@zhin.js/agent 1.1.22 → 1.1.26

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 (1246) hide show
  1. package/README.md +54 -25
  2. package/lib/activity-feedback/adapter-integration.d.ts +1 -1
  3. package/lib/activity-feedback/adapter-integration.d.ts.map +1 -1
  4. package/lib/activity-feedback/index.d.ts +0 -1
  5. package/lib/activity-feedback/index.d.ts.map +1 -1
  6. package/lib/activity-feedback/index.js +0 -1
  7. package/lib/activity-feedback/index.js.map +1 -1
  8. package/lib/activity-feedback/subagent-prefix.d.ts +1 -1
  9. package/lib/activity-feedback/subagent-prefix.js +1 -1
  10. package/lib/ai-event-bus.d.ts +6 -10
  11. package/lib/ai-event-bus.d.ts.map +1 -1
  12. package/lib/ai-event-bus.js +0 -13
  13. package/lib/ai-event-bus.js.map +1 -1
  14. package/lib/ai-event-contract.d.ts +43 -0
  15. package/lib/ai-event-contract.d.ts.map +1 -0
  16. package/lib/ai-event-contract.js +2 -0
  17. package/lib/ai-event-contract.js.map +1 -0
  18. package/lib/ai-event-subscriber.d.ts +3 -5
  19. package/lib/ai-event-subscriber.d.ts.map +1 -1
  20. package/lib/ai-event-subscriber.js +0 -19
  21. package/lib/ai-event-subscriber.js.map +1 -1
  22. package/lib/ai-hook-runtime-bus.d.ts +3 -4
  23. package/lib/ai-hook-runtime-bus.d.ts.map +1 -1
  24. package/lib/ai-hook-runtime-bus.js +2 -3
  25. package/lib/ai-hook-runtime-bus.js.map +1 -1
  26. package/lib/assistant/deliver-schedule-to-adapter.d.ts +2 -4
  27. package/lib/assistant/deliver-schedule-to-adapter.d.ts.map +1 -1
  28. package/lib/assistant/deliver-schedule-to-adapter.js +1 -8
  29. package/lib/assistant/deliver-schedule-to-adapter.js.map +1 -1
  30. package/lib/assistant/domains/ha-home-backend.d.ts.map +1 -1
  31. package/lib/assistant/domains/ha-home-backend.js +1 -2
  32. package/lib/assistant/domains/ha-home-backend.js.map +1 -1
  33. package/lib/assistant/domains/ha-ws-transport.d.ts.map +1 -1
  34. package/lib/assistant/domains/ha-ws-transport.js +1 -2
  35. package/lib/assistant/domains/ha-ws-transport.js.map +1 -1
  36. package/lib/assistant/domains/home-state-watch.d.ts.map +1 -1
  37. package/lib/assistant/domains/home-state-watch.js +1 -2
  38. package/lib/assistant/domains/home-state-watch.js.map +1 -1
  39. package/lib/assistant/event-ingress.d.ts.map +1 -1
  40. package/lib/assistant/event-ingress.js +1 -2
  41. package/lib/assistant/event-ingress.js.map +1 -1
  42. package/lib/assistant/home-policy.d.ts +1 -1
  43. package/lib/assistant/home-policy.d.ts.map +1 -1
  44. package/lib/assistant/home-tools.d.ts.map +1 -1
  45. package/lib/assistant/home-tools.js.map +1 -1
  46. package/lib/assistant/index.d.ts +2 -2
  47. package/lib/assistant/index.d.ts.map +1 -1
  48. package/lib/assistant/index.js +2 -2
  49. package/lib/assistant/index.js.map +1 -1
  50. package/lib/assistant/job-engine.d.ts +3 -2
  51. package/lib/assistant/job-engine.d.ts.map +1 -1
  52. package/lib/assistant/job-engine.js +6 -4
  53. package/lib/assistant/job-engine.js.map +1 -1
  54. package/lib/assistant/job-scheduler.d.ts +2 -2
  55. package/lib/assistant/job-scheduler.d.ts.map +1 -1
  56. package/lib/assistant/job-scheduler.js +2 -11
  57. package/lib/assistant/job-scheduler.js.map +1 -1
  58. package/lib/assistant/job-worker.js +1 -1
  59. package/lib/assistant/job-worker.js.map +1 -1
  60. package/lib/assistant/notification-router.d.ts.map +1 -1
  61. package/lib/assistant/notification-router.js +2 -2
  62. package/lib/assistant/notification-router.js.map +1 -1
  63. package/lib/assistant/profile-loader.d.ts +0 -4
  64. package/lib/assistant/profile-loader.d.ts.map +1 -1
  65. package/lib/assistant/profile-loader.js +0 -4
  66. package/lib/assistant/profile-loader.js.map +1 -1
  67. package/lib/assistant/schedule-skills.d.ts.map +1 -1
  68. package/lib/assistant/schedule-skills.js +5 -7
  69. package/lib/assistant/schedule-skills.js.map +1 -1
  70. package/lib/authoring/bridge.d.ts +2 -16
  71. package/lib/authoring/bridge.d.ts.map +1 -1
  72. package/lib/authoring/bridge.js +1 -74
  73. package/lib/authoring/bridge.js.map +1 -1
  74. package/lib/authoring/disable-tool.d.ts +2 -2
  75. package/lib/authoring/disable-tool.d.ts.map +1 -1
  76. package/lib/authoring/disable-tool.js +2 -2
  77. package/lib/authoring/disable-tool.js.map +1 -1
  78. package/lib/authoring/index.d.ts +1 -11
  79. package/lib/authoring/index.d.ts.map +1 -1
  80. package/lib/authoring/index.js +1 -6
  81. package/lib/authoring/index.js.map +1 -1
  82. package/lib/authoring/types.d.ts +3 -116
  83. package/lib/authoring/types.d.ts.map +1 -1
  84. package/lib/authoring/types.js.map +1 -1
  85. package/lib/bootstrap.d.ts +3 -8
  86. package/lib/bootstrap.d.ts.map +1 -1
  87. package/lib/bootstrap.js +9 -29
  88. package/lib/bootstrap.js.map +1 -1
  89. package/lib/builtins/builtin-tool-service.d.ts +2 -1
  90. package/lib/builtins/builtin-tool-service.d.ts.map +1 -1
  91. package/lib/builtins/builtin-tool-service.js +16 -5
  92. package/lib/builtins/builtin-tool-service.js.map +1 -1
  93. package/lib/config/fix-ai-config.d.ts.map +1 -1
  94. package/lib/config/fix-ai-config.js +0 -57
  95. package/lib/config/fix-ai-config.js.map +1 -1
  96. package/lib/config/index.d.ts +2 -1
  97. package/lib/config/index.d.ts.map +1 -1
  98. package/lib/config/index.js +2 -1
  99. package/lib/config/index.js.map +1 -1
  100. package/lib/config/provider-instance.d.ts +3 -3
  101. package/lib/config/provider-instance.d.ts.map +1 -1
  102. package/lib/config/provider-instance.js.map +1 -1
  103. package/lib/config/resolve-five-agent-binding.d.ts +1 -1
  104. package/lib/config/resolve-five-agent-binding.d.ts.map +1 -1
  105. package/lib/config/validate-ai-config.d.ts +0 -1
  106. package/lib/config/validate-ai-config.d.ts.map +1 -1
  107. package/lib/config/validate-ai-config.js +0 -229
  108. package/lib/config/validate-ai-config.js.map +1 -1
  109. package/lib/config/zhin-agent-config.d.ts +1 -1
  110. package/lib/config/zhin-agent-config.d.ts.map +1 -1
  111. package/lib/config/zhin-agent-defaults.js +4 -4
  112. package/lib/config/zhin-agent-dependencies.d.ts +5 -5
  113. package/lib/config/zhin-agent-dependencies.d.ts.map +1 -1
  114. package/lib/context/agents-instruction.d.ts +0 -1
  115. package/lib/context/agents-instruction.d.ts.map +1 -1
  116. package/lib/context/agents-instruction.js +1 -14
  117. package/lib/context/agents-instruction.js.map +1 -1
  118. package/lib/context/context-system.d.ts.map +1 -1
  119. package/lib/context/context-system.js +2 -2
  120. package/lib/context/context-system.js.map +1 -1
  121. package/lib/context/index.d.ts +1 -1
  122. package/lib/context/index.d.ts.map +1 -1
  123. package/lib/context/index.js +1 -1
  124. package/lib/context/index.js.map +1 -1
  125. package/lib/context/turn-user-message.d.ts.map +1 -1
  126. package/lib/context/turn-user-message.js +1 -2
  127. package/lib/context/turn-user-message.js.map +1 -1
  128. package/lib/core/agent-core-run.d.ts.map +1 -1
  129. package/lib/core/agent-core-run.js +17 -16
  130. package/lib/core/agent-core-run.js.map +1 -1
  131. package/lib/core/agent-loop-standalone.d.ts +2 -1
  132. package/lib/core/agent-loop-standalone.d.ts.map +1 -1
  133. package/lib/core/agent-loop-standalone.js +19 -18
  134. package/lib/core/agent-loop-standalone.js.map +1 -1
  135. package/lib/core/tool-calls-user-format.d.ts.map +1 -1
  136. package/lib/core/tool-calls-user-format.js +2 -76
  137. package/lib/core/tool-calls-user-format.js.map +1 -1
  138. package/lib/create-agent-session.d.ts +1 -1
  139. package/lib/create-agent-session.d.ts.map +1 -1
  140. package/lib/create-agent-session.js +2 -2
  141. package/lib/create-agent-session.js.map +1 -1
  142. package/lib/data-governance/disclosure-authority.d.ts +38 -0
  143. package/lib/data-governance/disclosure-authority.d.ts.map +1 -0
  144. package/lib/data-governance/disclosure-authority.js +2 -0
  145. package/lib/data-governance/disclosure-authority.js.map +1 -0
  146. package/lib/data-governance/governance-authority-repository.d.ts +3 -0
  147. package/lib/data-governance/governance-authority-repository.d.ts.map +1 -1
  148. package/lib/data-governance/governance-authority-repository.js +10 -1
  149. package/lib/data-governance/governance-authority-repository.js.map +1 -1
  150. package/lib/deferred-worker-runner.d.ts +2 -1
  151. package/lib/deferred-worker-runner.d.ts.map +1 -1
  152. package/lib/deferred-worker-runner.js +6 -4
  153. package/lib/deferred-worker-runner.js.map +1 -1
  154. package/lib/discovery/agent-surface-info.d.ts +5 -9
  155. package/lib/discovery/agent-surface-info.d.ts.map +1 -1
  156. package/lib/discovery/agent-surface-info.js +81 -45
  157. package/lib/discovery/agent-surface-info.js.map +1 -1
  158. package/lib/discovery/agent-surface.d.ts +2 -22
  159. package/lib/discovery/agent-surface.d.ts.map +1 -1
  160. package/lib/discovery/agent-surface.js +72 -287
  161. package/lib/discovery/agent-surface.js.map +1 -1
  162. package/lib/discovery/agents.d.ts +10 -12
  163. package/lib/discovery/agents.d.ts.map +1 -1
  164. package/lib/discovery/agents.js +91 -90
  165. package/lib/discovery/agents.js.map +1 -1
  166. package/lib/discovery/utils.d.ts +2 -15
  167. package/lib/discovery/utils.d.ts.map +1 -1
  168. package/lib/discovery/utils.js +2 -76
  169. package/lib/discovery/utils.js.map +1 -1
  170. package/lib/event/agent-stream-hooks.d.ts +0 -2
  171. package/lib/event/agent-stream-hooks.d.ts.map +1 -1
  172. package/lib/event/agent-stream-hooks.js +0 -8
  173. package/lib/event/agent-stream-hooks.js.map +1 -1
  174. package/lib/event/ai-event-bus.d.ts +13 -0
  175. package/lib/event/ai-event-bus.d.ts.map +1 -0
  176. package/lib/event/ai-event-bus.js +45 -0
  177. package/lib/event/ai-event-bus.js.map +1 -0
  178. package/lib/event/event-emitter.d.ts +8 -14
  179. package/lib/event/event-emitter.d.ts.map +1 -1
  180. package/lib/event/event-emitter.js +7 -37
  181. package/lib/event/event-emitter.js.map +1 -1
  182. package/lib/index.d.ts +42 -74
  183. package/lib/index.d.ts.map +1 -1
  184. package/lib/index.js +29 -58
  185. package/lib/index.js.map +1 -1
  186. package/lib/init/activate-ai-database-storage.d.ts +1 -1
  187. package/lib/init/activate-ai-database-storage.d.ts.map +1 -1
  188. package/lib/init/activate-ai-database-storage.js +28 -32
  189. package/lib/init/activate-ai-database-storage.js.map +1 -1
  190. package/lib/init/compose-zhin-agent-runtime.d.ts +2 -0
  191. package/lib/init/compose-zhin-agent-runtime.d.ts.map +1 -1
  192. package/lib/init/compose-zhin-agent-runtime.js +1 -0
  193. package/lib/init/compose-zhin-agent-runtime.js.map +1 -1
  194. package/lib/init/configure-zhin-agent.d.ts +3 -4
  195. package/lib/init/configure-zhin-agent.d.ts.map +1 -1
  196. package/lib/init/configure-zhin-agent.js +9 -7
  197. package/lib/init/configure-zhin-agent.js.map +1 -1
  198. package/lib/init/define-ai-database-models.js +1 -1
  199. package/lib/init/dispose-zhin-agent.d.ts +1 -1
  200. package/lib/init/dispose-zhin-agent.d.ts.map +1 -1
  201. package/lib/init/dispose-zhin-agent.js +0 -1
  202. package/lib/init/dispose-zhin-agent.js.map +1 -1
  203. package/lib/init/runtime-management-commands.d.ts +1 -2
  204. package/lib/init/runtime-management-commands.d.ts.map +1 -1
  205. package/lib/init/runtime-management-commands.js.map +1 -1
  206. package/lib/internal/agent-host.d.ts +10 -5
  207. package/lib/internal/agent-host.d.ts.map +1 -1
  208. package/lib/internal/host-types.d.ts +5 -7
  209. package/lib/internal/host-types.d.ts.map +1 -1
  210. package/lib/mcp-client/bridge.d.ts +1 -2
  211. package/lib/mcp-client/bridge.d.ts.map +1 -1
  212. package/lib/mcp-client/bridge.js +1 -2
  213. package/lib/mcp-client/bridge.js.map +1 -1
  214. package/lib/media/media-publisher.d.ts +1 -1
  215. package/lib/media/media-publisher.d.ts.map +1 -1
  216. package/lib/media/media-router.d.ts +4 -7
  217. package/lib/media/media-router.d.ts.map +1 -1
  218. package/lib/media/media-router.js +10 -26
  219. package/lib/media/media-router.js.map +1 -1
  220. package/lib/media/media-types.d.ts +4 -0
  221. package/lib/media/media-types.d.ts.map +1 -1
  222. package/lib/media/media-types.js.map +1 -1
  223. package/lib/media/resolve-config.d.ts +0 -1
  224. package/lib/media/resolve-config.d.ts.map +1 -1
  225. package/lib/media/resolve-config.js +0 -3
  226. package/lib/media/resolve-config.js.map +1 -1
  227. package/lib/media/subagent-inbound.d.ts +3 -2
  228. package/lib/media/subagent-inbound.d.ts.map +1 -1
  229. package/lib/media/subagent-inbound.js +5 -8
  230. package/lib/media/subagent-inbound.js.map +1 -1
  231. package/lib/memory/ai-compaction-strategy.d.ts +3 -2
  232. package/lib/memory/ai-compaction-strategy.d.ts.map +1 -1
  233. package/lib/memory/ai-compaction-strategy.js +4 -1
  234. package/lib/memory/ai-compaction-strategy.js.map +1 -1
  235. package/lib/memory/compaction-runtime.d.ts +23 -14
  236. package/lib/memory/compaction-runtime.d.ts.map +1 -1
  237. package/lib/memory/compaction-runtime.js +92 -76
  238. package/lib/memory/compaction-runtime.js.map +1 -1
  239. package/lib/memory/context-repository-store.js +1 -1
  240. package/lib/memory/context-repository-store.js.map +1 -1
  241. package/lib/memory/index.d.ts +2 -2
  242. package/lib/memory/index.d.ts.map +1 -1
  243. package/lib/memory/index.js +1 -1
  244. package/lib/memory/index.js.map +1 -1
  245. package/lib/memory/memory-system.d.ts.map +1 -1
  246. package/lib/memory/memory-system.js +5 -6
  247. package/lib/memory/memory-system.js.map +1 -1
  248. package/lib/memory-layers.d.ts +2 -6
  249. package/lib/memory-layers.d.ts.map +1 -1
  250. package/lib/memory-layers.js +23 -75
  251. package/lib/memory-layers.js.map +1 -1
  252. package/lib/orchestration/five-agent/index.d.ts.map +1 -0
  253. package/lib/orchestration/five-agent/index.js.map +1 -0
  254. package/lib/orchestration/five-agent/prompts.d.ts.map +1 -0
  255. package/lib/orchestration/five-agent/prompts.js.map +1 -0
  256. package/lib/orchestration/five-agent/role-capability-policy.d.ts.map +1 -0
  257. package/lib/orchestration/five-agent/role-capability-policy.js.map +1 -0
  258. package/lib/orchestration/five-agent/roles.d.ts.map +1 -0
  259. package/lib/orchestration/five-agent/roles.js.map +1 -0
  260. package/lib/plugin-ai-hook-bus.d.ts +3 -7
  261. package/lib/plugin-ai-hook-bus.d.ts.map +1 -1
  262. package/lib/plugin-ai-hook-bus.js +1 -7
  263. package/lib/plugin-ai-hook-bus.js.map +1 -1
  264. package/lib/plugin-runtime/agent-event-bus.d.ts +4 -0
  265. package/lib/plugin-runtime/agent-event-bus.d.ts.map +1 -0
  266. package/lib/plugin-runtime/agent-event-bus.js +4 -0
  267. package/lib/plugin-runtime/agent-event-bus.js.map +1 -0
  268. package/lib/plugin-runtime/agent-host-port.d.ts +0 -6
  269. package/lib/plugin-runtime/agent-host-port.d.ts.map +1 -1
  270. package/lib/plugin-runtime/agent-host-port.js.map +1 -1
  271. package/lib/plugin-runtime/agent-runtime.d.ts +1 -1
  272. package/lib/plugin-runtime/agent-runtime.d.ts.map +1 -1
  273. package/lib/plugin-runtime/agent-runtime.js +9 -4
  274. package/lib/plugin-runtime/agent-runtime.js.map +1 -1
  275. package/lib/plugin-runtime/capability-ingress.d.ts +1 -1
  276. package/lib/plugin-runtime/capability-ingress.d.ts.map +1 -1
  277. package/lib/plugin-runtime/capability-ingress.js +118 -12
  278. package/lib/plugin-runtime/capability-ingress.js.map +1 -1
  279. package/lib/plugin-runtime/capability-tools.d.ts.map +1 -1
  280. package/lib/plugin-runtime/capability-tools.js +5 -3
  281. package/lib/plugin-runtime/capability-tools.js.map +1 -1
  282. package/lib/plugin-runtime/deferred-capability-plan.d.ts.map +1 -1
  283. package/lib/plugin-runtime/deferred-capability-plan.js +50 -21
  284. package/lib/plugin-runtime/deferred-capability-plan.js.map +1 -1
  285. package/lib/plugin-runtime/file-edit-quote-utils.d.ts.map +1 -0
  286. package/lib/plugin-runtime/file-edit-quote-utils.js.map +1 -0
  287. package/lib/plugin-runtime/full-agent-turn-engine.d.ts.map +1 -1
  288. package/lib/plugin-runtime/full-agent-turn-engine.js +10 -10
  289. package/lib/plugin-runtime/full-agent-turn-engine.js.map +1 -1
  290. package/lib/plugin-runtime/github-actions-delivery-provider.d.ts +44 -0
  291. package/lib/plugin-runtime/github-actions-delivery-provider.d.ts.map +1 -0
  292. package/lib/plugin-runtime/github-actions-delivery-provider.js +246 -0
  293. package/lib/plugin-runtime/github-actions-delivery-provider.js.map +1 -0
  294. package/lib/plugin-runtime/github-exact-merge-gateway.d.ts +62 -0
  295. package/lib/plugin-runtime/github-exact-merge-gateway.d.ts.map +1 -0
  296. package/lib/plugin-runtime/github-exact-merge-gateway.js +79 -0
  297. package/lib/plugin-runtime/github-exact-merge-gateway.js.map +1 -0
  298. package/lib/plugin-runtime/github-workroom-capability.d.ts +15 -0
  299. package/lib/plugin-runtime/github-workroom-capability.d.ts.map +1 -0
  300. package/lib/plugin-runtime/github-workroom-capability.js +79 -0
  301. package/lib/plugin-runtime/github-workroom-capability.js.map +1 -0
  302. package/lib/plugin-runtime/host-tool-projection.d.ts +1 -1
  303. package/lib/plugin-runtime/host-tool-projection.d.ts.map +1 -1
  304. package/lib/plugin-runtime/host-tool-projection.js +5 -3
  305. package/lib/plugin-runtime/host-tool-projection.js.map +1 -1
  306. package/lib/plugin-runtime/index.d.ts +29 -1
  307. package/lib/plugin-runtime/index.d.ts.map +1 -1
  308. package/lib/plugin-runtime/index.js +26 -1
  309. package/lib/plugin-runtime/index.js.map +1 -1
  310. package/lib/plugin-runtime/native-bash-tool.d.ts +35 -0
  311. package/lib/plugin-runtime/native-bash-tool.d.ts.map +1 -0
  312. package/lib/plugin-runtime/native-bash-tool.js +110 -0
  313. package/lib/plugin-runtime/native-bash-tool.js.map +1 -0
  314. package/lib/plugin-runtime/native-file-tools.d.ts.map +1 -1
  315. package/lib/plugin-runtime/native-file-tools.js +10 -9
  316. package/lib/plugin-runtime/native-file-tools.js.map +1 -1
  317. package/lib/plugin-runtime/native-image-tool.d.ts +12 -0
  318. package/lib/plugin-runtime/native-image-tool.d.ts.map +1 -0
  319. package/lib/plugin-runtime/native-image-tool.js +73 -0
  320. package/lib/plugin-runtime/native-image-tool.js.map +1 -0
  321. package/lib/plugin-runtime/native-interaction-tools.js +1 -1
  322. package/lib/plugin-runtime/native-interaction-tools.js.map +1 -1
  323. package/lib/plugin-runtime/native-knowledge-tool.d.ts +34 -0
  324. package/lib/plugin-runtime/native-knowledge-tool.d.ts.map +1 -0
  325. package/lib/plugin-runtime/native-knowledge-tool.js +170 -0
  326. package/lib/plugin-runtime/native-knowledge-tool.js.map +1 -0
  327. package/lib/plugin-runtime/native-semantic-memory-tools.js +2 -2
  328. package/lib/plugin-runtime/native-semantic-memory-tools.js.map +1 -1
  329. package/lib/plugin-runtime/native-todo-tools.js +2 -2
  330. package/lib/plugin-runtime/native-todo-tools.js.map +1 -1
  331. package/lib/plugin-runtime/native-tool-suite.d.ts +15 -0
  332. package/lib/plugin-runtime/native-tool-suite.d.ts.map +1 -0
  333. package/lib/plugin-runtime/native-tool-suite.js +18 -0
  334. package/lib/plugin-runtime/native-tool-suite.js.map +1 -0
  335. package/lib/plugin-runtime/native-web-tools.d.ts.map +1 -1
  336. package/lib/plugin-runtime/native-web-tools.js +6 -19
  337. package/lib/plugin-runtime/native-web-tools.js.map +1 -1
  338. package/lib/plugin-runtime/schedule-capability-plan.js +6 -1
  339. package/lib/plugin-runtime/schedule-capability-plan.js.map +1 -1
  340. package/lib/plugin-runtime/self-delivery-project-composition.d.ts +25 -0
  341. package/lib/plugin-runtime/self-delivery-project-composition.d.ts.map +1 -0
  342. package/lib/plugin-runtime/self-delivery-project-composition.js +85 -0
  343. package/lib/plugin-runtime/self-delivery-project-composition.js.map +1 -0
  344. package/lib/plugin-runtime/self-delivery-project.d.ts +65 -0
  345. package/lib/plugin-runtime/self-delivery-project.d.ts.map +1 -0
  346. package/lib/plugin-runtime/self-delivery-project.js +140 -0
  347. package/lib/plugin-runtime/self-delivery-project.js.map +1 -0
  348. package/lib/plugin-runtime/workroom-acceptance-internal-providers.d.ts.map +1 -1
  349. package/lib/plugin-runtime/workroom-acceptance-internal-providers.js +7 -2
  350. package/lib/plugin-runtime/workroom-acceptance-internal-providers.js.map +1 -1
  351. package/lib/plugin-runtime/workroom-acceptance-production-composition.d.ts +2 -0
  352. package/lib/plugin-runtime/workroom-acceptance-production-composition.d.ts.map +1 -1
  353. package/lib/plugin-runtime/workroom-acceptance-production-composition.js +1 -0
  354. package/lib/plugin-runtime/workroom-acceptance-production-composition.js.map +1 -1
  355. package/lib/plugin-runtime/workroom-acceptance-provider-composition.d.ts +3 -0
  356. package/lib/plugin-runtime/workroom-acceptance-provider-composition.d.ts.map +1 -1
  357. package/lib/plugin-runtime/workroom-acceptance-provider-composition.js +43 -6
  358. package/lib/plugin-runtime/workroom-acceptance-provider-composition.js.map +1 -1
  359. package/lib/plugin-runtime/workroom-accepted-source-runtime.d.ts +1 -1
  360. package/lib/plugin-runtime/workroom-accepted-source-runtime.d.ts.map +1 -1
  361. package/lib/plugin-runtime/workroom-assignment-authority-provider.d.ts +3 -77
  362. package/lib/plugin-runtime/workroom-assignment-authority-provider.d.ts.map +1 -1
  363. package/lib/plugin-runtime/workroom-assignment-authority-provider.js +12 -112
  364. package/lib/plugin-runtime/workroom-assignment-authority-provider.js.map +1 -1
  365. package/lib/plugin-runtime/workroom-assignment-knowledge-composition.d.ts +1 -1
  366. package/lib/plugin-runtime/workroom-assignment-knowledge-composition.d.ts.map +1 -1
  367. package/lib/plugin-runtime/workroom-data-governance-authority-writer.d.ts +2 -0
  368. package/lib/plugin-runtime/workroom-data-governance-authority-writer.d.ts.map +1 -1
  369. package/lib/plugin-runtime/workroom-data-governance-authority-writer.js +24 -0
  370. package/lib/plugin-runtime/workroom-data-governance-authority-writer.js.map +1 -1
  371. package/lib/plugin-runtime/workroom-data-governance-bootstrap.d.ts.map +1 -1
  372. package/lib/plugin-runtime/workroom-data-governance-bootstrap.js +19 -0
  373. package/lib/plugin-runtime/workroom-data-governance-bootstrap.js.map +1 -1
  374. package/lib/plugin-runtime/workroom-data-governance-runtime.d.ts +4 -38
  375. package/lib/plugin-runtime/workroom-data-governance-runtime.d.ts.map +1 -1
  376. package/lib/plugin-runtime/workroom-data-governance-runtime.js +145 -42
  377. package/lib/plugin-runtime/workroom-data-governance-runtime.js.map +1 -1
  378. package/lib/plugin-runtime/workroom-data-governance-storage.d.ts.map +1 -1
  379. package/lib/plugin-runtime/workroom-data-governance-storage.js +1 -2
  380. package/lib/plugin-runtime/workroom-data-governance-storage.js.map +1 -1
  381. package/lib/plugin-runtime/workroom-delivery-gateway.d.ts +96 -0
  382. package/lib/plugin-runtime/workroom-delivery-gateway.d.ts.map +1 -0
  383. package/lib/plugin-runtime/workroom-delivery-gateway.js +129 -0
  384. package/lib/plugin-runtime/workroom-delivery-gateway.js.map +1 -0
  385. package/lib/plugin-runtime/workroom-dynamic-planning-provider.d.ts.map +1 -1
  386. package/lib/plugin-runtime/workroom-dynamic-planning-provider.js +2 -1
  387. package/lib/plugin-runtime/workroom-dynamic-planning-provider.js.map +1 -1
  388. package/lib/plugin-runtime/workroom-effect-composition.d.ts.map +1 -1
  389. package/lib/plugin-runtime/workroom-effect-composition.js +12 -1
  390. package/lib/plugin-runtime/workroom-effect-composition.js.map +1 -1
  391. package/lib/plugin-runtime/workroom-effect-production.d.ts +5 -0
  392. package/lib/plugin-runtime/workroom-effect-production.d.ts.map +1 -1
  393. package/lib/plugin-runtime/workroom-effect-production.js +22 -3
  394. package/lib/plugin-runtime/workroom-effect-production.js.map +1 -1
  395. package/lib/plugin-runtime/workroom-effect-runtime.d.ts +1 -17
  396. package/lib/plugin-runtime/workroom-effect-runtime.d.ts.map +1 -1
  397. package/lib/plugin-runtime/workroom-effect-runtime.js +77 -17
  398. package/lib/plugin-runtime/workroom-effect-runtime.js.map +1 -1
  399. package/lib/plugin-runtime/workroom-governed-dispatch-composition.d.ts +8 -3
  400. package/lib/plugin-runtime/workroom-governed-dispatch-composition.d.ts.map +1 -1
  401. package/lib/plugin-runtime/workroom-governed-dispatch-composition.js +21 -18
  402. package/lib/plugin-runtime/workroom-governed-dispatch-composition.js.map +1 -1
  403. package/lib/plugin-runtime/workroom-journal-payload-composition.d.ts +1 -1
  404. package/lib/plugin-runtime/workroom-journal-payload-composition.d.ts.map +1 -1
  405. package/lib/plugin-runtime/workroom-journal-payload-composition.js +1 -1
  406. package/lib/plugin-runtime/workroom-journal-payload-composition.js.map +1 -1
  407. package/lib/plugin-runtime/workroom-local-agent-core-adapter.js +3 -3
  408. package/lib/plugin-runtime/workroom-local-agent-core-adapter.js.map +1 -1
  409. package/lib/plugin-runtime/workroom-local-agent-loop.d.ts +2 -1
  410. package/lib/plugin-runtime/workroom-local-agent-loop.d.ts.map +1 -1
  411. package/lib/plugin-runtime/workroom-local-agent-loop.js +11 -1
  412. package/lib/plugin-runtime/workroom-local-agent-loop.js.map +1 -1
  413. package/lib/{workroom/local-assignment-executor.d.ts → plugin-runtime/workroom-local-assignment-executor.d.ts} +4 -4
  414. package/lib/plugin-runtime/workroom-local-assignment-executor.d.ts.map +1 -0
  415. package/lib/{workroom/local-assignment-executor.js → plugin-runtime/workroom-local-assignment-executor.js} +3 -3
  416. package/lib/plugin-runtime/workroom-local-assignment-executor.js.map +1 -0
  417. package/lib/plugin-runtime/workroom-local-assignment-runtime.d.ts +1 -0
  418. package/lib/plugin-runtime/workroom-local-assignment-runtime.d.ts.map +1 -1
  419. package/lib/plugin-runtime/workroom-local-assignment-runtime.js +72 -26
  420. package/lib/plugin-runtime/workroom-local-assignment-runtime.js.map +1 -1
  421. package/lib/plugin-runtime/workroom-portfolio-checkpoint-ack.d.ts +1 -1
  422. package/lib/plugin-runtime/workroom-portfolio-checkpoint-ack.d.ts.map +1 -1
  423. package/lib/plugin-runtime/workroom-portfolio-control-composition.d.ts.map +1 -1
  424. package/lib/plugin-runtime/workroom-portfolio-control-composition.js +1 -0
  425. package/lib/plugin-runtime/workroom-portfolio-control-composition.js.map +1 -1
  426. package/lib/plugin-runtime/workroom-portfolio-control-runtime.d.ts +1 -0
  427. package/lib/plugin-runtime/workroom-portfolio-control-runtime.d.ts.map +1 -1
  428. package/lib/plugin-runtime/workroom-portfolio-control-runtime.js +1 -0
  429. package/lib/plugin-runtime/workroom-portfolio-control-runtime.js.map +1 -1
  430. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.d.ts +1 -1
  431. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.d.ts.map +1 -1
  432. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.js +6 -3
  433. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.js.map +1 -1
  434. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.d.ts +1 -1
  435. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.d.ts.map +1 -1
  436. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.js +11 -5
  437. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.js.map +1 -1
  438. package/lib/plugin-runtime/workroom-preemption-runtime.d.ts +1 -1
  439. package/lib/plugin-runtime/workroom-preemption-runtime.d.ts.map +1 -1
  440. package/lib/plugin-runtime/workroom-priority-authority.d.ts +11 -3
  441. package/lib/plugin-runtime/workroom-priority-authority.d.ts.map +1 -1
  442. package/lib/plugin-runtime/workroom-priority-authority.js +51 -47
  443. package/lib/plugin-runtime/workroom-priority-authority.js.map +1 -1
  444. package/lib/plugin-runtime/workroom-profile-authority-composition.d.ts.map +1 -1
  445. package/lib/plugin-runtime/workroom-profile-authority-composition.js +2 -1
  446. package/lib/plugin-runtime/workroom-profile-authority-composition.js.map +1 -1
  447. package/lib/plugin-runtime/workroom-profile-authority-runtime.d.ts +1 -0
  448. package/lib/plugin-runtime/workroom-profile-authority-runtime.d.ts.map +1 -1
  449. package/lib/plugin-runtime/workroom-profile-authority-runtime.js +1 -0
  450. package/lib/plugin-runtime/workroom-profile-authority-runtime.js.map +1 -1
  451. package/lib/plugin-runtime/workroom-projection-outbound.d.ts +1 -1
  452. package/lib/plugin-runtime/workroom-projection-outbound.d.ts.map +1 -1
  453. package/lib/plugin-runtime/workroom-projection-runtime.d.ts +6 -4
  454. package/lib/plugin-runtime/workroom-projection-runtime.d.ts.map +1 -1
  455. package/lib/plugin-runtime/workroom-projection-runtime.js +11 -1
  456. package/lib/plugin-runtime/workroom-projection-runtime.js.map +1 -1
  457. package/lib/plugin-runtime/workroom-remote-callback-runtime.d.ts +2 -2
  458. package/lib/plugin-runtime/workroom-remote-callback-runtime.d.ts.map +1 -1
  459. package/lib/plugin-runtime/workroom-remote-executor.d.ts +1 -12
  460. package/lib/plugin-runtime/workroom-remote-executor.d.ts.map +1 -1
  461. package/lib/plugin-runtime/workroom-remote-executor.js +1 -20
  462. package/lib/plugin-runtime/workroom-remote-executor.js.map +1 -1
  463. package/lib/plugin-runtime/workroom-run-profile-pin-authority.d.ts +1 -1
  464. package/lib/plugin-runtime/workroom-run-profile-pin-authority.d.ts.map +1 -1
  465. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.d.ts +8 -1
  466. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.d.ts.map +1 -1
  467. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.js +4 -0
  468. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.js.map +1 -1
  469. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.d.ts +4 -1
  470. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.d.ts.map +1 -1
  471. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.js +23 -6
  472. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.js.map +1 -1
  473. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.d.ts +5 -0
  474. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.d.ts.map +1 -1
  475. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.js +20 -1
  476. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.js.map +1 -1
  477. package/lib/plugin-runtime/workroom-scheduler-runtime.d.ts +1 -1
  478. package/lib/plugin-runtime/workroom-scheduler-runtime.d.ts.map +1 -1
  479. package/lib/plugin-runtime/workroom-scheduler-runtime.js +6 -1
  480. package/lib/plugin-runtime/workroom-scheduler-runtime.js.map +1 -1
  481. package/lib/prompt/assembly.d.ts.map +1 -1
  482. package/lib/prompt/assembly.js +1 -2
  483. package/lib/prompt/assembly.js.map +1 -1
  484. package/lib/prompt/git-context.d.ts +0 -2
  485. package/lib/prompt/git-context.d.ts.map +1 -1
  486. package/lib/prompt/git-context.js +1 -12
  487. package/lib/prompt/git-context.js.map +1 -1
  488. package/lib/prompt/index.d.ts +1 -1
  489. package/lib/prompt/index.d.ts.map +1 -1
  490. package/lib/prompt/index.js +1 -1
  491. package/lib/prompt/index.js.map +1 -1
  492. package/lib/prompt/prompt-assembly-registry.d.ts +1 -1
  493. package/lib/prompt/prompt-assembly-registry.d.ts.map +1 -1
  494. package/lib/prompt/prompt-assembly-registry.js.map +1 -1
  495. package/lib/prompt/system-prompt.d.ts +1 -1
  496. package/lib/prompt/system-prompt.d.ts.map +1 -1
  497. package/lib/prompt/system-prompt.js +1 -2
  498. package/lib/prompt/system-prompt.js.map +1 -1
  499. package/lib/prompt/templates.d.ts +2 -5
  500. package/lib/prompt/templates.d.ts.map +1 -1
  501. package/lib/prompt/templates.js +2 -16
  502. package/lib/prompt/templates.js.map +1 -1
  503. package/lib/prompt/workspace-prompt.d.ts +0 -1
  504. package/lib/prompt/workspace-prompt.d.ts.map +1 -1
  505. package/lib/prompt/workspace-prompt.js +1 -14
  506. package/lib/prompt/workspace-prompt.js.map +1 -1
  507. package/lib/reserved-tools.d.ts.map +1 -1
  508. package/lib/reserved-tools.js +0 -3
  509. package/lib/reserved-tools.js.map +1 -1
  510. package/lib/resource-hub/hook-registry.d.ts +1 -1
  511. package/lib/resource-hub/hook-registry.d.ts.map +1 -1
  512. package/lib/resource-hub/hook-registry.js +3 -15
  513. package/lib/resource-hub/hook-registry.js.map +1 -1
  514. package/lib/resource-hub/index.d.ts +4 -16
  515. package/lib/resource-hub/index.d.ts.map +1 -1
  516. package/lib/resource-hub/index.js +3 -20
  517. package/lib/resource-hub/index.js.map +1 -1
  518. package/lib/resource-hub/mcp-registry.js +1 -1
  519. package/lib/resource-hub/mcp-registry.js.map +1 -1
  520. package/lib/resource-hub/public-api.d.ts +0 -1
  521. package/lib/resource-hub/public-api.d.ts.map +1 -1
  522. package/lib/resource-hub/resolve-subagent-tools.d.ts.map +1 -1
  523. package/lib/resource-hub/resolve-subagent-tools.js +6 -4
  524. package/lib/resource-hub/resolve-subagent-tools.js.map +1 -1
  525. package/lib/resource-hub/role-configs.js +4 -4
  526. package/lib/resource-hub/role-configs.js.map +1 -1
  527. package/lib/resource-hub/skill-registry.d.ts +1 -1
  528. package/lib/resource-hub/skill-registry.js +1 -1
  529. package/lib/resource-hub/subagent-registry.d.ts +0 -2
  530. package/lib/resource-hub/subagent-registry.d.ts.map +1 -1
  531. package/lib/resource-hub/subagent-registry.js +0 -2
  532. package/lib/resource-hub/subagent-registry.js.map +1 -1
  533. package/lib/resource-hub/tool-selection.d.ts +4 -30
  534. package/lib/resource-hub/tool-selection.d.ts.map +1 -1
  535. package/lib/resource-hub/tool-selection.js +4 -289
  536. package/lib/resource-hub/tool-selection.js.map +1 -1
  537. package/lib/resource-hub/types.d.ts +6 -1
  538. package/lib/resource-hub/types.d.ts.map +1 -1
  539. package/lib/routing/route-matcher.d.ts +1 -1
  540. package/lib/routing/route-matcher.js +1 -1
  541. package/lib/schedule-manager.d.ts.map +1 -1
  542. package/lib/schedule-manager.js.map +1 -1
  543. package/lib/seam/index.d.ts +4 -3
  544. package/lib/seam/index.d.ts.map +1 -1
  545. package/lib/seam/index.js +1 -1
  546. package/lib/seam/index.js.map +1 -1
  547. package/lib/seam/seam-integration.d.ts +26 -37
  548. package/lib/seam/seam-integration.d.ts.map +1 -1
  549. package/lib/seam/seam-integration.js +82 -52
  550. package/lib/seam/seam-integration.js.map +1 -1
  551. package/lib/seam/seam-provider.d.ts +2 -1
  552. package/lib/seam/seam-provider.d.ts.map +1 -1
  553. package/lib/seam/seam-provider.js +25 -11
  554. package/lib/seam/seam-provider.js.map +1 -1
  555. package/lib/seam/skill-service.d.ts +0 -21
  556. package/lib/seam/skill-service.d.ts.map +1 -1
  557. package/lib/seam/tokens.d.ts +3 -2
  558. package/lib/seam/tokens.d.ts.map +1 -1
  559. package/lib/seam/tokens.js +3 -1
  560. package/lib/seam/tokens.js.map +1 -1
  561. package/lib/seam/tool-service.d.ts +12 -6
  562. package/lib/seam/tool-service.d.ts.map +1 -1
  563. package/lib/security/anomaly-detection.d.ts +2 -7
  564. package/lib/security/anomaly-detection.d.ts.map +1 -1
  565. package/lib/security/anomaly-detection.js +2 -20
  566. package/lib/security/anomaly-detection.js.map +1 -1
  567. package/lib/security/audit-logger.d.ts +0 -13
  568. package/lib/security/audit-logger.d.ts.map +1 -1
  569. package/lib/security/audit-logger.js +0 -30
  570. package/lib/security/audit-logger.js.map +1 -1
  571. package/lib/security/comm-message-context.d.ts +4 -0
  572. package/lib/security/comm-message-context.d.ts.map +1 -1
  573. package/lib/security/comm-message-context.js +9 -1
  574. package/lib/security/comm-message-context.js.map +1 -1
  575. package/lib/security/dangerous-tool-policy.d.ts +3 -3
  576. package/lib/security/dangerous-tool-policy.d.ts.map +1 -1
  577. package/lib/security/dangerous-tool-policy.js +8 -28
  578. package/lib/security/dangerous-tool-policy.js.map +1 -1
  579. package/lib/security/exec-policy.d.ts +4 -4
  580. package/lib/security/exec-policy.d.ts.map +1 -1
  581. package/lib/security/exec-policy.js +21 -62
  582. package/lib/security/exec-policy.js.map +1 -1
  583. package/lib/security/file-policy.d.ts.map +1 -1
  584. package/lib/security/file-policy.js +9 -57
  585. package/lib/security/file-policy.js.map +1 -1
  586. package/lib/security/file-role-policy.d.ts +1 -5
  587. package/lib/security/file-role-policy.d.ts.map +1 -1
  588. package/lib/security/file-role-policy.js +1 -25
  589. package/lib/security/file-role-policy.js.map +1 -1
  590. package/lib/security/index.d.ts +1 -1
  591. package/lib/security/index.d.ts.map +1 -1
  592. package/lib/security/index.js +1 -1
  593. package/lib/security/index.js.map +1 -1
  594. package/lib/security/owner-approval-contracts.d.ts +6 -0
  595. package/lib/security/owner-approval-contracts.d.ts.map +1 -0
  596. package/lib/security/owner-approval-contracts.js +2 -0
  597. package/lib/security/owner-approval-contracts.js.map +1 -0
  598. package/lib/security/owner-approval-runtime.d.ts +39 -0
  599. package/lib/security/owner-approval-runtime.d.ts.map +1 -0
  600. package/lib/security/owner-approval-runtime.js +159 -0
  601. package/lib/security/owner-approval-runtime.js.map +1 -0
  602. package/lib/security/owner-approval-store.d.ts +34 -0
  603. package/lib/security/owner-approval-store.d.ts.map +1 -0
  604. package/lib/security/owner-approval-store.js +154 -0
  605. package/lib/security/owner-approval-store.js.map +1 -0
  606. package/lib/security/policy-facade.d.ts +8 -15
  607. package/lib/security/policy-facade.d.ts.map +1 -1
  608. package/lib/security/policy-facade.js +33 -38
  609. package/lib/security/policy-facade.js.map +1 -1
  610. package/lib/security/sandbox.d.ts +0 -13
  611. package/lib/security/sandbox.d.ts.map +1 -1
  612. package/lib/security/sandbox.js +0 -21
  613. package/lib/security/sandbox.js.map +1 -1
  614. package/lib/security/turn-file-authority.d.ts.map +1 -1
  615. package/lib/security/turn-file-authority.js +0 -1
  616. package/lib/security/turn-file-authority.js.map +1 -1
  617. package/lib/service.d.ts +15 -19
  618. package/lib/service.d.ts.map +1 -1
  619. package/lib/service.js +42 -39
  620. package/lib/service.js.map +1 -1
  621. package/lib/session/approval-port.d.ts +16 -0
  622. package/lib/session/approval-port.d.ts.map +1 -1
  623. package/lib/session/approval-port.js.map +1 -1
  624. package/lib/session/approval-review-agent.d.ts +29 -0
  625. package/lib/session/approval-review-agent.d.ts.map +1 -0
  626. package/lib/session/approval-review-agent.js +183 -0
  627. package/lib/session/approval-review-agent.js.map +1 -0
  628. package/lib/session/branch-summarization-runtime.d.ts.map +1 -1
  629. package/lib/session/branch-summarization-runtime.js +3 -2
  630. package/lib/session/branch-summarization-runtime.js.map +1 -1
  631. package/lib/session/index.d.ts +2 -2
  632. package/lib/session/index.d.ts.map +1 -1
  633. package/lib/session/index.js +2 -2
  634. package/lib/session/index.js.map +1 -1
  635. package/lib/session/session-io.d.ts +7 -14
  636. package/lib/session/session-io.d.ts.map +1 -1
  637. package/lib/session/session-io.js +14 -47
  638. package/lib/session/session-io.js.map +1 -1
  639. package/lib/session/turn-ingress-session.d.ts +2 -5
  640. package/lib/session/turn-ingress-session.d.ts.map +1 -1
  641. package/lib/session/turn-ingress-session.js +8 -51
  642. package/lib/session/turn-ingress-session.js.map +1 -1
  643. package/lib/skill/skill-instruction-reader-factory.d.ts +5 -0
  644. package/lib/skill/skill-instruction-reader-factory.d.ts.map +1 -0
  645. package/lib/skill/skill-instruction-reader-factory.js +13 -0
  646. package/lib/skill/skill-instruction-reader-factory.js.map +1 -0
  647. package/lib/skill/skill-instruction-reader.d.ts +22 -0
  648. package/lib/skill/skill-instruction-reader.d.ts.map +1 -0
  649. package/lib/skill/skill-instruction-reader.js +44 -0
  650. package/lib/skill/skill-instruction-reader.js.map +1 -0
  651. package/lib/skill/skill-instructions.d.ts +5 -0
  652. package/lib/skill/skill-instructions.d.ts.map +1 -0
  653. package/lib/skill/skill-instructions.js +78 -0
  654. package/lib/skill/skill-instructions.js.map +1 -0
  655. package/lib/skill/skill-registry-as-service.d.ts +5 -5
  656. package/lib/skill/skill-registry-as-service.d.ts.map +1 -1
  657. package/lib/skill/skill-registry-as-service.js +21 -16
  658. package/lib/skill/skill-registry-as-service.js.map +1 -1
  659. package/lib/skill/skill-system.js +3 -3
  660. package/lib/skill/skill-system.js.map +1 -1
  661. package/lib/{builtin → spawn}/spawn-task-tool.d.ts +5 -6
  662. package/lib/spawn/spawn-task-tool.d.ts.map +1 -0
  663. package/lib/{builtin → spawn}/spawn-task-tool.js +17 -15
  664. package/lib/spawn/spawn-task-tool.js.map +1 -0
  665. package/lib/stability/memory-pressure.d.ts +5 -4
  666. package/lib/stability/memory-pressure.d.ts.map +1 -1
  667. package/lib/stability/memory-pressure.js +14 -23
  668. package/lib/stability/memory-pressure.js.map +1 -1
  669. package/lib/standalone/standalone-tool-catalog.d.ts +13 -0
  670. package/lib/standalone/standalone-tool-catalog.d.ts.map +1 -0
  671. package/lib/standalone/standalone-tool-catalog.js +46 -0
  672. package/lib/standalone/standalone-tool-catalog.js.map +1 -0
  673. package/lib/subagent/subagent-runtime.d.ts +7 -5
  674. package/lib/subagent/subagent-runtime.d.ts.map +1 -1
  675. package/lib/subagent/subagent-runtime.js +13 -16
  676. package/lib/subagent/subagent-runtime.js.map +1 -1
  677. package/lib/subagent/subagent-system-init.d.ts +2 -1
  678. package/lib/subagent/subagent-system-init.d.ts.map +1 -1
  679. package/lib/subagent/subagent-system-init.js +1 -0
  680. package/lib/subagent/subagent-system-init.js.map +1 -1
  681. package/lib/subagent-ai-events.d.ts +3 -2
  682. package/lib/subagent-ai-events.d.ts.map +1 -1
  683. package/lib/subagent-ai-events.js.map +1 -1
  684. package/lib/subagent-parent-context.js +1 -1
  685. package/lib/subagent-parent-context.js.map +1 -1
  686. package/lib/subagent-prompt.d.ts +1 -1
  687. package/lib/subagent-prompt.js +2 -5
  688. package/lib/subagent-prompt.js.map +1 -1
  689. package/lib/task-executor.d.ts +2 -14
  690. package/lib/task-executor.d.ts.map +1 -1
  691. package/lib/task-executor.js +2 -11
  692. package/lib/task-executor.js.map +1 -1
  693. package/lib/tool/builtin-policy-extractors.d.ts +2 -1
  694. package/lib/tool/builtin-policy-extractors.d.ts.map +1 -1
  695. package/lib/tool/builtin-policy-extractors.js +18 -15
  696. package/lib/tool/builtin-policy-extractors.js.map +1 -1
  697. package/lib/tool/context-tools.js +1 -1
  698. package/lib/tool/context-tools.js.map +1 -1
  699. package/lib/tool/conversation-reference-tool.d.ts.map +1 -1
  700. package/lib/tool/conversation-reference-tool.js +1 -1
  701. package/lib/tool/conversation-reference-tool.js.map +1 -1
  702. package/lib/tool/deferred-resolution.js +2 -2
  703. package/lib/tool/deferred-resolution.js.map +1 -1
  704. package/lib/tool/executable-tool-registry.d.ts +11 -0
  705. package/lib/tool/executable-tool-registry.d.ts.map +1 -0
  706. package/lib/tool/executable-tool-registry.js +25 -0
  707. package/lib/tool/executable-tool-registry.js.map +1 -0
  708. package/lib/tool/index.d.ts +1 -1
  709. package/lib/tool/index.d.ts.map +1 -1
  710. package/lib/tool/index.js +1 -1
  711. package/lib/tool/index.js.map +1 -1
  712. package/lib/tool/prepare-turn-tools.d.ts.map +1 -1
  713. package/lib/tool/prepare-turn-tools.js +1 -2
  714. package/lib/tool/prepare-turn-tools.js.map +1 -1
  715. package/lib/tool/sources.d.ts.map +1 -1
  716. package/lib/tool/sources.js +5 -4
  717. package/lib/tool/sources.js.map +1 -1
  718. package/lib/tool/tool-approval-gate.d.ts +1 -2
  719. package/lib/tool/tool-approval-gate.d.ts.map +1 -1
  720. package/lib/tool/tool-approval-gate.js +24 -0
  721. package/lib/tool/tool-approval-gate.js.map +1 -1
  722. package/lib/tool/tool-execution-authority.d.ts +26 -0
  723. package/lib/tool/tool-execution-authority.d.ts.map +1 -0
  724. package/lib/tool/tool-execution-authority.js +84 -0
  725. package/lib/tool/tool-execution-authority.js.map +1 -0
  726. package/lib/tool/tool-runtime.d.ts +10 -9
  727. package/lib/tool/tool-runtime.d.ts.map +1 -1
  728. package/lib/tool/tool-runtime.js +77 -79
  729. package/lib/tool/tool-runtime.js.map +1 -1
  730. package/lib/tool/tool-system.js +1 -1
  731. package/lib/tool/tool-system.js.map +1 -1
  732. package/lib/tool/turn-tool-runtime.d.ts +6 -2
  733. package/lib/tool/turn-tool-runtime.d.ts.map +1 -1
  734. package/lib/tool/turn-tool-runtime.js +19 -5
  735. package/lib/tool/turn-tool-runtime.js.map +1 -1
  736. package/lib/tool-catalog/deferred-turn-controller.d.ts +2 -2
  737. package/lib/tool-catalog/deferred-turn-controller.d.ts.map +1 -1
  738. package/lib/tool-catalog/deferred-turn-controller.js +4 -4
  739. package/lib/tool-catalog/deferred-turn-controller.js.map +1 -1
  740. package/lib/turn/deferred-auto-continue.js +1 -1
  741. package/lib/turn/deferred-auto-continue.js.map +1 -1
  742. package/lib/turn/deferred-delivery.js +1 -1
  743. package/lib/turn/deferred-delivery.js.map +1 -1
  744. package/lib/turn/inbound-media.d.ts +8 -1
  745. package/lib/turn/inbound-media.d.ts.map +1 -1
  746. package/lib/turn/inbound-media.js +4 -6
  747. package/lib/turn/inbound-media.js.map +1 -1
  748. package/lib/turn/index.d.ts +2 -2
  749. package/lib/turn/index.d.ts.map +1 -1
  750. package/lib/turn/index.js +2 -2
  751. package/lib/turn/index.js.map +1 -1
  752. package/lib/turn/persist-deferred-context.js +1 -1
  753. package/lib/turn/prompt-api.d.ts +3 -4
  754. package/lib/turn/prompt-api.d.ts.map +1 -1
  755. package/lib/turn/prompt-api.js +7 -11
  756. package/lib/turn/prompt-api.js.map +1 -1
  757. package/lib/turn/task-continuation.d.ts +0 -5
  758. package/lib/turn/task-continuation.d.ts.map +1 -1
  759. package/lib/turn/task-continuation.js +0 -15
  760. package/lib/turn/task-continuation.js.map +1 -1
  761. package/lib/turn/turn-ingress.d.ts +1 -1
  762. package/lib/turn/turn-ingress.d.ts.map +1 -1
  763. package/lib/turn/turn-metrics.d.ts +0 -4
  764. package/lib/turn/turn-metrics.d.ts.map +1 -1
  765. package/lib/turn/turn-metrics.js +0 -8
  766. package/lib/turn/turn-metrics.js.map +1 -1
  767. package/lib/turn/turn-pipeline.js +7 -4
  768. package/lib/turn/turn-pipeline.js.map +1 -1
  769. package/lib/typing-indicator/adapter-integration.d.ts +1 -4
  770. package/lib/typing-indicator/adapter-integration.d.ts.map +1 -1
  771. package/lib/typing-indicator/adapter-integration.js.map +1 -1
  772. package/lib/typing-indicator/index.d.ts +0 -17
  773. package/lib/typing-indicator/index.d.ts.map +1 -1
  774. package/lib/typing-indicator/index.js +0 -31
  775. package/lib/typing-indicator/index.js.map +1 -1
  776. package/lib/user-profile.js +1 -1
  777. package/lib/user-profile.js.map +1 -1
  778. package/lib/utils/config-env.d.ts +1 -1
  779. package/lib/utils/config-env.js +1 -1
  780. package/lib/web/bing-search-html.d.ts.map +1 -0
  781. package/lib/{builtin → web}/bing-search-html.js +2 -6
  782. package/lib/web/bing-search-html.js.map +1 -0
  783. package/lib/web/web-search-locale.d.ts +5 -0
  784. package/lib/web/web-search-locale.d.ts.map +1 -0
  785. package/lib/web/web-search-locale.js +13 -0
  786. package/lib/web/web-search-locale.js.map +1 -0
  787. package/lib/{builtin → web}/web-tool-utils.d.ts +0 -1
  788. package/lib/web/web-tool-utils.d.ts.map +1 -0
  789. package/lib/{builtin → web}/web-tool-utils.js +0 -1
  790. package/lib/web/web-tool-utils.js.map +1 -0
  791. package/lib/workroom/acceptance-control.d.ts +2 -1
  792. package/lib/workroom/acceptance-control.d.ts.map +1 -1
  793. package/lib/workroom/acceptance-control.js +12 -2
  794. package/lib/workroom/acceptance-control.js.map +1 -1
  795. package/lib/workroom/accepted-source-memory-application.d.ts +1 -1
  796. package/lib/workroom/accepted-source-memory-application.d.ts.map +1 -1
  797. package/lib/workroom/assignment-authority-grant-application.d.ts +2 -2
  798. package/lib/workroom/assignment-authority-grant-application.d.ts.map +1 -1
  799. package/lib/workroom/assignment-authority-grant-application.js +1 -1
  800. package/lib/workroom/assignment-authority-grant-application.js.map +1 -1
  801. package/lib/workroom/assignment-authority-grant-repository.d.ts +3 -2
  802. package/lib/workroom/assignment-authority-grant-repository.d.ts.map +1 -1
  803. package/lib/workroom/assignment-authority-grant-repository.js +3 -1
  804. package/lib/workroom/assignment-authority-grant-repository.js.map +1 -1
  805. package/lib/workroom/assignment-authority.d.ts +75 -0
  806. package/lib/workroom/assignment-authority.d.ts.map +1 -0
  807. package/lib/workroom/assignment-authority.js +179 -0
  808. package/lib/workroom/assignment-authority.js.map +1 -0
  809. package/lib/workroom/catalog-definition.d.ts +0 -6
  810. package/lib/workroom/catalog-definition.d.ts.map +1 -1
  811. package/lib/workroom/catalog.js +1 -1
  812. package/lib/workroom/catalog.js.map +1 -1
  813. package/lib/workroom/coding-assignment-executor.d.ts +90 -0
  814. package/lib/workroom/coding-assignment-executor.d.ts.map +1 -0
  815. package/lib/workroom/coding-assignment-executor.js +250 -0
  816. package/lib/workroom/coding-assignment-executor.js.map +1 -0
  817. package/lib/workroom/coding-git-objects.d.ts +17 -0
  818. package/lib/workroom/coding-git-objects.d.ts.map +1 -0
  819. package/lib/workroom/coding-git-objects.js +68 -0
  820. package/lib/workroom/coding-git-objects.js.map +1 -0
  821. package/lib/workroom/durable-file-store.d.ts +2 -0
  822. package/lib/workroom/durable-file-store.d.ts.map +1 -1
  823. package/lib/workroom/durable-file-store.js +5 -0
  824. package/lib/workroom/durable-file-store.js.map +1 -1
  825. package/lib/workroom/effect-blocker-repository.d.ts +17 -1
  826. package/lib/workroom/effect-blocker-repository.d.ts.map +1 -1
  827. package/lib/workroom/effect-blocker-repository.js.map +1 -1
  828. package/lib/workroom/effect-ledger.d.ts +21 -1
  829. package/lib/workroom/effect-ledger.d.ts.map +1 -1
  830. package/lib/workroom/effect-ledger.js +44 -3
  831. package/lib/workroom/effect-ledger.js.map +1 -1
  832. package/lib/workroom/file-accepted-source-memory-repository.d.ts.map +1 -1
  833. package/lib/workroom/file-accepted-source-memory-repository.js +6 -3
  834. package/lib/workroom/file-accepted-source-memory-repository.js.map +1 -1
  835. package/lib/workroom/file-coding-execution-store.d.ts +25 -0
  836. package/lib/workroom/file-coding-execution-store.d.ts.map +1 -0
  837. package/lib/workroom/file-coding-execution-store.js +122 -0
  838. package/lib/workroom/file-coding-execution-store.js.map +1 -0
  839. package/lib/workroom/file-effect-ledger.d.ts.map +1 -1
  840. package/lib/workroom/file-effect-ledger.js +6 -3
  841. package/lib/workroom/file-effect-ledger.js.map +1 -1
  842. package/lib/workroom/git-workspace-gateway.d.ts +6 -3
  843. package/lib/workroom/git-workspace-gateway.d.ts.map +1 -1
  844. package/lib/workroom/git-workspace-gateway.js +10 -1
  845. package/lib/workroom/git-workspace-gateway.js.map +1 -1
  846. package/lib/workroom/github-workspace-transport.d.ts +30 -0
  847. package/lib/workroom/github-workspace-transport.d.ts.map +1 -0
  848. package/lib/workroom/github-workspace-transport.js +224 -0
  849. package/lib/workroom/github-workspace-transport.js.map +1 -0
  850. package/lib/{plugin-runtime/workroom-governed-dispatch-reasons.d.ts → workroom/governed-dispatch-reasons.d.ts} +2 -2
  851. package/lib/workroom/governed-dispatch-reasons.d.ts.map +1 -0
  852. package/lib/{plugin-runtime/workroom-governed-dispatch-reasons.js → workroom/governed-dispatch-reasons.js} +1 -1
  853. package/lib/workroom/governed-dispatch-reasons.js.map +1 -0
  854. package/lib/workroom/human-ingress-orchestrator.d.ts.map +1 -1
  855. package/lib/workroom/human-ingress-orchestrator.js +29 -1
  856. package/lib/workroom/human-ingress-orchestrator.js.map +1 -1
  857. package/lib/workroom/human-ingress-source-reader.d.ts +3 -3
  858. package/lib/workroom/human-ingress-source-reader.d.ts.map +1 -1
  859. package/lib/workroom/human-ingress-source-reader.js.map +1 -1
  860. package/lib/workroom/journal/activatable-journal.d.ts +15 -0
  861. package/lib/workroom/journal/activatable-journal.d.ts.map +1 -0
  862. package/lib/workroom/journal/activatable-journal.js +39 -0
  863. package/lib/workroom/journal/activatable-journal.js.map +1 -0
  864. package/lib/workroom/{journal.d.ts → journal/contracts.d.ts} +19 -95
  865. package/lib/workroom/journal/contracts.d.ts.map +1 -0
  866. package/lib/workroom/journal/contracts.js +19 -0
  867. package/lib/workroom/journal/contracts.js.map +1 -0
  868. package/lib/workroom/journal/database-journal.d.ts +31 -0
  869. package/lib/workroom/journal/database-journal.d.ts.map +1 -0
  870. package/lib/workroom/journal/database-journal.js +118 -0
  871. package/lib/workroom/journal/database-journal.js.map +1 -0
  872. package/lib/workroom/journal/event-codec.d.ts +26 -0
  873. package/lib/workroom/journal/event-codec.d.ts.map +1 -0
  874. package/lib/workroom/journal/event-codec.js +233 -0
  875. package/lib/workroom/journal/event-codec.js.map +1 -0
  876. package/lib/workroom/journal/event-validation.d.ts +10 -0
  877. package/lib/workroom/journal/event-validation.d.ts.map +1 -0
  878. package/lib/workroom/journal/event-validation.js +671 -0
  879. package/lib/workroom/journal/event-validation.js.map +1 -0
  880. package/lib/workroom/journal/file-journal.d.ts +15 -0
  881. package/lib/workroom/journal/file-journal.d.ts.map +1 -0
  882. package/lib/workroom/journal/file-journal.js +272 -0
  883. package/lib/workroom/journal/file-journal.js.map +1 -0
  884. package/lib/workroom/journal/index.d.ts +9 -0
  885. package/lib/workroom/journal/index.d.ts.map +1 -0
  886. package/lib/workroom/journal/index.js +8 -0
  887. package/lib/workroom/journal/index.js.map +1 -0
  888. package/lib/workroom/journal/memory-journal.d.ts +27 -0
  889. package/lib/workroom/journal/memory-journal.d.ts.map +1 -0
  890. package/lib/workroom/journal/memory-journal.js +103 -0
  891. package/lib/workroom/journal/memory-journal.js.map +1 -0
  892. package/lib/workroom/journal/payload-governance.d.ts +29 -0
  893. package/lib/workroom/journal/payload-governance.d.ts.map +1 -0
  894. package/lib/workroom/journal/payload-governance.js +282 -0
  895. package/lib/workroom/journal/payload-governance.js.map +1 -0
  896. package/lib/workroom/journal/payload-reference.d.ts +9 -0
  897. package/lib/workroom/journal/payload-reference.d.ts.map +1 -0
  898. package/lib/workroom/journal/payload-reference.js +60 -0
  899. package/lib/workroom/journal/payload-reference.js.map +1 -0
  900. package/lib/workroom/journal/stored-event-projection.d.ts +6 -0
  901. package/lib/workroom/journal/stored-event-projection.d.ts.map +1 -0
  902. package/lib/workroom/journal/stored-event-projection.js +280 -0
  903. package/lib/workroom/journal/stored-event-projection.js.map +1 -0
  904. package/lib/workroom/kernel-state.d.ts.map +1 -1
  905. package/lib/workroom/kernel-state.js +35 -3
  906. package/lib/workroom/kernel-state.js.map +1 -1
  907. package/lib/workroom/{projection-outbox.d.ts → projection-outbox/contracts.d.ts} +8 -72
  908. package/lib/workroom/projection-outbox/contracts.d.ts.map +1 -0
  909. package/lib/workroom/projection-outbox/contracts.js +11 -0
  910. package/lib/workroom/projection-outbox/contracts.js.map +1 -0
  911. package/lib/workroom/projection-outbox/delivery-worker.d.ts +22 -0
  912. package/lib/workroom/projection-outbox/delivery-worker.d.ts.map +1 -0
  913. package/lib/workroom/projection-outbox/delivery-worker.js +96 -0
  914. package/lib/workroom/projection-outbox/delivery-worker.js.map +1 -0
  915. package/lib/workroom/projection-outbox/file-repository.d.ts +11 -0
  916. package/lib/workroom/projection-outbox/file-repository.d.ts.map +1 -0
  917. package/lib/workroom/projection-outbox/file-repository.js +89 -0
  918. package/lib/workroom/projection-outbox/file-repository.js.map +1 -0
  919. package/lib/workroom/projection-outbox/index.d.ts +10 -0
  920. package/lib/workroom/projection-outbox/index.d.ts.map +1 -0
  921. package/lib/workroom/projection-outbox/index.js +8 -0
  922. package/lib/workroom/projection-outbox/index.js.map +1 -0
  923. package/lib/workroom/projection-outbox/memory-repository.d.ts +11 -0
  924. package/lib/workroom/projection-outbox/memory-repository.d.ts.map +1 -0
  925. package/lib/workroom/projection-outbox/memory-repository.js +40 -0
  926. package/lib/workroom/projection-outbox/memory-repository.js.map +1 -0
  927. package/lib/workroom/projection-outbox/projector.d.ts +36 -0
  928. package/lib/workroom/projection-outbox/projector.d.ts.map +1 -0
  929. package/lib/workroom/projection-outbox/projector.js +517 -0
  930. package/lib/workroom/projection-outbox/projector.js.map +1 -0
  931. package/lib/workroom/projection-outbox/repository-state.d.ts +17 -0
  932. package/lib/workroom/projection-outbox/repository-state.d.ts.map +1 -0
  933. package/lib/workroom/projection-outbox/repository-state.js +343 -0
  934. package/lib/workroom/projection-outbox/repository-state.js.map +1 -0
  935. package/lib/workroom/projection-outbox/tracer.d.ts +19 -0
  936. package/lib/workroom/projection-outbox/tracer.d.ts.map +1 -0
  937. package/lib/workroom/projection-outbox/tracer.js +201 -0
  938. package/lib/workroom/projection-outbox/tracer.js.map +1 -0
  939. package/lib/workroom/remote-dispatch-admission.d.ts +2 -2
  940. package/lib/workroom/remote-dispatch-admission.d.ts.map +1 -1
  941. package/lib/workroom/remote-dispatch-admission.js +1 -1
  942. package/lib/workroom/remote-dispatch-admission.js.map +1 -1
  943. package/lib/workroom/remote-dispatch-worker.d.ts +1 -1
  944. package/lib/workroom/remote-dispatch-worker.d.ts.map +1 -1
  945. package/lib/workroom/remote-dispatch-worker.js +1 -1
  946. package/lib/workroom/remote-dispatch-worker.js.map +1 -1
  947. package/lib/workroom/remote-executor.d.ts +15 -0
  948. package/lib/workroom/remote-executor.d.ts.map +1 -0
  949. package/lib/workroom/remote-executor.js +21 -0
  950. package/lib/workroom/remote-executor.js.map +1 -0
  951. package/lib/workroom/runtime.d.ts +1 -1
  952. package/lib/workroom/runtime.d.ts.map +1 -1
  953. package/lib/workroom/software-delivery-plan.d.ts +32 -0
  954. package/lib/workroom/software-delivery-plan.d.ts.map +1 -0
  955. package/lib/workroom/software-delivery-plan.js +60 -0
  956. package/lib/workroom/software-delivery-plan.js.map +1 -0
  957. package/lib/workroom/validate-catalog.d.ts +2 -0
  958. package/lib/workroom/validate-catalog.d.ts.map +1 -0
  959. package/lib/workroom/validate-catalog.js +230 -0
  960. package/lib/workroom/validate-catalog.js.map +1 -0
  961. package/lib/workroom/workroom-kernel.d.ts +11 -1
  962. package/lib/workroom/workroom-kernel.d.ts.map +1 -1
  963. package/lib/workroom/workroom-kernel.js +102 -30
  964. package/lib/workroom/workroom-kernel.js.map +1 -1
  965. package/lib/workroom/workroom-preemption.d.ts +1 -1
  966. package/lib/workroom/workroom-preemption.d.ts.map +1 -1
  967. package/lib/workroom/workroom-scheduler-application.d.ts +1 -1
  968. package/lib/workroom/workroom-scheduler-application.d.ts.map +1 -1
  969. package/lib/workroom/workroom-scheduler-application.js +1 -1
  970. package/lib/workroom/workroom-scheduler-application.js.map +1 -1
  971. package/lib/workroom/workroom-scheduler.js +3 -0
  972. package/lib/workroom/workroom-scheduler.js.map +1 -1
  973. package/lib/zhin-agent/index.d.ts +12 -6
  974. package/lib/zhin-agent/index.d.ts.map +1 -1
  975. package/lib/zhin-agent/index.js +18 -12
  976. package/lib/zhin-agent/index.js.map +1 -1
  977. package/package.json +14 -29
  978. package/lib/activity-feedback/ai-bus.d.ts +0 -21
  979. package/lib/activity-feedback/ai-bus.d.ts.map +0 -1
  980. package/lib/activity-feedback/ai-bus.js +0 -59
  981. package/lib/activity-feedback/ai-bus.js.map +0 -1
  982. package/lib/ai-hook-handlers.d.ts +0 -8
  983. package/lib/ai-hook-handlers.d.ts.map +0 -1
  984. package/lib/ai-hook-handlers.js +0 -46
  985. package/lib/ai-hook-handlers.js.map +0 -1
  986. package/lib/authoring/define-agent.d.ts +0 -4
  987. package/lib/authoring/define-agent.d.ts.map +0 -1
  988. package/lib/authoring/define-agent.js +0 -8
  989. package/lib/authoring/define-agent.js.map +0 -1
  990. package/lib/authoring/define-connection.d.ts +0 -5
  991. package/lib/authoring/define-connection.d.ts.map +0 -1
  992. package/lib/authoring/define-connection.js +0 -8
  993. package/lib/authoring/define-connection.js.map +0 -1
  994. package/lib/authoring/define-schedule.d.ts +0 -4
  995. package/lib/authoring/define-schedule.d.ts.map +0 -1
  996. package/lib/authoring/define-schedule.js +0 -8
  997. package/lib/authoring/define-schedule.js.map +0 -1
  998. package/lib/authoring/define-tool.d.ts +0 -20
  999. package/lib/authoring/define-tool.d.ts.map +0 -1
  1000. package/lib/authoring/define-tool.js +0 -28
  1001. package/lib/authoring/define-tool.js.map +0 -1
  1002. package/lib/authoring/entries/connections.d.ts +0 -3
  1003. package/lib/authoring/entries/connections.d.ts.map +0 -1
  1004. package/lib/authoring/entries/connections.js +0 -2
  1005. package/lib/authoring/entries/connections.js.map +0 -1
  1006. package/lib/authoring/entries/schedules.d.ts +0 -3
  1007. package/lib/authoring/entries/schedules.d.ts.map +0 -1
  1008. package/lib/authoring/entries/schedules.js +0 -2
  1009. package/lib/authoring/entries/schedules.js.map +0 -1
  1010. package/lib/authoring/entries/tools.d.ts +0 -5
  1011. package/lib/authoring/entries/tools.d.ts.map +0 -1
  1012. package/lib/authoring/entries/tools.js +0 -3
  1013. package/lib/authoring/entries/tools.js.map +0 -1
  1014. package/lib/authoring/tool-policy.d.ts +0 -3
  1015. package/lib/authoring/tool-policy.d.ts.map +0 -1
  1016. package/lib/authoring/tool-policy.js +0 -2
  1017. package/lib/authoring/tool-policy.js.map +0 -1
  1018. package/lib/authoring/zod-schema.d.ts +0 -10
  1019. package/lib/authoring/zod-schema.d.ts.map +0 -1
  1020. package/lib/authoring/zod-schema.js +0 -7
  1021. package/lib/authoring/zod-schema.js.map +0 -1
  1022. package/lib/builtin/analyze-media-tool.d.ts +0 -13
  1023. package/lib/builtin/analyze-media-tool.d.ts.map +0 -1
  1024. package/lib/builtin/analyze-media-tool.js +0 -94
  1025. package/lib/builtin/analyze-media-tool.js.map +0 -1
  1026. package/lib/builtin/bash-tool.d.ts +0 -29
  1027. package/lib/builtin/bash-tool.d.ts.map +0 -1
  1028. package/lib/builtin/bash-tool.js +0 -107
  1029. package/lib/builtin/bash-tool.js.map +0 -1
  1030. package/lib/builtin/bing-search-html.d.ts.map +0 -1
  1031. package/lib/builtin/bing-search-html.js.map +0 -1
  1032. package/lib/builtin/builtin-base-tool.d.ts +0 -27
  1033. package/lib/builtin/builtin-base-tool.d.ts.map +0 -1
  1034. package/lib/builtin/builtin-base-tool.js +0 -35
  1035. package/lib/builtin/builtin-base-tool.js.map +0 -1
  1036. package/lib/builtin/edit-file-tool.d.ts +0 -13
  1037. package/lib/builtin/edit-file-tool.d.ts.map +0 -1
  1038. package/lib/builtin/edit-file-tool.js +0 -86
  1039. package/lib/builtin/edit-file-tool.js.map +0 -1
  1040. package/lib/builtin/file-edit-quote-utils.d.ts.map +0 -1
  1041. package/lib/builtin/file-edit-quote-utils.js.map +0 -1
  1042. package/lib/builtin/five-agent/index.d.ts.map +0 -1
  1043. package/lib/builtin/five-agent/index.js.map +0 -1
  1044. package/lib/builtin/five-agent/prompts.d.ts.map +0 -1
  1045. package/lib/builtin/five-agent/prompts.js.map +0 -1
  1046. package/lib/builtin/five-agent/role-capability-policy.d.ts.map +0 -1
  1047. package/lib/builtin/five-agent/role-capability-policy.js.map +0 -1
  1048. package/lib/builtin/five-agent/roles.d.ts.map +0 -1
  1049. package/lib/builtin/five-agent/roles.js.map +0 -1
  1050. package/lib/builtin/generate-image-tool.d.ts +0 -21
  1051. package/lib/builtin/generate-image-tool.d.ts.map +0 -1
  1052. package/lib/builtin/generate-image-tool.js +0 -138
  1053. package/lib/builtin/generate-image-tool.js.map +0 -1
  1054. package/lib/builtin/glob-tool.d.ts +0 -23
  1055. package/lib/builtin/glob-tool.d.ts.map +0 -1
  1056. package/lib/builtin/glob-tool.js +0 -53
  1057. package/lib/builtin/glob-tool.js.map +0 -1
  1058. package/lib/builtin/grep-tool.d.ts +0 -23
  1059. package/lib/builtin/grep-tool.d.ts.map +0 -1
  1060. package/lib/builtin/grep-tool.js +0 -121
  1061. package/lib/builtin/grep-tool.js.map +0 -1
  1062. package/lib/builtin/install-skill-tool.d.ts +0 -24
  1063. package/lib/builtin/install-skill-tool.d.ts.map +0 -1
  1064. package/lib/builtin/install-skill-tool.js +0 -76
  1065. package/lib/builtin/install-skill-tool.js.map +0 -1
  1066. package/lib/builtin/knowledge-search-tool.d.ts +0 -6
  1067. package/lib/builtin/knowledge-search-tool.d.ts.map +0 -1
  1068. package/lib/builtin/knowledge-search-tool.js +0 -184
  1069. package/lib/builtin/knowledge-search-tool.js.map +0 -1
  1070. package/lib/builtin/list-dir-tool.d.ts +0 -13
  1071. package/lib/builtin/list-dir-tool.d.ts.map +0 -1
  1072. package/lib/builtin/list-dir-tool.js +0 -57
  1073. package/lib/builtin/list-dir-tool.js.map +0 -1
  1074. package/lib/builtin/load-skill-tool.d.ts +0 -20
  1075. package/lib/builtin/load-skill-tool.d.ts.map +0 -1
  1076. package/lib/builtin/load-skill-tool.js +0 -60
  1077. package/lib/builtin/load-skill-tool.js.map +0 -1
  1078. package/lib/builtin/read-file-tool.d.ts +0 -14
  1079. package/lib/builtin/read-file-tool.d.ts.map +0 -1
  1080. package/lib/builtin/read-file-tool.js +0 -74
  1081. package/lib/builtin/read-file-tool.js.map +0 -1
  1082. package/lib/builtin/run-deferred-task-tool.d.ts +0 -23
  1083. package/lib/builtin/run-deferred-task-tool.d.ts.map +0 -1
  1084. package/lib/builtin/run-deferred-task-tool.js +0 -41
  1085. package/lib/builtin/run-deferred-task-tool.js.map +0 -1
  1086. package/lib/builtin/spawn-task-tool.d.ts.map +0 -1
  1087. package/lib/builtin/spawn-task-tool.js.map +0 -1
  1088. package/lib/builtin/todo-read-tool.d.ts +0 -14
  1089. package/lib/builtin/todo-read-tool.d.ts.map +0 -1
  1090. package/lib/builtin/todo-read-tool.js +0 -56
  1091. package/lib/builtin/todo-read-tool.js.map +0 -1
  1092. package/lib/builtin/todo-write-tool.d.ts +0 -14
  1093. package/lib/builtin/todo-write-tool.d.ts.map +0 -1
  1094. package/lib/builtin/todo-write-tool.js +0 -54
  1095. package/lib/builtin/todo-write-tool.js.map +0 -1
  1096. package/lib/builtin/web-fetch-tool.d.ts +0 -21
  1097. package/lib/builtin/web-fetch-tool.d.ts.map +0 -1
  1098. package/lib/builtin/web-fetch-tool.js +0 -86
  1099. package/lib/builtin/web-fetch-tool.js.map +0 -1
  1100. package/lib/builtin/web-search-locale.d.ts +0 -16
  1101. package/lib/builtin/web-search-locale.d.ts.map +0 -1
  1102. package/lib/builtin/web-search-locale.js +0 -74
  1103. package/lib/builtin/web-search-locale.js.map +0 -1
  1104. package/lib/builtin/web-search-tool.d.ts +0 -20
  1105. package/lib/builtin/web-search-tool.d.ts.map +0 -1
  1106. package/lib/builtin/web-search-tool.js +0 -115
  1107. package/lib/builtin/web-search-tool.js.map +0 -1
  1108. package/lib/builtin/web-tool-utils.d.ts.map +0 -1
  1109. package/lib/builtin/web-tool-utils.js.map +0 -1
  1110. package/lib/builtin/write-file-tool.d.ts +0 -13
  1111. package/lib/builtin/write-file-tool.d.ts.map +0 -1
  1112. package/lib/builtin/write-file-tool.js +0 -55
  1113. package/lib/builtin/write-file-tool.js.map +0 -1
  1114. package/lib/builtin-tools.d.ts +0 -25
  1115. package/lib/builtin-tools.d.ts.map +0 -1
  1116. package/lib/builtin-tools.js +0 -54
  1117. package/lib/builtin-tools.js.map +0 -1
  1118. package/lib/defaults/hooks.d.ts +0 -6
  1119. package/lib/defaults/hooks.d.ts.map +0 -1
  1120. package/lib/defaults/hooks.js +0 -9
  1121. package/lib/defaults/hooks.js.map +0 -1
  1122. package/lib/defaults/subagents.d.ts +0 -6
  1123. package/lib/defaults/subagents.d.ts.map +0 -1
  1124. package/lib/defaults/subagents.js +0 -23
  1125. package/lib/defaults/subagents.js.map +0 -1
  1126. package/lib/defaults/tools.d.ts +0 -5
  1127. package/lib/defaults/tools.d.ts.map +0 -1
  1128. package/lib/defaults/tools.js +0 -6
  1129. package/lib/defaults/tools.js.map +0 -1
  1130. package/lib/discovery/index.d.ts +0 -5
  1131. package/lib/discovery/index.d.ts.map +0 -1
  1132. package/lib/discovery/index.js +0 -5
  1133. package/lib/discovery/index.js.map +0 -1
  1134. package/lib/discovery/skills.d.ts +0 -53
  1135. package/lib/discovery/skills.d.ts.map +0 -1
  1136. package/lib/discovery/skills.js +0 -306
  1137. package/lib/discovery/skills.js.map +0 -1
  1138. package/lib/discovery/tools.d.ts +0 -53
  1139. package/lib/discovery/tools.d.ts.map +0 -1
  1140. package/lib/discovery/tools.js +0 -305
  1141. package/lib/discovery/tools.js.map +0 -1
  1142. package/lib/features/agent-feature.d.ts +0 -23
  1143. package/lib/features/agent-feature.d.ts.map +0 -1
  1144. package/lib/features/agent-feature.js +0 -51
  1145. package/lib/features/agent-feature.js.map +0 -1
  1146. package/lib/features/index.d.ts +0 -3
  1147. package/lib/features/index.d.ts.map +0 -1
  1148. package/lib/features/index.js +0 -3
  1149. package/lib/features/index.js.map +0 -1
  1150. package/lib/features/mcp-feature.d.ts +0 -25
  1151. package/lib/features/mcp-feature.d.ts.map +0 -1
  1152. package/lib/features/mcp-feature.js +0 -52
  1153. package/lib/features/mcp-feature.js.map +0 -1
  1154. package/lib/hooks.d.ts +0 -144
  1155. package/lib/hooks.d.ts.map +0 -1
  1156. package/lib/hooks.js +0 -82
  1157. package/lib/hooks.js.map +0 -1
  1158. package/lib/ingress/capability-ingress.d.ts +0 -76
  1159. package/lib/ingress/capability-ingress.d.ts.map +0 -1
  1160. package/lib/ingress/capability-ingress.js +0 -274
  1161. package/lib/ingress/capability-ingress.js.map +0 -1
  1162. package/lib/ingress/index.d.ts +0 -2
  1163. package/lib/ingress/index.d.ts.map +0 -1
  1164. package/lib/ingress/index.js +0 -2
  1165. package/lib/ingress/index.js.map +0 -1
  1166. package/lib/init/introspection-args.d.ts +0 -37
  1167. package/lib/init/introspection-args.d.ts.map +0 -1
  1168. package/lib/init/introspection-args.js +0 -71
  1169. package/lib/init/introspection-args.js.map +0 -1
  1170. package/lib/init/introspection-collectors.d.ts +0 -26
  1171. package/lib/init/introspection-collectors.d.ts.map +0 -1
  1172. package/lib/init/introspection-collectors.js +0 -108
  1173. package/lib/init/introspection-collectors.js.map +0 -1
  1174. package/lib/init/introspection-commands-format.d.ts +0 -40
  1175. package/lib/init/introspection-commands-format.d.ts.map +0 -1
  1176. package/lib/init/introspection-commands-format.js +0 -93
  1177. package/lib/init/introspection-commands-format.js.map +0 -1
  1178. package/lib/init/introspection-pagination.d.ts +0 -14
  1179. package/lib/init/introspection-pagination.d.ts.map +0 -1
  1180. package/lib/init/introspection-pagination.js +0 -33
  1181. package/lib/init/introspection-pagination.js.map +0 -1
  1182. package/lib/init/introspection-rest.d.ts +0 -24
  1183. package/lib/init/introspection-rest.d.ts.map +0 -1
  1184. package/lib/init/introspection-rest.js +0 -65
  1185. package/lib/init/introspection-rest.js.map +0 -1
  1186. package/lib/init/upgrade-agent-db-schema.d.ts +0 -49
  1187. package/lib/init/upgrade-agent-db-schema.d.ts.map +0 -1
  1188. package/lib/init/upgrade-agent-db-schema.js +0 -210
  1189. package/lib/init/upgrade-agent-db-schema.js.map +0 -1
  1190. package/lib/init/upgrade-endpoint-id-schema.d.ts +0 -12
  1191. package/lib/init/upgrade-endpoint-id-schema.d.ts.map +0 -1
  1192. package/lib/init/upgrade-endpoint-id-schema.js +0 -58
  1193. package/lib/init/upgrade-endpoint-id-schema.js.map +0 -1
  1194. package/lib/plugin-runtime/workroom-governed-dispatch-reasons.d.ts.map +0 -1
  1195. package/lib/plugin-runtime/workroom-governed-dispatch-reasons.js.map +0 -1
  1196. package/lib/resource-hub/tool-registry.d.ts +0 -60
  1197. package/lib/resource-hub/tool-registry.d.ts.map +0 -1
  1198. package/lib/resource-hub/tool-registry.js +0 -228
  1199. package/lib/resource-hub/tool-registry.js.map +0 -1
  1200. package/lib/security/owner-approve-always-store.d.ts +0 -67
  1201. package/lib/security/owner-approve-always-store.d.ts.map +0 -1
  1202. package/lib/security/owner-approve-always-store.js +0 -510
  1203. package/lib/security/owner-approve-always-store.js.map +0 -1
  1204. package/lib/security/turn-sandbox-authority.d.ts +0 -13
  1205. package/lib/security/turn-sandbox-authority.d.ts.map +0 -1
  1206. package/lib/security/turn-sandbox-authority.js +0 -42
  1207. package/lib/security/turn-sandbox-authority.js.map +0 -1
  1208. package/lib/skill/skill-load-opts.d.ts +0 -5
  1209. package/lib/skill/skill-load-opts.d.ts.map +0 -1
  1210. package/lib/skill/skill-load-opts.js +0 -14
  1211. package/lib/skill/skill-load-opts.js.map +0 -1
  1212. package/lib/stability/registry-cleanup.d.ts +0 -5
  1213. package/lib/stability/registry-cleanup.d.ts.map +0 -1
  1214. package/lib/stability/registry-cleanup.js +0 -20
  1215. package/lib/stability/registry-cleanup.js.map +0 -1
  1216. package/lib/tool/classic-tool-execution-authority.d.ts +0 -22
  1217. package/lib/tool/classic-tool-execution-authority.d.ts.map +0 -1
  1218. package/lib/tool/classic-tool-execution-authority.js +0 -80
  1219. package/lib/tool/classic-tool-execution-authority.js.map +0 -1
  1220. package/lib/tool/web-search-locale-attach.d.ts +0 -4
  1221. package/lib/tool/web-search-locale-attach.d.ts.map +0 -1
  1222. package/lib/tool/web-search-locale-attach.js +0 -20
  1223. package/lib/tool/web-search-locale-attach.js.map +0 -1
  1224. package/lib/typing-indicator/integration.d.ts +0 -89
  1225. package/lib/typing-indicator/integration.d.ts.map +0 -1
  1226. package/lib/typing-indicator/integration.js +0 -261
  1227. package/lib/typing-indicator/integration.js.map +0 -1
  1228. package/lib/workroom/journal.d.ts.map +0 -1
  1229. package/lib/workroom/journal.js +0 -2022
  1230. package/lib/workroom/journal.js.map +0 -1
  1231. package/lib/workroom/local-assignment-executor.d.ts.map +0 -1
  1232. package/lib/workroom/local-assignment-executor.js.map +0 -1
  1233. package/lib/workroom/projection-outbox.d.ts.map +0 -1
  1234. package/lib/workroom/projection-outbox.js +0 -1324
  1235. package/lib/workroom/projection-outbox.js.map +0 -1
  1236. /package/lib/{builtin → orchestration}/five-agent/index.d.ts +0 -0
  1237. /package/lib/{builtin → orchestration}/five-agent/index.js +0 -0
  1238. /package/lib/{builtin → orchestration}/five-agent/prompts.d.ts +0 -0
  1239. /package/lib/{builtin → orchestration}/five-agent/prompts.js +0 -0
  1240. /package/lib/{builtin → orchestration}/five-agent/role-capability-policy.d.ts +0 -0
  1241. /package/lib/{builtin → orchestration}/five-agent/role-capability-policy.js +0 -0
  1242. /package/lib/{builtin → orchestration}/five-agent/roles.d.ts +0 -0
  1243. /package/lib/{builtin → orchestration}/five-agent/roles.js +0 -0
  1244. /package/lib/{builtin → plugin-runtime}/file-edit-quote-utils.d.ts +0 -0
  1245. /package/lib/{builtin → plugin-runtime}/file-edit-quote-utils.js +0 -0
  1246. /package/lib/{builtin → web}/bing-search-html.d.ts +0 -0
@@ -1,2022 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { readFile, readdir } from 'node:fs/promises';
3
- import { basename, join } from 'node:path';
4
- import { assertAcceptanceContract, assertPersistedAcceptanceRecord } from './acceptance-policy.js';
5
- import { canonicalWorkroomJson, compareCanonicalWorkroomText, deepFreezeWorkroomValue as deepFreeze, digestCanonicalWorkroomValue, } from './canonical-value.js';
6
- import { assertWorkflowPlanProposal } from './workflow-plan-builder.js';
7
- import { assertWorkflowPlanRevisionCandidate } from './plan-revision.js';
8
- import { parseWorkroomRemoteAssignmentIssuance } from './remote-assignment-issuance.js';
9
- import { parseWorkroomLocalAssignmentIssuance } from './local-assignment-issuance.js';
10
- import { isWorkroomRunCancelReasonCode, isWorkroomRunReplanReasonCode, } from './workroom-run-control.js';
11
- import { assertWorkroomSchedulerPolicySnapshot, parseWorkroomDispatchTaskDecision, parseWorkroomPreemptionPrepareDecision, parseWorkroomPriorityChangeProposal, } from './workroom-scheduler.js';
12
- import { DurableFileStore } from './durable-file-store.js';
13
- import { FileLegacyEmbeddedPayloadReadAdapter, LegacyEmbeddedPayloadDetectedError, assertActiveStoreHasNoLegacyEmbeddedPayload, } from './legacy-embedded-payload-migration.js';
14
- export class WorkroomJournalPayloadAuthorityUnavailableError extends Error {
15
- constructor() {
16
- super('Governed Workroom Journal payload authority is unavailable');
17
- this.name = 'WorkroomJournalPayloadAuthorityUnavailableError';
18
- }
19
- }
20
- export class WorkroomSequenceConflictError extends Error {
21
- runId;
22
- expectedSequence;
23
- actualSequence;
24
- constructor(runId, expectedSequence, actualSequence) {
25
- super(`Workroom ${runId} sequence conflict: expected ${expectedSequence}, actual ${actualSequence}`);
26
- this.runId = runId;
27
- this.expectedSequence = expectedSequence;
28
- this.actualSequence = actualSequence;
29
- this.name = 'WorkroomSequenceConflictError';
30
- }
31
- }
32
- export class MemoryWorkroomJournal {
33
- #runs = new Map();
34
- #payloads;
35
- constructor(payloads = new MemoryWorkroomJournalPayloadPort()) {
36
- this.#payloads = payloads;
37
- }
38
- async listRunIds() {
39
- return Object.freeze([...this.#runs.keys()].sort());
40
- }
41
- async scanStoredHeaders() {
42
- return Object.freeze([...this.#runs.entries()]
43
- .sort(([left], [right]) => compareCanonicalWorkroomText(left, right))
44
- .map(([runId, events]) => storedRunHeaders(runId, events)));
45
- }
46
- async readStoredHeaders(runId) {
47
- const events = this.#runs.get(runId) ?? [];
48
- return events.length === 0 ? null : storedRunHeaders(runId, events);
49
- }
50
- async verifyGovernedPayloadPublication(intent) {
51
- const events = this.#runs.get(intent.publicationScope ?? '') ?? [];
52
- return verifyJournalPayloadPublication(intent, events);
53
- }
54
- async read(runId) {
55
- const events = this.#runs.get(runId) ?? [];
56
- return events.length === 0
57
- ? Object.freeze([])
58
- : await materializeStoredEvents(events, this.#payloads);
59
- }
60
- async append(runId, expectedSequence, drafts) {
61
- const current = this.#runs.get(runId) ?? [];
62
- const actualSequence = current.at(-1)?.sequence ?? -1;
63
- if (actualSequence !== expectedSequence) {
64
- throw new WorkroomSequenceConflictError(runId, expectedSequence, actualSequence);
65
- }
66
- if (drafts.length === 0)
67
- return [];
68
- const appended = materializeEvents(runId, expectedSequence, drafts);
69
- const projectId = projectIdForAppend(current, appended);
70
- const protectedEvents = await protectEvents(appended, projectId, this.#payloads);
71
- const winner = this.#runs.get(runId) ?? [];
72
- const winnerSequence = winner.at(-1)?.sequence ?? -1;
73
- if (winnerSequence !== expectedSequence) {
74
- throw new WorkroomSequenceConflictError(runId, expectedSequence, winnerSequence);
75
- }
76
- this.#runs.set(runId, Object.freeze([...current, ...protectedEvents]));
77
- return appended;
78
- }
79
- }
80
- /** In-memory authority used by the non-production Memory journal. */
81
- export class MemoryWorkroomJournalPayloadPort {
82
- #values = new Map();
83
- async write(input) {
84
- if (digestCanonicalWorkroomValue(input.value) !== input.contentHash) {
85
- throw new Error('Memory Workroom Journal payload content hash drift');
86
- }
87
- const objectId = createWorkroomJournalPayloadObjectId(input);
88
- const vaultObjectId = `memory:${digestCanonicalWorkroomValue({ objectId, contentHash: input.contentHash })}`;
89
- const existing = this.#values.get(vaultObjectId);
90
- if (existing !== undefined
91
- && digestCanonicalWorkroomValue(existing) !== input.contentHash) {
92
- throw new Error('Memory Workroom Journal payload identity conflict');
93
- }
94
- this.#values.set(vaultObjectId, structuredClone(input.value));
95
- return Object.freeze({
96
- descriptor: Object.freeze({
97
- vaultObjectId,
98
- objectId,
99
- payloadHash: input.contentHash,
100
- descriptorDigest: digestCanonicalWorkroomValue({
101
- objectId,
102
- payloadHash: input.contentHash,
103
- projectId: input.projectId,
104
- }),
105
- locationManifestDigest: digestCanonicalWorkroomValue({ location: vaultObjectId }),
106
- bytes: Buffer.byteLength(canonicalWorkroomJson(input.value)),
107
- }),
108
- source: Object.freeze({
109
- kind: 'command',
110
- ref: input.source.ref,
111
- digest: input.source.digest,
112
- bindingDigest: input.source.bindingDigest,
113
- verification: 'verified',
114
- }),
115
- });
116
- }
117
- async read(input) {
118
- const value = this.#values.get(input.receipt.descriptor.vaultObjectId);
119
- if (value === undefined)
120
- throw new Error('Memory Workroom Journal payload is unavailable');
121
- return structuredClone(value);
122
- }
123
- }
124
- /**
125
- * Durable append-only journal. Every committed batch is an immutable segment;
126
- * publishing its first sequence with an exclusive hard-link is the filesystem
127
- * CAS. Separate generation instances and separate processes therefore cannot
128
- * overwrite one another after reading the same expectedSequence.
129
- */
130
- export class FileWorkroomJournal {
131
- #directory;
132
- #store;
133
- #payloads;
134
- constructor(directory, payloads) {
135
- this.#directory = directory;
136
- this.#store = new DurableFileStore(directory);
137
- this.#payloads = payloads;
138
- }
139
- async listRunIds() {
140
- let names;
141
- try {
142
- names = await readdir(this.#directory);
143
- }
144
- catch (error) {
145
- if (isMissingFile(error))
146
- return Object.freeze([]);
147
- throw error;
148
- }
149
- if (names.some(name => name.endsWith('.json') && !isSegmentName(name))) {
150
- throw new Error('Invalid Workroom journal segment name');
151
- }
152
- const ids = new Set();
153
- for (const name of names) {
154
- if (!isSegmentName(name))
155
- continue;
156
- const events = await this.#readStoredFile(join(this.#directory, name), segmentFirstSequence(name));
157
- const runId = events[0]?.runId;
158
- if (runId)
159
- ids.add(runId);
160
- }
161
- if (ids.size > 0)
162
- await this.#store.syncLeaf();
163
- return Object.freeze([...ids].sort());
164
- }
165
- async scanStoredHeaders() {
166
- const groups = new Map();
167
- let names;
168
- try {
169
- names = (await readdir(this.#directory)).filter(name => name.endsWith('.json')).sort();
170
- }
171
- catch (error) {
172
- if (isMissingFile(error))
173
- return Object.freeze([]);
174
- throw error;
175
- }
176
- if (names.some(name => !isSegmentName(name))) {
177
- throw new Error('Invalid Workroom journal segment name');
178
- }
179
- for (const name of names) {
180
- const events = await this.#readStoredFile(join(this.#directory, name), segmentFirstSequence(name));
181
- const runId = events[0]?.runId;
182
- if (!runId)
183
- throw new Error('Workroom journal segment has no Run header');
184
- groups.set(runId, [...(groups.get(runId) ?? []), ...events]);
185
- }
186
- if (groups.size > 0)
187
- await this.#store.syncLeaf();
188
- return Object.freeze([...groups.entries()]
189
- .sort(([left], [right]) => compareCanonicalWorkroomText(left, right))
190
- .map(([runId, events]) => storedRunHeaders(runId, events)));
191
- }
192
- async readStoredHeaders(runId) {
193
- const events = await this.#readStoredWithoutPayloads(runId);
194
- return events.length === 0 ? null : storedRunHeaders(runId, events);
195
- }
196
- async verifyGovernedPayloadPublication(intent) {
197
- if (!intent.publicationScope)
198
- return deepFreeze({ status: 'missing' });
199
- return verifyJournalPayloadPublication(intent, await this.#readStoredWithoutPayloads(intent.publicationScope));
200
- }
201
- async read(runId) {
202
- const digest = this.#digest(runId);
203
- let names;
204
- try {
205
- const entries = await readdir(this.#directory);
206
- names = entries
207
- .filter(name => name.startsWith(`${digest}.`) && name.endsWith('.json'));
208
- if (names.some(name => !isSegmentName(name))) {
209
- throw new Error('Invalid Workroom journal segment name');
210
- }
211
- names.sort();
212
- }
213
- catch (error) {
214
- if (isMissingFile(error))
215
- return [];
216
- throw error;
217
- }
218
- const segments = await Promise.all(names.map(name => this.#readStoredFile(join(this.#directory, name), segmentFirstSequence(name))));
219
- const events = segments.flat();
220
- if (events.some(event => event.runId !== runId)) {
221
- throw new Error('Workroom journal digest collision');
222
- }
223
- const ordered = events.sort((left, right) => left.sequence - right.sequence);
224
- if (ordered.some((event, index) => event.sequence !== index)) {
225
- throw new Error('Workroom journal sequence is not contiguous');
226
- }
227
- if (ordered.length > 0) {
228
- await this.#store.syncLeaf();
229
- await reconcileJournalPayloads(runId, ordered, this.#requirePayloads());
230
- }
231
- if (ordered.length === 0)
232
- return Object.freeze([]);
233
- return await materializeStoredEvents(Object.freeze(ordered), this.#requirePayloads());
234
- }
235
- async append(runId, expectedSequence, drafts) {
236
- const current = await this.#readStored(runId);
237
- const actualSequence = current.at(-1)?.sequence ?? -1;
238
- if (actualSequence !== expectedSequence) {
239
- throw new WorkroomSequenceConflictError(runId, expectedSequence, actualSequence);
240
- }
241
- if (drafts.length === 0)
242
- return [];
243
- const result = materializeEvents(runId, expectedSequence, drafts);
244
- const projectId = projectIdForAppend(current, result);
245
- await this.#store.ensureDurableLeaf('Workroom Journal');
246
- await this.#assertNoLegacyEmbeddedPayload();
247
- const protectedEvents = await protectEvents(result, projectId, this.#requirePayloads());
248
- const segment = this.#segmentPath(runId, expectedSequence + 1);
249
- const payload = Object.freeze({
250
- version: 3,
251
- runId,
252
- expectedSequence,
253
- events: protectedEvents,
254
- });
255
- const stored = Object.freeze({
256
- ...payload,
257
- payloadDigest: digestCanonicalWorkroomValue(payload),
258
- });
259
- const receipts = collectGovernedPayloadReceipts(protectedEvents);
260
- await this.#requirePayloads().prepare?.({ projectId, runId, receipts });
261
- let headerPublished = false;
262
- try {
263
- const published = await this.#store.publishCreateOnly({
264
- target: segment,
265
- content: canonicalWorkroomJson(stored),
266
- createdValue: result,
267
- onConflict: async () => {
268
- const winner = await this.#readStored(runId);
269
- throw new WorkroomSequenceConflictError(runId, expectedSequence, winner.at(-1)?.sequence ?? -1);
270
- },
271
- });
272
- headerPublished = true;
273
- await this.#requirePayloads().publish?.({
274
- projectId,
275
- runId,
276
- receipts,
277
- publicationDigest: journalPublicationDigest(runId, [...current, ...protectedEvents]),
278
- });
279
- return published.value;
280
- }
281
- catch (error) {
282
- if (!headerPublished) {
283
- await this.#requirePayloads().abandon?.({ projectId, runId, receipts, reason: 'cas_lost' });
284
- }
285
- throw error;
286
- }
287
- }
288
- async #readStored(runId) {
289
- const events = await this.#readStoredWithoutPayloads(runId);
290
- if (events.length > 0)
291
- await reconcileJournalPayloads(runId, events, this.#requirePayloads());
292
- return events;
293
- }
294
- async #assertNoLegacyEmbeddedPayload() {
295
- const names = await readdir(this.#directory);
296
- const unexpected = names.find(name => !isSegmentName(name) && !isSegmentTemporaryName(name));
297
- if (unexpected)
298
- throw new Error('Invalid Workroom journal segment name');
299
- const segments = names.filter(isSegmentName).sort();
300
- if (segments.length === 0)
301
- return;
302
- await assertActiveStoreHasNoLegacyEmbeddedPayload(new FileLegacyEmbeddedPayloadReadAdapter(segments.map(name => ({ sourceKind: 'journal', path: join(this.#directory, name) }))));
303
- }
304
- async #readStoredWithoutPayloads(runId) {
305
- const digest = this.#digest(runId);
306
- let names;
307
- try {
308
- names = (await readdir(this.#directory))
309
- .filter(name => name.startsWith(`${digest}.`) && name.endsWith('.json'))
310
- .sort();
311
- }
312
- catch (error) {
313
- if (isMissingFile(error))
314
- return [];
315
- throw error;
316
- }
317
- const events = (await Promise.all(names.map(name => this.#readStoredFile(join(this.#directory, name), segmentFirstSequence(name))))).flat().sort((left, right) => left.sequence - right.sequence);
318
- if (events.some((event, index) => event.runId !== runId || event.sequence !== index)) {
319
- throw new Error('Workroom journal sequence or Run binding is invalid');
320
- }
321
- if (events.length > 0)
322
- await this.#store.syncLeaf();
323
- return Object.freeze(events);
324
- }
325
- async #readStoredFile(path, expectedFirstSequence) {
326
- try {
327
- const parsed = JSON.parse(await readFile(path, 'utf8'));
328
- if (Array.isArray(parsed)) {
329
- throw legacyJournalPayloadError();
330
- }
331
- if (isRecord(parsed) && (parsed.version === 1 || parsed.version === 2)) {
332
- throw legacyJournalPayloadError();
333
- }
334
- if (!isRecord(parsed) || parsed.version !== 3 || !isNonEmptyString(parsed.runId)
335
- || !Number.isSafeInteger(parsed.expectedSequence)
336
- || !Array.isArray(parsed.events) || typeof parsed.payloadDigest !== 'string') {
337
- throw new Error('Invalid Workroom journal segment envelope');
338
- }
339
- if (parsed.expectedSequence !== expectedFirstSequence - 1) {
340
- throw new Error('Workroom journal segment first sequence does not match its filename');
341
- }
342
- const events = parseStoredEvents(parsed.events);
343
- const payload = Object.freeze({
344
- version: 3,
345
- runId: parsed.runId,
346
- expectedSequence: parsed.expectedSequence,
347
- events,
348
- });
349
- const stored = Object.freeze({
350
- ...payload,
351
- payloadDigest: parsed.payloadDigest,
352
- });
353
- if (parsed.payloadDigest !== digestCanonicalWorkroomValue(payload)
354
- || canonicalWorkroomJson(parsed) !== canonicalWorkroomJson(stored)) {
355
- throw new Error('Workroom journal segment payload digest mismatch');
356
- }
357
- if (events.some(event => event.runId !== parsed.runId)) {
358
- throw new Error('Workroom journal segment Run binding drift');
359
- }
360
- if (basename(path) !== `${this.#digest(parsed.runId)}.${String(expectedFirstSequence).padStart(16, '0')}.json`) {
361
- throw new Error('Workroom journal segment Run digest does not match its filename');
362
- }
363
- if (events.length === 0 || events[0].sequence !== expectedFirstSequence) {
364
- throw new Error('Workroom journal segment first sequence does not match its filename');
365
- }
366
- if (events.some((event, index) => event.sequence !== expectedFirstSequence + index)) {
367
- throw new Error('Workroom journal segment sequence is not contiguous');
368
- }
369
- return events;
370
- }
371
- catch (error) {
372
- if (isMissingFile(error))
373
- return [];
374
- throw error;
375
- }
376
- }
377
- #digest(runId) {
378
- return createHash('sha256').update(runId).digest('hex');
379
- }
380
- #segmentPath(runId, firstSequence) {
381
- return join(this.#directory, `${this.#digest(runId)}.${String(firstSequence).padStart(16, '0')}.json`);
382
- }
383
- #requirePayloads() {
384
- if (!this.#payloads)
385
- throw new WorkroomJournalPayloadAuthorityUnavailableError();
386
- return this.#payloads;
387
- }
388
- }
389
- /** Candidate-owned latch: no caller can observe a placeholder journal. */
390
- export class ActivatableWorkroomJournal {
391
- #delegate = null;
392
- get active() {
393
- return this.#delegate !== null;
394
- }
395
- activate(delegate) {
396
- if (this.#delegate)
397
- throw new Error('Workroom journal is already active');
398
- this.#delegate = delegate;
399
- }
400
- listRunIds() {
401
- return this.#require().listRunIds();
402
- }
403
- scanStoredHeaders() {
404
- return this.#require().scanStoredHeaders();
405
- }
406
- readStoredHeaders(runId) {
407
- return this.#require().readStoredHeaders(runId);
408
- }
409
- verifyGovernedPayloadPublication(intent) {
410
- const delegate = this.#require();
411
- return delegate.verifyGovernedPayloadPublication
412
- ? delegate.verifyGovernedPayloadPublication(intent)
413
- : Promise.resolve(deepFreeze({ status: 'unknown' }));
414
- }
415
- read(runId) {
416
- return this.#require().read(runId);
417
- }
418
- append(runId, expectedSequence, events) {
419
- return this.#require().append(runId, expectedSequence, events);
420
- }
421
- #require() {
422
- if (!this.#delegate)
423
- throw new Error('Workroom journal is not active');
424
- return this.#delegate;
425
- }
426
- }
427
- export class DatabaseWorkroomJournal {
428
- #database;
429
- #eventModel;
430
- #payloads;
431
- constructor(database, eventModel, payloads) {
432
- this.#database = database;
433
- this.#eventModel = eventModel;
434
- this.#payloads = payloads;
435
- }
436
- async listRunIds() {
437
- return Object.freeze((await this.scanStoredHeaders()).map(run => run.runId));
438
- }
439
- async scanStoredHeaders() {
440
- const rows = await this.#eventModel.select().where({});
441
- return Object.freeze([...parseStoredRowGroups(rows).entries()]
442
- .map(([runId, events]) => storedRunHeaders(runId, events)));
443
- }
444
- async readStoredHeaders(runId) {
445
- const rows = await this.#eventModel.select().where({ run_id: runId });
446
- const events = parseStoredRows(runId, rows);
447
- return events.length === 0 ? null : storedRunHeaders(runId, events);
448
- }
449
- async verifyGovernedPayloadPublication(intent) {
450
- if (!intent.publicationScope)
451
- return deepFreeze({ status: 'missing' });
452
- const rows = await this.#eventModel.select().where({ run_id: intent.publicationScope });
453
- return verifyJournalPayloadPublication(intent, parseStoredRows(intent.publicationScope, rows));
454
- }
455
- async read(runId) {
456
- const rows = await this.#eventModel.select().where({ run_id: runId });
457
- const events = parseStoredRows(runId, rows);
458
- if (events.length === 0)
459
- return Object.freeze([]);
460
- await reconcileJournalPayloads(runId, events, this.#requirePayloads());
461
- return await materializeStoredEvents(events, this.#requirePayloads());
462
- }
463
- async append(runId, expectedSequence, drafts) {
464
- let publication;
465
- try {
466
- const appended = await this.#database.transaction(async (transaction) => {
467
- const allRows = await transaction.select('workroom_events').where({});
468
- await assertActiveStoreHasNoLegacyEmbeddedPayload({
469
- read: async () => legacyDatabaseJournalRecords(allRows),
470
- });
471
- const current = parseStoredRowGroups(allRows).get(runId) ?? Object.freeze([]);
472
- if (current.length > 0)
473
- await reconcileJournalPayloads(runId, current, this.#requirePayloads());
474
- const actualSequence = current.at(-1)?.sequence ?? -1;
475
- if (actualSequence !== expectedSequence) {
476
- throw new WorkroomSequenceConflictError(runId, expectedSequence, actualSequence);
477
- }
478
- if (drafts.length === 0)
479
- return [];
480
- const appended = materializeEvents(runId, expectedSequence, drafts);
481
- const projectId = projectIdForAppend(current, appended);
482
- const protectedEvents = await protectEvents(appended, projectId, this.#requirePayloads());
483
- await this.#requirePayloads().prepare?.({
484
- projectId,
485
- runId,
486
- receipts: collectGovernedPayloadReceipts(protectedEvents),
487
- });
488
- await transaction.insertMany('workroom_events', protectedEvents.map(toRow));
489
- publication = { projectId, protectedEvents, current };
490
- return appended;
491
- }, { isolationLevel: 'SERIALIZABLE' });
492
- if (publication) {
493
- await this.#requirePayloads().publish?.({
494
- projectId: publication.projectId,
495
- runId,
496
- receipts: collectGovernedPayloadReceipts(publication.protectedEvents),
497
- publicationDigest: journalPublicationDigest(runId, [...publication.current, ...publication.protectedEvents]),
498
- });
499
- }
500
- return appended;
501
- }
502
- catch (error) {
503
- if (error instanceof WorkroomSequenceConflictError)
504
- throw error;
505
- // A serializable/unique-key loser is dialect-specific. Re-read the
506
- // authoritative sequence and normalize only a proven concurrent winner;
507
- // unrelated database failures retain their original error.
508
- const actualSequence = (await this.read(runId)).at(-1)?.sequence ?? -1;
509
- if (actualSequence !== expectedSequence) {
510
- throw new WorkroomSequenceConflictError(runId, expectedSequence, actualSequence);
511
- }
512
- if (publication) {
513
- await this.#requirePayloads().abandon?.({
514
- projectId: publication.projectId,
515
- runId,
516
- receipts: collectGovernedPayloadReceipts(publication.protectedEvents),
517
- reason: 'write_failed',
518
- });
519
- }
520
- throw error;
521
- }
522
- }
523
- #requirePayloads() {
524
- if (!this.#payloads)
525
- throw new WorkroomJournalPayloadAuthorityUnavailableError();
526
- return this.#payloads;
527
- }
528
- }
529
- function legacyDatabaseJournalRecords(rows) {
530
- return Object.freeze(rows.map(row => {
531
- let envelope;
532
- try {
533
- envelope = JSON.parse(String(row.payload_json));
534
- }
535
- catch {
536
- throw new Error('Legacy Workroom Journal database payload is corrupt or unknown');
537
- }
538
- return Object.freeze({
539
- storage: 'database',
540
- sourceKind: 'journal',
541
- recordRef: `workroom-events:${digestCanonicalWorkroomValue({
542
- runId: String(row.run_id),
543
- sequence: row.sequence,
544
- })}`,
545
- value: Object.freeze({ version: row.version, envelope }),
546
- });
547
- }));
548
- }
549
- function materializeEvents(runId, expectedSequence, drafts) {
550
- if (!isNonEmptyString(runId) || !Number.isSafeInteger(expectedSequence) || expectedSequence < -1) {
551
- throw new Error('Invalid Workroom append position');
552
- }
553
- return Object.freeze(drafts.map((draft, index) => {
554
- if (!isNonEmptyString(draft.eventId) || !isFiniteNumber(draft.occurredAt)
555
- || !isWorkroomEventType(draft.type) || !isRecord(draft.payload)) {
556
- throw new Error('Invalid Workroom event draft');
557
- }
558
- validatePayload(draft.type, draft.payload, expectedSequence + index + 1);
559
- return Object.freeze({
560
- ...draft,
561
- version: 1,
562
- runId,
563
- sequence: expectedSequence + index + 1,
564
- payload: Object.freeze({ ...draft.payload }),
565
- });
566
- }));
567
- }
568
- function parseStoredEvents(values) {
569
- const events = values.map((value) => {
570
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
571
- throw new Error('Invalid Workroom journal event');
572
- }
573
- const raw = value;
574
- if (raw.version === 1 || raw.version === 2)
575
- throw legacyJournalPayloadError();
576
- assertExactRecordKeys(raw, [
577
- 'version', 'eventId', 'runId', 'sequence', 'occurredAt', 'type', 'control', 'payload',
578
- ], 'Stored Workroom event');
579
- const event = value;
580
- if (event.version !== 3 || !isNonEmptyString(event.eventId) || !isNonEmptyString(event.runId)
581
- || !isSequence(event.sequence) || !isFiniteNumber(event.occurredAt)
582
- || !isWorkroomEventType(event.type) || !isRecord(event.control) || !isRecord(event.payload)) {
583
- throw new Error('Invalid Workroom journal event');
584
- }
585
- validateStoredEventControl(event.type, event.control);
586
- validateProtectedPayload(event.type, event.payload);
587
- const sequence = Number(event.sequence);
588
- return Object.freeze({
589
- ...event,
590
- version: 3,
591
- eventId: event.eventId,
592
- runId: event.runId,
593
- sequence,
594
- occurredAt: event.occurredAt,
595
- type: event.type,
596
- control: deepFreeze({ ...event.control }),
597
- payload: Object.freeze({ ...event.payload }),
598
- });
599
- });
600
- return Object.freeze(events.sort((left, right) => left.sequence - right.sequence));
601
- }
602
- function isMissingFile(error) {
603
- return !!error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT';
604
- }
605
- function isSegmentName(name) {
606
- return /^[a-f0-9]{64}\.[0-9]{16}\.json$/u.test(name);
607
- }
608
- function isSegmentTemporaryName(name) {
609
- return /^[a-f0-9]{64}\.[0-9]{16}\.json\.[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}\.tmp$/u
610
- .test(name);
611
- }
612
- function segmentFirstSequence(name) {
613
- if (!isSegmentName(name))
614
- throw new Error('Invalid Workroom journal segment name');
615
- const value = Number(name.slice(65, 81));
616
- if (!Number.isSafeInteger(value) || value < 0) {
617
- throw new Error('Invalid Workroom journal segment first sequence');
618
- }
619
- return value;
620
- }
621
- function toRow(event) {
622
- const storedEventDigest = digestStoredWorkroomEvent(event);
623
- const row = {
624
- id: `${event.runId}:${event.sequence}`,
625
- run_id: event.runId,
626
- sequence: event.sequence,
627
- version: event.version,
628
- type: event.type,
629
- payload_json: canonicalWorkroomJson({
630
- eventId: event.eventId,
631
- control: event.control,
632
- payload: event.payload,
633
- }),
634
- occurred_at: event.occurredAt,
635
- stored_event_digest: storedEventDigest,
636
- };
637
- return { ...row, row_binding_digest: digestWorkroomEventRowBinding(row) };
638
- }
639
- function parseStoredRows(runId, rows) {
640
- const events = rows.map(row => {
641
- if (row.version === 1 || row.version === 2)
642
- throw legacyJournalPayloadError();
643
- if (!isDigest(row.stored_event_digest) || !isDigest(row.row_binding_digest)) {
644
- throw legacyJournalPayloadError();
645
- }
646
- if (row.version !== 3)
647
- throw new Error(`Unsupported Workroom event version: ${String(row.version)}`);
648
- let envelope;
649
- try {
650
- envelope = JSON.parse(String(row.payload_json));
651
- }
652
- catch {
653
- throw new Error('Invalid Workroom event payload JSON');
654
- }
655
- if (!envelope || !isNonEmptyString(envelope.eventId) || !isRecord(envelope.control)
656
- || !isRecord(envelope.payload)
657
- || !isSequence(row.sequence) || !isFiniteNumber(row.occurred_at)
658
- || !isWorkroomEventType(row.type)) {
659
- throw new Error('Invalid Workroom event payload envelope');
660
- }
661
- assertExactRecordKeys(envelope, ['eventId', 'control', 'payload'], 'Workroom event payload envelope');
662
- const expectedId = `${runId}:${Number(row.sequence)}`;
663
- if (row.id !== expectedId)
664
- throw new Error('Workroom event row id binding is invalid');
665
- if (String(row.payload_json) !== canonicalWorkroomJson(envelope)) {
666
- throw new Error('Workroom event payload JSON is not canonical');
667
- }
668
- validateStoredEventControl(row.type, envelope.control);
669
- validateProtectedPayload(row.type, envelope.payload);
670
- const event = Object.freeze({
671
- version: 3,
672
- eventId: envelope.eventId,
673
- runId,
674
- sequence: row.sequence,
675
- occurredAt: row.occurred_at,
676
- type: row.type,
677
- control: deepFreeze({ ...envelope.control }),
678
- payload: Object.freeze({ ...envelope.payload }),
679
- });
680
- if (row.stored_event_digest !== digestStoredWorkroomEvent(event)) {
681
- throw new Error('Workroom stored event digest mismatch');
682
- }
683
- if (row.row_binding_digest !== digestWorkroomEventRowBinding(row)) {
684
- throw new Error('Workroom event row binding digest mismatch');
685
- }
686
- return event;
687
- }).sort((left, right) => left.sequence - right.sequence);
688
- const stored = Object.freeze(events);
689
- if (stored.length > 0)
690
- assertStoredEventReceiptBindings(stored);
691
- return stored;
692
- }
693
- function parseStoredRowGroups(rows) {
694
- const rowGroups = new Map();
695
- for (const row of rows) {
696
- const runId = String(row.run_id ?? '');
697
- if (!isNonEmptyString(runId))
698
- throw new Error('Invalid Workroom event Run id');
699
- rowGroups.set(runId, [...(rowGroups.get(runId) ?? []), row]);
700
- }
701
- return new Map([...rowGroups.entries()]
702
- .sort(([left], [right]) => compareCanonicalWorkroomText(left, right))
703
- .map(([runId, runRows]) => [runId, parseStoredRows(runId, runRows)]));
704
- }
705
- export function digestStoredWorkroomEvent(event) {
706
- return digestCanonicalWorkroomValue({
707
- version: event.version,
708
- eventId: event.eventId,
709
- runId: event.runId,
710
- sequence: event.sequence,
711
- occurredAt: event.occurredAt,
712
- type: event.type,
713
- control: event.control,
714
- payload: event.payload,
715
- });
716
- }
717
- export function digestWorkroomEventRowBinding(row) {
718
- return digestCanonicalWorkroomValue({
719
- version: 1,
720
- id: row.id,
721
- runId: row.run_id,
722
- sequence: row.sequence,
723
- storedVersion: row.version,
724
- type: row.type,
725
- payloadJson: row.payload_json,
726
- occurredAt: row.occurred_at,
727
- storedEventDigest: row.stored_event_digest,
728
- });
729
- }
730
- function storedRunHeaders(runId, values) {
731
- if (!isNonEmptyString(runId) || values.length === 0
732
- || values.some((event, index) => event.runId !== runId || event.sequence !== index)) {
733
- throw new Error('Stored Workroom Journal header sequence or Run binding is invalid');
734
- }
735
- assertStoredEventReceiptBindings(values);
736
- const events = values.map((event) => {
737
- const protectedPayloadDigest = digestCanonicalWorkroomValue(event.payload);
738
- const body = deepFreeze({
739
- version: 1,
740
- eventRef: `workroom-event:${digestCanonicalWorkroomValue({
741
- runId, eventId: event.eventId, sequence: event.sequence,
742
- })}`,
743
- runId,
744
- sequence: event.sequence,
745
- occurredAt: event.occurredAt,
746
- type: event.type,
747
- control: event.control,
748
- protectedPayloadDigest,
749
- protectedReceipts: storedProtectedReceiptHeaders(event.payload),
750
- });
751
- return deepFreeze({ ...body, digest: digestCanonicalWorkroomValue(body) });
752
- });
753
- const body = deepFreeze({ version: 1, runId, events });
754
- return deepFreeze({ ...body, digest: digestCanonicalWorkroomValue(body) });
755
- }
756
- function deriveStoredEventControl(event) {
757
- const payload = event.payload;
758
- const taskKey = () => opaqueStoredRef('task', event.runId, storedHeaderText(payload, 'taskKey'));
759
- const assignmentId = () => opaqueStoredRef('assignment', event.runId, storedHeaderText(payload, 'assignmentId'));
760
- switch (event.type) {
761
- case 'run.created': return deepFreeze({ projectId: storedHeaderText(payload, 'projectId') });
762
- case 'task.planned': return deepFreeze({
763
- taskKey: taskKey(),
764
- required: payload.required === true,
765
- maxAttempts: storedHeaderPositiveInteger(payload, 'maxAttempts'),
766
- });
767
- case 'task.blocked': return deepFreeze({
768
- taskKey: taskKey(),
769
- blockerId: opaqueStoredRef('blocker', event.runId, storedHeaderText(payload, 'blockerId')),
770
- blockerKind: storedHeaderBlockerKind(payload.kind),
771
- blockerDeadline: storedHeaderNonNegativeInteger(payload, 'deadline'),
772
- blockerAllowedActions: Object.freeze(['resolve', 'replan', 'cancel']),
773
- });
774
- case 'task.blocker_resolved': return deepFreeze({
775
- taskKey: taskKey(),
776
- blockerId: opaqueStoredRef('blocker', event.runId, storedHeaderText(payload, 'blockerId')),
777
- });
778
- case 'assignment.claimed': return deepFreeze({
779
- taskKey: taskKey(),
780
- assignmentId: assignmentId(),
781
- role: storedHeaderRole(payload.role),
782
- attempt: storedHeaderPositiveInteger(payload, 'attempt'),
783
- assignmentRevision: storedHeaderPositiveInteger(payload, 'assignmentRevision'),
784
- fence: storedHeaderPositiveInteger(payload, 'fence'),
785
- });
786
- case 'assignment.started':
787
- case 'assignment.progress':
788
- case 'assignment.heartbeat':
789
- case 'assignment.checkpointed':
790
- case 'assignment.checkpoint_requested':
791
- case 'assignment.preempted':
792
- case 'assignment.execution_completed':
793
- case 'assignment.cancel_requested':
794
- case 'assignment.lease_expired': return deepFreeze({ assignmentId: assignmentId() });
795
- case 'assignment.cancelled': return deepFreeze({
796
- assignmentId: assignmentId(), outcome: storedHeaderOutcome(payload.outcome),
797
- });
798
- case 'task.accepted':
799
- case 'task.acceptance_pinned':
800
- case 'task.acceptance_blocked':
801
- case 'task.cancel_requested':
802
- case 'task.cancelled':
803
- case 'task.failed':
804
- case 'task.rework_requested': return deepFreeze({ taskKey: taskKey() });
805
- case 'task.revised': return deepFreeze({
806
- taskKey: taskKey(), maxAttempts: storedHeaderPositiveInteger(payload, 'maxAttempts'),
807
- });
808
- case 'task.plan_revised': return deepFreeze({
809
- taskKey: taskKey(), required: payload.required === true,
810
- maxAttempts: storedHeaderPositiveInteger(payload, 'maxAttempts'),
811
- newTaskRevision: storedHeaderPositiveInteger(payload, 'newTaskRevision'),
812
- });
813
- case 'reviewer.assigned': {
814
- const assignment = storedHeaderRecord(payload, 'assignment');
815
- return deepFreeze({
816
- taskKey: taskKey(),
817
- waitId: opaqueStoredRef('reviewer', event.runId, storedHeaderText(assignment, 'id')),
818
- waitStatus: storedHeaderText(assignment, 'status'),
819
- });
820
- }
821
- case 'reviewer.claimed':
822
- case 'reviewer.verdict_recorded':
823
- case 'reviewer.expired': return deepFreeze({
824
- taskKey: taskKey(),
825
- waitId: opaqueStoredRef('reviewer', event.runId, storedHeaderText(payload, 'assignmentId')),
826
- ...(event.type === 'reviewer.verdict_recorded'
827
- ? { verdictOutcome: payload.outcome === 'passed' ? 'passed' : 'rework' }
828
- : {}),
829
- });
830
- case 'sponsor_gate.opened': {
831
- const gate = storedHeaderRecord(payload, 'gate');
832
- return deepFreeze({
833
- taskKey: taskKey(),
834
- waitId: opaqueStoredRef('sponsor-gate', event.runId, storedHeaderText(gate, 'id')),
835
- waitStatus: storedHeaderText(gate, 'status'),
836
- });
837
- }
838
- case 'sponsor_gate.decided': return deepFreeze({
839
- taskKey: taskKey(),
840
- waitId: opaqueStoredRef('sponsor-gate', event.runId, storedHeaderText(payload, 'gateId')),
841
- decision: storedHeaderDecision(payload.decision),
842
- });
843
- case 'sponsor_gate.expired': return deepFreeze({
844
- taskKey: taskKey(),
845
- waitId: opaqueStoredRef('sponsor-gate', event.runId, storedHeaderText(payload, 'gateId')),
846
- });
847
- default: return Object.freeze({});
848
- }
849
- }
850
- const WORKROOM_EVENT_CONTROL_KEYS = Object.freeze({
851
- 'run.created': ['projectId'],
852
- 'task.planned': ['taskKey', 'required', 'maxAttempts'],
853
- 'task.blocked': [
854
- 'taskKey', 'blockerId', 'blockerKind', 'blockerDeadline', 'blockerAllowedActions',
855
- ],
856
- 'task.blocker_resolved': ['taskKey', 'blockerId'],
857
- 'assignment.claimed': [
858
- 'taskKey', 'assignmentId', 'role', 'attempt', 'assignmentRevision', 'fence',
859
- ],
860
- 'assignment.started': ['assignmentId'],
861
- 'assignment.progress': ['assignmentId'],
862
- 'assignment.heartbeat': ['assignmentId'],
863
- 'assignment.checkpointed': ['assignmentId'],
864
- 'assignment.checkpoint_requested': ['assignmentId'],
865
- 'assignment.preempted': ['assignmentId'],
866
- 'assignment.execution_completed': ['assignmentId'],
867
- 'assignment.cancel_requested': ['assignmentId'],
868
- 'assignment.cancelled': ['assignmentId', 'outcome'],
869
- 'assignment.lease_expired': ['assignmentId'],
870
- 'task.accepted': ['taskKey'],
871
- 'task.acceptance_pinned': ['taskKey'],
872
- 'task.acceptance_blocked': ['taskKey'],
873
- 'task.cancel_requested': ['taskKey'],
874
- 'task.cancelled': ['taskKey'],
875
- 'task.failed': ['taskKey'],
876
- 'task.rework_requested': ['taskKey'],
877
- 'task.revised': ['taskKey', 'maxAttempts'],
878
- 'task.plan_revised': ['taskKey', 'required', 'maxAttempts', 'newTaskRevision'],
879
- 'reviewer.assigned': ['taskKey', 'waitId', 'waitStatus'],
880
- 'reviewer.claimed': ['taskKey', 'waitId'],
881
- 'reviewer.verdict_recorded': ['taskKey', 'waitId', 'verdictOutcome'],
882
- 'reviewer.expired': ['taskKey', 'waitId'],
883
- 'sponsor_gate.opened': ['taskKey', 'waitId', 'waitStatus'],
884
- 'sponsor_gate.decided': ['taskKey', 'waitId', 'decision'],
885
- 'sponsor_gate.expired': ['taskKey', 'waitId'],
886
- 'plan.admitted': [],
887
- 'plan.revision_applied': [],
888
- 'plan_gate.decided': [],
889
- 'run.control_decided': [],
890
- 'run.replan_requested': [],
891
- 'run.cancel_requested': [],
892
- 'run.cancelled': [],
893
- 'scheduler.dispatch_requested': [],
894
- 'scheduler.priority_changed': [],
895
- 'scheduler.preemption_requested': [],
896
- 'scheduler.preemption_checkpoint_acknowledged': [],
897
- 'scheduler.preemption_timed_out': [],
898
- 'local_execution.requested': [],
899
- 'remote_dispatch.requested': [],
900
- 'clock.advanced': [],
901
- });
902
- function validateStoredEventControl(type, control) {
903
- const keys = type === 'task.blocked' && Object.keys(control).length === 2
904
- ? ['taskKey', 'blockerId']
905
- : WORKROOM_EVENT_CONTROL_KEYS[type];
906
- assertExactRecordKeys(control, keys, 'Stored Workroom control');
907
- if (control.projectId !== undefined)
908
- storedHeaderText(control, 'projectId');
909
- for (const key of ['taskKey', 'assignmentId', 'blockerId', 'waitId']) {
910
- if (control[key] !== undefined && (typeof control[key] !== 'string'
911
- || !/^workroom-[a-z-]+:[a-f0-9]{64}$/u.test(control[key]))) {
912
- throw new Error(`Stored Workroom control ${key} is invalid`);
913
- }
914
- }
915
- for (const key of ['maxAttempts', 'attempt', 'assignmentRevision', 'fence', 'newTaskRevision']) {
916
- if (control[key] !== undefined)
917
- storedHeaderPositiveInteger(control, key);
918
- }
919
- if (control.required !== undefined && typeof control.required !== 'boolean') {
920
- throw new Error('Stored Workroom control required is invalid');
921
- }
922
- if (control.blockerKind !== undefined)
923
- storedHeaderBlockerKind(control.blockerKind);
924
- if (control.blockerDeadline !== undefined) {
925
- storedHeaderNonNegativeInteger(control, 'blockerDeadline');
926
- }
927
- if (control.blockerAllowedActions !== undefined) {
928
- storedHeaderBlockerActions(control.blockerAllowedActions);
929
- }
930
- if (control.role !== undefined)
931
- storedHeaderRole(control.role);
932
- if (control.outcome !== undefined)
933
- storedHeaderOutcome(control.outcome);
934
- if (control.decision !== undefined)
935
- storedHeaderDecision(control.decision);
936
- if (control.verdictOutcome !== undefined
937
- && control.verdictOutcome !== 'passed' && control.verdictOutcome !== 'rework') {
938
- throw new Error('Stored Workroom control verdict outcome is invalid');
939
- }
940
- if (control.waitStatus !== undefined && ![
941
- 'open', 'claimed', 'passed', 'rework', 'expired', 'cancelled', 'satisfied', 'stale',
942
- ].includes(String(control.waitStatus))) {
943
- throw new Error('Stored Workroom control wait status is invalid');
944
- }
945
- }
946
- function storedProtectedReceiptHeaders(value) {
947
- const headers = [];
948
- const visit = (candidate) => {
949
- if (isGovernedJournalPayloadReference(candidate)) {
950
- headers.push(deepFreeze({
951
- fieldPath: candidate.fieldPath,
952
- contentHash: candidate.contentHash,
953
- descriptorDigest: candidate.receipt.descriptor.descriptorDigest,
954
- sourceDigest: candidate.receipt.source.digest,
955
- sourceBindingDigest: candidate.receipt.source.bindingDigest,
956
- }));
957
- return;
958
- }
959
- if (Array.isArray(candidate)) {
960
- for (const item of candidate)
961
- visit(item);
962
- return;
963
- }
964
- if (isRecord(candidate))
965
- for (const item of Object.values(candidate))
966
- visit(item);
967
- };
968
- visit(value);
969
- return deepFreeze(headers.sort((left, right) => compareCanonicalWorkroomText(left.fieldPath, right.fieldPath)));
970
- }
971
- function opaqueStoredRef(kind, runId, rawId) {
972
- return `workroom-${kind}:${digestCanonicalWorkroomValue({ kind, runId, rawId }).slice('sha256:'.length)}`;
973
- }
974
- function storedHeaderText(payload, key) {
975
- const value = payload[key];
976
- if (!isNonEmptyString(value))
977
- throw new Error(`Stored Workroom header ${key} is invalid`);
978
- return value;
979
- }
980
- function storedHeaderPositiveInteger(payload, key) {
981
- const value = payload[key];
982
- if (!Number.isSafeInteger(value) || Number(value) < 1) {
983
- throw new Error(`Stored Workroom header ${key} is invalid`);
984
- }
985
- return Number(value);
986
- }
987
- function storedHeaderNonNegativeInteger(payload, key) {
988
- const value = payload[key];
989
- if (!Number.isSafeInteger(value) || Number(value) < 0) {
990
- throw new Error(`Stored Workroom header ${key} is invalid`);
991
- }
992
- return Number(value);
993
- }
994
- function storedHeaderBlockerKind(value) {
995
- if (value !== 'dependency' && value !== 'approval' && value !== 'capability'
996
- && value !== 'external' && value !== 'human_input') {
997
- throw new Error('Stored Workroom header Blocker kind is invalid');
998
- }
999
- return value;
1000
- }
1001
- function storedHeaderBlockerActions(value) {
1002
- if (!Array.isArray(value)
1003
- || canonicalWorkroomJson(value) !== canonicalWorkroomJson(['resolve', 'replan', 'cancel'])) {
1004
- throw new Error('Stored Workroom header Blocker allowedActions are invalid');
1005
- }
1006
- return Object.freeze([...value]);
1007
- }
1008
- function storedHeaderRecord(payload, key) {
1009
- const value = payload[key];
1010
- if (!isRecord(value))
1011
- throw new Error(`Stored Workroom header ${key} is invalid`);
1012
- return value;
1013
- }
1014
- function storedHeaderRole(value) {
1015
- if (value !== 'executor' && value !== 'reviewer' && value !== 'integration') {
1016
- throw new Error('Stored Workroom header Assignment role is invalid');
1017
- }
1018
- return value;
1019
- }
1020
- function storedHeaderOutcome(value) {
1021
- if (value !== 'interrupted' && value !== 'committed' && value !== 'outcome_unknown') {
1022
- throw new Error('Stored Workroom header Assignment outcome is invalid');
1023
- }
1024
- return value;
1025
- }
1026
- function storedHeaderDecision(value) {
1027
- if (value !== 'approve' && value !== 'reject' && value !== 'request_changes' && value !== 'cancel') {
1028
- throw new Error('Stored Workroom header Sponsor decision is invalid');
1029
- }
1030
- return value;
1031
- }
1032
- async function protectEvents(events, projectId, payloads) {
1033
- return Object.freeze(await Promise.all(events.map(async (event) => Object.freeze({
1034
- ...event,
1035
- version: 3,
1036
- control: deriveStoredEventControl(event),
1037
- payload: await protectValue(event.payload, '$.payload', event, projectId, payloads),
1038
- }))));
1039
- }
1040
- async function protectValue(value, fieldPath, event, projectId, payloads) {
1041
- if (Array.isArray(value)) {
1042
- return Object.freeze(await Promise.all(value.map((item, index) => protectValue(item, `${fieldPath}[${index}]`, event, projectId, payloads))));
1043
- }
1044
- if (!isRecord(value))
1045
- return value;
1046
- const entries = [];
1047
- for (const [key, child] of Object.entries(value)) {
1048
- const path = `${fieldPath}.${key}`;
1049
- if (!isContentFreeJournalValue(event.type, path, child) && containsGovernedValue(child)) {
1050
- const contentHash = digestCanonicalWorkroomValue(child);
1051
- const source = journalPayloadSource(event, path, contentHash);
1052
- const receipt = await payloads.write({
1053
- projectId,
1054
- runId: event.runId,
1055
- eventId: event.eventId,
1056
- eventType: event.type,
1057
- fieldPath: path,
1058
- value: structuredClone(child),
1059
- contentHash,
1060
- source,
1061
- });
1062
- assertJournalPayloadReceipt(receipt, createWorkroomJournalPayloadObjectId({
1063
- projectId,
1064
- runId: event.runId,
1065
- eventId: event.eventId,
1066
- eventType: event.type,
1067
- fieldPath: path,
1068
- contentHash,
1069
- }), contentHash, source);
1070
- entries.push([key, Object.freeze({
1071
- version: 1,
1072
- kind: 'governed_workroom_journal_payload',
1073
- fieldPath: path,
1074
- contentHash,
1075
- receipt,
1076
- })]);
1077
- continue;
1078
- }
1079
- entries.push([key, await protectValue(child, path, event, projectId, payloads)]);
1080
- }
1081
- return Object.freeze(Object.fromEntries(entries));
1082
- }
1083
- async function materializeStoredEvents(events, payloads) {
1084
- assertStoredEventReceiptBindings(events);
1085
- const projectId = storedProjectId(events);
1086
- const materialized = await Promise.all(events.map(async (event) => {
1087
- const payload = await materializeValue(event.payload, '$.payload', event, projectId, payloads);
1088
- if (!isRecord(payload))
1089
- throw new Error('Materialized Workroom Journal payload is invalid');
1090
- validatePayload(event.type, payload, event.sequence);
1091
- const derivedControl = deriveStoredEventControl({ ...event, version: 1, payload });
1092
- const comparableControl = event.type === 'task.blocked'
1093
- && Object.keys(event.control).length === 2
1094
- ? Object.freeze({ taskKey: derivedControl.taskKey, blockerId: derivedControl.blockerId })
1095
- : derivedControl;
1096
- if (canonicalWorkroomJson(event.control) !== canonicalWorkroomJson(comparableControl)) {
1097
- throw new Error('Stored Workroom control projection does not match the governed payload');
1098
- }
1099
- const { control: _control, ...eventHeader } = event;
1100
- return Object.freeze({
1101
- ...eventHeader,
1102
- version: 1,
1103
- payload: Object.freeze({ ...payload }),
1104
- });
1105
- }));
1106
- return Object.freeze(materialized);
1107
- }
1108
- async function reconcileJournalPayloads(runId, events, payloads) {
1109
- if (!payloads.reconcile || events.length === 0)
1110
- return;
1111
- await payloads.reconcile({
1112
- projectId: storedProjectId(events),
1113
- runId,
1114
- receipts: collectGovernedPayloadReceipts(events),
1115
- publicationDigest: journalPublicationDigest(runId, events),
1116
- });
1117
- }
1118
- function journalPublicationDigest(runId, events) {
1119
- return digestCanonicalWorkroomValue({
1120
- version: 1,
1121
- runId,
1122
- eventHeaders: events.map(event => ({
1123
- eventId: event.eventId,
1124
- sequence: event.sequence,
1125
- type: event.type,
1126
- control: event.control,
1127
- payload: event.payload,
1128
- })),
1129
- });
1130
- }
1131
- function verifyJournalPayloadPublication(intent, events) {
1132
- if (intent.consumer !== 'journal_header')
1133
- return deepFreeze({ status: 'unknown' });
1134
- const runId = intent.publicationScope;
1135
- if (!runId || events.length === 0 || events.some(event => event.runId !== runId)) {
1136
- return deepFreeze({ status: 'missing' });
1137
- }
1138
- const exact = collectGovernedPayloadReceipts(events).some(receipt => receipt.descriptor.objectId === intent.objectId
1139
- && receipt.descriptor.payloadHash === intent.payloadHash
1140
- && receipt.descriptor.descriptorDigest === intent.descriptorDigest
1141
- && receipt.source.bindingDigest === intent.sourceBindingDigest);
1142
- return exact
1143
- ? deepFreeze({
1144
- status: 'exact',
1145
- publicationDigest: journalPublicationDigest(runId, events),
1146
- })
1147
- : deepFreeze({ status: 'missing' });
1148
- }
1149
- function collectGovernedPayloadReceipts(events) {
1150
- const receipts = [];
1151
- const visit = (value) => {
1152
- if (isGovernedJournalPayloadReference(value)) {
1153
- receipts.push(value.receipt);
1154
- return;
1155
- }
1156
- if (Array.isArray(value)) {
1157
- for (const item of value)
1158
- visit(item);
1159
- return;
1160
- }
1161
- if (isRecord(value)) {
1162
- for (const item of Object.values(value))
1163
- visit(item);
1164
- }
1165
- };
1166
- for (const event of events)
1167
- visit(event.payload);
1168
- return Object.freeze(receipts);
1169
- }
1170
- async function materializeValue(value, fieldPath, event, projectId, payloads) {
1171
- if (isGovernedJournalPayloadReference(value)) {
1172
- if (value.fieldPath !== fieldPath)
1173
- throw new Error('Governed Workroom Journal payload field binding drift');
1174
- const source = journalPayloadSource(event, fieldPath, value.contentHash);
1175
- assertJournalPayloadReceipt(value.receipt, createWorkroomJournalPayloadObjectId({
1176
- projectId,
1177
- runId: event.runId,
1178
- eventId: event.eventId,
1179
- eventType: event.type,
1180
- fieldPath,
1181
- contentHash: value.contentHash,
1182
- }), value.contentHash, source);
1183
- const materialized = await payloads.read({
1184
- projectId,
1185
- runId: event.runId,
1186
- eventId: event.eventId,
1187
- eventType: event.type,
1188
- fieldPath,
1189
- contentHash: value.contentHash,
1190
- receipt: value.receipt,
1191
- purpose: 'kernel-replay',
1192
- });
1193
- if (digestCanonicalWorkroomValue(materialized) !== value.contentHash) {
1194
- throw new Error('Governed Workroom Journal payload content hash mismatch');
1195
- }
1196
- if (Buffer.byteLength(canonicalWorkroomJson(materialized)) !== value.receipt.descriptor.bytes) {
1197
- throw new Error('Governed Workroom Journal payload byte length mismatch');
1198
- }
1199
- return materialized;
1200
- }
1201
- if (Array.isArray(value)) {
1202
- return Object.freeze(await Promise.all(value.map((item, index) => materializeValue(item, `${fieldPath}[${index}]`, event, projectId, payloads))));
1203
- }
1204
- if (!isRecord(value))
1205
- return value;
1206
- return Object.freeze(Object.fromEntries(await Promise.all(Object.entries(value).map(async ([key, child]) => [
1207
- key,
1208
- await materializeValue(child, `${fieldPath}.${key}`, event, projectId, payloads),
1209
- ]))));
1210
- }
1211
- function projectIdForAppend(current, appended) {
1212
- if (current.length > 0)
1213
- return storedProjectId(current);
1214
- const created = appended[0];
1215
- if (!created || created.type !== 'run.created' || !isNonEmptyString(created.payload.projectId)) {
1216
- throw new Error('Workroom Journal first append must begin with a Project-bound run.created event');
1217
- }
1218
- return created.payload.projectId;
1219
- }
1220
- function storedProjectId(events) {
1221
- const created = events[0];
1222
- if (!created || created.type !== 'run.created' || !isNonEmptyString(created.payload.projectId)) {
1223
- throw new Error('Stored Workroom Journal has no Project-bound run.created header');
1224
- }
1225
- return created.payload.projectId;
1226
- }
1227
- function journalPayloadSource(event, fieldPath, contentHash) {
1228
- const ref = `workroom-journal-event:${event.runId}:${event.eventId}:${fieldPath}`;
1229
- const sourceBody = Object.freeze({
1230
- version: 1,
1231
- runId: event.runId,
1232
- eventId: event.eventId,
1233
- eventType: event.type,
1234
- fieldPath,
1235
- contentHash,
1236
- });
1237
- const sourceDigest = digestCanonicalWorkroomValue(sourceBody);
1238
- return Object.freeze({
1239
- ref,
1240
- digest: sourceDigest,
1241
- bindingDigest: digestCanonicalWorkroomValue({ ref, sourceDigest, ...sourceBody }),
1242
- });
1243
- }
1244
- function assertJournalPayloadReceipt(receipt, objectId, contentHash, source) {
1245
- if (!receipt || !isRecord(receipt.descriptor) || !isRecord(receipt.source)
1246
- || !isNonEmptyString(receipt.descriptor.vaultObjectId)
1247
- || receipt.descriptor.objectId !== objectId
1248
- || receipt.descriptor.payloadHash !== contentHash
1249
- || !isDigest(receipt.descriptor.descriptorDigest)
1250
- || !isDigest(receipt.descriptor.locationManifestDigest)
1251
- || !Number.isSafeInteger(receipt.descriptor.bytes) || Number(receipt.descriptor.bytes) < 0
1252
- || receipt.source.kind !== 'command'
1253
- || receipt.source.ref !== source.ref
1254
- || receipt.source.digest !== source.digest
1255
- || receipt.source.bindingDigest !== source.bindingDigest
1256
- || receipt.source.verification !== 'verified') {
1257
- throw new Error('Governed Workroom Journal payload receipt is forged or incomplete');
1258
- }
1259
- }
1260
- function assertStoredEventReceiptBindings(events) {
1261
- if (events.length === 0)
1262
- return;
1263
- const projectId = storedProjectId(events);
1264
- const visit = (value, fieldPath, event) => {
1265
- if (isGovernedJournalPayloadReference(value)) {
1266
- if (value.fieldPath !== fieldPath) {
1267
- throw new Error('Governed Workroom Journal payload field binding drift');
1268
- }
1269
- const source = journalPayloadSource(event, fieldPath, value.contentHash);
1270
- assertJournalPayloadReceipt(value.receipt, createWorkroomJournalPayloadObjectId({
1271
- projectId,
1272
- runId: event.runId,
1273
- eventId: event.eventId,
1274
- eventType: event.type,
1275
- fieldPath,
1276
- contentHash: value.contentHash,
1277
- }), value.contentHash, source);
1278
- return;
1279
- }
1280
- if (Array.isArray(value)) {
1281
- value.forEach((item, index) => visit(item, `${fieldPath}[${index}]`, event));
1282
- return;
1283
- }
1284
- if (isRecord(value)) {
1285
- for (const [key, child] of Object.entries(value)) {
1286
- visit(child, `${fieldPath}.${key}`, event);
1287
- }
1288
- }
1289
- };
1290
- for (const event of events)
1291
- visit(event.payload, '$.payload', event);
1292
- }
1293
- export function createWorkroomJournalPayloadObjectId(input) {
1294
- return `workroom-journal-payload:${digestCanonicalWorkroomValue({
1295
- projectId: input.projectId,
1296
- runId: input.runId,
1297
- eventId: input.eventId,
1298
- eventType: input.eventType,
1299
- fieldPath: input.fieldPath,
1300
- contentHash: input.contentHash,
1301
- })}`;
1302
- }
1303
- function isGovernedJournalPayloadReference(value) {
1304
- if (!isRecord(value) || value.version !== 1 || value.kind !== 'governed_workroom_journal_payload'
1305
- || !isNonEmptyString(value.fieldPath) || !isDigest(value.contentHash)
1306
- || !isRecord(value.receipt))
1307
- return false;
1308
- const keys = Object.keys(value).sort();
1309
- return keys.length === 5
1310
- && ['contentHash', 'fieldPath', 'kind', 'receipt', 'version'].every((key, index) => keys[index] === key);
1311
- }
1312
- function validateProtectedPayload(type, payload) {
1313
- assertAllowedPayloadKeys(type, payload);
1314
- const visit = (value, fieldPath) => {
1315
- if (isGovernedJournalPayloadReference(value)) {
1316
- if (value.fieldPath !== fieldPath)
1317
- throw new Error('Governed Workroom Journal payload path is invalid');
1318
- return;
1319
- }
1320
- if (Array.isArray(value)) {
1321
- value.forEach((item, index) => visit(item, `${fieldPath}[${index}]`));
1322
- return;
1323
- }
1324
- if (!isRecord(value))
1325
- return;
1326
- for (const [key, child] of Object.entries(value)) {
1327
- if (!isContentFreeJournalValue(type, `${fieldPath}.${key}`, child) && containsGovernedValue(child)
1328
- && !isGovernedJournalPayloadReference(child)) {
1329
- throw legacyJournalPayloadError();
1330
- }
1331
- visit(child, `${fieldPath}.${key}`);
1332
- }
1333
- };
1334
- visit(payload, '$.payload');
1335
- }
1336
- function isContentFreeJournalValue(type, fieldPath, value) {
1337
- if (value === undefined || value === null || value === '')
1338
- return true;
1339
- if (typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value)))
1340
- return true;
1341
- if (typeof value !== 'string')
1342
- return false;
1343
- if (type === 'run.created' && fieldPath === '$.payload.projectId')
1344
- return true;
1345
- return isDigest(value);
1346
- }
1347
- function containsGovernedValue(value) {
1348
- if (value === undefined || value === null || value === '')
1349
- return false;
1350
- if (Array.isArray(value))
1351
- return value.length > 0;
1352
- return typeof value !== 'object' || Object.keys(value).length > 0;
1353
- }
1354
- function legacyJournalPayloadError() {
1355
- return new LegacyEmbeddedPayloadDetectedError('Legacy embedded Workroom Journal payload is quarantined; use offline export/purge verification before activation');
1356
- }
1357
- function isDigest(value) {
1358
- return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/u.test(value);
1359
- }
1360
- const WORKROOM_EVENT_TYPES = new Set([
1361
- 'run.created', 'run.control_decided', 'run.replan_requested',
1362
- 'run.cancel_requested', 'run.cancelled', 'plan.admitted', 'plan_gate.decided',
1363
- 'plan.revision_applied',
1364
- 'task.planned', 'task.blocked', 'task.blocker_resolved',
1365
- 'task.cancel_requested', 'task.cancelled', 'task.failed',
1366
- 'task.accepted', 'task.acceptance_pinned', 'task.acceptance_blocked', 'task.rework_requested', 'task.revised',
1367
- 'task.plan_revised',
1368
- 'reviewer.assigned', 'reviewer.claimed', 'reviewer.verdict_recorded', 'reviewer.expired',
1369
- 'sponsor_gate.opened', 'sponsor_gate.decided', 'sponsor_gate.expired',
1370
- 'assignment.claimed', 'assignment.started', 'assignment.heartbeat',
1371
- 'assignment.progress', 'assignment.checkpointed',
1372
- 'assignment.checkpoint_requested', 'assignment.preempted',
1373
- 'assignment.execution_completed', 'assignment.cancel_requested',
1374
- 'assignment.cancelled', 'assignment.lease_expired',
1375
- 'scheduler.dispatch_requested', 'scheduler.priority_changed', 'scheduler.preemption_requested',
1376
- 'scheduler.preemption_checkpoint_acknowledged', 'scheduler.preemption_timed_out',
1377
- 'local_execution.requested',
1378
- 'remote_dispatch.requested', 'clock.advanced',
1379
- ]);
1380
- function isWorkroomEventType(value) {
1381
- return typeof value === 'string' && WORKROOM_EVENT_TYPES.has(value);
1382
- }
1383
- /**
1384
- * Closed top-level schema for every persisted Kernel fact. Values not listed
1385
- * here are rejected before either the Journal header or Payload Vault is
1386
- * written, so adding a future field requires an explicit governance choice.
1387
- */
1388
- const WORKROOM_EVENT_PAYLOAD_KEYS = Object.freeze({
1389
- 'run.created': ['projectId', 'title'],
1390
- 'run.control_decided': [
1391
- 'operationId', 'action', 'reasonCode', 'expectedSequence', 'principalId', 'requestDigest',
1392
- 'catalogRevision', 'projectDigest', 'authorizationRef',
1393
- 'stateSequence', 'stateStatus', 'stateDigest',
1394
- ],
1395
- 'run.replan_requested': ['operationId', 'reasonCode', 'requestDigest'],
1396
- 'run.cancel_requested': ['reason'],
1397
- 'run.cancelled': ['reason'],
1398
- 'plan.admitted': [
1399
- 'operationId', 'sourceEventRef', 'sourceEventDigest', 'orchestratorAgentDefinitionId',
1400
- 'plan', 'schedulerPolicy',
1401
- ],
1402
- 'plan.revision_applied': ['candidate', 'planRevision', 'recomputedDiffDigest'],
1403
- 'plan_gate.decided': [
1404
- 'operationId', 'requestDigest', 'taskKey', 'taskRevision', 'gateId', 'planDigest',
1405
- 'policyRevisionId', 'policyDigest', 'decision', 'sponsorPrincipalId', 'authorizedBy',
1406
- 'reasonDigest',
1407
- ],
1408
- 'task.planned': [
1409
- 'type', 'taskKey', 'title', 'required', 'maxAttempts', 'role', 'dependsOn', 'requires',
1410
- 'sponsorLane', 'localRank', 'deadline', 'enqueuedAt', 'preemptibility', 'approvalGate',
1411
- ],
1412
- 'task.blocked': [
1413
- 'type', 'taskKey', 'blockerId', 'kind', 'owner', 'reason', 'deadline', 'allowedActions',
1414
- ],
1415
- 'task.blocker_resolved': ['type', 'taskKey', 'blockerId'],
1416
- 'task.cancel_requested': ['taskKey', 'reason'],
1417
- 'task.cancelled': ['taskKey', 'reason'],
1418
- 'task.failed': ['taskKey', 'reason'],
1419
- 'task.accepted': ['taskKey', 'reportRef', 'record'],
1420
- 'task.acceptance_pinned': ['taskKey', 'contract'],
1421
- 'task.acceptance_blocked': ['taskKey', 'reportRef', 'reason', 'evaluation'],
1422
- 'task.rework_requested': ['type', 'taskKey', 'reason', 'evaluation'],
1423
- 'task.revised': ['type', 'taskKey', 'title', 'reason', 'maxAttempts'],
1424
- 'task.plan_revised': [
1425
- 'taskKey', 'title', 'required', 'maxAttempts', 'role', 'dependsOn', 'requires',
1426
- 'sponsorLane', 'localRank', 'deadline', 'enqueuedAt', 'preemptibility', 'approvalGate',
1427
- 'expectedTaskRevision', 'newTaskRevision', 'reason',
1428
- ],
1429
- 'reviewer.assigned': ['taskKey', 'reason', 'assignment'],
1430
- 'reviewer.claimed': [
1431
- 'taskKey', 'assignmentId', 'reviewerPrincipalId', 'authorizedBy', 'authorization',
1432
- ],
1433
- 'reviewer.verdict_recorded': [
1434
- 'taskKey', 'assignmentId', 'reviewerPrincipalId', 'authorizedBy', 'outcome',
1435
- 'verdict', 'authorization',
1436
- ],
1437
- 'reviewer.expired': ['taskKey', 'assignmentId'],
1438
- 'sponsor_gate.opened': ['taskKey', 'reason', 'gate'],
1439
- 'sponsor_gate.decided': [
1440
- 'taskKey', 'gateId', 'sponsorPrincipalId', 'authorizedBy', 'reason', 'candidateHash',
1441
- 'decision', 'authorization',
1442
- ],
1443
- 'sponsor_gate.expired': ['taskKey', 'gateId'],
1444
- 'assignment.claimed': [
1445
- 'type', 'taskKey', 'assignmentId', 'owner', 'role', 'taskRevision', 'attempt',
1446
- 'assignmentRevision', 'fence', 'envelopeDigest', 'leaseExpiresAt',
1447
- ],
1448
- 'assignment.started': ['assignmentId'],
1449
- 'assignment.progress': [
1450
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest', 'progress',
1451
- ],
1452
- 'assignment.heartbeat': [
1453
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest', 'leaseExpiresAt',
1454
- ],
1455
- 'assignment.checkpointed': [
1456
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest',
1457
- 'checkpointRef', 'checkpointDigest',
1458
- ],
1459
- 'assignment.checkpoint_requested': [
1460
- 'decisionId', 'assignmentId', 'envelopeDigest', 'reservedTaskKey', 'requestedAt',
1461
- 'deadline', 'takeoverFence', 'owner', 'allowedSuccessors',
1462
- ],
1463
- 'assignment.preempted': [
1464
- 'decisionId', 'assignmentId', 'checkpointRef', 'checkpointDigest', 'outcome',
1465
- ],
1466
- 'assignment.execution_completed': [
1467
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest', 'reportRef',
1468
- 'reportDigest', 'candidateRef', 'candidateHash', 'completionReceiptDigest',
1469
- ],
1470
- 'assignment.cancel_requested': ['assignmentId', 'controlDeadline'],
1471
- 'assignment.cancelled': ['assignmentId', 'outcome'],
1472
- 'assignment.lease_expired': ['assignmentId'],
1473
- 'scheduler.dispatch_requested': [
1474
- 'version', 'type', 'decisionId', 'digest', 'projectId', 'runId', 'expectedSequence',
1475
- 'taskKey', 'taskRevision', 'role', 'sponsorLane', 'reason', 'policy',
1476
- ],
1477
- 'scheduler.priority_changed': [
1478
- 'version', 'type', 'proposalId', 'digest', 'projectId', 'runId', 'taskKey',
1479
- 'taskRevision', 'expectedSequence', 'currentLane', 'requestedLane', 'localRank',
1480
- 'principalId', 'authority', 'authorityRef', 'deadline', 'owner', 'allowedSuccessors',
1481
- 'authorizedBy',
1482
- ],
1483
- 'scheduler.preemption_requested': [
1484
- 'version', 'type', 'decisionId', 'digest', 'projectId', 'runId', 'expectedSequence',
1485
- 'victimTaskKey', 'victimTaskRevision', 'reservedTaskKey', 'reservedTaskRevision',
1486
- 'assignmentId', 'assignmentAttempt', 'assignmentFence', 'assignmentEnvelopeDigest',
1487
- 'owner', 'requestedAt', 'deadline', 'takeoverFence', 'reason', 'allowedSuccessors', 'policy',
1488
- ],
1489
- 'scheduler.preemption_checkpoint_acknowledged': [
1490
- 'decisionId', 'assignmentId', 'envelopeDigest', 'observationId', 'observationDigest',
1491
- 'checkpointRef', 'checkpointDigest', 'assignmentAttempt', 'assignmentFence', 'takeoverFence',
1492
- ],
1493
- 'scheduler.preemption_timed_out': [
1494
- 'decisionId', 'assignmentId', 'reservedTaskKey', 'blockerId', 'owner', 'deadline',
1495
- 'allowedSuccessors', 'reason',
1496
- ],
1497
- 'local_execution.requested': [
1498
- 'operationId', 'requestDigest', 'agentDefinitionId', 'issuedAt', 'envelope',
1499
- ],
1500
- 'remote_dispatch.requested': [
1501
- 'operationId', 'requestDigest', 'issuedAt', 'reconcileDeadline', 'envelope', 'dispatchItem',
1502
- ],
1503
- 'clock.advanced': ['now'],
1504
- });
1505
- function assertAllowedPayloadKeys(type, payload) {
1506
- const allowed = WORKROOM_EVENT_PAYLOAD_KEYS[type];
1507
- if (Object.keys(payload).some(key => !allowed.includes(key))) {
1508
- throw new Error(`Invalid Workroom event payload keys: ${type}`);
1509
- }
1510
- }
1511
- function validatePayload(type, payload, sequence) {
1512
- assertAllowedPayloadKeys(type, payload);
1513
- switch (type) {
1514
- case 'run.created':
1515
- requirePayloadString(payload, 'projectId');
1516
- requirePayloadString(payload, 'title');
1517
- return;
1518
- case 'run.control_decided':
1519
- requirePayloadString(payload, 'operationId');
1520
- requirePayloadEnum(payload, 'action', ['cancel', 'request_replan']);
1521
- requirePayloadString(payload, 'reasonCode');
1522
- if (payload.action === 'cancel'
1523
- ? !isWorkroomRunCancelReasonCode(payload.reasonCode)
1524
- : !isWorkroomRunReplanReasonCode(payload.reasonCode)) {
1525
- throw new Error('Invalid Workroom event payload: Run control reasonCode');
1526
- }
1527
- if (!Number.isSafeInteger(payload.expectedSequence) || Number(payload.expectedSequence) < 0) {
1528
- throw new Error('Invalid Workroom event payload: expectedSequence');
1529
- }
1530
- requirePayloadString(payload, 'principalId');
1531
- requirePayloadDigest(payload, 'requestDigest');
1532
- requirePayloadString(payload, 'catalogRevision');
1533
- requirePayloadDigest(payload, 'projectDigest');
1534
- requirePayloadString(payload, 'authorizationRef');
1535
- if (!Number.isSafeInteger(payload.stateSequence) || Number(payload.stateSequence) < 0) {
1536
- throw new Error('Invalid Workroom event payload: stateSequence');
1537
- }
1538
- requirePayloadEnum(payload, 'stateStatus', [
1539
- 'active', 'blocked', 'needs_replan', 'cancelling', 'completed', 'cancelled',
1540
- ]);
1541
- requirePayloadDigest(payload, 'stateDigest');
1542
- return;
1543
- case 'run.replan_requested':
1544
- requirePayloadString(payload, 'operationId');
1545
- requirePayloadString(payload, 'reasonCode');
1546
- if (!isWorkroomRunReplanReasonCode(payload.reasonCode)) {
1547
- throw new Error('Invalid Workroom event payload: replan reasonCode');
1548
- }
1549
- requirePayloadDigest(payload, 'requestDigest');
1550
- return;
1551
- case 'plan.admitted':
1552
- requirePayloadString(payload, 'operationId');
1553
- requirePayloadString(payload, 'sourceEventRef');
1554
- requirePayloadDigest(payload, 'sourceEventDigest');
1555
- requirePayloadString(payload, 'orchestratorAgentDefinitionId');
1556
- assertWorkflowPlanProposal(requirePayloadRecord(payload, 'plan'));
1557
- if (payload.schedulerPolicy !== undefined) {
1558
- assertWorkroomSchedulerPolicySnapshot(payload.schedulerPolicy, sequence);
1559
- }
1560
- return;
1561
- case 'plan.revision_applied': {
1562
- const candidate = requirePayloadRecord(payload, 'candidate');
1563
- assertWorkflowPlanRevisionCandidate(candidate);
1564
- requirePayloadPositiveInteger(payload, 'planRevision');
1565
- requirePayloadDigest(payload, 'recomputedDiffDigest');
1566
- if (payload.recomputedDiffDigest !== digestCanonicalWorkroomValue(candidate.diff)) {
1567
- throw new Error('Persisted Plan Revision recomputed diff digest is invalid');
1568
- }
1569
- return;
1570
- }
1571
- case 'plan_gate.decided':
1572
- requirePayloadString(payload, 'operationId');
1573
- requirePayloadDigest(payload, 'requestDigest');
1574
- requirePayloadString(payload, 'taskKey');
1575
- requirePayloadPositiveInteger(payload, 'taskRevision');
1576
- requirePayloadString(payload, 'gateId');
1577
- requirePayloadDigest(payload, 'planDigest');
1578
- requirePayloadString(payload, 'policyRevisionId');
1579
- requirePayloadDigest(payload, 'policyDigest');
1580
- requirePayloadEnum(payload, 'decision', ['approve', 'reject', 'request_changes', 'cancel']);
1581
- requirePayloadString(payload, 'sponsorPrincipalId');
1582
- requirePayloadString(payload, 'authorizedBy');
1583
- requirePayloadDigest(payload, 'reasonDigest');
1584
- return;
1585
- case 'local_execution.requested':
1586
- parseWorkroomLocalAssignmentIssuance(payload);
1587
- return;
1588
- case 'remote_dispatch.requested':
1589
- parseWorkroomRemoteAssignmentIssuance(payload);
1590
- return;
1591
- case 'scheduler.dispatch_requested':
1592
- parseWorkroomDispatchTaskDecision(payload);
1593
- return;
1594
- case 'scheduler.priority_changed':
1595
- requirePayloadString(payload, 'proposalId');
1596
- requirePayloadDigest(payload, 'digest');
1597
- requirePayloadString(payload, 'projectId');
1598
- requirePayloadString(payload, 'runId');
1599
- requirePayloadString(payload, 'taskKey');
1600
- requirePayloadPositiveInteger(payload, 'taskRevision');
1601
- requirePayloadEnum(payload, 'currentLane', ['urgent', 'high', 'normal', 'low']);
1602
- requirePayloadEnum(payload, 'requestedLane', ['urgent', 'high', 'normal', 'low']);
1603
- requirePayloadEnum(payload, 'authority', ['sponsor', 'orchestrator']);
1604
- requirePayloadString(payload, 'principalId');
1605
- requirePayloadString(payload, 'authorityRef');
1606
- requirePayloadString(payload, 'owner');
1607
- requirePayloadNumber(payload, 'deadline');
1608
- requirePayloadString(payload, 'authorizedBy');
1609
- parseWorkroomPriorityChangeProposal({
1610
- version: payload.version,
1611
- type: payload.type,
1612
- proposalId: payload.proposalId,
1613
- digest: payload.digest,
1614
- projectId: payload.projectId,
1615
- runId: payload.runId,
1616
- taskKey: payload.taskKey,
1617
- taskRevision: payload.taskRevision,
1618
- expectedSequence: payload.expectedSequence,
1619
- currentLane: payload.currentLane,
1620
- requestedLane: payload.requestedLane,
1621
- localRank: payload.localRank,
1622
- principalId: payload.principalId,
1623
- authority: payload.authority,
1624
- authorityRef: payload.authorityRef,
1625
- deadline: payload.deadline,
1626
- owner: payload.owner,
1627
- allowedSuccessors: payload.allowedSuccessors,
1628
- });
1629
- if (payload.authorizedBy !== payload.authorityRef) {
1630
- throw new Error('Persisted Workroom priority authority proof is not exact');
1631
- }
1632
- return;
1633
- case 'scheduler.preemption_requested':
1634
- parseWorkroomPreemptionPrepareDecision(payload);
1635
- return;
1636
- case 'scheduler.preemption_checkpoint_acknowledged':
1637
- requirePayloadString(payload, 'decisionId');
1638
- requirePayloadString(payload, 'assignmentId');
1639
- requirePayloadDigest(payload, 'envelopeDigest');
1640
- requirePayloadString(payload, 'observationId');
1641
- requirePayloadDigest(payload, 'observationDigest');
1642
- requirePayloadString(payload, 'checkpointRef');
1643
- requirePayloadDigest(payload, 'checkpointDigest');
1644
- requirePayloadPositiveInteger(payload, 'assignmentAttempt');
1645
- requirePayloadPositiveInteger(payload, 'assignmentFence');
1646
- requirePayloadPositiveInteger(payload, 'takeoverFence');
1647
- if (payload.takeoverFence !== Number(payload.assignmentFence) + 1) {
1648
- throw new Error('Invalid Workroom event payload: preemption takeover fence');
1649
- }
1650
- return;
1651
- case 'scheduler.preemption_timed_out':
1652
- requirePayloadString(payload, 'decisionId');
1653
- requirePayloadString(payload, 'assignmentId');
1654
- requirePayloadString(payload, 'reservedTaskKey');
1655
- requirePayloadString(payload, 'blockerId');
1656
- requirePayloadString(payload, 'owner');
1657
- requirePayloadNumber(payload, 'deadline');
1658
- requirePayloadString(payload, 'reason');
1659
- if (canonicalWorkroomJson(payload.allowedSuccessors) !== canonicalWorkroomJson(['replan', 'cancel_run'])) {
1660
- throw new Error('Invalid Workroom event payload: preemption timeout successors');
1661
- }
1662
- return;
1663
- case 'run.cancel_requested':
1664
- case 'run.cancelled':
1665
- requirePayloadString(payload, 'reason');
1666
- return;
1667
- case 'task.planned':
1668
- requirePayloadString(payload, 'taskKey');
1669
- requirePayloadString(payload, 'title');
1670
- requirePayloadBoolean(payload, 'required');
1671
- requirePayloadPositiveInteger(payload, 'maxAttempts');
1672
- if (payload.approvalGate !== undefined) {
1673
- const gate = requirePayloadRecord(payload, 'approvalGate');
1674
- requirePayloadString(gate, 'id');
1675
- requirePayloadEnum(gate, 'kind', ['sponsor']);
1676
- requirePayloadString(gate, 'owner');
1677
- requirePayloadPositiveInteger(gate, 'decisionTimeoutMs');
1678
- requirePayloadString(gate, 'policyRevisionId');
1679
- requirePayloadDigest(gate, 'policyDigest');
1680
- if (!Array.isArray(gate.allowedActions)
1681
- || canonicalWorkroomJson(gate.allowedActions) !== canonicalWorkroomJson(['approve', 'reject', 'replan', 'cancel'])) {
1682
- throw new Error('Invalid Workroom event payload: approvalGate allowedActions');
1683
- }
1684
- }
1685
- return;
1686
- case 'task.blocked':
1687
- requirePayloadString(payload, 'taskKey');
1688
- requirePayloadString(payload, 'blockerId');
1689
- requirePayloadEnum(payload, 'kind', ['dependency', 'approval', 'capability', 'external', 'human_input']);
1690
- requirePayloadString(payload, 'owner');
1691
- requirePayloadString(payload, 'reason');
1692
- requirePayloadNumber(payload, 'deadline');
1693
- return;
1694
- case 'task.blocker_resolved':
1695
- requirePayloadString(payload, 'taskKey');
1696
- requirePayloadString(payload, 'blockerId');
1697
- return;
1698
- case 'task.cancel_requested':
1699
- case 'task.cancelled':
1700
- case 'task.failed':
1701
- requirePayloadString(payload, 'taskKey');
1702
- requirePayloadString(payload, 'reason');
1703
- return;
1704
- case 'task.accepted':
1705
- requirePayloadString(payload, 'taskKey');
1706
- requirePayloadString(payload, 'reportRef');
1707
- assertPersistedAcceptanceRecord(payload.record, String(payload.taskKey), String(payload.reportRef), sequence);
1708
- return;
1709
- case 'task.acceptance_pinned': {
1710
- requirePayloadString(payload, 'taskKey');
1711
- const contract = requirePayloadRecord(payload, 'contract');
1712
- assertAcceptanceContract(contract, String(payload.taskKey), Number(contract.taskRevision));
1713
- return;
1714
- }
1715
- case 'task.acceptance_blocked':
1716
- requirePayloadString(payload, 'taskKey');
1717
- requirePayloadString(payload, 'reportRef');
1718
- requirePayloadString(payload, 'reason');
1719
- requirePayloadRecord(payload, 'evaluation');
1720
- return;
1721
- case 'reviewer.assigned':
1722
- requirePayloadString(payload, 'taskKey');
1723
- requirePayloadString(payload, 'reason');
1724
- validateAcceptanceWait(requirePayloadRecord(payload, 'assignment'), String(payload.taskKey), true);
1725
- return;
1726
- case 'reviewer.expired':
1727
- requirePayloadString(payload, 'taskKey');
1728
- requirePayloadString(payload, 'assignmentId');
1729
- return;
1730
- case 'reviewer.claimed':
1731
- requirePayloadString(payload, 'taskKey');
1732
- requirePayloadString(payload, 'assignmentId');
1733
- requirePayloadString(payload, 'reviewerPrincipalId');
1734
- requirePayloadString(payload, 'authorizedBy');
1735
- requirePayloadRecord(payload, 'authorization');
1736
- return;
1737
- case 'reviewer.verdict_recorded':
1738
- requirePayloadString(payload, 'taskKey');
1739
- requirePayloadString(payload, 'assignmentId');
1740
- requirePayloadEnum(payload, 'outcome', ['passed', 'rework']);
1741
- requirePayloadRecord(payload, 'verdict');
1742
- requirePayloadRecord(payload, 'authorization');
1743
- return;
1744
- case 'sponsor_gate.opened':
1745
- requirePayloadString(payload, 'taskKey');
1746
- requirePayloadString(payload, 'reason');
1747
- validateAcceptanceWait(requirePayloadRecord(payload, 'gate'), String(payload.taskKey), false);
1748
- return;
1749
- case 'sponsor_gate.expired':
1750
- requirePayloadString(payload, 'taskKey');
1751
- requirePayloadString(payload, 'gateId');
1752
- return;
1753
- case 'sponsor_gate.decided':
1754
- requirePayloadString(payload, 'taskKey');
1755
- requirePayloadString(payload, 'gateId');
1756
- requirePayloadString(payload, 'sponsorPrincipalId');
1757
- requirePayloadString(payload, 'authorizedBy');
1758
- requirePayloadString(payload, 'reason');
1759
- requirePayloadString(payload, 'candidateHash');
1760
- requirePayloadEnum(payload, 'decision', ['approve', 'reject', 'request_changes', 'cancel']);
1761
- requirePayloadRecord(payload, 'authorization');
1762
- return;
1763
- case 'task.rework_requested':
1764
- requirePayloadString(payload, 'taskKey');
1765
- requirePayloadString(payload, 'reason');
1766
- return;
1767
- case 'task.revised':
1768
- requirePayloadString(payload, 'taskKey');
1769
- requirePayloadString(payload, 'title');
1770
- requirePayloadString(payload, 'reason');
1771
- requirePayloadPositiveInteger(payload, 'maxAttempts');
1772
- return;
1773
- case 'task.plan_revised':
1774
- requirePayloadString(payload, 'taskKey');
1775
- requirePayloadPositiveInteger(payload, 'expectedTaskRevision');
1776
- requirePayloadPositiveInteger(payload, 'newTaskRevision');
1777
- requirePayloadString(payload, 'title');
1778
- requirePayloadBoolean(payload, 'required');
1779
- requirePayloadPositiveInteger(payload, 'maxAttempts');
1780
- requirePayloadString(payload, 'role');
1781
- requirePayloadString(payload, 'reason');
1782
- return;
1783
- case 'assignment.claimed':
1784
- requirePayloadString(payload, 'taskKey');
1785
- requirePayloadString(payload, 'assignmentId');
1786
- requirePayloadString(payload, 'owner');
1787
- requirePayloadEnum(payload, 'role', ['executor', 'reviewer', 'integration']);
1788
- requirePayloadPositiveInteger(payload, 'taskRevision');
1789
- requirePayloadPositiveInteger(payload, 'attempt');
1790
- requirePayloadPositiveInteger(payload, 'assignmentRevision');
1791
- requirePayloadPositiveInteger(payload, 'fence');
1792
- requirePayloadDigest(payload, 'envelopeDigest');
1793
- requirePayloadNumber(payload, 'leaseExpiresAt');
1794
- return;
1795
- case 'assignment.started':
1796
- case 'assignment.lease_expired':
1797
- requirePayloadString(payload, 'assignmentId');
1798
- return;
1799
- case 'assignment.progress':
1800
- validateAssignmentObservationHeader(payload);
1801
- assertExactPayloadKeys(payload, [
1802
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest', 'progress',
1803
- ], type);
1804
- validateProgress(requirePayloadRecord(payload, 'progress'));
1805
- assertPersistedAssignmentObservationDigest(payload, {
1806
- version: 1,
1807
- type: 'progress',
1808
- observationId: payload.observationId,
1809
- envelopeDigest: payload.envelopeDigest,
1810
- progress: payload.progress,
1811
- });
1812
- return;
1813
- case 'assignment.heartbeat':
1814
- validateAssignmentObservationHeader(payload);
1815
- assertExactPayloadKeys(payload, [
1816
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest', 'leaseExpiresAt',
1817
- ], type);
1818
- requirePayloadNumber(payload, 'leaseExpiresAt');
1819
- assertPersistedAssignmentObservationDigest(payload, {
1820
- version: 1,
1821
- type: 'heartbeat',
1822
- observationId: payload.observationId,
1823
- envelopeDigest: payload.envelopeDigest,
1824
- });
1825
- return;
1826
- case 'assignment.checkpointed':
1827
- validateAssignmentObservationHeader(payload);
1828
- assertExactPayloadKeys(payload, [
1829
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest',
1830
- 'checkpointRef', 'checkpointDigest',
1831
- ], type);
1832
- requirePayloadString(payload, 'checkpointRef');
1833
- requirePayloadDigest(payload, 'checkpointDigest');
1834
- assertPersistedAssignmentObservationDigest(payload, {
1835
- version: 1,
1836
- type: 'checkpoint',
1837
- observationId: payload.observationId,
1838
- envelopeDigest: payload.envelopeDigest,
1839
- checkpoint: { ref: payload.checkpointRef, digest: payload.checkpointDigest },
1840
- });
1841
- return;
1842
- case 'assignment.checkpoint_requested':
1843
- requirePayloadString(payload, 'decisionId');
1844
- requirePayloadString(payload, 'assignmentId');
1845
- requirePayloadDigest(payload, 'envelopeDigest');
1846
- requirePayloadString(payload, 'reservedTaskKey');
1847
- requirePayloadNumber(payload, 'requestedAt');
1848
- requirePayloadNumber(payload, 'deadline');
1849
- requirePayloadPositiveInteger(payload, 'takeoverFence');
1850
- requirePayloadString(payload, 'owner');
1851
- if (Number(payload.deadline) <= Number(payload.requestedAt)
1852
- || canonicalWorkroomJson(payload.allowedSuccessors) !== canonicalWorkroomJson(['replan', 'cancel_run'])) {
1853
- throw new Error('Invalid Workroom event payload: checkpoint request recovery metadata');
1854
- }
1855
- return;
1856
- case 'assignment.preempted':
1857
- requirePayloadString(payload, 'decisionId');
1858
- requirePayloadString(payload, 'assignmentId');
1859
- requirePayloadString(payload, 'checkpointRef');
1860
- requirePayloadDigest(payload, 'checkpointDigest');
1861
- requirePayloadEnum(payload, 'outcome', ['interrupted']);
1862
- return;
1863
- case 'assignment.execution_completed':
1864
- validateAssignmentObservationHeader(payload);
1865
- assertExactPayloadKeys(payload, [
1866
- 'assignmentId', 'observationId', 'observationDigest', 'envelopeDigest',
1867
- 'reportRef', 'reportDigest', 'candidateRef', 'candidateHash',
1868
- ...(payload.completionReceiptDigest === undefined
1869
- ? []
1870
- : ['completionReceiptDigest']),
1871
- ], type);
1872
- requirePayloadString(payload, 'reportRef');
1873
- requirePayloadDigest(payload, 'reportDigest');
1874
- requirePayloadString(payload, 'candidateRef');
1875
- requirePayloadDigest(payload, 'candidateHash');
1876
- if (payload.completionReceiptDigest !== undefined) {
1877
- requirePayloadDigest(payload, 'completionReceiptDigest');
1878
- }
1879
- assertPersistedAssignmentObservationDigest(payload, {
1880
- version: 1,
1881
- type: 'execution_completed',
1882
- observationId: payload.observationId,
1883
- envelopeDigest: payload.envelopeDigest,
1884
- completion: {
1885
- report: { ref: payload.reportRef, digest: payload.reportDigest },
1886
- candidate: { ref: payload.candidateRef, hash: payload.candidateHash },
1887
- ...(payload.completionReceiptDigest === undefined
1888
- ? {}
1889
- : { completionReceiptDigest: payload.completionReceiptDigest }),
1890
- },
1891
- });
1892
- return;
1893
- case 'assignment.cancel_requested':
1894
- requirePayloadString(payload, 'assignmentId');
1895
- requirePayloadNumber(payload, 'controlDeadline');
1896
- return;
1897
- case 'assignment.cancelled':
1898
- requirePayloadString(payload, 'assignmentId');
1899
- requirePayloadEnum(payload, 'outcome', ['interrupted', 'committed', 'outcome_unknown']);
1900
- return;
1901
- case 'clock.advanced':
1902
- requirePayloadNumber(payload, 'now');
1903
- return;
1904
- }
1905
- }
1906
- function validateAssignmentObservationHeader(payload) {
1907
- requirePayloadString(payload, 'assignmentId');
1908
- requirePayloadString(payload, 'observationId');
1909
- requirePayloadDigest(payload, 'observationDigest');
1910
- requirePayloadDigest(payload, 'envelopeDigest');
1911
- }
1912
- function assertPersistedAssignmentObservationDigest(payload, observation) {
1913
- if (digestCanonicalWorkroomValue(observation) !== payload.observationDigest) {
1914
- throw new Error('Invalid Workroom event payload: observationDigest does not match body');
1915
- }
1916
- }
1917
- function validateProgress(progress) {
1918
- const keys = Object.keys(progress);
1919
- if (keys.some(key => !['summary', 'completedUnits', 'totalUnits'].includes(key))) {
1920
- throw new Error('Invalid Workroom event payload: progress keys');
1921
- }
1922
- requirePayloadString(progress, 'summary');
1923
- const completed = progress.completedUnits;
1924
- const total = progress.totalUnits;
1925
- if (completed !== undefined && (!Number.isSafeInteger(completed) || completed < 0)) {
1926
- throw new Error('Invalid Workroom event payload: completedUnits');
1927
- }
1928
- if (total !== undefined && (!Number.isSafeInteger(total) || total < 1)) {
1929
- throw new Error('Invalid Workroom event payload: totalUnits');
1930
- }
1931
- if (typeof completed === 'number' && typeof total === 'number' && completed > total) {
1932
- throw new Error('Invalid Workroom event payload: completedUnits exceeds totalUnits');
1933
- }
1934
- }
1935
- function assertExactPayloadKeys(payload, expected, type) {
1936
- const actual = Object.keys(payload).sort();
1937
- const canonical = [...expected].sort();
1938
- if (actual.length !== canonical.length || actual.some((key, index) => key !== canonical[index])) {
1939
- throw new Error(`Invalid Workroom event payload keys: ${type}`);
1940
- }
1941
- }
1942
- function assertExactRecordKeys(value, expected, label) {
1943
- const actual = Object.keys(value).sort();
1944
- const canonical = [...expected].sort();
1945
- if (actual.length !== canonical.length || actual.some((key, index) => key !== canonical[index])) {
1946
- throw new Error(`${label} keys are invalid`);
1947
- }
1948
- }
1949
- function validateAcceptanceWait(value, taskKey, reviewer) {
1950
- for (const key of ['id', 'taskKey', 'candidateHash', 'contractId', 'owner']) {
1951
- requirePayloadString(value, key);
1952
- }
1953
- requirePayloadPositiveInteger(value, 'taskRevision');
1954
- requirePayloadEnum(value, 'riskTier', ['low', 'medium', 'high', 'critical']);
1955
- requirePayloadEnum(value, 'route', ['reviewer_required', 'sponsor_required', 'reviewer_then_sponsor']);
1956
- if (value.taskKey !== taskKey)
1957
- throw new Error('Invalid Workroom event payload: wait taskKey');
1958
- requirePayloadNumber(value, 'deadline');
1959
- requirePayloadEnum(value, 'status', ['open']);
1960
- requirePayloadRecord(value, 'evaluation');
1961
- const policy = requirePayloadRecord(value, 'policy');
1962
- requirePayloadString(policy, 'id');
1963
- requirePayloadString(policy, 'digest');
1964
- requirePayloadPositiveInteger(policy, 'revision');
1965
- if (reviewer)
1966
- requirePayloadString(value, 'producerPrincipalId');
1967
- if (!Array.isArray(value.allowedActions) || value.allowedActions.length === 0
1968
- || value.allowedActions.some(action => !isNonEmptyString(action)
1969
- || !ACCEPTANCE_WAIT_ACTIONS.has(action))) {
1970
- throw new Error('Invalid Workroom event payload: allowedActions');
1971
- }
1972
- }
1973
- const ACCEPTANCE_WAIT_ACTIONS = new Set([
1974
- 'claim', 'submit_verdict', 'approve', 'reject', 'request_changes',
1975
- 'reassign', 'reopen', 'rebase', 'replan', 'cancel',
1976
- ]);
1977
- function isRecord(value) {
1978
- return !!value && typeof value === 'object' && !Array.isArray(value);
1979
- }
1980
- function isNonEmptyString(value) {
1981
- return typeof value === 'string' && value.trim().length > 0;
1982
- }
1983
- function isFiniteNumber(value) {
1984
- return typeof value === 'number' && Number.isFinite(value);
1985
- }
1986
- function isSequence(value) {
1987
- return Number.isSafeInteger(value) && value >= 0;
1988
- }
1989
- function requirePayloadString(payload, key) {
1990
- if (!isNonEmptyString(payload[key]))
1991
- throw new Error(`Invalid Workroom event payload: ${key}`);
1992
- }
1993
- function requirePayloadNumber(payload, key) {
1994
- if (!isFiniteNumber(payload[key]))
1995
- throw new Error(`Invalid Workroom event payload: ${key}`);
1996
- }
1997
- function requirePayloadDigest(payload, key) {
1998
- if (typeof payload[key] !== 'string' || !/^sha256:[a-f0-9]{64}$/u.test(payload[key])) {
1999
- throw new Error(`Invalid Workroom event payload: ${key}`);
2000
- }
2001
- }
2002
- function requirePayloadRecord(payload, key) {
2003
- if (!isRecord(payload[key]))
2004
- throw new Error(`Invalid Workroom event payload: ${key}`);
2005
- return payload[key];
2006
- }
2007
- function requirePayloadPositiveInteger(payload, key) {
2008
- const value = payload[key];
2009
- if (!Number.isSafeInteger(value) || value < 1) {
2010
- throw new Error(`Invalid Workroom event payload: ${key}`);
2011
- }
2012
- }
2013
- function requirePayloadBoolean(payload, key) {
2014
- if (typeof payload[key] !== 'boolean')
2015
- throw new Error(`Invalid Workroom event payload: ${key}`);
2016
- }
2017
- function requirePayloadEnum(payload, key, values) {
2018
- if (typeof payload[key] !== 'string' || !values.includes(payload[key])) {
2019
- throw new Error(`Invalid Workroom event payload: ${key}`);
2020
- }
2021
- }
2022
- //# sourceMappingURL=journal.js.map