crewly 1.20.194 → 1.20.196
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 +68 -0
- package/config/hooks/agent-status/report.sh +31 -12
- package/config/hooks/subagent-guard/subagent.sh +25 -1
- package/config/roles/auditor/prompt.md +2 -2
- package/config/roles/orchestrator/fragments/communication.md +1 -1
- package/config/roles/orchestrator/fragments/lifecycle.md +1 -1
- package/config/roles/orchestrator/prompt.md +18 -508
- package/config/skills/_common/lib.sh +28 -5
- package/config/skills/_common/lib.test.sh +32 -1
- package/config/skills/agent/computer-use/SKILL.md +6 -0
- package/config/skills/agent/core/create-intent-tasks/execute.sh +2 -0
- package/config/skills/agent/core/decompose-intent/execute.sh +2 -0
- package/config/skills/agent/core/experiment-card/SKILL.md +38 -5
- package/config/skills/agent/core/experiment-card/execute.sh +40 -4
- package/config/skills/agent/core/experiment-card/execute.test.sh +17 -0
- package/config/skills/agent/core/project-tickets/SKILL.md +35 -2
- package/config/skills/agent/core/project-tickets/execute.sh +59 -6
- package/config/skills/agent/core/project-tickets/execute.test.sh +24 -0
- package/config/skills/agent/core/send-message/execute.sh +16 -0
- package/config/skills/agent/core/send-message/execute.test.sh +10 -0
- package/config/skills/agent/core/trace-read/SKILL.md +117 -0
- package/config/skills/agent/core/trace-read/execute.sh +116 -0
- package/config/skills/agent/core/update-intent-task/execute.sh +2 -0
- package/config/skills/agent/desktop-app-control/execute.sh +5 -2
- package/config/skills/agent/marketing/submit-for-approval/execute.sh +3 -2
- package/config/skills/orchestrator/decompose-mission/execute.sh +2 -0
- package/config/skills/orchestrator/decompose-okr/execute.sh +1 -0
- package/config/skills/orchestrator/design-team/execute.sh +2 -0
- package/config/skills/orchestrator/measure-kr/execute.sh +2 -0
- package/config/skills/orchestrator/review-mission/execute.sh +2 -0
- package/config/skills/orchestrator/send-message/execute.sh +27 -2
- package/config/skills/orchestrator/send-message/execute.test.sh +89 -0
- package/config/skills/registry.json +6 -5
- package/config/skills/team-leader/design-checklist/execute.sh +2 -0
- package/config/skills/team-leader/signal-digest/SKILL.md +110 -0
- package/config/skills/team-leader/signal-digest/execute.sh +173 -0
- package/config/skills/team-leader/signal-digest/execute.test.sh +123 -0
- package/config/skills/team-leader/signal-digest/signal-digest.config.example.json +23 -0
- package/config/skills/team-leader/signal-digest/signal_digest.py +572 -0
- package/config/skills/team-leader/signal-digest/signal_digest.test.py +319 -0
- package/dist/backend/backend/src/constants.d.ts +356 -5
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +341 -8
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +9 -3
- 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 +38 -5
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +4 -9
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +6 -14
- package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts +64 -0
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.js +164 -0
- package/dist/backend/backend/src/controllers/auth/owner-session.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +18 -5
- package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js +8 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +16 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +3 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +3 -5
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -2
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.js +17 -2
- package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +2 -3
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -1
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +4 -2
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +31 -20
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/desktop/desktop.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/desktop/desktop.controller.js +16 -0
- package/dist/backend/backend/src/controllers/desktop/desktop.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.js +9 -5
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js +16 -3
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.controller.js +3 -5
- package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +1 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +8 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.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 +5 -2
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +3 -5
- package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/people/people.routes.js +3 -5
- package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +35 -2
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +138 -4
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +2 -0
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +7 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.js +2 -4
- package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.js +5 -1
- package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/settings/settings.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/settings/settings.controller.js +18 -2
- package/dist/backend/backend/src/controllers/settings/settings.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts +26 -0
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js +100 -0
- package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +9 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +11 -0
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts +6 -4
- package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system-control.controller.js +20 -13
- package/dist/backend/backend/src/controllers/system/system-control.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +14 -7
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +5 -7
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts +73 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.js +437 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +3 -3
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +4 -2
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +10 -2
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +34 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +342 -61
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts +31 -0
- package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/agent-origin-correction.js +31 -0
- package/dist/backend/backend/src/middleware/agent-origin-correction.js.map +1 -0
- package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts +6 -0
- package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts.map +1 -1
- package/dist/backend/backend/src/middleware/agent-origin.middleware.js +4 -1
- package/dist/backend/backend/src/middleware/agent-origin.middleware.js.map +1 -1
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +20 -17
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -1
- package/dist/backend/backend/src/middleware/api-token.middleware.js +27 -37
- package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -1
- package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts +213 -0
- package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/caller-identity.middleware.js +481 -0
- package/dist/backend/backend/src/middleware/caller-identity.middleware.js.map +1 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts +67 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.js +108 -0
- package/dist/backend/backend/src/middleware/caller-identity.testing.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +11 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- 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 +17 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +19 -10
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts +5 -2
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.js +5 -2
- package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
- 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 +22 -6
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +6 -0
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.js +7 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +175 -2
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +444 -35
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
- 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 +34 -4
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +7 -4
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.d.ts +0 -1
- package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.js +0 -1
- package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.d.ts +28 -0
- package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.js +46 -0
- package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/dashboard-build.d.ts +49 -0
- package/dist/backend/backend/src/services/core/dashboard-build.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/dashboard-build.js +68 -0
- package/dist/backend/backend/src/services/core/dashboard-build.js.map +1 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.d.ts +127 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.js +205 -0
- package/dist/backend/backend/src/services/core/owner-auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/peer-process.service.d.ts +168 -0
- package/dist/backend/backend/src/services/core/peer-process.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/peer-process.service.js +352 -0
- package/dist/backend/backend/src/services/core/peer-process.service.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-store.js +5 -1
- package/dist/backend/backend/src/services/decisions/decision-store.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +10 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +20 -9
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts +1 -1
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js +2 -2
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +149 -4
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.service.js +549 -24
- package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts +20 -5
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js +46 -9
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts +7 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js +21 -1
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js.map +1 -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 +7 -0
- 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 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +0 -18
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
- 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 +41 -5
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +391 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +35 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +138 -2
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
- package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts +82 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js +141 -0
- package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts +51 -1
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +118 -2
- package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +7 -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 +4 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts +103 -0
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js +86 -0
- package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +57 -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 +100 -4
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +10 -2
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +16 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +13 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +44 -3
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js +2 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +3 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts +156 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js +308 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts +212 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +515 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts +186 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js +341 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +309 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +726 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +15 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +61 -3
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/interrupted-turns.js +106 -9
- package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -1
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +22 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/restart-drain.service.js +37 -5
- package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -1
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts +62 -0
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js +126 -0
- package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js.map +1 -0
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts +17 -2
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -1
- package/dist/backend/backend/src/services/restart/turn-probe.js +29 -4
- package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.js +8 -5
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts +75 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js +187 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-card.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts +86 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js +307 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-contract.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts +85 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js +185 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest-store.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts +272 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js +570 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.service.js.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts +51 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js +116 -0
- package/dist/backend/backend/src/services/signal-digest/signal-digest.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts +5 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js +6 -2
- package/dist/backend/backend/src/services/slack/notify-reconciliation.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.js +66 -3
- package/dist/backend/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +2 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +3 -2
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
- 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 +200 -41
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +43 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +76 -7
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/system/auto-update.service.d.ts +2 -2
- package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.js +4 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
- 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 +2 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts +99 -0
- package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-analysis.service.js +148 -0
- package/dist/backend/backend/src/services/trace/trace-analysis.service.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +212 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.js +489 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts +46 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.js +176 -0
- package/dist/backend/backend/src/services/trace/trace-http.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-markers.d.ts +93 -0
- package/dist/backend/backend/src/services/trace/trace-markers.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-markers.js +162 -0
- package/dist/backend/backend/src/services/trace/trace-markers.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.d.ts +262 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.js +810 -0
- package/dist/backend/backend/src/services/trace/trace-metrics.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.d.ts +338 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.js +789 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-store.d.ts +308 -0
- package/dist/backend/backend/src/services/trace/trace-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-store.js +714 -0
- package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-summary.d.ts +77 -0
- package/dist/backend/backend/src/services/trace/trace-summary.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-summary.js +239 -0
- package/dist/backend/backend/src/services/trace/trace-summary.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.d.ts +74 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.js +162 -0
- package/dist/backend/backend/src/services/trace/trace-timeline.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace.types.d.ts +137 -0
- package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/trace.types.js +104 -0
- package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts +80 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js +184 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js.map +1 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +7 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +16 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +16 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +4 -0
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +2 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +8 -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 +46 -4
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +4 -3
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +3 -2
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
- 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.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -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 +3 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js +2 -1
- package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +3 -0
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +7 -0
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +3 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/experiment.types.d.ts +65 -6
- package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/experiment.types.js.map +1 -1
- package/dist/backend/backend/src/types/signal-digest.types.d.ts +185 -0
- package/dist/backend/backend/src/types/signal-digest.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/signal-digest.types.js +21 -0
- package/dist/backend/backend/src/types/signal-digest.types.js.map +1 -0
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +9 -0
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/ticket-autopilot.types.js +14 -0
- package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +4 -0
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts +4 -0
- package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +5 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +2 -0
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +44 -37
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/agent-caller.utils.js +48 -42
- package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
- package/dist/backend/backend/src/utils/secret-env.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/secret-env.js +8 -1
- package/dist/backend/backend/src/utils/secret-env.js.map +1 -1
- package/dist/backend/backend/src/utils/security.d.ts +2 -0
- package/dist/backend/backend/src/utils/security.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/security.js +3 -1
- package/dist/backend/backend/src/utils/security.js.map +1 -1
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts +9 -0
- package/dist/backend/backend/src/websocket/chat.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/chat.gateway.js +26 -0
- package/dist/backend/backend/src/websocket/chat.gateway.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +67 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +67 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +356 -5
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +341 -8
- 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 +17 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +19 -10
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +4 -2
- 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 +22 -6
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +2 -2
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +6 -0
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.js +7 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat/chat.service.d.ts +282 -0
- package/dist/cli/backend/src/services/chat/chat.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat/chat.service.js +783 -0
- package/dist/cli/backend/src/services/chat/chat.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
- 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 +34 -4
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +4 -3
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +7 -4
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
- package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/types.d.ts +0 -1
- package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/types.js +0 -1
- package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.d.ts +28 -0
- package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.js +46 -0
- package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/owner-auth.service.d.ts +127 -0
- package/dist/cli/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/owner-auth.service.js +205 -0
- package/dist/cli/backend/src/services/core/owner-auth.service.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-store.js +5 -1
- package/dist/cli/backend/src/services/decisions/decision-store.js.map +1 -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 +7 -0
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +0 -18
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
- 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 +41 -5
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +391 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
- package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +7 -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 +4 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +57 -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 +100 -4
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +44 -3
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +22 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/restart/restart-drain.service.js +37 -5
- package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.js +8 -5
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.js +66 -3
- package/dist/cli/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +2 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +3 -2
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
- 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 +200 -41
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +43 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +76 -7
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.js +4 -0
- package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +2 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +212 -0
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-context.service.js +489 -0
- package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-markers.d.ts +93 -0
- package/dist/cli/backend/src/services/trace/trace-markers.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-markers.js +162 -0
- package/dist/cli/backend/src/services/trace/trace-markers.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.d.ts +338 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.js +789 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-store.d.ts +308 -0
- package/dist/cli/backend/src/services/trace/trace-store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace-store.js +714 -0
- package/dist/cli/backend/src/services/trace/trace-store.js.map +1 -0
- package/dist/cli/backend/src/services/trace/trace.types.d.ts +137 -0
- package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/trace.types.js +104 -0
- package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.js +4 -0
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
- 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.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +3 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +9 -0
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/ticket-autopilot.types.js +14 -0
- package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +4 -0
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.d.ts +4 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +5 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +2 -0
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/backend/src/utils/secret-env.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/secret-env.js +8 -1
- package/dist/cli/backend/src/utils/secret-env.js.map +1 -1
- package/dist/cli/backend/src/utils/security.d.ts +196 -0
- package/dist/cli/backend/src/utils/security.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/security.js +538 -0
- package/dist/cli/backend/src/utils/security.js.map +1 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts +9 -0
- package/dist/cli/backend/src/websocket/chat.gateway.d.ts.map +1 -1
- package/dist/cli/backend/src/websocket/chat.gateway.js +26 -0
- package/dist/cli/backend/src/websocket/chat.gateway.js.map +1 -1
- package/dist/cli/cli/src/commands/service.d.ts +12 -0
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/service.js +36 -2
- package/dist/cli/cli/src/commands/service.js.map +1 -1
- package/dist/cli/cli/src/index.js +4 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/owner-token-fetch.d.ts +41 -0
- package/dist/cli/cli/src/utils/owner-token-fetch.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/owner-token-fetch.js +83 -0
- package/dist/cli/cli/src/utils/owner-token-fetch.js.map +1 -0
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts +13 -3
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/safe-shutdown.js +26 -4
- package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -1
- package/dist/cli/config/constants.d.ts +67 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +67 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-bfa0e2e8.css +42 -0
- package/frontend/dist/assets/{index-800118ca.js → index-edfa8e04.js} +285 -285
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/packages/crewly-agent/src/runtime/api-client.test.ts +42 -0
- package/packages/crewly-agent/src/runtime/api-client.ts +6 -0
- package/dist/backend/backend/src/services/v3/request-notification.service.d.ts +0 -52
- package/dist/backend/backend/src/services/v3/request-notification.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/v3/request-notification.service.js +0 -161
- package/dist/backend/backend/src/services/v3/request-notification.service.js.map +0 -1
- package/frontend/dist/assets/index-5e967795.css +0 -42
|
@@ -224,6 +224,13 @@ api_call() {
|
|
|
224
224
|
local args=(-s -w '\n%{http_code}' -X "$method" -H "Content-Type: application/json")
|
|
225
225
|
# Include agent session identity header for heartbeat tracking
|
|
226
226
|
# Use ${VAR:-} pattern to avoid 'unbound variable' error under set -u (nounset)
|
|
227
|
+
# The agent badge (#999): the credential that makes the backend treat this
|
|
228
|
+
# call as this agent. Injected by the harness at launch; without it the
|
|
229
|
+
# session header alone is accepted for one release only. Never the owner
|
|
230
|
+
# either way.
|
|
231
|
+
if [ -n "${CREWLY_AGENT_BADGE:-}" ]; then
|
|
232
|
+
args+=(-H "X-Agent-Badge: $CREWLY_AGENT_BADGE")
|
|
233
|
+
fi
|
|
227
234
|
if [ -n "${CREWLY_SESSION_NAME:-}" ]; then
|
|
228
235
|
args+=(-H "X-Agent-Session: $CREWLY_SESSION_NAME")
|
|
229
236
|
# This shell's pid: the backend walks its parents to the agent PTY it
|
|
@@ -433,11 +440,27 @@ auto_remember() {
|
|
|
433
440
|
# The background curl is non-blocking (~5ms) and errors are silently ignored.
|
|
434
441
|
# -----------------------------------------------------------------------------
|
|
435
442
|
_skill_heartbeat() {
|
|
436
|
-
|
|
437
|
-
-H "X-Agent-Session: ${CREWLY_SESSION_NAME:-}"
|
|
438
|
-
-H "X-Agent-Pid: $$"
|
|
439
|
-
-H "Content-Type: application/json"
|
|
440
|
-
|
|
443
|
+
local hb_args=(-s -X POST "${CREWLY_API_URL}/api/heartbeat"
|
|
444
|
+
-H "X-Agent-Session: ${CREWLY_SESSION_NAME:-}"
|
|
445
|
+
-H "X-Agent-Pid: $$"
|
|
446
|
+
-H "Content-Type: application/json")
|
|
447
|
+
[ -n "${CREWLY_AGENT_BADGE:-}" ] && hb_args+=(-H "X-Agent-Badge: $CREWLY_AGENT_BADGE")
|
|
448
|
+
curl "${hb_args[@]}" -d '{"source":"skill-start"}' >/dev/null 2>&1 &
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
# -----------------------------------------------------------------------------
|
|
452
|
+
# agent_auth_curl_args
|
|
453
|
+
#
|
|
454
|
+
# For a skill that calls the backend with its own `curl` instead of api_call:
|
|
455
|
+
# prints the identity headers as curl arguments, one per line, so they can be
|
|
456
|
+
# read into an array without word-splitting surprises:
|
|
457
|
+
# mapfile -t AUTH < <(agent_auth_curl_args) # bash 4+
|
|
458
|
+
# while IFS= read -r a; do AUTH+=("$a"); done < <(agent_auth_curl_args) # bash 3.2
|
|
459
|
+
# curl "${AUTH[@]}" ...
|
|
460
|
+
# -----------------------------------------------------------------------------
|
|
461
|
+
agent_auth_curl_args() {
|
|
462
|
+
if [ -n "${CREWLY_AGENT_BADGE:-}" ]; then printf '%s\n' -H "X-Agent-Badge: $CREWLY_AGENT_BADGE"; fi
|
|
463
|
+
if [ -n "${CREWLY_SESSION_NAME:-}" ]; then printf '%s\n' -H "X-Agent-Session: $CREWLY_SESSION_NAME"; fi
|
|
441
464
|
}
|
|
442
465
|
|
|
443
466
|
# Auto-heartbeat on skill entry when running inside a Crewly agent session
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Tests for lib.sh — shared skills library
|
|
4
4
|
# Covers: --file preprocessor, read_json_input, require_param, error_exit,
|
|
5
5
|
# api_call output cap (CREWLY_SKILL_MAX_OUTPUT_BYTES),
|
|
6
|
-
# CREWLY_API_URL default (#777)
|
|
6
|
+
# CREWLY_API_URL default (#777), agent badge header (#999)
|
|
7
7
|
# =============================================================================
|
|
8
8
|
set -euo pipefail
|
|
9
9
|
|
|
@@ -88,6 +88,11 @@ SKILL_EOF
|
|
|
88
88
|
chmod +x "$TEMP_DIR/test_read_json.sh"
|
|
89
89
|
|
|
90
90
|
export LIB_PATH="$SCRIPT_DIR/lib.sh"
|
|
91
|
+
# Sourcing lib.sh with CREWLY_SESSION_NAME set fires a real skill-start
|
|
92
|
+
# heartbeat (curl in the background). Point it at a closed port so a test
|
|
93
|
+
# run never writes to a Crewly backend running on this machine — it used to
|
|
94
|
+
# post heartbeats for the fake sessions here to the live :8787.
|
|
95
|
+
export CREWLY_API_URL="http://127.0.0.1:9"
|
|
91
96
|
|
|
92
97
|
echo "=== lib.sh Test Suite ==="
|
|
93
98
|
echo ""
|
|
@@ -315,6 +320,32 @@ assert_eq "lib.sh: default API URL without WEB_PORT is 8787" "http://localhost:8
|
|
|
315
320
|
RESULT=$(CREWLY_API_URL=http://localhost:9001 WEB_PORT=8797 bash -c 'source "$1"; echo "$CREWLY_API_URL"' _ "$SCRIPT_DIR/lib.sh")
|
|
316
321
|
assert_eq "lib.sh: CREWLY_API_URL set by the backend wins" "http://localhost:9001" "$RESULT"
|
|
317
322
|
|
|
323
|
+
# ---- Test 28: api_call sends the agent badge (#999) ----
|
|
324
|
+
mkdir -p "$TEMP_DIR/skills/fake-badge"
|
|
325
|
+
cat > "$TEMP_DIR/skills/fake-badge/execute.sh" << 'SKILL_EOF'
|
|
326
|
+
#!/bin/bash
|
|
327
|
+
set -euo pipefail
|
|
328
|
+
source "$LIB_PATH"
|
|
329
|
+
# Record every argument curl got, one per line, then answer 200.
|
|
330
|
+
curl() {
|
|
331
|
+
printf '%s\n' "$@" > "$ARGS_OUT"
|
|
332
|
+
printf '%s\n%s' '{"ok":true}' 200
|
|
333
|
+
}
|
|
334
|
+
api_call POST "/decisions" '{}'
|
|
335
|
+
SKILL_EOF
|
|
336
|
+
chmod +x "$TEMP_DIR/skills/fake-badge/execute.sh"
|
|
337
|
+
export ARGS_OUT="$TEMP_DIR/curl-args.txt"
|
|
338
|
+
CREWLY_SESSION_NAME=dev-1 CREWLY_AGENT_BADGE=cab1.ZGV2LTE.sig bash "$TEMP_DIR/skills/fake-badge/execute.sh" >/dev/null 2>&1
|
|
339
|
+
assert_contains "api_call: sends X-Agent-Badge when the harness set CREWLY_AGENT_BADGE" "X-Agent-Badge: cab1.ZGV2LTE.sig" "$(cat "$ARGS_OUT")"
|
|
340
|
+
assert_contains "api_call: still sends X-Agent-Session" "X-Agent-Session: dev-1" "$(cat "$ARGS_OUT")"
|
|
341
|
+
env -u CREWLY_AGENT_BADGE CREWLY_SESSION_NAME=dev-1 bash "$TEMP_DIR/skills/fake-badge/execute.sh" >/dev/null 2>&1
|
|
342
|
+
assert_eq "api_call: no badge header when there is no badge" "0" "$(grep -c 'X-Agent-Badge' "$ARGS_OUT" || true)"
|
|
343
|
+
|
|
344
|
+
# ---- Test 29: agent_auth_curl_args for skills that run their own curl ----
|
|
345
|
+
RESULT=$(CREWLY_SESSION_NAME=dev-1 CREWLY_AGENT_BADGE=b1 bash -c 'source "$1"; agent_auth_curl_args' _ "$SCRIPT_DIR/lib.sh" 2>/dev/null)
|
|
346
|
+
assert_eq "agent_auth_curl_args: badge and session as curl args" "$(printf '%s\n' -H 'X-Agent-Badge: b1' -H 'X-Agent-Session: dev-1')" "$RESULT"
|
|
347
|
+
unset ARGS_OUT
|
|
348
|
+
|
|
318
349
|
echo ""
|
|
319
350
|
echo "=== Results: $PASS/$TOTAL passed, $FAIL failed ==="
|
|
320
351
|
|
|
@@ -182,6 +182,12 @@ bash execute.sh '{"action":"find","mode":"color","target":"0,120,215"}'
|
|
|
182
182
|
```
|
|
183
183
|
Returns screen coordinates of found elements. Use with click to interact.
|
|
184
184
|
|
|
185
|
+
### click-text -- Find on-screen text and click it in one step
|
|
186
|
+
```bash
|
|
187
|
+
bash execute.sh '{"action":"click-text","target":"Export"}'
|
|
188
|
+
```
|
|
189
|
+
Runs `find` in `text` mode and clicks the match; returns `success:false` with `"Text not found"` when nothing matches.
|
|
190
|
+
|
|
185
191
|
**Modes:**
|
|
186
192
|
- **button** -- Finds bright/white rectangular regions (buttons, panels, input fields) by scanning for horizontal runs of light pixels (r,g,b > 200) wider than 100px, then clustering vertically adjacent runs into distinct elements.
|
|
187
193
|
- **avatar** -- Finds colored circles in the center half of the screen (account avatars, profile icons) by detecting saturated pixels, then clusters them and offsets coordinates rightward to target adjacent text/labels.
|
|
@@ -73,6 +73,8 @@ API_URL="${CREWLY_API_URL:-http://localhost:${CREWLY_PORT}}"
|
|
|
73
73
|
RESPONSE=$(curl -s -w "\n%{http_code}" \
|
|
74
74
|
-X POST \
|
|
75
75
|
-H "Content-Type: application/json" \
|
|
76
|
+
-H "X-Agent-Badge: ${CREWLY_AGENT_BADGE:-}" \
|
|
77
|
+
-H "X-Agent-Session: ${CREWLY_SESSION_NAME:-}" \
|
|
76
78
|
-d "$BODY" \
|
|
77
79
|
"${API_URL}/api/intent-tasks/batch" 2>&1) || {
|
|
78
80
|
echo "{\"success\":false,\"error\":\"Failed to connect to backend at ${API_URL}\"}"
|
|
@@ -88,6 +88,8 @@ API_URL="${CREWLY_API_URL:-http://localhost:${CREWLY_PORT}}"
|
|
|
88
88
|
RESPONSE=$(curl -s -w "\n%{http_code}" \
|
|
89
89
|
-X POST \
|
|
90
90
|
-H "Content-Type: application/json" \
|
|
91
|
+
-H "X-Agent-Badge: ${CREWLY_AGENT_BADGE:-}" \
|
|
92
|
+
-H "X-Agent-Session: ${CREWLY_SESSION_NAME:-}" \
|
|
91
93
|
-d "$BODY" \
|
|
92
94
|
"${API_URL}/api/intent-tasks/decompose" 2>&1) || {
|
|
93
95
|
echo "{\"success\":false,\"error\":\"Failed to connect to backend at ${API_URL}\"}"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Experiment Card
|
|
3
3
|
description: Attach an experiment to an optimisation ticket — hypothesis ("change X → metric Y from a to b"), a Search Console or GA4 metric (via seo-ops), an observation window (default 14 days). Crewly captures the baseline when the change ships, measures it when the window ends, labels it worked / didn't / inconclusive, resolves your prediction, writes the wiki experiment log and tells the owner.
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
category: analysis
|
|
6
6
|
skillType: claude-skill
|
|
7
7
|
assignableRoles:
|
|
@@ -41,7 +41,10 @@ Crewly does the rest:
|
|
|
41
41
|
|
|
42
42
|
1. **Ship** — when the linked ticket reaches `done` (or you run `ship`), the
|
|
43
43
|
windows are fixed and the **baseline** is fetched right away: the
|
|
44
|
-
`windowDays` days that had settled before the ship day.
|
|
44
|
+
`windowDays` days that had settled before the ship day. The ship time is
|
|
45
|
+
the ticket's move to `done` in its log. If you link a ticket that is
|
|
46
|
+
already done and its log has no done time, `create` asks for
|
|
47
|
+
`--shipped-at` (when the change went live).
|
|
45
48
|
2. **Wait** — the observation window is the `windowDays` days after the ship
|
|
46
49
|
day. Nothing to do; don't re-check it by hand.
|
|
47
50
|
3. **Measure** — once those days have settled (Search Console +3 days, GA4
|
|
@@ -76,12 +79,42 @@ bash execute.sh create --hypothesis "3-field inquiry form → submissions from 8
|
|
|
76
79
|
- gsc measures: `clicks`, `impressions`, `ctr`, `position` (lower is better;
|
|
77
80
|
direction defaults to `decrease`). Filters: `--page URL`, `--query Q`,
|
|
78
81
|
`--page-match` / `--query-match exact|contains`.
|
|
79
|
-
- ga4 measures: `sessions` (Organic Search unless `--channel all`)
|
|
80
|
-
`events` (`--event NAME`)
|
|
82
|
+
- ga4 measures: `sessions` (Organic Search unless `--channel all`),
|
|
83
|
+
`events` (`--event NAME`) and `conversions` (GA4 key events; `--event NAME`
|
|
84
|
+
for one of them). Filter: `--page /landing-path` (a full URL is reduced to
|
|
85
|
+
its path; the query string is dropped).
|
|
81
86
|
- `--window-days` 7–90, whole weeks preferred (default 14).
|
|
82
87
|
- One experiment per change: two changes on the same page in one window
|
|
83
88
|
can't be told apart.
|
|
84
89
|
|
|
90
|
+
## Measure a ticket-autopilot period (owner / orchestrator / team lead)
|
|
91
|
+
|
|
92
|
+
When the owner lets a project's ticket autopilot drive a feature, one card
|
|
93
|
+
measures both the business number and how autonomous the run was:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
bash execute.sh create --autopilot --project <project id> --label feed \
|
|
97
|
+
--hypothesis "Autopilot drives /feed for 4 weeks → feed card clicks up" \
|
|
98
|
+
--source ga4 --measure events --event feed_card_click --channel all \
|
|
99
|
+
--config /abs/path/ce.seo-ops.json --metric-label "Feed card clicks" \
|
|
100
|
+
--metric "ga4:sessions:page=/feed,pageMatch=contains,channel=all" \
|
|
101
|
+
--window-days 28 [--started-at ISO]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- **Start** is now (or `--started-at`); the baseline is the equal window
|
|
105
|
+
before it. The card is `running` right away.
|
|
106
|
+
- `--label` (with `--autopilot`): only tickets carrying that label count in
|
|
107
|
+
the process numbers. Use `--metric-label` to name the metric.
|
|
108
|
+
- `--metric "source:measure:key=value,…"` (repeatable): more outcome
|
|
109
|
+
metrics, each with its own baseline, result and verdict. Keys: `page`,
|
|
110
|
+
`pageMatch`, `query`, `queryMatch`, `event`, `channel`, `label`, `config`
|
|
111
|
+
(default: `--config`). The primary metric gives the verdict.
|
|
112
|
+
- **Process**: tickets shipped, owner touches per ticket, stall time and $
|
|
113
|
+
per shipped ticket, from the autopilot stats of the same windows.
|
|
114
|
+
- The owner gets one short note a week while it runs, and the full result
|
|
115
|
+
(outcome verdicts + process) at the end. Everything is in the timeline.
|
|
116
|
+
- While it runs, the team lead's daily autopilot retro is on by default.
|
|
117
|
+
|
|
85
118
|
## Follow it
|
|
86
119
|
|
|
87
120
|
```bash
|
|
@@ -93,4 +126,4 @@ bash execute.sh cancel --id EXP-3 --reason "change reverted"
|
|
|
93
126
|
```
|
|
94
127
|
|
|
95
128
|
If a fetch keeps failing (credentials, property access) the owner is told
|
|
96
|
-
once with the error; it
|
|
129
|
+
once with the error; after 6 failures in a row it retries once a day.
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
# [--page P] [--page-match exact|contains] [--query Q] [--query-match exact|contains]
|
|
11
11
|
# [--event NAME] [--channel all] [--label "…"] [--title "…"]
|
|
12
12
|
# [--from A] [--to B] [--direction increase|decrease] [--window-days 14]
|
|
13
|
-
# [--confidence 0.6] [--project P --ticket ID | --tkt TKT-12]
|
|
13
|
+
# [--confidence 0.6] [--project P --ticket ID | --tkt TKT-12] [--shipped-at ISO]
|
|
14
|
+
# bash execute.sh create --autopilot --project P [--label feed] [--started-at ISO] --hypothesis "…"
|
|
15
|
+
# --source … --measure … --config … [--metric "ga4:sessions:page=/feed,pageMatch=contains"] …
|
|
14
16
|
# bash execute.sh ship --id EXP-3 [--shipped-at ISO]
|
|
15
17
|
# bash execute.sh show --id EXP-3
|
|
16
18
|
# bash execute.sh list [--status planned|running|done|cancelled] [--ticket ID]
|
|
@@ -28,8 +30,16 @@ Usage:
|
|
|
28
30
|
bash execute.sh create --hypothesis "change X → metric Y from a to b" --source gsc|ga4 --measure M
|
|
29
31
|
--config /abs/path/seo-ops.config.json [filters] [--from A] [--to B]
|
|
30
32
|
[--window-days 14] [--confidence 0.6] [--project P --ticket ID | --tkt TKT-12]
|
|
33
|
+
[--shipped-at ISO] (required when the ticket is already done but has no recorded done time)
|
|
34
|
+
bash execute.sh create --autopilot --project P [--label feed] [--started-at ISO] --hypothesis "…"
|
|
35
|
+
--source S --measure M --config /abs/seo-ops.config.json [filters]
|
|
36
|
+
[--metric "source:measure:key=value,key=value" …] [--window-days 28]
|
|
37
|
+
Measure a period of ticket-autopilot work on project P: the primary metric
|
|
38
|
+
(and each --metric) before vs after the start, plus the process (tickets
|
|
39
|
+
shipped, owner touches per ticket, stall time, $ per shipped ticket).
|
|
40
|
+
--label: only tickets with this label; --metric-label names the metric
|
|
31
41
|
gsc measures: clicks impressions ctr position (filters: --page URL --query Q, --page-match/--query-match exact|contains)
|
|
32
|
-
ga4 measures: sessions events
|
|
42
|
+
ga4 measures: sessions events conversions (filters: --page /path, --event NAME, --channel all)
|
|
33
43
|
bash execute.sh ship --id EXP-3 [--shipped-at ISO] The change is live (automatic when the ticket is done)
|
|
34
44
|
bash execute.sh show --id EXP-3 Card, baseline, result and timeline
|
|
35
45
|
bash execute.sh list [--status S] [--ticket ID]
|
|
@@ -42,6 +52,7 @@ ACTION=""; ID=""; JSON_BODY=""
|
|
|
42
52
|
HYPOTHESIS=""; TITLE=""; SOURCE=""; MEASURE=""; CONFIG=""; PAGE=""; PAGE_MATCH=""; QUERY=""; QUERY_MATCH=""
|
|
43
53
|
EVENT=""; CHANNEL=""; LABEL=""; FROM=""; TO=""; DIRECTION=""; WINDOW=""; CONFIDENCE=""; PROJECT=""; TICKET=""; TKT=""
|
|
44
54
|
SHIPPED_AT=""; STATUS=""; REASON=""
|
|
55
|
+
AUTOPILOT=""; STARTED_AT=""; METRIC_LABEL=""; EXTRA_METRICS="[]"
|
|
45
56
|
|
|
46
57
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
47
58
|
J=$(read_json_input "$1"); shift
|
|
@@ -51,7 +62,7 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
|
51
62
|
STATUS=$(printf '%s' "$J" | jq -r '.status // empty')
|
|
52
63
|
REASON=$(printf '%s' "$J" | jq -r '.reason // empty')
|
|
53
64
|
TICKET=$(printf '%s' "$J" | jq -r 'if (.ticket|type) == "string" then .ticket else empty end')
|
|
54
|
-
JSON_BODY=$(printf '%s' "$J" | jq -c 'del(.action, .id, .
|
|
65
|
+
JSON_BODY=$(printf '%s' "$J" | jq -c 'del(.action, .id, .status, .reason)')
|
|
55
66
|
fi
|
|
56
67
|
if [[ -z "$ACTION" && $# -gt 0 && ${1:0:1} != '-' ]]; then ACTION="$1"; shift; fi
|
|
57
68
|
|
|
@@ -79,6 +90,16 @@ while [[ $# -gt 0 ]]; do
|
|
|
79
90
|
--ticket) [ $# -ge 2 ] || error_exit "--ticket requires a value"; TICKET="$2"; shift 2 ;;
|
|
80
91
|
--tkt) [ $# -ge 2 ] || error_exit "--tkt requires a value"; TKT="$2"; shift 2 ;;
|
|
81
92
|
--shipped-at) [ $# -ge 2 ] || error_exit "--shipped-at requires a value"; SHIPPED_AT="$2"; shift 2 ;;
|
|
93
|
+
--autopilot) AUTOPILOT=1; shift ;;
|
|
94
|
+
--started-at) [ $# -ge 2 ] || error_exit "--started-at requires a value"; STARTED_AT="$2"; shift 2 ;;
|
|
95
|
+
--metric-label) [ $# -ge 2 ] || error_exit "--metric-label requires a value"; METRIC_LABEL="$2"; shift 2 ;;
|
|
96
|
+
--metric) [ $# -ge 2 ] || error_exit "--metric requires \"source:measure:key=value,…\""
|
|
97
|
+
M=$(jq -cn --arg s "$2" '($s | capture("^(?<source>[^:]+):(?<measure>[^:]+)(:(?<rest>.*))?$")) as $c
|
|
98
|
+
| {source: $c.source, measure: $c.measure}
|
|
99
|
+
+ (($c.rest // "") | split(",") | map(select(length > 0) | capture("^(?<k>[^=]+)=(?<v>.*)$") | {(.k): .v}) | add // {})') \
|
|
100
|
+
|| M=""
|
|
101
|
+
[ -n "$M" ] || error_exit "--metric must look like ga4:sessions:page=/feed,pageMatch=contains"
|
|
102
|
+
EXTRA_METRICS=$(jq -c --argjson m "$M" '. + [$m]' <<<"$EXTRA_METRICS"); shift 2 ;;
|
|
82
103
|
--status) [ $# -ge 2 ] || error_exit "--status requires a value"; STATUS="$2"; shift 2 ;;
|
|
83
104
|
--reason) [ $# -ge 2 ] || error_exit "--reason requires a value"; REASON="$2"; shift 2 ;;
|
|
84
105
|
--help|-h) print_usage; exit 0 ;;
|
|
@@ -87,7 +108,8 @@ while [[ $# -gt 0 ]]; do
|
|
|
87
108
|
done
|
|
88
109
|
|
|
89
110
|
enc() { jq -rn --arg v "$1" '$v|@uri'; }
|
|
90
|
-
CARD='{id, status, title, hypothesis, metric: (.metric | {source, measure, page, query, event, label} | with_entries(select(.value != null))), windowDays, ticket, shippedAt, dueAt, baseline: (.baseline.total // null), result: (.result.total // null), verdict, verdictReason, lastError, traceId}
|
|
111
|
+
CARD='{id, status, title, hypothesis, metric: (.metric | {source, measure, page, query, event, label} | with_entries(select(.value != null))), windowDays, ticket, shippedAt, dueAt, baseline: (.baseline.total // null), result: (.result.total // null), verdict, verdictReason, lastError, traceId}
|
|
112
|
+
+ (if .autopilot then {autopilot: (.autopilot | {projectName, label, outcomes: [.outcomes[]? | {metric: (.metric | {source, measure, page, event}), baseline: (.baseline.total // null), result: (.result.total // null), verdict}], processBaseline, processResult, checkIns})} else {} end)'
|
|
91
113
|
|
|
92
114
|
case "$ACTION" in
|
|
93
115
|
create)
|
|
@@ -99,6 +121,14 @@ case "$ACTION" in
|
|
|
99
121
|
require_param "measure (--measure)" "$MEASURE"
|
|
100
122
|
require_param "config (--config, the seo-ops site config)" "$CONFIG"
|
|
101
123
|
if [ -n "$TICKET" ] && [ -z "$PROJECT" ]; then error_exit "--ticket needs --project (or use --tkt TKT-n for a harness ticket)"; fi
|
|
124
|
+
if [ -n "$AUTOPILOT" ]; then
|
|
125
|
+
require_param "project (--project, the autopilot project)" "$PROJECT"
|
|
126
|
+
[ -z "$TICKET" ] || error_exit "--autopilot measures a period of the project's work; leave out --ticket"
|
|
127
|
+
AP_LABEL="$LABEL"; LABEL="$METRIC_LABEL"; AP_PROJECT="$PROJECT"; PROJECT=""
|
|
128
|
+
else
|
|
129
|
+
[ "$EXTRA_METRICS" = "[]" ] || error_exit "--metric (extra outcome metrics) needs --autopilot"
|
|
130
|
+
[ -z "$METRIC_LABEL" ] || LABEL="$METRIC_LABEL"
|
|
131
|
+
fi
|
|
102
132
|
BODY=$(jq -cn \
|
|
103
133
|
--arg h "$HYPOTHESIS" --arg t "$TITLE" --arg s "$SOURCE" --arg m "$MEASURE" --arg c "$CONFIG" \
|
|
104
134
|
--arg page "$PAGE" --arg pm "$PAGE_MATCH" --arg q "$QUERY" --arg qm "$QUERY_MATCH" --arg ev "$EVENT" \
|
|
@@ -116,6 +146,12 @@ case "$ACTION" in
|
|
|
116
146
|
elif $tic != "" then {ticket: {kind: "project", project: $proj, id: $tic}}
|
|
117
147
|
else {} end)')
|
|
118
148
|
fi
|
|
149
|
+
if [ -n "$AUTOPILOT" ] && [ -n "${AP_PROJECT:-}" ]; then
|
|
150
|
+
BODY=$(printf '%s' "$BODY" | jq -c --arg p "$AP_PROJECT" --arg l "${AP_LABEL:-}" --argjson m "$EXTRA_METRICS" \
|
|
151
|
+
'. + {autopilot: ({project: $p} + (if $l != "" then {label: $l} else {} end))} + (if ($m | length) > 0 then {metrics: $m} else {} end)')
|
|
152
|
+
fi
|
|
153
|
+
if [ -n "$STARTED_AT" ]; then BODY=$(printf '%s' "$BODY" | jq -c --arg at "$STARTED_AT" '. + {startedAt: $at}'); fi
|
|
154
|
+
if [ -n "$SHIPPED_AT" ]; then BODY=$(printf '%s' "$BODY" | jq -c --arg at "$SHIPPED_AT" '. + {shippedAt: $at}'); fi
|
|
119
155
|
api_call POST "/experiments" "$BODY" | jq "{success, experiment: (.data | ${CARD})}"
|
|
120
156
|
;;
|
|
121
157
|
ship)
|
|
@@ -64,6 +64,23 @@ check "create ga4: body" "$(last '.body | tostring')" '{"hypothesis":"Shorter fo
|
|
|
64
64
|
run '{"action":"create","hypothesis":"J","metric":{"source":"gsc","measure":"ctr","config":"/c.json"}}' >/dev/null
|
|
65
65
|
check "create json: body" "$(last '.body | tostring')" '{"hypothesis":"J","metric":{"source":"gsc","measure":"ctr","config":"/c.json"}}'
|
|
66
66
|
|
|
67
|
+
# --- create on an already-done ticket with an explicit ship time ---
|
|
68
|
+
run create --hypothesis "Late card" --source gsc --measure clicks --config /c.json --project ce --ticket T-9 --shipped-at 2026-10-01T10:00:00Z >/dev/null
|
|
69
|
+
check "create shipped-at: body" "$(last '.body.shippedAt')" "2026-10-01T10:00:00Z"
|
|
70
|
+
run '{"action":"create","hypothesis":"J","metric":{"source":"gsc","measure":"ctr","config":"/c.json"},"shippedAt":"2026-10-01T10:00:00Z"}' >/dev/null
|
|
71
|
+
check "create json shipped-at: body" "$(last '.body.shippedAt')" "2026-10-01T10:00:00Z"
|
|
72
|
+
|
|
73
|
+
# --- autopilot scope: project + label, extra outcome metrics, start time ---
|
|
74
|
+
run create --autopilot --project 7667a919 --label feed --started-at 2026-10-03T00:00:00Z \
|
|
75
|
+
--hypothesis "Autopilot on /feed → feed clicks up" --source ga4 --measure events --event feed_card_click --channel all --config /c.json \
|
|
76
|
+
--metric "ga4:sessions:page=/feed,pageMatch=contains,channel=all" --metric "gsc:clicks:page=https://visa.careerengine.us/feed,pageMatch=contains" \
|
|
77
|
+
--metric-label "Feed card clicks" --window-days 28 >/dev/null
|
|
78
|
+
check "autopilot: body" "$(last '.body | tostring')" '{"hypothesis":"Autopilot on /feed → feed clicks up","metric":{"source":"ga4","measure":"events","config":"/c.json","event":"feed_card_click","channel":"all","label":"Feed card clicks"},"windowDays":"28","autopilot":{"project":"7667a919","label":"feed"},"metrics":[{"source":"ga4","measure":"sessions","page":"/feed","pageMatch":"contains","channel":"all"},{"source":"gsc","measure":"clicks","page":"https://visa.careerengine.us/feed","pageMatch":"contains"}],"startedAt":"2026-10-03T00:00:00Z"}'
|
|
79
|
+
check "autopilot: needs project" "$(run_err create --autopilot --hypothesis h --source gsc --measure clicks --config /c | grep -c 'project')" "1"
|
|
80
|
+
check "autopilot: no ticket" "$(run_err create --autopilot --project p --ticket T-1 --hypothesis h --source gsc --measure clicks --config /c | grep -c 'leave out --ticket')" "1"
|
|
81
|
+
check "metric needs autopilot" "$(run_err create --hypothesis h --source gsc --measure clicks --config /c --metric gsc:clicks | grep -c 'needs --autopilot')" "1"
|
|
82
|
+
check "bad metric spec" "$(run_err create --autopilot --project p --hypothesis h --source gsc --measure clicks --config /c --metric nonsense | grep -c 'must look like')" "1"
|
|
83
|
+
|
|
67
84
|
# --- missing params / a ticket without its project ---
|
|
68
85
|
check "create: missing" "$(run_err create --hypothesis h --source gsc --measure clicks | grep -c 'config')" "1"
|
|
69
86
|
check "create: ticket w/o project" "$(run_err create --hypothesis h --source gsc --measure clicks --config /c --ticket T-1 | grep -c 'needs --project')" "1"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Project Tickets
|
|
3
|
-
description: A project's own backlog — list, read, create, update, claim, release, assign, link, log and ask-owner (structured decision cards) on project tickets (markdown files in <project>/.crewly/tickets/, tracked in git), plus the per-project ticket autopilot switch.
|
|
4
|
-
version: 1.
|
|
3
|
+
description: A project's own backlog — list, read, create, update, claim, release, assign, link, log and ask-owner (structured decision cards) on project tickets (markdown files in <project>/.crewly/tickets/, tracked in git), plus the per-project ticket autopilot switch, its stats and the daily retro.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
category: task-management
|
|
6
6
|
skillType: claude-skill
|
|
7
7
|
assignableRoles:
|
|
@@ -189,3 +189,36 @@ split, ask the owner, or cancel), pauses for the day at the daily token budget
|
|
|
189
189
|
sends the owner the batched questions plus one evening digest. Only switch it
|
|
190
190
|
on when the owner asked for it. Refused for anyone but the owner and the
|
|
191
191
|
orchestrator.
|
|
192
|
+
|
|
193
|
+
`--retro on|off|default` switches the team lead's daily retro (default: on
|
|
194
|
+
while an autopilot experiment on the project is running).
|
|
195
|
+
|
|
196
|
+
## Autopilot numbers and retro (owner / orchestrator / team lead)
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
bash execute.sh stats --project P [--days 14] [--label feed] # per day + total
|
|
200
|
+
bash execute.sh runs --project P [--days 7] [--label feed] # run trace + ticket traces per day
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
`stats` counts tickets triaged / started / done (worker finished) / verified
|
|
204
|
+
(ticket done) / sent back / stalled, cycle times, owner touches by kind,
|
|
205
|
+
stalls by cause, harness interventions, traced tokens and $ against the daily
|
|
206
|
+
budget, and time paused on the budget. Read a day's run with `trace-read
|
|
207
|
+
--trace <runTraceId>`.
|
|
208
|
+
|
|
209
|
+
Once a day (09:00) the driver gets an `autopilot_retro` WorkItem for the
|
|
210
|
+
previous day. File it with:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
bash execute.sh retro --project P --day 2026-10-02 \
|
|
214
|
+
--summary "Shipped CE-12 and CE-14. CE-15 stalled 3h waiting on the owner for the copy." \
|
|
215
|
+
--problem "owner_dependency|CE-15 waited 3h for copy approval|Decision D-40 open 3h|tr-20261002-ab12cd34" \
|
|
216
|
+
--problem "harness_gap|Triage brief listed a stopped member as busy"
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
`--problem "class|title|detail|evidence"`, class one of `agent_judgment`,
|
|
220
|
+
`missing_skill`, `harness_gap`, `owner_dependency`. Crewly writes the retro to
|
|
221
|
+
the project wiki (`llm-curated/autopilot-retros/<day>.md`); harness gaps
|
|
222
|
+
become backlog tickets on the Crewly project, deduplicated and at most 3 a
|
|
223
|
+
day, and the owner approves them with one card. Never file harness gaps as
|
|
224
|
+
tickets yourself.
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
# bash execute.sh ask-owner --project P --id APP-12 --clear [--note "answer"]
|
|
24
24
|
# bash execute.sh autopilot --project P [--on|--off] [--driver <session>|--driver default]
|
|
25
25
|
# [--daily-budget <tokens, e.g. 20M>] [--max-in-flight <n>] (owner / orchestrator)
|
|
26
|
+
# [--retro on|off|default]
|
|
27
|
+
# bash execute.sh stats --project P [--days 14] [--label feed] (owner / orc / lead)
|
|
28
|
+
# bash execute.sh runs --project P [--days 7] [--label feed] (owner / orc / lead)
|
|
29
|
+
# bash execute.sh retro --project P --day YYYY-MM-DD --summary "…" [--problem "class|title|detail|evidence" …]
|
|
26
30
|
# bash execute.sh '{"action":"create","project":"P","title":"…"}'
|
|
27
31
|
#
|
|
28
32
|
# P = project id, name, or absolute path.
|
|
@@ -58,9 +62,23 @@ Usage:
|
|
|
58
62
|
bash execute.sh ask-owner --project P --id APP-12 --clear [--note "answer"]
|
|
59
63
|
The owner answered: remove the needs-owner mark
|
|
60
64
|
bash execute.sh autopilot --project P [--on|--off] [--driver <session>|default]
|
|
61
|
-
[--daily-budget <tokens, e.g. 20M>] [--max-in-flight <n>]
|
|
65
|
+
[--daily-budget <tokens, e.g. 20M>] [--max-in-flight <n>] [--retro on|off|default]
|
|
62
66
|
Owner / orchestrator: show or change the ticket
|
|
63
|
-
autopilot (no flags = show)
|
|
67
|
+
autopilot (no flags = show). --retro: the lead's
|
|
68
|
+
daily retro (default: on while an autopilot
|
|
69
|
+
experiment runs)
|
|
70
|
+
bash execute.sh stats --project P [--days 14] [--label feed]
|
|
71
|
+
Autopilot numbers per day: tickets triaged /
|
|
72
|
+
started / done / verified / sent back / stalled,
|
|
73
|
+
cycle times, owner touches, stalls by cause,
|
|
74
|
+
interventions, cost vs the daily budget
|
|
75
|
+
bash execute.sh runs --project P [--days 7] [--label feed]
|
|
76
|
+
Run trace + ticket traces per day (for trace-read)
|
|
77
|
+
bash execute.sh retro --project P --day YYYY-MM-DD --summary "what shipped, where it stalled, why"
|
|
78
|
+
[--problem "class|title|detail|evidence" …]
|
|
79
|
+
Team lead: file the daily autopilot retro.
|
|
80
|
+
class = agent_judgment | missing_skill |
|
|
81
|
+
harness_gap | owner_dependency
|
|
64
82
|
|
|
65
83
|
P = project id, name or absolute path. Workers' new tickets start in backlog;
|
|
66
84
|
the owner, the orchestrator or a team lead makes them ready.
|
|
@@ -72,6 +90,7 @@ STATUS=""; SOURCE=""; REQUEST_ID=""; NOTE=""; OWNER_REVIEW=""; ASSIGNEE=""; STAR
|
|
|
72
90
|
ACCEPTANCE_JSON="null"
|
|
73
91
|
HAS_DESCRIPTION=0
|
|
74
92
|
QUESTION=""; CLEAR=""; OPTIONS_JSON="[]"; DEFAULT_OPT=""; DEADLINE=""; SENSITIVE=""; AP_ENABLED=""; AP_DRIVER=""; AP_BUDGET=""; AP_MAX=""
|
|
93
|
+
AP_RETRO=""; DAYS=""; LABEL=""; DAY=""; SUMMARY=""; PROBLEMS_JSON="[]"
|
|
75
94
|
|
|
76
95
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
77
96
|
J="$1"; shift
|
|
@@ -104,6 +123,12 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
|
104
123
|
AP_DRIVER=$(printf '%s' "$J" | jq -r '.driver // empty')
|
|
105
124
|
AP_BUDGET=$(printf '%s' "$J" | jq -r '.dailyBudgetTokens // empty')
|
|
106
125
|
AP_MAX=$(printf '%s' "$J" | jq -r '.maxInFlightPerMember // empty')
|
|
126
|
+
AP_RETRO=$(printf '%s' "$J" | jq -r 'if (.retro|type) == "boolean" then (if .retro then "on" else "off" end) else (.retro // empty) end')
|
|
127
|
+
DAYS=$(printf '%s' "$J" | jq -r '.days // empty')
|
|
128
|
+
LABEL=$(printf '%s' "$J" | jq -r '.label // empty')
|
|
129
|
+
DAY=$(printf '%s' "$J" | jq -r '.day // empty')
|
|
130
|
+
SUMMARY=$(printf '%s' "$J" | jq -r '.summary // empty')
|
|
131
|
+
PROBLEMS_JSON=$(printf '%s' "$J" | jq -c 'if (.problems|type) == "array" then .problems else [] end')
|
|
107
132
|
fi
|
|
108
133
|
if [[ -z "$ACTION" && $# -gt 0 && ${1:0:1} != '-' ]]; then ACTION="$1"; shift; fi
|
|
109
134
|
|
|
@@ -140,13 +165,20 @@ while [[ $# -gt 0 ]]; do
|
|
|
140
165
|
--daily-budget|--budget)
|
|
141
166
|
[ $# -ge 2 ] || error_exit "--daily-budget requires a value"; AP_BUDGET="$2"; shift 2 ;;
|
|
142
167
|
--max-in-flight) [ $# -ge 2 ] || error_exit "--max-in-flight requires a value"; AP_MAX="$2"; shift 2 ;;
|
|
168
|
+
--retro) [ $# -ge 2 ] || error_exit "--retro requires on, off or default"; AP_RETRO="$2"; shift 2 ;;
|
|
169
|
+
--days) [ $# -ge 2 ] || error_exit "--days requires a value"; DAYS="$2"; shift 2 ;;
|
|
170
|
+
--label) [ $# -ge 2 ] || error_exit "--label requires a value"; LABEL="$2"; shift 2 ;;
|
|
171
|
+
--day) [ $# -ge 2 ] || error_exit "--day requires a value"; DAY="$2"; shift 2 ;;
|
|
172
|
+
--summary) [ $# -ge 2 ] || error_exit "--summary requires a value"; SUMMARY="$2"; shift 2 ;;
|
|
173
|
+
--problem) [ $# -ge 2 ] || error_exit "--problem requires \"class|title|detail|evidence\""
|
|
174
|
+
PROBLEMS_JSON=$(jq -c --arg p "$2" '. + [($p | split("|")) as $f | {class: ($f[0] // "" | gsub("^\\s+|\\s+$"; "")), title: ($f[1] // "")} + (if ($f[2] // "") != "" then {detail: $f[2]} else {} end) + (if ($f[3:] | join("|")) != "" then {evidence: ($f[3:] | join("|"))} else {} end)]' <<<"$PROBLEMS_JSON"); shift 2 ;;
|
|
143
175
|
--full) shift ;;
|
|
144
176
|
--help|-h) print_usage; exit 0 ;;
|
|
145
177
|
*) error_exit "Unknown option: $1" ;;
|
|
146
178
|
esac
|
|
147
179
|
done
|
|
148
180
|
|
|
149
|
-
[ -n "$ACTION" ] || { print_usage >&2; error_exit "Missing action: list | show | create | update | claim | release | assign | log | link | ask-owner | autopilot"; }
|
|
181
|
+
[ -n "$ACTION" ] || { print_usage >&2; error_exit "Missing action: list | show | create | update | claim | release | assign | log | link | ask-owner | autopilot | stats | runs | retro"; }
|
|
150
182
|
|
|
151
183
|
# URL-encode a path segment (project paths contain slashes).
|
|
152
184
|
enc() { jq -rn --arg v "$1" '$v|@uri'; }
|
|
@@ -250,19 +282,40 @@ case "$ACTION" in
|
|
|
250
282
|
;;
|
|
251
283
|
autopilot)
|
|
252
284
|
require_param "project" "$PROJECT"
|
|
253
|
-
if [ -z "$AP_ENABLED$AP_DRIVER$AP_BUDGET$AP_MAX" ]; then
|
|
285
|
+
if [ -z "$AP_ENABLED$AP_DRIVER$AP_BUDGET$AP_MAX$AP_RETRO" ]; then
|
|
254
286
|
api_call GET "/project-ticket-autopilot/$(enc "$PROJECT")" | jq '{success, autopilot: .data}'
|
|
255
287
|
else
|
|
256
|
-
BODY=$(jq -n --arg enabled "$AP_ENABLED" --arg driver "$AP_DRIVER" --arg budget "$AP_BUDGET" --arg max "$AP_MAX" \
|
|
288
|
+
BODY=$(jq -n --arg enabled "$AP_ENABLED" --arg driver "$AP_DRIVER" --arg budget "$AP_BUDGET" --arg max "$AP_MAX" --arg retro "$AP_RETRO" \
|
|
257
289
|
'{}
|
|
258
290
|
+ (if $enabled != "" then {enabled: ($enabled == "true")} else {} end)
|
|
291
|
+
+ (if $retro == "default" then {retro: null} elif $retro != "" then {retro: $retro} else {} end)
|
|
259
292
|
+ (if $driver == "default" then {driver: null} elif $driver != "" then {driver: $driver} else {} end)
|
|
260
293
|
+ (if $budget == "default" then {dailyBudgetTokens: null} elif $budget != "" then {dailyBudgetTokens: ($budget | tonumber? // $budget)} else {} end)
|
|
261
294
|
+ (if $max == "default" then {maxInFlightPerMember: null} elif $max != "" then {maxInFlightPerMember: ($max | tonumber? // $max)} else {} end)')
|
|
262
295
|
api_call POST "/project-ticket-autopilot/$(enc "$PROJECT")" "$BODY" | jq '{success, autopilot: .data}'
|
|
263
296
|
fi
|
|
264
297
|
;;
|
|
298
|
+
stats|runs)
|
|
299
|
+
require_param "project" "$PROJECT"
|
|
300
|
+
QS=""
|
|
301
|
+
[ -n "$DAYS" ] && QS="days=$(enc "$DAYS")"
|
|
302
|
+
[ -n "$LABEL" ] && QS="${QS:+$QS&}label=$(enc "$LABEL")"
|
|
303
|
+
if [ "$ACTION" = "stats" ]; then
|
|
304
|
+
api_call GET "/project-ticket-autopilot/$(enc "$PROJECT")/stats${QS:+?$QS}" \
|
|
305
|
+
| jq '{success, stats: (.data | if . == null then null else {project, label, range, pausedForToday, total, labels,
|
|
306
|
+
days: [.days[] | {day, triaged, started, done, verified, sentBack, stalled, ownerTouches: .ownerTouches.total, stallMs: .stalls.totalMs, costUsd, pausedMs, runTraceId}]} end)}'
|
|
307
|
+
else
|
|
308
|
+
api_call GET "/project-ticket-autopilot/$(enc "$PROJECT")/runs${QS:+?$QS}" | jq '{success, runs: .data}'
|
|
309
|
+
fi
|
|
310
|
+
;;
|
|
311
|
+
retro)
|
|
312
|
+
require_param "project" "$PROJECT"
|
|
313
|
+
require_param "day (--day YYYY-MM-DD)" "$DAY"
|
|
314
|
+
require_param "summary (--summary)" "$SUMMARY"
|
|
315
|
+
BODY=$(jq -n --arg d "$DAY" --arg s "$SUMMARY" --argjson p "$PROBLEMS_JSON" '{day: $d, summary: $s, problems: $p}')
|
|
316
|
+
api_call POST "/project-ticket-autopilot/$(enc "$PROJECT")/retro" "$BODY" | jq '{success, retro: .data, error}'
|
|
317
|
+
;;
|
|
265
318
|
*)
|
|
266
|
-
error_exit "Unknown action: $ACTION (use list | show | create | update | claim | release | assign | log | link | ask-owner | autopilot)"
|
|
319
|
+
error_exit "Unknown action: $ACTION (use list | show | create | update | claim | release | assign | log | link | ask-owner | autopilot | stats | runs | retro)"
|
|
267
320
|
;;
|
|
268
321
|
esac
|
|
@@ -31,6 +31,13 @@ class H(BaseHTTPRequestHandler):
|
|
|
31
31
|
if self.path.count('/') >= 4 and not self.path.split('?')[0].endswith('%2Fapp'):
|
|
32
32
|
return self.reply(200, {'success': True, 'data': T})
|
|
33
33
|
return self.reply(200, {'success': True, 'data': {'project': {'id': 'p1'}, 'tickets': [T], 'invalid': []}})
|
|
34
|
+
if self.path.startswith('/api/project-ticket-autopilot/') and '/stats' in self.path:
|
|
35
|
+
day = {'day': '2026-10-02', 'triaged': 3, 'started': 2, 'done': 2, 'verified': 1, 'sentBack': 0, 'stalled': 1,
|
|
36
|
+
'ownerTouches': {'total': 2}, 'stalls': {'totalMs': 60000}, 'costUsd': 1.5, 'pausedMs': 0, 'runTraceId': 'tr-x', 'extra': 1}
|
|
37
|
+
return self.reply(200, {'success': True, 'data': {'project': {'id': 'p1'}, 'label': 'feed', 'range': {}, 'pausedForToday': False,
|
|
38
|
+
'total': {'verified': 1}, 'labels': ['feed'], 'days': [day]}})
|
|
39
|
+
if self.path.startswith('/api/project-ticket-autopilot/') and '/runs' in self.path:
|
|
40
|
+
return self.reply(200, {'success': True, 'data': {'project': {'id': 'p1'}, 'days': [{'day': '2026-10-02', 'runTraceId': 'tr-x', 'traces': []}]}})
|
|
34
41
|
if self.path.startswith('/api/project-ticket-autopilot/'):
|
|
35
42
|
return self.reply(200, {'success': True, 'data': {'settings': {'enabled': False}}})
|
|
36
43
|
if self.path.startswith('/api/project-tickets'):
|
|
@@ -147,6 +154,23 @@ check "autopilot off: body" "$(last '.body | tostring')" '{"enabled":false,"driv
|
|
|
147
154
|
run '{"action":"autopilot","project":"p1","enabled":true,"driver":"ce-owen"}' >/dev/null
|
|
148
155
|
check "autopilot json: body" "$(last '.body | tostring')" '{"enabled":true,"driver":"ce-owen"}'
|
|
149
156
|
|
|
157
|
+
run autopilot --project p1 --retro on >/dev/null
|
|
158
|
+
check "autopilot retro on: body" "$(last '.body | tostring')" '{"retro":"on"}'
|
|
159
|
+
run autopilot --project p1 --retro default >/dev/null
|
|
160
|
+
check "autopilot retro default: body" "$(last '.body | tostring')" '{"retro":null}'
|
|
161
|
+
|
|
162
|
+
# --- stats / runs / retro (specs/2026-10-03-autopilot-experiments.md) ---
|
|
163
|
+
OUT=$(run stats --project p1 --days 7 --label feed)
|
|
164
|
+
check "stats: path" "$(last .path)" "/api/project-ticket-autopilot/p1/stats?days=7&label=feed"
|
|
165
|
+
check "stats: day row" "$(printf '%s' "$OUT" | jq -c '.stats.days[0] | [.day, .verified, .ownerTouches, .stallMs, .runTraceId, has("extra")]')" '["2026-10-02",1,2,60000,"tr-x",false]'
|
|
166
|
+
OUT=$(run runs --project p1)
|
|
167
|
+
check "runs: path" "$(last .path)" "/api/project-ticket-autopilot/p1/runs"
|
|
168
|
+
check "runs: output" "$(printf '%s' "$OUT" | jq -c '.runs.days[0].runTraceId')" '"tr-x"'
|
|
169
|
+
run retro --project p1 --day 2026-10-02 --summary "Shipped CE-1; CE-2 stalled on the owner." --problem "owner_dependency|CE-2 waited for copy|D-4 open 3h|tr-a" --problem "harness_gap|Triage listed a stopped member as busy" >/dev/null
|
|
170
|
+
check "retro: path" "$(last .path)" "/api/project-ticket-autopilot/p1/retro"
|
|
171
|
+
check "retro: body" "$(last '.body | tostring')" '{"day":"2026-10-02","summary":"Shipped CE-1; CE-2 stalled on the owner.","problems":[{"class":"owner_dependency","title":"CE-2 waited for copy","detail":"D-4 open 3h","evidence":"tr-a"},{"class":"harness_gap","title":"Triage listed a stopped member as busy"}]}'
|
|
172
|
+
check "retro: missing day" "$(run_err retro --project p1 --summary x | grep -c 'day')" "1"
|
|
173
|
+
|
|
150
174
|
# --- errors ---
|
|
151
175
|
check "missing action" "$(run_err | grep -c 'Missing action')" "1"
|
|
152
176
|
check "unknown action" "$(run_err explode | grep -c 'Unknown action')" "1"
|
|
@@ -39,7 +39,23 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
|
39
39
|
shift || true
|
|
40
40
|
fi
|
|
41
41
|
|
|
42
|
+
# A value flag at the end of the line (or followed by another of this skill's
|
|
43
|
+
# flags) has no value: say so instead of failing on an unset "$2". Any other
|
|
44
|
+
# value is kept, so a message may still start with "-".
|
|
45
|
+
flag_value() {
|
|
46
|
+
if [[ $# -lt 2 ]]; then
|
|
47
|
+
error_exit "Flag $1 needs a value, e.g. $1 <value>. Use --help for usage."
|
|
48
|
+
fi
|
|
49
|
+
case "$2" in
|
|
50
|
+
--to|-t|--message|-m|--message-file|--json|-j|--help|-h)
|
|
51
|
+
error_exit "Flag $1 needs a value, e.g. $1 <value>. Use --help for usage." ;;
|
|
52
|
+
esac
|
|
53
|
+
}
|
|
54
|
+
|
|
42
55
|
while [[ $# -gt 0 ]]; do
|
|
56
|
+
case "$1" in
|
|
57
|
+
--to|-t|--message|-m|--message-file|--json|-j) flag_value "$@" ;;
|
|
58
|
+
esac
|
|
43
59
|
case "$1" in
|
|
44
60
|
--to|-t)
|
|
45
61
|
TO="$2"
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# queued, not delivered, with a do-not-resend note (#937)
|
|
13
13
|
# 4. another queued answer is reported as queued, not delivered
|
|
14
14
|
# 5. an HTTP error still fails the skill
|
|
15
|
+
# 6. a value flag with no value prints a clear error (#997)
|
|
15
16
|
|
|
16
17
|
set -euo pipefail
|
|
17
18
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
@@ -76,6 +77,15 @@ else
|
|
|
76
77
|
echo " PASS: an HTTP error fails the skill"; PASS=$((PASS + 1))
|
|
77
78
|
fi
|
|
78
79
|
|
|
80
|
+
OUT=$(bash "$RUN" --to 2>&1 >/dev/null || true)
|
|
81
|
+
check "--to with no value names the flag" "$OUT" 'Flag --to needs a value'
|
|
82
|
+
|
|
83
|
+
OUT=$(bash "$RUN" --to qa-1 --message 2>&1 >/dev/null || true)
|
|
84
|
+
check "--message with no value names the flag" "$OUT" 'Flag --message needs a value'
|
|
85
|
+
|
|
86
|
+
OUT=$(bash "$RUN" --to --message hi 2>&1 >/dev/null || true)
|
|
87
|
+
check "--to followed by another flag is refused" "$OUT" 'Flag --to needs a value'
|
|
88
|
+
|
|
79
89
|
echo ""
|
|
80
90
|
echo "Results: $PASS passed, $FAIL failed"
|
|
81
91
|
[ "$FAIL" -eq 0 ]
|