crewly 1.20.179 → 1.20.181
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/config/roles/team-leader/prompt.md +2 -2
- package/config/roles/team-leader/tl-addon.md +2 -2
- package/config/skills/agent/core/ask-owner/SKILL.md +79 -0
- package/config/skills/agent/core/ask-owner/execute.sh +66 -0
- package/config/skills/agent/core/ask-owner/execute.test.sh +62 -0
- package/config/skills/agent/core/project-tickets/SKILL.md +21 -9
- package/config/skills/agent/core/project-tickets/execute.sh +28 -9
- package/config/skills/agent/core/project-tickets/execute.test.sh +12 -4
- package/config/skills/agent/core/reply/SKILL.md +22 -5
- package/config/skills/agent/core/reply/execute.sh +12 -5
- package/config/skills/agent/core/reply/execute.test.sh +8 -0
- package/config/skills/agent/core/schedule-followup/SKILL.md +8 -0
- package/config/skills/agent/core/schedule-followup/execute.sh +7 -0
- package/config/skills/agent/remote-browser/SKILL.md +28 -8
- package/config/slack-app-manifest.json +5 -1
- package/config/slack-master-app-manifest.json +7 -2
- package/dist/backend/backend/src/constants.d.ts +99 -5
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +106 -5
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +2 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +15 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +3 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +54 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +67 -0
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +215 -0
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +8 -5
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +51 -12
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +4 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +135 -2
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +6 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.js +13 -13
- package/dist/backend/backend/src/services/boot/boot-announce.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts +202 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.js +533 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +24 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +55 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +51 -0
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.js +82 -3
- package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/held-action-store.d.ts +125 -0
- package/dist/backend/backend/src/services/browser/held-action-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/held-action-store.js +141 -0
- package/dist/backend/backend/src/services/browser/held-action-store.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +6 -6
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +3 -3
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +14 -13
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts +155 -0
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-card.js +337 -0
- package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts +83 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.js +226 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.d.ts +34 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.js +64 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-store.d.ts +80 -0
- package/dist/backend/backend/src/services/decisions/decision-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-store.js +151 -0
- package/dist/backend/backend/src/services/decisions/decision-store.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +338 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js +729 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +70 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +172 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.d.ts +97 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.js +137 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +165 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.js +239 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +134 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +217 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +1 -30
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +1 -22
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +2 -15
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +8 -22
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +11 -12
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +27 -52
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +6 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +3 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +12 -12
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +16 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +56 -2
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/system/auto-update.service.js +2 -2
- package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -1
- package/dist/backend/backend/src/services/system/auto-update.utils.js +2 -2
- package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +168 -0
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/decision.types.js +13 -0
- package/dist/backend/backend/src/types/decision.types.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +30 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/trigger.types.d.ts +17 -0
- package/dist/backend/backend/src/types/v2/trigger.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/trigger.types.js +17 -0
- package/dist/backend/backend/src/types/v2/trigger.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +99 -5
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +106 -5
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +12 -12
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +16 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +56 -2
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/system/auto-update.utils.js +2 -2
- package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +30 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/trigger.types.d.ts +17 -0
- package/dist/cli/backend/src/types/v2/trigger.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/trigger.types.js +17 -0
- package/dist/cli/backend/src/types/v2/trigger.types.js.map +1 -1
- package/frontend/dist/assets/index-04d192f8.css +42 -0
- package/frontend/dist/assets/{index-69af46c3.js → index-4271e95e.js} +259 -259
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-cdc52122.css +0 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-contract.js","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who asks the owner about a ticket (specs/2026-10-01-decision-cards.md §2). Pure.
|
|
3
|
+
*
|
|
4
|
+
* The responsible agent asks, never the orchestrator: the ticket's assignee
|
|
5
|
+
* when it is a member of one of the project's teams, else the lead of the
|
|
6
|
+
* ticket's team, else the lead of the first project team.
|
|
7
|
+
*
|
|
8
|
+
* @module services/decisions/decision-routing
|
|
9
|
+
*/
|
|
10
|
+
import type { Team } from '../../types/index.js';
|
|
11
|
+
import type { ProjectTicket } from '../../types/project-ticket.types.js';
|
|
12
|
+
/** The chosen asker. */
|
|
13
|
+
export interface TicketAsker {
|
|
14
|
+
session: string;
|
|
15
|
+
teamId: string;
|
|
16
|
+
why: 'assignee' | 'ticket_team_lead' | 'project_team_lead';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Pick the agent that asks the owner about a ticket.
|
|
20
|
+
*
|
|
21
|
+
* @param ticket - Ticket (assignee, team)
|
|
22
|
+
* @param teams - The project's non-archived teams
|
|
23
|
+
* @returns The asker, or null when the project has no team with a lead
|
|
24
|
+
*/
|
|
25
|
+
export declare function pickTicketAsker(ticket: Pick<ProjectTicket, 'assignee' | 'team'>, teams: Team[]): TicketAsker | null;
|
|
26
|
+
/**
|
|
27
|
+
* The team an agent session belongs to.
|
|
28
|
+
*
|
|
29
|
+
* @param session - Agent session
|
|
30
|
+
* @param teams - Teams
|
|
31
|
+
* @returns Team id, or undefined
|
|
32
|
+
*/
|
|
33
|
+
export declare function teamOfSession(session: string, teams: Team[]): string | undefined;
|
|
34
|
+
//# sourceMappingURL=decision-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-routing.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision-routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAGzE,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,UAAU,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;CAC5D;AAYD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,GAAG,IAAI,CAkBnH;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,SAAS,CAKhF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who asks the owner about a ticket (specs/2026-10-01-decision-cards.md §2). Pure.
|
|
3
|
+
*
|
|
4
|
+
* The responsible agent asks, never the orchestrator: the ticket's assignee
|
|
5
|
+
* when it is a member of one of the project's teams, else the lead of the
|
|
6
|
+
* ticket's team, else the lead of the first project team.
|
|
7
|
+
*
|
|
8
|
+
* @module services/decisions/decision-routing
|
|
9
|
+
*/
|
|
10
|
+
import { ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
11
|
+
import { getTeamLeads } from '../../utils/team.utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* A member's session name.
|
|
14
|
+
*
|
|
15
|
+
* @param m - Member
|
|
16
|
+
* @returns Session (falls back to the member id)
|
|
17
|
+
*/
|
|
18
|
+
function sessionOf(m) {
|
|
19
|
+
return m.sessionName || m.id;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Pick the agent that asks the owner about a ticket.
|
|
23
|
+
*
|
|
24
|
+
* @param ticket - Ticket (assignee, team)
|
|
25
|
+
* @param teams - The project's non-archived teams
|
|
26
|
+
* @returns The asker, or null when the project has no team with a lead
|
|
27
|
+
*/
|
|
28
|
+
export function pickTicketAsker(ticket, teams) {
|
|
29
|
+
const assignee = ticket.assignee?.trim();
|
|
30
|
+
if (assignee && assignee !== ORCHESTRATOR_SESSION_NAME) {
|
|
31
|
+
for (const team of teams) {
|
|
32
|
+
const m = (team.members ?? []).find((x) => x.sessionName === assignee || x.agentId === assignee || x.id === assignee);
|
|
33
|
+
if (m)
|
|
34
|
+
return { session: sessionOf(m), teamId: team.id, why: 'assignee' };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const own = ticket.team ? teams.find((t) => t.id === ticket.team) : undefined;
|
|
38
|
+
if (own) {
|
|
39
|
+
const lead = getTeamLeads(own)[0];
|
|
40
|
+
if (lead)
|
|
41
|
+
return { session: sessionOf(lead), teamId: own.id, why: 'ticket_team_lead' };
|
|
42
|
+
}
|
|
43
|
+
for (const team of teams) {
|
|
44
|
+
const lead = getTeamLeads(team)[0];
|
|
45
|
+
if (lead)
|
|
46
|
+
return { session: sessionOf(lead), teamId: team.id, why: 'project_team_lead' };
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The team an agent session belongs to.
|
|
52
|
+
*
|
|
53
|
+
* @param session - Agent session
|
|
54
|
+
* @param teams - Teams
|
|
55
|
+
* @returns Team id, or undefined
|
|
56
|
+
*/
|
|
57
|
+
export function teamOfSession(session, teams) {
|
|
58
|
+
for (const team of teams) {
|
|
59
|
+
if ((team.members ?? []).some((m) => m.sessionName === session || m.agentId === session))
|
|
60
|
+
return team.id;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=decision-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-routing.js","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision-routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AASzD;;;;;GAKG;AACH,SAAS,SAAS,CAAC,CAAa;IAC9B,OAAO,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgD,EAAE,KAAa;IAC7F,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,QAAQ,IAAI,QAAQ,KAAK,yBAAyB,EAAE,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YACtH,IAAI,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC;IACzF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC;IAC3F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAa;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IAC3G,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable store of owner decisions (specs/2026-10-01-decision-cards.md §1).
|
|
3
|
+
*
|
|
4
|
+
* One JSON file under CREWLY_HOME with a monotonically increasing id
|
|
5
|
+
* counter, so `D-7` is never reused. All writes are serialised and atomic.
|
|
6
|
+
* Settled decisions are pruned after {@link DECISION_CONSTANTS.RESOLVED_KEEP_MS}.
|
|
7
|
+
*
|
|
8
|
+
* @module services/decisions/decision-store
|
|
9
|
+
*/
|
|
10
|
+
import type { OwnerDecision } from '../../types/decision.types.js';
|
|
11
|
+
/** Statuses still in front of the owner. */
|
|
12
|
+
export declare const PENDING_DECISION_STATUSES: ReadonlySet<OwnerDecision['status']>;
|
|
13
|
+
/**
|
|
14
|
+
* Persistent decision store.
|
|
15
|
+
*/
|
|
16
|
+
export declare class DecisionStore {
|
|
17
|
+
private readonly filePath;
|
|
18
|
+
private readonly now;
|
|
19
|
+
private data;
|
|
20
|
+
private chain;
|
|
21
|
+
/**
|
|
22
|
+
* @param filePath - JSON file
|
|
23
|
+
* @param now - Clock (tests)
|
|
24
|
+
*/
|
|
25
|
+
constructor(filePath: string, now?: () => Date);
|
|
26
|
+
/**
|
|
27
|
+
* Store under a CREWLY_HOME.
|
|
28
|
+
*
|
|
29
|
+
* @param crewlyHome - CREWLY_HOME
|
|
30
|
+
* @returns The store
|
|
31
|
+
*/
|
|
32
|
+
static inHome(crewlyHome: string): DecisionStore;
|
|
33
|
+
/**
|
|
34
|
+
* Add a decision, assigning its id.
|
|
35
|
+
*
|
|
36
|
+
* @param draft - Decision without id/timestamps
|
|
37
|
+
* @returns The stored decision
|
|
38
|
+
*/
|
|
39
|
+
create(draft: Omit<OwnerDecision, 'id' | 'createdAt' | 'updatedAt'>): Promise<OwnerDecision>;
|
|
40
|
+
/**
|
|
41
|
+
* Change a decision under the write lock.
|
|
42
|
+
*
|
|
43
|
+
* @param id - Decision id
|
|
44
|
+
* @param fn - Returns the patch, or null to leave it alone
|
|
45
|
+
* @returns The updated decision, or null when missing / unchanged
|
|
46
|
+
*/
|
|
47
|
+
update(id: string, fn: (d: OwnerDecision) => Partial<OwnerDecision> | null): Promise<OwnerDecision | null>;
|
|
48
|
+
/**
|
|
49
|
+
* One decision.
|
|
50
|
+
*
|
|
51
|
+
* @param id - Decision id
|
|
52
|
+
* @returns Copy, or null
|
|
53
|
+
*/
|
|
54
|
+
get(id: string): Promise<OwnerDecision | null>;
|
|
55
|
+
/**
|
|
56
|
+
* All decisions, newest first, optionally filtered.
|
|
57
|
+
*
|
|
58
|
+
* @param filter - Predicate
|
|
59
|
+
* @returns Copies
|
|
60
|
+
*/
|
|
61
|
+
list(filter?: (d: OwnerDecision) => boolean): Promise<OwnerDecision[]>;
|
|
62
|
+
/**
|
|
63
|
+
* The open decision whose card is this message (or whose thread this is).
|
|
64
|
+
*
|
|
65
|
+
* @param slackChannelId - Channel
|
|
66
|
+
* @param ts - Card ts or thread ts
|
|
67
|
+
* @returns Decision, or null
|
|
68
|
+
*/
|
|
69
|
+
findByCard(slackChannelId: string, ts: string): Promise<OwnerDecision | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Drop settled decisions older than the keep window.
|
|
72
|
+
*
|
|
73
|
+
* @returns How many were dropped
|
|
74
|
+
*/
|
|
75
|
+
prune(): Promise<number>;
|
|
76
|
+
private load;
|
|
77
|
+
private save;
|
|
78
|
+
private serial;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=decision-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAQnE,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAA+B,CAAC;AAE3G;;GAEG;AACH,qBAAa,aAAa;IAStB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,KAAK,CAAuC;IAEpD;;;OAGG;gBAEgB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,IAAuB;IAGrD;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa;IAIhD;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAYlG;;;;;;OAMG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAchH;;;;;OAKG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAMpD;;;;;OAKG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ5E;;;;;;OAMG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAMnF;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;YAYhB,IAAI;YASJ,IAAI;IAIlB,OAAO,CAAC,MAAM;CAKf"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable store of owner decisions (specs/2026-10-01-decision-cards.md §1).
|
|
3
|
+
*
|
|
4
|
+
* One JSON file under CREWLY_HOME with a monotonically increasing id
|
|
5
|
+
* counter, so `D-7` is never reused. All writes are serialised and atomic.
|
|
6
|
+
* Settled decisions are pruned after {@link DECISION_CONSTANTS.RESOLVED_KEEP_MS}.
|
|
7
|
+
*
|
|
8
|
+
* @module services/decisions/decision-store
|
|
9
|
+
*/
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { DECISION_CONSTANTS } from '../../constants.js';
|
|
12
|
+
import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
|
|
13
|
+
/** Statuses still in front of the owner. */
|
|
14
|
+
export const PENDING_DECISION_STATUSES = new Set(['open', 'parked']);
|
|
15
|
+
/**
|
|
16
|
+
* Persistent decision store.
|
|
17
|
+
*/
|
|
18
|
+
export class DecisionStore {
|
|
19
|
+
filePath;
|
|
20
|
+
now;
|
|
21
|
+
data = null;
|
|
22
|
+
chain = Promise.resolve();
|
|
23
|
+
/**
|
|
24
|
+
* @param filePath - JSON file
|
|
25
|
+
* @param now - Clock (tests)
|
|
26
|
+
*/
|
|
27
|
+
constructor(filePath, now = () => new Date()) {
|
|
28
|
+
this.filePath = filePath;
|
|
29
|
+
this.now = now;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Store under a CREWLY_HOME.
|
|
33
|
+
*
|
|
34
|
+
* @param crewlyHome - CREWLY_HOME
|
|
35
|
+
* @returns The store
|
|
36
|
+
*/
|
|
37
|
+
static inHome(crewlyHome) {
|
|
38
|
+
return new DecisionStore(path.join(crewlyHome, DECISION_CONSTANTS.STORE_FILENAME));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Add a decision, assigning its id.
|
|
42
|
+
*
|
|
43
|
+
* @param draft - Decision without id/timestamps
|
|
44
|
+
* @returns The stored decision
|
|
45
|
+
*/
|
|
46
|
+
async create(draft) {
|
|
47
|
+
return this.serial(async () => {
|
|
48
|
+
const data = await this.load();
|
|
49
|
+
const at = this.now().toISOString();
|
|
50
|
+
const decision = { ...draft, id: `${DECISION_CONSTANTS.ID_PREFIX}${data.nextId}`, createdAt: at, updatedAt: at };
|
|
51
|
+
data.nextId += 1;
|
|
52
|
+
data.decisions.push(decision);
|
|
53
|
+
await this.save();
|
|
54
|
+
return { ...decision };
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Change a decision under the write lock.
|
|
59
|
+
*
|
|
60
|
+
* @param id - Decision id
|
|
61
|
+
* @param fn - Returns the patch, or null to leave it alone
|
|
62
|
+
* @returns The updated decision, or null when missing / unchanged
|
|
63
|
+
*/
|
|
64
|
+
async update(id, fn) {
|
|
65
|
+
return this.serial(async () => {
|
|
66
|
+
const data = await this.load();
|
|
67
|
+
const idx = data.decisions.findIndex((d) => d.id === id);
|
|
68
|
+
if (idx < 0)
|
|
69
|
+
return null;
|
|
70
|
+
const patch = fn({ ...data.decisions[idx] });
|
|
71
|
+
if (!patch)
|
|
72
|
+
return null;
|
|
73
|
+
const next = { ...data.decisions[idx], ...patch, updatedAt: this.now().toISOString() };
|
|
74
|
+
data.decisions[idx] = next;
|
|
75
|
+
await this.save();
|
|
76
|
+
return { ...next };
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* One decision.
|
|
81
|
+
*
|
|
82
|
+
* @param id - Decision id
|
|
83
|
+
* @returns Copy, or null
|
|
84
|
+
*/
|
|
85
|
+
async get(id) {
|
|
86
|
+
const data = await this.load();
|
|
87
|
+
const d = data.decisions.find((x) => x.id === id);
|
|
88
|
+
return d ? { ...d } : null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* All decisions, newest first, optionally filtered.
|
|
92
|
+
*
|
|
93
|
+
* @param filter - Predicate
|
|
94
|
+
* @returns Copies
|
|
95
|
+
*/
|
|
96
|
+
async list(filter) {
|
|
97
|
+
const data = await this.load();
|
|
98
|
+
return data.decisions
|
|
99
|
+
.filter((d) => !filter || filter(d))
|
|
100
|
+
.map((d) => ({ ...d }))
|
|
101
|
+
.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt) || b.id.localeCompare(a.id, undefined, { numeric: true }));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The open decision whose card is this message (or whose thread this is).
|
|
105
|
+
*
|
|
106
|
+
* @param slackChannelId - Channel
|
|
107
|
+
* @param ts - Card ts or thread ts
|
|
108
|
+
* @returns Decision, or null
|
|
109
|
+
*/
|
|
110
|
+
async findByCard(slackChannelId, ts) {
|
|
111
|
+
const data = await this.load();
|
|
112
|
+
const d = data.decisions.find((x) => x.card?.slackChannelId === slackChannelId && x.card.messageTs === ts);
|
|
113
|
+
return d ? { ...d } : null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Drop settled decisions older than the keep window.
|
|
117
|
+
*
|
|
118
|
+
* @returns How many were dropped
|
|
119
|
+
*/
|
|
120
|
+
async prune() {
|
|
121
|
+
return this.serial(async () => {
|
|
122
|
+
const data = await this.load();
|
|
123
|
+
const cutoff = this.now().getTime() - DECISION_CONSTANTS.RESOLVED_KEEP_MS;
|
|
124
|
+
const before = data.decisions.length;
|
|
125
|
+
data.decisions = data.decisions.filter((d) => PENDING_DECISION_STATUSES.has(d.status) || Date.parse(d.updatedAt) >= cutoff);
|
|
126
|
+
const dropped = before - data.decisions.length;
|
|
127
|
+
if (dropped > 0)
|
|
128
|
+
await this.save();
|
|
129
|
+
return dropped;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async load() {
|
|
133
|
+
if (this.data)
|
|
134
|
+
return this.data;
|
|
135
|
+
const raw = await safeReadJson(this.filePath, {});
|
|
136
|
+
const decisions = Array.isArray(raw.decisions) ? raw.decisions : [];
|
|
137
|
+
const maxId = decisions.reduce((m, d) => Math.max(m, Number(String(d.id).replace(DECISION_CONSTANTS.ID_PREFIX, '')) || 0), 0);
|
|
138
|
+
this.data = { nextId: Math.max(Number(raw.nextId) || 1, maxId + 1), decisions };
|
|
139
|
+
return this.data;
|
|
140
|
+
}
|
|
141
|
+
async save() {
|
|
142
|
+
if (this.data)
|
|
143
|
+
await atomicWriteJson(this.filePath, this.data);
|
|
144
|
+
}
|
|
145
|
+
serial(fn) {
|
|
146
|
+
const next = this.chain.then(fn, fn);
|
|
147
|
+
this.chain = next.catch(() => undefined);
|
|
148
|
+
return next;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=decision-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision-store.ts"],"names":[],"mappings":"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"}
|