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.
Files changed (166) hide show
  1. package/config/roles/team-leader/prompt.md +2 -2
  2. package/config/roles/team-leader/tl-addon.md +2 -2
  3. package/config/skills/agent/core/ask-owner/SKILL.md +79 -0
  4. package/config/skills/agent/core/ask-owner/execute.sh +66 -0
  5. package/config/skills/agent/core/ask-owner/execute.test.sh +62 -0
  6. package/config/skills/agent/core/project-tickets/SKILL.md +21 -9
  7. package/config/skills/agent/core/project-tickets/execute.sh +28 -9
  8. package/config/skills/agent/core/project-tickets/execute.test.sh +12 -4
  9. package/config/skills/agent/core/reply/SKILL.md +22 -5
  10. package/config/skills/agent/core/reply/execute.sh +12 -5
  11. package/config/skills/agent/core/reply/execute.test.sh +8 -0
  12. package/config/skills/agent/core/schedule-followup/SKILL.md +8 -0
  13. package/config/skills/agent/core/schedule-followup/execute.sh +7 -0
  14. package/config/skills/agent/remote-browser/SKILL.md +28 -8
  15. package/config/slack-app-manifest.json +5 -1
  16. package/config/slack-master-app-manifest.json +7 -2
  17. package/dist/backend/backend/src/constants.d.ts +99 -5
  18. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  19. package/dist/backend/backend/src/constants.js +106 -5
  20. package/dist/backend/backend/src/constants.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +2 -1
  22. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/browser/browser.controller.js +15 -1
  24. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +3 -0
  26. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +54 -1
  28. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  29. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +67 -0
  30. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -0
  31. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +215 -0
  32. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -0
  33. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +8 -5
  34. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  35. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +51 -12
  36. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  37. package/dist/backend/backend/src/index.d.ts +4 -0
  38. package/dist/backend/backend/src/index.d.ts.map +1 -1
  39. package/dist/backend/backend/src/index.js +135 -2
  40. package/dist/backend/backend/src/index.js.map +1 -1
  41. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  42. package/dist/backend/backend/src/routes/api.routes.js +6 -0
  43. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  44. package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts +1 -1
  45. package/dist/backend/backend/src/services/boot/boot-announce.service.js +13 -13
  46. package/dist/backend/backend/src/services/boot/boot-announce.service.js.map +1 -1
  47. package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts +202 -0
  48. package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts.map +1 -0
  49. package/dist/backend/backend/src/services/browser/browser-approval.service.js +533 -0
  50. package/dist/backend/backend/src/services/browser/browser-approval.service.js.map +1 -0
  51. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +24 -0
  52. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  53. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +55 -0
  54. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  55. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +51 -0
  56. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/browser/browser-session.service.js +82 -3
  58. package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
  59. package/dist/backend/backend/src/services/browser/held-action-store.d.ts +125 -0
  60. package/dist/backend/backend/src/services/browser/held-action-store.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/browser/held-action-store.js +141 -0
  62. package/dist/backend/backend/src/services/browser/held-action-store.js.map +1 -0
  63. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +6 -6
  64. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +3 -3
  66. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +14 -13
  68. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
  69. package/dist/backend/backend/src/services/decisions/decision-card.d.ts +155 -0
  70. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -0
  71. package/dist/backend/backend/src/services/decisions/decision-card.js +337 -0
  72. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -0
  73. package/dist/backend/backend/src/services/decisions/decision-contract.d.ts +83 -0
  74. package/dist/backend/backend/src/services/decisions/decision-contract.d.ts.map +1 -0
  75. package/dist/backend/backend/src/services/decisions/decision-contract.js +226 -0
  76. package/dist/backend/backend/src/services/decisions/decision-contract.js.map +1 -0
  77. package/dist/backend/backend/src/services/decisions/decision-routing.d.ts +34 -0
  78. package/dist/backend/backend/src/services/decisions/decision-routing.d.ts.map +1 -0
  79. package/dist/backend/backend/src/services/decisions/decision-routing.js +64 -0
  80. package/dist/backend/backend/src/services/decisions/decision-routing.js.map +1 -0
  81. package/dist/backend/backend/src/services/decisions/decision-store.d.ts +80 -0
  82. package/dist/backend/backend/src/services/decisions/decision-store.d.ts.map +1 -0
  83. package/dist/backend/backend/src/services/decisions/decision-store.js +151 -0
  84. package/dist/backend/backend/src/services/decisions/decision-store.js.map +1 -0
  85. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +338 -0
  86. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -0
  87. package/dist/backend/backend/src/services/decisions/decision.service.js +729 -0
  88. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -0
  89. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +70 -0
  90. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -0
  91. package/dist/backend/backend/src/services/decisions/decision.wiring.js +172 -0
  92. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -0
  93. package/dist/backend/backend/src/services/decisions/ticket-thread-store.d.ts +97 -0
  94. package/dist/backend/backend/src/services/decisions/ticket-thread-store.d.ts.map +1 -0
  95. package/dist/backend/backend/src/services/decisions/ticket-thread-store.js +137 -0
  96. package/dist/backend/backend/src/services/decisions/ticket-thread-store.js.map +1 -0
  97. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +165 -0
  98. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -0
  99. package/dist/backend/backend/src/services/orc/work-item-destination.js +239 -0
  100. package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -0
  101. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +134 -0
  102. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -0
  103. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +217 -0
  104. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -0
  105. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +1 -30
  106. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  107. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +1 -22
  108. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  109. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +2 -15
  110. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
  111. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +8 -22
  112. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
  113. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +11 -12
  114. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  115. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +27 -52
  116. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  117. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +6 -0
  118. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +3 -1
  120. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
  121. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +12 -12
  122. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  123. package/dist/backend/backend/src/services/slack/slack.service.d.ts +16 -1
  124. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  125. package/dist/backend/backend/src/services/slack/slack.service.js +56 -2
  126. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  127. package/dist/backend/backend/src/services/system/auto-update.service.js +2 -2
  128. package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/system/auto-update.utils.js +2 -2
  130. package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -1
  131. package/dist/backend/backend/src/types/decision.types.d.ts +168 -0
  132. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -0
  133. package/dist/backend/backend/src/types/decision.types.js +13 -0
  134. package/dist/backend/backend/src/types/decision.types.js.map +1 -0
  135. package/dist/backend/backend/src/types/slack.types.d.ts +30 -0
  136. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  137. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  138. package/dist/backend/backend/src/types/v2/trigger.types.d.ts +17 -0
  139. package/dist/backend/backend/src/types/v2/trigger.types.d.ts.map +1 -1
  140. package/dist/backend/backend/src/types/v2/trigger.types.js +17 -0
  141. package/dist/backend/backend/src/types/v2/trigger.types.js.map +1 -1
  142. package/dist/backend/build-info.json +2 -2
  143. package/dist/cli/backend/src/constants.d.ts +99 -5
  144. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  145. package/dist/cli/backend/src/constants.js +106 -5
  146. package/dist/cli/backend/src/constants.js.map +1 -1
  147. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +12 -12
  148. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  149. package/dist/cli/backend/src/services/slack/slack.service.d.ts +16 -1
  150. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  151. package/dist/cli/backend/src/services/slack/slack.service.js +56 -2
  152. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  153. package/dist/cli/backend/src/services/system/auto-update.utils.js +2 -2
  154. package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -1
  155. package/dist/cli/backend/src/types/slack.types.d.ts +30 -0
  156. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  157. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  158. package/dist/cli/backend/src/types/v2/trigger.types.d.ts +17 -0
  159. package/dist/cli/backend/src/types/v2/trigger.types.d.ts.map +1 -1
  160. package/dist/cli/backend/src/types/v2/trigger.types.js +17 -0
  161. package/dist/cli/backend/src/types/v2/trigger.types.js.map +1 -1
  162. package/frontend/dist/assets/index-04d192f8.css +42 -0
  163. package/frontend/dist/assets/{index-69af46c3.js → index-4271e95e.js} +259 -259
  164. package/frontend/dist/index.html +2 -2
  165. package/package.json +1 -1
  166. 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":"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"}
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({ extended: true, limit: '10mb' }));
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');