crewly 1.20.362 → 1.20.364
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/hooks/destructive-git-guard/guard.mjs +96 -0
- package/config/roles/orchestrator/prompt.md +3 -3
- package/config/roles/team-leader/prompt.md +2 -0
- package/config/skills/agent/core/ask-owner/SKILL.md +31 -0
- package/config/skills/agent/core/ask-owner/execute.sh +14 -3
- package/config/skills/agent/core/ask-owner/execute.test.sh +8 -0
- package/config/skills/agent/core/gmail-read/SKILL.md +8 -0
- package/config/skills/agent/core/gmail-send/SKILL.md +10 -3
- package/config/skills/agent/core/gmail-send/execute.sh +2 -1
- package/config/skills/agent/core/gmail-watch-thread/SKILL.md +69 -0
- package/config/skills/agent/core/gmail-watch-thread/execute.sh +51 -0
- package/config/skills/agent/core/project-tickets/SKILL.md +12 -0
- package/config/skills/agent/core/project-tickets/execute.sh +13 -3
- package/config/skills/agent/core/project-tickets/execute.test.sh +4 -0
- package/config/skills/agent/core/watch-for-event/SKILL.md +22 -0
- package/config/skills/orchestrator/delegate-task/SKILL.md +14 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +19 -2
- package/config/skills/orchestrator/delegate-task/execute.test.sh +30 -0
- package/config/skills/orchestrator/harness-login/SKILL.md +1 -1
- package/config/skills/team-leader/delegate-task/execute.sh +6 -0
- package/dist/backend/backend/src/constants.d.ts +74 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +75 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +14 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +44 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.js +121 -3
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js +5 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +2 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +7 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +61 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts +46 -13
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.js +100 -50
- package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts +23 -1
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-contract.js +76 -4
- package/dist/backend/backend/src/services/decisions/decision-contract.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-wording.d.ts +167 -0
- package/dist/backend/backend/src/services/decisions/decision-wording.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-wording.js +406 -0
- package/dist/backend/backend/src/services/decisions/decision-wording.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +30 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +44 -8
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +17 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +6 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.d.ts +142 -0
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js +304 -0
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.d.ts +130 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.js +216 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-send-gate.d.ts +28 -13
- package/dist/backend/backend/src/services/google/gmail-send-gate.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/gmail-send-gate.js +82 -29
- package/dist/backend/backend/src/services/google/gmail-send-gate.js.map +1 -1
- package/dist/backend/backend/src/services/google/gmail.service.d.ts +90 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/gmail.service.js +122 -0
- package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +24 -14
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-accounts.js +35 -21
- package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-native-login.d.ts +106 -0
- package/dist/backend/backend/src/services/harness/claude-native-login.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-native-login.js +174 -0
- package/dist/backend/backend/src/services/harness/claude-native-login.js.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.d.ts +158 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.js +283 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +44 -24
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js +96 -39
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-registry.js +1 -1
- package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +2 -2
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js +2 -2
- package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.service.js +10 -1
- package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +24 -21
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/login-broker.service.js +50 -64
- package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/login-rules.d.ts +17 -11
- package/dist/backend/backend/src/services/harness/login-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/login-rules.js +22 -25
- package/dist/backend/backend/src/services/harness/login-rules.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +36 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js +70 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +25 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.js +65 -5
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +5 -2
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +50 -2
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +103 -11
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts +27 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +25 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +4 -2
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
- package/dist/backend/backend/src/services/orc/team-lead-report.d.ts +120 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.js +198 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.js.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js +85 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +35 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js +38 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +5 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +30 -6
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-file.js +6 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-file.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.d.ts +64 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.js +93 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.d.ts +176 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.js +301 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +33 -3
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +50 -4
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +8 -1
- 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 +26 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +6 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +3 -2
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +4 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts +34 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js +70 -2
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +36 -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 +72 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +3 -0
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +5 -2
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.d.ts +7 -2
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.js +11 -2
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +53 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +10 -2
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +8 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/project-ticket.types.d.ts +7 -0
- package/dist/backend/backend/src/types/project-ticket.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/project-ticket.types.js +1 -0
- package/dist/backend/backend/src/types/project-ticket.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +8 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +74 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +75 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts +46 -13
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-card.js +100 -50
- package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-contract.d.ts +23 -1
- package/dist/cli/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-contract.js +76 -4
- package/dist/cli/backend/src/services/decisions/decision-contract.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-wording.d.ts +167 -0
- package/dist/cli/backend/src/services/decisions/decision-wording.d.ts.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-wording.js +406 -0
- package/dist/cli/backend/src/services/decisions/decision-wording.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +30 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +44 -8
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js +6 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +24 -14
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-accounts.js +35 -21
- package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-native-login.d.ts +106 -0
- package/dist/cli/backend/src/services/harness/claude-native-login.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-native-login.js +174 -0
- package/dist/cli/backend/src/services/harness/claude-native-login.js.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.d.ts +158 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.js +283 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +44 -24
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js +96 -39
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-registry.js +1 -1
- package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +2 -2
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js +2 -2
- package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.service.js +10 -1
- package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +24 -21
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/login-broker.service.js +50 -64
- package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/login-rules.d.ts +17 -11
- package/dist/cli/backend/src/services/harness/login-rules.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/login-rules.js +22 -25
- package/dist/cli/backend/src/services/harness/login-rules.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +36 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js +70 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +25 -0
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.js +65 -5
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts +113 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js +195 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.d.ts +120 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.js +198 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.js.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js +85 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +35 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js +38 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +5 -0
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +30 -6
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-file.js +6 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-file.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.d.ts +176 -0
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.d.ts.map +1 -0
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.js +301 -0
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +36 -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 +72 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +53 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts +10 -2
- package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.js +8 -0
- package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/cli/backend/src/types/project-ticket.types.d.ts +7 -0
- package/dist/cli/backend/src/types/project-ticket.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/project-ticket.types.js +1 -0
- package/dist/cli/backend/src/types/project-ticket.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +8 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code's own login state: is a config dir (or the default login)
|
|
3
|
+
* signed in through Claude Code itself?
|
|
4
|
+
*
|
|
5
|
+
* Crewly does not collect, store or intermediate Claude.ai credentials
|
|
6
|
+
* (Anthropic's Claude Code legal page). Claude Code keeps its own login in
|
|
7
|
+
* `<config dir>/.credentials.json` or, on macOS, in the keychain, so a file
|
|
8
|
+
* check alone is wrong on a Mac: the default login of a Mac has no
|
|
9
|
+
* `.credentials.json` at all. Two questions are therefore asked of the CLI
|
|
10
|
+
* itself, always with Crewly's own env (no `CLAUDE_CODE_OAUTH_TOKEN`, no API
|
|
11
|
+
* key) so a token can never make a login look native:
|
|
12
|
+
*
|
|
13
|
+
* - {@link readClaudeAuthStatus}: `claude auth status --json`, the CLI's own
|
|
14
|
+
* record (`loggedIn`). Cheap, no network turn, but it keeps saying
|
|
15
|
+
* `loggedIn: true` for an expired login. Feeds the sync "signed in" flag.
|
|
16
|
+
* - {@link probeClaudeNativeLogin}: one tiny real turn. This is the
|
|
17
|
+
* verification the token migration waits for before it deletes anything.
|
|
18
|
+
*
|
|
19
|
+
* Neither prints or reads a credential: only the exit code and the output
|
|
20
|
+
* of the CLI are looked at.
|
|
21
|
+
*
|
|
22
|
+
* @module services/harness/claude-native-login
|
|
23
|
+
*/
|
|
24
|
+
import type { LoginState, RunCommand } from './harness.types.js';
|
|
25
|
+
/** Injectable dependencies. */
|
|
26
|
+
export interface ClaudeNativeLoginDeps {
|
|
27
|
+
run?: RunCommand;
|
|
28
|
+
/** Base env (default process.env) */
|
|
29
|
+
env?: NodeJS.ProcessEnv;
|
|
30
|
+
homeDir?: string;
|
|
31
|
+
/** PATH lookup of the `claude` binary */
|
|
32
|
+
resolveCommand?: (command: string) => string | null;
|
|
33
|
+
/** Scratch directory the probe turn runs in */
|
|
34
|
+
scratchDir?: string;
|
|
35
|
+
timeoutMs?: number;
|
|
36
|
+
now?: () => number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Env to ask Claude Code about its OWN login: the caller's env without any
|
|
40
|
+
* token or key, pointed at a config dir (or the default login's).
|
|
41
|
+
*
|
|
42
|
+
* @param baseEnv - Starting env
|
|
43
|
+
* @param configDir - A named account's config dir; null = the default login
|
|
44
|
+
* @returns Env for the child process
|
|
45
|
+
*/
|
|
46
|
+
export declare function nativeLoginEnv(baseEnv: NodeJS.ProcessEnv, configDir: string | null): NodeJS.ProcessEnv;
|
|
47
|
+
/**
|
|
48
|
+
* Ask the CLI whether it is signed in (`claude auth status --json`).
|
|
49
|
+
*
|
|
50
|
+
* @param configDir - A named account's config dir; null = the default login
|
|
51
|
+
* @param deps - Dependencies
|
|
52
|
+
* @returns `loggedIn` as the CLI reports it, or null when it could not be asked
|
|
53
|
+
*/
|
|
54
|
+
export declare function readClaudeAuthStatus(configDir: string | null, deps?: ClaudeNativeLoginDeps): Promise<boolean | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Refresh the cached `claude auth status` answer of accounts.
|
|
57
|
+
*
|
|
58
|
+
* @param accounts - Account configs: `account` is the name (null = default login), `configDir` its dir (null = default)
|
|
59
|
+
* @param deps - Dependencies
|
|
60
|
+
* @param maxAgeMs - Skip an account answered this recently
|
|
61
|
+
* @returns Resolves when every account was asked (an unanswered one keeps its old answer)
|
|
62
|
+
*/
|
|
63
|
+
export declare function refreshClaudeNativeLogins(accounts: ReadonlyArray<{
|
|
64
|
+
account: string | null;
|
|
65
|
+
configDir: string | null;
|
|
66
|
+
}>, deps?: ClaudeNativeLoginDeps, maxAgeMs?: number): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* The last `claude auth status` answer for an account.
|
|
69
|
+
*
|
|
70
|
+
* @param account - Account name; null = the default login
|
|
71
|
+
* @returns True/false, or undefined when never asked
|
|
72
|
+
*/
|
|
73
|
+
export declare function cachedClaudeNativeLogin(account: string | null): boolean | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Set the cached answer (after a verified login or sign-out).
|
|
76
|
+
*
|
|
77
|
+
* @param account - Account name; null = the default login
|
|
78
|
+
* @param loggedIn - New answer
|
|
79
|
+
* @param now - Clock
|
|
80
|
+
*/
|
|
81
|
+
export declare function setCachedClaudeNativeLogin(account: string | null, loggedIn: boolean, now?: number): void;
|
|
82
|
+
/** Forget every cached answer (tests). */
|
|
83
|
+
export declare function resetClaudeNativeLoginCache(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Classify the output of a probe turn.
|
|
86
|
+
*
|
|
87
|
+
* @param result - Exit code and output
|
|
88
|
+
* @returns `logged_out` on a login-expiry message; `logged_in` when the turn
|
|
89
|
+
* worked or the account answered with a usage limit (a limit proves the
|
|
90
|
+
* login works); else `unknown`
|
|
91
|
+
*/
|
|
92
|
+
export declare function classifyNativeProbe(result: {
|
|
93
|
+
code: number | null;
|
|
94
|
+
stdout: string;
|
|
95
|
+
stderr: string;
|
|
96
|
+
}): LoginState;
|
|
97
|
+
/**
|
|
98
|
+
* Verify a login with one real Claude turn on Claude Code's own login, with
|
|
99
|
+
* no token or key in the env.
|
|
100
|
+
*
|
|
101
|
+
* @param configDir - A named account's config dir; null = the default login
|
|
102
|
+
* @param deps - Dependencies
|
|
103
|
+
* @returns `logged_in`, `logged_out` or `unknown`; never rejects
|
|
104
|
+
*/
|
|
105
|
+
export declare function probeClaudeNativeLogin(configDir: string | null, deps?: ClaudeNativeLoginDeps): Promise<LoginState>;
|
|
106
|
+
//# sourceMappingURL=claude-native-login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-native-login.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/claude-native-login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGjE,+BAA+B;AAC/B,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACpD,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAWD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU,CAOtG;AAeD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAa9H;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC9C,QAAQ,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EAC7E,IAAI,GAAE,qBAA0B,EAChC,QAAQ,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAEnF;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAEpH;AAED,0CAA0C;AAC1C,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAO/G;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,UAAU,CAAC,CAW5H"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code's own login state: is a config dir (or the default login)
|
|
3
|
+
* signed in through Claude Code itself?
|
|
4
|
+
*
|
|
5
|
+
* Crewly does not collect, store or intermediate Claude.ai credentials
|
|
6
|
+
* (Anthropic's Claude Code legal page). Claude Code keeps its own login in
|
|
7
|
+
* `<config dir>/.credentials.json` or, on macOS, in the keychain, so a file
|
|
8
|
+
* check alone is wrong on a Mac: the default login of a Mac has no
|
|
9
|
+
* `.credentials.json` at all. Two questions are therefore asked of the CLI
|
|
10
|
+
* itself, always with Crewly's own env (no `CLAUDE_CODE_OAUTH_TOKEN`, no API
|
|
11
|
+
* key) so a token can never make a login look native:
|
|
12
|
+
*
|
|
13
|
+
* - {@link readClaudeAuthStatus}: `claude auth status --json`, the CLI's own
|
|
14
|
+
* record (`loggedIn`). Cheap, no network turn, but it keeps saying
|
|
15
|
+
* `loggedIn: true` for an expired login. Feeds the sync "signed in" flag.
|
|
16
|
+
* - {@link probeClaudeNativeLogin}: one tiny real turn. This is the
|
|
17
|
+
* verification the token migration waits for before it deletes anything.
|
|
18
|
+
*
|
|
19
|
+
* Neither prints or reads a credential: only the exit code and the output
|
|
20
|
+
* of the CLI are looked at.
|
|
21
|
+
*
|
|
22
|
+
* @module services/harness/claude-native-login
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from 'fs';
|
|
25
|
+
import * as os from 'os';
|
|
26
|
+
import * as path from 'path';
|
|
27
|
+
import { HARNESS_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
|
|
28
|
+
import { detectUsageLimit, isExhaustingKind } from '../runtime-fallback/usage-limit-rules.js';
|
|
29
|
+
import { buildHarnessPath, resolveExecutable, runCommand } from './harness-exec.utils.js';
|
|
30
|
+
import { detectLoginExpiry } from './login-expiry-rules.js';
|
|
31
|
+
/** Env that would nest the run in a Claude session or leak Crewly's API token. */
|
|
32
|
+
const NESTED_ENV = ['CREWLY_API_TOKEN', 'CLAUDECODE', 'CLAUDE_CODE_ENTRYPOINT', 'CLAUDE_CODE_SSE_PORT'];
|
|
33
|
+
/** Cache key of the default login. */
|
|
34
|
+
const DEFAULT_KEY = '';
|
|
35
|
+
/** Last `claude auth status` answer per account (`''` = the default login). */
|
|
36
|
+
const statusCache = new Map();
|
|
37
|
+
/**
|
|
38
|
+
* Env to ask Claude Code about its OWN login: the caller's env without any
|
|
39
|
+
* token or key, pointed at a config dir (or the default login's).
|
|
40
|
+
*
|
|
41
|
+
* @param baseEnv - Starting env
|
|
42
|
+
* @param configDir - A named account's config dir; null = the default login
|
|
43
|
+
* @returns Env for the child process
|
|
44
|
+
*/
|
|
45
|
+
export function nativeLoginEnv(baseEnv, configDir) {
|
|
46
|
+
const env = { ...baseEnv };
|
|
47
|
+
delete env[HARNESS_CONSTANTS.CLAUDE.OAUTH_TOKEN_ENV];
|
|
48
|
+
delete env[HARNESS_CONSTANTS.CLAUDE.API_KEY_ENV];
|
|
49
|
+
for (const name of NESTED_ENV)
|
|
50
|
+
delete env[name];
|
|
51
|
+
if (configDir)
|
|
52
|
+
env[HARNESS_CONSTANTS.CLAUDE.CONFIG_DIR_ENV] = configDir;
|
|
53
|
+
return env;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolve the claude binary and base env once per call.
|
|
57
|
+
*
|
|
58
|
+
* @param deps - Dependencies
|
|
59
|
+
* @returns Binary path (or null), base env and the runner
|
|
60
|
+
*/
|
|
61
|
+
function setup(deps) {
|
|
62
|
+
const env = deps.env ?? process.env;
|
|
63
|
+
const homeDir = deps.homeDir ?? os.homedir();
|
|
64
|
+
const resolve = deps.resolveCommand ?? ((command) => resolveExecutable(command, buildHarnessPath(env.PATH, homeDir)));
|
|
65
|
+
return { binary: resolve('claude'), env, run: deps.run ?? runCommand, timeoutMs: deps.timeoutMs ?? HARNESS_CONSTANTS.RELOGIN.PROBE_TIMEOUT_MS };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Ask the CLI whether it is signed in (`claude auth status --json`).
|
|
69
|
+
*
|
|
70
|
+
* @param configDir - A named account's config dir; null = the default login
|
|
71
|
+
* @param deps - Dependencies
|
|
72
|
+
* @returns `loggedIn` as the CLI reports it, or null when it could not be asked
|
|
73
|
+
*/
|
|
74
|
+
export async function readClaudeAuthStatus(configDir, deps = {}) {
|
|
75
|
+
try {
|
|
76
|
+
const { binary, env, run, timeoutMs } = setup(deps);
|
|
77
|
+
if (!binary)
|
|
78
|
+
return null;
|
|
79
|
+
const result = await run(binary, ['auth', 'status', '--json'], { env: nativeLoginEnv(env, configDir), timeoutMs });
|
|
80
|
+
const parsed = JSON.parse(result.stdout);
|
|
81
|
+
if (parsed !== null && typeof parsed === 'object' && typeof parsed.loggedIn === 'boolean') {
|
|
82
|
+
return parsed.loggedIn;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Refresh the cached `claude auth status` answer of accounts.
|
|
92
|
+
*
|
|
93
|
+
* @param accounts - Account configs: `account` is the name (null = default login), `configDir` its dir (null = default)
|
|
94
|
+
* @param deps - Dependencies
|
|
95
|
+
* @param maxAgeMs - Skip an account answered this recently
|
|
96
|
+
* @returns Resolves when every account was asked (an unanswered one keeps its old answer)
|
|
97
|
+
*/
|
|
98
|
+
export async function refreshClaudeNativeLogins(accounts, deps = {}, maxAgeMs = 60_000) {
|
|
99
|
+
const now = (deps.now ?? Date.now)();
|
|
100
|
+
for (const { account, configDir } of accounts) {
|
|
101
|
+
const key = account ?? DEFAULT_KEY;
|
|
102
|
+
const known = statusCache.get(key);
|
|
103
|
+
if (known && now - known.at < maxAgeMs)
|
|
104
|
+
continue;
|
|
105
|
+
const loggedIn = await readClaudeAuthStatus(configDir, deps);
|
|
106
|
+
if (loggedIn !== null)
|
|
107
|
+
statusCache.set(key, { loggedIn, at: now });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The last `claude auth status` answer for an account.
|
|
112
|
+
*
|
|
113
|
+
* @param account - Account name; null = the default login
|
|
114
|
+
* @returns True/false, or undefined when never asked
|
|
115
|
+
*/
|
|
116
|
+
export function cachedClaudeNativeLogin(account) {
|
|
117
|
+
return statusCache.get(account ?? DEFAULT_KEY)?.loggedIn;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Set the cached answer (after a verified login or sign-out).
|
|
121
|
+
*
|
|
122
|
+
* @param account - Account name; null = the default login
|
|
123
|
+
* @param loggedIn - New answer
|
|
124
|
+
* @param now - Clock
|
|
125
|
+
*/
|
|
126
|
+
export function setCachedClaudeNativeLogin(account, loggedIn, now = Date.now()) {
|
|
127
|
+
statusCache.set(account ?? DEFAULT_KEY, { loggedIn, at: now });
|
|
128
|
+
}
|
|
129
|
+
/** Forget every cached answer (tests). */
|
|
130
|
+
export function resetClaudeNativeLoginCache() {
|
|
131
|
+
statusCache.clear();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Classify the output of a probe turn.
|
|
135
|
+
*
|
|
136
|
+
* @param result - Exit code and output
|
|
137
|
+
* @returns `logged_out` on a login-expiry message; `logged_in` when the turn
|
|
138
|
+
* worked or the account answered with a usage limit (a limit proves the
|
|
139
|
+
* login works); else `unknown`
|
|
140
|
+
*/
|
|
141
|
+
export function classifyNativeProbe(result) {
|
|
142
|
+
const output = `${result.stdout}\n${result.stderr}`;
|
|
143
|
+
if (detectLoginExpiry(output, HARNESS_CONSTANTS.IDS.CLAUDE_CODE))
|
|
144
|
+
return 'logged_out';
|
|
145
|
+
const limit = detectUsageLimit(output, RUNTIME_TYPES.CLAUDE_CODE);
|
|
146
|
+
if (limit && isExhaustingKind(limit.kind))
|
|
147
|
+
return 'logged_in';
|
|
148
|
+
if (result.code === 0)
|
|
149
|
+
return 'logged_in';
|
|
150
|
+
return 'unknown';
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Verify a login with one real Claude turn on Claude Code's own login, with
|
|
154
|
+
* no token or key in the env.
|
|
155
|
+
*
|
|
156
|
+
* @param configDir - A named account's config dir; null = the default login
|
|
157
|
+
* @param deps - Dependencies
|
|
158
|
+
* @returns `logged_in`, `logged_out` or `unknown`; never rejects
|
|
159
|
+
*/
|
|
160
|
+
export async function probeClaudeNativeLogin(configDir, deps = {}) {
|
|
161
|
+
try {
|
|
162
|
+
const { binary, env, run, timeoutMs } = setup(deps);
|
|
163
|
+
if (!binary)
|
|
164
|
+
return 'unknown';
|
|
165
|
+
const scratch = deps.scratchDir ?? path.join(os.tmpdir(), 'crewly-native-login-probe');
|
|
166
|
+
fs.mkdirSync(scratch, { recursive: true });
|
|
167
|
+
const result = await run(binary, HARNESS_CONSTANTS.CLAUDE.PROBE_ARGS, { env: nativeLoginEnv(env, configDir), timeoutMs, cwd: scratch });
|
|
168
|
+
return classifyNativeProbe(result);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return 'unknown';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=claude-native-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-native-login.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/claude-native-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude token migration — retire the Claude sign-in tokens older Crewly
|
|
3
|
+
* versions saved, without locking anyone out.
|
|
4
|
+
*
|
|
5
|
+
* Anthropic's Claude Code legal page: developers may not collect, store or
|
|
6
|
+
* intermediate Claude.ai credentials or session tokens; sign-in must finish
|
|
7
|
+
* through Anthropic's own flow. Older Crewly ran `claude setup-token`, read
|
|
8
|
+
* the token off the screen and saved it in `harness-credentials.json`
|
|
9
|
+
* (`claude.oauthToken` for the default login, `claudeAccounts.<name>.oauthToken`
|
|
10
|
+
* for named accounts). Crewly now signs in with Claude Code's own
|
|
11
|
+
* `claude auth login` and stores nothing (login-broker.service.ts).
|
|
12
|
+
*
|
|
13
|
+
* Rules of the transition:
|
|
14
|
+
*
|
|
15
|
+
* - A saved token keeps being handed to its account's Claude Code processes
|
|
16
|
+
* until that account is signed in natively (store.legacyClaudeTokenEnv).
|
|
17
|
+
* Nothing stops working on upgrade.
|
|
18
|
+
* - A token is deleted only after the account's native login is verified by
|
|
19
|
+
* a real Claude turn run WITHOUT any token or key in the env
|
|
20
|
+
* (claude-native-login.ts). A login that only looks signed in is not enough.
|
|
21
|
+
* - A named account's own config dir can only have been signed in by Crewly's
|
|
22
|
+
* flow or by the owner, so a verified native login there retires its token
|
|
23
|
+
* at once (the periodic run notices a login done by hand too). The default
|
|
24
|
+
* login is different: the machine's own Claude login may be another
|
|
25
|
+
* account than the one the saved token belongs to, so its token is retired
|
|
26
|
+
* only by a sign-in done through Crewly (`login claude`), never guessed.
|
|
27
|
+
* - The owner is told once per machine which accounts need one re-sign-in
|
|
28
|
+
* (state file `claude-token-migration.json`, no secrets in it).
|
|
29
|
+
* - When no saved token remains, the leftover Claude keys are removed from
|
|
30
|
+
* `harness-credentials.json`; other keys are untouched, the file is
|
|
31
|
+
* rewritten atomically with mode 0600, and no backup is kept.
|
|
32
|
+
*
|
|
33
|
+
* @module services/harness/claude-token-migration.service
|
|
34
|
+
*/
|
|
35
|
+
import { type HarnessCredentialsStore } from './harness-credentials.store.js';
|
|
36
|
+
import { type HarnessLogger, type LoginState } from './harness.types.js';
|
|
37
|
+
/** A login that still depends on a token an older Crewly saved. */
|
|
38
|
+
export interface LegacyTokenEntry {
|
|
39
|
+
/** Named account; null = the default login */
|
|
40
|
+
account: string | null;
|
|
41
|
+
}
|
|
42
|
+
/** What one run did. */
|
|
43
|
+
export interface MigrationResult {
|
|
44
|
+
/** Logins whose token was deleted this run */
|
|
45
|
+
retired: Array<string | null>;
|
|
46
|
+
/** Logins that still run on a saved token (need a native sign-in) */
|
|
47
|
+
pending: Array<string | null>;
|
|
48
|
+
/** The owner notice was sent this run */
|
|
49
|
+
notified: boolean;
|
|
50
|
+
}
|
|
51
|
+
/** Owner DM sender. */
|
|
52
|
+
export interface MigrationNotifier {
|
|
53
|
+
sendToOwner(text: string): Promise<unknown>;
|
|
54
|
+
}
|
|
55
|
+
/** Injectable dependencies. */
|
|
56
|
+
export interface ClaudeTokenMigrationDeps {
|
|
57
|
+
credentials?: Pick<HarnessCredentialsStore, 'getLegacyClaudeOauthToken' | 'listClaudeAccountsWithToken' | 'clearLegacyClaudeOauthToken' | 'clearClaudeAccount' | 'pruneLegacyClaudeKeys'>;
|
|
58
|
+
/** Real Claude turn on Claude Code's own login, no token in the env */
|
|
59
|
+
probe?: (configDir: string | null) => Promise<LoginState>;
|
|
60
|
+
/** `claude auth status` on Claude Code's own login */
|
|
61
|
+
readStatus?: (configDir: string | null) => Promise<boolean | null>;
|
|
62
|
+
/** Config dir of a named account */
|
|
63
|
+
accountConfigDir?: (account: string) => string;
|
|
64
|
+
notifier?: () => MigrationNotifier | null;
|
|
65
|
+
/** Directory of the state file (default CREWLY_HOME) */
|
|
66
|
+
crewlyHome?: string;
|
|
67
|
+
logger?: HarnessLogger;
|
|
68
|
+
now?: () => number;
|
|
69
|
+
}
|
|
70
|
+
/** Retires saved Claude tokens once the account is signed in natively. */
|
|
71
|
+
export declare class ClaudeTokenMigrationService {
|
|
72
|
+
private readonly credentials;
|
|
73
|
+
private readonly probe;
|
|
74
|
+
private readonly readStatus;
|
|
75
|
+
private readonly accountConfigDir;
|
|
76
|
+
private notifier;
|
|
77
|
+
private readonly crewlyHome;
|
|
78
|
+
private readonly logger;
|
|
79
|
+
private readonly now;
|
|
80
|
+
private running;
|
|
81
|
+
private timer;
|
|
82
|
+
/**
|
|
83
|
+
* @param deps - Injectable dependencies (all optional)
|
|
84
|
+
*/
|
|
85
|
+
constructor(deps?: ClaudeTokenMigrationDeps);
|
|
86
|
+
/**
|
|
87
|
+
* Where the owner notice is sent.
|
|
88
|
+
*
|
|
89
|
+
* @param notifier - Lazy owner DM sender
|
|
90
|
+
*/
|
|
91
|
+
setNotifier(notifier: () => MigrationNotifier | null): void;
|
|
92
|
+
/**
|
|
93
|
+
* Logins that still depend on a saved token.
|
|
94
|
+
*
|
|
95
|
+
* @returns Entries (default login first)
|
|
96
|
+
*/
|
|
97
|
+
listLegacy(): LegacyTokenEntry[];
|
|
98
|
+
/**
|
|
99
|
+
* Check every login that still has a saved token; retire what can be
|
|
100
|
+
* retired and tell the owner about the rest, once. Safe to call at any
|
|
101
|
+
* time and as often as you like (idempotent); concurrent calls share one run.
|
|
102
|
+
*
|
|
103
|
+
* @returns What happened; never rejects
|
|
104
|
+
*/
|
|
105
|
+
run(): Promise<MigrationResult>;
|
|
106
|
+
/**
|
|
107
|
+
* A sign-in done through Crewly just completed and was verified: retire
|
|
108
|
+
* the saved token of that login (default or named).
|
|
109
|
+
*
|
|
110
|
+
* @param account - Named account; null = the default login
|
|
111
|
+
* @returns Resolves when done; never rejects
|
|
112
|
+
*/
|
|
113
|
+
afterLogin(account: string | null): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Run now (after a short delay) and then on an interval.
|
|
116
|
+
*
|
|
117
|
+
* @param startDelayMs - Delay before the first run
|
|
118
|
+
*/
|
|
119
|
+
start(startDelayMs?: number): void;
|
|
120
|
+
/** Stop the timers. */
|
|
121
|
+
stop(): void;
|
|
122
|
+
private hasLegacy;
|
|
123
|
+
private configDirOf;
|
|
124
|
+
/**
|
|
125
|
+
* Delete the saved token of a login when its native login passes a real
|
|
126
|
+
* Claude turn with no token in the env.
|
|
127
|
+
*
|
|
128
|
+
* @param account - Named account; null = the default login
|
|
129
|
+
* @returns True when the token was deleted
|
|
130
|
+
*/
|
|
131
|
+
private retireIfVerified;
|
|
132
|
+
/** Remove leftover Claude keys once no saved token remains. */
|
|
133
|
+
private finishCleanup;
|
|
134
|
+
private runOnce;
|
|
135
|
+
private statePath;
|
|
136
|
+
private readState;
|
|
137
|
+
private writeState;
|
|
138
|
+
/**
|
|
139
|
+
* Tell the owner, once per machine, which logins need one re-sign-in.
|
|
140
|
+
*
|
|
141
|
+
* @param pending - Logins that still run on a saved token
|
|
142
|
+
* @returns True when the notice was delivered now
|
|
143
|
+
*/
|
|
144
|
+
private notifyOnce;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* The backend's token migration, bound to the stored credentials.
|
|
148
|
+
*
|
|
149
|
+
* @returns The singleton
|
|
150
|
+
*/
|
|
151
|
+
export declare function getClaudeTokenMigrationService(): ClaudeTokenMigrationService;
|
|
152
|
+
/**
|
|
153
|
+
* Replace or clear the singleton (tests).
|
|
154
|
+
*
|
|
155
|
+
* @param service - Service, or null
|
|
156
|
+
*/
|
|
157
|
+
export declare function setClaudeTokenMigrationServiceForTesting(service: ClaudeTokenMigrationService | null): void;
|
|
158
|
+
//# sourceMappingURL=claude-token-migration.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-token-migration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/claude-token-migration.service.ts"],"names":[],"mappings":"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"}
|