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
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,7 +64,7 @@ import { getSlackAutoWorkingService } from './services/slack/slack-auto-working.
|
|
|
64
64
|
import { getSlackAgentDmService } from './services/slack/slack-agent-dm.service.js';
|
|
65
65
|
import { sendBootAnnouncement, isFirstBoot, markBooted } from './services/boot/boot-announce.service.js';
|
|
66
66
|
import { SubAgentMessageQueue } from './services/messaging/sub-agent-message-queue.service.js';
|
|
67
|
-
import { SUB_AGENT_QUEUE_CONSTANTS, CHAT_CONTEXT_CONSTANTS, SAFE_RESTART, AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CLAUDE_STARTUP_CONSTANTS, WEB_CONSTANTS, TICKET_CONSTANTS, UNASSIGNED_ROUTE_CONSTANTS, CLOUD_TALK_CONSTANTS, STANDING_ANSWERS_CONSTANTS, TICKET_AUTOPILOT_CONSTANTS } from './constants.js';
|
|
67
|
+
import { SUB_AGENT_QUEUE_CONSTANTS, CHAT_CONTEXT_CONSTANTS, SAFE_RESTART, AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CLAUDE_STARTUP_CONSTANTS, WEB_CONSTANTS, TICKET_CONSTANTS, UNASSIGNED_ROUTE_CONSTANTS, CLOUD_TALK_CONSTANTS, STANDING_ANSWERS_CONSTANTS, TICKET_AUTOPILOT_CONSTANTS, WORK_ITEM_DESTINATION_CONSTANTS } from './constants.js';
|
|
68
68
|
import { PtyActivityTrackerService } from './services/agent/pty-activity-tracker.service.js';
|
|
69
69
|
import { InFlightTurnTracker } from './services/restart/in-flight-turn-tracker.service.js';
|
|
70
70
|
import { TicketIntakeService, setTicketIntakeService, resolveTicketIdForSession, } from './services/v3/ticket-intake.service.js';
|
|
@@ -105,6 +105,7 @@ import { RuntimeExitMonitorService } from './services/agent/runtime-exit-monitor
|
|
|
105
105
|
import { ContextWindowMonitorService } from './services/agent/context-window-monitor.service.js';
|
|
106
106
|
import { OAuthReloginMonitorService } from './services/agent/oauth-relogin-monitor.service.js';
|
|
107
107
|
import { OrcReplyRouteService } from './services/orc/orc-reply-route.service.js';
|
|
108
|
+
import { buildTriggerOrigin } from './services/orc/work-item-destination.js';
|
|
108
109
|
import { ReloginAgentResumerService } from './services/agent/relogin-agent-resumer.service.js';
|
|
109
110
|
import { getHarnessReloginService, harnessCommandWord } from './services/harness/harness-relogin.service.js';
|
|
110
111
|
import { getHarnessService } from './services/harness/harness.service.js';
|
|
@@ -1402,7 +1403,14 @@ export class CrewlyServer {
|
|
|
1402
1403
|
req.rawBody = buf.toString('utf8');
|
|
1403
1404
|
},
|
|
1404
1405
|
}));
|
|
1405
|
-
this.app.use(express.urlencoded({
|
|
1406
|
+
this.app.use(express.urlencoded({
|
|
1407
|
+
extended: true,
|
|
1408
|
+
limit: '10mb',
|
|
1409
|
+
// Slack's interactive `payload=` form is verified over the exact bytes.
|
|
1410
|
+
verify: (req, _res, buf) => {
|
|
1411
|
+
req.rawBody = buf.toString('utf8');
|
|
1412
|
+
},
|
|
1413
|
+
}));
|
|
1406
1414
|
// Note: Static files are configured in configureRoutes() after API routes
|
|
1407
1415
|
}
|
|
1408
1416
|
configureRoutes() {
|
|
@@ -1967,6 +1975,44 @@ export class CrewlyServer {
|
|
|
1967
1975
|
setBrowserControlDeps({
|
|
1968
1976
|
sendMessageToAgent: (sessionName, message) => this.apiController.agentRegistrationService.sendMessageToAgent(sessionName, message),
|
|
1969
1977
|
});
|
|
1978
|
+
// Held irreversible actions: ask the owner with a Slack decision
|
|
1979
|
+
// card in the agent's work thread, persist the hold, and apply the
|
|
1980
|
+
// answer from any surface (card, reaction, reply, dashboard, portal).
|
|
1981
|
+
try {
|
|
1982
|
+
const { BrowserApprovalService } = await import('./services/browser/browser-approval.service.js');
|
|
1983
|
+
const { HeldActionStore } = await import('./services/browser/held-action-store.js');
|
|
1984
|
+
const { DecisionService } = await import('./services/decisions/decision.service.js');
|
|
1985
|
+
const approvals = new BrowserApprovalService({
|
|
1986
|
+
store: HeldActionStore.inHome(this.config.crewlyHome),
|
|
1987
|
+
sessions: browserSessions,
|
|
1988
|
+
decisions: () => DecisionService.getInstance(),
|
|
1989
|
+
canAskInSlack: () => !!DecisionService.getInstance() && getSlackService().isConnected(),
|
|
1990
|
+
tellAgent: (sessionName, message) => this.apiController.agentRegistrationService.sendMessageToAgent(sessionName, message),
|
|
1991
|
+
agentNameOf: async (sessionName) => {
|
|
1992
|
+
const teams = await this.storageService.getTeams().catch(() => []);
|
|
1993
|
+
return teams.flatMap((t) => t.members ?? []).find((m) => m.sessionName === sessionName)?.name;
|
|
1994
|
+
},
|
|
1995
|
+
boundTabOf: (sessionName) => {
|
|
1996
|
+
const binding = browserBridge.getBinding(sessionName);
|
|
1997
|
+
return binding ? { tabId: binding.tabId, ...(binding.instanceId ? { instanceId: binding.instanceId } : {}) } : undefined;
|
|
1998
|
+
},
|
|
1999
|
+
adoptTab: (sessionName, tabId, instanceId) => browserBridge.adoptTab(sessionName, tabId, instanceId),
|
|
2000
|
+
});
|
|
2001
|
+
BrowserApprovalService.setInstance(approvals);
|
|
2002
|
+
DecisionService.registerKindHandler('browser_action', approvals);
|
|
2003
|
+
browserSessions.setHoldListener(approvals);
|
|
2004
|
+
browserBridge.onTabInventory((tabs, instanceId) => approvals.onTabInventory(tabs, instanceId));
|
|
2005
|
+
// Restored holds expire through their cards, so restore once
|
|
2006
|
+
// decision cards run (startDecisionCards) — or now, if they do.
|
|
2007
|
+
if (DecisionService.getInstance())
|
|
2008
|
+
await approvals.restore();
|
|
2009
|
+
approvals.start();
|
|
2010
|
+
}
|
|
2011
|
+
catch (error) {
|
|
2012
|
+
this.logger.warn('Browser approval cards not started', {
|
|
2013
|
+
error: error instanceof Error ? error.message : String(error),
|
|
2014
|
+
});
|
|
2015
|
+
}
|
|
1970
2016
|
this.logger.info('Live browser view started');
|
|
1971
2017
|
}
|
|
1972
2018
|
catch (error) {
|
|
@@ -2489,6 +2535,11 @@ export class CrewlyServer {
|
|
|
2489
2535
|
cronTaskId: task.id,
|
|
2490
2536
|
targetTeamId: task.targetTeamId,
|
|
2491
2537
|
firedSlot: slot,
|
|
2538
|
+
[WORK_ITEM_DESTINATION_CONSTANTS.METADATA_KEY]: buildTriggerOrigin({
|
|
2539
|
+
cronTaskId: task.id,
|
|
2540
|
+
teamId: task.targetTeamId,
|
|
2541
|
+
topic: task.taskDescription,
|
|
2542
|
+
}),
|
|
2492
2543
|
},
|
|
2493
2544
|
});
|
|
2494
2545
|
await TaskPoolService.getInstance().addToPool(workItem);
|
|
@@ -2574,6 +2625,18 @@ export class CrewlyServer {
|
|
|
2574
2625
|
target,
|
|
2575
2626
|
triggerId,
|
|
2576
2627
|
requestId: template.requestId,
|
|
2628
|
+
// Where this fire's output goes (specs/2026-10-01-decision-cards.md §6):
|
|
2629
|
+
// the trigger's destination, else a NEW top-level post in the
|
|
2630
|
+
// target's team channel — never the thread the agent was last asked in.
|
|
2631
|
+
metadata: {
|
|
2632
|
+
...(template.metadata ?? {}),
|
|
2633
|
+
[WORK_ITEM_DESTINATION_CONSTANTS.METADATA_KEY]: buildTriggerOrigin({
|
|
2634
|
+
triggerId,
|
|
2635
|
+
destination: trigger.destination,
|
|
2636
|
+
teamId: trigger.teamId,
|
|
2637
|
+
topic: template.title || trigger.name || 'Scheduled task',
|
|
2638
|
+
}),
|
|
2639
|
+
},
|
|
2577
2640
|
});
|
|
2578
2641
|
// Each fire is a full wake-up for the target. Skip it when the same
|
|
2579
2642
|
// work is still open: an identical item from an earlier fire, or —
|
|
@@ -2841,6 +2904,10 @@ export class CrewlyServer {
|
|
|
2841
2904
|
else {
|
|
2842
2905
|
this.logger.info('Ticket autopilot off (CREWLY_TICKET_AUTOPILOT=0)');
|
|
2843
2906
|
}
|
|
2907
|
+
// Decision cards (specs/2026-10-01-decision-cards.md): structured owner
|
|
2908
|
+
// questions posted by the responsible agent's own bot, answered by
|
|
2909
|
+
// button / reaction / thread reply / dashboard; deadlines applied here.
|
|
2910
|
+
await this.startDecisionCards();
|
|
2844
2911
|
}
|
|
2845
2912
|
catch (autoClaimErr) {
|
|
2846
2913
|
this.logger.warn('AgentAutoClaimService initialization failed (non-critical)', {
|
|
@@ -4542,6 +4609,72 @@ export class CrewlyServer {
|
|
|
4542
4609
|
*
|
|
4543
4610
|
* @param chatV2 - The chat-v2 service (turn events, system notes)
|
|
4544
4611
|
*/
|
|
4612
|
+
/**
|
|
4613
|
+
* Start decision cards: the service, its Slack listeners and its deadline tick.
|
|
4614
|
+
*/
|
|
4615
|
+
async startDecisionCards() {
|
|
4616
|
+
try {
|
|
4617
|
+
const { createDecisionService, attachDecisionSlackListeners } = await import('./services/decisions/decision.wiring.js');
|
|
4618
|
+
const { DecisionService } = await import('./services/decisions/decision.service.js');
|
|
4619
|
+
const RUNNING = new Set(['running', 'accepted', 'proposed']);
|
|
4620
|
+
const decisions = createDecisionService({
|
|
4621
|
+
crewlyHome: this.config.crewlyHome,
|
|
4622
|
+
getTeams: () => this.storageService.getTeams(),
|
|
4623
|
+
sendToAgent: async (session, text) => {
|
|
4624
|
+
let exists = false;
|
|
4625
|
+
try {
|
|
4626
|
+
exists = getSessionBackendSync()?.sessionExists(session) ?? false;
|
|
4627
|
+
}
|
|
4628
|
+
catch {
|
|
4629
|
+
exists = false;
|
|
4630
|
+
}
|
|
4631
|
+
if (!exists) {
|
|
4632
|
+
const { activateAgentBySession } = await import('./controllers/team/team.controller.js');
|
|
4633
|
+
await activateAgentBySession(this.apiController, session).catch(() => undefined);
|
|
4634
|
+
}
|
|
4635
|
+
const result = await this.apiController.agentRegistrationService.sendMessageToAgent(session, text);
|
|
4636
|
+
return result.success;
|
|
4637
|
+
},
|
|
4638
|
+
sendToOrchestrator: async (text) => {
|
|
4639
|
+
this.messageQueueService.enqueue({ content: text, conversationId: 'system', source: 'system_event' });
|
|
4640
|
+
return true;
|
|
4641
|
+
},
|
|
4642
|
+
currentWorkItemId: async (session) => {
|
|
4643
|
+
const items = await TaskPoolService.getInstance().getAllItems().catch(() => []);
|
|
4644
|
+
const mine = items
|
|
4645
|
+
.filter((wi) => wi.target === session && RUNNING.has(wi.status))
|
|
4646
|
+
.sort((a, b) => Date.parse(b.startedAt ?? b.createdAt) - Date.parse(a.startedAt ?? a.createdAt));
|
|
4647
|
+
return mine[0]?.id;
|
|
4648
|
+
},
|
|
4649
|
+
workDestination: async (session) => {
|
|
4650
|
+
try {
|
|
4651
|
+
const { resolveAgentSlackDestination } = await import('./services/orc/work-item-destination.wiring.js');
|
|
4652
|
+
return await resolveAgentSlackDestination(session);
|
|
4653
|
+
}
|
|
4654
|
+
catch {
|
|
4655
|
+
return null;
|
|
4656
|
+
}
|
|
4657
|
+
},
|
|
4658
|
+
});
|
|
4659
|
+
DecisionService.getInstance()?.stop();
|
|
4660
|
+
DecisionService.setInstance(decisions);
|
|
4661
|
+
attachDecisionSlackListeners(decisions);
|
|
4662
|
+
decisions.start();
|
|
4663
|
+
this.logger.info('Decision cards started');
|
|
4664
|
+
}
|
|
4665
|
+
catch (error) {
|
|
4666
|
+
this.logger.warn('Decision cards not started', { error: error instanceof Error ? error.message : String(error) });
|
|
4667
|
+
}
|
|
4668
|
+
// Held browser actions from before the restart: re-attach or expire
|
|
4669
|
+
// (after the decision service, so expired cards are updated).
|
|
4670
|
+
try {
|
|
4671
|
+
const { BrowserApprovalService } = await import('./services/browser/browser-approval.service.js');
|
|
4672
|
+
await BrowserApprovalService.getInstance()?.restore();
|
|
4673
|
+
}
|
|
4674
|
+
catch (error) {
|
|
4675
|
+
this.logger.warn('Held browser actions not restored', { error: error instanceof Error ? error.message : String(error) });
|
|
4676
|
+
}
|
|
4677
|
+
}
|
|
4545
4678
|
async startOwnerMessageWatchdog(chatV2) {
|
|
4546
4679
|
try {
|
|
4547
4680
|
const wiring = await import('./services/messaging/owner-message-watchdog.wiring.js');
|