opensquid 0.5.441 → 0.5.449

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/README.md +1 -0
  2. package/dist/functions/arm_scope.d.ts +27 -0
  3. package/dist/functions/arm_scope.d.ts.map +1 -0
  4. package/dist/functions/arm_scope.js +52 -0
  5. package/dist/functions/arm_scope.js.map +1 -0
  6. package/dist/functions/index.d.ts +1 -0
  7. package/dist/functions/index.d.ts.map +1 -1
  8. package/dist/functions/index.js +1 -0
  9. package/dist/functions/index.js.map +1 -1
  10. package/dist/functions/recall_pre_inject.d.ts.map +1 -1
  11. package/dist/functions/recall_pre_inject.js +12 -0
  12. package/dist/functions/recall_pre_inject.js.map +1 -1
  13. package/dist/rag/store_git.d.ts +23 -0
  14. package/dist/rag/store_git.d.ts.map +1 -0
  15. package/dist/rag/store_git.js +57 -0
  16. package/dist/rag/store_git.js.map +1 -0
  17. package/dist/runtime/bootstrap.d.ts.map +1 -1
  18. package/dist/runtime/bootstrap.js +2 -0
  19. package/dist/runtime/bootstrap.js.map +1 -1
  20. package/dist/runtime/handoff/render.d.ts +5 -4
  21. package/dist/runtime/handoff/render.d.ts.map +1 -1
  22. package/dist/runtime/handoff/render.js +7 -7
  23. package/dist/runtime/handoff/render.js.map +1 -1
  24. package/dist/runtime/hooks/active_task_mirror.js +0 -0
  25. package/dist/runtime/hooks/apply_patch.js +0 -0
  26. package/dist/runtime/hooks/dispatch.js +0 -0
  27. package/dist/runtime/hooks/hook_output.js +0 -0
  28. package/dist/runtime/hooks/memory_reconcile.js +0 -0
  29. package/dist/runtime/hooks/new_project_detect.js +0 -0
  30. package/dist/runtime/hooks/profession_resolver.js +0 -0
  31. package/dist/runtime/hooks/scope_intent.js +0 -0
  32. package/dist/runtime/hooks/session-end.js +11 -0
  33. package/dist/runtime/hooks/session-end.js.map +1 -1
  34. package/dist/runtime/hooks/session_id.js +0 -0
  35. package/dist/runtime/hooks/session_liveness.js +0 -0
  36. package/dist/runtime/hooks/stop_drive.js +0 -0
  37. package/dist/runtime/hooks/stop_stream.js +0 -0
  38. package/dist/runtime/hooks/subagent_guard.js +0 -0
  39. package/dist/runtime/hooks/transcript.js +0 -0
  40. package/dist/runtime/hooks/transcript_tasks.js +0 -0
  41. package/dist/runtime/ralph/orchestrator.d.ts.map +1 -1
  42. package/dist/runtime/ralph/orchestrator.js +2 -1
  43. package/dist/runtime/ralph/orchestrator.js.map +1 -1
  44. package/dist/setup/cli/limits_state.d.ts.map +1 -1
  45. package/dist/setup/cli/limits_state.js +6 -40
  46. package/dist/setup/cli/limits_state.js.map +1 -1
  47. package/dist/setup/cli/pack_walk.d.ts +32 -0
  48. package/dist/setup/cli/pack_walk.d.ts.map +1 -0
  49. package/dist/setup/cli/pack_walk.js +76 -0
  50. package/dist/setup/cli/pack_walk.js.map +1 -0
  51. package/dist/setup/cli/permissions_state.d.ts.map +1 -1
  52. package/dist/setup/cli/permissions_state.js +6 -37
  53. package/dist/setup/cli/permissions_state.js.map +1 -1
  54. package/dist/setup/cli/triggers_state.d.ts.map +1 -1
  55. package/dist/setup/cli/triggers_state.js +3 -29
  56. package/dist/setup/cli/triggers_state.js.map +1 -1
  57. package/dist/workgraph/events.d.ts.map +1 -1
  58. package/dist/workgraph/events.js +10 -0
  59. package/dist/workgraph/events.js.map +1 -1
  60. package/dist/workgraph/store.d.ts.map +1 -1
  61. package/dist/workgraph/store.js +5 -0
  62. package/dist/workgraph/store.js.map +1 -1
  63. package/dist/workgraph/types.d.ts +2 -1
  64. package/dist/workgraph/types.d.ts.map +1 -1
  65. package/docs/ARCHITECTURE.md +268 -0
  66. package/docs/pack-runtime.md +15 -12
  67. package/docs/skill-grammar-guide.md +4 -4
  68. package/package.json +5 -3
  69. package/packs/builtin/coding-flow/skills/entry-and-handoffs/skill.yaml +13 -17
  70. package/dist/anti-drift/evaluator.d.ts +0 -88
  71. package/dist/anti-drift/evaluator.d.ts.map +0 -1
  72. package/dist/anti-drift/evaluator.js +0 -417
  73. package/dist/anti-drift/evaluator.js.map +0 -1
  74. package/dist/anti-drift/evaluator.test.js +0 -78
  75. package/dist/anti-drift/rules.d.ts +0 -80
  76. package/dist/anti-drift/rules.d.ts.map +0 -1
  77. package/dist/anti-drift/rules.js +0 -368
  78. package/dist/anti-drift/rules.js.map +0 -1
  79. package/dist/anti-drift/rules.test.js +0 -213
  80. package/dist/anti-drift/state.d.ts +0 -107
  81. package/dist/anti-drift/state.d.ts.map +0 -1
  82. package/dist/anti-drift/state.js +0 -177
  83. package/dist/anti-drift/state.js.map +0 -1
  84. package/dist/anti-drift/state.test.js +0 -120
  85. package/dist/chat/adapters/discord.d.ts +0 -41
  86. package/dist/chat/adapters/discord.d.ts.map +0 -1
  87. package/dist/chat/adapters/discord.js +0 -176
  88. package/dist/chat/adapters/discord.js.map +0 -1
  89. package/dist/chat/adapters/discord.test.js +0 -25
  90. package/dist/chat/adapters/slack.d.ts +0 -43
  91. package/dist/chat/adapters/slack.d.ts.map +0 -1
  92. package/dist/chat/adapters/slack.js +0 -172
  93. package/dist/chat/adapters/slack.js.map +0 -1
  94. package/dist/chat/adapters/slack.test.js +0 -30
  95. package/dist/chat/adapters/telegram.d.ts +0 -148
  96. package/dist/chat/adapters/telegram.d.ts.map +0 -1
  97. package/dist/chat/adapters/telegram.js +0 -498
  98. package/dist/chat/adapters/telegram.js.map +0 -1
  99. package/dist/chat/adapters/telegram.test.js +0 -94
  100. package/dist/chat/config.d.ts +0 -98
  101. package/dist/chat/config.d.ts.map +0 -1
  102. package/dist/chat/config.js +0 -185
  103. package/dist/chat/config.js.map +0 -1
  104. package/dist/chat/daemon/active-project.d.ts +0 -17
  105. package/dist/chat/daemon/active-project.d.ts.map +0 -1
  106. package/dist/chat/daemon/active-project.js +0 -23
  107. package/dist/chat/daemon/active-project.js.map +0 -1
  108. package/dist/chat/daemon/autospawn.d.ts +0 -40
  109. package/dist/chat/daemon/autospawn.d.ts.map +0 -1
  110. package/dist/chat/daemon/autospawn.js +0 -129
  111. package/dist/chat/daemon/autospawn.js.map +0 -1
  112. package/dist/chat/daemon/autospawn.test.js +0 -112
  113. package/dist/chat/daemon/cli.d.ts +0 -18
  114. package/dist/chat/daemon/cli.d.ts.map +0 -1
  115. package/dist/chat/daemon/cli.js +0 -71
  116. package/dist/chat/daemon/cli.js.map +0 -1
  117. package/dist/chat/daemon/collisions.js +0 -384
  118. package/dist/chat/daemon/health-check.d.ts +0 -69
  119. package/dist/chat/daemon/health-check.d.ts.map +0 -1
  120. package/dist/chat/daemon/health-check.js +0 -112
  121. package/dist/chat/daemon/health-check.js.map +0 -1
  122. package/dist/chat/daemon/inbox-read.d.ts +0 -35
  123. package/dist/chat/daemon/inbox-read.d.ts.map +0 -1
  124. package/dist/chat/daemon/inbox-read.js +0 -75
  125. package/dist/chat/daemon/inbox-read.js.map +0 -1
  126. package/dist/chat/daemon/inbox-read.test.js +0 -97
  127. package/dist/chat/daemon/inbox.d.ts +0 -63
  128. package/dist/chat/daemon/inbox.d.ts.map +0 -1
  129. package/dist/chat/daemon/inbox.js +0 -56
  130. package/dist/chat/daemon/inbox.js.map +0 -1
  131. package/dist/chat/daemon/inbox.test.js +0 -110
  132. package/dist/chat/daemon/lifecycle.d.ts +0 -71
  133. package/dist/chat/daemon/lifecycle.d.ts.map +0 -1
  134. package/dist/chat/daemon/lifecycle.js +0 -221
  135. package/dist/chat/daemon/lifecycle.js.map +0 -1
  136. package/dist/chat/daemon/lifecycle.test.js +0 -163
  137. package/dist/chat/daemon/protocol.d.ts +0 -107
  138. package/dist/chat/daemon/protocol.d.ts.map +0 -1
  139. package/dist/chat/daemon/protocol.js +0 -54
  140. package/dist/chat/daemon/protocol.js.map +0 -1
  141. package/dist/chat/daemon/routing.d.ts +0 -140
  142. package/dist/chat/daemon/routing.d.ts.map +0 -1
  143. package/dist/chat/daemon/routing.js +0 -198
  144. package/dist/chat/daemon/routing.js.map +0 -1
  145. package/dist/chat/daemon/routing.test.js +0 -259
  146. package/dist/chat/daemon/rpc-client.d.ts +0 -45
  147. package/dist/chat/daemon/rpc-client.d.ts.map +0 -1
  148. package/dist/chat/daemon/rpc-client.js +0 -133
  149. package/dist/chat/daemon/rpc-client.js.map +0 -1
  150. package/dist/chat/daemon/rpc-server.d.ts +0 -39
  151. package/dist/chat/daemon/rpc-server.d.ts.map +0 -1
  152. package/dist/chat/daemon/rpc-server.js +0 -385
  153. package/dist/chat/daemon/rpc-server.js.map +0 -1
  154. package/dist/chat/daemon/rpc.test.js +0 -177
  155. package/dist/chat/daemon/subscribers.js +0 -257
  156. package/dist/chat/daemon/worker.d.ts +0 -27
  157. package/dist/chat/daemon/worker.d.ts.map +0 -1
  158. package/dist/chat/daemon/worker.js +0 -313
  159. package/dist/chat/daemon/worker.js.map +0 -1
  160. package/dist/chat/daemon/workspace-topic.js +0 -324
  161. package/dist/chat/env-token.d.ts +0 -60
  162. package/dist/chat/env-token.d.ts.map +0 -1
  163. package/dist/chat/env-token.js +0 -137
  164. package/dist/chat/env-token.js.map +0 -1
  165. package/dist/chat/env-token.test.js +0 -160
  166. package/dist/chat/factory.d.ts +0 -30
  167. package/dist/chat/factory.d.ts.map +0 -1
  168. package/dist/chat/factory.js +0 -50
  169. package/dist/chat/factory.js.map +0 -1
  170. package/dist/chat/factory.test.js +0 -55
  171. package/dist/chat/gateway.d.ts +0 -176
  172. package/dist/chat/gateway.d.ts.map +0 -1
  173. package/dist/chat/gateway.js +0 -146
  174. package/dist/chat/gateway.js.map +0 -1
  175. package/dist/chat/gateway.test.js +0 -192
  176. package/dist/claude-md.d.ts +0 -39
  177. package/dist/claude-md.d.ts.map +0 -1
  178. package/dist/claude-md.js +0 -113
  179. package/dist/claude-md.js.map +0 -1
  180. package/dist/claude-md.test.js +0 -91
  181. package/dist/codex/activate.d.ts +0 -66
  182. package/dist/codex/activate.d.ts.map +0 -1
  183. package/dist/codex/activate.js +0 -329
  184. package/dist/codex/activate.js.map +0 -1
  185. package/dist/codex/activate.test.js +0 -229
  186. package/dist/codex/bundled-default/bundled-default.test.js +0 -161
  187. package/dist/codex/cli-publish.test.js +0 -133
  188. package/dist/codex/cli.d.ts +0 -35
  189. package/dist/codex/cli.d.ts.map +0 -1
  190. package/dist/codex/cli.js +0 -554
  191. package/dist/codex/cli.js.map +0 -1
  192. package/dist/codex/cli.test.js +0 -277
  193. package/dist/codex/import-skill-md.d.ts +0 -53
  194. package/dist/codex/import-skill-md.d.ts.map +0 -1
  195. package/dist/codex/import-skill-md.js +0 -236
  196. package/dist/codex/import-skill-md.js.map +0 -1
  197. package/dist/codex/import-skill-md.test.js +0 -225
  198. package/dist/codex/loader.d.ts +0 -27
  199. package/dist/codex/loader.d.ts.map +0 -1
  200. package/dist/codex/loader.js +0 -86
  201. package/dist/codex/loader.js.map +0 -1
  202. package/dist/codex/loader.test.js +0 -75
  203. package/dist/codex/parse.d.ts +0 -28
  204. package/dist/codex/parse.d.ts.map +0 -1
  205. package/dist/codex/parse.js +0 -309
  206. package/dist/codex/parse.js.map +0 -1
  207. package/dist/codex/parse.test.js +0 -241
  208. package/dist/codex/store.d.ts +0 -87
  209. package/dist/codex/store.d.ts.map +0 -1
  210. package/dist/codex/store.js +0 -205
  211. package/dist/codex/store.js.map +0 -1
  212. package/dist/codex/store.test.js +0 -242
  213. package/dist/codex/types.d.ts +0 -398
  214. package/dist/codex/types.d.ts.map +0 -1
  215. package/dist/codex/types.js +0 -21
  216. package/dist/codex/types.js.map +0 -1
  217. package/dist/config.d.ts +0 -53
  218. package/dist/config.d.ts.map +0 -1
  219. package/dist/config.js +0 -202
  220. package/dist/config.js.map +0 -1
  221. package/dist/config.test.js +0 -117
  222. package/dist/engine/cli.d.ts +0 -14
  223. package/dist/engine/cli.d.ts.map +0 -1
  224. package/dist/engine/cli.js +0 -171
  225. package/dist/engine/cli.js.map +0 -1
  226. package/dist/engine/client.d.ts +0 -219
  227. package/dist/engine/client.d.ts.map +0 -1
  228. package/dist/engine/client.js +0 -312
  229. package/dist/engine/client.js.map +0 -1
  230. package/dist/engine/config.d.ts +0 -62
  231. package/dist/engine/config.d.ts.map +0 -1
  232. package/dist/engine/config.js +0 -223
  233. package/dist/engine/config.js.map +0 -1
  234. package/dist/engine/index.d.ts +0 -17
  235. package/dist/engine/index.d.ts.map +0 -1
  236. package/dist/engine/index.js +0 -16
  237. package/dist/engine/index.js.map +0 -1
  238. package/dist/engine/resolver.d.ts +0 -62
  239. package/dist/engine/resolver.d.ts.map +0 -1
  240. package/dist/engine/resolver.js +0 -103
  241. package/dist/engine/resolver.js.map +0 -1
  242. package/dist/engine/singleton.d.ts +0 -95
  243. package/dist/engine/singleton.d.ts.map +0 -1
  244. package/dist/engine/singleton.js +0 -325
  245. package/dist/engine/singleton.js.map +0 -1
  246. package/dist/engine/types.d.ts +0 -402
  247. package/dist/engine/types.d.ts.map +0 -1
  248. package/dist/engine/types.js +0 -22
  249. package/dist/engine/types.js.map +0 -1
  250. package/dist/engine-binary-resolver.js +0 -110
  251. package/dist/engine-binary-resolver.test.js +0 -61
  252. package/dist/engine-cli.js +0 -60
  253. package/dist/engine-client.js +0 -301
  254. package/dist/engine-client.test.js +0 -118
  255. package/dist/functions/chain_state.d.ts +0 -51
  256. package/dist/functions/chain_state.d.ts.map +0 -1
  257. package/dist/functions/chain_state.js +0 -59
  258. package/dist/functions/chain_state.js.map +0 -1
  259. package/dist/hooks/drift-catalog.d.ts +0 -68
  260. package/dist/hooks/drift-catalog.d.ts.map +0 -1
  261. package/dist/hooks/drift-catalog.js +0 -184
  262. package/dist/hooks/drift-catalog.js.map +0 -1
  263. package/dist/hooks/drift-catalog.test.js +0 -154
  264. package/dist/hooks/drift-patterns.d.ts +0 -110
  265. package/dist/hooks/drift-patterns.d.ts.map +0 -1
  266. package/dist/hooks/drift-patterns.js +0 -289
  267. package/dist/hooks/drift-patterns.js.map +0 -1
  268. package/dist/hooks/drift-patterns.test.js +0 -325
  269. package/dist/hooks/engine-vocab-gate.d.ts +0 -108
  270. package/dist/hooks/engine-vocab-gate.d.ts.map +0 -1
  271. package/dist/hooks/engine-vocab-gate.js +0 -225
  272. package/dist/hooks/engine-vocab-gate.js.map +0 -1
  273. package/dist/hooks/engine-vocab-gate.test.js +0 -170
  274. package/dist/hooks/heartbeat.d.ts +0 -107
  275. package/dist/hooks/heartbeat.d.ts.map +0 -1
  276. package/dist/hooks/heartbeat.js +0 -316
  277. package/dist/hooks/heartbeat.js.map +0 -1
  278. package/dist/hooks/heartbeat.test.js +0 -393
  279. package/dist/hooks/honesty-ledger-session-scope.test.js +0 -100
  280. package/dist/hooks/honesty-ledger.d.ts +0 -123
  281. package/dist/hooks/honesty-ledger.d.ts.map +0 -1
  282. package/dist/hooks/honesty-ledger.js +0 -226
  283. package/dist/hooks/honesty-ledger.js.map +0 -1
  284. package/dist/hooks/honesty-ledger.test.js +0 -466
  285. package/dist/hooks/inline-report-check.d.ts +0 -63
  286. package/dist/hooks/inline-report-check.d.ts.map +0 -1
  287. package/dist/hooks/inline-report-check.js +0 -88
  288. package/dist/hooks/inline-report-check.js.map +0 -1
  289. package/dist/hooks/inline-report-check.test.js +0 -96
  290. package/dist/hooks/pre-tool-use.d.ts +0 -62
  291. package/dist/hooks/pre-tool-use.d.ts.map +0 -1
  292. package/dist/hooks/pre-tool-use.js +0 -342
  293. package/dist/hooks/pre-tool-use.js.map +0 -1
  294. package/dist/hooks/pre-tool-use.test.js +0 -134
  295. package/dist/hooks/session-end.d.ts +0 -15
  296. package/dist/hooks/session-end.d.ts.map +0 -1
  297. package/dist/hooks/session-end.js +0 -60
  298. package/dist/hooks/session-end.js.map +0 -1
  299. package/dist/hooks/session-end.test.js +0 -52
  300. package/dist/hooks/stop.d.ts +0 -35
  301. package/dist/hooks/stop.d.ts.map +0 -1
  302. package/dist/hooks/stop.js +0 -136
  303. package/dist/hooks/stop.js.map +0 -1
  304. package/dist/hooks/transcript-active-task.test.js +0 -342
  305. package/dist/hooks/transcript.d.ts +0 -26
  306. package/dist/hooks/transcript.d.ts.map +0 -1
  307. package/dist/hooks/transcript.js +0 -266
  308. package/dist/hooks/transcript.js.map +0 -1
  309. package/dist/hooks/transcript.test.js +0 -103
  310. package/dist/hooks/user-prompt-submit.d.ts +0 -74
  311. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  312. package/dist/hooks/user-prompt-submit.js +0 -256
  313. package/dist/hooks/user-prompt-submit.js.map +0 -1
  314. package/dist/hooks/user-prompt-submit.test.js +0 -118
  315. package/dist/hooks/versioning-gate.d.ts +0 -101
  316. package/dist/hooks/versioning-gate.d.ts.map +0 -1
  317. package/dist/hooks/versioning-gate.js +0 -245
  318. package/dist/hooks/versioning-gate.js.map +0 -1
  319. package/dist/hooks/versioning-gate.test.js +0 -368
  320. package/dist/hooks/workflow-gate.d.ts +0 -64
  321. package/dist/hooks/workflow-gate.d.ts.map +0 -1
  322. package/dist/hooks/workflow-gate.js +0 -152
  323. package/dist/hooks/workflow-gate.js.map +0 -1
  324. package/dist/hooks/workflow-gate.test.js +0 -197
  325. package/dist/hooks-cli.d.ts +0 -25
  326. package/dist/hooks-cli.d.ts.map +0 -1
  327. package/dist/hooks-cli.js +0 -286
  328. package/dist/hooks-cli.js.map +0 -1
  329. package/dist/hooks-cli.test.js +0 -148
  330. package/dist/origin.d.ts +0 -16
  331. package/dist/origin.d.ts.map +0 -1
  332. package/dist/origin.js +0 -92
  333. package/dist/origin.js.map +0 -1
  334. package/dist/packs/seed_lessons_ingest.d.ts +0 -30
  335. package/dist/packs/seed_lessons_ingest.d.ts.map +0 -1
  336. package/dist/packs/seed_lessons_ingest.js +0 -107
  337. package/dist/packs/seed_lessons_ingest.js.map +0 -1
  338. package/dist/project-cli.d.ts +0 -7
  339. package/dist/project-cli.d.ts.map +0 -1
  340. package/dist/project-cli.js +0 -145
  341. package/dist/project-cli.js.map +0 -1
  342. package/dist/project.d.ts +0 -127
  343. package/dist/project.d.ts.map +0 -1
  344. package/dist/project.js +0 -281
  345. package/dist/project.js.map +0 -1
  346. package/dist/project.test.js +0 -287
  347. package/dist/rag/backends/loop_engine.d.ts +0 -61
  348. package/dist/rag/backends/loop_engine.d.ts.map +0 -1
  349. package/dist/rag/backends/loop_engine.js +0 -160
  350. package/dist/rag/backends/loop_engine.js.map +0 -1
  351. package/dist/recall.d.ts +0 -82
  352. package/dist/recall.d.ts.map +0 -1
  353. package/dist/recall.js +0 -81
  354. package/dist/recall.js.map +0 -1
  355. package/dist/runtime/agent_bridge/autospawn.d.ts +0 -131
  356. package/dist/runtime/agent_bridge/autospawn.d.ts.map +0 -1
  357. package/dist/runtime/agent_bridge/autospawn.js +0 -251
  358. package/dist/runtime/agent_bridge/autospawn.js.map +0 -1
  359. package/dist/runtime/chain_state.d.ts +0 -124
  360. package/dist/runtime/chain_state.d.ts.map +0 -1
  361. package/dist/runtime/chain_state.js +0 -189
  362. package/dist/runtime/chain_state.js.map +0 -1
  363. package/dist/runtime/hooks/permission_decision.d.ts +0 -34
  364. package/dist/runtime/hooks/permission_decision.d.ts.map +0 -1
  365. package/dist/runtime/hooks/permission_decision.js +0 -39
  366. package/dist/runtime/hooks/permission_decision.js.map +0 -1
  367. package/dist/runtime/workflow_fsm.d.ts +0 -21
  368. package/dist/runtime/workflow_fsm.d.ts.map +0 -1
  369. package/dist/runtime/workflow_fsm.js +0 -25
  370. package/dist/runtime/workflow_fsm.js.map +0 -1
  371. package/dist/runtime/workflow_map.d.ts +0 -26
  372. package/dist/runtime/workflow_map.d.ts.map +0 -1
  373. package/dist/runtime/workflow_map.js +0 -38
  374. package/dist/runtime/workflow_map.js.map +0 -1
  375. package/dist/scope.d.ts +0 -48
  376. package/dist/scope.d.ts.map +0 -1
  377. package/dist/scope.js +0 -111
  378. package/dist/scope.js.map +0 -1
  379. package/dist/setup/cli/topic_create_step.d.ts +0 -84
  380. package/dist/setup/cli/topic_create_step.d.ts.map +0 -1
  381. package/dist/setup/cli/topic_create_step.js +0 -213
  382. package/dist/setup/cli/topic_create_step.js.map +0 -1
  383. package/dist/system-export.d.ts +0 -65
  384. package/dist/system-export.d.ts.map +0 -1
  385. package/dist/system-export.js +0 -194
  386. package/dist/system-export.js.map +0 -1
  387. package/dist/utterance/classifier.d.ts +0 -53
  388. package/dist/utterance/classifier.d.ts.map +0 -1
  389. package/dist/utterance/classifier.js +0 -184
  390. package/dist/utterance/classifier.js.map +0 -1
  391. package/dist/utterance/classifier.test.js +0 -147
@@ -1,107 +0,0 @@
1
- /**
2
- * Anti-drift state primitives (0.8 unified-evaluator track).
3
- *
4
- * Per loop/docs/opensquid-anti-drift-unified-evaluator-design.md C-section
5
- * "state primitives": one filesystem-backed source of truth for the
6
- * active-task signal + violations log + drift catalog.
7
- *
8
- * This module is the foundation of the unified evaluator. Today it
9
- * lives alongside src/hooks/ (no cutover yet). Subsequent patches
10
- * port rules from src/hooks/* into src/anti-drift/rules.ts which
11
- * reads from this state module, replacing per-rule transcript
12
- * parsing.
13
- *
14
- * Three state primitives:
15
- * 1. active-task.json — current in_progress task id + subject + started_at
16
- * 2. violations.log — append-only ring buffer (last N violations)
17
- * 3. drift-catalog.jsonl — append-only audit trail
18
- *
19
- * Layout (sessions are short-lived; project scope is durable):
20
- * ~/.opensquid/sessions/<session-id>/active-task.json
21
- * ~/.opensquid/sessions/<session-id>/violations.log
22
- * ~/.opensquid/projects/<project-uuid>/drift-catalog.jsonl
23
- *
24
- * Design choice: writes are best-effort. State corruption is recoverable
25
- * (worst case: rule fails-open, which is what the existing hooks already
26
- * do). The new architecture's win is making "no active task" a positive
27
- * signal (file absent) rather than a parse failure (transcript
28
- * unreadable) — different shape, easier to reason about.
29
- */
30
- export interface ActiveTaskState {
31
- /** Numeric task id from Claude Code's TodoWrite / TaskCreate. */
32
- id: string;
33
- /** Human-readable subject (helps with grep + debugging). */
34
- subject?: string;
35
- /** ISO 8601 timestamp when this task was marked in_progress. */
36
- started_at: string;
37
- }
38
- /**
39
- * Write the active-task state. Idempotent — overwrites any existing
40
- * file. Caller is responsible for choosing the right semantic (e.g.
41
- * a fresh TaskCreate vs. a TaskUpdate(in_progress) on an existing
42
- * task id).
43
- *
44
- * Exported for direct testing + use by the PreToolUse sync helper.
45
- */
46
- export declare function writeActiveTask(sessionId: string, state: ActiveTaskState, options?: {
47
- dataRoot?: string;
48
- }): Promise<void>;
49
- /**
50
- * Read the active-task state. Returns null when the file is absent
51
- * (the canonical "no in_progress task" signal) OR when the file is
52
- * malformed (fail-safe: treat corruption as "no task" rather than
53
- * crashing the gate).
54
- */
55
- export declare function readActiveTask(sessionId: string, options?: {
56
- dataRoot?: string;
57
- }): Promise<ActiveTaskState | null>;
58
- /**
59
- * Delete the active-task state. Idempotent — silent no-op when the
60
- * file is already absent. Called on TaskUpdate(completed).
61
- */
62
- export declare function clearActiveTask(sessionId: string, options?: {
63
- dataRoot?: string;
64
- }): Promise<void>;
65
- export interface ViolationEntry {
66
- /** ISO 8601 timestamp the rule fired. */
67
- ts: string;
68
- /** Rule id from rules.ts. */
69
- rule_id: string;
70
- /** "block" | "warn" | "surface" | "auto". */
71
- verdict: string;
72
- /** Free-text reason (becomes the agent-facing surface text). */
73
- reason: string;
74
- /** Optional matched-text snippet (≤200 chars). */
75
- evidence?: string;
76
- }
77
- /**
78
- * Append a violation entry. Each call writes exactly one JSON line.
79
- * Best-effort: silent on write failure (the rule has already fired
80
- * in-process — losing the log entry is non-load-bearing).
81
- */
82
- export declare function appendViolation(sessionId: string, entry: ViolationEntry, options?: {
83
- dataRoot?: string;
84
- }): Promise<void>;
85
- /**
86
- * Atomically claim all pending violations for surfacing at next UPS.
87
- * Returns the parsed entries; the on-disk file is renamed-then-deleted
88
- * so concurrent writers land in a fresh file the next consumer picks up.
89
- */
90
- export declare function consumeViolations(sessionId: string, options?: {
91
- dataRoot?: string;
92
- }): Promise<ViolationEntry[]>;
93
- /**
94
- * Path helper for the per-project drift catalog. The catalog is
95
- * project-scoped (not session-scoped) so a project's drift history
96
- * accumulates across sessions.
97
- *
98
- * Falls back to a session-scoped path when projectUuid is null —
99
- * matches the existing drift-catalog.ts fallback shape.
100
- */
101
- export declare function driftCatalogPath(projectUuid: string | null, sessionId: string, dataRoot?: string): string;
102
- /**
103
- * Per-session file paths that SessionEnd should clean up. Project-scoped
104
- * files (drift-catalog.jsonl) are durable across sessions and excluded.
105
- */
106
- export declare function sessionStateFiles(sessionId: string, dataRoot?: string): string[];
107
- //# sourceMappingURL=state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src.legacy/anti-drift/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAWH,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAiBjC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,IAAI,CAAC,CAOf;AAMD,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,cAAc,EAAE,CAAC,CA+B3B;AAMD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAMR;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhF"}
@@ -1,177 +0,0 @@
1
- /**
2
- * Anti-drift state primitives (0.8 unified-evaluator track).
3
- *
4
- * Per loop/docs/opensquid-anti-drift-unified-evaluator-design.md C-section
5
- * "state primitives": one filesystem-backed source of truth for the
6
- * active-task signal + violations log + drift catalog.
7
- *
8
- * This module is the foundation of the unified evaluator. Today it
9
- * lives alongside src/hooks/ (no cutover yet). Subsequent patches
10
- * port rules from src/hooks/* into src/anti-drift/rules.ts which
11
- * reads from this state module, replacing per-rule transcript
12
- * parsing.
13
- *
14
- * Three state primitives:
15
- * 1. active-task.json — current in_progress task id + subject + started_at
16
- * 2. violations.log — append-only ring buffer (last N violations)
17
- * 3. drift-catalog.jsonl — append-only audit trail
18
- *
19
- * Layout (sessions are short-lived; project scope is durable):
20
- * ~/.opensquid/sessions/<session-id>/active-task.json
21
- * ~/.opensquid/sessions/<session-id>/violations.log
22
- * ~/.opensquid/projects/<project-uuid>/drift-catalog.jsonl
23
- *
24
- * Design choice: writes are best-effort. State corruption is recoverable
25
- * (worst case: rule fails-open, which is what the existing hooks already
26
- * do). The new architecture's win is making "no active task" a positive
27
- * signal (file absent) rather than a parse failure (transcript
28
- * unreadable) — different shape, easier to reason about.
29
- */
30
- import { promises as fs } from "node:fs";
31
- import * as path from "node:path";
32
- import { resolveDataRoot } from "../codex/store.js";
33
- function activeTaskPath(sessionId, dataRoot) {
34
- return path.join(resolveDataRoot(dataRoot), "sessions", sessionId, "active-task.json");
35
- }
36
- /**
37
- * Write the active-task state. Idempotent — overwrites any existing
38
- * file. Caller is responsible for choosing the right semantic (e.g.
39
- * a fresh TaskCreate vs. a TaskUpdate(in_progress) on an existing
40
- * task id).
41
- *
42
- * Exported for direct testing + use by the PreToolUse sync helper.
43
- */
44
- export async function writeActiveTask(sessionId, state, options = {}) {
45
- const p = activeTaskPath(sessionId, options.dataRoot);
46
- await fs.mkdir(path.dirname(p), { recursive: true });
47
- await fs.writeFile(p, JSON.stringify(state, null, 2) + "\n", "utf8");
48
- }
49
- /**
50
- * Read the active-task state. Returns null when the file is absent
51
- * (the canonical "no in_progress task" signal) OR when the file is
52
- * malformed (fail-safe: treat corruption as "no task" rather than
53
- * crashing the gate).
54
- */
55
- export async function readActiveTask(sessionId, options = {}) {
56
- const p = activeTaskPath(sessionId, options.dataRoot);
57
- let raw;
58
- try {
59
- raw = await fs.readFile(p, "utf8");
60
- }
61
- catch {
62
- return null;
63
- }
64
- try {
65
- const parsed = JSON.parse(raw);
66
- if (typeof parsed?.id !== "string" || typeof parsed?.started_at !== "string") {
67
- return null;
68
- }
69
- return parsed;
70
- }
71
- catch {
72
- return null;
73
- }
74
- }
75
- /**
76
- * Delete the active-task state. Idempotent — silent no-op when the
77
- * file is already absent. Called on TaskUpdate(completed).
78
- */
79
- export async function clearActiveTask(sessionId, options = {}) {
80
- const p = activeTaskPath(sessionId, options.dataRoot);
81
- try {
82
- await fs.rm(p);
83
- }
84
- catch {
85
- /* already gone — idempotent */
86
- }
87
- }
88
- function violationsPath(sessionId, dataRoot) {
89
- return path.join(resolveDataRoot(dataRoot), "sessions", sessionId, "violations.log");
90
- }
91
- /**
92
- * Append a violation entry. Each call writes exactly one JSON line.
93
- * Best-effort: silent on write failure (the rule has already fired
94
- * in-process — losing the log entry is non-load-bearing).
95
- */
96
- export async function appendViolation(sessionId, entry, options = {}) {
97
- const p = violationsPath(sessionId, options.dataRoot);
98
- try {
99
- await fs.mkdir(path.dirname(p), { recursive: true });
100
- await fs.appendFile(p, JSON.stringify(entry) + "\n", "utf8");
101
- }
102
- catch {
103
- /* best-effort logging — swallow */
104
- }
105
- }
106
- /**
107
- * Atomically claim all pending violations for surfacing at next UPS.
108
- * Returns the parsed entries; the on-disk file is renamed-then-deleted
109
- * so concurrent writers land in a fresh file the next consumer picks up.
110
- */
111
- export async function consumeViolations(sessionId, options = {}) {
112
- const p = violationsPath(sessionId, options.dataRoot);
113
- const claimed = `${p}.consuming.${Date.now()}.${Math.random().toString(36).slice(2, 8)}`;
114
- try {
115
- await fs.rename(p, claimed);
116
- }
117
- catch {
118
- return [];
119
- }
120
- let raw;
121
- try {
122
- raw = await fs.readFile(claimed, "utf8");
123
- }
124
- catch {
125
- raw = "";
126
- }
127
- try {
128
- await fs.rm(claimed);
129
- }
130
- catch {
131
- /* already gone */
132
- }
133
- if (!raw.trim())
134
- return [];
135
- const entries = [];
136
- for (const line of raw.split("\n")) {
137
- const t = line.trim();
138
- if (!t)
139
- continue;
140
- try {
141
- entries.push(JSON.parse(t));
142
- }
143
- catch {
144
- /* skip malformed line */
145
- }
146
- }
147
- return entries;
148
- }
149
- // =====================================================================
150
- // drift-catalog.jsonl — project-scoped audit trail
151
- // =====================================================================
152
- /**
153
- * Path helper for the per-project drift catalog. The catalog is
154
- * project-scoped (not session-scoped) so a project's drift history
155
- * accumulates across sessions.
156
- *
157
- * Falls back to a session-scoped path when projectUuid is null —
158
- * matches the existing drift-catalog.ts fallback shape.
159
- */
160
- export function driftCatalogPath(projectUuid, sessionId, dataRoot) {
161
- const root = resolveDataRoot(dataRoot);
162
- if (projectUuid) {
163
- return path.join(root, "projects", projectUuid, "drift-catalog.jsonl");
164
- }
165
- return path.join(root, "sessions", sessionId, "drift-catalog.jsonl");
166
- }
167
- // =====================================================================
168
- // SessionEnd cleanup — paths the cleanup phase removes
169
- // =====================================================================
170
- /**
171
- * Per-session file paths that SessionEnd should clean up. Project-scoped
172
- * files (drift-catalog.jsonl) are durable across sessions and excluded.
173
- */
174
- export function sessionStateFiles(sessionId, dataRoot) {
175
- return [activeTaskPath(sessionId, dataRoot), violationsPath(sessionId, dataRoot)];
176
- }
177
- //# sourceMappingURL=state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src.legacy/anti-drift/state.ts"],"names":[],"mappings":"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"}
@@ -1,120 +0,0 @@
1
- /**
2
- * Tests for anti-drift/state.ts (0.8 unified-evaluator track foundation).
3
- *
4
- * Each test uses a fresh tmpdir as dataRoot to keep tests hermetic.
5
- */
6
- import { promises as fs } from "node:fs";
7
- import * as os from "node:os";
8
- import * as path from "node:path";
9
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
10
- import { appendViolation, clearActiveTask, consumeViolations, driftCatalogPath, readActiveTask, sessionStateFiles, writeActiveTask, } from "./state.js";
11
- const SESSION = "test-session-xyz";
12
- let tmp;
13
- beforeEach(async () => {
14
- tmp = await fs.mkdtemp(path.join(os.tmpdir(), "anti-drift-state-"));
15
- });
16
- afterEach(async () => {
17
- await fs.rm(tmp, { recursive: true, force: true });
18
- });
19
- describe("active-task state", () => {
20
- it("readActiveTask returns null when no file exists", async () => {
21
- expect(await readActiveTask(SESSION, { dataRoot: tmp })).toBeNull();
22
- });
23
- it("writeActiveTask + readActiveTask round-trips", async () => {
24
- const state = {
25
- id: "11",
26
- subject: "scaffold anti-drift/state.ts",
27
- started_at: "2026-05-18T15:00:00.000Z",
28
- };
29
- await writeActiveTask(SESSION, state, { dataRoot: tmp });
30
- const got = await readActiveTask(SESSION, { dataRoot: tmp });
31
- expect(got).toEqual(state);
32
- });
33
- it("writeActiveTask is overwrite (idempotent for TaskUpdate semantics)", async () => {
34
- await writeActiveTask(SESSION, { id: "11", subject: "first", started_at: "2026-05-18T15:00:00.000Z" }, { dataRoot: tmp });
35
- await writeActiveTask(SESSION, { id: "11", subject: "updated", started_at: "2026-05-18T15:01:00.000Z" }, { dataRoot: tmp });
36
- const got = await readActiveTask(SESSION, { dataRoot: tmp });
37
- expect(got?.subject).toBe("updated");
38
- });
39
- it("clearActiveTask removes the file", async () => {
40
- await writeActiveTask(SESSION, { id: "11", started_at: "2026-05-18T15:00:00.000Z" }, { dataRoot: tmp });
41
- expect(await readActiveTask(SESSION, { dataRoot: tmp })).not.toBeNull();
42
- await clearActiveTask(SESSION, { dataRoot: tmp });
43
- expect(await readActiveTask(SESSION, { dataRoot: tmp })).toBeNull();
44
- });
45
- it("clearActiveTask is idempotent (no error when file absent)", async () => {
46
- await expect(clearActiveTask(SESSION, { dataRoot: tmp })).resolves.toBeUndefined();
47
- });
48
- it("readActiveTask returns null on malformed JSON (fail-safe)", async () => {
49
- const dir = path.join(tmp, "sessions", SESSION);
50
- await fs.mkdir(dir, { recursive: true });
51
- await fs.writeFile(path.join(dir, "active-task.json"), "not valid json {", "utf8");
52
- expect(await readActiveTask(SESSION, { dataRoot: tmp })).toBeNull();
53
- });
54
- it("readActiveTask returns null on missing required fields", async () => {
55
- const dir = path.join(tmp, "sessions", SESSION);
56
- await fs.mkdir(dir, { recursive: true });
57
- await fs.writeFile(path.join(dir, "active-task.json"), '{"subject":"no id field"}', "utf8");
58
- expect(await readActiveTask(SESSION, { dataRoot: tmp })).toBeNull();
59
- });
60
- });
61
- describe("violations.log", () => {
62
- it("consumeViolations returns empty array when no file exists", async () => {
63
- expect(await consumeViolations(SESSION, { dataRoot: tmp })).toEqual([]);
64
- });
65
- it("appendViolation + consumeViolations round-trips a single entry", async () => {
66
- const entry = {
67
- ts: "2026-05-18T15:05:00.000Z",
68
- rule_id: "active-task-required",
69
- verdict: "block",
70
- reason: "log_phase called without an in_progress task",
71
- };
72
- await appendViolation(SESSION, entry, { dataRoot: tmp });
73
- expect(await consumeViolations(SESSION, { dataRoot: tmp })).toEqual([entry]);
74
- });
75
- it("consumeViolations clears the file (atomic claim)", async () => {
76
- await appendViolation(SESSION, { ts: "1", rule_id: "x", verdict: "block", reason: "y" }, { dataRoot: tmp });
77
- const first = await consumeViolations(SESSION, { dataRoot: tmp });
78
- expect(first.length).toBe(1);
79
- // Second consume on now-empty state returns empty.
80
- expect(await consumeViolations(SESSION, { dataRoot: tmp })).toEqual([]);
81
- });
82
- it("multiple appends accumulate", async () => {
83
- await appendViolation(SESSION, { ts: "1", rule_id: "a", verdict: "block", reason: "r1" }, { dataRoot: tmp });
84
- await appendViolation(SESSION, { ts: "2", rule_id: "b", verdict: "warn", reason: "r2" }, { dataRoot: tmp });
85
- const got = await consumeViolations(SESSION, { dataRoot: tmp });
86
- expect(got.length).toBe(2);
87
- expect(got.map((e) => e.rule_id)).toEqual(["a", "b"]);
88
- });
89
- it("consumeViolations skips malformed lines silently", async () => {
90
- const dir = path.join(tmp, "sessions", SESSION);
91
- await fs.mkdir(dir, { recursive: true });
92
- await fs.writeFile(path.join(dir, "violations.log"), `not json\n${JSON.stringify({ ts: "1", rule_id: "ok", verdict: "warn", reason: "real" })}\n`, "utf8");
93
- const got = await consumeViolations(SESSION, { dataRoot: tmp });
94
- expect(got).toHaveLength(1);
95
- expect(got[0].rule_id).toBe("ok");
96
- });
97
- });
98
- describe("driftCatalogPath", () => {
99
- it("uses project-scoped path when projectUuid is provided", () => {
100
- const got = driftCatalogPath("abc-uuid", SESSION, tmp);
101
- expect(got).toBe(path.join(tmp, "projects", "abc-uuid", "drift-catalog.jsonl"));
102
- });
103
- it("falls back to session-scoped path when projectUuid is null", () => {
104
- const got = driftCatalogPath(null, SESSION, tmp);
105
- expect(got).toBe(path.join(tmp, "sessions", SESSION, "drift-catalog.jsonl"));
106
- });
107
- });
108
- describe("sessionStateFiles", () => {
109
- it("returns the per-session state file paths for SessionEnd cleanup", () => {
110
- const got = sessionStateFiles(SESSION, tmp);
111
- expect(got).toContain(path.join(tmp, "sessions", SESSION, "active-task.json"));
112
- expect(got).toContain(path.join(tmp, "sessions", SESSION, "violations.log"));
113
- expect(got).toHaveLength(2);
114
- });
115
- it("does NOT include project-scoped paths (drift-catalog.jsonl is durable across sessions)", () => {
116
- const got = sessionStateFiles(SESSION, tmp);
117
- expect(got.every((p) => !p.includes("/projects/"))).toBe(true);
118
- expect(got.every((p) => !p.endsWith("drift-catalog.jsonl"))).toBe(true);
119
- });
120
- });
@@ -1,41 +0,0 @@
1
- /**
2
- * Discord adapter — Gateway WebSocket via discord.js (v0.7b).
3
- *
4
- * SDK: `discord.js` v14 (npm i discord.js as optionalDependency).
5
- * Discord's Gateway protocol is non-trivial — heartbeats, resume
6
- * tokens, sharding, identify backoff, zlib decompression. Rolling our
7
- * own WebSocket client would be ~500 LOC of fragile protocol code.
8
- * One big SDK we import a few symbols from is the right tradeoff.
9
- *
10
- * Connection: outbound WebSocket via `client.login(token)`. No public
11
- * webhook URL. Works behind any NAT.
12
- *
13
- * Intents: `Guilds`, `GuildMessages`, `MessageContent`, `DirectMessages`
14
- * — forgetting DirectMessages silently drops DM events, a known
15
- * newcomer gotcha. MESSAGE CONTENT is a privileged intent that needs
16
- * to be enabled in the Developer Portal but is exempt for DMs and
17
- * @-mentions, so personal-bot DM use works regardless.
18
- *
19
- * Dynamic import discipline matches [[telegram-adapter]] — non-discord
20
- * installs pay zero cost.
21
- */
22
- import { type ChatAdapter, type MessageHandler, type OutboundMessage, type SendResult } from "../gateway.js";
23
- import type { DiscordConfig } from "../config.js";
24
- export declare class DiscordAdapter implements ChatAdapter {
25
- private readonly config;
26
- readonly platform: "discord";
27
- private client;
28
- private handlers;
29
- private botUsername;
30
- private botId;
31
- constructor(config: DiscordConfig);
32
- start(): Promise<void>;
33
- shutdown(): Promise<void>;
34
- onMessage(handler: MessageHandler): void;
35
- send(message: OutboundMessage): Promise<SendResult>;
36
- identity(): Promise<{
37
- username: string;
38
- nativeId: string;
39
- }>;
40
- }
41
- //# sourceMappingURL=discord.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../src.legacy/chat/adapters/discord.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,EAEhB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA6ClD,qBAAa,cAAe,YAAW,WAAW;IAQpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPnC,QAAQ,CAAC,QAAQ,EAAG,SAAS,CAAU;IAEvC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,KAAK,CAAM;gBAEU,MAAM,EAAE,aAAa;IAS5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsGtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIlC,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BnD,QAAQ,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAMlE"}
@@ -1,176 +0,0 @@
1
- /**
2
- * Discord adapter — Gateway WebSocket via discord.js (v0.7b).
3
- *
4
- * SDK: `discord.js` v14 (npm i discord.js as optionalDependency).
5
- * Discord's Gateway protocol is non-trivial — heartbeats, resume
6
- * tokens, sharding, identify backoff, zlib decompression. Rolling our
7
- * own WebSocket client would be ~500 LOC of fragile protocol code.
8
- * One big SDK we import a few symbols from is the right tradeoff.
9
- *
10
- * Connection: outbound WebSocket via `client.login(token)`. No public
11
- * webhook URL. Works behind any NAT.
12
- *
13
- * Intents: `Guilds`, `GuildMessages`, `MessageContent`, `DirectMessages`
14
- * — forgetting DirectMessages silently drops DM events, a known
15
- * newcomer gotcha. MESSAGE CONTENT is a privileged intent that needs
16
- * to be enabled in the Developer Portal but is exempt for DMs and
17
- * @-mentions, so personal-bot DM use works regardless.
18
- *
19
- * Dynamic import discipline matches [[telegram-adapter]] — non-discord
20
- * installs pay zero cost.
21
- */
22
- import { ChatGatewayError, formatChannelId, } from "../gateway.js";
23
- export class DiscordAdapter {
24
- config;
25
- platform = "discord";
26
- client = null;
27
- handlers = [];
28
- botUsername = "";
29
- botId = "";
30
- constructor(config) {
31
- this.config = config;
32
- if (!config.bot_token?.trim()) {
33
- throw new ChatGatewayError("discord adapter: bot_token is required", "set chat_connections.discord.bot_token in ~/.opensquid/config.json");
34
- }
35
- }
36
- async start() {
37
- if (this.client)
38
- return;
39
- let Client;
40
- let GatewayIntentBits;
41
- try {
42
- const discord = (await import("discord.js"));
43
- Client = discord.Client;
44
- GatewayIntentBits = discord.GatewayIntentBits;
45
- }
46
- catch (err) {
47
- // v0.7 audit fix (M5): distinguish not-installed from installed-but-threw.
48
- const code = err?.code;
49
- if (code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND") {
50
- throw new ChatGatewayError("discord adapter: 'discord.js' SDK not installed", "run `npm install discord.js` (or reinstall opensquid without --omit=optional)");
51
- }
52
- throw new ChatGatewayError(`discord adapter: 'discord.js' SDK failed to load: ${err instanceof Error ? err.message : String(err)}`, "the SDK is installed but threw on import — check node version compatibility");
53
- }
54
- const client = new Client({
55
- intents: [
56
- GatewayIntentBits.Guilds,
57
- GatewayIntentBits.GuildMessages,
58
- GatewayIntentBits.MessageContent,
59
- GatewayIntentBits.DirectMessages,
60
- ],
61
- });
62
- this.client = client;
63
- // Capture identity once the gateway handshake completes.
64
- const ready = new Promise((resolve) => {
65
- client.once("ready", () => {
66
- const me = client.user;
67
- if (me) {
68
- this.botUsername = me.username;
69
- this.botId = me.id;
70
- }
71
- resolve();
72
- });
73
- });
74
- client.on("messageCreate", async (m) => {
75
- if (m.author.bot)
76
- return; // ignore bot-authored messages (including ourselves)
77
- // Allowlist enforcement on sender user id.
78
- if (this.config.allowlist_user_ids &&
79
- this.config.allowlist_user_ids.length > 0 &&
80
- !this.config.allowlist_user_ids.includes(m.author.id)) {
81
- return;
82
- }
83
- const normalized = {
84
- id: m.id,
85
- platform: "discord",
86
- channel: formatChannelId("discord", m.channelId),
87
- sender: m.author.username,
88
- senderId: m.author.id,
89
- text: m.content,
90
- receivedAt: new Date(m.createdTimestamp),
91
- mentionsBot: client.user ? m.mentions.has(client.user) : false,
92
- };
93
- for (const h of this.handlers) {
94
- try {
95
- await h(normalized);
96
- }
97
- catch (err) {
98
- const msg = err instanceof Error ? err.message : String(err);
99
- // eslint-disable-next-line no-console
100
- console.error(`[discord adapter] handler error: ${msg}`);
101
- }
102
- }
103
- });
104
- // login() rejects on bad token; ready resolves after the handshake.
105
- // v0.7 audit fix (H2): the `MessageContent` intent is privileged and
106
- // requires explicit enablement in the Discord Developer Portal. Without
107
- // it, login() throws `DisallowedIntents` with a cryptic message. Catch
108
- // and rethrow with an actionable hint pointing at the Dev Portal toggle.
109
- try {
110
- await client.login(this.config.bot_token);
111
- }
112
- catch (err) {
113
- const msg = err instanceof Error ? err.message : String(err);
114
- if (/disallowed intent|used disallowed/i.test(msg)) {
115
- // discard the half-built client
116
- this.client = null;
117
- throw new ChatGatewayError("discord adapter: bot is requesting privileged intents that aren't enabled", "go to https://discord.com/developers/applications → your app → Bot → Privileged Gateway Intents → toggle ON 'MESSAGE CONTENT INTENT'. DMs and @-mentions are exempt but channel content needs the toggle.");
118
- }
119
- this.client = null;
120
- throw err;
121
- }
122
- await ready;
123
- }
124
- async shutdown() {
125
- if (!this.client)
126
- return;
127
- try {
128
- await this.client.destroy();
129
- }
130
- catch {
131
- // best-effort
132
- }
133
- this.client = null;
134
- }
135
- onMessage(handler) {
136
- this.handlers.push(handler);
137
- }
138
- async send(message) {
139
- if (!this.client) {
140
- throw new ChatGatewayError("discord adapter: not started", "call gateway.start() before send()");
141
- }
142
- const channelId = nativeChannelIdFromChannel(message.channel);
143
- const channel = await this.client.channels.fetch(channelId);
144
- if (!channel) {
145
- throw new ChatGatewayError(`discord adapter: channel '${channelId}' not found or bot lacks access`);
146
- }
147
- const payload = message.replyTo !== undefined
148
- ? { content: message.text, reply: { messageReference: message.replyTo } }
149
- : message.text;
150
- const sent = await channel.send(payload);
151
- return {
152
- platform: "discord",
153
- messageId: sent.id,
154
- deliveredAt: new Date(sent.createdTimestamp),
155
- };
156
- }
157
- async identity() {
158
- if (!this.client) {
159
- throw new ChatGatewayError("discord adapter: not started");
160
- }
161
- return { username: this.botUsername, nativeId: this.botId };
162
- }
163
- }
164
- // ---------------------------------------------------------------------
165
- // Helpers
166
- // ---------------------------------------------------------------------
167
- function nativeChannelIdFromChannel(channel) {
168
- const idx = channel.indexOf(":");
169
- if (idx === -1) {
170
- throw new ChatGatewayError(`malformed channel id '${channel}'`);
171
- }
172
- if (channel.slice(0, idx) !== "discord") {
173
- throw new ChatGatewayError(`discord adapter received non-discord channel: '${channel}'`);
174
- }
175
- return channel.slice(idx + 1);
176
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src.legacy/chat/adapters/discord.ts"],"names":[],"mappings":"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"}