wicked-crew 0.7.40 → 0.7.46

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 (361) hide show
  1. package/dist/api/audit.d.ts +3 -0
  2. package/dist/api/audit.d.ts.map +1 -1
  3. package/dist/api/audit.js +2 -0
  4. package/dist/api/audit.js.map +1 -1
  5. package/dist/api/capture.d.ts +149 -0
  6. package/dist/api/capture.d.ts.map +1 -0
  7. package/dist/api/capture.js +330 -0
  8. package/dist/api/capture.js.map +1 -0
  9. package/dist/api/chat-citations.d.ts +174 -0
  10. package/dist/api/chat-citations.d.ts.map +1 -0
  11. package/dist/api/chat-citations.js +528 -0
  12. package/dist/api/chat-citations.js.map +1 -0
  13. package/dist/api/chat-transcripts.d.ts +20 -1
  14. package/dist/api/chat-transcripts.d.ts.map +1 -1
  15. package/dist/api/chat-transcripts.js +29 -0
  16. package/dist/api/chat-transcripts.js.map +1 -1
  17. package/dist/api/delivery-cache.d.ts +2 -2
  18. package/dist/api/delivery-freeze.d.ts +66 -0
  19. package/dist/api/delivery-freeze.d.ts.map +1 -0
  20. package/dist/api/delivery-freeze.js +104 -0
  21. package/dist/api/delivery-freeze.js.map +1 -0
  22. package/dist/api/delivery-index.d.ts +53 -9
  23. package/dist/api/delivery-index.d.ts.map +1 -1
  24. package/dist/api/delivery-index.js +115 -22
  25. package/dist/api/delivery-index.js.map +1 -1
  26. package/dist/api/demo.d.ts +90 -0
  27. package/dist/api/demo.d.ts.map +1 -0
  28. package/dist/api/demo.js +492 -0
  29. package/dist/api/demo.js.map +1 -0
  30. package/dist/api/diagnostics.d.ts +64 -1
  31. package/dist/api/diagnostics.d.ts.map +1 -1
  32. package/dist/api/diagnostics.js +129 -1
  33. package/dist/api/diagnostics.js.map +1 -1
  34. package/dist/api/eval-sample.d.ts +6 -6
  35. package/dist/api/governance-steering.d.ts +2 -2
  36. package/dist/api/mcp.d.ts +282 -0
  37. package/dist/api/mcp.d.ts.map +1 -0
  38. package/dist/api/mcp.js +521 -0
  39. package/dist/api/mcp.js.map +1 -0
  40. package/dist/api/plan-schema.d.ts +56 -0
  41. package/dist/api/plan-schema.d.ts.map +1 -0
  42. package/dist/api/plan-schema.js +26 -0
  43. package/dist/api/plan-schema.js.map +1 -0
  44. package/dist/api/roster-standing.d.ts +15 -2
  45. package/dist/api/roster-standing.d.ts.map +1 -1
  46. package/dist/api/roster-standing.js +59 -3
  47. package/dist/api/roster-standing.js.map +1 -1
  48. package/dist/api/routes.d.ts +630 -51
  49. package/dist/api/routes.d.ts.map +1 -1
  50. package/dist/api/routes.js +738 -127
  51. package/dist/api/routes.js.map +1 -1
  52. package/dist/api/run-files.d.ts.map +1 -1
  53. package/dist/api/run-files.js +31 -2
  54. package/dist/api/run-files.js.map +1 -1
  55. package/dist/api/run-liveness.d.ts +41 -0
  56. package/dist/api/run-liveness.d.ts.map +1 -0
  57. package/dist/api/run-liveness.js +166 -0
  58. package/dist/api/run-liveness.js.map +1 -0
  59. package/dist/api/seat-health.d.ts +35 -0
  60. package/dist/api/seat-health.d.ts.map +1 -1
  61. package/dist/api/seat-health.js +92 -4
  62. package/dist/api/seat-health.js.map +1 -1
  63. package/dist/api/seat-probe.d.ts +141 -0
  64. package/dist/api/seat-probe.d.ts.map +1 -0
  65. package/dist/api/seat-probe.js +257 -0
  66. package/dist/api/seat-probe.js.map +1 -0
  67. package/dist/api/seat-record.d.ts +40 -0
  68. package/dist/api/seat-record.d.ts.map +1 -0
  69. package/dist/api/seat-record.js +218 -0
  70. package/dist/api/seat-record.js.map +1 -0
  71. package/dist/api/seat-signin.d.ts.map +1 -1
  72. package/dist/api/seat-signin.js +3 -1
  73. package/dist/api/seat-signin.js.map +1 -1
  74. package/dist/api/seat-standing.d.ts +25 -5
  75. package/dist/api/seat-standing.d.ts.map +1 -1
  76. package/dist/api/seat-standing.js +76 -9
  77. package/dist/api/seat-standing.js.map +1 -1
  78. package/dist/api/server.d.ts +34 -48
  79. package/dist/api/server.d.ts.map +1 -1
  80. package/dist/api/server.js +283 -107
  81. package/dist/api/server.js.map +1 -1
  82. package/dist/api/skills.d.ts +3 -1
  83. package/dist/api/skills.d.ts.map +1 -1
  84. package/dist/api/skills.js +7 -2
  85. package/dist/api/skills.js.map +1 -1
  86. package/dist/api/stall-watchdog.d.ts +34 -3
  87. package/dist/api/stall-watchdog.d.ts.map +1 -1
  88. package/dist/api/stall-watchdog.js +107 -8
  89. package/dist/api/stall-watchdog.js.map +1 -1
  90. package/dist/api/steering-landing.d.ts +6 -6
  91. package/dist/api/steering-landing.d.ts.map +1 -1
  92. package/dist/api/steering-landing.js +7 -9
  93. package/dist/api/steering-landing.js.map +1 -1
  94. package/dist/api/testing.d.ts +6 -4
  95. package/dist/api/testing.d.ts.map +1 -1
  96. package/dist/api/testing.js +82 -47
  97. package/dist/api/testing.js.map +1 -1
  98. package/dist/campaign/boot-resume.d.ts +34 -0
  99. package/dist/campaign/boot-resume.d.ts.map +1 -0
  100. package/dist/campaign/boot-resume.js +45 -0
  101. package/dist/campaign/boot-resume.js.map +1 -0
  102. package/dist/campaigns/rollup.d.ts +4 -1
  103. package/dist/campaigns/rollup.d.ts.map +1 -1
  104. package/dist/campaigns/rollup.js +6 -1
  105. package/dist/campaigns/rollup.js.map +1 -1
  106. package/dist/campaigns/routes.d.ts +2 -2
  107. package/dist/cli/bearer.d.ts +27 -1
  108. package/dist/cli/bearer.d.ts.map +1 -1
  109. package/dist/cli/bearer.js +62 -2
  110. package/dist/cli/bearer.js.map +1 -1
  111. package/dist/cli/governance.d.ts +11 -0
  112. package/dist/cli/governance.d.ts.map +1 -1
  113. package/dist/cli/governance.js +8 -2
  114. package/dist/cli/governance.js.map +1 -1
  115. package/dist/cli/index.d.ts.map +1 -1
  116. package/dist/cli/index.js +140 -75
  117. package/dist/cli/index.js.map +1 -1
  118. package/dist/cli/mcp.d.ts +11 -0
  119. package/dist/cli/mcp.d.ts.map +1 -1
  120. package/dist/cli/mcp.js +40 -9
  121. package/dist/cli/mcp.js.map +1 -1
  122. package/dist/cli/service.d.ts +78 -0
  123. package/dist/cli/service.d.ts.map +1 -0
  124. package/dist/cli/service.js +334 -0
  125. package/dist/cli/service.js.map +1 -0
  126. package/dist/core/adapter.d.ts +238 -12
  127. package/dist/core/adapter.d.ts.map +1 -1
  128. package/dist/core/adapter.js +619 -157
  129. package/dist/core/adapter.js.map +1 -1
  130. package/dist/core/bridge-reaper.d.ts +4 -1
  131. package/dist/core/bridge-reaper.d.ts.map +1 -1
  132. package/dist/core/bridge-reaper.js +15 -1
  133. package/dist/core/bridge-reaper.js.map +1 -1
  134. package/dist/core/bus-notice.d.ts +27 -0
  135. package/dist/core/bus-notice.d.ts.map +1 -0
  136. package/dist/core/bus-notice.js +24 -0
  137. package/dist/core/bus-notice.js.map +1 -0
  138. package/dist/core/bus.d.ts +99 -0
  139. package/dist/core/bus.d.ts.map +1 -0
  140. package/dist/core/bus.js +176 -0
  141. package/dist/core/bus.js.map +1 -0
  142. package/dist/core/deliver-exclusions.d.ts +71 -0
  143. package/dist/core/deliver-exclusions.d.ts.map +1 -0
  144. package/dist/core/deliver-exclusions.js +110 -0
  145. package/dist/core/deliver-exclusions.js.map +1 -0
  146. package/dist/core/deliver-text.d.ts +61 -14
  147. package/dist/core/deliver-text.d.ts.map +1 -1
  148. package/dist/core/deliver-text.js +178 -30
  149. package/dist/core/deliver-text.js.map +1 -1
  150. package/dist/core/deliver-triage.d.ts +11 -2
  151. package/dist/core/deliver-triage.d.ts.map +1 -1
  152. package/dist/core/deliver-triage.js +19 -1
  153. package/dist/core/deliver-triage.js.map +1 -1
  154. package/dist/core/deliver.d.ts +161 -3
  155. package/dist/core/deliver.d.ts.map +1 -1
  156. package/dist/core/deliver.js +463 -25
  157. package/dist/core/deliver.js.map +1 -1
  158. package/dist/core/deliverable-floor.d.ts.map +1 -1
  159. package/dist/core/deliverable-floor.js +5 -7
  160. package/dist/core/deliverable-floor.js.map +1 -1
  161. package/dist/core/engine-bus.d.ts +40 -0
  162. package/dist/core/engine-bus.d.ts.map +1 -0
  163. package/dist/core/engine-bus.js +27 -0
  164. package/dist/core/engine-bus.js.map +1 -0
  165. package/dist/core/estate-mcp-client.d.ts +87 -5
  166. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  167. package/dist/core/estate-mcp-client.js +90 -11
  168. package/dist/core/estate-mcp-client.js.map +1 -1
  169. package/dist/core/linked-issues.d.ts +46 -0
  170. package/dist/core/linked-issues.d.ts.map +1 -0
  171. package/dist/core/linked-issues.js +123 -0
  172. package/dist/core/linked-issues.js.map +1 -0
  173. package/dist/core/run-identity.d.ts +100 -0
  174. package/dist/core/run-identity.d.ts.map +1 -0
  175. package/dist/core/run-identity.js +178 -0
  176. package/dist/core/run-identity.js.map +1 -0
  177. package/dist/core/shutdown.d.ts +16 -0
  178. package/dist/core/shutdown.d.ts.map +1 -0
  179. package/dist/core/shutdown.js +39 -0
  180. package/dist/core/shutdown.js.map +1 -0
  181. package/dist/core/types.d.ts +15 -1
  182. package/dist/core/types.d.ts.map +1 -1
  183. package/dist/core/types.js +4 -0
  184. package/dist/core/types.js.map +1 -1
  185. package/dist/interactive/bridge-pool.d.ts +67 -3
  186. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  187. package/dist/interactive/bridge-pool.js +129 -13
  188. package/dist/interactive/bridge-pool.js.map +1 -1
  189. package/dist/interactive/bridge-root.d.ts +9 -0
  190. package/dist/interactive/bridge-root.d.ts.map +1 -1
  191. package/dist/interactive/bridge-root.js +11 -4
  192. package/dist/interactive/bridge-root.js.map +1 -1
  193. package/dist/interactive/chat-events.d.ts +14 -9
  194. package/dist/interactive/chat-events.d.ts.map +1 -1
  195. package/dist/interactive/chat-events.js +55 -57
  196. package/dist/interactive/chat-events.js.map +1 -1
  197. package/dist/interactive/council-outcome.d.ts +1 -0
  198. package/dist/interactive/council-outcome.d.ts.map +1 -1
  199. package/dist/interactive/council-outcome.js +33 -0
  200. package/dist/interactive/council-outcome.js.map +1 -1
  201. package/dist/interactive/draft-events.d.ts +36 -17
  202. package/dist/interactive/draft-events.d.ts.map +1 -1
  203. package/dist/interactive/draft-events.js +121 -92
  204. package/dist/interactive/draft-events.js.map +1 -1
  205. package/dist/interactive/draft-skill.d.ts +59 -0
  206. package/dist/interactive/draft-skill.d.ts.map +1 -1
  207. package/dist/interactive/draft-skill.js +233 -0
  208. package/dist/interactive/draft-skill.js.map +1 -1
  209. package/dist/interactive/edit-events.d.ts +1 -14
  210. package/dist/interactive/edit-events.d.ts.map +1 -1
  211. package/dist/interactive/edit-events.js +37 -70
  212. package/dist/interactive/edit-events.js.map +1 -1
  213. package/dist/interactive/proxy-routes.d.ts +2 -2
  214. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  215. package/dist/interactive/proxy-routes.js +4 -13
  216. package/dist/interactive/proxy-routes.js.map +1 -1
  217. package/dist/interactive/ws-relay.d.ts +9 -10
  218. package/dist/interactive/ws-relay.d.ts.map +1 -1
  219. package/dist/interactive/ws-relay.js +23 -50
  220. package/dist/interactive/ws-relay.js.map +1 -1
  221. package/dist/mcp/broker.d.ts +88 -0
  222. package/dist/mcp/broker.d.ts.map +1 -0
  223. package/dist/mcp/broker.js +307 -0
  224. package/dist/mcp/broker.js.map +1 -0
  225. package/dist/mcp/call-records.d.ts +61 -0
  226. package/dist/mcp/call-records.d.ts.map +1 -0
  227. package/dist/mcp/call-records.js +135 -0
  228. package/dist/mcp/call-records.js.map +1 -0
  229. package/dist/mcp/classify.d.ts +45 -0
  230. package/dist/mcp/classify.d.ts.map +1 -0
  231. package/dist/mcp/classify.js +83 -0
  232. package/dist/mcp/classify.js.map +1 -0
  233. package/dist/mcp/discovery.d.ts +24 -0
  234. package/dist/mcp/discovery.d.ts.map +1 -0
  235. package/dist/mcp/discovery.js +78 -0
  236. package/dist/mcp/discovery.js.map +1 -0
  237. package/dist/mcp/invoke.d.ts +36 -0
  238. package/dist/mcp/invoke.d.ts.map +1 -0
  239. package/dist/mcp/invoke.js +80 -0
  240. package/dist/mcp/invoke.js.map +1 -0
  241. package/dist/mcp/policies.d.ts +110 -0
  242. package/dist/mcp/policies.d.ts.map +1 -0
  243. package/dist/mcp/policies.js +400 -0
  244. package/dist/mcp/policies.js.map +1 -0
  245. package/dist/mcp/probe.d.ts +66 -0
  246. package/dist/mcp/probe.d.ts.map +1 -0
  247. package/dist/mcp/probe.js +116 -0
  248. package/dist/mcp/probe.js.map +1 -0
  249. package/dist/mcp/redact.d.ts +34 -0
  250. package/dist/mcp/redact.d.ts.map +1 -0
  251. package/dist/mcp/redact.js +84 -0
  252. package/dist/mcp/redact.js.map +1 -0
  253. package/dist/mcp/registry-store.d.ts +69 -0
  254. package/dist/mcp/registry-store.d.ts.map +1 -0
  255. package/dist/mcp/registry-store.js +82 -0
  256. package/dist/mcp/registry-store.js.map +1 -0
  257. package/dist/mcp/registry.d.ts +147 -0
  258. package/dist/mcp/registry.d.ts.map +1 -0
  259. package/dist/mcp/registry.js +509 -0
  260. package/dist/mcp/registry.js.map +1 -0
  261. package/dist/mcp/rest.d.ts +111 -0
  262. package/dist/mcp/rest.d.ts.map +1 -0
  263. package/dist/mcp/rest.js +606 -0
  264. package/dist/mcp/rest.js.map +1 -0
  265. package/dist/mcp/secrets.d.ts +66 -0
  266. package/dist/mcp/secrets.d.ts.map +1 -0
  267. package/dist/mcp/secrets.js +180 -0
  268. package/dist/mcp/secrets.js.map +1 -0
  269. package/dist/mcp/tool-list.d.ts +25 -0
  270. package/dist/mcp/tool-list.d.ts.map +1 -0
  271. package/dist/mcp/tool-list.js +62 -0
  272. package/dist/mcp/tool-list.js.map +1 -0
  273. package/dist/mcp/upstream-error.d.ts +12 -0
  274. package/dist/mcp/upstream-error.d.ts.map +1 -0
  275. package/dist/mcp/upstream-error.js +14 -0
  276. package/dist/mcp/upstream-error.js.map +1 -0
  277. package/dist/mcp/usage.d.ts +31 -0
  278. package/dist/mcp/usage.d.ts.map +1 -0
  279. package/dist/mcp/usage.js +159 -0
  280. package/dist/mcp/usage.js.map +1 -0
  281. package/dist/presets/routes.d.ts +53 -0
  282. package/dist/presets/routes.d.ts.map +1 -0
  283. package/dist/presets/routes.js +115 -0
  284. package/dist/presets/routes.js.map +1 -0
  285. package/dist/projects/activity.d.ts +6 -18
  286. package/dist/projects/activity.d.ts.map +1 -1
  287. package/dist/projects/activity.js +17 -60
  288. package/dist/projects/activity.js.map +1 -1
  289. package/dist/projects/events.d.ts +6 -5
  290. package/dist/projects/events.d.ts.map +1 -1
  291. package/dist/projects/events.js +33 -58
  292. package/dist/projects/events.js.map +1 -1
  293. package/dist/projects/routes.d.ts.map +1 -1
  294. package/dist/projects/routes.js +19 -0
  295. package/dist/projects/routes.js.map +1 -1
  296. package/dist/projects/state-home-preflight.d.ts.map +1 -1
  297. package/dist/projects/state-home-preflight.js +7 -0
  298. package/dist/projects/state-home-preflight.js.map +1 -1
  299. package/dist/projects/state-home-registry.d.ts.map +1 -1
  300. package/dist/projects/state-home-registry.js +9 -1
  301. package/dist/projects/state-home-registry.js.map +1 -1
  302. package/dist/qe/acceptance.d.ts +28 -28
  303. package/dist/qe/acceptance.d.ts.map +1 -1
  304. package/dist/qe/acceptance.js +60 -61
  305. package/dist/qe/acceptance.js.map +1 -1
  306. package/dist/qe/test-sets.d.ts +3 -5
  307. package/dist/qe/test-sets.d.ts.map +1 -1
  308. package/dist/qe/test-sets.js +5 -7
  309. package/dist/qe/test-sets.js.map +1 -1
  310. package/dist/skills/installed.d.ts +51 -0
  311. package/dist/skills/installed.d.ts.map +1 -0
  312. package/dist/skills/installed.js +46 -0
  313. package/dist/skills/installed.js.map +1 -0
  314. package/dist/standing-orders/evaluator.d.ts +113 -0
  315. package/dist/standing-orders/evaluator.d.ts.map +1 -0
  316. package/dist/standing-orders/evaluator.js +225 -0
  317. package/dist/standing-orders/evaluator.js.map +1 -0
  318. package/dist/standing-orders/history.d.ts +58 -0
  319. package/dist/standing-orders/history.d.ts.map +1 -0
  320. package/dist/standing-orders/history.js +117 -0
  321. package/dist/standing-orders/history.js.map +1 -0
  322. package/dist/standing-orders/parse.d.ts +19 -0
  323. package/dist/standing-orders/parse.d.ts.map +1 -0
  324. package/dist/standing-orders/parse.js +75 -0
  325. package/dist/standing-orders/parse.js.map +1 -0
  326. package/dist/standing-orders/routes.d.ts +180 -0
  327. package/dist/standing-orders/routes.d.ts.map +1 -0
  328. package/dist/standing-orders/routes.js +95 -0
  329. package/dist/standing-orders/routes.js.map +1 -0
  330. package/dist/standing-orders/store.d.ts +154 -0
  331. package/dist/standing-orders/store.d.ts.map +1 -0
  332. package/dist/standing-orders/store.js +189 -0
  333. package/dist/standing-orders/store.js.map +1 -0
  334. package/dist/studio/assets/index-CvV5qITf.css +32 -0
  335. package/dist/studio/assets/index-jCOy6Ns7.js +568 -0
  336. package/dist/studio/index.html +3 -3
  337. package/dist/studio/testid-inventory.json +3274 -894
  338. package/dist/team/key.d.ts +5 -0
  339. package/dist/team/key.d.ts.map +1 -0
  340. package/dist/team/key.js +21 -0
  341. package/dist/team/key.js.map +1 -0
  342. package/dist/team/routes.d.ts +196 -0
  343. package/dist/team/routes.d.ts.map +1 -0
  344. package/dist/team/routes.js +274 -0
  345. package/dist/team/routes.js.map +1 -0
  346. package/dist/team/ws-relay.d.ts +39 -0
  347. package/dist/team/ws-relay.d.ts.map +1 -0
  348. package/dist/team/ws-relay.js +63 -0
  349. package/dist/team/ws-relay.js.map +1 -0
  350. package/endpoint-manifest.json +502 -6
  351. package/package.json +6 -6
  352. package/dist/interactive/demo-events.d.ts +0 -367
  353. package/dist/interactive/demo-events.d.ts.map +0 -1
  354. package/dist/interactive/demo-events.js +0 -1293
  355. package/dist/interactive/demo-events.js.map +0 -1
  356. package/dist/qe/gate-events.d.ts +0 -113
  357. package/dist/qe/gate-events.d.ts.map +0 -1
  358. package/dist/qe/gate-events.js +0 -172
  359. package/dist/qe/gate-events.js.map +0 -1
  360. package/dist/studio/assets/index-Bg7Z3BR-.css +0 -32
  361. package/dist/studio/assets/index-BvOFMjf9.js +0 -554
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Standing orders (Studio OS behaviour 10) — the routes.
3
+ *
4
+ * GET /standing-orders the away flag, the orders, the queued outbox
5
+ * PUT /standing-orders/away `{ away }` — turning it on re-sweeps the open gates
6
+ * POST /standing-orders/parse `{ text }` → `{ rule, seat }`: ONE seat reads the words (a
7
+ * one-turn chat, closed after); the studio shows the rule back
8
+ * POST /standing-orders `{ text, rule }` — the CONFIRMED rule; the invariant refuses
9
+ * an approve of the deliver gate, a plan approval or a finding
10
+ * DELETE /standing-orders/:id retire an order
11
+ */
12
+ import type { FastifyInstance } from 'fastify';
13
+ import { z } from 'zod';
14
+ import type { StandingOrderEvaluator } from './evaluator.js';
15
+ import { type StandingOrderRule, type StandingOrderStore } from './store.js';
16
+ export declare const CreateStandingOrderSchema: z.ZodObject<{
17
+ text: z.ZodString;
18
+ rule: z.ZodObject<{
19
+ scope: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
20
+ kind: z.ZodLiteral<"all">;
21
+ }, "strict", z.ZodTypeAny, {
22
+ kind: "all";
23
+ }, {
24
+ kind: "all";
25
+ }>, z.ZodObject<{
26
+ kind: z.ZodLiteral<"project">;
27
+ projectId: z.ZodString;
28
+ }, "strict", z.ZodTypeAny, {
29
+ kind: "project";
30
+ projectId: string;
31
+ }, {
32
+ kind: "project";
33
+ projectId: string;
34
+ }>]>;
35
+ trigger: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
36
+ kind: z.ZodLiteral<"gate">;
37
+ phase: z.ZodString;
38
+ band: z.ZodOptional<z.ZodString>;
39
+ preset: z.ZodOptional<z.ZodString>;
40
+ }, "strict", z.ZodTypeAny, {
41
+ kind: "gate";
42
+ phase: string;
43
+ preset?: string | undefined;
44
+ band?: string | undefined;
45
+ }, {
46
+ kind: "gate";
47
+ phase: string;
48
+ preset?: string | undefined;
49
+ band?: string | undefined;
50
+ }>, z.ZodObject<{
51
+ kind: z.ZodLiteral<"finding">;
52
+ severity: z.ZodEnum<["high", "medium", "*"]>;
53
+ }, "strict", z.ZodTypeAny, {
54
+ kind: "finding";
55
+ severity: "*" | "high" | "medium";
56
+ }, {
57
+ kind: "finding";
58
+ severity: "*" | "high" | "medium";
59
+ }>]>;
60
+ action: z.ZodEnum<["approve", "hold", "notify"]>;
61
+ activeWhen: z.ZodEnum<["away", "always"]>;
62
+ }, "strict", z.ZodTypeAny, {
63
+ action: "hold" | "notify" | "approve";
64
+ scope: {
65
+ kind: "all";
66
+ } | {
67
+ kind: "project";
68
+ projectId: string;
69
+ };
70
+ trigger: {
71
+ kind: "gate";
72
+ phase: string;
73
+ preset?: string | undefined;
74
+ band?: string | undefined;
75
+ } | {
76
+ kind: "finding";
77
+ severity: "*" | "high" | "medium";
78
+ };
79
+ activeWhen: "away" | "always";
80
+ }, {
81
+ action: "hold" | "notify" | "approve";
82
+ scope: {
83
+ kind: "all";
84
+ } | {
85
+ kind: "project";
86
+ projectId: string;
87
+ };
88
+ trigger: {
89
+ kind: "gate";
90
+ phase: string;
91
+ preset?: string | undefined;
92
+ band?: string | undefined;
93
+ } | {
94
+ kind: "finding";
95
+ severity: "*" | "high" | "medium";
96
+ };
97
+ activeWhen: "away" | "always";
98
+ }>;
99
+ }, "strict", z.ZodTypeAny, {
100
+ text: string;
101
+ rule: {
102
+ action: "hold" | "notify" | "approve";
103
+ scope: {
104
+ kind: "all";
105
+ } | {
106
+ kind: "project";
107
+ projectId: string;
108
+ };
109
+ trigger: {
110
+ kind: "gate";
111
+ phase: string;
112
+ preset?: string | undefined;
113
+ band?: string | undefined;
114
+ } | {
115
+ kind: "finding";
116
+ severity: "*" | "high" | "medium";
117
+ };
118
+ activeWhen: "away" | "always";
119
+ };
120
+ }, {
121
+ text: string;
122
+ rule: {
123
+ action: "hold" | "notify" | "approve";
124
+ scope: {
125
+ kind: "all";
126
+ } | {
127
+ kind: "project";
128
+ projectId: string;
129
+ };
130
+ trigger: {
131
+ kind: "gate";
132
+ phase: string;
133
+ preset?: string | undefined;
134
+ band?: string | undefined;
135
+ } | {
136
+ kind: "finding";
137
+ severity: "*" | "high" | "medium";
138
+ };
139
+ activeWhen: "away" | "always";
140
+ };
141
+ }>;
142
+ export declare const ParseStandingOrderSchema: z.ZodObject<{
143
+ text: z.ZodString;
144
+ }, "strict", z.ZodTypeAny, {
145
+ text: string;
146
+ }, {
147
+ text: string;
148
+ }>;
149
+ export declare const StandingAwaySchema: z.ZodObject<{
150
+ away: z.ZodBoolean;
151
+ }, "strict", z.ZodTypeAny, {
152
+ away: boolean;
153
+ }, {
154
+ away: boolean;
155
+ }>;
156
+ /** The seat's parse: a rule it produced, or why it could not (its own answer, for the person). */
157
+ export type ParseOutcome = {
158
+ ok: true;
159
+ rule: StandingOrderRule;
160
+ seat: string;
161
+ } | {
162
+ ok: false;
163
+ code: 409 | 422 | 502;
164
+ error: string;
165
+ answer?: string;
166
+ };
167
+ export interface StandingOrderRouteDeps {
168
+ store: StandingOrderStore;
169
+ evaluator: StandingOrderEvaluator;
170
+ parse: (text: string) => Promise<ParseOutcome>;
171
+ }
172
+ /** The seat's instructions: the rule schema in words, the projects it may scope to, the words. */
173
+ export declare function parsePrompt(text: string, projects: Array<{
174
+ id: string;
175
+ name: string;
176
+ }>): string;
177
+ /** The first JSON object in a seat's answer that is a valid rule, or undefined. */
178
+ export declare function ruleFromAnswer(answer: string): StandingOrderRule | undefined;
179
+ export declare function registerStandingOrderRoutes(app: FastifyInstance, deps: StandingOrderRouteDeps): void;
180
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/standing-orders/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAoC,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAI/G,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE3B,CAAC;AACZ,eAAO,MAAM,wBAAwB;;;;;;EAAiE,CAAC;AACvG,eAAO,MAAM,kBAAkB;;;;;;EAA2C,CAAC;AAE3E,kGAAkG;AAClG,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAChD;AAED,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAY/F;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAU5E;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,sBAAsB,GAAG,IAAI,CA+DpG"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Standing orders (Studio OS behaviour 10) — the routes.
3
+ *
4
+ * GET /standing-orders the away flag, the orders, the queued outbox
5
+ * PUT /standing-orders/away `{ away }` — turning it on re-sweeps the open gates
6
+ * POST /standing-orders/parse `{ text }` → `{ rule, seat }`: ONE seat reads the words (a
7
+ * one-turn chat, closed after); the studio shows the rule back
8
+ * POST /standing-orders `{ text, rule }` — the CONFIRMED rule; the invariant refuses
9
+ * an approve of the deliver gate, a plan approval or a finding
10
+ * DELETE /standing-orders/:id retire an order
11
+ */
12
+ import { z } from 'zod';
13
+ import { API_PREFIX } from '../api/api-prefix.js';
14
+ import { LOCAL_ACTOR } from '../api/auth.js';
15
+ import { refusal, StandingOrderRuleSchema } from './store.js';
16
+ const V = API_PREFIX;
17
+ export const CreateStandingOrderSchema = z
18
+ .object({ text: z.string().trim().min(1).max(500), rule: StandingOrderRuleSchema })
19
+ .strict();
20
+ export const ParseStandingOrderSchema = z.object({ text: z.string().trim().min(1).max(500) }).strict();
21
+ export const StandingAwaySchema = z.object({ away: z.boolean() }).strict();
22
+ /** The seat's instructions: the rule schema in words, the projects it may scope to, the words. */
23
+ export function parsePrompt(text, projects) {
24
+ return [
25
+ 'Turn this standing order into ONE JSON object and answer with the JSON only, no prose.',
26
+ 'Shape: {"scope":{"kind":"all"} or {"kind":"project","projectId":"<id>"},',
27
+ ' "trigger":{"kind":"gate","phase":"<intake (the gate before a run starts), understand, design, build, test, review, deliver, or * for any gate>"}',
28
+ ' or {"kind":"finding","severity":"high"|"medium"|"*"},',
29
+ ' "action":"approve"|"hold"|"notify", "activeWhen":"away"|"always"}.',
30
+ '"wake me", "tell me", "ping me" = notify. "hold", "keep", "wait" = hold. "auto-approve", "clear" = approve.',
31
+ 'An order that says nothing about being away applies while away ("activeWhen":"away").',
32
+ `Projects (id: name): ${projects.map((p) => `${p.id}: ${p.name}`).join('; ') || 'none'}.`,
33
+ `Order: ${text}`,
34
+ ].join('\n');
35
+ }
36
+ /** The first JSON object in a seat's answer that is a valid rule, or undefined. */
37
+ export function ruleFromAnswer(answer) {
38
+ const start = answer.indexOf('{');
39
+ const end = answer.lastIndexOf('}');
40
+ if (start < 0 || end <= start)
41
+ return undefined;
42
+ try {
43
+ const parsed = StandingOrderRuleSchema.safeParse(JSON.parse(answer.slice(start, end + 1)));
44
+ return parsed.success ? parsed.data : undefined;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ export function registerStandingOrderRoutes(app, deps) {
51
+ const { store, evaluator } = deps;
52
+ const actorOf = (req) => req.actor ?? LOCAL_ACTOR;
53
+ const invalid = (error) => ({ error: 'Invalid request body', details: error.issues });
54
+ app.get(`${V}/standing-orders`, { config: { manifest: { responseType: 'StandingOrdersState', statusCodes: [200] } } }, async () => store.snapshot());
55
+ app.put(`${V}/standing-orders/away`, { config: { manifest: { requestType: 'StandingAwayBody', responseType: 'StandingOrdersState', statusCodes: [200, 400] } } }, async (req, reply) => {
56
+ const parsed = StandingAwaySchema.safeParse(req.body);
57
+ if (!parsed.success)
58
+ return reply.code(400).send(invalid(parsed.error));
59
+ if (store.setAway(parsed.data.away, actorOf(req)) && parsed.data.away)
60
+ await evaluator.sweep();
61
+ return store.snapshot();
62
+ });
63
+ app.post(`${V}/standing-orders/parse`, {
64
+ config: {
65
+ manifest: { requestType: 'ParseStandingOrderBody', responseType: 'ParsedStandingOrder', statusCodes: [200, 400, 409, 422, 502] },
66
+ },
67
+ }, async (req, reply) => {
68
+ const parsed = ParseStandingOrderSchema.safeParse(req.body);
69
+ if (!parsed.success)
70
+ return reply.code(400).send(invalid(parsed.error));
71
+ const out = await deps.parse(parsed.data.text);
72
+ if (!out.ok) {
73
+ return reply.code(out.code).send({ error: out.error, ...(out.answer !== undefined ? { answer: out.answer } : {}) });
74
+ }
75
+ const refused = refusal(out.rule);
76
+ return { rule: out.rule, seat: out.seat, ...(refused !== null ? { refused } : {}) };
77
+ });
78
+ app.post(`${V}/standing-orders`, { config: { manifest: { requestType: 'CreateStandingOrderBody', responseType: '{ order: StandingOrder }', statusCodes: [201, 400] } } }, async (req, reply) => {
79
+ const parsed = CreateStandingOrderSchema.safeParse(req.body);
80
+ if (!parsed.success)
81
+ return reply.code(400).send(invalid(parsed.error));
82
+ const refused = refusal(parsed.data.rule);
83
+ if (refused !== null)
84
+ return reply.code(400).send({ error: refused, code: 'order_refused' });
85
+ const order = store.add(parsed.data.text, parsed.data.rule, actorOf(req));
86
+ await evaluator.sweep();
87
+ return reply.code(201).send({ order });
88
+ });
89
+ app.delete(`${V}/standing-orders/:id`, { config: { manifest: { responseType: '{ removed: true }', statusCodes: [200, 404] } } }, async (req, reply) => {
90
+ if (!store.remove(req.params.id, actorOf(req)))
91
+ return reply.code(404).send({ error: 'Standing order not found' });
92
+ return { removed: true };
93
+ });
94
+ }
95
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/standing-orders/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAmD,MAAM,YAAY,CAAC;AAE/G,MAAM,CAAC,GAAG,UAAU,CAAC;AAErB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;KAClF,MAAM,EAAE,CAAC;AACZ,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACvG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAa3E,kGAAkG;AAClG,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAA6C;IACrF,OAAO;QACL,wFAAwF;QACxF,0EAA0E;QAC1E,mJAAmJ;QACnJ,yDAAyD;QACzD,qEAAqE;QACrE,6GAA6G;QAC7G,uFAAuF;QACvF,wBAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG;QACzF,UAAU,IAAI,EAAE;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAAoB,EAAE,IAA4B;IAC5F,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,OAAO,GAAG,CAAC,GAAsB,EAAS,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC;IAC5E,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAElG,GAAG,CAAC,GAAG,CACL,GAAG,CAAC,kBAAkB,EACtB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EACrF,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAC7B,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,GAAG,CAAC,uBAAuB,EAC3B,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAC3H,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/F,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,wBAAwB,EAC5B;QACE,MAAM,EAAE;YACN,QAAQ,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;SACjI;KACF,EACD,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACtF,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,kBAAkB,EACtB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,YAAY,EAAE,0BAA0B,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EACvI,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAC7F,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,MAAM,CACR,GAAG,CAAC,sBAAsB,EAC1B,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EACxF,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Standing orders (Studio OS behaviour 10) — the store.
3
+ *
4
+ * Plain-words rules for when the operator is busy or away, kept as STRUCTURED rules the operator
5
+ * confirmed (never a guess: the seat's parse is shown back and only the confirmed rule is stored).
6
+ *
7
+ * The durable record is the AUDIT TRAIL, like retry lineage and guidance (`GuidanceIndex`): every
8
+ * change is one entry — `standing-order.created {standingOrder, rule}`, `standing-order.retired`,
9
+ * `standing-order.away {away}`, `standing-order.notified {standingOrder, messageId, text}` (the
10
+ * queued outbox) — and this class is the in-memory fold of them, hydrated once at boot. No file of
11
+ * its own under the state home (a new top-level entry there is one core's worker fence refuses).
12
+ *
13
+ * THE INVARIANT lives here as a validation (`refusal`) and again in the evaluator: an order never
14
+ * approves the deliver gate and never approves a finding. It approves a plan approval only as a
15
+ * TRUST RECEIPT (brainstorm idea 13): one project, one preset, and the lowest band (`0-19`) — and
16
+ * the evaluator re-reads the open plan gate's own band and risk before it answers.
17
+ */
18
+ import { z } from 'zod';
19
+ import type { AuditLog } from '../api/audit.js';
20
+ import type { Actor } from '../core/types.js';
21
+ export declare const StandingOrderRuleSchema: z.ZodObject<{
22
+ scope: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
23
+ kind: z.ZodLiteral<"all">;
24
+ }, "strict", z.ZodTypeAny, {
25
+ kind: "all";
26
+ }, {
27
+ kind: "all";
28
+ }>, z.ZodObject<{
29
+ kind: z.ZodLiteral<"project">;
30
+ projectId: z.ZodString;
31
+ }, "strict", z.ZodTypeAny, {
32
+ kind: "project";
33
+ projectId: string;
34
+ }, {
35
+ kind: "project";
36
+ projectId: string;
37
+ }>]>;
38
+ trigger: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
39
+ kind: z.ZodLiteral<"gate">;
40
+ phase: z.ZodString;
41
+ band: z.ZodOptional<z.ZodString>;
42
+ preset: z.ZodOptional<z.ZodString>;
43
+ }, "strict", z.ZodTypeAny, {
44
+ kind: "gate";
45
+ phase: string;
46
+ preset?: string | undefined;
47
+ band?: string | undefined;
48
+ }, {
49
+ kind: "gate";
50
+ phase: string;
51
+ preset?: string | undefined;
52
+ band?: string | undefined;
53
+ }>, z.ZodObject<{
54
+ kind: z.ZodLiteral<"finding">;
55
+ severity: z.ZodEnum<["high", "medium", "*"]>;
56
+ }, "strict", z.ZodTypeAny, {
57
+ kind: "finding";
58
+ severity: "*" | "high" | "medium";
59
+ }, {
60
+ kind: "finding";
61
+ severity: "*" | "high" | "medium";
62
+ }>]>;
63
+ action: z.ZodEnum<["approve", "hold", "notify"]>;
64
+ activeWhen: z.ZodEnum<["away", "always"]>;
65
+ }, "strict", z.ZodTypeAny, {
66
+ action: "hold" | "notify" | "approve";
67
+ scope: {
68
+ kind: "all";
69
+ } | {
70
+ kind: "project";
71
+ projectId: string;
72
+ };
73
+ trigger: {
74
+ kind: "gate";
75
+ phase: string;
76
+ preset?: string | undefined;
77
+ band?: string | undefined;
78
+ } | {
79
+ kind: "finding";
80
+ severity: "*" | "high" | "medium";
81
+ };
82
+ activeWhen: "away" | "always";
83
+ }, {
84
+ action: "hold" | "notify" | "approve";
85
+ scope: {
86
+ kind: "all";
87
+ } | {
88
+ kind: "project";
89
+ projectId: string;
90
+ };
91
+ trigger: {
92
+ kind: "gate";
93
+ phase: string;
94
+ preset?: string | undefined;
95
+ band?: string | undefined;
96
+ } | {
97
+ kind: "finding";
98
+ severity: "*" | "high" | "medium";
99
+ };
100
+ activeWhen: "away" | "always";
101
+ }>;
102
+ export type StandingOrderRule = z.infer<typeof StandingOrderRuleSchema>;
103
+ export interface StandingOrder {
104
+ id: string;
105
+ /** The operator's own words. */
106
+ text: string;
107
+ rule: StandingOrderRule;
108
+ createdAt: number;
109
+ }
110
+ /** A message an order wants sent. Outbound is only ever QUEUED — no sender exists. */
111
+ export interface QueuedMessage {
112
+ id: string;
113
+ orderId: string;
114
+ orderText: string;
115
+ runId: string | null;
116
+ text: string;
117
+ at: number;
118
+ status: 'queued';
119
+ }
120
+ export interface StandingOrdersState {
121
+ away: boolean;
122
+ awaySince: number | null;
123
+ orders: StandingOrder[];
124
+ outbox: QueuedMessage[];
125
+ }
126
+ /** The phase name a plan-approval trust order triggers on. */
127
+ export declare const PLAN_APPROVAL_PHASE = "plan_approval";
128
+ /** The only band whose plan approval an order may answer: the lowest. */
129
+ export declare const TRUSTED_PLAN_BAND = "0-19";
130
+ /** Why a rule may not be stored, or null. The code invariant, stated once for creation. */
131
+ export declare function refusal(rule: StandingOrderRule): string | null;
132
+ /** The trail actions this store folds, oldest first. */
133
+ export declare const STANDING_ORDER_ACTIONS: readonly ["standing-order.created", "standing-order.retired", "standing-order.away", "standing-order.notified"];
134
+ export declare function orderActor(o: Pick<StandingOrder, 'id'>): Actor;
135
+ export declare class StandingOrderStore {
136
+ private readonly audit;
137
+ private state;
138
+ constructor(audit: Pick<AuditLog, 'record'>);
139
+ /** Fold the trail's standing-order entries (best-effort: an unreadable trail starts empty, said). */
140
+ hydrate(trail: Pick<AuditLog, 'readAll'>, log?: (msg: string) => void): Promise<void>;
141
+ private fold;
142
+ /** Record one change and fold it, so memory and the trail cannot disagree. */
143
+ private write;
144
+ snapshot(): StandingOrdersState;
145
+ get away(): boolean;
146
+ orders(): readonly StandingOrder[];
147
+ /** Returns whether the flag changed. */
148
+ setAway(away: boolean, actor: Actor): boolean;
149
+ add(text: string, rule: StandingOrderRule, actor: Actor): StandingOrder;
150
+ remove(id: string, actor: Actor): boolean;
151
+ /** Queue a message an order wants sent — recorded as the order's `standing-order.notified`. */
152
+ queue(o: StandingOrder, runId: string, text: string): QueuedMessage;
153
+ }
154
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/standing-orders/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,kBAAkB,CAAC;AAE1D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwBzB,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAKD,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAkB9D;AAED,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,iHAKzB,CAAC;AAEX,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,KAAK,CAE9D;AAED,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,KAAK,CAAiF;gBAEjE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5D,qGAAqG;IAC/F,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3F,OAAO,CAAC,IAAI;IAoCZ,8EAA8E;IAC9E,OAAO,CAAC,KAAK;IAKb,QAAQ,IAAI,mBAAmB;IAI/B,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,MAAM,IAAI,SAAS,aAAa,EAAE;IAIlC,wCAAwC;IACxC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO;IAM7C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa;IAOvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO;IAOzC,+FAA+F;IAC/F,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa;CAYpE"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Standing orders (Studio OS behaviour 10) — the store.
3
+ *
4
+ * Plain-words rules for when the operator is busy or away, kept as STRUCTURED rules the operator
5
+ * confirmed (never a guess: the seat's parse is shown back and only the confirmed rule is stored).
6
+ *
7
+ * The durable record is the AUDIT TRAIL, like retry lineage and guidance (`GuidanceIndex`): every
8
+ * change is one entry — `standing-order.created {standingOrder, rule}`, `standing-order.retired`,
9
+ * `standing-order.away {away}`, `standing-order.notified {standingOrder, messageId, text}` (the
10
+ * queued outbox) — and this class is the in-memory fold of them, hydrated once at boot. No file of
11
+ * its own under the state home (a new top-level entry there is one core's worker fence refuses).
12
+ *
13
+ * THE INVARIANT lives here as a validation (`refusal`) and again in the evaluator: an order never
14
+ * approves the deliver gate and never approves a finding. It approves a plan approval only as a
15
+ * TRUST RECEIPT (brainstorm idea 13): one project, one preset, and the lowest band (`0-19`) — and
16
+ * the evaluator re-reads the open plan gate's own band and risk before it answers.
17
+ */
18
+ import { randomUUID } from 'node:crypto';
19
+ import { z } from 'zod';
20
+ export const StandingOrderRuleSchema = z
21
+ .object({
22
+ scope: z.discriminatedUnion('kind', [
23
+ z.object({ kind: z.literal('all') }).strict(),
24
+ z.object({ kind: z.literal('project'), projectId: z.string().min(1) }).strict(),
25
+ ]),
26
+ trigger: z.discriminatedUnion('kind', [
27
+ // `phase`: the phase the gate reviews (the reviewed unit's `phase_ref`), `intake` (the gate
28
+ // before the run's first unit), or `*` for any gate. `band` (optional): only a run whose
29
+ // accepted plan landed in that band (`"0-19"`, …); a run with no scored plan never matches.
30
+ // `preset` (optional): only a run launched from that preset (`team_plan.preset`).
31
+ z
32
+ .object({
33
+ kind: z.literal('gate'),
34
+ phase: z.string().min(1).max(64),
35
+ band: z.string().min(1).max(16).optional(),
36
+ preset: z.string().min(1).max(128).optional(),
37
+ })
38
+ .strict(),
39
+ z.object({ kind: z.literal('finding'), severity: z.enum(['high', 'medium', '*']) }).strict(),
40
+ ]),
41
+ action: z.enum(['approve', 'hold', 'notify']),
42
+ activeWhen: z.enum(['away', 'always']),
43
+ })
44
+ .strict();
45
+ /** Phases whose gate an order may never approve, by name. */
46
+ const NEVER_APPROVED_PHASES = new Set(['deliver']);
47
+ /** The phase name a plan-approval trust order triggers on. */
48
+ export const PLAN_APPROVAL_PHASE = 'plan_approval';
49
+ /** The only band whose plan approval an order may answer: the lowest. */
50
+ export const TRUSTED_PLAN_BAND = '0-19';
51
+ /** Why a rule may not be stored, or null. The code invariant, stated once for creation. */
52
+ export function refusal(rule) {
53
+ if (rule.action !== 'approve')
54
+ return null;
55
+ if (rule.trigger.kind === 'finding')
56
+ return 'an order cannot approve a finding — hold or notify on it';
57
+ if (NEVER_APPROVED_PHASES.has(rule.trigger.phase)) {
58
+ return `an order never answers the ${rule.trigger.phase} gate — it always waits for you`;
59
+ }
60
+ if (rule.trigger.phase === PLAN_APPROVAL_PHASE) {
61
+ if (rule.trigger.band !== TRUSTED_PLAN_BAND) {
62
+ return `an order answers the plan_approval gate only for band ${TRUSTED_PLAN_BAND} runs — every other plan waits for you`;
63
+ }
64
+ if (rule.trigger.preset === undefined) {
65
+ return 'an order answers the plan_approval gate only for runs of one preset — name the preset';
66
+ }
67
+ if (rule.scope.kind !== 'project') {
68
+ return 'an order answers the plan_approval gate only within one project — scope it to the project';
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ /** The trail actions this store folds, oldest first. */
74
+ export const STANDING_ORDER_ACTIONS = [
75
+ 'standing-order.created',
76
+ 'standing-order.retired',
77
+ 'standing-order.away',
78
+ 'standing-order.notified',
79
+ ];
80
+ export function orderActor(o) {
81
+ return { id: `standing-order:${o.id}`, kind: 'system', trust: 'operator' };
82
+ }
83
+ export class StandingOrderStore {
84
+ audit;
85
+ state = { away: false, awaySince: null, orders: [], outbox: [] };
86
+ constructor(audit) {
87
+ this.audit = audit;
88
+ }
89
+ /** Fold the trail's standing-order entries (best-effort: an unreadable trail starts empty, said). */
90
+ async hydrate(trail, log) {
91
+ try {
92
+ // One full-file scan; the trail answers newest first, so replay it reversed (append order).
93
+ const mine = new Set(STANDING_ORDER_ACTIONS);
94
+ const entries = (await trail.readAll()).filter((e) => mine.has(e.action));
95
+ for (const e of entries.reverse())
96
+ this.fold(e);
97
+ }
98
+ catch (err) {
99
+ log?.(`[standing-orders] hydrate failed — no orders until restart: ${err instanceof Error ? err.message : String(err)}`);
100
+ }
101
+ }
102
+ fold(e) {
103
+ const d = (e.detail ?? {});
104
+ const so = d['standingOrder'];
105
+ switch (e.action) {
106
+ case 'standing-order.created': {
107
+ const rule = StandingOrderRuleSchema.safeParse(d['rule']);
108
+ if (typeof so?.id !== 'string' || typeof so.text !== 'string' || !rule.success)
109
+ return;
110
+ this.state.orders.push({ id: so.id, text: so.text, rule: rule.data, createdAt: e.ts });
111
+ return;
112
+ }
113
+ case 'standing-order.retired':
114
+ if (typeof so?.id === 'string')
115
+ this.state.orders = this.state.orders.filter((o) => o.id !== so.id);
116
+ return;
117
+ case 'standing-order.away':
118
+ if (typeof d['away'] === 'boolean') {
119
+ this.state.away = d['away'];
120
+ this.state.awaySince = d['away'] ? e.ts : null;
121
+ }
122
+ return;
123
+ case 'standing-order.notified':
124
+ if (typeof so?.id !== 'string' || typeof d['messageId'] !== 'string' || typeof d['text'] !== 'string')
125
+ return;
126
+ this.state.outbox.push({
127
+ id: d['messageId'],
128
+ orderId: so.id,
129
+ orderText: typeof so.text === 'string' ? so.text : '',
130
+ runId: e.runId ?? null,
131
+ text: d['text'],
132
+ at: e.ts,
133
+ status: 'queued',
134
+ });
135
+ return;
136
+ default:
137
+ return;
138
+ }
139
+ }
140
+ /** Record one change and fold it, so memory and the trail cannot disagree. */
141
+ write(action, actor, fields) {
142
+ const ts = this.audit.record(action, actor, fields) || Date.now();
143
+ this.fold({ ts, action, actor, ...(fields.runId !== undefined ? { runId: fields.runId } : {}), detail: fields.detail });
144
+ }
145
+ snapshot() {
146
+ return structuredClone(this.state);
147
+ }
148
+ get away() {
149
+ return this.state.away;
150
+ }
151
+ orders() {
152
+ return this.state.orders;
153
+ }
154
+ /** Returns whether the flag changed. */
155
+ setAway(away, actor) {
156
+ if (this.state.away === away)
157
+ return false;
158
+ this.write('standing-order.away', actor, { detail: { away } });
159
+ return true;
160
+ }
161
+ add(text, rule, actor) {
162
+ // The full UUID: retiring an order removes every order with its id, so ids must never collide.
163
+ const id = randomUUID();
164
+ this.write('standing-order.created', actor, { detail: { standingOrder: { id, text }, rule } });
165
+ return this.state.orders.find((o) => o.id === id);
166
+ }
167
+ remove(id, actor) {
168
+ const o = this.state.orders.find((x) => x.id === id);
169
+ if (o === undefined)
170
+ return false;
171
+ this.write('standing-order.retired', actor, { detail: { standingOrder: { id, text: o.text } } });
172
+ return true;
173
+ }
174
+ /** Queue a message an order wants sent — recorded as the order's `standing-order.notified`. */
175
+ queue(o, runId, text) {
176
+ // Idempotent: the same order's same message about the same run is queued once, so a gate
177
+ // still open after a restart (the boot sweep sees it again) does not queue it twice.
178
+ const queued = this.state.outbox.find((m) => m.orderId === o.id && m.runId === runId && m.text === text);
179
+ if (queued !== undefined)
180
+ return queued;
181
+ const messageId = randomUUID();
182
+ this.write('standing-order.notified', orderActor(o), {
183
+ runId,
184
+ detail: { standingOrder: { id: o.id, text: o.text }, messageId, queued: true, text },
185
+ });
186
+ return this.state.outbox[this.state.outbox.length - 1];
187
+ }
188
+ }
189
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/standing-orders/store.ts"],"names":[],"mappings":"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"}