@probelabs/visor 0.1.186 → 0.1.187
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/defaults/assistant.yaml +31 -0
- package/defaults/code-talk.yaml +32 -0
- package/defaults/skills/code-explorer.yaml +6 -0
- package/dist/action-cli-bridge.d.ts.map +1 -1
- package/dist/agent-protocol/a2a-frontend.d.ts.map +1 -1
- package/dist/agent-protocol/index.d.ts.map +1 -1
- package/dist/agent-protocol/push-notification-manager.d.ts.map +1 -1
- package/dist/agent-protocol/state-transitions.d.ts.map +1 -1
- package/dist/agent-protocol/task-evaluator.d.ts.map +1 -1
- package/dist/agent-protocol/task-live-update-slack.d.ts +10 -0
- package/dist/agent-protocol/task-live-update-slack.d.ts.map +1 -1
- package/dist/agent-protocol/task-live-update-teams.d.ts.map +1 -1
- package/dist/agent-protocol/task-live-update-telegram.d.ts.map +1 -1
- package/dist/agent-protocol/task-live-updates.d.ts +10 -0
- package/dist/agent-protocol/task-live-updates.d.ts.map +1 -1
- package/dist/agent-protocol/task-progress-tool.d.ts.map +1 -1
- package/dist/agent-protocol/task-queue.d.ts.map +1 -1
- package/dist/agent-protocol/task-store.d.ts.map +1 -1
- package/dist/agent-protocol/task-stream-manager.d.ts.map +1 -1
- package/dist/agent-protocol/task-trace-resolution.d.ts.map +1 -1
- package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
- package/dist/agent-protocol/tasks-tui.d.ts.map +1 -1
- package/dist/agent-protocol/trace-serializer.d.ts +43 -1
- package/dist/agent-protocol/trace-serializer.d.ts.map +1 -1
- package/dist/agent-protocol/track-execution.d.ts.map +1 -1
- package/dist/agent-protocol/types.d.ts.map +1 -1
- package/dist/ai-review-service.d.ts +22 -1
- package/dist/ai-review-service.d.ts.map +1 -1
- package/dist/check-execution-engine.d.ts.map +1 -1
- package/dist/cli-main.d.ts +1 -0
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/config/cli-handler.d.ts.map +1 -1
- package/dist/config/config-reloader.d.ts.map +1 -1
- package/dist/config/config-snapshot-store.d.ts.map +1 -1
- package/dist/config/config-watcher.d.ts.map +1 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/cron-scheduler.d.ts.map +1 -1
- package/dist/debug-visualizer/debug-span-exporter.d.ts.map +1 -1
- package/dist/debug-visualizer/trace-reader.d.ts.map +1 -1
- package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
- package/dist/defaults/assistant.yaml +31 -0
- package/dist/defaults/code-talk.yaml +32 -0
- package/dist/defaults/skills/code-explorer.yaml +6 -0
- package/dist/dependency-resolver.d.ts.map +1 -1
- package/dist/docs/telemetry-setup.md +18 -2
- package/dist/email/adapter.d.ts.map +1 -1
- package/dist/email/client.d.ts.map +1 -1
- package/dist/email/markdown.d.ts.map +1 -1
- package/dist/email/polling-runner.d.ts +1 -0
- package/dist/email/polling-runner.d.ts.map +1 -1
- package/dist/engine/on-finish/orchestrator.d.ts.map +1 -1
- package/dist/engine/on-finish/utils.d.ts.map +1 -1
- package/dist/event-bus/event-bus.d.ts.map +1 -1
- package/dist/event-bus/types.d.ts.map +1 -1
- package/dist/event-mapper.d.ts.map +1 -1
- package/dist/failure-condition-evaluator.d.ts.map +1 -1
- package/dist/footer.d.ts.map +1 -1
- package/dist/frontends/email-frontend.d.ts.map +1 -1
- package/dist/frontends/github-frontend.d.ts.map +1 -1
- package/dist/frontends/host.d.ts.map +1 -1
- package/dist/frontends/ndjson-sink.d.ts.map +1 -1
- package/dist/frontends/slack-frontend.d.ts.map +1 -1
- package/dist/frontends/teams-frontend.d.ts.map +1 -1
- package/dist/frontends/telegram-frontend.d.ts.map +1 -1
- package/dist/frontends/whatsapp-frontend.d.ts.map +1 -1
- package/dist/generated/config-schema.d.ts +16 -8
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/git-repository-analyzer.d.ts.map +1 -1
- package/dist/github-auth.d.ts.map +1 -1
- package/dist/github-check-service.d.ts.map +1 -1
- package/dist/github-comments.d.ts.map +1 -1
- package/dist/github-reactions.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7656 -1458
- package/dist/issue-filter.d.ts.map +1 -1
- package/dist/liquid-extensions.d.ts.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/mcp-job-manager.d.ts.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/memory-store.d.ts.map +1 -1
- package/dist/output/traces/{run-2026-05-05T12-31-47-571Z.ndjson → run-2026-08-20T13-50-06-218Z.ndjson} +2699 -2699
- package/dist/output-formatters.d.ts.map +1 -1
- package/dist/policy/default-engine.d.ts.map +1 -1
- package/dist/policy/index.d.ts.map +1 -1
- package/dist/policy/policy-check-command.d.ts.map +1 -1
- package/dist/policy/types.d.ts.map +1 -1
- package/dist/pr-analyzer.d.ts.map +1 -1
- package/dist/pr-detector.d.ts.map +1 -1
- package/dist/providers/a2a-check-provider.d.ts.map +1 -1
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/api-tool-executor.d.ts.map +1 -1
- package/dist/providers/check-provider-registry.d.ts.map +1 -1
- package/dist/providers/check-provider.interface.d.ts.map +1 -1
- package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
- package/dist/providers/claude-code-types.d.ts.map +1 -1
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/providers/custom-tool-executor.d.ts.map +1 -1
- package/dist/providers/git-checkout-provider.d.ts.map +1 -1
- package/dist/providers/github-ops-provider.d.ts.map +1 -1
- package/dist/providers/http-check-provider.d.ts.map +1 -1
- package/dist/providers/http-client-provider.d.ts.map +1 -1
- package/dist/providers/http-input-provider.d.ts.map +1 -1
- package/dist/providers/human-input-check-provider.d.ts.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/log-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
- package/dist/providers/mcp-tools.d.ts.map +1 -1
- package/dist/providers/memory-check-provider.d.ts.map +1 -1
- package/dist/providers/noop-check-provider.d.ts.map +1 -1
- package/dist/providers/script-check-provider.d.ts.map +1 -1
- package/dist/providers/utcp-check-provider.d.ts.map +1 -1
- package/dist/providers/workflow-check-provider.d.ts.map +1 -1
- package/dist/providers/workflow-tool-executor.d.ts.map +1 -1
- package/dist/reviewer.d.ts.map +1 -1
- package/dist/runners/config-reload-runtime.d.ts.map +1 -1
- package/dist/runners/graceful-restart.d.ts.map +1 -1
- package/dist/runners/mcp-server-runner.d.ts.map +1 -1
- package/dist/runners/process-cli-handler.d.ts.map +1 -1
- package/dist/runners/process-discovery.d.ts.map +1 -1
- package/dist/runners/runner-factory.d.ts.map +1 -1
- package/dist/runners/runner-host.d.ts.map +1 -1
- package/dist/runners/runner.d.ts.map +1 -1
- package/dist/runners/telemetry-init.d.ts.map +1 -1
- package/dist/sandbox/bubblewrap-sandbox.d.ts.map +1 -1
- package/dist/sandbox/cache-volume-manager.d.ts.map +1 -1
- package/dist/sandbox/check-runner.d.ts.map +1 -1
- package/dist/sandbox/compose-generator.d.ts.map +1 -1
- package/dist/sandbox/docker-compose-sandbox.d.ts.map +1 -1
- package/dist/sandbox/docker-image-sandbox.d.ts.map +1 -1
- package/dist/sandbox/env-filter.d.ts.map +1 -1
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/sandbox-manager.d.ts.map +1 -1
- package/dist/sandbox/sandbox-telemetry.d.ts.map +1 -1
- package/dist/sandbox/seatbelt-sandbox.d.ts.map +1 -1
- package/dist/sandbox/trace-ingester.d.ts.map +1 -1
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/scheduler/cli-handler.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/message-trigger.d.ts.map +1 -1
- package/dist/scheduler/schedule-parser.d.ts.map +1 -1
- package/dist/scheduler/schedule-store.d.ts.map +1 -1
- package/dist/scheduler/schedule-tool.d.ts.map +1 -1
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/store/index.d.ts.map +1 -1
- package/dist/scheduler/store/json-migrator.d.ts.map +1 -1
- package/dist/scheduler/store/sqlite-store.d.ts.map +1 -1
- package/dist/scheduler/store/types.d.ts.map +1 -1
- package/dist/sdk/{a2a-frontend-L3TQ7QQ6.mjs → a2a-frontend-XCQ4CQUF.mjs} +3 -3
- package/dist/sdk/{check-provider-registry-RQYIEQLJ.mjs → check-provider-registry-2D3MCWP3.mjs} +14 -11
- package/dist/sdk/{chunk-WZQMTD7W.mjs → chunk-2LLKENYD.mjs} +3 -3
- package/dist/sdk/{chunk-WZQMTD7W.mjs.map → chunk-2LLKENYD.mjs.map} +1 -1
- package/dist/sdk/{chunk-XXAEN5KU.mjs → chunk-77AKSSW2.mjs} +43 -65
- package/dist/sdk/chunk-77AKSSW2.mjs.map +1 -0
- package/dist/sdk/chunk-7QI6F66G.mjs +145 -0
- package/dist/sdk/chunk-7QI6F66G.mjs.map +1 -0
- package/dist/sdk/{chunk-NEZY2MXM.mjs → chunk-B2LQT6QU.mjs} +4 -4
- package/dist/sdk/{chunk-NEZY2MXM.mjs.map → chunk-B2LQT6QU.mjs.map} +1 -1
- package/dist/sdk/{chunk-IY5PQ5EN.mjs → chunk-BVEATT5V.mjs} +822 -51
- package/dist/sdk/chunk-BVEATT5V.mjs.map +1 -0
- package/dist/sdk/{chunk-TSX3YS3F.mjs → chunk-HW4MPCOW.mjs} +5 -139
- package/dist/sdk/chunk-HW4MPCOW.mjs.map +1 -0
- package/dist/sdk/chunk-PGBV3VZB.mjs +122 -0
- package/dist/sdk/chunk-PGBV3VZB.mjs.map +1 -0
- package/dist/sdk/{chunk-PDQTEBOJ.mjs → chunk-QT766ZLD.mjs} +5 -1
- package/dist/sdk/chunk-QT766ZLD.mjs.map +1 -0
- package/dist/sdk/{chunk-5TXIAPRA.mjs → chunk-S3GSZRYC.mjs} +2 -2
- package/dist/sdk/{chunk-NPOVLLKH.mjs → chunk-TGQBEM3Y.mjs} +570 -259
- package/dist/sdk/chunk-TGQBEM3Y.mjs.map +1 -0
- package/dist/sdk/chunk-TL3ZTYFY.mjs +141 -0
- package/dist/sdk/chunk-TL3ZTYFY.mjs.map +1 -0
- package/dist/sdk/{chunk-4UMDSYC7.mjs → chunk-VS3JE2DL.mjs} +3 -3
- package/dist/sdk/{chunk-A4WHMRK2.mjs → chunk-YETG675X.mjs} +2 -2
- package/dist/sdk/{chunk-XX6WT332.mjs → chunk-YTG5DN72.mjs} +17 -9
- package/dist/sdk/chunk-YTG5DN72.mjs.map +1 -0
- package/dist/sdk/{chunk-SRU5TFNY.mjs → chunk-YU3VR5SZ.mjs} +145 -16
- package/dist/sdk/chunk-YU3VR5SZ.mjs.map +1 -0
- package/dist/sdk/{config-BCYAVJ5S.mjs → config-H5IOLBFA.mjs} +2 -2
- package/dist/sdk/{email-frontend-P7QE4UUJ.mjs → email-frontend-AE5TYWNC.mjs} +18 -3
- package/dist/sdk/{email-frontend-P7QE4UUJ.mjs.map → email-frontend-AE5TYWNC.mjs.map} +1 -1
- package/dist/sdk/{failure-condition-evaluator-ZBOSD574.mjs → failure-condition-evaluator-66PWLV3D.mjs} +4 -4
- package/dist/sdk/{github-frontend-4WHT5JEU.mjs → github-frontend-BBFKCY4M.mjs} +4 -4
- package/dist/sdk/{host-FKR7H26C.mjs → host-UQRZDLT7.mjs} +8 -8
- package/dist/sdk/oauth2-token-cache-OS7WHLDI.mjs +13 -0
- package/dist/sdk/{routing-IB2PXYFC.mjs → routing-Q647KUMO.mjs} +5 -5
- package/dist/sdk/{schedule-tool-LB33KL2W.mjs → schedule-tool-WMGSM6IT.mjs} +14 -11
- package/dist/sdk/{schedule-tool-handler-KYWZHKSS.mjs → schedule-tool-handler-JMDHCGZ2.mjs} +14 -11
- package/dist/sdk/sdk.d.mts +14 -2
- package/dist/sdk/sdk.d.ts +14 -2
- package/dist/sdk/sdk.js +1927 -643
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +13 -10
- package/dist/sdk/sdk.mjs.map +1 -1
- package/dist/sdk/session-registry-CENXWIFR.mjs +12 -0
- package/dist/sdk/{slack-frontend-K3TPGERM.mjs → slack-frontend-JMX5MUVZ.mjs} +42 -12
- package/dist/sdk/slack-frontend-JMX5MUVZ.mjs.map +1 -0
- package/dist/sdk/{task-evaluator-H3BXC7SE.mjs → task-evaluator-4QG4CYQA.mjs} +7 -6
- package/dist/sdk/task-evaluator-4QG4CYQA.mjs.map +1 -0
- package/dist/sdk/{teams-frontend-6RRW533K.mjs → teams-frontend-6MDAN7OR.mjs} +17 -4
- package/dist/sdk/teams-frontend-6MDAN7OR.mjs.map +1 -0
- package/dist/sdk/{telegram-frontend-5UA77YAT.mjs → telegram-frontend-NLX2ZHS4.mjs} +17 -4
- package/dist/sdk/telegram-frontend-NLX2ZHS4.mjs.map +1 -0
- package/dist/sdk/{trace-helpers-AMZ2524G.mjs → trace-helpers-AIUGQLK5.mjs} +3 -3
- package/dist/sdk/{trace-serializer-EBHTHZYT.mjs → trace-serializer-4TOIAVQL.mjs} +10 -2
- package/dist/sdk/{track-execution-VW6P3OYO.mjs → track-execution-CFRZXMEC.mjs} +91 -20
- package/dist/sdk/track-execution-CFRZXMEC.mjs.map +1 -0
- package/dist/sdk/{utcp-check-provider-Q4PD5EP2.mjs → utcp-check-provider-WDTSQ7DZ.mjs} +3 -2
- package/dist/sdk/{whatsapp-frontend-72XEIUIR.mjs → whatsapp-frontend-3EMMNC7R.mjs} +15 -2
- package/dist/sdk/whatsapp-frontend-3EMMNC7R.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-N6KSDPWU.mjs → workflow-check-provider-G7A67EPP.mjs} +14 -11
- package/dist/sdk/workflow-check-provider-G7A67EPP.mjs.map +1 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/session-registry.d.ts +2 -7
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/slack/adapter.d.ts.map +1 -1
- package/dist/slack/cache-prewarmer.d.ts.map +1 -1
- package/dist/slack/client.d.ts +8 -0
- package/dist/slack/client.d.ts.map +1 -1
- package/dist/slack/markdown.d.ts.map +1 -1
- package/dist/slack/prompt-state.d.ts.map +1 -1
- package/dist/slack/rate-limiter.d.ts.map +1 -1
- package/dist/slack/schedule-tool-handler.d.ts.map +1 -1
- package/dist/slack/signature.d.ts.map +1 -1
- package/dist/slack/slack-output-adapter.d.ts.map +1 -1
- package/dist/slack/socket-runner.d.ts +1 -0
- package/dist/slack/socket-runner.d.ts.map +1 -1
- package/dist/slack/thread-cache.d.ts.map +1 -1
- package/dist/snapshot-store.d.ts.map +1 -1
- package/dist/state-machine/context/build-engine-context.d.ts.map +1 -1
- package/dist/state-machine/context/workflow-inputs.d.ts.map +1 -1
- package/dist/state-machine/dispatch/debounce-manager.d.ts +44 -0
- package/dist/state-machine/dispatch/debounce-manager.d.ts.map +1 -0
- package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -1
- package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
- package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -1
- package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -1
- package/dist/state-machine/dispatch/on-init-handlers.d.ts.map +1 -1
- package/dist/state-machine/dispatch/policy-gate.d.ts.map +1 -1
- package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -1
- package/dist/state-machine/dispatch/sandbox-routing.d.ts.map +1 -1
- package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -1
- package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -1
- package/dist/state-machine/execution/summary.d.ts.map +1 -1
- package/dist/state-machine/runner.d.ts.map +1 -1
- package/dist/state-machine/states/check-running.d.ts.map +1 -1
- package/dist/state-machine/states/completed.d.ts.map +1 -1
- package/dist/state-machine/states/error.d.ts.map +1 -1
- package/dist/state-machine/states/init.d.ts.map +1 -1
- package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
- package/dist/state-machine/states/plan-ready.d.ts.map +1 -1
- package/dist/state-machine/states/routing.d.ts.map +1 -1
- package/dist/state-machine/states/wave-planning.d.ts.map +1 -1
- package/dist/state-machine/workflow-projection.d.ts.map +1 -1
- package/dist/state-machine-execution-engine.d.ts +1 -0
- package/dist/state-machine-execution-engine.d.ts.map +1 -1
- package/dist/teams/adapter.d.ts.map +1 -1
- package/dist/teams/client.d.ts.map +1 -1
- package/dist/teams/markdown.d.ts.map +1 -1
- package/dist/teams/webhook-runner.d.ts +1 -0
- package/dist/teams/webhook-runner.d.ts.map +1 -1
- package/dist/telegram/adapter.d.ts.map +1 -1
- package/dist/telegram/client.d.ts.map +1 -1
- package/dist/telegram/markdown.d.ts.map +1 -1
- package/dist/telegram/polling-runner.d.ts +1 -0
- package/dist/telegram/polling-runner.d.ts.map +1 -1
- package/dist/telemetry/fallback-ndjson.d.ts.map +1 -1
- package/dist/telemetry/file-span-exporter.d.ts.map +1 -1
- package/dist/telemetry/lazy-otel.d.ts.map +1 -1
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/opentelemetry.d.ts.map +1 -1
- package/dist/telemetry/state-capture.d.ts.map +1 -1
- package/dist/telemetry/trace-helpers.d.ts.map +1 -1
- package/dist/telemetry/trace-report-exporter.d.ts.map +1 -1
- package/dist/test-runner/assertions.d.ts.map +1 -1
- package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
- package/dist/test-runner/core/environment.d.ts.map +1 -1
- package/dist/test-runner/core/fixture.d.ts.map +1 -1
- package/dist/test-runner/core/flow-stage.d.ts.map +1 -1
- package/dist/test-runner/core/mocks.d.ts.map +1 -1
- package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -1
- package/dist/test-runner/evaluators.d.ts.map +1 -1
- package/dist/test-runner/fixture-loader.d.ts.map +1 -1
- package/dist/test-runner/index.d.ts.map +1 -1
- package/dist/test-runner/llm-judge.d.ts.map +1 -1
- package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -1
- package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -1
- package/dist/test-runner/recorders/slack-recorder.d.ts.map +1 -1
- package/dist/test-runner/utils/selectors.d.ts.map +1 -1
- package/dist/test-runner/validator.d.ts.map +1 -1
- package/dist/traces/{run-2026-05-05T12-31-47-571Z.ndjson → run-2026-08-20T13-50-06-218Z.ndjson} +2699 -2699
- package/dist/tui/chat-runner.d.ts.map +1 -1
- package/dist/tui/chat-state.d.ts.map +1 -1
- package/dist/tui/chat-tui.d.ts.map +1 -1
- package/dist/tui/components/chat-box.d.ts.map +1 -1
- package/dist/tui/components/input-bar.d.ts.map +1 -1
- package/dist/tui/components/status-bar.d.ts.map +1 -1
- package/dist/tui/components/trace-viewer.d.ts.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/tui-frontend.d.ts.map +1 -1
- package/dist/types/bot.d.ts.map +1 -1
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/config.d.ts +14 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/engine.d.ts.map +1 -1
- package/dist/types/execution.d.ts.map +1 -1
- package/dist/types/git-checkout.d.ts.map +1 -1
- package/dist/types/github.d.ts.map +1 -1
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/utils/author-permissions.d.ts.map +1 -1
- package/dist/utils/child-process-error-handler.d.ts +19 -0
- package/dist/utils/child-process-error-handler.d.ts.map +1 -0
- package/dist/utils/command-executor.d.ts.map +1 -1
- package/dist/utils/comment-metadata.d.ts.map +1 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-merger.d.ts.map +1 -1
- package/dist/utils/diff-processor.d.ts.map +1 -1
- package/dist/utils/env-exposure.d.ts.map +1 -1
- package/dist/utils/env-resolver.d.ts.map +1 -1
- package/dist/utils/fair-concurrency-limiter.d.ts.map +1 -1
- package/dist/utils/file-exclusion.d.ts.map +1 -1
- package/dist/utils/head-sha.d.ts.map +1 -1
- package/dist/utils/human-id.d.ts.map +1 -1
- package/dist/utils/instance-id.d.ts.map +1 -1
- package/dist/utils/interactive-prompt.d.ts.map +1 -1
- package/dist/utils/issue-normalizer.d.ts.map +1 -1
- package/dist/utils/json-text-extractor.d.ts.map +1 -1
- package/dist/utils/mermaid-telemetry.d.ts.map +1 -1
- package/dist/utils/oauth2-token-cache.d.ts.map +1 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/sandbox.d.ts.map +1 -1
- package/dist/utils/script-memory-ops.d.ts.map +1 -1
- package/dist/utils/script-tool-environment.d.ts.map +1 -1
- package/dist/utils/stdin-reader.d.ts.map +1 -1
- package/dist/utils/template-context.d.ts.map +1 -1
- package/dist/utils/tool-resolver.d.ts.map +1 -1
- package/dist/utils/toolkit-expander.d.ts.map +1 -1
- package/dist/utils/tracer-init.d.ts.map +1 -1
- package/dist/utils/ui-helpers.d.ts.map +1 -1
- package/dist/utils/user-facing-error.d.ts +4 -0
- package/dist/utils/user-facing-error.d.ts.map +1 -0
- package/dist/utils/workspace-manager.d.ts +5 -0
- package/dist/utils/workspace-manager.d.ts.map +1 -1
- package/dist/utils/worktree-cleanup.d.ts +28 -0
- package/dist/utils/worktree-cleanup.d.ts.map +1 -1
- package/dist/utils/worktree-manager.d.ts +6 -0
- package/dist/utils/worktree-manager.d.ts.map +1 -1
- package/dist/webhook-server.d.ts.map +1 -1
- package/dist/whatsapp/adapter.d.ts.map +1 -1
- package/dist/whatsapp/client.d.ts.map +1 -1
- package/dist/whatsapp/markdown.d.ts.map +1 -1
- package/dist/whatsapp/webhook-runner.d.ts +1 -0
- package/dist/whatsapp/webhook-runner.d.ts.map +1 -1
- package/dist/workflow-executor.d.ts +7 -0
- package/dist/workflow-executor.d.ts.map +1 -1
- package/dist/workflow-registry.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/output/traces/run-2026-05-05T12-31-09-587Z.ndjson +0 -252
- package/dist/sdk/chunk-IY5PQ5EN.mjs.map +0 -1
- package/dist/sdk/chunk-NPOVLLKH.mjs.map +0 -1
- package/dist/sdk/chunk-PDQTEBOJ.mjs.map +0 -1
- package/dist/sdk/chunk-SRU5TFNY.mjs.map +0 -1
- package/dist/sdk/chunk-TSX3YS3F.mjs.map +0 -1
- package/dist/sdk/chunk-XX6WT332.mjs.map +0 -1
- package/dist/sdk/chunk-XXAEN5KU.mjs.map +0 -1
- package/dist/sdk/session-registry-6PV6SGEJ.mjs +0 -10
- package/dist/sdk/slack-frontend-K3TPGERM.mjs.map +0 -1
- package/dist/sdk/task-evaluator-H3BXC7SE.mjs.map +0 -1
- package/dist/sdk/teams-frontend-6RRW533K.mjs.map +0 -1
- package/dist/sdk/telegram-frontend-5UA77YAT.mjs.map +0 -1
- package/dist/sdk/trace-reader-OVE4DL2D.mjs +0 -270
- package/dist/sdk/trace-reader-OVE4DL2D.mjs.map +0 -1
- package/dist/sdk/track-execution-VW6P3OYO.mjs.map +0 -1
- package/dist/sdk/whatsapp-frontend-72XEIUIR.mjs.map +0 -1
- package/dist/traces/run-2026-05-05T12-31-09-587Z.ndjson +0 -252
- /package/dist/sdk/{a2a-frontend-L3TQ7QQ6.mjs.map → a2a-frontend-XCQ4CQUF.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-RQYIEQLJ.mjs.map → check-provider-registry-2D3MCWP3.mjs.map} +0 -0
- /package/dist/sdk/{chunk-5TXIAPRA.mjs.map → chunk-S3GSZRYC.mjs.map} +0 -0
- /package/dist/sdk/{chunk-4UMDSYC7.mjs.map → chunk-VS3JE2DL.mjs.map} +0 -0
- /package/dist/sdk/{chunk-A4WHMRK2.mjs.map → chunk-YETG675X.mjs.map} +0 -0
- /package/dist/sdk/{config-BCYAVJ5S.mjs.map → config-H5IOLBFA.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-ZBOSD574.mjs.map → failure-condition-evaluator-66PWLV3D.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-4WHT5JEU.mjs.map → github-frontend-BBFKCY4M.mjs.map} +0 -0
- /package/dist/sdk/{host-FKR7H26C.mjs.map → host-UQRZDLT7.mjs.map} +0 -0
- /package/dist/sdk/{routing-IB2PXYFC.mjs.map → oauth2-token-cache-OS7WHLDI.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-LB33KL2W.mjs.map → routing-Q647KUMO.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-KYWZHKSS.mjs.map → schedule-tool-WMGSM6IT.mjs.map} +0 -0
- /package/dist/sdk/{session-registry-6PV6SGEJ.mjs.map → schedule-tool-handler-JMDHCGZ2.mjs.map} +0 -0
- /package/dist/sdk/{trace-helpers-AMZ2524G.mjs.map → session-registry-CENXWIFR.mjs.map} +0 -0
- /package/dist/sdk/{trace-serializer-EBHTHZYT.mjs.map → trace-helpers-AIUGQLK5.mjs.map} +0 -0
- /package/dist/sdk/{utcp-check-provider-Q4PD5EP2.mjs.map → trace-serializer-4TOIAVQL.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-N6KSDPWU.mjs.map → utcp-check-provider-WDTSQ7DZ.mjs.map} +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
+
extractProbeTaskSummary,
|
|
2
3
|
fetchTraceSpans,
|
|
3
4
|
init_trace_serializer,
|
|
4
5
|
serializeTraceForPrompt
|
|
5
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BVEATT5V.mjs";
|
|
6
7
|
import {
|
|
7
8
|
init_logger,
|
|
8
9
|
logger
|
|
@@ -137,6 +138,67 @@ function formatProgressMetadata(timing) {
|
|
|
137
138
|
}
|
|
138
139
|
return `_Metadata: ${parts.join(" | ")}_`;
|
|
139
140
|
}
|
|
141
|
+
function formatTaskStatusMarker(status) {
|
|
142
|
+
switch (status) {
|
|
143
|
+
case "completed":
|
|
144
|
+
return "[x]";
|
|
145
|
+
case "in_progress":
|
|
146
|
+
return "[~]";
|
|
147
|
+
case "blocked":
|
|
148
|
+
case "failed":
|
|
149
|
+
case "error":
|
|
150
|
+
return "[!]";
|
|
151
|
+
case "deleted":
|
|
152
|
+
case "cancelled":
|
|
153
|
+
case "canceled":
|
|
154
|
+
return "[-]";
|
|
155
|
+
default:
|
|
156
|
+
return "[ ]";
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function formatTaskLabel(task) {
|
|
160
|
+
const title = String(task.title || "").trim();
|
|
161
|
+
return title || task.id || task.status;
|
|
162
|
+
}
|
|
163
|
+
function scopeHasRenderableTasks(scope) {
|
|
164
|
+
if (scope.tasks.some((task) => !task.synthetic)) return true;
|
|
165
|
+
return scope.children.some((child) => scopeHasRenderableTasks(child));
|
|
166
|
+
}
|
|
167
|
+
function appendTaskScopeLines(lines, scope, depth = 0) {
|
|
168
|
+
if (!scopeHasRenderableTasks(scope)) return;
|
|
169
|
+
const prefix = " ".repeat(depth);
|
|
170
|
+
if (depth > 0 || scope.label !== "Main Agent") {
|
|
171
|
+
lines.push(`${prefix}${scope.label}`);
|
|
172
|
+
}
|
|
173
|
+
const visibleTasks = scope.tasks.filter((task) => !task.synthetic).slice(0, 8);
|
|
174
|
+
for (const task of visibleTasks) {
|
|
175
|
+
lines.push(`${prefix}\u2022 ${formatTaskStatusMarker(task.status)} ${formatTaskLabel(task)}`);
|
|
176
|
+
}
|
|
177
|
+
const hiddenCount = scope.tasks.filter((task) => !task.synthetic).length - visibleTasks.length;
|
|
178
|
+
if (hiddenCount > 0) {
|
|
179
|
+
lines.push(`${prefix}\u2022 ... ${hiddenCount} more`);
|
|
180
|
+
}
|
|
181
|
+
for (const child of scope.children) {
|
|
182
|
+
appendTaskScopeLines(lines, child, depth + 1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function formatTaskSummary(summary) {
|
|
186
|
+
if (!summary || summary.tasks.length === 0) return void 0;
|
|
187
|
+
const lines = ["*Tasks*"];
|
|
188
|
+
if (summary.scopes.length > 0) {
|
|
189
|
+
for (const scope of summary.scopes) appendTaskScopeLines(lines, scope);
|
|
190
|
+
} else {
|
|
191
|
+
const visibleTasks = summary.tasks.filter((task) => !task.synthetic).slice(0, 8);
|
|
192
|
+
for (const task of visibleTasks) {
|
|
193
|
+
lines.push(`\u2022 ${formatTaskStatusMarker(task.status)} ${formatTaskLabel(task)}`);
|
|
194
|
+
}
|
|
195
|
+
const hiddenCount = summary.tasks.filter((task) => !task.synthetic).length - visibleTasks.length;
|
|
196
|
+
if (hiddenCount > 0) {
|
|
197
|
+
lines.push(`\u2022 ... ${hiddenCount} more`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return lines.length > 1 ? lines.join("\n") : void 0;
|
|
201
|
+
}
|
|
140
202
|
function formatSkillList(skills) {
|
|
141
203
|
const normalized = dedupeStrings(skills);
|
|
142
204
|
if (normalized.length <= 4) return normalized.join(", ");
|
|
@@ -149,7 +211,7 @@ function dedupeStrings(values) {
|
|
|
149
211
|
async function extractTraceSkillMetadata(traceRef, traceId) {
|
|
150
212
|
if (!traceRef && !traceId) return void 0;
|
|
151
213
|
try {
|
|
152
|
-
const spans = await fetchTraceSpans(
|
|
214
|
+
const spans = await fetchTraceSpans(traceRef || traceId, { targetTraceId: traceId });
|
|
153
215
|
if (!spans.length) return void 0;
|
|
154
216
|
const routeIntentSpan = spans.find(
|
|
155
217
|
(span) => span.attributes["visor.check.id"] === "route-intent"
|
|
@@ -168,8 +230,12 @@ async function extractTraceSkillMetadata(traceRef, traceId) {
|
|
|
168
230
|
(Array.isArray(routeIntentOutput?.skills) ? routeIntentOutput.skills : void 0) || (Array.isArray(classifyOutput?.skills) ? classifyOutput.skills : void 0)
|
|
169
231
|
);
|
|
170
232
|
const finalActivatedSkills = activatedSkills.length > 0 ? activatedSkills : fallbackActivatedSkills;
|
|
171
|
-
|
|
172
|
-
|
|
233
|
+
const taskSummary = extractProbeTaskSummary(spans);
|
|
234
|
+
if (!finalActivatedSkills.length && !taskSummary) return void 0;
|
|
235
|
+
return {
|
|
236
|
+
activatedSkills: finalActivatedSkills.length ? finalActivatedSkills : void 0,
|
|
237
|
+
taskSummary: taskSummary || void 0
|
|
238
|
+
};
|
|
173
239
|
} catch (err) {
|
|
174
240
|
logger.debug(
|
|
175
241
|
`[TaskLiveUpdates] Failed to extract skill metadata from trace: ${err instanceof Error ? err.message : String(err)}`
|
|
@@ -225,7 +291,7 @@ function extractProgressField(text, label) {
|
|
|
225
291
|
function escapeRegExp(value) {
|
|
226
292
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
227
293
|
}
|
|
228
|
-
var DEFAULT_TASK_LIVE_UPDATE_INTERVAL_SECONDS, DEFAULT_TASK_LIVE_UPDATE_MAX_TRACE_CHARS, DEFAULT_TASK_LIVE_UPDATE_FIRST_UPDATE_DELAY_SECONDS, DEFAULT_TASK_LIVE_UPDATE_METADATA_REFRESH_SECONDS, DEFAULT_TASK_LIVE_UPDATE_STALL_FALLBACK_SECONDS, DEFAULT_TASK_LIVE_UPDATE_MODEL, DEFAULT_TASK_LIVE_UPDATE_STALL_NOTICE, DEFAULT_TASK_LIVE_UPDATE_PROMPT, TaskLiveUpdateManager;
|
|
294
|
+
var DEFAULT_TASK_LIVE_UPDATE_INTERVAL_SECONDS, DEFAULT_TASK_LIVE_UPDATE_MAX_TRACE_CHARS, DEFAULT_TASK_LIVE_UPDATE_FIRST_UPDATE_DELAY_SECONDS, DEFAULT_TASK_LIVE_UPDATE_METADATA_REFRESH_SECONDS, DEFAULT_TASK_LIVE_UPDATE_STALL_FALLBACK_SECONDS, DEFAULT_TASK_LIVE_UPDATE_MODEL, DEFAULT_TASK_LIVE_UPDATE_STALL_NOTICE, GENERIC_COMPLETION_FALLBACK, DEFAULT_TASK_LIVE_UPDATE_PROMPT, TaskLiveUpdateManager;
|
|
229
295
|
var init_task_live_updates = __esm({
|
|
230
296
|
"src/agent-protocol/task-live-updates.ts"() {
|
|
231
297
|
"use strict";
|
|
@@ -238,6 +304,7 @@ var init_task_live_updates = __esm({
|
|
|
238
304
|
DEFAULT_TASK_LIVE_UPDATE_STALL_FALLBACK_SECONDS = 60;
|
|
239
305
|
DEFAULT_TASK_LIVE_UPDATE_MODEL = "gemini-3.1-flash-lite-preview";
|
|
240
306
|
DEFAULT_TASK_LIVE_UPDATE_STALL_NOTICE = "_No new meaningful progress is visible yet. Some steps can stay quiet for up to 5 minutes before there is new news._";
|
|
307
|
+
GENERIC_COMPLETION_FALLBACK = "Execution completed";
|
|
241
308
|
DEFAULT_TASK_LIVE_UPDATE_PROMPT = `You are generating a short live progress update for a user while an AI task is still running.
|
|
242
309
|
|
|
243
310
|
This is NOT the final answer.
|
|
@@ -320,6 +387,9 @@ Good update example:
|
|
|
320
387
|
firstTickTimer;
|
|
321
388
|
metadataRefreshTimer;
|
|
322
389
|
running = false;
|
|
390
|
+
inflightTick;
|
|
391
|
+
inflightMetadataRefresh;
|
|
392
|
+
inflightPublishes = /* @__PURE__ */ new Set();
|
|
323
393
|
started = false;
|
|
324
394
|
completed = false;
|
|
325
395
|
startedAt = /* @__PURE__ */ new Date();
|
|
@@ -355,6 +425,14 @@ Good update example:
|
|
|
355
425
|
if (this.completed) return;
|
|
356
426
|
this.completed = true;
|
|
357
427
|
this.stop();
|
|
428
|
+
await this.waitForInflightSinkPublishes();
|
|
429
|
+
const cleanedFinalText = finalText.trim();
|
|
430
|
+
if (!this.lastPostedMessage && cleanedFinalText === GENERIC_COMPLETION_FALLBACK) {
|
|
431
|
+
logger.info(
|
|
432
|
+
`[TaskLiveUpdates] Suppressing generic final update for task ${this.ctx.taskId}: no progress update was posted`
|
|
433
|
+
);
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
358
436
|
try {
|
|
359
437
|
logger.info(`[TaskLiveUpdates] Publishing final success update for task ${this.ctx.taskId}`);
|
|
360
438
|
const result = await this.ctx.sink.complete(this.decorateText(finalText));
|
|
@@ -370,6 +448,7 @@ Good update example:
|
|
|
370
448
|
if (this.completed) return;
|
|
371
449
|
this.completed = true;
|
|
372
450
|
this.stop();
|
|
451
|
+
await this.waitForInflightSinkPublishes();
|
|
373
452
|
try {
|
|
374
453
|
logger.info(`[TaskLiveUpdates] Publishing final failure update for task ${this.ctx.taskId}`);
|
|
375
454
|
const result = await this.ctx.sink.fail(this.decorateText(finalText));
|
|
@@ -396,6 +475,16 @@ Good update example:
|
|
|
396
475
|
}
|
|
397
476
|
}
|
|
398
477
|
async tick() {
|
|
478
|
+
if (this.inflightTick) return this.inflightTick;
|
|
479
|
+
const promise = this.runTick().finally(() => {
|
|
480
|
+
if (this.inflightTick === promise) {
|
|
481
|
+
this.inflightTick = void 0;
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
this.inflightTick = promise;
|
|
485
|
+
return promise;
|
|
486
|
+
}
|
|
487
|
+
async runTick() {
|
|
399
488
|
if (this.completed || this.running) return;
|
|
400
489
|
const traceState = this.getTraceState();
|
|
401
490
|
if (!traceState.traceRef && !traceState.traceId) {
|
|
@@ -468,11 +557,18 @@ Good update example:
|
|
|
468
557
|
elapsedSeconds: Math.max(0, Math.floor((Date.now() - this.startedAt.getTime()) / 1e3)),
|
|
469
558
|
previousUpdateAt: this.lastUpdateAt,
|
|
470
559
|
secondsSincePreviousUpdate: this.lastUpdateAt ? Math.max(0, Math.floor((Date.now() - this.lastUpdateAt.getTime()) / 1e3)) : void 0,
|
|
471
|
-
activatedSkills: this.lastSkillMetadata?.activatedSkills
|
|
560
|
+
activatedSkills: this.lastSkillMetadata?.activatedSkills,
|
|
561
|
+
taskSummary: this.lastSkillMetadata?.taskSummary
|
|
472
562
|
},
|
|
473
563
|
traceState.traceId
|
|
474
564
|
);
|
|
475
|
-
|
|
565
|
+
if (this.completed) {
|
|
566
|
+
logger.debug(
|
|
567
|
+
`[TaskLiveUpdates] Aborting progress publish for task ${this.ctx.taskId}: task already completed before sink update`
|
|
568
|
+
);
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
const result = await this.trackPublish(this.ctx.sink.update(message));
|
|
476
572
|
this.recordSinkRef(result);
|
|
477
573
|
this.ctx.appendHistory?.(cleaned, "progress");
|
|
478
574
|
this.lastUpdateText = cleaned;
|
|
@@ -500,15 +596,31 @@ Good update example:
|
|
|
500
596
|
this.timer.unref();
|
|
501
597
|
}
|
|
502
598
|
this.metadataRefreshTimer = setInterval(() => {
|
|
503
|
-
void this.
|
|
599
|
+
void this.scheduleMetadataRefresh();
|
|
504
600
|
}, DEFAULT_TASK_LIVE_UPDATE_METADATA_REFRESH_SECONDS * 1e3);
|
|
505
601
|
if (typeof this.metadataRefreshTimer?.unref === "function") {
|
|
506
602
|
this.metadataRefreshTimer.unref();
|
|
507
603
|
}
|
|
508
604
|
}
|
|
605
|
+
async waitForInflightSinkPublishes() {
|
|
606
|
+
const pending = [...this.inflightPublishes];
|
|
607
|
+
if (pending.length === 0) return;
|
|
608
|
+
try {
|
|
609
|
+
await Promise.allSettled(pending);
|
|
610
|
+
} catch {
|
|
611
|
+
}
|
|
612
|
+
}
|
|
509
613
|
recordSinkRef(result) {
|
|
510
614
|
if (result?.ref) this.ctx.onPostedRef?.(result.ref);
|
|
511
615
|
}
|
|
616
|
+
async trackPublish(publish) {
|
|
617
|
+
this.inflightPublishes.add(publish);
|
|
618
|
+
try {
|
|
619
|
+
return await publish;
|
|
620
|
+
} finally {
|
|
621
|
+
this.inflightPublishes.delete(publish);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
512
624
|
getTraceState() {
|
|
513
625
|
const resolved = this.ctx.resolveTraceState?.();
|
|
514
626
|
return {
|
|
@@ -523,16 +635,30 @@ Good update example:
|
|
|
523
635
|
|
|
524
636
|
\`task_id: ${this.ctx.taskId}\``;
|
|
525
637
|
}
|
|
526
|
-
decorateProgressText(text, timing,
|
|
638
|
+
decorateProgressText(text, timing, _traceId) {
|
|
527
639
|
const normalized = normalizeProgressSummary(text);
|
|
640
|
+
const taskSummary = formatTaskSummary(timing.taskSummary);
|
|
528
641
|
const blocks = [
|
|
529
642
|
"*Live Update*",
|
|
530
643
|
"_Current task is still running. This message updates in place until the final answer is ready._",
|
|
531
644
|
this.lastUpdateKind === "stall" ? DEFAULT_TASK_LIVE_UPDATE_STALL_NOTICE : "",
|
|
645
|
+
taskSummary,
|
|
532
646
|
normalized,
|
|
533
|
-
formatProgressMetadata(timing)
|
|
647
|
+
formatProgressMetadata(timing),
|
|
648
|
+
`\`task_id: ${this.ctx.taskId}\``,
|
|
649
|
+
"`live_update: true`"
|
|
534
650
|
].filter(Boolean);
|
|
535
|
-
return
|
|
651
|
+
return blocks.join("\n\n");
|
|
652
|
+
}
|
|
653
|
+
scheduleMetadataRefresh() {
|
|
654
|
+
if (this.inflightMetadataRefresh) return this.inflightMetadataRefresh;
|
|
655
|
+
const promise = this.refreshProgressMetadata().finally(() => {
|
|
656
|
+
if (this.inflightMetadataRefresh === promise) {
|
|
657
|
+
this.inflightMetadataRefresh = void 0;
|
|
658
|
+
}
|
|
659
|
+
});
|
|
660
|
+
this.inflightMetadataRefresh = promise;
|
|
661
|
+
return promise;
|
|
536
662
|
}
|
|
537
663
|
async refreshProgressMetadata() {
|
|
538
664
|
if (this.completed || this.running || !this.lastUpdateText) return;
|
|
@@ -543,7 +669,8 @@ Good update example:
|
|
|
543
669
|
elapsedSeconds: Math.max(0, Math.floor((Date.now() - this.startedAt.getTime()) / 1e3)),
|
|
544
670
|
previousUpdateAt: this.lastUpdateAt,
|
|
545
671
|
secondsSincePreviousUpdate: this.lastUpdateAt ? Math.max(0, Math.floor((Date.now() - this.lastUpdateAt.getTime()) / 1e3)) : void 0,
|
|
546
|
-
activatedSkills: this.lastSkillMetadata?.activatedSkills
|
|
672
|
+
activatedSkills: this.lastSkillMetadata?.activatedSkills,
|
|
673
|
+
taskSummary: this.lastSkillMetadata?.taskSummary
|
|
547
674
|
},
|
|
548
675
|
traceState.traceId
|
|
549
676
|
);
|
|
@@ -553,7 +680,7 @@ Good update example:
|
|
|
553
680
|
logger.debug(
|
|
554
681
|
`[TaskLiveUpdates] Refreshing metadata-only live update for task ${this.ctx.taskId}`
|
|
555
682
|
);
|
|
556
|
-
const result = await this.ctx.sink.update(message);
|
|
683
|
+
const result = await this.trackPublish(this.ctx.sink.update(message));
|
|
557
684
|
this.recordSinkRef(result);
|
|
558
685
|
this.lastPostedMessage = message;
|
|
559
686
|
} catch (err) {
|
|
@@ -589,7 +716,8 @@ Good update example:
|
|
|
589
716
|
elapsedSeconds: Math.max(0, Math.floor((Date.now() - this.startedAt.getTime()) / 1e3)),
|
|
590
717
|
previousUpdateAt: this.lastUpdateAt,
|
|
591
718
|
secondsSincePreviousUpdate: this.lastUpdateAt ? Math.max(0, Math.floor((Date.now() - this.lastUpdateAt.getTime()) / 1e3)) : void 0,
|
|
592
|
-
activatedSkills: this.lastSkillMetadata?.activatedSkills
|
|
719
|
+
activatedSkills: this.lastSkillMetadata?.activatedSkills,
|
|
720
|
+
taskSummary: this.lastSkillMetadata?.taskSummary
|
|
593
721
|
},
|
|
594
722
|
traceId
|
|
595
723
|
);
|
|
@@ -597,7 +725,8 @@ Good update example:
|
|
|
597
725
|
this.lastStallFallbackAt = now;
|
|
598
726
|
return;
|
|
599
727
|
}
|
|
600
|
-
|
|
728
|
+
if (this.completed) return;
|
|
729
|
+
const result = await this.trackPublish(this.ctx.sink.update(message));
|
|
601
730
|
this.recordSinkRef(result);
|
|
602
731
|
if (!this.lastUpdateText) {
|
|
603
732
|
this.ctx.appendHistory?.(baseText, "progress");
|
|
@@ -617,4 +746,4 @@ export {
|
|
|
617
746
|
TaskLiveUpdateManager,
|
|
618
747
|
init_task_live_updates
|
|
619
748
|
};
|
|
620
|
-
//# sourceMappingURL=chunk-
|
|
749
|
+
//# sourceMappingURL=chunk-YU3VR5SZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/agent-protocol/task-live-updates.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { logger } from '../logger';\nimport type { TaskLiveUpdatesConfig } from '../types/config';\nimport {\n extractProbeTaskSummary,\n fetchTraceSpans,\n serializeTraceForPrompt,\n type ProbeTaskSummary,\n} from './trace-serializer';\n\nexport const DEFAULT_TASK_LIVE_UPDATE_INTERVAL_SECONDS = 10;\nexport const DEFAULT_TASK_LIVE_UPDATE_MAX_TRACE_CHARS = 12_000;\nexport const DEFAULT_TASK_LIVE_UPDATE_FIRST_UPDATE_DELAY_SECONDS = 10;\nexport const DEFAULT_TASK_LIVE_UPDATE_METADATA_REFRESH_SECONDS = 5;\nexport const DEFAULT_TASK_LIVE_UPDATE_STALL_FALLBACK_SECONDS = 60;\nexport const DEFAULT_TASK_LIVE_UPDATE_MODEL = 'gemini-3.1-flash-lite-preview';\nconst DEFAULT_TASK_LIVE_UPDATE_STALL_NOTICE =\n '_No new meaningful progress is visible yet. Some steps can stay quiet for up to 5 minutes before there is new news._';\nconst GENERIC_COMPLETION_FALLBACK = 'Execution completed';\n\nexport const DEFAULT_TASK_LIVE_UPDATE_PROMPT = `You are generating a short live progress update for a user while an AI task is still running.\n\nThis is NOT the final answer.\nDo NOT answer the user's original request.\nDo NOT write the final solution.\nDo NOT explain the topic in full.\nDo NOT provide a root cause, recommendation, summary of findings, or conclusion.\nEven if you think you already know the answer, do NOT give it here.\n\nYou will receive:\n- the user's original request\n- the previous progress update, if any\n- timing metadata for this run\n- the latest execution trace snapshot\n\nYour job is to produce a concise status update that tells the user only:\n- the overall progress so far\n- the last meaningful action that finished\n- what the agent is doing right now\n- what it is likely waiting on, if anything\n\nRules:\n- This is a STATUS UPDATE, not the final answer\n- Never answer the user's request directly\n- Never switch into explanation mode\n- Never write a complete answer, even partially\n- Keep it short: exactly 4 short bullet points\n- Use the exact bullet labels below\n- Do NOT generate timing metadata lines\n- Do NOT generate task_id lines\n- Timing metadata is provided only so you understand task pace and recency\n- The system will append timing and task metadata separately\n- Prefer concrete progress over generic wording\n- Mention the most recent completed action before the current action\n- Do not claim completion unless the task is actually done\n- Do not mention internal implementation details unless they help explain the current work\n- Avoid repeating the previous update verbatim\n- Do not use code fences\n- Plain markdown text only\n\nRequired output format:\n- Progress: <very short overall progress statement, not a final answer>\n- Last done: <most recent completed action>\n- Now: <current action in progress>\n- Waiting on: <tool, search, model, user input, or \"nothing blocking right now\">\n\nTrace interpretation rules:\n- Translate internal trace phases into user-meaningful progress, do not just repeat raw span names\n- If the trace shows routing or classify work, describe that as understanding the request and choosing the right path\n- If the trace shows setup-projects, build-config, or loading context, describe that as preparing the workspace or gathering context\n- If the trace shows search, extract, code-explorer, or file inspection, describe that as investigating the codebase\n- If the trace shows engineer work, edits, tests, PR creation, or command execution, describe that as implementing or verifying changes\n- If the trace shows completion prompts, final answer generation, summarization, final validation, or output rendering, describe that as validating findings and preparing the final response\n- If the trace shows waiting on a long AI request, delegate, tool call, or sandboxed child task, describe that as waiting for analysis or validation to finish\n\nIf you are tempted to answer the user's question, stop and convert that into:\n- what was learned so far\n- what was just completed\n- what is still being checked\n\nBad update example:\n- \"API rate limiting works by...\"\n\nGood update example:\n- \"Progress: identified the gateway components involved in rate limiting\"\n- \"Last done: found the middleware files and session manager entry points\"\n- \"Now: tracing the enforcement path through the gateway\"\n- \"Waiting on: search results for the limiter implementation details\"`;\n\nexport interface TaskLiveUpdateSink {\n readonly kind: string;\n start(): Promise<{ ref?: Record<string, unknown> } | null>;\n update(text: string): Promise<{ ref?: Record<string, unknown> } | null>;\n complete(text: string): Promise<{ ref?: Record<string, unknown> } | null>;\n fail(text: string): Promise<{ ref?: Record<string, unknown> } | null>;\n}\n\nexport interface TaskLiveUpdateDeps {\n summarizeProgress?: (input: TaskProgressSummaryInput) => Promise<string | null>;\n serializeTrace?: (\n traceRef: string,\n maxChars: number,\n traceId?: string\n ) => Promise<string | undefined>;\n extractSkillMetadata?: (\n traceRef: string,\n traceId?: string\n ) => Promise<TaskLiveUpdateSkillMetadata | undefined>;\n}\n\nexport interface TaskProgressSummaryInput {\n requestText: string;\n previousUpdate?: string;\n traceSnapshot: string;\n config: RequiredTaskLiveUpdatesConfig;\n startedAt: Date;\n now: Date;\n elapsedSeconds: number;\n previousUpdateAt?: Date;\n secondsSincePreviousUpdate?: number;\n}\n\ninterface ProgressTimingMetadata {\n elapsedSeconds: number;\n previousUpdateAt?: Date;\n secondsSincePreviousUpdate?: number;\n activatedSkills?: string[];\n taskSummary?: ProbeTaskSummary;\n}\n\ninterface TaskLiveUpdateSkillMetadata {\n activatedSkills?: string[];\n taskSummary?: ProbeTaskSummary;\n}\n\nexport interface TaskLiveUpdateContext {\n taskId: string;\n requestText: string;\n traceRef?: string;\n traceId?: string;\n includeTraceId?: boolean;\n resolveTraceState?: () => { traceRef?: string; traceId?: string };\n sink: TaskLiveUpdateSink;\n config: RequiredTaskLiveUpdatesConfig;\n onPostedRef?: (ref: Record<string, unknown>) => void;\n appendHistory?: (text: string, stage: 'started' | 'progress' | 'completed' | 'failed') => void;\n}\n\nexport interface RequiredTaskLiveUpdatesConfig {\n enabled: boolean;\n intervalSeconds: number;\n model: string;\n provider?: string;\n prompt: string;\n initialMessage: string;\n maxTraceChars: number;\n}\n\nexport function resolveTaskLiveUpdatesConfig(\n config?: boolean | TaskLiveUpdatesConfig | null\n): RequiredTaskLiveUpdatesConfig | null {\n if (!config) return null;\n if (config === true) {\n return {\n enabled: true,\n intervalSeconds: DEFAULT_TASK_LIVE_UPDATE_INTERVAL_SECONDS,\n model: DEFAULT_TASK_LIVE_UPDATE_MODEL,\n prompt: DEFAULT_TASK_LIVE_UPDATE_PROMPT,\n initialMessage: '',\n maxTraceChars: DEFAULT_TASK_LIVE_UPDATE_MAX_TRACE_CHARS,\n };\n }\n\n if (config.enabled === false) return null;\n\n return {\n enabled: true,\n intervalSeconds: Math.max(\n 1,\n Math.floor(config.interval_seconds || DEFAULT_TASK_LIVE_UPDATE_INTERVAL_SECONDS)\n ),\n model: config.model || DEFAULT_TASK_LIVE_UPDATE_MODEL,\n provider: config.provider,\n prompt: config.prompt || DEFAULT_TASK_LIVE_UPDATE_PROMPT,\n initialMessage: config.initial_message || '',\n maxTraceChars: Math.max(\n 1000,\n Math.floor(config.max_trace_chars || DEFAULT_TASK_LIVE_UPDATE_MAX_TRACE_CHARS)\n ),\n };\n}\n\nexport function isFrontendLiveUpdatesEnabled(\n config: boolean | TaskLiveUpdatesConfig | null | undefined,\n frontend: 'slack' | 'telegram' | 'teams' | 'whatsapp'\n): boolean {\n if (!config) return false;\n if (config === true) return true;\n if (config.enabled === false) return false;\n const frontendCfg = config.frontends?.[frontend];\n if (frontendCfg?.enabled === false) return false;\n return true;\n}\n\nexport class TaskLiveUpdateManager {\n private readonly deps: Required<TaskLiveUpdateDeps>;\n private timer?: ReturnType<typeof setInterval>;\n private firstTickTimer?: ReturnType<typeof setTimeout>;\n private metadataRefreshTimer?: ReturnType<typeof setInterval>;\n private running = false;\n private inflightTick?: Promise<void>;\n private inflightMetadataRefresh?: Promise<void>;\n private readonly inflightPublishes = new Set<Promise<unknown>>();\n private started = false;\n private completed = false;\n private readonly startedAt = new Date();\n private lastUpdateText?: string;\n private lastUpdateAt?: Date;\n private lastTraceSnapshot?: string;\n private lastPostedMessage?: string;\n private lastStallFallbackAt?: Date;\n private lastUpdateKind: 'semantic' | 'stall' = 'semantic';\n private lastSkillMetadata?: TaskLiveUpdateSkillMetadata;\n\n constructor(\n private readonly ctx: TaskLiveUpdateContext,\n deps?: TaskLiveUpdateDeps\n ) {\n this.deps = {\n summarizeProgress: deps?.summarizeProgress || summarizeTaskProgress,\n serializeTrace: deps?.serializeTrace || defaultSerializeTrace,\n extractSkillMetadata: deps?.extractSkillMetadata || extractTraceSkillMetadata,\n };\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n try {\n const started = await this.ctx.sink.start();\n this.recordSinkRef(started);\n logger.info(\n `[TaskLiveUpdates] Started for task ${this.ctx.taskId}; first update in ${DEFAULT_TASK_LIVE_UPDATE_FIRST_UPDATE_DELAY_SECONDS}s, interval=${this.ctx.config.intervalSeconds}s, provider=${this.ctx.config.provider || 'default'}, model=${this.ctx.config.model}`\n );\n } catch (err) {\n logger.warn(\n `[TaskLiveUpdates] Failed to initialize live updates for task ${this.ctx.taskId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n\n this.firstTickTimer = setTimeout(() => {\n void this.runFirstTick();\n }, DEFAULT_TASK_LIVE_UPDATE_FIRST_UPDATE_DELAY_SECONDS * 1000);\n if (typeof (this.firstTickTimer as any)?.unref === 'function') {\n (this.firstTickTimer as any).unref();\n }\n }\n\n async complete(finalText: string): Promise<void> {\n if (this.completed) return;\n this.completed = true;\n this.stop();\n await this.waitForInflightSinkPublishes();\n const cleanedFinalText = finalText.trim();\n if (!this.lastPostedMessage && cleanedFinalText === GENERIC_COMPLETION_FALLBACK) {\n logger.info(\n `[TaskLiveUpdates] Suppressing generic final update for task ${this.ctx.taskId}: no progress update was posted`\n );\n return;\n }\n try {\n logger.info(`[TaskLiveUpdates] Publishing final success update for task ${this.ctx.taskId}`);\n const result = await this.ctx.sink.complete(this.decorateText(finalText));\n this.recordSinkRef(result);\n this.ctx.appendHistory?.(finalText, 'completed');\n } catch (err) {\n logger.warn(\n `[TaskLiveUpdates] Failed to publish final update for task ${this.ctx.taskId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n\n async fail(finalText: string): Promise<void> {\n if (this.completed) return;\n this.completed = true;\n this.stop();\n await this.waitForInflightSinkPublishes();\n try {\n logger.info(`[TaskLiveUpdates] Publishing final failure update for task ${this.ctx.taskId}`);\n const result = await this.ctx.sink.fail(this.decorateText(finalText));\n this.recordSinkRef(result);\n this.ctx.appendHistory?.(finalText, 'failed');\n } catch (err) {\n logger.warn(\n `[TaskLiveUpdates] Failed to publish failure update for task ${this.ctx.taskId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n\n stop(): void {\n if (this.firstTickTimer) {\n clearTimeout(this.firstTickTimer);\n this.firstTickTimer = undefined;\n }\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n if (this.metadataRefreshTimer) {\n clearInterval(this.metadataRefreshTimer);\n this.metadataRefreshTimer = undefined;\n }\n }\n\n async tick(): Promise<void> {\n if (this.inflightTick) return this.inflightTick;\n const promise = this.runTick().finally(() => {\n if (this.inflightTick === promise) {\n this.inflightTick = undefined;\n }\n });\n this.inflightTick = promise;\n return promise;\n }\n\n private async runTick(): Promise<void> {\n if (this.completed || this.running) return;\n const traceState = this.getTraceState();\n if (!traceState.traceRef && !traceState.traceId) {\n logger.debug(\n `[TaskLiveUpdates] Skipping tick for task ${this.ctx.taskId}: no trace reference available yet`\n );\n return;\n }\n this.running = true;\n try {\n const traceRef = traceState.traceRef || traceState.traceId!;\n const traceSnapshot = await this.deps.serializeTrace(\n traceRef,\n this.ctx.config.maxTraceChars,\n traceState.traceId\n );\n if (this.completed) {\n logger.debug(\n `[TaskLiveUpdates] Aborting in-flight tick for task ${this.ctx.taskId}: task already completed`\n );\n return;\n }\n if (!traceSnapshot || traceSnapshot === '(no trace data available)') {\n logger.debug(\n `[TaskLiveUpdates] Skipping tick for task ${this.ctx.taskId}: no trace data available yet (traceRef=${traceRef})`\n );\n return;\n }\n if (traceSnapshot === this.lastTraceSnapshot) {\n await this.maybePublishStallFallback(traceSnapshot, traceState.traceId);\n logger.debug(\n `[TaskLiveUpdates] Skipping tick for task ${this.ctx.taskId}: trace snapshot unchanged`\n );\n return;\n }\n\n const summary = await this.deps.summarizeProgress({\n requestText: this.ctx.requestText,\n previousUpdate: this.lastUpdateText,\n traceSnapshot,\n config: this.ctx.config,\n startedAt: this.startedAt,\n now: new Date(),\n elapsedSeconds: Math.max(0, Math.floor((Date.now() - this.startedAt.getTime()) / 1000)),\n previousUpdateAt: this.lastUpdateAt,\n secondsSincePreviousUpdate: this.lastUpdateAt\n ? Math.max(0, Math.floor((Date.now() - this.lastUpdateAt.getTime()) / 1000))\n : undefined,\n });\n if (this.completed) {\n logger.debug(\n `[TaskLiveUpdates] Aborting in-flight tick for task ${this.ctx.taskId}: task already completed after summarization`\n );\n return;\n }\n const cleaned = summary?.trim();\n if (!cleaned || cleaned === this.lastUpdateText) {\n await this.maybePublishStallFallback(traceSnapshot, traceState.traceId);\n logger.debug(\n `[TaskLiveUpdates] Skipping tick for task ${this.ctx.taskId}: summary empty or unchanged`\n );\n this.lastTraceSnapshot = traceSnapshot;\n return;\n }\n\n logger.info(\n `[TaskLiveUpdates] Publishing progress update for task ${this.ctx.taskId}: ${cleaned.slice(0, 160)}`\n );\n this.lastSkillMetadata = await this.deps.extractSkillMetadata(traceRef, traceState.traceId);\n this.lastUpdateKind = 'semantic';\n const message = this.decorateProgressText(\n cleaned,\n {\n elapsedSeconds: Math.max(0, Math.floor((Date.now() - this.startedAt.getTime()) / 1000)),\n previousUpdateAt: this.lastUpdateAt,\n secondsSincePreviousUpdate: this.lastUpdateAt\n ? Math.max(0, Math.floor((Date.now() - this.lastUpdateAt.getTime()) / 1000))\n : undefined,\n activatedSkills: this.lastSkillMetadata?.activatedSkills,\n taskSummary: this.lastSkillMetadata?.taskSummary,\n },\n traceState.traceId\n );\n if (this.completed) {\n logger.debug(\n `[TaskLiveUpdates] Aborting progress publish for task ${this.ctx.taskId}: task already completed before sink update`\n );\n return;\n }\n const result = await this.trackPublish(this.ctx.sink.update(message));\n this.recordSinkRef(result);\n this.ctx.appendHistory?.(cleaned, 'progress');\n this.lastUpdateText = cleaned;\n this.lastUpdateAt = new Date();\n this.lastTraceSnapshot = traceSnapshot;\n this.lastPostedMessage = message;\n this.lastStallFallbackAt = undefined;\n } catch (err) {\n logger.warn(\n `[TaskLiveUpdates] Progress update failed for task ${this.ctx.taskId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n } finally {\n this.running = false;\n }\n }\n\n private async runFirstTick(): Promise<void> {\n if (this.completed) return;\n logger.debug(`[TaskLiveUpdates] Running first scheduled tick for task ${this.ctx.taskId}`);\n await this.tick();\n if (this.completed) return;\n this.timer = setInterval(() => {\n void this.tick();\n }, this.ctx.config.intervalSeconds * 1000);\n if (typeof (this.timer as any)?.unref === 'function') {\n (this.timer as any).unref();\n }\n this.metadataRefreshTimer = setInterval(() => {\n void this.scheduleMetadataRefresh();\n }, DEFAULT_TASK_LIVE_UPDATE_METADATA_REFRESH_SECONDS * 1000);\n if (typeof (this.metadataRefreshTimer as any)?.unref === 'function') {\n (this.metadataRefreshTimer as any).unref();\n }\n }\n\n private async waitForInflightSinkPublishes(): Promise<void> {\n const pending = [...this.inflightPublishes];\n if (pending.length === 0) return;\n try {\n await Promise.allSettled(pending);\n } catch {}\n }\n\n private recordSinkRef(result: { ref?: Record<string, unknown> } | null | undefined): void {\n if (result?.ref) this.ctx.onPostedRef?.(result.ref);\n }\n\n private async trackPublish<T>(publish: Promise<T>): Promise<T> {\n this.inflightPublishes.add(publish);\n try {\n return await publish;\n } finally {\n this.inflightPublishes.delete(publish);\n }\n }\n\n private getTraceState(): { traceRef?: string; traceId?: string } {\n const resolved = this.ctx.resolveTraceState?.();\n return {\n traceRef: resolved?.traceRef || this.ctx.traceRef,\n traceId: resolved?.traceId || this.ctx.traceId,\n };\n }\n\n private decorateText(text: string, _traceId?: string): string {\n if (!this.ctx.includeTraceId) return text;\n if (text.includes(`task_id: ${this.ctx.taskId}`)) return text;\n return `${text}\\n\\n\\`task_id: ${this.ctx.taskId}\\``;\n }\n\n private decorateProgressText(\n text: string,\n timing: ProgressTimingMetadata,\n _traceId?: string\n ): string {\n const normalized = normalizeProgressSummary(text);\n const taskSummary = formatTaskSummary(timing.taskSummary);\n const blocks = [\n '*Live Update*',\n '_Current task is still running. This message updates in place until the final answer is ready._',\n this.lastUpdateKind === 'stall' ? DEFAULT_TASK_LIVE_UPDATE_STALL_NOTICE : '',\n taskSummary,\n normalized,\n formatProgressMetadata(timing),\n `\\`task_id: ${this.ctx.taskId}\\``,\n '`live_update: true`',\n ].filter(Boolean);\n return blocks.join('\\n\\n');\n }\n\n private scheduleMetadataRefresh(): Promise<void> {\n if (this.inflightMetadataRefresh) return this.inflightMetadataRefresh;\n const promise = this.refreshProgressMetadata().finally(() => {\n if (this.inflightMetadataRefresh === promise) {\n this.inflightMetadataRefresh = undefined;\n }\n });\n this.inflightMetadataRefresh = promise;\n return promise;\n }\n\n private async refreshProgressMetadata(): Promise<void> {\n if (this.completed || this.running || !this.lastUpdateText) return;\n const traceState = this.getTraceState();\n const message = this.decorateProgressText(\n this.lastUpdateText,\n {\n elapsedSeconds: Math.max(0, Math.floor((Date.now() - this.startedAt.getTime()) / 1000)),\n previousUpdateAt: this.lastUpdateAt,\n secondsSincePreviousUpdate: this.lastUpdateAt\n ? Math.max(0, Math.floor((Date.now() - this.lastUpdateAt.getTime()) / 1000))\n : undefined,\n activatedSkills: this.lastSkillMetadata?.activatedSkills,\n taskSummary: this.lastSkillMetadata?.taskSummary,\n },\n traceState.traceId\n );\n if (!message || message === this.lastPostedMessage) return;\n if (this.completed) return;\n try {\n logger.debug(\n `[TaskLiveUpdates] Refreshing metadata-only live update for task ${this.ctx.taskId}`\n );\n const result = await this.trackPublish(this.ctx.sink.update(message));\n this.recordSinkRef(result);\n this.lastPostedMessage = message;\n } catch (err) {\n logger.warn(\n `[TaskLiveUpdates] Metadata refresh failed for task ${this.ctx.taskId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n\n private async maybePublishStallFallback(traceSnapshot: string, traceId?: string): Promise<void> {\n if (this.completed) return;\n const now = new Date();\n if (\n this.lastStallFallbackAt &&\n now.getTime() - this.lastStallFallbackAt.getTime() <\n DEFAULT_TASK_LIVE_UPDATE_STALL_FALLBACK_SECONDS * 1000\n ) {\n return;\n }\n if (\n this.lastUpdateAt &&\n now.getTime() - this.lastUpdateAt.getTime() <\n DEFAULT_TASK_LIVE_UPDATE_STALL_FALLBACK_SECONDS * 1000\n ) {\n return;\n }\n this.lastSkillMetadata = await this.deps.extractSkillMetadata(\n this.getTraceState().traceRef || traceId || '',\n traceId\n );\n\n const fallback = buildStallFallbackSummary(traceSnapshot, this.lastUpdateText);\n const baseText = this.lastUpdateText || fallback;\n if (!baseText) return;\n\n logger.info(\n `[TaskLiveUpdates] Publishing stall notice for task ${this.ctx.taskId}: ${baseText.slice(0, 160)}`\n );\n this.lastUpdateKind = 'stall';\n if (this.completed) return;\n const message = this.decorateProgressText(\n baseText,\n {\n elapsedSeconds: Math.max(0, Math.floor((Date.now() - this.startedAt.getTime()) / 1000)),\n previousUpdateAt: this.lastUpdateAt,\n secondsSincePreviousUpdate: this.lastUpdateAt\n ? Math.max(0, Math.floor((Date.now() - this.lastUpdateAt.getTime()) / 1000))\n : undefined,\n activatedSkills: this.lastSkillMetadata?.activatedSkills,\n taskSummary: this.lastSkillMetadata?.taskSummary,\n },\n traceId\n );\n if (message === this.lastPostedMessage) {\n this.lastStallFallbackAt = now;\n return;\n }\n if (this.completed) return;\n const result = await this.trackPublish(this.ctx.sink.update(message));\n this.recordSinkRef(result);\n if (!this.lastUpdateText) {\n this.ctx.appendHistory?.(baseText, 'progress');\n this.lastUpdateText = baseText;\n this.lastUpdateAt = now;\n }\n this.lastPostedMessage = message;\n this.lastStallFallbackAt = now;\n }\n}\n\nasync function defaultSerializeTrace(\n traceRef: string,\n maxChars: number,\n traceId?: string\n): Promise<string | undefined> {\n logger.debug(\n `[TaskLiveUpdates] Serializing trace for progress update (traceRef=${traceRef}, traceId=${traceId || '-'}, sink=${process.env.VISOR_TELEMETRY_SINK || 'auto'})`\n );\n return serializeTraceForPrompt(traceRef, maxChars, undefined, undefined, traceId);\n}\n\nexport async function summarizeTaskProgress(\n input: TaskProgressSummaryInput\n): Promise<string | null> {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { ProbeAgent } = require('@probelabs/probe');\n\n const agentOptions: Record<string, unknown> = {\n sessionId: `visor-task-progress-${Date.now()}-${crypto.randomUUID().slice(0, 8)}`,\n systemPrompt: input.config.prompt,\n maxIterations: 1,\n disableTools: true,\n };\n if (input.config.model) agentOptions.model = input.config.model;\n if (input.config.provider) agentOptions.provider = input.config.provider;\n\n const agent = new ProbeAgent(agentOptions);\n if (typeof agent.initialize === 'function') {\n await agent.initialize();\n }\n\n const userPrompt = [\n `<user_request>\\n${input.requestText}\\n</user_request>`,\n input.previousUpdate\n ? `<previous_update>\\n${input.previousUpdate}\\n</previous_update>`\n : '<previous_update>(none)</previous_update>',\n `<timing>\\nstarted_at: ${input.startedAt.toISOString()}\\nnow: ${input.now.toISOString()}\\nelapsed: ${formatDuration(input.elapsedSeconds)}\\nlast_update_at: ${input.previousUpdateAt ? input.previousUpdateAt.toISOString() : '(none)'}\\ntime_since_last_update: ${\n input.previousUpdateAt ? formatDuration(input.secondsSincePreviousUpdate || 0) : '(none)'\n }\\n</timing>`,\n `<execution_trace>\\n${input.traceSnapshot}\\n</execution_trace>`,\n ].join('\\n\\n');\n\n const response = await agent.answer(userPrompt);\n const cleaned = response\n .replace(/^```(?:markdown|md|text)?\\s*\\n?/i, '')\n .replace(/\\n?```\\s*$/m, '')\n .trim();\n return cleaned || null;\n}\n\nfunction formatDuration(totalSeconds: number): string {\n const seconds = Math.max(0, Math.floor(totalSeconds));\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = seconds % 60;\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (remainingSeconds > 0 || parts.length === 0) parts.push(`${remainingSeconds}s`);\n return parts.join(' ');\n}\n\nfunction normalizeProgressSummary(text: string): string {\n const wantedLabels = ['Progress', 'Last done', 'Now', 'Waiting on'];\n const lines = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(Boolean);\n\n const matched = new Map<string, string>();\n for (const line of lines) {\n const match = line.match(/^-?\\s*(Progress|Last done|Now|Waiting on|Timing)\\s*:\\s*(.+)$/i);\n if (!match) continue;\n const label = match[1].toLowerCase();\n if (label === 'timing') continue;\n const canonical = wantedLabels.find(item => item.toLowerCase() === label);\n if (canonical && !matched.has(canonical)) {\n matched.set(canonical, match[2].trim());\n }\n }\n\n if (matched.size === wantedLabels.length) {\n return wantedLabels.map(label => `- ${label}: ${matched.get(label)}`).join('\\n');\n }\n\n const withoutTiming = lines.filter(line => !/^-?\\s*(Timing|Metadata|Trace)\\s*:/i.test(line));\n return withoutTiming.join('\\n');\n}\n\nfunction formatProgressMetadata(timing: ProgressTimingMetadata): string {\n const parts = [`elapsed ${formatDuration(timing.elapsedSeconds)}`];\n if (timing.previousUpdateAt) {\n parts.push(`previous update ${formatDuration(timing.secondsSincePreviousUpdate || 0)} ago`);\n parts.push(`at ${timing.previousUpdateAt.toISOString()}`);\n } else {\n parts.push('first live update');\n }\n if (timing.activatedSkills && timing.activatedSkills.length > 0) {\n parts.push(`activated skills ${formatSkillList(timing.activatedSkills)}`);\n }\n return `_Metadata: ${parts.join(' | ')}_`;\n}\n\nfunction formatTaskStatusMarker(status: string): string {\n switch (status) {\n case 'completed':\n return '[x]';\n case 'in_progress':\n return '[~]';\n case 'blocked':\n case 'failed':\n case 'error':\n return '[!]';\n case 'deleted':\n case 'cancelled':\n case 'canceled':\n return '[-]';\n default:\n return '[ ]';\n }\n}\n\nfunction formatTaskLabel(task: { id: string; title: string; status: string }): string {\n const title = String(task.title || '').trim();\n return title || task.id || task.status;\n}\n\nfunction scopeHasRenderableTasks(scope: NonNullable<ProbeTaskSummary['scopes']>[number]): boolean {\n if (scope.tasks.some(task => !task.synthetic)) return true;\n return scope.children.some(child => scopeHasRenderableTasks(child));\n}\n\nfunction appendTaskScopeLines(\n lines: string[],\n scope: NonNullable<ProbeTaskSummary['scopes']>[number],\n depth = 0\n): void {\n if (!scopeHasRenderableTasks(scope)) return;\n const prefix = ' '.repeat(depth);\n if (depth > 0 || scope.label !== 'Main Agent') {\n lines.push(`${prefix}${scope.label}`);\n }\n const visibleTasks = scope.tasks.filter(task => !task.synthetic).slice(0, 8);\n for (const task of visibleTasks) {\n lines.push(`${prefix}• ${formatTaskStatusMarker(task.status)} ${formatTaskLabel(task)}`);\n }\n const hiddenCount = scope.tasks.filter(task => !task.synthetic).length - visibleTasks.length;\n if (hiddenCount > 0) {\n lines.push(`${prefix}• ... ${hiddenCount} more`);\n }\n for (const child of scope.children) {\n appendTaskScopeLines(lines, child, depth + 1);\n }\n}\n\nfunction formatTaskSummary(summary?: ProbeTaskSummary): string | undefined {\n if (!summary || summary.tasks.length === 0) return undefined;\n const lines = ['*Tasks*'];\n if (summary.scopes.length > 0) {\n for (const scope of summary.scopes) appendTaskScopeLines(lines, scope);\n } else {\n const visibleTasks = summary.tasks.filter(task => !task.synthetic).slice(0, 8);\n for (const task of visibleTasks) {\n lines.push(`• ${formatTaskStatusMarker(task.status)} ${formatTaskLabel(task)}`);\n }\n const hiddenCount = summary.tasks.filter(task => !task.synthetic).length - visibleTasks.length;\n if (hiddenCount > 0) {\n lines.push(`• ... ${hiddenCount} more`);\n }\n }\n return lines.length > 1 ? lines.join('\\n') : undefined;\n}\n\nfunction formatSkillList(skills: string[]): string {\n const normalized = dedupeStrings(skills);\n if (normalized.length <= 4) return normalized.join(', ');\n return `${normalized.slice(0, 4).join(', ')} +${normalized.length - 4} more`;\n}\n\nfunction dedupeStrings(values: string[] | undefined): string[] {\n if (!Array.isArray(values)) return [];\n return [...new Set(values.map(value => String(value || '').trim()).filter(Boolean))];\n}\n\nexport async function extractTraceSkillMetadata(\n traceRef: string,\n traceId?: string\n): Promise<TaskLiveUpdateSkillMetadata | undefined> {\n if (!traceRef && !traceId) return undefined;\n try {\n const spans = await fetchTraceSpans(traceRef || traceId!, { targetTraceId: traceId });\n if (!spans.length) return undefined;\n\n const routeIntentSpan = spans.find(\n span => span.attributes['visor.check.id'] === 'route-intent'\n );\n const buildConfigSpan = spans.find(\n span => span.attributes['visor.check.id'] === 'build-config'\n );\n const classifySpan = spans.find(span => span.attributes['visor.check.id'] === 'classify');\n\n const routeIntentOutput = parseJsonAttribute(routeIntentSpan?.attributes['visor.check.output']);\n const classifyOutput = parseJsonAttribute(classifySpan?.attributes['visor.check.output']);\n const buildConfigOutput = parseJsonAttribute(buildConfigSpan?.attributes['visor.check.output']);\n\n const activatedSkills = dedupeStrings(\n Array.isArray(buildConfigOutput?.activated_skills)\n ? buildConfigOutput.activated_skills\n : undefined\n );\n\n const fallbackActivatedSkills = dedupeStrings(\n (Array.isArray(routeIntentOutput?.skills) ? routeIntentOutput.skills : undefined) ||\n (Array.isArray(classifyOutput?.skills) ? classifyOutput.skills : undefined)\n );\n\n const finalActivatedSkills =\n activatedSkills.length > 0 ? activatedSkills : fallbackActivatedSkills;\n const taskSummary = extractProbeTaskSummary(spans);\n if (!finalActivatedSkills.length && !taskSummary) return undefined;\n return {\n activatedSkills: finalActivatedSkills.length ? finalActivatedSkills : undefined,\n taskSummary: taskSummary || undefined,\n };\n } catch (err) {\n logger.debug(\n `[TaskLiveUpdates] Failed to extract skill metadata from trace: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n return undefined;\n }\n}\n\nfunction parseJsonAttribute(value: unknown): Record<string, any> | undefined {\n if (typeof value !== 'string' || !value.trim()) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction buildStallFallbackSummary(traceSnapshot: string, previousUpdate?: string): string {\n const lastDone =\n extractProgressField(previousUpdate, 'Last done') ||\n 'continuing from the last completed analysis step';\n\n const lower = traceSnapshot.toLowerCase();\n let now = 'waiting for the current analysis step to finish';\n let waitingOn = 'the current analysis step to complete';\n\n if (\n lower.includes('search.delegate') ||\n lower.includes('tool: search') ||\n lower.includes('search(')\n ) {\n now = 'running or waiting on the current code search step';\n waitingOn = 'search results and downstream analysis to finish';\n } else if (lower.includes('extract(') || lower.includes('tool: extract')) {\n now = 'extracting the relevant code or documentation context';\n waitingOn = 'the extract step to finish and be interpreted';\n } else if (lower.includes('engineer-task') || lower.includes('engineer')) {\n now = 'waiting on the current implementation or validation step';\n waitingOn = 'the engineer workflow to finish the current step';\n } else if (\n lower.includes('ai.request') ||\n lower.includes('gemini') ||\n lower.includes('claude') ||\n lower.includes('openai')\n ) {\n now = 'waiting on the current model analysis step';\n waitingOn = 'the active model response to finish';\n } else if (lower.includes('bash(') || lower.includes('go test') || lower.includes('npm test')) {\n now = 'running or waiting on command-based validation';\n waitingOn = 'the current command or test run to finish';\n } else if (lower.includes('setup-projects') || lower.includes('build-config')) {\n now = 'preparing the workspace and loading the required context';\n waitingOn = 'workspace setup and context loading to finish';\n }\n\n return [\n '- Progress: still working through the same step; no new completed action yet',\n `- Last done: ${lastDone}`,\n `- Now: ${now}`,\n `- Waiting on: ${waitingOn}`,\n ].join('\\n');\n}\n\nfunction extractProgressField(text: string | undefined, label: string): string | undefined {\n if (!text) return undefined;\n const match = text.match(new RegExp(`(?:^|\\\\n)-?\\\\s*${escapeRegExp(label)}\\\\s*:\\\\s*(.+)$`, 'im'));\n return match?.[1]?.trim() || undefined;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ConfigManager,
|
|
3
3
|
VALID_EVENT_TRIGGERS,
|
|
4
4
|
init_config
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-YTG5DN72.mjs";
|
|
6
6
|
import "./chunk-KWTCTEFT.mjs";
|
|
7
7
|
import "./chunk-LW3INISN.mjs";
|
|
8
8
|
import "./chunk-6E625R3C.mjs";
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
ConfigManager,
|
|
14
14
|
VALID_EVENT_TRIGGERS
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=config-
|
|
16
|
+
//# sourceMappingURL=config-H5IOLBFA.mjs.map
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatUserFacingExecutionMessage,
|
|
3
|
+
init_user_facing_error,
|
|
4
|
+
summarizeUserFacingIssues
|
|
5
|
+
} from "./chunk-TL3ZTYFY.mjs";
|
|
1
6
|
import {
|
|
2
7
|
__esm
|
|
3
8
|
} from "./chunk-J7LXIPZS.mjs";
|
|
@@ -523,6 +528,7 @@ var init_email_frontend = __esm({
|
|
|
523
528
|
"src/frontends/email-frontend.ts"() {
|
|
524
529
|
init_client();
|
|
525
530
|
init_markdown();
|
|
531
|
+
init_user_facing_error();
|
|
526
532
|
EmailFrontend = class {
|
|
527
533
|
name = "email";
|
|
528
534
|
subs = [];
|
|
@@ -601,12 +607,14 @@ var init_email_frontend = __esm({
|
|
|
601
607
|
if (checkId) text += `
|
|
602
608
|
Check: ${checkId}`;
|
|
603
609
|
if (message) text += `
|
|
604
|
-
${message}`;
|
|
610
|
+
${formatUserFacingExecutionMessage(message)}`;
|
|
605
611
|
const sendOpts = {
|
|
606
612
|
to: ev.from,
|
|
607
613
|
subject: ev.subject ? addRePrefix(ev.subject) : `Visor: ${title}`,
|
|
608
614
|
text,
|
|
609
|
-
html: wrapInEmailTemplate(
|
|
615
|
+
html: wrapInEmailTemplate(
|
|
616
|
+
`<p><strong>${title}</strong></p><p>${formatUserFacingExecutionMessage(message)}</p>`
|
|
617
|
+
)
|
|
610
618
|
};
|
|
611
619
|
if (ev.messageId) {
|
|
612
620
|
sendOpts.inReplyTo = ev.messageId;
|
|
@@ -656,6 +664,13 @@ ${message}`;
|
|
|
656
664
|
if (out && typeof out._rawOutput === "string" && out._rawOutput.trim().length > 0) {
|
|
657
665
|
text = (text || "") + "\n\n" + out._rawOutput.trim();
|
|
658
666
|
}
|
|
667
|
+
if (!text) {
|
|
668
|
+
const issueSummary = summarizeUserFacingIssues(result?.issues || []);
|
|
669
|
+
if (issueSummary) {
|
|
670
|
+
text = issueSummary;
|
|
671
|
+
this.errorNotified = true;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
659
674
|
if (!text) {
|
|
660
675
|
ctx.logger.info(`[email-frontend] skip posting reply for ${checkId}: no renderable text`);
|
|
661
676
|
return;
|
|
@@ -698,4 +713,4 @@ init_email_frontend();
|
|
|
698
713
|
export {
|
|
699
714
|
EmailFrontend
|
|
700
715
|
};
|
|
701
|
-
//# sourceMappingURL=email-frontend-
|
|
716
|
+
//# sourceMappingURL=email-frontend-AE5TYWNC.mjs.map
|