@zhin.js/agent 1.1.13 → 1.1.15

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 (1163) hide show
  1. package/README.md +40 -20
  2. package/lib/ai-event-bus.d.ts +1 -1
  3. package/lib/ai-hook-handlers.d.ts +1 -1
  4. package/lib/assistant/config.d.ts +3 -17
  5. package/lib/assistant/config.d.ts.map +1 -1
  6. package/lib/assistant/config.js +1 -8
  7. package/lib/assistant/config.js.map +1 -1
  8. package/lib/assistant/index.d.ts +6 -9
  9. package/lib/assistant/index.d.ts.map +1 -1
  10. package/lib/assistant/index.js +4 -6
  11. package/lib/assistant/index.js.map +1 -1
  12. package/lib/assistant/job-engine.d.ts +0 -4
  13. package/lib/assistant/job-engine.d.ts.map +1 -1
  14. package/lib/assistant/job-engine.js +0 -2
  15. package/lib/assistant/job-engine.js.map +1 -1
  16. package/lib/assistant/job-store.d.ts +1 -8
  17. package/lib/assistant/job-store.d.ts.map +1 -1
  18. package/lib/assistant/job-store.js +3 -9
  19. package/lib/assistant/job-store.js.map +1 -1
  20. package/lib/assistant/job-worker.d.ts +2 -3
  21. package/lib/assistant/job-worker.d.ts.map +1 -1
  22. package/lib/assistant/job-worker.js +15 -25
  23. package/lib/assistant/job-worker.js.map +1 -1
  24. package/lib/assistant/runtime-contract.d.ts +22 -0
  25. package/lib/assistant/runtime-contract.d.ts.map +1 -0
  26. package/lib/assistant/runtime-contract.js +2 -0
  27. package/lib/assistant/runtime-contract.js.map +1 -0
  28. package/lib/assistant/types.d.ts +0 -10
  29. package/lib/assistant/types.d.ts.map +1 -1
  30. package/lib/assistant/types.js +0 -4
  31. package/lib/assistant/types.js.map +1 -1
  32. package/lib/authoring/bridge.d.ts +1 -1
  33. package/lib/authoring/index.d.ts +0 -4
  34. package/lib/authoring/index.d.ts.map +1 -1
  35. package/lib/authoring/index.js +0 -2
  36. package/lib/authoring/index.js.map +1 -1
  37. package/lib/authoring/types.d.ts +3 -39
  38. package/lib/authoring/types.d.ts.map +1 -1
  39. package/lib/authoring/types.js.map +1 -1
  40. package/lib/builtin/bash-tool.d.ts.map +1 -1
  41. package/lib/builtin/bash-tool.js +15 -2
  42. package/lib/builtin/bash-tool.js.map +1 -1
  43. package/lib/builtin/five-agent/index.d.ts +0 -1
  44. package/lib/builtin/five-agent/index.d.ts.map +1 -1
  45. package/lib/builtin/five-agent/index.js +0 -1
  46. package/lib/builtin/five-agent/index.js.map +1 -1
  47. package/lib/builtin/five-agent/role-capability-policy.d.ts +1 -1
  48. package/lib/builtin/five-agent/role-capability-policy.d.ts.map +1 -1
  49. package/lib/builtin/five-agent/role-capability-policy.js +1 -1
  50. package/lib/builtin/five-agent/role-capability-policy.js.map +1 -1
  51. package/lib/builtin/spawn-task-tool.d.ts +1 -1
  52. package/lib/builtin/spawn-task-tool.d.ts.map +1 -1
  53. package/lib/builtin/spawn-task-tool.js +4 -100
  54. package/lib/builtin/spawn-task-tool.js.map +1 -1
  55. package/lib/builtin-tools.d.ts +0 -2
  56. package/lib/builtin-tools.d.ts.map +1 -1
  57. package/lib/builtin-tools.js +0 -6
  58. package/lib/builtin-tools.js.map +1 -1
  59. package/lib/common-adapter-tools.d.ts +1 -1
  60. package/lib/config/agent-interfaces.d.ts +2 -1
  61. package/lib/config/agent-interfaces.d.ts.map +1 -1
  62. package/lib/config/index.d.ts +3 -3
  63. package/lib/config/index.d.ts.map +1 -1
  64. package/lib/config/index.js +2 -2
  65. package/lib/config/index.js.map +1 -1
  66. package/lib/config/keyword-triggers.d.ts +0 -1
  67. package/lib/config/keyword-triggers.d.ts.map +1 -1
  68. package/lib/config/keyword-triggers.js +0 -1
  69. package/lib/config/keyword-triggers.js.map +1 -1
  70. package/lib/config/normalize-ai-config.d.ts.map +1 -1
  71. package/lib/config/normalize-ai-config.js +9 -0
  72. package/lib/config/normalize-ai-config.js.map +1 -1
  73. package/lib/config/validate-ai-config.d.ts +1 -0
  74. package/lib/config/validate-ai-config.d.ts.map +1 -1
  75. package/lib/config/validate-ai-config.js +179 -0
  76. package/lib/config/validate-ai-config.js.map +1 -1
  77. package/lib/config/zhin-agent-config.d.ts +0 -3
  78. package/lib/config/zhin-agent-config.d.ts.map +1 -1
  79. package/lib/config/zhin-agent-constants.d.ts +0 -3
  80. package/lib/config/zhin-agent-constants.d.ts.map +1 -1
  81. package/lib/config/zhin-agent-constants.js +0 -14
  82. package/lib/config/zhin-agent-constants.js.map +1 -1
  83. package/lib/config/zhin-agent-defaults.d.ts.map +1 -1
  84. package/lib/config/zhin-agent-defaults.js +0 -3
  85. package/lib/config/zhin-agent-defaults.js.map +1 -1
  86. package/lib/config/zhin-agent-dependencies.d.ts +4 -5
  87. package/lib/config/zhin-agent-dependencies.d.ts.map +1 -1
  88. package/lib/context/context-system.d.ts +2 -1
  89. package/lib/context/context-system.d.ts.map +1 -1
  90. package/lib/context/context-system.js +1 -0
  91. package/lib/context/context-system.js.map +1 -1
  92. package/lib/context/context-tail-limit.d.ts +2 -2
  93. package/lib/context/context-tail-limit.d.ts.map +1 -1
  94. package/lib/context/context-tail-limit.js +2 -3
  95. package/lib/context/context-tail-limit.js.map +1 -1
  96. package/lib/context/im-turn-context-adapter.d.ts +1 -2
  97. package/lib/context/im-turn-context-adapter.d.ts.map +1 -1
  98. package/lib/context/im-turn-context-adapter.js +1 -5
  99. package/lib/context/im-turn-context-adapter.js.map +1 -1
  100. package/lib/context/turn-envelope.d.ts +1 -1
  101. package/lib/context/turn-envelope.d.ts.map +1 -1
  102. package/lib/context/turn-envelope.js +4 -0
  103. package/lib/context/turn-envelope.js.map +1 -1
  104. package/lib/context/turn-user-message.d.ts +1 -1
  105. package/lib/context/turn-user-message.d.ts.map +1 -1
  106. package/lib/context/turn-user-message.js +3 -3
  107. package/lib/context/turn-user-message.js.map +1 -1
  108. package/lib/core/agent-core-run.d.ts.map +1 -1
  109. package/lib/core/agent-core-run.js +36 -12
  110. package/lib/core/agent-core-run.js.map +1 -1
  111. package/lib/core/agent-loop-standalone.d.ts +1 -1
  112. package/lib/core/agent-loop-standalone.js +13 -6
  113. package/lib/core/agent-loop-standalone.js.map +1 -1
  114. package/lib/core/tool-execution-authority.d.ts +2 -2
  115. package/lib/core/tool-execution-authority.d.ts.map +1 -1
  116. package/lib/data-governance/data-governance.d.ts +198 -0
  117. package/lib/data-governance/data-governance.d.ts.map +1 -0
  118. package/lib/data-governance/data-governance.js +660 -0
  119. package/lib/data-governance/data-governance.js.map +1 -0
  120. package/lib/data-governance/database-payload-lifecycle-repository.d.ts +68 -0
  121. package/lib/data-governance/database-payload-lifecycle-repository.d.ts.map +1 -0
  122. package/lib/data-governance/database-payload-lifecycle-repository.js +226 -0
  123. package/lib/data-governance/database-payload-lifecycle-repository.js.map +1 -0
  124. package/lib/data-governance/disclosure-manifest.d.ts +110 -0
  125. package/lib/data-governance/disclosure-manifest.d.ts.map +1 -0
  126. package/lib/data-governance/disclosure-manifest.js +264 -0
  127. package/lib/data-governance/disclosure-manifest.js.map +1 -0
  128. package/lib/data-governance/encrypted-database-payload-vault.d.ts +107 -0
  129. package/lib/data-governance/encrypted-database-payload-vault.d.ts.map +1 -0
  130. package/lib/data-governance/encrypted-database-payload-vault.js +236 -0
  131. package/lib/data-governance/encrypted-database-payload-vault.js.map +1 -0
  132. package/lib/data-governance/encrypted-file-payload-vault.d.ts +117 -0
  133. package/lib/data-governance/encrypted-file-payload-vault.d.ts.map +1 -0
  134. package/lib/data-governance/encrypted-file-payload-vault.js +507 -0
  135. package/lib/data-governance/encrypted-file-payload-vault.js.map +1 -0
  136. package/lib/data-governance/file-payload-lifecycle-repository.d.ts +19 -0
  137. package/lib/data-governance/file-payload-lifecycle-repository.d.ts.map +1 -0
  138. package/lib/data-governance/file-payload-lifecycle-repository.js +194 -0
  139. package/lib/data-governance/file-payload-lifecycle-repository.js.map +1 -0
  140. package/lib/data-governance/governance-authority-repository.d.ts +148 -0
  141. package/lib/data-governance/governance-authority-repository.d.ts.map +1 -0
  142. package/lib/data-governance/governance-authority-repository.js +439 -0
  143. package/lib/data-governance/governance-authority-repository.js.map +1 -0
  144. package/lib/data-governance/governed-payload-write-saga.d.ts +126 -0
  145. package/lib/data-governance/governed-payload-write-saga.d.ts.map +1 -0
  146. package/lib/data-governance/governed-payload-write-saga.js +471 -0
  147. package/lib/data-governance/governed-payload-write-saga.js.map +1 -0
  148. package/lib/data-governance/payload-hold-overdue-projection.d.ts +57 -0
  149. package/lib/data-governance/payload-hold-overdue-projection.d.ts.map +1 -0
  150. package/lib/data-governance/payload-hold-overdue-projection.js +80 -0
  151. package/lib/data-governance/payload-hold-overdue-projection.js.map +1 -0
  152. package/lib/data-governance/payload-lifecycle.d.ts +359 -0
  153. package/lib/data-governance/payload-lifecycle.d.ts.map +1 -0
  154. package/lib/data-governance/payload-lifecycle.js +930 -0
  155. package/lib/data-governance/payload-lifecycle.js.map +1 -0
  156. package/lib/data-governance/payload-vault-storage-handoff.d.ts +255 -0
  157. package/lib/data-governance/payload-vault-storage-handoff.d.ts.map +1 -0
  158. package/lib/data-governance/payload-vault-storage-handoff.js +471 -0
  159. package/lib/data-governance/payload-vault-storage-handoff.js.map +1 -0
  160. package/lib/defaults/hooks.d.ts +2 -2
  161. package/lib/defaults/hooks.d.ts.map +1 -1
  162. package/lib/defaults/hooks.js +2 -2
  163. package/lib/defaults/hooks.js.map +1 -1
  164. package/lib/defaults/subagents.d.ts +2 -2
  165. package/lib/defaults/subagents.d.ts.map +1 -1
  166. package/lib/defaults/subagents.js +2 -2
  167. package/lib/defaults/subagents.js.map +1 -1
  168. package/lib/defaults/tools.d.ts +1 -2
  169. package/lib/defaults/tools.js +2 -2
  170. package/lib/defaults/tools.js.map +1 -1
  171. package/lib/discovery/agent-surface-info.d.ts +0 -2
  172. package/lib/discovery/agent-surface-info.d.ts.map +1 -1
  173. package/lib/discovery/agent-surface-info.js +0 -5
  174. package/lib/discovery/agent-surface-info.js.map +1 -1
  175. package/lib/discovery/agent-surface.d.ts.map +1 -1
  176. package/lib/discovery/agent-surface.js +0 -39
  177. package/lib/discovery/agent-surface.js.map +1 -1
  178. package/lib/event/agent-stream-hooks.d.ts +1 -1
  179. package/lib/event/hook-stream-sink.d.ts +1 -1
  180. package/lib/event/publish-agent-stream.d.ts +3 -3
  181. package/lib/event/publish-agent-stream.d.ts.map +1 -1
  182. package/lib/event/publish-agent-stream.js +1 -1
  183. package/lib/event/publish-agent-stream.js.map +1 -1
  184. package/lib/event/session-events.d.ts +1 -1
  185. package/lib/event/turn-event.d.ts +22 -2
  186. package/lib/event/turn-event.d.ts.map +1 -1
  187. package/lib/event/turn-event.js.map +1 -1
  188. package/lib/event/turn-to-agent-stream.js +6 -0
  189. package/lib/event/turn-to-agent-stream.js.map +1 -1
  190. package/lib/features/agent-feature.d.ts +1 -1
  191. package/lib/features/mcp-feature.d.ts +1 -1
  192. package/lib/index.d.ts +100 -33
  193. package/lib/index.d.ts.map +1 -1
  194. package/lib/index.js +95 -21
  195. package/lib/index.js.map +1 -1
  196. package/lib/ingress/capability-ingress.d.ts +5 -5
  197. package/lib/ingress/capability-ingress.d.ts.map +1 -1
  198. package/lib/ingress/capability-ingress.js +26 -26
  199. package/lib/ingress/capability-ingress.js.map +1 -1
  200. package/lib/init/activate-ai-database-storage.d.ts +5 -3
  201. package/lib/init/activate-ai-database-storage.d.ts.map +1 -1
  202. package/lib/init/activate-ai-database-storage.js +23 -32
  203. package/lib/init/activate-ai-database-storage.js.map +1 -1
  204. package/lib/init/configure-zhin-agent.d.ts +1 -1
  205. package/lib/init/configure-zhin-agent.d.ts.map +1 -1
  206. package/lib/init/configure-zhin-agent.js +3 -5
  207. package/lib/init/configure-zhin-agent.js.map +1 -1
  208. package/lib/init/define-ai-database-models.d.ts.map +1 -1
  209. package/lib/init/define-ai-database-models.js +21 -5
  210. package/lib/init/define-ai-database-models.js.map +1 -1
  211. package/lib/init/dispose-zhin-agent.d.ts +1 -3
  212. package/lib/init/dispose-zhin-agent.d.ts.map +1 -1
  213. package/lib/init/dispose-zhin-agent.js +0 -2
  214. package/lib/init/dispose-zhin-agent.js.map +1 -1
  215. package/lib/init/introspection-collectors.d.ts +1 -1
  216. package/lib/init/introspection-collectors.d.ts.map +1 -1
  217. package/lib/init/introspection-collectors.js +13 -14
  218. package/lib/init/introspection-collectors.js.map +1 -1
  219. package/lib/internal/agent-host.d.ts +5 -8
  220. package/lib/internal/agent-host.d.ts.map +1 -1
  221. package/lib/internal/host-types.d.ts +4 -0
  222. package/lib/internal/host-types.d.ts.map +1 -1
  223. package/lib/journal/persistent-turn-journal.d.ts +5 -1
  224. package/lib/journal/persistent-turn-journal.d.ts.map +1 -1
  225. package/lib/journal/persistent-turn-journal.js +11 -1
  226. package/lib/journal/persistent-turn-journal.js.map +1 -1
  227. package/lib/mcp-client/bridge.d.ts +1 -1
  228. package/lib/mcp-client/connection.d.ts +1 -1
  229. package/lib/mcp-client/index.d.ts +1 -1
  230. package/lib/media/media-normalize.d.ts +9 -5
  231. package/lib/media/media-normalize.d.ts.map +1 -1
  232. package/lib/media/media-normalize.js +125 -69
  233. package/lib/media/media-normalize.js.map +1 -1
  234. package/lib/media/media-publisher.d.ts.map +1 -1
  235. package/lib/media/media-publisher.js +48 -3
  236. package/lib/media/media-publisher.js.map +1 -1
  237. package/lib/media/vision-capability.js +1 -1
  238. package/lib/media/vision-capability.js.map +1 -1
  239. package/lib/memory/index.d.ts +1 -1
  240. package/lib/memory/index.d.ts.map +1 -1
  241. package/lib/plugin-ai-hook-bus.d.ts +1 -1
  242. package/lib/plugin-runtime/agent-host-port.d.ts +74 -4
  243. package/lib/plugin-runtime/agent-host-port.d.ts.map +1 -1
  244. package/lib/plugin-runtime/agent-host-port.js.map +1 -1
  245. package/lib/plugin-runtime/agent-runtime.d.ts +3 -0
  246. package/lib/plugin-runtime/agent-runtime.d.ts.map +1 -1
  247. package/lib/plugin-runtime/agent-runtime.js +73 -3
  248. package/lib/plugin-runtime/agent-runtime.js.map +1 -1
  249. package/lib/plugin-runtime/agent-trace-runtime.d.ts +37 -0
  250. package/lib/plugin-runtime/agent-trace-runtime.d.ts.map +1 -0
  251. package/lib/plugin-runtime/agent-trace-runtime.js +150 -0
  252. package/lib/plugin-runtime/agent-trace-runtime.js.map +1 -0
  253. package/lib/plugin-runtime/capability-tools.js +2 -2
  254. package/lib/plugin-runtime/capability-tools.js.map +1 -1
  255. package/lib/plugin-runtime/database-overlay-pack-promotion-repository.d.ts +70 -0
  256. package/lib/plugin-runtime/database-overlay-pack-promotion-repository.d.ts.map +1 -0
  257. package/lib/plugin-runtime/database-overlay-pack-promotion-repository.js +203 -0
  258. package/lib/plugin-runtime/database-overlay-pack-promotion-repository.js.map +1 -0
  259. package/lib/plugin-runtime/deferred-capability-plan.d.ts +26 -0
  260. package/lib/plugin-runtime/deferred-capability-plan.d.ts.map +1 -1
  261. package/lib/plugin-runtime/deferred-capability-plan.js +98 -4
  262. package/lib/plugin-runtime/deferred-capability-plan.js.map +1 -1
  263. package/lib/plugin-runtime/full-agent-turn-engine.js +48 -5
  264. package/lib/plugin-runtime/full-agent-turn-engine.js.map +1 -1
  265. package/lib/plugin-runtime/host-mcp-projection.d.ts +1 -1
  266. package/lib/plugin-runtime/index.d.ts +67 -0
  267. package/lib/plugin-runtime/index.d.ts.map +1 -1
  268. package/lib/plugin-runtime/index.js +65 -0
  269. package/lib/plugin-runtime/index.js.map +1 -1
  270. package/lib/plugin-runtime/native-interaction-tools.js +1 -1
  271. package/lib/plugin-runtime/native-interaction-tools.js.map +1 -1
  272. package/lib/plugin-runtime/native-semantic-memory-tools.d.ts +17 -0
  273. package/lib/plugin-runtime/native-semantic-memory-tools.d.ts.map +1 -0
  274. package/lib/plugin-runtime/native-semantic-memory-tools.js +169 -0
  275. package/lib/plugin-runtime/native-semantic-memory-tools.js.map +1 -0
  276. package/lib/plugin-runtime/turn-intent-resolver.d.ts +20 -0
  277. package/lib/plugin-runtime/turn-intent-resolver.d.ts.map +1 -0
  278. package/lib/plugin-runtime/turn-intent-resolver.js +8 -0
  279. package/lib/plugin-runtime/turn-intent-resolver.js.map +1 -0
  280. package/lib/plugin-runtime/workroom-acceptance-authority.d.ts +5 -0
  281. package/lib/plugin-runtime/workroom-acceptance-authority.d.ts.map +1 -0
  282. package/lib/plugin-runtime/workroom-acceptance-authority.js +14 -0
  283. package/lib/plugin-runtime/workroom-acceptance-authority.js.map +1 -0
  284. package/lib/plugin-runtime/workroom-acceptance-fact-providers.d.ts +233 -0
  285. package/lib/plugin-runtime/workroom-acceptance-fact-providers.d.ts.map +1 -0
  286. package/lib/plugin-runtime/workroom-acceptance-fact-providers.js +517 -0
  287. package/lib/plugin-runtime/workroom-acceptance-fact-providers.js.map +1 -0
  288. package/lib/plugin-runtime/workroom-acceptance-internal-providers.d.ts +139 -0
  289. package/lib/plugin-runtime/workroom-acceptance-internal-providers.d.ts.map +1 -0
  290. package/lib/plugin-runtime/workroom-acceptance-internal-providers.js +430 -0
  291. package/lib/plugin-runtime/workroom-acceptance-internal-providers.js.map +1 -0
  292. package/lib/plugin-runtime/workroom-acceptance-policy.d.ts +4 -0
  293. package/lib/plugin-runtime/workroom-acceptance-policy.d.ts.map +1 -0
  294. package/lib/plugin-runtime/workroom-acceptance-policy.js +20 -0
  295. package/lib/plugin-runtime/workroom-acceptance-policy.js.map +1 -0
  296. package/lib/plugin-runtime/workroom-acceptance-production-composition.d.ts +175 -0
  297. package/lib/plugin-runtime/workroom-acceptance-production-composition.d.ts.map +1 -0
  298. package/lib/plugin-runtime/workroom-acceptance-production-composition.js +793 -0
  299. package/lib/plugin-runtime/workroom-acceptance-production-composition.js.map +1 -0
  300. package/lib/plugin-runtime/workroom-acceptance-provider-composition.d.ts +186 -0
  301. package/lib/plugin-runtime/workroom-acceptance-provider-composition.d.ts.map +1 -0
  302. package/lib/plugin-runtime/workroom-acceptance-provider-composition.js +553 -0
  303. package/lib/plugin-runtime/workroom-acceptance-provider-composition.js.map +1 -0
  304. package/lib/plugin-runtime/workroom-accepted-source-runtime.d.ts +75 -0
  305. package/lib/plugin-runtime/workroom-accepted-source-runtime.d.ts.map +1 -0
  306. package/lib/plugin-runtime/workroom-accepted-source-runtime.js +267 -0
  307. package/lib/plugin-runtime/workroom-accepted-source-runtime.js.map +1 -0
  308. package/lib/plugin-runtime/workroom-assignment-authority-grant-runtime.d.ts +42 -0
  309. package/lib/plugin-runtime/workroom-assignment-authority-grant-runtime.d.ts.map +1 -0
  310. package/lib/plugin-runtime/workroom-assignment-authority-grant-runtime.js +90 -0
  311. package/lib/plugin-runtime/workroom-assignment-authority-grant-runtime.js.map +1 -0
  312. package/lib/plugin-runtime/workroom-assignment-authority-provider.d.ts +159 -0
  313. package/lib/plugin-runtime/workroom-assignment-authority-provider.d.ts.map +1 -0
  314. package/lib/plugin-runtime/workroom-assignment-authority-provider.js +595 -0
  315. package/lib/plugin-runtime/workroom-assignment-authority-provider.js.map +1 -0
  316. package/lib/plugin-runtime/workroom-assignment-knowledge-composition.d.ts +58 -0
  317. package/lib/plugin-runtime/workroom-assignment-knowledge-composition.d.ts.map +1 -0
  318. package/lib/plugin-runtime/workroom-assignment-knowledge-composition.js +218 -0
  319. package/lib/plugin-runtime/workroom-assignment-knowledge-composition.js.map +1 -0
  320. package/lib/plugin-runtime/workroom-data-governance-authority-writer.d.ts +47 -0
  321. package/lib/plugin-runtime/workroom-data-governance-authority-writer.d.ts.map +1 -0
  322. package/lib/plugin-runtime/workroom-data-governance-authority-writer.js +115 -0
  323. package/lib/plugin-runtime/workroom-data-governance-authority-writer.js.map +1 -0
  324. package/lib/plugin-runtime/workroom-data-governance-composition.d.ts +28 -0
  325. package/lib/plugin-runtime/workroom-data-governance-composition.d.ts.map +1 -0
  326. package/lib/plugin-runtime/workroom-data-governance-composition.js +41 -0
  327. package/lib/plugin-runtime/workroom-data-governance-composition.js.map +1 -0
  328. package/lib/plugin-runtime/workroom-data-governance-root-provider.d.ts +51 -0
  329. package/lib/plugin-runtime/workroom-data-governance-root-provider.d.ts.map +1 -0
  330. package/lib/plugin-runtime/workroom-data-governance-root-provider.js +66 -0
  331. package/lib/plugin-runtime/workroom-data-governance-root-provider.js.map +1 -0
  332. package/lib/plugin-runtime/workroom-data-governance-runtime.d.ts +134 -0
  333. package/lib/plugin-runtime/workroom-data-governance-runtime.d.ts.map +1 -0
  334. package/lib/plugin-runtime/workroom-data-governance-runtime.js +1253 -0
  335. package/lib/plugin-runtime/workroom-data-governance-runtime.js.map +1 -0
  336. package/lib/plugin-runtime/workroom-data-governance-storage.d.ts +66 -0
  337. package/lib/plugin-runtime/workroom-data-governance-storage.d.ts.map +1 -0
  338. package/lib/plugin-runtime/workroom-data-governance-storage.js +160 -0
  339. package/lib/plugin-runtime/workroom-data-governance-storage.js.map +1 -0
  340. package/lib/plugin-runtime/workroom-data-lifecycle-composition.d.ts +37 -0
  341. package/lib/plugin-runtime/workroom-data-lifecycle-composition.d.ts.map +1 -0
  342. package/lib/plugin-runtime/workroom-data-lifecycle-composition.js +131 -0
  343. package/lib/plugin-runtime/workroom-data-lifecycle-composition.js.map +1 -0
  344. package/lib/plugin-runtime/workroom-data-lifecycle-console.d.ts +238 -0
  345. package/lib/plugin-runtime/workroom-data-lifecycle-console.d.ts.map +1 -0
  346. package/lib/plugin-runtime/workroom-data-lifecycle-console.js +495 -0
  347. package/lib/plugin-runtime/workroom-data-lifecycle-console.js.map +1 -0
  348. package/lib/plugin-runtime/workroom-data-lifecycle-human-ingress.d.ts +15 -0
  349. package/lib/plugin-runtime/workroom-data-lifecycle-human-ingress.d.ts.map +1 -0
  350. package/lib/plugin-runtime/workroom-data-lifecycle-human-ingress.js +119 -0
  351. package/lib/plugin-runtime/workroom-data-lifecycle-human-ingress.js.map +1 -0
  352. package/lib/plugin-runtime/workroom-dynamic-planning-provider.d.ts +142 -0
  353. package/lib/plugin-runtime/workroom-dynamic-planning-provider.d.ts.map +1 -0
  354. package/lib/plugin-runtime/workroom-dynamic-planning-provider.js +301 -0
  355. package/lib/plugin-runtime/workroom-dynamic-planning-provider.js.map +1 -0
  356. package/lib/plugin-runtime/workroom-dynamic-planning.d.ts +4 -0
  357. package/lib/plugin-runtime/workroom-dynamic-planning.d.ts.map +1 -0
  358. package/lib/plugin-runtime/workroom-dynamic-planning.js +13 -0
  359. package/lib/plugin-runtime/workroom-dynamic-planning.js.map +1 -0
  360. package/lib/plugin-runtime/workroom-effect-composition.d.ts +37 -0
  361. package/lib/plugin-runtime/workroom-effect-composition.d.ts.map +1 -0
  362. package/lib/plugin-runtime/workroom-effect-composition.js +69 -0
  363. package/lib/plugin-runtime/workroom-effect-composition.js.map +1 -0
  364. package/lib/plugin-runtime/workroom-effect-production.d.ts +133 -0
  365. package/lib/plugin-runtime/workroom-effect-production.d.ts.map +1 -0
  366. package/lib/plugin-runtime/workroom-effect-production.js +272 -0
  367. package/lib/plugin-runtime/workroom-effect-production.js.map +1 -0
  368. package/lib/plugin-runtime/workroom-effect-runtime.d.ts +72 -0
  369. package/lib/plugin-runtime/workroom-effect-runtime.d.ts.map +1 -0
  370. package/lib/plugin-runtime/workroom-effect-runtime.js +179 -0
  371. package/lib/plugin-runtime/workroom-effect-runtime.js.map +1 -0
  372. package/lib/plugin-runtime/workroom-governed-dispatch-composition.d.ts +27 -0
  373. package/lib/plugin-runtime/workroom-governed-dispatch-composition.d.ts.map +1 -0
  374. package/lib/plugin-runtime/workroom-governed-dispatch-composition.js +40 -0
  375. package/lib/plugin-runtime/workroom-governed-dispatch-composition.js.map +1 -0
  376. package/lib/plugin-runtime/workroom-governed-dispatch-reasons.d.ts +10 -0
  377. package/lib/plugin-runtime/workroom-governed-dispatch-reasons.d.ts.map +1 -0
  378. package/lib/plugin-runtime/workroom-governed-dispatch-reasons.js +20 -0
  379. package/lib/plugin-runtime/workroom-governed-dispatch-reasons.js.map +1 -0
  380. package/lib/plugin-runtime/workroom-journal-payload-composition.d.ts +16 -0
  381. package/lib/plugin-runtime/workroom-journal-payload-composition.d.ts.map +1 -0
  382. package/lib/plugin-runtime/workroom-journal-payload-composition.js +69 -0
  383. package/lib/plugin-runtime/workroom-journal-payload-composition.js.map +1 -0
  384. package/lib/plugin-runtime/workroom-local-agent-core-adapter.d.ts +17 -0
  385. package/lib/plugin-runtime/workroom-local-agent-core-adapter.d.ts.map +1 -0
  386. package/lib/plugin-runtime/workroom-local-agent-core-adapter.js +101 -0
  387. package/lib/plugin-runtime/workroom-local-agent-core-adapter.js.map +1 -0
  388. package/lib/plugin-runtime/workroom-local-agent-loop.d.ts +90 -0
  389. package/lib/plugin-runtime/workroom-local-agent-loop.d.ts.map +1 -0
  390. package/lib/plugin-runtime/workroom-local-agent-loop.js +303 -0
  391. package/lib/plugin-runtime/workroom-local-agent-loop.js.map +1 -0
  392. package/lib/plugin-runtime/workroom-local-assignment-authority.d.ts +5 -0
  393. package/lib/plugin-runtime/workroom-local-assignment-authority.d.ts.map +1 -0
  394. package/lib/plugin-runtime/workroom-local-assignment-authority.js +16 -0
  395. package/lib/plugin-runtime/workroom-local-assignment-authority.js.map +1 -0
  396. package/lib/plugin-runtime/workroom-local-assignment-runtime.d.ts +33 -0
  397. package/lib/plugin-runtime/workroom-local-assignment-runtime.d.ts.map +1 -0
  398. package/lib/plugin-runtime/workroom-local-assignment-runtime.js +189 -0
  399. package/lib/plugin-runtime/workroom-local-assignment-runtime.js.map +1 -0
  400. package/lib/plugin-runtime/workroom-local-assignment-supply.d.ts +39 -0
  401. package/lib/plugin-runtime/workroom-local-assignment-supply.d.ts.map +1 -0
  402. package/lib/plugin-runtime/workroom-local-assignment-supply.js +107 -0
  403. package/lib/plugin-runtime/workroom-local-assignment-supply.js.map +1 -0
  404. package/lib/plugin-runtime/workroom-overlay-pack-promotion.d.ts +145 -0
  405. package/lib/plugin-runtime/workroom-overlay-pack-promotion.d.ts.map +1 -0
  406. package/lib/plugin-runtime/workroom-overlay-pack-promotion.js +516 -0
  407. package/lib/plugin-runtime/workroom-overlay-pack-promotion.js.map +1 -0
  408. package/lib/plugin-runtime/workroom-payload-processor-recall.d.ts +91 -0
  409. package/lib/plugin-runtime/workroom-payload-processor-recall.d.ts.map +1 -0
  410. package/lib/plugin-runtime/workroom-payload-processor-recall.js +189 -0
  411. package/lib/plugin-runtime/workroom-payload-processor-recall.js.map +1 -0
  412. package/lib/plugin-runtime/workroom-plan-gate-authority.d.ts +7 -0
  413. package/lib/plugin-runtime/workroom-plan-gate-authority.d.ts.map +1 -0
  414. package/lib/plugin-runtime/workroom-plan-gate-authority.js +40 -0
  415. package/lib/plugin-runtime/workroom-plan-gate-authority.js.map +1 -0
  416. package/lib/plugin-runtime/workroom-portfolio-capacity.d.ts +132 -0
  417. package/lib/plugin-runtime/workroom-portfolio-capacity.d.ts.map +1 -0
  418. package/lib/plugin-runtime/workroom-portfolio-capacity.js +189 -0
  419. package/lib/plugin-runtime/workroom-portfolio-capacity.js.map +1 -0
  420. package/lib/plugin-runtime/workroom-portfolio-checkpoint-ack.d.ts +38 -0
  421. package/lib/plugin-runtime/workroom-portfolio-checkpoint-ack.d.ts.map +1 -0
  422. package/lib/plugin-runtime/workroom-portfolio-checkpoint-ack.js +103 -0
  423. package/lib/plugin-runtime/workroom-portfolio-checkpoint-ack.js.map +1 -0
  424. package/lib/plugin-runtime/workroom-portfolio-control-composition.d.ts +30 -0
  425. package/lib/plugin-runtime/workroom-portfolio-control-composition.d.ts.map +1 -0
  426. package/lib/plugin-runtime/workroom-portfolio-control-composition.js +102 -0
  427. package/lib/plugin-runtime/workroom-portfolio-control-composition.js.map +1 -0
  428. package/lib/plugin-runtime/workroom-portfolio-control-runtime.d.ts +41 -0
  429. package/lib/plugin-runtime/workroom-portfolio-control-runtime.d.ts.map +1 -0
  430. package/lib/plugin-runtime/workroom-portfolio-control-runtime.js +208 -0
  431. package/lib/plugin-runtime/workroom-portfolio-control-runtime.js.map +1 -0
  432. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.d.ts +141 -0
  433. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.d.ts.map +1 -0
  434. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.js +331 -0
  435. package/lib/plugin-runtime/workroom-portfolio-grant-assignment.js.map +1 -0
  436. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.d.ts +23 -0
  437. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.d.ts.map +1 -0
  438. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.js +82 -0
  439. package/lib/plugin-runtime/workroom-portfolio-kernel-authority.js.map +1 -0
  440. package/lib/plugin-runtime/workroom-portfolio-sponsor.d.ts +96 -0
  441. package/lib/plugin-runtime/workroom-portfolio-sponsor.d.ts.map +1 -0
  442. package/lib/plugin-runtime/workroom-portfolio-sponsor.js +313 -0
  443. package/lib/plugin-runtime/workroom-portfolio-sponsor.js.map +1 -0
  444. package/lib/plugin-runtime/workroom-preemption-runtime.d.ts +57 -0
  445. package/lib/plugin-runtime/workroom-preemption-runtime.d.ts.map +1 -0
  446. package/lib/plugin-runtime/workroom-preemption-runtime.js +163 -0
  447. package/lib/plugin-runtime/workroom-preemption-runtime.js.map +1 -0
  448. package/lib/plugin-runtime/workroom-priority-authority.d.ts +11 -0
  449. package/lib/plugin-runtime/workroom-priority-authority.d.ts.map +1 -0
  450. package/lib/plugin-runtime/workroom-priority-authority.js +72 -0
  451. package/lib/plugin-runtime/workroom-priority-authority.js.map +1 -0
  452. package/lib/plugin-runtime/workroom-profile-authority-composition.d.ts +61 -0
  453. package/lib/plugin-runtime/workroom-profile-authority-composition.d.ts.map +1 -0
  454. package/lib/plugin-runtime/workroom-profile-authority-composition.js +231 -0
  455. package/lib/plugin-runtime/workroom-profile-authority-composition.js.map +1 -0
  456. package/lib/plugin-runtime/workroom-profile-authority-runtime.d.ts +228 -0
  457. package/lib/plugin-runtime/workroom-profile-authority-runtime.d.ts.map +1 -0
  458. package/lib/plugin-runtime/workroom-profile-authority-runtime.js +1132 -0
  459. package/lib/plugin-runtime/workroom-profile-authority-runtime.js.map +1 -0
  460. package/lib/plugin-runtime/workroom-projection-outbound.d.ts +10 -0
  461. package/lib/plugin-runtime/workroom-projection-outbound.d.ts.map +1 -0
  462. package/lib/plugin-runtime/workroom-projection-outbound.js +35 -0
  463. package/lib/plugin-runtime/workroom-projection-outbound.js.map +1 -0
  464. package/lib/plugin-runtime/workroom-projection-runtime.d.ts +87 -0
  465. package/lib/plugin-runtime/workroom-projection-runtime.d.ts.map +1 -0
  466. package/lib/plugin-runtime/workroom-projection-runtime.js +421 -0
  467. package/lib/plugin-runtime/workroom-projection-runtime.js.map +1 -0
  468. package/lib/plugin-runtime/workroom-remote-assignment-authority.d.ts +9 -0
  469. package/lib/plugin-runtime/workroom-remote-assignment-authority.d.ts.map +1 -0
  470. package/lib/plugin-runtime/workroom-remote-assignment-authority.js +20 -0
  471. package/lib/plugin-runtime/workroom-remote-assignment-authority.js.map +1 -0
  472. package/lib/plugin-runtime/workroom-remote-callback-runtime.d.ts +38 -0
  473. package/lib/plugin-runtime/workroom-remote-callback-runtime.d.ts.map +1 -0
  474. package/lib/plugin-runtime/workroom-remote-callback-runtime.js +80 -0
  475. package/lib/plugin-runtime/workroom-remote-callback-runtime.js.map +1 -0
  476. package/lib/plugin-runtime/workroom-remote-executor.d.ts +20 -0
  477. package/lib/plugin-runtime/workroom-remote-executor.d.ts.map +1 -0
  478. package/lib/plugin-runtime/workroom-remote-executor.js +42 -0
  479. package/lib/plugin-runtime/workroom-remote-executor.js.map +1 -0
  480. package/lib/plugin-runtime/workroom-reviewer-authority-runtime.d.ts +72 -0
  481. package/lib/plugin-runtime/workroom-reviewer-authority-runtime.d.ts.map +1 -0
  482. package/lib/plugin-runtime/workroom-reviewer-authority-runtime.js +142 -0
  483. package/lib/plugin-runtime/workroom-reviewer-authority-runtime.js.map +1 -0
  484. package/lib/plugin-runtime/workroom-risk-acceptance-runtime.d.ts +112 -0
  485. package/lib/plugin-runtime/workroom-risk-acceptance-runtime.d.ts.map +1 -0
  486. package/lib/plugin-runtime/workroom-risk-acceptance-runtime.js +376 -0
  487. package/lib/plugin-runtime/workroom-risk-acceptance-runtime.js.map +1 -0
  488. package/lib/plugin-runtime/workroom-run-profile-pin-authority.d.ts +42 -0
  489. package/lib/plugin-runtime/workroom-run-profile-pin-authority.d.ts.map +1 -0
  490. package/lib/plugin-runtime/workroom-run-profile-pin-authority.js +125 -0
  491. package/lib/plugin-runtime/workroom-run-profile-pin-authority.js.map +1 -0
  492. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.d.ts +25 -0
  493. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.d.ts.map +1 -0
  494. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.js +79 -0
  495. package/lib/plugin-runtime/workroom-scheduler-portfolio-composition.js.map +1 -0
  496. package/lib/plugin-runtime/workroom-scheduler-portfolio-contract.d.ts +16 -0
  497. package/lib/plugin-runtime/workroom-scheduler-portfolio-contract.d.ts.map +1 -0
  498. package/lib/plugin-runtime/workroom-scheduler-portfolio-contract.js +49 -0
  499. package/lib/plugin-runtime/workroom-scheduler-portfolio-contract.js.map +1 -0
  500. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.d.ts +63 -0
  501. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.d.ts.map +1 -0
  502. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.js +233 -0
  503. package/lib/plugin-runtime/workroom-scheduler-portfolio-request-authority.js.map +1 -0
  504. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.d.ts +37 -0
  505. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.d.ts.map +1 -0
  506. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.js +122 -0
  507. package/lib/plugin-runtime/workroom-scheduler-portfolio-supply.js.map +1 -0
  508. package/lib/plugin-runtime/workroom-scheduler-route-registry.d.ts +27 -0
  509. package/lib/plugin-runtime/workroom-scheduler-route-registry.d.ts.map +1 -0
  510. package/lib/plugin-runtime/workroom-scheduler-route-registry.js +136 -0
  511. package/lib/plugin-runtime/workroom-scheduler-route-registry.js.map +1 -0
  512. package/lib/plugin-runtime/workroom-scheduler-runtime.d.ts +84 -0
  513. package/lib/plugin-runtime/workroom-scheduler-runtime.d.ts.map +1 -0
  514. package/lib/plugin-runtime/workroom-scheduler-runtime.js +231 -0
  515. package/lib/plugin-runtime/workroom-scheduler-runtime.js.map +1 -0
  516. package/lib/portfolio/capacity-control-outbox.d.ts +174 -0
  517. package/lib/portfolio/capacity-control-outbox.d.ts.map +1 -0
  518. package/lib/portfolio/capacity-control-outbox.js +338 -0
  519. package/lib/portfolio/capacity-control-outbox.js.map +1 -0
  520. package/lib/portfolio/database-capacity-control-outbox.d.ts +62 -0
  521. package/lib/portfolio/database-capacity-control-outbox.d.ts.map +1 -0
  522. package/lib/portfolio/database-capacity-control-outbox.js +166 -0
  523. package/lib/portfolio/database-capacity-control-outbox.js.map +1 -0
  524. package/lib/portfolio/file-capacity-control-outbox.d.ts +10 -0
  525. package/lib/portfolio/file-capacity-control-outbox.d.ts.map +1 -0
  526. package/lib/portfolio/file-capacity-control-outbox.js +113 -0
  527. package/lib/portfolio/file-capacity-control-outbox.js.map +1 -0
  528. package/lib/portfolio/file-portfolio-journal.d.ts +11 -0
  529. package/lib/portfolio/file-portfolio-journal.d.ts.map +1 -0
  530. package/lib/portfolio/file-portfolio-journal.js +196 -0
  531. package/lib/portfolio/file-portfolio-journal.js.map +1 -0
  532. package/lib/portfolio/portfolio-admission.d.ts +95 -0
  533. package/lib/portfolio/portfolio-admission.d.ts.map +1 -0
  534. package/lib/portfolio/portfolio-admission.js +1080 -0
  535. package/lib/portfolio/portfolio-admission.js.map +1 -0
  536. package/lib/portfolio/portfolio-journal.d.ts +359 -0
  537. package/lib/portfolio/portfolio-journal.d.ts.map +1 -0
  538. package/lib/portfolio/portfolio-journal.js +844 -0
  539. package/lib/portfolio/portfolio-journal.js.map +1 -0
  540. package/lib/portfolio/resource-bundle.d.ts +136 -0
  541. package/lib/portfolio/resource-bundle.d.ts.map +1 -0
  542. package/lib/portfolio/resource-bundle.js +387 -0
  543. package/lib/portfolio/resource-bundle.js.map +1 -0
  544. package/lib/portfolio/sponsor-projection.d.ts +78 -0
  545. package/lib/portfolio/sponsor-projection.d.ts.map +1 -0
  546. package/lib/portfolio/sponsor-projection.js +135 -0
  547. package/lib/portfolio/sponsor-projection.js.map +1 -0
  548. package/lib/prompt/assembly.d.ts.map +1 -1
  549. package/lib/prompt/assembly.js +1 -3
  550. package/lib/prompt/assembly.js.map +1 -1
  551. package/lib/prompt/prompt-builder.d.ts +1 -1
  552. package/lib/prompt/prompt-builder.d.ts.map +1 -1
  553. package/lib/prompt/system-prompt.d.ts +1 -1
  554. package/lib/prompt/system-prompt.js +2 -2
  555. package/lib/prompt/system-prompt.js.map +1 -1
  556. package/lib/reserved-tools.d.ts.map +1 -1
  557. package/lib/reserved-tools.js +0 -1
  558. package/lib/reserved-tools.js.map +1 -1
  559. package/lib/{orchestrator → resource-hub}/hook-registry.d.ts.map +1 -1
  560. package/lib/{orchestrator → resource-hub}/hook-registry.js.map +1 -1
  561. package/lib/{orchestrator → resource-hub}/index.d.ts +4 -11
  562. package/lib/{orchestrator → resource-hub}/index.d.ts.map +1 -1
  563. package/lib/{orchestrator → resource-hub}/index.js +4 -8
  564. package/lib/{orchestrator → resource-hub}/index.js.map +1 -1
  565. package/lib/{orchestrator → resource-hub}/mcp-lifecycle.d.ts.map +1 -1
  566. package/lib/{orchestrator → resource-hub}/mcp-lifecycle.js.map +1 -1
  567. package/lib/{orchestrator → resource-hub}/mcp-registry.d.ts.map +1 -1
  568. package/lib/{orchestrator → resource-hub}/mcp-registry.js.map +1 -1
  569. package/lib/{orchestrator → resource-hub}/resolve-subagent-tools.d.ts +3 -3
  570. package/lib/resource-hub/resolve-subagent-tools.d.ts.map +1 -0
  571. package/lib/{orchestrator → resource-hub}/resolve-subagent-tools.js +18 -13
  572. package/lib/resource-hub/resolve-subagent-tools.js.map +1 -0
  573. package/lib/{orchestrator → resource-hub}/resource-registry.d.ts.map +1 -1
  574. package/lib/{orchestrator → resource-hub}/resource-registry.js.map +1 -1
  575. package/lib/{orchestrator → resource-hub}/role-configs.d.ts.map +1 -1
  576. package/lib/{orchestrator → resource-hub}/role-configs.js +0 -2
  577. package/lib/{orchestrator → resource-hub}/role-configs.js.map +1 -1
  578. package/lib/{orchestrator → resource-hub}/skill-registry.d.ts.map +1 -1
  579. package/lib/{orchestrator → resource-hub}/skill-registry.js.map +1 -1
  580. package/lib/{orchestrator → resource-hub}/subagent-registry.d.ts.map +1 -1
  581. package/lib/{orchestrator → resource-hub}/subagent-registry.js.map +1 -1
  582. package/lib/{orchestrator → resource-hub}/tool-registry.d.ts.map +1 -1
  583. package/lib/{orchestrator → resource-hub}/tool-registry.js.map +1 -1
  584. package/lib/{orchestrator → resource-hub}/tool-selection.d.ts.map +1 -1
  585. package/lib/{orchestrator → resource-hub}/tool-selection.js.map +1 -1
  586. package/lib/{orchestrator → resource-hub}/types.d.ts +1 -1
  587. package/lib/{orchestrator → resource-hub}/types.d.ts.map +1 -1
  588. package/lib/{orchestrator → resource-hub}/types.js.map +1 -1
  589. package/lib/routing/workroom-bot-identity.d.ts +22 -0
  590. package/lib/routing/workroom-bot-identity.d.ts.map +1 -0
  591. package/lib/routing/workroom-bot-identity.js +46 -0
  592. package/lib/routing/workroom-bot-identity.js.map +1 -0
  593. package/lib/schedule-domain/budget-guard.d.ts +1 -1
  594. package/lib/schedule-domain/budget-guard.d.ts.map +1 -1
  595. package/lib/schedule-domain/budget-guard.js +9 -1
  596. package/lib/schedule-domain/budget-guard.js.map +1 -1
  597. package/lib/schedule-domain/execution-domain.d.ts +1 -0
  598. package/lib/schedule-domain/execution-domain.d.ts.map +1 -1
  599. package/lib/schedule-domain/execution-domain.js +3 -1
  600. package/lib/schedule-domain/execution-domain.js.map +1 -1
  601. package/lib/schedule-domain/schedule-execution-queue.d.ts +24 -0
  602. package/lib/schedule-domain/schedule-execution-queue.d.ts.map +1 -0
  603. package/lib/schedule-domain/schedule-execution-queue.js +123 -0
  604. package/lib/schedule-domain/schedule-execution-queue.js.map +1 -0
  605. package/lib/seam/seam-integration.d.ts +1 -1
  606. package/lib/seam/seam-integration.js +1 -1
  607. package/lib/seam/skill-service.d.ts +1 -1
  608. package/lib/security/exec-policy.d.ts +11 -1
  609. package/lib/security/exec-policy.d.ts.map +1 -1
  610. package/lib/security/exec-policy.js +16 -4
  611. package/lib/security/exec-policy.js.map +1 -1
  612. package/lib/security/policy-facade.d.ts.map +1 -1
  613. package/lib/security/policy-facade.js +60 -5
  614. package/lib/security/policy-facade.js.map +1 -1
  615. package/lib/security/sandbox-docker.js +1 -1
  616. package/lib/security/sandbox-docker.js.map +1 -1
  617. package/lib/security/sandbox.d.ts +2 -0
  618. package/lib/security/sandbox.d.ts.map +1 -1
  619. package/lib/security/sandbox.js +16 -4
  620. package/lib/security/sandbox.js.map +1 -1
  621. package/lib/security/turn-file-authority.d.ts +1 -1
  622. package/lib/security/turn-file-authority.d.ts.map +1 -1
  623. package/lib/security/turn-file-authority.js +10 -3
  624. package/lib/security/turn-file-authority.js.map +1 -1
  625. package/lib/security/turn-sandbox-authority.d.ts +13 -0
  626. package/lib/security/turn-sandbox-authority.d.ts.map +1 -0
  627. package/lib/security/turn-sandbox-authority.js +42 -0
  628. package/lib/security/turn-sandbox-authority.js.map +1 -0
  629. package/lib/service.d.ts +2 -0
  630. package/lib/service.d.ts.map +1 -1
  631. package/lib/service.js +2 -1
  632. package/lib/service.js.map +1 -1
  633. package/lib/session/approval-port.d.ts +2 -0
  634. package/lib/session/approval-port.d.ts.map +1 -1
  635. package/lib/session/approval-port.js.map +1 -1
  636. package/lib/session/index.d.ts +2 -6
  637. package/lib/session/index.d.ts.map +1 -1
  638. package/lib/session/index.js +2 -4
  639. package/lib/session/index.js.map +1 -1
  640. package/lib/session/session-io.d.ts +2 -6
  641. package/lib/session/session-io.d.ts.map +1 -1
  642. package/lib/session/session-io.js +4 -20
  643. package/lib/session/session-io.js.map +1 -1
  644. package/lib/session/session-system.d.ts +0 -2
  645. package/lib/session/session-system.d.ts.map +1 -1
  646. package/lib/session/session-system.js +2 -13
  647. package/lib/session/session-system.js.map +1 -1
  648. package/lib/session/turn-ingress-session.d.ts +1 -5
  649. package/lib/session/turn-ingress-session.d.ts.map +1 -1
  650. package/lib/session/turn-ingress-session.js +27 -29
  651. package/lib/session/turn-ingress-session.js.map +1 -1
  652. package/lib/session-tree-runtime.d.ts +15 -0
  653. package/lib/session-tree-runtime.d.ts.map +1 -0
  654. package/lib/{session-tree-runtime-registry.js → session-tree-runtime.js} +5 -15
  655. package/lib/session-tree-runtime.js.map +1 -0
  656. package/lib/skill/index.d.ts +2 -2
  657. package/lib/skill/index.d.ts.map +1 -1
  658. package/lib/skill/index.js +1 -1
  659. package/lib/skill/skill-registry-as-service.d.ts +1 -1
  660. package/lib/skill/skill-system.d.ts +4 -4
  661. package/lib/skill/skill-system.d.ts.map +1 -1
  662. package/lib/skill/skill-system.js +2 -2
  663. package/lib/skill/skill-system.js.map +1 -1
  664. package/lib/subagent/subagent-runtime.d.ts +2 -7
  665. package/lib/subagent/subagent-runtime.d.ts.map +1 -1
  666. package/lib/subagent/subagent-runtime.js +4 -43
  667. package/lib/subagent/subagent-runtime.js.map +1 -1
  668. package/lib/subagent/subagent-system-init.d.ts.map +1 -1
  669. package/lib/subagent/subagent-system-init.js +0 -2
  670. package/lib/subagent/subagent-system-init.js.map +1 -1
  671. package/lib/subagent-ai-events.d.ts +1 -1
  672. package/lib/subagent-ai-events.js +1 -1
  673. package/lib/subagent-preset.d.ts +1 -1
  674. package/lib/subagent-preset.d.ts.map +1 -1
  675. package/lib/subagent-prompt.d.ts +0 -2
  676. package/lib/subagent-prompt.d.ts.map +1 -1
  677. package/lib/subagent-prompt.js +3 -3
  678. package/lib/subagent-prompt.js.map +1 -1
  679. package/lib/task-executor.d.ts +1 -0
  680. package/lib/task-executor.d.ts.map +1 -1
  681. package/lib/task-executor.js +4 -1
  682. package/lib/task-executor.js.map +1 -1
  683. package/lib/tool/classic-tool-execution-authority.js +2 -2
  684. package/lib/tool/classic-tool-execution-authority.js.map +1 -1
  685. package/lib/tool/context-tools.d.ts +1 -4
  686. package/lib/tool/context-tools.d.ts.map +1 -1
  687. package/lib/tool/context-tools.js +0 -50
  688. package/lib/tool/context-tools.js.map +1 -1
  689. package/lib/tool/contracts.d.ts +1 -1
  690. package/lib/tool/conversation-reference-tool.d.ts +5 -0
  691. package/lib/tool/conversation-reference-tool.d.ts.map +1 -0
  692. package/lib/tool/conversation-reference-tool.js +40 -0
  693. package/lib/tool/conversation-reference-tool.js.map +1 -0
  694. package/lib/tool/index.d.ts +1 -0
  695. package/lib/tool/index.d.ts.map +1 -1
  696. package/lib/tool/index.js +1 -0
  697. package/lib/tool/index.js.map +1 -1
  698. package/lib/tool/prepare-turn-tools.d.ts.map +1 -1
  699. package/lib/tool/prepare-turn-tools.js +7 -22
  700. package/lib/tool/prepare-turn-tools.js.map +1 -1
  701. package/lib/tool/runtime.d.ts +3 -4
  702. package/lib/tool/runtime.d.ts.map +1 -1
  703. package/lib/tool/runtime.js +0 -1
  704. package/lib/tool/runtime.js.map +1 -1
  705. package/lib/tool/sources.d.ts +3 -4
  706. package/lib/tool/sources.d.ts.map +1 -1
  707. package/lib/tool/sources.js +2 -6
  708. package/lib/tool/sources.js.map +1 -1
  709. package/lib/tool/tool-approval-once-store.d.ts +1 -1
  710. package/lib/tool/tool-approval-once-store.js +1 -1
  711. package/lib/tool/tool-system.d.ts.map +1 -1
  712. package/lib/tool/tool-system.js.map +1 -1
  713. package/lib/tool/turn-tool-runtime.d.ts +2 -1
  714. package/lib/tool/turn-tool-runtime.d.ts.map +1 -1
  715. package/lib/tool/turn-tool-runtime.js +76 -21
  716. package/lib/tool/turn-tool-runtime.js.map +1 -1
  717. package/lib/tool-bridge.d.ts +2 -2
  718. package/lib/tool-bridge.js +1 -1
  719. package/lib/tool-catalog/deferred-turn-controller.d.ts +1 -1
  720. package/lib/tool-catalog/tool-catalog.d.ts +1 -1
  721. package/lib/turn/auto-continue.d.ts +1 -1
  722. package/lib/turn/deferred-delivery.d.ts +1 -1
  723. package/lib/turn/inbound-media.d.ts +12 -8
  724. package/lib/turn/inbound-media.d.ts.map +1 -1
  725. package/lib/turn/inbound-media.js +61 -42
  726. package/lib/turn/inbound-media.js.map +1 -1
  727. package/lib/turn/inbound-queue-config.d.ts +1 -1
  728. package/lib/turn/inbound-queue-runtime.d.ts +1 -1
  729. package/lib/turn/inbound-turn-queue.d.ts +1 -1
  730. package/lib/turn/index.d.ts +1 -1
  731. package/lib/turn/index.d.ts.map +1 -1
  732. package/lib/turn/index.js.map +1 -1
  733. package/lib/turn/persist-deferred-context.d.ts +1 -1
  734. package/lib/turn/persist-subagent-context.d.ts +1 -1
  735. package/lib/turn/process-stream.d.ts +1 -1
  736. package/lib/turn/prompt-api.d.ts +1 -1
  737. package/lib/turn/prompt-controller.d.ts +6 -0
  738. package/lib/turn/prompt-controller.d.ts.map +1 -1
  739. package/lib/turn/prompt-controller.js +58 -5
  740. package/lib/turn/prompt-controller.js.map +1 -1
  741. package/lib/turn/turn-ingress.d.ts +55 -5
  742. package/lib/turn/turn-ingress.d.ts.map +1 -1
  743. package/lib/turn/turn-ingress.js +18 -0
  744. package/lib/turn/turn-ingress.js.map +1 -1
  745. package/lib/turn/turn-pipeline.d.ts.map +1 -1
  746. package/lib/turn/turn-pipeline.js +5 -4
  747. package/lib/turn/turn-pipeline.js.map +1 -1
  748. package/lib/utils/keyed-mutex.d.ts +1 -1
  749. package/lib/utils/keyed-mutex.d.ts.map +1 -1
  750. package/lib/utils/keyed-mutex.js +32 -5
  751. package/lib/utils/keyed-mutex.js.map +1 -1
  752. package/lib/workroom/acceptance-control.d.ts +76 -0
  753. package/lib/workroom/acceptance-control.d.ts.map +1 -0
  754. package/lib/workroom/acceptance-control.js +335 -0
  755. package/lib/workroom/acceptance-control.js.map +1 -0
  756. package/lib/workroom/acceptance-policy.d.ts +152 -0
  757. package/lib/workroom/acceptance-policy.d.ts.map +1 -0
  758. package/lib/workroom/acceptance-policy.js +610 -0
  759. package/lib/workroom/acceptance-policy.js.map +1 -0
  760. package/lib/workroom/accepted-source-memory-application.d.ts +113 -0
  761. package/lib/workroom/accepted-source-memory-application.d.ts.map +1 -0
  762. package/lib/workroom/accepted-source-memory-application.js +327 -0
  763. package/lib/workroom/accepted-source-memory-application.js.map +1 -0
  764. package/lib/workroom/accepted-source-projector.d.ts +89 -0
  765. package/lib/workroom/accepted-source-projector.d.ts.map +1 -0
  766. package/lib/workroom/accepted-source-projector.js +281 -0
  767. package/lib/workroom/accepted-source-projector.js.map +1 -0
  768. package/lib/workroom/assignment-authority-grant-application.d.ts +125 -0
  769. package/lib/workroom/assignment-authority-grant-application.d.ts.map +1 -0
  770. package/lib/workroom/assignment-authority-grant-application.js +317 -0
  771. package/lib/workroom/assignment-authority-grant-application.js.map +1 -0
  772. package/lib/workroom/assignment-authority-grant-repository.d.ts +151 -0
  773. package/lib/workroom/assignment-authority-grant-repository.d.ts.map +1 -0
  774. package/lib/workroom/assignment-authority-grant-repository.js +387 -0
  775. package/lib/workroom/assignment-authority-grant-repository.js.map +1 -0
  776. package/lib/workroom/assignment-executor.d.ts +110 -0
  777. package/lib/workroom/assignment-executor.d.ts.map +1 -0
  778. package/lib/workroom/assignment-executor.js +371 -0
  779. package/lib/workroom/assignment-executor.js.map +1 -0
  780. package/lib/workroom/assignment-observation-ingress.d.ts +21 -0
  781. package/lib/workroom/assignment-observation-ingress.d.ts.map +1 -0
  782. package/lib/workroom/assignment-observation-ingress.js +24 -0
  783. package/lib/workroom/assignment-observation-ingress.js.map +1 -0
  784. package/lib/workroom/canonical-value.d.ts +7 -0
  785. package/lib/workroom/canonical-value.d.ts.map +1 -0
  786. package/lib/workroom/canonical-value.js +32 -0
  787. package/lib/workroom/canonical-value.js.map +1 -0
  788. package/lib/workroom/catalog-definition.d.ts +49 -0
  789. package/lib/workroom/catalog-definition.d.ts.map +1 -0
  790. package/lib/workroom/catalog-definition.js +2 -0
  791. package/lib/workroom/catalog-definition.js.map +1 -0
  792. package/lib/workroom/catalog.d.ts +80 -0
  793. package/lib/workroom/catalog.d.ts.map +1 -0
  794. package/lib/workroom/catalog.js +372 -0
  795. package/lib/workroom/catalog.js.map +1 -0
  796. package/lib/workroom/database-project-knowledge-journal.d.ts +62 -0
  797. package/lib/workroom/database-project-knowledge-journal.d.ts.map +1 -0
  798. package/lib/workroom/database-project-knowledge-journal.js +161 -0
  799. package/lib/workroom/database-project-knowledge-journal.js.map +1 -0
  800. package/lib/workroom/durable-file-store.d.ts +52 -0
  801. package/lib/workroom/durable-file-store.d.ts.map +1 -0
  802. package/lib/workroom/durable-file-store.js +117 -0
  803. package/lib/workroom/durable-file-store.js.map +1 -0
  804. package/lib/workroom/dynamic-workflow-planner.d.ts +86 -0
  805. package/lib/workroom/dynamic-workflow-planner.d.ts.map +1 -0
  806. package/lib/workroom/dynamic-workflow-planner.js +260 -0
  807. package/lib/workroom/dynamic-workflow-planner.js.map +1 -0
  808. package/lib/workroom/effect-blocker-repository.d.ts +35 -0
  809. package/lib/workroom/effect-blocker-repository.d.ts.map +1 -0
  810. package/lib/workroom/effect-blocker-repository.js +174 -0
  811. package/lib/workroom/effect-blocker-repository.js.map +1 -0
  812. package/lib/workroom/effect-ledger.d.ts +191 -0
  813. package/lib/workroom/effect-ledger.d.ts.map +1 -0
  814. package/lib/workroom/effect-ledger.js +443 -0
  815. package/lib/workroom/effect-ledger.js.map +1 -0
  816. package/lib/workroom/file-accepted-source-memory-repository.d.ts +15 -0
  817. package/lib/workroom/file-accepted-source-memory-repository.d.ts.map +1 -0
  818. package/lib/workroom/file-accepted-source-memory-repository.js +133 -0
  819. package/lib/workroom/file-accepted-source-memory-repository.js.map +1 -0
  820. package/lib/workroom/file-effect-ledger.d.ts +10 -0
  821. package/lib/workroom/file-effect-ledger.d.ts.map +1 -0
  822. package/lib/workroom/file-effect-ledger.js +118 -0
  823. package/lib/workroom/file-effect-ledger.js.map +1 -0
  824. package/lib/workroom/file-human-ingress-application.d.ts +10 -0
  825. package/lib/workroom/file-human-ingress-application.d.ts.map +1 -0
  826. package/lib/workroom/file-human-ingress-application.js +177 -0
  827. package/lib/workroom/file-human-ingress-application.js.map +1 -0
  828. package/lib/workroom/file-human-ingress.d.ts +24 -0
  829. package/lib/workroom/file-human-ingress.d.ts.map +1 -0
  830. package/lib/workroom/file-human-ingress.js +234 -0
  831. package/lib/workroom/file-human-ingress.js.map +1 -0
  832. package/lib/workroom/file-interaction-space-binding-repository.d.ts +24 -0
  833. package/lib/workroom/file-interaction-space-binding-repository.d.ts.map +1 -0
  834. package/lib/workroom/file-interaction-space-binding-repository.js +293 -0
  835. package/lib/workroom/file-interaction-space-binding-repository.js.map +1 -0
  836. package/lib/workroom/file-profile-journal.d.ts +32 -0
  837. package/lib/workroom/file-profile-journal.d.ts.map +1 -0
  838. package/lib/workroom/file-profile-journal.js +308 -0
  839. package/lib/workroom/file-profile-journal.js.map +1 -0
  840. package/lib/workroom/git-workspace-gateway.d.ts +149 -0
  841. package/lib/workroom/git-workspace-gateway.d.ts.map +1 -0
  842. package/lib/workroom/git-workspace-gateway.js +248 -0
  843. package/lib/workroom/git-workspace-gateway.js.map +1 -0
  844. package/lib/workroom/human-ingress-application.d.ts +126 -0
  845. package/lib/workroom/human-ingress-application.d.ts.map +1 -0
  846. package/lib/workroom/human-ingress-application.js +414 -0
  847. package/lib/workroom/human-ingress-application.js.map +1 -0
  848. package/lib/workroom/human-ingress-orchestrator.d.ts +99 -0
  849. package/lib/workroom/human-ingress-orchestrator.d.ts.map +1 -0
  850. package/lib/workroom/human-ingress-orchestrator.js +234 -0
  851. package/lib/workroom/human-ingress-orchestrator.js.map +1 -0
  852. package/lib/workroom/human-ingress-source-reader.d.ts +29 -0
  853. package/lib/workroom/human-ingress-source-reader.d.ts.map +1 -0
  854. package/lib/workroom/human-ingress-source-reader.js +119 -0
  855. package/lib/workroom/human-ingress-source-reader.js.map +1 -0
  856. package/lib/workroom/human-ingress.d.ts +182 -0
  857. package/lib/workroom/human-ingress.d.ts.map +1 -0
  858. package/lib/workroom/human-ingress.js +526 -0
  859. package/lib/workroom/human-ingress.js.map +1 -0
  860. package/lib/workroom/interaction-space-binding-service.d.ts +57 -0
  861. package/lib/workroom/interaction-space-binding-service.d.ts.map +1 -0
  862. package/lib/workroom/interaction-space-binding-service.js +197 -0
  863. package/lib/workroom/interaction-space-binding-service.js.map +1 -0
  864. package/lib/workroom/interaction-space-router.d.ts +75 -0
  865. package/lib/workroom/interaction-space-router.d.ts.map +1 -0
  866. package/lib/workroom/interaction-space-router.js +243 -0
  867. package/lib/workroom/interaction-space-router.js.map +1 -0
  868. package/lib/workroom/journal-model.d.ts +40 -0
  869. package/lib/workroom/journal-model.d.ts.map +1 -0
  870. package/lib/workroom/journal-model.js +12 -0
  871. package/lib/workroom/journal-model.js.map +1 -0
  872. package/lib/workroom/journal.d.ts +217 -0
  873. package/lib/workroom/journal.d.ts.map +1 -0
  874. package/lib/workroom/journal.js +2022 -0
  875. package/lib/workroom/journal.js.map +1 -0
  876. package/lib/workroom/kernel-contracts.d.ts +168 -0
  877. package/lib/workroom/kernel-contracts.d.ts.map +1 -0
  878. package/lib/workroom/kernel-contracts.js +2 -0
  879. package/lib/workroom/kernel-contracts.js.map +1 -0
  880. package/lib/workroom/kernel-state.d.ts +5 -0
  881. package/lib/workroom/kernel-state.d.ts.map +1 -0
  882. package/lib/workroom/kernel-state.js +853 -0
  883. package/lib/workroom/kernel-state.js.map +1 -0
  884. package/lib/workroom/legacy-embedded-payload-migration.d.ts +89 -0
  885. package/lib/workroom/legacy-embedded-payload-migration.d.ts.map +1 -0
  886. package/lib/workroom/legacy-embedded-payload-migration.js +312 -0
  887. package/lib/workroom/legacy-embedded-payload-migration.js.map +1 -0
  888. package/lib/workroom/legacy-run-offline-migration.d.ts +84 -0
  889. package/lib/workroom/legacy-run-offline-migration.d.ts.map +1 -0
  890. package/lib/workroom/legacy-run-offline-migration.js +470 -0
  891. package/lib/workroom/legacy-run-offline-migration.js.map +1 -0
  892. package/lib/workroom/local-assignment-executor.d.ts +59 -0
  893. package/lib/workroom/local-assignment-executor.d.ts.map +1 -0
  894. package/lib/workroom/local-assignment-executor.js +197 -0
  895. package/lib/workroom/local-assignment-executor.js.map +1 -0
  896. package/lib/workroom/local-assignment-issuance.d.ts +68 -0
  897. package/lib/workroom/local-assignment-issuance.d.ts.map +1 -0
  898. package/lib/workroom/local-assignment-issuance.js +128 -0
  899. package/lib/workroom/local-assignment-issuance.js.map +1 -0
  900. package/lib/workroom/plan-approval-control.d.ts +52 -0
  901. package/lib/workroom/plan-approval-control.d.ts.map +1 -0
  902. package/lib/workroom/plan-approval-control.js +9 -0
  903. package/lib/workroom/plan-approval-control.js.map +1 -0
  904. package/lib/workroom/plan-revision.d.ts +44 -0
  905. package/lib/workroom/plan-revision.d.ts.map +1 -0
  906. package/lib/workroom/plan-revision.js +133 -0
  907. package/lib/workroom/plan-revision.js.map +1 -0
  908. package/lib/workroom/profile-compiler.d.ts +130 -0
  909. package/lib/workroom/profile-compiler.d.ts.map +1 -0
  910. package/lib/workroom/profile-compiler.js +357 -0
  911. package/lib/workroom/profile-compiler.js.map +1 -0
  912. package/lib/workroom/profile-registry.d.ts +191 -0
  913. package/lib/workroom/profile-registry.d.ts.map +1 -0
  914. package/lib/workroom/profile-registry.js +698 -0
  915. package/lib/workroom/profile-registry.js.map +1 -0
  916. package/lib/workroom/project-knowledge-registry.d.ts +136 -0
  917. package/lib/workroom/project-knowledge-registry.d.ts.map +1 -0
  918. package/lib/workroom/project-knowledge-registry.js +429 -0
  919. package/lib/workroom/project-knowledge-registry.js.map +1 -0
  920. package/lib/workroom/projection-outbox.d.ts +254 -0
  921. package/lib/workroom/projection-outbox.d.ts.map +1 -0
  922. package/lib/workroom/projection-outbox.js +1312 -0
  923. package/lib/workroom/projection-outbox.js.map +1 -0
  924. package/lib/workroom/remote-assignment-dispatch-command.d.ts +31 -0
  925. package/lib/workroom/remote-assignment-dispatch-command.d.ts.map +1 -0
  926. package/lib/workroom/remote-assignment-dispatch-command.js +56 -0
  927. package/lib/workroom/remote-assignment-dispatch-command.js.map +1 -0
  928. package/lib/workroom/remote-assignment-issuance.d.ts +88 -0
  929. package/lib/workroom/remote-assignment-issuance.d.ts.map +1 -0
  930. package/lib/workroom/remote-assignment-issuance.js +201 -0
  931. package/lib/workroom/remote-assignment-issuance.js.map +1 -0
  932. package/lib/workroom/remote-callback-application.d.ts +115 -0
  933. package/lib/workroom/remote-callback-application.d.ts.map +1 -0
  934. package/lib/workroom/remote-callback-application.js +570 -0
  935. package/lib/workroom/remote-callback-application.js.map +1 -0
  936. package/lib/workroom/remote-callback-gateway.d.ts +60 -0
  937. package/lib/workroom/remote-callback-gateway.d.ts.map +1 -0
  938. package/lib/workroom/remote-callback-gateway.js +173 -0
  939. package/lib/workroom/remote-callback-gateway.js.map +1 -0
  940. package/lib/workroom/remote-callback-inbox.d.ts +278 -0
  941. package/lib/workroom/remote-callback-inbox.d.ts.map +1 -0
  942. package/lib/workroom/remote-callback-inbox.js +1088 -0
  943. package/lib/workroom/remote-callback-inbox.js.map +1 -0
  944. package/lib/workroom/remote-callback-reconciliation-worker.d.ts +60 -0
  945. package/lib/workroom/remote-callback-reconciliation-worker.d.ts.map +1 -0
  946. package/lib/workroom/remote-callback-reconciliation-worker.js +197 -0
  947. package/lib/workroom/remote-callback-reconciliation-worker.js.map +1 -0
  948. package/lib/workroom/remote-dispatch-admission.d.ts +45 -0
  949. package/lib/workroom/remote-dispatch-admission.d.ts.map +1 -0
  950. package/lib/workroom/remote-dispatch-admission.js +187 -0
  951. package/lib/workroom/remote-dispatch-admission.js.map +1 -0
  952. package/lib/workroom/remote-dispatch-outbox.d.ts +203 -0
  953. package/lib/workroom/remote-dispatch-outbox.d.ts.map +1 -0
  954. package/lib/workroom/remote-dispatch-outbox.js +765 -0
  955. package/lib/workroom/remote-dispatch-outbox.js.map +1 -0
  956. package/lib/workroom/remote-dispatch-scheduler.d.ts +36 -0
  957. package/lib/workroom/remote-dispatch-scheduler.d.ts.map +1 -0
  958. package/lib/workroom/remote-dispatch-scheduler.js +133 -0
  959. package/lib/workroom/remote-dispatch-scheduler.js.map +1 -0
  960. package/lib/workroom/remote-dispatch-worker.d.ts +22 -0
  961. package/lib/workroom/remote-dispatch-worker.d.ts.map +1 -0
  962. package/lib/workroom/remote-dispatch-worker.js +124 -0
  963. package/lib/workroom/remote-dispatch-worker.js.map +1 -0
  964. package/lib/workroom/remote-dispatch.d.ts +79 -0
  965. package/lib/workroom/remote-dispatch.d.ts.map +1 -0
  966. package/lib/workroom/remote-dispatch.js +220 -0
  967. package/lib/workroom/remote-dispatch.js.map +1 -0
  968. package/lib/workroom/role-capability-snapshot.d.ts +88 -0
  969. package/lib/workroom/role-capability-snapshot.d.ts.map +1 -0
  970. package/lib/workroom/role-capability-snapshot.js +456 -0
  971. package/lib/workroom/role-capability-snapshot.js.map +1 -0
  972. package/lib/workroom/runtime.d.ts +142 -0
  973. package/lib/workroom/runtime.d.ts.map +1 -0
  974. package/lib/workroom/runtime.js +542 -0
  975. package/lib/workroom/runtime.js.map +1 -0
  976. package/lib/workroom/scheduler-priority-control.d.ts +35 -0
  977. package/lib/workroom/scheduler-priority-control.d.ts.map +1 -0
  978. package/lib/workroom/scheduler-priority-control.js +9 -0
  979. package/lib/workroom/scheduler-priority-control.js.map +1 -0
  980. package/lib/workroom/workflow-plan-builder.d.ts +88 -0
  981. package/lib/workroom/workflow-plan-builder.d.ts.map +1 -0
  982. package/lib/workroom/workflow-plan-builder.js +232 -0
  983. package/lib/workroom/workflow-plan-builder.js.map +1 -0
  984. package/lib/workroom/workroom-assignment-knowledge-context.d.ts +102 -0
  985. package/lib/workroom/workroom-assignment-knowledge-context.d.ts.map +1 -0
  986. package/lib/workroom/workroom-assignment-knowledge-context.js +127 -0
  987. package/lib/workroom/workroom-assignment-knowledge-context.js.map +1 -0
  988. package/lib/workroom/workroom-kernel.d.ts +147 -0
  989. package/lib/workroom/workroom-kernel.d.ts.map +1 -0
  990. package/lib/workroom/workroom-kernel.js +1454 -0
  991. package/lib/workroom/workroom-kernel.js.map +1 -0
  992. package/lib/workroom/workroom-preemption.d.ts +65 -0
  993. package/lib/workroom/workroom-preemption.d.ts.map +1 -0
  994. package/lib/workroom/workroom-preemption.js +213 -0
  995. package/lib/workroom/workroom-preemption.js.map +1 -0
  996. package/lib/workroom/workroom-run-control.d.ts +69 -0
  997. package/lib/workroom/workroom-run-control.d.ts.map +1 -0
  998. package/lib/workroom/workroom-run-control.js +144 -0
  999. package/lib/workroom/workroom-run-control.js.map +1 -0
  1000. package/lib/workroom/workroom-scheduler-application.d.ts +43 -0
  1001. package/lib/workroom/workroom-scheduler-application.d.ts.map +1 -0
  1002. package/lib/workroom/workroom-scheduler-application.js +71 -0
  1003. package/lib/workroom/workroom-scheduler-application.js.map +1 -0
  1004. package/lib/workroom/workroom-scheduler.d.ts +135 -0
  1005. package/lib/workroom/workroom-scheduler.d.ts.map +1 -0
  1006. package/lib/workroom/workroom-scheduler.js +657 -0
  1007. package/lib/workroom/workroom-scheduler.js.map +1 -0
  1008. package/lib/workroom/workroom-task-report-store.d.ts +131 -0
  1009. package/lib/workroom/workroom-task-report-store.d.ts.map +1 -0
  1010. package/lib/workroom/workroom-task-report-store.js +528 -0
  1011. package/lib/workroom/workroom-task-report-store.js.map +1 -0
  1012. package/lib/zhin-agent/index.d.ts +7 -22
  1013. package/lib/zhin-agent/index.d.ts.map +1 -1
  1014. package/lib/zhin-agent/index.js +5 -33
  1015. package/lib/zhin-agent/index.js.map +1 -1
  1016. package/lib/zhin-agent/runtime-modules.d.ts +3 -3
  1017. package/lib/zhin-agent/runtime-modules.d.ts.map +1 -1
  1018. package/lib/zhin-agent/runtime-modules.js +3 -3
  1019. package/lib/zhin-agent/runtime-modules.js.map +1 -1
  1020. package/package.json +10 -16
  1021. package/lib/a2a/delegation-message.d.ts +0 -14
  1022. package/lib/a2a/delegation-message.d.ts.map +0 -1
  1023. package/lib/a2a/delegation-message.js +0 -53
  1024. package/lib/a2a/delegation-message.js.map +0 -1
  1025. package/lib/a2a/task-state.d.ts +0 -9
  1026. package/lib/a2a/task-state.d.ts.map +0 -1
  1027. package/lib/a2a/task-state.js +0 -53
  1028. package/lib/a2a/task-state.js.map +0 -1
  1029. package/lib/assistant/runtime-registry.d.ts +0 -23
  1030. package/lib/assistant/runtime-registry.d.ts.map +0 -1
  1031. package/lib/assistant/runtime-registry.js +0 -27
  1032. package/lib/assistant/runtime-registry.js.map +0 -1
  1033. package/lib/authoring/define-dynamic.d.ts +0 -4
  1034. package/lib/authoring/define-dynamic.d.ts.map +0 -1
  1035. package/lib/authoring/define-dynamic.js +0 -8
  1036. package/lib/authoring/define-dynamic.js.map +0 -1
  1037. package/lib/authoring/define-state.d.ts +0 -4
  1038. package/lib/authoring/define-state.d.ts.map +0 -1
  1039. package/lib/authoring/define-state.js +0 -8
  1040. package/lib/authoring/define-state.js.map +0 -1
  1041. package/lib/builtin/five-agent/strategy.d.ts +0 -4
  1042. package/lib/builtin/five-agent/strategy.d.ts.map +0 -1
  1043. package/lib/builtin/five-agent/strategy.js +0 -42
  1044. package/lib/builtin/five-agent/strategy.js.map +0 -1
  1045. package/lib/builtin/memory-search-tool.d.ts +0 -2
  1046. package/lib/builtin/memory-search-tool.d.ts.map +0 -1
  1047. package/lib/builtin/memory-search-tool.js +0 -58
  1048. package/lib/builtin/memory-search-tool.js.map +0 -1
  1049. package/lib/builtin/memory-upsert-tool.d.ts +0 -2
  1050. package/lib/builtin/memory-upsert-tool.d.ts.map +0 -1
  1051. package/lib/builtin/memory-upsert-tool.js +0 -72
  1052. package/lib/builtin/memory-upsert-tool.js.map +0 -1
  1053. package/lib/builtin/orchestration-tools.d.ts +0 -7
  1054. package/lib/builtin/orchestration-tools.d.ts.map +0 -1
  1055. package/lib/builtin/orchestration-tools.js +0 -259
  1056. package/lib/builtin/orchestration-tools.js.map +0 -1
  1057. package/lib/connection/authorization-flow.d.ts +0 -26
  1058. package/lib/connection/authorization-flow.d.ts.map +0 -1
  1059. package/lib/connection/authorization-flow.js +0 -76
  1060. package/lib/connection/authorization-flow.js.map +0 -1
  1061. package/lib/connection/index.d.ts +0 -3
  1062. package/lib/connection/index.d.ts.map +0 -1
  1063. package/lib/connection/index.js +0 -2
  1064. package/lib/connection/index.js.map +0 -1
  1065. package/lib/dynamic/dynamic-registry.d.ts +0 -34
  1066. package/lib/dynamic/dynamic-registry.d.ts.map +0 -1
  1067. package/lib/dynamic/dynamic-registry.js +0 -52
  1068. package/lib/dynamic/dynamic-registry.js.map +0 -1
  1069. package/lib/init/bootstrap-gate.d.ts +0 -6
  1070. package/lib/init/bootstrap-gate.d.ts.map +0 -1
  1071. package/lib/init/bootstrap-gate.js +0 -28
  1072. package/lib/init/bootstrap-gate.js.map +0 -1
  1073. package/lib/memory-entry-registry.d.ts +0 -13
  1074. package/lib/memory-entry-registry.d.ts.map +0 -1
  1075. package/lib/memory-entry-registry.js +0 -24
  1076. package/lib/memory-entry-registry.js.map +0 -1
  1077. package/lib/orchestration-memory-hook.d.ts +0 -3
  1078. package/lib/orchestration-memory-hook.d.ts.map +0 -1
  1079. package/lib/orchestration-memory-hook.js +0 -22
  1080. package/lib/orchestration-memory-hook.js.map +0 -1
  1081. package/lib/orchestration-runtime-registry.d.ts +0 -16
  1082. package/lib/orchestration-runtime-registry.d.ts.map +0 -1
  1083. package/lib/orchestration-runtime-registry.js +0 -20
  1084. package/lib/orchestration-runtime-registry.js.map +0 -1
  1085. package/lib/orchestrator/agent-dispatcher.d.ts +0 -171
  1086. package/lib/orchestrator/agent-dispatcher.d.ts.map +0 -1
  1087. package/lib/orchestrator/agent-dispatcher.js +0 -415
  1088. package/lib/orchestrator/agent-dispatcher.js.map +0 -1
  1089. package/lib/orchestrator/bootstrap-executors.d.ts +0 -7
  1090. package/lib/orchestrator/bootstrap-executors.d.ts.map +0 -1
  1091. package/lib/orchestrator/bootstrap-executors.js +0 -73
  1092. package/lib/orchestrator/bootstrap-executors.js.map +0 -1
  1093. package/lib/orchestrator/orchestration-mappers.d.ts +0 -9
  1094. package/lib/orchestrator/orchestration-mappers.d.ts.map +0 -1
  1095. package/lib/orchestrator/orchestration-mappers.js +0 -117
  1096. package/lib/orchestrator/orchestration-mappers.js.map +0 -1
  1097. package/lib/orchestrator/orchestration-repository.d.ts +0 -91
  1098. package/lib/orchestrator/orchestration-repository.d.ts.map +0 -1
  1099. package/lib/orchestrator/orchestration-repository.js +0 -389
  1100. package/lib/orchestrator/orchestration-repository.js.map +0 -1
  1101. package/lib/orchestrator/orchestration-service.d.ts +0 -133
  1102. package/lib/orchestrator/orchestration-service.d.ts.map +0 -1
  1103. package/lib/orchestrator/orchestration-service.js +0 -582
  1104. package/lib/orchestrator/orchestration-service.js.map +0 -1
  1105. package/lib/orchestrator/orchestration-source.d.ts +0 -5
  1106. package/lib/orchestrator/orchestration-source.d.ts.map +0 -1
  1107. package/lib/orchestrator/orchestration-source.js +0 -22
  1108. package/lib/orchestrator/orchestration-source.js.map +0 -1
  1109. package/lib/orchestrator/orchestration-types.d.ts +0 -88
  1110. package/lib/orchestrator/orchestration-types.d.ts.map +0 -1
  1111. package/lib/orchestrator/orchestration-types.js +0 -2
  1112. package/lib/orchestrator/orchestration-types.js.map +0 -1
  1113. package/lib/orchestrator/remote-agent-registry.d.ts +0 -37
  1114. package/lib/orchestrator/remote-agent-registry.d.ts.map +0 -1
  1115. package/lib/orchestrator/remote-agent-registry.js +0 -178
  1116. package/lib/orchestrator/remote-agent-registry.js.map +0 -1
  1117. package/lib/orchestrator/remote-task-executor.d.ts +0 -10
  1118. package/lib/orchestrator/remote-task-executor.d.ts.map +0 -1
  1119. package/lib/orchestrator/remote-task-executor.js +0 -231
  1120. package/lib/orchestrator/remote-task-executor.js.map +0 -1
  1121. package/lib/orchestrator/remote-task-poller.d.ts +0 -18
  1122. package/lib/orchestrator/remote-task-poller.d.ts.map +0 -1
  1123. package/lib/orchestrator/remote-task-poller.js +0 -84
  1124. package/lib/orchestrator/remote-task-poller.js.map +0 -1
  1125. package/lib/orchestrator/resolve-subagent-tools.d.ts.map +0 -1
  1126. package/lib/orchestrator/resolve-subagent-tools.js.map +0 -1
  1127. package/lib/orchestrator/task-queue.d.ts +0 -167
  1128. package/lib/orchestrator/task-queue.d.ts.map +0 -1
  1129. package/lib/orchestrator/task-queue.js +0 -416
  1130. package/lib/orchestrator/task-queue.js.map +0 -1
  1131. package/lib/session/passive-group-buffer.d.ts +0 -15
  1132. package/lib/session/passive-group-buffer.d.ts.map +0 -1
  1133. package/lib/session/passive-group-buffer.js +0 -50
  1134. package/lib/session/passive-group-buffer.js.map +0 -1
  1135. package/lib/session/passive-group-session.d.ts +0 -10
  1136. package/lib/session/passive-group-session.d.ts.map +0 -1
  1137. package/lib/session/passive-group-session.js +0 -32
  1138. package/lib/session/passive-group-session.js.map +0 -1
  1139. package/lib/session-tree-runtime-registry.d.ts +0 -22
  1140. package/lib/session-tree-runtime-registry.d.ts.map +0 -1
  1141. package/lib/session-tree-runtime-registry.js.map +0 -1
  1142. package/lib/state/agent-state-store.d.ts +0 -18
  1143. package/lib/state/agent-state-store.d.ts.map +0 -1
  1144. package/lib/state/agent-state-store.js +0 -50
  1145. package/lib/state/agent-state-store.js.map +0 -1
  1146. /package/lib/{orchestrator → resource-hub}/hook-registry.d.ts +0 -0
  1147. /package/lib/{orchestrator → resource-hub}/hook-registry.js +0 -0
  1148. /package/lib/{orchestrator → resource-hub}/mcp-lifecycle.d.ts +0 -0
  1149. /package/lib/{orchestrator → resource-hub}/mcp-lifecycle.js +0 -0
  1150. /package/lib/{orchestrator → resource-hub}/mcp-registry.d.ts +0 -0
  1151. /package/lib/{orchestrator → resource-hub}/mcp-registry.js +0 -0
  1152. /package/lib/{orchestrator → resource-hub}/resource-registry.d.ts +0 -0
  1153. /package/lib/{orchestrator → resource-hub}/resource-registry.js +0 -0
  1154. /package/lib/{orchestrator → resource-hub}/role-configs.d.ts +0 -0
  1155. /package/lib/{orchestrator → resource-hub}/skill-registry.d.ts +0 -0
  1156. /package/lib/{orchestrator → resource-hub}/skill-registry.js +0 -0
  1157. /package/lib/{orchestrator → resource-hub}/subagent-registry.d.ts +0 -0
  1158. /package/lib/{orchestrator → resource-hub}/subagent-registry.js +0 -0
  1159. /package/lib/{orchestrator → resource-hub}/tool-registry.d.ts +0 -0
  1160. /package/lib/{orchestrator → resource-hub}/tool-registry.js +0 -0
  1161. /package/lib/{orchestrator → resource-hub}/tool-selection.d.ts +0 -0
  1162. /package/lib/{orchestrator → resource-hub}/tool-selection.js +0 -0
  1163. /package/lib/{orchestrator → resource-hub}/types.js +0 -0
@@ -0,0 +1,1312 @@
1
+ import { readFile, readdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { DurableFileStore } from './durable-file-store.js';
4
+ import { compareCanonicalWorkroomText, deepFreezeWorkroomValue as deepFreeze, digestCanonicalWorkroomValue as digest, } from './canonical-value.js';
5
+ import { createWorkroomGovernedDispatchReason } from '../plugin-runtime/workroom-governed-dispatch-reasons.js';
6
+ export class WorkroomProjectionRevisionConflictError extends Error {
7
+ expectedRevision;
8
+ actualRevision;
9
+ constructor(expectedRevision, actualRevision) {
10
+ super(`Workroom Projection revision conflict: expected ${expectedRevision}, actual ${actualRevision}`);
11
+ this.expectedRevision = expectedRevision;
12
+ this.actualRevision = actualRevision;
13
+ this.name = 'WorkroomProjectionRevisionConflictError';
14
+ }
15
+ }
16
+ export class MemoryWorkroomProjectionRepository {
17
+ #state = emptyProjectionState();
18
+ async read() {
19
+ return this.#state;
20
+ }
21
+ async bind(expectedRevision, binding) {
22
+ this.#assertRevision(expectedRevision);
23
+ this.#state = applyBinding(this.#state, binding);
24
+ return this.#state;
25
+ }
26
+ async capture(expectedRevision, input) {
27
+ if (this.#state.revision !== expectedRevision) {
28
+ throw new WorkroomProjectionRevisionConflictError(expectedRevision, this.#state.revision);
29
+ }
30
+ this.#state = applyCapture(this.#state, input);
31
+ return this.#state;
32
+ }
33
+ async claimNext(expectedRevision, workerId, now, leaseMs) {
34
+ this.#assertRevision(expectedRevision);
35
+ const claimed = applyClaim(this.#state, workerId, now, leaseMs);
36
+ if (!claimed)
37
+ return undefined;
38
+ this.#state = claimed.state;
39
+ return claimed.item;
40
+ }
41
+ async settle(expectedRevision, itemId, workerId, fence, result, settledAt) {
42
+ this.#assertRevision(expectedRevision);
43
+ this.#state = applySettlement(this.#state, itemId, workerId, fence, result, settledAt);
44
+ return this.#state;
45
+ }
46
+ #assertRevision(expectedRevision) {
47
+ if (this.#state.revision !== expectedRevision) {
48
+ throw new WorkroomProjectionRevisionConflictError(expectedRevision, this.#state.revision);
49
+ }
50
+ }
51
+ }
52
+ /** Crash-durable, cross-process CAS snapshots for one Projection binding. */
53
+ export class FileWorkroomProjectionRepository {
54
+ #store;
55
+ constructor(directory) {
56
+ this.#store = new DurableFileStore(directory);
57
+ }
58
+ async read() {
59
+ let names;
60
+ try {
61
+ names = (await readdir(this.#store.directory))
62
+ .filter(name => /^projection\.[0-9]{16}\.json$/u.test(name))
63
+ .sort();
64
+ }
65
+ catch (error) {
66
+ if (hasCode(error, 'ENOENT'))
67
+ return emptyProjectionState();
68
+ throw error;
69
+ }
70
+ if (names.length === 0)
71
+ return emptyProjectionState();
72
+ for (let index = 0; index < names.length; index += 1) {
73
+ const expected = projectionSnapshotName(index + 1);
74
+ if (names[index] !== expected) {
75
+ throw new Error(`Workroom Projection snapshot gap before revision ${index + 1}`);
76
+ }
77
+ }
78
+ const parsed = JSON.parse(await readFile(join(this.#store.directory, names.at(-1)), 'utf8'));
79
+ return parseProjectionState(parsed, names.length);
80
+ }
81
+ async capture(expectedRevision, input) {
82
+ const current = await this.read();
83
+ if (current.revision !== expectedRevision) {
84
+ throw new WorkroomProjectionRevisionConflictError(expectedRevision, current.revision);
85
+ }
86
+ const next = applyCapture(current, input);
87
+ return await this.#publish(expectedRevision, next);
88
+ }
89
+ async bind(expectedRevision, binding) {
90
+ const current = await this.read();
91
+ if (current.revision !== expectedRevision) {
92
+ throw new WorkroomProjectionRevisionConflictError(expectedRevision, current.revision);
93
+ }
94
+ const next = applyBinding(current, binding);
95
+ if (next === current)
96
+ return current;
97
+ return await this.#publish(expectedRevision, next);
98
+ }
99
+ async claimNext(expectedRevision, workerId, now, leaseMs) {
100
+ const current = await this.read();
101
+ if (current.revision !== expectedRevision) {
102
+ throw new WorkroomProjectionRevisionConflictError(expectedRevision, current.revision);
103
+ }
104
+ const claimed = applyClaim(current, workerId, now, leaseMs);
105
+ if (!claimed)
106
+ return undefined;
107
+ const persisted = await this.#publish(expectedRevision, claimed.state);
108
+ return persisted.items[claimed.item.id];
109
+ }
110
+ async settle(expectedRevision, itemId, workerId, fence, result, settledAt) {
111
+ const current = await this.read();
112
+ if (current.revision !== expectedRevision) {
113
+ throw new WorkroomProjectionRevisionConflictError(expectedRevision, current.revision);
114
+ }
115
+ return await this.#publish(expectedRevision, applySettlement(current, itemId, workerId, fence, result, settledAt));
116
+ }
117
+ async #publish(expectedRevision, next) {
118
+ await this.#store.ensureDurableLeaf('Workroom Projection repository');
119
+ const target = join(this.#store.directory, projectionSnapshotName(next.revision));
120
+ const published = await this.#store.publishCreateOnly({
121
+ target,
122
+ content: JSON.stringify({ state: next, digest: digest(next) }),
123
+ createdValue: next,
124
+ onConflict: async () => {
125
+ const winner = parseProjectionState(JSON.parse(await readFile(target, 'utf8')), next.revision);
126
+ if (digest(winner) === digest(next))
127
+ return await this.read();
128
+ const latest = await this.read();
129
+ throw new WorkroomProjectionRevisionConflictError(expectedRevision, latest.revision);
130
+ },
131
+ });
132
+ return published.value;
133
+ }
134
+ }
135
+ /** At-least-once delivery worker; Projection receipts never mutate Kernel facts. */
136
+ export class WorkroomProjectionDeliveryWorker {
137
+ #repository;
138
+ #outbound;
139
+ #workerId;
140
+ #leaseMs;
141
+ #governance;
142
+ #authority;
143
+ #now;
144
+ constructor(options) {
145
+ requireText(options.workerId, 'workerId');
146
+ requirePositiveInteger(options.leaseMs, 'leaseMs');
147
+ this.#repository = options.repository;
148
+ this.#outbound = options.outbound;
149
+ this.#workerId = options.workerId;
150
+ this.#leaseMs = options.leaseMs;
151
+ this.#governance = options.governance;
152
+ this.#authority = options.authority;
153
+ this.#now = options.now ?? Date.now;
154
+ }
155
+ async runOnce(now, signal) {
156
+ requireFiniteNumber(now, 'delivery now');
157
+ signal.throwIfAborted();
158
+ const claimed = await this.#claim(now);
159
+ if (!claimed)
160
+ return Object.freeze({ status: 'idle' });
161
+ let result;
162
+ try {
163
+ const authorized = this.#authority ? await this.#authority.authorize(claimed) : true;
164
+ if (!authorized) {
165
+ result = Object.freeze({
166
+ status: 'failed', code: 'catalog_binding_stale', retryable: false,
167
+ });
168
+ }
169
+ else if (!this.#governance) {
170
+ result = Object.freeze({
171
+ status: 'failed', code: 'project_authority_unavailable', retryable: false,
172
+ });
173
+ }
174
+ else {
175
+ const governed = await this.#governance.revalidate(claimed.disclosure, signal);
176
+ result = governed.status === 'blocked'
177
+ ? (() => {
178
+ const reason = createWorkroomGovernedDispatchReason(governed.reason);
179
+ return Object.freeze({
180
+ status: 'failed', code: reason.code, retryable: reason.retryable,
181
+ });
182
+ })()
183
+ : normalizeDeliveryResult(await this.#outbound.send(claimed, governed.body, signal));
184
+ }
185
+ }
186
+ catch (error) {
187
+ if (signal.aborted)
188
+ throw signal.reason ?? error;
189
+ result = Object.freeze({ status: 'failed', code: 'transport_error', retryable: true });
190
+ }
191
+ // Once send returned a receipt the external effect already happened;
192
+ // cancellation must not discard it and cause a blind duplicate retry.
193
+ const settledAt = this.#now();
194
+ requireFiniteNumber(settledAt, 'delivery completion time');
195
+ await this.#settle(claimed, result, settledAt);
196
+ return result;
197
+ }
198
+ async #claim(now) {
199
+ for (let conflict = 0; conflict < 8; conflict += 1) {
200
+ const state = await this.#repository.read();
201
+ try {
202
+ return await this.#repository.claimNext(state.revision, this.#workerId, now, this.#leaseMs);
203
+ }
204
+ catch (error) {
205
+ if (!(error instanceof WorkroomProjectionRevisionConflictError))
206
+ throw error;
207
+ }
208
+ }
209
+ throw new Error('Workroom Projection delivery claim CAS retries exhausted');
210
+ }
211
+ async #settle(item, result, settledAt) {
212
+ for (let conflict = 0; conflict < 8; conflict += 1) {
213
+ const state = await this.#repository.read();
214
+ try {
215
+ await this.#repository.settle(state.revision, item.id, this.#workerId, item.delivery.fence, result, settledAt);
216
+ return;
217
+ }
218
+ catch (error) {
219
+ if (!(error instanceof WorkroomProjectionRevisionConflictError))
220
+ throw error;
221
+ }
222
+ }
223
+ throw new Error('Workroom Projection delivery settlement CAS retries exhausted');
224
+ }
225
+ }
226
+ /** Durable cursor tracer from authoritative Kernel events to an IM outbox. */
227
+ export class WorkroomProjectionTracer {
228
+ #journal;
229
+ #repository;
230
+ #governance;
231
+ constructor(options) {
232
+ this.#journal = options.journal;
233
+ this.#repository = options.repository;
234
+ this.#governance = options.governance;
235
+ }
236
+ async capture(bindingValue, runId, signal = new AbortController().signal) {
237
+ const binding = freezeAndValidateBinding(bindingValue);
238
+ const events = await this.#journal.read(runId);
239
+ if (events.length === 0)
240
+ throw new Error(`Workroom Projection Run ${runId} not found`);
241
+ if (events[0]?.payload.projectId !== binding.projectId) {
242
+ throw new Error('Workroom Projection binding targets another Project');
243
+ }
244
+ for (let conflict = 0; conflict < 8; conflict += 1) {
245
+ const current = await this.#repository.read();
246
+ const cursorId = projectionBindingCursorKey(runId, binding);
247
+ const storedCursor = current.cursors[cursorId];
248
+ const legacyCursor = storedCursor === undefined
249
+ ? exactLegacyBindingCursor(current, runId, binding)
250
+ : undefined;
251
+ const cursor = storedCursor ?? legacyCursor ?? -1;
252
+ const expectedCursor = storedCursor ?? -1;
253
+ const sourceSequence = events.at(-1)?.sequence ?? -1;
254
+ if (cursor > sourceSequence) {
255
+ throw new Error('Workroom Projection legacy cursor exceeds the authoritative Journal');
256
+ }
257
+ if (cursor >= sourceSequence) {
258
+ return legacyCursor === undefined
259
+ ? current
260
+ : await this.#repository.capture(current.revision, {
261
+ runId: cursorId,
262
+ expectedCursor,
263
+ cursor,
264
+ items: [],
265
+ });
266
+ }
267
+ const rawProjection = projectEvents(events, cursor, binding);
268
+ const projected = deepFreeze({
269
+ cursor: rawProjection.cursor,
270
+ items: rawProjection.items.map(item => deepFreeze({ ...item, cursorId })),
271
+ });
272
+ if (projected.cursor <= cursor)
273
+ return current;
274
+ if (!this.#governance && projected.items.length > 0) {
275
+ throw new Error('Workroom Projection governance authority is unavailable');
276
+ }
277
+ const governedItems = await Promise.all(projected.items.map(async (draft) => {
278
+ const governed = await this.#governance.prepareProjection({
279
+ operationId: `projection:${binding.projectId}:${runId}:${draft.sourceSequence}`,
280
+ projectId: binding.projectId,
281
+ sinkRuleId: 'projection:workroom',
282
+ body: draft.content,
283
+ sourceEventIds: draft.sourceEventIds,
284
+ }, signal);
285
+ if (governed.status === 'blocked') {
286
+ throw new Error(`Workroom Projection disclosure blocked: ${governed.reason}`);
287
+ }
288
+ return materializeProjectionItem(draft, governed);
289
+ }));
290
+ try {
291
+ return await this.#repository.capture(current.revision, {
292
+ runId: cursorId,
293
+ expectedCursor,
294
+ cursor: projected.cursor,
295
+ items: governedItems,
296
+ });
297
+ }
298
+ catch (error) {
299
+ if (!(error instanceof WorkroomProjectionRevisionConflictError))
300
+ throw error;
301
+ }
302
+ }
303
+ throw new Error('Workroom Projection capture CAS retries exhausted');
304
+ }
305
+ /** Capture content-free P12 Hold review facts into the same governed IM outbox. */
306
+ async captureLifecycleOverdue(bindingValue, snapshotValue, signal = new AbortController().signal) {
307
+ const binding = freezeAndValidateBinding(bindingValue);
308
+ const snapshot = validateLifecycleOverdueSnapshot(snapshotValue);
309
+ if (snapshot.projectId !== binding.projectId) {
310
+ throw new Error('Workroom Lifecycle Projection binding targets another Project');
311
+ }
312
+ const byObject = new Map();
313
+ for (const item of snapshot.overdue) {
314
+ byObject.set(item.objectId, [...(byObject.get(item.objectId) ?? []), item]);
315
+ }
316
+ let state = await this.#repository.read();
317
+ for (const objectId of [...byObject.keys()].sort(compareCanonicalWorkroomText)) {
318
+ signal.throwIfAborted();
319
+ state = await this.#captureLifecycleObject(binding, objectId, byObject.get(objectId), signal);
320
+ }
321
+ return state;
322
+ }
323
+ /** Publishes one Project-scoped card from a content-free Portfolio projection. */
324
+ async capturePortfolioSponsor(bindingValue, projectionValue, signal = new AbortController().signal) {
325
+ signal.throwIfAborted();
326
+ const binding = freezeAndValidateBinding(bindingValue);
327
+ if (projectionAudience(binding) !== 'sponsor_room') {
328
+ throw new Error('Portfolio Sponsor projection requires a Sponsor Room binding');
329
+ }
330
+ const { digest: suppliedDigest, ...projectionBody } = projectionValue;
331
+ if (suppliedDigest !== digest(projectionBody)) {
332
+ throw new Error('Portfolio Sponsor projection digest mismatch');
333
+ }
334
+ const project = projectionValue.projects[binding.projectId];
335
+ if (!project || project.projectId !== binding.projectId) {
336
+ throw new Error('Portfolio Sponsor projection does not contain the binding Project');
337
+ }
338
+ const runId = workroomPortfolioProjectionCursorKey(projectionValue.portfolioId, binding.projectId);
339
+ const cursorId = projectionBindingCursorKey(runId, binding);
340
+ for (let conflict = 0; conflict < 8; conflict += 1) {
341
+ const current = await this.#repository.read();
342
+ const storedCursor = current.cursors[cursorId];
343
+ const legacyCursor = storedCursor === undefined
344
+ ? exactLegacyBindingCursor(current, runId, binding)
345
+ : undefined;
346
+ const cursor = storedCursor ?? legacyCursor ?? -1;
347
+ const expectedCursor = storedCursor ?? -1;
348
+ if (cursor > projectionValue.sourceSequence) {
349
+ throw new Error('Portfolio Sponsor legacy cursor exceeds the authoritative projection');
350
+ }
351
+ if (cursor >= projectionValue.sourceSequence) {
352
+ return legacyCursor === undefined
353
+ ? current
354
+ : await this.#repository.capture(current.revision, {
355
+ runId: cursorId,
356
+ expectedCursor,
357
+ cursor,
358
+ items: [],
359
+ });
360
+ }
361
+ const draft = deepFreeze({
362
+ ...portfolioSponsorDraft(binding, projectionValue, runId),
363
+ cursorId,
364
+ });
365
+ if (!this.#governance) {
366
+ throw new Error('Workroom Projection governance authority is unavailable');
367
+ }
368
+ const governed = await this.#governance.prepareProjection({
369
+ operationId: `projection:${draft.sourceEventIds[0]}`,
370
+ projectId: binding.projectId,
371
+ sinkRuleId: 'projection:sponsor-room',
372
+ body: draft.content,
373
+ sourceEventIds: draft.sourceEventIds,
374
+ }, signal);
375
+ if (governed.status === 'blocked') {
376
+ throw new Error(`Workroom Projection disclosure blocked: ${governed.reason}`);
377
+ }
378
+ try {
379
+ return await this.#repository.capture(current.revision, {
380
+ runId: cursorId,
381
+ expectedCursor,
382
+ cursor: projectionValue.sourceSequence,
383
+ items: [materializeProjectionItem(draft, governed)],
384
+ });
385
+ }
386
+ catch (error) {
387
+ if (!(error instanceof WorkroomProjectionRevisionConflictError) || conflict === 7)
388
+ throw error;
389
+ }
390
+ }
391
+ throw new Error('Portfolio Sponsor projection capture retries exhausted');
392
+ }
393
+ async #captureLifecycleObject(binding, objectId, values, signal) {
394
+ const stateSequences = new Set(values.map(value => value.stateSequence));
395
+ const stateDigests = new Set(values.map(value => value.stateDigest));
396
+ if (stateSequences.size !== 1 || stateDigests.size !== 1) {
397
+ throw new Error('Workroom Lifecycle Projection object state binding is inconsistent');
398
+ }
399
+ const runId = workroomLifecycleProjectionCursorKey(binding.projectId, objectId);
400
+ const cursorId = projectionBindingCursorKey(runId, binding);
401
+ for (let conflict = 0; conflict < 8; conflict += 1) {
402
+ const current = await this.#repository.read();
403
+ const cursor = current.cursors[cursorId] ?? -1;
404
+ const existingSources = new Set(Object.values(current.items)
405
+ .filter(item => item.projectId === binding.projectId
406
+ && item.bindingRevision === binding.bindingRevision)
407
+ .flatMap(item => item.sourceEventIds));
408
+ const pending = values
409
+ .filter(value => !existingSources.has(lifecycleOverdueSourceEventId(binding.projectId, value)))
410
+ .sort((left, right) => compareCanonicalWorkroomText(lifecycleOverdueSourceEventId(binding.projectId, left), lifecycleOverdueSourceEventId(binding.projectId, right)));
411
+ if (pending.length === 0)
412
+ return current;
413
+ const drafts = pending.map((value, index) => deepFreeze({
414
+ ...lifecycleOverdueDraft(binding, runId, value, cursor + index + 1),
415
+ cursorId,
416
+ }));
417
+ if (!this.#governance && drafts.length > 0) {
418
+ throw new Error('Workroom Projection governance authority is unavailable');
419
+ }
420
+ const governedItems = await Promise.all(drafts.map(async (draft) => {
421
+ const governed = await this.#governance.prepareProjection({
422
+ operationId: `projection:${draft.sourceEventIds[0]}`,
423
+ projectId: binding.projectId,
424
+ sinkRuleId: 'projection:sponsor-room',
425
+ body: draft.content,
426
+ sourceEventIds: draft.sourceEventIds,
427
+ }, signal);
428
+ if (governed.status === 'blocked') {
429
+ throw new Error(`Workroom Projection disclosure blocked: ${governed.reason}`);
430
+ }
431
+ return materializeProjectionItem(draft, governed);
432
+ }));
433
+ try {
434
+ return await this.#repository.capture(current.revision, {
435
+ runId: cursorId,
436
+ expectedCursor: cursor,
437
+ cursor: cursor + drafts.length,
438
+ items: governedItems,
439
+ });
440
+ }
441
+ catch (error) {
442
+ if (!(error instanceof WorkroomProjectionRevisionConflictError))
443
+ throw error;
444
+ }
445
+ }
446
+ throw new Error('Workroom Lifecycle Projection capture CAS retries exhausted');
447
+ }
448
+ }
449
+ function emptyProjectionState() {
450
+ return deepFreeze({ revision: 0, bindings: {}, cursors: {}, items: {}, messageIndex: {} });
451
+ }
452
+ function projectionSnapshotName(revision) {
453
+ return `projection.${String(revision).padStart(16, '0')}.json`;
454
+ }
455
+ function parseProjectionState(value, expectedRevision) {
456
+ const snapshot = requireRecord(value, 'snapshot');
457
+ assertExactRecordKeys(snapshot, ['state', 'digest'], 'snapshot');
458
+ const state = requireRecord(snapshot.state, 'snapshot.state');
459
+ if (typeof snapshot.digest !== 'string' || digest(state) !== snapshot.digest) {
460
+ throw new Error('Workroom Projection snapshot digest mismatch');
461
+ }
462
+ assertExactRecordKeys(state, ['revision', 'bindings', 'cursors', 'items', 'messageIndex'], 'snapshot.state');
463
+ if (state.revision !== expectedRevision) {
464
+ throw new Error('Workroom Projection snapshot revision mismatch');
465
+ }
466
+ const bindings = requireRecord(state.bindings, 'snapshot.bindings');
467
+ const cursors = requireRecord(state.cursors, 'snapshot.cursors');
468
+ const items = requireRecord(state.items, 'snapshot.items');
469
+ const messageIndex = requireRecord(state.messageIndex, 'snapshot.messageIndex');
470
+ for (const [bindingKey, bindingValue] of Object.entries(bindings)) {
471
+ const binding = freezeAndValidateBinding(bindingValue);
472
+ if (workroomProjectionBindingKey(binding.projectId, projectionAudience(binding)) !== bindingKey) {
473
+ throw new Error('Workroom Projection binding key mismatch');
474
+ }
475
+ }
476
+ for (const [runId, cursor] of Object.entries(cursors)) {
477
+ requireText(runId, 'snapshot cursor runId');
478
+ requireSequence(cursor, 'snapshot cursor', 0);
479
+ }
480
+ for (const [itemId, itemValue] of Object.entries(items)) {
481
+ const item = itemValue;
482
+ if (item?.id !== itemId)
483
+ throw new Error('Workroom Projection snapshot item key mismatch');
484
+ const cursorId = item.cursorId ?? item.runId;
485
+ assertProjectionItem(item, cursorId, -1, Number.MAX_SAFE_INTEGER);
486
+ assertDeliveryState(item.delivery, item.conversation);
487
+ const cursor = cursors[cursorId];
488
+ if (typeof cursor !== 'number' || cursor < item.sourceSequence) {
489
+ throw new Error('Workroom Projection snapshot item exceeds durable cursor');
490
+ }
491
+ }
492
+ for (const [key, entryValue] of Object.entries(messageIndex)) {
493
+ const entry = entryValue;
494
+ const item = items[entry?.projectionId];
495
+ if (!item
496
+ || workroomProjectionMessageKey(entry.message) !== key
497
+ || item.delivery.status !== 'sent'
498
+ || !item.delivery.message
499
+ || workroomProjectionMessageKey(item.delivery.message) !== key
500
+ || entry.bindingRevision !== item.bindingRevision
501
+ || digest(entry.sourceEventIds) !== digest(item.sourceEventIds)
502
+ || digest(entry.target) !== digest(item.target)
503
+ || digest(entry.speaker) !== digest(item.speaker)) {
504
+ throw new Error('Workroom Projection Message Index entry is invalid');
505
+ }
506
+ }
507
+ return deepFreeze({
508
+ revision: expectedRevision,
509
+ bindings: { ...bindings },
510
+ cursors: { ...cursors },
511
+ items: { ...items },
512
+ messageIndex: { ...messageIndex },
513
+ });
514
+ }
515
+ function applyBinding(state, value) {
516
+ const binding = freezeAndValidateBinding(value);
517
+ const key = workroomProjectionBindingKey(binding.projectId, projectionAudience(binding));
518
+ const current = state.bindings[key];
519
+ if (current && digest(normalizeLegacyBindingAudience(current))
520
+ === digest(normalizeLegacyBindingAudience(binding)))
521
+ return state;
522
+ if (current && binding.bindingRevision <= current.bindingRevision) {
523
+ throw new Error('Workroom Projection binding revision must advance');
524
+ }
525
+ return deepFreeze({
526
+ ...state,
527
+ revision: state.revision + 1,
528
+ bindings: { ...state.bindings, [key]: binding },
529
+ });
530
+ }
531
+ function normalizeLegacyBindingAudience(binding) {
532
+ return binding.audience === undefined
533
+ ? deepFreeze({ ...binding, audience: 'workroom' })
534
+ : binding;
535
+ }
536
+ function applyClaim(state, workerId, now, leaseMs) {
537
+ requireText(workerId, 'claim.workerId');
538
+ requireFiniteNumber(now, 'claim.now');
539
+ requirePositiveInteger(leaseMs, 'claim.leaseMs');
540
+ const current = Object.values(state.items)
541
+ .filter(item => item.delivery.status === 'pending'
542
+ || (item.delivery.status === 'failed' && item.delivery.retryable === true
543
+ && (item.delivery.nextAttemptAt === undefined || item.delivery.nextAttemptAt <= now))
544
+ || (item.delivery.status === 'leased'
545
+ && Number(item.delivery.leaseExpiresAt) <= now))
546
+ .sort((left, right) => left.sourceSequence - right.sourceSequence || compareCanonicalWorkroomText(left.id, right.id))[0];
547
+ if (!current)
548
+ return undefined;
549
+ const item = deepFreeze({
550
+ ...current,
551
+ delivery: {
552
+ status: 'leased',
553
+ attempts: current.delivery.attempts + 1,
554
+ fence: current.delivery.fence + 1,
555
+ leaseOwner: workerId,
556
+ leaseExpiresAt: now + leaseMs,
557
+ },
558
+ });
559
+ return deepFreeze({
560
+ item,
561
+ state: {
562
+ ...state,
563
+ revision: state.revision + 1,
564
+ items: { ...state.items, [item.id]: item },
565
+ },
566
+ });
567
+ }
568
+ function applySettlement(state, itemId, workerId, fence, resultValue, settledAt) {
569
+ requireFiniteNumber(settledAt, 'delivery settledAt');
570
+ const current = state.items[itemId];
571
+ if (!current
572
+ || current.delivery.status !== 'leased'
573
+ || current.delivery.leaseOwner !== workerId
574
+ || current.delivery.fence !== fence) {
575
+ throw new Error('Workroom Projection delivery settlement is stale or not owned');
576
+ }
577
+ const result = normalizeDeliveryResult(resultValue);
578
+ const delivery = result.status === 'sent'
579
+ ? {
580
+ status: 'sent',
581
+ attempts: current.delivery.attempts,
582
+ fence: current.delivery.fence,
583
+ ...(result.message ? { message: result.message } : {}),
584
+ }
585
+ : {
586
+ status: 'failed',
587
+ attempts: current.delivery.attempts,
588
+ fence: current.delivery.fence,
589
+ failureCode: result.code,
590
+ retryable: result.retryable,
591
+ ...(result.retryable ? { nextAttemptAt: settledAt + retryDelay(current.delivery.attempts) } : {}),
592
+ };
593
+ const item = deepFreeze({ ...current, delivery });
594
+ let messageIndex = state.messageIndex;
595
+ if (result.status === 'sent' && result.message) {
596
+ if (digest(result.message.conversation) !== digest(current.conversation)) {
597
+ throw new Error('Workroom Projection receipt targets another conversation');
598
+ }
599
+ const key = workroomProjectionMessageKey(result.message);
600
+ const entry = deepFreeze({
601
+ projectionId: current.id,
602
+ bindingRevision: current.bindingRevision,
603
+ sourceEventIds: current.sourceEventIds,
604
+ target: current.target,
605
+ speaker: current.speaker,
606
+ message: result.message,
607
+ });
608
+ const existing = messageIndex[key];
609
+ if (existing && digest(existing) !== digest(entry)) {
610
+ throw new Error('Workroom Projection Message Index conflict');
611
+ }
612
+ messageIndex = { ...messageIndex, [key]: entry };
613
+ }
614
+ return deepFreeze({
615
+ ...state,
616
+ revision: state.revision + 1,
617
+ items: { ...state.items, [itemId]: item },
618
+ messageIndex,
619
+ });
620
+ }
621
+ function normalizeDeliveryResult(value) {
622
+ if (value?.status === 'failed') {
623
+ requireText(value.code, 'delivery failure code');
624
+ if (typeof value.retryable !== 'boolean') {
625
+ throw new Error('Workroom Projection delivery retryable must be boolean');
626
+ }
627
+ return deepFreeze({ status: 'failed', code: value.code, retryable: value.retryable });
628
+ }
629
+ if (value?.status !== 'sent')
630
+ throw new Error('Workroom Projection delivery result is invalid');
631
+ if (!value.message)
632
+ return Object.freeze({ status: 'sent' });
633
+ requireConversation(value.message.conversation);
634
+ requireText(value.message.id, 'delivery message.id');
635
+ return deepFreeze({ status: 'sent', message: value.message });
636
+ }
637
+ function assertDeliveryState(value, conversation) {
638
+ const delivery = requireRecord(value, 'delivery state');
639
+ if (!Number.isSafeInteger(delivery.attempts) || Number(delivery.attempts) < 0
640
+ || !Number.isSafeInteger(delivery.fence) || Number(delivery.fence) < 0
641
+ || delivery.attempts !== delivery.fence) {
642
+ throw new Error('Workroom Projection delivery attempt/fence is invalid');
643
+ }
644
+ if (delivery.status === 'pending') {
645
+ assertExactRecordKeys(delivery, ['status', 'attempts', 'fence'], 'pending delivery');
646
+ if (delivery.attempts !== 0)
647
+ throw new Error('Workroom Projection pending delivery was attempted');
648
+ return;
649
+ }
650
+ if (delivery.status === 'leased') {
651
+ assertExactRecordKeys(delivery, ['status', 'attempts', 'fence', 'leaseOwner', 'leaseExpiresAt'], 'leased delivery');
652
+ requireText(delivery.leaseOwner, 'delivery.leaseOwner');
653
+ requireFiniteNumber(delivery.leaseExpiresAt, 'delivery.leaseExpiresAt');
654
+ return;
655
+ }
656
+ if (delivery.status === 'failed') {
657
+ assertExactRecordKeys(delivery, ['status', 'attempts', 'fence', 'failureCode', 'retryable',
658
+ ...(delivery.nextAttemptAt !== undefined ? ['nextAttemptAt'] : [])], 'failed delivery');
659
+ requireText(delivery.failureCode, 'delivery.failureCode');
660
+ if (typeof delivery.retryable !== 'boolean') {
661
+ throw new Error('Workroom Projection failed delivery retryable is invalid');
662
+ }
663
+ if (delivery.nextAttemptAt !== undefined) {
664
+ if (delivery.retryable !== true) {
665
+ throw new Error('Workroom Projection non-retryable delivery cannot have nextAttemptAt');
666
+ }
667
+ requireFiniteNumber(delivery.nextAttemptAt, 'delivery.nextAttemptAt');
668
+ }
669
+ return;
670
+ }
671
+ if (delivery.status !== 'sent') {
672
+ throw new Error('Workroom Projection delivery status is invalid');
673
+ }
674
+ assertExactRecordKeys(delivery, ['status', 'attempts', 'fence', ...(delivery.message ? ['message'] : [])], 'sent delivery');
675
+ if (delivery.message) {
676
+ const message = delivery.message;
677
+ workroomProjectionMessageKey(message);
678
+ if (digest(message.conversation) !== digest(conversation)) {
679
+ throw new Error('Workroom Projection persisted receipt targets another conversation');
680
+ }
681
+ }
682
+ }
683
+ function retryDelay(attempts) {
684
+ return Math.min(60_000, 1_000 * 2 ** Math.min(6, Math.max(0, attempts - 1)));
685
+ }
686
+ export function workroomProjectionMessageKey(value) {
687
+ if (!value)
688
+ throw new Error('Workroom Projection MessageRef is required');
689
+ requireConversation(value.conversation);
690
+ requireText(value.id, 'message.id');
691
+ return [
692
+ value.conversation.endpoint.adapter,
693
+ value.conversation.endpoint.id,
694
+ value.conversation.kind,
695
+ value.conversation.id,
696
+ value.conversation.parent?.kind ?? '',
697
+ value.conversation.parent?.id ?? '',
698
+ value.conversation.threadId ?? '',
699
+ value.id,
700
+ ].join('\0');
701
+ }
702
+ /** Pure Message Index lookup; it proposes context and owns no Kernel command port. */
703
+ export function resolveProjectionReplyTarget(state, input) {
704
+ requireText(input.projectId, 'reply projectId');
705
+ requirePositiveInteger(input.bindingRevision, 'reply bindingRevision');
706
+ const entry = state.messageIndex[workroomProjectionMessageKey(input.replyTo)];
707
+ if (!entry) {
708
+ return deepFreeze({
709
+ status: 'clarification_required',
710
+ reason: 'target_not_found',
711
+ candidateRefs: [],
712
+ });
713
+ }
714
+ if (entry.target.projectId !== input.projectId) {
715
+ return deepFreeze({
716
+ status: 'clarification_required',
717
+ reason: 'cross_project_target',
718
+ candidateRefs: [entry.target.projectId],
719
+ });
720
+ }
721
+ if (input.bindingRevision !== entry.bindingRevision) {
722
+ return deepFreeze({
723
+ status: 'clarification_required',
724
+ reason: 'stale_binding',
725
+ candidateRefs: [entry.projectionId],
726
+ });
727
+ }
728
+ const target = entry.target;
729
+ if (!target.taskKey || !target.taskRevision
730
+ || !target.assignmentId || !target.assignmentRevision) {
731
+ return deepFreeze({
732
+ status: 'clarification_required',
733
+ reason: 'non_task_projection',
734
+ candidateRefs: [entry.projectionId],
735
+ });
736
+ }
737
+ const active = input.activeAssignments.some(candidate => candidate.projectId === target.projectId
738
+ && candidate.runId === target.runId
739
+ && candidate.taskKey === target.taskKey
740
+ && candidate.taskRevision === target.taskRevision
741
+ && candidate.assignmentId === target.assignmentId
742
+ && candidate.assignmentRevision === target.assignmentRevision);
743
+ return deepFreeze({
744
+ status: 'task_target',
745
+ via: 'reply',
746
+ disposition: input.intent === 'task_input' && active
747
+ ? 'context_proposal'
748
+ : 'discussion_only',
749
+ sourceProjectionId: entry.projectionId,
750
+ sourceEventIds: entry.sourceEventIds,
751
+ target: {
752
+ projectId: target.projectId,
753
+ runId: target.runId,
754
+ taskKey: target.taskKey,
755
+ taskRevision: target.taskRevision,
756
+ assignmentId: target.assignmentId,
757
+ assignmentRevision: target.assignmentRevision,
758
+ agentDefinitionId: target.agentDefinitionId,
759
+ status: active ? 'active' : 'historical',
760
+ },
761
+ });
762
+ }
763
+ function applyCapture(state, input) {
764
+ requireText(input.runId, 'capture.runId');
765
+ requireSequence(input.expectedCursor, 'capture.expectedCursor', -1);
766
+ requireSequence(input.cursor, 'capture.cursor', 0);
767
+ const currentCursor = state.cursors[input.runId] ?? -1;
768
+ if (currentCursor !== input.expectedCursor) {
769
+ throw new Error(`Workroom Projection cursor conflict for ${input.runId}`);
770
+ }
771
+ if (input.cursor <= input.expectedCursor) {
772
+ throw new Error('Workroom Projection capture cursor must advance');
773
+ }
774
+ const items = { ...state.items };
775
+ for (const item of input.items) {
776
+ assertProjectionItem(item, input.runId, input.expectedCursor, input.cursor);
777
+ const existing = items[item.id];
778
+ if (existing && existing.digest !== item.digest) {
779
+ throw new Error(`Workroom Projection item conflict: ${item.id}`);
780
+ }
781
+ items[item.id] = item;
782
+ }
783
+ return deepFreeze({
784
+ revision: state.revision + 1,
785
+ bindings: state.bindings,
786
+ cursors: { ...state.cursors, [input.runId]: input.cursor },
787
+ items,
788
+ messageIndex: state.messageIndex,
789
+ });
790
+ }
791
+ function projectEvents(events, cursor, binding) {
792
+ const assignments = new Map();
793
+ const taskRevisions = new Map();
794
+ const taskAssignments = new Map();
795
+ const items = [];
796
+ let capturedThrough = cursor;
797
+ let pendingProgress = [];
798
+ const flushProgress = () => {
799
+ if (pendingProgress.length === 0)
800
+ return;
801
+ const byAssignment = new Map();
802
+ for (const progressEvent of pendingProgress) {
803
+ const assignmentId = String(progressEvent.payload.assignmentId);
804
+ byAssignment.set(assignmentId, [...(byAssignment.get(assignmentId) ?? []), progressEvent]);
805
+ }
806
+ for (const progressEvents of byAssignment.values()) {
807
+ const latest = progressEvents.at(-1);
808
+ const item = projectEvent(latest, binding, assignments, taskRevisions, taskAssignments, progressProjectionDefinition(latest, assignments, taskAssignments, progressEvents.length), progressEvents);
809
+ if (item)
810
+ items.push(item);
811
+ }
812
+ capturedThrough = pendingProgress.at(-1).sequence;
813
+ pendingProgress = [];
814
+ };
815
+ for (const event of events) {
816
+ if (event.type === 'task.planned')
817
+ taskRevisions.set(String(event.payload.taskKey), 1);
818
+ if (event.type === 'task.revised') {
819
+ const taskKey = String(event.payload.taskKey);
820
+ taskRevisions.set(taskKey, (taskRevisions.get(taskKey) ?? 0) + 1);
821
+ }
822
+ if (event.type === 'assignment.claimed') {
823
+ const scope = {
824
+ assignmentId: String(event.payload.assignmentId),
825
+ taskKey: String(event.payload.taskKey),
826
+ taskRevision: Number(event.payload.taskRevision),
827
+ assignmentRevision: Number(event.payload.assignmentRevision),
828
+ owner: String(event.payload.owner),
829
+ role: event.payload.role,
830
+ };
831
+ assignments.set(scope.assignmentId, scope);
832
+ taskAssignments.set(scope.taskKey, scope.assignmentId);
833
+ }
834
+ if (event.sequence <= cursor)
835
+ continue;
836
+ if (event.type === 'assignment.progress') {
837
+ pendingProgress.push(event);
838
+ if (pendingProgress.length >= progressWindowSizeForPolicy(binding.projectionPolicyRevision)) {
839
+ flushProgress();
840
+ }
841
+ continue;
842
+ }
843
+ const item = projectEvent(event, binding, assignments, taskRevisions, taskAssignments);
844
+ if (item) {
845
+ // Observable boundaries are immediate. Any partial progress window is
846
+ // deterministically closed before the boundary rather than timer-flushed.
847
+ flushProgress();
848
+ items.push(item);
849
+ capturedThrough = event.sequence;
850
+ }
851
+ else if (pendingProgress.length === 0) {
852
+ capturedThrough = event.sequence;
853
+ }
854
+ }
855
+ return deepFreeze({ items, cursor: capturedThrough });
856
+ }
857
+ function projectEvent(event, binding, assignments, taskRevisions, taskAssignments, definitionOverride, sourceEvents = [event]) {
858
+ const assignmentId = assignmentIdForEvent(event, taskAssignments);
859
+ const assignment = assignmentId ? assignments.get(assignmentId) : undefined;
860
+ const definition = definitionOverride ?? projectionDefinition(event, assignment);
861
+ if (!definition)
862
+ return undefined;
863
+ const speaker = assignment
864
+ ? requireAgentIdentity(binding, assignment)
865
+ : binding.orchestrator;
866
+ const taskKey = assignment?.taskKey ?? taskKeyForEvent(event);
867
+ const taskRevision = assignment?.taskRevision
868
+ ?? (taskKey ? taskRevisions.get(taskKey) : undefined);
869
+ const target = deepFreeze({
870
+ projectId: binding.projectId,
871
+ runId: event.runId,
872
+ ...(taskKey ? { taskKey } : {}),
873
+ ...(taskRevision ? { taskRevision } : {}),
874
+ ...(assignment ? { assignmentId: assignment.assignmentId } : {}),
875
+ ...(assignment ? { assignmentRevision: assignment.assignmentRevision } : {}),
876
+ agentDefinitionId: speaker.agentDefinitionId,
877
+ });
878
+ const immutableProjection = {
879
+ version: 1,
880
+ audience: 'workroom',
881
+ projectId: binding.projectId,
882
+ runId: event.runId,
883
+ sourceEventIds: sourceEvents.map(sourceEvent => sourceEvent.eventId),
884
+ sourceSequence: event.sequence,
885
+ bindingRevision: binding.bindingRevision,
886
+ projectionPolicyRevision: binding.projectionPolicyRevision,
887
+ conversation: binding.conversation,
888
+ speaker,
889
+ kind: definition.kind,
890
+ content: `[${speaker.displayName} · ${speaker.role}] ${definition.content}`,
891
+ target,
892
+ };
893
+ const itemDigest = digest(immutableProjection);
894
+ const id = `projection:${itemDigest.slice('sha256:'.length)}`;
895
+ return deepFreeze({
896
+ ...immutableProjection,
897
+ id,
898
+ idempotencyKey: id,
899
+ digest: itemDigest,
900
+ delivery: { status: 'pending', attempts: 0, fence: 0 },
901
+ });
902
+ }
903
+ export function workroomLifecycleProjectionCursorKey(projectId, objectId) {
904
+ requireText(projectId, 'Lifecycle Projection projectId');
905
+ requireText(objectId, 'Lifecycle Projection objectId');
906
+ return `payload-lifecycle:${digest({ version: 1, projectId, objectId }).slice('sha256:'.length)}`;
907
+ }
908
+ function projectionBindingCursorKey(sourceKey, binding) {
909
+ requireText(sourceKey, 'Projection cursor source key');
910
+ return `binding-cursor:${digest({
911
+ version: 1,
912
+ sourceKey,
913
+ projectId: binding.projectId,
914
+ audience: projectionAudience(binding),
915
+ bindingRevision: binding.bindingRevision,
916
+ catalogBindingDigest: binding.catalogBindingDigest,
917
+ conversation: binding.conversation,
918
+ }).slice('sha256:'.length)}`;
919
+ }
920
+ function exactLegacyBindingCursor(state, sourceKey, binding) {
921
+ const cursor = state.cursors[sourceKey];
922
+ if (cursor === undefined)
923
+ return undefined;
924
+ const legacyItems = Object.values(state.items).filter(item => item.cursorId === undefined && item.runId === sourceKey);
925
+ if (legacyItems.length === 0)
926
+ return undefined;
927
+ const audience = projectionAudience(binding);
928
+ return legacyItems.every(item => item.projectId === binding.projectId
929
+ && (item.audience ?? 'workroom') === audience
930
+ && item.bindingRevision === binding.bindingRevision
931
+ && item.projectionPolicyRevision === binding.projectionPolicyRevision
932
+ && digest(item.conversation) === digest(binding.conversation)) ? cursor : undefined;
933
+ }
934
+ export function workroomPortfolioProjectionCursorKey(portfolioId, projectId) {
935
+ requireText(portfolioId, 'Portfolio Projection portfolioId');
936
+ requireText(projectId, 'Portfolio Projection projectId');
937
+ return `portfolio-sponsor:${digest({ version: 1, portfolioId, projectId }).slice('sha256:'.length)}`;
938
+ }
939
+ function portfolioSponsorDraft(binding, projection, runId) {
940
+ const project = projection.projects[binding.projectId];
941
+ const speaker = binding.orchestrator;
942
+ const sourceEventIds = [`portfolio-sponsor:${digest({
943
+ version: 1,
944
+ portfolioId: projection.portfolioId,
945
+ projectId: binding.projectId,
946
+ sourceSequence: projection.sourceSequence,
947
+ projectionDigest: projection.digest,
948
+ }).slice('sha256:'.length)}`];
949
+ const queue = project.queueHead
950
+ ? `queue=${boundedProjectionText(project.queueHead.opaqueHeadId, 'opaque')} `
951
+ + `starvationAt=${project.queueHead.starvationAt}`
952
+ : 'queue=empty';
953
+ const rate = Object.entries(project.rate)
954
+ .sort(([left], [right]) => compareCanonicalWorkroomText(left, right))
955
+ .map(([poolId, window]) => `${boundedProjectionText(poolId, 'pool')}:`
956
+ + `${window.usedUnits}/${window.limitUnits}@${window.windowStart}-${window.windowEnd}`)
957
+ .join(',') || 'none';
958
+ const immutableProjection = {
959
+ version: 1,
960
+ audience: 'sponsor_room',
961
+ projectId: binding.projectId,
962
+ runId,
963
+ sourceEventIds,
964
+ sourceSequence: projection.sourceSequence,
965
+ bindingRevision: binding.bindingRevision,
966
+ projectionPolicyRevision: binding.projectionPolicyRevision,
967
+ conversation: binding.conversation,
968
+ speaker,
969
+ kind: (project.blockers.length > 0 ? 'attention' : 'status'),
970
+ content: `[${speaker.displayName} · ${speaker.role}] Portfolio ${boundedProjectionText(projection.portfolioId, 'portfolio')} / Project ${boundedProjectionText(binding.projectId, 'project')}:`
971
+ + `lane=${project.lane} status=${project.status} ${queue} `
972
+ + `grants=${project.grants.length} reclaims=${project.reclaims.length} `
973
+ + `budget=${project.budget.availableMicros}/${project.budget.limitMicros} `
974
+ + `rate=${rate} fairness=${project.fairness.weightedService} `
975
+ + `blockers=${project.blockers.join(',') || 'none'}`,
976
+ target: deepFreeze({
977
+ projectId: binding.projectId,
978
+ runId,
979
+ agentDefinitionId: speaker.agentDefinitionId,
980
+ }),
981
+ };
982
+ const itemDigest = digest(immutableProjection);
983
+ const id = `projection:${itemDigest.slice('sha256:'.length)}`;
984
+ return deepFreeze({
985
+ ...immutableProjection,
986
+ id,
987
+ idempotencyKey: id,
988
+ digest: itemDigest,
989
+ delivery: { status: 'pending', attempts: 0, fence: 0 },
990
+ });
991
+ }
992
+ function lifecycleOverdueSourceEventId(projectId, value) {
993
+ return `payload-hold-overdue:${digest({
994
+ version: 1,
995
+ projectId,
996
+ objectId: value.objectId,
997
+ holdId: value.holdId,
998
+ reasonCode: value.reasonCode,
999
+ placedAt: value.placedAt,
1000
+ reviewAt: value.reviewAt,
1001
+ }).slice('sha256:'.length)}`;
1002
+ }
1003
+ function lifecycleOverdueDraft(binding, runId, value, sourceSequence) {
1004
+ const speaker = binding.orchestrator;
1005
+ const sourceEventIds = [lifecycleOverdueSourceEventId(binding.projectId, value)];
1006
+ const immutableProjection = {
1007
+ version: 1,
1008
+ audience: 'sponsor_room',
1009
+ projectId: binding.projectId,
1010
+ runId,
1011
+ sourceEventIds,
1012
+ sourceSequence,
1013
+ bindingRevision: binding.bindingRevision,
1014
+ projectionPolicyRevision: binding.projectionPolicyRevision,
1015
+ conversation: binding.conversation,
1016
+ speaker,
1017
+ kind: 'attention',
1018
+ content: `[${speaker.displayName} · ${speaker.role}] Retention Hold review overdue:`
1019
+ + `object ${boundedProjectionText(value.objectId, 'unknown')};`
1020
+ + `hold ${boundedProjectionText(value.holdId, 'unknown')};reviewAt ${value.reviewAt}`,
1021
+ target: deepFreeze({
1022
+ projectId: binding.projectId,
1023
+ runId,
1024
+ agentDefinitionId: speaker.agentDefinitionId,
1025
+ }),
1026
+ };
1027
+ const itemDigest = digest(immutableProjection);
1028
+ const id = `projection:${itemDigest.slice('sha256:'.length)}`;
1029
+ return deepFreeze({
1030
+ ...immutableProjection,
1031
+ id,
1032
+ idempotencyKey: id,
1033
+ digest: itemDigest,
1034
+ delivery: { status: 'pending', attempts: 0, fence: 0 },
1035
+ });
1036
+ }
1037
+ function validateLifecycleOverdueSnapshot(value) {
1038
+ if (!value || value.version !== 1 || !Array.isArray(value.overdue)
1039
+ || !Number.isSafeInteger(value.clockRevision) || value.clockRevision < 0
1040
+ || !Number.isSafeInteger(value.observedAt) || value.observedAt < 0) {
1041
+ throw new Error('Workroom Lifecycle overdue projection is invalid');
1042
+ }
1043
+ requireText(value.projectId, 'Lifecycle overdue Project');
1044
+ const identities = new Set();
1045
+ for (const item of value.overdue) {
1046
+ requireText(item.objectId, 'Lifecycle overdue object');
1047
+ requireText(item.holdId, 'Lifecycle overdue Hold');
1048
+ requireText(item.ownerPrincipalId, 'Lifecycle overdue owner');
1049
+ if (!Number.isSafeInteger(item.stateSequence) || item.stateSequence < 0
1050
+ || !/^sha256:[a-f0-9]{64}$/u.test(item.stateDigest)
1051
+ || !['legal_hold', 'investigation', 'regulatory_preservation'].includes(item.reasonCode)
1052
+ || !Number.isSafeInteger(item.placedAt) || item.placedAt < 0
1053
+ || !Number.isSafeInteger(item.reviewAt) || item.reviewAt <= item.placedAt
1054
+ || !Number.isSafeInteger(item.overdueBy) || item.overdueBy < 0) {
1055
+ throw new Error('Workroom Lifecycle overdue Hold is invalid');
1056
+ }
1057
+ const identity = lifecycleOverdueSourceEventId(value.projectId, item);
1058
+ if (identities.has(identity))
1059
+ throw new Error('Workroom Lifecycle overdue projection contains duplicates');
1060
+ identities.add(identity);
1061
+ }
1062
+ const { digest: supplied, ...body } = value;
1063
+ if (supplied !== digest(body))
1064
+ throw new Error('Workroom Lifecycle overdue projection digest mismatch');
1065
+ return deepFreeze(structuredClone(value));
1066
+ }
1067
+ function materializeProjectionItem(draft, governed) {
1068
+ const { content: _body, id: _draftId, idempotencyKey: _draftKey, digest: _draftDigest, delivery, ...header } = draft;
1069
+ const projection = deepFreeze({
1070
+ ...header,
1071
+ disclosure: {
1072
+ request: structuredClone(governed.request),
1073
+ manifest: structuredClone(governed.manifest),
1074
+ },
1075
+ });
1076
+ const itemDigest = digest(projection);
1077
+ const id = `projection:${itemDigest.slice('sha256:'.length)}`;
1078
+ return deepFreeze({
1079
+ ...projection,
1080
+ id,
1081
+ idempotencyKey: id,
1082
+ digest: itemDigest,
1083
+ delivery: structuredClone(delivery),
1084
+ });
1085
+ }
1086
+ function projectionDefinition(event, assignment) {
1087
+ const taskKey = assignment?.taskKey ?? taskKeyForEvent(event);
1088
+ switch (event.type) {
1089
+ case 'run.created':
1090
+ return { kind: 'status', content: `Run 已启动:${boundedProjectionText(event.payload.title, '未命名 Run')}` };
1091
+ case 'task.planned':
1092
+ return { kind: 'status', content: `${taskKey}:已规划` };
1093
+ case 'assignment.claimed':
1094
+ return { kind: 'status', content: `${taskKey}:已领取当前工作` };
1095
+ case 'assignment.started':
1096
+ return { kind: 'status', content: `${taskKey}:正在执行` };
1097
+ case 'assignment.checkpointed':
1098
+ return { kind: 'milestone', content: `${taskKey}:已形成 checkpoint` };
1099
+ case 'assignment.execution_completed':
1100
+ return { kind: 'conclusion', content: `${taskKey}:已提交执行结论,等待验收` };
1101
+ case 'task.blocked':
1102
+ return { kind: 'attention', content: `${taskKey}:阻塞——${boundedProjectionText(event.payload.reason, '原因未说明')}` };
1103
+ case 'task.accepted':
1104
+ return { kind: 'conclusion', content: `${taskKey}:已验收` };
1105
+ case 'task.failed':
1106
+ return { kind: 'attention', content: `${taskKey}:失败——${boundedProjectionText(event.payload.reason, '原因未说明')}` };
1107
+ case 'reviewer.assigned':
1108
+ return { kind: 'attention', content: `${taskKey}:已进入 Reviewer 验收` };
1109
+ case 'sponsor_gate.opened':
1110
+ return { kind: 'attention', content: `${taskKey}:等待 Sponsor 决策` };
1111
+ case 'sponsor_gate.expired':
1112
+ return { kind: 'attention', content: `${taskKey}:Sponsor 决策已过期` };
1113
+ case 'sponsor_gate.decided':
1114
+ return {
1115
+ kind: 'attention',
1116
+ content: `${taskKey}:Sponsor 已${sponsorDecisionLabel(event.payload.decision)}`,
1117
+ };
1118
+ case 'plan_gate.decided':
1119
+ return {
1120
+ kind: 'attention',
1121
+ content: `${taskKey}:Sponsor 已对执行前 Plan Gate ${sponsorDecisionLabel(event.payload.decision)}`,
1122
+ };
1123
+ case 'task.rework_requested':
1124
+ return {
1125
+ kind: 'attention',
1126
+ content: `${taskKey}:已要求返工——${boundedProjectionText(event.payload.reason, '原因未说明')}`,
1127
+ };
1128
+ case 'assignment.lease_expired':
1129
+ return { kind: 'attention', content: `${taskKey}:执行租约已过期,等待恢复` };
1130
+ case 'assignment.cancel_requested':
1131
+ return { kind: 'attention', content: `${taskKey}:执行已请求取消` };
1132
+ case 'assignment.cancelled':
1133
+ return { kind: 'attention', content: `${taskKey}:执行已取消` };
1134
+ case 'task.cancel_requested':
1135
+ return { kind: 'attention', content: `${taskKey}:已请求取消` };
1136
+ case 'run.cancel_requested':
1137
+ return {
1138
+ kind: 'attention',
1139
+ content: `Run 已请求取消——${boundedProjectionText(event.payload.reason, '原因未说明')}`,
1140
+ };
1141
+ case 'task.cancelled':
1142
+ return { kind: 'attention', content: `${taskKey}:已取消` };
1143
+ case 'run.cancelled':
1144
+ return { kind: 'attention', content: 'Run 已取消' };
1145
+ default:
1146
+ return undefined;
1147
+ }
1148
+ }
1149
+ function progressProjectionDefinition(event, assignments, taskAssignments, count) {
1150
+ const assignmentId = assignmentIdForEvent(event, taskAssignments);
1151
+ const taskKey = assignmentId ? assignments.get(assignmentId)?.taskKey : undefined;
1152
+ const progress = event.payload.progress;
1153
+ const completedUnits = progress.completedUnits;
1154
+ const totalUnits = progress.totalUnits;
1155
+ const units = typeof completedUnits === 'number' && Number.isFinite(completedUnits)
1156
+ && typeof totalUnits === 'number' && Number.isFinite(totalUnits)
1157
+ ? `(${completedUnits}/${totalUnits})`
1158
+ : '';
1159
+ const window = count > 1 ? `;本窗口 ${count} 次更新` : '';
1160
+ return {
1161
+ kind: 'progress',
1162
+ content: `${taskKey ?? '未知任务'}:${boundedProjectionText(progress.summary, '进度已更新')}${units}${window}`,
1163
+ };
1164
+ }
1165
+ /** Policy revision pins the aggregation contract; source Kernel order closes each fixed window. */
1166
+ function progressWindowSizeForPolicy(projectionPolicyRevision) {
1167
+ requirePositiveInteger(projectionPolicyRevision, 'projectionPolicyRevision');
1168
+ return 3;
1169
+ }
1170
+ function boundedProjectionText(value, fallback) {
1171
+ if (typeof value !== 'string')
1172
+ return fallback;
1173
+ const canonical = value.replace(/[\p{Cc}\p{Cf}\s]+/gu, ' ').trim();
1174
+ return (canonical || fallback).slice(0, 240);
1175
+ }
1176
+ function sponsorDecisionLabel(value) {
1177
+ switch (value) {
1178
+ case 'approve': return '批准';
1179
+ case 'reject': return '拒绝';
1180
+ case 'request_changes': return '要求修改';
1181
+ case 'cancel': return '取消';
1182
+ default: return '作出决策';
1183
+ }
1184
+ }
1185
+ function assignmentIdForEvent(event, taskAssignments) {
1186
+ if (event.type.startsWith('assignment.'))
1187
+ return String(event.payload.assignmentId ?? '') || undefined;
1188
+ const taskKey = taskKeyForEvent(event);
1189
+ return taskKey ? taskAssignments.get(taskKey) : undefined;
1190
+ }
1191
+ function taskKeyForEvent(event) {
1192
+ const value = event.payload.taskKey;
1193
+ return typeof value === 'string' && value ? value : undefined;
1194
+ }
1195
+ function requireAgentIdentity(binding, assignment) {
1196
+ const matches = binding.agents.filter(identity => identity.principalId === assignment.owner && identity.role === assignment.role);
1197
+ if (matches.length !== 1) {
1198
+ throw new Error(`Workroom Projection requires one named Agent identity for ${assignment.assignmentId}`);
1199
+ }
1200
+ return matches[0];
1201
+ }
1202
+ function freezeAndValidateBinding(value) {
1203
+ if (value.version !== 1)
1204
+ throw new Error('Workroom Projection binding version is unsupported');
1205
+ projectionAudience(value);
1206
+ requireText(value.projectId, 'binding.projectId');
1207
+ if (!/^sha256:[a-f0-9]{64}$/u.test(value.catalogBindingDigest)) {
1208
+ throw new Error('Workroom Projection binding.catalogBindingDigest is invalid');
1209
+ }
1210
+ requirePositiveInteger(value.bindingRevision, 'binding.bindingRevision');
1211
+ requirePositiveInteger(value.projectionPolicyRevision, 'binding.projectionPolicyRevision');
1212
+ requireConversation(value.conversation);
1213
+ requireIdentity(value.orchestrator, 'binding.orchestrator');
1214
+ if (value.orchestrator.role !== 'orchestrator' || !Array.isArray(value.agents)) {
1215
+ throw new Error('Workroom Projection binding requires an Orchestrator and Agent directory');
1216
+ }
1217
+ for (const identity of value.agents)
1218
+ requireIdentity(identity, 'binding.agents[]');
1219
+ return deepFreeze(value);
1220
+ }
1221
+ export function workroomProjectionBindingKey(projectId, audience) {
1222
+ requireText(projectId, 'binding key projectId');
1223
+ return audience === 'workroom' ? projectId : `${projectId}:sponsor-room`;
1224
+ }
1225
+ export function projectionAudience(value) {
1226
+ if (value.audience === undefined)
1227
+ return 'workroom';
1228
+ if (value.audience !== 'workroom' && value.audience !== 'sponsor_room') {
1229
+ throw new Error('Workroom Projection audience is invalid');
1230
+ }
1231
+ return value.audience;
1232
+ }
1233
+ function assertProjectionItem(item, runId, after, through) {
1234
+ projectionAudience(item);
1235
+ if ('content' in item) {
1236
+ throw new Error('Legacy plaintext Workroom Projection snapshot is unsupported; use offline export then purge it');
1237
+ }
1238
+ if (item.version !== 1 || (item.cursorId ?? item.runId) !== runId
1239
+ || item.sourceSequence <= after || item.sourceSequence > through
1240
+ || item.id !== item.idempotencyKey || !/^projection:[a-f0-9]{64}$/u.test(item.id)
1241
+ || !/^sha256:[a-f0-9]{64}$/u.test(item.digest)) {
1242
+ throw new Error('Invalid Workroom Projection outbox item');
1243
+ }
1244
+ const expectedChannel = projectionAudience(item) === 'sponsor_room'
1245
+ ? 'sponsor_projection'
1246
+ : 'workroom_projection';
1247
+ if (!item.disclosure?.request || !item.disclosure.manifest
1248
+ || item.disclosure.request.projectId !== item.projectId
1249
+ || item.disclosure.manifest.source.payloadHash !== item.disclosure.request.sourceDigest
1250
+ || item.disclosure.manifest.channel !== expectedChannel) {
1251
+ throw new Error('Invalid Workroom Projection Disclosure Manifest');
1252
+ }
1253
+ const { id: _id, idempotencyKey: _key, digest: _digest, delivery: _delivery, ...projection } = item;
1254
+ if (digest(projection) !== item.digest || item.id !== `projection:${item.digest.slice(7)}`) {
1255
+ throw new Error('Workroom Projection outbox item digest mismatch');
1256
+ }
1257
+ }
1258
+ function requireConversation(value) {
1259
+ requireText(value.endpoint?.id, 'conversation.endpoint.id');
1260
+ requireText(value.endpoint?.adapter, 'conversation.endpoint.adapter');
1261
+ requireText(value.id, 'conversation.id');
1262
+ if (!['private', 'group', 'channel'].includes(value.kind)) {
1263
+ throw new Error('Workroom Projection conversation kind is invalid');
1264
+ }
1265
+ }
1266
+ function requireIdentity(value, label) {
1267
+ requireText(value.principalId, `${label}.principalId`);
1268
+ requireText(value.agentDefinitionId, `${label}.agentDefinitionId`);
1269
+ requireText(value.displayName, `${label}.displayName`);
1270
+ if (!['orchestrator', 'executor', 'reviewer', 'integration'].includes(value.role)) {
1271
+ throw new Error(`Workroom Projection ${label}.role is invalid`);
1272
+ }
1273
+ }
1274
+ function requireText(value, label) {
1275
+ if (typeof value !== 'string' || !value.trim()) {
1276
+ throw new Error(`Workroom Projection ${label} requires non-empty text`);
1277
+ }
1278
+ }
1279
+ function requirePositiveInteger(value, label) {
1280
+ if (!Number.isSafeInteger(value) || Number(value) < 1) {
1281
+ throw new Error(`Workroom Projection ${label} must be a positive integer`);
1282
+ }
1283
+ }
1284
+ function requireSequence(value, label, minimum) {
1285
+ if (!Number.isSafeInteger(value) || Number(value) < minimum) {
1286
+ throw new Error(`Workroom Projection ${label} is invalid`);
1287
+ }
1288
+ }
1289
+ function requireFiniteNumber(value, label) {
1290
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
1291
+ throw new Error(`Workroom Projection ${label} must be finite`);
1292
+ }
1293
+ }
1294
+ function requireRecord(value, label) {
1295
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
1296
+ throw new Error(`Workroom Projection ${label} must be an object`);
1297
+ }
1298
+ return value;
1299
+ }
1300
+ function assertExactRecordKeys(value, expected, label) {
1301
+ const actual = Object.keys(value).sort();
1302
+ const canonical = [...expected].sort();
1303
+ if (actual.length !== canonical.length
1304
+ || actual.some((key, index) => key !== canonical[index])) {
1305
+ throw new Error(`Workroom Projection ${label} fields are invalid`);
1306
+ }
1307
+ }
1308
+ function hasCode(error, code) {
1309
+ return Boolean(error && typeof error === 'object' && 'code' in error
1310
+ && error.code === code);
1311
+ }
1312
+ //# sourceMappingURL=projection-outbox.js.map