crewly 1.20.302 → 1.20.304
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/roles/developer/prompt.md +7 -0
- package/config/roles/fullstack-dev/prompt.md +7 -0
- package/config/roles/product-manager/prompt.md +7 -0
- package/config/skills/orchestrator/move-team/SKILL.md +53 -0
- package/config/skills/orchestrator/move-team/execute.sh +42 -0
- package/config/skills/orchestrator/usage-categories/SKILL.md +59 -0
- package/config/skills/orchestrator/usage-categories/execute.sh +81 -0
- package/config/skills/orchestrator/usage-categories/execute.test.sh +45 -0
- package/config/skills/orchestrator/usage-report/SKILL.md +71 -0
- package/config/skills/orchestrator/usage-report/execute.sh +84 -0
- package/config/skills/orchestrator/usage-report/execute.test.sh +39 -0
- package/config/skills/team-leader/usage-report/SKILL.md +71 -0
- package/config/skills/team-leader/usage-report/execute.sh +84 -0
- package/config/skills/team-leader/usage-report/execute.test.sh +39 -0
- package/dist/backend/backend/src/constants.d.ts +80 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +80 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts +45 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.js +214 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts +36 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js +158 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js +26 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +10 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +97 -20
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +6 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts +32 -0
- package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js +42 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +26 -6
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js +59 -5
- package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
- 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/core/storage.service.d.ts +18 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +16 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +19 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +46 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +101 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts +58 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js +100 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +3 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +7 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +15 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.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/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +25 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +41 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts +122 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.js +202 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +59 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.js +133 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js +217 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.js +348 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts +209 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.js +504 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +156 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js +462 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts +157 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.js +298 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.d.ts +69 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.js +198 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +121 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.js +462 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts +110 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.js +198 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts +71 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +269 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +42 -2
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-context.service.js +66 -5
- package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-recorder.js +11 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -1
- package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts +28 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.js +67 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts +37 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.js +49 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/index.d.ts +14 -0
- package/dist/backend/backend/src/services/usage-ledger/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/index.js +14 -0
- package/dist/backend/backend/src/services/usage-ledger/index.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts +100 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js +189 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts +41 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.js +71 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts +47 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.js +106 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts +101 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js +263 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts +96 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js +166 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts +90 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js +294 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts +102 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js +314 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts +62 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js +106 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts +52 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js +95 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts +127 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js +19 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts +124 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js +372 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +80 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +80 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +26 -6
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js +59 -5
- package/dist/cli/backend/src/services/agent/resource-mode.service.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/dist/cli/backend/src/services/core/storage.service.d.ts +18 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +16 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +101 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +3 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +41 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +42 -2
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.js +66 -5
- package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-recorder.js +11 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -1
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
- package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
- package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/team-move.js +155 -0
- package/dist/cli/cli/src/commands/team-move.js.map +1 -0
- package/dist/cli/cli/src/index.js +33 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team move exporter (source machine).
|
|
3
|
+
*
|
|
4
|
+
* Collects everything Crewly owns about ONE team into a staging directory,
|
|
5
|
+
* writes a manifest with a hash for every file, runs the secret scan, and (in
|
|
6
|
+
* {@link buildEncryptedPackage}) turns the staging directory into an encrypted
|
|
7
|
+
* `tar.gz` stream.
|
|
8
|
+
*
|
|
9
|
+
* Package layout (POSIX paths):
|
|
10
|
+
*
|
|
11
|
+
* manifest.json
|
|
12
|
+
* team/** the team's folder: config, prompts, norms, SOPs,
|
|
13
|
+
* wiki vault, cron tasks
|
|
14
|
+
* agents/<session>/** agent memory, standing answers, session summaries
|
|
15
|
+
* handover/<file> newest handover notes per agent
|
|
16
|
+
* records/*.json task-pool items, decisions, chat channels and
|
|
17
|
+
* rooms, Slack channel mapping, scheduled messages
|
|
18
|
+
* projects/<id>/data/** `<project>/.crewly/**` (or the package-tree stores)
|
|
19
|
+
*
|
|
20
|
+
* Not in it: credentials, tokens, runtime logins, logs and transcripts,
|
|
21
|
+
* node_modules/build output and repository working trees (the repo list in
|
|
22
|
+
* the manifest lets the target clone them).
|
|
23
|
+
*
|
|
24
|
+
* @module services/team-move/team-move-exporter
|
|
25
|
+
*/
|
|
26
|
+
import type { Project, Team } from '../../types/index.js';
|
|
27
|
+
import { type SecretEnvValue } from '../../utils/secret-env.js';
|
|
28
|
+
import { StagingArea } from './team-move-fs.js';
|
|
29
|
+
import { inspectRepo as defaultInspectRepo } from './team-move-git.js';
|
|
30
|
+
import type { CloudManifestSummary, PackageFileEntry, PackageRepo, TeamMoveManifest } from './team-move.types.js';
|
|
31
|
+
/** Thrown when a repository holds work that exists only on the source. */
|
|
32
|
+
export declare class TeamMoveBlockedError extends Error {
|
|
33
|
+
readonly lines: string[];
|
|
34
|
+
constructor(lines: string[]);
|
|
35
|
+
}
|
|
36
|
+
/** Collaborators of the exporter. */
|
|
37
|
+
export interface ExportDeps {
|
|
38
|
+
/** Crewly home of this machine. */
|
|
39
|
+
home?: string;
|
|
40
|
+
getTeams: () => Promise<Team[]>;
|
|
41
|
+
getProjects: () => Promise<Project[]>;
|
|
42
|
+
crewlyVersion: string;
|
|
43
|
+
source: {
|
|
44
|
+
instanceId: string | null;
|
|
45
|
+
deviceName: string | null;
|
|
46
|
+
};
|
|
47
|
+
/** Exact secret values this machine holds (env, settings). */
|
|
48
|
+
knownSecrets?: () => Promise<SecretEnvValue[]>;
|
|
49
|
+
inspectRepo?: typeof defaultInspectRepo;
|
|
50
|
+
now?: () => string;
|
|
51
|
+
}
|
|
52
|
+
/** Options of one export. */
|
|
53
|
+
export interface ExportOptions {
|
|
54
|
+
teamId: string;
|
|
55
|
+
moveId: string;
|
|
56
|
+
/** Directory the package is assembled in (created). */
|
|
57
|
+
stagingDir: string;
|
|
58
|
+
/** Move although a repository has uncommitted or unpushed work. */
|
|
59
|
+
allowDirty?: boolean;
|
|
60
|
+
/** Leave files with secrets out of the package instead of aborting (only free-form notes and project files). */
|
|
61
|
+
skipFlagged?: boolean;
|
|
62
|
+
}
|
|
63
|
+
/** What an export produced. */
|
|
64
|
+
export interface ExportResult {
|
|
65
|
+
manifest: TeamMoveManifest;
|
|
66
|
+
staging: StagingArea;
|
|
67
|
+
/** What Cloud receives with `package/init`. */
|
|
68
|
+
summary: CloudManifestSummary;
|
|
69
|
+
/** Lines describing uncommitted/unpushed work that was allowed through. */
|
|
70
|
+
dirtyRepos: string[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Prepare a team config for another machine: nothing is running there yet.
|
|
74
|
+
*
|
|
75
|
+
* @param raw - Parsed `config.json`
|
|
76
|
+
* @returns Copy with runtime state cleared
|
|
77
|
+
*/
|
|
78
|
+
export declare function sanitizeTeamForMove(raw: Record<string, unknown>): Record<string, unknown>;
|
|
79
|
+
/** The exporter. */
|
|
80
|
+
export declare class TeamMoveExporter {
|
|
81
|
+
private readonly deps;
|
|
82
|
+
private readonly home;
|
|
83
|
+
private readonly now;
|
|
84
|
+
private readonly inspect;
|
|
85
|
+
constructor(deps: ExportDeps);
|
|
86
|
+
/**
|
|
87
|
+
* Check, before anything is built, that no repository holds work only this
|
|
88
|
+
* machine has. Used by the REST entry point so the owner learns what to
|
|
89
|
+
* push before a move is even requested.
|
|
90
|
+
*
|
|
91
|
+
* @param teamId - Team to move
|
|
92
|
+
* @returns The repos and the lines that block the move
|
|
93
|
+
*/
|
|
94
|
+
checkRepos(teamId: string): Promise<{
|
|
95
|
+
repos: PackageRepo[];
|
|
96
|
+
blocking: string[];
|
|
97
|
+
}>;
|
|
98
|
+
private requireTeam;
|
|
99
|
+
private teamProjects;
|
|
100
|
+
/**
|
|
101
|
+
* Collect, scan and describe the package.
|
|
102
|
+
*
|
|
103
|
+
* @param options - Team, move, staging directory, policy flags
|
|
104
|
+
* @returns Manifest, staging area and the Cloud summary
|
|
105
|
+
* @throws TeamMoveBlockedError for unpushed work; TeamMoveSecretScanError for secrets
|
|
106
|
+
*/
|
|
107
|
+
export(options: ExportOptions): Promise<ExportResult>;
|
|
108
|
+
/** The things a move deliberately leaves out, shown to the owner. */
|
|
109
|
+
private notMovedList;
|
|
110
|
+
/** Global-store records of the team. */
|
|
111
|
+
private collectRecords;
|
|
112
|
+
/**
|
|
113
|
+
* Copy each project's Crewly data under the size caps.
|
|
114
|
+
*
|
|
115
|
+
* @returns Manifest entries of the projects
|
|
116
|
+
*/
|
|
117
|
+
private collectProjects;
|
|
118
|
+
/** Tools and connectors the team's own words mention (prompts, norms, SOPs, cron tasks). */
|
|
119
|
+
private detectNeeds;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The small summary Cloud receives (kept far below its 64 KB limit).
|
|
123
|
+
*
|
|
124
|
+
* @param manifest - Full manifest
|
|
125
|
+
* @returns Summary without file names
|
|
126
|
+
*/
|
|
127
|
+
export declare function summarize(manifest: TeamMoveManifest): CloudManifestSummary;
|
|
128
|
+
/** Result of {@link buildEncryptedPackage}. */
|
|
129
|
+
export interface EncryptedPackage {
|
|
130
|
+
/** Absolute path of the ciphertext file. */
|
|
131
|
+
file: string;
|
|
132
|
+
/** Ciphertext size in bytes. */
|
|
133
|
+
size: number;
|
|
134
|
+
/** Hex SHA-256 of the ciphertext. */
|
|
135
|
+
sha256: string;
|
|
136
|
+
/** Upload chunks (8 MiB each, the last shorter). */
|
|
137
|
+
chunks: number;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Tar+gzip a staging directory and encrypt it for the target.
|
|
141
|
+
*
|
|
142
|
+
* @param stagingDir - Directory built by {@link TeamMoveExporter.export}
|
|
143
|
+
* @param outFile - Where the ciphertext is written
|
|
144
|
+
* @param recipientPublicKey - Target's base64 X25519 public key
|
|
145
|
+
* @param moveId - Move id (bound into the encryption)
|
|
146
|
+
* @returns File, size, hash and chunk count of the ciphertext
|
|
147
|
+
*/
|
|
148
|
+
export declare function buildEncryptedPackage(stagingDir: string, outFile: string, recipientPublicKey: string, moveId: string): Promise<EncryptedPackage>;
|
|
149
|
+
/**
|
|
150
|
+
* Package entries sorted for stable comparisons in tests.
|
|
151
|
+
*
|
|
152
|
+
* @param files - Manifest file entries
|
|
153
|
+
* @returns Paths
|
|
154
|
+
*/
|
|
155
|
+
export declare function packagePaths(files: readonly PackageFileEntry[]): string[];
|
|
156
|
+
//# sourceMappingURL=team-move-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-exporter.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,OAAO,KAAK,EAAE,OAAO,EAAoB,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAI5E,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIxF,OAAO,EAAE,WAAW,EAAa,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAyB,WAAW,IAAI,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAW9F,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAGhB,WAAW,EAEX,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAiC9B,0EAA0E;AAC1E,qBAAa,oBAAqB,SAAQ,KAAK;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE;gBAAf,KAAK,EAAE,MAAM,EAAE;CAIrC;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjE,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,6BAA6B;AAC7B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,+BAA+B;AAC/B,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,+CAA+C;IAC/C,OAAO,EAAE,oBAAoB,CAAC;IAC9B,2EAA2E;IAC3E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzF;AAOD,oBAAoB;AACpB,qBAAa,gBAAgB;IAKf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAEvB,IAAI,EAAE,UAAU;IAM7C;;;;;;;OAOG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;YAOzE,WAAW;YAOX,YAAY;IAK1B;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwI3D,qEAAqE;IACrE,OAAO,CAAC,YAAY;IAWpB,wCAAwC;YAC1B,cAAc;IAkC5B;;;;OAIG;YACW,eAAe;IAuE7B,4FAA4F;YAC9E,WAAW;CAe1B;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAe1E;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAWtJ;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAEzE"}
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team move exporter (source machine).
|
|
3
|
+
*
|
|
4
|
+
* Collects everything Crewly owns about ONE team into a staging directory,
|
|
5
|
+
* writes a manifest with a hash for every file, runs the secret scan, and (in
|
|
6
|
+
* {@link buildEncryptedPackage}) turns the staging directory into an encrypted
|
|
7
|
+
* `tar.gz` stream.
|
|
8
|
+
*
|
|
9
|
+
* Package layout (POSIX paths):
|
|
10
|
+
*
|
|
11
|
+
* manifest.json
|
|
12
|
+
* team/** the team's folder: config, prompts, norms, SOPs,
|
|
13
|
+
* wiki vault, cron tasks
|
|
14
|
+
* agents/<session>/** agent memory, standing answers, session summaries
|
|
15
|
+
* handover/<file> newest handover notes per agent
|
|
16
|
+
* records/*.json task-pool items, decisions, chat channels and
|
|
17
|
+
* rooms, Slack channel mapping, scheduled messages
|
|
18
|
+
* projects/<id>/data/** `<project>/.crewly/**` (or the package-tree stores)
|
|
19
|
+
*
|
|
20
|
+
* Not in it: credentials, tokens, runtime logins, logs and transcripts,
|
|
21
|
+
* node_modules/build output and repository working trees (the repo list in
|
|
22
|
+
* the manifest lets the target clone them).
|
|
23
|
+
*
|
|
24
|
+
* @module services/team-move/team-move-exporter
|
|
25
|
+
*/
|
|
26
|
+
import * as fs from 'node:fs/promises';
|
|
27
|
+
import * as path from 'node:path';
|
|
28
|
+
import { createWriteStream } from 'node:fs';
|
|
29
|
+
import { pipeline } from 'node:stream/promises';
|
|
30
|
+
import { create as tarCreate } from 'tar';
|
|
31
|
+
import { TEAM_MOVE_CONSTANTS } from '../../constants.js';
|
|
32
|
+
import { safeReadJson } from '../../utils/file-io.utils.js';
|
|
33
|
+
import { collectSecretEnvValues } from '../../utils/secret-env.js';
|
|
34
|
+
import { PACKAGE_TREE_STORES, getCrewlyHomePath, isInsidePackageTree, resolveProjectDataDir } from '../core/crewly-home.utils.js';
|
|
35
|
+
import { readTeamChat } from './team-move-chat.js';
|
|
36
|
+
import { createEncryptStream, createHashTap } from './team-move-crypto.js';
|
|
37
|
+
import { StagingArea, walkFiles } from './team-move-fs.js';
|
|
38
|
+
import { describeBlockingRepos, inspectRepo as defaultInspectRepo } from './team-move-git.js';
|
|
39
|
+
import { TeamMoveSecretScanError, isSkippableFinding, scanStaging } from './team-move-secret-scan.js';
|
|
40
|
+
import { identityOf, resetWorkItemForTarget, selectDecisions, selectPoolItems, selectScheduledMessages, } from './team-move-select.js';
|
|
41
|
+
const C = TEAM_MOVE_CONSTANTS;
|
|
42
|
+
/** First path segments of a project's `.crewly` that are Crewly state, packaged before anything else. */
|
|
43
|
+
const CORE_PROJECT_DIRS = new Set([
|
|
44
|
+
'tickets',
|
|
45
|
+
'missions',
|
|
46
|
+
'requests',
|
|
47
|
+
'triggers',
|
|
48
|
+
'knowledge',
|
|
49
|
+
'wiki',
|
|
50
|
+
'goals',
|
|
51
|
+
'tasks',
|
|
52
|
+
'task-records',
|
|
53
|
+
'escalations',
|
|
54
|
+
'specs',
|
|
55
|
+
'memory',
|
|
56
|
+
'prompts',
|
|
57
|
+
'agents-index.json',
|
|
58
|
+
]);
|
|
59
|
+
/** Folders of a project's `.crewly` that are scratch space, never packaged. */
|
|
60
|
+
const PROJECT_SCRATCH_DIRS = new Set(['worktrees', 'tmp', 'cache']);
|
|
61
|
+
/** Connectors whose connection does not travel; found by name in the team's words. */
|
|
62
|
+
const CONNECTOR_HINTS = {
|
|
63
|
+
Google: /\bgoogle (?:drive|docs|sheets|slides|calendar)\b|\bgmail\b/,
|
|
64
|
+
Zoho: /\bzoho\b/,
|
|
65
|
+
Canva: /\bcanva\b/,
|
|
66
|
+
WhatsApp: /\bwhatsapp\b/,
|
|
67
|
+
};
|
|
68
|
+
/** Thrown when a repository holds work that exists only on the source. */
|
|
69
|
+
export class TeamMoveBlockedError extends Error {
|
|
70
|
+
lines;
|
|
71
|
+
constructor(lines) {
|
|
72
|
+
super(`Push this work before moving the team: ${lines.join('; ')}`);
|
|
73
|
+
this.lines = lines;
|
|
74
|
+
this.name = 'TeamMoveBlockedError';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Prepare a team config for another machine: nothing is running there yet.
|
|
79
|
+
*
|
|
80
|
+
* @param raw - Parsed `config.json`
|
|
81
|
+
* @returns Copy with runtime state cleared
|
|
82
|
+
*/
|
|
83
|
+
export function sanitizeTeamForMove(raw) {
|
|
84
|
+
const team = { ...raw };
|
|
85
|
+
delete team['archived'];
|
|
86
|
+
delete team['archivedAt'];
|
|
87
|
+
delete team['movedTo'];
|
|
88
|
+
const members = Array.isArray(team['members']) ? team['members'] : [];
|
|
89
|
+
team['members'] = members.map((m) => {
|
|
90
|
+
const next = { ...m, agentStatus: 'inactive', workingStatus: 'idle' };
|
|
91
|
+
for (const key of ['readyAt', 'lastStartError', 'dropoutReason', 'lastActivityCheck', 'runtimeFallback'])
|
|
92
|
+
delete next[key];
|
|
93
|
+
return next;
|
|
94
|
+
});
|
|
95
|
+
return team;
|
|
96
|
+
}
|
|
97
|
+
/** Escape a string for use in a RegExp. */
|
|
98
|
+
function escapeRegExp(text) {
|
|
99
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
100
|
+
}
|
|
101
|
+
/** The exporter. */
|
|
102
|
+
export class TeamMoveExporter {
|
|
103
|
+
deps;
|
|
104
|
+
home;
|
|
105
|
+
now;
|
|
106
|
+
inspect;
|
|
107
|
+
constructor(deps) {
|
|
108
|
+
this.deps = deps;
|
|
109
|
+
this.home = deps.home ?? getCrewlyHomePath();
|
|
110
|
+
this.now = deps.now ?? (() => new Date().toISOString());
|
|
111
|
+
this.inspect = deps.inspectRepo ?? defaultInspectRepo;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check, before anything is built, that no repository holds work only this
|
|
115
|
+
* machine has. Used by the REST entry point so the owner learns what to
|
|
116
|
+
* push before a move is even requested.
|
|
117
|
+
*
|
|
118
|
+
* @param teamId - Team to move
|
|
119
|
+
* @returns The repos and the lines that block the move
|
|
120
|
+
*/
|
|
121
|
+
async checkRepos(teamId) {
|
|
122
|
+
const team = await this.requireTeam(teamId);
|
|
123
|
+
const projects = await this.teamProjects(team);
|
|
124
|
+
const repos = await Promise.all(projects.map((p) => this.inspect({ id: p.id, name: p.name, path: p.path })));
|
|
125
|
+
return { repos, blocking: describeBlockingRepos(repos) };
|
|
126
|
+
}
|
|
127
|
+
async requireTeam(teamId) {
|
|
128
|
+
const team = (await this.deps.getTeams()).find((t) => t.id === teamId);
|
|
129
|
+
if (!team)
|
|
130
|
+
throw new Error(`team ${teamId} not found on this machine`);
|
|
131
|
+
if (team.members.length === 0)
|
|
132
|
+
throw new Error(`team ${team.name} has no members`);
|
|
133
|
+
return team;
|
|
134
|
+
}
|
|
135
|
+
async teamProjects(team) {
|
|
136
|
+
const all = await this.deps.getProjects();
|
|
137
|
+
return team.projectIds.map((id) => all.find((p) => p.id === id)).filter((p) => !!p);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Collect, scan and describe the package.
|
|
141
|
+
*
|
|
142
|
+
* @param options - Team, move, staging directory, policy flags
|
|
143
|
+
* @returns Manifest, staging area and the Cloud summary
|
|
144
|
+
* @throws TeamMoveBlockedError for unpushed work; TeamMoveSecretScanError for secrets
|
|
145
|
+
*/
|
|
146
|
+
async export(options) {
|
|
147
|
+
const team = await this.requireTeam(options.teamId);
|
|
148
|
+
const projects = await this.teamProjects(team);
|
|
149
|
+
const id = identityOf(team);
|
|
150
|
+
const repos = await Promise.all(projects.map((p) => this.inspect({ id: p.id, name: p.name, path: p.path })));
|
|
151
|
+
const blocking = describeBlockingRepos(repos);
|
|
152
|
+
if (blocking.length > 0 && !options.allowDirty)
|
|
153
|
+
throw new TeamMoveBlockedError(blocking);
|
|
154
|
+
const staging = new StagingArea(path.resolve(options.stagingDir));
|
|
155
|
+
await staging.init();
|
|
156
|
+
const counts = {};
|
|
157
|
+
const bump = (key, n = 1) => {
|
|
158
|
+
counts[key] = (counts[key] ?? 0) + n;
|
|
159
|
+
};
|
|
160
|
+
// 1. The team's folder (config, prompts, norms, SOPs, wiki vault, cron tasks).
|
|
161
|
+
const teamDir = path.join(this.home, 'teams', team.id);
|
|
162
|
+
const rawConfig = await safeReadJson(path.join(teamDir, 'config.json'), null);
|
|
163
|
+
if (!rawConfig)
|
|
164
|
+
throw new Error(`team ${team.name} has no config.json`);
|
|
165
|
+
await staging.writeJson('team/config.json', sanitizeTeamForMove(rawConfig));
|
|
166
|
+
for await (const f of walkFiles(teamDir)) {
|
|
167
|
+
if (f.rel === 'config.json')
|
|
168
|
+
continue;
|
|
169
|
+
await staging.copyIn(f.abs, `team/${f.rel}`);
|
|
170
|
+
const top = f.rel.split('/')[0];
|
|
171
|
+
if (top === 'wiki')
|
|
172
|
+
bump('wikiPages');
|
|
173
|
+
else if (top === 'norms' || top === 'sops')
|
|
174
|
+
bump('normsAndSops');
|
|
175
|
+
else if (top === 'prompts')
|
|
176
|
+
bump('prompts');
|
|
177
|
+
else if (f.rel === 'cron-tasks.json')
|
|
178
|
+
bump('cronTaskFiles');
|
|
179
|
+
}
|
|
180
|
+
bump('members', team.members.length);
|
|
181
|
+
const cron = await safeReadJson(path.join(teamDir, 'cron-tasks.json'), {});
|
|
182
|
+
if (Array.isArray(cron.tasks))
|
|
183
|
+
counts['cronTasks'] = cron.tasks.length;
|
|
184
|
+
if (Array.isArray(team.triggers))
|
|
185
|
+
counts['teamTriggers'] = team.triggers.length;
|
|
186
|
+
// 2. Agent memory, standing answers and session summaries.
|
|
187
|
+
for (const session of id.sessions) {
|
|
188
|
+
for await (const f of walkFiles(path.join(this.home, 'agents', session))) {
|
|
189
|
+
await staging.copyIn(f.abs, `agents/${session}/${f.rel}`);
|
|
190
|
+
bump('agentFiles');
|
|
191
|
+
if (f.rel.startsWith('sessions/'))
|
|
192
|
+
bump('sessionSummaries');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// 3. Newest handover notes per agent.
|
|
196
|
+
const handoverDir = path.join(this.home, 'handover');
|
|
197
|
+
const handoverNames = await fs.readdir(handoverDir).catch(() => []);
|
|
198
|
+
for (const session of id.sessions) {
|
|
199
|
+
const own = new RegExp(`^${escapeRegExp(session)}-(?:\\d{4}-|restart-|runtime-)`);
|
|
200
|
+
const matching = [];
|
|
201
|
+
for (const name of handoverNames) {
|
|
202
|
+
if (!own.test(name) || !name.endsWith('.md'))
|
|
203
|
+
continue;
|
|
204
|
+
const st = await fs.stat(path.join(handoverDir, name)).catch(() => null);
|
|
205
|
+
if (st?.isFile())
|
|
206
|
+
matching.push({ name, mtime: st.mtimeMs });
|
|
207
|
+
}
|
|
208
|
+
matching.sort((a, b) => b.mtime - a.mtime);
|
|
209
|
+
for (const h of matching.slice(0, C.HANDOVERS_PER_AGENT)) {
|
|
210
|
+
await staging.copyIn(path.join(handoverDir, h.name), `handover/${h.name}`);
|
|
211
|
+
bump('handoverNotes');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// 4. Records from the global stores.
|
|
215
|
+
await this.collectRecords(staging, id, team, counts);
|
|
216
|
+
// 5. Project-local Crewly data, within the size caps.
|
|
217
|
+
const allTeams = await this.deps.getTeams();
|
|
218
|
+
const packageProjects = await this.collectProjects(staging, projects, allTeams, team.id, counts);
|
|
219
|
+
// 6. Required tools and runtimes.
|
|
220
|
+
const { tools: requiredTools, connectors: requiredConnectors } = await this.detectNeeds(staging, team);
|
|
221
|
+
const requiredRuntimes = [...new Set(team.members.map((m) => m.runtimeType).filter(Boolean))].sort();
|
|
222
|
+
// 7. Secret scan: nothing leaves the machine with a credential in it.
|
|
223
|
+
const known = this.deps.knownSecrets ? await this.deps.knownSecrets() : collectSecretEnvValues(process.env);
|
|
224
|
+
const scan = await scanStaging(staging, staging.files(), known);
|
|
225
|
+
let excludedFiles = 0;
|
|
226
|
+
if (scan.findings.length > 0) {
|
|
227
|
+
const removable = scan.findings.filter((f) => isSkippableFinding(f.path));
|
|
228
|
+
if (!options.skipFlagged || removable.length !== scan.findings.length)
|
|
229
|
+
throw new TeamMoveSecretScanError(scan.findings);
|
|
230
|
+
for (const finding of removable) {
|
|
231
|
+
const bytes = staging.files().find((e) => e.path === finding.path)?.bytes ?? 0;
|
|
232
|
+
await staging.remove(finding.path);
|
|
233
|
+
excludedFiles += 1;
|
|
234
|
+
const projectMatch = /^projects\/([^/]+)\//.exec(finding.path);
|
|
235
|
+
const project = projectMatch ? packageProjects.find((p) => p.id === projectMatch[1]) : undefined;
|
|
236
|
+
project?.skipped.push({ path: finding.path.replace(/^projects\/[^/]+\/data\//, ''), bytes, reason: 'secret_scan' });
|
|
237
|
+
if (project) {
|
|
238
|
+
project.files -= 1;
|
|
239
|
+
project.bytes -= bytes;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// 8. Manifest.
|
|
244
|
+
const members = team.members.map((m) => ({
|
|
245
|
+
id: m.id,
|
|
246
|
+
name: m.name,
|
|
247
|
+
role: m.role,
|
|
248
|
+
sessionName: m.sessionName,
|
|
249
|
+
runtimeType: m.runtimeType,
|
|
250
|
+
}));
|
|
251
|
+
counts['repos'] = repos.length;
|
|
252
|
+
counts['projects'] = packageProjects.length;
|
|
253
|
+
const files = staging.files();
|
|
254
|
+
const manifest = {
|
|
255
|
+
kind: C.PACKAGE_KIND,
|
|
256
|
+
schemaVersion: C.SCHEMA_VERSION,
|
|
257
|
+
moveId: options.moveId,
|
|
258
|
+
createdAt: this.now(),
|
|
259
|
+
crewlyVersion: this.deps.crewlyVersion,
|
|
260
|
+
source: { ...this.deps.source, homePath: this.home, platform: process.platform },
|
|
261
|
+
team: { id: team.id, name: team.name, members, projectIds: [...team.projectIds] },
|
|
262
|
+
counts,
|
|
263
|
+
projects: packageProjects,
|
|
264
|
+
repos,
|
|
265
|
+
requiredTools,
|
|
266
|
+
requiredRuntimes,
|
|
267
|
+
requiredConnectors,
|
|
268
|
+
files,
|
|
269
|
+
totalBytes: files.reduce((n, f) => n + f.bytes, 0),
|
|
270
|
+
noSecrets: true,
|
|
271
|
+
secretScan: { filesScanned: scan.filesScanned, knownValuesChecked: known.length, findings: 0, excludedFiles },
|
|
272
|
+
notMoved: this.notMovedList(),
|
|
273
|
+
};
|
|
274
|
+
await staging.writeJson('manifest.json', manifest);
|
|
275
|
+
return {
|
|
276
|
+
manifest,
|
|
277
|
+
staging,
|
|
278
|
+
summary: summarize(manifest),
|
|
279
|
+
dirtyRepos: blocking,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/** The things a move deliberately leaves out, shown to the owner. */
|
|
283
|
+
notMovedList() {
|
|
284
|
+
return [
|
|
285
|
+
'Credentials, API keys, OAuth/connector grants and runtime logins (Claude, Codex, ...)',
|
|
286
|
+
'Slack bot tokens (Crewly Cloud re-points the agents\' Slack apps to the target)',
|
|
287
|
+
'Source code (cloned from each repository on the target)',
|
|
288
|
+
'Chat message history (channels and rooms move, messages stay on the source)',
|
|
289
|
+
'Running sessions, logs, transcripts, build output and node_modules',
|
|
290
|
+
'Short-lived agent reminders (they are set again by the agents)',
|
|
291
|
+
];
|
|
292
|
+
}
|
|
293
|
+
/** Global-store records of the team. */
|
|
294
|
+
async collectRecords(staging, id, team, counts) {
|
|
295
|
+
// Task pool: open items of the team. Claims are not moved: nothing runs on the target yet.
|
|
296
|
+
const pool = await safeReadJson(path.join(this.home, 'task-pool', 'pool.json'), {});
|
|
297
|
+
const slice = selectPoolItems(pool, id);
|
|
298
|
+
await staging.writeJson('records/task-pool.json', { workItems: slice.workItems.map(resetWorkItemForTarget) });
|
|
299
|
+
counts['taskPoolItems'] = slice.workItems.length;
|
|
300
|
+
// Open decisions / requests to the owner.
|
|
301
|
+
const decisionsFile = await safeReadJson(path.join(this.home, 'owner-decisions.json'), {});
|
|
302
|
+
const decisions = selectDecisions(Array.isArray(decisionsFile.decisions) ? decisionsFile.decisions : [], id);
|
|
303
|
+
await staging.writeJson('records/decisions.json', { decisions });
|
|
304
|
+
counts['openDecisions'] = decisions.length;
|
|
305
|
+
// Legacy owner-created scheduled messages aimed at the team.
|
|
306
|
+
const scheduled = await safeReadJson(path.join(this.home, 'scheduled-messages.json'), []);
|
|
307
|
+
const mine = selectScheduledMessages(Array.isArray(scheduled) ? scheduled : [], id);
|
|
308
|
+
await staging.writeJson('records/scheduled-messages.json', { messages: mine });
|
|
309
|
+
counts['scheduledMessages'] = mine.length;
|
|
310
|
+
// Chat channels, rooms and DMs with their membership.
|
|
311
|
+
const chat = readTeamChat(this.home, id);
|
|
312
|
+
await staging.writeJson('records/chat-channels.json', chat);
|
|
313
|
+
counts['chatChannels'] = chat.channels.length;
|
|
314
|
+
// The Slack channel mapping of the team, so the target reuses the same channel.
|
|
315
|
+
const slackFile = await safeReadJson(path.join(this.home, 'slack-team-channels.json'), {});
|
|
316
|
+
const mapping = (Array.isArray(slackFile.mappings) ? slackFile.mappings : []).find((m) => m['teamId'] === team.id) ?? null;
|
|
317
|
+
await staging.writeJson('records/slack-team-channel.json', { mapping });
|
|
318
|
+
if (mapping)
|
|
319
|
+
counts['slackChannelMappings'] = 1;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Copy each project's Crewly data under the size caps.
|
|
323
|
+
*
|
|
324
|
+
* @returns Manifest entries of the projects
|
|
325
|
+
*/
|
|
326
|
+
async collectProjects(staging, projects, allTeams, teamId, counts) {
|
|
327
|
+
const out = [];
|
|
328
|
+
let remaining = C.PROJECT_FILES_MAX_BYTES;
|
|
329
|
+
for (const project of projects) {
|
|
330
|
+
const dataDir = resolveProjectDataDir(project.path);
|
|
331
|
+
const inHome = isInsidePackageTree(project.path);
|
|
332
|
+
const entry = {
|
|
333
|
+
id: project.id,
|
|
334
|
+
name: project.name,
|
|
335
|
+
sourcePath: project.path,
|
|
336
|
+
dataDir: inHome ? 'home' : '.crewly',
|
|
337
|
+
files: 0,
|
|
338
|
+
bytes: 0,
|
|
339
|
+
skipped: [],
|
|
340
|
+
sharedWithTeams: allTeams.filter((t) => t.id !== teamId && t.projectIds.includes(project.id)).map((t) => t.name),
|
|
341
|
+
};
|
|
342
|
+
// Candidates: every file with its package-relative path.
|
|
343
|
+
const candidates = [];
|
|
344
|
+
const roots = inHome
|
|
345
|
+
? PACKAGE_TREE_STORES.map((s) => ({ dir: path.join(dataDir, s), prefix: s }))
|
|
346
|
+
: [{ dir: dataDir, prefix: '' }];
|
|
347
|
+
for (const root of roots) {
|
|
348
|
+
const single = await fs.stat(root.dir).catch(() => null);
|
|
349
|
+
if (single?.isFile()) {
|
|
350
|
+
candidates.push({ abs: root.dir, rel: root.prefix, size: single.size, priority: 0 });
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
for await (const f of walkFiles(root.dir, PROJECT_SCRATCH_DIRS)) {
|
|
354
|
+
const rel = root.prefix ? `${root.prefix}/${f.rel}` : f.rel;
|
|
355
|
+
candidates.push({ abs: f.abs, rel, size: f.size, priority: CORE_PROJECT_DIRS.has(rel.split('/')[0]) ? 0 : 1 });
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Core state first, then small files before big ones, so a cap loses the biggest scratch files.
|
|
359
|
+
candidates.sort((a, b) => a.priority - b.priority || a.size - b.size || (a.rel < b.rel ? -1 : 1));
|
|
360
|
+
for (const c of candidates) {
|
|
361
|
+
const skip = (reason) => {
|
|
362
|
+
entry.skipped.push({ path: c.rel, bytes: c.size, reason });
|
|
363
|
+
};
|
|
364
|
+
if (c.size > C.PROJECT_FILE_MAX_BYTES)
|
|
365
|
+
skip('too_large');
|
|
366
|
+
else if (c.size > remaining)
|
|
367
|
+
skip('size_cap');
|
|
368
|
+
else {
|
|
369
|
+
try {
|
|
370
|
+
await staging.copyIn(c.abs, `projects/${project.id}/data/${c.rel}`);
|
|
371
|
+
remaining -= c.size;
|
|
372
|
+
entry.files += 1;
|
|
373
|
+
entry.bytes += c.size;
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
skip('unreadable');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
entry.skipped.sort((a, b) => b.bytes - a.bytes);
|
|
381
|
+
counts['projectFiles'] = (counts['projectFiles'] ?? 0) + entry.files;
|
|
382
|
+
const count = (prefix) => staging.files().filter((f) => f.path.startsWith(`projects/${project.id}/data/${prefix}/`)).length;
|
|
383
|
+
counts['tickets'] = (counts['tickets'] ?? 0) + staging.files().filter((f) => f.path.startsWith(`projects/${project.id}/data/tickets/`) && f.path.endsWith('.md')).length;
|
|
384
|
+
counts['missionFiles'] = (counts['missionFiles'] ?? 0) + count('missions');
|
|
385
|
+
counts['requestFiles'] = (counts['requestFiles'] ?? 0) + count('requests');
|
|
386
|
+
counts['triggerFiles'] = (counts['triggerFiles'] ?? 0) + count('triggers');
|
|
387
|
+
out.push(entry);
|
|
388
|
+
}
|
|
389
|
+
return out;
|
|
390
|
+
}
|
|
391
|
+
/** Tools and connectors the team's own words mention (prompts, norms, SOPs, cron tasks). */
|
|
392
|
+
async detectNeeds(staging, team) {
|
|
393
|
+
let text = team.members.map((m) => m.systemPrompt ?? '').join('\n');
|
|
394
|
+
for (const f of staging.files()) {
|
|
395
|
+
if (!/^team\/(norms|sops|prompts)\//.test(f.path) && f.path !== 'team/cron-tasks.json')
|
|
396
|
+
continue;
|
|
397
|
+
if (f.bytes > C.TEXT_FILE_MAX_BYTES)
|
|
398
|
+
continue;
|
|
399
|
+
text += `\n${await fs.readFile(staging.abs(f.path), 'utf8').catch(() => '')}`;
|
|
400
|
+
}
|
|
401
|
+
const lower = text.toLowerCase();
|
|
402
|
+
const tools = C.KNOWN_TOOLS.filter((tool) => new RegExp(`(?:^|[^a-z0-9-])${escapeRegExp(tool)}(?:$|[^a-z0-9-])`).test(lower)).sort();
|
|
403
|
+
const connectors = Object.entries(CONNECTOR_HINTS)
|
|
404
|
+
.filter(([, re]) => re.test(lower))
|
|
405
|
+
.map(([name]) => name)
|
|
406
|
+
.sort();
|
|
407
|
+
return { tools, connectors };
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* The small summary Cloud receives (kept far below its 64 KB limit).
|
|
412
|
+
*
|
|
413
|
+
* @param manifest - Full manifest
|
|
414
|
+
* @returns Summary without file names
|
|
415
|
+
*/
|
|
416
|
+
export function summarize(manifest) {
|
|
417
|
+
return {
|
|
418
|
+
kind: manifest.kind,
|
|
419
|
+
schemaVersion: manifest.schemaVersion,
|
|
420
|
+
crewlyVersion: manifest.crewlyVersion,
|
|
421
|
+
team: { id: manifest.team.id, name: manifest.team.name, members: manifest.team.members.length },
|
|
422
|
+
counts: manifest.counts,
|
|
423
|
+
repos: manifest.repos.length,
|
|
424
|
+
reposDirty: manifest.repos.filter((r) => r.dirty || r.unpushed > 0).length,
|
|
425
|
+
requiredTools: manifest.requiredTools,
|
|
426
|
+
requiredRuntimes: manifest.requiredRuntimes,
|
|
427
|
+
totalBytes: manifest.totalBytes,
|
|
428
|
+
uncompressedBytes: manifest.totalBytes,
|
|
429
|
+
noSecrets: true,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Tar+gzip a staging directory and encrypt it for the target.
|
|
434
|
+
*
|
|
435
|
+
* @param stagingDir - Directory built by {@link TeamMoveExporter.export}
|
|
436
|
+
* @param outFile - Where the ciphertext is written
|
|
437
|
+
* @param recipientPublicKey - Target's base64 X25519 public key
|
|
438
|
+
* @param moveId - Move id (bound into the encryption)
|
|
439
|
+
* @returns File, size, hash and chunk count of the ciphertext
|
|
440
|
+
*/
|
|
441
|
+
export async function buildEncryptedPackage(stagingDir, outFile, recipientPublicKey, moveId) {
|
|
442
|
+
await fs.mkdir(path.dirname(outFile), { recursive: true });
|
|
443
|
+
const tap = createHashTap();
|
|
444
|
+
const tarStream = tarCreate({ gzip: true, cwd: stagingDir, portable: true, noMtime: true }, ['.']);
|
|
445
|
+
await pipeline(tarStream, createEncryptStream({ recipientPublicKey, moveId }), tap, createWriteStream(outFile, { mode: 0o600 }));
|
|
446
|
+
return {
|
|
447
|
+
file: outFile,
|
|
448
|
+
size: tap.bytes,
|
|
449
|
+
sha256: tap.digest(),
|
|
450
|
+
chunks: Math.max(1, Math.ceil(tap.bytes / C.TRANSFER_CHUNK_BYTES)),
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Package entries sorted for stable comparisons in tests.
|
|
455
|
+
*
|
|
456
|
+
* @param files - Manifest file entries
|
|
457
|
+
* @returns Paths
|
|
458
|
+
*/
|
|
459
|
+
export function packagePaths(files) {
|
|
460
|
+
return files.map((f) => f.path).sort();
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=team-move-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-exporter.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-exporter.ts"],"names":[],"mappings":"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"}
|