opensquid 0.5.432 → 0.5.447

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 (440) 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/event.d.ts.map +1 -1
  7. package/dist/functions/event.js +18 -2
  8. package/dist/functions/event.js.map +1 -1
  9. package/dist/functions/index.d.ts +4 -0
  10. package/dist/functions/index.d.ts.map +1 -1
  11. package/dist/functions/index.js +4 -0
  12. package/dist/functions/index.js.map +1 -1
  13. package/dist/functions/inject_context.d.ts +18 -0
  14. package/dist/functions/inject_context.d.ts.map +1 -0
  15. package/dist/functions/inject_context.js +16 -0
  16. package/dist/functions/inject_context.js.map +1 -0
  17. package/dist/functions/procedure_pre_inject.d.ts +23 -0
  18. package/dist/functions/procedure_pre_inject.d.ts.map +1 -0
  19. package/dist/functions/procedure_pre_inject.js +49 -0
  20. package/dist/functions/procedure_pre_inject.js.map +1 -0
  21. package/dist/functions/registry.d.ts +6 -0
  22. package/dist/functions/registry.d.ts.map +1 -1
  23. package/dist/functions/registry.js.map +1 -1
  24. package/dist/functions/rubric_pre_inject.d.ts.map +1 -1
  25. package/dist/functions/rubric_pre_inject.js +2 -1
  26. package/dist/functions/rubric_pre_inject.js.map +1 -1
  27. package/dist/functions/set_request_type.d.ts +11 -0
  28. package/dist/functions/set_request_type.d.ts.map +1 -0
  29. package/dist/functions/set_request_type.js +34 -0
  30. package/dist/functions/set_request_type.js.map +1 -0
  31. package/dist/functions/shell_parse.d.ts +1 -0
  32. package/dist/functions/shell_parse.d.ts.map +1 -1
  33. package/dist/functions/shell_parse.js +22 -4
  34. package/dist/functions/shell_parse.js.map +1 -1
  35. package/dist/packs/loader.d.ts.map +1 -1
  36. package/dist/packs/loader.js +26 -0
  37. package/dist/packs/loader.js.map +1 -1
  38. package/dist/runtime/bootstrap.d.ts.map +1 -1
  39. package/dist/runtime/bootstrap.js +6 -0
  40. package/dist/runtime/bootstrap.js.map +1 -1
  41. package/dist/runtime/fsm_state.d.ts +6 -0
  42. package/dist/runtime/fsm_state.d.ts.map +1 -1
  43. package/dist/runtime/fsm_state.js +14 -0
  44. package/dist/runtime/fsm_state.js.map +1 -1
  45. package/dist/runtime/handoff/render.d.ts +5 -4
  46. package/dist/runtime/handoff/render.d.ts.map +1 -1
  47. package/dist/runtime/handoff/render.js +7 -7
  48. package/dist/runtime/handoff/render.js.map +1 -1
  49. package/dist/runtime/handoff/stranded_scoping.d.ts +21 -0
  50. package/dist/runtime/handoff/stranded_scoping.d.ts.map +1 -0
  51. package/dist/runtime/handoff/stranded_scoping.js +39 -0
  52. package/dist/runtime/handoff/stranded_scoping.js.map +1 -0
  53. package/dist/runtime/hooks/active_task_mirror.js +0 -0
  54. package/dist/runtime/hooks/apply_patch.js +0 -0
  55. package/dist/runtime/hooks/dispatch.d.ts.map +1 -1
  56. package/dist/runtime/hooks/dispatch.js +3 -0
  57. package/dist/runtime/hooks/dispatch.js.map +1 -1
  58. package/dist/runtime/hooks/hook_output.js +0 -0
  59. package/dist/runtime/hooks/memory_reconcile.js +0 -0
  60. package/dist/runtime/hooks/new_project_detect.js +0 -0
  61. package/dist/runtime/hooks/profession_resolver.js +0 -0
  62. package/dist/runtime/hooks/scope_intent.js +0 -0
  63. package/dist/runtime/hooks/session-start.js +17 -0
  64. package/dist/runtime/hooks/session-start.js.map +1 -1
  65. package/dist/runtime/hooks/session_id.js +0 -0
  66. package/dist/runtime/hooks/session_liveness.js +0 -0
  67. package/dist/runtime/hooks/stop_drive.js +0 -0
  68. package/dist/runtime/hooks/stop_stream.js +0 -0
  69. package/dist/runtime/hooks/subagent_guard.js +0 -0
  70. package/dist/runtime/hooks/transcript.js +0 -0
  71. package/dist/runtime/hooks/transcript_tasks.js +0 -0
  72. package/dist/runtime/hooks/user-prompt-submit.d.ts.map +1 -1
  73. package/dist/runtime/hooks/user-prompt-submit.js +22 -1
  74. package/dist/runtime/hooks/user-prompt-submit.js.map +1 -1
  75. package/dist/runtime/ralph/orchestrator.d.ts.map +1 -1
  76. package/dist/runtime/ralph/orchestrator.js +2 -1
  77. package/dist/runtime/ralph/orchestrator.js.map +1 -1
  78. package/dist/runtime/request_type.d.ts +33 -0
  79. package/dist/runtime/request_type.d.ts.map +1 -0
  80. package/dist/runtime/request_type.js +38 -0
  81. package/dist/runtime/request_type.js.map +1 -0
  82. package/dist/runtime/session_state.d.ts +11 -0
  83. package/dist/runtime/session_state.d.ts.map +1 -1
  84. package/dist/runtime/session_state.js +30 -0
  85. package/dist/runtime/session_state.js.map +1 -1
  86. package/dist/runtime/types.d.ts +5 -0
  87. package/dist/runtime/types.d.ts.map +1 -1
  88. package/dist/runtime/types.js +3 -0
  89. package/dist/runtime/types.js.map +1 -1
  90. package/dist/setup/cli/limits_state.d.ts.map +1 -1
  91. package/dist/setup/cli/limits_state.js +6 -40
  92. package/dist/setup/cli/limits_state.js.map +1 -1
  93. package/dist/setup/cli/pack_walk.d.ts +32 -0
  94. package/dist/setup/cli/pack_walk.d.ts.map +1 -0
  95. package/dist/setup/cli/pack_walk.js +76 -0
  96. package/dist/setup/cli/pack_walk.js.map +1 -0
  97. package/dist/setup/cli/permissions_state.d.ts.map +1 -1
  98. package/dist/setup/cli/permissions_state.js +6 -37
  99. package/dist/setup/cli/permissions_state.js.map +1 -1
  100. package/dist/setup/cli/triggers_state.d.ts.map +1 -1
  101. package/dist/setup/cli/triggers_state.js +3 -29
  102. package/dist/setup/cli/triggers_state.js.map +1 -1
  103. package/dist/workgraph/events.d.ts.map +1 -1
  104. package/dist/workgraph/events.js +10 -0
  105. package/dist/workgraph/events.js.map +1 -1
  106. package/dist/workgraph/store.d.ts.map +1 -1
  107. package/dist/workgraph/store.js +5 -0
  108. package/dist/workgraph/store.js.map +1 -1
  109. package/dist/workgraph/types.d.ts +2 -1
  110. package/dist/workgraph/types.d.ts.map +1 -1
  111. package/docs/ARCHITECTURE.md +268 -0
  112. package/docs/pack-runtime.md +26 -10
  113. package/package.json +5 -3
  114. package/packs/builtin/coding-flow/procedure.md +43 -0
  115. package/packs/builtin/coding-flow/skills/entry-and-handoffs/skill.yaml +49 -6
  116. package/packs/builtin/coding-flow/skills/pause-stop-guard/skill.yaml +11 -1
  117. package/packs/builtin/default-discipline/manifest.yaml +15 -6
  118. package/packs/builtin/pack-architect/skills/skill-yaml-author-walkthrough/skill.yaml +8 -0
  119. package/dist/anti-drift/evaluator.d.ts +0 -88
  120. package/dist/anti-drift/evaluator.d.ts.map +0 -1
  121. package/dist/anti-drift/evaluator.js +0 -417
  122. package/dist/anti-drift/evaluator.js.map +0 -1
  123. package/dist/anti-drift/evaluator.test.js +0 -78
  124. package/dist/anti-drift/rules.d.ts +0 -80
  125. package/dist/anti-drift/rules.d.ts.map +0 -1
  126. package/dist/anti-drift/rules.js +0 -368
  127. package/dist/anti-drift/rules.js.map +0 -1
  128. package/dist/anti-drift/rules.test.js +0 -213
  129. package/dist/anti-drift/state.d.ts +0 -107
  130. package/dist/anti-drift/state.d.ts.map +0 -1
  131. package/dist/anti-drift/state.js +0 -177
  132. package/dist/anti-drift/state.js.map +0 -1
  133. package/dist/anti-drift/state.test.js +0 -120
  134. package/dist/chat/adapters/discord.d.ts +0 -41
  135. package/dist/chat/adapters/discord.d.ts.map +0 -1
  136. package/dist/chat/adapters/discord.js +0 -176
  137. package/dist/chat/adapters/discord.js.map +0 -1
  138. package/dist/chat/adapters/discord.test.js +0 -25
  139. package/dist/chat/adapters/slack.d.ts +0 -43
  140. package/dist/chat/adapters/slack.d.ts.map +0 -1
  141. package/dist/chat/adapters/slack.js +0 -172
  142. package/dist/chat/adapters/slack.js.map +0 -1
  143. package/dist/chat/adapters/slack.test.js +0 -30
  144. package/dist/chat/adapters/telegram.d.ts +0 -148
  145. package/dist/chat/adapters/telegram.d.ts.map +0 -1
  146. package/dist/chat/adapters/telegram.js +0 -498
  147. package/dist/chat/adapters/telegram.js.map +0 -1
  148. package/dist/chat/adapters/telegram.test.js +0 -94
  149. package/dist/chat/config.d.ts +0 -98
  150. package/dist/chat/config.d.ts.map +0 -1
  151. package/dist/chat/config.js +0 -185
  152. package/dist/chat/config.js.map +0 -1
  153. package/dist/chat/daemon/active-project.d.ts +0 -17
  154. package/dist/chat/daemon/active-project.d.ts.map +0 -1
  155. package/dist/chat/daemon/active-project.js +0 -23
  156. package/dist/chat/daemon/active-project.js.map +0 -1
  157. package/dist/chat/daemon/autospawn.d.ts +0 -40
  158. package/dist/chat/daemon/autospawn.d.ts.map +0 -1
  159. package/dist/chat/daemon/autospawn.js +0 -129
  160. package/dist/chat/daemon/autospawn.js.map +0 -1
  161. package/dist/chat/daemon/autospawn.test.js +0 -112
  162. package/dist/chat/daemon/cli.d.ts +0 -18
  163. package/dist/chat/daemon/cli.d.ts.map +0 -1
  164. package/dist/chat/daemon/cli.js +0 -71
  165. package/dist/chat/daemon/cli.js.map +0 -1
  166. package/dist/chat/daemon/collisions.js +0 -384
  167. package/dist/chat/daemon/health-check.d.ts +0 -69
  168. package/dist/chat/daemon/health-check.d.ts.map +0 -1
  169. package/dist/chat/daemon/health-check.js +0 -112
  170. package/dist/chat/daemon/health-check.js.map +0 -1
  171. package/dist/chat/daemon/inbox-read.d.ts +0 -35
  172. package/dist/chat/daemon/inbox-read.d.ts.map +0 -1
  173. package/dist/chat/daemon/inbox-read.js +0 -75
  174. package/dist/chat/daemon/inbox-read.js.map +0 -1
  175. package/dist/chat/daemon/inbox-read.test.js +0 -97
  176. package/dist/chat/daemon/inbox.d.ts +0 -63
  177. package/dist/chat/daemon/inbox.d.ts.map +0 -1
  178. package/dist/chat/daemon/inbox.js +0 -56
  179. package/dist/chat/daemon/inbox.js.map +0 -1
  180. package/dist/chat/daemon/inbox.test.js +0 -110
  181. package/dist/chat/daemon/lifecycle.d.ts +0 -71
  182. package/dist/chat/daemon/lifecycle.d.ts.map +0 -1
  183. package/dist/chat/daemon/lifecycle.js +0 -221
  184. package/dist/chat/daemon/lifecycle.js.map +0 -1
  185. package/dist/chat/daemon/lifecycle.test.js +0 -163
  186. package/dist/chat/daemon/protocol.d.ts +0 -107
  187. package/dist/chat/daemon/protocol.d.ts.map +0 -1
  188. package/dist/chat/daemon/protocol.js +0 -54
  189. package/dist/chat/daemon/protocol.js.map +0 -1
  190. package/dist/chat/daemon/routing.d.ts +0 -140
  191. package/dist/chat/daemon/routing.d.ts.map +0 -1
  192. package/dist/chat/daemon/routing.js +0 -198
  193. package/dist/chat/daemon/routing.js.map +0 -1
  194. package/dist/chat/daemon/routing.test.js +0 -259
  195. package/dist/chat/daemon/rpc-client.d.ts +0 -45
  196. package/dist/chat/daemon/rpc-client.d.ts.map +0 -1
  197. package/dist/chat/daemon/rpc-client.js +0 -133
  198. package/dist/chat/daemon/rpc-client.js.map +0 -1
  199. package/dist/chat/daemon/rpc-server.d.ts +0 -39
  200. package/dist/chat/daemon/rpc-server.d.ts.map +0 -1
  201. package/dist/chat/daemon/rpc-server.js +0 -385
  202. package/dist/chat/daemon/rpc-server.js.map +0 -1
  203. package/dist/chat/daemon/rpc.test.js +0 -177
  204. package/dist/chat/daemon/subscribers.js +0 -257
  205. package/dist/chat/daemon/worker.d.ts +0 -27
  206. package/dist/chat/daemon/worker.d.ts.map +0 -1
  207. package/dist/chat/daemon/worker.js +0 -313
  208. package/dist/chat/daemon/worker.js.map +0 -1
  209. package/dist/chat/daemon/workspace-topic.js +0 -324
  210. package/dist/chat/env-token.d.ts +0 -60
  211. package/dist/chat/env-token.d.ts.map +0 -1
  212. package/dist/chat/env-token.js +0 -137
  213. package/dist/chat/env-token.js.map +0 -1
  214. package/dist/chat/env-token.test.js +0 -160
  215. package/dist/chat/factory.d.ts +0 -30
  216. package/dist/chat/factory.d.ts.map +0 -1
  217. package/dist/chat/factory.js +0 -50
  218. package/dist/chat/factory.js.map +0 -1
  219. package/dist/chat/factory.test.js +0 -55
  220. package/dist/chat/gateway.d.ts +0 -176
  221. package/dist/chat/gateway.d.ts.map +0 -1
  222. package/dist/chat/gateway.js +0 -146
  223. package/dist/chat/gateway.js.map +0 -1
  224. package/dist/chat/gateway.test.js +0 -192
  225. package/dist/claude-md.d.ts +0 -39
  226. package/dist/claude-md.d.ts.map +0 -1
  227. package/dist/claude-md.js +0 -113
  228. package/dist/claude-md.js.map +0 -1
  229. package/dist/claude-md.test.js +0 -91
  230. package/dist/codex/activate.d.ts +0 -66
  231. package/dist/codex/activate.d.ts.map +0 -1
  232. package/dist/codex/activate.js +0 -329
  233. package/dist/codex/activate.js.map +0 -1
  234. package/dist/codex/activate.test.js +0 -229
  235. package/dist/codex/bundled-default/bundled-default.test.js +0 -161
  236. package/dist/codex/cli-publish.test.js +0 -133
  237. package/dist/codex/cli.d.ts +0 -35
  238. package/dist/codex/cli.d.ts.map +0 -1
  239. package/dist/codex/cli.js +0 -554
  240. package/dist/codex/cli.js.map +0 -1
  241. package/dist/codex/cli.test.js +0 -277
  242. package/dist/codex/import-skill-md.d.ts +0 -53
  243. package/dist/codex/import-skill-md.d.ts.map +0 -1
  244. package/dist/codex/import-skill-md.js +0 -236
  245. package/dist/codex/import-skill-md.js.map +0 -1
  246. package/dist/codex/import-skill-md.test.js +0 -225
  247. package/dist/codex/loader.d.ts +0 -27
  248. package/dist/codex/loader.d.ts.map +0 -1
  249. package/dist/codex/loader.js +0 -86
  250. package/dist/codex/loader.js.map +0 -1
  251. package/dist/codex/loader.test.js +0 -75
  252. package/dist/codex/parse.d.ts +0 -28
  253. package/dist/codex/parse.d.ts.map +0 -1
  254. package/dist/codex/parse.js +0 -309
  255. package/dist/codex/parse.js.map +0 -1
  256. package/dist/codex/parse.test.js +0 -241
  257. package/dist/codex/store.d.ts +0 -87
  258. package/dist/codex/store.d.ts.map +0 -1
  259. package/dist/codex/store.js +0 -205
  260. package/dist/codex/store.js.map +0 -1
  261. package/dist/codex/store.test.js +0 -242
  262. package/dist/codex/types.d.ts +0 -398
  263. package/dist/codex/types.d.ts.map +0 -1
  264. package/dist/codex/types.js +0 -21
  265. package/dist/codex/types.js.map +0 -1
  266. package/dist/config.d.ts +0 -53
  267. package/dist/config.d.ts.map +0 -1
  268. package/dist/config.js +0 -202
  269. package/dist/config.js.map +0 -1
  270. package/dist/config.test.js +0 -117
  271. package/dist/engine/cli.d.ts +0 -14
  272. package/dist/engine/cli.d.ts.map +0 -1
  273. package/dist/engine/cli.js +0 -171
  274. package/dist/engine/cli.js.map +0 -1
  275. package/dist/engine/client.d.ts +0 -219
  276. package/dist/engine/client.d.ts.map +0 -1
  277. package/dist/engine/client.js +0 -312
  278. package/dist/engine/client.js.map +0 -1
  279. package/dist/engine/config.d.ts +0 -62
  280. package/dist/engine/config.d.ts.map +0 -1
  281. package/dist/engine/config.js +0 -223
  282. package/dist/engine/config.js.map +0 -1
  283. package/dist/engine/index.d.ts +0 -17
  284. package/dist/engine/index.d.ts.map +0 -1
  285. package/dist/engine/index.js +0 -16
  286. package/dist/engine/index.js.map +0 -1
  287. package/dist/engine/resolver.d.ts +0 -62
  288. package/dist/engine/resolver.d.ts.map +0 -1
  289. package/dist/engine/resolver.js +0 -103
  290. package/dist/engine/resolver.js.map +0 -1
  291. package/dist/engine/singleton.d.ts +0 -95
  292. package/dist/engine/singleton.d.ts.map +0 -1
  293. package/dist/engine/singleton.js +0 -325
  294. package/dist/engine/singleton.js.map +0 -1
  295. package/dist/engine/types.d.ts +0 -402
  296. package/dist/engine/types.d.ts.map +0 -1
  297. package/dist/engine/types.js +0 -22
  298. package/dist/engine/types.js.map +0 -1
  299. package/dist/engine-binary-resolver.js +0 -110
  300. package/dist/engine-binary-resolver.test.js +0 -61
  301. package/dist/engine-cli.js +0 -60
  302. package/dist/engine-client.js +0 -301
  303. package/dist/engine-client.test.js +0 -118
  304. package/dist/functions/chain_state.d.ts +0 -51
  305. package/dist/functions/chain_state.d.ts.map +0 -1
  306. package/dist/functions/chain_state.js +0 -59
  307. package/dist/functions/chain_state.js.map +0 -1
  308. package/dist/hooks/drift-catalog.d.ts +0 -68
  309. package/dist/hooks/drift-catalog.d.ts.map +0 -1
  310. package/dist/hooks/drift-catalog.js +0 -184
  311. package/dist/hooks/drift-catalog.js.map +0 -1
  312. package/dist/hooks/drift-catalog.test.js +0 -154
  313. package/dist/hooks/drift-patterns.d.ts +0 -110
  314. package/dist/hooks/drift-patterns.d.ts.map +0 -1
  315. package/dist/hooks/drift-patterns.js +0 -289
  316. package/dist/hooks/drift-patterns.js.map +0 -1
  317. package/dist/hooks/drift-patterns.test.js +0 -325
  318. package/dist/hooks/engine-vocab-gate.d.ts +0 -108
  319. package/dist/hooks/engine-vocab-gate.d.ts.map +0 -1
  320. package/dist/hooks/engine-vocab-gate.js +0 -225
  321. package/dist/hooks/engine-vocab-gate.js.map +0 -1
  322. package/dist/hooks/engine-vocab-gate.test.js +0 -170
  323. package/dist/hooks/heartbeat.d.ts +0 -107
  324. package/dist/hooks/heartbeat.d.ts.map +0 -1
  325. package/dist/hooks/heartbeat.js +0 -316
  326. package/dist/hooks/heartbeat.js.map +0 -1
  327. package/dist/hooks/heartbeat.test.js +0 -393
  328. package/dist/hooks/honesty-ledger-session-scope.test.js +0 -100
  329. package/dist/hooks/honesty-ledger.d.ts +0 -123
  330. package/dist/hooks/honesty-ledger.d.ts.map +0 -1
  331. package/dist/hooks/honesty-ledger.js +0 -226
  332. package/dist/hooks/honesty-ledger.js.map +0 -1
  333. package/dist/hooks/honesty-ledger.test.js +0 -466
  334. package/dist/hooks/inline-report-check.d.ts +0 -63
  335. package/dist/hooks/inline-report-check.d.ts.map +0 -1
  336. package/dist/hooks/inline-report-check.js +0 -88
  337. package/dist/hooks/inline-report-check.js.map +0 -1
  338. package/dist/hooks/inline-report-check.test.js +0 -96
  339. package/dist/hooks/pre-tool-use.d.ts +0 -62
  340. package/dist/hooks/pre-tool-use.d.ts.map +0 -1
  341. package/dist/hooks/pre-tool-use.js +0 -342
  342. package/dist/hooks/pre-tool-use.js.map +0 -1
  343. package/dist/hooks/pre-tool-use.test.js +0 -134
  344. package/dist/hooks/session-end.d.ts +0 -15
  345. package/dist/hooks/session-end.d.ts.map +0 -1
  346. package/dist/hooks/session-end.js +0 -60
  347. package/dist/hooks/session-end.js.map +0 -1
  348. package/dist/hooks/session-end.test.js +0 -52
  349. package/dist/hooks/stop.d.ts +0 -35
  350. package/dist/hooks/stop.d.ts.map +0 -1
  351. package/dist/hooks/stop.js +0 -136
  352. package/dist/hooks/stop.js.map +0 -1
  353. package/dist/hooks/transcript-active-task.test.js +0 -342
  354. package/dist/hooks/transcript.d.ts +0 -26
  355. package/dist/hooks/transcript.d.ts.map +0 -1
  356. package/dist/hooks/transcript.js +0 -266
  357. package/dist/hooks/transcript.js.map +0 -1
  358. package/dist/hooks/transcript.test.js +0 -103
  359. package/dist/hooks/user-prompt-submit.d.ts +0 -74
  360. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  361. package/dist/hooks/user-prompt-submit.js +0 -256
  362. package/dist/hooks/user-prompt-submit.js.map +0 -1
  363. package/dist/hooks/user-prompt-submit.test.js +0 -118
  364. package/dist/hooks/versioning-gate.d.ts +0 -101
  365. package/dist/hooks/versioning-gate.d.ts.map +0 -1
  366. package/dist/hooks/versioning-gate.js +0 -245
  367. package/dist/hooks/versioning-gate.js.map +0 -1
  368. package/dist/hooks/versioning-gate.test.js +0 -368
  369. package/dist/hooks/workflow-gate.d.ts +0 -64
  370. package/dist/hooks/workflow-gate.d.ts.map +0 -1
  371. package/dist/hooks/workflow-gate.js +0 -152
  372. package/dist/hooks/workflow-gate.js.map +0 -1
  373. package/dist/hooks/workflow-gate.test.js +0 -197
  374. package/dist/hooks-cli.d.ts +0 -25
  375. package/dist/hooks-cli.d.ts.map +0 -1
  376. package/dist/hooks-cli.js +0 -286
  377. package/dist/hooks-cli.js.map +0 -1
  378. package/dist/hooks-cli.test.js +0 -148
  379. package/dist/origin.d.ts +0 -16
  380. package/dist/origin.d.ts.map +0 -1
  381. package/dist/origin.js +0 -92
  382. package/dist/origin.js.map +0 -1
  383. package/dist/packs/seed_lessons_ingest.d.ts +0 -30
  384. package/dist/packs/seed_lessons_ingest.d.ts.map +0 -1
  385. package/dist/packs/seed_lessons_ingest.js +0 -107
  386. package/dist/packs/seed_lessons_ingest.js.map +0 -1
  387. package/dist/project-cli.d.ts +0 -7
  388. package/dist/project-cli.d.ts.map +0 -1
  389. package/dist/project-cli.js +0 -145
  390. package/dist/project-cli.js.map +0 -1
  391. package/dist/project.d.ts +0 -127
  392. package/dist/project.d.ts.map +0 -1
  393. package/dist/project.js +0 -281
  394. package/dist/project.js.map +0 -1
  395. package/dist/project.test.js +0 -287
  396. package/dist/rag/backends/loop_engine.d.ts +0 -61
  397. package/dist/rag/backends/loop_engine.d.ts.map +0 -1
  398. package/dist/rag/backends/loop_engine.js +0 -160
  399. package/dist/rag/backends/loop_engine.js.map +0 -1
  400. package/dist/recall.d.ts +0 -82
  401. package/dist/recall.d.ts.map +0 -1
  402. package/dist/recall.js +0 -81
  403. package/dist/recall.js.map +0 -1
  404. package/dist/runtime/agent_bridge/autospawn.d.ts +0 -131
  405. package/dist/runtime/agent_bridge/autospawn.d.ts.map +0 -1
  406. package/dist/runtime/agent_bridge/autospawn.js +0 -251
  407. package/dist/runtime/agent_bridge/autospawn.js.map +0 -1
  408. package/dist/runtime/chain_state.d.ts +0 -124
  409. package/dist/runtime/chain_state.d.ts.map +0 -1
  410. package/dist/runtime/chain_state.js +0 -189
  411. package/dist/runtime/chain_state.js.map +0 -1
  412. package/dist/runtime/hooks/permission_decision.d.ts +0 -34
  413. package/dist/runtime/hooks/permission_decision.d.ts.map +0 -1
  414. package/dist/runtime/hooks/permission_decision.js +0 -39
  415. package/dist/runtime/hooks/permission_decision.js.map +0 -1
  416. package/dist/runtime/workflow_fsm.d.ts +0 -21
  417. package/dist/runtime/workflow_fsm.d.ts.map +0 -1
  418. package/dist/runtime/workflow_fsm.js +0 -25
  419. package/dist/runtime/workflow_fsm.js.map +0 -1
  420. package/dist/runtime/workflow_map.d.ts +0 -26
  421. package/dist/runtime/workflow_map.d.ts.map +0 -1
  422. package/dist/runtime/workflow_map.js +0 -38
  423. package/dist/runtime/workflow_map.js.map +0 -1
  424. package/dist/scope.d.ts +0 -48
  425. package/dist/scope.d.ts.map +0 -1
  426. package/dist/scope.js +0 -111
  427. package/dist/scope.js.map +0 -1
  428. package/dist/setup/cli/topic_create_step.d.ts +0 -84
  429. package/dist/setup/cli/topic_create_step.d.ts.map +0 -1
  430. package/dist/setup/cli/topic_create_step.js +0 -213
  431. package/dist/setup/cli/topic_create_step.js.map +0 -1
  432. package/dist/system-export.d.ts +0 -65
  433. package/dist/system-export.d.ts.map +0 -1
  434. package/dist/system-export.js +0 -194
  435. package/dist/system-export.js.map +0 -1
  436. package/dist/utterance/classifier.d.ts +0 -53
  437. package/dist/utterance/classifier.d.ts.map +0 -1
  438. package/dist/utterance/classifier.js +0 -184
  439. package/dist/utterance/classifier.js.map +0 -1
  440. package/dist/utterance/classifier.test.js +0 -147
@@ -1,213 +0,0 @@
1
- /**
2
- * Tests for anti-drift/rules.ts (0.7.33 unified-evaluator track).
3
- *
4
- * Validates:
5
- * 1. Catalog shape — every rule has the required fields
6
- * 2. rulesForEvent filtering — by event + bypass env var
7
- * 3. evaluateRules behavior — PreToolUse short-circuits on block
8
- * 4. Specific rule when() predicates fire correctly
9
- *
10
- * Deep behavioral coverage of each rule's check() lives in the
11
- * existing src/hooks/*.test.ts suites (since the rules delegate
12
- * there). The 0.7.35 cutover migrates those tests alongside.
13
- */
14
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
15
- import { RULES, evaluateRules, rulesForEvent, } from "./rules.js";
16
- describe("RULES catalog shape", () => {
17
- it("has at least 16 rules (matches the design doc's 18, allowing 1-2 implementation merges)", () => {
18
- expect(RULES.length).toBeGreaterThanOrEqual(16);
19
- });
20
- it("every rule has all required fields populated", () => {
21
- for (const r of RULES) {
22
- expect(r.id).toBeTruthy();
23
- expect(r.catches).toBeTruthy();
24
- expect(["PreToolUse", "Stop", "UserPromptSubmit", "SessionEnd"]).toContain(r.hook);
25
- expect(typeof r.when).toBe("function");
26
- expect(typeof r.check).toBe("function");
27
- expect(r.rationale).toBeTruthy();
28
- }
29
- });
30
- it("rule ids are unique", () => {
31
- const ids = RULES.map((r) => r.id);
32
- expect(new Set(ids).size).toBe(ids.length);
33
- });
34
- it("covers all 10 drift D-entries (by `catches` field)", () => {
35
- const covered = new Set(RULES.map((r) => r.catches).flatMap((c) => c.split("+").map((s) => s.trim())));
36
- for (const drift of ["D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10"]) {
37
- expect([...covered].some((c) => c === drift || c.startsWith(drift)), `expected catches to include ${drift}`).toBe(true);
38
- }
39
- });
40
- });
41
- describe("rulesForEvent", () => {
42
- it("filters by hook event", () => {
43
- const preRules = rulesForEvent("PreToolUse");
44
- expect(preRules.every((r) => r.hook === "PreToolUse")).toBe(true);
45
- expect(preRules.length).toBeGreaterThan(0);
46
- });
47
- it("excludes bypassed rules", () => {
48
- const target = RULES.find((r) => r.id === "active-task-required");
49
- expect(target).toBeDefined();
50
- expect(target.bypass).toBe("OPENSQUID_SKIP_ACTIVE_TASK_GATE");
51
- process.env.OPENSQUID_SKIP_ACTIVE_TASK_GATE = "1";
52
- try {
53
- const ids = rulesForEvent("PreToolUse").map((r) => r.id);
54
- expect(ids).not.toContain("active-task-required");
55
- }
56
- finally {
57
- delete process.env.OPENSQUID_SKIP_ACTIVE_TASK_GATE;
58
- }
59
- });
60
- it("bypass env var must be exactly '1' (other values do NOT bypass)", () => {
61
- process.env.OPENSQUID_SKIP_ACTIVE_TASK_GATE = "true";
62
- try {
63
- const ids = rulesForEvent("PreToolUse").map((r) => r.id);
64
- expect(ids).toContain("active-task-required");
65
- }
66
- finally {
67
- delete process.env.OPENSQUID_SKIP_ACTIVE_TASK_GATE;
68
- }
69
- });
70
- });
71
- describe("rule when() predicates", () => {
72
- const preCtx = (toolName, command) => ({
73
- hookEvent: "PreToolUse",
74
- toolName,
75
- toolInput: command !== undefined ? { command } : {},
76
- });
77
- it("active-task-required fires only on log_phase / chat_send", () => {
78
- const rule = RULES.find((r) => r.id === "active-task-required");
79
- expect(rule.when(preCtx("mcp__opensquid__log_phase"))).toBe(true);
80
- expect(rule.when(preCtx("mcp__opensquid__chat_send"))).toBe(true);
81
- expect(rule.when(preCtx("Bash", "ls"))).toBe(false);
82
- expect(rule.when(preCtx("Read"))).toBe(false);
83
- });
84
- it("never-amend.when fires on Bash tool", () => {
85
- const rule = RULES.find((r) => r.id === "never-amend");
86
- expect(rule.when(preCtx("Bash", "git commit --amend"))).toBe(true);
87
- // Filter happens inside check via drift-patterns; when() just gates by tool name.
88
- expect(rule.when(preCtx("Edit"))).toBe(false);
89
- });
90
- it("engine-vocab-leak fires only on git commit Bash commands", () => {
91
- const rule = RULES.find((r) => r.id === "engine-vocab-leak");
92
- expect(rule.when(preCtx("Bash", "git commit -m 'foo'"))).toBe(true);
93
- expect(rule.when(preCtx("Bash", "git status"))).toBe(false);
94
- expect(rule.when(preCtx("Bash"))).toBe(false);
95
- });
96
- it("heartbeat-recall-required fires on any mcp__opensquid__* tool", () => {
97
- const rule = RULES.find((r) => r.id === "heartbeat-recall-required");
98
- expect(rule.when(preCtx("mcp__opensquid__recall"))).toBe(true);
99
- expect(rule.when(preCtx("mcp__opensquid__log_phase"))).toBe(true);
100
- expect(rule.when(preCtx("mcp__opensquid__chat_send"))).toBe(true);
101
- expect(rule.when(preCtx("mcp__plugin_telegram_telegram__reply"))).toBe(false);
102
- expect(rule.when(preCtx("Bash"))).toBe(false);
103
- });
104
- it("telegram-redirect-report fires only on plugin:telegram reply", () => {
105
- const rule = RULES.find((r) => r.id === "telegram-redirect-report");
106
- expect(rule.when(preCtx("mcp__plugin_telegram_telegram__reply"))).toBe(true);
107
- expect(rule.when(preCtx("mcp__opensquid__chat_send"))).toBe(false);
108
- });
109
- it("inline-report-missing-phases fires on Stop with assistantText", () => {
110
- const rule = RULES.find((r) => r.id === "inline-report-missing-phases");
111
- expect(rule.when({ hookEvent: "Stop", assistantText: "hi" })).toBe(true);
112
- expect(rule.when({ hookEvent: "Stop" })).toBe(false);
113
- });
114
- it("multi-task-plan-injection fires on UPS with userPrompt", () => {
115
- const rule = RULES.find((r) => r.id === "multi-task-plan-injection");
116
- expect(rule.when({ hookEvent: "UserPromptSubmit", userPrompt: "166 then 168" })).toBe(true);
117
- expect(rule.when({ hookEvent: "UserPromptSubmit" })).toBe(false);
118
- });
119
- });
120
- describe("evaluateRules — short-circuit on PreToolUse block", () => {
121
- let originalRules;
122
- beforeEach(() => {
123
- originalRules = [...RULES];
124
- });
125
- afterEach(() => {
126
- RULES.length = 0;
127
- RULES.push(...originalRules);
128
- });
129
- it("PreToolUse: stops at the first block verdict (most-restrictive-wins)", async () => {
130
- // Replace catalog with two fakes that both apply; the first blocks.
131
- RULES.length = 0;
132
- let secondRan = false;
133
- RULES.push({
134
- id: "fake-block",
135
- catches: "test",
136
- hook: "PreToolUse",
137
- when: () => true,
138
- check: async () => ({ kind: "block", message: "first" }),
139
- rationale: "test",
140
- }, {
141
- id: "fake-second",
142
- catches: "test",
143
- hook: "PreToolUse",
144
- when: () => true,
145
- check: async () => {
146
- secondRan = true;
147
- return { kind: "pass" };
148
- },
149
- rationale: "test",
150
- });
151
- const verdicts = await evaluateRules({ hookEvent: "PreToolUse", toolName: "Bash" });
152
- expect(verdicts.length).toBe(1);
153
- expect(verdicts[0]).toEqual({ kind: "block", message: "first" });
154
- expect(secondRan).toBe(false);
155
- });
156
- it("Stop: accumulates all verdicts (no short-circuit on first surface)", async () => {
157
- RULES.length = 0;
158
- RULES.push({
159
- id: "fake-surface-a",
160
- catches: "test",
161
- hook: "Stop",
162
- when: () => true,
163
- check: async () => ({ kind: "surface", message: "a" }),
164
- rationale: "test",
165
- }, {
166
- id: "fake-surface-b",
167
- catches: "test",
168
- hook: "Stop",
169
- when: () => true,
170
- check: async () => ({ kind: "surface", message: "b" }),
171
- rationale: "test",
172
- });
173
- const verdicts = await evaluateRules({ hookEvent: "Stop", assistantText: "test" });
174
- expect(verdicts.length).toBe(2);
175
- expect(verdicts.map((v) => v.kind === "surface" && v.message)).toEqual(["a", "b"]);
176
- });
177
- it("skips rules whose when() returns false", async () => {
178
- RULES.length = 0;
179
- RULES.push({
180
- id: "fake-not-applicable",
181
- catches: "test",
182
- hook: "PreToolUse",
183
- when: () => false,
184
- check: async () => ({ kind: "block", message: "should not fire" }),
185
- rationale: "test",
186
- });
187
- const verdicts = await evaluateRules({ hookEvent: "PreToolUse", toolName: "Bash" });
188
- expect(verdicts).toEqual([]);
189
- });
190
- });
191
- describe("Verdict shape — pass / block / warn / surface", () => {
192
- it("PASS verdicts have no message field", () => {
193
- const v = { kind: "pass" };
194
- expect(v.kind).toBe("pass");
195
- expect("message" in v).toBe(false);
196
- });
197
- it("non-pass verdicts carry a message", () => {
198
- const block = { kind: "block", message: "x" };
199
- const warn = { kind: "warn", message: "y" };
200
- const surface = { kind: "surface", message: "z" };
201
- expect(block.message).toBe("x");
202
- expect(warn.message).toBe("y");
203
- expect(surface.message).toBe("z");
204
- });
205
- });
206
- describe("hook-event coverage", () => {
207
- it("each of the 4 hook events has at least one rule", () => {
208
- for (const event of ["PreToolUse", "Stop", "UserPromptSubmit", "SessionEnd"]) {
209
- const rules = RULES.filter((r) => r.hook === event);
210
- expect(rules.length, `expected at least one rule for ${event}`).toBeGreaterThan(0);
211
- }
212
- });
213
- });
@@ -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