crewly 1.20.185 → 1.20.187

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 (279) hide show
  1. package/config/skills/agent/core/remember/SKILL.md +1 -0
  2. package/config/skills/agent/core/remember/execute.sh +12 -0
  3. package/config/skills/agent/core/report-status/SKILL.md +7 -1
  4. package/config/skills/agent/core/report-status/execute.sh +41 -0
  5. package/config/skills/agent/core/slack-post/SKILL.md +1 -0
  6. package/config/skills/agent/core/slack-post/execute.sh +9 -2
  7. package/config/skills/team-leader/_common/lib.sh +45 -0
  8. package/config/skills/team-leader/start-agent/SKILL.md +6 -6
  9. package/config/skills/team-leader/start-agent/execute.sh +3 -12
  10. package/config/skills/team-leader/stop-agent/SKILL.md +6 -6
  11. package/config/skills/team-leader/stop-agent/execute.sh +3 -12
  12. package/dist/backend/backend/src/constants.d.ts +64 -0
  13. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  14. package/dist/backend/backend/src/constants.js +64 -0
  15. package/dist/backend/backend/src/constants.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +62 -0
  18. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/request/open-items.controller.js +1 -1
  20. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/slack/slack.controller.js +4 -1
  23. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +18 -1
  25. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/standing/standing.controller.js +77 -4
  27. package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/system/spend.controller.d.ts +32 -0
  29. package/dist/backend/backend/src/controllers/system/spend.controller.d.ts.map +1 -0
  30. package/dist/backend/backend/src/controllers/system/spend.controller.js +100 -0
  31. package/dist/backend/backend/src/controllers/system/spend.controller.js.map +1 -0
  32. package/dist/backend/backend/src/controllers/system/system.controller.d.ts +12 -0
  33. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  34. package/dist/backend/backend/src/controllers/system/system.controller.js +28 -3
  35. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  36. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +7 -0
  37. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  38. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +64 -1
  39. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  40. package/dist/backend/backend/src/index.d.ts.map +1 -1
  41. package/dist/backend/backend/src/index.js +59 -0
  42. package/dist/backend/backend/src/index.js.map +1 -1
  43. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  44. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  45. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  46. package/dist/backend/backend/src/scripts/open-items-stale-followups.d.ts +51 -0
  47. package/dist/backend/backend/src/scripts/open-items-stale-followups.d.ts.map +1 -0
  48. package/dist/backend/backend/src/scripts/open-items-stale-followups.js +142 -0
  49. package/dist/backend/backend/src/scripts/open-items-stale-followups.js.map +1 -0
  50. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/agent/agent-registration.service.js +32 -1
  52. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +9 -0
  54. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/decisions/decision.service.js +37 -1
  56. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
  58. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +83 -2
  60. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/memory/memory.service.d.ts +14 -2
  62. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/memory/memory.service.js +12 -1
  64. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +18 -1
  66. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/memory/project-memory.service.js +38 -1
  68. package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +11 -0
  70. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/memory/standing-answers.service.js +40 -2
  72. package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -1
  73. package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts +70 -0
  74. package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts.map +1 -0
  75. package/dist/backend/backend/src/services/messaging/offline-agent-message.js +92 -0
  76. package/dist/backend/backend/src/services/messaging/offline-agent-message.js.map +1 -0
  77. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +5 -1
  78. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +11 -2
  80. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -0
  83. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  84. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +9 -1
  86. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  87. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +41 -1
  88. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +87 -2
  90. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  91. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
  92. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  93. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +83 -13
  94. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  95. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +25 -0
  96. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  97. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +45 -1
  98. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  99. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
  100. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  101. package/dist/backend/backend/src/services/open-items/open-item-extractor.js +86 -5
  102. package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  103. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +2 -1
  104. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -1
  105. package/dist/backend/backend/src/services/open-items/open-items-backfill.js +17 -6
  106. package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -1
  107. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +62 -1
  108. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  109. package/dist/backend/backend/src/services/open-items/open-items.service.js +203 -9
  110. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  111. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts +40 -0
  112. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts.map +1 -0
  113. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js +82 -0
  114. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js.map +1 -0
  115. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +29 -0
  116. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  117. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +49 -0
  118. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  119. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +6 -11
  121. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  122. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +23 -0
  123. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  124. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +55 -1
  125. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  126. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +10 -4
  128. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
  130. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
  132. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  133. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts +99 -0
  134. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts.map +1 -0
  135. package/dist/backend/backend/src/services/spend/spend-cap-command.js +190 -0
  136. package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -0
  137. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts +64 -0
  138. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
  139. package/dist/backend/backend/src/services/spend/spend-cap.gate.js +71 -0
  140. package/dist/backend/backend/src/services/spend/spend-cap.gate.js.map +1 -0
  141. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +225 -0
  142. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -0
  143. package/dist/backend/backend/src/services/spend/spend-cap.service.js +503 -0
  144. package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -0
  145. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts +85 -0
  146. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts.map +1 -0
  147. package/dist/backend/backend/src/services/spend/spend-cap.store.js +95 -0
  148. package/dist/backend/backend/src/services/spend/spend-cap.store.js.map +1 -0
  149. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts +50 -0
  150. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts.map +1 -0
  151. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js +98 -0
  152. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js.map +1 -0
  153. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts +124 -0
  154. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts.map +1 -0
  155. package/dist/backend/backend/src/services/spend/spend-ledger.service.js +189 -0
  156. package/dist/backend/backend/src/services/spend/spend-ledger.service.js.map +1 -0
  157. package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts +51 -0
  158. package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts.map +1 -0
  159. package/dist/backend/backend/src/services/task-pool/claim-target-waker.js +43 -0
  160. package/dist/backend/backend/src/services/task-pool/claim-target-waker.js.map +1 -0
  161. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +38 -0
  162. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  163. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +73 -1
  164. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  165. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts +44 -0
  166. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
  167. package/dist/backend/backend/src/services/task-pool/work-item-usage.js +37 -0
  168. package/dist/backend/backend/src/services/task-pool/work-item-usage.js.map +1 -0
  169. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  170. package/dist/backend/backend/src/services/v3/v3-data.service.js +11 -14
  171. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  172. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +25 -0
  173. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +50 -0
  175. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  176. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +9 -1
  177. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  178. package/dist/backend/backend/src/services/workflow/scheduler.service.js +16 -2
  179. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  180. package/dist/backend/backend/src/types/decision.types.d.ts +5 -1
  181. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  182. package/dist/backend/backend/src/types/event-bus.types.d.ts +9 -1
  183. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  184. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  185. package/dist/backend/backend/src/types/review-reason.types.d.ts +3 -1
  186. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -1
  187. package/dist/backend/backend/src/types/review-reason.types.js +1 -0
  188. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -1
  189. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +5 -1
  190. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  191. package/dist/backend/backend/src/types/v2/open-item.types.js +1 -1
  192. package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -1
  193. package/dist/backend/build-info.json +2 -2
  194. package/dist/cli/backend/src/constants.d.ts +64 -0
  195. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  196. package/dist/cli/backend/src/constants.js +64 -0
  197. package/dist/cli/backend/src/constants.js.map +1 -1
  198. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  199. package/dist/cli/backend/src/services/agent/agent-registration.service.js +32 -1
  200. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  201. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +9 -0
  202. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  203. package/dist/cli/backend/src/services/decisions/decision.service.js +37 -1
  204. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  205. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
  206. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  207. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +83 -2
  208. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  209. package/dist/cli/backend/src/services/memory/memory.service.d.ts +14 -2
  210. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  211. package/dist/cli/backend/src/services/memory/memory.service.js +12 -1
  212. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  213. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +18 -1
  214. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  215. package/dist/cli/backend/src/services/memory/project-memory.service.js +38 -1
  216. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
  217. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +11 -0
  218. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  219. package/dist/cli/backend/src/services/memory/standing-answers.service.js +40 -2
  220. package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -1
  221. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +5 -1
  222. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  223. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +11 -2
  224. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  225. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  226. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +9 -1
  227. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  228. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +41 -1
  229. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  230. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +87 -2
  231. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  232. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
  233. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  234. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +83 -13
  235. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  236. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts +97 -0
  237. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts.map +1 -0
  238. package/dist/cli/backend/src/services/monitoring/model-pricing.js +120 -0
  239. package/dist/cli/backend/src/services/monitoring/model-pricing.js.map +1 -0
  240. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +25 -0
  241. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  242. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +45 -1
  243. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  244. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
  245. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  246. package/dist/cli/backend/src/services/open-items/open-item-extractor.js +86 -5
  247. package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  248. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
  249. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  250. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
  251. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  252. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts +64 -0
  253. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
  254. package/dist/cli/backend/src/services/spend/spend-cap.gate.js +71 -0
  255. package/dist/cli/backend/src/services/spend/spend-cap.gate.js.map +1 -0
  256. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +38 -0
  257. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  258. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +73 -1
  259. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  260. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts +44 -0
  261. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
  262. package/dist/cli/backend/src/services/task-pool/work-item-usage.js +37 -0
  263. package/dist/cli/backend/src/services/task-pool/work-item-usage.js.map +1 -0
  264. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  265. package/dist/cli/backend/src/services/v3/v3-data.service.js +11 -14
  266. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  267. package/dist/cli/backend/src/types/decision.types.d.ts +5 -1
  268. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  269. package/dist/cli/backend/src/types/event-bus.types.d.ts +9 -1
  270. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  271. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  272. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +5 -1
  273. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  274. package/dist/cli/backend/src/types/v2/open-item.types.js +1 -1
  275. package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -1
  276. package/frontend/dist/assets/{index-1ee8a9a2.js → index-15c2faf2.js} +279 -279
  277. package/frontend/dist/assets/{index-a79c7852.css → index-20a67829.css} +1 -1
  278. package/frontend/dist/index.html +2 -2
  279. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * One-off backfill: scan tickets of the last 7 days for commitments and
2
+ * One-off backfill: scan tickets for promises of the last 24h for commitments and
3
3
  * questions their agents left open before open-item tracking existed
4
4
  * (specs/2026-10-01-reply-open-items.md §6). Dry-run by default: it reports
5
5
  * what it WOULD create and changes nothing.
@@ -22,7 +22,7 @@
22
22
  */
23
23
  import { OPEN_ITEMS_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
24
24
  import { formatTicketNumber } from '../../types/v2/ticket.types.js';
25
- import { childrenState, childWorkFor, isSameItem } from './open-items.service.js';
25
+ import { childrenState, childWorkFor, isSameItem, isSamePromise } from './open-items.service.js';
26
26
  /** A login / re-login / sign-in prompt (harness flow, not an owner decision). */
27
27
  const LOGIN_RE = /\b(?:log ?in|logged in|sign(?:ed)? ?in|re-?login|re-?log ?in|oauth|auth(?:orization)? code|device code|verification code)\b|登录|登陆|登上|登入|重新登|授权码|验证码|授权链接/i;
28
28
  /** A runtime / harness the agent might ask the owner to sign in to. */
@@ -61,9 +61,11 @@ export function reportsSettled(content) {
61
61
  export async function backfillOpenItems(deps, opts = {}) {
62
62
  const apply = opts.apply === true;
63
63
  const now = (deps.now ?? (() => new Date()))();
64
- const since = now.getTime() - OPEN_ITEMS_CONSTANTS.LOOKBACK_MS;
64
+ // Only promises from the last day: an older one was either delivered or is
65
+ // too stale to chase the owner about.
66
+ const since = now.getTime() - OPEN_ITEMS_CONSTANTS.BACKFILL_MAX_AGE_MS;
65
67
  const allRequests = await deps.listRequests();
66
- const requests = allRequests.filter((r) => typeof r.ticketNumber === 'number' && !!r.chatRef && r.status !== 'cancelled' && Date.parse(r.updatedAt) >= since);
68
+ const requests = allRequests.filter((r) => typeof r.ticketNumber === 'number' && !!r.chatRef && r.status !== 'cancelled' && Date.parse(r.updatedAt) >= now.getTime() - OPEN_ITEMS_CONSTANTS.LOOKBACK_MS);
67
69
  const pool = await deps.listWorkItems();
68
70
  const report = { dryRun: !apply, scanned: requests.length, rows: [], reopened: [] };
69
71
  for (const request of requests) {
@@ -85,6 +87,15 @@ export async function backfillOpenItems(deps, opts = {}) {
85
87
  for (const p of planned) {
86
88
  if (keep.some((k) => isSameItem(k.item, p.item)))
87
89
  continue;
90
+ // The same promise said again later: the newer one stands, the earlier row is dropped.
91
+ const dup = keep.findIndex((k) => isSamePromise(k.item, p.item));
92
+ if (dup >= 0) {
93
+ const old = keep[dup];
94
+ keep.splice(dup, 1);
95
+ const ri = report.rows.findIndex((r) => r.requestId === request.id && r.type === 'commitment' && r.text === old.item.text && !r.skipped);
96
+ if (ri >= 0)
97
+ report.rows[ri] = { ...report.rows[ri], skipped: 'said again later in the thread; the newer promise stands', action: 'none' };
98
+ }
88
99
  const row = {
89
100
  requestId: request.id,
90
101
  ticket,
@@ -164,7 +175,7 @@ export async function backfillOpenItems(deps, opts = {}) {
164
175
  if (request.status === 'done')
165
176
  report.reopened.push(`${ticket} (${request.id.slice(0, 8)})`);
166
177
  if (apply)
167
- await deps.service.adopt(request.id, keep, { source: 'backfill' });
178
+ await deps.service.adopt(request.id, keep, { source: 'backfill', caller: opts.caller });
168
179
  }
169
180
  return report;
170
181
  }
@@ -176,7 +187,7 @@ export async function backfillOpenItems(deps, opts = {}) {
176
187
  */
177
188
  export function formatBackfillReport(report) {
178
189
  const lines = [];
179
- lines.push(`${report.dryRun ? 'DRY RUN — nothing changed' : 'APPLIED'}. Tickets scanned (last 7 days): ${report.scanned}.`);
190
+ lines.push(`${report.dryRun ? 'DRY RUN — nothing changed' : 'APPLIED'}. Tickets scanned (promises of the last 24h): ${report.scanned}.`);
180
191
  const live = report.rows.filter((r) => !r.skipped);
181
192
  const skipped = report.rows.filter((r) => r.skipped);
182
193
  lines.push(`Open items to track: ${live.length} (${live.filter((r) => r.type === 'commitment').length} commitments, ${live.filter((r) => r.type === 'question').length} questions). Already settled, skipped: ${skipped.length}.`);
@@ -1 +1 @@
1
- {"version":3,"file":"open-items-backfill.js","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-items-backfill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"open-items-backfill.js","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-items-backfill.ts"],"names":[],"mappings":"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"}
@@ -171,6 +171,19 @@ export declare function childrenState(ids: readonly string[], pool: readonly Wor
171
171
  * @returns True for a duplicate
172
172
  */
173
173
  export declare function isSameItem(a: Pick<RequestOpenItem, 'sourceMessageId' | 'text' | 'agent' | 'createdAt'>, b: Pick<RequestOpenItem, 'sourceMessageId' | 'text' | 'agent' | 'createdAt'>): boolean;
174
+ /** Whether the owner's message agrees ("可以", "同意", "ok", "go ahead", 👍) and does not hold back. */
175
+ export declare function isApproval(text: string): boolean;
176
+ /**
177
+ * Whether two commitments are the same promise: the same words, or — from the
178
+ * same agent within {@link OPEN_ITEMS_CONSTANTS.PROMISE_DUPLICATE_WINDOW_MS} —
179
+ * very similar words, or the same deliverable (same person named and the same
180
+ * kind of thing handed over).
181
+ *
182
+ * @param a - One item
183
+ * @param b - The other
184
+ * @returns True for one promise said twice
185
+ */
186
+ export declare function isSamePromise(a: RequestOpenItem, b: RequestOpenItem): boolean;
174
187
  /**
175
188
  * Tracks commitments and questions on Requests. See module docs.
176
189
  */
@@ -217,6 +230,25 @@ export declare class OpenItemsService {
217
230
  * @returns The request it changed, or null
218
231
  */
219
232
  onAgentMessage(message: OpenItemsChatMessage): Promise<Request | null>;
233
+ /**
234
+ * The owner posted in a ticket's thread: a yes opens the conditional
235
+ * promises that wait on them.
236
+ *
237
+ * @param message - The owner's message
238
+ * @returns The request it changed, or null
239
+ */
240
+ onOwnerMessage(message: OpenItemsChatMessage): Promise<Request | null>;
241
+ /**
242
+ * Open waiting promises: their due time is counted from `at`, and the
243
+ * follow-up WorkItem is created now.
244
+ *
245
+ * @param request - Request
246
+ * @param at - When the owner agreed
247
+ * @param why - For the log
248
+ * @param pick - Which waiting items
249
+ * @returns The updated request, or null when none matched
250
+ */
251
+ private openWaiting;
220
252
  /**
221
253
  * What a message would add, without side effects (also the backfill's view).
222
254
  *
@@ -226,6 +258,14 @@ export declare class OpenItemsService {
226
258
  * @returns Planned items
227
259
  */
228
260
  plan(request: Request, message: OpenItemsChatMessage, at: Date): Promise<PlannedOpenItem[]>;
261
+ /**
262
+ * The newest ask-owner decision this agent made shortly before `at` (the card a conditional promise waits on).
263
+ *
264
+ * @param agent - Agent
265
+ * @param at - When the promise was made
266
+ * @returns The decision, or null
267
+ */
268
+ private recentDecision;
229
269
  /**
230
270
  * The ask-owner decision the agent already made for this question, if any.
231
271
  *
@@ -268,16 +308,37 @@ export declare class OpenItemsService {
268
308
  * @returns True when it is the delivery
269
309
  */
270
310
  deliveredBy(item: RequestOpenItem, message: OpenItemsChatMessage, pool: readonly WorkItem[]): boolean;
311
+ /**
312
+ * Whether a post makes a NEW promise: restating the one it delivers does not count.
313
+ *
314
+ * @param item - The commitment being delivered
315
+ * @param message - The post
316
+ * @param at - Its time (epoch ms)
317
+ * @returns True when it promises something else
318
+ */
319
+ private promisesAnew;
320
+ /**
321
+ * The agent that owns a follow-up WorkItem closes it as already delivered:
322
+ * the open item is closed and the WorkItem finished (no done_by_worker step).
323
+ *
324
+ * @param workItemId - The follow-up WorkItem
325
+ * @param agent - The session closing it (must be the promising agent)
326
+ * @param summary - What the agent says (where it was delivered)
327
+ * @returns True when an active item of that agent was closed
328
+ */
329
+ closeByAgent(workItemId: string, agent: string, summary: string): Promise<boolean>;
271
330
  /**
272
331
  * Take planned items onto a request (the backfill's apply step).
273
332
  *
274
333
  * @param requestId - Request
275
334
  * @param planned - Items from {@link plan}
276
- * @param opts - `source: 'backfill'` marks the cards it posts as backfilled
335
+ * @param opts - `source: 'backfill'` marks the cards it posts as backfilled; `caller` is
336
+ * the session of whoever asked for it (logged: who ran an apply)
277
337
  * @returns Updated request, or null when it is gone
278
338
  */
279
339
  adopt(requestId: string, planned: PlannedOpenItem[], opts?: {
280
340
  source?: DecisionSource;
341
+ caller?: string;
281
342
  }): Promise<Request | null>;
282
343
  /**
283
344
  * Store items, and move the request between `done` and `awaiting_followup`.
@@ -1 +1 @@
1
- {"version":3,"file":"open-items.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-items.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"open-items.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-items.service.ts"],"names":[],"mappings":"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"}
@@ -35,7 +35,7 @@ import { isInterim } from '../slack/slack-typing-placeholder.service.js';
35
35
  import { LoggerService } from '../core/logger.service.js';
36
36
  import { ACTIVE_OPEN_ITEM_STATUSES } from '../../types/v2/open-item.types.js';
37
37
  import { formatTicketNumber } from '../../types/v2/ticket.types.js';
38
- import { extractOpenItems } from './open-item-extractor.js';
38
+ import { extractOpenItems, parseDue } from './open-item-extractor.js';
39
39
  import { deriveQuestionCard, questionSimilarity } from './open-item-card.js';
40
40
  import { formatWhen } from '../decisions/decision-card.js';
41
41
  /** Thrown for open-item requests the caller must fix (HTTP 4xx). */
@@ -188,6 +188,45 @@ export function isSameItem(a, b) {
188
188
  return true;
189
189
  return a.agent === b.agent && Math.abs(Date.parse(a.createdAt) - Date.parse(b.createdAt)) <= OPEN_ITEMS_CONSTANTS.DUPLICATE_WINDOW_MS;
190
190
  }
191
+ /** Whether the owner's message agrees ("可以", "同意", "ok", "go ahead", 👍) and does not hold back. */
192
+ export function isApproval(text) {
193
+ const t = text.replace(/<@[A-Z0-9]+>/g, ' ').trim().toLowerCase();
194
+ if (!t || t.length > 120)
195
+ return false;
196
+ if (/不(?:行|可以|同意|好|要|用|必)|别|先别|等等|再想想|\bno\b|don'?t|\bwait\b|\bhold\b|\bstop\b|不对/.test(t))
197
+ return false;
198
+ return /^(?:ok|okay|yes|yep|yeah|sure|go|go ahead|approved?|lgtm|agreed?|👍|✅|可以|好的?|行|同意|没问题|批准|确认|通过|发吧|做吧|开始吧?|就这样|按你说的)/u.test(t) || /(?:可以|同意|没问题|go ahead|approved?)[。!!.\s]*$/u.test(t);
199
+ }
200
+ /** Named people / tools a promise mentions (Nova, Vera, CDC…). */
201
+ function namesIn(s) {
202
+ return new Set((s.match(/\b[A-Z][A-Za-z]{2,}\b/g) ?? []).map((n) => n.toLowerCase()));
203
+ }
204
+ const DELIVERABLE_NOUNS = ['预览', 'preview', 'pdf', '报告', '结论', '文章', '稿', '名单', 'report', 'draft'];
205
+ /**
206
+ * Whether two commitments are the same promise: the same words, or — from the
207
+ * same agent within {@link OPEN_ITEMS_CONSTANTS.PROMISE_DUPLICATE_WINDOW_MS} —
208
+ * very similar words, or the same deliverable (same person named and the same
209
+ * kind of thing handed over).
210
+ *
211
+ * @param a - One item
212
+ * @param b - The other
213
+ * @returns True for one promise said twice
214
+ */
215
+ export function isSamePromise(a, b) {
216
+ if (a.type !== 'commitment' || b.type !== 'commitment')
217
+ return false;
218
+ if (isSameItem(a, b))
219
+ return true;
220
+ if (a.agent !== b.agent || Math.abs(Date.parse(a.createdAt) - Date.parse(b.createdAt)) > OPEN_ITEMS_CONSTANTS.PROMISE_DUPLICATE_WINDOW_MS)
221
+ return false;
222
+ if (questionSimilarity(a.text, b.text) >= OPEN_ITEMS_CONSTANTS.SAME_QUESTION_SIMILARITY)
223
+ return true;
224
+ const na = namesIn(a.text);
225
+ const shared = [...namesIn(b.text)].some((n) => na.has(n));
226
+ const la = a.text.toLowerCase();
227
+ const lb = b.text.toLowerCase();
228
+ return shared && DELIVERABLE_NOUNS.some((w) => la.includes(w) && lb.includes(w));
229
+ }
191
230
  /**
192
231
  * Clip for a one-line mention.
193
232
  *
@@ -311,6 +350,8 @@ export class OpenItemsService {
311
350
  * @returns The request it changed, or null
312
351
  */
313
352
  async onAgentMessage(message) {
353
+ if (message.senderType === 'user')
354
+ return this.onOwnerMessage(message);
314
355
  if (message.senderType !== 'agent' || !message.content?.trim())
315
356
  return null;
316
357
  // "Got it — on it" placeholders are not the reply.
@@ -337,8 +378,20 @@ export class OpenItemsService {
337
378
  }
338
379
  // The same words twice (a reply recorded both from the reply path and the
339
380
  // Slack mirror) are one item.
340
- const fresh = planned.filter((p) => !items.some((i) => isSameItem(i, p.item)));
381
+ // A post that delivers something restates it ("结论在下面:…"): the words are
382
+ // the delivery, not a new promise.
383
+ const restated = (p) => p.item.type === 'commitment' &&
384
+ delivered.some((d) => questionSimilarity(d.text, p.item.text) >= OPEN_ITEMS_CONSTANTS.SAME_QUESTION_SIMILARITY);
385
+ const fresh = planned.filter((p) => !items.some((i) => isSameItem(i, p.item)) && !restated(p));
341
386
  for (const p of fresh) {
387
+ // The same promise said again (a plan, then "收到,按刚才说的做"): the newest one stands.
388
+ for (let k = 0; k < items.length; k++) {
389
+ if (isSamePromise(items[k], p.item) && ACTIVE_OPEN_ITEM_STATUSES.has(items[k].status)) {
390
+ if (items[k].workItemId)
391
+ await this.closeFollowUp(items[k].workItemId, 'cancelled', `Superseded by a newer promise (${p.item.id})`);
392
+ items[k] = { ...items[k], status: 'superseded', closedAt: at.toISOString(), closedReason: `said again in message ${message.id}` };
393
+ }
394
+ }
342
395
  const item = await this.activate(request, p, pool);
343
396
  items.push(item);
344
397
  changed = true;
@@ -348,6 +401,52 @@ export class OpenItemsService {
348
401
  return this.save(request, items, fresh.length > 0);
349
402
  });
350
403
  }
404
+ /**
405
+ * The owner posted in a ticket's thread: a yes opens the conditional
406
+ * promises that wait on them.
407
+ *
408
+ * @param message - The owner's message
409
+ * @returns The request it changed, or null
410
+ */
411
+ async onOwnerMessage(message) {
412
+ if (!message.content?.trim() || !isApproval(message.content))
413
+ return null;
414
+ return this.serial(async () => {
415
+ const all = await this.deps.requests.listAll();
416
+ const request = all.find((r) => r.status !== 'cancelled' && inRequestThread(r, message) && (r.openItems ?? []).some((i) => i.status === 'waiting_owner'));
417
+ if (!request)
418
+ return null;
419
+ const at = new Date(message.createdAt ?? this.now().getTime());
420
+ return this.openWaiting(request, at, `the owner said yes in the thread (message ${message.id})`, () => true);
421
+ });
422
+ }
423
+ /**
424
+ * Open waiting promises: their due time is counted from `at`, and the
425
+ * follow-up WorkItem is created now.
426
+ *
427
+ * @param request - Request
428
+ * @param at - When the owner agreed
429
+ * @param why - For the log
430
+ * @param pick - Which waiting items
431
+ * @returns The updated request, or null when none matched
432
+ */
433
+ async openWaiting(request, at, why, pick) {
434
+ const pool = await this.deps.listWorkItems().catch(() => []);
435
+ const items = [];
436
+ let changed = false;
437
+ for (const i of request.openItems ?? []) {
438
+ if (i.status !== 'waiting_owner' || !pick(i)) {
439
+ items.push(i);
440
+ continue;
441
+ }
442
+ const { due, source } = parseDue(i.text, at);
443
+ const opened = await this.activate(request, { item: { ...i, status: 'open', due: due.toISOString(), dueSource: source } }, pool);
444
+ this.logger.info('Conditional promise opened', { tkt: ticketLabel(request), item: i.id, due: opened.due, why });
445
+ items.push(opened);
446
+ changed = true;
447
+ }
448
+ return changed ? this.save(request, items, false) : null;
449
+ }
351
450
  /**
352
451
  * What a message would add, without side effects (also the backfill's view).
353
452
  *
@@ -372,9 +471,15 @@ export class OpenItemsService {
372
471
  status: 'open',
373
472
  });
374
473
  const out = [];
375
- found.commitments.forEach((c, i) => {
474
+ for (const [i, c] of found.commitments.entries()) {
475
+ if (c.waitsOnOwner) {
476
+ // Conditional on the owner: no due time, no follow-up, no nudges until they say yes.
477
+ const gate = await this.recentDecision(message.senderId, at);
478
+ out.push({ item: { ...base('commitment', i + 1), type: 'commitment', text: c.text, status: 'waiting_owner', ...(gate ? { gateDecisionId: gate.id } : {}) } });
479
+ continue;
480
+ }
376
481
  out.push({ item: { ...base('commitment', i + 1), type: 'commitment', text: c.text, due: c.due.toISOString(), dueSource: c.dueSource } });
377
- });
482
+ }
378
483
  let qi = 0;
379
484
  for (const q of found.questions) {
380
485
  qi += 1;
@@ -389,6 +494,20 @@ export class OpenItemsService {
389
494
  }
390
495
  return out;
391
496
  }
497
+ /**
498
+ * The newest ask-owner decision this agent made shortly before `at` (the card a conditional promise waits on).
499
+ *
500
+ * @param agent - Agent
501
+ * @param at - When the promise was made
502
+ * @returns The decision, or null
503
+ */
504
+ async recentDecision(agent, at) {
505
+ if (!this.deps.recentDecisionsBy)
506
+ return null;
507
+ const win = OPEN_ITEMS_CONSTANTS.ASK_OWNER_DEDUPE_WINDOW_MS;
508
+ const recent = await this.deps.recentDecisionsBy(agent, at.getTime() - win).catch(() => []);
509
+ return recent.filter((d) => d.kind !== 'reply_question' && Date.parse(d.createdAt) <= at.getTime() + 60_000).sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt))[0] ?? null;
510
+ }
392
511
  /**
393
512
  * The ask-owner decision the agent already made for this question, if any.
394
513
  *
@@ -422,6 +541,10 @@ export class OpenItemsService {
422
541
  this.logger.info('Question the owner already skipped — not asked again', { tkt: ticketLabel(request), decisionId: p.skippedDecisionId });
423
542
  return { ...item, status: 'skipped', decisionId: p.skippedDecisionId, closedAt: this.now().toISOString(), closedReason: `owner skipped this before (${p.skippedDecisionId})` };
424
543
  }
544
+ if (item.type === 'commitment' && item.status === 'waiting_owner') {
545
+ this.logger.info('Conditional promise — waiting on the owner', { tkt: ticketLabel(request), item: item.id, agent: item.agent, gate: item.gateDecisionId });
546
+ return item;
547
+ }
425
548
  if (item.type === 'commitment') {
426
549
  const children = childWorkFor(request, item, pool);
427
550
  if (children.length > 0)
@@ -467,7 +590,7 @@ export class OpenItemsService {
467
590
  deliveries(items, message, at, pool) {
468
591
  const out = [];
469
592
  for (const item of items) {
470
- if (item.type !== 'commitment' || !ACTIVE_OPEN_ITEM_STATUSES.has(item.status))
593
+ if (item.type !== 'commitment' || !ACTIVE_OPEN_ITEM_STATUSES.has(item.status) || item.status === 'waiting_owner')
471
594
  continue;
472
595
  if (!this.deliveredBy(item, { ...message, createdAt: at.getTime() }, pool))
473
596
  continue;
@@ -503,25 +626,68 @@ export class OpenItemsService {
503
626
  const state = childrenState(children, pool);
504
627
  if (!state.ready)
505
628
  return false;
506
- // Posted after the work was finished.
507
- return !state.finishedAt || at >= Date.parse(state.finishedAt);
629
+ // Posted after the work was finished. A verify pass can stamp the child's
630
+ // completedAt after the agent has posted, so allow a grace before it.
631
+ const postedBefore = state.finishedAt ? Date.parse(state.finishedAt) - at : 0;
632
+ if (postedBefore > OPEN_ITEMS_CONSTANTS.DELIVERY_FINISH_GRACE_MS)
633
+ return false;
634
+ // A post that makes a new promise is not the delivery.
635
+ return postedBefore <= 0 || !this.promisesAnew(item, message, at);
508
636
  }
509
637
  if (message.senderId !== item.agent)
510
638
  return false;
511
639
  if (at - Date.parse(item.createdAt) < OPEN_ITEMS_CONSTANTS.MIN_DELIVERY_GAP_MS)
512
640
  return false;
513
- return extractOpenItems(message.content, { now: new Date(at) }).commitments.length === 0;
641
+ return !this.promisesAnew(item, message, at);
642
+ }
643
+ /**
644
+ * Whether a post makes a NEW promise: restating the one it delivers does not count.
645
+ *
646
+ * @param item - The commitment being delivered
647
+ * @param message - The post
648
+ * @param at - Its time (epoch ms)
649
+ * @returns True when it promises something else
650
+ */
651
+ promisesAnew(item, message, at) {
652
+ return extractOpenItems(message.content, { now: new Date(at) }).commitments.some((c) => questionSimilarity(c.text, item.text) < OPEN_ITEMS_CONSTANTS.SAME_QUESTION_SIMILARITY);
653
+ }
654
+ /**
655
+ * The agent that owns a follow-up WorkItem closes it as already delivered:
656
+ * the open item is closed and the WorkItem finished (no done_by_worker step).
657
+ *
658
+ * @param workItemId - The follow-up WorkItem
659
+ * @param agent - The session closing it (must be the promising agent)
660
+ * @param summary - What the agent says (where it was delivered)
661
+ * @returns True when an active item of that agent was closed
662
+ */
663
+ async closeByAgent(workItemId, agent, summary) {
664
+ return this.serial(async () => {
665
+ const all = await this.deps.requests.listAll();
666
+ const request = all.find((r) => (r.openItems ?? []).some((i) => i.workItemId === workItemId));
667
+ if (!request)
668
+ return false;
669
+ const target = (request.openItems ?? []).find((i) => i.workItemId === workItemId);
670
+ if (!target || target.agent !== agent || !ACTIVE_OPEN_ITEM_STATUSES.has(target.status))
671
+ return false;
672
+ const at = this.now().toISOString();
673
+ const items = (request.openItems ?? []).map((i) => i.id === target.id ? { ...i, status: 'delivered', closedAt: at, closedReason: `closed by ${agent}: ${short(summary, 200)}` } : i);
674
+ await this.deps.closeFollowUp?.(workItemId, 'delivered', `Closed by ${agent}`);
675
+ await this.save(request, items, false);
676
+ return true;
677
+ });
514
678
  }
515
679
  /**
516
680
  * Take planned items onto a request (the backfill's apply step).
517
681
  *
518
682
  * @param requestId - Request
519
683
  * @param planned - Items from {@link plan}
520
- * @param opts - `source: 'backfill'` marks the cards it posts as backfilled
684
+ * @param opts - `source: 'backfill'` marks the cards it posts as backfilled; `caller` is
685
+ * the session of whoever asked for it (logged: who ran an apply)
521
686
  * @returns Updated request, or null when it is gone
522
687
  */
523
688
  async adopt(requestId, planned, opts = {}) {
524
689
  return this.serial(async () => {
690
+ this.logger.info('Open items adopted (backfill apply)', { requestId, count: planned.length, caller: opts.caller ?? 'unknown', source: opts.source ?? 'live' });
525
691
  const request = await this.deps.requests.getById(requestId);
526
692
  if (!request)
527
693
  return null;
@@ -779,6 +945,34 @@ export class OpenItemsService {
779
945
  counts.closed += 1;
780
946
  return { ...item, status, closedAt: nowIso, closedReason: `${d.id} ${d.status}`, ...(answer ? { answer } : {}) };
781
947
  }
948
+ if (item.status === 'waiting_owner') {
949
+ // No due time, no nudges. A card answer opens it; a declined card closes it.
950
+ if (!item.gateDecisionId || !this.deps.getDecision)
951
+ return item;
952
+ const d = await this.deps.getDecision(item.gateDecisionId).catch(() => null);
953
+ if (!d || d.status === 'open' || d.status === 'parked')
954
+ return item;
955
+ if (d.status === 'cancelled' || d.status === 'expired' || (d.chosenKey && d.yesKey && d.chosenKey !== d.yesKey)) {
956
+ counts.closed += 1;
957
+ return { ...item, status: 'superseded', closedAt: nowIso, closedReason: `${d.id} ${d.status}: the owner did not agree` };
958
+ }
959
+ const at = d.resolvedAt ? new Date(d.resolvedAt) : now;
960
+ const { due, source } = parseDue(item.text, at);
961
+ return this.activate(request, { item: { ...item, status: 'open', due: due.toISOString(), dueSource: source } }, pool);
962
+ }
963
+ // Commitment whose follow-up WorkItem was finished or cancelled (by anyone,
964
+ // through the task API): the item is closed with it, so it cannot nudge or be re-armed.
965
+ const followUp = item.workItemId ? pool.find((w) => w.id === item.workItemId) : undefined;
966
+ if (followUp && ['done', 'verified', 'cancelled'].includes(followUp.status)) {
967
+ counts.closed += 1;
968
+ const delivered = followUp.status !== 'cancelled';
969
+ return {
970
+ ...item,
971
+ status: delivered ? 'delivered' : 'cancelled',
972
+ closedAt: nowIso,
973
+ closedReason: `follow-up ${followUp.id.slice(0, 8)} is ${followUp.status}`,
974
+ };
975
+ }
782
976
  // Commitment: link child work started after the promise.
783
977
  let current = item;
784
978
  const children = childWorkFor(request, item, pool);