crewly 1.20.183 → 1.20.184

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 (128) hide show
  1. package/dist/backend/backend/src/constants.d.ts +44 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +44 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts +25 -0
  6. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -0
  7. package/dist/backend/backend/src/controllers/request/open-items.controller.js +68 -0
  8. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -0
  9. package/dist/backend/backend/src/controllers/request/request.routes.d.ts +2 -0
  10. package/dist/backend/backend/src/controllers/request/request.routes.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/request/request.routes.js +6 -0
  12. package/dist/backend/backend/src/controllers/request/request.routes.js.map +1 -1
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +57 -1
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/scripts/open-items-backfill.d.ts +16 -0
  17. package/dist/backend/backend/src/scripts/open-items-backfill.d.ts.map +1 -0
  18. package/dist/backend/backend/src/scripts/open-items-backfill.js +112 -0
  19. package/dist/backend/backend/src/scripts/open-items-backfill.js.map +1 -0
  20. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  21. package/dist/backend/backend/src/services/agent/agent-registration.service.js +4 -2
  22. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  23. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
  24. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  25. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +11 -0
  26. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  27. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  28. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  29. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
  30. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  31. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +8 -1
  32. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/decisions/decision.service.js +12 -2
  34. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  35. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts +66 -0
  36. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
  37. package/dist/backend/backend/src/services/open-items/open-item-card.js +208 -0
  38. package/dist/backend/backend/src/services/open-items/open-item-card.js.map +1 -0
  39. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
  40. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
  41. package/dist/backend/backend/src/services/open-items/open-item-extractor.js +394 -0
  42. package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -0
  43. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +70 -0
  44. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -0
  45. package/dist/backend/backend/src/services/open-items/open-items-backfill.js +147 -0
  46. package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -0
  47. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +332 -0
  48. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -0
  49. package/dist/backend/backend/src/services/open-items/open-items.service.js +785 -0
  50. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -0
  51. package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts +44 -0
  52. package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts.map +1 -0
  53. package/dist/backend/backend/src/services/open-items/open-items.wiring.js +172 -0
  54. package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -0
  55. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +4 -0
  57. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  58. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/v3/request.service.js +15 -1
  60. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/v3/ticket-review.service.js +5 -1
  63. package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
  64. package/dist/backend/backend/src/types/decision.types.d.ts +15 -1
  65. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  66. package/dist/backend/backend/src/types/v2/index.d.ts +2 -0
  67. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  68. package/dist/backend/backend/src/types/v2/index.js +1 -0
  69. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  70. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +73 -0
  71. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -0
  72. package/dist/backend/backend/src/types/v2/open-item.types.js +14 -0
  73. package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -0
  74. package/dist/backend/backend/src/types/v2/request.types.d.ts +22 -1
  75. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  76. package/dist/backend/backend/src/types/v2/request.types.js +10 -5
  77. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  78. package/dist/backend/build-info.json +2 -2
  79. package/dist/cli/backend/src/constants.d.ts +44 -0
  80. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  81. package/dist/cli/backend/src/constants.js +44 -0
  82. package/dist/cli/backend/src/constants.js.map +1 -1
  83. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  84. package/dist/cli/backend/src/services/agent/agent-registration.service.js +4 -2
  85. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  86. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
  87. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  88. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +11 -0
  89. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  90. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  91. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  92. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
  93. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  94. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +8 -1
  95. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  96. package/dist/cli/backend/src/services/decisions/decision.service.js +12 -2
  97. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  98. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts +66 -0
  99. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
  100. package/dist/cli/backend/src/services/open-items/open-item-card.js +208 -0
  101. package/dist/cli/backend/src/services/open-items/open-item-card.js.map +1 -0
  102. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
  103. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
  104. package/dist/cli/backend/src/services/open-items/open-item-extractor.js +394 -0
  105. package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -0
  106. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  107. package/dist/cli/backend/src/services/v3/request.service.js +15 -1
  108. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  109. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  110. package/dist/cli/backend/src/services/v3/ticket-review.service.js +5 -1
  111. package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
  112. package/dist/cli/backend/src/types/decision.types.d.ts +15 -1
  113. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  114. package/dist/cli/backend/src/types/v2/index.d.ts +2 -0
  115. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  116. package/dist/cli/backend/src/types/v2/index.js +1 -0
  117. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  118. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +73 -0
  119. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -0
  120. package/dist/cli/backend/src/types/v2/open-item.types.js +14 -0
  121. package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -0
  122. package/dist/cli/backend/src/types/v2/request.types.d.ts +22 -1
  123. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  124. package/dist/cli/backend/src/types/v2/request.types.js +10 -5
  125. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  126. package/frontend/dist/assets/{index-9c91de50.js → index-a6cb8533.js} +265 -265
  127. package/frontend/dist/index.html +1 -1
  128. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Open items HTTP handlers (specs/2026-10-01-reply-open-items.md).
3
+ *
4
+ * - GET /api/requests/open-items — active open items across requests
5
+ * - POST /api/requests/open-items/backfill — scan the last 7 days; dry-run
6
+ * unless the body says `{ "apply": true }`
7
+ *
8
+ * @module controllers/request/open-items.controller
9
+ */
10
+ import type { Request as ExpressRequest, Response } from 'express';
11
+ /**
12
+ * Active open items, newest first, with their ticket.
13
+ *
14
+ * @param _req - Express request
15
+ * @param res - Express response
16
+ */
17
+ export declare function listOpenItems(_req: ExpressRequest, res: Response): Promise<void>;
18
+ /**
19
+ * Backfill: dry-run by default.
20
+ *
21
+ * @param req - Express request (`{ apply?: boolean }`)
22
+ * @param res - Express response with the report (and its text form)
23
+ */
24
+ export declare function backfillOpenItemsHandler(req: ExpressRequest, res: Response): Promise<void>;
25
+ //# sourceMappingURL=open-items.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-items.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/request/open-items.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQnE;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtF;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBhG"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Open items HTTP handlers (specs/2026-10-01-reply-open-items.md).
3
+ *
4
+ * - GET /api/requests/open-items — active open items across requests
5
+ * - POST /api/requests/open-items/backfill — scan the last 7 days; dry-run
6
+ * unless the body says `{ "apply": true }`
7
+ *
8
+ * @module controllers/request/open-items.controller
9
+ */
10
+ import { RequestService } from '../../services/v3/request.service.js';
11
+ import { TaskPoolService } from '../../services/task-pool/task-pool.service.js';
12
+ import { OpenItemsService } from '../../services/open-items/open-items.service.js';
13
+ import { backfillOpenItems, formatBackfillReport } from '../../services/open-items/open-items-backfill.js';
14
+ import { ACTIVE_OPEN_ITEM_STATUSES } from '../../types/v2/open-item.types.js';
15
+ import { formatTicketNumber } from '../../types/v2/ticket.types.js';
16
+ /**
17
+ * Active open items, newest first, with their ticket.
18
+ *
19
+ * @param _req - Express request
20
+ * @param res - Express response
21
+ */
22
+ export async function listOpenItems(_req, res) {
23
+ try {
24
+ const all = await RequestService.getInstance().listAll();
25
+ const rows = all.flatMap((r) => (r.openItems ?? [])
26
+ .filter((i) => ACTIVE_OPEN_ITEM_STATUSES.has(i.status))
27
+ .map((i) => ({
28
+ ...i,
29
+ requestId: r.id,
30
+ ticket: typeof r.ticketNumber === 'number' ? formatTicketNumber(r.ticketNumber) : undefined,
31
+ requestTitle: r.title,
32
+ requestStatus: r.status,
33
+ })));
34
+ rows.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt));
35
+ res.json({ success: true, data: rows, count: rows.length });
36
+ }
37
+ catch (error) {
38
+ res.status(500).json({ success: false, error: error.message });
39
+ }
40
+ }
41
+ /**
42
+ * Backfill: dry-run by default.
43
+ *
44
+ * @param req - Express request (`{ apply?: boolean }`)
45
+ * @param res - Express response with the report (and its text form)
46
+ */
47
+ export async function backfillOpenItemsHandler(req, res) {
48
+ try {
49
+ const service = OpenItemsService.getInstance();
50
+ if (!service) {
51
+ res.status(503).json({ success: false, error: 'Open items are not running on this instance' });
52
+ return;
53
+ }
54
+ const apply = req.body?.apply === true;
55
+ const { getChatV2Service } = await import('../../services/chat-v2/chat-v2.singleton.js');
56
+ const report = await backfillOpenItems({
57
+ service,
58
+ listRequests: () => RequestService.getInstance().listAll(),
59
+ listWorkItems: () => TaskPoolService.getInstance().getAllItems(),
60
+ listThread: async (channelId, rootId) => getChatV2Service().listThreadForBridge(channelId, rootId),
61
+ }, { apply });
62
+ res.json({ success: true, data: report, text: formatBackfillReport(report) });
63
+ }
64
+ catch (error) {
65
+ res.status(500).json({ success: false, error: error.message });
66
+ }
67
+ }
68
+ //# sourceMappingURL=open-items.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-items.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/request/open-items.controller.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,8 @@ import { Router } from 'express';
14
14
  * - GET / — list all requests
15
15
  * - POST / — create a new request
16
16
  * - POST /plan — plan tasks from a user message
17
+ * - GET /open-items — active open items (reply-open-items)
18
+ * - POST /open-items/backfill — scan the last 7 days (dry-run unless apply)
17
19
  * - GET /:id — get a single request
18
20
  * - PUT /:id — update a request
19
21
  *
@@ -1 +1 @@
1
- {"version":3,"file":"request.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/request/request.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AASjC;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAmB5C"}
1
+ {"version":3,"file":"request.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/request/request.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAUjC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAuB5C"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { Router } from 'express';
10
10
  import { listRequests, getRequest, createRequestHandler, planRequest, updateRequest, } from './request.controller.js';
11
+ import { listOpenItems, backfillOpenItemsHandler } from './open-items.controller.js';
11
12
  /**
12
13
  * Creates the request router with all endpoints.
13
14
  *
@@ -15,6 +16,8 @@ import { listRequests, getRequest, createRequestHandler, planRequest, updateRequ
15
16
  * - GET / — list all requests
16
17
  * - POST / — create a new request
17
18
  * - POST /plan — plan tasks from a user message
19
+ * - GET /open-items — active open items (reply-open-items)
20
+ * - POST /open-items/backfill — scan the last 7 days (dry-run unless apply)
18
21
  * - GET /:id — get a single request
19
22
  * - PUT /:id — update a request
20
23
  *
@@ -28,6 +31,9 @@ export function createRequestRouter() {
28
31
  router.post('/', createRequestHandler);
29
32
  // Plan tasks from a user message (must be before /:id to avoid conflict)
30
33
  router.post('/plan', planRequest);
34
+ // Open items: commitments / questions in agents' replies (before /:id)
35
+ router.get('/open-items', listOpenItems);
36
+ router.post('/open-items/backfill', backfillOpenItemsHandler);
31
37
  // Get a single request by ID
32
38
  router.get('/:id', getRequest);
33
39
  // Update a request
@@ -1 +1 @@
1
- {"version":3,"file":"request.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/request/request.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,oBAAoB;IACpB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE9B,uBAAuB;IACvB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAEvC,yEAAyE;IACzE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAElC,6BAA6B;IAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE/B,mBAAmB;IACnB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"request.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/request/request.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAErF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,oBAAoB;IACpB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE9B,uBAAuB;IACvB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAEvC,yEAAyE;IACzE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAElC,uEAAuE;IACvE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;IAE9D,6BAA6B;IAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE/B,mBAAmB;IACnB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":"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"}
@@ -600,7 +600,16 @@ export class CrewlyServer {
600
600
  },
601
601
  });
602
602
  getChatV2Service().on('chat_message', (dto) => {
603
- void ticketReview.onChatMessage(dto).catch(() => undefined);
603
+ // Open items read the same message after the review recorded it, so
604
+ // the two never write the ticket at once (specs/2026-10-01-reply-open-items.md).
605
+ void ticketReview
606
+ .onChatMessage(dto)
607
+ .catch(() => undefined)
608
+ .then(async () => {
609
+ const { OpenItemsService } = await import('./services/open-items/open-items.service.js');
610
+ await OpenItemsService.getInstance()?.onAgentMessage(dto);
611
+ })
612
+ .catch(() => undefined);
604
613
  });
605
614
  const reviewSweep = setInterval(() => {
606
615
  void ticketReview.sweep().catch((sweepErr) => {
@@ -1135,6 +1144,15 @@ export class CrewlyServer {
1135
1144
  if (event.type === 'agent:busy' && event.sessionName) {
1136
1145
  getSlackAutoWorkingService()?.noteBusy(event.sessionName);
1137
1146
  }
1147
+ // Work an agent promised the owner may now be ready to deliver
1148
+ // (specs/2026-10-01-reply-open-items.md).
1149
+ const finished = event;
1150
+ if ((finished.type === 'task:verified' || finished.type === 'task:done') && finished.workItemId) {
1151
+ const workItemId = finished.workItemId;
1152
+ void import('./services/open-items/open-items.service.js')
1153
+ .then(({ OpenItemsService }) => OpenItemsService.getInstance()?.onWorkItemSettled(workItemId))
1154
+ .catch(() => undefined);
1155
+ }
1138
1156
  if (event.type === 'agent:idle' && event.sessionName) {
1139
1157
  try {
1140
1158
  const waitingThreads = this.threadStatusQueueService.getByStatus('replied_waiting_actions');
@@ -4665,6 +4683,44 @@ export class CrewlyServer {
4665
4683
  // owner agrees to a runtime's first-run Terms from a Slack card.
4666
4684
  const { startRuntimeTerms } = await import('./services/runtime-terms/runtime-terms.wiring.js');
4667
4685
  startRuntimeTerms({ crewlyHome: this.config.crewlyHome, decisions, machineName: () => os.hostname().replace(/\.local$/, '') });
4686
+ // Open items (specs/2026-10-01-reply-open-items.md): commitments and
4687
+ // questions in agents' replies to the owner are tracked until done.
4688
+ const { startOpenItems } = await import('./services/open-items/open-items.wiring.js');
4689
+ startOpenItems({
4690
+ getTeams: () => this.storageService.getTeams(),
4691
+ sendToAgent: async (session, text) => {
4692
+ let exists = false;
4693
+ try {
4694
+ exists = getSessionBackendSync()?.sessionExists(session) ?? false;
4695
+ }
4696
+ catch {
4697
+ exists = false;
4698
+ }
4699
+ if (!exists) {
4700
+ const { activateAgentBySession } = await import('./controllers/team/team.controller.js');
4701
+ await activateAgentBySession(this.apiController, session).catch(() => undefined);
4702
+ }
4703
+ const result = await this.apiController.agentRegistrationService.sendMessageToAgent(session, text);
4704
+ return result.success;
4705
+ },
4706
+ recordChatNote: (chatChannelId, threadId, text) => {
4707
+ try {
4708
+ getChatV2Service().recordTurn({
4709
+ channelId: chatChannelId,
4710
+ senderType: 'system',
4711
+ senderId: 'crewly',
4712
+ content: text,
4713
+ ...(threadId ? { threadId } : {}),
4714
+ metadata: { source: 'system' },
4715
+ });
4716
+ return true;
4717
+ }
4718
+ catch {
4719
+ return false;
4720
+ }
4721
+ },
4722
+ });
4723
+ this.logger.info('Open items started');
4668
4724
  }
4669
4725
  catch (error) {
4670
4726
  this.logger.warn('Decision cards not started', { error: error instanceof Error ? error.message : String(error) });