opensquid 0.5.441 → 0.5.449

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/README.md +1 -0
  2. package/dist/functions/arm_scope.d.ts +27 -0
  3. package/dist/functions/arm_scope.d.ts.map +1 -0
  4. package/dist/functions/arm_scope.js +52 -0
  5. package/dist/functions/arm_scope.js.map +1 -0
  6. package/dist/functions/index.d.ts +1 -0
  7. package/dist/functions/index.d.ts.map +1 -1
  8. package/dist/functions/index.js +1 -0
  9. package/dist/functions/index.js.map +1 -1
  10. package/dist/functions/recall_pre_inject.d.ts.map +1 -1
  11. package/dist/functions/recall_pre_inject.js +12 -0
  12. package/dist/functions/recall_pre_inject.js.map +1 -1
  13. package/dist/rag/store_git.d.ts +23 -0
  14. package/dist/rag/store_git.d.ts.map +1 -0
  15. package/dist/rag/store_git.js +57 -0
  16. package/dist/rag/store_git.js.map +1 -0
  17. package/dist/runtime/bootstrap.d.ts.map +1 -1
  18. package/dist/runtime/bootstrap.js +2 -0
  19. package/dist/runtime/bootstrap.js.map +1 -1
  20. package/dist/runtime/handoff/render.d.ts +5 -4
  21. package/dist/runtime/handoff/render.d.ts.map +1 -1
  22. package/dist/runtime/handoff/render.js +7 -7
  23. package/dist/runtime/handoff/render.js.map +1 -1
  24. package/dist/runtime/hooks/active_task_mirror.js +0 -0
  25. package/dist/runtime/hooks/apply_patch.js +0 -0
  26. package/dist/runtime/hooks/dispatch.js +0 -0
  27. package/dist/runtime/hooks/hook_output.js +0 -0
  28. package/dist/runtime/hooks/memory_reconcile.js +0 -0
  29. package/dist/runtime/hooks/new_project_detect.js +0 -0
  30. package/dist/runtime/hooks/profession_resolver.js +0 -0
  31. package/dist/runtime/hooks/scope_intent.js +0 -0
  32. package/dist/runtime/hooks/session-end.js +11 -0
  33. package/dist/runtime/hooks/session-end.js.map +1 -1
  34. package/dist/runtime/hooks/session_id.js +0 -0
  35. package/dist/runtime/hooks/session_liveness.js +0 -0
  36. package/dist/runtime/hooks/stop_drive.js +0 -0
  37. package/dist/runtime/hooks/stop_stream.js +0 -0
  38. package/dist/runtime/hooks/subagent_guard.js +0 -0
  39. package/dist/runtime/hooks/transcript.js +0 -0
  40. package/dist/runtime/hooks/transcript_tasks.js +0 -0
  41. package/dist/runtime/ralph/orchestrator.d.ts.map +1 -1
  42. package/dist/runtime/ralph/orchestrator.js +2 -1
  43. package/dist/runtime/ralph/orchestrator.js.map +1 -1
  44. package/dist/setup/cli/limits_state.d.ts.map +1 -1
  45. package/dist/setup/cli/limits_state.js +6 -40
  46. package/dist/setup/cli/limits_state.js.map +1 -1
  47. package/dist/setup/cli/pack_walk.d.ts +32 -0
  48. package/dist/setup/cli/pack_walk.d.ts.map +1 -0
  49. package/dist/setup/cli/pack_walk.js +76 -0
  50. package/dist/setup/cli/pack_walk.js.map +1 -0
  51. package/dist/setup/cli/permissions_state.d.ts.map +1 -1
  52. package/dist/setup/cli/permissions_state.js +6 -37
  53. package/dist/setup/cli/permissions_state.js.map +1 -1
  54. package/dist/setup/cli/triggers_state.d.ts.map +1 -1
  55. package/dist/setup/cli/triggers_state.js +3 -29
  56. package/dist/setup/cli/triggers_state.js.map +1 -1
  57. package/dist/workgraph/events.d.ts.map +1 -1
  58. package/dist/workgraph/events.js +10 -0
  59. package/dist/workgraph/events.js.map +1 -1
  60. package/dist/workgraph/store.d.ts.map +1 -1
  61. package/dist/workgraph/store.js +5 -0
  62. package/dist/workgraph/store.js.map +1 -1
  63. package/dist/workgraph/types.d.ts +2 -1
  64. package/dist/workgraph/types.d.ts.map +1 -1
  65. package/docs/ARCHITECTURE.md +268 -0
  66. package/docs/pack-runtime.md +15 -12
  67. package/docs/skill-grammar-guide.md +4 -4
  68. package/package.json +5 -3
  69. package/packs/builtin/coding-flow/skills/entry-and-handoffs/skill.yaml +13 -17
  70. package/dist/anti-drift/evaluator.d.ts +0 -88
  71. package/dist/anti-drift/evaluator.d.ts.map +0 -1
  72. package/dist/anti-drift/evaluator.js +0 -417
  73. package/dist/anti-drift/evaluator.js.map +0 -1
  74. package/dist/anti-drift/evaluator.test.js +0 -78
  75. package/dist/anti-drift/rules.d.ts +0 -80
  76. package/dist/anti-drift/rules.d.ts.map +0 -1
  77. package/dist/anti-drift/rules.js +0 -368
  78. package/dist/anti-drift/rules.js.map +0 -1
  79. package/dist/anti-drift/rules.test.js +0 -213
  80. package/dist/anti-drift/state.d.ts +0 -107
  81. package/dist/anti-drift/state.d.ts.map +0 -1
  82. package/dist/anti-drift/state.js +0 -177
  83. package/dist/anti-drift/state.js.map +0 -1
  84. package/dist/anti-drift/state.test.js +0 -120
  85. package/dist/chat/adapters/discord.d.ts +0 -41
  86. package/dist/chat/adapters/discord.d.ts.map +0 -1
  87. package/dist/chat/adapters/discord.js +0 -176
  88. package/dist/chat/adapters/discord.js.map +0 -1
  89. package/dist/chat/adapters/discord.test.js +0 -25
  90. package/dist/chat/adapters/slack.d.ts +0 -43
  91. package/dist/chat/adapters/slack.d.ts.map +0 -1
  92. package/dist/chat/adapters/slack.js +0 -172
  93. package/dist/chat/adapters/slack.js.map +0 -1
  94. package/dist/chat/adapters/slack.test.js +0 -30
  95. package/dist/chat/adapters/telegram.d.ts +0 -148
  96. package/dist/chat/adapters/telegram.d.ts.map +0 -1
  97. package/dist/chat/adapters/telegram.js +0 -498
  98. package/dist/chat/adapters/telegram.js.map +0 -1
  99. package/dist/chat/adapters/telegram.test.js +0 -94
  100. package/dist/chat/config.d.ts +0 -98
  101. package/dist/chat/config.d.ts.map +0 -1
  102. package/dist/chat/config.js +0 -185
  103. package/dist/chat/config.js.map +0 -1
  104. package/dist/chat/daemon/active-project.d.ts +0 -17
  105. package/dist/chat/daemon/active-project.d.ts.map +0 -1
  106. package/dist/chat/daemon/active-project.js +0 -23
  107. package/dist/chat/daemon/active-project.js.map +0 -1
  108. package/dist/chat/daemon/autospawn.d.ts +0 -40
  109. package/dist/chat/daemon/autospawn.d.ts.map +0 -1
  110. package/dist/chat/daemon/autospawn.js +0 -129
  111. package/dist/chat/daemon/autospawn.js.map +0 -1
  112. package/dist/chat/daemon/autospawn.test.js +0 -112
  113. package/dist/chat/daemon/cli.d.ts +0 -18
  114. package/dist/chat/daemon/cli.d.ts.map +0 -1
  115. package/dist/chat/daemon/cli.js +0 -71
  116. package/dist/chat/daemon/cli.js.map +0 -1
  117. package/dist/chat/daemon/collisions.js +0 -384
  118. package/dist/chat/daemon/health-check.d.ts +0 -69
  119. package/dist/chat/daemon/health-check.d.ts.map +0 -1
  120. package/dist/chat/daemon/health-check.js +0 -112
  121. package/dist/chat/daemon/health-check.js.map +0 -1
  122. package/dist/chat/daemon/inbox-read.d.ts +0 -35
  123. package/dist/chat/daemon/inbox-read.d.ts.map +0 -1
  124. package/dist/chat/daemon/inbox-read.js +0 -75
  125. package/dist/chat/daemon/inbox-read.js.map +0 -1
  126. package/dist/chat/daemon/inbox-read.test.js +0 -97
  127. package/dist/chat/daemon/inbox.d.ts +0 -63
  128. package/dist/chat/daemon/inbox.d.ts.map +0 -1
  129. package/dist/chat/daemon/inbox.js +0 -56
  130. package/dist/chat/daemon/inbox.js.map +0 -1
  131. package/dist/chat/daemon/inbox.test.js +0 -110
  132. package/dist/chat/daemon/lifecycle.d.ts +0 -71
  133. package/dist/chat/daemon/lifecycle.d.ts.map +0 -1
  134. package/dist/chat/daemon/lifecycle.js +0 -221
  135. package/dist/chat/daemon/lifecycle.js.map +0 -1
  136. package/dist/chat/daemon/lifecycle.test.js +0 -163
  137. package/dist/chat/daemon/protocol.d.ts +0 -107
  138. package/dist/chat/daemon/protocol.d.ts.map +0 -1
  139. package/dist/chat/daemon/protocol.js +0 -54
  140. package/dist/chat/daemon/protocol.js.map +0 -1
  141. package/dist/chat/daemon/routing.d.ts +0 -140
  142. package/dist/chat/daemon/routing.d.ts.map +0 -1
  143. package/dist/chat/daemon/routing.js +0 -198
  144. package/dist/chat/daemon/routing.js.map +0 -1
  145. package/dist/chat/daemon/routing.test.js +0 -259
  146. package/dist/chat/daemon/rpc-client.d.ts +0 -45
  147. package/dist/chat/daemon/rpc-client.d.ts.map +0 -1
  148. package/dist/chat/daemon/rpc-client.js +0 -133
  149. package/dist/chat/daemon/rpc-client.js.map +0 -1
  150. package/dist/chat/daemon/rpc-server.d.ts +0 -39
  151. package/dist/chat/daemon/rpc-server.d.ts.map +0 -1
  152. package/dist/chat/daemon/rpc-server.js +0 -385
  153. package/dist/chat/daemon/rpc-server.js.map +0 -1
  154. package/dist/chat/daemon/rpc.test.js +0 -177
  155. package/dist/chat/daemon/subscribers.js +0 -257
  156. package/dist/chat/daemon/worker.d.ts +0 -27
  157. package/dist/chat/daemon/worker.d.ts.map +0 -1
  158. package/dist/chat/daemon/worker.js +0 -313
  159. package/dist/chat/daemon/worker.js.map +0 -1
  160. package/dist/chat/daemon/workspace-topic.js +0 -324
  161. package/dist/chat/env-token.d.ts +0 -60
  162. package/dist/chat/env-token.d.ts.map +0 -1
  163. package/dist/chat/env-token.js +0 -137
  164. package/dist/chat/env-token.js.map +0 -1
  165. package/dist/chat/env-token.test.js +0 -160
  166. package/dist/chat/factory.d.ts +0 -30
  167. package/dist/chat/factory.d.ts.map +0 -1
  168. package/dist/chat/factory.js +0 -50
  169. package/dist/chat/factory.js.map +0 -1
  170. package/dist/chat/factory.test.js +0 -55
  171. package/dist/chat/gateway.d.ts +0 -176
  172. package/dist/chat/gateway.d.ts.map +0 -1
  173. package/dist/chat/gateway.js +0 -146
  174. package/dist/chat/gateway.js.map +0 -1
  175. package/dist/chat/gateway.test.js +0 -192
  176. package/dist/claude-md.d.ts +0 -39
  177. package/dist/claude-md.d.ts.map +0 -1
  178. package/dist/claude-md.js +0 -113
  179. package/dist/claude-md.js.map +0 -1
  180. package/dist/claude-md.test.js +0 -91
  181. package/dist/codex/activate.d.ts +0 -66
  182. package/dist/codex/activate.d.ts.map +0 -1
  183. package/dist/codex/activate.js +0 -329
  184. package/dist/codex/activate.js.map +0 -1
  185. package/dist/codex/activate.test.js +0 -229
  186. package/dist/codex/bundled-default/bundled-default.test.js +0 -161
  187. package/dist/codex/cli-publish.test.js +0 -133
  188. package/dist/codex/cli.d.ts +0 -35
  189. package/dist/codex/cli.d.ts.map +0 -1
  190. package/dist/codex/cli.js +0 -554
  191. package/dist/codex/cli.js.map +0 -1
  192. package/dist/codex/cli.test.js +0 -277
  193. package/dist/codex/import-skill-md.d.ts +0 -53
  194. package/dist/codex/import-skill-md.d.ts.map +0 -1
  195. package/dist/codex/import-skill-md.js +0 -236
  196. package/dist/codex/import-skill-md.js.map +0 -1
  197. package/dist/codex/import-skill-md.test.js +0 -225
  198. package/dist/codex/loader.d.ts +0 -27
  199. package/dist/codex/loader.d.ts.map +0 -1
  200. package/dist/codex/loader.js +0 -86
  201. package/dist/codex/loader.js.map +0 -1
  202. package/dist/codex/loader.test.js +0 -75
  203. package/dist/codex/parse.d.ts +0 -28
  204. package/dist/codex/parse.d.ts.map +0 -1
  205. package/dist/codex/parse.js +0 -309
  206. package/dist/codex/parse.js.map +0 -1
  207. package/dist/codex/parse.test.js +0 -241
  208. package/dist/codex/store.d.ts +0 -87
  209. package/dist/codex/store.d.ts.map +0 -1
  210. package/dist/codex/store.js +0 -205
  211. package/dist/codex/store.js.map +0 -1
  212. package/dist/codex/store.test.js +0 -242
  213. package/dist/codex/types.d.ts +0 -398
  214. package/dist/codex/types.d.ts.map +0 -1
  215. package/dist/codex/types.js +0 -21
  216. package/dist/codex/types.js.map +0 -1
  217. package/dist/config.d.ts +0 -53
  218. package/dist/config.d.ts.map +0 -1
  219. package/dist/config.js +0 -202
  220. package/dist/config.js.map +0 -1
  221. package/dist/config.test.js +0 -117
  222. package/dist/engine/cli.d.ts +0 -14
  223. package/dist/engine/cli.d.ts.map +0 -1
  224. package/dist/engine/cli.js +0 -171
  225. package/dist/engine/cli.js.map +0 -1
  226. package/dist/engine/client.d.ts +0 -219
  227. package/dist/engine/client.d.ts.map +0 -1
  228. package/dist/engine/client.js +0 -312
  229. package/dist/engine/client.js.map +0 -1
  230. package/dist/engine/config.d.ts +0 -62
  231. package/dist/engine/config.d.ts.map +0 -1
  232. package/dist/engine/config.js +0 -223
  233. package/dist/engine/config.js.map +0 -1
  234. package/dist/engine/index.d.ts +0 -17
  235. package/dist/engine/index.d.ts.map +0 -1
  236. package/dist/engine/index.js +0 -16
  237. package/dist/engine/index.js.map +0 -1
  238. package/dist/engine/resolver.d.ts +0 -62
  239. package/dist/engine/resolver.d.ts.map +0 -1
  240. package/dist/engine/resolver.js +0 -103
  241. package/dist/engine/resolver.js.map +0 -1
  242. package/dist/engine/singleton.d.ts +0 -95
  243. package/dist/engine/singleton.d.ts.map +0 -1
  244. package/dist/engine/singleton.js +0 -325
  245. package/dist/engine/singleton.js.map +0 -1
  246. package/dist/engine/types.d.ts +0 -402
  247. package/dist/engine/types.d.ts.map +0 -1
  248. package/dist/engine/types.js +0 -22
  249. package/dist/engine/types.js.map +0 -1
  250. package/dist/engine-binary-resolver.js +0 -110
  251. package/dist/engine-binary-resolver.test.js +0 -61
  252. package/dist/engine-cli.js +0 -60
  253. package/dist/engine-client.js +0 -301
  254. package/dist/engine-client.test.js +0 -118
  255. package/dist/functions/chain_state.d.ts +0 -51
  256. package/dist/functions/chain_state.d.ts.map +0 -1
  257. package/dist/functions/chain_state.js +0 -59
  258. package/dist/functions/chain_state.js.map +0 -1
  259. package/dist/hooks/drift-catalog.d.ts +0 -68
  260. package/dist/hooks/drift-catalog.d.ts.map +0 -1
  261. package/dist/hooks/drift-catalog.js +0 -184
  262. package/dist/hooks/drift-catalog.js.map +0 -1
  263. package/dist/hooks/drift-catalog.test.js +0 -154
  264. package/dist/hooks/drift-patterns.d.ts +0 -110
  265. package/dist/hooks/drift-patterns.d.ts.map +0 -1
  266. package/dist/hooks/drift-patterns.js +0 -289
  267. package/dist/hooks/drift-patterns.js.map +0 -1
  268. package/dist/hooks/drift-patterns.test.js +0 -325
  269. package/dist/hooks/engine-vocab-gate.d.ts +0 -108
  270. package/dist/hooks/engine-vocab-gate.d.ts.map +0 -1
  271. package/dist/hooks/engine-vocab-gate.js +0 -225
  272. package/dist/hooks/engine-vocab-gate.js.map +0 -1
  273. package/dist/hooks/engine-vocab-gate.test.js +0 -170
  274. package/dist/hooks/heartbeat.d.ts +0 -107
  275. package/dist/hooks/heartbeat.d.ts.map +0 -1
  276. package/dist/hooks/heartbeat.js +0 -316
  277. package/dist/hooks/heartbeat.js.map +0 -1
  278. package/dist/hooks/heartbeat.test.js +0 -393
  279. package/dist/hooks/honesty-ledger-session-scope.test.js +0 -100
  280. package/dist/hooks/honesty-ledger.d.ts +0 -123
  281. package/dist/hooks/honesty-ledger.d.ts.map +0 -1
  282. package/dist/hooks/honesty-ledger.js +0 -226
  283. package/dist/hooks/honesty-ledger.js.map +0 -1
  284. package/dist/hooks/honesty-ledger.test.js +0 -466
  285. package/dist/hooks/inline-report-check.d.ts +0 -63
  286. package/dist/hooks/inline-report-check.d.ts.map +0 -1
  287. package/dist/hooks/inline-report-check.js +0 -88
  288. package/dist/hooks/inline-report-check.js.map +0 -1
  289. package/dist/hooks/inline-report-check.test.js +0 -96
  290. package/dist/hooks/pre-tool-use.d.ts +0 -62
  291. package/dist/hooks/pre-tool-use.d.ts.map +0 -1
  292. package/dist/hooks/pre-tool-use.js +0 -342
  293. package/dist/hooks/pre-tool-use.js.map +0 -1
  294. package/dist/hooks/pre-tool-use.test.js +0 -134
  295. package/dist/hooks/session-end.d.ts +0 -15
  296. package/dist/hooks/session-end.d.ts.map +0 -1
  297. package/dist/hooks/session-end.js +0 -60
  298. package/dist/hooks/session-end.js.map +0 -1
  299. package/dist/hooks/session-end.test.js +0 -52
  300. package/dist/hooks/stop.d.ts +0 -35
  301. package/dist/hooks/stop.d.ts.map +0 -1
  302. package/dist/hooks/stop.js +0 -136
  303. package/dist/hooks/stop.js.map +0 -1
  304. package/dist/hooks/transcript-active-task.test.js +0 -342
  305. package/dist/hooks/transcript.d.ts +0 -26
  306. package/dist/hooks/transcript.d.ts.map +0 -1
  307. package/dist/hooks/transcript.js +0 -266
  308. package/dist/hooks/transcript.js.map +0 -1
  309. package/dist/hooks/transcript.test.js +0 -103
  310. package/dist/hooks/user-prompt-submit.d.ts +0 -74
  311. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  312. package/dist/hooks/user-prompt-submit.js +0 -256
  313. package/dist/hooks/user-prompt-submit.js.map +0 -1
  314. package/dist/hooks/user-prompt-submit.test.js +0 -118
  315. package/dist/hooks/versioning-gate.d.ts +0 -101
  316. package/dist/hooks/versioning-gate.d.ts.map +0 -1
  317. package/dist/hooks/versioning-gate.js +0 -245
  318. package/dist/hooks/versioning-gate.js.map +0 -1
  319. package/dist/hooks/versioning-gate.test.js +0 -368
  320. package/dist/hooks/workflow-gate.d.ts +0 -64
  321. package/dist/hooks/workflow-gate.d.ts.map +0 -1
  322. package/dist/hooks/workflow-gate.js +0 -152
  323. package/dist/hooks/workflow-gate.js.map +0 -1
  324. package/dist/hooks/workflow-gate.test.js +0 -197
  325. package/dist/hooks-cli.d.ts +0 -25
  326. package/dist/hooks-cli.d.ts.map +0 -1
  327. package/dist/hooks-cli.js +0 -286
  328. package/dist/hooks-cli.js.map +0 -1
  329. package/dist/hooks-cli.test.js +0 -148
  330. package/dist/origin.d.ts +0 -16
  331. package/dist/origin.d.ts.map +0 -1
  332. package/dist/origin.js +0 -92
  333. package/dist/origin.js.map +0 -1
  334. package/dist/packs/seed_lessons_ingest.d.ts +0 -30
  335. package/dist/packs/seed_lessons_ingest.d.ts.map +0 -1
  336. package/dist/packs/seed_lessons_ingest.js +0 -107
  337. package/dist/packs/seed_lessons_ingest.js.map +0 -1
  338. package/dist/project-cli.d.ts +0 -7
  339. package/dist/project-cli.d.ts.map +0 -1
  340. package/dist/project-cli.js +0 -145
  341. package/dist/project-cli.js.map +0 -1
  342. package/dist/project.d.ts +0 -127
  343. package/dist/project.d.ts.map +0 -1
  344. package/dist/project.js +0 -281
  345. package/dist/project.js.map +0 -1
  346. package/dist/project.test.js +0 -287
  347. package/dist/rag/backends/loop_engine.d.ts +0 -61
  348. package/dist/rag/backends/loop_engine.d.ts.map +0 -1
  349. package/dist/rag/backends/loop_engine.js +0 -160
  350. package/dist/rag/backends/loop_engine.js.map +0 -1
  351. package/dist/recall.d.ts +0 -82
  352. package/dist/recall.d.ts.map +0 -1
  353. package/dist/recall.js +0 -81
  354. package/dist/recall.js.map +0 -1
  355. package/dist/runtime/agent_bridge/autospawn.d.ts +0 -131
  356. package/dist/runtime/agent_bridge/autospawn.d.ts.map +0 -1
  357. package/dist/runtime/agent_bridge/autospawn.js +0 -251
  358. package/dist/runtime/agent_bridge/autospawn.js.map +0 -1
  359. package/dist/runtime/chain_state.d.ts +0 -124
  360. package/dist/runtime/chain_state.d.ts.map +0 -1
  361. package/dist/runtime/chain_state.js +0 -189
  362. package/dist/runtime/chain_state.js.map +0 -1
  363. package/dist/runtime/hooks/permission_decision.d.ts +0 -34
  364. package/dist/runtime/hooks/permission_decision.d.ts.map +0 -1
  365. package/dist/runtime/hooks/permission_decision.js +0 -39
  366. package/dist/runtime/hooks/permission_decision.js.map +0 -1
  367. package/dist/runtime/workflow_fsm.d.ts +0 -21
  368. package/dist/runtime/workflow_fsm.d.ts.map +0 -1
  369. package/dist/runtime/workflow_fsm.js +0 -25
  370. package/dist/runtime/workflow_fsm.js.map +0 -1
  371. package/dist/runtime/workflow_map.d.ts +0 -26
  372. package/dist/runtime/workflow_map.d.ts.map +0 -1
  373. package/dist/runtime/workflow_map.js +0 -38
  374. package/dist/runtime/workflow_map.js.map +0 -1
  375. package/dist/scope.d.ts +0 -48
  376. package/dist/scope.d.ts.map +0 -1
  377. package/dist/scope.js +0 -111
  378. package/dist/scope.js.map +0 -1
  379. package/dist/setup/cli/topic_create_step.d.ts +0 -84
  380. package/dist/setup/cli/topic_create_step.d.ts.map +0 -1
  381. package/dist/setup/cli/topic_create_step.js +0 -213
  382. package/dist/setup/cli/topic_create_step.js.map +0 -1
  383. package/dist/system-export.d.ts +0 -65
  384. package/dist/system-export.d.ts.map +0 -1
  385. package/dist/system-export.js +0 -194
  386. package/dist/system-export.js.map +0 -1
  387. package/dist/utterance/classifier.d.ts +0 -53
  388. package/dist/utterance/classifier.d.ts.map +0 -1
  389. package/dist/utterance/classifier.js +0 -184
  390. package/dist/utterance/classifier.js.map +0 -1
  391. package/dist/utterance/classifier.test.js +0 -147
@@ -1,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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAA4B,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,EAML,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EAKpB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAcvB,MAAM,OAAO,SAAS;IAMS;IALrB,MAAM,CAAS;IACf,SAAS,GAAG,KAAK,CAAC;IACT,OAAO,CAAS;IAChB,SAAS,CAAS;IAEnC,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;QACjD,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,kEAAkE;QAClE,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3B,8DAA8D;QAChE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,oEAAoE;QACpE,8DAA8D;QAC9D,gEAAgE;QAChE,6DAA6D;QAC7D,qCAAqC;QACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;YACrB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,MAAc;QACrC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,GAAG,IAAI,KAAK,CAAC;YACb,IAAI,EAAU,CAAC;YACf,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACvC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,kEAAkE;YAClE,oDAAoD;YACpD,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,IAAY,EAAE,MAAc;QAC/C,IAAI,GAAmB,CAAC;QACxB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAClF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAE,GAAkC,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzD,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,OAAO,CAAC,MAAc,EAAE,QAAyC;QACvE,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,GAAmB;QACtC,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnB,KAAK,MAAM;oBACT,OAAO,OAAO,CAAa,GAAG,CAAC,EAAE,EAAE;wBACjC,IAAI,EAAE,IAAI;wBACV,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;wBACjC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS;qBACxC,CAAC,CAAC;gBACL,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,uDAAuD;oBACvD,uDAAuD;oBACvD,wDAAwD;oBACxD,oDAAoD;oBACpD,yDAAyD;oBACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;oBACtD,MAAM,YAAY,GAAa,EAAE,CAAC;oBAClC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBAChD,MAAM,KAAK,GAAG,OAAwD,CAAC;wBACvE,IAAI,OAAO,KAAK,EAAE,cAAc,KAAK,UAAU,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;4BAC1E,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACvB,CAAC;oBACH,CAAC;oBACD,OAAO,OAAO,CAAqB,GAAG,CAAC,EAAE,EAAE;wBACzC,gBAAgB,EAAE,SAAS;wBAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;wBACtC,uBAAuB,EAAE,YAAY;qBACtC,CAAC,CAAC;gBACL,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,CAAC,GAAG,GAAG,CAAC,MAAgC,CAAC;oBAC/C,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtE,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,uBAAuB,EAAE,+BAA+B,CAAC,CAAC;oBACnF,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;wBAC1C,OAAO,EAAE,CAAC,CAAC,OAAO;wBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;wBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;qBACrB,CAAC,CAAC;oBACH,OAAO,OAAO,CAAa,GAAG,CAAC,EAAE,EAAE;wBACjC,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,UAAU,EAAE,MAAM,CAAC,SAAS;wBAC5B,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE;qBAC/C,CAAC,CAAC;gBACL,CAAC;gBACD,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAuC,CAAC;oBACtD,IACE,CAAC,CAAC;wBACF,CAAC,CAAC,QAAQ,KAAK,UAAU;wBACzB,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;wBAC7B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAC1B,CAAC;wBACD,OAAO,OAAO,CACZ,GAAG,CAAC,EAAE,EACN,uBAAuB,EACvB,2DAA2D,CAC5D,CAAC;oBACJ,CAAC;oBACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBACzD,IACE,CAAC,OAAO;wBACR,OAAQ,OAAqC,CAAC,WAAW,KAAK,UAAU,EACxE,CAAC;wBACD,OAAO,OAAO,CACZ,GAAG,CAAC,EAAE,EACN,uBAAuB,EACvB,GAAG,CAAC,CAAC,QAAQ,0DAA0D,CACxE,CAAC;oBACJ,CAAC;oBACD,MAAM,UAAU,GAAG,OAMlB,CAAC;oBACF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;wBAC1D,SAAS,EAAE,CAAC,CAAC,UAAU;wBACvB,iBAAiB,EAAE,CAAC,CAAC,oBAAoB;qBAC1C,CAAC,CAAC;oBACH,OAAO,OAAO,CAAoB,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBACjD,CAAC;gBACD;oBACE,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,yBAAyB,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,OAAO,CACZ,GAAG,CAAC,EAAE,EACN,uBAAuB,EACvB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,wEAAwE;AACxE,4BAA4B;AAC5B,wEAAwE;AAExE,SAAS,OAAO,CAAI,EAAmB,EAAE,MAAS;IAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,OAAO,CAAC,EAA0B,EAAE,IAAY,EAAE,OAAe;IACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,IAAI,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,EAA0B;IAChD,OAAO,OAAO,CAAC,EAAE,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;AAC1E,CAAC"}