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
|
@@ -0,0 +1,810 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomy metrics of one run trace, computed from its events only: where the
|
|
3
|
+
* time went (agents working, waiting on the owner, waiting on an agent, idle),
|
|
4
|
+
* owner touches, rework, stalls with a cause, harness interventions, tokens
|
|
5
|
+
* and cost, and the outcome.
|
|
6
|
+
*
|
|
7
|
+
* Pure: no I/O, no clock unless none is given. The definitions are in
|
|
8
|
+
* specs/2026-10-03-autonomy-metrics.md; keep the two in step.
|
|
9
|
+
*
|
|
10
|
+
* @module services/trace/trace-metrics
|
|
11
|
+
*/
|
|
12
|
+
import { TRACE_CONSTANTS } from '../../constants.js';
|
|
13
|
+
import { eventCostUsd, eventTokens } from '../monitoring/token-usage.service.js';
|
|
14
|
+
/** Every stall cause, in the order they are checked. */
|
|
15
|
+
export const STALL_CAUSES = ['runtime_quota', 'delivery_failure', 'waiting_on_owner', 'waiting_on_agent', 'nobody_pushing'];
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Settings
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Stall threshold: `CREWLY_TRACE_STALL_MINUTES`, else
|
|
21
|
+
* {@link TRACE_CONSTANTS.STALL_MINUTES}.
|
|
22
|
+
*
|
|
23
|
+
* @returns Minutes
|
|
24
|
+
*/
|
|
25
|
+
export function defaultStallMinutes() {
|
|
26
|
+
const env = Number(process.env.CREWLY_TRACE_STALL_MINUTES);
|
|
27
|
+
return Number.isFinite(env) && env > 0 ? clampStallMinutes(env) : TRACE_CONSTANTS.STALL_MINUTES;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A caller's stall threshold within bounds.
|
|
31
|
+
*
|
|
32
|
+
* @param minutes - Requested minutes
|
|
33
|
+
* @returns Minutes within STALL_MINUTES_MIN..STALL_MINUTES_MAX
|
|
34
|
+
*/
|
|
35
|
+
export function clampStallMinutes(minutes) {
|
|
36
|
+
return Math.min(TRACE_CONSTANTS.STALL_MINUTES_MAX, Math.max(TRACE_CONSTANTS.STALL_MINUTES_MIN, minutes));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Sort and merge overlapping intervals; empty ones are dropped.
|
|
40
|
+
*
|
|
41
|
+
* @param list - Intervals
|
|
42
|
+
* @returns Disjoint, sorted intervals
|
|
43
|
+
*/
|
|
44
|
+
export function mergeIntervals(list) {
|
|
45
|
+
const sorted = list.filter(([a, b]) => b > a).sort((x, y) => x[0] - y[0]);
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const [a, b] of sorted) {
|
|
48
|
+
const last = out[out.length - 1];
|
|
49
|
+
if (last && a <= last[1])
|
|
50
|
+
last[1] = Math.max(last[1], b);
|
|
51
|
+
else
|
|
52
|
+
out.push([a, b]);
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Clip intervals to a window.
|
|
58
|
+
*
|
|
59
|
+
* @param list - Intervals
|
|
60
|
+
* @param lo - Window start
|
|
61
|
+
* @param hi - Window end
|
|
62
|
+
* @returns Clipped intervals (merged)
|
|
63
|
+
*/
|
|
64
|
+
function clip(list, lo, hi) {
|
|
65
|
+
return mergeIntervals(list.map(([a, b]) => [Math.max(a, lo), Math.min(b, hi)]));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* `a` minus `b`; both merged.
|
|
69
|
+
*
|
|
70
|
+
* @param a - Intervals
|
|
71
|
+
* @param b - Intervals to remove
|
|
72
|
+
* @returns What is in `a` and not in `b`
|
|
73
|
+
*/
|
|
74
|
+
export function subtractIntervals(a, b) {
|
|
75
|
+
const out = [];
|
|
76
|
+
for (const [start, end] of a) {
|
|
77
|
+
let cursor = start;
|
|
78
|
+
for (const [bs, be] of b) {
|
|
79
|
+
if (be <= cursor || bs >= end)
|
|
80
|
+
continue;
|
|
81
|
+
if (bs > cursor)
|
|
82
|
+
out.push([cursor, bs]);
|
|
83
|
+
cursor = Math.max(cursor, be);
|
|
84
|
+
if (cursor >= end)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
if (cursor < end)
|
|
88
|
+
out.push([cursor, end]);
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Total length.
|
|
94
|
+
*
|
|
95
|
+
* @param list - Disjoint intervals
|
|
96
|
+
* @returns ms
|
|
97
|
+
*/
|
|
98
|
+
function lengthOf(list) {
|
|
99
|
+
return list.reduce((sum, [a, b]) => sum + (b - a), 0);
|
|
100
|
+
}
|
|
101
|
+
/** Work item statuses after which nobody works on it. */
|
|
102
|
+
const WORK_ITEM_CLOSED = new Set(['done', 'done_by_worker', 'verified', 'failed', 'rejected', 'cancelled']);
|
|
103
|
+
/** Work item statuses that hold nobody (waiting for a time). */
|
|
104
|
+
const WORK_ITEM_WAITING_ON_TIME = new Set(['scheduled']);
|
|
105
|
+
/** Statuses a work item is re-queued from (a retry). */
|
|
106
|
+
const RETRY_FROM = new Set(['running', 'blocked', 'failed', 'rejected', 'done_by_worker', 'escalated', 'cancelled', 'verified', 'done']);
|
|
107
|
+
/** Work item types that are a verification. */
|
|
108
|
+
const VERIFY_TYPES = new Set(['check', 'review']);
|
|
109
|
+
/** Decision statuses that close it (`parked` still waits on the owner). */
|
|
110
|
+
const DECISION_CLOSED = new Set(['resolved', 'defaulted', 'cancelled', 'expired', 'skipped']);
|
|
111
|
+
/** Decision kinds that are approvals. */
|
|
112
|
+
const APPROVAL_DECISION_KINDS = new Set(['spend_cap', 'runtime_terms', 'browser_action']);
|
|
113
|
+
/** Request statuses an agent holds. */
|
|
114
|
+
const REQUEST_AGENT_HOLD = new Set(['open', 'ready', 'running', 'awaiting_followup', 'blocked']);
|
|
115
|
+
/** Request statuses work goes back to on a send-back. */
|
|
116
|
+
const REQUEST_BACK_TO_WORK = new Set(['open', 'ready', 'running', 'blocked']);
|
|
117
|
+
/** Events that are not progress (pushing, refusals, failures). */
|
|
118
|
+
const NOT_PROGRESS = new Set(['harness.nudge', 'harness.redelivery', 'harness.wake', 'harness.correction', 'harness.subagent_sendback', 'guard.block', 'error', 'runtime.blocked', 'trace.truncated', 'trace.root']);
|
|
119
|
+
/** turn.error text that means the runtime is out of usage or signed out. */
|
|
120
|
+
const QUOTA_TEXT = /usage limit|rate limit|quota|credit|billing|sign.?in|log.?in|logged out|unauthori[sz]ed|\b401\b/i;
|
|
121
|
+
/**
|
|
122
|
+
* A string field of `data`.
|
|
123
|
+
*
|
|
124
|
+
* @param e - Event
|
|
125
|
+
* @param key - Field
|
|
126
|
+
* @returns The value, or undefined
|
|
127
|
+
*/
|
|
128
|
+
function dataStr(e, key) {
|
|
129
|
+
const v = e.data?.[key];
|
|
130
|
+
return typeof v === 'string' ? v : typeof v === 'number' || typeof v === 'boolean' ? String(v) : undefined;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A number field of `data`.
|
|
134
|
+
*
|
|
135
|
+
* @param e - Event
|
|
136
|
+
* @param key - Field
|
|
137
|
+
* @returns The value (0 when absent)
|
|
138
|
+
*/
|
|
139
|
+
function dataNum(e, key) {
|
|
140
|
+
const v = Number(e.data?.[key]);
|
|
141
|
+
return Number.isFinite(v) ? v : 0;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The agent session an event is about: its agent actor, else `refs.session`.
|
|
145
|
+
*
|
|
146
|
+
* @param e - Event
|
|
147
|
+
* @returns Session, or undefined
|
|
148
|
+
*/
|
|
149
|
+
export function sessionOfEvent(e) {
|
|
150
|
+
if (e.actor.kind === 'agent' && e.actor.session)
|
|
151
|
+
return e.actor.session;
|
|
152
|
+
return e.refs.session || undefined;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Whether an event moved the run forward (see the spec's Stalls section).
|
|
156
|
+
*
|
|
157
|
+
* @param e - Event
|
|
158
|
+
* @returns True for progress
|
|
159
|
+
*/
|
|
160
|
+
export function isProgressEvent(e) {
|
|
161
|
+
if (NOT_PROGRESS.has(e.type))
|
|
162
|
+
return false;
|
|
163
|
+
if (e.type === 'message.outbound' && e.outcome === 'failed')
|
|
164
|
+
return false;
|
|
165
|
+
if (e.type === 'turn.delivered' && (dataStr(e, 'kind') === 'redelivery' || e.outcome === 'failed'))
|
|
166
|
+
return false;
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The text of an owner message delivery without its "delivered to X" prefix
|
|
171
|
+
* (one message delivered to two agents is one touch).
|
|
172
|
+
*
|
|
173
|
+
* @param e - turn.delivered event
|
|
174
|
+
* @returns Message text
|
|
175
|
+
*/
|
|
176
|
+
function ownerMessageText(e) {
|
|
177
|
+
return e.summary.replace(/^Owner message delivered to \S+: /, '');
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Tokens and cost of a `usage` event (the Usage page's unit and prices).
|
|
181
|
+
*
|
|
182
|
+
* @param e - Event
|
|
183
|
+
* @returns Tokens (input incl. cached + output) and USD, or null for other events
|
|
184
|
+
*/
|
|
185
|
+
export function usageOfEvent(e) {
|
|
186
|
+
if (e.type !== 'usage')
|
|
187
|
+
return null;
|
|
188
|
+
const runtime = dataStr(e, 'runtime');
|
|
189
|
+
const usage = {
|
|
190
|
+
model: dataStr(e, 'model') ?? 'unknown',
|
|
191
|
+
input: dataNum(e, 'input'),
|
|
192
|
+
output: dataNum(e, 'output'),
|
|
193
|
+
cachedInput: dataNum(e, 'cachedInput'),
|
|
194
|
+
cacheWrite: dataNum(e, 'cacheWrite'),
|
|
195
|
+
...(runtime ? { runtime } : {}),
|
|
196
|
+
};
|
|
197
|
+
const tokens = eventTokens(usage);
|
|
198
|
+
return { ...tokens, costUsd: eventCostUsd(usage) };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Sorted events with a valid time (the root excluded).
|
|
202
|
+
*
|
|
203
|
+
* @param events - Raw events
|
|
204
|
+
* @returns Events with times, in time order (file order breaks ties)
|
|
205
|
+
*/
|
|
206
|
+
export function sortTraceEvents(events) {
|
|
207
|
+
return events
|
|
208
|
+
.map((e, i) => ({ e, t: Date.parse(e.ts), i }))
|
|
209
|
+
.filter((x) => x.e.type !== 'trace.root' && Number.isFinite(x.t))
|
|
210
|
+
.sort((a, b) => a.t - b.t || a.i - b.i)
|
|
211
|
+
.map(({ e, t }) => ({ e, t }));
|
|
212
|
+
}
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// Busy periods
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
/**
|
|
217
|
+
* Busy periods per session: from `turn.ended` events when the session has
|
|
218
|
+
* any, else inferred from its deliveries and own activity.
|
|
219
|
+
*
|
|
220
|
+
* @param timed - Sorted events
|
|
221
|
+
* @returns Intervals and how they were found
|
|
222
|
+
*/
|
|
223
|
+
function busyPeriods(timed) {
|
|
224
|
+
const explicit = new Map();
|
|
225
|
+
const points = new Map();
|
|
226
|
+
const add = (map, s, t) => {
|
|
227
|
+
const list = map.get(s) ?? [];
|
|
228
|
+
list.push(t);
|
|
229
|
+
map.set(s, list);
|
|
230
|
+
};
|
|
231
|
+
for (const { e, t } of timed) {
|
|
232
|
+
if (e.type === 'turn.ended' && e.actor.session) {
|
|
233
|
+
const busyMs = Math.max(0, dataNum(e, 'busyMs'));
|
|
234
|
+
const list = explicit.get(e.actor.session) ?? [];
|
|
235
|
+
list.push([t - busyMs, t]);
|
|
236
|
+
explicit.set(e.actor.session, list);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (e.type === 'turn.delivered' && e.refs.session && isProgressEvent(e))
|
|
240
|
+
add(points, e.refs.session, t);
|
|
241
|
+
else if (e.actor.kind === 'agent' && e.actor.session)
|
|
242
|
+
add(points, e.actor.session, t);
|
|
243
|
+
}
|
|
244
|
+
const intervals = [];
|
|
245
|
+
let inferred = 0;
|
|
246
|
+
for (const list of explicit.values())
|
|
247
|
+
intervals.push(...list);
|
|
248
|
+
for (const [session, pts] of points) {
|
|
249
|
+
if (explicit.has(session))
|
|
250
|
+
continue;
|
|
251
|
+
inferred += 1;
|
|
252
|
+
let cur = null;
|
|
253
|
+
for (const p of pts) {
|
|
254
|
+
if (cur && p - cur[1] <= TRACE_CONSTANTS.INFERRED_TURN_GAP_MS)
|
|
255
|
+
cur[1] = p;
|
|
256
|
+
else {
|
|
257
|
+
if (cur)
|
|
258
|
+
intervals.push(cur);
|
|
259
|
+
cur = [p, p];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (cur)
|
|
263
|
+
intervals.push(cur);
|
|
264
|
+
}
|
|
265
|
+
return { intervals, explicit: explicit.size, inferred };
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Owner and agent holds from decisions, Requests, work items and agent →
|
|
269
|
+
* agent messages.
|
|
270
|
+
*
|
|
271
|
+
* @param timed - Sorted events
|
|
272
|
+
* @param end - Window end (open holds end here)
|
|
273
|
+
* @returns Holds and last statuses
|
|
274
|
+
*/
|
|
275
|
+
function collectHolds(timed, end) {
|
|
276
|
+
const owner = [];
|
|
277
|
+
const agent = [];
|
|
278
|
+
const openDecisions = new Map();
|
|
279
|
+
const requestState = new Map();
|
|
280
|
+
const workItems = new Map();
|
|
281
|
+
const pendingMessages = [];
|
|
282
|
+
const closeRequest = (id, t, stillOpen = false) => {
|
|
283
|
+
const st = requestState.get(id);
|
|
284
|
+
if (!st)
|
|
285
|
+
return;
|
|
286
|
+
const flag = stillOpen ? { stillOpen } : {};
|
|
287
|
+
if (st.status === 'waiting_confirmation')
|
|
288
|
+
owner.push({ start: st.since, end: t, label: `Ticket ${id} waits for the owner's review`, ...flag });
|
|
289
|
+
else if (REQUEST_AGENT_HOLD.has(st.status))
|
|
290
|
+
agent.push({ start: st.since, end: t, label: `Ticket ${id} is ${st.status.replace(/_/g, ' ')}`, ...flag });
|
|
291
|
+
};
|
|
292
|
+
const closeWorkItem = (id, t, stillOpen = false) => {
|
|
293
|
+
const wi = workItems.get(id);
|
|
294
|
+
if (!wi || !wi.open)
|
|
295
|
+
return;
|
|
296
|
+
agent.push({
|
|
297
|
+
start: wi.since,
|
|
298
|
+
end: t,
|
|
299
|
+
label: `Work item${wi.target ? ` for ${wi.target}` : ''} is ${wi.status}`,
|
|
300
|
+
...(wi.target ? { session: wi.target } : {}),
|
|
301
|
+
...(stillOpen ? { stillOpen } : {}),
|
|
302
|
+
});
|
|
303
|
+
wi.open = false;
|
|
304
|
+
};
|
|
305
|
+
for (const { e, t } of timed) {
|
|
306
|
+
// Any activity of an agent answers messages sent to it.
|
|
307
|
+
const actorSession = e.actor.kind === 'agent' ? e.actor.session : undefined;
|
|
308
|
+
if (actorSession) {
|
|
309
|
+
for (let i = pendingMessages.length - 1; i >= 0; i--) {
|
|
310
|
+
const m = pendingMessages[i];
|
|
311
|
+
if (m.target === actorSession && t >= m.since) {
|
|
312
|
+
agent.push({ start: m.since, end: t, label: `Message to ${m.target}${m.from ? ` from ${m.from}` : ''} not picked up`, session: m.target });
|
|
313
|
+
pendingMessages.splice(i, 1);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
switch (e.type) {
|
|
318
|
+
case 'decision.created': {
|
|
319
|
+
const id = e.refs.decisionId ?? `decision@${t}`;
|
|
320
|
+
if (!openDecisions.has(id))
|
|
321
|
+
openDecisions.set(id, t);
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case 'decision.status': {
|
|
325
|
+
const id = e.refs.decisionId ?? '';
|
|
326
|
+
const to = dataStr(e, 'to') ?? '';
|
|
327
|
+
const since = openDecisions.get(id);
|
|
328
|
+
if (since !== undefined && DECISION_CLOSED.has(to)) {
|
|
329
|
+
owner.push({ start: since, end: t, label: `Decision ${id} open` });
|
|
330
|
+
openDecisions.delete(id);
|
|
331
|
+
}
|
|
332
|
+
else if (since === undefined && !DECISION_CLOSED.has(to) && id) {
|
|
333
|
+
openDecisions.set(id, t);
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case 'request.created':
|
|
338
|
+
case 'request.status': {
|
|
339
|
+
const id = e.refs.requestId ?? 'request';
|
|
340
|
+
const status = e.type === 'request.created' ? (dataStr(e, 'status') ?? 'open') : (dataStr(e, 'to') ?? '');
|
|
341
|
+
if (!status)
|
|
342
|
+
break;
|
|
343
|
+
closeRequest(id, t);
|
|
344
|
+
requestState.set(id, { status, since: t });
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
case 'workitem.created': {
|
|
348
|
+
const id = e.refs.workItemId;
|
|
349
|
+
if (!id)
|
|
350
|
+
break;
|
|
351
|
+
const status = dataStr(e, 'status') ?? 'queued';
|
|
352
|
+
const open = !WORK_ITEM_CLOSED.has(status) && !WORK_ITEM_WAITING_ON_TIME.has(status);
|
|
353
|
+
workItems.set(id, { status, since: t, open, ...(e.refs.session ? { target: e.refs.session } : {}) });
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
case 'workitem.status': {
|
|
357
|
+
const id = e.refs.workItemId;
|
|
358
|
+
if (!id)
|
|
359
|
+
break;
|
|
360
|
+
const to = dataStr(e, 'to') ?? '';
|
|
361
|
+
const wi = workItems.get(id) ?? { status: dataStr(e, 'from') ?? 'queued', since: t, open: false, ...(e.refs.session ? { target: e.refs.session } : {}) };
|
|
362
|
+
if (!workItems.has(id))
|
|
363
|
+
workItems.set(id, wi);
|
|
364
|
+
closeWorkItem(id, t);
|
|
365
|
+
wi.status = to;
|
|
366
|
+
wi.since = t;
|
|
367
|
+
if (e.refs.session)
|
|
368
|
+
wi.target = e.refs.session;
|
|
369
|
+
wi.open = !WORK_ITEM_CLOSED.has(to) && !WORK_ITEM_WAITING_ON_TIME.has(to);
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
case 'message.agent': {
|
|
373
|
+
if (e.refs.session && e.refs.session !== actorSession)
|
|
374
|
+
pendingMessages.push({ target: e.refs.session, ...(actorSession ? { from: actorSession } : {}), since: t });
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
default:
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// Still open at the end of the window.
|
|
382
|
+
for (const [id, since] of openDecisions)
|
|
383
|
+
owner.push({ start: since, end, label: `Decision ${id} open`, stillOpen: true });
|
|
384
|
+
for (const id of requestState.keys())
|
|
385
|
+
closeRequest(id, end, true);
|
|
386
|
+
for (const id of workItems.keys())
|
|
387
|
+
closeWorkItem(id, end, true);
|
|
388
|
+
for (const m of pendingMessages) {
|
|
389
|
+
agent.push({ start: m.since, end, label: `Message to ${m.target}${m.from ? ` from ${m.from}` : ''} not picked up`, session: m.target, stillOpen: true });
|
|
390
|
+
}
|
|
391
|
+
const workItemStatus = new Map();
|
|
392
|
+
for (const [id, wi] of workItems)
|
|
393
|
+
workItemStatus.set(id, wi.status);
|
|
394
|
+
const requestStatus = new Map();
|
|
395
|
+
for (const [id, st] of requestState)
|
|
396
|
+
requestStatus.set(id, st.status);
|
|
397
|
+
return { owner, agent, workItemStatus, requestStatus };
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Holds covering a moment.
|
|
401
|
+
*
|
|
402
|
+
* @param holds - Holds
|
|
403
|
+
* @param at - Time (ms)
|
|
404
|
+
* @returns Holds open at `at` (a hold still open at the window's end covers every later moment)
|
|
405
|
+
*/
|
|
406
|
+
function holdsAt(holds, at) {
|
|
407
|
+
return holds.filter((h) => h.start <= at && (h.end > at || h.stillOpen === true));
|
|
408
|
+
}
|
|
409
|
+
// ---------------------------------------------------------------------------
|
|
410
|
+
// Main
|
|
411
|
+
// ---------------------------------------------------------------------------
|
|
412
|
+
/**
|
|
413
|
+
* Compute the autonomy metrics of a trace.
|
|
414
|
+
*
|
|
415
|
+
* @param root - The trace root
|
|
416
|
+
* @param events - Its events, in any order (the root event is ignored)
|
|
417
|
+
* @param options - Stall threshold, clock
|
|
418
|
+
* @returns The metrics
|
|
419
|
+
*
|
|
420
|
+
* @example
|
|
421
|
+
* ```typescript
|
|
422
|
+
* const page = await store.read(id, 0, TRACE_CONSTANTS.MAX_PAGE_SIZE);
|
|
423
|
+
* const m = computeTraceMetrics(page.root, page.events, { stallMinutes: 30 });
|
|
424
|
+
* m.time.waitingOwnerMs; // time the run sat on the owner
|
|
425
|
+
* ```
|
|
426
|
+
*/
|
|
427
|
+
export function computeTraceMetrics(root, events, options = {}) {
|
|
428
|
+
const stallMinutes = clampStallMinutes(options.stallMinutes ?? defaultStallMinutes());
|
|
429
|
+
const thresholdMs = stallMinutes * 60_000;
|
|
430
|
+
const now = (options.now ?? new Date()).getTime();
|
|
431
|
+
const timed = sortTraceEvents(events);
|
|
432
|
+
const rootAt = Date.parse(root.createdAt);
|
|
433
|
+
const firstAt = timed.length > 0 ? timed[0].t : Number.NaN;
|
|
434
|
+
const start = Number.isFinite(rootAt) ? (Number.isFinite(firstAt) ? Math.min(rootAt, firstAt) : rootAt) : Number.isFinite(firstAt) ? firstAt : now;
|
|
435
|
+
const end = Math.max(start, timed.length > 0 ? timed[timed.length - 1].t : start);
|
|
436
|
+
// --- Time ---------------------------------------------------------------
|
|
437
|
+
const busy = busyPeriods(timed);
|
|
438
|
+
const active = clip(busy.intervals, start, end);
|
|
439
|
+
const holds = collectHolds(timed, end);
|
|
440
|
+
const ownerHeld = clip(holds.owner.map((h) => [h.start, h.end]), start, end);
|
|
441
|
+
const agentHeld = clip(holds.agent.map((h) => [h.start, h.end]), start, end);
|
|
442
|
+
const activeMs = lengthOf(active);
|
|
443
|
+
const ownerOnly = subtractIntervals(ownerHeld, active);
|
|
444
|
+
const waitingOwnerMs = lengthOf(ownerOnly);
|
|
445
|
+
const waitingAgentMs = lengthOf(subtractIntervals(subtractIntervals(agentHeld, active), ownerHeld));
|
|
446
|
+
const wallMs = end - start;
|
|
447
|
+
const idleMs = Math.max(0, wallMs - activeMs - waitingOwnerMs - waitingAgentMs);
|
|
448
|
+
const activeSource = busy.explicit === 0 && busy.inferred === 0 ? 'none' : busy.explicit === 0 ? 'inferred' : busy.inferred === 0 ? 'turn_events' : 'mixed';
|
|
449
|
+
// --- Owner touches, rework, interventions, usage --------------------------
|
|
450
|
+
const touches = { answered: 0, approved: 0, sentBack: 0, corrected: 0, manual: 0 };
|
|
451
|
+
const rework = { sendBacks: 0, retries: 0, failedVerifications: 0, subagentSendBacks: 0 };
|
|
452
|
+
const interventions = { nudges: 0, redeliveries: 0, wakes: 0, corrections: 0, guardBlocks: 0, misroutes: 0 };
|
|
453
|
+
const touchTimes = [];
|
|
454
|
+
const touchEvents = [];
|
|
455
|
+
const ownerActions = [];
|
|
456
|
+
const approvalDecisions = new Set();
|
|
457
|
+
const rejectCounts = new Map();
|
|
458
|
+
const workItemType = new Map();
|
|
459
|
+
const retryCounts = new Map();
|
|
460
|
+
const recentOwnerMessages = [];
|
|
461
|
+
let agentSpoke = false;
|
|
462
|
+
const byAgent = new Map();
|
|
463
|
+
const byModel = new Map();
|
|
464
|
+
const agents = new Set();
|
|
465
|
+
let experiment;
|
|
466
|
+
const touch = (kind, t) => {
|
|
467
|
+
touches[kind] += 1;
|
|
468
|
+
touchTimes.push(t);
|
|
469
|
+
if (options.detail)
|
|
470
|
+
touchEvents.push({ kind, at: new Date(t).toISOString() });
|
|
471
|
+
agentSpoke = false;
|
|
472
|
+
};
|
|
473
|
+
const addUsage = (map, key, tokens, cost) => {
|
|
474
|
+
const row = map.get(key) ?? { key, inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, totalTokens: 0, costUsd: 0 };
|
|
475
|
+
row.inputTokens += tokens.input;
|
|
476
|
+
row.cachedInputTokens += tokens.cachedInput;
|
|
477
|
+
row.outputTokens += tokens.output;
|
|
478
|
+
row.totalTokens += tokens.total;
|
|
479
|
+
row.costUsd += cost;
|
|
480
|
+
map.set(key, row);
|
|
481
|
+
};
|
|
482
|
+
for (const { e, t } of timed) {
|
|
483
|
+
if (e.actor.kind === 'agent' && e.actor.session)
|
|
484
|
+
agents.add(e.actor.session);
|
|
485
|
+
switch (e.type) {
|
|
486
|
+
case 'message.outbound':
|
|
487
|
+
if (e.outcome === 'failed')
|
|
488
|
+
interventions.misroutes += 1;
|
|
489
|
+
else if (e.actor.kind === 'agent')
|
|
490
|
+
agentSpoke = true;
|
|
491
|
+
break;
|
|
492
|
+
case 'turn.delivered': {
|
|
493
|
+
if (e.refs.session && e.actor.kind !== 'owner')
|
|
494
|
+
agents.add(e.refs.session);
|
|
495
|
+
if (dataStr(e, 'kind') !== 'owner_message' || e.actor.kind !== 'owner')
|
|
496
|
+
break;
|
|
497
|
+
if (e.refs.session)
|
|
498
|
+
agents.add(e.refs.session);
|
|
499
|
+
const text = ownerMessageText(e);
|
|
500
|
+
const dup = recentOwnerMessages.some((m) => m.text === text && t - m.t <= TRACE_CONSTANTS.OWNER_MESSAGE_DEDUPE_MS);
|
|
501
|
+
recentOwnerMessages.push({ text, t });
|
|
502
|
+
if (dup || t - start <= TRACE_CONSTANTS.ROOT_GRACE_MS)
|
|
503
|
+
break;
|
|
504
|
+
touch(agentSpoke ? 'answered' : 'corrected', t);
|
|
505
|
+
break;
|
|
506
|
+
}
|
|
507
|
+
case 'decision.created': {
|
|
508
|
+
const kind = dataStr(e, 'kind');
|
|
509
|
+
if (e.refs.decisionId && (dataStr(e, 'sensitive') || (kind && APPROVAL_DECISION_KINDS.has(kind))))
|
|
510
|
+
approvalDecisions.add(e.refs.decisionId);
|
|
511
|
+
if (e.actor.kind === 'agent')
|
|
512
|
+
agentSpoke = true;
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
case 'decision.status': {
|
|
516
|
+
const to = dataStr(e, 'to');
|
|
517
|
+
if (e.actor.kind === 'owner' && (to === 'resolved' || to === 'skipped')) {
|
|
518
|
+
touch(e.refs.decisionId && approvalDecisions.has(e.refs.decisionId) ? 'approved' : 'answered', t);
|
|
519
|
+
}
|
|
520
|
+
break;
|
|
521
|
+
}
|
|
522
|
+
case 'request.created': {
|
|
523
|
+
if (e.refs.requestId)
|
|
524
|
+
rejectCounts.set(e.refs.requestId, 0);
|
|
525
|
+
break;
|
|
526
|
+
}
|
|
527
|
+
case 'request.status': {
|
|
528
|
+
const id = e.refs.requestId ?? 'request';
|
|
529
|
+
const from = dataStr(e, 'from');
|
|
530
|
+
const to = dataStr(e, 'to');
|
|
531
|
+
const accepted = dataStr(e, 'acceptedBy');
|
|
532
|
+
const prevRc = rejectCounts.get(id) ?? 0;
|
|
533
|
+
const rc = e.data && 'rejectCount' in e.data ? dataNum(e, 'rejectCount') : prevRc;
|
|
534
|
+
rejectCounts.set(id, Math.max(prevRc, rc));
|
|
535
|
+
if (to === 'done' && (accepted === 'owner' || (from === 'waiting_confirmation' && !accepted)))
|
|
536
|
+
touch('approved', t);
|
|
537
|
+
else if (rc > prevRc || (from === 'waiting_confirmation' && to && REQUEST_BACK_TO_WORK.has(to))) {
|
|
538
|
+
touch('sentBack', t);
|
|
539
|
+
rework.sendBacks += 1;
|
|
540
|
+
}
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
case 'workitem.created': {
|
|
544
|
+
if (e.refs.workItemId) {
|
|
545
|
+
workItemType.set(e.refs.workItemId, dataStr(e, 'type') ?? '');
|
|
546
|
+
retryCounts.set(e.refs.workItemId, 0);
|
|
547
|
+
}
|
|
548
|
+
break;
|
|
549
|
+
}
|
|
550
|
+
case 'workitem.status': {
|
|
551
|
+
const id = e.refs.workItemId ?? '';
|
|
552
|
+
const from = dataStr(e, 'from') ?? '';
|
|
553
|
+
const to = dataStr(e, 'to') ?? '';
|
|
554
|
+
const prevRetry = retryCounts.get(id) ?? 0;
|
|
555
|
+
const retry = e.data && 'retryCount' in e.data ? dataNum(e, 'retryCount') : prevRetry;
|
|
556
|
+
retryCounts.set(id, Math.max(prevRetry, retry));
|
|
557
|
+
if ((to === 'queued' && RETRY_FROM.has(from)) || retry > prevRetry)
|
|
558
|
+
rework.retries += 1;
|
|
559
|
+
if ((from === 'done_by_worker' && to === 'rejected') || (VERIFY_TYPES.has(workItemType.get(id) ?? '') && (to === 'failed' || to === 'rejected'))) {
|
|
560
|
+
rework.failedVerifications += 1;
|
|
561
|
+
}
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
case 'harness.subagent_sendback':
|
|
565
|
+
rework.subagentSendBacks += 1;
|
|
566
|
+
break;
|
|
567
|
+
case 'harness.nudge':
|
|
568
|
+
interventions.nudges += 1;
|
|
569
|
+
break;
|
|
570
|
+
case 'harness.redelivery':
|
|
571
|
+
interventions.redeliveries += 1;
|
|
572
|
+
break;
|
|
573
|
+
case 'harness.wake':
|
|
574
|
+
interventions.wakes += 1;
|
|
575
|
+
break;
|
|
576
|
+
case 'harness.correction':
|
|
577
|
+
interventions.corrections += 1;
|
|
578
|
+
break;
|
|
579
|
+
case 'guard.block':
|
|
580
|
+
interventions.guardBlocks += 1;
|
|
581
|
+
break;
|
|
582
|
+
case 'owner.action':
|
|
583
|
+
ownerActions.push(t);
|
|
584
|
+
break;
|
|
585
|
+
case 'usage': {
|
|
586
|
+
const u = usageOfEvent(e);
|
|
587
|
+
if (!u)
|
|
588
|
+
break;
|
|
589
|
+
addUsage(byAgent, sessionOfEvent(e) ?? 'unknown', u, u.costUsd);
|
|
590
|
+
addUsage(byModel, dataStr(e, 'model') ?? 'unknown', u, u.costUsd);
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
case 'experiment.event': {
|
|
594
|
+
const id = e.refs.experimentId ?? experiment?.id ?? '';
|
|
595
|
+
const ev = dataStr(e, 'event') ?? '';
|
|
596
|
+
experiment = { ...(experiment ?? {}), id };
|
|
597
|
+
if (ev === 'created' && !experiment.status)
|
|
598
|
+
experiment.status = 'planned';
|
|
599
|
+
if (ev === 'shipped' || ev === 'baseline_captured')
|
|
600
|
+
experiment.status = 'running';
|
|
601
|
+
if (ev === 'cancelled')
|
|
602
|
+
experiment.status = 'cancelled';
|
|
603
|
+
if (ev === 'measured') {
|
|
604
|
+
experiment.status = 'done';
|
|
605
|
+
const m = /measured: (worked|didnt|inconclusive)/.exec(e.summary);
|
|
606
|
+
if (m)
|
|
607
|
+
experiment.verdict = m[1];
|
|
608
|
+
}
|
|
609
|
+
break;
|
|
610
|
+
}
|
|
611
|
+
default:
|
|
612
|
+
break;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
// A dashboard write next to an owner touch is that touch.
|
|
616
|
+
touches.manual = ownerActions.filter((t) => !touchTimes.some((x) => Math.abs(x - t) <= TRACE_CONSTANTS.OWNER_ACTION_DEDUPE_MS)).length;
|
|
617
|
+
// --- Stalls --------------------------------------------------------------
|
|
618
|
+
const progress = timed.filter(({ e }) => isProgressEvent(e));
|
|
619
|
+
// Busy periods and progress instants, in order (overlaps are fine: the cursor only moves forward).
|
|
620
|
+
const covered = [...active, ...progress.map(({ t }) => [t, t])].sort((x, y) => x[0] - y[0]);
|
|
621
|
+
const gaps = [];
|
|
622
|
+
let cursor = start;
|
|
623
|
+
for (const [a, b] of covered) {
|
|
624
|
+
if (a - cursor > thresholdMs)
|
|
625
|
+
gaps.push([cursor, a]);
|
|
626
|
+
cursor = Math.max(cursor, b);
|
|
627
|
+
}
|
|
628
|
+
// A gap that runs to the window's end (no progress after it) can still be going on.
|
|
629
|
+
const trailing = end - cursor > thresholdMs;
|
|
630
|
+
if (trailing)
|
|
631
|
+
gaps.push([cursor, end]);
|
|
632
|
+
const openAtEnd = holdsAt(holds.owner, end).length > 0 || holdsAt(holds.agent, end).length > 0;
|
|
633
|
+
const stalls = gaps.map(([a, b]) => classifyStall(a, b, timed, progress, holds));
|
|
634
|
+
if (openAtEnd && now - end > 0) {
|
|
635
|
+
const last = stalls[stalls.length - 1];
|
|
636
|
+
if (trailing && last) {
|
|
637
|
+
last.end = new Date(now).toISOString();
|
|
638
|
+
last.ms = now - Date.parse(last.start);
|
|
639
|
+
last.ongoing = true;
|
|
640
|
+
}
|
|
641
|
+
else if (now - Math.max(cursor, end) > thresholdMs) {
|
|
642
|
+
const s = classifyStall(Math.max(cursor, end), now, timed, progress, holds);
|
|
643
|
+
s.ongoing = true;
|
|
644
|
+
stalls.push(s);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
const byCause = Object.fromEntries(STALL_CAUSES.map((c) => [c, 0]));
|
|
648
|
+
for (const s of stalls)
|
|
649
|
+
byCause[s.cause] += 1;
|
|
650
|
+
const kept = !options.detail && stalls.length > TRACE_CONSTANTS.METRICS_MAX_STALL_ITEMS
|
|
651
|
+
? [...stalls].sort((x, y) => y.ms - x.ms).slice(0, TRACE_CONSTANTS.METRICS_MAX_STALL_ITEMS).sort((x, y) => x.start.localeCompare(y.start))
|
|
652
|
+
: stalls;
|
|
653
|
+
// --- Outcome -------------------------------------------------------------
|
|
654
|
+
const wiStatuses = [...holds.workItemStatus.values()];
|
|
655
|
+
const workItems = {
|
|
656
|
+
total: wiStatuses.length,
|
|
657
|
+
done: wiStatuses.filter((s) => s === 'done' || s === 'verified' || s === 'done_by_worker').length,
|
|
658
|
+
failed: wiStatuses.filter((s) => s === 'failed' || s === 'rejected').length,
|
|
659
|
+
open: wiStatuses.filter((s) => !WORK_ITEM_CLOSED.has(s)).length,
|
|
660
|
+
};
|
|
661
|
+
const primaryRequest = root.refs.requestId && holds.requestStatus.has(root.refs.requestId) ? root.refs.requestId : [...holds.requestStatus.keys()][0];
|
|
662
|
+
const requestStatus = primaryRequest ? holds.requestStatus.get(primaryRequest) : undefined;
|
|
663
|
+
const state = outcomeState({ requestStatus, experiment, workItems, ownerOpen: holdsAt(holds.owner, end).length > 0, agentOpen: holdsAt(holds.agent, end).length > 0 });
|
|
664
|
+
const sortUsage = (map) => [...map.values()].map((r) => ({ ...r, costUsd: roundUsd(r.costUsd) })).sort((a, b) => b.costUsd - a.costUsd || b.totalTokens - a.totalTokens);
|
|
665
|
+
const agentRows = sortUsage(byAgent);
|
|
666
|
+
const sum = (k) => agentRows.reduce((s, r) => s + r[k], 0);
|
|
667
|
+
const total = (o) => Object.values(o).reduce((s, n) => s + n, 0);
|
|
668
|
+
return {
|
|
669
|
+
traceId: root.traceId,
|
|
670
|
+
window: { start: new Date(start).toISOString(), end: new Date(end).toISOString() },
|
|
671
|
+
eventCount: timed.length,
|
|
672
|
+
agents: [...agents].sort(),
|
|
673
|
+
time: { wallMs, activeMs, waitingOwnerMs, waitingAgentMs, idleMs, activeSource },
|
|
674
|
+
// `manual` is not collected yet (see TraceMetrics.ownerTouches): not in the total.
|
|
675
|
+
ownerTouches: { ...touches, total: touches.answered + touches.approved + touches.sentBack + touches.corrected },
|
|
676
|
+
rework: { ...rework, total: total(rework) },
|
|
677
|
+
stalls: { thresholdMinutes: stallMinutes, count: stalls.length, totalMs: stalls.reduce((s, x) => s + x.ms, 0), byCause, items: kept },
|
|
678
|
+
interventions: { ...interventions, total: total(interventions) },
|
|
679
|
+
usage: {
|
|
680
|
+
inputTokens: sum('inputTokens'),
|
|
681
|
+
cachedInputTokens: sum('cachedInputTokens'),
|
|
682
|
+
outputTokens: sum('outputTokens'),
|
|
683
|
+
totalTokens: sum('totalTokens'),
|
|
684
|
+
costUsd: roundUsd([...byAgent.values()].reduce((s, r) => s + r.costUsd, 0)),
|
|
685
|
+
byAgent: agentRows,
|
|
686
|
+
byModel: sortUsage(byModel),
|
|
687
|
+
},
|
|
688
|
+
outcome: {
|
|
689
|
+
state,
|
|
690
|
+
...(requestStatus ? { requestStatus } : {}),
|
|
691
|
+
workItems,
|
|
692
|
+
...(experiment ? { experiment } : {}),
|
|
693
|
+
},
|
|
694
|
+
...(options.detail ? { ownerTouchEvents: touchEvents } : {}),
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Round a dollar amount to 1/10 000 (sums of tiny per-turn costs).
|
|
699
|
+
*
|
|
700
|
+
* @param usd - Amount
|
|
701
|
+
* @returns Rounded amount
|
|
702
|
+
*/
|
|
703
|
+
function roundUsd(usd) {
|
|
704
|
+
return Math.round(usd * 10_000) / 10_000;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* The run's overall state.
|
|
708
|
+
*
|
|
709
|
+
* @param input - Request status, experiment, work items, open holds at the end
|
|
710
|
+
* @returns State
|
|
711
|
+
*/
|
|
712
|
+
function outcomeState(input) {
|
|
713
|
+
const { requestStatus, experiment, workItems } = input;
|
|
714
|
+
if (requestStatus === 'done')
|
|
715
|
+
return 'done';
|
|
716
|
+
if (requestStatus === 'cancelled')
|
|
717
|
+
return 'cancelled';
|
|
718
|
+
if (input.ownerOpen || requestStatus === 'waiting_confirmation')
|
|
719
|
+
return 'waiting_on_owner';
|
|
720
|
+
if (experiment?.status === 'done')
|
|
721
|
+
return 'done';
|
|
722
|
+
if (experiment?.status === 'cancelled')
|
|
723
|
+
return 'cancelled';
|
|
724
|
+
if (input.agentOpen || workItems.open > 0 || experiment?.status === 'running' || experiment?.status === 'planned')
|
|
725
|
+
return 'in_progress';
|
|
726
|
+
if (workItems.total > 0 && workItems.done > 0)
|
|
727
|
+
return 'done';
|
|
728
|
+
if (workItems.total > 0 && workItems.failed > 0)
|
|
729
|
+
return 'failed';
|
|
730
|
+
if (workItems.total > 0)
|
|
731
|
+
return 'cancelled';
|
|
732
|
+
return 'no_open_work';
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Give a stall its cause (the spec's table; first match wins).
|
|
736
|
+
*
|
|
737
|
+
* @param a - Stall start (ms)
|
|
738
|
+
* @param b - Stall end (ms)
|
|
739
|
+
* @param timed - All events, sorted
|
|
740
|
+
* @param progress - Progress events, sorted
|
|
741
|
+
* @param holds - Owner / agent holds
|
|
742
|
+
* @returns The stall
|
|
743
|
+
*/
|
|
744
|
+
function classifyStall(a, b, timed, progress, holds) {
|
|
745
|
+
const base = { start: new Date(a).toISOString(), end: new Date(b).toISOString(), ms: b - a };
|
|
746
|
+
const around = timed.filter(({ t }) => t >= a - TRACE_CONSTANTS.STALL_CAUSE_LOOKBACK_MS && t <= b).map(({ e }) => e);
|
|
747
|
+
const quota = around.find((e) => e.type === 'runtime.blocked' ||
|
|
748
|
+
(e.type === 'harness.nudge' && ['login', 'spend_cap'].includes(dataStr(e, 'reason') ?? '')) ||
|
|
749
|
+
(e.type === 'turn.error' && QUOTA_TEXT.test(e.summary)));
|
|
750
|
+
if (quota) {
|
|
751
|
+
const session = sessionOfEvent(quota);
|
|
752
|
+
return { ...base, cause: 'runtime_quota', detail: quota.summary, ...(session ? { sessions: [session] } : {}) };
|
|
753
|
+
}
|
|
754
|
+
const failed = around.find((e) => (e.type === 'message.outbound' || e.type === 'turn.delivered') && e.outcome === 'failed');
|
|
755
|
+
if (failed) {
|
|
756
|
+
const session = sessionOfEvent(failed);
|
|
757
|
+
return { ...base, cause: 'delivery_failure', detail: failed.summary, ...(session ? { sessions: [session] } : {}) };
|
|
758
|
+
}
|
|
759
|
+
const ownerHolds = holdsAt(holds.owner, a);
|
|
760
|
+
if (ownerHolds.length > 0)
|
|
761
|
+
return { ...base, cause: 'waiting_on_owner', detail: holdDetail(ownerHolds) };
|
|
762
|
+
const before = [...progress].reverse().find(({ t }) => t <= a);
|
|
763
|
+
const after = progress.find(({ t }) => t >= b);
|
|
764
|
+
if (before?.e.type === 'message.outbound' && before.e.actor.kind === 'agent' && after?.e.actor.kind === 'owner') {
|
|
765
|
+
return { ...base, cause: 'waiting_on_owner', detail: `${before.e.actor.session ?? 'An agent'} spoke to the owner; the owner answered after the gap` };
|
|
766
|
+
}
|
|
767
|
+
const agentHolds = holdsAt(holds.agent, a);
|
|
768
|
+
if (agentHolds.length > 0) {
|
|
769
|
+
const sessions = [...new Set(agentHolds.map((h) => h.session).filter((s) => !!s))];
|
|
770
|
+
return { ...base, cause: 'waiting_on_agent', detail: holdDetail(agentHolds), ...(sessions.length > 0 ? { sessions } : {}) };
|
|
771
|
+
}
|
|
772
|
+
return { ...base, cause: 'nobody_pushing', detail: 'Nothing was open and nobody was working' };
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* What held a stall, each distinct reason once ("×3" when repeated).
|
|
776
|
+
*
|
|
777
|
+
* @param holds - Holds open at the stall's start
|
|
778
|
+
* @returns One line
|
|
779
|
+
*/
|
|
780
|
+
function holdDetail(holds) {
|
|
781
|
+
const counts = new Map();
|
|
782
|
+
for (const h of holds)
|
|
783
|
+
counts.set(h.label, (counts.get(h.label) ?? 0) + 1);
|
|
784
|
+
return [...counts].map(([label, n]) => (n > 1 ? `${label} (×${n})` : label)).join('; ');
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* The numbers embedded in list rows.
|
|
788
|
+
*
|
|
789
|
+
* @param m - Full metrics
|
|
790
|
+
* @returns Summary
|
|
791
|
+
*/
|
|
792
|
+
export function summarizeTraceMetrics(m) {
|
|
793
|
+
return {
|
|
794
|
+
wallMs: m.time.wallMs,
|
|
795
|
+
activeMs: m.time.activeMs,
|
|
796
|
+
waitingOwnerMs: m.time.waitingOwnerMs,
|
|
797
|
+
waitingAgentMs: m.time.waitingAgentMs,
|
|
798
|
+
idleMs: m.time.idleMs,
|
|
799
|
+
ownerTouches: m.ownerTouches.total,
|
|
800
|
+
rework: m.rework.total,
|
|
801
|
+
stalls: m.stalls.count,
|
|
802
|
+
stallMs: m.stalls.totalMs,
|
|
803
|
+
ongoingStall: m.stalls.items.some((s) => s.ongoing === true),
|
|
804
|
+
interventions: m.interventions.total,
|
|
805
|
+
totalTokens: m.usage.totalTokens,
|
|
806
|
+
costUsd: m.usage.costUsd,
|
|
807
|
+
state: m.outcome.state,
|
|
808
|
+
};
|
|
809
|
+
}
|
|
810
|
+
//# sourceMappingURL=trace-metrics.js.map
|