crewly 1.20.186 → 1.20.188
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/skills/agent/core/project-tickets/SKILL.md +3 -2
- package/config/skills/agent/core/project-tickets/execute.sh +4 -4
- package/config/skills/agent/core/project-tickets/execute.test.sh +2 -2
- package/config/skills/agent/core/remember/SKILL.md +1 -0
- package/config/skills/agent/core/remember/execute.sh +12 -0
- package/config/skills/agent/core/report-status/SKILL.md +7 -1
- package/config/skills/agent/core/report-status/execute.sh +41 -0
- package/config/skills/agent/core/slack-post/SKILL.md +1 -0
- package/config/skills/agent/core/slack-post/execute.sh +9 -2
- package/config/skills/team-leader/_common/lib.sh +45 -0
- package/config/skills/team-leader/start-agent/SKILL.md +6 -6
- package/config/skills/team-leader/start-agent/execute.sh +3 -12
- package/config/skills/team-leader/stop-agent/SKILL.md +6 -6
- package/config/skills/team-leader/stop-agent/execute.sh +3 -12
- package/dist/backend/backend/src/constants.d.ts +114 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +114 -2
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +62 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +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 +5 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.js +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +4 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +18 -1
- package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/standing/standing.controller.js +77 -4
- package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts +12 -0
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js +28 -3
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/usage.controller.d.ts +46 -0
- package/dist/backend/backend/src/controllers/system/usage.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/usage.controller.js +181 -0
- package/dist/backend/backend/src/controllers/system/usage.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +7 -0
- 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 +64 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +7 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +115 -1
- package/dist/backend/backend/src/index.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/scripts/open-items-stale-followups.d.ts +51 -0
- package/dist/backend/backend/src/scripts/open-items-stale-followups.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/open-items-stale-followups.js +142 -0
- package/dist/backend/backend/src/scripts/open-items-stale-followups.js.map +1 -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 +32 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
- 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 +83 -2
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.d.ts +14 -2
- package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.js +12 -1
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +18 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.js +38 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +11 -0
- package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/standing-answers.service.js +40 -2
- package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts +70 -0
- package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/offline-agent-message.js +92 -0
- package/dist/backend/backend/src/services/messaging/offline-agent-message.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +7 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +16 -2
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
- 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 +9 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +41 -1
- 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 +87 -2
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +87 -15
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts +130 -0
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js +274 -0
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts +152 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js +311 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +78 -1
- 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 +96 -4
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
- 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 +86 -5
- 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-backfill.d.ts +2 -1
- package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items-backfill.js +17 -6
- package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +62 -1
- 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 +203 -9
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +4 -4
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +4 -3
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +7 -4
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +40 -9
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +68 -20
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts +40 -0
- package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js +82 -0
- package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +29 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +49 -0
- 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.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +6 -11
- 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 +23 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +55 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +10 -4
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts +129 -0
- package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap-command.js +323 -0
- package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts +60 -0
- package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.gate.js +66 -0
- package/dist/backend/backend/src/services/spend/spend-cap.gate.js.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +340 -0
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.service.js +760 -0
- package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts +126 -0
- package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.store.js +141 -0
- package/dist/backend/backend/src/services/spend/spend-cap.store.js.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts +52 -0
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.js +112 -0
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts +145 -0
- package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/spend/spend-ledger.service.js +214 -0
- package/dist/backend/backend/src/services/spend/spend-ledger.service.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts +51 -0
- package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts.map +1 -0
- package/dist/backend/backend/src/services/task-pool/claim-target-waker.js +43 -0
- package/dist/backend/backend/src/services/task-pool/claim-target-waker.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +38 -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 +73 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts +53 -0
- package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
- package/dist/backend/backend/src/services/task-pool/work-item-usage.js +39 -0
- package/dist/backend/backend/src/services/task-pool/work-item-usage.js.map +1 -0
- package/dist/backend/backend/src/services/usage/token-format.d.ts +49 -0
- package/dist/backend/backend/src/services/usage/token-format.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage/token-format.js +81 -0
- package/dist/backend/backend/src/services/usage/token-format.js.map +1 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +132 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.js +226 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +11 -14
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +25 -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 +50 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +9 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +16 -2
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +3 -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 +9 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/review-reason.types.d.ts +3 -1
- package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/review-reason.types.js +1 -0
- package/dist/backend/backend/src/types/review-reason.types.js.map +1 -1
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +24 -7
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/ticket-autopilot.types.js +29 -13
- package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +5 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.js +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +114 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +114 -2
- package/dist/cli/backend/src/constants.js.map +1 -1
- 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 +32 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
- 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 +83 -2
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.d.ts +14 -2
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.js +12 -1
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +18 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.js +38 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +11 -0
- package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/standing-answers.service.js +40 -2
- package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +7 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +16 -2
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- 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 +9 -1
- 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 +41 -1
- 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 +87 -2
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +87 -15
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts +97 -0
- package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/model-pricing.js +120 -0
- package/dist/cli/backend/src/services/monitoring/model-pricing.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +78 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +96 -4
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
- 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 +86 -5
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts +60 -0
- package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
- package/dist/cli/backend/src/services/spend/spend-cap.gate.js +66 -0
- package/dist/cli/backend/src/services/spend/spend-cap.gate.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +38 -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 +73 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts +53 -0
- package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
- package/dist/cli/backend/src/services/task-pool/work-item-usage.js +39 -0
- package/dist/cli/backend/src/services/task-pool/work-item-usage.js.map +1 -0
- package/dist/cli/backend/src/services/usage/token-format.d.ts +49 -0
- package/dist/cli/backend/src/services/usage/token-format.d.ts.map +1 -0
- package/dist/cli/backend/src/services/usage/token-format.js +81 -0
- package/dist/cli/backend/src/services/usage/token-format.js.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.js +11 -14
- package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +3 -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 +9 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +24 -7
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/ticket-autopilot.types.js +29 -13
- package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +5 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.js +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -1
- package/frontend/dist/assets/{index-a79c7852.css → index-20a67829.css} +1 -1
- package/frontend/dist/assets/{index-1ee8a9a2.js → index-49f50b45.js} +282 -282
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token amounts for owners: "12.4M tokens" out, "20M" / "500k" / "2000万" in.
|
|
3
|
+
*
|
|
4
|
+
* specs/2026-10-02-spend-cap.md §Token unit
|
|
5
|
+
*
|
|
6
|
+
* @module services/usage/token-format
|
|
7
|
+
*/
|
|
8
|
+
import { USAGE_CONSTANTS } from '../../constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Short token count: `950`, `12.4K`, `12.4M`, `1.2B`.
|
|
11
|
+
*
|
|
12
|
+
* @param tokens - Token count
|
|
13
|
+
* @returns Compact text (no unit)
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* compactTokens(12_400_000) // '12.4M'
|
|
17
|
+
*/
|
|
18
|
+
export function compactTokens(tokens) {
|
|
19
|
+
const n = Math.max(0, Math.round(Number.isFinite(tokens) ? tokens : 0));
|
|
20
|
+
const units = [
|
|
21
|
+
[1e9, 'B'],
|
|
22
|
+
[1e6, 'M'],
|
|
23
|
+
[1e3, 'K'],
|
|
24
|
+
];
|
|
25
|
+
for (const [size, suffix] of units) {
|
|
26
|
+
if (n >= size) {
|
|
27
|
+
const v = n / size;
|
|
28
|
+
const text = v >= 100 ? v.toFixed(0) : v.toFixed(1).replace(/\.0$/, '');
|
|
29
|
+
return `${text}${suffix}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return String(n);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Token count for owner text.
|
|
36
|
+
*
|
|
37
|
+
* @param tokens - Token count
|
|
38
|
+
* @returns e.g. `12.4M tokens`
|
|
39
|
+
*/
|
|
40
|
+
export function formatTokens(tokens) {
|
|
41
|
+
return `${compactTokens(tokens)} tokens`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse a token amount the owner typed.
|
|
45
|
+
*
|
|
46
|
+
* Accepts a plain number, `K`/`M`/`B` suffixes (any case, `mil`/`million`
|
|
47
|
+
* too), Chinese `万` (10k) / `亿` (100M), commas, and an optional trailing
|
|
48
|
+
* `tokens` / `token`.
|
|
49
|
+
*
|
|
50
|
+
* @param text - Amount text
|
|
51
|
+
* @returns Whole tokens, or null when it is not a positive amount
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* parseTokenAmount('20M') // 20_000_000
|
|
55
|
+
* parseTokenAmount('2000万') // 20_000_000
|
|
56
|
+
* parseTokenAmount('1.5b tokens') // 1_500_000_000
|
|
57
|
+
*/
|
|
58
|
+
export function parseTokenAmount(text) {
|
|
59
|
+
if (typeof text === 'number')
|
|
60
|
+
return Number.isFinite(text) && text > 0 ? Math.round(text) : null;
|
|
61
|
+
if (typeof text !== 'string')
|
|
62
|
+
return null;
|
|
63
|
+
const t = text.trim().toLowerCase().replace(/,/g, '').replace(/\s*(?:tokens?|个)?\s*$/u, '');
|
|
64
|
+
const m = /^(\d+(?:\.\d+)?)\s*(k|m|mil|million|b|bn|billion|万|亿)?$/u.exec(t);
|
|
65
|
+
if (!m)
|
|
66
|
+
return null;
|
|
67
|
+
const mult = { k: 1e3, m: 1e6, mil: 1e6, million: 1e6, b: 1e9, bn: 1e9, billion: 1e9, 万: 1e4, 亿: 1e8 };
|
|
68
|
+
const n = Number(m[1]) * (m[2] ? mult[m[2]] : 1);
|
|
69
|
+
return Number.isFinite(n) && n >= 1 ? Math.round(n) : null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Convert a USD setting to tokens with the documented migration rate
|
|
73
|
+
* ({@link USAGE_CONSTANTS.TOKENS_PER_USD}), rounded to a whole thousand.
|
|
74
|
+
*
|
|
75
|
+
* @param usd - Dollars
|
|
76
|
+
* @returns Tokens
|
|
77
|
+
*/
|
|
78
|
+
export function usdToTokens(usd) {
|
|
79
|
+
return Math.max(1000, Math.round((usd * USAGE_CONSTANTS.TOKENS_PER_USD) / 1000) * 1000);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=token-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-format.js","sourceRoot":"","sources":["../../../../../../backend/src/services/usage/token-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage stats — tokens grouped by agent, team, project, work item, runtime
|
|
3
|
+
* or day, over the last N local days (`GET /api/system/usage`).
|
|
4
|
+
*
|
|
5
|
+
* The unit is the token unit ({@link eventTokens}: input incl. cached +
|
|
6
|
+
* output); cached input is reported beside it. Every event lands in exactly
|
|
7
|
+
* one row of a grouping (unattributable usage gets its own row), so each
|
|
8
|
+
* grouping sums to the same total — except `workItem`, which lists the top
|
|
9
|
+
* work items only.
|
|
10
|
+
*
|
|
11
|
+
* Attribution:
|
|
12
|
+
* - team: the session's team membership (the orc and unknown sessions are
|
|
13
|
+
* "(unattributed)");
|
|
14
|
+
* - work item: {@link computeWorkItemUsage} — the agent's usage between the
|
|
15
|
+
* item's start and completion (clipped to the window);
|
|
16
|
+
* - project: the work item running when the event happened, if it names a
|
|
17
|
+
* project (`metadata.projectId`) or its agent's team works on exactly one
|
|
18
|
+
* project; otherwise the session's team when it works on exactly one
|
|
19
|
+
* project; otherwise "(unattributed)".
|
|
20
|
+
*
|
|
21
|
+
* specs/2026-10-02-spend-cap.md §Stats
|
|
22
|
+
*
|
|
23
|
+
* @module services/usage/usage-stats.service
|
|
24
|
+
*/
|
|
25
|
+
import { type TokenUsageEvent } from '../monitoring/token-usage.service.js';
|
|
26
|
+
import { type SessionUsageWindowSource } from '../task-pool/work-item-usage.js';
|
|
27
|
+
/** A grouping. */
|
|
28
|
+
export type UsageGroupBy = 'agent' | 'team' | 'project' | 'workItem' | 'runtime' | 'day';
|
|
29
|
+
/** Token figures. */
|
|
30
|
+
export interface UsageTokens {
|
|
31
|
+
/** Input tokens, cached included */
|
|
32
|
+
input: number;
|
|
33
|
+
/** Of `input`, the cached part */
|
|
34
|
+
cachedInput: number;
|
|
35
|
+
output: number;
|
|
36
|
+
/** input + output — the unit caps count */
|
|
37
|
+
total: number;
|
|
38
|
+
/** Usage events (model calls / turns) */
|
|
39
|
+
events: number;
|
|
40
|
+
}
|
|
41
|
+
/** One row of a grouping. */
|
|
42
|
+
export interface UsageRow extends UsageTokens {
|
|
43
|
+
/** Session / team id / project id / work item id / runtime / `YYYY-MM-DD` */
|
|
44
|
+
key: string;
|
|
45
|
+
label: string;
|
|
46
|
+
/** Share of the window total (0–1) */
|
|
47
|
+
share: number;
|
|
48
|
+
/** Dashboard link (work items) */
|
|
49
|
+
link?: string;
|
|
50
|
+
/** Extra facts: `team` / `agent` / `status` / `runtimes` */
|
|
51
|
+
meta?: Record<string, string | string[]>;
|
|
52
|
+
}
|
|
53
|
+
/** What `GET /api/system/usage` returns. */
|
|
54
|
+
export interface UsageStats {
|
|
55
|
+
days: number;
|
|
56
|
+
/** Window start (local midnight), ISO */
|
|
57
|
+
since: string;
|
|
58
|
+
/** Local day of now */
|
|
59
|
+
today: string;
|
|
60
|
+
totals: UsageTokens;
|
|
61
|
+
todayTotals: UsageTokens;
|
|
62
|
+
groupBy: UsageGroupBy[];
|
|
63
|
+
/** Rows of the first grouping */
|
|
64
|
+
rows: UsageRow[];
|
|
65
|
+
/** Rows of every requested grouping */
|
|
66
|
+
groups: Partial<Record<UsageGroupBy, UsageRow[]>>;
|
|
67
|
+
}
|
|
68
|
+
/** A team as stats need it. */
|
|
69
|
+
export interface UsageTeam {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
members: Array<{
|
|
73
|
+
session: string;
|
|
74
|
+
name: string;
|
|
75
|
+
}>;
|
|
76
|
+
projectIds: string[];
|
|
77
|
+
}
|
|
78
|
+
/** A work item as stats need it. */
|
|
79
|
+
export interface UsageWorkItem {
|
|
80
|
+
id: string;
|
|
81
|
+
title: string;
|
|
82
|
+
status: string;
|
|
83
|
+
/** Agent session that ran it */
|
|
84
|
+
target?: string;
|
|
85
|
+
createdAt: string;
|
|
86
|
+
startedAt?: string;
|
|
87
|
+
completedAt?: string;
|
|
88
|
+
metadata?: Record<string, unknown>;
|
|
89
|
+
}
|
|
90
|
+
/** Collaborators. */
|
|
91
|
+
export interface UsageStatsDeps {
|
|
92
|
+
/** The token ledger (TokenUsageService) */
|
|
93
|
+
ledger: SessionUsageWindowSource & {
|
|
94
|
+
forEachEvent(visit: (sessionName: string, event: TokenUsageEvent) => void, since?: Date): void;
|
|
95
|
+
};
|
|
96
|
+
teams: () => Promise<UsageTeam[]>;
|
|
97
|
+
projects: () => Promise<Array<{
|
|
98
|
+
id: string;
|
|
99
|
+
name: string;
|
|
100
|
+
}>>;
|
|
101
|
+
workItems: () => Promise<UsageWorkItem[]>;
|
|
102
|
+
now?: () => Date;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parse `groupBy` (one value or a comma list).
|
|
106
|
+
*
|
|
107
|
+
* @param raw - Query value
|
|
108
|
+
* @returns Valid groupings (default `agent`)
|
|
109
|
+
*/
|
|
110
|
+
export declare function parseGroupBy(raw: unknown): UsageGroupBy[];
|
|
111
|
+
/**
|
|
112
|
+
* Token usage stats.
|
|
113
|
+
*/
|
|
114
|
+
export declare class UsageStatsService {
|
|
115
|
+
private readonly deps;
|
|
116
|
+
private readonly now;
|
|
117
|
+
/** @param deps - Collaborators */
|
|
118
|
+
constructor(deps: UsageStatsDeps);
|
|
119
|
+
/**
|
|
120
|
+
* Aggregate the window.
|
|
121
|
+
*
|
|
122
|
+
* @param days - Local days, today included (clamped to 1…MAX_DAYS)
|
|
123
|
+
* @param groupBy - Groupings
|
|
124
|
+
* @returns Stats
|
|
125
|
+
*/
|
|
126
|
+
query(days: number, groupBy: UsageGroupBy[]): Promise<UsageStats>;
|
|
127
|
+
/**
|
|
128
|
+
* Top work items in the window by tokens.
|
|
129
|
+
*/
|
|
130
|
+
private workItemRows;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=usage-stats.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-stats.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/usage/usage-stats.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage stats — tokens grouped by agent, team, project, work item, runtime
|
|
3
|
+
* or day, over the last N local days (`GET /api/system/usage`).
|
|
4
|
+
*
|
|
5
|
+
* The unit is the token unit ({@link eventTokens}: input incl. cached +
|
|
6
|
+
* output); cached input is reported beside it. Every event lands in exactly
|
|
7
|
+
* one row of a grouping (unattributable usage gets its own row), so each
|
|
8
|
+
* grouping sums to the same total — except `workItem`, which lists the top
|
|
9
|
+
* work items only.
|
|
10
|
+
*
|
|
11
|
+
* Attribution:
|
|
12
|
+
* - team: the session's team membership (the orc and unknown sessions are
|
|
13
|
+
* "(unattributed)");
|
|
14
|
+
* - work item: {@link computeWorkItemUsage} — the agent's usage between the
|
|
15
|
+
* item's start and completion (clipped to the window);
|
|
16
|
+
* - project: the work item running when the event happened, if it names a
|
|
17
|
+
* project (`metadata.projectId`) or its agent's team works on exactly one
|
|
18
|
+
* project; otherwise the session's team when it works on exactly one
|
|
19
|
+
* project; otherwise "(unattributed)".
|
|
20
|
+
*
|
|
21
|
+
* specs/2026-10-02-spend-cap.md §Stats
|
|
22
|
+
*
|
|
23
|
+
* @module services/usage/usage-stats.service
|
|
24
|
+
*/
|
|
25
|
+
import { ORCHESTRATOR_SESSION_NAME, SPEND_CAP_CONSTANTS, USAGE_CONSTANTS as U } from '../../constants.js';
|
|
26
|
+
import { eventTokens } from '../monitoring/token-usage.service.js';
|
|
27
|
+
import { localDateKey } from '../project-tickets/ticket-autopilot-decision.js';
|
|
28
|
+
import { runtimeOfEvent, windowDays } from '../spend/spend-ledger.service.js';
|
|
29
|
+
import { computeWorkItemUsage } from '../task-pool/work-item-usage.js';
|
|
30
|
+
/** Zero figures. */
|
|
31
|
+
function zero() {
|
|
32
|
+
return { input: 0, cachedInput: 0, output: 0, total: 0, events: 0 };
|
|
33
|
+
}
|
|
34
|
+
/** Add one event's tokens. */
|
|
35
|
+
function add(into, e) {
|
|
36
|
+
const t = eventTokens(e);
|
|
37
|
+
into.input += t.input;
|
|
38
|
+
into.cachedInput += t.cachedInput;
|
|
39
|
+
into.output += t.output;
|
|
40
|
+
into.total += t.total;
|
|
41
|
+
into.events += 1;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse `groupBy` (one value or a comma list).
|
|
45
|
+
*
|
|
46
|
+
* @param raw - Query value
|
|
47
|
+
* @returns Valid groupings (default `agent`)
|
|
48
|
+
*/
|
|
49
|
+
export function parseGroupBy(raw) {
|
|
50
|
+
const parts = String(raw ?? '')
|
|
51
|
+
.split(',')
|
|
52
|
+
.map((s) => s.trim())
|
|
53
|
+
.filter((s) => U.GROUP_BY.includes(s));
|
|
54
|
+
return parts.length > 0 ? [...new Set(parts)] : ['agent'];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Token usage stats.
|
|
58
|
+
*/
|
|
59
|
+
export class UsageStatsService {
|
|
60
|
+
deps;
|
|
61
|
+
now;
|
|
62
|
+
/** @param deps - Collaborators */
|
|
63
|
+
constructor(deps) {
|
|
64
|
+
this.deps = deps;
|
|
65
|
+
this.now = deps.now ?? (() => new Date());
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Aggregate the window.
|
|
69
|
+
*
|
|
70
|
+
* @param days - Local days, today included (clamped to 1…MAX_DAYS)
|
|
71
|
+
* @param groupBy - Groupings
|
|
72
|
+
* @returns Stats
|
|
73
|
+
*/
|
|
74
|
+
async query(days, groupBy) {
|
|
75
|
+
const now = this.now();
|
|
76
|
+
const n = Math.min(SPEND_CAP_CONSTANTS.MAX_DAYS, Math.max(1, Math.floor(Number.isFinite(days) ? days : SPEND_CAP_CONSTANTS.DEFAULT_DAYS)));
|
|
77
|
+
const { since } = windowDays(now, n);
|
|
78
|
+
const today = localDateKey(now);
|
|
79
|
+
const [teams, projects, items] = await Promise.all([
|
|
80
|
+
this.deps.teams().catch(() => []),
|
|
81
|
+
this.deps.projects().catch(() => []),
|
|
82
|
+
groupBy.includes('workItem') || groupBy.includes('project') ? this.deps.workItems().catch(() => []) : Promise.resolve([]),
|
|
83
|
+
]);
|
|
84
|
+
const teamOf = new Map();
|
|
85
|
+
const nameOf = new Map([[ORCHESTRATOR_SESSION_NAME, 'Orc']]);
|
|
86
|
+
for (const t of teams) {
|
|
87
|
+
for (const m of t.members) {
|
|
88
|
+
if (!m.session)
|
|
89
|
+
continue;
|
|
90
|
+
if (!teamOf.has(m.session))
|
|
91
|
+
teamOf.set(m.session, t);
|
|
92
|
+
nameOf.set(m.session, m.name || m.session);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const projectName = new Map(projects.map((p) => [p.id, p.name]));
|
|
96
|
+
const teamProject = (t) => (t && t.projectIds.length === 1 ? t.projectIds[0] : null);
|
|
97
|
+
// Work item windows per session, for project attribution.
|
|
98
|
+
const windows = new Map();
|
|
99
|
+
for (const wi of items) {
|
|
100
|
+
if (!wi.target)
|
|
101
|
+
continue;
|
|
102
|
+
const pid = typeof wi.metadata?.projectId === 'string' ? wi.metadata.projectId : teamProject(teamOf.get(wi.target));
|
|
103
|
+
if (!pid)
|
|
104
|
+
continue;
|
|
105
|
+
const start = new Date(wi.startedAt ?? wi.createdAt).getTime();
|
|
106
|
+
const end = wi.completedAt ? new Date(wi.completedAt).getTime() : now.getTime();
|
|
107
|
+
if (!Number.isFinite(start) || !Number.isFinite(end) || end < start)
|
|
108
|
+
continue;
|
|
109
|
+
const list = windows.get(wi.target) ?? [];
|
|
110
|
+
list.push({ start, end, projectId: pid });
|
|
111
|
+
windows.set(wi.target, list);
|
|
112
|
+
}
|
|
113
|
+
for (const list of windows.values())
|
|
114
|
+
list.sort((a, b) => b.start - a.start);
|
|
115
|
+
const projectOfEvent = (session, ms) => {
|
|
116
|
+
const hit = windows.get(session)?.find((w) => w.start <= ms && ms <= w.end);
|
|
117
|
+
return hit?.projectId ?? teamProject(teamOf.get(session));
|
|
118
|
+
};
|
|
119
|
+
const totals = zero();
|
|
120
|
+
const todayTotals = zero();
|
|
121
|
+
const buckets = new Map();
|
|
122
|
+
const bucketOf = (g, key, label, meta) => {
|
|
123
|
+
let map = buckets.get(g);
|
|
124
|
+
if (!map) {
|
|
125
|
+
map = new Map();
|
|
126
|
+
buckets.set(g, map);
|
|
127
|
+
}
|
|
128
|
+
let row = map.get(key);
|
|
129
|
+
if (!row) {
|
|
130
|
+
row = { key, label, share: 0, ...zero(), ...(meta ? { meta } : {}) };
|
|
131
|
+
map.set(key, row);
|
|
132
|
+
}
|
|
133
|
+
return row;
|
|
134
|
+
};
|
|
135
|
+
const eventGroupings = groupBy.filter((g) => g !== 'workItem');
|
|
136
|
+
const runtimesOf = new Map();
|
|
137
|
+
this.deps.ledger.forEachEvent((session, e) => {
|
|
138
|
+
const ms = new Date(e.timestamp).getTime();
|
|
139
|
+
if (!Number.isFinite(ms) || ms > now.getTime())
|
|
140
|
+
return;
|
|
141
|
+
add(totals, e);
|
|
142
|
+
const day = localDateKey(new Date(ms));
|
|
143
|
+
if (day === today)
|
|
144
|
+
add(todayTotals, e);
|
|
145
|
+
const runtime = runtimeOfEvent(e);
|
|
146
|
+
runtimesOf.set(session, (runtimesOf.get(session) ?? new Set()).add(runtime));
|
|
147
|
+
for (const g of eventGroupings) {
|
|
148
|
+
let row;
|
|
149
|
+
if (g === 'agent') {
|
|
150
|
+
const team = teamOf.get(session);
|
|
151
|
+
row = bucketOf(g, session, nameOf.get(session) ?? session, team ? { team: team.name } : undefined);
|
|
152
|
+
}
|
|
153
|
+
else if (g === 'team') {
|
|
154
|
+
const team = teamOf.get(session);
|
|
155
|
+
row = team ? bucketOf(g, team.id, team.name) : bucketOf(g, U.UNATTRIBUTED, session === ORCHESTRATOR_SESSION_NAME ? 'Orc (no team)' : U.UNATTRIBUTED);
|
|
156
|
+
}
|
|
157
|
+
else if (g === 'runtime') {
|
|
158
|
+
row = bucketOf(g, runtime, runtime);
|
|
159
|
+
}
|
|
160
|
+
else if (g === 'day') {
|
|
161
|
+
row = bucketOf(g, day, day);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const pid = projectOfEvent(session, ms);
|
|
165
|
+
row = pid ? bucketOf(g, pid, projectName.get(pid) ?? pid) : bucketOf(g, U.UNATTRIBUTED, U.UNATTRIBUTED);
|
|
166
|
+
}
|
|
167
|
+
add(row, e);
|
|
168
|
+
}
|
|
169
|
+
}, since);
|
|
170
|
+
const groups = {};
|
|
171
|
+
for (const g of groupBy) {
|
|
172
|
+
let rows;
|
|
173
|
+
if (g === 'workItem') {
|
|
174
|
+
rows = this.workItemRows(items, since, now, teamOf, nameOf);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
rows = [...(buckets.get(g)?.values() ?? [])];
|
|
178
|
+
if (g === 'agent')
|
|
179
|
+
for (const r of rows)
|
|
180
|
+
r.meta = { ...(r.meta ?? {}), runtimes: [...(runtimesOf.get(r.key) ?? [])].sort() };
|
|
181
|
+
if (g === 'day')
|
|
182
|
+
rows.sort((a, b) => a.key.localeCompare(b.key));
|
|
183
|
+
else
|
|
184
|
+
rows.sort((a, b) => b.total - a.total);
|
|
185
|
+
}
|
|
186
|
+
for (const r of rows)
|
|
187
|
+
r.share = totals.total > 0 ? r.total / totals.total : 0;
|
|
188
|
+
groups[g] = rows;
|
|
189
|
+
}
|
|
190
|
+
return { days: n, since: since.toISOString(), today, totals, todayTotals, groupBy, rows: groups[groupBy[0]] ?? [], groups };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Top work items in the window by tokens.
|
|
194
|
+
*/
|
|
195
|
+
workItemRows(items, since, now, teamOf, nameOf) {
|
|
196
|
+
const rows = [];
|
|
197
|
+
for (const wi of items) {
|
|
198
|
+
if (!wi.target)
|
|
199
|
+
continue;
|
|
200
|
+
const startMs = new Date(wi.startedAt ?? wi.createdAt).getTime();
|
|
201
|
+
const endMs = wi.completedAt ? new Date(wi.completedAt).getTime() : now.getTime();
|
|
202
|
+
if (!Number.isFinite(startMs) || !Number.isFinite(endMs) || endMs < since.getTime() || startMs > now.getTime())
|
|
203
|
+
continue;
|
|
204
|
+
const clipped = { createdAt: wi.createdAt, startedAt: new Date(Math.max(startMs, since.getTime())).toISOString(), completedAt: wi.completedAt };
|
|
205
|
+
const usage = computeWorkItemUsage(clipped, wi.target, this.deps.ledger, now);
|
|
206
|
+
if (!usage || usage.totalTokens <= 0)
|
|
207
|
+
continue;
|
|
208
|
+
const team = teamOf.get(wi.target);
|
|
209
|
+
rows.push({
|
|
210
|
+
key: wi.id,
|
|
211
|
+
label: wi.title || wi.id,
|
|
212
|
+
share: 0,
|
|
213
|
+
input: usage.totalTokens - usage.outputTokens,
|
|
214
|
+
cachedInput: usage.cachedInputTokens,
|
|
215
|
+
output: usage.outputTokens,
|
|
216
|
+
total: usage.totalTokens,
|
|
217
|
+
events: 0,
|
|
218
|
+
link: `/workitems/${wi.id}`,
|
|
219
|
+
meta: { agent: nameOf.get(wi.target) ?? wi.target, status: wi.status, ...(team ? { team: team.name } : {}) },
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
rows.sort((a, b) => b.total - a.total);
|
|
223
|
+
return rows.slice(0, U.MAX_WORK_ITEM_ROWS);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=usage-stats.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-stats.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/usage/usage-stats.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3-data.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/v3-data.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAStC,OAAO,EAA4B,KAAK,cAAc,EAAE,KAAK,WAAW,EAAsB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"v3-data.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/v3-data.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,7 @@ import { isValidRequestTransition } from '../../types/v2/request.types.js';
|
|
|
33
33
|
import { classifyIntentLevel, classifyIntentCategory, } from '../../types/intent-task.types.js';
|
|
34
34
|
import { ensureDir, atomicWriteJson } from '../../utils/file-io.utils.js';
|
|
35
35
|
import { TokenUsageService } from '../monitoring/token-usage.service.js';
|
|
36
|
+
import { computeWorkItemUsage } from '../task-pool/work-item-usage.js';
|
|
36
37
|
import { collectRequestWorkItems, evaluateRequestCompletion, } from './request-completion.js';
|
|
37
38
|
import * as path from 'path';
|
|
38
39
|
// ---------------------------------------------------------------------------
|
|
@@ -260,23 +261,19 @@ export class V3DataService {
|
|
|
260
261
|
...(event.sessionName ? { session: event.sessionName } : {}),
|
|
261
262
|
via: 'v3-data:task-completed',
|
|
262
263
|
});
|
|
263
|
-
//
|
|
264
|
+
// Token usage for this work item: the session's usage while the item
|
|
265
|
+
// ran, not the session's cumulative total (#812).
|
|
264
266
|
try {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
const totalInput = sessionSummary.totalInput || 0;
|
|
271
|
-
const totalOutput = sessionSummary.totalOutput || 0;
|
|
272
|
-
const totalCost = sessionSummary.cost || 0;
|
|
273
|
-
if (totalInput > 0 || totalOutput > 0) {
|
|
274
|
-
await taskPool.updateTokenUsage(match.id, totalInput, totalOutput, totalCost);
|
|
267
|
+
if (event.sessionName) {
|
|
268
|
+
// `match` was read before completion, so the window ends now.
|
|
269
|
+
const usage = computeWorkItemUsage(match, event.sessionName, TokenUsageService.getInstance());
|
|
270
|
+
if (usage && (usage.inputTokens > 0 || usage.outputTokens > 0)) {
|
|
271
|
+
await taskPool.updateTokenUsage(match.id, usage.inputTokens, usage.outputTokens, usage.cost);
|
|
275
272
|
this.logger.debug('Updated WorkItem token usage', {
|
|
276
273
|
workItemId: match.id,
|
|
277
|
-
inputTokens:
|
|
278
|
-
outputTokens:
|
|
279
|
-
cost:
|
|
274
|
+
inputTokens: usage.inputTokens,
|
|
275
|
+
outputTokens: usage.outputTokens,
|
|
276
|
+
cost: usage.cost,
|
|
280
277
|
});
|
|
281
278
|
}
|
|
282
279
|
}
|