crewly 1.20.183 → 1.20.185

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 (260) hide show
  1. package/config/constants.ts +83 -0
  2. package/config/index.ts +2 -0
  3. package/config/oss-boundary-allowlist.json +10 -0
  4. package/config/skills/agent/core/ask-owner/SKILL.md +5 -2
  5. package/config/skills/agent/core/complete-task/execute.sh +4 -12
  6. package/config/skills/agent/core/complete-task/execute.test.sh +11 -0
  7. package/config/skills/agent/core/report-status/SKILL.md +1 -1
  8. package/config/skills/agent/core/report-status/execute.sh +5 -10
  9. package/dist/backend/backend/src/constants.d.ts +84 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +79 -1
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +11 -1
  14. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +38 -0
  16. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/google/google.controller.js +3 -2
  19. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts +34 -0
  21. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -0
  22. package/dist/backend/backend/src/controllers/request/open-items.controller.js +96 -0
  23. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -0
  24. package/dist/backend/backend/src/controllers/request/request.routes.d.ts +3 -0
  25. package/dist/backend/backend/src/controllers/request/request.routes.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/request/request.routes.js +9 -0
  27. package/dist/backend/backend/src/controllers/request/request.routes.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +5 -2
  29. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/standing/standing.controller.js +3 -1
  31. package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -1
  32. package/dist/backend/backend/src/index.d.ts.map +1 -1
  33. package/dist/backend/backend/src/index.js +72 -2
  34. package/dist/backend/backend/src/index.js.map +1 -1
  35. package/dist/backend/backend/src/scripts/check-oss-boundary.d.ts +217 -0
  36. package/dist/backend/backend/src/scripts/check-oss-boundary.d.ts.map +1 -0
  37. package/dist/backend/backend/src/scripts/check-oss-boundary.js +490 -0
  38. package/dist/backend/backend/src/scripts/check-oss-boundary.js.map +1 -0
  39. package/dist/backend/backend/src/scripts/open-items-backfill.d.ts +16 -0
  40. package/dist/backend/backend/src/scripts/open-items-backfill.d.ts.map +1 -0
  41. package/dist/backend/backend/src/scripts/open-items-backfill.js +112 -0
  42. package/dist/backend/backend/src/scripts/open-items-backfill.js.map +1 -0
  43. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/agent/agent-registration.service.js +4 -2
  45. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +3 -1
  47. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js +15 -4
  49. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +11 -0
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  55. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
  57. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  58. package/dist/backend/backend/src/services/decisions/decision-card.d.ts +31 -4
  59. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/decisions/decision-card.js +60 -2
  61. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
  62. package/dist/backend/backend/src/services/decisions/decision-skip-command.d.ts +56 -0
  63. package/dist/backend/backend/src/services/decisions/decision-skip-command.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/decisions/decision-skip-command.js +108 -0
  65. package/dist/backend/backend/src/services/decisions/decision-skip-command.js.map +1 -0
  66. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +113 -3
  67. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/decisions/decision.service.js +199 -13
  69. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +8 -0
  71. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/decisions/decision.wiring.js +25 -0
  73. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  74. package/dist/backend/backend/src/services/memory/agent-memory.service.d.ts +19 -0
  75. package/dist/backend/backend/src/services/memory/agent-memory.service.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/memory/agent-memory.service.js +48 -0
  77. package/dist/backend/backend/src/services/memory/agent-memory.service.js.map +1 -1
  78. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/memory/memory.service.js +20 -0
  80. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +40 -0
  82. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/memory/project-memory.service.js +101 -0
  84. package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/memory/role-knowledge-eligibility.d.ts +1 -1
  86. package/dist/backend/backend/src/services/memory/role-knowledge-eligibility.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/memory/role-knowledge-eligibility.js.map +1 -1
  88. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +61 -1
  89. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/memory/standing-answers.service.js +71 -3
  91. package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -1
  92. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts +7 -4
  93. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/memory/standing-refresh.service.js +18 -9
  95. package/dist/backend/backend/src/services/memory/standing-refresh.service.js.map +1 -1
  96. package/dist/backend/backend/src/services/memory/task-log-filter.d.ts +27 -0
  97. package/dist/backend/backend/src/services/memory/task-log-filter.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/memory/task-log-filter.js +56 -0
  99. package/dist/backend/backend/src/services/memory/task-log-filter.js.map +1 -0
  100. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts +66 -0
  101. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/open-items/open-item-card.js +208 -0
  103. package/dist/backend/backend/src/services/open-items/open-item-card.js.map +1 -0
  104. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
  105. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/open-items/open-item-extractor.js +394 -0
  107. package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -0
  108. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +95 -0
  109. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/open-items/open-items-backfill.js +203 -0
  111. package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -0
  112. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +367 -0
  113. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/open-items/open-items.service.js +880 -0
  115. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -0
  116. package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts +44 -0
  117. package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/open-items/open-items.wiring.js +185 -0
  119. package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -0
  120. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +4 -0
  122. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  123. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  124. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  125. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +34 -11
  126. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  127. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  128. package/dist/backend/backend/src/services/v3/request.service.js +15 -1
  129. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  130. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/v3/ticket-review.service.js +5 -1
  132. package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
  133. package/dist/backend/backend/src/services/wiki/wiki-process.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/wiki/wiki-process.service.js +4 -2
  135. package/dist/backend/backend/src/services/wiki/wiki-process.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts +103 -1
  137. package/dist/backend/backend/src/services/wiki/wiki-queue.service.d.ts.map +1 -1
  138. package/dist/backend/backend/src/services/wiki/wiki-queue.service.js +171 -20
  139. package/dist/backend/backend/src/services/wiki/wiki-queue.service.js.map +1 -1
  140. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +60 -0
  141. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
  142. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +121 -7
  143. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
  144. package/dist/backend/backend/src/types/decision.types.d.ts +33 -4
  145. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  146. package/dist/backend/backend/src/types/v2/index.d.ts +2 -0
  147. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  148. package/dist/backend/backend/src/types/v2/index.js +1 -0
  149. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  150. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +76 -0
  151. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -0
  152. package/dist/backend/backend/src/types/v2/open-item.types.js +14 -0
  153. package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -0
  154. package/dist/backend/backend/src/types/v2/request.types.d.ts +22 -1
  155. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  156. package/dist/backend/backend/src/types/v2/request.types.js +10 -5
  157. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  158. package/dist/backend/build-info.json +2 -2
  159. package/dist/backend/config/constants.d.ts +73 -0
  160. package/dist/backend/config/constants.d.ts.map +1 -1
  161. package/dist/backend/config/constants.js +80 -0
  162. package/dist/backend/config/constants.js.map +1 -1
  163. package/dist/backend/config/index.d.ts +10 -2
  164. package/dist/backend/config/index.d.ts.map +1 -1
  165. package/dist/backend/config/index.js +2 -2
  166. package/dist/backend/config/index.js.map +1 -1
  167. package/dist/cli/backend/src/constants.d.ts +84 -0
  168. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  169. package/dist/cli/backend/src/constants.js +79 -1
  170. package/dist/cli/backend/src/constants.js.map +1 -1
  171. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  172. package/dist/cli/backend/src/services/agent/agent-registration.service.js +4 -2
  173. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  174. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +3 -1
  175. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -1
  176. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js +15 -4
  177. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -1
  178. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
  179. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  180. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +11 -0
  181. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  182. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  183. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  184. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
  185. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  186. package/dist/cli/backend/src/services/decisions/decision-card.d.ts +31 -4
  187. package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  188. package/dist/cli/backend/src/services/decisions/decision-card.js +60 -2
  189. package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
  190. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +113 -3
  191. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  192. package/dist/cli/backend/src/services/decisions/decision.service.js +199 -13
  193. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  194. package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts +19 -0
  195. package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts.map +1 -1
  196. package/dist/cli/backend/src/services/memory/agent-memory.service.js +48 -0
  197. package/dist/cli/backend/src/services/memory/agent-memory.service.js.map +1 -1
  198. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  199. package/dist/cli/backend/src/services/memory/memory.service.js +20 -0
  200. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  201. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +40 -0
  202. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  203. package/dist/cli/backend/src/services/memory/project-memory.service.js +101 -0
  204. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
  205. package/dist/cli/backend/src/services/memory/role-knowledge-eligibility.d.ts +1 -1
  206. package/dist/cli/backend/src/services/memory/role-knowledge-eligibility.d.ts.map +1 -1
  207. package/dist/cli/backend/src/services/memory/role-knowledge-eligibility.js.map +1 -1
  208. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +61 -1
  209. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  210. package/dist/cli/backend/src/services/memory/standing-answers.service.js +71 -3
  211. package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -1
  212. package/dist/cli/backend/src/services/memory/task-log-filter.d.ts +27 -0
  213. package/dist/cli/backend/src/services/memory/task-log-filter.d.ts.map +1 -0
  214. package/dist/cli/backend/src/services/memory/task-log-filter.js +56 -0
  215. package/dist/cli/backend/src/services/memory/task-log-filter.js.map +1 -0
  216. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts +66 -0
  217. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
  218. package/dist/cli/backend/src/services/open-items/open-item-card.js +208 -0
  219. package/dist/cli/backend/src/services/open-items/open-item-card.js.map +1 -0
  220. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
  221. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
  222. package/dist/cli/backend/src/services/open-items/open-item-extractor.js +394 -0
  223. package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -0
  224. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  225. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  226. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +34 -11
  227. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  228. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  229. package/dist/cli/backend/src/services/v3/request.service.js +15 -1
  230. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  231. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  232. package/dist/cli/backend/src/services/v3/ticket-review.service.js +5 -1
  233. package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
  234. package/dist/cli/backend/src/types/decision.types.d.ts +33 -4
  235. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  236. package/dist/cli/backend/src/types/v2/index.d.ts +2 -0
  237. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  238. package/dist/cli/backend/src/types/v2/index.js +1 -0
  239. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  240. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +76 -0
  241. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -0
  242. package/dist/cli/backend/src/types/v2/open-item.types.js +14 -0
  243. package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -0
  244. package/dist/cli/backend/src/types/v2/request.types.d.ts +22 -1
  245. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  246. package/dist/cli/backend/src/types/v2/request.types.js +10 -5
  247. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  248. package/dist/cli/config/constants.d.ts +73 -0
  249. package/dist/cli/config/constants.d.ts.map +1 -1
  250. package/dist/cli/config/constants.js +80 -0
  251. package/dist/cli/config/constants.js.map +1 -1
  252. package/dist/cli/config/index.d.ts +10 -2
  253. package/dist/cli/config/index.d.ts.map +1 -1
  254. package/dist/cli/config/index.js +2 -2
  255. package/dist/cli/config/index.js.map +1 -1
  256. package/frontend/dist/assets/{index-9c91de50.js → index-1ee8a9a2.js} +273 -273
  257. package/frontend/dist/assets/index-a79c7852.css +42 -0
  258. package/frontend/dist/index.html +2 -2
  259. package/package.json +2 -1
  260. package/frontend/dist/assets/index-04d192f8.css +0 -42
@@ -0,0 +1,203 @@
1
+ /**
2
+ * One-off backfill: scan tickets of the last 7 days for commitments and
3
+ * questions their agents left open before open-item tracking existed
4
+ * (specs/2026-10-01-reply-open-items.md §6). Dry-run by default: it reports
5
+ * what it WOULD create and changes nothing.
6
+ *
7
+ * An item already settled by the conversation is skipped:
8
+ * - a commitment the agent (or the child's agent) delivered later in the
9
+ * thread, by the live delivery rule;
10
+ * - a question the owner replied to later in the thread;
11
+ * - a question whose topic an agent later reported as settled in the thread
12
+ * ("done", "logged in", 「登上了」, 「搞定」…);
13
+ * - a harness-flow question (a login / re-login prompt, e.g. crewly-orc's
14
+ * 「Claude Code 的登录链接已经发过去了,你那边登上了吗?」): the harness
15
+ * tracks those itself, they are never the owner's decision;
16
+ * - a question the owner already skipped in that request.
17
+ *
18
+ * The cards it posts are marked `source: 'backfill'`, so the owner can clear
19
+ * them all at once (`POST /api/decisions/skip-all { source: 'backfill' }`).
20
+ *
21
+ * @module services/open-items/open-items-backfill
22
+ */
23
+ import { OPEN_ITEMS_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
24
+ import { formatTicketNumber } from '../../types/v2/ticket.types.js';
25
+ import { childrenState, childWorkFor, isSameItem } from './open-items.service.js';
26
+ /** A login / re-login / sign-in prompt (harness flow, not an owner decision). */
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
+ /** A runtime / harness the agent might ask the owner to sign in to. */
29
+ const HARNESS_RE = /\b(?:claude(?: code)?|codex|gemini|antigravity|agy|crewly|cloud)\b/i;
30
+ /** An agent saying the thing is settled. */
31
+ const SETTLED_RE = /\b(?:done|finished|completed|resolved|fixed|sorted|all set|logged in|signed in|is back|works now|working now|no longer needed)\b|已完成|完成了|做完了|搞定|弄好了|做好了|已经好了|已解决|解决了|修好了|已修复|已登录|登录成功|登上了|已经登上|登好了|恢复了|不需要了|处理好了/i;
32
+ /**
33
+ * Whether a question is part of a harness flow (a login prompt): from the
34
+ * orc, or naming a runtime, and about logging in.
35
+ *
36
+ * @param agent - Asking agent
37
+ * @param text - The question
38
+ * @returns True to skip it
39
+ */
40
+ export function isHarnessFlowQuestion(agent, text) {
41
+ if (!LOGIN_RE.test(text))
42
+ return false;
43
+ return agent === ORCHESTRATOR_SESSION_NAME || HARNESS_RE.test(text);
44
+ }
45
+ /**
46
+ * Whether an agent message reports that something is settled.
47
+ *
48
+ * @param content - Message text
49
+ * @returns True for "done" / "logged in" / 「搞定」…
50
+ */
51
+ export function reportsSettled(content) {
52
+ return SETTLED_RE.test(content);
53
+ }
54
+ /**
55
+ * Run the backfill.
56
+ *
57
+ * @param deps - Readers and the service
58
+ * @param opts - `apply: true` to make the changes (default: dry-run)
59
+ * @returns What it found (and, when applied, did)
60
+ */
61
+ export async function backfillOpenItems(deps, opts = {}) {
62
+ const apply = opts.apply === true;
63
+ const now = (deps.now ?? (() => new Date()))();
64
+ const since = now.getTime() - OPEN_ITEMS_CONSTANTS.LOOKBACK_MS;
65
+ 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);
67
+ const pool = await deps.listWorkItems();
68
+ const report = { dryRun: !apply, scanned: requests.length, rows: [], reopened: [] };
69
+ for (const request of requests) {
70
+ const ref = request.chatRef;
71
+ const thread = (await deps.listThread(ref.channelId, ref.threadRootId)).sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0));
72
+ const ticket = formatTicketNumber(request.ticketNumber);
73
+ const keep = [];
74
+ for (const message of thread) {
75
+ if (message.senderType !== 'agent' || Date.parse(new Date(message.createdAt ?? 0).toISOString()) < since)
76
+ continue;
77
+ if ((request.openItems ?? []).some((i) => i.sourceMessageId === message.id))
78
+ continue;
79
+ // One ticket per message, as the live path decides it.
80
+ if (deps.service.findRequestFor(message, allRequests)?.id !== request.id)
81
+ continue;
82
+ const at = new Date(message.createdAt ?? now.getTime());
83
+ const planned = await deps.service.plan(request, message, at);
84
+ const later = thread.filter((m) => (m.createdAt ?? 0) > (message.createdAt ?? 0));
85
+ for (const p of planned) {
86
+ if (keep.some((k) => isSameItem(k.item, p.item)))
87
+ continue;
88
+ const row = {
89
+ requestId: request.id,
90
+ ticket,
91
+ requestStatus: request.status,
92
+ agent: p.item.agent,
93
+ type: p.item.type,
94
+ text: p.item.text,
95
+ at: p.item.createdAt,
96
+ action: '',
97
+ };
98
+ if (p.item.type === 'commitment') {
99
+ const children = childWorkFor(request, p.item, pool);
100
+ const byId = new Map(pool.map((w) => [w.id, w]));
101
+ row.due = p.item.due;
102
+ row.children = children.map((id) => `${id.slice(0, 8)}: ${byId.get(id)?.status ?? '?'}`);
103
+ const item = { ...p.item, ...(children.length ? { childWorkItemIds: children } : {}) };
104
+ const delivery = later.find((m) => m.senderType === 'agent' && deps.service.deliveredBy(item, m, pool));
105
+ if (delivery) {
106
+ row.skipped = `delivered by ${delivery.senderId} at ${new Date(delivery.createdAt ?? 0).toISOString()}`;
107
+ row.action = 'none';
108
+ report.rows.push(row);
109
+ continue;
110
+ }
111
+ const state = childrenState(children, pool);
112
+ const overdue = p.item.due ? Date.parse(p.item.due) <= now.getTime() : false;
113
+ const parts = ['create follow-up WorkItem for ' + p.item.agent];
114
+ if (state.ready)
115
+ parts.push(`wake ${p.item.agent} now — the work is ready (finished ${state.finishedAt ?? '?'})`);
116
+ else if (state.pending.length)
117
+ parts.push(`wait for ${state.pending.map((w) => `${w.id.slice(0, 8)} (${w.status})`).join(', ')}`);
118
+ if (overdue)
119
+ parts.push('already past due → nudge on the next sweep');
120
+ row.action = parts.join('; ');
121
+ }
122
+ else {
123
+ const ownerReply = later.find((m) => m.senderType === 'user');
124
+ if (ownerReply) {
125
+ row.skipped = `owner replied at ${new Date(ownerReply.createdAt ?? 0).toISOString()}`;
126
+ row.action = 'none';
127
+ report.rows.push(row);
128
+ continue;
129
+ }
130
+ if (isHarnessFlowQuestion(p.item.agent, p.item.text)) {
131
+ row.skipped = 'harness flow (a login prompt), not an owner decision';
132
+ row.action = 'none';
133
+ report.rows.push(row);
134
+ continue;
135
+ }
136
+ const settled = later.find((m) => m.senderType === 'agent' && reportsSettled(m.content));
137
+ if (settled) {
138
+ row.skipped = `resolved later in the thread (${settled.senderId} at ${new Date(settled.createdAt ?? 0).toISOString()})`;
139
+ row.action = 'none';
140
+ report.rows.push(row);
141
+ continue;
142
+ }
143
+ if (p.skippedDecisionId) {
144
+ row.skipped = `the owner skipped this question before (${p.skippedDecisionId})`;
145
+ row.action = 'none';
146
+ report.rows.push(row);
147
+ continue;
148
+ }
149
+ if (p.linkedDecisionId) {
150
+ row.action = `link to existing ask-owner card ${p.linkedDecisionId} (no new card)`;
151
+ }
152
+ else if (p.card) {
153
+ const opts = p.card.options.map((o) => `${o.label}${o.detail ? ` (${o.detail})` : ''}`).join(' / ');
154
+ const def = p.card.options.find((o) => o.key === p.card.defaultKey)?.label ?? p.card.defaultKey;
155
+ row.action = `post decision card as ${p.item.agent} in the ticket thread: ${opts}; default ${def}; deadline tomorrow 12:00${p.card.sensitive ? `; sensitive ${p.card.sensitive}` : ''}`;
156
+ }
157
+ }
158
+ keep.push(p);
159
+ report.rows.push(row);
160
+ }
161
+ }
162
+ if (keep.length === 0)
163
+ continue;
164
+ if (request.status === 'done')
165
+ report.reopened.push(`${ticket} (${request.id.slice(0, 8)})`);
166
+ if (apply)
167
+ await deps.service.adopt(request.id, keep, { source: 'backfill' });
168
+ }
169
+ return report;
170
+ }
171
+ /**
172
+ * Plain-text rendering of a report (the script's output).
173
+ *
174
+ * @param report - Report
175
+ * @returns Text
176
+ */
177
+ export function formatBackfillReport(report) {
178
+ const lines = [];
179
+ lines.push(`${report.dryRun ? 'DRY RUN — nothing changed' : 'APPLIED'}. Tickets scanned (last 7 days): ${report.scanned}.`);
180
+ const live = report.rows.filter((r) => !r.skipped);
181
+ const skipped = report.rows.filter((r) => r.skipped);
182
+ 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}.`);
183
+ if (report.reopened.length)
184
+ lines.push(`Closed tickets that would move to awaiting_followup: ${report.reopened.join(', ')}`);
185
+ for (const r of live) {
186
+ lines.push('');
187
+ lines.push(`${r.ticket} [${r.requestStatus}] ${r.type.toUpperCase()} by ${r.agent} at ${r.at}`);
188
+ lines.push(` "${r.text}"`);
189
+ if (r.due)
190
+ lines.push(` due: ${r.due}`);
191
+ if (r.children?.length)
192
+ lines.push(` child work: ${r.children.join(', ')}`);
193
+ lines.push(` → ${r.action}`);
194
+ }
195
+ if (skipped.length) {
196
+ lines.push('');
197
+ lines.push('Skipped (already settled in the thread):');
198
+ for (const r of skipped)
199
+ lines.push(` ${r.ticket} ${r.type} by ${r.agent}: "${r.text.slice(0, 80)}" — ${r.skipped}`);
200
+ }
201
+ return lines.join('\n');
202
+ }
203
+ //# sourceMappingURL=open-items-backfill.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Open items — Crewly tracks what agents promise and ask the owner in their
3
+ * replies, so nothing is silently dropped (specs/2026-10-01-reply-open-items.md).
4
+ *
5
+ * Incident (TKT-185, 2026-10-01): in #book-publish Atlas told the owner "Kai is
6
+ * going through the four episodes… 明天中午给我,我核过以后挑最有用的几条发你"
7
+ * and asked "第 13 章「互评当体检用」这个读法,你同意吗?". The ticket was already
8
+ * closed. Kai finished at 18:14 and Atlas verified it, but nobody delivered
9
+ * it and Atlas went idle; the question was never tracked.
10
+ *
11
+ * Now, for every agent message in a ticket's conversation:
12
+ *
13
+ * - **Extract** commitments and owner questions (rules, {@link extractOpenItems}).
14
+ * - **Hold the ticket open**: items live on `Request.openItems`; while one is
15
+ * active the ticket is `awaiting_followup` (RequestService gates `done`).
16
+ * - **Commitments**: a follow-up WorkItem for the agent, due at the parsed
17
+ * time; the delegated child work is linked; when that work is finished
18
+ * before the agent delivers, the agent is woken at once ("the work you
19
+ * promised the owner is ready — deliver it now"); past the due time the
20
+ * agent is nudged once, then the owner is told in the thread what is late
21
+ * and why; the agent's next post in the thread once the work is ready
22
+ * marks it delivered.
23
+ * - **Questions**: a decision card in the same thread, asked as the agent,
24
+ * with options and a default derived from its words ({@link deriveQuestionCard});
25
+ * answers reach the agent through the decision flow. No second card when
26
+ * the agent already asked the same thing with ask-owner.
27
+ *
28
+ * Collaborators are injected ({@link OpenItemsDeps}); `open-items.wiring.ts`
29
+ * connects the real ones.
30
+ *
31
+ * @module services/open-items/open-items.service
32
+ */
33
+ import { type ComponentLogger } from '../core/logger.service.js';
34
+ import type { Request } from '../../types/v2/request.types.js';
35
+ import type { WorkItem } from '../../types/v2/work-item.types.js';
36
+ import { type RequestOpenItem } from '../../types/v2/open-item.types.js';
37
+ import type { DecisionSource, OwnerDecision } from '../../types/decision.types.js';
38
+ import { type DerivedQuestionCard } from './open-item-card.js';
39
+ /** The chat-v2 message fields the service reads. */
40
+ export interface OpenItemsChatMessage {
41
+ id: string;
42
+ channelId: string;
43
+ senderType: string;
44
+ senderId: string;
45
+ content: string;
46
+ threadId?: string;
47
+ /** Epoch ms (defaults to now) */
48
+ createdAt?: number;
49
+ metadata?: Record<string, unknown>;
50
+ }
51
+ /** Where a request's conversation lives in Slack, when it does. */
52
+ export interface OpenItemsSlackPlace {
53
+ slackChannelId: string;
54
+ threadTs: string;
55
+ }
56
+ /** Input to create a commitment's follow-up WorkItem. */
57
+ export interface FollowUpInput {
58
+ request: Request;
59
+ item: RequestOpenItem;
60
+ /** Slack thread of the conversation, when it has one */
61
+ place: OpenItemsSlackPlace | null;
62
+ }
63
+ /** Input to card a question. */
64
+ export interface QuestionCardInput {
65
+ request: Request;
66
+ item: RequestOpenItem;
67
+ card: DerivedQuestionCard;
68
+ place: OpenItemsSlackPlace | null;
69
+ /** `backfill` when the backfill cards an old reply */
70
+ source?: DecisionSource;
71
+ }
72
+ /** Collaborators. */
73
+ export interface OpenItemsDeps {
74
+ requests: {
75
+ getById(id: string): Promise<Request | null>;
76
+ listAll(): Promise<Request[]>;
77
+ update(id: string, updates: Parameters<import('../v3/request.service.js').RequestService['update']>[1]): Promise<Request>;
78
+ };
79
+ /** Every WorkItem in the pool */
80
+ listWorkItems: () => Promise<WorkItem[]>;
81
+ /** Queue the follow-up WorkItem (held until delivered); returns its id */
82
+ createFollowUp?: (input: FollowUpInput) => Promise<string | null>;
83
+ /** Close the follow-up WorkItem: `delivered` → done, else cancelled */
84
+ closeFollowUp?: (workItemId: string, outcome: 'delivered' | 'cancelled', reason: string) => Promise<void>;
85
+ /** Decisions the agent asked recently (for the ask-owner dedupe) */
86
+ recentDecisionsBy?: (agent: string, sinceMs: number) => Promise<OwnerDecision[]>;
87
+ /** Post a card for a question; returns the decision */
88
+ askQuestion?: (input: QuestionCardInput) => Promise<OwnerDecision | null>;
89
+ /** Withdraw a question's card (the ticket was cancelled) */
90
+ cancelQuestion?: (decisionId: string, note: string) => Promise<void>;
91
+ /** A question the owner skipped in this request (not asked again for 30 days) */
92
+ skippedQuestion?: (requestId: string, agent: string, question: string) => Promise<OwnerDecision | null>;
93
+ /** Skip a question's card (the owner skipped the open item); false when it was not pending */
94
+ skipQuestion?: (decisionId: string) => Promise<boolean>;
95
+ /** A decision by id (sweep catches answers a missed handler call left behind) */
96
+ getDecision?: (decisionId: string) => Promise<OwnerDecision | null>;
97
+ /** Deliver a note to an agent, waking it; false when it could not */
98
+ deliverToAgent: (session: string, text: string) => Promise<boolean>;
99
+ /** Post a note for the owner in the request's conversation */
100
+ postOwnerNote: (request: Request, text: string) => Promise<boolean>;
101
+ /** Display name of an agent ("Atlas") */
102
+ displayName?: (session: string) => Promise<string>;
103
+ /** Names of the agent's colleagues (questions to them are not for the owner) */
104
+ colleagueNames?: (session: string) => Promise<string[]>;
105
+ /** The owner's Slack user id */
106
+ ownerSlackUserId?: () => string | null;
107
+ now?: () => Date;
108
+ logger?: ComponentLogger;
109
+ }
110
+ /** What one extraction would add (also the backfill's dry-run row). */
111
+ export interface PlannedOpenItem {
112
+ item: RequestOpenItem;
113
+ /** Question: the card it would post (absent when an ask-owner card already covers it) */
114
+ card?: DerivedQuestionCard;
115
+ /** Question: the ask-owner decision it is linked to instead of a new card */
116
+ linkedDecisionId?: string;
117
+ /** Question: the owner already skipped the same question here — tracked as skipped, never carded */
118
+ skippedDecisionId?: string;
119
+ }
120
+ /** Thrown for open-item requests the caller must fix (HTTP 4xx). */
121
+ export declare class OpenItemsError extends Error {
122
+ readonly status: number;
123
+ constructor(status: number, message: string);
124
+ }
125
+ /**
126
+ * The Slack thread of a request's conversation (`origin.threadRef` is
127
+ * `slack:<channel>:<ts>`).
128
+ *
129
+ * @param request - Request
130
+ * @returns Place, or null for chat-only conversations
131
+ */
132
+ export declare function slackPlaceOf(request: Pick<Request, 'origin'>): OpenItemsSlackPlace | null;
133
+ /**
134
+ * Whether a message is in the request's conversation.
135
+ *
136
+ * @param request - Ticket with a chatRef
137
+ * @param message - chat-v2 message
138
+ * @returns True for its thread (or its root)
139
+ */
140
+ export declare function inRequestThread(request: Pick<Request, 'chatRef'>, message: Pick<OpenItemsChatMessage, 'channelId' | 'threadId' | 'id'>): boolean;
141
+ /**
142
+ * The delegated child work a commitment waits on: WorkItems of the request
143
+ * given to someone else, started around the promise and not already finished
144
+ * before it.
145
+ *
146
+ * @param request - Request
147
+ * @param item - Commitment
148
+ * @param pool - Every WorkItem
149
+ * @returns Child WorkItem ids
150
+ */
151
+ export declare function childWorkFor(request: Request, item: Pick<RequestOpenItem, 'agent' | 'createdAt'>, pool: readonly WorkItem[]): string[];
152
+ /**
153
+ * Whether every child of a commitment is finished (cancelled ones ignored).
154
+ *
155
+ * @param ids - Child ids
156
+ * @param pool - Every WorkItem
157
+ * @returns `ready` with the latest finish time, or not ready (with what is left)
158
+ */
159
+ export declare function childrenState(ids: readonly string[], pool: readonly WorkItem[]): {
160
+ ready: boolean;
161
+ finishedAt?: string;
162
+ pending: WorkItem[];
163
+ done: WorkItem[];
164
+ };
165
+ /**
166
+ * Whether two items are the same thing said once: same message, or the same
167
+ * words by the same agent within {@link OPEN_ITEMS_CONSTANTS.DUPLICATE_WINDOW_MS}.
168
+ *
169
+ * @param a - Item
170
+ * @param b - Item
171
+ * @returns True for a duplicate
172
+ */
173
+ export declare function isSameItem(a: Pick<RequestOpenItem, 'sourceMessageId' | 'text' | 'agent' | 'createdAt'>, b: Pick<RequestOpenItem, 'sourceMessageId' | 'text' | 'agent' | 'createdAt'>): boolean;
174
+ /**
175
+ * Tracks commitments and questions on Requests. See module docs.
176
+ */
177
+ export declare class OpenItemsService {
178
+ private readonly deps;
179
+ private static instance;
180
+ private readonly logger;
181
+ private readonly now;
182
+ private chain;
183
+ private timer;
184
+ /**
185
+ * @param deps - Collaborators
186
+ */
187
+ constructor(deps: OpenItemsDeps);
188
+ /** @returns The process-wide instance, or null before wiring */
189
+ static getInstance(): OpenItemsService | null;
190
+ /** @param service - Instance to install (null clears) */
191
+ static setInstance(service: OpenItemsService | null): void;
192
+ /** Start the periodic sweep. */
193
+ start(): void;
194
+ /** Stop the sweep. */
195
+ stop(): void;
196
+ /**
197
+ * One change at a time (a chat message, a WorkItem event and the sweep may
198
+ * touch the same request).
199
+ */
200
+ private serial;
201
+ /**
202
+ * The ticket an agent message belongs to: the one whose thread it is in
203
+ * (any status but cancelled, closed within the lookback), else — for a
204
+ * top-level message — the newest open ticket in that channel the agent is
205
+ * answering.
206
+ *
207
+ * @param message - chat-v2 message
208
+ * @param all - Every request
209
+ * @returns The request, or null
210
+ */
211
+ findRequestFor(message: OpenItemsChatMessage, all: readonly Request[]): Request | null;
212
+ /**
213
+ * An agent posted in chat-v2: mark what it delivered, and track what it
214
+ * newly promised or asked.
215
+ *
216
+ * @param message - The message
217
+ * @returns The request it changed, or null
218
+ */
219
+ onAgentMessage(message: OpenItemsChatMessage): Promise<Request | null>;
220
+ /**
221
+ * What a message would add, without side effects (also the backfill's view).
222
+ *
223
+ * @param request - Its request
224
+ * @param message - The agent message
225
+ * @param at - When it was posted
226
+ * @returns Planned items
227
+ */
228
+ plan(request: Request, message: OpenItemsChatMessage, at: Date): Promise<PlannedOpenItem[]>;
229
+ /**
230
+ * The ask-owner decision the agent already made for this question, if any.
231
+ *
232
+ * @param agent - Asking agent
233
+ * @param q - The question
234
+ * @param at - When it was asked in the reply
235
+ * @returns The decision, or null
236
+ */
237
+ private alreadyAsked;
238
+ /**
239
+ * Turn a planned item into a tracked one: link child work and queue the
240
+ * follow-up (commitment), or post / link the card (question).
241
+ *
242
+ * @param request - Its request
243
+ * @param p - Planned item
244
+ * @param pool - Every WorkItem
245
+ * @returns The stored item
246
+ */
247
+ private activate;
248
+ /**
249
+ * Commitments this message delivers.
250
+ *
251
+ * @param items - Current items
252
+ * @param message - The post
253
+ * @param at - Its time
254
+ * @param pool - Every WorkItem
255
+ * @returns Updated (delivered) items
256
+ */
257
+ private deliveries;
258
+ /**
259
+ * Whether a post in the thread delivers a commitment: by the promising
260
+ * agent (or one doing the child work), once the child work is finished.
261
+ * With no child work: a later post by the promising agent, at least
262
+ * {@link OPEN_ITEMS_CONSTANTS.MIN_DELIVERY_GAP_MS} after the promise, that
263
+ * does not itself promise something new.
264
+ *
265
+ * @param item - Commitment
266
+ * @param message - The post (`createdAt` set)
267
+ * @param pool - Every WorkItem
268
+ * @returns True when it is the delivery
269
+ */
270
+ deliveredBy(item: RequestOpenItem, message: OpenItemsChatMessage, pool: readonly WorkItem[]): boolean;
271
+ /**
272
+ * Take planned items onto a request (the backfill's apply step).
273
+ *
274
+ * @param requestId - Request
275
+ * @param planned - Items from {@link plan}
276
+ * @param opts - `source: 'backfill'` marks the cards it posts as backfilled
277
+ * @returns Updated request, or null when it is gone
278
+ */
279
+ adopt(requestId: string, planned: PlannedOpenItem[], opts?: {
280
+ source?: DecisionSource;
281
+ }): Promise<Request | null>;
282
+ /**
283
+ * Store items, and move the request between `done` and `awaiting_followup`.
284
+ *
285
+ * @param request - Request as read
286
+ * @param items - New item list
287
+ * @param added - New active items were added
288
+ * @returns Updated request
289
+ */
290
+ private save;
291
+ /**
292
+ * A WorkItem finished (task:done / task:verified): wake whoever promised
293
+ * the owner the result, if that was the last piece.
294
+ *
295
+ * @param workItemId - The WorkItem
296
+ * @returns Items that became ready
297
+ */
298
+ onWorkItemSettled(workItemId: string): Promise<RequestOpenItem[]>;
299
+ /**
300
+ * The child work is finished: wake the agent to deliver.
301
+ *
302
+ * @param request - Request
303
+ * @param item - Commitment
304
+ * @param finishedAt - When the last child finished
305
+ * @param done - Finished children
306
+ * @returns Updated item (`ready`)
307
+ */
308
+ private markReady;
309
+ /**
310
+ * A `reply_question` decision settled: close its open item and give the
311
+ * agent the answer (the generic decision note).
312
+ *
313
+ * @param d - The decision
314
+ * @param fallback - The generic note
315
+ * @returns The note for the agent (null when withdrawn)
316
+ */
317
+ onDecisionSettled(d: OwnerDecision, fallback: string | null | undefined): Promise<string | null>;
318
+ /**
319
+ * The owner skipped an open item ("I don't care about this anymore"). A
320
+ * promise is closed, its follow-up WorkItem cancelled and the agent told
321
+ * once to drop it; a question's card is skipped (which closes the item and
322
+ * tells the agent). The request completes when nothing else is open.
323
+ *
324
+ * @param requestId - Request
325
+ * @param itemId - Open item
326
+ * @returns The closed item
327
+ * @throws OpenItemsError(404 / 409)
328
+ */
329
+ skipItem(requestId: string, itemId: string): Promise<RequestOpenItem>;
330
+ /**
331
+ * Periodic pass: link late child work, catch missed readiness, nudge
332
+ * overdue promises once and then tell the owner, sync answered questions,
333
+ * expire stale items, close cancelled tickets' items.
334
+ *
335
+ * @returns Counts of what happened
336
+ */
337
+ sweep(): Promise<{
338
+ ready: number;
339
+ nudged: number;
340
+ ownerNotes: number;
341
+ expired: number;
342
+ closed: number;
343
+ }>;
344
+ /**
345
+ * One item's sweep step.
346
+ */
347
+ private sweepItem;
348
+ /**
349
+ * The owner's note for a late promise: what, by when, and why it is late.
350
+ *
351
+ * @param request - Request
352
+ * @param item - Commitment
353
+ * @param pool - Every WorkItem
354
+ * @param now - Clock
355
+ * @returns Note text (English harness text; the agent's words quoted)
356
+ */
357
+ ownerNote(request: Request, item: RequestOpenItem, pool: readonly WorkItem[], now: Date): Promise<string>;
358
+ private closeFollowUp;
359
+ }
360
+ /**
361
+ * The open-item status a settled decision leaves its question in.
362
+ *
363
+ * @param d - Decision
364
+ * @returns Status (`open` while it is still pending)
365
+ */
366
+ export declare function itemStatusFor(d: Pick<OwnerDecision, 'status'>): RequestOpenItem['status'];
367
+ //# sourceMappingURL=open-items.service.d.ts.map
@@ -0,0 +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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"}