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,325 +0,0 @@
1
- /**
2
- * Daemon-singleton acquire-or-spawn for the loop-engine UDS daemon.
3
- *
4
- * One engine process per host. All opensquid hooks + sessions share
5
- * the same engine over a Unix domain socket at
6
- * `~/.opensquid/loop-engine.sock`. This is the keystone for cross-
7
- * session memory recall — session A writes a memory, session B reads
8
- * it through the same engine without per-process spawn cost.
9
- *
10
- * Flow (per spec T.4 / audit T.1.Y + T.1.Z + T.1.BB + T.1.DD):
11
- *
12
- * 1. Windows guard — UDS is Unix-only; named-pipe support is a
13
- * follow-up. Windows callers fall back to per-process stdio spawn
14
- * by setting `OPENSQUID_ENGINE_SOCKET=disable` upstream.
15
- *
16
- * 2. Path-byte guard — macOS limits UDS paths to 104 bytes (Linux
17
- * 108). `~/.opensquid/loop-engine.sock` ≈ 30 chars on typical
18
- * homes, but exotic `$HOME` values can exceed it. Refuse at 100
19
- * to leave margin.
20
- *
21
- * 3. Fast path — if the socket file exists, try to connect. Success
22
- * means an engine is already running; return the socket with
23
- * `spawnedByUs: false`. ECONNREFUSED means the file is stale (a
24
- * previous engine crashed without unlinking); unlink and fall
25
- * through to the spawn path.
26
- *
27
- * 4. Slow path (lock + spawn):
28
- * a. Touch `~/.opensquid/loop-engine.lock` so `proper-lockfile`
29
- * has a stable inode to lock against.
30
- * b. Acquire the lock with retry — serializes concurrent spawn
31
- * attempts across multiple opensquid processes.
32
- * c. RECHECK after the lock: another process may have spawned
33
- * the engine while we waited. If yes, connect + return.
34
- * d. Resolve the engine binary via existing `resolveEngineBin()`.
35
- * e. Spawn detached + `stdio: 'ignore'` so the engine outlives
36
- * the parent (true daemon semantics). `'inherit'` would hold
37
- * the parent's stdout/stderr pipes open and block parent exit
38
- * (per subprocess-lifecycle audit). Engine logs route to
39
- * /dev/null in this mode; `RUST_LOG=...` + a redirect-to-file
40
- * is the workaround if diagnostics are needed.
41
- * f. Write `~/.opensquid/loop-engine.pid` with the spawned pid
42
- * BEFORE `proc.unref()` so T.7's `engine kill` command can
43
- * find it.
44
- * g. `proc.unref()` — let the parent event loop exit without
45
- * waiting on the engine.
46
- * h. Wait for the socket file to appear (engine binds before
47
- * accept; 10s budget covers cold-start HNSW rehydrate of
48
- * ~76 memories on typical hardware).
49
- * i. Connect; return with `spawnedByUs: true`.
50
- *
51
- * 5. Always release the lock in a `finally` block.
52
- *
53
- * NOT a singleton class — exported as a plain async function so
54
- * callers can compose / inject without instance state. Concurrency
55
- * safety lives in `proper-lockfile`, not in this module.
56
- */
57
- import { existsSync } from 'node:fs';
58
- import { open, unlink, writeFile } from 'node:fs/promises';
59
- import { spawn } from 'node:child_process';
60
- import { connect } from 'node:net';
61
- import { join } from 'node:path';
62
- import { homedir } from 'node:os';
63
- import lockfile from 'proper-lockfile';
64
- import { resolveEngineBin } from './config.js';
65
- // ---- Constants -----------------------------------------------------
66
- // Layout under `~/.opensquid/`. Keep all three colocated so cleanup
67
- // scripts can `rm ~/.opensquid/loop-engine.*` without hunting.
68
- const SOCK_FILENAME = 'loop-engine.sock';
69
- const LOCK_FILENAME = 'loop-engine.lock';
70
- const PID_FILENAME = 'loop-engine.pid';
71
- /**
72
- * macOS sockaddr_un caps the path at 104 bytes; Linux at 108. We
73
- * guard at 100 to leave margin for either platform. Failure here is
74
- * fast + actionable — the alternative is a cryptic `ENAMETOOLONG`
75
- * from `bind(2)` deep inside engine startup.
76
- */
77
- const SOCKET_PATH_BYTE_LIMIT = 100;
78
- /**
79
- * Cold-start budget for the engine. Bind happens in <500ms cold, but
80
- * HNSW rehydrate of ~76 memories adds 1-3s on typical hardware.
81
- * 10s is forgiving without making real failure modes (missing
82
- * binary, wrong --socket path) feel slow.
83
- */
84
- const SOCKET_WAIT_TIMEOUT_MS = 10_000;
85
- const SOCKET_WAIT_POLL_INTERVAL_MS = 50;
86
- // ---- Path helpers --------------------------------------------------
87
- /** Engine socket path. Override `OPENSQUID_HOME` to relocate. */
88
- export function engineSocketPath() {
89
- return join(opensquidHome(), SOCK_FILENAME);
90
- }
91
- /** Lock file used to serialize concurrent spawn attempts. */
92
- export function engineLockPath() {
93
- return join(opensquidHome(), LOCK_FILENAME);
94
- }
95
- /**
96
- * Pidfile path used by `engine kill` (T.7). Written after spawn
97
- * returns, before `unref()`. Note: the engine process itself does
98
- * NOT manage this file — opensquid owns its lifecycle since opensquid
99
- * is the one that spawned the engine. T.7 will add a startup-time
100
- * cleanup hook for the spawned-by-us case.
101
- */
102
- export function enginePidPath() {
103
- return join(opensquidHome(), PID_FILENAME);
104
- }
105
- function opensquidHome() {
106
- // Mirrors `OPENSQUID_HOME` resolution from runtime/paths.ts without
107
- // importing it (avoid cycles + keep this module's import surface
108
- // narrow). Override semantics: env wins → default `~/.opensquid`.
109
- const env = process.env.OPENSQUID_HOME?.trim();
110
- // `??` would let an empty-string env through; we want to fall back
111
- // on empty just like on undefined, so guard explicitly.
112
- return env && env.length > 0 ? env : join(homedir(), '.opensquid');
113
- }
114
- /**
115
- * Acquire a connection to the shared loop-engine daemon, spawning
116
- * one if none is running. Safe to call concurrently from multiple
117
- * processes — `proper-lockfile` serializes spawn attempts so only
118
- * one engine starts per `~/.opensquid/loop-engine.sock` lifetime.
119
- *
120
- * Throws on:
121
- * - Windows (UDS unsupported; use stdio mode upstream)
122
- * - socket path exceeds platform byte limit
123
- * - engine binary not resolvable
124
- * - socket never appears within `SOCKET_WAIT_TIMEOUT_MS`
125
- * - underlying spawn / connect / lock errors
126
- */
127
- export async function acquireOrSpawnEngine() {
128
- // Windows: UDS isn't supported (engine returns an error on this
129
- // path too). Throw clearly so callers can route around it rather
130
- // than failing deep in `net.connect`.
131
- if (process.platform === 'win32') {
132
- throw new Error('UDS singleton not supported on Windows yet; ' +
133
- 'set OPENSQUID_ENGINE_SOCKET=disable to fall back to per-process stdio spawn');
134
- }
135
- const sockPath = engineSocketPath();
136
- if (Buffer.byteLength(sockPath, 'utf8') > SOCKET_PATH_BYTE_LIMIT) {
137
- throw new Error(`UDS path ${sockPath} exceeds ${SOCKET_PATH_BYTE_LIMIT}-byte limit ` +
138
- `(macOS=104, Linux=108). Move OPENSQUID_HOME to a shorter path.`);
139
- }
140
- // Fast path: existing engine.
141
- if (existsSync(sockPath)) {
142
- const warm = await tryConnect(sockPath).catch(() => null);
143
- if (warm) {
144
- return { socket: warm, spawnedByUs: false };
145
- }
146
- // ECONNREFUSED → stale socket file. Drop it; fall through to
147
- // the lock + spawn path. Errors from unlink are swallowed (the
148
- // recheck-after-lock step will catch any residual state).
149
- await unlink(sockPath).catch(() => undefined);
150
- }
151
- // Slow path: serialize spawn attempts.
152
- await ensureOpensquidHome();
153
- const lockPath = engineLockPath();
154
- await touchFile(lockPath);
155
- const release = await lockfile.lock(lockPath, {
156
- realpath: false,
157
- retries: {
158
- retries: 5,
159
- factor: 2,
160
- minTimeout: 50,
161
- maxTimeout: 500,
162
- },
163
- // 10s stale-lock window — covers our 10s socket-wait + slack.
164
- // Without this, a crashed spawning-process would hold the lock
165
- // forever and every subsequent acquire would time out.
166
- stale: 10_000,
167
- });
168
- try {
169
- // RECHECK: another process may have raced past us between the
170
- // fast-path miss and the lock acquisition.
171
- if (existsSync(sockPath)) {
172
- const warm = await tryConnect(sockPath).catch(() => null);
173
- if (warm) {
174
- return { socket: warm, spawnedByUs: false };
175
- }
176
- await unlink(sockPath).catch(() => undefined);
177
- }
178
- const bin = await resolveEngineBin();
179
- if (!bin) {
180
- throw new Error('loop-engine binary not found. Set OPENSQUID_ENGINE_BIN, run ' +
181
- '`opensquid engine set-path <path>`, or build at ' +
182
- '~/projects/loop/engine/target/release/loop-engine');
183
- }
184
- // Detached + ignored stdio = true daemon. Both flags are
185
- // load-bearing:
186
- // - `detached: true` puts the child in its own process group so
187
- // it survives parent exit (Unix double-fork semantics).
188
- // - `stdio: ['ignore', 'ignore', 'ignore']` closes the
189
- // inherited stdio fds. `'inherit'` would hold the parent's
190
- // stdout/stderr pipes open and block parent exit (e.g. the
191
- // Node CLI would never return to the shell).
192
- //
193
- // Side effect: engine `tracing` output writes to /dev/null. If
194
- // diagnostics are needed, set `RUST_LOG` AND redirect engine
195
- // stderr to a file via a wrapper script — opensquid does not
196
- // own that policy.
197
- const proc = spawn(bin, ['serve', '--socket', sockPath], {
198
- stdio: ['ignore', 'ignore', 'ignore'],
199
- env: {
200
- ...process.env,
201
- // Pin the engine's storage root to ~/.opensquid (T.1.D regression
202
- // guard). Engine defaults to ~/.loop; without this pin, memories +
203
- // lessons written via opensquid would be invisible to subsequent
204
- // engine reads.
205
- LOOP_HOME: process.env.LOOP_HOME ?? join(homedir(), '.opensquid'),
206
- },
207
- detached: true,
208
- });
209
- // Pidfile write BEFORE `unref()` so T.7's `engine kill` can find
210
- // the pid even if the spawning Node process exits immediately.
211
- // Best-effort: a pidfile-write failure shouldn't tank the
212
- // acquire (T.7 falls back to `pgrep` if the pidfile is missing).
213
- if (proc.pid !== undefined) {
214
- await writeFile(enginePidPath(), `${String(proc.pid)}\n`, 'utf8').catch((e) => {
215
- process.stderr.write(`[opensquid] warning: failed to write engine pidfile: ${String(e)}\n`);
216
- });
217
- }
218
- // Detach the child from the parent's reference count. Without
219
- // this, the parent's event loop would stay alive waiting on the
220
- // child even though we never read its (closed) stdio.
221
- proc.unref();
222
- // Track spawn-time errors before the socket appears. Capture the
223
- // first error so we can re-throw it AS the cause instead of letting
224
- // it dead-end at stderr while waitForSocket times out 10s later
225
- // with a misleading "Timeout waiting for engine UDS at ..." message.
226
- // Spawn ENOENT (missing binary), EACCES (not executable), etc. now
227
- // surface their actual cause to the caller.
228
- let spawnErr;
229
- proc.once('error', (err) => {
230
- spawnErr = err;
231
- process.stderr.write(`[opensquid] engine spawn error: ${err.message}\n`);
232
- });
233
- try {
234
- await waitForSocket(sockPath, SOCKET_WAIT_TIMEOUT_MS);
235
- }
236
- catch (waitErr) {
237
- // Prefer the spawn error if one fired — it's the real cause.
238
- // The waitForSocket timeout is the symptom, not the diagnosis.
239
- if (spawnErr) {
240
- throw new Error(`engine spawn failed before socket appeared: ${spawnErr.message}`, {
241
- cause: spawnErr,
242
- });
243
- }
244
- throw waitErr;
245
- }
246
- const sock = await tryConnect(sockPath);
247
- return { socket: sock, spawnedByUs: true };
248
- }
249
- finally {
250
- await release().catch((e) => {
251
- // Lock release failure is informational — proper-lockfile's
252
- // stale-window will let subsequent acquires recover.
253
- process.stderr.write(`[opensquid] warning: failed to release engine spawn lock: ${String(e)}\n`);
254
- });
255
- }
256
- }
257
- // ---- Internals -----------------------------------------------------
258
- /**
259
- * Attempt a UDS connect, resolving with the socket on success and
260
- * rejecting with the connect-time error on failure. The `error`
261
- * listener doubles as the rejection path — ECONNREFUSED, ENOENT,
262
- * etc. all surface here. Caller decides whether to retry / unlink.
263
- */
264
- function tryConnect(path) {
265
- return new Promise((resolve, reject) => {
266
- const sock = connect(path);
267
- // Cleanup helper — single source of truth for listener removal
268
- // so success + failure paths don't leak.
269
- const cleanup = () => {
270
- sock.off('connect', onConnect);
271
- sock.off('error', onError);
272
- };
273
- const onConnect = () => {
274
- cleanup();
275
- resolve(sock);
276
- };
277
- const onError = (err) => {
278
- cleanup();
279
- // Make sure the failed socket doesn't linger in a half-open
280
- // state on the event loop.
281
- sock.destroy();
282
- reject(err);
283
- };
284
- sock.once('connect', onConnect);
285
- sock.once('error', onError);
286
- });
287
- }
288
- /**
289
- * Poll for socket existence with a deadline. The engine binds the
290
- * UDS BEFORE entering its accept loop, so file existence is a sound
291
- * readiness signal — `connect()` may still race for a tick or two
292
- * but `tryConnect` handles that.
293
- */
294
- async function waitForSocket(path, timeoutMs) {
295
- const start = Date.now();
296
- while (Date.now() - start < timeoutMs) {
297
- if (existsSync(path))
298
- return;
299
- await new Promise((r) => setTimeout(r, SOCKET_WAIT_POLL_INTERVAL_MS));
300
- }
301
- throw new Error(`Timeout (${String(timeoutMs)}ms) waiting for engine UDS at ${path}. ` +
302
- `Likely causes: engine binary failed to start (try OPENSQUID_ENGINE_BIN=<path> ` +
303
- `loop-engine serve --socket ${path} manually to see stderr), or HNSW ` +
304
- `rehydrate is unusually slow on this machine.`);
305
- }
306
- /**
307
- * Ensure `~/.opensquid/` exists so the lock + pidfile + socket
308
- * paths under it are writable. `mkdir -p` semantics — no error if
309
- * the dir already exists.
310
- */
311
- async function ensureOpensquidHome() {
312
- const { mkdir } = await import('node:fs/promises');
313
- await mkdir(opensquidHome(), { recursive: true });
314
- }
315
- /**
316
- * Create the lock file if it doesn't already exist.
317
- * `proper-lockfile.lock()` rejects with ENOENT if the target is
318
- * absent; this is the standard touch-then-lock idiom (matches
319
- * `src/functions/state.ts`).
320
- */
321
- async function touchFile(path) {
322
- const fh = await open(path, 'a');
323
- await fh.close();
324
- }
325
- //# sourceMappingURL=singleton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../src/engine/singleton.ts"],"names":[],"mappings":"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"}