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,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token caps and boosts from the owner's DM with the orc. Handled by the
|
|
3
|
+
* backend, not the orc — so it works while the orc itself is stopped:
|
|
4
|
+
*
|
|
5
|
+
* Caps (amounts in tokens: `5M`, `500k`, `2000万`, `5000000`):
|
|
6
|
+
* - `set daily cap for Ella to 5M` / `set daily cap to 5M` (default per agent)
|
|
7
|
+
* - `set team cap for CE to 50M` / `set daily cap for team CE to 50M`
|
|
8
|
+
* - `set daily total cap to 200M` (all agents together)
|
|
9
|
+
* - `remove daily cap for Ella` / `remove team cap for CE` / `remove daily cap` / `remove daily total cap`
|
|
10
|
+
*
|
|
11
|
+
* Boosts (until local midnight):
|
|
12
|
+
* - `boost CE by 20M today` / `boost Ella by 5M` / `boost everyone by 10M today`
|
|
13
|
+
* - `unlimited today for everyone` / `unlimited today for CE` / `CE unlimited today`
|
|
14
|
+
* - `放开 CE 今天` / `今天放开 CE` / `今天全部放开` / `给 CE 加 20M` / `CE 今天加 2000万`
|
|
15
|
+
*
|
|
16
|
+
* A target is everyone, a team (by name) or an agent (by name / session);
|
|
17
|
+
* a name that is both a team and an agent means the team. Replies are
|
|
18
|
+
* English (harness text rule).
|
|
19
|
+
*
|
|
20
|
+
* While the orc is stopped by a cap, every other owner DM to it gets one
|
|
21
|
+
* harness line saying so (the message itself stays queued for the orc).
|
|
22
|
+
*
|
|
23
|
+
* specs/2026-10-02-spend-cap.md
|
|
24
|
+
*
|
|
25
|
+
* @module services/spend/spend-cap-command
|
|
26
|
+
*/
|
|
27
|
+
import type { SlackIncomingMessage } from '../../types/slack.types.js';
|
|
28
|
+
import { type SpendStop } from './spend-cap.gate.js';
|
|
29
|
+
import { type BoostInput, type SpendCapPatch } from './spend-cap.service.js';
|
|
30
|
+
/** A parsed command. `target` is the name as typed (resolved later). */
|
|
31
|
+
export type SpendCapCommand = {
|
|
32
|
+
kind: 'set';
|
|
33
|
+
target: string | null;
|
|
34
|
+
team?: boolean;
|
|
35
|
+
tokens: number;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'set_total';
|
|
38
|
+
tokens: number;
|
|
39
|
+
} | {
|
|
40
|
+
kind: 'remove';
|
|
41
|
+
target: string | null;
|
|
42
|
+
team?: boolean;
|
|
43
|
+
} | {
|
|
44
|
+
kind: 'remove_total';
|
|
45
|
+
} | {
|
|
46
|
+
kind: 'boost';
|
|
47
|
+
target: string;
|
|
48
|
+
tokens: number;
|
|
49
|
+
} | {
|
|
50
|
+
kind: 'unlimited';
|
|
51
|
+
target: string;
|
|
52
|
+
} | {
|
|
53
|
+
kind: 'usd_hint';
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Parse a cap / boost command.
|
|
57
|
+
*
|
|
58
|
+
* @param text - Message text
|
|
59
|
+
* @returns The command, or null when the message is not one
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* parseSpendCapCommand('boost CE by 20M today') // { kind: 'boost', target: 'ce', tokens: 20000000 }
|
|
63
|
+
* parseSpendCapCommand('放开 CE 今天') // { kind: 'unlimited', target: 'ce' }
|
|
64
|
+
*/
|
|
65
|
+
export declare function parseSpendCapCommand(text: string | undefined): SpendCapCommand | null;
|
|
66
|
+
/** An agent the owner can name. */
|
|
67
|
+
export interface NamedAgent {
|
|
68
|
+
session: string;
|
|
69
|
+
name: string;
|
|
70
|
+
}
|
|
71
|
+
/** A team the owner can name. */
|
|
72
|
+
export interface NamedTeam {
|
|
73
|
+
id: string;
|
|
74
|
+
name: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve the agent the owner named.
|
|
78
|
+
*
|
|
79
|
+
* @param who - Session name, member name, or "orc" / "orchestrator"
|
|
80
|
+
* @param agents - Configured agents
|
|
81
|
+
* @returns Session, or null when unknown / ambiguous
|
|
82
|
+
*/
|
|
83
|
+
export declare function resolveAgent(who: string, agents: NamedAgent[]): string | null;
|
|
84
|
+
/**
|
|
85
|
+
* Resolve the team the owner named.
|
|
86
|
+
*
|
|
87
|
+
* @param who - Team name or id (`team CE` works too)
|
|
88
|
+
* @param teams - Teams
|
|
89
|
+
* @returns Team, or null when unknown / ambiguous
|
|
90
|
+
*/
|
|
91
|
+
export declare function resolveTeam(who: string, teams: NamedTeam[]): NamedTeam | null;
|
|
92
|
+
/** What the interceptor needs. */
|
|
93
|
+
export interface SpendCapCommandDeps {
|
|
94
|
+
/** `orc` when the message is the owner writing in their DM with the orc */
|
|
95
|
+
ownerDmScope: (message: SlackIncomingMessage) => 'orc' | 'agent' | null;
|
|
96
|
+
replyTargetOf: (message: SlackIncomingMessage) => unknown;
|
|
97
|
+
reply: (text: string, target: unknown) => Promise<unknown>;
|
|
98
|
+
/** Configured agents (orc included) */
|
|
99
|
+
agents: () => Promise<NamedAgent[]>;
|
|
100
|
+
teams: () => Promise<NamedTeam[]>;
|
|
101
|
+
setCaps: (patch: SpendCapPatch) => Promise<unknown>;
|
|
102
|
+
boost: (input: BoostInput) => Promise<unknown>;
|
|
103
|
+
/** The orc's stop, or null */
|
|
104
|
+
orcStop: () => SpendStop | null;
|
|
105
|
+
onError?: (err: unknown) => void;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The orc's harness line while it is stopped by a cap.
|
|
109
|
+
*
|
|
110
|
+
* @param stop - The orc's stop
|
|
111
|
+
* @returns One line
|
|
112
|
+
*/
|
|
113
|
+
export declare function orcCappedReply(stop: SpendStop): string;
|
|
114
|
+
/**
|
|
115
|
+
* Run a parsed command.
|
|
116
|
+
*
|
|
117
|
+
* @param cmd - Command
|
|
118
|
+
* @param deps - Collaborators
|
|
119
|
+
* @returns The owner's one-line answer
|
|
120
|
+
*/
|
|
121
|
+
export declare function runSpendCapCommand(cmd: SpendCapCommand, deps: Pick<SpendCapCommandDeps, 'agents' | 'teams' | 'setCaps' | 'boost'>): Promise<string>;
|
|
122
|
+
/**
|
|
123
|
+
* The Slack bridge interceptor for the owner's orc DM.
|
|
124
|
+
*
|
|
125
|
+
* @param deps - Collaborators
|
|
126
|
+
* @returns Interceptor: true when the message was a cap command (consumed)
|
|
127
|
+
*/
|
|
128
|
+
export declare function createSpendCapInterceptor(deps: SpendCapCommandDeps): (message: SlackIncomingMessage) => boolean;
|
|
129
|
+
//# sourceMappingURL=spend-cap-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spend-cap-command.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token caps and boosts from the owner's DM with the orc. Handled by the
|
|
3
|
+
* backend, not the orc — so it works while the orc itself is stopped:
|
|
4
|
+
*
|
|
5
|
+
* Caps (amounts in tokens: `5M`, `500k`, `2000万`, `5000000`):
|
|
6
|
+
* - `set daily cap for Ella to 5M` / `set daily cap to 5M` (default per agent)
|
|
7
|
+
* - `set team cap for CE to 50M` / `set daily cap for team CE to 50M`
|
|
8
|
+
* - `set daily total cap to 200M` (all agents together)
|
|
9
|
+
* - `remove daily cap for Ella` / `remove team cap for CE` / `remove daily cap` / `remove daily total cap`
|
|
10
|
+
*
|
|
11
|
+
* Boosts (until local midnight):
|
|
12
|
+
* - `boost CE by 20M today` / `boost Ella by 5M` / `boost everyone by 10M today`
|
|
13
|
+
* - `unlimited today for everyone` / `unlimited today for CE` / `CE unlimited today`
|
|
14
|
+
* - `放开 CE 今天` / `今天放开 CE` / `今天全部放开` / `给 CE 加 20M` / `CE 今天加 2000万`
|
|
15
|
+
*
|
|
16
|
+
* A target is everyone, a team (by name) or an agent (by name / session);
|
|
17
|
+
* a name that is both a team and an agent means the team. Replies are
|
|
18
|
+
* English (harness text rule).
|
|
19
|
+
*
|
|
20
|
+
* While the orc is stopped by a cap, every other owner DM to it gets one
|
|
21
|
+
* harness line saying so (the message itself stays queued for the orc).
|
|
22
|
+
*
|
|
23
|
+
* specs/2026-10-02-spend-cap.md
|
|
24
|
+
*
|
|
25
|
+
* @module services/spend/spend-cap-command
|
|
26
|
+
*/
|
|
27
|
+
import { ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
28
|
+
import { compactTokens, formatTokens, parseTokenAmount } from '../usage/token-format.js';
|
|
29
|
+
import { spendCapReason } from './spend-cap.gate.js';
|
|
30
|
+
import { suggestedBoost } from './spend-cap.service.js';
|
|
31
|
+
/** A name a boost may target from free text: short ASCII, or an "everyone" word. */
|
|
32
|
+
const NAME = /^[a-z0-9][a-z0-9 _.@-]{0,39}$/;
|
|
33
|
+
/**
|
|
34
|
+
* Whether free text after a boost keyword is a plausible target (so an
|
|
35
|
+
* ordinary sentence that happens to start with 放开 / ends with "unlimited
|
|
36
|
+
* today" still goes to the orc).
|
|
37
|
+
*
|
|
38
|
+
* @param who - Candidate target
|
|
39
|
+
* @returns True when it may be a team / agent name or "everyone"
|
|
40
|
+
*/
|
|
41
|
+
function plausibleTarget(who) {
|
|
42
|
+
return EVERYONE.has(who) || NAME.test(who);
|
|
43
|
+
}
|
|
44
|
+
/** Words for "everyone". */
|
|
45
|
+
const EVERYONE = new Set(['everyone', 'everybody', 'all', 'all agents', 'every agent', 'the whole crew', 'total', '所有人', '全部', '大家', '所有', '全员', '全部人']);
|
|
46
|
+
const AMOUNT = String.raw `(\d+(?:\.\d+)?\s*(?:k|m|mil|million|b|bn|billion|万|亿)?)(?:\s*tokens?)?`;
|
|
47
|
+
const CAP = String.raw `(?:daily\s+)?(?:token\s+|spend(?:ing)?\s+|usage\s+)?cap`;
|
|
48
|
+
const TODAY = String.raw `(?:\s*(?:for\s+)?today)?`;
|
|
49
|
+
/**
|
|
50
|
+
* Normalise a message for matching.
|
|
51
|
+
*
|
|
52
|
+
* @param text - Raw text
|
|
53
|
+
* @returns Lower-cased, mentions and trailing punctuation removed
|
|
54
|
+
*/
|
|
55
|
+
function norm(text) {
|
|
56
|
+
return text
|
|
57
|
+
.replace(/<@[A-Z0-9]+>/g, '')
|
|
58
|
+
.replace(/[`*_]/g, '')
|
|
59
|
+
.toLowerCase()
|
|
60
|
+
.replace(/[\s.。!!~~]+$/u, '')
|
|
61
|
+
.replace(/^(?:please|pls|请)\s*/u, '')
|
|
62
|
+
.replace(/\s+/g, ' ')
|
|
63
|
+
.trim();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Amount text → tokens.
|
|
67
|
+
*
|
|
68
|
+
* @param text - e.g. `20m`, `2000万`
|
|
69
|
+
* @returns Tokens, or null
|
|
70
|
+
*/
|
|
71
|
+
function amount(text) {
|
|
72
|
+
return parseTokenAmount(text.replace(/\s+/g, ''));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parse a cap / boost command.
|
|
76
|
+
*
|
|
77
|
+
* @param text - Message text
|
|
78
|
+
* @returns The command, or null when the message is not one
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* parseSpendCapCommand('boost CE by 20M today') // { kind: 'boost', target: 'ce', tokens: 20000000 }
|
|
82
|
+
* parseSpendCapCommand('放开 CE 今天') // { kind: 'unlimited', target: 'ce' }
|
|
83
|
+
*/
|
|
84
|
+
export function parseSpendCapCommand(text) {
|
|
85
|
+
if (!text)
|
|
86
|
+
return null;
|
|
87
|
+
const t = norm(text);
|
|
88
|
+
if (!t)
|
|
89
|
+
return null;
|
|
90
|
+
let m;
|
|
91
|
+
const num = (s) => amount(s);
|
|
92
|
+
// ---- caps
|
|
93
|
+
m = new RegExp(String.raw `^set (?:the )?(?:daily total|total daily|total)(?: token| spend(?:ing)?)? cap to ${AMOUNT}$`).exec(t);
|
|
94
|
+
if (m && num(m[1]))
|
|
95
|
+
return { kind: 'set_total', tokens: num(m[1]) };
|
|
96
|
+
m = new RegExp(String.raw `^set (?:the )?(?:daily )?team (?:token )?cap for (.+?) to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
|
|
97
|
+
if (m && num(m[2]))
|
|
98
|
+
return { kind: 'set', target: m[1].trim(), team: true, tokens: num(m[2]) };
|
|
99
|
+
m = new RegExp(String.raw `^set (?:the )?${CAP} for team (.+?) to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
|
|
100
|
+
if (m && num(m[2]))
|
|
101
|
+
return { kind: 'set', target: m[1].trim(), team: true, tokens: num(m[2]) };
|
|
102
|
+
m = new RegExp(String.raw `^set (?:the )?${CAP}(?: for (.+?))? to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
|
|
103
|
+
if (m && num(m[2]))
|
|
104
|
+
return { kind: 'set', target: m[1]?.trim() || null, tokens: num(m[2]) };
|
|
105
|
+
m = /^(?:remove|clear|turn off|disable) (?:the )?(?:daily total|total daily|total)(?: token| spend(?:ing)?)? cap$/.exec(t);
|
|
106
|
+
if (m)
|
|
107
|
+
return { kind: 'remove_total' };
|
|
108
|
+
m = /^(?:remove|clear|turn off|disable) (?:the )?(?:daily )?team cap for (.+)$/.exec(t) ?? new RegExp(String.raw `^(?:remove|clear|turn off|disable) (?:the )?${CAP} for team (.+)$`).exec(t);
|
|
109
|
+
if (m)
|
|
110
|
+
return { kind: 'remove', target: m[1].trim(), team: true };
|
|
111
|
+
m = new RegExp(String.raw `^(?:remove|clear|turn off|disable) (?:the )?${CAP}(?: for (.+))?$`).exec(t);
|
|
112
|
+
if (m)
|
|
113
|
+
return { kind: 'remove', target: m[1]?.trim() || null };
|
|
114
|
+
// ---- boosts (English)
|
|
115
|
+
m = new RegExp(String.raw `^boost (.+?) (?:by |\+)\s*${AMOUNT}${TODAY}$`).exec(t);
|
|
116
|
+
if (m && num(m[2]))
|
|
117
|
+
return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
|
|
118
|
+
m = new RegExp(String.raw `^give (.+?) (?:\+)?${AMOUNT} (?:more|extra)${TODAY}$`).exec(t);
|
|
119
|
+
if (m && num(m[2]))
|
|
120
|
+
return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
|
|
121
|
+
m = /^(?:unlimited|no (?:token )?cap|no limit)(?: tokens?)? (?:for )?today(?: for (.+))?$/.exec(t);
|
|
122
|
+
if (m)
|
|
123
|
+
return { kind: 'unlimited', target: m[1]?.trim() || 'everyone' };
|
|
124
|
+
m = /^(?:unlimited|no (?:token )?cap|no limit) (?:tokens? )?for (.+?)(?: (?:for )?today)?$/.exec(t);
|
|
125
|
+
if (m)
|
|
126
|
+
return { kind: 'unlimited', target: m[1].trim() };
|
|
127
|
+
m = /^(?:lift|remove|drop) (?:the )?(?:daily )?(?:token )?caps? (?:for|on) (.+?) (?:for )?today$/.exec(t);
|
|
128
|
+
if (m)
|
|
129
|
+
return { kind: 'unlimited', target: m[1].trim() };
|
|
130
|
+
m = /^(.+?) unlimited today$/.exec(t);
|
|
131
|
+
if (m && plausibleTarget(m[1].trim()))
|
|
132
|
+
return { kind: 'unlimited', target: m[1].trim() };
|
|
133
|
+
// ---- boosts (Chinese)
|
|
134
|
+
const zh = t.replace(/\s+/g, ' ');
|
|
135
|
+
m = /^(?:今天)?\s*(?:全部|全都|所有人|大家)?\s*放开(?:吧)?\s*(.*?)\s*(?:今天|今日)?(?:吧)?$/u.exec(zh);
|
|
136
|
+
if (m) {
|
|
137
|
+
const who = m[1].trim();
|
|
138
|
+
const all = /^(?:今天|今日)?\s*(?:全部|全都|所有人|大家)/u.test(zh) || EVERYONE.has(who) || who === '';
|
|
139
|
+
if (all)
|
|
140
|
+
return { kind: 'unlimited', target: 'everyone' };
|
|
141
|
+
if (plausibleTarget(who))
|
|
142
|
+
return { kind: 'unlimited', target: who };
|
|
143
|
+
}
|
|
144
|
+
m = /^(.+?)\s*(?:今天|今日)\s*(?:不限|不封顶|放开)$/u.exec(zh);
|
|
145
|
+
if (m && plausibleTarget(m[1].trim()))
|
|
146
|
+
return { kind: 'unlimited', target: m[1].trim() };
|
|
147
|
+
m = new RegExp(String.raw `^(?:今天)?\s*给\s*(.+?)\s*(?:今天)?\s*(?:加|多加|增加)\s*${AMOUNT}$`, 'u').exec(zh);
|
|
148
|
+
if (m && num(m[2]) && plausibleTarget(m[1].trim()))
|
|
149
|
+
return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
|
|
150
|
+
m = new RegExp(String.raw `^(.+?)\s*(?:今天|今日)\s*(?:加|多加|增加)\s*${AMOUNT}$`, 'u').exec(zh);
|
|
151
|
+
if (m && num(m[2]) && plausibleTarget(m[1].trim()))
|
|
152
|
+
return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
|
|
153
|
+
// ---- the pre-token dollar forms: answer with the token form instead of passing them on
|
|
154
|
+
if (/^(?:set|raise|remove) .*cap.*\$\s*\d/.test(t))
|
|
155
|
+
return { kind: 'usd_hint' };
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Resolve the agent the owner named.
|
|
160
|
+
*
|
|
161
|
+
* @param who - Session name, member name, or "orc" / "orchestrator"
|
|
162
|
+
* @param agents - Configured agents
|
|
163
|
+
* @returns Session, or null when unknown / ambiguous
|
|
164
|
+
*/
|
|
165
|
+
export function resolveAgent(who, agents) {
|
|
166
|
+
const w = who.trim().toLowerCase().replace(/^@/, '');
|
|
167
|
+
if (['orc', 'the orc', 'orchestrator', 'the orchestrator', 'crewly orc', ORCHESTRATOR_SESSION_NAME].includes(w))
|
|
168
|
+
return ORCHESTRATOR_SESSION_NAME;
|
|
169
|
+
const bySession = agents.find((a) => a.session.toLowerCase() === w);
|
|
170
|
+
if (bySession)
|
|
171
|
+
return bySession.session;
|
|
172
|
+
const byName = agents.filter((a) => a.name.toLowerCase() === w);
|
|
173
|
+
return byName.length === 1 ? byName[0].session : null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Resolve the team the owner named.
|
|
177
|
+
*
|
|
178
|
+
* @param who - Team name or id (`team CE` works too)
|
|
179
|
+
* @param teams - Teams
|
|
180
|
+
* @returns Team, or null when unknown / ambiguous
|
|
181
|
+
*/
|
|
182
|
+
export function resolveTeam(who, teams) {
|
|
183
|
+
const w = who.trim().toLowerCase().replace(/^(?:the )?team\s+/, '').replace(/\s+team$/, '');
|
|
184
|
+
const byId = teams.find((t) => t.id.toLowerCase() === w);
|
|
185
|
+
if (byId)
|
|
186
|
+
return byId;
|
|
187
|
+
const byName = teams.filter((t) => t.name.toLowerCase() === w);
|
|
188
|
+
return byName.length === 1 ? byName[0] : null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The orc's harness line while it is stopped by a cap.
|
|
192
|
+
*
|
|
193
|
+
* @param stop - The orc's stop
|
|
194
|
+
* @returns One line
|
|
195
|
+
*/
|
|
196
|
+
export function orcCappedReply(stop) {
|
|
197
|
+
const extra = compactTokens(suggestedBoost(stop.capTokens));
|
|
198
|
+
const who = stop.scope === 'total' ? 'everyone' : stop.scope === 'team' ? (stop.teamName ?? 'the team') : 'orc';
|
|
199
|
+
return `${spendCapReason(stop, 'Orc')}. No new turns start until midnight; your message is queued. To lift it for today, reply \`boost ${who} by ${extra} today\` or \`unlimited today for ${who}\` (or Settings → System → Usage).`;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Run a parsed command.
|
|
203
|
+
*
|
|
204
|
+
* @param cmd - Command
|
|
205
|
+
* @param deps - Collaborators
|
|
206
|
+
* @returns The owner's one-line answer
|
|
207
|
+
*/
|
|
208
|
+
export async function runSpendCapCommand(cmd, deps) {
|
|
209
|
+
const agents = await deps.agents();
|
|
210
|
+
const teams = await deps.teams();
|
|
211
|
+
const agentOf = (target) => {
|
|
212
|
+
const session = resolveAgent(target, agents);
|
|
213
|
+
if (!session)
|
|
214
|
+
return null;
|
|
215
|
+
return { session, name: session === ORCHESTRATOR_SESSION_NAME ? 'Orc' : (agents.find((a) => a.session === session)?.name ?? session) };
|
|
216
|
+
};
|
|
217
|
+
const unknown = (target) => `I don't know a team or agent called "${target}". Use a team name (e.g. ${teams[0]?.name ?? 'CE'}), an agent's name or session name, or "everyone".`;
|
|
218
|
+
const resolve = (target, preferTeam) => {
|
|
219
|
+
if (EVERYONE.has(target.trim().toLowerCase()))
|
|
220
|
+
return { scope: 'all' };
|
|
221
|
+
const team = resolveTeam(target, teams);
|
|
222
|
+
const agent = agentOf(target);
|
|
223
|
+
if (team && (preferTeam || !agent))
|
|
224
|
+
return { scope: 'team', team };
|
|
225
|
+
if (agent)
|
|
226
|
+
return { scope: 'agent', ...agent };
|
|
227
|
+
return unknown(target);
|
|
228
|
+
};
|
|
229
|
+
const label = (t) => (t.scope === 'all' ? 'everyone' : t.scope === 'team' ? `team ${t.team.name}` : t.name);
|
|
230
|
+
const boostInput = (t) => t.scope === 'all' ? { scope: 'all' } : t.scope === 'team' ? { scope: 'team', id: t.team.id } : { scope: 'agent', id: t.session };
|
|
231
|
+
switch (cmd.kind) {
|
|
232
|
+
case 'usd_hint':
|
|
233
|
+
return 'Caps are counted in tokens now, not dollars. Try `set daily cap for orc to 5M`, `set team cap for CE to 50M`, or `boost CE by 20M today`.';
|
|
234
|
+
case 'set_total':
|
|
235
|
+
await deps.setCaps({ totalCapTokens: cmd.tokens });
|
|
236
|
+
return `Daily token cap set to ${formatTokens(cmd.tokens)} for all agents together.`;
|
|
237
|
+
case 'remove_total':
|
|
238
|
+
await deps.setCaps({ totalCapTokens: null });
|
|
239
|
+
return 'Daily total token cap removed.';
|
|
240
|
+
case 'set': {
|
|
241
|
+
if (!cmd.target) {
|
|
242
|
+
await deps.setCaps({ defaultAgentCapTokens: cmd.tokens });
|
|
243
|
+
return `Daily token cap set to ${formatTokens(cmd.tokens)} per agent (agents with their own cap keep it).`;
|
|
244
|
+
}
|
|
245
|
+
const t = resolve(cmd.target, cmd.team === true);
|
|
246
|
+
if (typeof t === 'string')
|
|
247
|
+
return t;
|
|
248
|
+
if (t.scope === 'all') {
|
|
249
|
+
await deps.setCaps({ totalCapTokens: cmd.tokens });
|
|
250
|
+
return `Daily token cap set to ${formatTokens(cmd.tokens)} for all agents together.`;
|
|
251
|
+
}
|
|
252
|
+
if (t.scope === 'team') {
|
|
253
|
+
await deps.setCaps({ teams: { [t.team.id]: cmd.tokens } });
|
|
254
|
+
return `Daily token cap for team ${t.team.name} set to ${formatTokens(cmd.tokens)} (all its members together).`;
|
|
255
|
+
}
|
|
256
|
+
await deps.setCaps({ agents: { [t.session]: cmd.tokens } });
|
|
257
|
+
return `Daily token cap for ${t.name} set to ${formatTokens(cmd.tokens)}.`;
|
|
258
|
+
}
|
|
259
|
+
case 'remove': {
|
|
260
|
+
if (!cmd.target) {
|
|
261
|
+
await deps.setCaps({ defaultAgentCapTokens: null });
|
|
262
|
+
return 'Default daily token cap removed (agents with their own cap keep it).';
|
|
263
|
+
}
|
|
264
|
+
const t = resolve(cmd.target, cmd.team === true);
|
|
265
|
+
if (typeof t === 'string')
|
|
266
|
+
return t;
|
|
267
|
+
if (t.scope === 'all') {
|
|
268
|
+
await deps.setCaps({ totalCapTokens: null });
|
|
269
|
+
return 'Daily total token cap removed.';
|
|
270
|
+
}
|
|
271
|
+
if (t.scope === 'team') {
|
|
272
|
+
await deps.setCaps({ teams: { [t.team.id]: null } });
|
|
273
|
+
return `Team ${t.team.name} has no daily token cap now.`;
|
|
274
|
+
}
|
|
275
|
+
await deps.setCaps({ agents: { [t.session]: null } });
|
|
276
|
+
return `${t.name} has no daily token cap now.`;
|
|
277
|
+
}
|
|
278
|
+
case 'boost': {
|
|
279
|
+
const t = resolve(cmd.target, true);
|
|
280
|
+
if (typeof t === 'string')
|
|
281
|
+
return t;
|
|
282
|
+
await deps.boost({ ...boostInput(t), extraTokens: cmd.tokens, by: 'orc-dm' });
|
|
283
|
+
return `Boosted ${label(t)} by +${formatTokens(cmd.tokens)} until midnight. Queued messages are being delivered.`;
|
|
284
|
+
}
|
|
285
|
+
case 'unlimited': {
|
|
286
|
+
const t = resolve(cmd.target, true);
|
|
287
|
+
if (typeof t === 'string')
|
|
288
|
+
return t;
|
|
289
|
+
await deps.boost({ ...boostInput(t), unlimited: true, by: 'orc-dm' });
|
|
290
|
+
return `No token cap for ${label(t)} until midnight. Queued messages are being delivered.`;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* The Slack bridge interceptor for the owner's orc DM.
|
|
296
|
+
*
|
|
297
|
+
* @param deps - Collaborators
|
|
298
|
+
* @returns Interceptor: true when the message was a cap command (consumed)
|
|
299
|
+
*/
|
|
300
|
+
export function createSpendCapInterceptor(deps) {
|
|
301
|
+
return (message) => {
|
|
302
|
+
if (deps.ownerDmScope(message) !== 'orc')
|
|
303
|
+
return false;
|
|
304
|
+
const target = deps.replyTargetOf(message);
|
|
305
|
+
const cmd = message.hasFiles ? null : parseSpendCapCommand(message.text);
|
|
306
|
+
if (cmd) {
|
|
307
|
+
void runSpendCapCommand(cmd, deps)
|
|
308
|
+
.then((text) => deps.reply(text, target))
|
|
309
|
+
.catch((err) => {
|
|
310
|
+
deps.onError?.(err);
|
|
311
|
+
return deps.reply(`Couldn't change the cap: ${err instanceof Error ? err.message : String(err)}`, target).catch(() => undefined);
|
|
312
|
+
});
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
const stop = deps.orcStop();
|
|
316
|
+
if (stop) {
|
|
317
|
+
// Not consumed: the message goes on to the orc's queue and waits there.
|
|
318
|
+
void deps.reply(orcCappedReply(stop), target).catch((err) => deps.onError?.(err));
|
|
319
|
+
}
|
|
320
|
+
return false;
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=spend-cap-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spend-cap-command.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token cap gate — the process-wide hook the delivery and wake paths ask
|
|
3
|
+
* "may this agent start a new turn?". Kept apart from the service so the
|
|
4
|
+
* hot paths (agent registration, the orc queue processor, the owner-message
|
|
5
|
+
* watchdog) import a tiny module with no dependencies of its own.
|
|
6
|
+
*
|
|
7
|
+
* specs/2026-10-02-spend-cap.md
|
|
8
|
+
*
|
|
9
|
+
* @module services/spend/spend-cap.gate
|
|
10
|
+
*/
|
|
11
|
+
/** Why an agent may not start a new turn today. */
|
|
12
|
+
export interface SpendStop {
|
|
13
|
+
session: string;
|
|
14
|
+
/** `agent`: its own cap; `team`: its team's cap; `total`: the all-agents cap */
|
|
15
|
+
scope: 'agent' | 'team' | 'total';
|
|
16
|
+
/** The cap in force (tokens, boosts included) */
|
|
17
|
+
capTokens: number;
|
|
18
|
+
/** Tokens used today against it */
|
|
19
|
+
usedTokens: number;
|
|
20
|
+
/** For a team stop: the team */
|
|
21
|
+
teamId?: string;
|
|
22
|
+
teamName?: string;
|
|
23
|
+
}
|
|
24
|
+
/** What the service exposes to the gate. */
|
|
25
|
+
export interface SpendCapGate {
|
|
26
|
+
/** The stop in force for a session, or null when it may run */
|
|
27
|
+
stopOf(session: string): SpendStop | null;
|
|
28
|
+
/** Owner-facing name of a session ("Orc", "Ella") */
|
|
29
|
+
displayNameOf?(session: string): string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Install (or clear) the gate.
|
|
33
|
+
*
|
|
34
|
+
* @param next - Gate, or null
|
|
35
|
+
*/
|
|
36
|
+
export declare function setSpendCapGate(next: SpendCapGate | null): void;
|
|
37
|
+
/**
|
|
38
|
+
* The stop in force for a session. Never throws: a broken gate lets the
|
|
39
|
+
* agent run rather than silently dropping its work.
|
|
40
|
+
*
|
|
41
|
+
* @param session - Agent session
|
|
42
|
+
* @returns Stop, or null
|
|
43
|
+
*/
|
|
44
|
+
export declare function spendCapStopOf(session: string): SpendStop | null;
|
|
45
|
+
/**
|
|
46
|
+
* Owner-facing name of a session.
|
|
47
|
+
*
|
|
48
|
+
* @param session - Agent session
|
|
49
|
+
* @returns Name (the session name when unknown)
|
|
50
|
+
*/
|
|
51
|
+
export declare function spendCapNameOf(session: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* The one-line reason, e.g. "Orc hit its daily token cap (5M tokens)".
|
|
54
|
+
*
|
|
55
|
+
* @param stop - The stop
|
|
56
|
+
* @param name - Owner-facing name (default: looked up)
|
|
57
|
+
* @returns Reason text
|
|
58
|
+
*/
|
|
59
|
+
export declare function spendCapReason(stop: SpendStop, name?: string): string;
|
|
60
|
+
//# sourceMappingURL=spend-cap.gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spend-cap.gate.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,qDAAqD;IACrD,aAAa,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,GAAE,MAAqC,GAAG,MAAM,CAQnG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token cap gate — the process-wide hook the delivery and wake paths ask
|
|
3
|
+
* "may this agent start a new turn?". Kept apart from the service so the
|
|
4
|
+
* hot paths (agent registration, the orc queue processor, the owner-message
|
|
5
|
+
* watchdog) import a tiny module with no dependencies of its own.
|
|
6
|
+
*
|
|
7
|
+
* specs/2026-10-02-spend-cap.md
|
|
8
|
+
*
|
|
9
|
+
* @module services/spend/spend-cap.gate
|
|
10
|
+
*/
|
|
11
|
+
import { formatTokens } from '../usage/token-format.js';
|
|
12
|
+
let gate = null;
|
|
13
|
+
/**
|
|
14
|
+
* Install (or clear) the gate.
|
|
15
|
+
*
|
|
16
|
+
* @param next - Gate, or null
|
|
17
|
+
*/
|
|
18
|
+
export function setSpendCapGate(next) {
|
|
19
|
+
gate = next;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The stop in force for a session. Never throws: a broken gate lets the
|
|
23
|
+
* agent run rather than silently dropping its work.
|
|
24
|
+
*
|
|
25
|
+
* @param session - Agent session
|
|
26
|
+
* @returns Stop, or null
|
|
27
|
+
*/
|
|
28
|
+
export function spendCapStopOf(session) {
|
|
29
|
+
try {
|
|
30
|
+
return gate?.stopOf(session) ?? null;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Owner-facing name of a session.
|
|
38
|
+
*
|
|
39
|
+
* @param session - Agent session
|
|
40
|
+
* @returns Name (the session name when unknown)
|
|
41
|
+
*/
|
|
42
|
+
export function spendCapNameOf(session) {
|
|
43
|
+
try {
|
|
44
|
+
return gate?.displayNameOf?.(session) || session;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return session;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The one-line reason, e.g. "Orc hit its daily token cap (5M tokens)".
|
|
52
|
+
*
|
|
53
|
+
* @param stop - The stop
|
|
54
|
+
* @param name - Owner-facing name (default: looked up)
|
|
55
|
+
* @returns Reason text
|
|
56
|
+
*/
|
|
57
|
+
export function spendCapReason(stop, name = spendCapNameOf(stop.session)) {
|
|
58
|
+
if (stop.scope === 'total') {
|
|
59
|
+
return `${name} is stopped: all agents together hit the daily token cap (${formatTokens(stop.capTokens)})`;
|
|
60
|
+
}
|
|
61
|
+
if (stop.scope === 'team') {
|
|
62
|
+
return `${name} is stopped: team ${stop.teamName ?? stop.teamId ?? ''} hit its daily token cap (${formatTokens(stop.capTokens)})`;
|
|
63
|
+
}
|
|
64
|
+
return `${name} hit its daily token cap (${formatTokens(stop.capTokens)})`;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=spend-cap.gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spend-cap.gate.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwBxD,IAAI,IAAI,GAAwB,IAAI,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,OAAe,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;IACzF,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,GAAG,IAAI,6DAA6D,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAC7G,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,qBAAqB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,6BAA6B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IACpI,CAAC;IACD,OAAO,GAAG,IAAI,6BAA6B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AAC7E,CAAC"}
|