crewly 1.11.5 → 1.12.0
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/skills/agent/onboarding/synthesize-hierarchy/SKILL.md +65 -0
- package/config/skills/agent/onboarding/synthesize-hierarchy/execute.sh +61 -0
- package/config/skills/agent/web-search/SKILL.md +70 -0
- package/config/skills/agent/web-search/execute.sh +170 -0
- package/config/skills/agent/web-search/skill.json +23 -0
- package/dist/backend/backend/src/constants.d.ts +34 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +34 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +22 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +58 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +3 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.d.ts +27 -0
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.js +108 -0
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.d.ts +6 -2
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.js +9 -3
- package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +36 -2
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +18 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +24 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +90 -0
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/backup/backup-archive.service.js +309 -0
- package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -0
- package/dist/backend/backend/src/services/backup/backup-cloud.client.d.ts +75 -0
- package/dist/backend/backend/src/services/backup/backup-cloud.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/backup/backup-cloud.client.js +134 -0
- package/dist/backend/backend/src/services/backup/backup-cloud.client.js.map +1 -0
- package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts +78 -0
- package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/backup/backup-restore.service.js +358 -0
- package/dist/backend/backend/src/services/backup/backup-restore.service.js.map +1 -0
- package/dist/backend/backend/src/services/backup/backup.types.d.ts +163 -0
- package/dist/backend/backend/src/services/backup/backup.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/backup/backup.types.js +13 -0
- package/dist/backend/backend/src/services/backup/backup.types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +29 -2
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +97 -13
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts +102 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +164 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -0
- package/dist/backend/backend/src/services/fission/fission-guard.service.d.ts +21 -0
- package/dist/backend/backend/src/services/fission/fission-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/fission/fission-guard.service.js +30 -0
- package/dist/backend/backend/src/services/fission/fission-guard.service.js.map +1 -1
- package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.d.ts +4 -0
- package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.js +8 -0
- package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.d.ts +79 -58
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +140 -65
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.d.ts +117 -0
- package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.js +189 -0
- package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.js.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/onboarding-mode-loader.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding-mode-loader.js +1 -0
- package/dist/backend/backend/src/services/orchestrator/onboarding-mode-loader.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding-mode.skill-allowlist.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding-mode.skill-allowlist.js +2 -0
- package/dist/backend/backend/src/services/orchestrator/onboarding-mode.skill-allowlist.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js +17 -1
- package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +50 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +71 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +18 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +75 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +115 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +189 -3
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +28 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js +61 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +67 -2
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts +19 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.js +39 -2
- package/dist/backend/backend/src/services/v3/cascade-request-status.js.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts +41 -0
- package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.js +169 -0
- package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-cascade.subscriber.d.ts +4 -1
- package/dist/backend/backend/src/services/v3/request-cascade.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-cascade.subscriber.js +21 -0
- package/dist/backend/backend/src/services/v3/request-cascade.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/intent-task.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/intent-task.types.js +8 -0
- package/dist/backend/backend/src/types/intent-task.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts +1 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.js +1 -0
- package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +34 -1
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +34 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts +70 -0
- package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts.map +1 -0
- package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.js +427 -0
- package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.js.map +1 -0
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +90 -0
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/backup/backup-archive.service.js +309 -0
- package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -0
- package/dist/cli/backend/src/services/backup/backup-cloud.client.d.ts +75 -0
- package/dist/cli/backend/src/services/backup/backup-cloud.client.d.ts.map +1 -0
- package/dist/cli/backend/src/services/backup/backup-cloud.client.js +134 -0
- package/dist/cli/backend/src/services/backup/backup-cloud.client.js.map +1 -0
- package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts +78 -0
- package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/backup/backup-restore.service.js +358 -0
- package/dist/cli/backend/src/services/backup/backup-restore.service.js.map +1 -0
- package/dist/cli/backend/src/services/backup/backup.types.d.ts +163 -0
- package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/backup/backup.types.js +13 -0
- package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts +410 -0
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js +863 -0
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +292 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +1093 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +328 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +171 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -0
- package/dist/cli/backend/src/services/cloud/device-identity.service.d.ts +89 -0
- package/dist/cli/backend/src/services/cloud/device-identity.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/cloud/device-identity.service.js +148 -0
- package/dist/cli/backend/src/services/cloud/device-identity.service.js.map +1 -0
- package/dist/cli/backend/src/services/user/user-identity.service.d.ts +86 -0
- package/dist/cli/backend/src/services/user/user-identity.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/user/user-identity.service.js +190 -0
- package/dist/cli/backend/src/services/user/user-identity.service.js.map +1 -0
- package/dist/cli/cli/src/commands/backup.d.ts +31 -0
- package/dist/cli/cli/src/commands/backup.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/backup.js +280 -0
- package/dist/cli/cli/src/commands/backup.js.map +1 -0
- package/dist/cli/cli/src/index.js +10 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/package.json +9 -3
- package/packages/crewly-agent/README.md +27 -0
- package/packages/crewly-agent/bin/crewly-agent +33 -0
- package/packages/crewly-agent/package.json +39 -0
- package/packages/crewly-agent/src/cli.ts +168 -0
- package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +2355 -0
- package/packages/crewly-agent/src/runtime/agent-runner.service.ts +1827 -0
- package/packages/crewly-agent/src/runtime/agent-stream.service.test.ts +153 -0
- package/packages/crewly-agent/src/runtime/agent-stream.service.ts +225 -0
- package/packages/crewly-agent/src/runtime/agent-worker.test.ts +171 -0
- package/packages/crewly-agent/src/runtime/agent-worker.ts +193 -0
- package/packages/crewly-agent/src/runtime/api-client.ts +143 -0
- package/packages/crewly-agent/src/runtime/approval-queue.service.ts +307 -0
- package/packages/crewly-agent/src/runtime/audit-log.service.test.ts +208 -0
- package/packages/crewly-agent/src/runtime/audit-log.service.ts +332 -0
- package/packages/crewly-agent/src/runtime/audit-trail.service.test.ts +178 -0
- package/packages/crewly-agent/src/runtime/audit-trail.service.ts +151 -0
- package/packages/crewly-agent/src/runtime/auditor-tools.test.ts +274 -0
- package/packages/crewly-agent/src/runtime/auditor-tools.ts +311 -0
- package/packages/crewly-agent/src/runtime/cloud-config.ts +67 -0
- package/packages/crewly-agent/src/runtime/deepseek-sse-transform.test.ts +165 -0
- package/packages/crewly-agent/src/runtime/deepseek-sse-transform.ts +168 -0
- package/packages/crewly-agent/src/runtime/env-isolation.service.ts +246 -0
- package/packages/crewly-agent/src/runtime/in-process-log-buffer.test.ts +280 -0
- package/packages/crewly-agent/src/runtime/in-process-log-buffer.ts +317 -0
- package/packages/crewly-agent/src/runtime/index.ts +38 -0
- package/packages/crewly-agent/src/runtime/mcp-tool-bridge.test.ts +352 -0
- package/packages/crewly-agent/src/runtime/mcp-tool-bridge.ts +244 -0
- package/packages/crewly-agent/src/runtime/model-manager.test.ts +326 -0
- package/packages/crewly-agent/src/runtime/model-manager.ts +363 -0
- package/packages/crewly-agent/src/runtime/output-filter.service.ts +175 -0
- package/packages/crewly-agent/src/runtime/prompt-guard.service.ts +303 -0
- package/packages/crewly-agent/src/runtime/rate-limiter.test.ts +228 -0
- package/packages/crewly-agent/src/runtime/rate-limiter.ts +353 -0
- package/packages/crewly-agent/src/runtime/tool-registry.test.ts +2510 -0
- package/packages/crewly-agent/src/runtime/tool-registry.ts +2104 -0
- package/packages/crewly-agent/src/runtime/types.test.ts +519 -0
- package/packages/crewly-agent/src/runtime/types.ts +637 -0
- package/packages/crewly-agent/src/runtime/web-search.tool.test.ts +131 -0
- package/packages/crewly-agent/src/runtime/web-search.tool.ts +140 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `crewly backup` — workspace backup CLI (P0: local `create`).
|
|
3
|
+
*
|
|
4
|
+
* Builds a portable `.tar.gz` of this machine's workspace (CREWLY_HOME globals
|
|
5
|
+
* + each project's `.crewly/` + chat.db) that can later be restored on another
|
|
6
|
+
* machine. Runs fully locally and offline. Cloud push/pull/list (Pro-gated)
|
|
7
|
+
* land in later phases. See specs/2026-06-07-workspace-backup.md.
|
|
8
|
+
*
|
|
9
|
+
* @module cli/commands/backup
|
|
10
|
+
*/
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import os from 'os';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import fs from 'fs';
|
|
15
|
+
import fsp from 'fs/promises';
|
|
16
|
+
import { BackupArchiveService } from '../../../backend/src/services/backup/backup-archive.service.js';
|
|
17
|
+
import { BackupRestoreService, RestoreConflictError } from '../../../backend/src/services/backup/backup-restore.service.js';
|
|
18
|
+
import { BackupCloudClient, BackupNotProError, } from '../../../backend/src/services/backup/backup-cloud.client.js';
|
|
19
|
+
import { getCrewlyHomePath } from '../../../backend/src/services/core/crewly-home.utils.js';
|
|
20
|
+
import { CloudClientService } from '../../../backend/src/services/cloud/cloud-client.service.js';
|
|
21
|
+
/** Human-readable byte size. */
|
|
22
|
+
function humanBytes(n) {
|
|
23
|
+
if (n < 1024)
|
|
24
|
+
return `${n} B`;
|
|
25
|
+
const units = ['KB', 'MB', 'GB'];
|
|
26
|
+
let v = n / 1024;
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (v >= 1024 && i < units.length - 1) {
|
|
29
|
+
v /= 1024;
|
|
30
|
+
i += 1;
|
|
31
|
+
}
|
|
32
|
+
return `${v.toFixed(1)} ${units[i]}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Best-effort source device id from CREWLY_HOME/device.json.
|
|
36
|
+
*
|
|
37
|
+
* @param home - CREWLY_HOME path
|
|
38
|
+
* @returns device id or null
|
|
39
|
+
*/
|
|
40
|
+
function readDeviceId(home) {
|
|
41
|
+
try {
|
|
42
|
+
const raw = fs.readFileSync(path.join(home, 'device.json'), 'utf8');
|
|
43
|
+
const parsed = JSON.parse(raw);
|
|
44
|
+
return parsed.id ?? parsed.deviceId ?? null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* `crewly backup <action>` dispatcher.
|
|
52
|
+
*
|
|
53
|
+
* @param action - Subcommand: `create` (P0). Others are placeholders.
|
|
54
|
+
* @param options - CLI options
|
|
55
|
+
*/
|
|
56
|
+
export async function backupCommand(action, target, options = {}) {
|
|
57
|
+
switch (action) {
|
|
58
|
+
case 'create':
|
|
59
|
+
await runCreate(options);
|
|
60
|
+
break;
|
|
61
|
+
case 'restore':
|
|
62
|
+
await runRestore(target, options);
|
|
63
|
+
break;
|
|
64
|
+
case 'push':
|
|
65
|
+
await withCloudErrors(() => runPush(options));
|
|
66
|
+
break;
|
|
67
|
+
case 'pull':
|
|
68
|
+
await withCloudErrors(() => runPull(target, options));
|
|
69
|
+
break;
|
|
70
|
+
case 'list':
|
|
71
|
+
await withCloudErrors(() => runList());
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
console.log(chalk.red(`Unknown backup action: ${action}`));
|
|
75
|
+
console.log(chalk.gray('Usage: crewly backup create [--out <file>] [--no-chat-db]'));
|
|
76
|
+
console.log(chalk.gray(' crewly backup restore <file> [--mode overwrite] [--map OLD=NEW] [--apply]'));
|
|
77
|
+
process.exitCode = 1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build a local workspace archive and print a summary.
|
|
82
|
+
*
|
|
83
|
+
* @param options - CLI options
|
|
84
|
+
*/
|
|
85
|
+
async function runCreate(options) {
|
|
86
|
+
const home = getCrewlyHomePath();
|
|
87
|
+
const createdAt = new Date().toISOString();
|
|
88
|
+
const excludeChatDb = options.chatDb === false; // commander: --no-chat-db → chatDb:false
|
|
89
|
+
console.log(chalk.cyan('Creating workspace backup…'));
|
|
90
|
+
console.log(chalk.gray(` CREWLY_HOME: ${home}`));
|
|
91
|
+
const svc = new BackupArchiveService();
|
|
92
|
+
const { archivePath, manifest, totalBytes } = await svc.createArchive({
|
|
93
|
+
homePath: home,
|
|
94
|
+
outPath: options.out,
|
|
95
|
+
excludeChatDb,
|
|
96
|
+
createdAt,
|
|
97
|
+
sourceDeviceId: readDeviceId(home),
|
|
98
|
+
sourceDeviceName: os.hostname(),
|
|
99
|
+
});
|
|
100
|
+
const archiveBytes = fs.statSync(archivePath).size;
|
|
101
|
+
console.log(chalk.green('\n✓ Backup created'));
|
|
102
|
+
console.log(` ${chalk.bold('Archive')} ${archivePath}`);
|
|
103
|
+
console.log(` ${chalk.bold('Size')} ${humanBytes(archiveBytes)} compressed (${humanBytes(totalBytes)} raw)`);
|
|
104
|
+
console.log(` ${chalk.bold('Globals')} ${manifest.global.length} files`);
|
|
105
|
+
console.log(` ${chalk.bold('Projects')} ${manifest.projects.length}`);
|
|
106
|
+
console.log(` ${chalk.bold('chat.db')} ${manifest.chatDb.included ? `included (${humanBytes(manifest.chatDb.bytes ?? 0)})` : `excluded${manifest.chatDb.skippedReason ? ` — ${manifest.chatDb.skippedReason}` : ''}`}`);
|
|
107
|
+
console.log(chalk.gray('\n Restore on another machine with: crewly backup restore <file>'));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Restore a workspace archive. Dry-run preview by default; `--apply` to commit.
|
|
111
|
+
*
|
|
112
|
+
* @param target - Archive file path
|
|
113
|
+
* @param options - CLI options (mode/map/apply)
|
|
114
|
+
*/
|
|
115
|
+
async function runRestore(target, options) {
|
|
116
|
+
if (!target) {
|
|
117
|
+
console.log(chalk.red('Missing archive path. Usage: crewly backup restore <file> [--apply]'));
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const home = getCrewlyHomePath();
|
|
122
|
+
const mode = options.mode === 'overwrite' ? 'overwrite' : 'abort';
|
|
123
|
+
const pathMap = {};
|
|
124
|
+
for (const m of options.map ?? []) {
|
|
125
|
+
const eq = m.indexOf('=');
|
|
126
|
+
if (eq <= 0) {
|
|
127
|
+
console.log(chalk.red(`Invalid --map "${m}" (expected OLD=NEW)`));
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
pathMap[m.slice(0, eq)] = m.slice(eq + 1);
|
|
132
|
+
}
|
|
133
|
+
const svc = new BackupRestoreService();
|
|
134
|
+
const restoreOpts = { archivePath: target, homePath: home, mode: mode, pathMap, now: new Date().toISOString() };
|
|
135
|
+
// Always show the plan first.
|
|
136
|
+
const plan = await svc.preview(restoreOpts);
|
|
137
|
+
console.log(chalk.cyan('\nRestore plan'));
|
|
138
|
+
console.log(` ${chalk.bold('From backup')} taken ${plan.manifestCreatedAt} (source home ${plan.sourceHomePath})`);
|
|
139
|
+
console.log(` ${chalk.bold('Into')} ${home}`);
|
|
140
|
+
console.log(` ${chalk.bold('Globals')} ${plan.globalFileCount} files · ${chalk.bold('chat.db')} ${plan.chatDbIncluded ? 'yes' : 'no'}`);
|
|
141
|
+
console.log(` ${chalk.bold('Projects')}`);
|
|
142
|
+
for (const p of plan.projects) {
|
|
143
|
+
const tgt = p.targetPath ? p.targetPath + (p.targetExists ? '' : ' (will be created)') : chalk.yellow('UNRESOLVED — pass --map');
|
|
144
|
+
console.log(` • ${p.name} → ${tgt}`);
|
|
145
|
+
}
|
|
146
|
+
if (plan.conflicts.teams.length || plan.conflicts.projects.length) {
|
|
147
|
+
console.log(chalk.yellow(` Conflicts: ${plan.conflicts.teams.length} team(s), ${plan.conflicts.projects.length} project(s) already on this machine`));
|
|
148
|
+
}
|
|
149
|
+
for (const w of plan.warnings)
|
|
150
|
+
console.log(chalk.yellow(` ⚠ ${w}`));
|
|
151
|
+
console.log(chalk.gray(` Discards: ${plan.discarded.join(', ')}`));
|
|
152
|
+
if (!options.apply) {
|
|
153
|
+
console.log(chalk.gray('\n Dry-run only. Re-run with --apply to restore.'));
|
|
154
|
+
if (!plan.ok)
|
|
155
|
+
console.log(chalk.yellow(" Note: conflicts present — add --mode overwrite (a pre-restore snapshot is always saved)."));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
console.log(chalk.cyan('\nApplying restore…'));
|
|
160
|
+
const res = await svc.restore(restoreOpts);
|
|
161
|
+
console.log(chalk.green('\n✓ Restore complete'));
|
|
162
|
+
console.log(` ${chalk.bold('Globals')} ${res.restoredGlobalFiles} files`);
|
|
163
|
+
console.log(` ${chalk.bold('Projects')} ${res.restoredProjects}`);
|
|
164
|
+
console.log(` ${chalk.bold('chat.db')} ${res.chatDbRestored ? 'restored' : 'not in backup'}`);
|
|
165
|
+
console.log(` ${chalk.bold('Rollback')} ${res.rollbackSnapshotPath}`);
|
|
166
|
+
console.log(chalk.gray('\n Restart Crewly so agents pick up the restored workspace.'));
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
if (err instanceof RestoreConflictError) {
|
|
170
|
+
console.log(chalk.red('\n✗ Restore aborted — conflicts present. Re-run with --mode overwrite to replace them.'));
|
|
171
|
+
process.exitCode = 1;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
throw err;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Cloud (Pro): push / pull / list
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
/** Thrown when there's no persisted Crewly Cloud connection. */
|
|
181
|
+
class CloudNotConnectedError extends Error {
|
|
182
|
+
constructor() {
|
|
183
|
+
super('Not connected to Crewly Cloud.');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Resolve the Cloud API base URL + access token from the persisted config
|
|
188
|
+
* (~/.crewly/cloud/config.json). Read directly (not via CloudClientService)
|
|
189
|
+
* so this one-shot CLI doesn't start the singleton's relay-token refresh timer.
|
|
190
|
+
*
|
|
191
|
+
* @returns Cloud base URL + token + tier
|
|
192
|
+
* @throws CloudNotConnectedError when not connected
|
|
193
|
+
*/
|
|
194
|
+
async function resolveCloudAuth() {
|
|
195
|
+
try {
|
|
196
|
+
const raw = await fsp.readFile(CloudClientService.getConfigPath(), 'utf8');
|
|
197
|
+
const cfg = JSON.parse(raw);
|
|
198
|
+
if (cfg.cloudUrl && cfg.token)
|
|
199
|
+
return { baseUrl: cfg.cloudUrl, token: cfg.token, tier: cfg.tier ?? 'free' };
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
/* fall through to not-connected */
|
|
203
|
+
}
|
|
204
|
+
throw new CloudNotConnectedError();
|
|
205
|
+
}
|
|
206
|
+
/** Wrap a cloud action, mapping not-Pro / not-connected to friendly messages. */
|
|
207
|
+
async function withCloudErrors(fn) {
|
|
208
|
+
try {
|
|
209
|
+
await fn();
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
if (err instanceof BackupNotProError) {
|
|
213
|
+
console.log(chalk.yellow('\n⚠ Cloud backup is a Pro feature.'));
|
|
214
|
+
console.log(chalk.gray(` ${err.message}`));
|
|
215
|
+
process.exitCode = 1;
|
|
216
|
+
}
|
|
217
|
+
else if (err instanceof CloudNotConnectedError) {
|
|
218
|
+
console.log(chalk.red('\nNot connected to Crewly Cloud. Run: crewly cloud login'));
|
|
219
|
+
process.exitCode = 1;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
throw err;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/** `crewly backup push` — create a local archive and upload it to the cloud. */
|
|
227
|
+
async function runPush(options) {
|
|
228
|
+
const auth = await resolveCloudAuth();
|
|
229
|
+
const home = getCrewlyHomePath();
|
|
230
|
+
const deviceName = os.hostname();
|
|
231
|
+
const deviceId = readDeviceId(home);
|
|
232
|
+
console.log(chalk.cyan('Creating workspace backup…'));
|
|
233
|
+
const svc = new BackupArchiveService();
|
|
234
|
+
const { archivePath, manifest } = await svc.createArchive({
|
|
235
|
+
homePath: home,
|
|
236
|
+
excludeChatDb: options.chatDb === false,
|
|
237
|
+
createdAt: new Date().toISOString(),
|
|
238
|
+
sourceDeviceId: deviceId,
|
|
239
|
+
sourceDeviceName: deviceName,
|
|
240
|
+
});
|
|
241
|
+
console.log(chalk.cyan('Uploading to Crewly Cloud…'));
|
|
242
|
+
const client = new BackupCloudClient({ baseUrl: auth.baseUrl, token: auth.token });
|
|
243
|
+
const item = await client.push(archivePath, { deviceName, deviceId: deviceId ?? undefined });
|
|
244
|
+
console.log(chalk.green('\n✓ Backup pushed to cloud'));
|
|
245
|
+
console.log(` ${chalk.bold('Backup id')} ${item.backupId}`);
|
|
246
|
+
console.log(` ${chalk.bold('Size')} ${humanBytes(item.sizeBytes)} · chat.db ${manifest.chatDb.included ? 'yes' : 'no'}`);
|
|
247
|
+
console.log(chalk.gray(`\n Restore on another machine: crewly backup pull ${item.backupId} --apply`));
|
|
248
|
+
}
|
|
249
|
+
/** `crewly backup pull <id>` — download a cloud snapshot and restore it. */
|
|
250
|
+
async function runPull(backupId, options) {
|
|
251
|
+
if (!backupId) {
|
|
252
|
+
console.log(chalk.red('Missing backup id. Usage: crewly backup pull <id> [--apply]'));
|
|
253
|
+
process.exitCode = 1;
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const auth = await resolveCloudAuth();
|
|
257
|
+
const client = new BackupCloudClient({ baseUrl: auth.baseUrl, token: auth.token });
|
|
258
|
+
const dest = path.join(os.tmpdir(), `crewly-pull-${backupId.replace(/[^\w.-]/g, '_')}.tar.gz`);
|
|
259
|
+
console.log(chalk.cyan(`Downloading backup ${backupId} from cloud…`));
|
|
260
|
+
await client.pull(backupId, dest);
|
|
261
|
+
console.log(chalk.gray(` Saved to ${dest}`));
|
|
262
|
+
// Hand off to the restore flow (dry-run by default; --apply commits).
|
|
263
|
+
await runRestore(dest, options);
|
|
264
|
+
}
|
|
265
|
+
/** `crewly backup list` — show this account's cloud snapshots. */
|
|
266
|
+
async function runList() {
|
|
267
|
+
const auth = await resolveCloudAuth();
|
|
268
|
+
const client = new BackupCloudClient({ baseUrl: auth.baseUrl, token: auth.token });
|
|
269
|
+
const items = await client.list();
|
|
270
|
+
if (items.length === 0) {
|
|
271
|
+
console.log(chalk.gray('No cloud backups yet. Create one with: crewly backup push'));
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
console.log(chalk.cyan(`\nCloud backups (${items.length})`));
|
|
275
|
+
for (const it of items) {
|
|
276
|
+
console.log(` ${chalk.bold(it.backupId)} ${it.createdAt} ${humanBytes(it.sizeBytes)} ${it.deviceName ?? ''}`);
|
|
277
|
+
}
|
|
278
|
+
console.log(chalk.gray('\n Restore: crewly backup pull <id> --apply'));
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../../../cli/src/commands/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { mcpServerCommand } from './commands/mcp-server.js';
|
|
|
13
13
|
import { publishCommand } from './commands/publish.js';
|
|
14
14
|
import { seedMarketplaceCommand } from './commands/seed-marketplace.js';
|
|
15
15
|
import { serviceCommand } from './commands/service.js';
|
|
16
|
+
import { backupCommand } from './commands/backup.js';
|
|
16
17
|
import { pairCommand } from './commands/pair.js';
|
|
17
18
|
import { loginCommand, statusCommand as cloudStatusCommand, logoutCommand } from './commands/cloud.js';
|
|
18
19
|
import { DEFAULT_WEB_PORT } from './constants.js';
|
|
@@ -106,6 +107,15 @@ program
|
|
|
106
107
|
.option('-n, --lines <number>', 'Number of log lines to show (default: 50)')
|
|
107
108
|
.option('-f, --follow', 'Follow log output in real-time (logs action)')
|
|
108
109
|
.action(serviceCommand);
|
|
110
|
+
program
|
|
111
|
+
.command('backup <action> [target]')
|
|
112
|
+
.description('Workspace backup: create | restore <file>. Archive this machine to restore on another. Pro: cloud push/pull (soon)')
|
|
113
|
+
.option('-o, --out <file>', 'Output archive path (create)')
|
|
114
|
+
.option('--no-chat-db', 'Exclude chat.db from the archive (create)')
|
|
115
|
+
.option('--mode <mode>', 'Restore conflict mode: abort (default) | overwrite')
|
|
116
|
+
.option('--map <mapping...>', 'Restore source→target path remap, OLD=NEW (repeatable)')
|
|
117
|
+
.option('--apply', 'Apply the restore (without this, restore is a dry-run preview)')
|
|
118
|
+
.action(backupCommand);
|
|
109
119
|
program
|
|
110
120
|
.command('pair')
|
|
111
121
|
.description('Pair two Crewly instances via Cloud Relay for remote collaboration')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../cli/src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../cli/src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crewly",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Multi-agent orchestration platform for AI coding teams — coordinates Claude Code, Gemini CLI, and Codex agents with a real-time web dashboard",
|
|
6
6
|
"workspaces": [
|
|
@@ -26,7 +26,11 @@
|
|
|
26
26
|
"frontend/dist/assets/*.woff2",
|
|
27
27
|
"frontend/dist/logo/",
|
|
28
28
|
"README.md",
|
|
29
|
-
"LICENSE"
|
|
29
|
+
"LICENSE",
|
|
30
|
+
"packages/crewly-agent/bin/",
|
|
31
|
+
"packages/crewly-agent/src/",
|
|
32
|
+
"packages/crewly-agent/package.json",
|
|
33
|
+
"packages/crewly-agent/README.md"
|
|
30
34
|
],
|
|
31
35
|
"scripts": {
|
|
32
36
|
"build": "npm run build:backend && npm run build:frontend && npm run build:cli",
|
|
@@ -109,7 +113,9 @@
|
|
|
109
113
|
"tar": "^7.5.9",
|
|
110
114
|
"uuid": "^9.0.0",
|
|
111
115
|
"ws": "^8.14.2",
|
|
112
|
-
"yaml": "^2.3.2"
|
|
116
|
+
"yaml": "^2.3.2",
|
|
117
|
+
"tsx": "^4.21.0",
|
|
118
|
+
"zod": "^3.25.76"
|
|
113
119
|
},
|
|
114
120
|
"devDependencies": {
|
|
115
121
|
"@playwright/test": "^1.55.0",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# crewly-agent
|
|
2
|
+
|
|
3
|
+
Standalone Crewly Agent executable for the OSS `crewly-agent` runtime.
|
|
4
|
+
|
|
5
|
+
It speaks a newline-delimited JSON protocol over `stdin` / `stdout`:
|
|
6
|
+
|
|
7
|
+
- `init`
|
|
8
|
+
- `run`
|
|
9
|
+
- `abort`
|
|
10
|
+
- `get-state`
|
|
11
|
+
- `shutdown`
|
|
12
|
+
|
|
13
|
+
The OSS backend manages the process through
|
|
14
|
+
`CrewlyAgentExternalRuntimeService` and surfaces logs through the existing
|
|
15
|
+
non-PTY monitoring path.
|
|
16
|
+
|
|
17
|
+
Current default OSS runtime command:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
crewly-agent
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Intended release model:
|
|
24
|
+
|
|
25
|
+
- `crewly` OSS owns orchestration, sessions, storage, and UI
|
|
26
|
+
- `crewly-agent` owns the agent runtime executable
|
|
27
|
+
- `crewly-pro` can distribute or enable `crewly-agent` without OSS importing Pro code
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Resolve the package directory even when installed as a dependency and
|
|
5
|
+
# invoked via a hoisted symlink (e.g. node_modules/.bin/crewly-agent ->
|
|
6
|
+
# ../crewly-agent/bin/crewly-agent).
|
|
7
|
+
SOURCE="${BASH_SOURCE[0]}"
|
|
8
|
+
while [ -L "${SOURCE}" ]; do
|
|
9
|
+
DIR="$(cd -P -- "$(dirname -- "${SOURCE}")" && pwd)"
|
|
10
|
+
SOURCE="$(readlink -- "${SOURCE}")"
|
|
11
|
+
[[ "${SOURCE}" != /* ]] && SOURCE="${DIR}/${SOURCE}"
|
|
12
|
+
done
|
|
13
|
+
SCRIPT_DIR="$(cd -P -- "$(dirname -- "${SOURCE}")" && pwd)"
|
|
14
|
+
PACKAGE_DIR="$(cd -P -- "${SCRIPT_DIR}/.." && pwd)"
|
|
15
|
+
|
|
16
|
+
# Find tsx — first try this package's own node_modules (standalone install),
|
|
17
|
+
# then resolve it RELATIVE TO THIS PACKAGE (not the cwd). The latter matters
|
|
18
|
+
# because the engine spawns this binary with cwd set to the agent's project
|
|
19
|
+
# directory (outside the crewly install), and as a hoisted workspace package
|
|
20
|
+
# our tsx lives in the parent install's node_modules. Passing `paths:
|
|
21
|
+
# [PACKAGE_DIR]` walks up from packages/crewly-agent → <install>/node_modules,
|
|
22
|
+
# independent of cwd. (A bare require.resolve would resolve from cwd and miss it.)
|
|
23
|
+
TSX_PATH="${PACKAGE_DIR}/node_modules/tsx/dist/cli.mjs"
|
|
24
|
+
if [ ! -f "${TSX_PATH}" ]; then
|
|
25
|
+
TSX_PATH="$(node -e "const o={paths:['${PACKAGE_DIR}']}; try { console.log(require.resolve('tsx/dist/cli.mjs', o)); } catch (e) { try { console.log(require.resolve('tsx/cli', o)); } catch (e2) {} }" 2>/dev/null || true)"
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
if [ -z "${TSX_PATH}" ] || [ ! -f "${TSX_PATH}" ]; then
|
|
29
|
+
echo "crewly-agent: cannot locate tsx — install via 'npm install crewly-agent' so tsx is present in node_modules." >&2
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
exec node "${TSX_PATH}" "${PACKAGE_DIR}/src/cli.ts" "$@"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "crewly-agent",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"private": true,
|
|
6
|
+
"description": "Crewly Agent runtime — the canonical agent reasoning loop crewly spawns as a subprocess. Talks newline-delimited JSON over stdin/stdout. Vendored into the crewly monorepo (formerly the standalone crewly-agent repo).",
|
|
7
|
+
"bin": {
|
|
8
|
+
"crewly-agent": "./bin/crewly-agent"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin/",
|
|
12
|
+
"src/runtime/",
|
|
13
|
+
"src/cli.ts",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"start": "./bin/crewly-agent",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
23
|
+
"vitest": "^3.2.4"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@ai-sdk/anthropic": "^3.0.58",
|
|
27
|
+
"@ai-sdk/google": "^3.0.43",
|
|
28
|
+
"@ai-sdk/openai": "^3.0.41",
|
|
29
|
+
"ai": "^6.0.116",
|
|
30
|
+
"better-sqlite3": "^12.10.0",
|
|
31
|
+
"ollama-ai-provider": "^1.2.0",
|
|
32
|
+
"tsx": "^4.21.0",
|
|
33
|
+
"zod": "^3.25.76"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=20.0.0"
|
|
37
|
+
},
|
|
38
|
+
"license": "MIT"
|
|
39
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --import tsx
|
|
2
|
+
|
|
3
|
+
import readline from 'node:readline';
|
|
4
|
+
import { AgentRunnerService } from './runtime/agent-runner.service.js';
|
|
5
|
+
import type {
|
|
6
|
+
AgentRunResult,
|
|
7
|
+
CrewlyAgentConfig,
|
|
8
|
+
StreamingEventCallbacks,
|
|
9
|
+
} from './runtime/types.js';
|
|
10
|
+
|
|
11
|
+
type ParentMessage =
|
|
12
|
+
| { type: 'init'; config: CrewlyAgentConfig }
|
|
13
|
+
| { type: 'run'; message: string; conversationId?: string; metadata?: Record<string, string> }
|
|
14
|
+
| { type: 'abort' }
|
|
15
|
+
| { type: 'get-state' }
|
|
16
|
+
| { type: 'shutdown' };
|
|
17
|
+
|
|
18
|
+
type WorkerMessage =
|
|
19
|
+
| { type: 'ready' }
|
|
20
|
+
| { type: 'result'; data: AgentRunResult }
|
|
21
|
+
| { type: 'error'; error: string; code?: string }
|
|
22
|
+
| { type: 'log'; level: 'debug' | 'info' | 'warn' | 'error'; message: string }
|
|
23
|
+
| { type: 'stream'; event: 'text'; data: { chunk: string } }
|
|
24
|
+
| { type: 'stream'; event: 'toolStart'; data: { toolName: string; args: Record<string, unknown> } }
|
|
25
|
+
| { type: 'stream'; event: 'toolFinish'; data: { toolName: string; args: Record<string, unknown>; result: unknown; durationMs: number } }
|
|
26
|
+
| { type: 'stream'; event: 'stepFinish'; data: { stepIndex: number; hasToolCalls: boolean } }
|
|
27
|
+
| { type: 'state'; data: { historyLength: number; isProcessing: boolean; isInitialized: boolean } };
|
|
28
|
+
|
|
29
|
+
let runner: AgentRunnerService | null = null;
|
|
30
|
+
let currentAbort: AbortController | null = null;
|
|
31
|
+
|
|
32
|
+
function send(message: WorkerMessage): void {
|
|
33
|
+
process.stdout.write(`${JSON.stringify(message)}\n`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function log(level: WorkerMessage extends { type: 'log'; level: infer L } ? L : never, message: string): void {
|
|
37
|
+
send({ type: 'log', level: level as 'debug' | 'info' | 'warn' | 'error', message });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function buildStreamingCallbacks(): StreamingEventCallbacks {
|
|
41
|
+
return {
|
|
42
|
+
onTextChunk: (chunk: string) => {
|
|
43
|
+
send({ type: 'stream', event: 'text', data: { chunk } });
|
|
44
|
+
},
|
|
45
|
+
onToolCallStart: (toolName: string, args: Record<string, unknown>) => {
|
|
46
|
+
send({ type: 'stream', event: 'toolStart', data: { toolName, args } });
|
|
47
|
+
},
|
|
48
|
+
onToolCallFinish: (toolName: string, args: Record<string, unknown>, result: unknown, durationMs: number) => {
|
|
49
|
+
send({ type: 'stream', event: 'toolFinish', data: { toolName, args, result, durationMs } });
|
|
50
|
+
},
|
|
51
|
+
onStepFinish: (stepIndex: number, hasToolCalls: boolean) => {
|
|
52
|
+
send({ type: 'stream', event: 'stepFinish', data: { stepIndex, hasToolCalls } });
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function handleMessage(message: ParentMessage): Promise<void> {
|
|
58
|
+
switch (message.type) {
|
|
59
|
+
case 'init':
|
|
60
|
+
try {
|
|
61
|
+
runner = new AgentRunnerService(message.config);
|
|
62
|
+
await runner.initialize();
|
|
63
|
+
send({ type: 'ready' });
|
|
64
|
+
log('info', `Initialized (${message.config.model.provider}/${message.config.model.modelId})`);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
send({
|
|
67
|
+
type: 'error',
|
|
68
|
+
error: error instanceof Error ? error.message : String(error),
|
|
69
|
+
code: 'INIT_FAILED',
|
|
70
|
+
});
|
|
71
|
+
runner = null;
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
case 'run':
|
|
75
|
+
if (!runner || !runner.isInitialized()) {
|
|
76
|
+
send({ type: 'error', error: 'Worker not initialized', code: 'NOT_INITIALIZED' });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
currentAbort = new AbortController();
|
|
80
|
+
try {
|
|
81
|
+
const result = await runner.run(
|
|
82
|
+
message.message,
|
|
83
|
+
message.conversationId,
|
|
84
|
+
message.metadata,
|
|
85
|
+
{
|
|
86
|
+
abortSignal: currentAbort.signal,
|
|
87
|
+
streaming: buildStreamingCallbacks(),
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
currentAbort = null;
|
|
91
|
+
send({ type: 'result', data: result });
|
|
92
|
+
} catch (error) {
|
|
93
|
+
currentAbort = null;
|
|
94
|
+
send({
|
|
95
|
+
type: 'error',
|
|
96
|
+
error: error instanceof Error ? error.message : String(error),
|
|
97
|
+
code: 'RUN_FAILED',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
case 'abort':
|
|
102
|
+
if (currentAbort) {
|
|
103
|
+
currentAbort.abort();
|
|
104
|
+
currentAbort = null;
|
|
105
|
+
}
|
|
106
|
+
runner?.abortCurrentRun();
|
|
107
|
+
log('warn', 'Run aborted by parent');
|
|
108
|
+
break;
|
|
109
|
+
case 'get-state':
|
|
110
|
+
send({
|
|
111
|
+
type: 'state',
|
|
112
|
+
data: {
|
|
113
|
+
historyLength: runner ? runner.getHistoryLength() : 0,
|
|
114
|
+
isProcessing: runner ? runner.isProcessing() : false,
|
|
115
|
+
isInitialized: runner ? runner.isInitialized() : false,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
break;
|
|
119
|
+
case 'shutdown':
|
|
120
|
+
log('info', 'Shutting down');
|
|
121
|
+
if (runner) {
|
|
122
|
+
await runner.shutdown();
|
|
123
|
+
runner = null;
|
|
124
|
+
}
|
|
125
|
+
process.exit(0);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const rl = readline.createInterface({
|
|
130
|
+
input: process.stdin,
|
|
131
|
+
crlfDelay: Infinity,
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
rl.on('line', (line) => {
|
|
135
|
+
const trimmed = line.trim();
|
|
136
|
+
if (!trimmed) return;
|
|
137
|
+
let message: ParentMessage;
|
|
138
|
+
try {
|
|
139
|
+
message = JSON.parse(trimmed) as ParentMessage;
|
|
140
|
+
} catch {
|
|
141
|
+
send({ type: 'error', error: `Invalid JSON input: ${trimmed}`, code: 'INVALID_JSON' });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
handleMessage(message).catch((error) => {
|
|
146
|
+
send({
|
|
147
|
+
type: 'error',
|
|
148
|
+
error: error instanceof Error ? error.message : String(error),
|
|
149
|
+
code: 'UNHANDLED',
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
process.on('SIGINT', async () => {
|
|
155
|
+
if (runner) {
|
|
156
|
+
await runner.shutdown();
|
|
157
|
+
}
|
|
158
|
+
process.exit(0);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
process.on('SIGTERM', async () => {
|
|
162
|
+
if (runner) {
|
|
163
|
+
await runner.shutdown();
|
|
164
|
+
}
|
|
165
|
+
process.exit(0);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
log('info', 'crewly-agent executable started');
|