crewly 1.20.193 → 1.20.195
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/roles/auditor/prompt.md +2 -2
- package/config/roles/orchestrator/fragments/communication.md +1 -1
- package/config/roles/orchestrator/prompt.md +15 -505
- package/config/skills/agent/computer-use/SKILL.md +6 -0
- package/config/skills/agent/core/experiment-card/SKILL.md +101 -0
- package/config/skills/agent/core/experiment-card/execute.sh +149 -0
- package/config/skills/agent/core/experiment-card/execute.test.sh +97 -0
- package/config/skills/agent/desktop-app-control/execute.sh +5 -2
- package/config/skills/orchestrator/send-message/execute.sh +19 -2
- package/config/skills/orchestrator/send-message/execute.test.sh +80 -0
- package/config/skills/registry.json +7 -5
- 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 +191 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +194 -1
- package/dist/backend/backend/src/constants.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 +6 -0
- 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/experiments/experiments.routes.d.ts +27 -0
- package/dist/backend/backend/src/controllers/experiments/experiments.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/experiments/experiments.routes.js +96 -0
- package/dist/backend/backend/src/controllers/experiments/experiments.routes.js.map +1 -0
- 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/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/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/trace/trace.controller.d.ts +47 -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 +169 -0
- package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +66 -20
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +14 -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 +6 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +3 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.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/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/canva/canva-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/canva/canva-token.service.js +5 -0
- package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +78 -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 +210 -26
- 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 +14 -3
- 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 +28 -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/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 +88 -0
- package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js +226 -0
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +350 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.js +908 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts +88 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js +162 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts +67 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js +133 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js +5 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.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/queue-processor.service.d.ts +11 -3
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +24 -7
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +5 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.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/orc/orc-status-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +12 -3
- 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/people/acting-for.service.d.ts +42 -5
- package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/people/acting-for.service.js +80 -5
- package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -1
- package/dist/backend/backend/src/services/people/grant-sharing.d.ts +5 -4
- package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -1
- package/dist/backend/backend/src/services/people/grant-sharing.js +12 -4
- package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -1
- package/dist/backend/backend/src/services/people/people-directory.service.d.ts +71 -13
- package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/people/people-directory.service.js +164 -27
- package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -1
- 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 +2 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket.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/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-bot-ids.d.ts +33 -0
- package/dist/backend/backend/src/services/slack/slack-bot-ids.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-bot-ids.js +56 -0
- package/dist/backend/backend/src/services/slack/slack-bot-ids.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +14 -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 +30 -10
- 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.service.d.ts +31 -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 +52 -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-context.service.d.ts +195 -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 +432 -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 +42 -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 +146 -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-recorder.d.ts +290 -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 +669 -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 +269 -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 +602 -0
- package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace.types.d.ts +118 -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 +85 -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.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/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/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +22 -2
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.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/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/experiment.types.d.ts +155 -0
- package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/experiment.types.js +32 -0
- package/dist/backend/backend/src/types/experiment.types.js.map +1 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts +6 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.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/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 +4 -0
- 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 +1 -0
- package/dist/backend/backend/src/types/v2/work-item.types.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/cli/backend/src/constants.d.ts +191 -1
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +194 -1
- 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 +6 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js +3 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.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-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 +185 -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 +558 -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 +14 -3
- 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 +28 -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/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/queue-processor.service.d.ts +11 -3
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +24 -7
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- 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/people/acting-for.service.d.ts +42 -5
- package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/people/acting-for.service.js +80 -5
- package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -1
- package/dist/cli/backend/src/services/people/people-directory.service.d.ts +71 -13
- package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/people/people-directory.service.js +164 -27
- package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -1
- 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 +2 -0
- package/dist/cli/backend/src/services/project-tickets/project-ticket.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-orchestrator-bridge.d.ts +14 -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 +30 -10
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +31 -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 +52 -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 +195 -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 +432 -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 +290 -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 +669 -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 +269 -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 +602 -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 +118 -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 +85 -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/messaging.types.d.ts +6 -0
- package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/messaging.types.js.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 +4 -0
- 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 +1 -0
- package/dist/cli/backend/src/types/v2/work-item.types.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/frontend/dist/assets/{index-465d1f8f.js → index-800118ca.js} +274 -274
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace context: which trace each agent session's turn is working on.
|
|
3
|
+
*
|
|
4
|
+
* Every message written into an agent turn passes through
|
|
5
|
+
* {@link TraceContext.noteTurnDelivery}. The trace of the text (a
|
|
6
|
+
* `[TRACE:…]` marker, a ticket marker, or a work item / decision / ticket id
|
|
7
|
+
* the index knows) becomes the session's current trace, and later events of
|
|
8
|
+
* that session (skill calls, replies, usage) are attributed to it.
|
|
9
|
+
*
|
|
10
|
+
* An owner message that names no trace is kept as a *pending root*: the trace
|
|
11
|
+
* is only created when the turn starts work ({@link TraceContext.ensureTraceForSession}),
|
|
12
|
+
* so chit-chat makes no trace.
|
|
13
|
+
*
|
|
14
|
+
* The current trace ends (so nothing later is billed to a finished run) when:
|
|
15
|
+
* - a delivery names no trace (cron / scheduled prompts, system notices,
|
|
16
|
+
* digests, an untraced owner message);
|
|
17
|
+
* - the session's work item in that trace reaches a terminal status
|
|
18
|
+
* ({@link TraceContext.clearIfCurrent});
|
|
19
|
+
* - the session shows no activity (deliveries, API calls) for the idle gap
|
|
20
|
+
* ({@link defaultIdleClearMs}).
|
|
21
|
+
*
|
|
22
|
+
* All state is in memory; a restart starts clean (new deliveries set it again).
|
|
23
|
+
*
|
|
24
|
+
* specs/2026-10-03-run-traces.md
|
|
25
|
+
*
|
|
26
|
+
* @module services/trace/trace-context.service
|
|
27
|
+
*/
|
|
28
|
+
import { TRACE_CONSTANTS } from '../../constants.js';
|
|
29
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
30
|
+
import { getTraceStore } from './trace-store.js';
|
|
31
|
+
import { cleanTraceData, extractTextRefs, parseTraceMarkers, safeSummary } from './trace-markers.js';
|
|
32
|
+
import { isTraceId, newTraceId, } from './trace.types.js';
|
|
33
|
+
/**
|
|
34
|
+
* Idle gap after which a session's current trace is dropped: the
|
|
35
|
+
* `CREWLY_TRACE_IDLE_CLEAR_MINUTES` env var, else
|
|
36
|
+
* {@link TRACE_CONSTANTS.IDLE_CLEAR_MS}.
|
|
37
|
+
*
|
|
38
|
+
* @returns Milliseconds
|
|
39
|
+
*/
|
|
40
|
+
export function defaultIdleClearMs() {
|
|
41
|
+
const minutes = Number(process.env.CREWLY_TRACE_IDLE_CLEAR_MINUTES);
|
|
42
|
+
return Number.isFinite(minutes) && minutes > 0 ? minutes * 60_000 : TRACE_CONSTANTS.IDLE_CLEAR_MS;
|
|
43
|
+
}
|
|
44
|
+
/** A `[CHAT:…]` / `[GCHAT:…]` routing prefix (owner or chat-routed message). */
|
|
45
|
+
const CHAT_PREFIX = /^\s*\[G?CHAT:[^\]]*\]/;
|
|
46
|
+
/**
|
|
47
|
+
* Classify a delivered text.
|
|
48
|
+
*
|
|
49
|
+
* @param text - Exactly what was written into the turn
|
|
50
|
+
* @returns The delivery kind
|
|
51
|
+
*/
|
|
52
|
+
export function classifyDelivery(text) {
|
|
53
|
+
if (/\[TASK RE-DELIVERY\]|\[CREWLY-DISPATCH\] \d+ WorkItems are still queued/.test(text))
|
|
54
|
+
return 'redelivery';
|
|
55
|
+
if (/\[CREWLY-DISPATCH\]|\[TASK ASSIGNMENT\]|^\s*\[TASK\]/.test(text))
|
|
56
|
+
return 'dispatch';
|
|
57
|
+
if (/Agent status:|Status from \S+ \(reports to you\)|\[STATUS DIGEST\]|\[STATUS REPORT\]/.test(text))
|
|
58
|
+
return 'status';
|
|
59
|
+
if (/\[DECISION\b/.test(text))
|
|
60
|
+
return 'decision';
|
|
61
|
+
if (/\[FOLLOW-UP\b/.test(text))
|
|
62
|
+
return 'follow_up';
|
|
63
|
+
if (/^\s*\[SYSTEM\b|\[EVENT:/.test(text))
|
|
64
|
+
return 'system';
|
|
65
|
+
if (CHAT_PREFIX.test(text))
|
|
66
|
+
return 'owner_message';
|
|
67
|
+
return 'system';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Per-session trace context. Singleton (see {@link getTraceContext}).
|
|
71
|
+
*/
|
|
72
|
+
export class TraceContext {
|
|
73
|
+
storeOf;
|
|
74
|
+
logger;
|
|
75
|
+
spans = new Map();
|
|
76
|
+
pending = new Map();
|
|
77
|
+
now;
|
|
78
|
+
idleClearMs;
|
|
79
|
+
/**
|
|
80
|
+
* @param storeOf - Store accessor (default: the process-wide store)
|
|
81
|
+
* @param now - Clock (ms)
|
|
82
|
+
* @param idleClearMs - Idle gap that ends a session's current trace (default {@link defaultIdleClearMs})
|
|
83
|
+
*/
|
|
84
|
+
constructor(storeOf = getTraceStore, now, idleClearMs) {
|
|
85
|
+
this.storeOf = storeOf;
|
|
86
|
+
this.logger = LoggerService.getInstance().createComponentLogger('TraceContext');
|
|
87
|
+
this.now = now ?? (() => Date.now());
|
|
88
|
+
this.idleClearMs = idleClearMs ?? defaultIdleClearMs();
|
|
89
|
+
}
|
|
90
|
+
/** The store. */
|
|
91
|
+
get store() {
|
|
92
|
+
return this.storeOf();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Start a trace and write its root event.
|
|
96
|
+
*
|
|
97
|
+
* @param input - Root kind, summary, actor, refs, optional session to bind
|
|
98
|
+
* @returns The new trace id, or null when the store refused it
|
|
99
|
+
*/
|
|
100
|
+
startTrace(input) {
|
|
101
|
+
try {
|
|
102
|
+
const at = input.now ?? new Date(this.now());
|
|
103
|
+
const traceId = newTraceId(at);
|
|
104
|
+
const ok = this.store.createRoot({
|
|
105
|
+
traceId,
|
|
106
|
+
kind: input.kind,
|
|
107
|
+
summary: safeSummary(input.summary) || input.kind,
|
|
108
|
+
createdAt: at.toISOString(),
|
|
109
|
+
actor: input.actor,
|
|
110
|
+
refs: input.refs ?? {},
|
|
111
|
+
});
|
|
112
|
+
if (!ok)
|
|
113
|
+
return null;
|
|
114
|
+
if (input.session)
|
|
115
|
+
this.setCurrent(input.session, traceId, at.getTime());
|
|
116
|
+
this.logger.debug('Trace started', { traceId, kind: input.kind, session: input.session });
|
|
117
|
+
return traceId;
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
this.logger.debug('Trace could not be started', { error: errText(err) });
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Append an event (summary cleaned, data trimmed). Never throws.
|
|
126
|
+
*
|
|
127
|
+
* @param input - The event
|
|
128
|
+
* @returns True when queued
|
|
129
|
+
*/
|
|
130
|
+
record(input) {
|
|
131
|
+
try {
|
|
132
|
+
if (!isTraceId(input.traceId))
|
|
133
|
+
return false;
|
|
134
|
+
const refs = {};
|
|
135
|
+
for (const [k, v] of Object.entries(input.refs ?? {})) {
|
|
136
|
+
if (typeof v === 'string' && v.length > 0)
|
|
137
|
+
refs[k] = v;
|
|
138
|
+
}
|
|
139
|
+
const data = cleanTraceData(input.data);
|
|
140
|
+
const event = {
|
|
141
|
+
ts: (input.at ?? new Date(this.now())).toISOString(),
|
|
142
|
+
traceId: input.traceId,
|
|
143
|
+
type: input.type,
|
|
144
|
+
actor: input.actor,
|
|
145
|
+
refs,
|
|
146
|
+
summary: safeSummary(input.summary),
|
|
147
|
+
outcome: input.outcome ?? 'info',
|
|
148
|
+
...(data ? { data } : {}),
|
|
149
|
+
};
|
|
150
|
+
return this.store.append(event);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
this.logger.debug('Trace event dropped', { type: input.type, error: errText(err) });
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The trace the session's turn is working on now.
|
|
159
|
+
*
|
|
160
|
+
* @param session - Agent session
|
|
161
|
+
* @returns Trace id, or null
|
|
162
|
+
*/
|
|
163
|
+
currentTrace(session) {
|
|
164
|
+
if (!session)
|
|
165
|
+
return null;
|
|
166
|
+
const last = this.expireIfIdle(session);
|
|
167
|
+
if (!last?.traceId)
|
|
168
|
+
return null;
|
|
169
|
+
return this.store.has(last.traceId) ? last.traceId : null;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The session did something (an API call, a delivery): keep its current
|
|
173
|
+
* trace alive. A trace already past the idle gap is ended first, so a
|
|
174
|
+
* session coming back after a long pause does not revive it.
|
|
175
|
+
*
|
|
176
|
+
* @param session - Agent session
|
|
177
|
+
* @param at - When (ms)
|
|
178
|
+
*/
|
|
179
|
+
touch(session, at = this.now()) {
|
|
180
|
+
if (!session)
|
|
181
|
+
return;
|
|
182
|
+
const last = this.expireIfIdle(session, at);
|
|
183
|
+
if (last?.traceId && at > last.lastActive)
|
|
184
|
+
last.lastActive = at;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* End the session's current trace if it is this one (its work item
|
|
188
|
+
* reached a terminal status).
|
|
189
|
+
*
|
|
190
|
+
* @param session - Agent session
|
|
191
|
+
* @param traceId - The trace that finished for it
|
|
192
|
+
* @returns True when it was cleared
|
|
193
|
+
*/
|
|
194
|
+
clearIfCurrent(session, traceId) {
|
|
195
|
+
if (!session || !traceId)
|
|
196
|
+
return false;
|
|
197
|
+
const spans = this.spans.get(session);
|
|
198
|
+
const last = spans?.[spans.length - 1];
|
|
199
|
+
if (last?.traceId !== traceId)
|
|
200
|
+
return false;
|
|
201
|
+
this.setCurrent(session, null);
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The session's last span, after ending it when the session has been idle
|
|
206
|
+
* longer than the idle gap (a null span then starts where the gap ended).
|
|
207
|
+
*
|
|
208
|
+
* @param session - Agent session
|
|
209
|
+
* @param at - Now (ms)
|
|
210
|
+
* @returns The last span after the check, or undefined
|
|
211
|
+
*/
|
|
212
|
+
expireIfIdle(session, at = this.now()) {
|
|
213
|
+
const spans = this.spans.get(session);
|
|
214
|
+
const last = spans?.[spans.length - 1];
|
|
215
|
+
if (!spans || !last?.traceId || at - last.lastActive <= this.idleClearMs)
|
|
216
|
+
return last;
|
|
217
|
+
const since = last.lastActive + this.idleClearMs;
|
|
218
|
+
spans.push({ since, traceId: null, lastActive: since });
|
|
219
|
+
while (spans.length > TRACE_CONSTANTS.SESSION_HISTORY_SPANS)
|
|
220
|
+
spans.shift();
|
|
221
|
+
return spans[spans.length - 1];
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* The trace the session was working on at a given time (usage entries are
|
|
225
|
+
* often recorded after the turn, e.g. by the Claude transcript sync).
|
|
226
|
+
*
|
|
227
|
+
* @param session - Agent session
|
|
228
|
+
* @param at - Time of the entry (ms); default now
|
|
229
|
+
* @returns Trace id, or null
|
|
230
|
+
*/
|
|
231
|
+
traceAt(session, at) {
|
|
232
|
+
if (!session)
|
|
233
|
+
return null;
|
|
234
|
+
const spans = this.spans.get(session);
|
|
235
|
+
if (!spans || spans.length === 0)
|
|
236
|
+
return null;
|
|
237
|
+
const t = at ?? this.now();
|
|
238
|
+
for (let i = spans.length - 1; i >= 0; i--) {
|
|
239
|
+
if (spans[i].since <= t) {
|
|
240
|
+
const id = spans[i].traceId;
|
|
241
|
+
// Past the idle gap of that span: the session had stopped working on it.
|
|
242
|
+
if (id && t - spans[i].lastActive > this.idleClearMs)
|
|
243
|
+
return null;
|
|
244
|
+
return id && this.store.has(id) ? id : null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Set (or clear) the session's current trace.
|
|
251
|
+
*
|
|
252
|
+
* @param session - Agent session
|
|
253
|
+
* @param traceId - Trace, or null for none
|
|
254
|
+
* @param at - Since when (ms)
|
|
255
|
+
*/
|
|
256
|
+
setCurrent(session, traceId, at = this.now()) {
|
|
257
|
+
const spans = this.spans.get(session) ?? [];
|
|
258
|
+
const last = spans[spans.length - 1];
|
|
259
|
+
if (last && last.traceId === traceId) {
|
|
260
|
+
if (at > last.lastActive)
|
|
261
|
+
last.lastActive = at;
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
spans.push({ since: at, traceId, lastActive: at });
|
|
265
|
+
while (spans.length > TRACE_CONSTANTS.SESSION_HISTORY_SPANS)
|
|
266
|
+
spans.shift();
|
|
267
|
+
this.spans.set(session, spans);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* The session's current trace; when it has none but an owner message is
|
|
271
|
+
* waiting, that message becomes the root of a new trace now (the turn is
|
|
272
|
+
* starting work).
|
|
273
|
+
*
|
|
274
|
+
* @param session - Agent session
|
|
275
|
+
* @returns Trace id, or null
|
|
276
|
+
*/
|
|
277
|
+
ensureTraceForSession(session) {
|
|
278
|
+
if (!session)
|
|
279
|
+
return null;
|
|
280
|
+
const current = this.currentTrace(session);
|
|
281
|
+
if (current)
|
|
282
|
+
return current;
|
|
283
|
+
const pending = this.pending.get(session);
|
|
284
|
+
if (!pending)
|
|
285
|
+
return null;
|
|
286
|
+
this.pending.delete(session);
|
|
287
|
+
if (this.now() - pending.at > TRACE_CONSTANTS.PENDING_ROOT_TTL_MS)
|
|
288
|
+
return null;
|
|
289
|
+
const traceId = this.startTrace({
|
|
290
|
+
kind: 'owner_message',
|
|
291
|
+
summary: pending.summary,
|
|
292
|
+
actor: { kind: 'owner' },
|
|
293
|
+
refs: { session },
|
|
294
|
+
now: new Date(pending.at),
|
|
295
|
+
});
|
|
296
|
+
if (!traceId)
|
|
297
|
+
return null;
|
|
298
|
+
this.record({
|
|
299
|
+
traceId,
|
|
300
|
+
type: 'turn.delivered',
|
|
301
|
+
actor: { kind: 'owner' },
|
|
302
|
+
summary: `Owner message delivered to ${session}: ${pending.summary}`,
|
|
303
|
+
refs: { session },
|
|
304
|
+
data: { kind: 'owner_message' },
|
|
305
|
+
at: new Date(pending.at),
|
|
306
|
+
});
|
|
307
|
+
this.setCurrent(session, traceId);
|
|
308
|
+
return traceId;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Traces a text refers to: `[TRACE:…]` markers win; otherwise ticket
|
|
312
|
+
* markers, then work item / decision / ticket ids the index knows.
|
|
313
|
+
*
|
|
314
|
+
* @param text - Any text
|
|
315
|
+
* @returns Trace ids, in order, de-duplicated
|
|
316
|
+
*/
|
|
317
|
+
resolveTracesFromText(text) {
|
|
318
|
+
const store = this.store;
|
|
319
|
+
const markers = parseTraceMarkers(text).filter((id) => store.has(id));
|
|
320
|
+
if (markers.length > 0)
|
|
321
|
+
return markers;
|
|
322
|
+
const refs = extractTextRefs(text);
|
|
323
|
+
const out = [];
|
|
324
|
+
const add = (id) => {
|
|
325
|
+
if (id && !out.includes(id))
|
|
326
|
+
out.push(id);
|
|
327
|
+
};
|
|
328
|
+
for (const id of refs.requestIds)
|
|
329
|
+
add(store.traceByRef('request', id));
|
|
330
|
+
for (const id of refs.workItemIds)
|
|
331
|
+
add(store.traceByRef('workItem', id));
|
|
332
|
+
for (const id of refs.decisionIds)
|
|
333
|
+
add(store.traceByRef('decision', id));
|
|
334
|
+
for (const id of refs.ticketIds)
|
|
335
|
+
add(store.traceByRef('ticket', id));
|
|
336
|
+
return out;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* A message was written into an agent's turn. Sets the session's current
|
|
340
|
+
* trace and records `turn.delivered` (see the module doc). Never throws.
|
|
341
|
+
*
|
|
342
|
+
* @param session - Agent session written to
|
|
343
|
+
* @param text - Exactly what was delivered
|
|
344
|
+
* @param runtime - `pty` or `in-process`
|
|
345
|
+
* @returns The trace the turn is now on, or null
|
|
346
|
+
*/
|
|
347
|
+
noteTurnDelivery(session, text, runtime = 'pty') {
|
|
348
|
+
try {
|
|
349
|
+
if (!session || typeof text !== 'string' || text.length === 0)
|
|
350
|
+
return null;
|
|
351
|
+
const kind = classifyDelivery(text);
|
|
352
|
+
const traces = this.resolveTracesFromText(text);
|
|
353
|
+
const now = this.now();
|
|
354
|
+
if (traces.length === 0) {
|
|
355
|
+
// Nothing in the text names a run. An owner message may start one
|
|
356
|
+
// (pending root); anything else — a cron / scheduled prompt, a system
|
|
357
|
+
// notice, a digest — is not part of the run the session was on, so
|
|
358
|
+
// later calls and usage must not be billed to it.
|
|
359
|
+
this.setCurrent(session, null, now);
|
|
360
|
+
if (kind === 'owner_message')
|
|
361
|
+
this.pending.set(session, { summary: safeSummary(text), at: now });
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
const current = this.currentTrace(session);
|
|
365
|
+
const next = current && traces.includes(current) ? current : traces[0];
|
|
366
|
+
this.setCurrent(session, next, now);
|
|
367
|
+
this.pending.delete(session);
|
|
368
|
+
const actor = kind === 'owner_message' ? { kind: 'owner' } : { kind: 'system' };
|
|
369
|
+
for (const traceId of traces) {
|
|
370
|
+
this.record({
|
|
371
|
+
traceId,
|
|
372
|
+
type: 'turn.delivered',
|
|
373
|
+
actor,
|
|
374
|
+
summary: `${DELIVERY_LABELS[kind]} delivered to ${session}: ${text}`,
|
|
375
|
+
refs: { session },
|
|
376
|
+
data: { kind, runtime },
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
return next;
|
|
380
|
+
}
|
|
381
|
+
catch (err) {
|
|
382
|
+
this.logger.debug('Turn delivery not traced', { session, error: errText(err) });
|
|
383
|
+
return null;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Forget everything (tests).
|
|
388
|
+
*/
|
|
389
|
+
reset() {
|
|
390
|
+
this.spans.clear();
|
|
391
|
+
this.pending.clear();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/** Human labels of delivery kinds (summaries). */
|
|
395
|
+
const DELIVERY_LABELS = {
|
|
396
|
+
owner_message: 'Owner message',
|
|
397
|
+
dispatch: 'Work item brief',
|
|
398
|
+
redelivery: 'Work item redelivery',
|
|
399
|
+
status: 'Status report',
|
|
400
|
+
decision: 'Decision answer',
|
|
401
|
+
follow_up: 'Follow-up',
|
|
402
|
+
system: 'System message',
|
|
403
|
+
};
|
|
404
|
+
/**
|
|
405
|
+
* Error text.
|
|
406
|
+
*
|
|
407
|
+
* @param err - Anything thrown
|
|
408
|
+
* @returns Message
|
|
409
|
+
*/
|
|
410
|
+
function errText(err) {
|
|
411
|
+
return err instanceof Error ? err.message : String(err);
|
|
412
|
+
}
|
|
413
|
+
let instance = null;
|
|
414
|
+
/**
|
|
415
|
+
* The process-wide trace context.
|
|
416
|
+
*
|
|
417
|
+
* @returns The context (created on first use)
|
|
418
|
+
*/
|
|
419
|
+
export function getTraceContext() {
|
|
420
|
+
if (!instance)
|
|
421
|
+
instance = new TraceContext();
|
|
422
|
+
return instance;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Replace the process-wide context (tests).
|
|
426
|
+
*
|
|
427
|
+
* @param context - Context, or null to rebuild the default lazily
|
|
428
|
+
*/
|
|
429
|
+
export function setTraceContextForTesting(context) {
|
|
430
|
+
instance = context;
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=trace-context.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-context.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/trace/trace-context.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,aAAa,EAAmB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EACN,SAAS,EACT,UAAU,GAOV,MAAM,kBAAkB,CAAC;AAiD1B;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC;AACnG,CAAC;AAED,gFAAgF;AAChF,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,IAAI,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9G,IAAI,sDAAsD,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IACzF,IAAI,sFAAsF,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvH,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC;IACnD,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1D,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,eAAe,CAAC;IACnD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IAaN;IAZD,MAAM,CAAkB;IACxB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IACzC,GAAG,CAAe;IAClB,WAAW,CAAS;IAErC;;;;OAIG;IACH,YACkB,UAA4B,aAAa,EAC1D,GAAkB,EAClB,WAAoB;QAFH,YAAO,GAAP,OAAO,CAAkC;QAI1D,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAChF,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,kBAAkB,EAAE,CAAC;IACxD,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,KAAsB;QAChC,IAAI,CAAC;YACJ,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBAChC,OAAO;gBACP,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI;gBACjD,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACrB,IAAI,KAAK,CAAC,OAAO;gBAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1F,OAAO,OAAO,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAkB;QACxB,IAAI,CAAC;YACJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC5C,MAAM,IAAI,GAAc,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gBACvD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;oBAAG,IAA+B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,KAAK,GAAe;gBACzB,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;gBACpD,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI;gBACJ,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;gBACnC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,MAAM;gBAChC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzB,CAAC;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpF,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,OAAkC;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,OAAO;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,OAAkC,EAAE,KAAa,IAAI,CAAC,GAAG,EAAE;QAChE,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACjE,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,OAAkC,EAAE,OAAkC;QACpF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,OAAO,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACK,YAAY,CAAC,OAAe,EAAE,KAAa,IAAI,CAAC,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,qBAAqB;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,OAAkC,EAAE,EAAW;QACtD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC5B,yEAAyE;gBACzE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;oBAAE,OAAO,IAAI,CAAC;gBAClE,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7C,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,OAAe,EAAE,OAAsB,EAAE,KAAa,IAAI,CAAC,GAAG,EAAE;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACtC,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YAC/C,OAAO;QACR,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,qBAAqB;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;OAOG;IACH,qBAAqB,CAAC,OAAkC;QACvD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;YAC/B,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YACxB,IAAI,EAAE,EAAE,OAAO,EAAE;YACjB,GAAG,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC;YACX,OAAO;YACP,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YACxB,OAAO,EAAE,8BAA8B,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;YACpE,IAAI,EAAE,EAAE,OAAO,EAAE;YACjB,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;YAC/B,EAAE,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB,CAAC,IAAY;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;QACvC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,EAAiB,EAAQ,EAAE;YACvC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU;YAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW;YAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW;YAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS;YAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,GAAG,CAAC;IACZ,CAAC;IAED;;;;;;;;OAQG;IACH,gBAAgB,CAAC,OAAe,EAAE,IAAY,EAAE,UAAkB,KAAK;QACtE,IAAI,CAAC;YACJ,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3E,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,kEAAkE;gBAClE,sEAAsE;gBACtE,mEAAmE;gBACnE,kDAAkD;gBAClD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBACpC,IAAI,IAAI,KAAK,eAAe;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBACjG,OAAO,IAAI,CAAC;YACb,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAe,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC5F,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC;oBACX,OAAO;oBACP,IAAI,EAAE,gBAAgB;oBACtB,KAAK;oBACL,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,iBAAiB,OAAO,KAAK,IAAI,EAAE;oBACpE,IAAI,EAAE,EAAE,OAAO,EAAE;oBACjB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;iBACvB,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACD;AAED,kDAAkD;AAClD,MAAM,eAAe,GAAiC;IACrD,aAAa,EAAE,eAAe;IAC9B,QAAQ,EAAE,iBAAiB;IAC3B,UAAU,EAAE,sBAAsB;IAClC,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,gBAAgB;CACxB,CAAC;AAEF;;;;;GAKG;AACH,SAAS,OAAO,CAAC,GAAY;IAC5B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,IAAI,QAAQ,GAAwB,IAAI,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC9B,IAAI,CAAC,QAAQ;QAAE,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IAC7C,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAA4B;IACrE,QAAQ,GAAG,OAAO,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run trace HTTP middleware (mounted first in `createApiRoutes`).
|
|
3
|
+
*
|
|
4
|
+
* - **Skill calls.** Skills call the backend with `X-Agent-Session`. When that
|
|
5
|
+
* session's turn has a trace, the call is recorded on `finish`:
|
|
6
|
+
* `skill.call` (2xx/3xx), `guard.block` (403/409/423/429) or `error`
|
|
7
|
+
* (other 4xx/5xx), with `refs.skill = "<METHOD> <path>"` and the response's
|
|
8
|
+
* `error` text. No skill sends anything extra.
|
|
9
|
+
* - **Agent → agent.** A message-mode write to `/terminal/:to/write|deliver`
|
|
10
|
+
* from an agent session gets the sender's `[TRACE:…]` appended, so the
|
|
11
|
+
* receiving turn joins the trace however the message is queued. The marker
|
|
12
|
+
* is skipped when it would push the text over the terminal input limit.
|
|
13
|
+
* - **Activity.** Every agent call keeps the session's trace from ending on
|
|
14
|
+
* the idle gap.
|
|
15
|
+
*
|
|
16
|
+
* Never fails a request: every step is wrapped.
|
|
17
|
+
*
|
|
18
|
+
* specs/2026-10-03-run-traces.md
|
|
19
|
+
*
|
|
20
|
+
* @module services/trace/trace-http.middleware
|
|
21
|
+
*/
|
|
22
|
+
import type { NextFunction, Request, Response } from 'express';
|
|
23
|
+
import type { TraceEventType, TraceOutcome } from './trace.types.js';
|
|
24
|
+
/**
|
|
25
|
+
* Event type and outcome for a response status.
|
|
26
|
+
*
|
|
27
|
+
* @param status - HTTP status
|
|
28
|
+
* @returns Type and outcome
|
|
29
|
+
*/
|
|
30
|
+
export declare function classifySkillStatus(status: number): {
|
|
31
|
+
type: TraceEventType;
|
|
32
|
+
outcome: TraceOutcome;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Express middleware; see the module doc.
|
|
36
|
+
*
|
|
37
|
+
* @param req - Request
|
|
38
|
+
* @param res - Response
|
|
39
|
+
* @param next - Next handler
|
|
40
|
+
*/
|
|
41
|
+
export declare function traceHttpMiddleware(req: Request, res: Response, next: NextFunction): void;
|
|
42
|
+
//# sourceMappingURL=trace-http.middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-http.middleware.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/trace/trace-http.middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAM/D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAuCrE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAInG;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAsDzF"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run trace HTTP middleware (mounted first in `createApiRoutes`).
|
|
3
|
+
*
|
|
4
|
+
* - **Skill calls.** Skills call the backend with `X-Agent-Session`. When that
|
|
5
|
+
* session's turn has a trace, the call is recorded on `finish`:
|
|
6
|
+
* `skill.call` (2xx/3xx), `guard.block` (403/409/423/429) or `error`
|
|
7
|
+
* (other 4xx/5xx), with `refs.skill = "<METHOD> <path>"` and the response's
|
|
8
|
+
* `error` text. No skill sends anything extra.
|
|
9
|
+
* - **Agent → agent.** A message-mode write to `/terminal/:to/write|deliver`
|
|
10
|
+
* from an agent session gets the sender's `[TRACE:…]` appended, so the
|
|
11
|
+
* receiving turn joins the trace however the message is queued. The marker
|
|
12
|
+
* is skipped when it would push the text over the terminal input limit.
|
|
13
|
+
* - **Activity.** Every agent call keeps the session's trace from ending on
|
|
14
|
+
* the idle gap.
|
|
15
|
+
*
|
|
16
|
+
* Never fails a request: every step is wrapped.
|
|
17
|
+
*
|
|
18
|
+
* specs/2026-10-03-run-traces.md
|
|
19
|
+
*
|
|
20
|
+
* @module services/trace/trace-http.middleware
|
|
21
|
+
*/
|
|
22
|
+
import { TRACE_CONSTANTS } from '../../constants.js';
|
|
23
|
+
import { readAgentSessionHeader } from '../../utils/agent-caller.utils.js';
|
|
24
|
+
import { getTraceContext } from './trace-context.service.js';
|
|
25
|
+
import { skillLabel } from './trace-markers.js';
|
|
26
|
+
import { carryAgentMessageTrace } from './trace-recorder.js';
|
|
27
|
+
/** `/terminal/<session>/write|deliver` relative to /api. */
|
|
28
|
+
const TERMINAL_MESSAGE_PATH = /^\/terminal\/([^/]+)\/(write|deliver)\/?$/;
|
|
29
|
+
/**
|
|
30
|
+
* Path of the request relative to `/api` (works mounted at `/api` or below).
|
|
31
|
+
*
|
|
32
|
+
* @param req - Request
|
|
33
|
+
* @returns e.g. `/task-pool/add`
|
|
34
|
+
*/
|
|
35
|
+
function apiPath(req) {
|
|
36
|
+
const full = (req.originalUrl || req.url || '').split('?')[0];
|
|
37
|
+
const idx = full.indexOf('/api/');
|
|
38
|
+
return idx >= 0 ? full.slice(idx + '/api'.length) : full;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Append the sender's trace to an agent → agent message body.
|
|
42
|
+
*
|
|
43
|
+
* @param req - Request (body mutated)
|
|
44
|
+
* @param sender - Calling agent session
|
|
45
|
+
* @param path - Path relative to /api
|
|
46
|
+
*/
|
|
47
|
+
function carryAgentMessage(req, sender, path) {
|
|
48
|
+
if (req.method !== 'POST')
|
|
49
|
+
return;
|
|
50
|
+
const m = TERMINAL_MESSAGE_PATH.exec(path);
|
|
51
|
+
if (!m)
|
|
52
|
+
return;
|
|
53
|
+
const target = decodeURIComponent(m[1]);
|
|
54
|
+
const body = req.body;
|
|
55
|
+
if (!body || typeof body !== 'object')
|
|
56
|
+
return;
|
|
57
|
+
if (m[2] === 'write') {
|
|
58
|
+
if (body.mode !== 'message' || typeof body.data !== 'string')
|
|
59
|
+
return;
|
|
60
|
+
body.data = carryAgentMessageTrace(sender, target, body.data);
|
|
61
|
+
}
|
|
62
|
+
else if (typeof body.message === 'string') {
|
|
63
|
+
body.message = carryAgentMessageTrace(sender, target, body.message);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Event type and outcome for a response status.
|
|
68
|
+
*
|
|
69
|
+
* @param status - HTTP status
|
|
70
|
+
* @returns Type and outcome
|
|
71
|
+
*/
|
|
72
|
+
export function classifySkillStatus(status) {
|
|
73
|
+
if (status < 400)
|
|
74
|
+
return { type: 'skill.call', outcome: status === 202 ? 'queued' : 'ok' };
|
|
75
|
+
if (TRACE_CONSTANTS.GUARD_BLOCK_STATUSES.includes(status))
|
|
76
|
+
return { type: 'guard.block', outcome: 'blocked' };
|
|
77
|
+
return { type: 'error', outcome: 'failed' };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Express middleware; see the module doc.
|
|
81
|
+
*
|
|
82
|
+
* @param req - Request
|
|
83
|
+
* @param res - Response
|
|
84
|
+
* @param next - Next handler
|
|
85
|
+
*/
|
|
86
|
+
export function traceHttpMiddleware(req, res, next) {
|
|
87
|
+
try {
|
|
88
|
+
const session = readAgentSessionHeader(req);
|
|
89
|
+
if (!session) {
|
|
90
|
+
next();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const path = apiPath(req);
|
|
94
|
+
// Any agent API call (hooks included) shows the session is still working,
|
|
95
|
+
// which keeps its current trace from ending on the idle gap.
|
|
96
|
+
getTraceContext().touch(session);
|
|
97
|
+
carryAgentMessage(req, session, path);
|
|
98
|
+
if (TRACE_CONSTANTS.SKIPPED_SKILL_PATH_PREFIXES.some((p) => path === p || path.startsWith(`${p}/`))) {
|
|
99
|
+
next();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const ctx = getTraceContext();
|
|
103
|
+
const skill = skillLabel(req.method, path);
|
|
104
|
+
let errorText;
|
|
105
|
+
const originalJson = res.json.bind(res);
|
|
106
|
+
res.json = ((body) => {
|
|
107
|
+
try {
|
|
108
|
+
const err = body?.error;
|
|
109
|
+
if (typeof err === 'string')
|
|
110
|
+
errorText = err;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Reading the body is best-effort.
|
|
114
|
+
}
|
|
115
|
+
return originalJson(body);
|
|
116
|
+
});
|
|
117
|
+
const startedAt = Date.now();
|
|
118
|
+
res.once('finish', () => {
|
|
119
|
+
try {
|
|
120
|
+
// Looked up at the end: the call itself may have started the trace
|
|
121
|
+
// (a delegation materialises a pending owner-message root).
|
|
122
|
+
const traceId = ctx.currentTrace(session);
|
|
123
|
+
if (!traceId)
|
|
124
|
+
return;
|
|
125
|
+
const { type, outcome } = classifySkillStatus(res.statusCode);
|
|
126
|
+
ctx.record({
|
|
127
|
+
traceId,
|
|
128
|
+
type,
|
|
129
|
+
actor: { kind: 'agent', session },
|
|
130
|
+
summary: type === 'skill.call' ? `${session} called ${skill}` : `${session} ${type === 'guard.block' ? 'was refused' : 'failed'} ${skill}: ${errorText ?? `HTTP ${res.statusCode}`}`,
|
|
131
|
+
outcome,
|
|
132
|
+
refs: { skill, session },
|
|
133
|
+
data: { status: res.statusCode, ms: Date.now() - startedAt },
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Recording is best-effort.
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Tracing never fails a request.
|
|
143
|
+
}
|
|
144
|
+
next();
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=trace-http.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-http.middleware.js","sourceRoot":"","sources":["../../../../../../backend/src/services/trace/trace-http.middleware.ts"],"names":[],"mappings":"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"}
|