crewly 1.20.355 → 1.20.358
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/constants.ts +11 -0
- package/config/roles/team-leader/prompt.md +1 -1
- package/config/roles/team-leader/tl-addon.md +1 -1
- package/config/skills/team-leader/delegate-task/SKILL.md +23 -1
- package/config/skills/team-leader/delegate-task/execute.sh +44 -1
- package/config/skills/team-leader/delegate-task/execute.test.sh +95 -1
- package/dist/backend/backend/src/constants.d.ts +319 -17
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +322 -17
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +10 -0
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +7 -0
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +5 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +15 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +138 -15
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +21 -2
- 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 +100 -3
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +8 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +26 -2
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +9 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +60 -4
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts +22 -0
- package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.js +33 -0
- package/dist/backend/backend/src/services/agent/resource-mode-protection.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +59 -3
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js +108 -10
- package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +126 -11
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +23 -0
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js +47 -6
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts +150 -0
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js +319 -0
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +9 -7
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +19 -17
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.js +11 -0
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts +104 -0
- package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/startup-briefing.service.js +302 -0
- package/dist/backend/backend/src/services/memory/startup-briefing.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts +14 -2
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.js +21 -4
- package/dist/backend/backend/src/services/messaging/deferred-start-retry.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts +24 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js +54 -3
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.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 +10 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +8 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.js +33 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js +2 -2
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/question-card-gate.d.ts +49 -0
- package/dist/backend/backend/src/services/open-items/question-card-gate.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/question-card-gate.js +77 -0
- package/dist/backend/backend/src/services/open-items/question-card-gate.js.map +1 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +9 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +16 -2
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +10 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +2 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +17 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +7 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +22 -10
- package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts +30 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js +48 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +8 -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 +29 -8
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +16 -0
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +23 -0
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts +2 -1
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.js +3 -2
- package/dist/backend/backend/src/services/runtime-fallback/reset-time.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +128 -5
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +320 -38
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts +23 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +48 -3
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +78 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js +159 -1
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.d.ts +63 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.js +104 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.d.ts +166 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.js +207 -0
- package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.js.map +1 -0
- package/dist/backend/backend/src/services/slack/agent-coordination.d.ts +119 -0
- package/dist/backend/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/agent-coordination.js +174 -0
- package/dist/backend/backend/src/services/slack/agent-coordination.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +7 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +619 -9
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +49 -12
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +21 -1
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-chat.js +54 -2
- package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +9 -4
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js +32 -10
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +19 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-importer.js +78 -3
- package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js +8 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts +106 -0
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.js +212 -0
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +20 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -2
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +11 -4
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +13 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +3 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +4 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +4 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +33 -4
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js +75 -7
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +3 -1
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts +116 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js +227 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.js +222 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts +93 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js +142 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts +104 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js +192 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts +3 -2
- package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-query.service.js +23 -39
- package/dist/backend/backend/src/services/wiki/wiki-query.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts +105 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js +195 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +3 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js +96 -25
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js +17 -1
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +22 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +35 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +12 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +1 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +11 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +11 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +319 -17
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +322 -17
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +21 -2
- 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 +100 -3
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +9 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +60 -4
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +59 -3
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js +108 -10
- package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +126 -11
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +23 -0
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js +47 -6
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.js +11 -0
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts +104 -0
- package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/startup-briefing.service.js +302 -0
- package/dist/cli/backend/src/services/memory/startup-briefing.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.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 +10 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +8 -0
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.js +33 -0
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/question-card-gate.d.ts +49 -0
- package/dist/cli/backend/src/services/open-items/question-card-gate.d.ts.map +1 -0
- package/dist/cli/backend/src/services/open-items/question-card-gate.js +77 -0
- package/dist/cli/backend/src/services/open-items/question-card-gate.js.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +2 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +17 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts +7 -0
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +22 -10
- package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +16 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +23 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts +2 -1
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.js +3 -2
- package/dist/cli/backend/src/services/runtime-fallback/reset-time.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +78 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js +159 -1
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.d.ts +63 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.js +104 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.d.ts +166 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.js +207 -0
- package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.js.map +1 -0
- package/dist/cli/backend/src/services/slack/agent-coordination.d.ts +119 -0
- package/dist/cli/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/agent-coordination.js +174 -0
- package/dist/cli/backend/src/services/slack/agent-coordination.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +619 -9
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +49 -12
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +33 -4
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js +75 -7
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.js +222 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.js +105 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
- package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-search.service.js +96 -25
- package/dist/cli/backend/src/services/wiki/wiki-search.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js +17 -1
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +12 -0
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.d.ts +1 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/config/constants.d.ts +11 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +11 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-limit-screen.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,EAA8D,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE3H,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAChC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,oCAAoC;IACpC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC;AAED,sBAAsB;AACtB,MAAM,WAAW,sBAAsB;IACtC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC/D;AAED,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACxC,wDAAwD;IACxD,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACtB,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAwBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC5C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwClC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read an agent's screen for a usage-limit state, record it, and answer
|
|
3
|
+
* Claude Code's usage-limit menu.
|
|
4
|
+
*
|
|
5
|
+
* One entry point ({@link inspectUsageLimitScreen}) for every place that
|
|
6
|
+
* already reads an agent's screen: the login/screen monitor's 30s sweep, the
|
|
7
|
+
* orchestrator heartbeat, and the delivery wait for a prompt. Detection is
|
|
8
|
+
* {@link detectUsageLimitScreen}; the state is {@link markUsageLimited}.
|
|
9
|
+
*
|
|
10
|
+
* The menu ("❯ 1. Stop and wait for limit to reset / 2. Wait here, then
|
|
11
|
+
* continue automatically at 8pm") is answered with option 2, like the other
|
|
12
|
+
* known start-up prompts are answered with the one right choice for an
|
|
13
|
+
* unattended agent: the turn waits and goes on by itself at the reset, so
|
|
14
|
+
* nobody has to come back and re-send it. Only while option 1 or 2 is the
|
|
15
|
+
* highlighted one, once per state, and Enter is pressed only after the
|
|
16
|
+
* screen shows option 2 highlighted.
|
|
17
|
+
*
|
|
18
|
+
* @module services/runtime-fallback/usage-limit-screen
|
|
19
|
+
*/
|
|
20
|
+
import { USAGE_LIMIT_STATE_CONSTANTS } from '../../constants.js';
|
|
21
|
+
import { delay } from '../../utils/async.utils.js';
|
|
22
|
+
import { reportRuntimeOutput } from './effective-runtime.js';
|
|
23
|
+
import { detectUsageLimitScreen } from './usage-limit-rules.js';
|
|
24
|
+
import { markUsageLimited, noteUsageLimitMenuAnswered, usageLimitOf } from './usage-limit-state.js';
|
|
25
|
+
/** `❯` on option 2 of the usage-limit menu. */
|
|
26
|
+
const OPTION_2_SELECTED = /❯\s*2\.\s*Wait\s*here/i;
|
|
27
|
+
/**
|
|
28
|
+
* Answer the usage-limit menu with option 2 ("Wait here, then continue
|
|
29
|
+
* automatically"). Down + check + Enter from option 1; Enter from option 2.
|
|
30
|
+
*
|
|
31
|
+
* @param sessionName - Session
|
|
32
|
+
* @param selected - Highlighted option
|
|
33
|
+
* @param io - Keys + capture
|
|
34
|
+
* @returns True when Enter was pressed on option 2
|
|
35
|
+
*/
|
|
36
|
+
async function answerMenu(sessionName, selected, io) {
|
|
37
|
+
if (selected === 1) {
|
|
38
|
+
await io.sendKey(sessionName, 'Down');
|
|
39
|
+
await delay(USAGE_LIMIT_STATE_CONSTANTS.MENU_KEY_DELAY_MS);
|
|
40
|
+
if (!OPTION_2_SELECTED.test(io.capture(sessionName)))
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
await io.sendEnter(sessionName);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Look at a session's screen for a usage-limit state. On a match the state
|
|
48
|
+
* is recorded (a new one is logged and handed to the runtime fallback, which
|
|
49
|
+
* may move the agent to another runtime) and an open usage-limit menu is
|
|
50
|
+
* answered. Never throws.
|
|
51
|
+
*
|
|
52
|
+
* @param sessionName - Session
|
|
53
|
+
* @param screen - Captured screen
|
|
54
|
+
* @param runtime - Runtime the session runs (null when unknown: nothing is detected)
|
|
55
|
+
* @param options - Keys, logger, clock
|
|
56
|
+
* @returns The state in force (also one recorded earlier), or null
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* const limited = await inspectUsageLimitScreen('crewly-orc', screen, 'claude-code', { io });
|
|
61
|
+
* if (limited) return; // do not restart / wait / write
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export async function inspectUsageLimitScreen(sessionName, screen, runtime, options = {}) {
|
|
65
|
+
const now = options.now ?? Date.now();
|
|
66
|
+
try {
|
|
67
|
+
const match = runtime ? detectUsageLimitScreen(screen, runtime, now, options.timeZone) : null;
|
|
68
|
+
if (!match)
|
|
69
|
+
return usageLimitOf(sessionName, now);
|
|
70
|
+
const { info, isNew } = markUsageLimited({ sessionName, runtime, ruleId: match.ruleId, resetAt: match.resetAt, source: match.menu ? 'menu' : 'screen' }, now);
|
|
71
|
+
if (isNew) {
|
|
72
|
+
options.logger?.warn('Agent runtime is out of usage — no restarts or deliveries until it resets', {
|
|
73
|
+
sessionName,
|
|
74
|
+
runtime,
|
|
75
|
+
rule: match.ruleId,
|
|
76
|
+
until: info.until ?? null,
|
|
77
|
+
retryAt: info.retryAt,
|
|
78
|
+
menu: match.menu !== null,
|
|
79
|
+
});
|
|
80
|
+
// The screen is live (bottom of it, a plausible reset): the fallback may
|
|
81
|
+
// move the agent to another runtime meanwhile.
|
|
82
|
+
if (options.reportToFallback !== false && runtime)
|
|
83
|
+
reportRuntimeOutput(sessionName, runtime, screen, 'output');
|
|
84
|
+
}
|
|
85
|
+
const selected = match.menu?.selected;
|
|
86
|
+
if (options.io && selected && !info.menuAnsweredAt) {
|
|
87
|
+
// Once per state: a menu that comes back is not pressed into again.
|
|
88
|
+
noteUsageLimitMenuAnswered(sessionName, now);
|
|
89
|
+
const answered = await answerMenu(sessionName, selected, options.io);
|
|
90
|
+
if (answered) {
|
|
91
|
+
options.logger?.info('Answered the usage-limit menu: wait and continue automatically at the reset', { sessionName, until: info.until ?? null });
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
options.logger?.warn('Usage-limit menu: could not select "Wait here, then continue automatically"; left as is', { sessionName });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return info;
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
options.logger?.warn('Usage-limit screen check failed (ignored)', { sessionName, error: err instanceof Error ? err.message : String(err) });
|
|
101
|
+
return usageLimitOf(sessionName, now);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=usage-limit-screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-limit-screen.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-screen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage-limit state per agent session — "this agent's runtime is out of
|
|
3
|
+
* usage until …". Process-wide and dependency-free (like the spend-cap gate)
|
|
4
|
+
* so the hot paths can ask it cheaply: the orchestrator restart service and
|
|
5
|
+
* heartbeat monitor (no restarts while limited), delivery (no waiting on a
|
|
6
|
+
* prompt that will not come, messages held), dispatch, and the status APIs.
|
|
7
|
+
*
|
|
8
|
+
* Why (2026-10-16): the orchestrator sat on Claude Code's weekly-limit menu
|
|
9
|
+
* for ~38 hours. Crewly kept waiting for its prompt every ~17s, restarted it
|
|
10
|
+
* 12 times in 15 minutes, and `GET /api/orchestrator/status` said "active and
|
|
11
|
+
* ready" the whole time.
|
|
12
|
+
*
|
|
13
|
+
* Fed by the login/screen monitor (screen sweep + live output) through
|
|
14
|
+
* {@link markUsageLimited}. A state lifts on its own at the reset time (plus
|
|
15
|
+
* a short grace), or after {@link USAGE_LIMIT_STATE_CONSTANTS.NO_RESET_BACKOFF_MS}
|
|
16
|
+
* when no reset time was given; it is set again if the limit is still there.
|
|
17
|
+
* It is lifted early ({@link liftUsageLimit}) as soon as the agent works
|
|
18
|
+
* again: a finished turn or tool call (Claude Code hooks), or fresh live
|
|
19
|
+
* output that is not a limit message.
|
|
20
|
+
* It is held in memory only: it describes the live screen, and after a Crewly
|
|
21
|
+
* restart the screen is read again.
|
|
22
|
+
*
|
|
23
|
+
* Distinct from the runtime fallback's account-wide "exhausted runtime"
|
|
24
|
+
* record: that one moves agents to another runtime; this one says what a
|
|
25
|
+
* given session is doing right now. A session moved to another runtime is
|
|
26
|
+
* cleared ({@link clearUsageLimit}).
|
|
27
|
+
*
|
|
28
|
+
* @module services/runtime-fallback/usage-limit-state
|
|
29
|
+
*/
|
|
30
|
+
/** Where a usage-limit state was seen. */
|
|
31
|
+
export type UsageLimitSource = 'menu' | 'screen' | 'output';
|
|
32
|
+
/** A session that is out of usage. */
|
|
33
|
+
export interface UsageLimitedInfo {
|
|
34
|
+
/** Agent session */
|
|
35
|
+
sessionName: string;
|
|
36
|
+
/** Runtime that is out of usage (null when unknown) */
|
|
37
|
+
runtime: string | null;
|
|
38
|
+
/** Detection rule (logs only) */
|
|
39
|
+
ruleId: string;
|
|
40
|
+
/** Where it was seen */
|
|
41
|
+
source: UsageLimitSource;
|
|
42
|
+
/** ISO time of first detection */
|
|
43
|
+
detectedAt: string;
|
|
44
|
+
/** ISO time the limit was last seen (every detection refreshes it) */
|
|
45
|
+
lastSeenAt: string;
|
|
46
|
+
/** ISO time the runtime says the limit resets, when it says so */
|
|
47
|
+
until?: string;
|
|
48
|
+
/** ISO time the session may be tried again (reset + grace, or the backoff) */
|
|
49
|
+
retryAt: string;
|
|
50
|
+
/** ISO time Crewly answered the usage-limit menu, when it did */
|
|
51
|
+
menuAnsweredAt?: string;
|
|
52
|
+
}
|
|
53
|
+
/** Input of {@link markUsageLimited}. */
|
|
54
|
+
export interface MarkUsageLimitedInput {
|
|
55
|
+
sessionName: string;
|
|
56
|
+
runtime: string | null;
|
|
57
|
+
ruleId: string;
|
|
58
|
+
/** Reset time (epoch ms), or null when unknown */
|
|
59
|
+
resetAt: number | null;
|
|
60
|
+
source: UsageLimitSource;
|
|
61
|
+
}
|
|
62
|
+
/** API view of a usage-limited session (the `usageLimited` status field). */
|
|
63
|
+
export interface UsageLimitedView {
|
|
64
|
+
/** ISO reset time, when known */
|
|
65
|
+
until?: string;
|
|
66
|
+
/** ISO time Crewly tries the session again */
|
|
67
|
+
retryAt: string;
|
|
68
|
+
/** ISO time of first detection */
|
|
69
|
+
detectedAt: string;
|
|
70
|
+
/** Runtime that is out of usage */
|
|
71
|
+
runtime: string | null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Record that a session is out of usage. A state already in force keeps its
|
|
75
|
+
* first-detection time; a reset time seen later replaces the backoff, and a
|
|
76
|
+
* later detection without one does not extend it.
|
|
77
|
+
*
|
|
78
|
+
* @param input - Session, runtime, rule, reset time, source
|
|
79
|
+
* @param now - Current time (ms)
|
|
80
|
+
* @returns The state and whether it is new (not in force before this call)
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* markUsageLimited({ sessionName: 'crewly-orc', runtime: 'claude-code', ruleId: 'claude.hit_your_limit', resetAt, source: 'menu' });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function markUsageLimited(input: MarkUsageLimitedInput, now?: number): {
|
|
88
|
+
info: UsageLimitedInfo;
|
|
89
|
+
isNew: boolean;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* The usage-limit state in force for a session. A state past its retry time
|
|
93
|
+
* is dropped. Never throws.
|
|
94
|
+
*
|
|
95
|
+
* @param sessionName - Agent session
|
|
96
|
+
* @param now - Current time (ms)
|
|
97
|
+
* @returns The state, or null when the session may run
|
|
98
|
+
*/
|
|
99
|
+
export declare function usageLimitOf(sessionName: string, now?: number): UsageLimitedInfo | null;
|
|
100
|
+
/**
|
|
101
|
+
* Milliseconds until a usage-limited session may be tried again.
|
|
102
|
+
*
|
|
103
|
+
* @param info - The state
|
|
104
|
+
* @param now - Current time (ms)
|
|
105
|
+
* @returns Milliseconds (at least 0)
|
|
106
|
+
*/
|
|
107
|
+
export declare function usageLimitRemainingMs(info: UsageLimitedInfo, now?: number): number;
|
|
108
|
+
/**
|
|
109
|
+
* Note that Crewly answered the usage-limit menu of a session.
|
|
110
|
+
*
|
|
111
|
+
* @param sessionName - Agent session
|
|
112
|
+
* @param now - Current time (ms)
|
|
113
|
+
*/
|
|
114
|
+
export declare function noteUsageLimitMenuAnswered(sessionName: string, now?: number): void;
|
|
115
|
+
/**
|
|
116
|
+
* Forget a session's usage-limit state (it moved to another runtime, or the
|
|
117
|
+
* owner changed its runtime).
|
|
118
|
+
*
|
|
119
|
+
* @param sessionName - Agent session
|
|
120
|
+
* @returns True when a state was in force
|
|
121
|
+
*/
|
|
122
|
+
export declare function clearUsageLimit(sessionName: string): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Lift a session's usage-limit state because the agent works again: it
|
|
125
|
+
* finished a turn, or wrote fresh output that is not a limit message.
|
|
126
|
+
* Activity within {@link USAGE_LIMIT_STATE_CONSTANTS.LIFT_GRACE_MS} of the
|
|
127
|
+
* limit last being seen, or of Crewly answering its menu, is the repaint of
|
|
128
|
+
* that screen and does not count.
|
|
129
|
+
*
|
|
130
|
+
* @param sessionName - Agent session
|
|
131
|
+
* @param now - Current time (ms)
|
|
132
|
+
* @returns The lifted state, or null when none was in force or it was too soon
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* if (liftUsageLimit('crewly-orc')) logger.info('Orchestrator works again');
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export declare function liftUsageLimit(sessionName: string, now?: number): UsageLimitedInfo | null;
|
|
140
|
+
/**
|
|
141
|
+
* Every session that is usage-limited now.
|
|
142
|
+
*
|
|
143
|
+
* @param now - Current time (ms)
|
|
144
|
+
* @returns States
|
|
145
|
+
*/
|
|
146
|
+
export declare function listUsageLimited(now?: number): UsageLimitedInfo[];
|
|
147
|
+
/**
|
|
148
|
+
* The status-API view of a session's state (`usageLimited`), or undefined.
|
|
149
|
+
*
|
|
150
|
+
* @param sessionName - Agent session
|
|
151
|
+
* @param now - Current time (ms)
|
|
152
|
+
* @returns View, or undefined when the session is not limited
|
|
153
|
+
*/
|
|
154
|
+
export declare function usageLimitedView(sessionName: string, now?: number): UsageLimitedView | undefined;
|
|
155
|
+
/**
|
|
156
|
+
* One-line, owner-facing reason, e.g. "Orchestrator is out of Claude usage
|
|
157
|
+
* until 2026-10-17T00:00:00.000Z".
|
|
158
|
+
*
|
|
159
|
+
* @param name - Who is limited ("Orchestrator", "Ella")
|
|
160
|
+
* @param info - The state
|
|
161
|
+
* @returns Reason text
|
|
162
|
+
*/
|
|
163
|
+
export declare function usageLimitReason(name: string, info: UsageLimitedInfo): string;
|
|
164
|
+
/** Forget every state (tests). */
|
|
165
|
+
export declare function resetUsageLimitState(): void;
|
|
166
|
+
//# sourceMappingURL=usage-limit-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-limit-state.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5D,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAChC,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAChC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAiBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,GAAE,MAAmB,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CA+BnI;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,gBAAgB,GAAG,IAAI,CAQnG;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAE9F;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAG9F;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,gBAAgB,GAAG,IAAI,CAOrG;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAmB,GAAG,gBAAgB,EAAE,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,gBAAgB,GAAG,SAAS,CAI5G;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAM7E;AAED,kCAAkC;AAClC,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage-limit state per agent session — "this agent's runtime is out of
|
|
3
|
+
* usage until …". Process-wide and dependency-free (like the spend-cap gate)
|
|
4
|
+
* so the hot paths can ask it cheaply: the orchestrator restart service and
|
|
5
|
+
* heartbeat monitor (no restarts while limited), delivery (no waiting on a
|
|
6
|
+
* prompt that will not come, messages held), dispatch, and the status APIs.
|
|
7
|
+
*
|
|
8
|
+
* Why (2026-10-16): the orchestrator sat on Claude Code's weekly-limit menu
|
|
9
|
+
* for ~38 hours. Crewly kept waiting for its prompt every ~17s, restarted it
|
|
10
|
+
* 12 times in 15 minutes, and `GET /api/orchestrator/status` said "active and
|
|
11
|
+
* ready" the whole time.
|
|
12
|
+
*
|
|
13
|
+
* Fed by the login/screen monitor (screen sweep + live output) through
|
|
14
|
+
* {@link markUsageLimited}. A state lifts on its own at the reset time (plus
|
|
15
|
+
* a short grace), or after {@link USAGE_LIMIT_STATE_CONSTANTS.NO_RESET_BACKOFF_MS}
|
|
16
|
+
* when no reset time was given; it is set again if the limit is still there.
|
|
17
|
+
* It is lifted early ({@link liftUsageLimit}) as soon as the agent works
|
|
18
|
+
* again: a finished turn or tool call (Claude Code hooks), or fresh live
|
|
19
|
+
* output that is not a limit message.
|
|
20
|
+
* It is held in memory only: it describes the live screen, and after a Crewly
|
|
21
|
+
* restart the screen is read again.
|
|
22
|
+
*
|
|
23
|
+
* Distinct from the runtime fallback's account-wide "exhausted runtime"
|
|
24
|
+
* record: that one moves agents to another runtime; this one says what a
|
|
25
|
+
* given session is doing right now. A session moved to another runtime is
|
|
26
|
+
* cleared ({@link clearUsageLimit}).
|
|
27
|
+
*
|
|
28
|
+
* @module services/runtime-fallback/usage-limit-state
|
|
29
|
+
*/
|
|
30
|
+
import { RUNTIME_FALLBACK_CONSTANTS, USAGE_LIMIT_STATE_CONSTANTS } from '../../constants.js';
|
|
31
|
+
const states = new Map();
|
|
32
|
+
/**
|
|
33
|
+
* When a state with this reset time may be tried again.
|
|
34
|
+
*
|
|
35
|
+
* @param resetAt - Reset time (ms), or null
|
|
36
|
+
* @param now - Current time (ms)
|
|
37
|
+
* @returns Epoch ms
|
|
38
|
+
*/
|
|
39
|
+
function retryAtFor(resetAt, now) {
|
|
40
|
+
return resetAt !== null
|
|
41
|
+
? resetAt + USAGE_LIMIT_STATE_CONSTANTS.RESET_GRACE_MS
|
|
42
|
+
: now + USAGE_LIMIT_STATE_CONSTANTS.NO_RESET_BACKOFF_MS;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Record that a session is out of usage. A state already in force keeps its
|
|
46
|
+
* first-detection time; a reset time seen later replaces the backoff, and a
|
|
47
|
+
* later detection without one does not extend it.
|
|
48
|
+
*
|
|
49
|
+
* @param input - Session, runtime, rule, reset time, source
|
|
50
|
+
* @param now - Current time (ms)
|
|
51
|
+
* @returns The state and whether it is new (not in force before this call)
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* markUsageLimited({ sessionName: 'crewly-orc', runtime: 'claude-code', ruleId: 'claude.hit_your_limit', resetAt, source: 'menu' });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export function markUsageLimited(input, now = Date.now()) {
|
|
59
|
+
const existing = usageLimitOf(input.sessionName, now);
|
|
60
|
+
// A reset in the past or implausibly far ahead (an old dated message read
|
|
61
|
+
// as next year's) is not trusted: back off instead.
|
|
62
|
+
const resetAt = input.resetAt !== null && input.resetAt > now && input.resetAt - now <= USAGE_LIMIT_STATE_CONSTANTS.MAX_RESET_AHEAD_MS
|
|
63
|
+
? input.resetAt
|
|
64
|
+
: null;
|
|
65
|
+
const until = resetAt !== null ? new Date(resetAt).toISOString() : undefined;
|
|
66
|
+
if (existing) {
|
|
67
|
+
if (until && existing.until !== until) {
|
|
68
|
+
existing.until = until;
|
|
69
|
+
existing.retryAt = new Date(retryAtFor(resetAt, now)).toISOString();
|
|
70
|
+
}
|
|
71
|
+
if (input.runtime && !existing.runtime)
|
|
72
|
+
existing.runtime = input.runtime;
|
|
73
|
+
if (input.source === 'menu')
|
|
74
|
+
existing.source = 'menu';
|
|
75
|
+
existing.lastSeenAt = new Date(now).toISOString();
|
|
76
|
+
return { info: existing, isNew: false };
|
|
77
|
+
}
|
|
78
|
+
const info = {
|
|
79
|
+
sessionName: input.sessionName,
|
|
80
|
+
runtime: input.runtime,
|
|
81
|
+
ruleId: input.ruleId,
|
|
82
|
+
source: input.source,
|
|
83
|
+
detectedAt: new Date(now).toISOString(),
|
|
84
|
+
lastSeenAt: new Date(now).toISOString(),
|
|
85
|
+
...(until ? { until } : {}),
|
|
86
|
+
retryAt: new Date(retryAtFor(resetAt, now)).toISOString(),
|
|
87
|
+
};
|
|
88
|
+
states.set(input.sessionName, info);
|
|
89
|
+
return { info, isNew: true };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The usage-limit state in force for a session. A state past its retry time
|
|
93
|
+
* is dropped. Never throws.
|
|
94
|
+
*
|
|
95
|
+
* @param sessionName - Agent session
|
|
96
|
+
* @param now - Current time (ms)
|
|
97
|
+
* @returns The state, or null when the session may run
|
|
98
|
+
*/
|
|
99
|
+
export function usageLimitOf(sessionName, now = Date.now()) {
|
|
100
|
+
const info = states.get(sessionName);
|
|
101
|
+
if (!info)
|
|
102
|
+
return null;
|
|
103
|
+
if (Date.parse(info.retryAt) <= now) {
|
|
104
|
+
states.delete(sessionName);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return info;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Milliseconds until a usage-limited session may be tried again.
|
|
111
|
+
*
|
|
112
|
+
* @param info - The state
|
|
113
|
+
* @param now - Current time (ms)
|
|
114
|
+
* @returns Milliseconds (at least 0)
|
|
115
|
+
*/
|
|
116
|
+
export function usageLimitRemainingMs(info, now = Date.now()) {
|
|
117
|
+
return Math.max(0, Date.parse(info.retryAt) - now);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Note that Crewly answered the usage-limit menu of a session.
|
|
121
|
+
*
|
|
122
|
+
* @param sessionName - Agent session
|
|
123
|
+
* @param now - Current time (ms)
|
|
124
|
+
*/
|
|
125
|
+
export function noteUsageLimitMenuAnswered(sessionName, now = Date.now()) {
|
|
126
|
+
const info = usageLimitOf(sessionName, now);
|
|
127
|
+
if (info)
|
|
128
|
+
info.menuAnsweredAt = new Date(now).toISOString();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Forget a session's usage-limit state (it moved to another runtime, or the
|
|
132
|
+
* owner changed its runtime).
|
|
133
|
+
*
|
|
134
|
+
* @param sessionName - Agent session
|
|
135
|
+
* @returns True when a state was in force
|
|
136
|
+
*/
|
|
137
|
+
export function clearUsageLimit(sessionName) {
|
|
138
|
+
return states.delete(sessionName);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Lift a session's usage-limit state because the agent works again: it
|
|
142
|
+
* finished a turn, or wrote fresh output that is not a limit message.
|
|
143
|
+
* Activity within {@link USAGE_LIMIT_STATE_CONSTANTS.LIFT_GRACE_MS} of the
|
|
144
|
+
* limit last being seen, or of Crewly answering its menu, is the repaint of
|
|
145
|
+
* that screen and does not count.
|
|
146
|
+
*
|
|
147
|
+
* @param sessionName - Agent session
|
|
148
|
+
* @param now - Current time (ms)
|
|
149
|
+
* @returns The lifted state, or null when none was in force or it was too soon
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* if (liftUsageLimit('crewly-orc')) logger.info('Orchestrator works again');
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export function liftUsageLimit(sessionName, now = Date.now()) {
|
|
157
|
+
const info = usageLimitOf(sessionName, now);
|
|
158
|
+
if (!info)
|
|
159
|
+
return null;
|
|
160
|
+
const lastSeen = Math.max(Date.parse(info.lastSeenAt), info.menuAnsweredAt ? Date.parse(info.menuAnsweredAt) : 0);
|
|
161
|
+
if (now - lastSeen < USAGE_LIMIT_STATE_CONSTANTS.LIFT_GRACE_MS)
|
|
162
|
+
return null;
|
|
163
|
+
states.delete(sessionName);
|
|
164
|
+
return info;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Every session that is usage-limited now.
|
|
168
|
+
*
|
|
169
|
+
* @param now - Current time (ms)
|
|
170
|
+
* @returns States
|
|
171
|
+
*/
|
|
172
|
+
export function listUsageLimited(now = Date.now()) {
|
|
173
|
+
return [...states.keys()].map((s) => usageLimitOf(s, now)).filter((i) => i !== null);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* The status-API view of a session's state (`usageLimited`), or undefined.
|
|
177
|
+
*
|
|
178
|
+
* @param sessionName - Agent session
|
|
179
|
+
* @param now - Current time (ms)
|
|
180
|
+
* @returns View, or undefined when the session is not limited
|
|
181
|
+
*/
|
|
182
|
+
export function usageLimitedView(sessionName, now = Date.now()) {
|
|
183
|
+
const info = usageLimitOf(sessionName, now);
|
|
184
|
+
if (!info)
|
|
185
|
+
return undefined;
|
|
186
|
+
return { ...(info.until ? { until: info.until } : {}), retryAt: info.retryAt, detectedAt: info.detectedAt, runtime: info.runtime };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* One-line, owner-facing reason, e.g. "Orchestrator is out of Claude usage
|
|
190
|
+
* until 2026-10-17T00:00:00.000Z".
|
|
191
|
+
*
|
|
192
|
+
* @param name - Who is limited ("Orchestrator", "Ella")
|
|
193
|
+
* @param info - The state
|
|
194
|
+
* @returns Reason text
|
|
195
|
+
*/
|
|
196
|
+
export function usageLimitReason(name, info) {
|
|
197
|
+
const runtime = info.runtime ? RUNTIME_FALLBACK_CONSTANTS.SHORT_LABELS[info.runtime] ?? info.runtime : null;
|
|
198
|
+
const what = runtime ? `out of ${runtime} usage` : 'out of usage';
|
|
199
|
+
return info.until
|
|
200
|
+
? `${name} is ${what} until ${info.until}`
|
|
201
|
+
: `${name} is ${what} (reset time unknown; trying again at ${info.retryAt})`;
|
|
202
|
+
}
|
|
203
|
+
/** Forget every state (tests). */
|
|
204
|
+
export function resetUsageLimitState() {
|
|
205
|
+
states.clear();
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=usage-limit-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-limit-state.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-to-agent coordination in Slack rooms (crewly#1340).
|
|
3
|
+
*
|
|
4
|
+
* 2026-10-16, #content-team: Ella, Max and Sam — all on the owner's Mac —
|
|
5
|
+
* posted 20+ top-level Slack messages to each other in 90 minutes ("@Max
|
|
6
|
+
* CREW-718 step 1 of 2 done…", "@Sam Got it, going with your first
|
|
7
|
+
* option…", "@Sam 1.0.217 is live…"). Each one was a new unread for the
|
|
8
|
+
* owner, who does not need that discussion; internal ticket ids leaked into
|
|
9
|
+
* every post; and Ella sent Sam the same conclusion three times.
|
|
10
|
+
*
|
|
11
|
+
* The model is a company group chat: whoever the room asked is the room's
|
|
12
|
+
* one voice; it reaches its helpers privately, and posts one update when
|
|
13
|
+
* their result is in. The pure pieces of that live here:
|
|
14
|
+
* - {@link classifyAgentAddressing}: whom an agent's room post is for —
|
|
15
|
+
* only agents on this machine (stays inside Crewly), agents elsewhere
|
|
16
|
+
* (Slack, in a thread), or anyone else (unchanged);
|
|
17
|
+
* - {@link stripTicketIds}: internal ticket ids out of anything an agent
|
|
18
|
+
* posts to Slack, for real ticket prefixes only;
|
|
19
|
+
* - {@link CoordinationDedupe}: the same agent sending a near-identical
|
|
20
|
+
* message to the same recipients in the same room within 15 minutes.
|
|
21
|
+
*
|
|
22
|
+
* @module services/slack/agent-coordination
|
|
23
|
+
*/
|
|
24
|
+
/** Whom an agent's room post addresses. */
|
|
25
|
+
export type AgentAddressing =
|
|
26
|
+
/** Only agents running on this machine: delivered inside Crewly, never posted to Slack. */
|
|
27
|
+
'local-only'
|
|
28
|
+
/** Only agents, at least one on another machine: Slack is the only way there, in a thread. */
|
|
29
|
+
| 'cross-machine'
|
|
30
|
+
/** No agent @'d, or a person / broadcast / name nobody knows: posted as before. */
|
|
31
|
+
| 'other';
|
|
32
|
+
/** What the room knows about the names an agent post @'s. */
|
|
33
|
+
export interface AgentAddressingInput {
|
|
34
|
+
/** Agents @'d that run on this machine (sessions) */
|
|
35
|
+
localAgents: readonly string[];
|
|
36
|
+
/** Agents @'d that run on another machine (sessions or names) */
|
|
37
|
+
remoteAgents: readonly string[];
|
|
38
|
+
/** @-tokens or native ids that are neither: a person, or a name nobody knows */
|
|
39
|
+
others: readonly string[];
|
|
40
|
+
/** A person addressed by name without an @ ("Steve, …"), or @here/@channel */
|
|
41
|
+
addressesPeople: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Whom an agent's post addresses. Anything that may be for a person — a
|
|
45
|
+
* person's name, a broadcast, a name that matched nobody — keeps today's
|
|
46
|
+
* behaviour: the owner must never miss a message meant for them.
|
|
47
|
+
*
|
|
48
|
+
* @param input - The resolved names
|
|
49
|
+
* @returns The addressing class
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* classifyAgentAddressing({ localAgents: ['max'], remoteAgents: [], others: [], addressesPeople: false }); // 'local-only'
|
|
54
|
+
* classifyAgentAddressing({ localAgents: ['max'], remoteAgents: ['rex'], others: [], addressesPeople: false }); // 'cross-machine'
|
|
55
|
+
* classifyAgentAddressing({ localAgents: ['max'], remoteAgents: [], others: ['Steve'], addressesPeople: false }); // 'other'
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function classifyAgentAddressing(input: AgentAddressingInput): AgentAddressing;
|
|
59
|
+
/**
|
|
60
|
+
* The real ticket prefixes, normalised: upper case, two to ten letters or
|
|
61
|
+
* digits starting with a letter. One-letter prefixes (the `T` fallback,
|
|
62
|
+
* decisions' `D`) are left out — "T-5" or "D-3" in prose is too often not
|
|
63
|
+
* a ticket.
|
|
64
|
+
*
|
|
65
|
+
* @param prefixes - Prefixes as configured (project ticket counters, `TKT`)
|
|
66
|
+
* @returns Unique prefixes, longest first
|
|
67
|
+
*/
|
|
68
|
+
export declare function normaliseTicketPrefixes(prefixes: readonly string[]): string[];
|
|
69
|
+
/**
|
|
70
|
+
* Take internal ticket ids out of a Slack post. Tickets are the harness's
|
|
71
|
+
* bookkeeping; the owner never sees their ids or mechanics.
|
|
72
|
+
*
|
|
73
|
+
* Only ids with a real prefix are touched, so "UTF-8", "GPT-6" or "ISO-27001"
|
|
74
|
+
* stay. An id that is part of a path, branch or URL ("fix/CREW-12",
|
|
75
|
+
* "/blog/CREW-12") stays too. A parenthetical of ids goes with its brackets,
|
|
76
|
+
* a leading "CREW-718:" with its colon, and a preposition left dangling
|
|
77
|
+
* before punctuation ("for CREW-718.") goes with the id.
|
|
78
|
+
*
|
|
79
|
+
* @param text - The post
|
|
80
|
+
* @param prefixes - Real ticket prefixes
|
|
81
|
+
* @returns The post without ticket ids (the original when nothing would be left)
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* stripTicketIds('@Max CREW-718 step 1 of 2 done', ['CREW']); // '@Max step 1 of 2 done'
|
|
86
|
+
* stripTicketIds('the fix (CREW-718) is live', ['CREW']); // 'the fix is live'
|
|
87
|
+
* stripTicketIds('UTF-8 and GPT-6', ['CREW']); // unchanged
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare function stripTicketIds(text: string, prefixes: readonly string[]): string;
|
|
91
|
+
/**
|
|
92
|
+
* Drops an agent's near-identical repeat to the same recipients in the same
|
|
93
|
+
* room within {@link AGENT_COORDINATION_CONSTANTS.DUPLICATE_WINDOW_MS} — Ella
|
|
94
|
+
* sent Sam one conclusion three times in six minutes (2026-10-16).
|
|
95
|
+
* In memory: a restart forgets, which only lets one repeat through.
|
|
96
|
+
*/
|
|
97
|
+
export declare class CoordinationDedupe {
|
|
98
|
+
private readonly windowMs;
|
|
99
|
+
private readonly threshold;
|
|
100
|
+
private readonly sent;
|
|
101
|
+
/**
|
|
102
|
+
* @param windowMs - How long a message counts as recent
|
|
103
|
+
* @param threshold - Similarity (0..1) at which two messages are one
|
|
104
|
+
*/
|
|
105
|
+
constructor(windowMs?: number, threshold?: number);
|
|
106
|
+
/**
|
|
107
|
+
* Whether this message repeats one the same agent sent the same recipients
|
|
108
|
+
* here recently. A message that is not a repeat is remembered.
|
|
109
|
+
*
|
|
110
|
+
* @param room - Room id
|
|
111
|
+
* @param sender - Sending agent
|
|
112
|
+
* @param recipients - Addressed agents
|
|
113
|
+
* @param text - The message
|
|
114
|
+
* @param now - Current time (ms)
|
|
115
|
+
* @returns True for a repeat (drop it)
|
|
116
|
+
*/
|
|
117
|
+
isRepeat(room: string, sender: string, recipients: readonly string[], text: string, now: number): boolean;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=agent-coordination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-coordination.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/agent-coordination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,2CAA2C;AAC3C,MAAM,MAAM,eAAe;AACzB,2FAA2F;AACzF,YAAY;AACd,8FAA8F;GAC5F,eAAe;AACjB,mFAAmF;GACjF,OAAO,CAAC;AAEZ,6DAA6D;AAC7D,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,iEAAiE;IACjE,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,gFAAgF;IAChF,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CAKpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAO7E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAoBhF;AAQD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAQ3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAR5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IAEvD;;;OAGG;gBAEgB,QAAQ,GAAE,MAAyD,EACnE,SAAS,GAAE,MAA0D;IAGxF;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;CAc1G"}
|