Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ A Discord text and image moderation bot with an embedded management Activity. Na
Node.js 22 and strict TypeScript; native HTTP, WebSocket, and browser DOM APIs; PostgreSQL (`pg`) or MySQL (`mysql2`); native image normalization (`sharp`); the official Discord Embedded App SDK bundled with esbuild. No separate Redis server is required because jobs and idempotency records live in the selected SQL database. The Activity is native TypeScript rather than React. Jev uses its documented HTTP protocol directly rather than an additional SDK layer. These choices reduce runtime components, but the custom HTTP/Gateway code still needs independent review and live soak testing.

## Install and run

Server owners and members with Discord **Administrator or Manage Server** can connect and complete TypeCheck setup immediately after installation. No separate TypeCheck role grant is needed. Other members need explicit delegated access. These permissions are checked live; losing Manage Server removes automatic management access. [Permissions](docs/PERMISSIONS.md).

Requirements: Node.js 22.13 or later, npm, a PostgreSQL 16 or MySQL 8.0.16+ database, a Discord application/bot, a TypeSafe account, and an HTTPS origin reachable by Discord's Activity proxy. Do not request the bot's Administrator permission.

Expand Down
47 changes: 24 additions & 23 deletions SHA256SUMS
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ a8ee0dfbeba5f217873d77b9cd189879749da3028d864955c6e11ada8f9bda15 .env.example
3a951f66e7e0f3e2dd1832473a871357c4a507b51100636b73bcf6ff0dd78b6c .npmrc
4d6b240473a65aae17782762186a6d0113939711830ed3ca0e9ac9769009bf93 Dockerfile
a0460ece20287dbf42aa4752837cacbd1a7e6ef8d5e92760f01b2b1c70771045 LICENSE
c3791ff3545c3f379decbb5a3dd5b93015d2964ebd7fb35b79d24519ef70315b README.md
ab425a3cb9866cf760e222bbd238f188d6d31e3ce8a08b122cbf13284fb55b65 README.md
8874198151635c6a264ed90a09f41bb9afda432b9409e3188c28fca414b2c0ba VALIDATION.md
a76abf002c49097d146e86740a3105a5d00450b1592e820a1109a8c5680cd697 activity/fonts/OFL-JetBrainsMono.txt
3b4f3063b6ac7c1e403e2c4a5e8ef3a58190ff83ed7b15af66511858699139ce activity/fonts/OFL-SchibstedGrotesk.txt
Expand All @@ -20,9 +20,9 @@ ecd8294e24a1cd55cc1aa0b3c5d6cde68c956524cfb1d7707766b4f6287b5e3e activity/index
2c22d3a5e0aff57971932e24cbdf4dc93c12f589b060203cc20417fd97a75142 activity/legal/legal.css
6c8b74d4d57bff38a393ab038418c8f410627dc66721bc416905289110f151ac activity/legal/privacy.html
297c926eb462285e52e196af2d23f2ac70cb280324bfd30aeff74836e02f159c activity/legal/terms.html
81b6e414e8069db0699dd3fea09383ee82b772fa8d929bef60cbd730a9734cfb activity/src/connection.ts
fd8e9fa4ba6382219e4bb13cb415fdeea893eaaf3e58002b05dd71fbaf6a1a66 activity/src/main.ts
8ee444c30afb9d212532308df0f8beffd5c01c8f6e61e0fd1e05c607ecbac477 activity/src/onboarding.ts
92481a623badff677f19c6eb71a34038931ce059a1b5f6c4e652cb745e590b35 activity/src/connection.ts
3d47f4f00cb34228a30376b4e8ea68ce174f22800d5f2d1728817d4437cd6f32 activity/src/main.ts
8010da4164c86394863cb645eaf4567f066822114c40edf1d2762c1a5da3806a activity/src/onboarding.ts
66988416b7ab216ad9d3947ed528bfe9f2e45f74943971d506a686ff0b044508 activity/style.css
3fb468ea85cd082f252d85b34bb3da8b62a10ae4aa984b48ef93f0ecacc7017f data/scams/README.md
2b1733d3ba70cd80dc5e91720f0deacf0fced2145e9af5d0e5f4029c50001694 data/scams/SHA256SUMS
Expand Down Expand Up @@ -70,21 +70,21 @@ aec6cfde3d69458895924c9bf66e9a0f5831a8f4b18c31dbfef8a35899001531 data/scams/ima
38e139c05672e5fdf2db5eebfb1d1fc28ead5f014bc77ac65d005dda9f9a2429 db/mysql/004_packs.sql
10c485e37724a59c7fab34713b065a9dd271788b82a2a1eeb7242d001f8e6c79 docker-compose.yml
c5fd8324e1e65527f7208a0fc0669ceab4cd4aab9d1dae517e46bbe754f3c101 docs/ACCEPTANCE.md
66def114aaed3addfe2aa297c1f97516e92df1f5431b7e3352a4910ef0c9b954 docs/AGENT_ONBOARDING.md
689810e45577972435405908f50d68bc0a89b12d510edc415483067952ef234a docs/API.md
ce3922770e54865dab09b7fe5d3ac44018015595193e84f35c3018a14c1503cf docs/AGENT_ONBOARDING.md
e77b36946c2cd3e87400a8ef30821a9e620775034537e5a61b1d00fa408d0f78 docs/API.md
24861f458f5bba54f223f5903aefe9300793c154cd25958b7ac4f46072a8647a docs/CONTENT_ANALYSIS.md
9c81d1916b565043cc438787fc43b2e5719ff7aac78846f5d32ec7035fdb9d7d docs/COSTS.md
9ade67158bf9c08e1bde20d12401658a23c08df186871f869f32fa476dbd800f docs/DEPENDENCIES.md
9aae43e617e681d49076da868ff96ad6eb915490f67c498ca5a3466a3ae51083 docs/DEPLOYMENT.md
558c2bc2f2277c8434f9912340b157db796c01d071ecc38711eb0a79304d178c docs/HISTORICAL_SCANS.md
e15373ed5926a2afe6e8069f0c832178ec2ffdcdd4d288525d0146c585271866 docs/HISTORICAL_SCANS.md
b2f2313e1b6cba9454ad457cb6f02850cba1396174a1edc568db6022714dddde docs/MATCHING.md
1541249f149981ee8f8d130147203ecdfe629d6e2b4e0f92b4a2cad8eb638242 docs/MODERATION_PACKS.md
41cb490223ca17c8953febc5524bc3c48e5338786c0317a483e93687e13a8543 docs/MODERATION_PACKS.md
af79129af04ddd9d5895dba21327f736e00fedca755f7f722395c62803bbb693 docs/OPERATIONS.md
e23f9dd58ab8dfeda5db3ed1395fb33aad2ef91918b316c91c13545b56ea8927 docs/PACK_VALIDATION.md
eb75c65b5045e310435beb9336d908000ef6dd00f7150473383bd09bf66f15f5 docs/PERMISSIONS.md
8fbd438d3abf7737814680b335c7250c35b8504eea13abbced98d1240dfb6e32 docs/PERMISSIONS.md
29cba5147c78a1c67d3619b9665dfabb57aaf450651d00ebfbe306aac5fb90bb docs/RESEARCH.md
d1599abc4e8b090d61139c10ad6b9707004025642bb48fcdb9357b2885b8c590 docs/SECURITY.md
feea8a2290f57fad6a995e9dd81a825fd1812d2e1825b3738581a84f6d3cc761 docs/SETUP.md
548ec927e1d97352156b824b228b722e32f7e3554e1894d6d402c28c81987975 docs/SECURITY.md
31eb57212ea71f93d717356df2ebe084e7db371fec5036a4e8761586dc63ec09 docs/SETUP.md
8e68110bbe703f2e44fe68d382a7f3d46ea0e5215406ee4d1ae72e7815a3a885 docs/TEXT_MODERATION.md
f618ca2b276495eecdf4e556dd622792c36f44f5e1d694873b863bfd92d69a99 docs/TEXT_STARTERS.md
821210b0d31fce09ccfb03dedf521df28465327d021991dd76a92954b8109a18 docs/USER_SPECIFICATION.md
Expand Down Expand Up @@ -397,22 +397,22 @@ a44e797125685b375a99f8ea8311972906255b05cdc4df91ea9beb0c8860e185 scripts/verify
b5e028d6a57cf4c6458f70c8411d2b95f561b48b212bf88cb8d04e3ea3efeeee server/content-evaluate-cli.ts
c7678b37fef2837eece5de6da59b919a9d00bbec87c44c677930b5ad717ebd04 server/content.ts
c3a5c6c6c01a10e2682f827d04f43fcb72f50fb8f3eb70690f28d78e130fd7b0 server/database.ts
7b6864c208dd2d42d54f4876a649043e054a2d1f0c37d055b921cb11e132944e server/discord.ts
e08839ca4a25c1087e39f2d98c5bc97ca9c2f4366cf27f5404088c5e00471d6c server/discord.ts
ba6fb59bda1bf219d1e09d787a52437bf4a0ae6bfabfbda2bcfb37bced886adc server/durable.ts
89e116491a077a347c18b0b0c6a2801f867f0005c224ab5ed6e2dd3d783c047a server/evaluate-cli.ts
6e00b4f2c76c2b68165105b9ca9a00dbc74183043d15ba4d5ffb82967b84130f server/gateway.ts
2ac6c1a5042969b8d83f6d285f246e980d4f1df3f6235c528b338401c14228fd server/historical.ts
a1d0be11a8d5d0ec2e814b2ed6332a5e45e797ec7eeb9415d036f4e1e82c0036 server/http.ts
f72b36e636d98f35f21d9e185aaf5ca7376ef20de2769e5c4a8a107022bcf832 server/historical.ts
d30042908815d3d04f455456f39728078c217cf281edab0c81372b638a6dfce0 server/http.ts
98a99e3407ace650bc8b1c9140d31548c378e0b2e1069e43dbed6325f5acf26b server/images.ts
6af6aa0e5917a1ec062d2076c6ae60a4cb94af546266e9fd4b746502a7a743a3 server/jev.ts
b556bb54b61153d824e83a5a931c7031974736e065dc63633e259090c3e7eb0d server/leadership.ts
b378f81be6a5ec3d533c525ed6e99669a848484639bcbff468912b8284d3c27c server/main.ts
fafb6781d39a74e7c1cf3e1be1daf28ee71141cf93cdbd28d37a1327e2574b3c server/migrate.ts
37c04181dfa9f14b7dd6da07376b277831d6665c5e8500814d007255c7aa1968 server/mysql-pool.ts
3846c2120719c93d6c9d97c74f8760ee20540f95762c2e937add6df137fea6dd server/mysql.ts
a8c1dd7a7c6b8542dd065fe4f303dfad222d554ce522920b3c6f2a31ea631995 server/onboarding.ts
cb4d6d5b69db9f50bec2740550b3834ff0008241d8e36086423995e3d7ba5929 server/onboarding.ts
9ccf13b87d8bdbca1557edc7f8e3f7e6f104598a75c9c74f9801cb9224ac8dfd server/pack-starters.ts
8788768b29251cc609bdea1327e1730ba6011de62a84447b126bd68d41b4d48d server/packs.ts
65592be0bb260c0f821237187c78c52ed0c62f7d51e7b80094c0be38ffa1f542 server/packs.ts
ee71b7b16b22b417ea8bf27c51aa7342e725070e4186f72fc80bf5d661121880 server/policy.ts
e697b498837a3b4e5b0cb172d49f8ff2dd16cb89ba88368da40d31b8f1c5d842 server/postgres.ts
1d5850f815d0289fd0a9372981f0b1e1d82c300f6a9d4fbf5af1f3a437c53676 server/release.ts
Expand All @@ -428,9 +428,9 @@ b3a578846c1e5d503d63ac65fd098c78e42f984dda22bd086f3afdb18b875ca2 server/text-st
dec2ef8a73677cdfccba0ba8bb59a8d578e921b314398cafda3c23765da5da59 shared/analytics.ts
73a43aba903b47d573c7ebd7ef966dcfe6d16da8f2420d3b894c72ba57b0a906 shared/content-metrics.ts
969336e4689745de39e5dd84dc16868bbd52181fe262ece8ee5aee215d767fe8 shared/content.ts
8ab8dd251f254e3d1fe64e1717970077bda2761d826b81423592dbe1afa5c854 shared/domain.ts
cc655a15e777c5bb85cc16a93a2fc1cfb5008e6db654441ced48604bd3059df0 shared/domain.ts
3d7b306a3d71ae8b34330001115b87812f212465e70e1a3be9d161b1cc3b5396 shared/historical.ts
f1a5a396b6bb7dce378b0068b9ff5de4d9b68e4a8821f82aa0f0625a644a9270 shared/onboarding.ts
12bf9402a1b55e7ee8ed05af5cb31005e8c7aecb550e9a4127a89ec1b1605706 shared/onboarding.ts
9e74eca7d879340f12129731fdbfff2d50a94c93988edd4bd0d7f7468dad8c5e shared/packs.ts
053dc4fb699e88d9c39ae486066930b2d35dc87754e5129bdb8dd9f975e496e1 shared/text-starters.ts
a827883c55658487ac1d3d56678cbb8c278d6eb394c5cb145dcc7edc6a08631f shared/text.ts
Expand All @@ -440,7 +440,7 @@ f379be142cd234fb82c6b55ebb66e5ea94c184cb972cda576606d8dd872187ff starters/combi
d1611476abf0bc8ab0e1d4ccfea0abaa232183aa144390d56a8cf00f7468d984 starters/custom-template.typecheck.json
79ba12d8b758c4bcabc7c79b357cebc584442d3f2a368c2142576ef6a95975dd starters/image-scam-analysis.typecheck.json
20868d9d3d3760a4f19cc5aa97ef6496dd3e076507d9eb1b333a8f5ea9691d1e starters/reviewed-scam-references.typecheck.json
787e6f7eed60f8d56a71d00d1ddf13d20df3fb7047bf760737cc8a066ab1deac tests/activity-connection.test.ts
e6ffc74de5d3e48bed4ab821bedee76b7d8e2a4df887df00a7a5d52b28c08354 tests/activity-connection.test.ts
2257548bf1aa1de3113925dbdbd367db1211f5692ea6e0e69dae9830ef6ca611 tests/analytics.test.ts
977ac57a09795d86d5d5211ca91fa42db9e4f2b63442b0daadfb16025d42ef1c tests/compose.env
f9c22e2e2b1b12d1463e433966978b3cffb6f57e6903aae9d97d2d47a13eaed7 tests/compose.validation.yml
Expand All @@ -450,18 +450,19 @@ f9c22e2e2b1b12d1463e433966978b3cffb6f57e6903aae9d97d2d47a13eaed7 tests/compose.
3093de7974045706da57d933b802999a8642677b2d52e6048a4d4c8f276470e3 tests/exact-hash.test.ts
4b9b9b42437ba56db989269d4f46b5d25a9a54d89b70ed3cb15bcc66a0281366 tests/gateway.test.ts
05ba15dd56aee6d4eb42697f0dae7b7ca242b443aa1119d39ed97bf885bfeec2 tests/helpers.ts
28fa54bf4f17f27a42633c22fb6e1e675c80604364238995c0a8946bb361e013 tests/historical.test.ts
ab6af47462fa1a198526e1cb3c842790d53edd7db06014b0fa2eb10cf9ec2304 tests/http.test.ts
b666285fc34870d9396562e38e6eaabeeae0058bf9f8acff68e710b89ba9c05e tests/historical.test.ts
eac971f393e25829a52546dfc1113d78d4f0f707ac0e15a5748d62948cf8151d tests/http.test.ts
99e193edfc23993f6020844712e50ce17c2e00b87d77f512ec93270f3d733cef tests/images.test.ts
2f4aea258b076c5d21ac66f6152d09a243f8ea09dc9a810a24df87b5e6fd9069 tests/leadership.test.ts
0e9bd7d68fc492b8880cd7a6689524a3d6d5baa2c0b00dc2b031c017044a973f tests/match-configuration.test.ts
763daa678e9516a6408a34eac380e9ba536b25e760f6245a0145385d8dbb4c21 tests/memory-analytics.ts
2b86e2692b95b7ddf490b10900536e361a078f82b9742306d7d9552ba7b58639 tests/memory.ts
862ba0dc7c796a83dedcf1685e7aa0ee060e42ed65f6d5f348e19a539dfc6a8c tests/offline-discord.mjs
8b71d54fcfc314e15001dcf3282a245eef824a4ae62b66139466f82e20a57a5d tests/onboarding.test.ts
30d22a63318eec0d6eeae9fa283a0d06dc108efe52a5770feda6fb9980582f19 tests/packs.test.ts
95b25062d0bc0e8fd2b44359f930dad1f614fc31a8310228cffce6f7c9c7871d tests/onboarding.test.ts
67c6af6269ee9366c8879d996cccfd62fbec2820dfb0a417e3c02bec46e4f18a tests/packs.test.ts
218ba72ba92a95ab8f151df6abd94641480587f1f38150b10e0b869bf0d6859e tests/persistence-drill.mjs
bcfbc96429e2a79fd463d52fc67edebb0213615b449edf65bc956bb62091fe4d tests/release.test.ts
2b8f8859ca5720cc881f37f269ed31e022b14736b4a0cf370c9c08b1d96c750e tests/seamless-access.test.ts
430e90aeaf44eeb9fd6a7362de4d00046c98cb42d50e267437eb877f66b3790f tests/starter-references.test.ts
fea7d9af9f4e1563d14b28176c6676333889c5d5f2d08d8fa405e6735f1bed3f tests/text.test.ts
f411cbf6159efa34020d2bb4ba6c25b0721065d6185b05beed0740134b04a34a tests/thresholds.test.ts
Expand Down
2 changes: 1 addition & 1 deletion activity/src/connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export async function apiResponse<T = any>(response: Response): Promise<T> {
}
export function connectionError(stage: string, error: unknown): Error {
if (error instanceof HttpError && error.status === 403 && error.message === 'no_delegated_access')
return new Error('You need permission to use TypeCheck in this server. Ask a server owner or administrator to open TypeCheck → Permissions and grant access to your Discord role, then click Connect in Discord. Server owners and administrators have access automatically.');
return new Error('You need permission to use TypeCheck in this server. Ask a server owner or member with Manage Server to open TypeCheck → Permissions and grant access to your Discord role, then click Connect in Discord. Server owners and members with Administrator or Manage Server have access automatically.');
const detail = error instanceof HttpError ? ` (HTTP ${error.status}: ${error.message}${error.reference ? `; reference ${error.reference}` : ''})` :
error && typeof error === 'object' && 'code' in error && typeof error.code === 'number' ? ` (Discord code ${error.code})` : '';
if (error instanceof HttpError && error.status >= 500)
Expand Down
Loading
Loading