@probelabs/visor 0.1.184-ee → 0.1.185
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/dist/{102.index.js → 140.index.js} +3 -3
- package/dist/{736.index.js → 142.index.js} +36 -36
- package/dist/{961.index.js → 223.index.js} +16 -16
- package/dist/{840.index.js → 676.index.js} +12 -12
- package/dist/{663.index.js → 85.index.js} +15 -15
- 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.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.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.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.map +1 -1
- package/dist/check-execution-engine.d.ts.map +1 -1
- 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/dependency-resolver.d.ts.map +1 -1
- 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.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.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.map +1 -1
- package/dist/index.js +8140 -9956
- 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-03-21T19-15-13-188Z.ndjson +252 -0
- package/dist/output/traces/run-2026-03-21T19-15-52-421Z.ndjson +3148 -0
- 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/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-OI4OVSKC.mjs → a2a-frontend-JZA4Z24P.mjs} +3 -3
- package/dist/sdk/{check-provider-registry-RITJW67U.mjs → check-provider-registry-XYPGKCY4.mjs} +6 -6
- package/dist/sdk/{chunk-QLT42TX7.mjs → chunk-J3BA347Q.mjs} +2 -2
- package/dist/sdk/{chunk-ZYDRR6PZ.mjs → chunk-ROLS2CKF.mjs} +182 -182
- package/dist/sdk/{chunk-ZYDRR6PZ.mjs.map → chunk-ROLS2CKF.mjs.map} +1 -1
- package/dist/sdk/{chunk-7XKHFRPN.mjs → chunk-WRRRKWYW.mjs} +2 -2
- package/dist/sdk/{chunk-UM7LGO2P.mjs → chunk-YIKN7TSP.mjs} +3 -3
- package/dist/sdk/{chunk-PUHU6UY6.mjs → chunk-YXRO7X7C.mjs} +2 -2
- package/dist/sdk/chunk-YXRO7X7C.mjs.map +1 -0
- package/dist/sdk/{dist-PN5UHL6A.mjs → dist-VBYEFQ6T.mjs} +22 -75
- package/dist/sdk/dist-VBYEFQ6T.mjs.map +1 -0
- package/dist/sdk/{email-frontend-6JU4L33L.mjs → email-frontend-P7QE4UUJ.mjs} +2 -2
- package/dist/sdk/{failure-condition-evaluator-USY3ISVA.mjs → failure-condition-evaluator-WY5S2SU2.mjs} +4 -4
- package/dist/sdk/{github-frontend-2T5PWYD5.mjs → github-frontend-O22WILVL.mjs} +4 -4
- package/dist/sdk/{host-RM6UJEPP.mjs → host-HJXAU545.mjs} +4 -4
- package/dist/sdk/{routing-NNQQSLWA.mjs → routing-Q6QSYM5L.mjs} +5 -5
- package/dist/sdk/{schedule-tool-EMNF3FPQ.mjs → schedule-tool-L7AHV4V7.mjs} +6 -6
- package/dist/sdk/{schedule-tool-handler-3R3IC6VA.mjs → schedule-tool-handler-RDTTPA7Y.mjs} +6 -6
- package/dist/sdk/sdk.js +916 -2290
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +5 -5
- package/dist/sdk/{trace-helpers-OMF4C24T.mjs → trace-helpers-CHHZEO7P.mjs} +3 -3
- package/dist/sdk/{track-execution-3CHMGEPH.mjs → track-execution-FX5ZX47L.mjs} +2 -2
- package/dist/sdk/{workflow-check-provider-TC2G33WF.mjs → workflow-check-provider-67W3MGOP.mjs} +6 -6
- package/dist/sdk.d.ts.map +1 -1
- 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.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.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/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.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.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.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-03-21T19-15-13-188Z.ndjson +252 -0
- package/dist/traces/run-2026-03-21T19-15-52-421Z.ndjson +3148 -0
- 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.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/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/workspace-manager.d.ts.map +1 -1
- package/dist/utils/worktree-cleanup.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/workflow-executor.d.ts.map +1 -1
- package/dist/workflow-registry.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/enterprise/license/validator.d.ts +0 -39
- package/dist/enterprise/license/validator.d.ts.map +0 -1
- package/dist/enterprise/loader.d.ts +0 -25
- package/dist/enterprise/loader.d.ts.map +0 -1
- package/dist/enterprise/policy/opa-compiler.d.ts +0 -37
- package/dist/enterprise/policy/opa-compiler.d.ts.map +0 -1
- package/dist/enterprise/policy/opa-http-evaluator.d.ts +0 -36
- package/dist/enterprise/policy/opa-http-evaluator.d.ts.map +0 -1
- package/dist/enterprise/policy/opa-policy-engine.d.ts +0 -48
- package/dist/enterprise/policy/opa-policy-engine.d.ts.map +0 -1
- package/dist/enterprise/policy/opa-wasm-evaluator.d.ts +0 -34
- package/dist/enterprise/policy/opa-wasm-evaluator.d.ts.map +0 -1
- package/dist/enterprise/policy/policy-input-builder.d.ts +0 -122
- package/dist/enterprise/policy/policy-input-builder.d.ts.map +0 -1
- package/dist/enterprise/scheduler/knex-store.d.ts +0 -47
- package/dist/enterprise/scheduler/knex-store.d.ts.map +0 -1
- package/dist/sdk/check-provider-registry-ZZ6N4GDP.mjs +0 -32
- package/dist/sdk/chunk-PUHU6UY6.mjs.map +0 -1
- package/dist/sdk/chunk-YYFSAAD6.mjs +0 -47061
- package/dist/sdk/chunk-YYFSAAD6.mjs.map +0 -1
- package/dist/sdk/dist-NERCHNRR.mjs +0 -7955
- package/dist/sdk/dist-NERCHNRR.mjs.map +0 -1
- package/dist/sdk/dist-PN5UHL6A.mjs.map +0 -1
- package/dist/sdk/email-frontend-ECHQCFTR.mjs +0 -701
- package/dist/sdk/email-frontend-ECHQCFTR.mjs.map +0 -1
- package/dist/sdk/host-OJSMCLKK.mjs +0 -87
- package/dist/sdk/host-RM6UJEPP.mjs.map +0 -1
- package/dist/sdk/knex-store-KCMFAMH5.mjs +0 -527
- package/dist/sdk/knex-store-KCMFAMH5.mjs.map +0 -1
- package/dist/sdk/loader-35YWX5UQ.mjs +0 -89
- package/dist/sdk/loader-35YWX5UQ.mjs.map +0 -1
- package/dist/sdk/opa-policy-engine-FY5D45YS.mjs +0 -655
- package/dist/sdk/opa-policy-engine-FY5D45YS.mjs.map +0 -1
- package/dist/sdk/schedule-tool-ADZ2ON4I.mjs +0 -38
- package/dist/sdk/schedule-tool-handler-F76ZD2WU.mjs +0 -42
- package/dist/sdk/schedule-tool-handler-F76ZD2WU.mjs.map +0 -1
- package/dist/sdk/trace-helpers-OMF4C24T.mjs.map +0 -1
- package/dist/sdk/validator-XTZJZZJH.mjs +0 -134
- package/dist/sdk/validator-XTZJZZJH.mjs.map +0 -1
- package/dist/sdk/workflow-check-provider-TC2G33WF.mjs.map +0 -1
- package/dist/sdk/workflow-check-provider-U4UXZ5YS.mjs +0 -32
- package/dist/sdk/workflow-check-provider-U4UXZ5YS.mjs.map +0 -1
- /package/dist/sdk/{a2a-frontend-OI4OVSKC.mjs.map → a2a-frontend-JZA4Z24P.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-RITJW67U.mjs.map → check-provider-registry-XYPGKCY4.mjs.map} +0 -0
- /package/dist/sdk/{chunk-QLT42TX7.mjs.map → chunk-J3BA347Q.mjs.map} +0 -0
- /package/dist/sdk/{chunk-7XKHFRPN.mjs.map → chunk-WRRRKWYW.mjs.map} +0 -0
- /package/dist/sdk/{chunk-UM7LGO2P.mjs.map → chunk-YIKN7TSP.mjs.map} +0 -0
- /package/dist/sdk/{email-frontend-6JU4L33L.mjs.map → email-frontend-P7QE4UUJ.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-ZZ6N4GDP.mjs.map → failure-condition-evaluator-WY5S2SU2.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-2T5PWYD5.mjs.map → github-frontend-O22WILVL.mjs.map} +0 -0
- /package/dist/sdk/{host-OJSMCLKK.mjs.map → host-HJXAU545.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-USY3ISVA.mjs.map → routing-Q6QSYM5L.mjs.map} +0 -0
- /package/dist/sdk/{routing-NNQQSLWA.mjs.map → schedule-tool-L7AHV4V7.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-ADZ2ON4I.mjs.map → schedule-tool-handler-RDTTPA7Y.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-EMNF3FPQ.mjs.map → trace-helpers-CHHZEO7P.mjs.map} +0 -0
- /package/dist/sdk/{track-execution-3CHMGEPH.mjs.map → track-execution-FX5ZX47L.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-3R3IC6VA.mjs.map → workflow-check-provider-67W3MGOP.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/email/client.ts","../../src/email/markdown.ts","../../src/frontends/email-frontend.ts"],"sourcesContent":["// Multi-backend email client for Visor.\n// Supports IMAP+SMTP (universal) and Resend (managed) for send/receive.\n//\n// Receive backends:\n// - IMAP (imapflow): connect, fetchNewMessages, IDLE for push\n// - Resend polling: GET /emails/receiving to list inbound, then GET /emails/{id} for full content\n// - Resend webhook: webhook metadata → GET /emails/{id} for full content+headers\n//\n// Send backends:\n// - SMTP (nodemailer): createTransport once, multipart/alternative\n// - Resend (resend SDK): resend.emails.send() with threading headers\n\nimport { createHash, randomUUID } from 'crypto';\n\nexport interface EmailMessage {\n id: string; // internal ID (IMAP UID or Resend email_id)\n messageId: string; // Message-ID header\n inReplyTo?: string; // In-Reply-To header\n references?: string[]; // References header chain\n from: string;\n to: string[];\n cc?: string[];\n subject: string;\n text: string;\n html?: string;\n date: Date;\n}\n\nexport interface EmailSendOptions {\n to: string | string[];\n subject: string;\n text: string;\n html?: string;\n inReplyTo?: string;\n references?: string[];\n messageId?: string;\n}\n\nexport interface EmailSendResult {\n ok: boolean;\n messageId?: string;\n error?: string;\n}\n\nexport interface ImapConfig {\n host: string;\n port?: number;\n auth: { user: string; pass: string };\n secure?: boolean;\n pollInterval?: number; // seconds (default: 30)\n folder?: string; // default: 'INBOX'\n markRead?: boolean; // default: true\n}\n\nexport interface SmtpConfig {\n host: string;\n port?: number;\n auth: { user: string; pass: string };\n secure?: boolean;\n from: string;\n}\n\nexport interface ResendConfig {\n apiKey: string;\n from?: string; // for sending\n webhookSecret?: string; // for inbound verification\n}\n\ntype ReceiveBackend = 'imap' | 'resend';\ntype SendBackend = 'smtp' | 'resend';\n\nexport class EmailClient {\n private receiveBackend: ReceiveBackend;\n private sendBackend: SendBackend;\n\n // IMAP\n private imapConfig?: ImapConfig;\n private imapClient?: any; // ImapFlow instance (lazily created)\n\n // SMTP\n private smtpConfig?: SmtpConfig;\n private smtpTransport?: any; // nodemailer transport\n\n // Resend\n private resendConfig?: ResendConfig;\n private resendClient?: any; // Resend instance\n\n private fromAddress: string;\n\n constructor(opts: {\n receive?: { type?: string } & Partial<ImapConfig> & Partial<ResendConfig>;\n send?: { type?: string } & Partial<SmtpConfig> & Partial<ResendConfig>;\n }) {\n this.receiveBackend = (opts.receive?.type as ReceiveBackend) || 'imap';\n this.sendBackend = (opts.send?.type as SendBackend) || 'smtp';\n\n // Configure IMAP (only when receive config is provided)\n if (this.receiveBackend === 'imap' && opts.receive) {\n const r = opts.receive;\n if (!r.host && !process.env.EMAIL_IMAP_HOST) {\n throw new Error('IMAP host is required (set receive.host or EMAIL_IMAP_HOST)');\n }\n this.imapConfig = {\n host: r.host || process.env.EMAIL_IMAP_HOST!,\n port: r.port || parseInt(process.env.EMAIL_IMAP_PORT || '993'),\n auth: {\n user: r.auth?.user || process.env.EMAIL_USER || '',\n pass: r.auth?.pass || process.env.EMAIL_PASSWORD || '',\n },\n secure: r.secure ?? true,\n pollInterval: r.pollInterval || parseInt(process.env.EMAIL_POLL_INTERVAL || '30'),\n folder: r.folder || 'INBOX',\n markRead: r.markRead ?? true,\n };\n }\n\n // Configure Resend for receive\n if (this.receiveBackend === 'resend') {\n const r = opts.receive!;\n const apiKey = (r as any).api_key || r.apiKey || process.env.RESEND_API_KEY;\n if (!apiKey) throw new Error('Resend API key is required for receive');\n this.resendConfig = {\n apiKey,\n webhookSecret:\n (r as any).webhook_secret || r.webhookSecret || process.env.RESEND_WEBHOOK_SECRET,\n };\n }\n\n // Configure SMTP\n if (this.sendBackend === 'smtp') {\n const s = opts.send!;\n if (!s.host && !process.env.EMAIL_SMTP_HOST) {\n throw new Error('SMTP host is required (set send.host or EMAIL_SMTP_HOST)');\n }\n this.smtpConfig = {\n host: s.host || process.env.EMAIL_SMTP_HOST!,\n port: s.port || parseInt(process.env.EMAIL_SMTP_PORT || '587'),\n auth: {\n user: s.auth?.user || process.env.EMAIL_USER || '',\n pass: s.auth?.pass || process.env.EMAIL_PASSWORD || '',\n },\n secure: s.secure ?? true,\n from: s.from || process.env.EMAIL_FROM || '',\n };\n }\n\n // Configure Resend for send\n if (this.sendBackend === 'resend') {\n const s = opts.send!;\n const apiKey = (s as any).api_key || s.apiKey || process.env.RESEND_API_KEY;\n if (!apiKey) throw new Error('Resend API key is required for send');\n if (!this.resendConfig) {\n this.resendConfig = { apiKey };\n }\n this.resendConfig.from = s.from || process.env.EMAIL_FROM;\n }\n\n // Determine from address\n this.fromAddress =\n opts.send?.from ||\n process.env.EMAIL_FROM ||\n this.smtpConfig?.from ||\n this.resendConfig?.from ||\n '';\n }\n\n /** Get the configured from address */\n getFromAddress(): string {\n return this.fromAddress;\n }\n\n /** Get the receive backend type */\n getReceiveBackend(): ReceiveBackend {\n return this.receiveBackend;\n }\n\n // ─── IMAP Receive ───\n\n /** Connect to IMAP server */\n async connectImap(): Promise<void> {\n if (this.receiveBackend !== 'imap' || !this.imapConfig) return;\n const { ImapFlow } = await import('imapflow');\n this.imapClient = new ImapFlow({\n host: this.imapConfig.host,\n port: this.imapConfig.port || 993,\n secure: this.imapConfig.secure ?? true,\n auth: this.imapConfig.auth,\n logger: false,\n });\n await this.imapClient.connect();\n }\n\n /** Fetch unseen messages from IMAP */\n async fetchNewMessages(): Promise<EmailMessage[]> {\n if (!this.imapClient || !this.imapConfig) return [];\n const { simpleParser } = await import('mailparser');\n\n const lock = await this.imapClient.getMailboxLock(this.imapConfig.folder || 'INBOX');\n try {\n const messages: EmailMessage[] = [];\n for await (const msg of this.imapClient.fetch({ seen: false }, { source: true, uid: true })) {\n const parsed = await simpleParser(msg.source);\n const messageId = parsed.messageId || `<${randomUUID()}@visor>`;\n const inReplyTo = typeof parsed.inReplyTo === 'string' ? parsed.inReplyTo : undefined;\n const references = parsed.references\n ? Array.isArray(parsed.references)\n ? parsed.references\n : [parsed.references]\n : undefined;\n\n messages.push({\n id: String(msg.uid),\n messageId,\n inReplyTo,\n references,\n from: typeof parsed.from?.text === 'string' ? parsed.from.text : '',\n to: parsed.to\n ? Array.isArray(parsed.to)\n ? parsed.to.map((a: any) => a.text || '')\n : [parsed.to.text || '']\n : [],\n cc: parsed.cc\n ? Array.isArray(parsed.cc)\n ? parsed.cc.map((a: any) => a.text || '')\n : [parsed.cc.text || '']\n : undefined,\n subject: parsed.subject || '',\n text: parsed.text || '',\n html: parsed.html || undefined,\n date: parsed.date || new Date(),\n });\n\n // Mark as read\n if (this.imapConfig.markRead !== false) {\n try {\n await this.imapClient.messageFlagsAdd({ uid: msg.uid }, ['\\\\Seen'], { uid: true });\n } catch {}\n }\n }\n return messages;\n } finally {\n lock.release();\n }\n }\n\n /** Disconnect IMAP */\n async disconnectImap(): Promise<void> {\n if (this.imapClient) {\n try {\n await this.imapClient.logout();\n } catch {}\n this.imapClient = undefined;\n }\n }\n\n // ─── Resend Receive ───\n\n /** Fetch full email content from Resend by ID */\n async fetchResendEmail(emailId: string): Promise<EmailMessage | null> {\n try {\n const resend = await this.getResendClient();\n const result = await resend.emails.get(emailId);\n const email: any = (result as any).data || result;\n if (!email) return null;\n\n // Extract threading headers\n const headers: Record<string, string> = {};\n if (Array.isArray(email.headers)) {\n for (const h of email.headers) {\n if (h.name && h.value) headers[h.name.toLowerCase()] = h.value;\n }\n } else if (email.headers && typeof email.headers === 'object') {\n for (const [k, v] of Object.entries(email.headers)) {\n headers[k.toLowerCase()] = String(v);\n }\n }\n\n const references = headers['references']\n ? headers['references'].split(/\\s+/).filter(Boolean)\n : undefined;\n\n return {\n id: emailId,\n messageId: headers['message-id'] || `<${emailId}@resend>`,\n inReplyTo: headers['in-reply-to'] || undefined,\n references,\n from: typeof email.from === 'string' ? email.from : email.from?.email || '',\n to: Array.isArray(email.to)\n ? email.to.map((t: any) => (typeof t === 'string' ? t : t?.email || ''))\n : [String(email.to || '')],\n subject: email.subject || '',\n text: email.text || email.body || '',\n html: email.html || undefined,\n date: email.created_at ? new Date(email.created_at) : new Date(),\n };\n } catch (err) {\n console.warn(`[EmailClient] Failed to fetch Resend email ${emailId}: ${err}`);\n return null;\n }\n }\n\n /**\n * List received inbound emails from Resend via polling.\n * Uses GET /emails/receiving with cursor-based pagination.\n * Returns email summaries (call fetchResendEmail for full content).\n */\n async listReceivedEmails(opts?: { limit?: number; after?: string }): Promise<{\n emails: Array<{\n id: string;\n from: string;\n to: string[];\n subject: string;\n created_at: string;\n message_id?: string;\n }>;\n hasMore: boolean;\n lastId?: string;\n }> {\n if (!this.resendConfig?.apiKey) {\n return { emails: [], hasMore: false };\n }\n\n try {\n const params = new URLSearchParams();\n if (opts?.limit) params.set('limit', String(opts.limit));\n if (opts?.after) params.set('after', opts.after);\n const qs = params.toString();\n const url = `https://api.resend.com/emails/receiving${qs ? `?${qs}` : ''}`;\n\n const resp = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.resendConfig.apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!resp.ok) {\n console.warn(\n `[EmailClient] Resend list received failed: ${resp.status} ${resp.statusText}`\n );\n return { emails: [], hasMore: false };\n }\n\n const body: any = await resp.json();\n const data = Array.isArray(body.data) ? body.data : [];\n const emails = data.map((e: any) => ({\n id: e.id,\n from: typeof e.from === 'string' ? e.from : e.from?.email || '',\n to: Array.isArray(e.to)\n ? e.to.map((t: any) => (typeof t === 'string' ? t : t?.email || ''))\n : [],\n subject: e.subject || '',\n created_at: e.created_at || '',\n message_id: e.message_id,\n }));\n\n const lastId = emails.length > 0 ? emails[emails.length - 1].id : undefined;\n return {\n emails,\n hasMore: !!body.has_more,\n lastId,\n };\n } catch (err) {\n console.warn(`[EmailClient] Resend list received error: ${err}`);\n return { emails: [], hasMore: false };\n }\n }\n\n /** Verify Resend webhook signature */\n async verifyResendWebhook(payload: string, headers: Record<string, string>): Promise<boolean> {\n if (!this.resendConfig?.webhookSecret) return true; // no secret = skip verification\n try {\n const { Webhook } = await import('svix');\n const wh = new Webhook(this.resendConfig.webhookSecret);\n wh.verify(payload, {\n 'svix-id': headers['svix-id'] || '',\n 'svix-timestamp': headers['svix-timestamp'] || '',\n 'svix-signature': headers['svix-signature'] || '',\n });\n return true;\n } catch {\n return false;\n }\n }\n\n // ─── Send ───\n\n /** Send an email via configured backend (SMTP or Resend) */\n async sendEmail(opts: EmailSendOptions): Promise<EmailSendResult> {\n const messageId = opts.messageId || `<${randomUUID()}@visor>`;\n\n if (this.sendBackend === 'resend') {\n return this.sendViaResend(opts, messageId);\n }\n return this.sendViaSmtp(opts, messageId);\n }\n\n private async sendViaSmtp(opts: EmailSendOptions, messageId: string): Promise<EmailSendResult> {\n try {\n const transport = await this.getSmtpTransport();\n const to = Array.isArray(opts.to) ? opts.to.join(', ') : opts.to;\n\n const mailOpts: Record<string, any> = {\n from: this.fromAddress,\n to,\n subject: opts.subject,\n text: opts.text,\n messageId,\n };\n\n if (opts.html) mailOpts.html = opts.html;\n if (opts.inReplyTo) mailOpts.inReplyTo = opts.inReplyTo;\n if (opts.references && opts.references.length > 0) {\n mailOpts.references = opts.references.join(' ');\n }\n\n const info = await transport.sendMail(mailOpts);\n return {\n ok: true,\n messageId: info.messageId || messageId,\n };\n } catch (err: any) {\n const errMsg = err?.message || String(err);\n console.warn(`[EmailClient] SMTP send failed: ${errMsg}`);\n return { ok: false, error: errMsg };\n }\n }\n\n private async sendViaResend(opts: EmailSendOptions, messageId: string): Promise<EmailSendResult> {\n try {\n const resend = await this.getResendClient();\n const to = Array.isArray(opts.to) ? opts.to : [opts.to];\n\n const headers: Record<string, string> = {};\n headers['Message-ID'] = messageId;\n if (opts.inReplyTo) headers['In-Reply-To'] = opts.inReplyTo;\n if (opts.references && opts.references.length > 0) {\n headers['References'] = opts.references.join(' ');\n }\n\n const sendOpts: Record<string, any> = {\n from: this.fromAddress,\n to,\n subject: opts.subject,\n text: opts.text,\n headers,\n };\n if (opts.html) sendOpts.html = opts.html;\n\n const result = await resend.emails.send(sendOpts);\n const data: any = (result as any).data || result;\n return {\n ok: true,\n messageId: data?.id ? `<${data.id}@resend>` : messageId,\n };\n } catch (err: any) {\n const errMsg = err?.message || String(err);\n console.warn(`[EmailClient] Resend send failed: ${errMsg}`);\n return { ok: false, error: errMsg };\n }\n }\n\n // ─── Lazy initialization helpers ───\n\n private async getSmtpTransport(): Promise<any> {\n if (this.smtpTransport) return this.smtpTransport;\n const nodemailer = await import('nodemailer');\n this.smtpTransport = nodemailer.createTransport({\n host: this.smtpConfig!.host,\n port: this.smtpConfig!.port || 587,\n secure: this.smtpConfig!.secure ?? true,\n auth: this.smtpConfig!.auth,\n });\n return this.smtpTransport;\n }\n\n private async getResendClient(): Promise<any> {\n if (this.resendClient) return this.resendClient;\n const { Resend } = await import('resend');\n this.resendClient = new Resend(this.resendConfig!.apiKey);\n return this.resendClient;\n }\n\n /** Generate a deterministic thread ID from a Message-ID chain */\n static deriveThreadId(rootMessageId: string): string {\n return createHash('sha256').update(rootMessageId).digest('hex').slice(0, 16);\n }\n}\n","// Markdown → email HTML converter.\n// Converts AI Markdown output to email-compatible HTML with inline styles.\n//\n// Supported conversions:\n// - # Header → <h1 style=\"...\">Header</h1>\n// - **bold** → <strong>bold</strong>\n// - *italic* → <em>italic</em>\n// - ~~strike~~ → <del>strike</del>\n// - `code` → <code style=\"...\">code</code>\n// - ```block``` → <pre style=\"...\"><code>block</code></pre>\n// - [label](url) → <a href=\"url\">label</a>\n// - > blockquote → <blockquote style=\"...\">text</blockquote>\n// - - item → <ul><li>item</li></ul>\n// - 1. item → <ol><li>item</li></ol>\n// - --- → <hr>\n// HTML entities escaped: & < >\n\n/** Escape HTML entities in text */\nexport function escapeHtml(text: string): string {\n return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/**\n * Convert Markdown text to email-compatible HTML.\n * Processes line-by-line, respecting fenced code blocks.\n */\nexport function markdownToEmailHtml(text: string): string {\n if (!text || typeof text !== 'string') return '';\n\n const lines = text.split(/\\r?\\n/);\n const result: string[] = [];\n let inCodeBlock = false;\n let codeBlockLang = '';\n let codeLines: string[] = [];\n let inBlockquote = false;\n let blockquoteLines: string[] = [];\n const listStack: ('ul' | 'ol')[] = [];\n\n const flushBlockquote = () => {\n if (blockquoteLines.length > 0) {\n result.push(\n `<blockquote style=\"border-left:3px solid #ccc;margin:8px 0;padding:4px 12px;color:#555;\">${blockquoteLines.join('<br>')}</blockquote>`\n );\n blockquoteLines = [];\n inBlockquote = false;\n }\n };\n\n const flushList = () => {\n while (listStack.length > 0) {\n const tag = listStack.pop()!;\n result.push(`</${tag}>`);\n }\n };\n\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimStart();\n\n // Track fenced code blocks\n if (/^```/.test(trimmed)) {\n if (!inCodeBlock) {\n flushBlockquote();\n flushList();\n inCodeBlock = true;\n codeBlockLang = trimmed.slice(3).trim();\n codeLines = [];\n } else {\n const escaped = codeLines.map(l => escapeHtml(l)).join('\\n');\n const langAttr = codeBlockLang ? ` class=\"language-${escapeHtml(codeBlockLang)}\"` : '';\n result.push(\n `<pre style=\"background:#f4f4f4;padding:12px;border-radius:4px;overflow-x:auto;font-size:13px;\"><code${langAttr}>${escaped}</code></pre>`\n );\n inCodeBlock = false;\n codeBlockLang = '';\n codeLines = [];\n }\n continue;\n }\n if (inCodeBlock) {\n codeLines.push(lines[i]);\n continue;\n }\n\n // Blockquotes: > text\n const bqMatch = /^>\\s?(.*)$/.exec(trimmed);\n if (bqMatch) {\n flushList();\n inBlockquote = true;\n blockquoteLines.push(convertInline(bqMatch[1]));\n continue;\n } else if (inBlockquote) {\n flushBlockquote();\n }\n\n // Bullet lists: \"- item\" or \"* item\"\n const bulletMatch = /^(\\s*)([-*])\\s+(.+)$/.exec(lines[i]);\n if (bulletMatch) {\n if (listStack.length === 0 || listStack[listStack.length - 1] !== 'ul') {\n flushList();\n listStack.push('ul');\n result.push('<ul style=\"margin:4px 0;padding-left:24px;\">');\n }\n result.push(`<li>${convertInline(bulletMatch[3])}</li>`);\n continue;\n }\n\n // Numbered lists: \"1. item\"\n const numMatch = /^(\\s*)(\\d+)\\.\\s+(.+)$/.exec(lines[i]);\n if (numMatch) {\n if (listStack.length === 0 || listStack[listStack.length - 1] !== 'ol') {\n flushList();\n listStack.push('ol');\n result.push('<ol style=\"margin:4px 0;padding-left:24px;\">');\n }\n result.push(`<li>${convertInline(numMatch[3])}</li>`);\n continue;\n }\n\n // Close any open list if we hit a non-list line\n if (listStack.length > 0) flushList();\n\n const line = lines[i];\n\n // Headers: # Header → <h1>...</h1> etc.\n const headerMatch = /^(#{1,6})\\s+(.+)$/.exec(line.trimStart());\n if (headerMatch) {\n const level = headerMatch[1].length;\n const sizes: Record<number, string> = {\n 1: '24px',\n 2: '20px',\n 3: '18px',\n 4: '16px',\n 5: '14px',\n 6: '13px',\n };\n result.push(\n `<h${level} style=\"font-size:${sizes[level]};margin:16px 0 8px 0;\">${convertInline(headerMatch[2].trim())}</h${level}>`\n );\n continue;\n }\n\n // Horizontal rules\n if (/^[-*_]{3,}\\s*$/.test(trimmed)) {\n result.push('<hr style=\"border:none;border-top:1px solid #ddd;margin:16px 0;\">');\n continue;\n }\n\n // Empty lines → <br>\n if (trimmed === '') {\n result.push('<br>');\n continue;\n }\n\n // Regular line: apply inline conversions\n result.push(`<p style=\"margin:4px 0;\">${convertInline(line)}</p>`);\n }\n\n // Close any unclosed code block\n if (inCodeBlock && codeLines.length > 0) {\n const escaped = codeLines.map(l => escapeHtml(l)).join('\\n');\n result.push(\n `<pre style=\"background:#f4f4f4;padding:12px;border-radius:4px;overflow-x:auto;font-size:13px;\"><code>${escaped}</code></pre>`\n );\n }\n flushBlockquote();\n flushList();\n\n return result.join('\\n');\n}\n\n/**\n * Apply inline Markdown conversions to a single line.\n * Order matters: escape HTML first, then apply formatting.\n */\nfunction convertInline(line: string): string {\n // First, identify and protect inline code spans\n const codeSpans: string[] = [];\n let processed = line.replace(/`([^`]+)`/g, (_m, code: string) => {\n const idx = codeSpans.length;\n codeSpans.push(\n `<code style=\"background:#f0f0f0;padding:1px 4px;border-radius:3px;font-size:13px;\">${escapeHtml(code)}</code>`\n );\n return `\\x00CODE${idx}\\x00`;\n });\n\n // Escape HTML in non-code portions\n processed = escapeHtml(processed);\n\n // Images: \n processed = processed.replace(\n /!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+"[^&]*")?\\)/g,\n (_m, alt: string, url: string) =>\n `<img src=\"${url}\" alt=\"${alt || 'image'}\" style=\"max-width:100%;\">`\n );\n\n // Links: [label](url) → <a href=\"url\">label</a>\n processed = processed.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+"[^&]*")?\\)/g,\n (_m, label: string, url: string) => `<a href=\"${url}\" style=\"color:#0066cc;\">${label}</a>`\n );\n\n // Bold: **text** or __text__\n processed = processed.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n processed = processed.replace(/__([^_]+)__/g, '<strong>$1</strong>');\n\n // Italic: *text* (but not inside bold)\n processed = processed.replace(/(?<!\\*)\\*([^*]+)\\*(?!\\*)/g, '<em>$1</em>');\n\n // Strikethrough: ~~text~~\n processed = processed.replace(/~~([^~]+)~~/g, '<del>$1</del>');\n\n // Restore code spans\n processed = processed.replace(\n /\\x00CODE(\\d+)\\x00/g,\n (_m, idx: string) => codeSpans[parseInt(idx)]\n );\n\n return processed;\n}\n\n/**\n * Wrap body HTML in a complete email HTML template with inline CSS.\n */\nexport function wrapInEmailTemplate(bodyHtml: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n</head>\n<body style=\"font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.5;color:#333;max-width:600px;margin:0 auto;padding:16px;\">\n${bodyHtml}\n</body>\n</html>`;\n}\n\n/**\n * Format text as a plain-text email quote (prepend \"> \" to each line).\n */\nexport function formatEmailQuote(text: string): string {\n if (!text) return '';\n return text\n .split(/\\r?\\n/)\n .map(l => `> ${l}`)\n .join('\\n');\n}\n\n/**\n * Add \"Re: \" prefix to subject if not already present.\n */\nexport function addRePrefix(subject: string): string {\n if (!subject) return 'Re:';\n if (/^Re:/i.test(subject.trim())) return subject.trim();\n return `Re: ${subject.trim()}`;\n}\n\n/**\n * Main entry point: convert Markdown to email HTML body (not wrapped in template).\n */\nexport function formatEmailText(text: string): string {\n return markdownToEmailHtml(text);\n}\n","/**\n * Email Frontend for Visor workflows.\n *\n * Mirrors the TelegramFrontend pattern:\n * - Sends AI replies as threaded emails (In-Reply-To, References headers)\n * - Converts Markdown to email HTML format\n * - No reaction equivalent (CheckScheduled is a no-op)\n */\nimport type { Frontend, FrontendContext } from './host';\nimport { EmailClient, type EmailSendOptions } from '../email/client';\nimport { formatEmailText, wrapInEmailTemplate, addRePrefix } from '../email/markdown';\n\ntype EmailFrontendConfig = {\n send?: {\n type?: string;\n host?: string;\n port?: number;\n auth?: { user?: string; pass?: string };\n secure?: boolean;\n from?: string;\n api_key?: string;\n };\n};\n\nexport class EmailFrontend implements Frontend {\n public readonly name = 'email';\n private subs: Array<{ unsubscribe(): void }> = [];\n private cfg: EmailFrontendConfig;\n private errorNotified: boolean = false;\n\n constructor(config?: EmailFrontendConfig) {\n this.cfg = config || {};\n }\n\n start(ctx: FrontendContext): void {\n const bus = ctx.eventBus;\n\n try {\n ctx.logger.info(`[email-frontend] started`);\n } catch {}\n\n // CheckCompleted: send reply email\n this.subs.push(\n bus.on('CheckCompleted', async (env: any) => {\n const ev = (env && env.payload) || env;\n await this.maybePostDirectReply(ctx, ev.checkId, ev.result).catch(() => {});\n })\n );\n\n // CheckErrored: send error email\n this.subs.push(\n bus.on('CheckErrored', async (env: any) => {\n const ev = (env && env.payload) || env;\n const message = ev?.error?.message || 'Execution error';\n await this.maybePostError(ctx, 'Check failed', message, ev?.checkId).catch(() => {});\n })\n );\n\n // Shutdown: send fatal error email\n this.subs.push(\n bus.on('Shutdown', async (env: any) => {\n const ev = (env && env.payload) || env;\n const message = ev?.error?.message || 'Fatal error';\n await this.maybePostError(ctx, 'Run failed', message).catch(() => {});\n })\n );\n\n // CheckScheduled: no-op for email (no reaction equivalent)\n // StateTransition: no-op for email\n }\n\n stop(): void {\n for (const s of this.subs) s.unsubscribe();\n this.subs = [];\n }\n\n private getEmailClient(ctx: FrontendContext): EmailClient | undefined {\n // Prefer injected client (for tests or shared runner context)\n const injected = (ctx as any).emailClient;\n if (injected) return injected;\n // Lazy-create from config\n try {\n const emailConfig = (ctx as any).webhookContext?.webhookData?.get('/bots/email/message');\n const sendCfg = this.cfg.send || (emailConfig as any)?.sendConfig;\n if (sendCfg || process.env.EMAIL_SMTP_HOST || process.env.RESEND_API_KEY) {\n return new EmailClient({\n send: sendCfg || {\n type: process.env.RESEND_API_KEY ? 'resend' : 'smtp',\n },\n });\n }\n } catch {}\n return undefined;\n }\n\n private getInboundEmailPayload(ctx: FrontendContext): any | null {\n try {\n const endpoint = '/bots/email/message';\n return (ctx as any).webhookContext?.webhookData?.get(endpoint) || null;\n } catch {\n return null;\n }\n }\n\n private async maybePostError(\n ctx: FrontendContext,\n title: string,\n message: string,\n checkId?: string\n ): Promise<void> {\n if (this.errorNotified) return;\n const client = this.getEmailClient(ctx);\n if (!client) return;\n const payload = this.getInboundEmailPayload(ctx);\n const ev: any = payload?.event;\n if (!ev?.from) return;\n\n let text = `${title}`;\n if (checkId) text += `\\nCheck: ${checkId}`;\n if (message) text += `\\n${message}`;\n\n const sendOpts: EmailSendOptions = {\n to: ev.from,\n subject: ev.subject ? addRePrefix(ev.subject) : `Visor: ${title}`,\n text,\n html: wrapInEmailTemplate(`<p><strong>${title}</strong></p><p>${message}</p>`),\n };\n\n // Thread the reply\n if (ev.messageId) {\n sendOpts.inReplyTo = ev.messageId;\n sendOpts.references = ev.references ? [...ev.references, ev.messageId] : [ev.messageId];\n }\n\n await client.sendEmail(sendOpts);\n this.errorNotified = true;\n }\n\n private async maybePostDirectReply(\n ctx: FrontendContext,\n checkId: string,\n result: { output?: any; content?: string }\n ): Promise<void> {\n try {\n const cfg: any = ctx.config || {};\n const checkCfg: any = cfg.checks?.[checkId];\n if (!checkCfg) return;\n\n const providerType = (checkCfg.type as string) || '';\n const isAi = providerType === 'ai';\n const isLogChat = providerType === 'log' && checkCfg.group === 'chat';\n const isWorkflow = providerType === 'workflow';\n if (!isAi && !isLogChat && !isWorkflow) return;\n if (checkCfg.criticality === 'internal') return;\n\n // For AI checks, only post simple schemas\n if (isAi) {\n const schema = checkCfg.schema;\n if (typeof schema === 'string') {\n const simpleSchemas = ['code-review', 'markdown', 'text', 'plain'];\n if (!simpleSchemas.includes(schema)) return;\n }\n }\n\n const client = this.getEmailClient(ctx);\n if (!client) return;\n\n const payload = this.getInboundEmailPayload(ctx);\n const ev: any = payload?.event;\n if (!ev?.from) {\n ctx.logger.warn(`[email-frontend] skip posting reply for ${checkId}: missing from address`);\n return;\n }\n\n // Extract text (same logic as TelegramFrontend/SlackFrontend)\n const out: any = (result as any)?.output;\n let text: string | undefined;\n if (out && typeof out.text === 'string' && out.text.trim().length > 0) {\n text = out.text.trim();\n } else if (isAi && typeof checkCfg.schema === 'string') {\n if (\n typeof (result as any)?.content === 'string' &&\n (result as any).content.trim().length > 0\n ) {\n text = (result as any).content.trim();\n }\n } else if (isLogChat && typeof (result as any)?.logOutput === 'string') {\n const raw = (result as any).logOutput;\n if (raw.trim().length > 0) text = raw.trim();\n }\n\n // Append raw output\n if (out && typeof out._rawOutput === 'string' && out._rawOutput.trim().length > 0) {\n text = (text || '') + '\\n\\n' + out._rawOutput.trim();\n }\n\n if (!text) {\n ctx.logger.info(`[email-frontend] skip posting reply for ${checkId}: no renderable text`);\n return;\n }\n\n // Normalize literal \\n escape sequences\n text = text.replace(/\\\\n/g, '\\n');\n\n const htmlBody = formatEmailText(text);\n const sendOpts: EmailSendOptions = {\n to: ev.from,\n subject: ev.subject ? addRePrefix(ev.subject) : `Re: Visor response`,\n text,\n html: wrapInEmailTemplate(htmlBody),\n };\n\n // Thread the reply\n if (ev.messageId) {\n sendOpts.inReplyTo = ev.messageId;\n sendOpts.references = ev.references ? [...ev.references, ev.messageId] : [ev.messageId];\n }\n\n const sendResult = await client.sendEmail(sendOpts);\n\n if (!sendResult.ok) {\n ctx.logger.warn(\n `[email-frontend] failed to send reply for ${checkId}: ${sendResult.error}`\n );\n return;\n }\n ctx.logger.info(\n `[email-frontend] sent reply for ${checkId} to ${ev.from} (messageId=${sendResult.messageId})`\n );\n } catch (err) {\n try {\n ctx.logger.warn(\n `[email-frontend] maybePostDirectReply failed for ${checkId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n } catch {}\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__esm
|
|
3
|
-
} from "./chunk-J7LXIPZS.mjs";
|
|
4
|
-
|
|
5
|
-
// src/frontends/host.ts
|
|
6
|
-
function isActiveFrontend(f) {
|
|
7
|
-
return typeof f.setEngine === "function" && typeof f.setVisorConfig === "function";
|
|
8
|
-
}
|
|
9
|
-
var FrontendsHost;
|
|
10
|
-
var init_host = __esm({
|
|
11
|
-
"src/frontends/host.ts"() {
|
|
12
|
-
FrontendsHost = class {
|
|
13
|
-
bus;
|
|
14
|
-
log;
|
|
15
|
-
frontends = [];
|
|
16
|
-
constructor(bus, log) {
|
|
17
|
-
this.bus = bus;
|
|
18
|
-
this.log = log;
|
|
19
|
-
}
|
|
20
|
-
async load(specs) {
|
|
21
|
-
this.frontends = [];
|
|
22
|
-
for (const spec of specs) {
|
|
23
|
-
if (spec.name === "ndjson-sink") {
|
|
24
|
-
const { NdjsonSink } = await import("./ndjson-sink-FD2PSXGD.mjs");
|
|
25
|
-
this.frontends.push(new NdjsonSink(spec.config));
|
|
26
|
-
} else if (spec.name === "github") {
|
|
27
|
-
const { GitHubFrontend } = await import("./github-frontend-2T5PWYD5.mjs");
|
|
28
|
-
this.frontends.push(new GitHubFrontend());
|
|
29
|
-
} else if (spec.name === "slack") {
|
|
30
|
-
const { SlackFrontend } = await import("./slack-frontend-K3TPGERM.mjs");
|
|
31
|
-
this.frontends.push(new SlackFrontend(spec.config));
|
|
32
|
-
} else if (spec.name === "tui") {
|
|
33
|
-
const { TuiFrontend } = await import("./tui-frontend-T56PZB67.mjs");
|
|
34
|
-
this.frontends.push(new TuiFrontend(spec.config));
|
|
35
|
-
} else if (spec.name === "telegram") {
|
|
36
|
-
const { TelegramFrontend } = await import("./telegram-frontend-5UA77YAT.mjs");
|
|
37
|
-
this.frontends.push(new TelegramFrontend(spec.config));
|
|
38
|
-
} else if (spec.name === "email") {
|
|
39
|
-
const { EmailFrontend } = await import("./email-frontend-6JU4L33L.mjs");
|
|
40
|
-
this.frontends.push(new EmailFrontend(spec.config));
|
|
41
|
-
} else if (spec.name === "whatsapp") {
|
|
42
|
-
const { WhatsAppFrontend } = await import("./whatsapp-frontend-72XEIUIR.mjs");
|
|
43
|
-
this.frontends.push(new WhatsAppFrontend(spec.config));
|
|
44
|
-
} else if (spec.name === "teams") {
|
|
45
|
-
const { TeamsFrontend } = await import("./teams-frontend-6RRW533K.mjs");
|
|
46
|
-
this.frontends.push(new TeamsFrontend(spec.config));
|
|
47
|
-
} else if (spec.name === "a2a") {
|
|
48
|
-
const { A2AFrontend } = await import("./a2a-frontend-OI4OVSKC.mjs");
|
|
49
|
-
this.frontends.push(new A2AFrontend(spec.config));
|
|
50
|
-
} else {
|
|
51
|
-
this.log.warn(`[FrontendsHost] Unknown frontend '${spec.name}', skipping`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
async startAll(ctxFactory) {
|
|
56
|
-
for (const f of this.frontends) {
|
|
57
|
-
try {
|
|
58
|
-
const ctx = ctxFactory();
|
|
59
|
-
if (isActiveFrontend(f)) {
|
|
60
|
-
if (ctx.engine) f.setEngine(ctx.engine);
|
|
61
|
-
if (ctx.visorConfig) f.setVisorConfig(ctx.visorConfig);
|
|
62
|
-
}
|
|
63
|
-
await f.start(ctx);
|
|
64
|
-
this.log.info(`[FrontendsHost] Started frontend '${f.name}'`);
|
|
65
|
-
} catch (err) {
|
|
66
|
-
this.log.error(`[FrontendsHost] Failed to start '${f.name}':`, err);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async stopAll() {
|
|
71
|
-
for (const f of this.frontends) {
|
|
72
|
-
try {
|
|
73
|
-
await f.stop();
|
|
74
|
-
} catch (err) {
|
|
75
|
-
this.log.error(`[FrontendsHost] Failed to stop '${f.name}':`, err);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
init_host();
|
|
83
|
-
export {
|
|
84
|
-
FrontendsHost,
|
|
85
|
-
isActiveFrontend
|
|
86
|
-
};
|
|
87
|
-
//# sourceMappingURL=host-OJSMCLKK.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/frontends/host.ts"],"sourcesContent":["import { EventBus } from '../event-bus/event-bus';\nimport type { TaskStore } from '../agent-protocol/task-store';\n\nexport interface FrontendContext {\n eventBus: EventBus;\n logger: {\n info: (...a: any[]) => void;\n warn: (...a: any[]) => void;\n error: (...a: any[]) => void;\n };\n config: unknown;\n run: {\n runId: string;\n workflowId?: string;\n repo?: { owner: string; name: string };\n pr?: number;\n headSha?: string;\n event?: string;\n actor?: string;\n };\n octokit?: any;\n // Optional webhook context (e.g., Slack Events API payload injected by socket runner)\n webhookContext?: { webhookData?: Map<string, unknown>; eventType?: string };\n // Optional engine reference for frontends that spawn their own execution runs (e.g., A2A)\n engine?: any;\n // Optional full VisorConfig for frontends that need access to checks/workflows\n visorConfig?: any;\n // Optional shared task store for cross-frontend execution tracking (when task_tracking is enabled)\n taskStore?: TaskStore;\n}\n\nexport interface Frontend {\n readonly name: string;\n start(ctx: FrontendContext): Promise<void> | void;\n stop(): Promise<void> | void;\n}\n\n/** Frontends that can trigger their own engine executions (e.g., A2A). */\nexport interface ActiveFrontend extends Frontend {\n setEngine(engine: any): void;\n setVisorConfig(config: any): void;\n}\n\n/** Type guard for ActiveFrontend (duck-typed). */\nexport function isActiveFrontend(f: Frontend): f is ActiveFrontend {\n return (\n typeof (f as any).setEngine === 'function' && typeof (f as any).setVisorConfig === 'function'\n );\n}\n\nexport interface FrontendSpec {\n name: string; // e.g., 'ndjson-sink', 'github', 'slack'\n package?: string; // external package name (future)\n config?: unknown;\n}\n\nexport class FrontendsHost {\n private bus: EventBus;\n private log: FrontendContext['logger'];\n private frontends: Frontend[] = [];\n\n constructor(bus: EventBus, log: FrontendContext['logger']) {\n this.bus = bus;\n this.log = log;\n }\n\n async load(specs: FrontendSpec[]): Promise<void> {\n this.frontends = [];\n for (const spec of specs) {\n if (spec.name === 'ndjson-sink') {\n const { NdjsonSink } = await import('./ndjson-sink');\n this.frontends.push(new NdjsonSink(spec.config));\n } else if (spec.name === 'github') {\n const { GitHubFrontend } = await import('./github-frontend');\n this.frontends.push(new GitHubFrontend());\n } else if (spec.name === 'slack') {\n const { SlackFrontend } = await import('./slack-frontend');\n this.frontends.push(new SlackFrontend(spec.config as any));\n } else if (spec.name === 'tui') {\n const { TuiFrontend } = await import('../tui/tui-frontend');\n this.frontends.push(new TuiFrontend(spec.config as any));\n } else if (spec.name === 'telegram') {\n const { TelegramFrontend } = await import('./telegram-frontend');\n this.frontends.push(new TelegramFrontend(spec.config as any));\n } else if (spec.name === 'email') {\n const { EmailFrontend } = await import('./email-frontend');\n this.frontends.push(new EmailFrontend(spec.config as any));\n } else if (spec.name === 'whatsapp') {\n const { WhatsAppFrontend } = await import('./whatsapp-frontend');\n this.frontends.push(new WhatsAppFrontend(spec.config as any));\n } else if (spec.name === 'teams') {\n const { TeamsFrontend } = await import('./teams-frontend');\n this.frontends.push(new TeamsFrontend(spec.config as any));\n } else if (spec.name === 'a2a') {\n const { A2AFrontend } = await import('../agent-protocol/a2a-frontend');\n this.frontends.push(new A2AFrontend(spec.config as any));\n } else {\n this.log.warn(`[FrontendsHost] Unknown frontend '${spec.name}', skipping`);\n }\n }\n }\n\n async startAll(ctxFactory: () => FrontendContext): Promise<void> {\n for (const f of this.frontends) {\n try {\n const ctx = ctxFactory();\n // Auto-inject engine/config into active frontends\n if (isActiveFrontend(f)) {\n if (ctx.engine) f.setEngine(ctx.engine);\n if (ctx.visorConfig) f.setVisorConfig(ctx.visorConfig);\n }\n await f.start(ctx);\n this.log.info(`[FrontendsHost] Started frontend '${f.name}'`);\n } catch (err) {\n this.log.error(`[FrontendsHost] Failed to start '${f.name}':`, err);\n }\n }\n }\n\n async stopAll(): Promise<void> {\n for (const f of this.frontends) {\n try {\n await f.stop();\n } catch (err) {\n this.log.error(`[FrontendsHost] Failed to stop '${f.name}':`, err);\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|