crewly 1.20.185 → 1.20.187
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/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 +64 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +64 -0
- 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/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/spend.controller.d.ts +32 -0
- package/dist/backend/backend/src/controllers/system/spend.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/spend.controller.js +100 -0
- package/dist/backend/backend/src/controllers/system/spend.controller.js.map +1 -0
- 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/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.map +1 -1
- package/dist/backend/backend/src/index.js +59 -0
- 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/decisions/decision.service.d.ts +9 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +37 -1
- package/dist/backend/backend/src/services/decisions/decision.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 +5 -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 +11 -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 +83 -13
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +25 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +45 -1
- 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/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 +99 -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 +190 -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 +64 -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 +71 -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 +225 -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 +503 -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 +85 -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 +95 -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 +50 -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 +98 -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 +124 -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 +189 -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 +44 -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 +37 -0
- package/dist/backend/backend/src/services/task-pool/work-item-usage.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 +5 -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/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 +64 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +64 -0
- 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/decisions/decision.service.d.ts +9 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +37 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts +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 +5 -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 +11 -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 +83 -13
- 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 +25 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +45 -1
- 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 +64 -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 +71 -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 +44 -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 +37 -0
- package/dist/cli/backend/src/services/task-pool/work-item-usage.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 +5 -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/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-1ee8a9a2.js → index-15c2faf2.js} +279 -279
- package/frontend/dist/assets/{index-a79c7852.css → index-20a67829.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -49,6 +49,7 @@ Store a memory entry for future recall. Use this to persist important context, d
|
|
|
49
49
|
| `--category` / `-C` | `category` | Yes | See category × scope matrix below |
|
|
50
50
|
| `--scope` / `-s` | `scope` | Yes | Scope: `agent` or `project` |
|
|
51
51
|
| `--project` / `-p` | `projectPath` | No | Project path (required for `project` scope) |
|
|
52
|
+
| `--supersedes` | `supersedes` | No | Decision id(s) this decision replaces, comma-separated (`dec:<id>`). When a decision changes an earlier one, always pass it: the old entry is marked superseded and leaves the standing answers. |
|
|
52
53
|
|
|
53
54
|
### Valid `category` × `scope` matrix
|
|
54
55
|
|
|
@@ -31,6 +31,8 @@ Options:
|
|
|
31
31
|
'workflow' is NOT a public category — use 'pattern' instead.
|
|
32
32
|
--scope | -s Scope: project or agent (required)
|
|
33
33
|
--project | -p Project path (required for project scope)
|
|
34
|
+
--supersedes Decision id(s) this decision replaces, comma-separated
|
|
35
|
+
(e.g. "dec:03ce4dda"); they leave standing answers (#884)
|
|
34
36
|
--json | -j Raw JSON payload
|
|
35
37
|
--help | -h Show this help
|
|
36
38
|
EOF_USAGE
|
|
@@ -42,6 +44,7 @@ CONTENT=""
|
|
|
42
44
|
CATEGORY=""
|
|
43
45
|
SCOPE=""
|
|
44
46
|
PROJECT_PATH=""
|
|
47
|
+
SUPERSEDES=""
|
|
45
48
|
|
|
46
49
|
# Detect legacy JSON argument
|
|
47
50
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
@@ -75,6 +78,10 @@ while [[ $# -gt 0 ]]; do
|
|
|
75
78
|
PROJECT_PATH="$2"
|
|
76
79
|
shift 2
|
|
77
80
|
;;
|
|
81
|
+
--supersedes)
|
|
82
|
+
SUPERSEDES="$2"
|
|
83
|
+
shift 2
|
|
84
|
+
;;
|
|
78
85
|
--json|-j)
|
|
79
86
|
INPUT_JSON="$2"
|
|
80
87
|
shift 2
|
|
@@ -116,6 +123,7 @@ if [ -n "$INPUT_JSON" ]; then
|
|
|
116
123
|
[ -z "$CATEGORY" ] && CATEGORY=$(printf '%s' "$INPUT" | jq -r '.category // empty')
|
|
117
124
|
[ -z "$SCOPE" ] && SCOPE=$(printf '%s' "$INPUT" | jq -r '.scope // empty')
|
|
118
125
|
[ -z "$PROJECT_PATH" ] && PROJECT_PATH=$(printf '%s' "$INPUT" | jq -r '.projectPath // empty')
|
|
126
|
+
[ -z "$SUPERSEDES" ] && SUPERSEDES=$(printf '%s' "$INPUT" | jq -r '(.supersedes // .metadata.supersedes // empty) | if type == "array" then join(",") else . end')
|
|
119
127
|
fi
|
|
120
128
|
|
|
121
129
|
require_param "agentId (--agent)" "$AGENT_ID"
|
|
@@ -143,4 +151,8 @@ else
|
|
|
143
151
|
fi
|
|
144
152
|
unset _MEM_AGENT _MEM_CONTENT _MEM_CATEGORY _MEM_SCOPE
|
|
145
153
|
|
|
154
|
+
if [ -n "$SUPERSEDES" ]; then
|
|
155
|
+
BODY=$(printf '%s' "$BODY" | jq --arg s "$SUPERSEDES" '. + {metadata: {supersedes: ($s | split(",") | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0)))}}')
|
|
156
|
+
fi
|
|
157
|
+
|
|
146
158
|
api_call POST "/memory/remember" "$BODY"
|
|
@@ -57,7 +57,7 @@ Pass the `workItemId` of the work you are reporting on (from your `[CREWLY-DISPA
|
|
|
57
57
|
| `--task-id` | `taskId` | No | Task ID (for structured StatusReport format) |
|
|
58
58
|
| `--progress` | `progress` | No | Progress percentage 0-100 |
|
|
59
59
|
| `--structured` | `structured` | No | Use structured StatusReport format |
|
|
60
|
-
| `--work-item-id` / `--wi-id` | `workItemId` | **Pass this when `status
|
|
60
|
+
| `--work-item-id` / `--wi-id` | `workItemId` | **Pass this when `status` is `done`, `blocked` or `failed`** | Which WorkItem to complete, block or fail. See below — without it the skill infers, and refuses when the choice is ambiguous |
|
|
61
61
|
|
|
62
62
|
## This skill COMPLETES a WorkItem, not just reports
|
|
63
63
|
|
|
@@ -84,6 +84,12 @@ had never happened.
|
|
|
84
84
|
If the completion itself fails, the skill says so explicitly — a reported
|
|
85
85
|
status never implies the WorkItem actually closed.
|
|
86
86
|
|
|
87
|
+
**`blocked` and `failed` move the WorkItem too**, with the same resolution
|
|
88
|
+
order: the item is marked `blocked` (claim released, it waits until someone
|
|
89
|
+
unblocks it) or `failed`, your summary is stored on it as the reason, and its
|
|
90
|
+
team lead is told. Pass `workItemId` here as well; with several items running
|
|
91
|
+
the skill refuses instead of guessing.
|
|
92
|
+
|
|
87
93
|
## Examples — CLI Flags (preferred)
|
|
88
94
|
|
|
89
95
|
```bash
|
|
@@ -311,6 +311,47 @@ if [ "$STATUS" = "done" ]; then
|
|
|
311
311
|
fi
|
|
312
312
|
fi
|
|
313
313
|
|
|
314
|
+
# A blocked or failed report moves the WorkItem too (#842). It used to reach
|
|
315
|
+
# only the orchestrator's chat: the WorkItem stayed `running` with its claim
|
|
316
|
+
# held, the team lead got no task:blocked / task:failed event, and the reason
|
|
317
|
+
# lived only in a chat message. Same resolution rules as `done` above:
|
|
318
|
+
# explicit workItemId, else the single running item, else refuse.
|
|
319
|
+
if [ "$STATUS" = "blocked" ] || [ "$STATUS" = "failed" ]; then
|
|
320
|
+
STOP_WI_ID="${WORK_ITEM_ID:-}"
|
|
321
|
+
STOP_RESOLUTION="explicit"
|
|
322
|
+
|
|
323
|
+
if [ -z "$STOP_WI_ID" ]; then
|
|
324
|
+
POOL_RESP=$(api_call_full GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
|
|
325
|
+
RUNNING_IDS=$(printf '%s' "$POOL_RESP" | jq -r '((.workItems // .data // []) | map(.id)) | .[]' 2>/dev/null || true)
|
|
326
|
+
RUNNING_COUNT=$(printf '%s' "$RUNNING_IDS" | grep -c . || true)
|
|
327
|
+
|
|
328
|
+
if [ "$RUNNING_COUNT" -gt 1 ]; then
|
|
329
|
+
CANDIDATES=$(printf '%s' "$RUNNING_IDS" | tr '\n' ' ')
|
|
330
|
+
error_exit "Status reported, but report-status will not guess which WorkItem is ${STATUS}: ${RUNNING_COUNT} are running for ${SESSION_NAME} (${CANDIDATES}). Run it again with workItemId so the right item is marked ${STATUS} and its team lead is told."
|
|
331
|
+
fi
|
|
332
|
+
|
|
333
|
+
STOP_WI_ID=$(printf '%s' "$RUNNING_IDS" | head -1)
|
|
334
|
+
STOP_RESOLUTION="inferred"
|
|
335
|
+
fi
|
|
336
|
+
|
|
337
|
+
if [ -n "$STOP_WI_ID" ]; then
|
|
338
|
+
if [ "$STATUS" = "blocked" ]; then
|
|
339
|
+
STOP_BODY=$(jq -n --arg agentId "$SESSION_NAME" --arg reason "$SUMMARY" '{agentId: $agentId, reason: $reason}')
|
|
340
|
+
STOP_PATH="/task-pool/block/${STOP_WI_ID}"
|
|
341
|
+
else
|
|
342
|
+
STOP_BODY=$(jq -n --arg agentId "$SESSION_NAME" --arg error "$SUMMARY" '{agentId: $agentId, error: $error}')
|
|
343
|
+
STOP_PATH="/task-pool/fail/${STOP_WI_ID}"
|
|
344
|
+
fi
|
|
345
|
+
if STOP_RESULT=$(api_call POST "$STOP_PATH" "$STOP_BODY" 2>&1); then
|
|
346
|
+
jq -n --arg id "$STOP_WI_ID" --arg how "$STOP_RESOLUTION" --arg status "$STATUS" \
|
|
347
|
+
'{workItem: $id, markedAs: $status, resolvedBy: $how}' >&2
|
|
348
|
+
else
|
|
349
|
+
jq -n --arg id "$STOP_WI_ID" --arg err "$STOP_RESULT" --arg status "$STATUS" \
|
|
350
|
+
'{warning: ("status reported, but marking the WorkItem " + $status + " FAILED — it is still open"), workItemId: $id, error: $err}' >&2
|
|
351
|
+
fi
|
|
352
|
+
fi
|
|
353
|
+
fi
|
|
354
|
+
|
|
314
355
|
# record_task_learning <label> <summary>
|
|
315
356
|
#
|
|
316
357
|
# Records the report as a project learning via POST /memory/record-learning.
|
|
@@ -111,6 +111,7 @@ two are told apart. Write ids exactly as Slack shows them.
|
|
|
111
111
|
| `--text` | `-m` | Message text (required unless piped or `--text-file`) |
|
|
112
112
|
| `--text-file` | | Read the text from a file |
|
|
113
113
|
| `--thread` | `-t` | Slack thread timestamp to reply inside, or the `[SLACK-THREAD:<key>]` key from your prompt |
|
|
114
|
+
| `--new-topic` | | A new top-level message. Use it for scheduled output (a briefing, a triage summary): without it, a post into a conversation where you still owe an answer from the last 30 minutes goes into that thread as the answer |
|
|
114
115
|
| `--json` | `-j` | Raw JSON payload |
|
|
115
116
|
|
|
116
117
|
## Environment
|
|
@@ -12,7 +12,7 @@ source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
|
12
12
|
print_usage() {
|
|
13
13
|
cat <<'EOF_USAGE'
|
|
14
14
|
Usage:
|
|
15
|
-
bash execute.sh --target <#channel|@user|C…|D…|U…> --text "message" [--thread <ts>]
|
|
15
|
+
bash execute.sh --target <#channel|@user|C…|D…|U…> --text "message" [--thread <ts> | --new-topic]
|
|
16
16
|
|
|
17
17
|
echo "message" | bash execute.sh --target "#general"
|
|
18
18
|
bash execute.sh --target "@steve" --text-file /tmp/report.md
|
|
@@ -23,6 +23,7 @@ Options:
|
|
|
23
23
|
--text | -m Message text (required unless piped or --text-file)
|
|
24
24
|
--text-file Read the message text from a file
|
|
25
25
|
--thread | -t Slack thread timestamp to reply inside
|
|
26
|
+
--new-topic A new top-level post (scheduled output), never an answer to an open question
|
|
26
27
|
--json | -j Raw JSON payload
|
|
27
28
|
--help | -h Show this help
|
|
28
29
|
EOF_USAGE
|
|
@@ -32,6 +33,7 @@ INPUT_JSON=""
|
|
|
32
33
|
TARGET=""
|
|
33
34
|
TEXT=""
|
|
34
35
|
THREAD_TS=""
|
|
36
|
+
NEW_TOPIC=""
|
|
35
37
|
|
|
36
38
|
# Legacy JSON as the first positional argument
|
|
37
39
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
@@ -45,6 +47,7 @@ while [[ $# -gt 0 ]]; do
|
|
|
45
47
|
--text|-m) TEXT="$2"; shift 2 ;;
|
|
46
48
|
--text-file) TEXT="$(cat "$2")"; shift 2 ;;
|
|
47
49
|
--thread|-t) THREAD_TS="$2"; shift 2 ;;
|
|
50
|
+
--new-topic) NEW_TOPIC="1"; shift ;;
|
|
48
51
|
--json|-j) INPUT_JSON="$2"; shift 2 ;;
|
|
49
52
|
--help|-h) print_usage; exit 0 ;;
|
|
50
53
|
*) echo "Unknown argument: $1" >&2; print_usage >&2; exit 2 ;;
|
|
@@ -65,6 +68,7 @@ except Exception as e:
|
|
|
65
68
|
print("PARSE_ERROR:" + str(e)); sys.exit(0)
|
|
66
69
|
print("TARGET=" + str(d.get("target", "")))
|
|
67
70
|
print("THREAD=" + str(d.get("threadTs", d.get("thread", ""))))
|
|
71
|
+
print("NEW_TOPIC=" + ("1" if d.get("newTopLevel") is True else ""))
|
|
68
72
|
print("TEXT_B64=" + base64.b64encode(str(d.get("text", "")).encode("utf-8")).decode("ascii"))
|
|
69
73
|
')
|
|
70
74
|
if echo "$EXTRACTED" | grep -q '^PARSE_ERROR'; then
|
|
@@ -75,6 +79,7 @@ print("TEXT_B64=" + base64.b64encode(str(d.get("text", "")).encode("utf-8")).dec
|
|
|
75
79
|
case "$line" in
|
|
76
80
|
TARGET=*) [ -z "$TARGET" ] && TARGET="${line#TARGET=}" ;;
|
|
77
81
|
THREAD=*) [ -z "$THREAD_TS" ] && THREAD_TS="${line#THREAD=}" ;;
|
|
82
|
+
NEW_TOPIC=*) [ -z "$NEW_TOPIC" ] && NEW_TOPIC="${line#NEW_TOPIC=}" ;;
|
|
78
83
|
TEXT_B64=*) [ -z "$TEXT" ] && TEXT="$(echo "${line#TEXT_B64=}" | base64 -d 2>/dev/null)" ;;
|
|
79
84
|
esac
|
|
80
85
|
done <<< "$EXTRACTED"
|
|
@@ -96,12 +101,14 @@ fi
|
|
|
96
101
|
# Convert literal \n to real newlines, matching the other comm skills
|
|
97
102
|
_NL=$'\n'; TEXT="${TEXT//\\n/$_NL}"
|
|
98
103
|
|
|
99
|
-
BODY=$(TARGET="$TARGET" TEXT="$TEXT" THREAD_TS="$THREAD_TS" python3 -c '
|
|
104
|
+
BODY=$(TARGET="$TARGET" TEXT="$TEXT" THREAD_TS="$THREAD_TS" NEW_TOPIC="$NEW_TOPIC" python3 -c '
|
|
100
105
|
import json, os
|
|
101
106
|
p = {"target": os.environ["TARGET"], "text": os.environ["TEXT"]}
|
|
102
107
|
ts = os.environ.get("THREAD_TS", "")
|
|
103
108
|
if ts:
|
|
104
109
|
p["threadTs"] = ts
|
|
110
|
+
elif os.environ.get("NEW_TOPIC"):
|
|
111
|
+
p["newTopLevel"] = True
|
|
105
112
|
print(json.dumps(p))
|
|
106
113
|
')
|
|
107
114
|
|
|
@@ -2,3 +2,48 @@
|
|
|
2
2
|
# Team Leader Skills Common Library - delegates to shared library
|
|
3
3
|
SHARED_LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/_common"
|
|
4
4
|
source "${SHARED_LIB_DIR}/lib.sh"
|
|
5
|
+
|
|
6
|
+
# tl_require_member_scope <team-json> <member-id> <tl-member-id>
|
|
7
|
+
#
|
|
8
|
+
# Exits with an error unless the team lead may start or stop the member.
|
|
9
|
+
# Allowed when:
|
|
10
|
+
# 1. the member reports to this lead (parentMemberId == tlMemberId), or
|
|
11
|
+
# 2. the member has no parent at all, and this lead is a leader of the same
|
|
12
|
+
# team (listed in leaderIds/leaderId, or canDelegate on its member record).
|
|
13
|
+
# Refused: members of another team (not in <team-json>), members whose parent
|
|
14
|
+
# is someone else, and any lead that does not lead this team.
|
|
15
|
+
#
|
|
16
|
+
# Rule 2 exists because many teams were created without a hierarchy: every
|
|
17
|
+
# Marketing member had parentMemberId=null, so the lead could not start a
|
|
18
|
+
# single one of its own members and the orchestrator had to (#930).
|
|
19
|
+
tl_require_member_scope() {
|
|
20
|
+
local team_json="$1" member_id="$2" tl_member_id="$3"
|
|
21
|
+
local verdict
|
|
22
|
+
verdict=$(printf '%s' "$team_json" | jq -r --arg mid "$member_id" --arg tl "$tl_member_id" '
|
|
23
|
+
(.data // .) as $team
|
|
24
|
+
| ($team.members // []) as $members
|
|
25
|
+
| ($members | map(select(.id == $mid)) | first) as $member
|
|
26
|
+
| ($members | map(select(.id == $tl)) | first) as $lead
|
|
27
|
+
| (($team.leaderIds // []) + (if $team.leaderId then [$team.leaderId] else [] end)) as $leaders
|
|
28
|
+
| if $member == null then "not_found"
|
|
29
|
+
elif ($member.parentMemberId // "") == $tl then "ok"
|
|
30
|
+
elif ($member.parentMemberId // "") != "" then "other_parent:" + $member.parentMemberId
|
|
31
|
+
elif $lead == null then "not_in_team"
|
|
32
|
+
elif (($leaders | index($tl)) != null) or ($lead.canDelegate == true) then "ok"
|
|
33
|
+
else "not_leader"
|
|
34
|
+
end' 2>/dev/null || echo "unreadable")
|
|
35
|
+
|
|
36
|
+
case "$verdict" in
|
|
37
|
+
ok) return 0 ;;
|
|
38
|
+
not_found)
|
|
39
|
+
error_exit "Member ${member_id} is not in this team. A team lead can only start or stop members of its own team." ;;
|
|
40
|
+
other_parent:*)
|
|
41
|
+
error_exit "Hierarchy violation: member ${member_id} (parentMemberId=${verdict#other_parent:}) reports to someone else, not to TL ${tl_member_id}" ;;
|
|
42
|
+
not_in_team)
|
|
43
|
+
error_exit "TL ${tl_member_id} is not a member of this team, so it cannot manage member ${member_id}" ;;
|
|
44
|
+
not_leader)
|
|
45
|
+
error_exit "Member ${member_id} has no parent, and TL ${tl_member_id} does not lead this team (not in leaderIds, canDelegate not set)" ;;
|
|
46
|
+
*)
|
|
47
|
+
error_exit "Could not read the team data to check whether TL ${tl_member_id} may manage member ${member_id}" ;;
|
|
48
|
+
esac
|
|
49
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Start Agent (TL)
|
|
3
|
-
description: "Start a worker agent within the Team Leader's
|
|
3
|
+
description: "Start a worker agent within the Team Leader's scope: a member whose parentMemberId is the TL, or a parentless member of a team the TL leads."
|
|
4
4
|
version: 1.0.0
|
|
5
5
|
category: management
|
|
6
6
|
skillType: claude-skill
|
|
@@ -50,18 +50,18 @@ bash {{TL_SKILLS_PATH}}/start-agent/execute.sh '{"teamId":"{{TEAM_ID}}","memberI
|
|
|
50
50
|
|
|
51
51
|
## Hierarchy Validation
|
|
52
52
|
|
|
53
|
-
The script fetches team data and
|
|
54
|
-
-
|
|
55
|
-
-
|
|
53
|
+
The script fetches team data and allows the start when:
|
|
54
|
+
- the member's `parentMemberId` is the TL's `memberId` (a subordinate), or
|
|
55
|
+
- the member has no `parentMemberId`, and the TL is a leader of the same team (listed in the team's `leaderIds`, or `canDelegate` on its own member record).
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
It refuses members of other teams, members whose parent is someone else, and parentless members of a team the TL does not lead.
|
|
58
58
|
|
|
59
59
|
## Differences from Orchestrator start-agent
|
|
60
60
|
|
|
61
61
|
| Aspect | Orchestrator | Team Leader |
|
|
62
62
|
|--------|-------------|-------------|
|
|
63
63
|
| Scope | Any agent in any team | Only subordinates |
|
|
64
|
-
| Hierarchy check | None |
|
|
64
|
+
| Hierarchy check | None | Subordinates, or parentless members of the TL's own team |
|
|
65
65
|
| Extra parameter | None | `tlMemberId` required |
|
|
66
66
|
|
|
67
67
|
## Output
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Start a worker agent within this Team Leader's subordinate scope.
|
|
3
|
-
# Validates
|
|
3
|
+
# Validates scope before starting.
|
|
4
4
|
set -euo pipefail
|
|
5
5
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
6
|
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
@@ -23,17 +23,8 @@ if [ "$TEAM_SUCCESS" != "true" ]; then
|
|
|
23
23
|
error_exit "Failed to fetch team data for team ${TEAM_ID}"
|
|
24
24
|
fi
|
|
25
25
|
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
'.data.members[] | select(.id == $mid) | .parentMemberId // empty' 2>/dev/null || true)
|
|
29
|
-
|
|
30
|
-
if [ -z "$WORKER_PARENT" ]; then
|
|
31
|
-
error_exit "Member ${MEMBER_ID} not found in team ${TEAM_ID} or has no parentMemberId set"
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
if [ "$WORKER_PARENT" != "$TL_MEMBER_ID" ]; then
|
|
35
|
-
error_exit "Hierarchy violation: member ${MEMBER_ID} (parentMemberId=${WORKER_PARENT}) is not a subordinate of TL ${TL_MEMBER_ID}"
|
|
36
|
-
fi
|
|
26
|
+
# The member must report to this TL, or be parentless in a team this TL leads (#930)
|
|
27
|
+
tl_require_member_scope "$TEAM_DATA" "$MEMBER_ID" "$TL_MEMBER_ID"
|
|
37
28
|
|
|
38
29
|
# Hierarchy validated — start the agent
|
|
39
30
|
api_call POST "/teams/${TEAM_ID}/members/${MEMBER_ID}/start"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Stop Agent (TL)
|
|
3
|
-
description: "Stop a worker agent within the Team Leader's
|
|
3
|
+
description: "Stop a worker agent within the Team Leader's scope: a member whose parentMemberId is the TL, or a parentless member of a team the TL leads."
|
|
4
4
|
version: 1.0.0
|
|
5
5
|
category: management
|
|
6
6
|
skillType: claude-skill
|
|
@@ -50,18 +50,18 @@ bash {{TL_SKILLS_PATH}}/stop-agent/execute.sh '{"teamId":"{{TEAM_ID}}","memberId
|
|
|
50
50
|
|
|
51
51
|
## Hierarchy Validation
|
|
52
52
|
|
|
53
|
-
The script fetches team data and
|
|
54
|
-
-
|
|
55
|
-
-
|
|
53
|
+
The script fetches team data and allows the stop when:
|
|
54
|
+
- the member's `parentMemberId` is the TL's `memberId` (a subordinate), or
|
|
55
|
+
- the member has no `parentMemberId`, and the TL is a leader of the same team (listed in the team's `leaderIds`, or `canDelegate` on its own member record).
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
It refuses members of other teams, members whose parent is someone else, and parentless members of a team the TL does not lead.
|
|
58
58
|
|
|
59
59
|
## Differences from Orchestrator stop-agent
|
|
60
60
|
|
|
61
61
|
| Aspect | Orchestrator | Team Leader |
|
|
62
62
|
|--------|-------------|-------------|
|
|
63
63
|
| Scope | Any agent in any team | Only subordinates |
|
|
64
|
-
| Hierarchy check | None |
|
|
64
|
+
| Hierarchy check | None | Subordinates, or parentless members of the TL's own team |
|
|
65
65
|
| Extra parameter | None | `tlMemberId` required |
|
|
66
66
|
|
|
67
67
|
## Output
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Stop a worker agent within this Team Leader's subordinate scope.
|
|
3
|
-
# Validates
|
|
3
|
+
# Validates scope before stopping.
|
|
4
4
|
set -euo pipefail
|
|
5
5
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
6
|
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
@@ -23,17 +23,8 @@ if [ "$TEAM_SUCCESS" != "true" ]; then
|
|
|
23
23
|
error_exit "Failed to fetch team data for team ${TEAM_ID}"
|
|
24
24
|
fi
|
|
25
25
|
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
'.data.members[] | select(.id == $mid) | .parentMemberId // empty' 2>/dev/null || true)
|
|
29
|
-
|
|
30
|
-
if [ -z "$WORKER_PARENT" ]; then
|
|
31
|
-
error_exit "Member ${MEMBER_ID} not found in team ${TEAM_ID} or has no parentMemberId set"
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
if [ "$WORKER_PARENT" != "$TL_MEMBER_ID" ]; then
|
|
35
|
-
error_exit "Hierarchy violation: member ${MEMBER_ID} (parentMemberId=${WORKER_PARENT}) is not a subordinate of TL ${TL_MEMBER_ID}"
|
|
36
|
-
fi
|
|
26
|
+
# The member must report to this TL, or be parentless in a team this TL leads (#930)
|
|
27
|
+
tl_require_member_scope "$TEAM_DATA" "$MEMBER_ID" "$TL_MEMBER_ID"
|
|
37
28
|
|
|
38
29
|
# Hierarchy validated — stop the agent
|
|
39
30
|
api_call POST "/teams/${TEAM_ID}/members/${MEMBER_ID}/stop"
|
|
@@ -1205,6 +1205,9 @@ export declare const EVENT_BUS_CONSTANTS: {
|
|
|
1205
1205
|
readonly EVENT_MESSAGE_PREFIX: "EVENT";
|
|
1206
1206
|
/** Threshold for cleaning stale entries from recentPublishMap */
|
|
1207
1207
|
readonly DEDUP_MAP_CLEANUP_THRESHOLD: 100;
|
|
1208
|
+
/** How long a delivered event id is remembered per subscription, so a
|
|
1209
|
+
* replayed publish of the same event is not delivered twice (#926) */
|
|
1210
|
+
readonly DELIVERED_EVENT_TTL_MS: number;
|
|
1208
1211
|
};
|
|
1209
1212
|
/**
|
|
1210
1213
|
* Constants for Slack thread file storage.
|
|
@@ -1378,6 +1381,8 @@ export declare const STANDING_ANSWERS_CONSTANTS: {
|
|
|
1378
1381
|
readonly BRIEF_MAX_ENTRIES: 30;
|
|
1379
1382
|
/** Characters of each entry shown in a refresh brief. */
|
|
1380
1383
|
readonly BRIEF_ENTRY_MAX_CHARS: 240;
|
|
1384
|
+
/** Shared topic words that flag two same-day entries as a possible supersede pair (#884). */
|
|
1385
|
+
readonly SUPERSEDE_MIN_SHARED_WORDS: 2;
|
|
1381
1386
|
/** Refresh tick interval when CREWLY_WIKI_REFLECT_INTERVAL_MS is unset (the reflect default). */
|
|
1382
1387
|
readonly REFRESH_INTERVAL_MS: number;
|
|
1383
1388
|
/** Minimum time between two refresh WorkItems for the same page. */
|
|
@@ -1474,6 +1479,12 @@ export declare const SLACK_TYPING_CONSTANTS: {
|
|
|
1474
1479
|
readonly TIMEOUT_MS: number;
|
|
1475
1480
|
/** A timed-out placeholder is still removed by a reply arriving within this long (ms) */
|
|
1476
1481
|
readonly EXPIRED_KEEP_MS: number;
|
|
1482
|
+
/**
|
|
1483
|
+
* A `slack-post` that names no thread answers an owed placeholder only if
|
|
1484
|
+
* that placeholder went up this recently. Older ones belong to questions
|
|
1485
|
+
* from another turn; a scheduled post was captured into those threads (#808).
|
|
1486
|
+
*/
|
|
1487
|
+
readonly UNTHREADED_ANSWER_MAX_AGE_MS: number;
|
|
1477
1488
|
/** A placeholder younger than this is not taken down when the turn ends (race with delivery) */
|
|
1478
1489
|
readonly SETTLE_MIN_AGE_MS: number;
|
|
1479
1490
|
/**
|
|
@@ -1825,6 +1836,8 @@ export declare const OWNER_MESSAGE_WATCHDOG_CONSTANTS: {
|
|
|
1825
1836
|
readonly NOTE_SILENT_TEXT: "⏳ {name} got your message but hasn't replied in {waited} min; I've sent a reminder.";
|
|
1826
1837
|
/** Shown in a note when a failed delivery left no error detail */
|
|
1827
1838
|
readonly NOTE_UNKNOWN_DETAIL: "reason unknown";
|
|
1839
|
+
/** The agent hit its daily spend cap (specs/2026-10-02-spend-cap.md) */
|
|
1840
|
+
readonly NOTE_SPEND_CAP_TEXT: "⏳ Still waiting on {name} — {name} hit its daily spend cap ({cap}). Your message is kept and delivered when the cap resets at midnight or you raise it (reply `raise cap for {who} to $<amount> today`).";
|
|
1828
1841
|
};
|
|
1829
1842
|
/**
|
|
1830
1843
|
* The single `reply` entry point (specs/2026-09-30-owner-message-guarantee.md §B).
|
|
@@ -5029,6 +5042,16 @@ export declare const SYSTEM_CONTROL_CONSTANTS: {
|
|
|
5029
5042
|
* card, answered with a button, a reaction or a thread reply.
|
|
5030
5043
|
*/
|
|
5031
5044
|
export declare const DECISION_CONSTANTS: {
|
|
5045
|
+
/**
|
|
5046
|
+
* Layout revision of the card blocks. Bump whenever the card layout changes
|
|
5047
|
+
* (buttons added/removed): open cards drawn with an older revision are
|
|
5048
|
+
* redrawn once at startup so they get the new controls (e.g. Skip, 1.20.185).
|
|
5049
|
+
*/
|
|
5050
|
+
readonly CARD_RENDER_REV: 2;
|
|
5051
|
+
/** Delay after startup before stale open cards are redrawn (ms) */
|
|
5052
|
+
readonly STALE_CARD_REFRESH_DELAY_MS: 15000;
|
|
5053
|
+
/** Gap between two card redraws, to stay under Slack's chat.update rate limit (ms) */
|
|
5054
|
+
readonly STALE_CARD_REFRESH_GAP_MS: 1200;
|
|
5032
5055
|
/** Persisted decisions under CREWLY_HOME */
|
|
5033
5056
|
readonly STORE_FILENAME: "owner-decisions.json";
|
|
5034
5057
|
/** Persisted ticket → Slack thread map under CREWLY_HOME */
|
|
@@ -5108,6 +5131,8 @@ export declare const OPEN_ITEMS_CONSTANTS: {
|
|
|
5108
5131
|
readonly DEFAULT_DUE_MS: number;
|
|
5109
5132
|
/** The same words by the same agent this close together are one item (a reply recorded twice) (ms) */
|
|
5110
5133
|
readonly DUPLICATE_WINDOW_MS: number;
|
|
5134
|
+
/** The same agent's two promises this close together, about the same deliverable, are one (the newer stands) (ms) */
|
|
5135
|
+
readonly PROMISE_DUPLICATE_WINDOW_MS: number;
|
|
5111
5136
|
/** Max commitments and max questions taken from one reply */
|
|
5112
5137
|
readonly MAX_ITEMS_PER_REPLY: 3;
|
|
5113
5138
|
/** Max characters stored for an item's text */
|
|
@@ -5126,6 +5151,13 @@ export declare const OPEN_ITEMS_CONSTANTS: {
|
|
|
5126
5151
|
readonly EXPIRE_AFTER_MS: number;
|
|
5127
5152
|
/** Requests looked at by the sweep and the backfill: updated within (ms) */
|
|
5128
5153
|
readonly LOOKBACK_MS: number;
|
|
5154
|
+
/** The backfill only looks at promises and questions made within this long before it runs (ms) */
|
|
5155
|
+
readonly BACKFILL_MAX_AGE_MS: number;
|
|
5156
|
+
/**
|
|
5157
|
+
* A post made up to this long before the child work's recorded finish still delivers it: a verify
|
|
5158
|
+
* pass overwrites `completedAt` after the agent has already posted (ms)
|
|
5159
|
+
*/
|
|
5160
|
+
readonly DELIVERY_FINISH_GRACE_MS: number;
|
|
5129
5161
|
/** Sweep cadence (ms) */
|
|
5130
5162
|
readonly SWEEP_INTERVAL_MS: number;
|
|
5131
5163
|
/** An ask-owner decision this close in time to the reply, by the same agent, is the same question (ms) */
|
|
@@ -5155,6 +5187,38 @@ export declare const WORK_ITEM_DESTINATION_CONSTANTS: {
|
|
|
5155
5187
|
/** The one line every prompt carries about where to answer */
|
|
5156
5188
|
readonly PROMPT_LINE: "Answer where you were asked; a new topic goes in a new thread.";
|
|
5157
5189
|
};
|
|
5190
|
+
/**
|
|
5191
|
+
* Per-agent daily spend cap with a hard stop (specs/2026-10-02-spend-cap.md).
|
|
5192
|
+
* Caps are OFF until the owner sets one. All owner-facing text is English.
|
|
5193
|
+
*/
|
|
5194
|
+
export declare const SPEND_CAP_CONSTANTS: {
|
|
5195
|
+
/** Caps + today's bookkeeping, under CREWLY_HOME */
|
|
5196
|
+
readonly STORE_FILE: "spend-caps.json";
|
|
5197
|
+
/** Default / max window of GET /api/system/spend */
|
|
5198
|
+
readonly DEFAULT_DAYS: 7;
|
|
5199
|
+
readonly MAX_DAYS: 31;
|
|
5200
|
+
/** Fraction of a cap that sends the one heads-up */
|
|
5201
|
+
readonly WARN_FRACTION: 0.8;
|
|
5202
|
+
/** Enforcement tick */
|
|
5203
|
+
readonly TICK_MS: 60000;
|
|
5204
|
+
/** How long the all-agents total is cached for the delivery gate */
|
|
5205
|
+
readonly TOTAL_CACHE_MS: 15000;
|
|
5206
|
+
/** How often the orc's held message queue re-checks the cap */
|
|
5207
|
+
readonly QUEUE_RECHECK_MS: 60000;
|
|
5208
|
+
/** "Raise to $Y today" offers the cap times this, rounded up to whole dollars */
|
|
5209
|
+
readonly RAISE_FACTOR: 2;
|
|
5210
|
+
/** Target key of the all-agents total cap */
|
|
5211
|
+
readonly TOTAL_TARGET: "*";
|
|
5212
|
+
/** Error code of a refused wake */
|
|
5213
|
+
readonly ERROR_CODE: "SPEND_CAP_REACHED";
|
|
5214
|
+
/** Queued-delivery marker in sendMessageToAgent results */
|
|
5215
|
+
readonly QUEUED_MARKER: "[SPEND_CAP]";
|
|
5216
|
+
/** Decision kind of the "cap reached" card */
|
|
5217
|
+
readonly DECISION_KIND: "spend_cap";
|
|
5218
|
+
readonly OPTIONS: {
|
|
5219
|
+
readonly KEEP: "Keep stopped";
|
|
5220
|
+
};
|
|
5221
|
+
};
|
|
5158
5222
|
/**
|
|
5159
5223
|
* Runtime fallback: switch an agent to another runtime when its runtime runs
|
|
5160
5224
|
* out of usage, and back when the limit resets.
|