crewly 1.20.153 → 1.20.155

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 (773) hide show
  1. package/README.md +21 -3
  2. package/config/constants.ts +78 -0
  3. package/config/hooks/agent-status/report.sh +78 -0
  4. package/config/hooks/control-plane-guard/pretooluse-bash.sh +241 -0
  5. package/config/orchestrator_tasks/prompts/assign-task-orchestrator-prompt-template.md +19 -49
  6. package/config/orchestrator_tasks/prompts/checkin-orchestrator-prompt-template.md +25 -125
  7. package/config/orchestrator_tasks/prompts/project-start-orchestrator-prompt-template.md +29 -100
  8. package/config/roles/orchestrator/prompt.md +18 -2
  9. package/config/roles/team-leader/prompt.md +13 -3
  10. package/config/roles/team-leader/role.json +1 -1
  11. package/config/roles/team-leader/tl-addon.md +12 -3
  12. package/config/skills/agent/core/complete-task/SKILL.md +1 -1
  13. package/config/skills/agent/core/project-tickets/SKILL.md +127 -0
  14. package/config/skills/agent/core/project-tickets/execute.sh +182 -0
  15. package/config/skills/agent/core/project-tickets/execute.test.sh +116 -0
  16. package/config/skills/agent/core/recall/SKILL.md +1 -1
  17. package/config/skills/agent/core/recall/execute.sh +7 -0
  18. package/config/skills/agent/core/report-status/SKILL.md +3 -2
  19. package/config/skills/agent/core/report-status/execute.sh +37 -15
  20. package/config/skills/agent/core/split-ticket/SKILL.md +62 -0
  21. package/config/skills/agent/core/split-ticket/execute.sh +87 -0
  22. package/config/skills/agent/core/split-ticket/execute.test.sh +77 -0
  23. package/config/skills/agent/core/standing-update/SKILL.md +96 -0
  24. package/config/skills/agent/core/standing-update/execute.sh +107 -0
  25. package/config/skills/agent/onboarding/materialize-team/SKILL.md +1 -1
  26. package/config/skills/agent/onboarding/recommend-team/SKILL.md +1 -1
  27. package/config/skills/orchestrator/delegate-task/SKILL.md +4 -3
  28. package/config/skills/orchestrator/render-verdict/SKILL.md +62 -0
  29. package/config/skills/orchestrator/render-verdict/execute.sh +47 -0
  30. package/config/skills/orchestrator/render-verdict/execute.test.sh +121 -0
  31. package/config/skills/orchestrator/wiki-migrate/SKILL.md +0 -1
  32. package/config/skills/team-leader/aggregate-results/SKILL.md +1 -1
  33. package/config/skills/team-leader/assign-ticket/SKILL.md +47 -0
  34. package/config/skills/team-leader/assign-ticket/execute.sh +59 -0
  35. package/config/skills/team-leader/assign-ticket/execute.test.sh +64 -0
  36. package/config/skills/team-leader/decompose-goal/SKILL.md +4 -4
  37. package/config/skills/team-leader/delegate-task/SKILL.md +1 -1
  38. package/config/skills/team-leader/delegate-task/execute.sh +17 -4
  39. package/config/skills/team-leader/verify-output/SKILL.md +2 -2
  40. package/config/sops/developer/git-workflow.md +1 -1
  41. package/dist/backend/backend/src/constants.d.ts +397 -1
  42. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  43. package/dist/backend/backend/src/constants.js +388 -2
  44. package/dist/backend/backend/src/constants.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +27 -0
  46. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -0
  47. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +55 -0
  48. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -0
  49. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.d.ts +13 -0
  50. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.d.ts.map +1 -0
  51. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.js +19 -0
  52. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.js.map +1 -0
  53. package/dist/backend/backend/src/controllers/api.controller.d.ts +0 -12
  54. package/dist/backend/backend/src/controllers/api.controller.d.ts.map +1 -1
  55. package/dist/backend/backend/src/controllers/api.controller.js +0 -44
  56. package/dist/backend/backend/src/controllers/api.controller.js.map +1 -1
  57. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +27 -5
  58. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -1
  59. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +55 -15
  60. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -1
  61. package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts.map +1 -1
  62. package/dist/backend/backend/src/controllers/approvals/approvals.routes.js +2 -0
  63. package/dist/backend/backend/src/controllers/approvals/approvals.routes.js.map +1 -1
  64. package/dist/backend/backend/src/controllers/expert/expert.controller.d.ts +13 -0
  65. package/dist/backend/backend/src/controllers/expert/expert.controller.d.ts.map +1 -1
  66. package/dist/backend/backend/src/controllers/expert/expert.controller.js +67 -9
  67. package/dist/backend/backend/src/controllers/expert/expert.controller.js.map +1 -1
  68. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +32 -0
  69. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  70. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +122 -8
  71. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  72. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts +41 -0
  73. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -0
  74. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +146 -0
  75. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -0
  76. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.d.ts +20 -0
  77. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.d.ts.map +1 -0
  78. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.js +29 -0
  79. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.js.map +1 -0
  80. package/dist/backend/backend/src/controllers/project/project.controller.d.ts +2 -2
  81. package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -1
  82. package/dist/backend/backend/src/controllers/project/project.controller.js +24 -7
  83. package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -1
  84. package/dist/backend/backend/src/controllers/project/project.routes.d.ts +2 -2
  85. package/dist/backend/backend/src/controllers/project/project.routes.d.ts.map +1 -1
  86. package/dist/backend/backend/src/controllers/project/project.routes.js +3 -36
  87. package/dist/backend/backend/src/controllers/project/project.routes.js.map +1 -1
  88. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +93 -0
  89. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -0
  90. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +252 -0
  91. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -0
  92. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +34 -0
  93. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -0
  94. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +51 -0
  95. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -0
  96. package/dist/backend/backend/src/controllers/request-types.d.ts +13 -0
  97. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  98. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +49 -0
  99. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -0
  100. package/dist/backend/backend/src/controllers/standing/standing.controller.js +100 -0
  101. package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -0
  102. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +38 -0
  103. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  104. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +143 -8
  105. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  106. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
  107. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +6 -1
  108. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
  109. package/dist/backend/backend/src/controllers/team/team.controller.d.ts +2 -0
  110. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  111. package/dist/backend/backend/src/controllers/team/team.controller.js +26 -6
  112. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  113. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts +18 -0
  114. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -1
  115. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +56 -0
  116. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -1
  117. package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts +1 -0
  118. package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts.map +1 -1
  119. package/dist/backend/backend/src/controllers/tickets/tickets.routes.js +3 -1
  120. package/dist/backend/backend/src/controllers/tickets/tickets.routes.js.map +1 -1
  121. package/dist/backend/backend/src/controllers/types.d.ts +1 -2
  122. package/dist/backend/backend/src/controllers/types.d.ts.map +1 -1
  123. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +2 -3
  124. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
  125. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +2 -3
  126. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
  127. package/dist/backend/backend/src/index.d.ts.map +1 -1
  128. package/dist/backend/backend/src/index.js +113 -7
  129. package/dist/backend/backend/src/index.js.map +1 -1
  130. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +29 -0
  131. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -1
  132. package/dist/backend/backend/src/middleware/api-token.middleware.js +38 -0
  133. package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -1
  134. package/dist/backend/backend/src/models/index.d.ts +0 -1
  135. package/dist/backend/backend/src/models/index.d.ts.map +1 -1
  136. package/dist/backend/backend/src/models/index.js +0 -1
  137. package/dist/backend/backend/src/models/index.js.map +1 -1
  138. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  139. package/dist/backend/backend/src/routes/api.routes.js +24 -3
  140. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  141. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts +6 -2
  142. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts.map +1 -1
  143. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js +6 -2
  144. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js.map +1 -1
  145. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +43 -1
  146. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  147. package/dist/backend/backend/src/services/agent/agent-registration.service.js +129 -34
  148. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  149. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +169 -0
  150. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -0
  151. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +231 -0
  152. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -0
  153. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +154 -2
  154. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  155. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +380 -22
  156. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  157. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +16 -0
  158. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  159. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +50 -0
  160. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  161. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts +9 -1
  162. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
  163. package/dist/backend/backend/src/services/agent/tmux-command.service.js +12 -2
  164. package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
  165. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  166. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +9 -8
  167. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  168. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.d.ts +75 -0
  169. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.d.ts.map +1 -0
  170. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.js +89 -0
  171. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.js.map +1 -0
  172. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +3 -0
  173. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/ai/prompt-modules/index.js +3 -0
  175. package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -1
  176. package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.js +1 -1
  177. package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -1
  178. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  179. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +12 -0
  180. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  181. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +14 -0
  182. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  183. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  184. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  185. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +11 -7
  186. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  187. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts +41 -0
  188. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts.map +1 -0
  189. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.js +44 -0
  190. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.js.map +1 -0
  191. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +67 -0
  192. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -0
  193. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js +146 -0
  194. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -0
  195. package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts.map +1 -1
  196. package/dist/backend/backend/src/services/ai/prompt-template.service.js +9 -7
  197. package/dist/backend/backend/src/services/ai/prompt-template.service.js.map +1 -1
  198. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  199. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +7 -0
  200. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  201. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts +7 -0
  202. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts.map +1 -1
  203. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js +9 -1
  204. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js.map +1 -1
  205. package/dist/backend/backend/src/services/core/logger.service.d.ts +21 -0
  206. package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -1
  207. package/dist/backend/backend/src/services/core/logger.service.js +42 -4
  208. package/dist/backend/backend/src/services/core/logger.service.js.map +1 -1
  209. package/dist/backend/backend/src/services/core/storage.service.d.ts +1 -5
  210. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  211. package/dist/backend/backend/src/services/core/storage.service.js +5 -162
  212. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  213. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  214. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +6 -0
  215. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  216. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  217. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +15 -9
  218. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  219. package/dist/backend/backend/src/services/index.d.ts +0 -4
  220. package/dist/backend/backend/src/services/index.d.ts.map +1 -1
  221. package/dist/backend/backend/src/services/index.js +0 -4
  222. package/dist/backend/backend/src/services/index.js.map +1 -1
  223. package/dist/backend/backend/src/services/intent-task/intent-task.service.d.ts +1 -1
  224. package/dist/backend/backend/src/services/intent-task/intent-task.service.js +1 -1
  225. package/dist/backend/backend/src/services/mcp-server.d.ts +19 -6
  226. package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -1
  227. package/dist/backend/backend/src/services/mcp-server.js +46 -16
  228. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  229. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
  230. package/dist/backend/backend/src/services/mcp-tool-definitions.js +3 -2
  231. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
  232. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +247 -0
  233. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -0
  234. package/dist/backend/backend/src/services/memory/standing-answers.service.js +534 -0
  235. package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -0
  236. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts +104 -0
  237. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts.map +1 -0
  238. package/dist/backend/backend/src/services/memory/standing-refresh.service.js +218 -0
  239. package/dist/backend/backend/src/services/memory/standing-refresh.service.js.map +1 -0
  240. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +35 -0
  241. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  242. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +99 -1
  243. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  244. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.d.ts +75 -0
  245. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.d.ts.map +1 -0
  246. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.js +80 -0
  247. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.js.map +1 -0
  248. package/dist/backend/backend/src/services/monitoring/agent-attention.d.ts +114 -0
  249. package/dist/backend/backend/src/services/monitoring/agent-attention.d.ts.map +1 -0
  250. package/dist/backend/backend/src/services/monitoring/agent-attention.js +165 -0
  251. package/dist/backend/backend/src/services/monitoring/agent-attention.js.map +1 -0
  252. package/dist/backend/backend/src/services/monitoring/agent-hook-state.d.ts +76 -0
  253. package/dist/backend/backend/src/services/monitoring/agent-hook-state.d.ts.map +1 -0
  254. package/dist/backend/backend/src/services/monitoring/agent-hook-state.js +96 -0
  255. package/dist/backend/backend/src/services/monitoring/agent-hook-state.js.map +1 -0
  256. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +1 -1
  257. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.d.ts +1 -1
  258. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.d.ts.map +1 -1
  259. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.js +13 -3
  260. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.js.map +1 -1
  261. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.d.ts.map +1 -1
  262. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js +0 -4
  263. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js.map +1 -1
  264. package/dist/backend/backend/src/services/project/project-search.service.d.ts +22 -16
  265. package/dist/backend/backend/src/services/project/project-search.service.d.ts.map +1 -1
  266. package/dist/backend/backend/src/services/project/project-search.service.js +30 -53
  267. package/dist/backend/backend/src/services/project/project-search.service.js.map +1 -1
  268. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +381 -0
  269. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -0
  270. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +839 -0
  271. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -0
  272. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +214 -0
  273. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -0
  274. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +466 -0
  275. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -0
  276. package/dist/backend/backend/src/services/project-tickets/ticket-file.d.ts +121 -0
  277. package/dist/backend/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -0
  278. package/dist/backend/backend/src/services/project-tickets/ticket-file.js +468 -0
  279. package/dist/backend/backend/src/services/project-tickets/ticket-file.js.map +1 -0
  280. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.d.ts +69 -0
  281. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.d.ts.map +1 -0
  282. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.js +194 -0
  283. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.js.map +1 -0
  284. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.d.ts +47 -0
  285. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.d.ts.map +1 -0
  286. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.js +83 -0
  287. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.js.map +1 -0
  288. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.d.ts +97 -0
  289. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.d.ts.map +1 -0
  290. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.js +201 -0
  291. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.js.map +1 -0
  292. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +86 -22
  293. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  294. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +173 -28
  295. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  296. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +19 -1
  297. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  298. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +33 -4
  299. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  300. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +24 -12
  301. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  302. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +87 -19
  303. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  304. package/dist/backend/backend/src/services/runtime-adapter.d.ts +1 -1
  305. package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
  306. package/dist/backend/backend/src/services/runtime-adapter.js +5 -9
  307. package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
  308. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +26 -1
  309. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  310. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +33 -2
  311. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  312. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +5 -0
  313. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  314. package/dist/backend/backend/src/services/session/pty/pty-session.js +8 -1
  315. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  316. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts +18 -0
  317. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
  318. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js +23 -0
  319. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
  320. package/dist/backend/backend/src/services/session/session-backend.interface.d.ts +8 -0
  321. package/dist/backend/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
  322. package/dist/backend/backend/src/services/session/session-backend.interface.js.map +1 -1
  323. package/dist/backend/backend/src/services/session/session-command-helper.d.ts +12 -2
  324. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  325. package/dist/backend/backend/src/services/session/session-command-helper.js +14 -2
  326. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  327. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.d.ts +239 -0
  328. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.d.ts.map +1 -0
  329. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js +395 -0
  330. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js.map +1 -0
  331. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.d.ts +53 -0
  332. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.d.ts.map +1 -0
  333. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.js +83 -0
  334. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.js.map +1 -0
  335. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.d.ts +93 -0
  336. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.d.ts.map +1 -0
  337. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.js +244 -0
  338. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.js.map +1 -0
  339. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +145 -19
  340. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  341. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +323 -53
  342. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  343. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  344. package/dist/backend/backend/src/services/template/template.service.js +11 -6
  345. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  346. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +21 -4
  347. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  348. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +53 -3
  349. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  350. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts +85 -6
  351. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
  352. package/dist/backend/backend/src/services/v3/escalation-router.service.js +188 -9
  353. package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
  354. package/dist/backend/backend/src/services/v3/escalation.service.js +1 -1
  355. package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
  356. package/dist/backend/backend/src/services/v3/mission-executor.service.js +2 -2
  357. package/dist/backend/backend/src/services/v3/mission-executor.service.js.map +1 -1
  358. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.d.ts +184 -0
  359. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.d.ts.map +1 -0
  360. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.js +420 -0
  361. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.js.map +1 -0
  362. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts +61 -0
  363. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts.map +1 -0
  364. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.js +100 -0
  365. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.js.map +1 -0
  366. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.d.ts +36 -0
  367. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.d.ts.map +1 -0
  368. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.js +239 -0
  369. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.js.map +1 -0
  370. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +152 -0
  371. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -0
  372. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +209 -0
  373. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -0
  374. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +194 -0
  375. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -0
  376. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js +85 -0
  377. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -0
  378. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +6 -4
  379. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
  380. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +15 -6
  381. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
  382. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.d.ts.map +1 -1
  383. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js +14 -5
  384. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js.map +1 -1
  385. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  386. package/dist/backend/backend/src/services/v3/request.service.js +2 -0
  387. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  388. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.d.ts +82 -0
  389. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.d.ts.map +1 -0
  390. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.js +172 -0
  391. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.js.map +1 -0
  392. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  393. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +2 -0
  394. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  395. package/dist/backend/backend/src/services/v3/ticket-intake-log.d.ts +87 -0
  396. package/dist/backend/backend/src/services/v3/ticket-intake-log.d.ts.map +1 -0
  397. package/dist/backend/backend/src/services/v3/ticket-intake-log.js +116 -0
  398. package/dist/backend/backend/src/services/v3/ticket-intake-log.js.map +1 -0
  399. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts +133 -15
  400. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -1
  401. package/dist/backend/backend/src/services/v3/ticket-intake.service.js +263 -45
  402. package/dist/backend/backend/src/services/v3/ticket-intake.service.js.map +1 -1
  403. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts +3 -1
  404. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  405. package/dist/backend/backend/src/services/v3/ticket-review.service.js +6 -2
  406. package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
  407. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  408. package/dist/backend/backend/src/services/v3/v3-data.service.js +9 -3
  409. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  410. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +88 -1
  411. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  412. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +169 -5
  413. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  414. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts +13 -5
  415. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -1
  416. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +10 -9
  417. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js.map +1 -1
  418. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.d.ts +241 -0
  419. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.d.ts.map +1 -0
  420. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js +511 -0
  421. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js.map +1 -0
  422. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts +70 -0
  423. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts.map +1 -0
  424. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js +121 -0
  425. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js.map +1 -0
  426. package/dist/backend/backend/src/services/worktree/worktree-git.d.ts +260 -0
  427. package/dist/backend/backend/src/services/worktree/worktree-git.d.ts.map +1 -0
  428. package/dist/backend/backend/src/services/worktree/worktree-git.js +569 -0
  429. package/dist/backend/backend/src/services/worktree/worktree-git.js.map +1 -0
  430. package/dist/backend/backend/src/types/event-bus.types.d.ts +6 -1
  431. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  432. package/dist/backend/backend/src/types/event-bus.types.js +8 -0
  433. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  434. package/dist/backend/backend/src/types/index.d.ts +23 -18
  435. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  436. package/dist/backend/backend/src/types/index.js.map +1 -1
  437. package/dist/backend/backend/src/types/intent-task.types.d.ts +1 -1
  438. package/dist/backend/backend/src/types/intent-task.types.d.ts.map +1 -1
  439. package/dist/backend/backend/src/types/project-ticket.types.d.ts +132 -0
  440. package/dist/backend/backend/src/types/project-ticket.types.d.ts.map +1 -0
  441. package/dist/backend/backend/src/types/project-ticket.types.js +120 -0
  442. package/dist/backend/backend/src/types/project-ticket.types.js.map +1 -0
  443. package/dist/backend/backend/src/types/review-reason.types.d.ts +3 -1
  444. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -1
  445. package/dist/backend/backend/src/types/review-reason.types.js +1 -0
  446. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -1
  447. package/dist/backend/backend/src/types/v2/index.d.ts +2 -2
  448. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  449. package/dist/backend/backend/src/types/v2/index.js +1 -1
  450. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  451. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts +7 -0
  452. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  453. package/dist/backend/backend/src/types/v2/reconcile.types.js.map +1 -1
  454. package/dist/backend/backend/src/types/v2/request.types.d.ts +18 -0
  455. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  456. package/dist/backend/backend/src/types/v2/request.types.js +1 -0
  457. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  458. package/dist/backend/backend/src/types/v2/ticket.types.d.ts +6 -2
  459. package/dist/backend/backend/src/types/v2/ticket.types.d.ts.map +1 -1
  460. package/dist/backend/backend/src/types/v2/ticket.types.js +1 -1
  461. package/dist/backend/backend/src/types/v2/ticket.types.js.map +1 -1
  462. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +169 -14
  463. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  464. package/dist/backend/backend/src/types/v2/work-item.types.js +263 -44
  465. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  466. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +33 -0
  467. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
  468. package/dist/backend/backend/src/utils/agent-caller.utils.js +37 -0
  469. package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
  470. package/dist/backend/backend/src/utils/secret-env.d.ts +61 -0
  471. package/dist/backend/backend/src/utils/secret-env.d.ts.map +1 -0
  472. package/dist/backend/backend/src/utils/secret-env.js +89 -0
  473. package/dist/backend/backend/src/utils/secret-env.js.map +1 -0
  474. package/dist/backend/build-info.json +2 -2
  475. package/dist/backend/config/constants.d.ts +71 -0
  476. package/dist/backend/config/constants.d.ts.map +1 -1
  477. package/dist/backend/config/constants.js +77 -0
  478. package/dist/backend/config/constants.js.map +1 -1
  479. package/dist/cli/backend/src/constants.d.ts +397 -1
  480. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  481. package/dist/cli/backend/src/constants.js +388 -2
  482. package/dist/cli/backend/src/constants.js.map +1 -1
  483. package/dist/cli/backend/src/models/index.d.ts +0 -1
  484. package/dist/cli/backend/src/models/index.d.ts.map +1 -1
  485. package/dist/cli/backend/src/models/index.js +0 -1
  486. package/dist/cli/backend/src/models/index.js.map +1 -1
  487. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +43 -1
  488. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  489. package/dist/cli/backend/src/services/agent/agent-registration.service.js +129 -34
  490. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  491. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +169 -0
  492. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -0
  493. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +231 -0
  494. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -0
  495. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +409 -0
  496. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -0
  497. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +961 -0
  498. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -0
  499. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +16 -0
  500. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  501. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +50 -0
  502. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  503. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  504. package/dist/cli/backend/src/services/ai/prompt-builder.service.js +9 -8
  505. package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  506. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.d.ts +75 -0
  507. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.d.ts.map +1 -0
  508. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.js +89 -0
  509. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.js.map +1 -0
  510. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js +1 -1
  511. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -1
  512. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  513. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +12 -0
  514. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  515. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +14 -0
  516. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  517. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  518. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  519. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +11 -7
  520. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  521. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts +41 -0
  522. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts.map +1 -0
  523. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.js +44 -0
  524. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.js.map +1 -0
  525. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +67 -0
  526. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -0
  527. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js +146 -0
  528. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -0
  529. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.d.ts +7 -0
  530. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.d.ts.map +1 -1
  531. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.js +9 -1
  532. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.js.map +1 -1
  533. package/dist/cli/backend/src/services/core/logger.service.d.ts +21 -0
  534. package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
  535. package/dist/cli/backend/src/services/core/logger.service.js +42 -4
  536. package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
  537. package/dist/cli/backend/src/services/core/storage.service.d.ts +1 -5
  538. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  539. package/dist/cli/backend/src/services/core/storage.service.js +5 -162
  540. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  541. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  542. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +6 -0
  543. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  544. package/dist/cli/backend/src/services/mcp-server.d.ts +19 -6
  545. package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -1
  546. package/dist/cli/backend/src/services/mcp-server.js +46 -16
  547. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  548. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
  549. package/dist/cli/backend/src/services/mcp-tool-definitions.js +3 -2
  550. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
  551. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +247 -0
  552. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -0
  553. package/dist/cli/backend/src/services/memory/standing-answers.service.js +534 -0
  554. package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -0
  555. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +35 -0
  556. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  557. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +99 -1
  558. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  559. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.d.ts +75 -0
  560. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.d.ts.map +1 -0
  561. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.js +80 -0
  562. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.js.map +1 -0
  563. package/dist/cli/backend/src/services/monitoring/agent-attention.d.ts +114 -0
  564. package/dist/cli/backend/src/services/monitoring/agent-attention.d.ts.map +1 -0
  565. package/dist/cli/backend/src/services/monitoring/agent-attention.js +165 -0
  566. package/dist/cli/backend/src/services/monitoring/agent-attention.js.map +1 -0
  567. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +214 -0
  568. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -0
  569. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +466 -0
  570. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -0
  571. package/dist/cli/backend/src/services/project-tickets/ticket-file.d.ts +121 -0
  572. package/dist/cli/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -0
  573. package/dist/cli/backend/src/services/project-tickets/ticket-file.js +468 -0
  574. package/dist/cli/backend/src/services/project-tickets/ticket-file.js.map +1 -0
  575. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.d.ts +69 -0
  576. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.d.ts.map +1 -0
  577. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.js +194 -0
  578. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.js.map +1 -0
  579. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.d.ts +47 -0
  580. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.d.ts.map +1 -0
  581. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.js +83 -0
  582. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.js.map +1 -0
  583. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.d.ts +97 -0
  584. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.d.ts.map +1 -0
  585. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.js +201 -0
  586. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.js.map +1 -0
  587. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +26 -1
  588. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  589. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +33 -2
  590. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  591. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +5 -0
  592. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  593. package/dist/cli/backend/src/services/session/pty/pty-session.js +8 -1
  594. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
  595. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts +18 -0
  596. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
  597. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js +23 -0
  598. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
  599. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts +8 -0
  600. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
  601. package/dist/cli/backend/src/services/session/session-backend.interface.js.map +1 -1
  602. package/dist/cli/backend/src/services/session/session-command-helper.d.ts +12 -2
  603. package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  604. package/dist/cli/backend/src/services/session/session-command-helper.js +14 -2
  605. package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
  606. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +145 -19
  607. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  608. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +323 -53
  609. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  610. package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
  611. package/dist/cli/backend/src/services/template/template.service.js +11 -6
  612. package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
  613. package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts +85 -6
  614. package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
  615. package/dist/cli/backend/src/services/v3/escalation-router.service.js +188 -9
  616. package/dist/cli/backend/src/services/v3/escalation-router.service.js.map +1 -1
  617. package/dist/cli/backend/src/services/v3/mission-executor.service.js +2 -2
  618. package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -1
  619. package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts +6 -4
  620. package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
  621. package/dist/cli/backend/src/services/v3/request-sla.subscriber.js +15 -6
  622. package/dist/cli/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
  623. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  624. package/dist/cli/backend/src/services/v3/request.service.js +2 -0
  625. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  626. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.d.ts +82 -0
  627. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.d.ts.map +1 -0
  628. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.js +172 -0
  629. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.js.map +1 -0
  630. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  631. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +2 -0
  632. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  633. package/dist/cli/backend/src/services/v3/ticket-intake-log.d.ts +87 -0
  634. package/dist/cli/backend/src/services/v3/ticket-intake-log.d.ts.map +1 -0
  635. package/dist/cli/backend/src/services/v3/ticket-intake-log.js +116 -0
  636. package/dist/cli/backend/src/services/v3/ticket-intake-log.js.map +1 -0
  637. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts +133 -15
  638. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -1
  639. package/dist/cli/backend/src/services/v3/ticket-intake.service.js +263 -45
  640. package/dist/cli/backend/src/services/v3/ticket-intake.service.js.map +1 -1
  641. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts +3 -1
  642. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  643. package/dist/cli/backend/src/services/v3/ticket-review.service.js +6 -2
  644. package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
  645. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  646. package/dist/cli/backend/src/services/v3/v3-data.service.js +9 -3
  647. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  648. package/dist/cli/backend/src/services/worktree/worktree-git.d.ts +260 -0
  649. package/dist/cli/backend/src/services/worktree/worktree-git.d.ts.map +1 -0
  650. package/dist/cli/backend/src/services/worktree/worktree-git.js +569 -0
  651. package/dist/cli/backend/src/services/worktree/worktree-git.js.map +1 -0
  652. package/dist/cli/backend/src/types/event-bus.types.d.ts +6 -1
  653. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  654. package/dist/cli/backend/src/types/event-bus.types.js +8 -0
  655. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  656. package/dist/cli/backend/src/types/index.d.ts +23 -18
  657. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  658. package/dist/cli/backend/src/types/index.js.map +1 -1
  659. package/dist/cli/backend/src/types/intent-task.types.d.ts +1 -1
  660. package/dist/cli/backend/src/types/intent-task.types.d.ts.map +1 -1
  661. package/dist/cli/backend/src/types/project-ticket.types.d.ts +132 -0
  662. package/dist/cli/backend/src/types/project-ticket.types.d.ts.map +1 -0
  663. package/dist/cli/backend/src/types/project-ticket.types.js +120 -0
  664. package/dist/cli/backend/src/types/project-ticket.types.js.map +1 -0
  665. package/dist/cli/backend/src/types/v2/index.d.ts +2 -2
  666. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  667. package/dist/cli/backend/src/types/v2/index.js +1 -1
  668. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  669. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts +7 -0
  670. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  671. package/dist/cli/backend/src/types/v2/reconcile.types.js.map +1 -1
  672. package/dist/cli/backend/src/types/v2/request.types.d.ts +18 -0
  673. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  674. package/dist/cli/backend/src/types/v2/request.types.js +1 -0
  675. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  676. package/dist/cli/backend/src/types/v2/ticket.types.d.ts +6 -2
  677. package/dist/cli/backend/src/types/v2/ticket.types.d.ts.map +1 -1
  678. package/dist/cli/backend/src/types/v2/ticket.types.js +1 -1
  679. package/dist/cli/backend/src/types/v2/ticket.types.js.map +1 -1
  680. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +169 -14
  681. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  682. package/dist/cli/backend/src/types/v2/work-item.types.js +263 -44
  683. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  684. package/dist/cli/backend/src/utils/secret-env.d.ts +61 -0
  685. package/dist/cli/backend/src/utils/secret-env.d.ts.map +1 -0
  686. package/dist/cli/backend/src/utils/secret-env.js +89 -0
  687. package/dist/cli/backend/src/utils/secret-env.js.map +1 -0
  688. package/dist/cli/cli/src/commands/onboard.d.ts +1 -1
  689. package/dist/cli/cli/src/commands/onboard.js +3 -3
  690. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  691. package/dist/cli/cli/src/commands/publish.d.ts.map +1 -1
  692. package/dist/cli/cli/src/commands/publish.js +4 -5
  693. package/dist/cli/cli/src/commands/publish.js.map +1 -1
  694. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  695. package/dist/cli/cli/src/commands/service.js +5 -2
  696. package/dist/cli/cli/src/commands/service.js.map +1 -1
  697. package/dist/cli/cli/src/commands/tickets.d.ts +60 -0
  698. package/dist/cli/cli/src/commands/tickets.d.ts.map +1 -0
  699. package/dist/cli/cli/src/commands/tickets.js +111 -0
  700. package/dist/cli/cli/src/commands/tickets.js.map +1 -0
  701. package/dist/cli/cli/src/index.js +12 -0
  702. package/dist/cli/cli/src/index.js.map +1 -1
  703. package/dist/cli/cli/src/utils/archive-creator.d.ts +7 -3
  704. package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -1
  705. package/dist/cli/cli/src/utils/archive-creator.js +17 -5
  706. package/dist/cli/cli/src/utils/archive-creator.js.map +1 -1
  707. package/dist/cli/cli/src/utils/cloud-submit.d.ts +1 -1
  708. package/dist/cli/cli/src/utils/cloud-submit.js +1 -1
  709. package/dist/cli/cli/src/utils/gh-submit.d.ts +10 -1
  710. package/dist/cli/cli/src/utils/gh-submit.d.ts.map +1 -1
  711. package/dist/cli/cli/src/utils/gh-submit.js +20 -4
  712. package/dist/cli/cli/src/utils/gh-submit.js.map +1 -1
  713. package/dist/cli/cli/src/utils/package-validator.d.ts +29 -6
  714. package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -1
  715. package/dist/cli/cli/src/utils/package-validator.js +88 -36
  716. package/dist/cli/cli/src/utils/package-validator.js.map +1 -1
  717. package/dist/cli/config/constants.d.ts +71 -0
  718. package/dist/cli/config/constants.d.ts.map +1 -1
  719. package/dist/cli/config/constants.js +77 -0
  720. package/dist/cli/config/constants.js.map +1 -1
  721. package/dist/cli/config/skills/marketplace-registry.d.ts +143 -0
  722. package/dist/cli/config/skills/marketplace-registry.d.ts.map +1 -0
  723. package/dist/cli/config/skills/marketplace-registry.js +192 -0
  724. package/dist/cli/config/skills/marketplace-registry.js.map +1 -0
  725. package/frontend/dist/assets/index-8d4b3ad2.js +4951 -0
  726. package/frontend/dist/assets/index-b6aded4c.css +42 -0
  727. package/frontend/dist/index.html +2 -2
  728. package/package.json +1 -1
  729. package/config/task_starters/build_e2e_test_plan_prompt.json +0 -51
  730. package/config/task_starters/build_tasks_prompt.json +0 -55
  731. package/config/task_starters/prompts/build_tasks_step1_milestone_structure.md +0 -274
  732. package/config/task_starters/prompts/e2e_test_plan_step1_build_tests.md +0 -391
  733. package/config/task_starters/prompts/e2e_test_plan_step2_run_tests.md +0 -240
  734. package/config/templates/customer-loyalty-team.json +0 -44
  735. package/config/templates/dtc-viral-content-team.json +0 -58
  736. package/config/templates/expert-innovation-team.json +0 -60
  737. package/config/templates/pragmatic-mvp-dev-team.json +0 -58
  738. package/config/templates/pro-sops/norms/content-production-pipeline.md +0 -39
  739. package/config/templates/pro-sops/norms/customer-onboarding-sop.md +0 -40
  740. package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts +0 -13
  741. package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts.map +0 -1
  742. package/dist/backend/backend/src/controllers/task-management/tickets.controller.js +0 -214
  743. package/dist/backend/backend/src/controllers/task-management/tickets.controller.js.map +0 -1
  744. package/dist/backend/backend/src/models/Ticket.d.ts +0 -24
  745. package/dist/backend/backend/src/models/Ticket.d.ts.map +0 -1
  746. package/dist/backend/backend/src/models/Ticket.js +0 -102
  747. package/dist/backend/backend/src/models/Ticket.js.map +0 -1
  748. package/dist/backend/backend/src/services/agent/task-planning.service.d.ts +0 -134
  749. package/dist/backend/backend/src/services/agent/task-planning.service.d.ts.map +0 -1
  750. package/dist/backend/backend/src/services/agent/task-planning.service.js +0 -291
  751. package/dist/backend/backend/src/services/agent/task-planning.service.js.map +0 -1
  752. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.d.ts +0 -71
  753. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.d.ts.map +0 -1
  754. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.js +0 -304
  755. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.js.map +0 -1
  756. package/dist/backend/backend/src/services/project/task-folder.service.d.ts +0 -48
  757. package/dist/backend/backend/src/services/project/task-folder.service.d.ts.map +0 -1
  758. package/dist/backend/backend/src/services/project/task-folder.service.js +0 -193
  759. package/dist/backend/backend/src/services/project/task-folder.service.js.map +0 -1
  760. package/dist/backend/backend/src/services/project/task.service.d.ts +0 -47
  761. package/dist/backend/backend/src/services/project/task.service.d.ts.map +0 -1
  762. package/dist/backend/backend/src/services/project/task.service.js +0 -253
  763. package/dist/backend/backend/src/services/project/task.service.js.map +0 -1
  764. package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts +0 -130
  765. package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts.map +0 -1
  766. package/dist/backend/backend/src/services/project/ticket-editor.service.js +0 -406
  767. package/dist/backend/backend/src/services/project/ticket-editor.service.js.map +0 -1
  768. package/dist/cli/backend/src/models/Ticket.d.ts +0 -24
  769. package/dist/cli/backend/src/models/Ticket.d.ts.map +0 -1
  770. package/dist/cli/backend/src/models/Ticket.js +0 -102
  771. package/dist/cli/backend/src/models/Ticket.js.map +0 -1
  772. package/frontend/dist/assets/index-2bdb57b9.css +0 -42
  773. package/frontend/dist/assets/index-54f1061c.js +0 -4963
@@ -13,7 +13,7 @@ import { ClaimService } from './claim.service.js';
13
13
  import { LoggerService } from '../core/logger.service.js';
14
14
  import { formatError } from '../../utils/format-error.js';
15
15
  import { TeamBudgetExceededError, } from '../budget/team-budget-gate.service.js';
16
- import { isWorkItem, isValidWorkItemTransition, isTransitionPermitted, LAST_REQUEUED_AT_METADATA_KEY, DISPOSITION_METADATA_KEY, DISPOSITION_REQUIRED_STATUSES, getWorkItemDisposition, WORK_ITEM_BLOCK_SOURCES, isExplicitlyBlocked, } from '../../types/v2/work-item.types.js';
16
+ import { isWorkItem, isValidWorkItemTransition, checkTransitionPermission, normalizeTransitionActor, describeTransitionActor, getWorkItemReviewer, ForbiddenTransitionError, VERDICT_TRANSITIONS, WORK_ITEM_REVIEWER_KEY, LAST_REQUEUED_AT_METADATA_KEY, DISPOSITION_METADATA_KEY, DISPOSITION_REQUIRED_STATUSES, getWorkItemDisposition, WORK_ITEM_BLOCK_SOURCES, isExplicitlyBlocked, TERMINAL_WORK_ITEM_STATUSES, } from '../../types/v2/work-item.types.js';
17
17
  import { createTaskClaim, } from '../../types/v2/claim.types.js';
18
18
  import { orderForAgent } from './ticket-claim-policy.js';
19
19
  import { SUPERSEDED_BY_METADATA_KEY } from '../v3/request-completion.js';
@@ -144,6 +144,37 @@ export class TaskPoolService {
144
144
  setEventBusService(bus) {
145
145
  this.eventBus = bus;
146
146
  }
147
+ /**
148
+ * Listeners told after a WorkItem is newly claimed (not for an
149
+ * already-held claim). There is no claim event on the bus; the claim sites
150
+ * are the HTTP controller, AgentAutoClaim and the boot path, so the hook
151
+ * lives here. Listeners run fire-and-forget: a slow or failing listener
152
+ * never delays or fails the claim. Used by the per-WorkItem worktree
153
+ * service (#814).
154
+ */
155
+ claimListeners = [];
156
+ /**
157
+ * Register a claim listener (see {@link claimListeners}).
158
+ *
159
+ * @param listener - Called with the claimed WorkItem and the claiming agent
160
+ * @returns Unsubscribe function
161
+ */
162
+ onClaimed(listener) {
163
+ this.claimListeners.push(listener);
164
+ return () => {
165
+ this.claimListeners = this.claimListeners.filter((l) => l !== listener);
166
+ };
167
+ }
168
+ /** Fire claim listeners without awaiting them; errors are logged, never thrown. */
169
+ notifyClaimed(workItem, agentId) {
170
+ for (const listener of this.claimListeners) {
171
+ Promise.resolve()
172
+ .then(() => listener(workItem, agentId))
173
+ .catch((err) => {
174
+ this.logger.warn('Claim listener failed (non-fatal)', { workItemId: workItem.id, error: formatError(err) });
175
+ });
176
+ }
177
+ }
147
178
  /**
148
179
  * Wire the Request-linker reference used by {@link addToPool} to
149
180
  * intrinsically link the new WI into its parent `Request.workItemIds[]`
@@ -530,6 +561,8 @@ export class TaskPoolService {
530
561
  workItemId: workItem.id,
531
562
  requestId: workItem.requestId,
532
563
  missionId: workItem.missionId,
564
+ // The dispatcher pushes the task to this session on queue.
565
+ ...(workItem.target ? { target: workItem.target } : {}),
533
566
  });
534
567
  }
535
568
  catch (err) {
@@ -897,6 +930,7 @@ export class TaskPoolService {
897
930
  title: selected.title,
898
931
  });
899
932
  await this.noteTicketSelfClaim(claimedItem, agentId);
933
+ this.notifyClaimed(claimedItem, agentId);
900
934
  return {
901
935
  workItem: claimedItem,
902
936
  claim,
@@ -980,6 +1014,7 @@ export class TaskPoolService {
980
1014
  await this.storage.flush();
981
1015
  this.logger.info('WorkItem claimed (specific)', { workItemId, agentId, claimId: claim.id });
982
1016
  await this.noteTicketSelfClaim(claimedItem, agentId);
1017
+ this.notifyClaimed(claimedItem, agentId);
983
1018
  return { workItem: claimedItem, claim };
984
1019
  });
985
1020
  }
@@ -1094,6 +1129,9 @@ export class TaskPoolService {
1094
1129
  * `done_by_worker` and wake the TL for sign-off.
1095
1130
  * - All other types (`cron_run`, `notify`, `reconcile`, `check`,
1096
1131
  * `confirm`, `review`, ...) default to simple completion (`done`).
1132
+ * - Bridge-auto maintenance items (`metadata.autoCreated`) and
1133
+ * trigger-fired check-ins (`triggerId`) complete as `done` too —
1134
+ * nothing reviews them (#813).
1097
1135
  *
1098
1136
  * The default is overridable via `wi.metadata.requiresVerification`:
1099
1137
  * - `true` — force verification path even for non-delegate types
@@ -1110,6 +1148,17 @@ export class TaskPoolService {
1110
1148
  return true;
1111
1149
  if (metaFlag === false)
1112
1150
  return false;
1151
+ // #813: bridge-auto maintenance items get no review item (the bridge
1152
+ // re-scans on its own tick), so parking them in done_by_worker only
1153
+ // stranded them until the TTL auto-verified them. Complete them as done.
1154
+ if (wi.metadata?.['autoCreated'] === true)
1155
+ return false;
1156
+ // #813: a trigger-fired item (schedule-followup / watch-for-event) is a
1157
+ // check-in the agent set for itself, created as `delegate` by default.
1158
+ // Nothing reviewed them — 123 of 293 verified items in the live pool on
1159
+ // 2026-09-26 were these, verified with no review item. Complete as done.
1160
+ if (wi.triggerId)
1161
+ return false;
1113
1162
  return wi.type === 'delegate';
1114
1163
  }
1115
1164
  /**
@@ -1264,6 +1313,11 @@ export class TaskPoolService {
1264
1313
  * the actor is not permitted to perform `running → done`.
1265
1314
  */
1266
1315
  async completeSimpleItem(workItemId, actorRole, result) {
1316
+ // #813: completing a review item renders a verdict on its source. Check
1317
+ // that this caller may render it BEFORE the review item itself is marked
1318
+ // done — otherwise a refused verdict leaves a "done" review and a source
1319
+ // that nobody reviewed.
1320
+ const verdictPlan = await this.planReviewVerdict(workItemId, actorRole, result);
1267
1321
  await this.releaseClaim(workItemId, 'completed');
1268
1322
  const updated = await this.transitionStatus(workItemId, 'done', actorRole, (wi) => {
1269
1323
  if (result)
@@ -1282,40 +1336,26 @@ export class TaskPoolService {
1282
1336
  //
1283
1337
  // When a verify WI completes (metadata.verifyOf points at its source),
1284
1338
  // propagate the verdict to the source via verifyItem so the source
1285
- // moves done_by_worker → verified AND its own dependents unblock. Use
1286
- // the 'system' actor — this is automatic propagation, not a fresh
1287
- // TL action (the TL action was completing this verify WI).
1288
- const verifyOf = updated?.metadata && typeof updated.metadata.verifyOf === 'string'
1289
- ? updated.metadata.verifyOf
1290
- : undefined;
1291
- if (verifyOf) {
1339
+ // moves done_by_worker → verified AND its own dependents unblock.
1340
+ // #813: the verdict is rendered AS THE CALLER who completed the review
1341
+ // item (it used to be 'system', which let anyone's completion certify
1342
+ // the source). {@link planReviewVerdict} already checked the caller.
1343
+ if (verdictPlan) {
1292
1344
  try {
1293
- const source = await this.storage.findWorkItem(verifyOf);
1294
- if (source && source.status === 'done_by_worker') {
1295
- // Ticket loop Phase 3: a reviewer can send work back by completing
1296
- // the review with `verdict: 'rejected'` (+ feedback). Before this,
1297
- // completing a review always meant "verified" and the bridge's
1298
- // retry path was unreachable from a reviewer.
1299
- const rejected = result?.verdict === 'rejected';
1300
- const feedback = typeof result?.feedback === 'string' && result.feedback.trim()
1301
- ? result.feedback.trim()
1302
- : typeof result?.summary === 'string'
1303
- ? result.summary
1304
- : undefined;
1305
- await this.verifyItem(verifyOf, 'system', rejected ? 'rejected' : 'verified', rejected ? feedback : undefined);
1306
- this.logger.info('Verify WI complete → propagated to source', {
1307
- verifyWorkItemId: workItemId,
1308
- sourceWorkItemId: verifyOf,
1309
- verdict: rejected ? 'rejected' : 'verified',
1310
- });
1311
- }
1345
+ await this.verifyItem(verdictPlan.sourceId, verdictPlan.reviewer, verdictPlan.verdict, verdictPlan.verdict === 'rejected' ? verdictPlan.feedback : undefined);
1346
+ this.logger.info('Verify WI complete → propagated to source', {
1347
+ verifyWorkItemId: workItemId,
1348
+ sourceWorkItemId: verdictPlan.sourceId,
1349
+ verdict: verdictPlan.verdict,
1350
+ reviewer: describeTransitionActor(verdictPlan.reviewer),
1351
+ });
1312
1352
  }
1313
1353
  catch (err) {
1314
1354
  // Propagation is best-effort — a failed propagate must NOT roll
1315
1355
  // back the verify WI's own completion.
1316
1356
  this.logger.warn('Verify-to-source propagation failed (non-fatal)', {
1317
1357
  verifyWorkItemId: workItemId,
1318
- sourceWorkItemId: verifyOf,
1358
+ sourceWorkItemId: verdictPlan.sourceId,
1319
1359
  error: err instanceof Error ? err.message : String(err),
1320
1360
  });
1321
1361
  }
@@ -1331,6 +1371,130 @@ export class TaskPoolService {
1331
1371
  }
1332
1372
  return updated;
1333
1373
  }
1374
+ /**
1375
+ * The verdict a review item's completion would render on its source, after
1376
+ * checking that the completing caller may render it (#813).
1377
+ *
1378
+ * A review item carries `metadata.verifyOf` = the source WorkItem id. The
1379
+ * caller completes the review as its assignee (`agent` role) or as the
1380
+ * orchestrator; on the source it acts as the REVIEWER, so the verdict is
1381
+ * checked as `team_lead`/`orchestrator` with the caller's session — the
1382
+ * reviewer rule then decides by identity, not by the claimed role.
1383
+ *
1384
+ * @param workItemId - The item being completed
1385
+ * @param actorInput - The caller completing it
1386
+ * @param result - The completion result (`verdict: 'rejected'` sends it back)
1387
+ * @returns The planned verdict, or null when this item reviews nothing that
1388
+ * is still awaiting review
1389
+ * @throws ForbiddenTransitionError when the caller may not render the verdict
1390
+ */
1391
+ async planReviewVerdict(workItemId, actorInput, result) {
1392
+ const reviewItem = await this.storage.findWorkItem(workItemId);
1393
+ const verifyOf = reviewItem?.metadata && typeof reviewItem.metadata.verifyOf === 'string'
1394
+ ? reviewItem.metadata.verifyOf
1395
+ : undefined;
1396
+ if (!verifyOf)
1397
+ return null;
1398
+ const source = await this.storage.findWorkItem(verifyOf);
1399
+ if (!source || source.status !== 'done_by_worker')
1400
+ return null;
1401
+ // Ticket loop Phase 3: a reviewer can send work back by completing the
1402
+ // review with `verdict: 'rejected'` (+ feedback).
1403
+ const verdict = result?.verdict === 'rejected' ? 'rejected' : 'verified';
1404
+ const feedback = typeof result?.feedback === 'string' && result.feedback.trim()
1405
+ ? result.feedback.trim()
1406
+ : typeof result?.summary === 'string'
1407
+ ? result.summary
1408
+ : undefined;
1409
+ const reviewer = TaskPoolService.reviewerActorFor(actorInput);
1410
+ // The review item's assignee is the reviewer of record for its source.
1411
+ await this.assertTransitionPermitted(source, verdict, reviewer, reviewItem?.target);
1412
+ // Persist the reviewer of record so the verdict below (and any later
1413
+ // audit) sees the same identity this check just accepted.
1414
+ if (reviewItem?.target && !getWorkItemReviewer(source)) {
1415
+ await this.storage.updateWorkItem(verifyOf, (wi) => {
1416
+ wi.metadata = { ...(wi.metadata ?? {}), [WORK_ITEM_REVIEWER_KEY]: reviewItem.target };
1417
+ });
1418
+ }
1419
+ return { sourceId: verifyOf, verdict, reviewer, ...(feedback ? { feedback } : {}) };
1420
+ }
1421
+ /**
1422
+ * Map the caller of a review item's completion to the actor that renders
1423
+ * the verdict on the source. `agent` → `team_lead` (it is reviewing, not
1424
+ * working); every other role is kept. A missing actor stays missing, so it
1425
+ * is refused.
1426
+ *
1427
+ * @param actorInput - The completing caller
1428
+ * @returns The reviewer actor (or undefined → refused by the gate)
1429
+ */
1430
+ static reviewerActorFor(actorInput) {
1431
+ const actor = normalizeTransitionActor(actorInput);
1432
+ if (!actor)
1433
+ return actorInput;
1434
+ return {
1435
+ ...actor,
1436
+ role: actor.role === 'agent' ? 'team_lead' : actor.role,
1437
+ via: actor.via ?? 'review-item-completion',
1438
+ };
1439
+ }
1440
+ /**
1441
+ * Run the closed permission gate for one transition and throw on refusal.
1442
+ *
1443
+ * For the verdict edges, an item that predates reviewer stamping gets its
1444
+ * reviewer from its review item (`<id>:verify:<id>`, targeted at the
1445
+ * reviewer when the bridge created it), so a lead can still review items
1446
+ * that were in flight when #813 shipped.
1447
+ *
1448
+ * @param item - The WorkItem as it is now
1449
+ * @param to - Target status
1450
+ * @param actorInput - The caller
1451
+ * @param reviewerHint - Reviewer of record when the caller already knows it
1452
+ * (the target of the review item being completed)
1453
+ * @throws ForbiddenTransitionError when refused
1454
+ */
1455
+ async assertTransitionPermitted(item, to, actorInput, reviewerHint) {
1456
+ let subject = item;
1457
+ if (VERDICT_TRANSITIONS.has(`${item.status}→${to}`) && !getWorkItemReviewer(item)) {
1458
+ const reviewer = reviewerHint ?? (await this.storage.findWorkItem(`${item.id}:verify:${item.id}`))?.target;
1459
+ if (reviewer) {
1460
+ subject = { ...item, metadata: { ...(item.metadata ?? {}), [WORK_ITEM_REVIEWER_KEY]: reviewer } };
1461
+ }
1462
+ }
1463
+ const decision = checkTransitionPermission(subject, to, actorInput);
1464
+ if (!decision.allowed) {
1465
+ const actor = normalizeTransitionActor(actorInput);
1466
+ this.logger.warn('Refused WorkItem transition', {
1467
+ workItemId: item.id,
1468
+ from: item.status,
1469
+ to,
1470
+ actor: describeTransitionActor(actor),
1471
+ reason: decision.reason,
1472
+ });
1473
+ throw new ForbiddenTransitionError(item.id, item.status, to, actor, decision);
1474
+ }
1475
+ }
1476
+ /**
1477
+ * Stamp a review-escalation marker on a `done_by_worker` item (#813).
1478
+ *
1479
+ * The marker is what lets the next reviewer in the chain render the verdict
1480
+ * (the orchestrator after {@link REVIEW_ESCALATED_TO_ORC_KEY}), and it
1481
+ * makes each escalation fire once even across a backend restart — the
1482
+ * reconciler used to dedupe in memory only. Status is not touched.
1483
+ *
1484
+ * @param workItemId - The item under review
1485
+ * @param key - Metadata key to stamp (the orc or owner escalation key)
1486
+ * @param at - Timestamp to record (defaults to now)
1487
+ * @returns True when stamped, false when the item is gone or no longer awaiting review
1488
+ */
1489
+ async stampReviewEscalation(workItemId, key, at = new Date().toISOString()) {
1490
+ const item = await this.storage.findWorkItem(workItemId);
1491
+ if (!item || item.status !== 'done_by_worker')
1492
+ return false;
1493
+ const ok = await this.storage.updateWorkItem(workItemId, (wi) => {
1494
+ wi.metadata = { ...(wi.metadata ?? {}), [key]: at };
1495
+ });
1496
+ return !!ok;
1497
+ }
1334
1498
  /**
1335
1499
  * TL records a verdict on a WorkItem in `done_by_worker` status.
1336
1500
  *
@@ -1360,10 +1524,28 @@ export class TaskPoolService {
1360
1524
  const updated = await this.transitionStatus(workItemId, verdict, actorRole, (wi) => {
1361
1525
  if (comment)
1362
1526
  wi.error = comment;
1527
+ // #813: record WHO rendered the verdict, so reports can show that a
1528
+ // verified item was reviewed and by whom.
1529
+ const by = normalizeTransitionActor(actorRole);
1530
+ wi.metadata = {
1531
+ ...(wi.metadata ?? {}),
1532
+ reviewedBy: by?.session ?? by?.role,
1533
+ reviewedByRole: by?.role,
1534
+ reviewedAt: new Date().toISOString(),
1535
+ };
1363
1536
  });
1364
1537
  if (verdict === 'verified') {
1365
1538
  await this.resolveBlockedDependents(workItemId);
1366
1539
  }
1540
+ // #819: a verdict rendered THROUGH this method directly (POST /verdict,
1541
+ // or an escalation's owner resolution) never completes the tracking
1542
+ // `<id>:verify:<id>` review item — only the normal "TL completes their
1543
+ // review WorkItem" path does that (via completeSimpleItem's own call
1544
+ // into verifyItem). Left alone, that review item sits open in the
1545
+ // reviewer's queue forever even though its source is already decided.
1546
+ // No-op when the review item was already closed by that normal path
1547
+ // (its status is already terminal by the time we get here).
1548
+ await this.closeReviewItemAfterDirectVerdict(workItemId);
1367
1549
  await this.storage.flush();
1368
1550
  this.logger.info('WorkItem verdict recorded', { workItemId, verdict, actorRole });
1369
1551
  // F1-BRIDGE-1: the `rejected` branch publishes task:rejected so the
@@ -1382,34 +1564,84 @@ export class TaskPoolService {
1382
1564
  return updated;
1383
1565
  }
1384
1566
  /**
1385
- * Legacy facade — picks the verification path for the caller.
1567
+ * Close the review item tracking a source WorkItem's verification, once
1568
+ * the verdict has been rendered directly on the source (#819) — e.g. via
1569
+ * `POST /verdict`, or the owner resolving an escalation — rather than by
1570
+ * completing the review item itself. Without this, `<id>:verify:<id>`
1571
+ * sits open in the reviewer's queue forever, even though its source has
1572
+ * already been verified or rejected.
1386
1573
  *
1387
- * Existing call sites (REST controller, task-management controllers,
1388
- * V3 data service) invoke `completeItem(id, result)` without an
1389
- * explicit actor role. The facade reads the WorkItem, applies the
1390
- * {@link requiresVerification} policy, and dispatches to either
1391
- * {@link submitForVerification} (delegate items / explicit opt-in)
1392
- * or {@link completeSimpleItem} (everything else).
1574
+ * A review item still `running` (claimed by its reviewer) is completed the
1575
+ * same way a reviewer's own completion would ({@link completeSimpleItem});
1576
+ * `planReviewVerdict` is a safe no-op there because the source is no
1577
+ * longer `done_by_worker`, so this can never recurse back into
1578
+ * {@link verifyItem}. A review item never claimed (`queued`/`blocked`/
1579
+ * `scheduled`) is cancelled instead, since `→done` requires `running`.
1580
+ * Already-terminal or missing review items are left alone.
1393
1581
  *
1394
- * The legacy actor role for these implicit callers is `'agent'`.
1395
- * Migrations to explicit-actor calls can land in follow-up tickets
1396
- * without touching the five call sites in this PR.
1582
+ * Best-effort: any failure here is logged, never thrown — the real verdict
1583
+ * on the source has already been recorded, and that must not be
1584
+ * jeopardized by a failure to tidy up a secondary tracking item.
1585
+ *
1586
+ * @param sourceId - The WorkItem whose verdict was just rendered
1587
+ */
1588
+ async closeReviewItemAfterDirectVerdict(sourceId) {
1589
+ const reviewId = `${sourceId}:verify:${sourceId}`;
1590
+ try {
1591
+ const reviewItem = await this.storage.findWorkItem(reviewId);
1592
+ if (!reviewItem || TERMINAL_WORK_ITEM_STATUSES.has(reviewItem.status))
1593
+ return;
1594
+ if (reviewItem.status === 'running') {
1595
+ await this.completeSimpleItem(reviewId, { role: 'system', via: 'verifyItem:auto-close-review' }, {
1596
+ summary: 'Auto-closed: the verdict was rendered directly on the source it reviews.',
1597
+ });
1598
+ }
1599
+ else {
1600
+ await this.transitionStatus(reviewId, 'cancelled', { role: 'system', via: 'verifyItem:auto-close-review' }, (wi) => {
1601
+ wi.metadata = {
1602
+ ...(wi.metadata ?? {}),
1603
+ autoClosedReason: 'verdict rendered directly on the source it reviews',
1604
+ };
1605
+ });
1606
+ await this.storage.flush();
1607
+ }
1608
+ }
1609
+ catch (err) {
1610
+ this.logger.warn('Failed to auto-close review item after a direct verdict (non-fatal)', {
1611
+ sourceId,
1612
+ reviewId,
1613
+ error: err instanceof Error ? err.message : String(err),
1614
+ });
1615
+ }
1616
+ }
1617
+ /**
1618
+ * Completion facade — picks the verification path for the caller.
1619
+ *
1620
+ * Reads the WorkItem, applies the {@link requiresVerification} policy, and
1621
+ * dispatches to either {@link submitForVerification} (delegate items /
1622
+ * explicit opt-in) or {@link completeSimpleItem} (everything else).
1623
+ *
1624
+ * #813: the caller's actor is REQUIRED. It used to be hard-coded `'agent'`
1625
+ * with no identity, so a review item's completion could not tell its
1626
+ * reviewer from anyone else. Controllers resolve it server-side (see
1627
+ * `resolveTransitionActor` in the task-pool controller).
1397
1628
  *
1398
1629
  * @param workItemId - WorkItem id
1399
1630
  * @param result - Optional result payload
1631
+ * @param actor - Who is completing it (role + session)
1400
1632
  * @throws When the WorkItem is missing or the underlying transition
1401
- * is rejected (invalid state, forbidden actor).
1633
+ * is rejected (invalid state, forbidden actor, not the reviewer).
1402
1634
  */
1403
- async completeItem(workItemId, result) {
1635
+ async completeItem(workItemId, result, actor) {
1404
1636
  const workItem = await this.storage.findWorkItem(workItemId);
1405
1637
  if (!workItem) {
1406
1638
  throw new Error(`WorkItem not found: ${workItemId}`);
1407
1639
  }
1408
1640
  if (this.requiresVerification(workItem)) {
1409
- await this.submitForVerification(workItemId, 'agent', result);
1641
+ await this.submitForVerification(workItemId, actor, result);
1410
1642
  }
1411
1643
  else {
1412
- await this.completeSimpleItem(workItemId, 'agent', result);
1644
+ await this.completeSimpleItem(workItemId, actor, result);
1413
1645
  }
1414
1646
  }
1415
1647
  /**
@@ -1967,6 +2199,22 @@ export class TaskPoolService {
1967
2199
  return null;
1968
2200
  return (await this.storage.findWorkItem(workItemId)) ?? null;
1969
2201
  }
2202
+ /**
2203
+ * Shallow-merge keys into a WorkItem's metadata (no status change).
2204
+ *
2205
+ * @param workItemId - WorkItem id
2206
+ * @param patch - Keys to set on `metadata`
2207
+ * @returns The updated WorkItem, or null if not found
2208
+ */
2209
+ async mergeItemMetadata(workItemId, patch) {
2210
+ const ok = await this.storage.updateWorkItem(workItemId, (wi) => {
2211
+ wi.metadata = { ...(wi.metadata ?? {}), ...patch };
2212
+ });
2213
+ if (!ok)
2214
+ return null;
2215
+ await this.storage.flush();
2216
+ return (await this.storage.findWorkItem(workItemId)) ?? null;
2217
+ }
1970
2218
  /**
1971
2219
  * Re-point a queued WorkItem at another agent (its target went stale).
1972
2220
  * Only `queued` items move: running work belongs to whoever holds it.
@@ -2059,6 +2307,25 @@ export class TaskPoolService {
2059
2307
  this.logger.info('WorkItem handoff', { workItemId, fromAgent, newTarget });
2060
2308
  return (await this.storage.findWorkItem(workItemId)) ?? null;
2061
2309
  }
2310
+ /**
2311
+ * Set one top-level metadata key on a WorkItem. Never changes its status
2312
+ * (this is not a transition), so it needs no actor. Used by the worktree
2313
+ * service to record `metadata.worktree` (#814).
2314
+ *
2315
+ * @param workItemId - WorkItem id
2316
+ * @param key - Metadata key
2317
+ * @param value - New value (replaces the old one)
2318
+ * @returns The updated WorkItem, or null when it does not exist
2319
+ */
2320
+ async patchMetadata(workItemId, key, value) {
2321
+ const ok = await this.storage.updateWorkItem(workItemId, (wi) => {
2322
+ const existing = (wi.metadata && typeof wi.metadata === 'object' ? wi.metadata : {});
2323
+ wi.metadata = { ...existing, [key]: value };
2324
+ });
2325
+ if (!ok)
2326
+ return null;
2327
+ return (await this.storage.findWorkItem(workItemId)) ?? null;
2328
+ }
2062
2329
  /**
2063
2330
  * Appends a working-state note to a WorkItem's metadata.notes array.
2064
2331
  *
@@ -2183,7 +2450,7 @@ export class TaskPoolService {
2183
2450
  * @throws Error if transition is invalid (state machine — see WORK_ITEM_TRANSITIONS)
2184
2451
  * @throws Error if actor is not permitted (role check — see TRANSITION_PERMISSIONS)
2185
2452
  */
2186
- async updateItemStatus(workItemId, newStatus, actorRole = 'system',
2453
+ async updateItemStatus(workItemId, newStatus, actorRole,
2187
2454
  /**
2188
2455
  * Optional human-readable reason. Persisted on:
2189
2456
  * - `WorkItem.cancelReason` when `newStatus === 'cancelled'`
@@ -2192,7 +2459,13 @@ export class TaskPoolService {
2192
2459
  * explanation)
2193
2460
  * - Ignored for other status transitions.
2194
2461
  */
2195
- reason) {
2462
+ reason,
2463
+ /**
2464
+ * Optional `WorkItem.blockSource` to set atomically with a transition
2465
+ * INTO `blocked` (the waiting_on_human rule passes
2466
+ * WORK_ITEM_BLOCK_SOURCES.WAITING_ON_HUMAN, #815). Ignored otherwise.
2467
+ */
2468
+ blockSource) {
2196
2469
  const items = await this.storage.getWorkItems();
2197
2470
  const item = items.find((wi) => wi.id === workItemId);
2198
2471
  if (!item) {
@@ -2216,11 +2489,8 @@ export class TaskPoolService {
2216
2489
  if (!isValidWorkItemTransition(item.status, newStatus)) {
2217
2490
  throw new Error(`Invalid status transition for WorkItem ${workItemId}: ${item.status} → ${newStatus}`);
2218
2491
  }
2219
- // TRANS-1 V3: enforce per-role permissions. system role always passes.
2220
- if (!isTransitionPermitted(item.status, newStatus, actorRole)) {
2221
- throw new Error(`Forbidden transition for WorkItem ${workItemId}: actor='${actorRole}' ` +
2222
- `not permitted to perform ${item.status} → ${newStatus}.`);
2223
- }
2492
+ // TRANS-1 V3 + #813: closed, item-aware permission gate. No role bypasses it.
2493
+ await this.assertTransitionPermitted(item, newStatus, actorRole);
2224
2494
  // Capture pre-write status. See transitionStatus's identical block
2225
2495
  // for the writeup — storage.updateWorkItem mutates in place, so
2226
2496
  // reading item.status after the write yields newStatus and the
@@ -2261,6 +2531,9 @@ export class TaskPoolService {
2261
2531
  if (newStatus === 'blocked' && typeof reason === 'string' && reason.length > 0) {
2262
2532
  wi.blockedReason = reason;
2263
2533
  }
2534
+ if (newStatus === 'blocked' && blockSource) {
2535
+ wi.blockSource = blockSource;
2536
+ }
2264
2537
  // Ticket loop Phase 3: an agent picks its own unblocked work back up
2265
2538
  // before new work, so remember that this item was blocked.
2266
2539
  if (fromStatus === 'blocked' && newStatus === 'queued') {
@@ -2362,10 +2635,7 @@ export class TaskPoolService {
2362
2635
  if (!isValidWorkItemTransition(item.status, newStatus)) {
2363
2636
  throw new Error(`Invalid status transition for WorkItem ${workItemId}: ${item.status} → ${newStatus}`);
2364
2637
  }
2365
- if (!isTransitionPermitted(item.status, newStatus, actorRole)) {
2366
- throw new Error(`Forbidden transition for WorkItem ${workItemId}: actor='${actorRole}' ` +
2367
- `not permitted to perform ${item.status} → ${newStatus}.`);
2368
- }
2638
+ await this.assertTransitionPermitted(item, newStatus, actorRole);
2369
2639
  // Capture the pre-write status into a local. `storage.updateWorkItem`
2370
2640
  // mutates the same in-memory object that `findWorkItem` returned, so
2371
2641
  // reading `item.status` AFTER the write yields the new value — which