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,208 @@
1
+ /**
2
+ * Turn a question an agent asked the owner in its reply into a decision card
3
+ * (specs/2026-10-01-reply-open-items.md §4). Pure.
4
+ *
5
+ * - A stated fallback decides the default: "不同意的话我就删掉,只留事实" →
6
+ * options Yes / No (No = "删掉,只留事实"), default No — what the agent said
7
+ * it would do without an answer. "没意见的话我就发" → default Yes.
8
+ * - "A 还是 B?" / "Should I A or B?" → options A and B, default wait.
9
+ * - Anything else → Yes / No / Reply in thread, default wait.
10
+ *
11
+ * Option labels the harness writes are English; the agent's own words stay
12
+ * as they are (in an option's label or detail).
13
+ *
14
+ * @module services/open-items/open-item-card
15
+ */
16
+ import { DECISION_CONSTANTS, OPEN_ITEMS_CONSTANTS } from '../../constants.js';
17
+ const KEYS = ['a', 'b', 'c'];
18
+ /** "If not, I'll …" — what happens on a no (Chinese / English). */
19
+ const FALLBACK_NO = [
20
+ /^(?:如果|要是)?(?:你|您)?(?:觉得)?(?:不同意|不认同|不行|不要|不需要|不用|不合适|不妥|不喜欢|不OK|不ok|不好)的话[,,\s]*(?:那)?(?:我)?(?:就|会|再|先)?(.+)$/iu,
21
+ /^(?:否则|不然)(?:的话)?[,,\s]*(?:那)?(?:我)?(?:就|会)?(.+)$/u,
22
+ /^(?:if not|if you don'?t (?:agree|want (?:it|that|this|to)|like (?:it|that))|if you disagree|otherwise),?\s*(?:i'?ll|i will|i'?d|we'?ll)\s+(.+)$/i,
23
+ ];
24
+ /** "If no objection, I'll …" — what happens on a yes / by default. */
25
+ const FALLBACK_YES = [
26
+ /^(?:如果|要是)?(?:你|您)?(?:觉得)?(?:没意见|没问题|同意|可以|OK|ok|没异议|不反对|行)的话[,,\s]*(?:那)?(?:我)?(?:就|会)?(.+)$/iu,
27
+ /^(?:if (?:i don'?t hear back|there'?s no objection|you don'?t object|no objection|that works|you agree)|unless you object),?\s*(?:i'?ll|i will|we'?ll)\s+(.+)$/i,
28
+ ];
29
+ /**
30
+ * Tidy an action phrase for an option detail.
31
+ *
32
+ * @param s - Raw phrase
33
+ * @returns Phrase without the closing punctuation
34
+ */
35
+ function tidy(s) {
36
+ return s.replace(/\s+/g, ' ').replace(/[。.!!;;]+$/u, '').trim();
37
+ }
38
+ /**
39
+ * Clip to the option detail limit.
40
+ *
41
+ * @param s - Text
42
+ * @returns Clipped text
43
+ */
44
+ function detail(s) {
45
+ const max = DECISION_CONSTANTS.OPTION_DETAIL_MAX_CHARS;
46
+ return s.length > max ? `${s.slice(0, max - 1)}…` : s;
47
+ }
48
+ /**
49
+ * The two alternatives of a choice question, when each fits on a button.
50
+ *
51
+ * @param q - Question sentence
52
+ * @returns [A, B] or null
53
+ */
54
+ export function choiceAlternatives(q) {
55
+ const max = DECISION_CONSTANTS.OPTION_LABEL_MAX_CHARS;
56
+ const t = q.trim();
57
+ const en = /^(?:should (?:i|we)|shall (?:i|we)|do you want (?:me|us) to|would you (?:prefer|like (?:me|us) to)|do you prefer)\s+(.+?),?\s+or\s+(.+?)\s*\?$/i.exec(t);
58
+ if (en) {
59
+ const a = tidy(en[1]);
60
+ const b = tidy(en[2]);
61
+ return a && b && a.length <= max && b.length <= max && a.toLowerCase() !== b.toLowerCase() ? [a, b] : null;
62
+ }
63
+ if (!/还是/.test(t))
64
+ return null;
65
+ // The clause holding 还是: "…,你想先发 A 还是 B?" → "先发 A" / "B".
66
+ // "要现在先发文字版,还是等图好了再发?": A may sit in the clause before.
67
+ const clauses = t.replace(/[??]\s*$/u, '').split(/[,,::;;]/).map((c) => c.trim());
68
+ const i = clauses.findIndex((c) => c.includes('还是'));
69
+ if (i < 0)
70
+ return null;
71
+ let rawA;
72
+ let rawB;
73
+ if (clauses[i].startsWith('还是') && i > 0) {
74
+ rawA = clauses[i - 1];
75
+ rawB = clauses[i].slice(2);
76
+ }
77
+ else {
78
+ [rawA, rawB] = clauses[i].split('还是');
79
+ }
80
+ if (rawA === undefined || rawB === undefined)
81
+ return null;
82
+ const a = tidy(rawA.replace(/^(?:那)?(?:你|您)?(?:觉得|想|要|看)?(?:是)?(?:要|用|选|先)?/u, ''));
83
+ const b = tidy(rawB.replace(/(?:呢|吗|吧|啊|好|比较好|更好)+$/u, ''));
84
+ if (!a || !b || a === b)
85
+ return null;
86
+ return a.length <= max && b.length <= max ? [a, b] : null;
87
+ }
88
+ /**
89
+ * Which approval boundary a question touches (never auto-applied), if any.
90
+ *
91
+ * @param text - Question and fallback
92
+ * @returns Sensitive kind, or undefined
93
+ */
94
+ export function sensitiveKindOf(text) {
95
+ const t = text.toLowerCase();
96
+ if (/\be-?mail\b|邮件|发信/.test(t))
97
+ return 'email';
98
+ if (/\bdeploy|\bproduction\b|\bprod\b|部署|上生产|上线/.test(t))
99
+ return 'deploy';
100
+ if (/\bpay\b|\bpurchase\b|\bbuy\b|\bsubscri|\bcharge|付款|付费|花钱|购买|订阅|扣费/.test(t))
101
+ return 'spend';
102
+ if (/\bpublish|\bpost (?:it )?publicly\b|\btweet\b|公开发布|发布出去|发出去|发帖/.test(t))
103
+ return 'publish';
104
+ return undefined;
105
+ }
106
+ /**
107
+ * Build the card for a question.
108
+ *
109
+ * @param q - The question (and its fallback sentence)
110
+ * @returns Card fields
111
+ *
112
+ * @example
113
+ * deriveQuestionCard({ type: 'question', text: '这个读法,你同意吗?', fallback: '不同意的话我就删掉,只留事实。' })
114
+ * // → options Yes / No ("删掉,只留事实"), default b (No), yesKey a
115
+ */
116
+ export function deriveQuestionCard(q) {
117
+ const C = OPEN_ITEMS_CONSTANTS;
118
+ const question = q.text;
119
+ const sensitive = sensitiveKindOf(`${q.text} ${q.fallback ?? ''}`);
120
+ const base = { question, ...(sensitive ? { sensitive } : {}) };
121
+ const fb = q.fallback?.trim();
122
+ if (fb) {
123
+ for (const re of FALLBACK_NO) {
124
+ const m = re.exec(fb);
125
+ if (m && tidy(m[1])) {
126
+ return {
127
+ ...base,
128
+ options: [
129
+ { key: 'a', label: C.YES_LABEL },
130
+ { key: 'b', label: C.NO_LABEL, detail: detail(tidy(m[1])) },
131
+ ],
132
+ defaultKey: 'b',
133
+ yesKey: 'a',
134
+ derivedFrom: 'fallback_no',
135
+ };
136
+ }
137
+ }
138
+ for (const re of FALLBACK_YES) {
139
+ const m = re.exec(fb);
140
+ if (m && tidy(m[1])) {
141
+ return {
142
+ ...base,
143
+ options: [
144
+ { key: 'a', label: C.YES_LABEL, detail: detail(tidy(m[1])) },
145
+ { key: 'b', label: C.NO_LABEL },
146
+ ],
147
+ defaultKey: 'a',
148
+ yesKey: 'a',
149
+ derivedFrom: 'fallback_yes',
150
+ };
151
+ }
152
+ }
153
+ }
154
+ const alt = choiceAlternatives(q.text);
155
+ if (alt) {
156
+ return {
157
+ ...base,
158
+ options: alt.map((label, i) => ({ key: KEYS[i], label })),
159
+ defaultKey: DECISION_CONSTANTS.WAIT_DEFAULT,
160
+ derivedFrom: 'choice',
161
+ };
162
+ }
163
+ return {
164
+ ...base,
165
+ options: [
166
+ { key: 'a', label: C.YES_LABEL },
167
+ { key: 'b', label: C.NO_LABEL },
168
+ { key: 'c', label: C.REPLY_LABEL, detail: "you'll answer in words in this thread" },
169
+ ],
170
+ defaultKey: DECISION_CONSTANTS.WAIT_DEFAULT,
171
+ yesKey: 'a',
172
+ derivedFrom: 'generic',
173
+ };
174
+ }
175
+ /**
176
+ * Character-bigram overlap of two questions (Dice coefficient), ignoring
177
+ * spaces and punctuation. Used to tell "the agent asked this through
178
+ * ask-owner already".
179
+ *
180
+ * @param a - Question
181
+ * @param b - Question
182
+ * @returns 0..1
183
+ */
184
+ export function questionSimilarity(a, b) {
185
+ const norm = (s) => s.toLowerCase().replace(/[\s\p{P}\p{S}]+/gu, '');
186
+ const grams = (s) => {
187
+ const m = new Map();
188
+ for (let i = 0; i < s.length - 1; i++) {
189
+ const g = s.slice(i, i + 2);
190
+ m.set(g, (m.get(g) ?? 0) + 1);
191
+ }
192
+ return m;
193
+ };
194
+ const x = norm(a);
195
+ const y = norm(b);
196
+ if (!x || !y)
197
+ return 0;
198
+ if (x === y)
199
+ return 1;
200
+ const gx = grams(x);
201
+ const gy = grams(y);
202
+ let overlap = 0;
203
+ for (const [g, n] of gx)
204
+ overlap += Math.min(n, gy.get(g) ?? 0);
205
+ const total = Math.max(1, x.length - 1) + Math.max(1, y.length - 1);
206
+ return (2 * overlap) / total;
207
+ }
208
+ //# sourceMappingURL=open-item-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-item-card.js","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-item-card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Find the commitments and questions an agent left open in a reply to the
3
+ * owner (specs/2026-10-01-reply-open-items.md §1). Pure, rules only.
4
+ *
5
+ * Tuned to miss rather than invent: a missed promise costs one follow-up the
6
+ * owner has to ask for himself; an invented question puts a pointless card in
7
+ * front of him. So a sentence only counts when it clearly says
8
+ *
9
+ * - **commitment**: a first-person future deliverable for the owner
10
+ * ("明天中午给我,我核过以后挑最有用的几条发你", "I'll send the draft tonight");
11
+ * - **question**: a direct question that asks the owner to decide or confirm
12
+ * ("这个读法,你同意吗?", "Should I keep the appendix?").
13
+ *
14
+ * Skipped on purpose: past tense ("已经发你了", "attached below"), conditional
15
+ * offers ("要的话我再…", "if you want, I'll…"), quoted text, headings,
16
+ * questions to a colleague (an @-mention or a teammate's name up front) and
17
+ * rhetorical questions that the agent answers itself.
18
+ *
19
+ * @module services/open-items/open-item-extractor
20
+ */
21
+ /** A commitment found in a reply. */
22
+ export interface ExtractedCommitment {
23
+ type: 'commitment';
24
+ /** The sentence (clipped) */
25
+ text: string;
26
+ /** When it is due */
27
+ due: Date;
28
+ /** `text` = a time was said; `default` = none was, so +24 h */
29
+ dueSource: 'text' | 'default';
30
+ }
31
+ /** A question to the owner found in a reply. */
32
+ export interface ExtractedQuestion {
33
+ type: 'question';
34
+ /** The question sentence (clipped, one line) */
35
+ text: string;
36
+ /** The sentence after it, when it states a fallback ("不同意的话我就删掉") */
37
+ fallback?: string;
38
+ }
39
+ /** Everything found in one reply. */
40
+ export interface ExtractedOpenItems {
41
+ commitments: ExtractedCommitment[];
42
+ questions: ExtractedQuestion[];
43
+ }
44
+ /** Options for {@link extractOpenItems}. */
45
+ export interface ExtractOptions {
46
+ /** When the reply was posted (due times are relative to it) */
47
+ now: Date;
48
+ /** Display names of the agent's colleagues (a question addressed to one is not for the owner) */
49
+ colleagueNames?: readonly string[];
50
+ /** The owner's Slack user id: an @-mention of anyone else makes a sentence not for the owner */
51
+ ownerSlackUserId?: string;
52
+ }
53
+ /** One sentence with the line it came from. */
54
+ interface Sentence {
55
+ text: string;
56
+ /** Index of the sentence within its line */
57
+ index: number;
58
+ /** All sentences of the same line */
59
+ line: string[];
60
+ }
61
+ /**
62
+ * Split a reply into sentences, line by line.
63
+ *
64
+ * @param text - Reply text
65
+ * @returns Sentences
66
+ */
67
+ export declare function splitSentences(text: string): Sentence[];
68
+ /**
69
+ * Whether a sentence is a commitment to the owner.
70
+ *
71
+ * @param s - Sentence
72
+ * @returns True for a first-person future deliverable
73
+ */
74
+ export declare function isCommitment(s: string): boolean;
75
+ /**
76
+ * When a commitment is due.
77
+ *
78
+ * Rules (local time): an explicit day/part of day wins ("明天中午" → tomorrow
79
+ * 12:00, "tonight" → today 21:00, "by Friday" → Friday 12:00); "tomorrow"
80
+ * alone → tomorrow {@link OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_HOUR_LOCAL}:00;
81
+ * "in 2 hours" → +2 h; nothing → +{@link OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_MS}.
82
+ *
83
+ * @param s - Sentence
84
+ * @param now - When it was said
85
+ * @returns Due time and whether the text named it
86
+ */
87
+ export declare function parseDue(s: string, now: Date): {
88
+ due: Date;
89
+ source: 'text' | 'default';
90
+ };
91
+ /**
92
+ * Whether a sentence (with its neighbours) is a question for the owner.
93
+ *
94
+ * @param s - The sentence
95
+ * @param next - The sentence after it on the same line, if any
96
+ * @param opts - Extraction options
97
+ * @returns True for a decision/confirmation question to the owner
98
+ */
99
+ export declare function isOwnerQuestion(s: string, next: string | undefined, opts: ExtractOptions): boolean;
100
+ /**
101
+ * Find open items in an agent's reply to the owner.
102
+ *
103
+ * @param text - The reply
104
+ * @param opts - Clock, colleague names, owner id
105
+ * @returns Commitments and questions (each at most
106
+ * {@link OPEN_ITEMS_CONSTANTS.MAX_ITEMS_PER_REPLY})
107
+ *
108
+ * @example
109
+ * extractOpenItems('明天中午给我,我核过以后挑最有用的几条发你。', { now })
110
+ * // → { commitments: [{ text: '明天中午给我,我核过以后挑最有用的几条发你。', due: <tomorrow 12:00>, … }], questions: [] }
111
+ */
112
+ export declare function extractOpenItems(text: string, opts: ExtractOptions): ExtractedOpenItems;
113
+ export {};
114
+ //# sourceMappingURL=open-item-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-item-extractor.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-item-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,qCAAqC;AACrC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,GAAG,EAAE,IAAI,CAAC;IACV,+DAA+D;IAC/D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,GAAG,EAAE,IAAI,CAAC;IACV,iGAAiG;IACjG,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,+CAA+C;AAC/C,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAgDD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAUvD;AAgGD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAa/C;AAuCD;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAkDxF;AAuBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAUlG;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAqBvF"}