crewly 1.20.307 → 1.20.308
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 +66 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +66 -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 +126 -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-push.service.d.ts +20 -2
- 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 +71 -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 +7 -0
- 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 +2 -0
- 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 +7 -0
- package/dist/backend/backend/src/services/board/board.sources.js.map +1 -1
- package/dist/backend/backend/src/services/board/board.types.d.ts +5 -0
- package/dist/backend/backend/src/services/board/board.types.d.ts.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 +66 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +66 -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';
|
|
@@ -336,6 +338,10 @@ export class CrewlyServer {
|
|
|
336
338
|
livenessMonitor = null;
|
|
337
339
|
waitingItemsSync = null;
|
|
338
340
|
ownerBoard = null;
|
|
341
|
+
/** Canvas: follows the agents' transcripts for their own text lines (crewly#1247 v2) */
|
|
342
|
+
canvasTail = null;
|
|
343
|
+
/** Canvas: masked terminal streams the owner opened in the portal */
|
|
344
|
+
canvasTerminal = null;
|
|
339
345
|
/** Epoch ms of the last shutdown signal acted on (dedups process-group delivery) */
|
|
340
346
|
lastShutdownSignalAt = 0;
|
|
341
347
|
/** Interrupted turns loaded at boot, resumed once their agents are back */
|
|
@@ -2959,6 +2965,78 @@ export class CrewlyServer {
|
|
|
2959
2965
|
error: waitingErr instanceof Error ? waitingErr.message : String(waitingErr),
|
|
2960
2966
|
});
|
|
2961
2967
|
}
|
|
2968
|
+
// Crewly Canvas (crewly#1247 v2): the owner's actions from the portal
|
|
2969
|
+
// canvas (message an agent, stop it, open its masked terminal) arrive as
|
|
2970
|
+
// `canvas_action` pushes; the handler fetches each with this machine's
|
|
2971
|
+
// token and runs it. Starting it advertises `canvas_actions` to Cloud.
|
|
2972
|
+
try {
|
|
2973
|
+
// The board's kill switch also keeps the canvas actions off this machine
|
|
2974
|
+
if (isBoardPushDisabled())
|
|
2975
|
+
throw new Error('CREWLY_BOARD_PUSH=0');
|
|
2976
|
+
const [{ CanvasInboundService }, { CanvasTerminalService }, { createStopAgent, createSecretsProvider }, { CloudClientService }, { buildAgentRoster }, { intakeChatV2OwnerMessage }, { getTicketIntakeService }, { getBoardService }, { getApiToken }, { internalCredentialHeaders },] = await Promise.all([
|
|
2977
|
+
import('./services/board/canvas/canvas-inbound.service.js'),
|
|
2978
|
+
import('./services/board/canvas/canvas-terminal.service.js'),
|
|
2979
|
+
import('./services/board/canvas/canvas-wiring.js'),
|
|
2980
|
+
import('./services/cloud/cloud-client.service.js'),
|
|
2981
|
+
import('./services/cloud/agent-roster.utils.js'),
|
|
2982
|
+
import('./services/v3/ticket-channel-hooks.js'),
|
|
2983
|
+
import('./services/v3/ticket-intake.service.js'),
|
|
2984
|
+
import('./services/board/board.service.js'),
|
|
2985
|
+
import('./services/core/api-token.service.js'),
|
|
2986
|
+
import('./services/core/owner-auth.service.js'),
|
|
2987
|
+
]);
|
|
2988
|
+
const cloudClient = CloudClientService.getInstance();
|
|
2989
|
+
const cloud = {
|
|
2990
|
+
getToken: () => cloudClient.getToken(),
|
|
2991
|
+
getCloudUrl: () => cloudClient.getCloudUrl(),
|
|
2992
|
+
tryRefreshToken: () => cloudClient.tryRefreshToken(),
|
|
2993
|
+
};
|
|
2994
|
+
const identity = async () => {
|
|
2995
|
+
const id = await DeviceIdentityService.getInstance().getOrCreateIdentity();
|
|
2996
|
+
return { instanceId: id.deviceId, deviceName: id.deviceName };
|
|
2997
|
+
};
|
|
2998
|
+
const terminal = new CanvasTerminalService({
|
|
2999
|
+
cloud,
|
|
3000
|
+
identity,
|
|
3001
|
+
capture: (session, lines) => getSessionBackendSync()?.captureOutput(session, lines) ?? null,
|
|
3002
|
+
exists: (session) => getSessionBackendSync()?.sessionExists(session) === true,
|
|
3003
|
+
secrets: createSecretsProvider(),
|
|
3004
|
+
});
|
|
3005
|
+
this.canvasTerminal = terminal;
|
|
3006
|
+
new CanvasInboundService({
|
|
3007
|
+
source: sync,
|
|
3008
|
+
cloud,
|
|
3009
|
+
chat: chatService,
|
|
3010
|
+
identity,
|
|
3011
|
+
deliver: async (channel, message) => {
|
|
3012
|
+
const toDispatch = await intakeChatV2OwnerMessage(getTicketIntakeService(), channel, message, CLOUD_TALK_CONSTANTS.INTAKE_ORIGIN);
|
|
3013
|
+
await chatDispatcher.dispatchMessage(channel, toDispatch);
|
|
3014
|
+
},
|
|
3015
|
+
agentExists: async (session) => buildAgentRoster(await this.storageService.getTeams()).some((a) => a.agentSession === session),
|
|
3016
|
+
stopAgent: createStopAgent({
|
|
3017
|
+
webPort: this.config.webPort,
|
|
3018
|
+
teams: () => this.storageService.getTeams(),
|
|
3019
|
+
headers: () => {
|
|
3020
|
+
let token = null;
|
|
3021
|
+
try {
|
|
3022
|
+
token = getApiToken();
|
|
3023
|
+
}
|
|
3024
|
+
catch {
|
|
3025
|
+
token = null;
|
|
3026
|
+
}
|
|
3027
|
+
return { ...(token ? { [API_SECURITY_CONSTANTS.TOKEN_HEADER]: token } : {}), ...internalCredentialHeaders('relay') };
|
|
3028
|
+
},
|
|
3029
|
+
}),
|
|
3030
|
+
terminal,
|
|
3031
|
+
// Someone is at the canvas: push live for a while
|
|
3032
|
+
onAction: () => getBoardService()?.push.noteViewer(),
|
|
3033
|
+
}).start();
|
|
3034
|
+
}
|
|
3035
|
+
catch (canvasErr) {
|
|
3036
|
+
this.logger.warn('Canvas action handler wiring skipped', {
|
|
3037
|
+
error: canvasErr instanceof Error ? canvasErr.message : String(canvasErr),
|
|
3038
|
+
});
|
|
3039
|
+
}
|
|
2962
3040
|
// Mobile app: generic allowlisted REST passthrough over the same
|
|
2963
3041
|
// relay (api_request → local HTTP → api_response). Non-fatal.
|
|
2964
3042
|
try {
|
|
@@ -5373,7 +5451,7 @@ export class CrewlyServer {
|
|
|
5373
5451
|
// whether this machine takes `talk_message` — also for machines
|
|
5374
5452
|
// without Slack, which never send the registry heartbeat.
|
|
5375
5453
|
roster: async () => buildAgentRoster(await this.storageService.getTeams()),
|
|
5376
|
-
capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
|
|
5454
|
+
capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...canvasCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
|
|
5377
5455
|
onNewMessage: (listener) => {
|
|
5378
5456
|
chat.on('chat_message', listener);
|
|
5379
5457
|
return () => chat.off('chat_message', listener);
|
|
@@ -5445,7 +5523,7 @@ export class CrewlyServer {
|
|
|
5445
5523
|
agentNames: async () => new Map(buildAgentRoster(await this.storageService.getTeams())
|
|
5446
5524
|
.filter((a) => a.displayName)
|
|
5447
5525
|
.map((a) => [a.agentSession, a.displayName])),
|
|
5448
|
-
capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
|
|
5526
|
+
capabilities: () => [...cloudTalkCapabilities(), ...waitingActionCapabilities(), ...canvasCapabilities(), ...talkTranscribeCapabilities(), ...driveCapabilities(), ...teamMoveCapabilities()],
|
|
5449
5527
|
onTicketChange: (listener) => RequestService.getInstance().onChange(() => listener()),
|
|
5450
5528
|
});
|
|
5451
5529
|
setWaitingItemsSyncService(service);
|
|
@@ -5480,11 +5558,55 @@ export class CrewlyServer {
|
|
|
5480
5558
|
setBoardService(service);
|
|
5481
5559
|
service.start();
|
|
5482
5560
|
this.ownerBoard = service;
|
|
5561
|
+
await this.startCanvasTail(service);
|
|
5483
5562
|
}
|
|
5484
5563
|
catch (error) {
|
|
5485
5564
|
this.logger.warn('Owner board not started (non-fatal)', { error: error instanceof Error ? error.message : String(error) });
|
|
5486
5565
|
}
|
|
5487
5566
|
}
|
|
5567
|
+
/**
|
|
5568
|
+
* Canvas (crewly#1247 v2): follow the agents' transcripts for their own
|
|
5569
|
+
* short text lines (and Codex's tool calls). Off with the board push.
|
|
5570
|
+
*/
|
|
5571
|
+
async startCanvasTail(service) {
|
|
5572
|
+
try {
|
|
5573
|
+
if (service.push.disabled)
|
|
5574
|
+
return;
|
|
5575
|
+
const [{ TranscriptTailService }, { createTranscriptLocator, createSecretsProvider }, recovery] = await Promise.all([
|
|
5576
|
+
import('./services/board/canvas/canvas-transcript.tail.js'),
|
|
5577
|
+
import('./services/board/canvas/canvas-wiring.js'),
|
|
5578
|
+
import('./services/agent/runtime-session-recovery.js'),
|
|
5579
|
+
]);
|
|
5580
|
+
const { findCodexRollout } = await import('./services/monitoring/codex-rollout-sync.service.js');
|
|
5581
|
+
const persistence = getSessionStatePersistence();
|
|
5582
|
+
const locate = createTranscriptLocator({
|
|
5583
|
+
meta: (session) => {
|
|
5584
|
+
try {
|
|
5585
|
+
return persistence.getSessionMetadata(session);
|
|
5586
|
+
}
|
|
5587
|
+
catch {
|
|
5588
|
+
return undefined;
|
|
5589
|
+
}
|
|
5590
|
+
},
|
|
5591
|
+
claudeHomes: (meta) => [meta.env?.CLAUDE_CONFIG_DIR, recovery.defaultClaudeHome()].filter((h) => typeof h === 'string' && h.length > 0),
|
|
5592
|
+
findClaude: recovery.findClaudeTranscript,
|
|
5593
|
+
codexHome: recovery.defaultCodexHome,
|
|
5594
|
+
findCodex: findCodexRollout,
|
|
5595
|
+
});
|
|
5596
|
+
this.canvasTail = new TranscriptTailService({
|
|
5597
|
+
steps: service.tracker.steps,
|
|
5598
|
+
sessions: () => service.builder.knownSessions(),
|
|
5599
|
+
locate,
|
|
5600
|
+
roots: (session) => this.boardProjectRoots(session),
|
|
5601
|
+
secrets: createSecretsProvider(),
|
|
5602
|
+
isLive: () => service.push.isLive(),
|
|
5603
|
+
});
|
|
5604
|
+
this.canvasTail.start();
|
|
5605
|
+
}
|
|
5606
|
+
catch (error) {
|
|
5607
|
+
this.logger.warn('Canvas transcript tail not started (non-fatal)', { error: error instanceof Error ? error.message : String(error) });
|
|
5608
|
+
}
|
|
5609
|
+
}
|
|
5488
5610
|
/** Cached project paths for the board's relative file paths. */
|
|
5489
5611
|
boardRootsCache = { at: 0, roots: [] };
|
|
5490
5612
|
boardProjectRoots(_session) {
|
|
@@ -6807,6 +6929,8 @@ export class CrewlyServer {
|
|
|
6807
6929
|
this.conversationCloudSync?.stop();
|
|
6808
6930
|
this.waitingItemsSync?.stop();
|
|
6809
6931
|
this.ownerBoard?.stop();
|
|
6932
|
+
this.canvasTail?.stop();
|
|
6933
|
+
this.canvasTerminal?.closeAll();
|
|
6810
6934
|
// Safe restart: stop delivering, wait for agents mid-turn, persist the rest.
|
|
6811
6935
|
// Runs before the force-exit timer below, which only bounds the teardown.
|
|
6812
6936
|
await this.drainInFlightTurns(options.reason ?? 'shutdown', options.drain !== false);
|