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.
- package/dist/backend/backend/src/constants.d.ts +44 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +44 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts +25 -0
- package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/request/open-items.controller.js +68 -0
- package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/request/request.routes.d.ts +2 -0
- package/dist/backend/backend/src/controllers/request/request.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.routes.js +6 -0
- package/dist/backend/backend/src/controllers/request/request.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +57 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/scripts/open-items-backfill.d.ts +16 -0
- package/dist/backend/backend/src/scripts/open-items-backfill.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/open-items-backfill.js +112 -0
- package/dist/backend/backend/src/scripts/open-items-backfill.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +4 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +11 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +8 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +12 -2
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-card.d.ts +66 -0
- package/dist/backend/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-item-card.js +208 -0
- package/dist/backend/backend/src/services/open-items/open-item-card.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js +394 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +70 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.js +147 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +332 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.js +785 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts +44 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js +172 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +4 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +15 -1
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-review.service.js +5 -1
- package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +15 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts +2 -0
- package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.js +1 -0
- package/dist/backend/backend/src/types/v2/index.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +73 -0
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/v2/open-item.types.js +14 -0
- package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -0
- package/dist/backend/backend/src/types/v2/request.types.d.ts +22 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.js +10 -5
- package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +44 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +44 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +4 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +11 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +8 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +12 -2
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-card.d.ts +66 -0
- package/dist/cli/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
- package/dist/cli/backend/src/services/open-items/open-item-card.js +208 -0
- package/dist/cli/backend/src/services/open-items/open-item-card.js.map +1 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js +394 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.js +15 -1
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-review.service.js +5 -1
- package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +15 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.d.ts +2 -0
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.js +1 -0
- package/dist/cli/backend/src/types/v2/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +73 -0
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/open-item.types.js +14 -0
- package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts +22 -1
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.js +10 -5
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
- package/frontend/dist/assets/{index-9c91de50.js → index-a6cb8533.js} +265 -265
- package/frontend/dist/index.html +1 -1
- 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;
|
|
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;
|
|
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":";AA2CA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAiOjD,qBAAa,YAAY;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAqE;IACnF,gFAAgF;IAChF,OAAO,CAAC,iBAAiB,CAAC,CAAyD;IAEnF,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,sBAAsB,CAA0B;IACxD,OAAO,CAAC,4BAA4B,CAAgC;IACpE,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,wBAAwB,CAA4B;IAC5D,OAAO,CAAC,eAAe,CAAmB;IAC1C,qEAAqE;IACrE,OAAO,CAAC,qBAAqB,CAAsC;IACnE,OAAO,CAAC,sBAAsB,CAAuC;IACrE,OAAO,CAAC,sBAAsB,CAAiD;IAC/E,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,0BAA0B,CAA2C;IAC7E,kGAAkG;IAClG,OAAO,CAAC,sBAAsB,CAAuC;IAGrE,OAAO,CAAC,+BAA+B,CAAgD;IACvF,+FAA+F;IAC/F,OAAO,CAAC,oBAAoB,CAAqC;IACjE,8HAA8H;IAC9H,OAAO,CAAC,0BAA0B,CAA2C;IAC7E,OAAO,CAAC,6BAA6B,CAA8C;IACnF,OAAO,CAAC,wBAAwB,CAAyC;IACzE,OAAO,CAAC,2BAA2B,CAA+B;IAClE,OAAO,CAAC,0BAA0B,CAA8B;IAChE,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,kBAAkB,CAA0C;IAKpE,OAAO,CAAC,aAAa,CAAuE;IAC5F,OAAO,CAAC,gBAAgB,CAET;IAGf,OAAO,CAAC,cAAc,CAAS;IAC/B,oEAAoE;IACpE,OAAO,CAAC,qBAAqB,CAA6C;IAC1E,OAAO,CAAC,qBAAqB,CAA2G;IACxI,OAAO,CAAC,gBAAgB,CAAiG;IACzH,oFAAoF;IACpF,OAAO,CAAC,oBAAoB,CAAK;IACjC,2EAA2E;IAC3E,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,wBAAwB,CAA+B;gBAEnD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAsE3C,OAAO,CAAC,kBAAkB;
|
|
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
|
-
|
|
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) });
|