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.
- package/config/hooks/agent-status/report.sh +5 -5
- package/dist/backend/backend/src/constants.d.ts +80 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +80 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +9 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +161 -2
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/board/board-activity.normalizer.d.ts +17 -0
- package/dist/backend/backend/src/services/board/board-activity.normalizer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/board/board-activity.normalizer.js +8 -5
- package/dist/backend/backend/src/services/board/board-activity.normalizer.js.map +1 -1
- package/dist/backend/backend/src/services/board/board-activity.tracker.d.ts +5 -0
- package/dist/backend/backend/src/services/board/board-activity.tracker.d.ts.map +1 -1
- package/dist/backend/backend/src/services/board/board-activity.tracker.js +25 -1
- package/dist/backend/backend/src/services/board/board-activity.tracker.js.map +1 -1
- package/dist/backend/backend/src/services/board/board-interaction-hooks.d.ts +34 -0
- package/dist/backend/backend/src/services/board/board-interaction-hooks.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/board-interaction-hooks.js +60 -0
- package/dist/backend/backend/src/services/board/board-interaction-hooks.js.map +1 -0
- package/dist/backend/backend/src/services/board/board-interactions.d.ts +54 -0
- package/dist/backend/backend/src/services/board/board-interactions.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/board-interactions.js +92 -0
- package/dist/backend/backend/src/services/board/board-interactions.js.map +1 -0
- package/dist/backend/backend/src/services/board/board-links.d.ts +51 -0
- package/dist/backend/backend/src/services/board/board-links.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/board-links.js +168 -0
- package/dist/backend/backend/src/services/board/board-links.js.map +1 -0
- package/dist/backend/backend/src/services/board/board-push.service.d.ts +28 -3
- package/dist/backend/backend/src/services/board/board-push.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/board/board-push.service.js +108 -9
- package/dist/backend/backend/src/services/board/board-push.service.js.map +1 -1
- package/dist/backend/backend/src/services/board/board-snapshot.builder.d.ts +39 -2
- package/dist/backend/backend/src/services/board/board-snapshot.builder.d.ts.map +1 -1
- package/dist/backend/backend/src/services/board/board-snapshot.builder.js +85 -8
- package/dist/backend/backend/src/services/board/board-snapshot.builder.js.map +1 -1
- package/dist/backend/backend/src/services/board/board.sources.d.ts.map +1 -1
- package/dist/backend/backend/src/services/board/board.sources.js +27 -1
- package/dist/backend/backend/src/services/board/board.sources.js.map +1 -1
- package/dist/backend/backend/src/services/board/board.types.d.ts +48 -0
- package/dist/backend/backend/src/services/board/board.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/board/board.types.js +9 -1
- package/dist/backend/backend/src/services/board/board.types.js.map +1 -1
- package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.d.ts +122 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.js +339 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.js.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-redact.d.ts +44 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-redact.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-redact.js +161 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-redact.js.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.d.ts +57 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.js +164 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.js.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.d.ts +140 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.js +300 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.js.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.d.ts +99 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.js +223 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.js.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.d.ts +126 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.js +385 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.js.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-wiring.d.ts +103 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-wiring.js +124 -0
- package/dist/backend/backend/src/services/board/canvas/canvas-wiring.js.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas.types.d.ts +88 -0
- package/dist/backend/backend/src/services/board/canvas/canvas.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/board/canvas/canvas.types.js +8 -0
- package/dist/backend/backend/src/services/board/canvas/canvas.types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +80 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +80 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- 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":";AA4CA,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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"}
|
|
@@ -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);
|