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.
Files changed (208) hide show
  1. package/config/skills/agent/onboarding/synthesize-hierarchy/SKILL.md +65 -0
  2. package/config/skills/agent/onboarding/synthesize-hierarchy/execute.sh +61 -0
  3. package/config/skills/agent/web-search/SKILL.md +70 -0
  4. package/config/skills/agent/web-search/execute.sh +170 -0
  5. package/config/skills/agent/web-search/skill.json +23 -0
  6. package/dist/backend/backend/src/constants.d.ts +34 -1
  7. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  8. package/dist/backend/backend/src/constants.js +34 -1
  9. package/dist/backend/backend/src/constants.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +22 -0
  11. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  12. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +58 -0
  13. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  14. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +3 -1
  16. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.d.ts +27 -0
  18. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.d.ts.map +1 -1
  19. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.js +108 -0
  20. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.controller.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.d.ts +6 -2
  22. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.js +9 -3
  24. package/dist/backend/backend/src/controllers/orchestrator-onboarding/orchestrator-onboarding.routes.js.map +1 -1
  25. package/dist/backend/backend/src/index.d.ts.map +1 -1
  26. package/dist/backend/backend/src/index.js +36 -2
  27. package/dist/backend/backend/src/index.js.map +1 -1
  28. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +18 -0
  29. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +24 -2
  31. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +90 -0
  33. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -0
  34. package/dist/backend/backend/src/services/backup/backup-archive.service.js +309 -0
  35. package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -0
  36. package/dist/backend/backend/src/services/backup/backup-cloud.client.d.ts +75 -0
  37. package/dist/backend/backend/src/services/backup/backup-cloud.client.d.ts.map +1 -0
  38. package/dist/backend/backend/src/services/backup/backup-cloud.client.js +134 -0
  39. package/dist/backend/backend/src/services/backup/backup-cloud.client.js.map +1 -0
  40. package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts +78 -0
  41. package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts.map +1 -0
  42. package/dist/backend/backend/src/services/backup/backup-restore.service.js +358 -0
  43. package/dist/backend/backend/src/services/backup/backup-restore.service.js.map +1 -0
  44. package/dist/backend/backend/src/services/backup/backup.types.d.ts +163 -0
  45. package/dist/backend/backend/src/services/backup/backup.types.d.ts.map +1 -0
  46. package/dist/backend/backend/src/services/backup/backup.types.js +13 -0
  47. package/dist/backend/backend/src/services/backup/backup.types.js.map +1 -0
  48. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +29 -2
  49. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +97 -13
  51. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  52. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts +102 -0
  53. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +164 -0
  55. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -0
  56. package/dist/backend/backend/src/services/fission/fission-guard.service.d.ts +21 -0
  57. package/dist/backend/backend/src/services/fission/fission-guard.service.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/fission/fission-guard.service.js +30 -0
  59. package/dist/backend/backend/src/services/fission/fission-guard.service.js.map +1 -1
  60. package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.d.ts +4 -0
  61. package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.js +8 -0
  63. package/dist/backend/backend/src/services/intent-task/intent-classifier.rules.js.map +1 -1
  64. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.d.ts +79 -58
  65. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +140 -65
  67. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js.map +1 -1
  68. package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.d.ts +117 -0
  69. package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.d.ts.map +1 -0
  70. package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.js +189 -0
  71. package/dist/backend/backend/src/services/orchestrator/onboarding/synthesize-hierarchy.js.map +1 -0
  72. package/dist/backend/backend/src/services/orchestrator/onboarding-mode-loader.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/orchestrator/onboarding-mode-loader.js +1 -0
  74. package/dist/backend/backend/src/services/orchestrator/onboarding-mode-loader.js.map +1 -1
  75. package/dist/backend/backend/src/services/orchestrator/onboarding-mode.skill-allowlist.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/orchestrator/onboarding-mode.skill-allowlist.js +2 -0
  77. package/dist/backend/backend/src/services/orchestrator/onboarding-mode.skill-allowlist.js.map +1 -1
  78. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js +17 -1
  80. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js.map +1 -1
  81. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +50 -0
  82. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +71 -0
  84. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  85. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +18 -0
  86. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +75 -1
  88. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +115 -0
  90. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +189 -3
  92. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  93. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +28 -0
  94. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/session/pty/pty-session.js +61 -1
  96. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  97. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/template/template.service.js +67 -2
  99. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  100. package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts +19 -1
  101. package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/v3/cascade-request-status.js +39 -2
  103. package/dist/backend/backend/src/services/v3/cascade-request-status.js.map +1 -1
  104. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts +41 -0
  105. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/v3/escalation-router.service.js +169 -0
  107. package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
  108. package/dist/backend/backend/src/services/v3/request-cascade.subscriber.d.ts +4 -1
  109. package/dist/backend/backend/src/services/v3/request-cascade.subscriber.d.ts.map +1 -1
  110. package/dist/backend/backend/src/services/v3/request-cascade.subscriber.js +21 -0
  111. package/dist/backend/backend/src/services/v3/request-cascade.subscriber.js.map +1 -1
  112. package/dist/backend/backend/src/types/intent-task.types.d.ts.map +1 -1
  113. package/dist/backend/backend/src/types/intent-task.types.js +8 -0
  114. package/dist/backend/backend/src/types/intent-task.types.js.map +1 -1
  115. package/dist/backend/backend/src/types/v2/request.types.d.ts +1 -1
  116. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  117. package/dist/backend/backend/src/types/v2/request.types.js +1 -0
  118. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  119. package/dist/cli/backend/src/constants.d.ts +34 -1
  120. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  121. package/dist/cli/backend/src/constants.js +34 -1
  122. package/dist/cli/backend/src/constants.js.map +1 -1
  123. package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts +70 -0
  124. package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.d.ts.map +1 -0
  125. package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.js +427 -0
  126. package/dist/cli/backend/src/controllers/cloud/cloud-google-auth.controller.js.map +1 -0
  127. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +90 -0
  128. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -0
  129. package/dist/cli/backend/src/services/backup/backup-archive.service.js +309 -0
  130. package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -0
  131. package/dist/cli/backend/src/services/backup/backup-cloud.client.d.ts +75 -0
  132. package/dist/cli/backend/src/services/backup/backup-cloud.client.d.ts.map +1 -0
  133. package/dist/cli/backend/src/services/backup/backup-cloud.client.js +134 -0
  134. package/dist/cli/backend/src/services/backup/backup-cloud.client.js.map +1 -0
  135. package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts +78 -0
  136. package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts.map +1 -0
  137. package/dist/cli/backend/src/services/backup/backup-restore.service.js +358 -0
  138. package/dist/cli/backend/src/services/backup/backup-restore.service.js.map +1 -0
  139. package/dist/cli/backend/src/services/backup/backup.types.d.ts +163 -0
  140. package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -0
  141. package/dist/cli/backend/src/services/backup/backup.types.js +13 -0
  142. package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -0
  143. package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts +410 -0
  144. package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -0
  145. package/dist/cli/backend/src/services/cloud/cloud-client.service.js +863 -0
  146. package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -0
  147. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +292 -0
  148. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -0
  149. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +1093 -0
  150. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -0
  151. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +328 -0
  152. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -0
  153. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +171 -0
  154. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -0
  155. package/dist/cli/backend/src/services/cloud/device-identity.service.d.ts +89 -0
  156. package/dist/cli/backend/src/services/cloud/device-identity.service.d.ts.map +1 -0
  157. package/dist/cli/backend/src/services/cloud/device-identity.service.js +148 -0
  158. package/dist/cli/backend/src/services/cloud/device-identity.service.js.map +1 -0
  159. package/dist/cli/backend/src/services/user/user-identity.service.d.ts +86 -0
  160. package/dist/cli/backend/src/services/user/user-identity.service.d.ts.map +1 -0
  161. package/dist/cli/backend/src/services/user/user-identity.service.js +190 -0
  162. package/dist/cli/backend/src/services/user/user-identity.service.js.map +1 -0
  163. package/dist/cli/cli/src/commands/backup.d.ts +31 -0
  164. package/dist/cli/cli/src/commands/backup.d.ts.map +1 -0
  165. package/dist/cli/cli/src/commands/backup.js +280 -0
  166. package/dist/cli/cli/src/commands/backup.js.map +1 -0
  167. package/dist/cli/cli/src/index.js +10 -0
  168. package/dist/cli/cli/src/index.js.map +1 -1
  169. package/package.json +9 -3
  170. package/packages/crewly-agent/README.md +27 -0
  171. package/packages/crewly-agent/bin/crewly-agent +33 -0
  172. package/packages/crewly-agent/package.json +39 -0
  173. package/packages/crewly-agent/src/cli.ts +168 -0
  174. package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +2355 -0
  175. package/packages/crewly-agent/src/runtime/agent-runner.service.ts +1827 -0
  176. package/packages/crewly-agent/src/runtime/agent-stream.service.test.ts +153 -0
  177. package/packages/crewly-agent/src/runtime/agent-stream.service.ts +225 -0
  178. package/packages/crewly-agent/src/runtime/agent-worker.test.ts +171 -0
  179. package/packages/crewly-agent/src/runtime/agent-worker.ts +193 -0
  180. package/packages/crewly-agent/src/runtime/api-client.ts +143 -0
  181. package/packages/crewly-agent/src/runtime/approval-queue.service.ts +307 -0
  182. package/packages/crewly-agent/src/runtime/audit-log.service.test.ts +208 -0
  183. package/packages/crewly-agent/src/runtime/audit-log.service.ts +332 -0
  184. package/packages/crewly-agent/src/runtime/audit-trail.service.test.ts +178 -0
  185. package/packages/crewly-agent/src/runtime/audit-trail.service.ts +151 -0
  186. package/packages/crewly-agent/src/runtime/auditor-tools.test.ts +274 -0
  187. package/packages/crewly-agent/src/runtime/auditor-tools.ts +311 -0
  188. package/packages/crewly-agent/src/runtime/cloud-config.ts +67 -0
  189. package/packages/crewly-agent/src/runtime/deepseek-sse-transform.test.ts +165 -0
  190. package/packages/crewly-agent/src/runtime/deepseek-sse-transform.ts +168 -0
  191. package/packages/crewly-agent/src/runtime/env-isolation.service.ts +246 -0
  192. package/packages/crewly-agent/src/runtime/in-process-log-buffer.test.ts +280 -0
  193. package/packages/crewly-agent/src/runtime/in-process-log-buffer.ts +317 -0
  194. package/packages/crewly-agent/src/runtime/index.ts +38 -0
  195. package/packages/crewly-agent/src/runtime/mcp-tool-bridge.test.ts +352 -0
  196. package/packages/crewly-agent/src/runtime/mcp-tool-bridge.ts +244 -0
  197. package/packages/crewly-agent/src/runtime/model-manager.test.ts +326 -0
  198. package/packages/crewly-agent/src/runtime/model-manager.ts +363 -0
  199. package/packages/crewly-agent/src/runtime/output-filter.service.ts +175 -0
  200. package/packages/crewly-agent/src/runtime/prompt-guard.service.ts +303 -0
  201. package/packages/crewly-agent/src/runtime/rate-limiter.test.ts +228 -0
  202. package/packages/crewly-agent/src/runtime/rate-limiter.ts +353 -0
  203. package/packages/crewly-agent/src/runtime/tool-registry.test.ts +2510 -0
  204. package/packages/crewly-agent/src/runtime/tool-registry.ts +2104 -0
  205. package/packages/crewly-agent/src/runtime/types.test.ts +519 -0
  206. package/packages/crewly-agent/src/runtime/types.ts +637 -0
  207. package/packages/crewly-agent/src/runtime/web-search.tool.test.ts +131 -0
  208. 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.11.5",
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');