crewly 1.20.307 → 1.20.309

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 (93) hide show
  1. package/config/hooks/agent-status/report.sh +5 -5
  2. package/dist/backend/backend/src/constants.d.ts +80 -0
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +80 -0
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/index.d.ts +9 -0
  7. package/dist/backend/backend/src/index.d.ts.map +1 -1
  8. package/dist/backend/backend/src/index.js +161 -2
  9. package/dist/backend/backend/src/index.js.map +1 -1
  10. package/dist/backend/backend/src/services/board/board-activity.normalizer.d.ts +17 -0
  11. package/dist/backend/backend/src/services/board/board-activity.normalizer.d.ts.map +1 -1
  12. package/dist/backend/backend/src/services/board/board-activity.normalizer.js +8 -5
  13. package/dist/backend/backend/src/services/board/board-activity.normalizer.js.map +1 -1
  14. package/dist/backend/backend/src/services/board/board-activity.tracker.d.ts +5 -0
  15. package/dist/backend/backend/src/services/board/board-activity.tracker.d.ts.map +1 -1
  16. package/dist/backend/backend/src/services/board/board-activity.tracker.js +25 -1
  17. package/dist/backend/backend/src/services/board/board-activity.tracker.js.map +1 -1
  18. package/dist/backend/backend/src/services/board/board-interaction-hooks.d.ts +34 -0
  19. package/dist/backend/backend/src/services/board/board-interaction-hooks.d.ts.map +1 -0
  20. package/dist/backend/backend/src/services/board/board-interaction-hooks.js +60 -0
  21. package/dist/backend/backend/src/services/board/board-interaction-hooks.js.map +1 -0
  22. package/dist/backend/backend/src/services/board/board-interactions.d.ts +54 -0
  23. package/dist/backend/backend/src/services/board/board-interactions.d.ts.map +1 -0
  24. package/dist/backend/backend/src/services/board/board-interactions.js +92 -0
  25. package/dist/backend/backend/src/services/board/board-interactions.js.map +1 -0
  26. package/dist/backend/backend/src/services/board/board-links.d.ts +51 -0
  27. package/dist/backend/backend/src/services/board/board-links.d.ts.map +1 -0
  28. package/dist/backend/backend/src/services/board/board-links.js +168 -0
  29. package/dist/backend/backend/src/services/board/board-links.js.map +1 -0
  30. package/dist/backend/backend/src/services/board/board-push.service.d.ts +28 -3
  31. package/dist/backend/backend/src/services/board/board-push.service.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/board/board-push.service.js +108 -9
  33. package/dist/backend/backend/src/services/board/board-push.service.js.map +1 -1
  34. package/dist/backend/backend/src/services/board/board-snapshot.builder.d.ts +39 -2
  35. package/dist/backend/backend/src/services/board/board-snapshot.builder.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/board/board-snapshot.builder.js +85 -8
  37. package/dist/backend/backend/src/services/board/board-snapshot.builder.js.map +1 -1
  38. package/dist/backend/backend/src/services/board/board.sources.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/board/board.sources.js +27 -1
  40. package/dist/backend/backend/src/services/board/board.sources.js.map +1 -1
  41. package/dist/backend/backend/src/services/board/board.types.d.ts +48 -0
  42. package/dist/backend/backend/src/services/board/board.types.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/board/board.types.js +9 -1
  44. package/dist/backend/backend/src/services/board/board.types.js.map +1 -1
  45. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.d.ts +122 -0
  46. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.js +339 -0
  48. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.js.map +1 -0
  49. package/dist/backend/backend/src/services/board/canvas/canvas-redact.d.ts +44 -0
  50. package/dist/backend/backend/src/services/board/canvas/canvas-redact.d.ts.map +1 -0
  51. package/dist/backend/backend/src/services/board/canvas/canvas-redact.js +161 -0
  52. package/dist/backend/backend/src/services/board/canvas/canvas-redact.js.map +1 -0
  53. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.d.ts +57 -0
  54. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.d.ts.map +1 -0
  55. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.js +164 -0
  56. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.js.map +1 -0
  57. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.d.ts +140 -0
  58. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.d.ts.map +1 -0
  59. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.js +300 -0
  60. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.js.map +1 -0
  61. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.d.ts +99 -0
  62. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.d.ts.map +1 -0
  63. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.js +223 -0
  64. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.js.map +1 -0
  65. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.d.ts +126 -0
  66. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.d.ts.map +1 -0
  67. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.js +385 -0
  68. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.js.map +1 -0
  69. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.d.ts +103 -0
  70. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.d.ts.map +1 -0
  71. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.js +124 -0
  72. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.js.map +1 -0
  73. package/dist/backend/backend/src/services/board/canvas/canvas.types.d.ts +88 -0
  74. package/dist/backend/backend/src/services/board/canvas/canvas.types.d.ts.map +1 -0
  75. package/dist/backend/backend/src/services/board/canvas/canvas.types.js +8 -0
  76. package/dist/backend/backend/src/services/board/canvas/canvas.types.js.map +1 -0
  77. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  78. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
  80. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  81. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
  83. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  84. package/dist/backend/build-info.json +2 -2
  85. package/dist/cli/backend/src/constants.d.ts +80 -0
  86. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  87. package/dist/cli/backend/src/constants.js +80 -0
  88. package/dist/cli/backend/src/constants.js.map +1 -1
  89. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  90. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  91. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  92. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  93. package/package.json +1 -1
@@ -54,6 +54,10 @@ export declare class CrewlyServer {
54
54
  private livenessMonitor;
55
55
  private waitingItemsSync;
56
56
  private ownerBoard;
57
+ /** Canvas: follows the agents' transcripts for their own text lines (crewly#1247 v2) */
58
+ private canvasTail;
59
+ /** Canvas: masked terminal streams the owner opened in the portal */
60
+ private canvasTerminal;
57
61
  /** Epoch ms of the last shutdown signal acted on (dedups process-group delivery) */
58
62
  private lastShutdownSignalAt;
59
63
  /** Interrupted turns loaded at boot, resumed once their agents are back */
@@ -246,6 +250,11 @@ export declare class CrewlyServer {
246
250
  * to Crewly Cloud runs while the machine is signed in. Never throws.
247
251
  */
248
252
  private startOwnerBoard;
253
+ /**
254
+ * Canvas (crewly#1247 v2): follow the agents' transcripts for their own
255
+ * short text lines (and Codex's tool calls). Off with the board push.
256
+ */
257
+ private startCanvasTail;
249
258
  /** Cached project paths for the board's relative file paths. */
250
259
  private boardRootsCache;
251
260
  private boardProjectRoots;
@@ -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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"}
@@ -77,6 +77,8 @@ import { parseSlackThreadKey } from './services/slack/slack-thread-key.js';
77
77
  import { LIVENESS_MONITOR_CONSTANTS, INPUT_CIRCUIT_CONSTANTS, INPUT_BLOCKED_RETRY_CONSTANTS } from './constants.js';
78
78
  import { InputBlockedRetryService } from './services/messaging/input-blocked-retry.service.js';
79
79
  import { driveCapabilities } from './services/drive/drive-agent.service.js';
80
+ import { canvasCapabilities } from './services/board/canvas/canvas-inbound.service.js';
81
+ import { isBoardPushDisabled } from './services/board/board-push.service.js';
80
82
  import { teamMoveCapabilities } from './services/team-move/team-move-driver.service.js';
81
83
  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, TICKET_HYGIENE_CONSTANTS, EXPERIMENT_CONSTANTS, WORK_ITEM_DESTINATION_CONSTANTS, CODEX_USAGE_SYNC_CONSTANTS, ANTIGRAVITY_USAGE_SYNC_CONSTANTS, OWNER_AUTH_CONSTANTS, CREWLY_APPS_CONSTANTS, SLACK_AGENT_DM_CONSTANTS, BRIEFING_CONSTANTS, DRIVE_CONSTANTS, POOL_PRUNE_CONSTANTS } from './constants.js';
82
84
  import { randomUUID } from 'crypto';
@@ -111,6 +113,8 @@ import { setMessageQueueService as setMessagingControllerQueueService } from './
111
113
  import { SystemResourceAlertService } from './services/monitoring/system-resource-alert.service.js';
112
114
  import { TokenUsageService } from './services/monitoring/token-usage.service.js';
113
115
  import { agentHeartbeatMiddleware } from './middleware/agent-heartbeat.middleware.js';
116
+ import { recordTerminalWrites } from './services/board/board-interaction-hooks.js';
117
+ import { resolveMemberSessionName } from './utils/member-session-name.utils.js';
114
118
  import { agentOriginMiddleware, liveSessionPids } from './middleware/agent-origin.middleware.js';
115
119
  import { createCallerIdentityMiddleware } from './middleware/caller-identity.middleware.js';
116
120
  import { bodyParserExcept } from './middleware/body-parser-except.js';
@@ -336,6 +340,10 @@ export class CrewlyServer {
336
340
  livenessMonitor = null;
337
341
  waitingItemsSync = null;
338
342
  ownerBoard = null;
343
+ /** Canvas: follows the agents' transcripts for their own text lines (crewly#1247 v2) */
344
+ canvasTail = null;
345
+ /** Canvas: masked terminal streams the owner opened in the portal */
346
+ canvasTerminal = null;
339
347
  /** Epoch ms of the last shutdown signal acted on (dedups process-group delivery) */
340
348
  lastShutdownSignalAt = 0;
341
349
  /** Interrupted turns loaded at boot, resumed once their agents are back */
@@ -1647,6 +1655,8 @@ export class CrewlyServer {
1647
1655
  this.app.use('/api', createCallerIdentityMiddleware(peerProcesses));
1648
1656
  // Agent heartbeat middleware - any API call with X-Agent-Session header updates heartbeat
1649
1657
  this.app.use('/api', agentHeartbeatMiddleware);
1658
+ // Canvas: an agent writing to another agent's terminal is a message (sender and receiver only)
1659
+ this.app.use('/api', recordTerminalWrites());
1650
1660
  // The dashboard's owner session + CSRF token (GET /api/auth/session).
1651
1661
  this.app.use('/api', createOwnerSessionRouter(peerProcesses));
1652
1662
  // API routes
@@ -2959,6 +2969,78 @@ export class CrewlyServer {
2959
2969
  error: waitingErr instanceof Error ? waitingErr.message : String(waitingErr),
2960
2970
  });
2961
2971
  }
2972
+ // Crewly Canvas (crewly#1247 v2): the owner's actions from the portal
2973
+ // canvas (message an agent, stop it, open its masked terminal) arrive as
2974
+ // `canvas_action` pushes; the handler fetches each with this machine's
2975
+ // token and runs it. Starting it advertises `canvas_actions` to Cloud.
2976
+ try {
2977
+ // The board's kill switch also keeps the canvas actions off this machine
2978
+ if (isBoardPushDisabled())
2979
+ throw new Error('CREWLY_BOARD_PUSH=0');
2980
+ const [{ CanvasInboundService }, { CanvasTerminalService }, { createStopAgent, createSecretsProvider }, { CloudClientService }, { buildAgentRoster }, { intakeChatV2OwnerMessage }, { getTicketIntakeService }, { getBoardService }, { getApiToken }, { internalCredentialHeaders },] = await Promise.all([
2981
+ import('./services/board/canvas/canvas-inbound.service.js'),
2982
+ import('./services/board/canvas/canvas-terminal.service.js'),
2983
+ import('./services/board/canvas/canvas-wiring.js'),
2984
+ import('./services/cloud/cloud-client.service.js'),
2985
+ import('./services/cloud/agent-roster.utils.js'),
2986
+ import('./services/v3/ticket-channel-hooks.js'),
2987
+ import('./services/v3/ticket-intake.service.js'),
2988
+ import('./services/board/board.service.js'),
2989
+ import('./services/core/api-token.service.js'),
2990
+ import('./services/core/owner-auth.service.js'),
2991
+ ]);
2992
+ const cloudClient = CloudClientService.getInstance();
2993
+ const cloud = {
2994
+ getToken: () => cloudClient.getToken(),
2995
+ getCloudUrl: () => cloudClient.getCloudUrl(),
2996
+ tryRefreshToken: () => cloudClient.tryRefreshToken(),
2997
+ };
2998
+ const identity = async () => {
2999
+ const id = await DeviceIdentityService.getInstance().getOrCreateIdentity();
3000
+ return { instanceId: id.deviceId, deviceName: id.deviceName };
3001
+ };
3002
+ const terminal = new CanvasTerminalService({
3003
+ cloud,
3004
+ identity,
3005
+ capture: (session, lines) => getSessionBackendSync()?.captureOutput(session, lines) ?? null,
3006
+ exists: (session) => getSessionBackendSync()?.sessionExists(session) === true,
3007
+ secrets: createSecretsProvider(),
3008
+ });
3009
+ this.canvasTerminal = terminal;
3010
+ new CanvasInboundService({
3011
+ source: sync,
3012
+ cloud,
3013
+ chat: chatService,
3014
+ identity,
3015
+ deliver: async (channel, message) => {
3016
+ const toDispatch = await intakeChatV2OwnerMessage(getTicketIntakeService(), channel, message, CLOUD_TALK_CONSTANTS.INTAKE_ORIGIN);
3017
+ await chatDispatcher.dispatchMessage(channel, toDispatch);
3018
+ },
3019
+ agentExists: async (session) => buildAgentRoster(await this.storageService.getTeams()).some((a) => a.agentSession === session),
3020
+ stopAgent: createStopAgent({
3021
+ webPort: this.config.webPort,
3022
+ teams: () => this.storageService.getTeams(),
3023
+ headers: () => {
3024
+ let token = null;
3025
+ try {
3026
+ token = getApiToken();
3027
+ }
3028
+ catch {
3029
+ token = null;
3030
+ }
3031
+ return { ...(token ? { [API_SECURITY_CONSTANTS.TOKEN_HEADER]: token } : {}), ...internalCredentialHeaders('relay') };
3032
+ },
3033
+ }),
3034
+ terminal,
3035
+ // Someone is at the canvas: push live for a while
3036
+ onAction: () => getBoardService()?.push.noteViewer(),
3037
+ }).start();
3038
+ }
3039
+ catch (canvasErr) {
3040
+ this.logger.warn('Canvas action handler wiring skipped', {
3041
+ error: canvasErr instanceof Error ? canvasErr.message : String(canvasErr),
3042
+ });
3043
+ }
2962
3044
  // Mobile app: generic allowlisted REST passthrough over the same
2963
3045
  // relay (api_request → local HTTP → api_response). Non-fatal.
2964
3046
  try {
@@ -5373,7 +5455,7 @@ export class CrewlyServer {
5373
5455
  // whether this machine takes `talk_message` — also for machines
5374
5456
  // without Slack, which never send the registry heartbeat.
5375
5457
  roster: async () => buildAgentRoster(await this.storageService.getTeams()),
5376
- capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
5458
+ capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...canvasCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
5377
5459
  onNewMessage: (listener) => {
5378
5460
  chat.on('chat_message', listener);
5379
5461
  return () => chat.off('chat_message', listener);
@@ -5445,7 +5527,7 @@ export class CrewlyServer {
5445
5527
  agentNames: async () => new Map(buildAgentRoster(await this.storageService.getTeams())
5446
5528
  .filter((a) => a.displayName)
5447
5529
  .map((a) => [a.agentSession, a.displayName])),
5448
- capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
5530
+ capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...canvasCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
5449
5531
  onTicketChange: (listener) => RequestService.getInstance().onChange(() => listener()),
5450
5532
  });
5451
5533
  setWaitingItemsSyncService(service);
@@ -5480,11 +5562,86 @@ export class CrewlyServer {
5480
5562
  setBoardService(service);
5481
5563
  service.start();
5482
5564
  this.ownerBoard = service;
5565
+ // Canvas messaging links: agent chat messages that @mention another agent
5566
+ try {
5567
+ const { recordChatMentions } = await import('./services/board/board-interaction-hooks.js');
5568
+ let ids = { at: 0, map: new Map() };
5569
+ const refresh = () => {
5570
+ void this.storageService.getTeams().then((teams) => {
5571
+ const map = new Map();
5572
+ for (const team of teams)
5573
+ for (const m of team.members ?? []) {
5574
+ if (!m?.id)
5575
+ continue;
5576
+ const session = resolveMemberSessionName(team.name, m);
5577
+ map.set(m.id, session);
5578
+ map.set(session, session);
5579
+ }
5580
+ map.set(ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_SESSION_NAME);
5581
+ ids = { at: Date.now(), map };
5582
+ }).catch(() => undefined);
5583
+ };
5584
+ refresh();
5585
+ getChatV2Service().on('chat_message', (dto) => {
5586
+ if (dto.senderType !== 'agent' || !dto.mentions?.length)
5587
+ return;
5588
+ if (Date.now() - ids.at > 30_000)
5589
+ refresh();
5590
+ recordChatMentions(dto, (id) => ids.map.get(id));
5591
+ });
5592
+ }
5593
+ catch {
5594
+ /* messaging links are optional */
5595
+ }
5596
+ await this.startCanvasTail(service);
5483
5597
  }
5484
5598
  catch (error) {
5485
5599
  this.logger.warn('Owner board not started (non-fatal)', { error: error instanceof Error ? error.message : String(error) });
5486
5600
  }
5487
5601
  }
5602
+ /**
5603
+ * Canvas (crewly#1247 v2): follow the agents' transcripts for their own
5604
+ * short text lines (and Codex's tool calls). Off with the board push.
5605
+ */
5606
+ async startCanvasTail(service) {
5607
+ try {
5608
+ if (service.push.disabled)
5609
+ return;
5610
+ const [{ TranscriptTailService }, { createTranscriptLocator, createSecretsProvider }, recovery] = await Promise.all([
5611
+ import('./services/board/canvas/canvas-transcript.tail.js'),
5612
+ import('./services/board/canvas/canvas-wiring.js'),
5613
+ import('./services/agent/runtime-session-recovery.js'),
5614
+ ]);
5615
+ const { findCodexRollout } = await import('./services/monitoring/codex-rollout-sync.service.js');
5616
+ const persistence = getSessionStatePersistence();
5617
+ const locate = createTranscriptLocator({
5618
+ meta: (session) => {
5619
+ try {
5620
+ return persistence.getSessionMetadata(session);
5621
+ }
5622
+ catch {
5623
+ return undefined;
5624
+ }
5625
+ },
5626
+ claudeHomes: (meta) => [meta.env?.CLAUDE_CONFIG_DIR, recovery.defaultClaudeHome()].filter((h) => typeof h === 'string' && h.length > 0),
5627
+ findClaude: recovery.findClaudeTranscript,
5628
+ codexHome: recovery.defaultCodexHome,
5629
+ findCodex: findCodexRollout,
5630
+ });
5631
+ this.canvasTail = new TranscriptTailService({
5632
+ steps: service.tracker.steps,
5633
+ sessions: () => service.builder.knownSessions(),
5634
+ locate,
5635
+ roots: (session) => this.boardProjectRoots(session),
5636
+ secrets: createSecretsProvider(),
5637
+ isLive: () => service.push.isLive(),
5638
+ });
5639
+ this.canvasTail.start();
5640
+ }
5641
+ catch (error) {
5642
+ this.logger.warn('Canvas transcript tail not started (non-fatal)', { error: error instanceof Error ? error.message : String(error) });
5643
+ }
5644
+ }
5488
5645
  /** Cached project paths for the board's relative file paths. */
5489
5646
  boardRootsCache = { at: 0, roots: [] };
5490
5647
  boardProjectRoots(_session) {
@@ -6807,6 +6964,8 @@ export class CrewlyServer {
6807
6964
  this.conversationCloudSync?.stop();
6808
6965
  this.waitingItemsSync?.stop();
6809
6966
  this.ownerBoard?.stop();
6967
+ this.canvasTail?.stop();
6968
+ this.canvasTerminal?.closeAll();
6810
6969
  // Safe restart: stop delivering, wait for agents mid-turn, persist the rest.
6811
6970
  // Runs before the force-exit timer below, which only bounds the teardown.
6812
6971
  await this.drainInFlightTurns(options.reason ?? 'shutdown', options.drain !== false);