opensquid 0.5.441 → 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 (380) 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/runtime/bootstrap.d.ts.map +1 -1
  11. package/dist/runtime/bootstrap.js +2 -0
  12. package/dist/runtime/bootstrap.js.map +1 -1
  13. package/dist/runtime/handoff/render.d.ts +5 -4
  14. package/dist/runtime/handoff/render.d.ts.map +1 -1
  15. package/dist/runtime/handoff/render.js +7 -7
  16. package/dist/runtime/handoff/render.js.map +1 -1
  17. package/dist/runtime/hooks/active_task_mirror.js +0 -0
  18. package/dist/runtime/hooks/apply_patch.js +0 -0
  19. package/dist/runtime/hooks/dispatch.js +0 -0
  20. package/dist/runtime/hooks/hook_output.js +0 -0
  21. package/dist/runtime/hooks/memory_reconcile.js +0 -0
  22. package/dist/runtime/hooks/new_project_detect.js +0 -0
  23. package/dist/runtime/hooks/profession_resolver.js +0 -0
  24. package/dist/runtime/hooks/scope_intent.js +0 -0
  25. package/dist/runtime/hooks/session_id.js +0 -0
  26. package/dist/runtime/hooks/session_liveness.js +0 -0
  27. package/dist/runtime/hooks/stop_drive.js +0 -0
  28. package/dist/runtime/hooks/stop_stream.js +0 -0
  29. package/dist/runtime/hooks/subagent_guard.js +0 -0
  30. package/dist/runtime/hooks/transcript.js +0 -0
  31. package/dist/runtime/hooks/transcript_tasks.js +0 -0
  32. package/dist/runtime/ralph/orchestrator.d.ts.map +1 -1
  33. package/dist/runtime/ralph/orchestrator.js +2 -1
  34. package/dist/runtime/ralph/orchestrator.js.map +1 -1
  35. package/dist/setup/cli/limits_state.d.ts.map +1 -1
  36. package/dist/setup/cli/limits_state.js +6 -40
  37. package/dist/setup/cli/limits_state.js.map +1 -1
  38. package/dist/setup/cli/pack_walk.d.ts +32 -0
  39. package/dist/setup/cli/pack_walk.d.ts.map +1 -0
  40. package/dist/setup/cli/pack_walk.js +76 -0
  41. package/dist/setup/cli/pack_walk.js.map +1 -0
  42. package/dist/setup/cli/permissions_state.d.ts.map +1 -1
  43. package/dist/setup/cli/permissions_state.js +6 -37
  44. package/dist/setup/cli/permissions_state.js.map +1 -1
  45. package/dist/setup/cli/triggers_state.d.ts.map +1 -1
  46. package/dist/setup/cli/triggers_state.js +3 -29
  47. package/dist/setup/cli/triggers_state.js.map +1 -1
  48. package/dist/workgraph/events.d.ts.map +1 -1
  49. package/dist/workgraph/events.js +10 -0
  50. package/dist/workgraph/events.js.map +1 -1
  51. package/dist/workgraph/store.d.ts.map +1 -1
  52. package/dist/workgraph/store.js +5 -0
  53. package/dist/workgraph/store.js.map +1 -1
  54. package/dist/workgraph/types.d.ts +2 -1
  55. package/dist/workgraph/types.d.ts.map +1 -1
  56. package/docs/ARCHITECTURE.md +268 -0
  57. package/package.json +5 -3
  58. package/packs/builtin/coding-flow/skills/entry-and-handoffs/skill.yaml +13 -17
  59. package/dist/anti-drift/evaluator.d.ts +0 -88
  60. package/dist/anti-drift/evaluator.d.ts.map +0 -1
  61. package/dist/anti-drift/evaluator.js +0 -417
  62. package/dist/anti-drift/evaluator.js.map +0 -1
  63. package/dist/anti-drift/evaluator.test.js +0 -78
  64. package/dist/anti-drift/rules.d.ts +0 -80
  65. package/dist/anti-drift/rules.d.ts.map +0 -1
  66. package/dist/anti-drift/rules.js +0 -368
  67. package/dist/anti-drift/rules.js.map +0 -1
  68. package/dist/anti-drift/rules.test.js +0 -213
  69. package/dist/anti-drift/state.d.ts +0 -107
  70. package/dist/anti-drift/state.d.ts.map +0 -1
  71. package/dist/anti-drift/state.js +0 -177
  72. package/dist/anti-drift/state.js.map +0 -1
  73. package/dist/anti-drift/state.test.js +0 -120
  74. package/dist/chat/adapters/discord.d.ts +0 -41
  75. package/dist/chat/adapters/discord.d.ts.map +0 -1
  76. package/dist/chat/adapters/discord.js +0 -176
  77. package/dist/chat/adapters/discord.js.map +0 -1
  78. package/dist/chat/adapters/discord.test.js +0 -25
  79. package/dist/chat/adapters/slack.d.ts +0 -43
  80. package/dist/chat/adapters/slack.d.ts.map +0 -1
  81. package/dist/chat/adapters/slack.js +0 -172
  82. package/dist/chat/adapters/slack.js.map +0 -1
  83. package/dist/chat/adapters/slack.test.js +0 -30
  84. package/dist/chat/adapters/telegram.d.ts +0 -148
  85. package/dist/chat/adapters/telegram.d.ts.map +0 -1
  86. package/dist/chat/adapters/telegram.js +0 -498
  87. package/dist/chat/adapters/telegram.js.map +0 -1
  88. package/dist/chat/adapters/telegram.test.js +0 -94
  89. package/dist/chat/config.d.ts +0 -98
  90. package/dist/chat/config.d.ts.map +0 -1
  91. package/dist/chat/config.js +0 -185
  92. package/dist/chat/config.js.map +0 -1
  93. package/dist/chat/daemon/active-project.d.ts +0 -17
  94. package/dist/chat/daemon/active-project.d.ts.map +0 -1
  95. package/dist/chat/daemon/active-project.js +0 -23
  96. package/dist/chat/daemon/active-project.js.map +0 -1
  97. package/dist/chat/daemon/autospawn.d.ts +0 -40
  98. package/dist/chat/daemon/autospawn.d.ts.map +0 -1
  99. package/dist/chat/daemon/autospawn.js +0 -129
  100. package/dist/chat/daemon/autospawn.js.map +0 -1
  101. package/dist/chat/daemon/autospawn.test.js +0 -112
  102. package/dist/chat/daemon/cli.d.ts +0 -18
  103. package/dist/chat/daemon/cli.d.ts.map +0 -1
  104. package/dist/chat/daemon/cli.js +0 -71
  105. package/dist/chat/daemon/cli.js.map +0 -1
  106. package/dist/chat/daemon/collisions.js +0 -384
  107. package/dist/chat/daemon/health-check.d.ts +0 -69
  108. package/dist/chat/daemon/health-check.d.ts.map +0 -1
  109. package/dist/chat/daemon/health-check.js +0 -112
  110. package/dist/chat/daemon/health-check.js.map +0 -1
  111. package/dist/chat/daemon/inbox-read.d.ts +0 -35
  112. package/dist/chat/daemon/inbox-read.d.ts.map +0 -1
  113. package/dist/chat/daemon/inbox-read.js +0 -75
  114. package/dist/chat/daemon/inbox-read.js.map +0 -1
  115. package/dist/chat/daemon/inbox-read.test.js +0 -97
  116. package/dist/chat/daemon/inbox.d.ts +0 -63
  117. package/dist/chat/daemon/inbox.d.ts.map +0 -1
  118. package/dist/chat/daemon/inbox.js +0 -56
  119. package/dist/chat/daemon/inbox.js.map +0 -1
  120. package/dist/chat/daemon/inbox.test.js +0 -110
  121. package/dist/chat/daemon/lifecycle.d.ts +0 -71
  122. package/dist/chat/daemon/lifecycle.d.ts.map +0 -1
  123. package/dist/chat/daemon/lifecycle.js +0 -221
  124. package/dist/chat/daemon/lifecycle.js.map +0 -1
  125. package/dist/chat/daemon/lifecycle.test.js +0 -163
  126. package/dist/chat/daemon/protocol.d.ts +0 -107
  127. package/dist/chat/daemon/protocol.d.ts.map +0 -1
  128. package/dist/chat/daemon/protocol.js +0 -54
  129. package/dist/chat/daemon/protocol.js.map +0 -1
  130. package/dist/chat/daemon/routing.d.ts +0 -140
  131. package/dist/chat/daemon/routing.d.ts.map +0 -1
  132. package/dist/chat/daemon/routing.js +0 -198
  133. package/dist/chat/daemon/routing.js.map +0 -1
  134. package/dist/chat/daemon/routing.test.js +0 -259
  135. package/dist/chat/daemon/rpc-client.d.ts +0 -45
  136. package/dist/chat/daemon/rpc-client.d.ts.map +0 -1
  137. package/dist/chat/daemon/rpc-client.js +0 -133
  138. package/dist/chat/daemon/rpc-client.js.map +0 -1
  139. package/dist/chat/daemon/rpc-server.d.ts +0 -39
  140. package/dist/chat/daemon/rpc-server.d.ts.map +0 -1
  141. package/dist/chat/daemon/rpc-server.js +0 -385
  142. package/dist/chat/daemon/rpc-server.js.map +0 -1
  143. package/dist/chat/daemon/rpc.test.js +0 -177
  144. package/dist/chat/daemon/subscribers.js +0 -257
  145. package/dist/chat/daemon/worker.d.ts +0 -27
  146. package/dist/chat/daemon/worker.d.ts.map +0 -1
  147. package/dist/chat/daemon/worker.js +0 -313
  148. package/dist/chat/daemon/worker.js.map +0 -1
  149. package/dist/chat/daemon/workspace-topic.js +0 -324
  150. package/dist/chat/env-token.d.ts +0 -60
  151. package/dist/chat/env-token.d.ts.map +0 -1
  152. package/dist/chat/env-token.js +0 -137
  153. package/dist/chat/env-token.js.map +0 -1
  154. package/dist/chat/env-token.test.js +0 -160
  155. package/dist/chat/factory.d.ts +0 -30
  156. package/dist/chat/factory.d.ts.map +0 -1
  157. package/dist/chat/factory.js +0 -50
  158. package/dist/chat/factory.js.map +0 -1
  159. package/dist/chat/factory.test.js +0 -55
  160. package/dist/chat/gateway.d.ts +0 -176
  161. package/dist/chat/gateway.d.ts.map +0 -1
  162. package/dist/chat/gateway.js +0 -146
  163. package/dist/chat/gateway.js.map +0 -1
  164. package/dist/chat/gateway.test.js +0 -192
  165. package/dist/claude-md.d.ts +0 -39
  166. package/dist/claude-md.d.ts.map +0 -1
  167. package/dist/claude-md.js +0 -113
  168. package/dist/claude-md.js.map +0 -1
  169. package/dist/claude-md.test.js +0 -91
  170. package/dist/codex/activate.d.ts +0 -66
  171. package/dist/codex/activate.d.ts.map +0 -1
  172. package/dist/codex/activate.js +0 -329
  173. package/dist/codex/activate.js.map +0 -1
  174. package/dist/codex/activate.test.js +0 -229
  175. package/dist/codex/bundled-default/bundled-default.test.js +0 -161
  176. package/dist/codex/cli-publish.test.js +0 -133
  177. package/dist/codex/cli.d.ts +0 -35
  178. package/dist/codex/cli.d.ts.map +0 -1
  179. package/dist/codex/cli.js +0 -554
  180. package/dist/codex/cli.js.map +0 -1
  181. package/dist/codex/cli.test.js +0 -277
  182. package/dist/codex/import-skill-md.d.ts +0 -53
  183. package/dist/codex/import-skill-md.d.ts.map +0 -1
  184. package/dist/codex/import-skill-md.js +0 -236
  185. package/dist/codex/import-skill-md.js.map +0 -1
  186. package/dist/codex/import-skill-md.test.js +0 -225
  187. package/dist/codex/loader.d.ts +0 -27
  188. package/dist/codex/loader.d.ts.map +0 -1
  189. package/dist/codex/loader.js +0 -86
  190. package/dist/codex/loader.js.map +0 -1
  191. package/dist/codex/loader.test.js +0 -75
  192. package/dist/codex/parse.d.ts +0 -28
  193. package/dist/codex/parse.d.ts.map +0 -1
  194. package/dist/codex/parse.js +0 -309
  195. package/dist/codex/parse.js.map +0 -1
  196. package/dist/codex/parse.test.js +0 -241
  197. package/dist/codex/store.d.ts +0 -87
  198. package/dist/codex/store.d.ts.map +0 -1
  199. package/dist/codex/store.js +0 -205
  200. package/dist/codex/store.js.map +0 -1
  201. package/dist/codex/store.test.js +0 -242
  202. package/dist/codex/types.d.ts +0 -398
  203. package/dist/codex/types.d.ts.map +0 -1
  204. package/dist/codex/types.js +0 -21
  205. package/dist/codex/types.js.map +0 -1
  206. package/dist/config.d.ts +0 -53
  207. package/dist/config.d.ts.map +0 -1
  208. package/dist/config.js +0 -202
  209. package/dist/config.js.map +0 -1
  210. package/dist/config.test.js +0 -117
  211. package/dist/engine/cli.d.ts +0 -14
  212. package/dist/engine/cli.d.ts.map +0 -1
  213. package/dist/engine/cli.js +0 -171
  214. package/dist/engine/cli.js.map +0 -1
  215. package/dist/engine/client.d.ts +0 -219
  216. package/dist/engine/client.d.ts.map +0 -1
  217. package/dist/engine/client.js +0 -312
  218. package/dist/engine/client.js.map +0 -1
  219. package/dist/engine/config.d.ts +0 -62
  220. package/dist/engine/config.d.ts.map +0 -1
  221. package/dist/engine/config.js +0 -223
  222. package/dist/engine/config.js.map +0 -1
  223. package/dist/engine/index.d.ts +0 -17
  224. package/dist/engine/index.d.ts.map +0 -1
  225. package/dist/engine/index.js +0 -16
  226. package/dist/engine/index.js.map +0 -1
  227. package/dist/engine/resolver.d.ts +0 -62
  228. package/dist/engine/resolver.d.ts.map +0 -1
  229. package/dist/engine/resolver.js +0 -103
  230. package/dist/engine/resolver.js.map +0 -1
  231. package/dist/engine/singleton.d.ts +0 -95
  232. package/dist/engine/singleton.d.ts.map +0 -1
  233. package/dist/engine/singleton.js +0 -325
  234. package/dist/engine/singleton.js.map +0 -1
  235. package/dist/engine/types.d.ts +0 -402
  236. package/dist/engine/types.d.ts.map +0 -1
  237. package/dist/engine/types.js +0 -22
  238. package/dist/engine/types.js.map +0 -1
  239. package/dist/engine-binary-resolver.js +0 -110
  240. package/dist/engine-binary-resolver.test.js +0 -61
  241. package/dist/engine-cli.js +0 -60
  242. package/dist/engine-client.js +0 -301
  243. package/dist/engine-client.test.js +0 -118
  244. package/dist/functions/chain_state.d.ts +0 -51
  245. package/dist/functions/chain_state.d.ts.map +0 -1
  246. package/dist/functions/chain_state.js +0 -59
  247. package/dist/functions/chain_state.js.map +0 -1
  248. package/dist/hooks/drift-catalog.d.ts +0 -68
  249. package/dist/hooks/drift-catalog.d.ts.map +0 -1
  250. package/dist/hooks/drift-catalog.js +0 -184
  251. package/dist/hooks/drift-catalog.js.map +0 -1
  252. package/dist/hooks/drift-catalog.test.js +0 -154
  253. package/dist/hooks/drift-patterns.d.ts +0 -110
  254. package/dist/hooks/drift-patterns.d.ts.map +0 -1
  255. package/dist/hooks/drift-patterns.js +0 -289
  256. package/dist/hooks/drift-patterns.js.map +0 -1
  257. package/dist/hooks/drift-patterns.test.js +0 -325
  258. package/dist/hooks/engine-vocab-gate.d.ts +0 -108
  259. package/dist/hooks/engine-vocab-gate.d.ts.map +0 -1
  260. package/dist/hooks/engine-vocab-gate.js +0 -225
  261. package/dist/hooks/engine-vocab-gate.js.map +0 -1
  262. package/dist/hooks/engine-vocab-gate.test.js +0 -170
  263. package/dist/hooks/heartbeat.d.ts +0 -107
  264. package/dist/hooks/heartbeat.d.ts.map +0 -1
  265. package/dist/hooks/heartbeat.js +0 -316
  266. package/dist/hooks/heartbeat.js.map +0 -1
  267. package/dist/hooks/heartbeat.test.js +0 -393
  268. package/dist/hooks/honesty-ledger-session-scope.test.js +0 -100
  269. package/dist/hooks/honesty-ledger.d.ts +0 -123
  270. package/dist/hooks/honesty-ledger.d.ts.map +0 -1
  271. package/dist/hooks/honesty-ledger.js +0 -226
  272. package/dist/hooks/honesty-ledger.js.map +0 -1
  273. package/dist/hooks/honesty-ledger.test.js +0 -466
  274. package/dist/hooks/inline-report-check.d.ts +0 -63
  275. package/dist/hooks/inline-report-check.d.ts.map +0 -1
  276. package/dist/hooks/inline-report-check.js +0 -88
  277. package/dist/hooks/inline-report-check.js.map +0 -1
  278. package/dist/hooks/inline-report-check.test.js +0 -96
  279. package/dist/hooks/pre-tool-use.d.ts +0 -62
  280. package/dist/hooks/pre-tool-use.d.ts.map +0 -1
  281. package/dist/hooks/pre-tool-use.js +0 -342
  282. package/dist/hooks/pre-tool-use.js.map +0 -1
  283. package/dist/hooks/pre-tool-use.test.js +0 -134
  284. package/dist/hooks/session-end.d.ts +0 -15
  285. package/dist/hooks/session-end.d.ts.map +0 -1
  286. package/dist/hooks/session-end.js +0 -60
  287. package/dist/hooks/session-end.js.map +0 -1
  288. package/dist/hooks/session-end.test.js +0 -52
  289. package/dist/hooks/stop.d.ts +0 -35
  290. package/dist/hooks/stop.d.ts.map +0 -1
  291. package/dist/hooks/stop.js +0 -136
  292. package/dist/hooks/stop.js.map +0 -1
  293. package/dist/hooks/transcript-active-task.test.js +0 -342
  294. package/dist/hooks/transcript.d.ts +0 -26
  295. package/dist/hooks/transcript.d.ts.map +0 -1
  296. package/dist/hooks/transcript.js +0 -266
  297. package/dist/hooks/transcript.js.map +0 -1
  298. package/dist/hooks/transcript.test.js +0 -103
  299. package/dist/hooks/user-prompt-submit.d.ts +0 -74
  300. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  301. package/dist/hooks/user-prompt-submit.js +0 -256
  302. package/dist/hooks/user-prompt-submit.js.map +0 -1
  303. package/dist/hooks/user-prompt-submit.test.js +0 -118
  304. package/dist/hooks/versioning-gate.d.ts +0 -101
  305. package/dist/hooks/versioning-gate.d.ts.map +0 -1
  306. package/dist/hooks/versioning-gate.js +0 -245
  307. package/dist/hooks/versioning-gate.js.map +0 -1
  308. package/dist/hooks/versioning-gate.test.js +0 -368
  309. package/dist/hooks/workflow-gate.d.ts +0 -64
  310. package/dist/hooks/workflow-gate.d.ts.map +0 -1
  311. package/dist/hooks/workflow-gate.js +0 -152
  312. package/dist/hooks/workflow-gate.js.map +0 -1
  313. package/dist/hooks/workflow-gate.test.js +0 -197
  314. package/dist/hooks-cli.d.ts +0 -25
  315. package/dist/hooks-cli.d.ts.map +0 -1
  316. package/dist/hooks-cli.js +0 -286
  317. package/dist/hooks-cli.js.map +0 -1
  318. package/dist/hooks-cli.test.js +0 -148
  319. package/dist/origin.d.ts +0 -16
  320. package/dist/origin.d.ts.map +0 -1
  321. package/dist/origin.js +0 -92
  322. package/dist/origin.js.map +0 -1
  323. package/dist/packs/seed_lessons_ingest.d.ts +0 -30
  324. package/dist/packs/seed_lessons_ingest.d.ts.map +0 -1
  325. package/dist/packs/seed_lessons_ingest.js +0 -107
  326. package/dist/packs/seed_lessons_ingest.js.map +0 -1
  327. package/dist/project-cli.d.ts +0 -7
  328. package/dist/project-cli.d.ts.map +0 -1
  329. package/dist/project-cli.js +0 -145
  330. package/dist/project-cli.js.map +0 -1
  331. package/dist/project.d.ts +0 -127
  332. package/dist/project.d.ts.map +0 -1
  333. package/dist/project.js +0 -281
  334. package/dist/project.js.map +0 -1
  335. package/dist/project.test.js +0 -287
  336. package/dist/rag/backends/loop_engine.d.ts +0 -61
  337. package/dist/rag/backends/loop_engine.d.ts.map +0 -1
  338. package/dist/rag/backends/loop_engine.js +0 -160
  339. package/dist/rag/backends/loop_engine.js.map +0 -1
  340. package/dist/recall.d.ts +0 -82
  341. package/dist/recall.d.ts.map +0 -1
  342. package/dist/recall.js +0 -81
  343. package/dist/recall.js.map +0 -1
  344. package/dist/runtime/agent_bridge/autospawn.d.ts +0 -131
  345. package/dist/runtime/agent_bridge/autospawn.d.ts.map +0 -1
  346. package/dist/runtime/agent_bridge/autospawn.js +0 -251
  347. package/dist/runtime/agent_bridge/autospawn.js.map +0 -1
  348. package/dist/runtime/chain_state.d.ts +0 -124
  349. package/dist/runtime/chain_state.d.ts.map +0 -1
  350. package/dist/runtime/chain_state.js +0 -189
  351. package/dist/runtime/chain_state.js.map +0 -1
  352. package/dist/runtime/hooks/permission_decision.d.ts +0 -34
  353. package/dist/runtime/hooks/permission_decision.d.ts.map +0 -1
  354. package/dist/runtime/hooks/permission_decision.js +0 -39
  355. package/dist/runtime/hooks/permission_decision.js.map +0 -1
  356. package/dist/runtime/workflow_fsm.d.ts +0 -21
  357. package/dist/runtime/workflow_fsm.d.ts.map +0 -1
  358. package/dist/runtime/workflow_fsm.js +0 -25
  359. package/dist/runtime/workflow_fsm.js.map +0 -1
  360. package/dist/runtime/workflow_map.d.ts +0 -26
  361. package/dist/runtime/workflow_map.d.ts.map +0 -1
  362. package/dist/runtime/workflow_map.js +0 -38
  363. package/dist/runtime/workflow_map.js.map +0 -1
  364. package/dist/scope.d.ts +0 -48
  365. package/dist/scope.d.ts.map +0 -1
  366. package/dist/scope.js +0 -111
  367. package/dist/scope.js.map +0 -1
  368. package/dist/setup/cli/topic_create_step.d.ts +0 -84
  369. package/dist/setup/cli/topic_create_step.d.ts.map +0 -1
  370. package/dist/setup/cli/topic_create_step.js +0 -213
  371. package/dist/setup/cli/topic_create_step.js.map +0 -1
  372. package/dist/system-export.d.ts +0 -65
  373. package/dist/system-export.d.ts.map +0 -1
  374. package/dist/system-export.js +0 -194
  375. package/dist/system-export.js.map +0 -1
  376. package/dist/utterance/classifier.d.ts +0 -53
  377. package/dist/utterance/classifier.d.ts.map +0 -1
  378. package/dist/utterance/classifier.js +0 -184
  379. package/dist/utterance/classifier.js.map +0 -1
  380. package/dist/utterance/classifier.test.js +0 -147
@@ -1,133 +0,0 @@
1
- /**
2
- * chat-daemon RPC client (v0.7.1 Phase B).
3
- *
4
- * Used by the MCP server when it wants to send a chat message but
5
- * doesn't want to start its own long-poll adapter (which would
6
- * collide with any other MCP server holding the same bot token).
7
- *
8
- * Behavior:
9
- * - One short-lived connection per request — keeps the implementation
10
- * trivial and avoids reconnect/backoff logic. Performance is fine
11
- * for v0.7.1's expected traffic (a handful of agent reports per
12
- * project session).
13
- * - Returns a typed result on success.
14
- * - Throws `DaemonUnreachableError` when the socket can't be reached
15
- * so callers can fall back to in-process send.
16
- * - Throws `DaemonRpcError` on JSON-RPC error responses.
17
- */
18
- import { connect } from "node:net";
19
- import { daemonSockAddress, } from "./protocol.js";
20
- export class DaemonUnreachableError extends Error {
21
- constructor(message) {
22
- super(message);
23
- this.name = "DaemonUnreachableError";
24
- }
25
- }
26
- export class DaemonRpcError extends Error {
27
- code;
28
- constructor(message, code) {
29
- super(message);
30
- this.code = code;
31
- this.name = "DaemonRpcError";
32
- }
33
- }
34
- let requestCounter = 0;
35
- export class DaemonClient {
36
- address;
37
- connectTimeoutMs;
38
- requestTimeoutMs;
39
- constructor(opts = {}) {
40
- this.address = daemonSockAddress(opts.dataRoot);
41
- this.connectTimeoutMs = opts.connectTimeoutMs ?? 1500;
42
- this.requestTimeoutMs = opts.requestTimeoutMs ?? 5000;
43
- }
44
- ping() {
45
- return this.call("ping", {});
46
- }
47
- listChannels() {
48
- return this.call("list_channels", {});
49
- }
50
- send(params) {
51
- return this.call("send", params);
52
- }
53
- createTopic(params) {
54
- return this.call("create_topic", params);
55
- }
56
- async call(method, params) {
57
- const sock = await this.openSocket();
58
- try {
59
- const id = ++requestCounter;
60
- const req = { jsonrpc: "2.0", id, method: method, params };
61
- sock.write(`${JSON.stringify(req)}\n`);
62
- const line = await readOneLine(sock, this.requestTimeoutMs);
63
- const res = JSON.parse(line);
64
- if ("error" in res) {
65
- throw new DaemonRpcError(res.error.message, res.error.code);
66
- }
67
- return res.result;
68
- }
69
- finally {
70
- sock.destroy();
71
- }
72
- }
73
- openSocket() {
74
- return new Promise((resolve, reject) => {
75
- const sock = connect({ path: this.address });
76
- const t = setTimeout(() => {
77
- sock.destroy();
78
- reject(new DaemonUnreachableError(`connect timeout (${this.connectTimeoutMs}ms)`));
79
- }, this.connectTimeoutMs);
80
- sock.once("connect", () => {
81
- clearTimeout(t);
82
- resolve(sock);
83
- });
84
- sock.once("error", (err) => {
85
- clearTimeout(t);
86
- // ENOENT (no socket file) / ECONNREFUSED (no listener) /
87
- // EACCES (permission) → daemon-unreachable. Other errors
88
- // propagate as the original error.
89
- if (err.code === "ENOENT" || err.code === "ECONNREFUSED" || err.code === "EACCES") {
90
- reject(new DaemonUnreachableError(`${err.code}: ${err.message}`));
91
- }
92
- else {
93
- reject(err);
94
- }
95
- });
96
- });
97
- }
98
- }
99
- function readOneLine(sock, timeoutMs) {
100
- return new Promise((resolve, reject) => {
101
- sock.setEncoding("utf8");
102
- let buf = "";
103
- const onData = (chunk) => {
104
- buf += chunk;
105
- const nl = buf.indexOf("\n");
106
- if (nl >= 0) {
107
- cleanup();
108
- resolve(buf.slice(0, nl));
109
- }
110
- };
111
- const onError = (err) => {
112
- cleanup();
113
- reject(err);
114
- };
115
- const onEnd = () => {
116
- cleanup();
117
- reject(new DaemonUnreachableError("daemon closed connection without response"));
118
- };
119
- const t = setTimeout(() => {
120
- cleanup();
121
- reject(new DaemonUnreachableError(`request timeout (${timeoutMs}ms)`));
122
- }, timeoutMs);
123
- const cleanup = () => {
124
- clearTimeout(t);
125
- sock.off("data", onData);
126
- sock.off("error", onError);
127
- sock.off("end", onEnd);
128
- };
129
- sock.on("data", onData);
130
- sock.on("error", onError);
131
- sock.on("end", onEnd);
132
- });
133
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src.legacy/chat/daemon/rpc-client.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- /**
2
- * chat-daemon RPC server (v0.7.1 Phase B).
3
- *
4
- * Runs INSIDE the daemon worker process. Listens on the platform-
5
- * correct socket address (Unix socket / named pipe) and dispatches
6
- * JSON-RPC method calls to the in-process ChatGateway.
7
- *
8
- * Connection model: stateless. Each line is one request; each response
9
- * goes back on the same connection. Connections may pipeline multiple
10
- * requests, and the server reads line-by-line (we keep a per-connection
11
- * buffer until \n).
12
- */
13
- import type { ChatGateway } from "../gateway.js";
14
- export interface RpcServerOptions {
15
- gateway: ChatGateway;
16
- dataRoot?: string;
17
- startedAt?: number;
18
- /** Daemon's process version string — surfaced by `ping`. */
19
- version?: string;
20
- /** Pid surfaced by `ping`. Defaults to process.pid. */
21
- pid?: number;
22
- /** Hook for tests: callback when a request is dispatched. */
23
- onRequest?: (method: string) => void;
24
- }
25
- export declare class RpcServer {
26
- private readonly opts;
27
- private server;
28
- private listening;
29
- private readonly address;
30
- private readonly startedAt;
31
- constructor(opts: RpcServerOptions);
32
- listen(): Promise<void>;
33
- close(): Promise<void>;
34
- private handleConnection;
35
- private dispatchLine;
36
- private respond;
37
- private handle;
38
- }
39
- //# sourceMappingURL=rpc-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../../src.legacy/chat/daemon/rpc-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAmBjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,qBAAa,SAAS;IAMR,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,IAAI,EAAE,gBAAgB;IAW7C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,OAAO;YAQD,MAAM;CAiGrB"}
@@ -1,385 +0,0 @@
1
- /**
2
- * chat-daemon RPC server (v0.7.1 Phase B).
3
- *
4
- * Runs INSIDE the daemon worker process. Listens on the platform-
5
- * correct socket address (Unix socket / named pipe) and dispatches
6
- * JSON-RPC method calls to the in-process ChatGateway.
7
- *
8
- * Connection model: stateless. Each line is one request; each response
9
- * goes back on the same connection. Connections may pipeline multiple
10
- * requests, and the server reads line-by-line (we keep a per-connection
11
- * buffer until \n).
12
- */
13
- import { createServer } from "node:net";
14
- import { existsSync, unlinkSync } from "node:fs";
15
- import { TopicGoneError } from "../adapters/telegram.js";
16
- import { recordTopicGoneEvent } from "./collisions.js";
17
- import { JSON_RPC_INTERNAL_ERROR, JSON_RPC_INVALID_PARAMS, JSON_RPC_INVALID_REQUEST, JSON_RPC_METHOD_NOT_FOUND, JSON_RPC_PARSE_ERROR, daemonSockAddress, } from "./protocol.js";
18
- import { loadProjectChatRouting } from "./routing.js";
19
- import { SubscriberRegistry } from "./subscribers.js";
20
- import { clearBinding, findOwnerOfBinding, resolveOrCreateTopic } from "./workspace-topic.js";
21
- export class RpcServer {
22
- opts;
23
- server;
24
- listening = false;
25
- address;
26
- startedAt;
27
- /**
28
- * TPS.6 patch 1 (v0.5.125) — long-lived subscriber registry. The
29
- * gateway.onMessage wire-up that broadcasts to this registry lands
30
- * in patch 2 (v0.5.126). For patch 1, the daemon accepts
31
- * subscribe/unsubscribe RPCs but does not yet push notifications.
32
- */
33
- subscribers = new SubscriberRegistry();
34
- constructor(opts) {
35
- this.opts = opts;
36
- this.address = daemonSockAddress(opts.dataRoot);
37
- this.startedAt = opts.startedAt ?? Date.now();
38
- this.server = createServer((socket) => this.handleConnection(socket));
39
- // Treat client errors as informational; a misbehaving client must
40
- // not crash the daemon.
41
- this.server.on("error", () => {
42
- /* swallowed at server level; per-conn errors handled below */
43
- });
44
- }
45
- async listen() {
46
- if (this.listening)
47
- return;
48
- // Unix-socket clean-up: a previously-aborted daemon may have left a
49
- // stale socket file. Removing it is safe because the previous
50
- // daemon is gone (verified by the lifecycle layer before we got
51
- // here). Windows named pipes are kernel objects with no file
52
- // residue, so this is a no-op there.
53
- if (process.platform !== "win32" && existsSync(this.address)) {
54
- try {
55
- unlinkSync(this.address);
56
- }
57
- catch {
58
- /* race-tolerant */
59
- }
60
- }
61
- await new Promise((resolve, reject) => {
62
- this.server.once("error", reject);
63
- this.server.listen(this.address, () => {
64
- this.server.off("error", reject);
65
- this.listening = true;
66
- resolve();
67
- });
68
- });
69
- }
70
- async close() {
71
- if (!this.listening)
72
- return;
73
- await new Promise((resolve) => {
74
- this.server.close(() => resolve());
75
- });
76
- this.listening = false;
77
- if (process.platform !== "win32" && existsSync(this.address)) {
78
- try {
79
- unlinkSync(this.address);
80
- }
81
- catch {
82
- /* race-tolerant */
83
- }
84
- }
85
- }
86
- handleConnection(socket) {
87
- let buf = "";
88
- socket.setEncoding("utf8");
89
- socket.on("data", (chunk) => {
90
- buf += chunk;
91
- let nl;
92
- while ((nl = buf.indexOf("\n")) >= 0) {
93
- const line = buf.slice(0, nl);
94
- buf = buf.slice(nl + 1);
95
- if (line.trim().length === 0)
96
- continue;
97
- this.dispatchLine(line, socket);
98
- }
99
- });
100
- socket.on("error", () => {
101
- // Half-open connections are common; closing here keeps the daemon
102
- // tidy without surfacing an error to other clients. Subscriber
103
- // eviction is handled by the registry's own socket 'error'/'close'
104
- // listeners installed at register() time, so we don't need to
105
- // touch the registry here.
106
- try {
107
- socket.destroy();
108
- }
109
- catch {
110
- /* already gone */
111
- }
112
- });
113
- }
114
- dispatchLine(line, socket) {
115
- let req;
116
- try {
117
- req = JSON.parse(line);
118
- }
119
- catch {
120
- this.respond(socket, parseError());
121
- return;
122
- }
123
- if (!req || req.jsonrpc !== "2.0" || typeof req.id === "undefined" || !req.method) {
124
- this.respond(socket, invalidRequest(req?.id ?? null));
125
- return;
126
- }
127
- if (this.opts.onRequest)
128
- this.opts.onRequest(req.method);
129
- void this.handle(req, socket).then((res) => this.respond(socket, res));
130
- }
131
- respond(socket, response) {
132
- try {
133
- socket.write(`${JSON.stringify(response)}\n`);
134
- }
135
- catch {
136
- /* dropped — connection gone */
137
- }
138
- }
139
- /**
140
- * TPS.7 (v0.5.130) — async stale-topic recovery. Locates the
141
- * workspace that owned the now-stale binding, clears it via
142
- * `clearBinding`, and records a `TopicGoneEvent` in collisions.jsonl
143
- * (which fires a debounced Telegram notification through the same
144
- * surface TPS.5 collisions use).
145
- *
146
- * Fire-and-forget from the send-RPC catch block. NEVER throws — all
147
- * failures log to stderr. The original send already failed; the
148
- * caller doesn't care about recovery errors.
149
- *
150
- * Re-binding does NOT happen here — by design it defers to the next
151
- * MCP-bridge subscribe (TPS.6 auto-boot path), which is lockfile-
152
- * protected so two concurrent recoveries can't double-create topics.
153
- */
154
- async handleTopicGone(err) {
155
- try {
156
- const workspaceUuid = await findOwnerOfBinding({
157
- chatId: err.chatId,
158
- topicId: err.threadId,
159
- ...(this.opts.dataRoot !== undefined ? { dataRoot: this.opts.dataRoot } : {}),
160
- });
161
- if (workspaceUuid === null) {
162
- // No project claims this binding — either the user manually
163
- // cleared it, a concurrent recovery beat us to it, or the
164
- // binding was never tracked. Nothing to clean; nothing to
165
- // notify.
166
- return;
167
- }
168
- await clearBinding({
169
- workspaceUuid,
170
- ...(this.opts.dataRoot !== undefined ? { dataRoot: this.opts.dataRoot } : {}),
171
- });
172
- await recordTopicGoneEvent({
173
- workspaceUuid,
174
- chatId: err.chatId,
175
- topicId: err.threadId,
176
- underlyingDescription: err.message,
177
- gateway: this.opts.gateway,
178
- ...(this.opts.dataRoot !== undefined ? { dataRoot: this.opts.dataRoot } : {}),
179
- });
180
- }
181
- catch (recoveryErr) {
182
- process.stderr.write(`[rpc-server] topic-gone recovery failed for chatId=${err.chatId} topicId=${err.threadId}: ${recoveryErr instanceof Error ? recoveryErr.message : String(recoveryErr)}\n`);
183
- }
184
- }
185
- async handle(req, socket) {
186
- try {
187
- switch (req.method) {
188
- case "subscribe": {
189
- const p = req.params;
190
- if (!p ||
191
- typeof p.session_id !== "string" ||
192
- p.session_id.length === 0 ||
193
- typeof p.workspace_uuid !== "string" ||
194
- typeof p.workspace_path !== "string" ||
195
- !Array.isArray(p.chat_ids)) {
196
- return failure(req.id, JSON_RPC_INVALID_PARAMS, "subscribe: session_id, workspace_uuid, workspace_path, chat_ids[] required");
197
- }
198
- for (const id of p.chat_ids) {
199
- if (typeof id !== "string") {
200
- return failure(req.id, JSON_RPC_INVALID_PARAMS, "subscribe: chat_ids[] must be strings");
201
- }
202
- }
203
- this.subscribers.register({
204
- session_id: p.session_id,
205
- workspace_uuid: p.workspace_uuid,
206
- workspace_path: p.workspace_path,
207
- chat_ids: p.chat_ids,
208
- socket,
209
- });
210
- // TPS.6 patch 4 (v0.5.128) — daemon-side auto-boot. When the
211
- // workspace has a configured supergroup but no auto_bound
212
- // binding yet, resolve-or-create the forum topic now so the
213
- // MCP bridge starts seeing per-workspace-routed inbound
214
- // messages without requiring a separate `opensquid setup
215
- // chat` wizard run. resolveOrCreateTopic is idempotent —
216
- // existing bindings come back as {created:false} with the
217
- // existing topic_id/topic_name.
218
- //
219
- // Skipped conditions (all degrade silently to a wildcard-
220
- // routed subscription; subscribers see general topic only):
221
- // - workspace_uuid is the "no-project" sentinel
222
- // - chat-routing.json missing or has no
223
- // telegram.report_channel (no destination)
224
- // - resolveOrCreateTopic throws (logged to stderr, never
225
- // blocks subscribe ack)
226
- const autoBoot = await tryAutoBootTopic(p.workspace_uuid, p.workspace_path, this.opts.dataRoot);
227
- if (autoBoot) {
228
- return success(req.id, {
229
- ok: true,
230
- bound_topic_id: autoBoot.topicId,
231
- bound_topic_name: autoBoot.topicName,
232
- });
233
- }
234
- return success(req.id, { ok: true });
235
- }
236
- case "unsubscribe": {
237
- const p = req.params;
238
- if (!p || typeof p.session_id !== "string" || p.session_id.length === 0) {
239
- return failure(req.id, JSON_RPC_INVALID_PARAMS, "unsubscribe: session_id required");
240
- }
241
- this.subscribers.unregister(p.session_id);
242
- return success(req.id, { ok: true });
243
- }
244
- case "ping":
245
- return success(req.id, {
246
- pong: true,
247
- pid: this.opts.pid ?? process.pid,
248
- version: this.opts.version ?? "unknown",
249
- });
250
- case "list_channels": {
251
- // 0.7.4 (#147): walk active adapters and ask which are
252
- // outbound-only (degraded due to 409 collision with an
253
- // external poller). Only the telegram adapter currently
254
- // exposes isOutboundOnly(); duck-type test so other
255
- // platforms can opt in later without changing this code.
256
- const platforms = this.opts.gateway.activePlatforms();
257
- const outboundOnly = [];
258
- for (const p of platforms) {
259
- const adapter = this.opts.gateway.getAdapter(p);
260
- const maybe = adapter;
261
- if (typeof maybe?.isOutboundOnly === "function" && maybe.isOutboundOnly()) {
262
- outboundOnly.push(p);
263
- }
264
- }
265
- return success(req.id, {
266
- active_platforms: platforms,
267
- uptime_ms: Date.now() - this.startedAt,
268
- outbound_only_platforms: outboundOnly,
269
- });
270
- }
271
- case "send": {
272
- const p = req.params;
273
- if (!p || typeof p.channel !== "string" || typeof p.text !== "string") {
274
- return failure(req.id, JSON_RPC_INVALID_PARAMS, "send: channel + text required");
275
- }
276
- try {
277
- const result = await this.opts.gateway.send({
278
- channel: p.channel,
279
- text: p.text,
280
- replyTo: p.replyTo,
281
- threadId: p.threadId,
282
- });
283
- return success(req.id, {
284
- ok: true,
285
- platform: result.platform,
286
- message_id: result.messageId,
287
- delivered_at: result.deliveredAt.toISOString(),
288
- });
289
- }
290
- catch (err) {
291
- // TPS.7 (v0.5.130) — typed stale-topic detection. Fire the
292
- // recovery asynchronously so the caller gets the original
293
- // failure (the send still failed; the daemon cleans up the
294
- // stale binding in the background, and the next MCP-bridge
295
- // subscribe rebinds via TPS.6 auto-boot).
296
- if (err instanceof TopicGoneError) {
297
- void this.handleTopicGone(err);
298
- }
299
- // Re-throw to the outer catch which formats the JSON-RPC
300
- // failure (preserves the existing error contract).
301
- throw err;
302
- }
303
- }
304
- case "create_topic": {
305
- const p = req.params;
306
- if (!p ||
307
- p.platform !== "telegram" ||
308
- typeof p.chat_id !== "string" ||
309
- typeof p.name !== "string") {
310
- return failure(req.id, JSON_RPC_INVALID_PARAMS, "create_topic: platform='telegram', chat_id, name required");
311
- }
312
- const adapter = this.opts.gateway.getAdapter(p.platform);
313
- if (!adapter ||
314
- typeof adapter.createTopic !== "function") {
315
- return failure(req.id, JSON_RPC_INTERNAL_ERROR, `${p.platform} adapter does not support topic creation (or not active)`);
316
- }
317
- const adapterAny = adapter;
318
- const res = await adapterAny.createTopic(p.chat_id, p.name, {
319
- iconColor: p.icon_color,
320
- iconCustomEmojiId: p.icon_custom_emoji_id,
321
- });
322
- return success(req.id, res);
323
- }
324
- default:
325
- return failure(req.id, JSON_RPC_METHOD_NOT_FOUND, `unknown method: ${req.method}`);
326
- }
327
- }
328
- catch (err) {
329
- return failure(req.id, JSON_RPC_INTERNAL_ERROR, err instanceof Error ? err.message : String(err));
330
- }
331
- }
332
- }
333
- // ---------------------------------------------------------------------
334
- // JSON-RPC response helpers
335
- // ---------------------------------------------------------------------
336
- function success(id, result) {
337
- return { jsonrpc: "2.0", id, result };
338
- }
339
- function failure(id, code, message) {
340
- return { jsonrpc: "2.0", id, error: { code, message } };
341
- }
342
- function parseError() {
343
- return failure(null, JSON_RPC_PARSE_ERROR, "parse error");
344
- }
345
- function invalidRequest(id) {
346
- return failure(id, JSON_RPC_INVALID_REQUEST, "invalid jsonrpc request");
347
- }
348
- // ---------------------------------------------------------------------
349
- // TPS.6 patch 4 (v0.5.128) — auto-boot helper
350
- // ---------------------------------------------------------------------
351
- /**
352
- * Try to resolve-or-create a Telegram forum topic for a workspace at
353
- * subscribe time. Returns null when the workspace can't be auto-bound
354
- * (no project, no routing file, no report_channel, or resolve threw).
355
- * Never throws — failures only log to stderr.
356
- */
357
- async function tryAutoBootTopic(workspaceUuid, workspacePath, dataRoot) {
358
- if (!workspaceUuid || workspaceUuid === "no-project")
359
- return null;
360
- let chatId;
361
- try {
362
- const routing = await loadProjectChatRouting(workspaceUuid, dataRoot);
363
- chatId = routing?.telegram?.report_channel;
364
- }
365
- catch (err) {
366
- process.stderr.write(`[rpc-server] auto-boot: loadProjectChatRouting failed for ${workspaceUuid}: ${err instanceof Error ? err.message : String(err)}\n`);
367
- return null;
368
- }
369
- if (!chatId || chatId.length === 0)
370
- return null;
371
- try {
372
- const result = await resolveOrCreateTopic({
373
- workspaceUuid,
374
- workspacePath,
375
- chatId,
376
- mode: "auto-boot",
377
- ...(dataRoot !== undefined ? { dataRoot } : {}),
378
- });
379
- return { topicId: result.topicId, topicName: result.topicName };
380
- }
381
- catch (err) {
382
- process.stderr.write(`[rpc-server] auto-boot: resolveOrCreateTopic failed for ${workspaceUuid} (chatId=${chatId}): ${err instanceof Error ? err.message : String(err)}\n`);
383
- return null;
384
- }
385
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-server.js","sourceRoot":"","sources":["../../../src.legacy/chat/daemon/rpc-server.ts"],"names":[],"mappings":"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"}