crewly 1.20.191 → 1.20.193
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/constants.ts +11 -0
- package/config/hooks/subagent-guard/subagent.sh +113 -0
- package/config/roles/architect/prompt.md +1 -1
- package/config/roles/auditor/prompt.md +1 -1
- package/config/roles/backend-developer/prompt.md +1 -1
- package/config/roles/content-strategist/prompt.md +2 -2
- package/config/roles/designer/prompt.md +1 -1
- package/config/roles/developer/prompt.md +2 -2
- package/config/roles/frontend-developer/prompt.md +1 -1
- package/config/roles/fullstack-dev/prompt.md +1 -1
- package/config/roles/generalist/prompt.md +1 -1
- package/config/roles/ops/prompt.md +1 -1
- package/config/roles/orchestrator/prompt.md +2 -2
- package/config/roles/product-manager/prompt.md +1 -1
- package/config/roles/qa/prompt.md +1 -1
- package/config/roles/qa-engineer/prompt.md +1 -1
- package/config/roles/researcher/prompt.md +1 -1
- package/config/roles/sales/prompt.md +1 -1
- package/config/roles/support/prompt.md +1 -1
- package/config/roles/team-leader/prompt.md +1 -1
- package/config/roles/tpm/prompt.md +1 -1
- package/config/roles/ux-designer/prompt.md +1 -1
- package/config/skills/_common/complete-body-shape.test.sh +17 -0
- package/config/skills/agent/core/complete-task/SKILL.md +27 -4
- package/config/skills/agent/core/complete-task/execute.sh +23 -3
- package/config/skills/agent/core/complete-task/execute.test.sh +34 -0
- package/config/skills/agent/core/handoff-task/execute.sh +1 -1
- package/config/skills/agent/core/report-status/SKILL.md +27 -4
- package/config/skills/agent/core/report-status/execute.sh +104 -4
- package/config/skills/agent/core/send-message/SKILL.md +6 -0
- package/config/skills/agent/core/send-message/execute.sh +17 -1
- package/config/skills/agent/core/send-message/execute.test.sh +81 -0
- package/config/skills/agent/core/todo-add/SKILL.md +16 -2
- package/config/skills/agent/core/todo-add/execute.sh +21 -5
- package/config/skills/agent/core/todo-add/execute.test.sh +14 -0
- package/config/skills/agent/core/todo-tasks/SKILL.md +4 -3
- package/config/skills/agent/core/todo-update/SKILL.md +13 -2
- package/config/skills/agent/core/todo-update/execute.sh +41 -3
- package/config/skills/agent/core/todo-update/execute.test.sh +7 -0
- package/config/skills/marketplace-registry.ts +4 -4
- package/config/skills/orchestrator/complete-task/SKILL.md +13 -6
- package/config/skills/orchestrator/complete-task/execute.sh +22 -3
- package/config/skills/orchestrator/delegate-task/execute.sh +2 -2
- package/config/skills/orchestrator/harness-login/SKILL.md +9 -1
- package/config/skills/orchestrator/harness-login/execute.sh +12 -4
- package/config/skills/orchestrator/harness-login/execute.test.sh +7 -0
- package/config/skills/team-leader/delegate-task/execute.sh +1 -1
- package/config/skills/team-leader/verify-output/SKILL.md +18 -1
- package/config/skills/team-leader/verify-output/execute.sh +28 -0
- package/config/skills/team-leader/verify-output/execute.test.sh +27 -0
- package/dist/backend/backend/src/constants.d.ts +181 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +183 -2
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts +6 -0
- package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.controller.js +15 -4
- package/dist/backend/backend/src/controllers/canva/canva.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js +3 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +4 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -0
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.js +32 -3
- package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts +41 -0
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +75 -0
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +6 -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 +21 -2
- 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 +3 -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.map +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +22 -3
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +19 -2
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +39 -6
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +3 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +9 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +71 -2
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/people/people.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/people/people.routes.js +90 -0
- package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/security/approvals.controller.d.ts +26 -0
- package/dist/backend/backend/src/controllers/security/approvals.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/security/approvals.controller.js +73 -0
- package/dist/backend/backend/src/controllers/security/approvals.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +9 -0
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +22 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +143 -3
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/usage.controller.d.ts +3 -3
- package/dist/backend/backend/src/controllers/system/usage.controller.js +3 -3
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +25 -3
- 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 +125 -19
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +14 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +44 -1
- 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 +3 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
- package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +28 -3
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +14 -3
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +49 -5
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts +8 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-approval.service.js +10 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.js.map +1 -1
- package/dist/backend/backend/src/services/canva/canva-token.service.d.ts +17 -4
- package/dist/backend/backend/src/services/canva/canva-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/canva/canva-token.service.js +49 -17
- package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +55 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +80 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +17 -2
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +30 -6
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +38 -2
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +63 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +204 -56
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
- 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.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +9 -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 +11 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +3 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +25 -2
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js +48 -7
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +207 -0
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-accounts.js +306 -0
- package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
- 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 +48 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js +156 -19
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.d.ts +2 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +19 -4
- 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 +46 -7
- package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +18 -2
- package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/owner-login-request.js +31 -7
- package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +29 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/spend-capped-delivery.d.ts +54 -0
- package/dist/backend/backend/src/services/messaging/spend-capped-delivery.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/spend-capped-delivery.js +65 -0
- package/dist/backend/backend/src/services/messaging/spend-capped-delivery.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +87 -5
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +151 -12
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +17 -4
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +45 -17
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts +118 -2
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js +213 -45
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +53 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +137 -60
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/model-pricing.d.ts +2 -1
- package/dist/backend/backend/src/services/monitoring/model-pricing.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/model-pricing.js +13 -0
- package/dist/backend/backend/src/services/monitoring/model-pricing.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +9 -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 +32 -3
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/people/acting-for.service.d.ts +151 -0
- package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/acting-for.service.js +224 -0
- package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.d.ts +89 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.js +113 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.js.map +1 -0
- package/dist/backend/backend/src/services/people/grant-sharing.d.ts +79 -0
- package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/grant-sharing.js +135 -0
- package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -0
- package/dist/backend/backend/src/services/people/people-directory.service.d.ts +181 -0
- package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/people-directory.service.js +317 -0
- package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +16 -2
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +60 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +140 -8
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.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 +12 -2
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +7 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +18 -3
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -1
- package/dist/backend/backend/src/services/security/approval-activity.service.d.ts +203 -0
- package/dist/backend/backend/src/services/security/approval-activity.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/security/approval-activity.service.js +279 -0
- package/dist/backend/backend/src/services/security/approval-activity.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill.service.js +14 -3
- package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +3 -0
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +22 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +50 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +54 -1
- 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 +260 -20
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap-command.js +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +48 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.js +85 -2
- package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts +105 -0
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js +238 -0
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js.map +1 -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 +4 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +101 -14
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/usage/usage-stats.service.js +183 -61
- package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -0
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +9 -0
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +10 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +45 -2
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +12 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.d.ts +5 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts +77 -0
- package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/v2/completion-evidence.types.js +119 -0
- package/dist/backend/backend/src/types/v2/completion-evidence.types.js.map +1 -0
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +13 -0
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +11 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +11 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +181 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +183 -2
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +13 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +28 -3
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +14 -3
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +49 -5
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +55 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +80 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +204 -56
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
- 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.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +9 -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 +11 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +207 -0
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-accounts.js +306 -0
- package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
- 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 +48 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js +156 -19
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.d.ts +2 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +19 -4
- 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 +46 -7
- package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +18 -2
- package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/owner-login-request.js +31 -7
- package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +29 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts +197 -0
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js +455 -0
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts +2 -1
- package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/model-pricing.js +13 -0
- package/dist/cli/backend/src/services/monitoring/model-pricing.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +9 -0
- 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 +32 -3
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/people/acting-for.service.d.ts +151 -0
- package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/people/acting-for.service.js +224 -0
- package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.d.ts +89 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.js +113 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.js.map +1 -0
- package/dist/cli/backend/src/services/people/people-directory.service.d.ts +181 -0
- package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/people/people-directory.service.js +317 -0
- package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
- package/dist/cli/backend/src/services/skill/skill.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/skill/skill.service.js +14 -3
- package/dist/cli/backend/src/services/skill/skill.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +3 -0
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +22 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +50 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +54 -1
- 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 +260 -20
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- 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 +4 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +12 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/messaging.types.d.ts +5 -0
- package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/messaging.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +13 -0
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.d.ts +21 -0
- package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.js +35 -1
- package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
- package/dist/cli/config/constants.d.ts +11 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +11 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/skills/marketplace-registry.d.ts +4 -4
- package/dist/cli/config/skills/marketplace-registry.js +4 -4
- package/frontend/dist/assets/index-465d1f8f.js +4955 -0
- package/frontend/dist/assets/index-5e967795.css +42 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/packages/crewly-agent/src/runtime/tool-registry.test.ts +45 -0
- package/packages/crewly-agent/src/runtime/tool-registry.ts +40 -5
- package/packages/crewly-agent/src/test/isolated-home.test.ts +24 -0
- package/frontend/dist/assets/index-20a67829.css +0 -42
- package/frontend/dist/assets/index-49f50b45.js +0 -4952
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Session Token Reader
|
|
3
|
+
*
|
|
4
|
+
* Reads per-turn token usage from Claude Code's session JSONL files.
|
|
5
|
+
* Claude Code stores conversations at:
|
|
6
|
+
* ~/.claude/projects/{path-slug}/{sessionId}.jsonl
|
|
7
|
+
* or, for a session that runs on another of the owner's Claude Code accounts
|
|
8
|
+
* (issue #942, `CLAUDE_CONFIG_DIR` set to the account's config dir):
|
|
9
|
+
* <account config dir>/projects/{path-slug}/{sessionId}.jsonl
|
|
10
|
+
*
|
|
11
|
+
* Each assistant message includes an API `usage` object with exact
|
|
12
|
+
* token counts (input_tokens, output_tokens, cache tokens).
|
|
13
|
+
*
|
|
14
|
+
* Used as the primary token source for claude-code agents because
|
|
15
|
+
* Claude Code's TUI status bar is not capturable from PTY scrollback.
|
|
16
|
+
*
|
|
17
|
+
* @module services/monitoring/claude-session-tokens
|
|
18
|
+
*/
|
|
19
|
+
/** Aggregated token usage for a time window. */
|
|
20
|
+
export interface SessionTokenSummary {
|
|
21
|
+
inputTokens: number;
|
|
22
|
+
outputTokens: number;
|
|
23
|
+
cacheReadTokens: number;
|
|
24
|
+
cacheCreateTokens: number;
|
|
25
|
+
cost: number;
|
|
26
|
+
model: string;
|
|
27
|
+
turnCount: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Encodes an absolute path into the slug format used by Claude Code
|
|
31
|
+
* for its projects directory. Replaces `/` with `-`.
|
|
32
|
+
*
|
|
33
|
+
* @param projectPath - Absolute path (e.g. /Users/alice/.crewly)
|
|
34
|
+
* @returns Encoded slug (e.g. -Users-alice--crewly)
|
|
35
|
+
*/
|
|
36
|
+
export declare function encodeProjectSlug(projectPath: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Builds the ordered, de-duplicated list of Claude Code project slugs that may
|
|
39
|
+
* hold transcripts for a working directory.
|
|
40
|
+
*
|
|
41
|
+
* Claude Code names its project directory after the *resolved* cwd (it sees
|
|
42
|
+
* `process.cwd()`, which the OS has already run through any symlinks). On
|
|
43
|
+
* macOS `/tmp` and `/var` are symlinks into `/private`, so an agent launched
|
|
44
|
+
* in `/tmp/proj` writes to `-private-tmp-proj`, not `-tmp-proj` (#938).
|
|
45
|
+
*
|
|
46
|
+
* The realpath slug comes first because that is where Claude Code writes. The
|
|
47
|
+
* raw slug is kept as a fallback for a cwd that cannot be resolved (deleted,
|
|
48
|
+
* permission denied) and for transcripts written before a directory was moved
|
|
49
|
+
* behind a symlink. Resolution failures never throw.
|
|
50
|
+
*
|
|
51
|
+
* @param projectPath - The agent's working directory, as Crewly recorded it
|
|
52
|
+
* @returns Slugs to try, most likely first; never empty
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* await resolveProjectSlugCandidates('/tmp/proj');
|
|
57
|
+
* // macOS: ['-private-tmp-proj', '-tmp-proj']; Linux: ['-tmp-proj']
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveProjectSlugCandidates(projectPath: string): Promise<string[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Synchronous {@link resolveProjectSlugCandidates}, for callers that cannot
|
|
63
|
+
* await (launch-time resume checks).
|
|
64
|
+
*
|
|
65
|
+
* The raw slug is taken from the absolute (`path.resolve`d) cwd.
|
|
66
|
+
*
|
|
67
|
+
* @param projectPath - The agent's working directory
|
|
68
|
+
* @returns Slugs to try, realpath slug first; never empty
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* resolveProjectSlugCandidatesSync('/tmp/proj');
|
|
73
|
+
* // macOS: ['-private-tmp-proj', '-tmp-proj']
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function resolveProjectSlugCandidatesSync(projectPath: string): string[];
|
|
77
|
+
/**
|
|
78
|
+
* The `projects/` directories Claude Code may have written a session's
|
|
79
|
+
* transcripts to, most likely first.
|
|
80
|
+
*
|
|
81
|
+
* A session on another of the owner's Claude Code accounts (issue #942) runs
|
|
82
|
+
* with `CLAUDE_CONFIG_DIR` set to that account's config dir, so its
|
|
83
|
+
* transcripts land in `<config dir>/projects/`. The default login's
|
|
84
|
+
* `~/.claude/projects/` is always included last: a session that switched
|
|
85
|
+
* accounts during the day has transcripts in both.
|
|
86
|
+
*
|
|
87
|
+
* @param homeDir - Home directory that contains `.claude/`
|
|
88
|
+
* @param configDirs - Claude config dirs of the session's accounts (current account first)
|
|
89
|
+
* @returns Absolute `projects/` directory paths, de-duplicated
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* claudeProjectsRoots('/Users/a', ['/Users/a/.crewly/claude-accounts/work']);
|
|
94
|
+
* // ['/Users/a/.crewly/claude-accounts/work/projects', '/Users/a/.claude/projects']
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function claudeProjectsRoots(homeDir: string, configDirs?: readonly string[]): string[];
|
|
98
|
+
/**
|
|
99
|
+
* Lists the Claude Code project directories that may hold transcripts for a
|
|
100
|
+
* working directory: every root of {@link claudeProjectsRoots}, each with the
|
|
101
|
+
* slugs of {@link resolveProjectSlugCandidates}. The directories are not
|
|
102
|
+
* required to exist.
|
|
103
|
+
*
|
|
104
|
+
* @param projectPath - The agent's working directory
|
|
105
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
106
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts the session runs on (searched first)
|
|
107
|
+
* @returns Absolute candidate directory paths, most likely first
|
|
108
|
+
*/
|
|
109
|
+
export declare function resolveProjectDirCandidates(projectPath: string, homeDir?: string, configDirs?: readonly string[]): Promise<string[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Locates a known conversation's transcript across all candidate project
|
|
112
|
+
* directories, returning the first one that exists.
|
|
113
|
+
*
|
|
114
|
+
* @param projectPath - The agent's working directory
|
|
115
|
+
* @param sessionId - Claude Code conversation UUID
|
|
116
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
117
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts (searched first)
|
|
118
|
+
* @returns Absolute path to the existing .jsonl file, or null if none exists
|
|
119
|
+
*/
|
|
120
|
+
export declare function findSessionJsonlPath(projectPath: string, sessionId: string, homeDir?: string, configDirs?: readonly string[]): Promise<string | null>;
|
|
121
|
+
/**
|
|
122
|
+
* Lists every transcript file across all candidate project directories.
|
|
123
|
+
*
|
|
124
|
+
* Merges rather than stopping at the first existing directory: if both the
|
|
125
|
+
* resolved and the raw slug directories exist, the live conversation may be in
|
|
126
|
+
* either, and picking a directory by existence alone could lock onto a stale
|
|
127
|
+
* one. A file name seen in an earlier (more likely) directory shadows the same
|
|
128
|
+
* name in a later one, so a conversation is never listed twice.
|
|
129
|
+
*
|
|
130
|
+
* @param projectPath - The agent's working directory
|
|
131
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
132
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts (searched first)
|
|
133
|
+
* @returns Absolute paths of all .jsonl files found, grouped by candidate directory order
|
|
134
|
+
*/
|
|
135
|
+
export declare function listProjectTranscripts(projectPath: string, homeDir?: string, configDirs?: readonly string[]): Promise<string[]>;
|
|
136
|
+
/**
|
|
137
|
+
* Finds the most recently modified transcript across all candidate project
|
|
138
|
+
* directories for a working directory.
|
|
139
|
+
*
|
|
140
|
+
* @param projectPath - The agent's working directory
|
|
141
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
142
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts (searched too)
|
|
143
|
+
* @returns Absolute path of the newest .jsonl file, or null if there is none
|
|
144
|
+
*/
|
|
145
|
+
export declare function findLatestSessionFile(projectPath: string, homeDir?: string, configDirs?: readonly string[]): Promise<string | null>;
|
|
146
|
+
/**
|
|
147
|
+
* Returns the path to a Claude Code session JSONL file under the *raw* cwd
|
|
148
|
+
* slug. Does not resolve symlinks — prefer {@link findSessionJsonlPath},
|
|
149
|
+
* which also checks the realpath slug Claude Code actually writes to.
|
|
150
|
+
*
|
|
151
|
+
* @param projectPath - The agent's working directory
|
|
152
|
+
* @param sessionId - Claude Code conversation UUID
|
|
153
|
+
* @returns Absolute path to the .jsonl file
|
|
154
|
+
*/
|
|
155
|
+
export declare function getSessionJsonlPath(projectPath: string, sessionId: string): string;
|
|
156
|
+
/**
|
|
157
|
+
* Finds the most recently modified .jsonl session file in a Claude Code
|
|
158
|
+
* project directory. Used as a fallback when the session ID is not known
|
|
159
|
+
* (e.g. the orchestrator session, which may not have been persisted yet).
|
|
160
|
+
* Checks both the realpath and the raw cwd slug directories.
|
|
161
|
+
*
|
|
162
|
+
* @param projectPath - The agent's working directory
|
|
163
|
+
* @returns The session UUID, or null if no JSONL files found
|
|
164
|
+
*/
|
|
165
|
+
export declare function findLatestSessionId(projectPath: string): Promise<string | null>;
|
|
166
|
+
/**
|
|
167
|
+
* Reads token usage from a Claude Code session JSONL, summing all
|
|
168
|
+
* assistant turns whose timestamp is at or after `since`.
|
|
169
|
+
*
|
|
170
|
+
* Reads the file from the end backwards for efficiency — recent
|
|
171
|
+
* entries are at the tail.
|
|
172
|
+
*
|
|
173
|
+
* @param projectPath - The agent's working directory
|
|
174
|
+
* @param sessionId - Claude Code conversation UUID (if null, auto-detects latest)
|
|
175
|
+
* @param since - Only count turns at or after this time
|
|
176
|
+
* @param until - Only count turns before this time (defaults to now)
|
|
177
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts the session runs on
|
|
178
|
+
* @returns Aggregated token summary, or null if the file doesn't exist
|
|
179
|
+
*/
|
|
180
|
+
export declare function getTokensSince(projectPath: string, sessionId: string | null, since: Date, until?: Date, configDirs?: readonly string[]): Promise<SessionTokenSummary | null>;
|
|
181
|
+
/**
|
|
182
|
+
* Scans all Claude Code session JSONL files for a project and feeds
|
|
183
|
+
* aggregated per-session token data into TokenUsageService.
|
|
184
|
+
*
|
|
185
|
+
* This bridges the gap between Claude Code's file-based token tracking
|
|
186
|
+
* and the in-memory TokenUsageService that powers the Usage dashboard.
|
|
187
|
+
* Should be called once during server startup.
|
|
188
|
+
*
|
|
189
|
+
* Only processes sessions modified in the last `maxAgeDays` to avoid
|
|
190
|
+
* scanning hundreds of old session files.
|
|
191
|
+
*
|
|
192
|
+
* @param projectPath - The project's working directory
|
|
193
|
+
* @param maxAgeDays - Only process sessions modified within this many days (default: 7)
|
|
194
|
+
* @returns Number of sessions loaded
|
|
195
|
+
*/
|
|
196
|
+
export declare function syncSessionsToTokenUsageService(projectPath: string, maxAgeDays?: number): Promise<number>;
|
|
197
|
+
//# sourceMappingURL=claude-session-tokens.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-session-tokens.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/monitoring/claude-session-tokens.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsCH,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAWD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASzF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAU9E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,EAAE,CAMjG;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAAqB,EAC9B,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAqB,EAC9B,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAAqB,EAC9B,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAAqB,EAC9B,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGrF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,IAAI,EACX,KAAK,CAAC,EAAE,IAAI,EACZ,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAiFrC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,MAAM,EACnB,UAAU,SAAI,GACb,OAAO,CAAC,MAAM,CAAC,CAsFjB"}
|
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Session Token Reader
|
|
3
|
+
*
|
|
4
|
+
* Reads per-turn token usage from Claude Code's session JSONL files.
|
|
5
|
+
* Claude Code stores conversations at:
|
|
6
|
+
* ~/.claude/projects/{path-slug}/{sessionId}.jsonl
|
|
7
|
+
* or, for a session that runs on another of the owner's Claude Code accounts
|
|
8
|
+
* (issue #942, `CLAUDE_CONFIG_DIR` set to the account's config dir):
|
|
9
|
+
* <account config dir>/projects/{path-slug}/{sessionId}.jsonl
|
|
10
|
+
*
|
|
11
|
+
* Each assistant message includes an API `usage` object with exact
|
|
12
|
+
* token counts (input_tokens, output_tokens, cache tokens).
|
|
13
|
+
*
|
|
14
|
+
* Used as the primary token source for claude-code agents because
|
|
15
|
+
* Claude Code's TUI status bar is not capturable from PTY scrollback.
|
|
16
|
+
*
|
|
17
|
+
* @module services/monitoring/claude-session-tokens
|
|
18
|
+
*/
|
|
19
|
+
import { promises as fs, realpathSync } from 'fs';
|
|
20
|
+
import * as path from 'path';
|
|
21
|
+
import * as os from 'os';
|
|
22
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
23
|
+
/**
|
|
24
|
+
* Cache-aware cost rates for Claude models (USD per token).
|
|
25
|
+
* Cache reads are ~10% of input price; cache writes are ~125% of input price.
|
|
26
|
+
*/
|
|
27
|
+
const CLAUDE_COST_RATES = {
|
|
28
|
+
'claude-opus-4-6': { input: 0.000015, output: 0.000075, cacheRead: 0.0000015, cacheWrite: 0.00001875 },
|
|
29
|
+
'claude-opus-4-20250514': { input: 0.000015, output: 0.000075, cacheRead: 0.0000015, cacheWrite: 0.00001875 },
|
|
30
|
+
'claude-sonnet-4-6': { input: 0.000003, output: 0.000015, cacheRead: 0.0000003, cacheWrite: 0.00000375 },
|
|
31
|
+
'claude-sonnet-4-20250514': { input: 0.000003, output: 0.000015, cacheRead: 0.0000003, cacheWrite: 0.00000375 },
|
|
32
|
+
'claude-haiku-4-20250506': { input: 0.00000025, output: 0.00000125, cacheRead: 0.000000025, cacheWrite: 0.0000003125 },
|
|
33
|
+
default: { input: 0.000003, output: 0.000015, cacheRead: 0.0000003, cacheWrite: 0.00000375 },
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Calculates cost with proper cache-aware pricing for Claude models.
|
|
37
|
+
*/
|
|
38
|
+
function calculateClaudeCost(inputTokens, outputTokens, cacheReadTokens, cacheCreateTokens, model) {
|
|
39
|
+
const rates = CLAUDE_COST_RATES[model] || CLAUDE_COST_RATES.default;
|
|
40
|
+
return (inputTokens * rates.input +
|
|
41
|
+
outputTokens * rates.output +
|
|
42
|
+
cacheReadTokens * rates.cacheRead +
|
|
43
|
+
cacheCreateTokens * rates.cacheWrite);
|
|
44
|
+
}
|
|
45
|
+
/** Claude Code's per-user state directory, under the home directory. */
|
|
46
|
+
const CLAUDE_DIR_NAME = '.claude';
|
|
47
|
+
/** Subdirectory of {@link CLAUDE_DIR_NAME} holding one directory per project slug. */
|
|
48
|
+
const CLAUDE_PROJECTS_DIR_NAME = 'projects';
|
|
49
|
+
/** File extension of Claude Code conversation transcripts. */
|
|
50
|
+
const JSONL_EXTENSION = '.jsonl';
|
|
51
|
+
const logger = LoggerService.getInstance().createComponentLogger('ClaudeSessionTokens');
|
|
52
|
+
/**
|
|
53
|
+
* Encodes an absolute path into the slug format used by Claude Code
|
|
54
|
+
* for its projects directory. Replaces `/` with `-`.
|
|
55
|
+
*
|
|
56
|
+
* @param projectPath - Absolute path (e.g. /Users/alice/.crewly)
|
|
57
|
+
* @returns Encoded slug (e.g. -Users-alice--crewly)
|
|
58
|
+
*/
|
|
59
|
+
export function encodeProjectSlug(projectPath) {
|
|
60
|
+
// Claude Code replaces both / and . with - in its project directory slug
|
|
61
|
+
return projectPath.replace(/[/.]/g, '-');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Builds the ordered, de-duplicated list of Claude Code project slugs that may
|
|
65
|
+
* hold transcripts for a working directory.
|
|
66
|
+
*
|
|
67
|
+
* Claude Code names its project directory after the *resolved* cwd (it sees
|
|
68
|
+
* `process.cwd()`, which the OS has already run through any symlinks). On
|
|
69
|
+
* macOS `/tmp` and `/var` are symlinks into `/private`, so an agent launched
|
|
70
|
+
* in `/tmp/proj` writes to `-private-tmp-proj`, not `-tmp-proj` (#938).
|
|
71
|
+
*
|
|
72
|
+
* The realpath slug comes first because that is where Claude Code writes. The
|
|
73
|
+
* raw slug is kept as a fallback for a cwd that cannot be resolved (deleted,
|
|
74
|
+
* permission denied) and for transcripts written before a directory was moved
|
|
75
|
+
* behind a symlink. Resolution failures never throw.
|
|
76
|
+
*
|
|
77
|
+
* @param projectPath - The agent's working directory, as Crewly recorded it
|
|
78
|
+
* @returns Slugs to try, most likely first; never empty
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* await resolveProjectSlugCandidates('/tmp/proj');
|
|
83
|
+
* // macOS: ['-private-tmp-proj', '-tmp-proj']; Linux: ['-tmp-proj']
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export async function resolveProjectSlugCandidates(projectPath) {
|
|
87
|
+
const rawSlug = encodeProjectSlug(projectPath);
|
|
88
|
+
let resolvedSlug = null;
|
|
89
|
+
try {
|
|
90
|
+
resolvedSlug = encodeProjectSlug(await fs.realpath(projectPath));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Nonexistent or unreadable cwd — the raw slug is the only guess left.
|
|
94
|
+
}
|
|
95
|
+
return resolvedSlug && resolvedSlug !== rawSlug ? [resolvedSlug, rawSlug] : [rawSlug];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Synchronous {@link resolveProjectSlugCandidates}, for callers that cannot
|
|
99
|
+
* await (launch-time resume checks).
|
|
100
|
+
*
|
|
101
|
+
* The raw slug is taken from the absolute (`path.resolve`d) cwd.
|
|
102
|
+
*
|
|
103
|
+
* @param projectPath - The agent's working directory
|
|
104
|
+
* @returns Slugs to try, realpath slug first; never empty
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* resolveProjectSlugCandidatesSync('/tmp/proj');
|
|
109
|
+
* // macOS: ['-private-tmp-proj', '-tmp-proj']
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function resolveProjectSlugCandidatesSync(projectPath) {
|
|
113
|
+
const absolute = path.resolve(projectPath);
|
|
114
|
+
const rawSlug = encodeProjectSlug(absolute);
|
|
115
|
+
let resolvedSlug = null;
|
|
116
|
+
try {
|
|
117
|
+
resolvedSlug = encodeProjectSlug(realpathSync(absolute));
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Nonexistent or unreadable cwd — the raw slug is the only guess left.
|
|
121
|
+
}
|
|
122
|
+
return resolvedSlug && resolvedSlug !== rawSlug ? [resolvedSlug, rawSlug] : [rawSlug];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The `projects/` directories Claude Code may have written a session's
|
|
126
|
+
* transcripts to, most likely first.
|
|
127
|
+
*
|
|
128
|
+
* A session on another of the owner's Claude Code accounts (issue #942) runs
|
|
129
|
+
* with `CLAUDE_CONFIG_DIR` set to that account's config dir, so its
|
|
130
|
+
* transcripts land in `<config dir>/projects/`. The default login's
|
|
131
|
+
* `~/.claude/projects/` is always included last: a session that switched
|
|
132
|
+
* accounts during the day has transcripts in both.
|
|
133
|
+
*
|
|
134
|
+
* @param homeDir - Home directory that contains `.claude/`
|
|
135
|
+
* @param configDirs - Claude config dirs of the session's accounts (current account first)
|
|
136
|
+
* @returns Absolute `projects/` directory paths, de-duplicated
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* claudeProjectsRoots('/Users/a', ['/Users/a/.crewly/claude-accounts/work']);
|
|
141
|
+
* // ['/Users/a/.crewly/claude-accounts/work/projects', '/Users/a/.claude/projects']
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export function claudeProjectsRoots(homeDir, configDirs = []) {
|
|
145
|
+
const roots = [
|
|
146
|
+
...configDirs.map((dir) => path.join(dir, CLAUDE_PROJECTS_DIR_NAME)),
|
|
147
|
+
path.join(homeDir, CLAUDE_DIR_NAME, CLAUDE_PROJECTS_DIR_NAME),
|
|
148
|
+
];
|
|
149
|
+
return [...new Set(roots)];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Lists the Claude Code project directories that may hold transcripts for a
|
|
153
|
+
* working directory: every root of {@link claudeProjectsRoots}, each with the
|
|
154
|
+
* slugs of {@link resolveProjectSlugCandidates}. The directories are not
|
|
155
|
+
* required to exist.
|
|
156
|
+
*
|
|
157
|
+
* @param projectPath - The agent's working directory
|
|
158
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
159
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts the session runs on (searched first)
|
|
160
|
+
* @returns Absolute candidate directory paths, most likely first
|
|
161
|
+
*/
|
|
162
|
+
export async function resolveProjectDirCandidates(projectPath, homeDir = os.homedir(), configDirs = []) {
|
|
163
|
+
const slugs = await resolveProjectSlugCandidates(projectPath);
|
|
164
|
+
return claudeProjectsRoots(homeDir, configDirs).flatMap((root) => slugs.map((slug) => path.join(root, slug)));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Locates a known conversation's transcript across all candidate project
|
|
168
|
+
* directories, returning the first one that exists.
|
|
169
|
+
*
|
|
170
|
+
* @param projectPath - The agent's working directory
|
|
171
|
+
* @param sessionId - Claude Code conversation UUID
|
|
172
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
173
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts (searched first)
|
|
174
|
+
* @returns Absolute path to the existing .jsonl file, or null if none exists
|
|
175
|
+
*/
|
|
176
|
+
export async function findSessionJsonlPath(projectPath, sessionId, homeDir = os.homedir(), configDirs = []) {
|
|
177
|
+
for (const dir of await resolveProjectDirCandidates(projectPath, homeDir, configDirs)) {
|
|
178
|
+
const candidate = path.join(dir, `${sessionId}${JSONL_EXTENSION}`);
|
|
179
|
+
try {
|
|
180
|
+
await fs.access(candidate);
|
|
181
|
+
return candidate;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Lists every transcript file across all candidate project directories.
|
|
191
|
+
*
|
|
192
|
+
* Merges rather than stopping at the first existing directory: if both the
|
|
193
|
+
* resolved and the raw slug directories exist, the live conversation may be in
|
|
194
|
+
* either, and picking a directory by existence alone could lock onto a stale
|
|
195
|
+
* one. A file name seen in an earlier (more likely) directory shadows the same
|
|
196
|
+
* name in a later one, so a conversation is never listed twice.
|
|
197
|
+
*
|
|
198
|
+
* @param projectPath - The agent's working directory
|
|
199
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
200
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts (searched first)
|
|
201
|
+
* @returns Absolute paths of all .jsonl files found, grouped by candidate directory order
|
|
202
|
+
*/
|
|
203
|
+
export async function listProjectTranscripts(projectPath, homeDir = os.homedir(), configDirs = []) {
|
|
204
|
+
const seen = new Set();
|
|
205
|
+
const result = [];
|
|
206
|
+
for (const dir of await resolveProjectDirCandidates(projectPath, homeDir, configDirs)) {
|
|
207
|
+
let files;
|
|
208
|
+
try {
|
|
209
|
+
files = await fs.readdir(dir);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
for (const file of files) {
|
|
215
|
+
if (!file.endsWith(JSONL_EXTENSION) || seen.has(file))
|
|
216
|
+
continue;
|
|
217
|
+
seen.add(file);
|
|
218
|
+
result.push(path.join(dir, file));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Finds the most recently modified transcript across all candidate project
|
|
225
|
+
* directories for a working directory.
|
|
226
|
+
*
|
|
227
|
+
* @param projectPath - The agent's working directory
|
|
228
|
+
* @param homeDir - Home directory that contains `.claude/` (defaults to the OS home)
|
|
229
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts (searched too)
|
|
230
|
+
* @returns Absolute path of the newest .jsonl file, or null if there is none
|
|
231
|
+
*/
|
|
232
|
+
export async function findLatestSessionFile(projectPath, homeDir = os.homedir(), configDirs = []) {
|
|
233
|
+
let latestFile = null;
|
|
234
|
+
let latestMtime = -1;
|
|
235
|
+
for (const file of await listProjectTranscripts(projectPath, homeDir, configDirs)) {
|
|
236
|
+
try {
|
|
237
|
+
const { mtimeMs } = await fs.stat(file);
|
|
238
|
+
if (mtimeMs > latestMtime) {
|
|
239
|
+
latestMtime = mtimeMs;
|
|
240
|
+
latestFile = file;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return latestFile;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Returns the path to a Claude Code session JSONL file under the *raw* cwd
|
|
251
|
+
* slug. Does not resolve symlinks — prefer {@link findSessionJsonlPath},
|
|
252
|
+
* which also checks the realpath slug Claude Code actually writes to.
|
|
253
|
+
*
|
|
254
|
+
* @param projectPath - The agent's working directory
|
|
255
|
+
* @param sessionId - Claude Code conversation UUID
|
|
256
|
+
* @returns Absolute path to the .jsonl file
|
|
257
|
+
*/
|
|
258
|
+
export function getSessionJsonlPath(projectPath, sessionId) {
|
|
259
|
+
const slug = encodeProjectSlug(projectPath);
|
|
260
|
+
return path.join(os.homedir(), CLAUDE_DIR_NAME, CLAUDE_PROJECTS_DIR_NAME, slug, `${sessionId}${JSONL_EXTENSION}`);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Finds the most recently modified .jsonl session file in a Claude Code
|
|
264
|
+
* project directory. Used as a fallback when the session ID is not known
|
|
265
|
+
* (e.g. the orchestrator session, which may not have been persisted yet).
|
|
266
|
+
* Checks both the realpath and the raw cwd slug directories.
|
|
267
|
+
*
|
|
268
|
+
* @param projectPath - The agent's working directory
|
|
269
|
+
* @returns The session UUID, or null if no JSONL files found
|
|
270
|
+
*/
|
|
271
|
+
export async function findLatestSessionId(projectPath) {
|
|
272
|
+
const latest = await findLatestSessionFile(projectPath);
|
|
273
|
+
return latest ? path.basename(latest, JSONL_EXTENSION) : null;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Reads token usage from a Claude Code session JSONL, summing all
|
|
277
|
+
* assistant turns whose timestamp is at or after `since`.
|
|
278
|
+
*
|
|
279
|
+
* Reads the file from the end backwards for efficiency — recent
|
|
280
|
+
* entries are at the tail.
|
|
281
|
+
*
|
|
282
|
+
* @param projectPath - The agent's working directory
|
|
283
|
+
* @param sessionId - Claude Code conversation UUID (if null, auto-detects latest)
|
|
284
|
+
* @param since - Only count turns at or after this time
|
|
285
|
+
* @param until - Only count turns before this time (defaults to now)
|
|
286
|
+
* @param configDirs - Config dirs of the owner's other Claude Code accounts the session runs on
|
|
287
|
+
* @returns Aggregated token summary, or null if the file doesn't exist
|
|
288
|
+
*/
|
|
289
|
+
export async function getTokensSince(projectPath, sessionId, since, until, configDirs = []) {
|
|
290
|
+
// Auto-detect session if not provided
|
|
291
|
+
const filePath = sessionId
|
|
292
|
+
? await findSessionJsonlPath(projectPath, sessionId, os.homedir(), configDirs)
|
|
293
|
+
: await findLatestSessionFile(projectPath, os.homedir(), configDirs);
|
|
294
|
+
if (!filePath) {
|
|
295
|
+
logger.debug('No Claude session JSONL found', { projectPath, sessionId });
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
let content;
|
|
299
|
+
try {
|
|
300
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
logger.debug('Session JSONL not found', { filePath });
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
const sinceMs = since.getTime();
|
|
307
|
+
const untilMs = until ? until.getTime() : Infinity;
|
|
308
|
+
const summary = {
|
|
309
|
+
inputTokens: 0,
|
|
310
|
+
outputTokens: 0,
|
|
311
|
+
cacheReadTokens: 0,
|
|
312
|
+
cacheCreateTokens: 0,
|
|
313
|
+
cost: 0,
|
|
314
|
+
model: '',
|
|
315
|
+
turnCount: 0,
|
|
316
|
+
};
|
|
317
|
+
// Parse lines from the end — most recent entries are last
|
|
318
|
+
const lines = content.split('\n');
|
|
319
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
320
|
+
const line = lines[i].trim();
|
|
321
|
+
if (!line)
|
|
322
|
+
continue;
|
|
323
|
+
let entry;
|
|
324
|
+
try {
|
|
325
|
+
entry = JSON.parse(line);
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
// Only assistant messages carry usage data
|
|
331
|
+
if (entry.type !== 'assistant')
|
|
332
|
+
continue;
|
|
333
|
+
const ts = entry.timestamp;
|
|
334
|
+
if (!ts)
|
|
335
|
+
continue;
|
|
336
|
+
// Timestamp can be ISO string or epoch ms
|
|
337
|
+
const entryMs = typeof ts === 'number' ? ts : new Date(ts).getTime();
|
|
338
|
+
if (isNaN(entryMs))
|
|
339
|
+
continue;
|
|
340
|
+
// Stop scanning once we're before the window — entries are chronological
|
|
341
|
+
if (entryMs < sinceMs)
|
|
342
|
+
break;
|
|
343
|
+
// Skip entries after the upper bound
|
|
344
|
+
if (entryMs > untilMs)
|
|
345
|
+
continue;
|
|
346
|
+
const msg = entry.message;
|
|
347
|
+
if (!msg)
|
|
348
|
+
continue;
|
|
349
|
+
const usage = msg.usage;
|
|
350
|
+
if (!usage)
|
|
351
|
+
continue;
|
|
352
|
+
const inputTokens = usage.input_tokens || 0;
|
|
353
|
+
const outputTokens = usage.output_tokens || 0;
|
|
354
|
+
const cacheRead = usage.cache_read_input_tokens || 0;
|
|
355
|
+
const cacheCreate = usage.cache_creation_input_tokens || 0;
|
|
356
|
+
const model = msg.model || '';
|
|
357
|
+
summary.inputTokens += inputTokens + cacheRead + cacheCreate;
|
|
358
|
+
summary.outputTokens += outputTokens;
|
|
359
|
+
summary.cacheReadTokens += cacheRead;
|
|
360
|
+
summary.cacheCreateTokens += cacheCreate;
|
|
361
|
+
summary.cost += calculateClaudeCost(inputTokens, outputTokens, cacheRead, cacheCreate, model);
|
|
362
|
+
summary.turnCount += 1;
|
|
363
|
+
if (!summary.model && model)
|
|
364
|
+
summary.model = model;
|
|
365
|
+
}
|
|
366
|
+
return summary;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Scans all Claude Code session JSONL files for a project and feeds
|
|
370
|
+
* aggregated per-session token data into TokenUsageService.
|
|
371
|
+
*
|
|
372
|
+
* This bridges the gap between Claude Code's file-based token tracking
|
|
373
|
+
* and the in-memory TokenUsageService that powers the Usage dashboard.
|
|
374
|
+
* Should be called once during server startup.
|
|
375
|
+
*
|
|
376
|
+
* Only processes sessions modified in the last `maxAgeDays` to avoid
|
|
377
|
+
* scanning hundreds of old session files.
|
|
378
|
+
*
|
|
379
|
+
* @param projectPath - The project's working directory
|
|
380
|
+
* @param maxAgeDays - Only process sessions modified within this many days (default: 7)
|
|
381
|
+
* @returns Number of sessions loaded
|
|
382
|
+
*/
|
|
383
|
+
export async function syncSessionsToTokenUsageService(projectPath, maxAgeDays = 7) {
|
|
384
|
+
const { TokenUsageService } = await import('./token-usage.service.js');
|
|
385
|
+
const tokenSvc = TokenUsageService.getInstance();
|
|
386
|
+
const jsonlFiles = await listProjectTranscripts(projectPath);
|
|
387
|
+
if (jsonlFiles.length === 0) {
|
|
388
|
+
logger.debug('No Claude transcripts found for project', { projectPath });
|
|
389
|
+
return 0;
|
|
390
|
+
}
|
|
391
|
+
const cutoffMs = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;
|
|
392
|
+
let loaded = 0;
|
|
393
|
+
for (const filePath of jsonlFiles) {
|
|
394
|
+
try {
|
|
395
|
+
const stat = await fs.stat(filePath);
|
|
396
|
+
if (stat.mtimeMs < cutoffMs)
|
|
397
|
+
continue;
|
|
398
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
399
|
+
const lines = content.split('\n');
|
|
400
|
+
let sessionInput = 0;
|
|
401
|
+
let sessionOutput = 0;
|
|
402
|
+
let sessionCacheRead = 0;
|
|
403
|
+
let sessionCacheCreate = 0;
|
|
404
|
+
let model = '';
|
|
405
|
+
let turnCount = 0;
|
|
406
|
+
for (const line of lines) {
|
|
407
|
+
if (!line.trim())
|
|
408
|
+
continue;
|
|
409
|
+
try {
|
|
410
|
+
const entry = JSON.parse(line);
|
|
411
|
+
if (entry.type !== 'assistant')
|
|
412
|
+
continue;
|
|
413
|
+
const msg = entry.message;
|
|
414
|
+
if (!msg?.usage)
|
|
415
|
+
continue;
|
|
416
|
+
const u = msg.usage;
|
|
417
|
+
sessionInput += u.input_tokens || 0;
|
|
418
|
+
sessionOutput += u.output_tokens || 0;
|
|
419
|
+
sessionCacheRead += u.cache_read_input_tokens || 0;
|
|
420
|
+
sessionCacheCreate += u.cache_creation_input_tokens || 0;
|
|
421
|
+
if (!model && msg.model)
|
|
422
|
+
model = msg.model;
|
|
423
|
+
turnCount++;
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
if (turnCount > 0) {
|
|
430
|
+
const sessionId = path.basename(filePath, JSONL_EXTENSION);
|
|
431
|
+
const resolvedModel = model || 'claude-sonnet-4-6';
|
|
432
|
+
// Calculate cost with proper cache-aware pricing
|
|
433
|
+
const cost = calculateClaudeCost(sessionInput, sessionOutput, sessionCacheRead, sessionCacheCreate, resolvedModel);
|
|
434
|
+
// Record only real input tokens (not cache) to avoid inflating counts.
|
|
435
|
+
// Pass pre-calculated cost via a dedicated method if available,
|
|
436
|
+
// otherwise record raw tokens and let the dashboard use our cost.
|
|
437
|
+
tokenSvc.recordUsage(sessionId, sessionId, sessionInput, sessionOutput, resolvedModel);
|
|
438
|
+
// Override the auto-calculated cost with our cache-aware cost
|
|
439
|
+
tokenSvc.overrideSessionCost(sessionId, cost);
|
|
440
|
+
loaded++;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
logger.info('Synced Claude Code sessions to TokenUsageService', {
|
|
448
|
+
projectPath,
|
|
449
|
+
scannedFiles: jsonlFiles.length,
|
|
450
|
+
loadedSessions: loaded,
|
|
451
|
+
maxAgeDays,
|
|
452
|
+
});
|
|
453
|
+
return loaded;
|
|
454
|
+
}
|
|
455
|
+
//# sourceMappingURL=claude-session-tokens.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-session-tokens.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/monitoring/claude-session-tokens.service.ts"],"names":[],"mappings":"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"}
|