@evalops/maestro 0.10.50 → 0.10.51
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/agent/agent-outcome.d.ts +54 -0
- package/dist/agent/agent-outcome.d.ts.map +1 -0
- package/dist/agent/agent-outcome.js +142 -0
- package/dist/agent/agent-outcome.js.map +1 -0
- package/dist/agent/agent-resume.d.ts.map +1 -1
- package/dist/agent/agent-resume.js +3 -3
- package/dist/agent/agent-resume.js.map +1 -1
- package/dist/agent/agent-run-summary.d.ts +37 -0
- package/dist/agent/agent-run-summary.d.ts.map +1 -0
- package/dist/agent/agent-run-summary.js +15 -0
- package/dist/agent/agent-run-summary.js.map +1 -0
- package/dist/agent/agent-work-board.d.ts +82 -0
- package/dist/agent/agent-work-board.d.ts.map +1 -0
- package/dist/agent/agent-work-board.js +312 -0
- package/dist/agent/agent-work-board.js.map +1 -0
- package/dist/agent/auto-compaction.d.ts +7 -2
- package/dist/agent/auto-compaction.d.ts.map +1 -1
- package/dist/agent/auto-compaction.js +23 -10
- package/dist/agent/auto-compaction.js.map +1 -1
- package/dist/agent/mission-artifacts.d.ts +62 -0
- package/dist/agent/mission-artifacts.d.ts.map +1 -0
- package/dist/agent/mission-artifacts.js +438 -0
- package/dist/agent/mission-artifacts.js.map +1 -0
- package/dist/agent/mission-manifest.d.ts +139 -3
- package/dist/agent/mission-manifest.d.ts.map +1 -1
- package/dist/agent/mission-manifest.js +549 -3
- package/dist/agent/mission-manifest.js.map +1 -1
- package/dist/agent/mission-store.d.ts +80 -0
- package/dist/agent/mission-store.d.ts.map +1 -0
- package/dist/agent/mission-store.js +603 -0
- package/dist/agent/mission-store.js.map +1 -0
- package/dist/agent/modes.d.ts +2 -2
- package/dist/agent/modes.d.ts.map +1 -1
- package/dist/agent/modes.js +10 -3
- package/dist/agent/modes.js.map +1 -1
- package/dist/agent/providers/codex-app-server.d.ts.map +1 -1
- package/dist/agent/providers/codex-app-server.js +1 -3
- package/dist/agent/providers/codex-app-server.js.map +1 -1
- package/dist/agent/providers/google-gemini-cli.js +203 -107
- package/dist/agent/providers/google.js +100 -41
- package/dist/agent/providers/scripted.d.ts.map +1 -1
- package/dist/agent/providers/scripted.js +1 -3
- package/dist/agent/providers/scripted.js.map +1 -1
- package/dist/agent/providers/validation.d.ts.map +1 -1
- package/dist/agent/providers/validation.js +1 -3
- package/dist/agent/providers/validation.js.map +1 -1
- package/dist/agent/providers/vertex.js +203 -107
- package/dist/agent/snapshot-store.d.ts +32 -0
- package/dist/agent/snapshot-store.d.ts.map +1 -0
- package/dist/agent/snapshot-store.js +195 -0
- package/dist/agent/snapshot-store.js.map +1 -0
- package/dist/agent/specialist-profiles.d.ts +36 -0
- package/dist/agent/specialist-profiles.d.ts.map +1 -0
- package/dist/agent/specialist-profiles.js +159 -0
- package/dist/agent/specialist-profiles.js.map +1 -0
- package/dist/agent/subagent-specs.d.ts +4 -1
- package/dist/agent/subagent-specs.d.ts.map +1 -1
- package/dist/agent/subagent-specs.js +81 -8
- package/dist/agent/subagent-specs.js.map +1 -1
- package/dist/agent/swarm/coverage-gate.d.ts +37 -0
- package/dist/agent/swarm/coverage-gate.d.ts.map +1 -0
- package/dist/agent/swarm/coverage-gate.js +48 -0
- package/dist/agent/swarm/coverage-gate.js.map +1 -0
- package/dist/agent/swarm/executor.d.ts +1 -0
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +151 -15
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/orchestrator-prompt.d.ts +25 -0
- package/dist/agent/swarm/orchestrator-prompt.d.ts.map +1 -0
- package/dist/agent/swarm/orchestrator-prompt.js +48 -0
- package/dist/agent/swarm/orchestrator-prompt.js.map +1 -0
- package/dist/agent/swarm/plan-parser.d.ts.map +1 -1
- package/dist/agent/swarm/plan-parser.js +27 -2
- package/dist/agent/swarm/plan-parser.js.map +1 -1
- package/dist/agent/swarm/types.d.ts +17 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/swarm/validation-directive.d.ts +21 -0
- package/dist/agent/swarm/validation-directive.d.ts.map +1 -0
- package/dist/agent/swarm/validation-directive.js +25 -0
- package/dist/agent/swarm/validation-directive.js.map +1 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.js +4 -1
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
- package/dist/api/enterprise-routes.d.ts.map +1 -1
- package/dist/api/enterprise-routes.js +87 -10
- package/dist/api/enterprise-routes.js.map +1 -1
- package/dist/api/org-settings-merge.d.ts +12 -0
- package/dist/api/org-settings-merge.d.ts.map +1 -0
- package/dist/api/org-settings-merge.js +38 -0
- package/dist/api/org-settings-merge.js.map +1 -0
- package/dist/api/user-settings-merge.d.ts +16 -0
- package/dist/api/user-settings-merge.d.ts.map +1 -0
- package/dist/api/user-settings-merge.js +37 -0
- package/dist/api/user-settings-merge.js.map +1 -0
- package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -1
- package/dist/app-server/daemon-lifecycle-api.js +1 -3
- package/dist/app-server/daemon-lifecycle-api.js.map +1 -1
- package/dist/app-server/external-agent-import-api.d.ts.map +1 -1
- package/dist/app-server/external-agent-import-api.js +1 -3
- package/dist/app-server/external-agent-import-api.js.map +1 -1
- package/dist/app-server/network-governance-api.d.ts.map +1 -1
- package/dist/app-server/network-governance-api.js +1 -3
- package/dist/app-server/network-governance-api.js.map +1 -1
- package/dist/app-server/plugin-bundle-api.d.ts.map +1 -1
- package/dist/app-server/plugin-bundle-api.js +1 -3
- package/dist/app-server/plugin-bundle-api.js.map +1 -1
- package/dist/app-server/policy-control-api.d.ts.map +1 -1
- package/dist/app-server/policy-control-api.js +1 -3
- package/dist/app-server/policy-control-api.js.map +1 -1
- package/dist/app-server/protocol-modes-api.d.ts.map +1 -1
- package/dist/app-server/protocol-modes-api.js +1 -3
- package/dist/app-server/protocol-modes-api.js.map +1 -1
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +15 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts.map +1 -1
- package/dist/cli/commands/a2a.js +1 -3
- package/dist/cli/commands/a2a.js.map +1 -1
- package/dist/cli/commands/agents.d.ts +4 -0
- package/dist/cli/commands/agents.d.ts.map +1 -1
- package/dist/cli/commands/agents.js +149 -0
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/mission.d.ts +4 -0
- package/dist/cli/commands/mission.d.ts.map +1 -0
- package/dist/cli/commands/mission.js +196 -0
- package/dist/cli/commands/mission.js.map +1 -0
- package/dist/cli/commands/value.d.ts +10 -0
- package/dist/cli/commands/value.d.ts.map +1 -0
- package/dist/cli/commands/value.js +33 -0
- package/dist/cli/commands/value.js.map +1 -0
- package/dist/cli/headless-protocol.d.ts.map +1 -1
- package/dist/cli/headless-protocol.js +1 -3
- package/dist/cli/headless-protocol.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +10 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/system-prompt.d.ts.map +1 -1
- package/dist/cli/system-prompt.js +38 -7
- package/dist/cli/system-prompt.js.map +1 -1
- package/dist/cli-runtime.js +7756 -2800
- package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
- package/dist/cli-tui/client-tools/client-tool-controller.js +1 -3
- package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
- package/dist/cli-tui/commands/undo-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/undo-handlers.js +7 -2
- package/dist/cli-tui/commands/undo-handlers.js.map +1 -1
- package/dist/cli-tui/tui-renderer/skills-controller.d.ts +3 -0
- package/dist/cli-tui/tui-renderer/skills-controller.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/skills-controller.js +77 -33
- package/dist/cli-tui/tui-renderer/skills-controller.js.map +1 -1
- package/dist/codex/app-server-client.d.ts.map +1 -1
- package/dist/codex/app-server-client.js +1 -3
- package/dist/codex/app-server-client.js.map +1 -1
- package/dist/codex/compatibility.d.ts.map +1 -1
- package/dist/codex/compatibility.js +1 -3
- package/dist/codex/compatibility.js.map +1 -1
- package/dist/codex/subagent-dispatch-table.d.ts +8 -0
- package/dist/codex/subagent-dispatch-table.d.ts.map +1 -1
- package/dist/codex/subagent-dispatch-table.js +23 -0
- package/dist/codex/subagent-dispatch-table.js.map +1 -1
- package/dist/context/manifest.d.ts.map +1 -1
- package/dist/context/manifest.js +1 -3
- package/dist/context/manifest.js.map +1 -1
- package/dist/conversation/render-model.d.ts +0 -36
- package/dist/conversation/render-model.d.ts.map +1 -1
- package/dist/conversation/render-model.js +1 -3
- package/dist/conversation/render-model.js.map +1 -1
- package/dist/customer-value/ambient-learning.d.ts +75 -0
- package/dist/customer-value/ambient-learning.d.ts.map +1 -0
- package/dist/customer-value/ambient-learning.js +472 -0
- package/dist/customer-value/ambient-learning.js.map +1 -0
- package/dist/customer-value/internal-helpers.d.ts +13 -0
- package/dist/customer-value/internal-helpers.d.ts.map +1 -0
- package/dist/customer-value/internal-helpers.js +70 -0
- package/dist/customer-value/internal-helpers.js.map +1 -0
- package/dist/customer-value/report.d.ts +282 -0
- package/dist/customer-value/report.d.ts.map +1 -0
- package/dist/customer-value/report.js +2085 -0
- package/dist/customer-value/report.js.map +1 -0
- package/dist/db/schema.d.ts +5 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
- package/dist/evalops/agent-bootstrap.js +1 -3
- package/dist/evalops/agent-bootstrap.js.map +1 -1
- package/dist/evalops/agent-mcp-metadata.d.ts.map +1 -1
- package/dist/evalops/agent-mcp-metadata.js +1 -3
- package/dist/evalops/agent-mcp-metadata.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/installers/maestro-review-workflow.d.ts +38 -0
- package/dist/installers/maestro-review-workflow.d.ts.map +1 -0
- package/dist/installers/maestro-review-workflow.js +163 -0
- package/dist/installers/maestro-review-workflow.js.map +1 -0
- package/dist/load-env.d.ts.map +1 -1
- package/dist/load-env.js +2 -1
- package/dist/load-env.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +92 -3
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +1 -3
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/elicitation.d.ts.map +1 -1
- package/dist/mcp/elicitation.js +1 -3
- package/dist/mcp/elicitation.js.map +1 -1
- package/dist/mcp/official-registry.d.ts.map +1 -1
- package/dist/mcp/official-registry.js +1 -3
- package/dist/mcp/official-registry.js.map +1 -1
- package/dist/mcp/workspace-trust.d.ts.map +1 -1
- package/dist/mcp/workspace-trust.js +1 -3
- package/dist/mcp/workspace-trust.js.map +1 -1
- package/dist/memory/service-client.d.ts.map +1 -1
- package/dist/memory/service-client.js +1 -3
- package/dist/memory/service-client.js.map +1 -1
- package/dist/models/config-loader.d.ts.map +1 -1
- package/dist/models/config-loader.js +1 -3
- package/dist/models/config-loader.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
- package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts +61 -0
- package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js +183 -0
- package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js.map +1 -0
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/oauth/connectors.d.ts.map +1 -1
- package/dist/oauth/connectors.js +1 -3
- package/dist/oauth/connectors.js.map +1 -1
- package/dist/oauth/evalops.d.ts.map +1 -1
- package/dist/oauth/evalops.js +1 -3
- package/dist/oauth/evalops.js.map +1 -1
- package/dist/platform/a2a-client.d.ts.map +1 -1
- package/dist/platform/a2a-client.js +1 -3
- package/dist/platform/a2a-client.js.map +1 -1
- package/dist/platform/a2a-cockpit.d.ts +1 -0
- package/dist/platform/a2a-cockpit.d.ts.map +1 -1
- package/dist/platform/a2a-cockpit.js +42 -11
- package/dist/platform/a2a-cockpit.js.map +1 -1
- package/dist/platform/a2a-completion-audit.d.ts +1 -1
- package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
- package/dist/platform/a2a-completion-audit.js +7 -11
- package/dist/platform/a2a-completion-audit.js.map +1 -1
- package/dist/platform/a2a-maestro-peer.js +16 -0
- package/dist/platform/a2a-maestro-peer.js.map +1 -1
- package/dist/platform/a2a-peer-pairing.d.ts.map +1 -1
- package/dist/platform/a2a-peer-pairing.js +1 -3
- package/dist/platform/a2a-peer-pairing.js.map +1 -1
- package/dist/platform/a2a-peer-registry.d.ts.map +1 -1
- package/dist/platform/a2a-peer-registry.js +1 -3
- package/dist/platform/a2a-peer-registry.js.map +1 -1
- package/dist/platform/a2a-task-ledger.d.ts +20 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
- package/dist/platform/a2a-task-ledger.js +207 -11
- package/dist/platform/a2a-task-ledger.js.map +1 -1
- package/dist/platform/a2a-work-graph.d.ts.map +1 -1
- package/dist/platform/a2a-work-graph.js +1 -3
- package/dist/platform/a2a-work-graph.js.map +1 -1
- package/dist/platform/operating-layer.d.ts.map +1 -1
- package/dist/platform/operating-layer.js +14 -8
- package/dist/platform/operating-layer.js.map +1 -1
- package/dist/platform/tool-execution-client.d.ts.map +1 -1
- package/dist/platform/tool-execution-client.js +19 -2
- package/dist/platform/tool-execution-client.js.map +1 -1
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +1 -3
- package/dist/providers/auth.js.map +1 -1
- package/dist/runtime/env.d.ts +9 -1
- package/dist/runtime/env.d.ts.map +1 -1
- package/dist/runtime/env.js +63 -1
- package/dist/runtime/env.js.map +1 -1
- package/dist/safety/policy.d.ts.map +1 -1
- package/dist/safety/policy.js +1 -4
- package/dist/safety/policy.js.map +1 -1
- package/dist/sandbox/docker-sandbox.d.ts.map +1 -1
- package/dist/sandbox/docker-sandbox.js +6 -1
- package/dist/sandbox/docker-sandbox.js.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.js +1 -3
- package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
- package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
- package/dist/server/handlers/platform-a2a-push.js +53 -2
- package/dist/server/handlers/platform-a2a-push.js.map +1 -1
- package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -1
- package/dist/server/handlers/runtime-app-server-ws.js +1 -3
- package/dist/server/handlers/runtime-app-server-ws.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +16 -0
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +232 -206
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
- package/dist/server/hosted-agent-runtime-progress.js +12 -3
- package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
- package/dist/server/pending-request-payload.d.ts.map +1 -1
- package/dist/server/pending-request-payload.js +1 -3
- package/dist/server/pending-request-payload.js.map +1 -1
- package/dist/server/route-auth.d.ts.map +1 -1
- package/dist/server/route-auth.js +2 -0
- package/dist/server/route-auth.js.map +1 -1
- package/dist/server/session-serialization.d.ts.map +1 -1
- package/dist/server/session-serialization.js +1 -3
- package/dist/server/session-serialization.js.map +1 -1
- package/dist/services/compliance/normalize.d.ts.map +1 -1
- package/dist/services/compliance/normalize.js +1 -3
- package/dist/services/compliance/normalize.js.map +1 -1
- package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
- package/dist/services/intelligent-router/normalize.js +1 -3
- package/dist/services/intelligent-router/normalize.js.map +1 -1
- package/dist/services/revenue-attribution/normalize.d.ts.map +1 -1
- package/dist/services/revenue-attribution/normalize.js +1 -3
- package/dist/services/revenue-attribution/normalize.js.map +1 -1
- package/dist/services/traces/normalize.d.ts.map +1 -1
- package/dist/services/traces/normalize.js +1 -3
- package/dist/services/traces/normalize.js.map +1 -1
- package/dist/services/workspace-config/normalize.d.ts.map +1 -1
- package/dist/services/workspace-config/normalize.js +1 -3
- package/dist/services/workspace-config/normalize.js.map +1 -1
- package/dist/skills/composer.d.ts.map +1 -1
- package/dist/skills/composer.js +13 -1
- package/dist/skills/composer.js.map +1 -1
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/learned-guidelines.d.ts +33 -0
- package/dist/skills/learned-guidelines.d.ts.map +1 -0
- package/dist/skills/learned-guidelines.js +291 -0
- package/dist/skills/learned-guidelines.js.map +1 -0
- package/dist/skills/linter.d.ts.map +1 -1
- package/dist/skills/linter.js +1 -3
- package/dist/skills/linter.js.map +1 -1
- package/dist/skills/runtime-activation.d.ts +1 -0
- package/dist/skills/runtime-activation.d.ts.map +1 -1
- package/dist/skills/runtime-activation.js +2 -3
- package/dist/skills/runtime-activation.js.map +1 -1
- package/dist/skills/tool.d.ts.map +1 -1
- package/dist/skills/tool.js +26 -21
- package/dist/skills/tool.js.map +1 -1
- package/dist/skills/trust-cache.d.ts +7 -0
- package/dist/skills/trust-cache.d.ts.map +1 -1
- package/dist/skills/trust-cache.js +16 -0
- package/dist/skills/trust-cache.js.map +1 -1
- package/dist/telemetry/agent-workforce-native-event.d.ts.map +1 -1
- package/dist/telemetry/agent-workforce-native-event.js +1 -3
- package/dist/telemetry/agent-workforce-native-event.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +42 -81
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
- package/dist/telemetry/maestro-platform-replay-fixture.js +1 -3
- package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +54 -43
- package/dist/telemetry.js.map +1 -1
- package/dist/theme/theme-loader.d.ts.map +1 -1
- package/dist/theme/theme-loader.js +1 -3
- package/dist/theme/theme-loader.js.map +1 -1
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +76 -8
- package/dist/tools/apply-patch.js.map +1 -1
- package/dist/tools/diff-preview.d.ts.map +1 -1
- package/dist/tools/diff-preview.js +10 -1
- package/dist/tools/diff-preview.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +17 -0
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +9 -0
- package/dist/tools/write.js.map +1 -1
- package/dist/undo/tracker.d.ts +5 -0
- package/dist/undo/tracker.d.ts.map +1 -1
- package/dist/undo/tracker.js +13 -0
- package/dist/undo/tracker.js.map +1 -1
- package/dist/utils/fs.d.ts +1 -1
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +29 -2
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/git-stash.d.ts.map +1 -1
- package/dist/utils/git-stash.js +15 -8
- package/dist/utils/git-stash.js.map +1 -1
- package/dist/utils/json.d.ts +11 -0
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js +9 -0
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/shell-env.d.ts.map +1 -1
- package/dist/utils/shell-env.js +2 -0
- package/dist/utils/shell-env.js.map +1 -1
- package/dist/utils/url-extractor-git.d.ts +26 -0
- package/dist/utils/url-extractor-git.d.ts.map +1 -0
- package/dist/utils/url-extractor-git.js +259 -0
- package/dist/utils/url-extractor-git.js.map +1 -0
- package/dist/utils/url-extractor.d.ts.map +1 -1
- package/dist/utils/url-extractor.js +23 -251
- package/dist/utils/url-extractor.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +310 -306
- package/skills/incident-triage/SKILL.md +19 -1
- package/skills/install-code-review/SKILL.md +69 -0
- package/skills/security-review/SKILL.md +68 -0
- package/skills/security-review/reference/rubric.md +85 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pending-request-payload.d.ts","sourceRoot":"","sources":["../../src/server/pending-request-payload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,sBAAsB,EACtB,eAAe,EACf,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"pending-request-payload.d.ts","sourceRoot":"","sources":["../../src/server/pending-request-payload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,sBAAsB,EACtB,eAAe,EACf,MAAM,oBAAoB,CAAC;AA8E5B,wBAAgB,0BAA0B,CACzC,SAAS,EAAE,MAAM,GACf,sBAAsB,EAAE,CAI1B;AAED,wBAAgB,8BAA8B,CAC7C,SAAS,EAAE,MAAM,GACf,IAAI,CACN,eAAe,EACb,yBAAyB,GACzB,2BAA2B,GAC3B,iBAAiB,GACjB,0BAA0B,CAC5B,CAuFA"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
+
import { isRecord } from "../utils/json.js";
|
|
1
2
|
import { serverRequestManager, } from "./server-request-manager.js";
|
|
2
|
-
function isRecord(value) {
|
|
3
|
-
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
4
|
-
}
|
|
5
3
|
/**
|
|
6
4
|
* Strip Unicode characters that could deceive a human approver:
|
|
7
5
|
* - Bidi-override / embedding controls (U+202A–U+202E, U+2066–U+2069)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pending-request-payload.js","sourceRoot":"","sources":["../../src/server/pending-request-payload.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerPendingClientToolRequest,\n\tComposerPendingRequest,\n\tComposerSession,\n} from \"@evalops/contracts\";\nimport {\n\ttype PendingServerRequestSnapshot,\n\tserverRequestManager,\n} from \"./server-request-manager.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\n/**\n * Strip Unicode characters that could deceive a human approver:\n * - Bidi-override / embedding controls (U+202A–U+202E, U+2066–U+2069)\n * - Zero-width / invisible characters (U+200B–U+200F, U+FEFF, U+FFFE)\n * Applied server-side before the approval payload is serialised, so both\n * the TUI Name line and the web approval card are protected.\n */\nfunction sanitizeDisplayString(value: string): string {\n\t// Remove bidi-override, bidi-embedding, and isolate controls\n\t// Remove zero-width space/non-joiner/joiner, left-to-right/right-to-left marks, BOM\n\treturn value\n\t\t.normalize(\"NFKC\")\n\t\t.replace(/[\\u202a-\\u202e\\u2066-\\u2069\\u200b-\\u200f\\ufeff\\ufffe]/gu, \"\");\n}\n\nfunction getToolRetryPayload(args: unknown): Record<string, unknown> {\n\treturn isRecord(args) ? args : {};\n}\n\nfunction pendingRequestArgs(entry: PendingServerRequestSnapshot): unknown {\n\tif (entry.kind !== \"tool_retry\") {\n\t\treturn entry.args;\n\t}\n\tconst args = getToolRetryPayload(entry.args);\n\treturn Object.prototype.hasOwnProperty.call(args, \"args\")\n\t\t? args.args\n\t\t: entry.args;\n}\n\nfunction mapPendingComposerRequests(\n\tpending: PendingServerRequestSnapshot[],\n): ComposerPendingRequest[] {\n\treturn pending.map((entry) => {\n\t\tconst createdAt = new Date(entry.timestamp).toISOString();\n\t\tconst expiresAt =\n\t\t\tNumber.isFinite(entry.timeoutMs) && entry.timeoutMs > 0\n\t\t\t\t? new Date(entry.timestamp + entry.timeoutMs).toISOString()\n\t\t\t\t: undefined;\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\tkind: entry.kind,\n\t\t\tstatus: \"pending\",\n\t\t\tvisibility: \"user\",\n\t\t\tsessionId: entry.sessionId,\n\t\t\ttoolCallId: entry.callId,\n\t\t\ttoolName: entry.toolName,\n\t\t\tdisplayName:\n\t\t\t\ttypeof entry.displayName === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.displayName)\n\t\t\t\t\t: entry.displayName,\n\t\t\tsummaryLabel:\n\t\t\t\ttypeof entry.summaryLabel === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.summaryLabel)\n\t\t\t\t\t: entry.summaryLabel,\n\t\t\tactionDescription:\n\t\t\t\ttypeof entry.actionDescription === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.actionDescription)\n\t\t\t\t\t: entry.actionDescription,\n\t\t\targs: pendingRequestArgs(entry),\n\t\t\treason:\n\t\t\t\ttypeof entry.reason === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.reason)\n\t\t\t\t\t: entry.reason,\n\t\t\tcreatedAt,\n\t\t\texpiresAt,\n\t\t\tsource: entry.platform ? \"platform\" : \"local\",\n\t\t\tplatform: entry.platform,\n\t\t};\n\t});\n}\n\nexport function getPendingComposerRequests(\n\tsessionId: string,\n): ComposerPendingRequest[] {\n\treturn mapPendingComposerRequests(\n\t\tserverRequestManager.listPending({ sessionId }),\n\t);\n}\n\nexport function getPendingServerRequestPayload(\n\tsessionId: string,\n): Pick<\n\tComposerSession,\n\t| \"pendingApprovalRequests\"\n\t| \"pendingClientToolRequests\"\n\t| \"pendingRequests\"\n\t| \"pendingToolRetryRequests\"\n> {\n\tconst pending = serverRequestManager.listPending({ sessionId });\n\n\tconst pendingApprovalRequests = pending\n\t\t.filter((entry) => entry.kind === \"approval\")\n\t\t.map((entry) => ({\n\t\t\tid: entry.id,\n\t\t\ttoolName: entry.toolName,\n\t\t\tdisplayName:\n\t\t\t\ttypeof entry.displayName === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.displayName)\n\t\t\t\t\t: entry.displayName,\n\t\t\tsummaryLabel:\n\t\t\t\ttypeof entry.summaryLabel === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.summaryLabel)\n\t\t\t\t\t: entry.summaryLabel,\n\t\t\tactionDescription:\n\t\t\t\ttypeof entry.actionDescription === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.actionDescription)\n\t\t\t\t\t: entry.actionDescription,\n\t\t\targs: entry.args,\n\t\t\treason:\n\t\t\t\ttypeof entry.reason === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.reason)\n\t\t\t\t\t: entry.reason,\n\t\t\tplatform: entry.platform,\n\t\t}));\n\n\tconst pendingClientToolRequests: ComposerPendingClientToolRequest[] = pending\n\t\t.filter(\n\t\t\t(\n\t\t\t\tentry,\n\t\t\t): entry is typeof entry & {\n\t\t\t\tkind: \"client_tool\" | \"mcp_elicitation\" | \"user_input\";\n\t\t\t} =>\n\t\t\t\tentry.kind === \"client_tool\" ||\n\t\t\t\tentry.kind === \"mcp_elicitation\" ||\n\t\t\t\tentry.kind === \"user_input\",\n\t\t)\n\t\t.map((entry) => ({\n\t\t\ttoolCallId: entry.callId,\n\t\t\ttoolName: entry.toolName,\n\t\t\targs: entry.args,\n\t\t\tkind: entry.kind,\n\t\t\treason: entry.reason,\n\t\t}));\n\n\tconst pendingToolRetryRequests = pending\n\t\t.filter((entry) => entry.kind === \"tool_retry\")\n\t\t.map((entry) => {\n\t\t\tconst args = getToolRetryPayload(entry.args);\n\t\t\treturn {\n\t\t\t\tid: entry.id,\n\t\t\t\ttoolCallId:\n\t\t\t\t\ttypeof args.tool_call_id === \"string\"\n\t\t\t\t\t\t? args.tool_call_id\n\t\t\t\t\t\t: entry.callId,\n\t\t\t\ttoolName: entry.toolName,\n\t\t\t\targs: args.args,\n\t\t\t\terrorMessage:\n\t\t\t\t\ttypeof args.error_message === \"string\"\n\t\t\t\t\t\t? args.error_message\n\t\t\t\t\t\t: entry.reason,\n\t\t\t\tattempt:\n\t\t\t\t\ttypeof args.attempt === \"number\" && Number.isFinite(args.attempt)\n\t\t\t\t\t\t? args.attempt\n\t\t\t\t\t\t: 1,\n\t\t\t\tmaxAttempts:\n\t\t\t\t\ttypeof args.max_attempts === \"number\" &&\n\t\t\t\t\tNumber.isFinite(args.max_attempts)\n\t\t\t\t\t\t? args.max_attempts\n\t\t\t\t\t\t: undefined,\n\t\t\t\tsummary: typeof args.summary === \"string\" ? args.summary : undefined,\n\t\t\t};\n\t\t});\n\tconst pendingRequests = mapPendingComposerRequests(pending);\n\n\treturn {\n\t\t...(pendingApprovalRequests.length > 0 ? { pendingApprovalRequests } : {}),\n\t\t...(pendingClientToolRequests.length > 0\n\t\t\t? { pendingClientToolRequests }\n\t\t\t: {}),\n\t\t...(pendingToolRetryRequests.length > 0\n\t\t\t? { pendingToolRetryRequests }\n\t\t\t: {}),\n\t\t...(pendingRequests.length > 0 ? { pendingRequests } : {}),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pending-request-payload.js","sourceRoot":"","sources":["../../src/server/pending-request-payload.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerPendingClientToolRequest,\n\tComposerPendingRequest,\n\tComposerSession,\n} from \"@evalops/contracts\";\nimport { isRecord } from \"../utils/json.js\";\nimport {\n\ttype PendingServerRequestSnapshot,\n\tserverRequestManager,\n} from \"./server-request-manager.js\";\n\n/**\n * Strip Unicode characters that could deceive a human approver:\n * - Bidi-override / embedding controls (U+202A–U+202E, U+2066–U+2069)\n * - Zero-width / invisible characters (U+200B–U+200F, U+FEFF, U+FFFE)\n * Applied server-side before the approval payload is serialised, so both\n * the TUI Name line and the web approval card are protected.\n */\nfunction sanitizeDisplayString(value: string): string {\n\t// Remove bidi-override, bidi-embedding, and isolate controls\n\t// Remove zero-width space/non-joiner/joiner, left-to-right/right-to-left marks, BOM\n\treturn value\n\t\t.normalize(\"NFKC\")\n\t\t.replace(/[\\u202a-\\u202e\\u2066-\\u2069\\u200b-\\u200f\\ufeff\\ufffe]/gu, \"\");\n}\n\nfunction getToolRetryPayload(args: unknown): Record<string, unknown> {\n\treturn isRecord(args) ? args : {};\n}\n\nfunction pendingRequestArgs(entry: PendingServerRequestSnapshot): unknown {\n\tif (entry.kind !== \"tool_retry\") {\n\t\treturn entry.args;\n\t}\n\tconst args = getToolRetryPayload(entry.args);\n\treturn Object.prototype.hasOwnProperty.call(args, \"args\")\n\t\t? args.args\n\t\t: entry.args;\n}\n\nfunction mapPendingComposerRequests(\n\tpending: PendingServerRequestSnapshot[],\n): ComposerPendingRequest[] {\n\treturn pending.map((entry) => {\n\t\tconst createdAt = new Date(entry.timestamp).toISOString();\n\t\tconst expiresAt =\n\t\t\tNumber.isFinite(entry.timeoutMs) && entry.timeoutMs > 0\n\t\t\t\t? new Date(entry.timestamp + entry.timeoutMs).toISOString()\n\t\t\t\t: undefined;\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\tkind: entry.kind,\n\t\t\tstatus: \"pending\",\n\t\t\tvisibility: \"user\",\n\t\t\tsessionId: entry.sessionId,\n\t\t\ttoolCallId: entry.callId,\n\t\t\ttoolName: entry.toolName,\n\t\t\tdisplayName:\n\t\t\t\ttypeof entry.displayName === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.displayName)\n\t\t\t\t\t: entry.displayName,\n\t\t\tsummaryLabel:\n\t\t\t\ttypeof entry.summaryLabel === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.summaryLabel)\n\t\t\t\t\t: entry.summaryLabel,\n\t\t\tactionDescription:\n\t\t\t\ttypeof entry.actionDescription === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.actionDescription)\n\t\t\t\t\t: entry.actionDescription,\n\t\t\targs: pendingRequestArgs(entry),\n\t\t\treason:\n\t\t\t\ttypeof entry.reason === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.reason)\n\t\t\t\t\t: entry.reason,\n\t\t\tcreatedAt,\n\t\t\texpiresAt,\n\t\t\tsource: entry.platform ? \"platform\" : \"local\",\n\t\t\tplatform: entry.platform,\n\t\t};\n\t});\n}\n\nexport function getPendingComposerRequests(\n\tsessionId: string,\n): ComposerPendingRequest[] {\n\treturn mapPendingComposerRequests(\n\t\tserverRequestManager.listPending({ sessionId }),\n\t);\n}\n\nexport function getPendingServerRequestPayload(\n\tsessionId: string,\n): Pick<\n\tComposerSession,\n\t| \"pendingApprovalRequests\"\n\t| \"pendingClientToolRequests\"\n\t| \"pendingRequests\"\n\t| \"pendingToolRetryRequests\"\n> {\n\tconst pending = serverRequestManager.listPending({ sessionId });\n\n\tconst pendingApprovalRequests = pending\n\t\t.filter((entry) => entry.kind === \"approval\")\n\t\t.map((entry) => ({\n\t\t\tid: entry.id,\n\t\t\ttoolName: entry.toolName,\n\t\t\tdisplayName:\n\t\t\t\ttypeof entry.displayName === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.displayName)\n\t\t\t\t\t: entry.displayName,\n\t\t\tsummaryLabel:\n\t\t\t\ttypeof entry.summaryLabel === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.summaryLabel)\n\t\t\t\t\t: entry.summaryLabel,\n\t\t\tactionDescription:\n\t\t\t\ttypeof entry.actionDescription === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.actionDescription)\n\t\t\t\t\t: entry.actionDescription,\n\t\t\targs: entry.args,\n\t\t\treason:\n\t\t\t\ttypeof entry.reason === \"string\"\n\t\t\t\t\t? sanitizeDisplayString(entry.reason)\n\t\t\t\t\t: entry.reason,\n\t\t\tplatform: entry.platform,\n\t\t}));\n\n\tconst pendingClientToolRequests: ComposerPendingClientToolRequest[] = pending\n\t\t.filter(\n\t\t\t(\n\t\t\t\tentry,\n\t\t\t): entry is typeof entry & {\n\t\t\t\tkind: \"client_tool\" | \"mcp_elicitation\" | \"user_input\";\n\t\t\t} =>\n\t\t\t\tentry.kind === \"client_tool\" ||\n\t\t\t\tentry.kind === \"mcp_elicitation\" ||\n\t\t\t\tentry.kind === \"user_input\",\n\t\t)\n\t\t.map((entry) => ({\n\t\t\ttoolCallId: entry.callId,\n\t\t\ttoolName: entry.toolName,\n\t\t\targs: entry.args,\n\t\t\tkind: entry.kind,\n\t\t\treason: entry.reason,\n\t\t}));\n\n\tconst pendingToolRetryRequests = pending\n\t\t.filter((entry) => entry.kind === \"tool_retry\")\n\t\t.map((entry) => {\n\t\t\tconst args = getToolRetryPayload(entry.args);\n\t\t\treturn {\n\t\t\t\tid: entry.id,\n\t\t\t\ttoolCallId:\n\t\t\t\t\ttypeof args.tool_call_id === \"string\"\n\t\t\t\t\t\t? args.tool_call_id\n\t\t\t\t\t\t: entry.callId,\n\t\t\t\ttoolName: entry.toolName,\n\t\t\t\targs: args.args,\n\t\t\t\terrorMessage:\n\t\t\t\t\ttypeof args.error_message === \"string\"\n\t\t\t\t\t\t? args.error_message\n\t\t\t\t\t\t: entry.reason,\n\t\t\t\tattempt:\n\t\t\t\t\ttypeof args.attempt === \"number\" && Number.isFinite(args.attempt)\n\t\t\t\t\t\t? args.attempt\n\t\t\t\t\t\t: 1,\n\t\t\t\tmaxAttempts:\n\t\t\t\t\ttypeof args.max_attempts === \"number\" &&\n\t\t\t\t\tNumber.isFinite(args.max_attempts)\n\t\t\t\t\t\t? args.max_attempts\n\t\t\t\t\t\t: undefined,\n\t\t\t\tsummary: typeof args.summary === \"string\" ? args.summary : undefined,\n\t\t\t};\n\t\t});\n\tconst pendingRequests = mapPendingComposerRequests(pending);\n\n\treturn {\n\t\t...(pendingApprovalRequests.length > 0 ? { pendingApprovalRequests } : {}),\n\t\t...(pendingClientToolRequests.length > 0\n\t\t\t? { pendingClientToolRequests }\n\t\t\t: {}),\n\t\t...(pendingToolRetryRequests.length > 0\n\t\t\t? { pendingToolRetryRequests }\n\t\t\t: {}),\n\t\t...(pendingRequests.length > 0 ? { pendingRequests } : {}),\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-auth.d.ts","sourceRoot":"","sources":["../../src/server/route-auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAkB,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;CACtB;AAWD,eAAO,MAAM,mBAAmB,EAAE,SAAS,oBAAoB,EA4JrD,CAAC;AAEX,eAAO,MAAM,8BAA8B,EAAE,SAAS,oBAAoB,
|
|
1
|
+
{"version":3,"file":"route-auth.d.ts","sourceRoot":"","sources":["../../src/server/route-auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAkB,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;CACtB;AAWD,eAAO,MAAM,mBAAmB,EAAE,SAAS,oBAAoB,EA4JrD,CAAC;AAEX,eAAO,MAAM,8BAA8B,EAAE,SAAS,oBAAoB,EA0BhE,CAAC;AA6CX,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,QAAQ,GAAE,SAAS,oBAAoB,EAAwB,GAC7D,KAAK,EAAE,CAsCT;AAED,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,KAAK,EAAE,GACtB,eAAe,GAAG,IAAI,CASxB"}
|
|
@@ -174,6 +174,8 @@ export const ENTERPRISE_ROUTE_AUTH_POLICIES = [
|
|
|
174
174
|
p("DELETE", "/api/org/members/:userId", "authenticated"),
|
|
175
175
|
p("GET", "/api/org/settings", "authenticated"),
|
|
176
176
|
p("PUT", "/api/org/settings", "authenticated"),
|
|
177
|
+
p("GET", "/api/user/settings", "authenticated"),
|
|
178
|
+
p("PUT", "/api/user/settings", "authenticated"),
|
|
177
179
|
p("GET", "/api/roles", "authenticated"),
|
|
178
180
|
p("GET", "/api/models/approvals", "authenticated"),
|
|
179
181
|
p("POST", "/api/models/approvals/:modelId/approve", "authenticated"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-auth.js","sourceRoot":"","sources":["../../src/server/route-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import { HOSTED_RUNNER_DRAIN_PATH } from \"./handlers/hosted-runner-drain.js\";\nimport { HOSTED_RUNNER_IDENTITY_PATH } from \"./handlers/hosted-runner-identity.js\";\nimport { PLATFORM_A2A_PUSH_CALLBACK_PATH } from \"./handlers/platform-a2a-push.js\";\nimport type { Route, RouteAuthLevel, RouteAuthPolicy } from \"./router.js\";\n\nexport interface RouteAuthPolicyEntry {\n\tmethod: string;\n\tpath: string;\n\tauth: RouteAuthPolicy;\n}\n\nfunction p(\n\tmethod: string,\n\tpath: string,\n\tlevel: RouteAuthLevel,\n\toptions: Omit<RouteAuthPolicy, \"level\"> = {},\n): RouteAuthPolicyEntry {\n\treturn { method, path, auth: { level, ...options } };\n}\n\nexport const ROUTE_AUTH_POLICIES: readonly RouteAuthPolicyEntry[] = [\n\tp(\"GET\", \"/healthz\", \"public\"),\n\tp(\"GET\", \"/readyz\", \"public\"),\n\tp(\"GET\", HOSTED_RUNNER_IDENTITY_PATH, \"public\"),\n\tp(\"POST\", HOSTED_RUNNER_DRAIN_PATH, \"public\"),\n\tp(\"POST\", PLATFORM_A2A_PUSH_CALLBACK_PATH, \"authenticated\"),\n\tp(\"GET\", \"/api/a2a/cockpit\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/connections\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions\", \"authenticated\"),\n\tp(\"GET\", \"/api/headless/sessions/:id\", \"authenticated\"),\n\tp(\"GET\", \"/api/headless/sessions/:id/events\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/subscribe\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/unsubscribe\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/heartbeat\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/disconnect\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/messages\", \"authenticated\"),\n\tp(\"GET\", \"/debug/z\", \"authenticated\"),\n\tp(\"GET\", \"/api/files\", \"authenticated\"),\n\tp(\"GET\", \"/api/commands\", \"authenticated\"),\n\tp(\"GET\", \"/api/command-prefs\", \"authenticated\"),\n\tp(\"POST\", \"/api/command-prefs\", \"authenticated\"),\n\tp(\"GET\", \"/api/models\", \"authenticated\"),\n\tp(\"GET\", \"/api/status\", \"authenticated\"),\n\tp(\"POST\", \"/api/prompt-suggestion\", \"authenticated\"),\n\tp(\"POST\", \"/api/status\", \"authenticated\"),\n\tp(\"GET\", \"/api/bridge/status\", \"authenticated\"),\n\tp(\"GET\", \"/api/config\", \"authenticated\"),\n\tp(\"POST\", \"/api/config\", \"authenticated\"),\n\tp(\"GET\", \"/api/guardian/status\", \"authenticated\"),\n\tp(\"POST\", \"/api/guardian/run\", \"authenticated\"),\n\tp(\"POST\", \"/api/guardian/config\", \"authenticated\"),\n\tp(\"GET\", \"/api/plan\", \"authenticated\"),\n\tp(\"POST\", \"/api/plan\", \"authenticated\"),\n\tp(\"GET\", \"/api/mcp\", \"authenticated\"),\n\tp(\"POST\", \"/api/mcp\", \"authenticated\"),\n\tp(\"GET\", \"/api/package\", \"authenticated\"),\n\tp(\"POST\", \"/api/package\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/analytics\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/analytics/:period\", \"authenticated\"),\n\tp(\"POST\", \"/api/traces\", \"authenticated\"),\n\tp(\"GET\", \"/api/traces\", \"authenticated\"),\n\tp(\"GET\", \"/api/traces/:id\", \"authenticated\"),\n\tp(\"GET\", \"/api/workspace-configs\", \"authenticated\"),\n\tp(\"POST\", \"/api/workspace-configs\", \"authenticated\"),\n\tp(\"GET\", \"/api/workspace-configs/:workspaceId\", \"authenticated\"),\n\tp(\"PUT\", \"/api/workspace-configs/:workspaceId\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/workspace-configs/:workspaceId\", \"authenticated\"),\n\tp(\"POST\", \"/api/compliance/generate-report\", \"authenticated\"),\n\tp(\"GET\", \"/api/compliance/controls\", \"authenticated\"),\n\tp(\"GET\", \"/api/compliance/evidence/:controlId\", \"authenticated\"),\n\tp(\"POST\", \"/api/attribution/record-outcome\", \"authenticated\"),\n\tp(\"GET\", \"/api/attribution/roi/:agentId\", \"authenticated\"),\n\tp(\"GET\", \"/api/intelligent-router/decisions\", \"authenticated\"),\n\tp(\"POST\", \"/api/intelligent-router/decisions\", \"authenticated\"),\n\tp(\"GET\", \"/api/intelligent-router/metrics\", \"authenticated\"),\n\tp(\"POST\", \"/api/intelligent-router/metrics\", \"authenticated\"),\n\tp(\"GET\", \"/api/intelligent-router/overrides\", \"authenticated\"),\n\tp(\"POST\", \"/api/intelligent-router/overrides\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/intelligent-router/overrides/:taskType\", \"authenticated\"),\n\tp(\"GET\", \"/api/fleet\", \"authenticated\"),\n\tp(\"GET\", \"/api/background\", \"authenticated\"),\n\tp(\"POST\", \"/api/background\", \"authenticated\"),\n\tp(\"GET\", \"/api/automations\", \"authenticated\"),\n\tp(\"POST\", \"/api/automations\", \"authenticated\"),\n\tp(\"POST\", \"/api/automations/preview\", \"authenticated\"),\n\tp(\"GET\", \"/api/automations/magic-docs\", \"authenticated\"),\n\tp(\"PATCH\", \"/api/automations/:id\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/automations/:id\", \"authenticated\"),\n\tp(\"POST\", \"/api/automations/:id/run\", \"authenticated\"),\n\tp(\"GET\", \"/api/undo\", \"authenticated\"),\n\tp(\"POST\", \"/api/undo\", \"authenticated\"),\n\tp(\"GET\", \"/api/changes\", \"authenticated\"),\n\tp(\"GET\", \"/api/approvals\", \"authenticated\"),\n\tp(\"POST\", \"/api/approvals\", \"authenticated\"),\n\tp(\"GET\", \"/api/framework\", \"authenticated\"),\n\tp(\"POST\", \"/api/framework\", \"authenticated\"),\n\tp(\"GET\", \"/api/tools\", \"authenticated\"),\n\tp(\"GET\", \"/api/review\", \"authenticated\"),\n\tp(\"GET\", \"/api/context\", \"authenticated\"),\n\tp(\"GET\", \"/api/stats\", \"authenticated\"),\n\tp(\"GET\", \"/api/telemetry\", \"authenticated\"),\n\tp(\"POST\", \"/api/telemetry\", \"authenticated\"),\n\tp(\"GET\", \"/api/training\", \"authenticated\"),\n\tp(\"POST\", \"/api/training\", \"authenticated\"),\n\tp(\"GET\", \"/api/diagnostics\", \"authenticated\"),\n\tp(\"GET\", \"/api/lsp\", \"authenticated\"),\n\tp(\"POST\", \"/api/lsp\", \"authenticated\"),\n\tp(\"GET\", \"/api/workflow\", \"authenticated\"),\n\tp(\"POST\", \"/api/workflow\", \"authenticated\"),\n\tp(\"GET\", \"/api/run\", \"authenticated\"),\n\tp(\"POST\", \"/api/run\", \"authenticated\"),\n\tp(\"GET\", \"/api/ollama\", \"authenticated\"),\n\tp(\"POST\", \"/api/ollama\", \"authenticated\"),\n\tp(\"GET\", \"/api/preview\", \"authenticated\"),\n\tp(\"GET\", \"/api/composer\", \"authenticated\"),\n\tp(\"POST\", \"/api/composer\", \"authenticated\"),\n\tp(\"GET\", \"/api/cost\", \"authenticated\"),\n\tp(\"POST\", \"/api/cost\", \"authenticated\"),\n\tp(\"GET\", \"/api/quota\", \"authenticated\"),\n\tp(\"POST\", \"/api/quota\", \"authenticated\"),\n\tp(\"GET\", \"/api/memory\", \"authenticated\"),\n\tp(\"POST\", \"/api/memory\", \"authenticated\"),\n\tp(\"GET\", \"/api/mode\", \"authenticated\"),\n\tp(\"POST\", \"/api/mode\", \"authenticated\"),\n\tp(\"GET\", \"/api/zen\", \"authenticated\"),\n\tp(\"POST\", \"/api/zen\", \"authenticated\"),\n\tp(\"GET\", \"/api/ui\", \"authenticated\"),\n\tp(\"POST\", \"/api/ui\", \"authenticated\"),\n\tp(\"GET\", \"/api/queue\", \"authenticated\"),\n\tp(\"POST\", \"/api/queue\", \"authenticated\"),\n\tp(\"GET\", \"/api/branch\", \"authenticated\"),\n\tp(\"POST\", \"/api/branch\", \"authenticated\"),\n\tp(\"GET\", \"/api/model\", \"authenticated\"),\n\tp(\"POST\", \"/api/model\", \"authenticated\"),\n\tp(\"GET\", \"/api/metrics\", \"authenticated\"),\n\tp(\"POST\", \"/api/chat\", \"authenticated\"),\n\tp(\"POST\", \"/api/pending-requests/:requestId/resume\", \"owner\"),\n\tp(\"POST\", \"/api/chat/approval\", \"authenticated\"),\n\tp(\"POST\", \"/api/chat/client-tool-result\", \"authenticated\"),\n\tp(\"POST\", \"/api/chat/tool-retry\", \"authenticated\"),\n\tp(\"POST\", \"/api/attachments/extract\", \"authenticated\"),\n\tp(\"GET\", \"/api/sessions/:id/artifacts\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/artifact-access\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/artifacts.zip\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/artifacts/events\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/artifacts/:filename\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/artifacts/:filename/view\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/attachments/:attachmentId\", \"owner\"),\n\tp(\"POST\", \"/api/sessions/:id/attachments/:attachmentId/extract\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/timeline\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/replay-lab\", \"owner\"),\n\tp(\"GET\", \"/api/sessions\", \"authenticated\"),\n\tp(\"POST\", \"/api/sessions\", \"authenticated\"),\n\tp(\"GET\", \"/api/sessions/:id\", \"owner\"),\n\tp(\"PATCH\", \"/api/sessions/:id\", \"owner\"),\n\tp(\"DELETE\", \"/api/sessions/:id\", \"owner\"),\n\tp(\"POST\", \"/api/sessions/:id/share\", \"owner\"),\n\tp(\"POST\", \"/api/sessions/:id/export\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/shared/:token\", \"authenticated\"),\n\tp(\n\t\t\"GET\",\n\t\t\"/api/sessions/shared/:token/attachments/:attachmentId\",\n\t\t\"authenticated\",\n\t),\n\tp(\"POST\", \"/api/policy/validate\", \"authenticated\"),\n\tp(\"POST\", \"/api/admin/cleanup\", \"authenticated\"),\n\tp(\"POST\", \"/api/admin/warm-caches\", \"authenticated\"),\n] as const;\n\nexport const ENTERPRISE_ROUTE_AUTH_POLICIES: readonly RouteAuthPolicyEntry[] = [\n\tp(\"POST\", \"/api/auth/register\", \"public\"),\n\tp(\"POST\", \"/api/auth/login\", \"public\"),\n\tp(\"GET\", \"/api/auth/me\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/quota\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/org\", \"authenticated\"),\n\tp(\"GET\", \"/api/audit/logs\", \"authenticated\"),\n\tp(\"GET\", \"/api/alerts\", \"authenticated\"),\n\tp(\"POST\", \"/api/alerts/:alertId/read\", \"authenticated\"),\n\tp(\"POST\", \"/api/alerts/:alertId/resolve\", \"authenticated\"),\n\tp(\"GET\", \"/api/org/members\", \"authenticated\"),\n\tp(\"POST\", \"/api/org/members/invite\", \"authenticated\"),\n\tp(\"PUT\", \"/api/org/members/:userId/role\", \"authenticated\"),\n\tp(\"PUT\", \"/api/org/members/:userId/quota\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/org/members/:userId\", \"authenticated\"),\n\tp(\"GET\", \"/api/org/settings\", \"authenticated\"),\n\tp(\"PUT\", \"/api/org/settings\", \"authenticated\"),\n\tp(\"GET\", \"/api/roles\", \"authenticated\"),\n\tp(\"GET\", \"/api/models/approvals\", \"authenticated\"),\n\tp(\"POST\", \"/api/models/approvals/:modelId/approve\", \"authenticated\"),\n\tp(\"POST\", \"/api/models/approvals/:modelId/deny\", \"authenticated\"),\n\tp(\"GET\", \"/api/directory-rules\", \"authenticated\"),\n\tp(\"POST\", \"/api/directory-rules\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/directory-rules/:ruleId\", \"authenticated\"),\n] as const;\n\nfunction routeKey(method: string, path: string): string {\n\treturn `${method.toUpperCase()} ${path}`;\n}\n\nfunction toSegments(pathname: string): string[] {\n\tif (pathname === \"/\" || pathname === \"\") return [];\n\treturn pathname.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n}\n\nfunction pathMatches(pattern: string, pathname: string): boolean {\n\tconst patternSegments = toSegments(pattern);\n\tconst pathSegments = toSegments(pathname);\n\tif (patternSegments.length !== pathSegments.length) return false;\n\tfor (let i = 0; i < patternSegments.length; i++) {\n\t\tconst patternSegment = patternSegments[i]!;\n\t\tconst pathSegment = pathSegments[i]!;\n\t\tif (patternSegment.startsWith(\":\")) continue;\n\t\tif (patternSegment !== pathSegment) return false;\n\t}\n\treturn true;\n}\n\nfunction validateUniquePolicies(\n\tpolicies: readonly RouteAuthPolicyEntry[],\n): Map<string, RouteAuthPolicy> {\n\tconst policyByRoute = new Map<string, RouteAuthPolicy>();\n\tconst duplicates: string[] = [];\n\tfor (const policy of policies) {\n\t\tconst key = routeKey(policy.method, policy.path);\n\t\tif (policyByRoute.has(key)) {\n\t\t\tduplicates.push(key);\n\t\t\tcontinue;\n\t\t}\n\t\tpolicyByRoute.set(key, policy.auth);\n\t}\n\tif (duplicates.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Duplicate route auth policy entries: ${duplicates.join(\", \")}`,\n\t\t);\n\t}\n\treturn policyByRoute;\n}\n\nexport function withRouteAuthPolicies(\n\troutes: readonly Route[],\n\tpolicies: readonly RouteAuthPolicyEntry[] = ROUTE_AUTH_POLICIES,\n): Route[] {\n\tconst policyByRoute = validateUniquePolicies(policies);\n\tconst routeKeys = new Set<string>();\n\tconst duplicates: string[] = [];\n\tconst missing: string[] = [];\n\n\tfor (const route of routes) {\n\t\tconst key = routeKey(route.method, route.path);\n\t\tif (routeKeys.has(key)) {\n\t\t\tduplicates.push(key);\n\t\t}\n\t\trouteKeys.add(key);\n\t\tif (!policyByRoute.has(key)) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tconst stale = Array.from(policyByRoute.keys()).filter(\n\t\t(key) => !routeKeys.has(key),\n\t);\n\tconst failures = [\n\t\tduplicates.length > 0\n\t\t\t? `Duplicate route definitions: ${duplicates.join(\", \")}`\n\t\t\t: null,\n\t\tmissing.length > 0\n\t\t\t? `Missing route auth policies: ${missing.join(\", \")}`\n\t\t\t: null,\n\t\tstale.length > 0 ? `Stale route auth policies: ${stale.join(\", \")}` : null,\n\t].filter((value): value is string => Boolean(value));\n\n\tif (failures.length > 0) {\n\t\tthrow new Error(failures.join(\"; \"));\n\t}\n\n\treturn routes.map((route) => ({\n\t\t...route,\n\t\tauth: policyByRoute.get(routeKey(route.method, route.path)),\n\t}));\n}\n\nexport function findRouteAuthPolicy(\n\tmethod: string,\n\tpathname: string,\n\troutes: readonly Route[],\n): RouteAuthPolicy | null {\n\tconst targetMethod = method.toUpperCase();\n\tfor (const route of routes) {\n\t\tif (route.method.toUpperCase() !== targetMethod) continue;\n\t\tif (pathMatches(route.path, pathname)) {\n\t\t\treturn route.auth ?? null;\n\t\t}\n\t}\n\treturn null;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"route-auth.js","sourceRoot":"","sources":["../../src/server/route-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AASlF,SAAS,CAAC,CACT,MAAc,EACd,IAAY,EACZ,KAAqB,EACrB,UAA0C,EAAE;IAE5C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAoC;IACnE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC9B,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC7B,CAAC,CAAC,KAAK,EAAE,2BAA2B,EAAE,QAAQ,CAAC;IAC/C,CAAC,CAAC,MAAM,EAAE,wBAAwB,EAAE,QAAQ,CAAC;IAC7C,CAAC,CAAC,MAAM,EAAE,+BAA+B,EAAE,eAAe,CAAC;IAC3D,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC7C,CAAC,CAAC,MAAM,EAAE,2BAA2B,EAAE,eAAe,CAAC;IACvD,CAAC,CAAC,MAAM,EAAE,wBAAwB,EAAE,eAAe,CAAC;IACpD,CAAC,CAAC,KAAK,EAAE,4BAA4B,EAAE,eAAe,CAAC;IACvD,CAAC,CAAC,KAAK,EAAE,mCAAmC,EAAE,eAAe,CAAC;IAC9D,CAAC,CAAC,MAAM,EAAE,sCAAsC,EAAE,eAAe,CAAC;IAClE,CAAC,CAAC,MAAM,EAAE,wCAAwC,EAAE,eAAe,CAAC;IACpE,CAAC,CAAC,MAAM,EAAE,sCAAsC,EAAE,eAAe,CAAC;IAClE,CAAC,CAAC,MAAM,EAAE,uCAAuC,EAAE,eAAe,CAAC;IACnE,CAAC,CAAC,MAAM,EAAE,qCAAqC,EAAE,eAAe,CAAC;IACjE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,CAAC;IACrC,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC;IAC1C,CAAC,CAAC,KAAK,EAAE,oBAAoB,EAAE,eAAe,CAAC;IAC/C,CAAC,CAAC,MAAM,EAAE,oBAAoB,EAAE,eAAe,CAAC;IAChD,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE,wBAAwB,EAAE,eAAe,CAAC;IACpD,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,oBAAoB,EAAE,eAAe,CAAC;IAC/C,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACjD,CAAC,CAAC,MAAM,EAAE,mBAAmB,EAAE,eAAe,CAAC;IAC/C,CAAC,CAAC,MAAM,EAAE,sBAAsB,EAAE,eAAe,CAAC;IAClD,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,CAAC;IACrC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,eAAe,CAAC;IAC1C,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACjD,CAAC,CAAC,KAAK,EAAE,8BAA8B,EAAE,eAAe,CAAC;IACzD,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,eAAe,CAAC;IAC5C,CAAC,CAAC,KAAK,EAAE,wBAAwB,EAAE,eAAe,CAAC;IACnD,CAAC,CAAC,MAAM,EAAE,wBAAwB,EAAE,eAAe,CAAC;IACpD,CAAC,CAAC,KAAK,EAAE,qCAAqC,EAAE,eAAe,CAAC;IAChE,CAAC,CAAC,KAAK,EAAE,qCAAqC,EAAE,eAAe,CAAC;IAChE,CAAC,CAAC,QAAQ,EAAE,qCAAqC,EAAE,eAAe,CAAC;IACnE,CAAC,CAAC,MAAM,EAAE,iCAAiC,EAAE,eAAe,CAAC;IAC7D,CAAC,CAAC,KAAK,EAAE,0BAA0B,EAAE,eAAe,CAAC;IACrD,CAAC,CAAC,KAAK,EAAE,qCAAqC,EAAE,eAAe,CAAC;IAChE,CAAC,CAAC,MAAM,EAAE,iCAAiC,EAAE,eAAe,CAAC;IAC7D,CAAC,CAAC,KAAK,EAAE,+BAA+B,EAAE,eAAe,CAAC;IAC1D,CAAC,CAAC,KAAK,EAAE,mCAAmC,EAAE,eAAe,CAAC;IAC9D,CAAC,CAAC,MAAM,EAAE,mCAAmC,EAAE,eAAe,CAAC;IAC/D,CAAC,CAAC,KAAK,EAAE,iCAAiC,EAAE,eAAe,CAAC;IAC5D,CAAC,CAAC,MAAM,EAAE,iCAAiC,EAAE,eAAe,CAAC;IAC7D,CAAC,CAAC,KAAK,EAAE,mCAAmC,EAAE,eAAe,CAAC;IAC9D,CAAC,CAAC,MAAM,EAAE,mCAAmC,EAAE,eAAe,CAAC;IAC/D,CAAC,CAAC,QAAQ,EAAE,6CAA6C,EAAE,eAAe,CAAC;IAC3E,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,eAAe,CAAC;IAC5C,CAAC,CAAC,MAAM,EAAE,iBAAiB,EAAE,eAAe,CAAC;IAC7C,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC7C,CAAC,CAAC,MAAM,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC9C,CAAC,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,CAAC;IACtD,CAAC,CAAC,KAAK,EAAE,6BAA6B,EAAE,eAAe,CAAC;IACxD,CAAC,CAAC,OAAO,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACnD,CAAC,CAAC,QAAQ,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACpD,CAAC,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,CAAC;IACtD,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC5C,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC5C,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC5C,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC;IAC1C,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC7C,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,CAAC;IACrC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC;IAC1C,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,CAAC;IACrC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC;IAC1C,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,CAAC;IACrC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC;IACtC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC;IACpC,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC;IACrC,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,MAAM,EAAE,yCAAyC,EAAE,OAAO,CAAC;IAC7D,CAAC,CAAC,MAAM,EAAE,oBAAoB,EAAE,eAAe,CAAC;IAChD,CAAC,CAAC,MAAM,EAAE,8BAA8B,EAAE,eAAe,CAAC;IAC1D,CAAC,CAAC,MAAM,EAAE,sBAAsB,EAAE,eAAe,CAAC;IAClD,CAAC,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,CAAC;IACtD,CAAC,CAAC,KAAK,EAAE,6BAA6B,EAAE,OAAO,CAAC;IAChD,CAAC,CAAC,KAAK,EAAE,mCAAmC,EAAE,OAAO,CAAC;IACtD,CAAC,CAAC,KAAK,EAAE,iCAAiC,EAAE,OAAO,EAAE;QACpD,mBAAmB,EAAE,IAAI;KACzB,CAAC;IACF,CAAC,CAAC,KAAK,EAAE,oCAAoC,EAAE,OAAO,EAAE;QACvD,mBAAmB,EAAE,IAAI;KACzB,CAAC;IACF,CAAC,CAAC,KAAK,EAAE,uCAAuC,EAAE,OAAO,EAAE;QAC1D,mBAAmB,EAAE,IAAI;KACzB,CAAC;IACF,CAAC,CAAC,KAAK,EAAE,4CAA4C,EAAE,OAAO,EAAE;QAC/D,mBAAmB,EAAE,IAAI;KACzB,CAAC;IACF,CAAC,CAAC,KAAK,EAAE,6CAA6C,EAAE,OAAO,CAAC;IAChE,CAAC,CAAC,MAAM,EAAE,qDAAqD,EAAE,OAAO,CAAC;IACzE,CAAC,CAAC,KAAK,EAAE,4BAA4B,EAAE,OAAO,CAAC;IAC/C,CAAC,CAAC,KAAK,EAAE,8BAA8B,EAAE,OAAO,CAAC;IACjD,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,CAAC;IAC1C,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,CAAC;IACtC,CAAC,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC;IACxC,CAAC,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,CAAC;IACzC,CAAC,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,CAAC;IAC7C,CAAC,CAAC,MAAM,EAAE,0BAA0B,EAAE,OAAO,CAAC;IAC9C,CAAC,CAAC,KAAK,EAAE,6BAA6B,EAAE,eAAe,CAAC;IACxD,CAAC,CACA,KAAK,EACL,uDAAuD,EACvD,eAAe,CACf;IACD,CAAC,CAAC,MAAM,EAAE,sBAAsB,EAAE,eAAe,CAAC;IAClD,CAAC,CAAC,MAAM,EAAE,oBAAoB,EAAE,eAAe,CAAC;IAChD,CAAC,CAAC,MAAM,EAAE,wBAAwB,EAAE,eAAe,CAAC;CAC3C,CAAC;AAEX,MAAM,CAAC,MAAM,8BAA8B,GAAoC;IAC9E,CAAC,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,CAAC;IACzC,CAAC,CAAC,MAAM,EAAE,iBAAiB,EAAE,QAAQ,CAAC;IACtC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC;IACzC,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC7C,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC3C,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,eAAe,CAAC;IAC5C,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE,2BAA2B,EAAE,eAAe,CAAC;IACvD,CAAC,CAAC,MAAM,EAAE,8BAA8B,EAAE,eAAe,CAAC;IAC1D,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC7C,CAAC,CAAC,MAAM,EAAE,yBAAyB,EAAE,eAAe,CAAC;IACrD,CAAC,CAAC,KAAK,EAAE,+BAA+B,EAAE,eAAe,CAAC;IAC1D,CAAC,CAAC,KAAK,EAAE,gCAAgC,EAAE,eAAe,CAAC;IAC3D,CAAC,CAAC,QAAQ,EAAE,0BAA0B,EAAE,eAAe,CAAC;IACxD,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,eAAe,CAAC;IAC9C,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,eAAe,CAAC;IAC9C,CAAC,CAAC,KAAK,EAAE,oBAAoB,EAAE,eAAe,CAAC;IAC/C,CAAC,CAAC,KAAK,EAAE,oBAAoB,EAAE,eAAe,CAAC;IAC/C,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,CAAC;IACvC,CAAC,CAAC,KAAK,EAAE,uBAAuB,EAAE,eAAe,CAAC;IAClD,CAAC,CAAC,MAAM,EAAE,wCAAwC,EAAE,eAAe,CAAC;IACpE,CAAC,CAAC,MAAM,EAAE,qCAAqC,EAAE,eAAe,CAAC;IACjE,CAAC,CAAC,KAAK,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACjD,CAAC,CAAC,MAAM,EAAE,sBAAsB,EAAE,eAAe,CAAC;IAClD,CAAC,CAAC,QAAQ,EAAE,8BAA8B,EAAE,eAAe,CAAC;CACnD,CAAC;AAEX,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAY;IAC7C,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IACnC,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACnD,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,QAAgB;IACrD,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,eAAe,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,cAAc,GAAG,eAAe,CAAC,CAAC,CAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC;QACrC,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC7C,IAAI,cAAc,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,sBAAsB,CAC9B,QAAyC;IAEzC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;IACzD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACV,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACd,wCAAwC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/D,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,MAAwB,EACxB,WAA4C,mBAAmB;IAE/D,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CACpD,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAC5B,CAAC;IACF,MAAM,QAAQ,GAAG;QAChB,UAAU,CAAC,MAAM,GAAG,CAAC;YACpB,CAAC,CAAC,gCAAgC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzD,CAAC,CAAC,IAAI;QACP,OAAO,CAAC,MAAM,GAAG,CAAC;YACjB,CAAC,CAAC,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtD,CAAC,CAAC,IAAI;QACP,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;KAC1E,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAErD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7B,GAAG,KAAK;QACR,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;KAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,MAAc,EACd,QAAgB,EAChB,MAAwB;IAExB,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,YAAY;YAAE,SAAS;QAC1D,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;QAC3B,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC","sourcesContent":["import { HOSTED_RUNNER_DRAIN_PATH } from \"./handlers/hosted-runner-drain.js\";\nimport { HOSTED_RUNNER_IDENTITY_PATH } from \"./handlers/hosted-runner-identity.js\";\nimport { PLATFORM_A2A_PUSH_CALLBACK_PATH } from \"./handlers/platform-a2a-push.js\";\nimport type { Route, RouteAuthLevel, RouteAuthPolicy } from \"./router.js\";\n\nexport interface RouteAuthPolicyEntry {\n\tmethod: string;\n\tpath: string;\n\tauth: RouteAuthPolicy;\n}\n\nfunction p(\n\tmethod: string,\n\tpath: string,\n\tlevel: RouteAuthLevel,\n\toptions: Omit<RouteAuthPolicy, \"level\"> = {},\n): RouteAuthPolicyEntry {\n\treturn { method, path, auth: { level, ...options } };\n}\n\nexport const ROUTE_AUTH_POLICIES: readonly RouteAuthPolicyEntry[] = [\n\tp(\"GET\", \"/healthz\", \"public\"),\n\tp(\"GET\", \"/readyz\", \"public\"),\n\tp(\"GET\", HOSTED_RUNNER_IDENTITY_PATH, \"public\"),\n\tp(\"POST\", HOSTED_RUNNER_DRAIN_PATH, \"public\"),\n\tp(\"POST\", PLATFORM_A2A_PUSH_CALLBACK_PATH, \"authenticated\"),\n\tp(\"GET\", \"/api/a2a/cockpit\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/connections\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions\", \"authenticated\"),\n\tp(\"GET\", \"/api/headless/sessions/:id\", \"authenticated\"),\n\tp(\"GET\", \"/api/headless/sessions/:id/events\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/subscribe\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/unsubscribe\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/heartbeat\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/disconnect\", \"authenticated\"),\n\tp(\"POST\", \"/api/headless/sessions/:id/messages\", \"authenticated\"),\n\tp(\"GET\", \"/debug/z\", \"authenticated\"),\n\tp(\"GET\", \"/api/files\", \"authenticated\"),\n\tp(\"GET\", \"/api/commands\", \"authenticated\"),\n\tp(\"GET\", \"/api/command-prefs\", \"authenticated\"),\n\tp(\"POST\", \"/api/command-prefs\", \"authenticated\"),\n\tp(\"GET\", \"/api/models\", \"authenticated\"),\n\tp(\"GET\", \"/api/status\", \"authenticated\"),\n\tp(\"POST\", \"/api/prompt-suggestion\", \"authenticated\"),\n\tp(\"POST\", \"/api/status\", \"authenticated\"),\n\tp(\"GET\", \"/api/bridge/status\", \"authenticated\"),\n\tp(\"GET\", \"/api/config\", \"authenticated\"),\n\tp(\"POST\", \"/api/config\", \"authenticated\"),\n\tp(\"GET\", \"/api/guardian/status\", \"authenticated\"),\n\tp(\"POST\", \"/api/guardian/run\", \"authenticated\"),\n\tp(\"POST\", \"/api/guardian/config\", \"authenticated\"),\n\tp(\"GET\", \"/api/plan\", \"authenticated\"),\n\tp(\"POST\", \"/api/plan\", \"authenticated\"),\n\tp(\"GET\", \"/api/mcp\", \"authenticated\"),\n\tp(\"POST\", \"/api/mcp\", \"authenticated\"),\n\tp(\"GET\", \"/api/package\", \"authenticated\"),\n\tp(\"POST\", \"/api/package\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/analytics\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/analytics/:period\", \"authenticated\"),\n\tp(\"POST\", \"/api/traces\", \"authenticated\"),\n\tp(\"GET\", \"/api/traces\", \"authenticated\"),\n\tp(\"GET\", \"/api/traces/:id\", \"authenticated\"),\n\tp(\"GET\", \"/api/workspace-configs\", \"authenticated\"),\n\tp(\"POST\", \"/api/workspace-configs\", \"authenticated\"),\n\tp(\"GET\", \"/api/workspace-configs/:workspaceId\", \"authenticated\"),\n\tp(\"PUT\", \"/api/workspace-configs/:workspaceId\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/workspace-configs/:workspaceId\", \"authenticated\"),\n\tp(\"POST\", \"/api/compliance/generate-report\", \"authenticated\"),\n\tp(\"GET\", \"/api/compliance/controls\", \"authenticated\"),\n\tp(\"GET\", \"/api/compliance/evidence/:controlId\", \"authenticated\"),\n\tp(\"POST\", \"/api/attribution/record-outcome\", \"authenticated\"),\n\tp(\"GET\", \"/api/attribution/roi/:agentId\", \"authenticated\"),\n\tp(\"GET\", \"/api/intelligent-router/decisions\", \"authenticated\"),\n\tp(\"POST\", \"/api/intelligent-router/decisions\", \"authenticated\"),\n\tp(\"GET\", \"/api/intelligent-router/metrics\", \"authenticated\"),\n\tp(\"POST\", \"/api/intelligent-router/metrics\", \"authenticated\"),\n\tp(\"GET\", \"/api/intelligent-router/overrides\", \"authenticated\"),\n\tp(\"POST\", \"/api/intelligent-router/overrides\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/intelligent-router/overrides/:taskType\", \"authenticated\"),\n\tp(\"GET\", \"/api/fleet\", \"authenticated\"),\n\tp(\"GET\", \"/api/background\", \"authenticated\"),\n\tp(\"POST\", \"/api/background\", \"authenticated\"),\n\tp(\"GET\", \"/api/automations\", \"authenticated\"),\n\tp(\"POST\", \"/api/automations\", \"authenticated\"),\n\tp(\"POST\", \"/api/automations/preview\", \"authenticated\"),\n\tp(\"GET\", \"/api/automations/magic-docs\", \"authenticated\"),\n\tp(\"PATCH\", \"/api/automations/:id\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/automations/:id\", \"authenticated\"),\n\tp(\"POST\", \"/api/automations/:id/run\", \"authenticated\"),\n\tp(\"GET\", \"/api/undo\", \"authenticated\"),\n\tp(\"POST\", \"/api/undo\", \"authenticated\"),\n\tp(\"GET\", \"/api/changes\", \"authenticated\"),\n\tp(\"GET\", \"/api/approvals\", \"authenticated\"),\n\tp(\"POST\", \"/api/approvals\", \"authenticated\"),\n\tp(\"GET\", \"/api/framework\", \"authenticated\"),\n\tp(\"POST\", \"/api/framework\", \"authenticated\"),\n\tp(\"GET\", \"/api/tools\", \"authenticated\"),\n\tp(\"GET\", \"/api/review\", \"authenticated\"),\n\tp(\"GET\", \"/api/context\", \"authenticated\"),\n\tp(\"GET\", \"/api/stats\", \"authenticated\"),\n\tp(\"GET\", \"/api/telemetry\", \"authenticated\"),\n\tp(\"POST\", \"/api/telemetry\", \"authenticated\"),\n\tp(\"GET\", \"/api/training\", \"authenticated\"),\n\tp(\"POST\", \"/api/training\", \"authenticated\"),\n\tp(\"GET\", \"/api/diagnostics\", \"authenticated\"),\n\tp(\"GET\", \"/api/lsp\", \"authenticated\"),\n\tp(\"POST\", \"/api/lsp\", \"authenticated\"),\n\tp(\"GET\", \"/api/workflow\", \"authenticated\"),\n\tp(\"POST\", \"/api/workflow\", \"authenticated\"),\n\tp(\"GET\", \"/api/run\", \"authenticated\"),\n\tp(\"POST\", \"/api/run\", \"authenticated\"),\n\tp(\"GET\", \"/api/ollama\", \"authenticated\"),\n\tp(\"POST\", \"/api/ollama\", \"authenticated\"),\n\tp(\"GET\", \"/api/preview\", \"authenticated\"),\n\tp(\"GET\", \"/api/composer\", \"authenticated\"),\n\tp(\"POST\", \"/api/composer\", \"authenticated\"),\n\tp(\"GET\", \"/api/cost\", \"authenticated\"),\n\tp(\"POST\", \"/api/cost\", \"authenticated\"),\n\tp(\"GET\", \"/api/quota\", \"authenticated\"),\n\tp(\"POST\", \"/api/quota\", \"authenticated\"),\n\tp(\"GET\", \"/api/memory\", \"authenticated\"),\n\tp(\"POST\", \"/api/memory\", \"authenticated\"),\n\tp(\"GET\", \"/api/mode\", \"authenticated\"),\n\tp(\"POST\", \"/api/mode\", \"authenticated\"),\n\tp(\"GET\", \"/api/zen\", \"authenticated\"),\n\tp(\"POST\", \"/api/zen\", \"authenticated\"),\n\tp(\"GET\", \"/api/ui\", \"authenticated\"),\n\tp(\"POST\", \"/api/ui\", \"authenticated\"),\n\tp(\"GET\", \"/api/queue\", \"authenticated\"),\n\tp(\"POST\", \"/api/queue\", \"authenticated\"),\n\tp(\"GET\", \"/api/branch\", \"authenticated\"),\n\tp(\"POST\", \"/api/branch\", \"authenticated\"),\n\tp(\"GET\", \"/api/model\", \"authenticated\"),\n\tp(\"POST\", \"/api/model\", \"authenticated\"),\n\tp(\"GET\", \"/api/metrics\", \"authenticated\"),\n\tp(\"POST\", \"/api/chat\", \"authenticated\"),\n\tp(\"POST\", \"/api/pending-requests/:requestId/resume\", \"owner\"),\n\tp(\"POST\", \"/api/chat/approval\", \"authenticated\"),\n\tp(\"POST\", \"/api/chat/client-tool-result\", \"authenticated\"),\n\tp(\"POST\", \"/api/chat/tool-retry\", \"authenticated\"),\n\tp(\"POST\", \"/api/attachments/extract\", \"authenticated\"),\n\tp(\"GET\", \"/api/sessions/:id/artifacts\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/artifact-access\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/artifacts.zip\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/artifacts/events\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/artifacts/:filename\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/artifacts/:filename/view\", \"owner\", {\n\t\tallowArtifactAccess: true,\n\t}),\n\tp(\"GET\", \"/api/sessions/:id/attachments/:attachmentId\", \"owner\"),\n\tp(\"POST\", \"/api/sessions/:id/attachments/:attachmentId/extract\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/timeline\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/:id/replay-lab\", \"owner\"),\n\tp(\"GET\", \"/api/sessions\", \"authenticated\"),\n\tp(\"POST\", \"/api/sessions\", \"authenticated\"),\n\tp(\"GET\", \"/api/sessions/:id\", \"owner\"),\n\tp(\"PATCH\", \"/api/sessions/:id\", \"owner\"),\n\tp(\"DELETE\", \"/api/sessions/:id\", \"owner\"),\n\tp(\"POST\", \"/api/sessions/:id/share\", \"owner\"),\n\tp(\"POST\", \"/api/sessions/:id/export\", \"owner\"),\n\tp(\"GET\", \"/api/sessions/shared/:token\", \"authenticated\"),\n\tp(\n\t\t\"GET\",\n\t\t\"/api/sessions/shared/:token/attachments/:attachmentId\",\n\t\t\"authenticated\",\n\t),\n\tp(\"POST\", \"/api/policy/validate\", \"authenticated\"),\n\tp(\"POST\", \"/api/admin/cleanup\", \"authenticated\"),\n\tp(\"POST\", \"/api/admin/warm-caches\", \"authenticated\"),\n] as const;\n\nexport const ENTERPRISE_ROUTE_AUTH_POLICIES: readonly RouteAuthPolicyEntry[] = [\n\tp(\"POST\", \"/api/auth/register\", \"public\"),\n\tp(\"POST\", \"/api/auth/login\", \"public\"),\n\tp(\"GET\", \"/api/auth/me\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/quota\", \"authenticated\"),\n\tp(\"GET\", \"/api/usage/org\", \"authenticated\"),\n\tp(\"GET\", \"/api/audit/logs\", \"authenticated\"),\n\tp(\"GET\", \"/api/alerts\", \"authenticated\"),\n\tp(\"POST\", \"/api/alerts/:alertId/read\", \"authenticated\"),\n\tp(\"POST\", \"/api/alerts/:alertId/resolve\", \"authenticated\"),\n\tp(\"GET\", \"/api/org/members\", \"authenticated\"),\n\tp(\"POST\", \"/api/org/members/invite\", \"authenticated\"),\n\tp(\"PUT\", \"/api/org/members/:userId/role\", \"authenticated\"),\n\tp(\"PUT\", \"/api/org/members/:userId/quota\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/org/members/:userId\", \"authenticated\"),\n\tp(\"GET\", \"/api/org/settings\", \"authenticated\"),\n\tp(\"PUT\", \"/api/org/settings\", \"authenticated\"),\n\tp(\"GET\", \"/api/user/settings\", \"authenticated\"),\n\tp(\"PUT\", \"/api/user/settings\", \"authenticated\"),\n\tp(\"GET\", \"/api/roles\", \"authenticated\"),\n\tp(\"GET\", \"/api/models/approvals\", \"authenticated\"),\n\tp(\"POST\", \"/api/models/approvals/:modelId/approve\", \"authenticated\"),\n\tp(\"POST\", \"/api/models/approvals/:modelId/deny\", \"authenticated\"),\n\tp(\"GET\", \"/api/directory-rules\", \"authenticated\"),\n\tp(\"POST\", \"/api/directory-rules\", \"authenticated\"),\n\tp(\"DELETE\", \"/api/directory-rules/:ruleId\", \"authenticated\"),\n] as const;\n\nfunction routeKey(method: string, path: string): string {\n\treturn `${method.toUpperCase()} ${path}`;\n}\n\nfunction toSegments(pathname: string): string[] {\n\tif (pathname === \"/\" || pathname === \"\") return [];\n\treturn pathname.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n}\n\nfunction pathMatches(pattern: string, pathname: string): boolean {\n\tconst patternSegments = toSegments(pattern);\n\tconst pathSegments = toSegments(pathname);\n\tif (patternSegments.length !== pathSegments.length) return false;\n\tfor (let i = 0; i < patternSegments.length; i++) {\n\t\tconst patternSegment = patternSegments[i]!;\n\t\tconst pathSegment = pathSegments[i]!;\n\t\tif (patternSegment.startsWith(\":\")) continue;\n\t\tif (patternSegment !== pathSegment) return false;\n\t}\n\treturn true;\n}\n\nfunction validateUniquePolicies(\n\tpolicies: readonly RouteAuthPolicyEntry[],\n): Map<string, RouteAuthPolicy> {\n\tconst policyByRoute = new Map<string, RouteAuthPolicy>();\n\tconst duplicates: string[] = [];\n\tfor (const policy of policies) {\n\t\tconst key = routeKey(policy.method, policy.path);\n\t\tif (policyByRoute.has(key)) {\n\t\t\tduplicates.push(key);\n\t\t\tcontinue;\n\t\t}\n\t\tpolicyByRoute.set(key, policy.auth);\n\t}\n\tif (duplicates.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Duplicate route auth policy entries: ${duplicates.join(\", \")}`,\n\t\t);\n\t}\n\treturn policyByRoute;\n}\n\nexport function withRouteAuthPolicies(\n\troutes: readonly Route[],\n\tpolicies: readonly RouteAuthPolicyEntry[] = ROUTE_AUTH_POLICIES,\n): Route[] {\n\tconst policyByRoute = validateUniquePolicies(policies);\n\tconst routeKeys = new Set<string>();\n\tconst duplicates: string[] = [];\n\tconst missing: string[] = [];\n\n\tfor (const route of routes) {\n\t\tconst key = routeKey(route.method, route.path);\n\t\tif (routeKeys.has(key)) {\n\t\t\tduplicates.push(key);\n\t\t}\n\t\trouteKeys.add(key);\n\t\tif (!policyByRoute.has(key)) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tconst stale = Array.from(policyByRoute.keys()).filter(\n\t\t(key) => !routeKeys.has(key),\n\t);\n\tconst failures = [\n\t\tduplicates.length > 0\n\t\t\t? `Duplicate route definitions: ${duplicates.join(\", \")}`\n\t\t\t: null,\n\t\tmissing.length > 0\n\t\t\t? `Missing route auth policies: ${missing.join(\", \")}`\n\t\t\t: null,\n\t\tstale.length > 0 ? `Stale route auth policies: ${stale.join(\", \")}` : null,\n\t].filter((value): value is string => Boolean(value));\n\n\tif (failures.length > 0) {\n\t\tthrow new Error(failures.join(\"; \"));\n\t}\n\n\treturn routes.map((route) => ({\n\t\t...route,\n\t\tauth: policyByRoute.get(routeKey(route.method, route.path)),\n\t}));\n}\n\nexport function findRouteAuthPolicy(\n\tmethod: string,\n\tpathname: string,\n\troutes: readonly Route[],\n): RouteAuthPolicy | null {\n\tconst targetMethod = method.toUpperCase();\n\tfor (const route of routes) {\n\t\tif (route.method.toUpperCase() !== targetMethod) continue;\n\t\tif (pathMatches(route.path, pathname)) {\n\t\t\treturn route.auth ?? null;\n\t\t}\n\t}\n\treturn null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-serialization.d.ts","sourceRoot":"","sources":["../../src/server/session-serialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAGX,eAAe,EACf,gBAAgB,EAEhB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EACX,UAAU,EAQV,KAAK,EACL,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-serialization.d.ts","sourceRoot":"","sources":["../../src/server/session-serialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAGX,eAAe,EACf,gBAAgB,EAEhB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EACX,UAAU,EAQV,KAAK,EACL,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,gDAAgD;AAChD,MAAM,MAAM,6BAA6B,GAAG,eAAe,GAAG,eAAe,CAAC;AAE9E;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC3C,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,MAAM,CAAC,EAAE,6BAA6B,CAAC;CACvC;AAgCD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,2BAA2B,CAAC;gBAEnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B;CAKlE;AAiFD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,KAAK,CAcxC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAkBnE;AAmLD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,UAAU,EACnB,KAAK,SAAI,EACT,OAAO,CAAC,EAAE;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9C,eAAe,CAgEjB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,CAAC,EAAE;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9C,eAAe,EAAE,CAInB;AAuDD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,eAAe,EACtB,KAAK,SAAI,GACP,UAAU,EAAE,CA2Nd;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,eAAe,EAAE,EAC3B,KAAK,EAAE,eAAe,GACpB,UAAU,EAAE,CAOd"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
* - Tool calls are serialized with their results as separate messages
|
|
22
22
|
*/
|
|
23
23
|
import { isAssistantMessage, isToolResultMessage, isUserMessage, } from "../agent/type-guards.js";
|
|
24
|
+
import { isRecord } from "../utils/json.js";
|
|
24
25
|
/**
|
|
25
26
|
* Convert internal Usage to Maestro protocol format.
|
|
26
27
|
* Handles missing/undefined fields by defaulting to zero.
|
|
@@ -78,9 +79,6 @@ function safeStringify(value) {
|
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
/** Type guard for plain objects (not arrays or null) */
|
|
81
|
-
function isRecord(value) {
|
|
82
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
83
|
-
}
|
|
84
82
|
function toComposerAttachments(attachments, options) {
|
|
85
83
|
if (!attachments || attachments.length === 0)
|
|
86
84
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-serialization.js","sourceRoot":"","sources":["../../src/server/session-serialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,GACb,MAAM,yBAAyB,CAAC;AA8BjC;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAa;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO;QACN,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;QACvB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;QACzB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;QAC/B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC;QACjC,oDAAoD;QACpD,IAAI,EAAE,KAAK,CAAC,IAAI;YACf,CAAC,CAAC;gBACA,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;gBAC5B,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;gBAC9B,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC;gBACpC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC;gBACtC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;aAC5B;YACF,CAAC,CAAC;gBACA,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,CAAC;aACR;KACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAGnD,YAAY,OAAe,EAAE,OAAqC;QACjE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD;AAED,mEAAmE;AACnE,MAAM,wBAAwB,GAAG,SAAS,CAAC;AAC3C,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAE5C;;;GAGG;AACH,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,kBAAkB,CAAC;IAC3B,CAAC;AACF,CAAC;AAED,wDAAwD;AACxD,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,qBAAqB,CAC7B,WAAqC,EACrC,OAAgD;IAEhD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,MAAM,wBAAwB,GAAG,OAAO,EAAE,wBAAwB,KAAK,KAAK,CAAC;IAC7E,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACzD,cAAc,EAAE,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAC3D,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,OAAO,EAAE,CAAC,CAAC,OAAO;KAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAC/B,WAA6C;IAE7C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/D,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,SAAS;QAChD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QAC1D,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,SAAS;QAC5D,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,SAAS;QAC5D,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACrE,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,8DAA8D;YAC9D,SAAS;QACV,CAAC;QACD,GAAG,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,aAAa,EACZ,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YAClE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAC9D,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACrC,CAAC;AAED,mEAAmE;AACnE,SAAS,YAAY,CACpB,MAAqC,EACrC,KAAa,EACb,IAAa;IAEb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,IAAI,EAAE;YACL,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;SACR;KACD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAsB;IAC1D,mCAAmC;IACnC,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IACD,qCAAqC;IACrC,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,8BAA8B;IAC9B,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,4CAA4C;IAC5C,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CACnB,KAAkC,EAClC,OAAoC;IAEpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,oDAAoD;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,sCAAsC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,yBAAyB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IACD,0CAA0C;IAC1C,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CACnB,KAAyB,EACzB,OAAoC;IAEpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,yBAAyB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAC1B,OAEiE;IAEjE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAEhD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,8BAA8B;QAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,SAAS;QACV,CAAC;QAED,+DAA+D;QAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ;gBAChC,CAAC,CAAC,GAAG,wBAAwB,GAAG,KAAK,CAAC,QAAQ,GAAG;gBACjD,CAAC,CAAC,yBAAyB,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3B,SAAS;QACV,CAAC;QAED,8DAA8D;QAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5D,SAAS;QACV,CAAC;QAED,wDAAwD;QACxD,MAAM,YAAY,GAAI,KAA2B,CAAC,IAAI,IAAI,SAAS,CAAC;QACpE,SAAS,CAAC,IAAI,CAAC,YAAY,YAAY,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CACvB,OAEiE;IAEjE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE9D,oDAAoD;IACpD,MAAM,OAAO,GAAG,OAAO;SACrB,MAAM,CAAC,CAAC,KAAK,EAA4B,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;SACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;SACrC,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CACxB,OAEiE;IAEjE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEvD,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,KAAK,EAAqB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;SAC/D,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,cAAc;QAC7C,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;QAC9B,UAAU,EAAE,QAAQ,CAAC,EAAE;KACvB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,0BAA0B,CAClC,OAAmC;IAEnC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,8BAA8B,CACtC,OAAmC;IAEnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,UAAU,GAEZ,EAAE,CAAC;IACP,KAAK,MAAM,KAAK,IAAI,OAAiC,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;aACxC,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnC,UAAU,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACxB,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B,CAC1C,OAAmB,EACnB,KAAK,GAAG,CAAC,EACT,OAAgD;IAEhD,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,WAAW,CAC5B,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACtD,OAAO,CACP,CAAC;IAEF,yCAAyC;IACzC,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,qBAAqB,CACxC,aAAa,IAAI,OAAO;YACvB,CAAC,CAAE,OAA0C,CAAC,WAAW;YACzD,CAAC,CAAC,SAAS,EACZ,OAAO,CACP,CAAC;QACF,OAAO;YACN,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5C,SAAS;YACT,WAAW;SACX,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO;YACN,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5C,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;YAC1C,SAAS;YACT,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACvC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC;YACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;SACpB,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO;YACN,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5C,SAAS;YACT,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;SACxB,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,UAAU,GAAG,OAGlB,CAAC;IACF,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC;YAC/C,SAAS;SACT,CAAC;IACH,CAAC;IAED,MAAM,IAAI,yBAAyB,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC3C,QAAsB,EACtB,OAAgD;IAEhD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CACtC,2BAA2B,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CACpD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CACzB,IAAsB,EACtB,YAAoB,EACpB,YAAoB;IAEpB,4CAA4C;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ,YAAY,IAAI,YAAY,EAAE,CAAC;IACzE,MAAM,UAAU,GACf,IAAI,CAAC,UAAU,IAAI,YAAY,YAAY,IAAI,YAAY,EAAE,CAAC;IAC/D,mDAAmD;IACnD,MAAM,IAAI,GAA4B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,OAAO;QACN,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,UAAU;QACd,IAAI;QACJ,SAAS,EAAE,IAAI;KACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC3B,IAAsB,EACtB,cAAwB,EACxB,SAA6B,EAC7B,OAAoC;IAEpC,OAAO;QACN,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,cAAc,CAAC,EAAE;QAC7B,QAAQ,EAAE,cAAc,CAAC,IAAI;QAC7B,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;aAChC;SACD;QACD,OAAO,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO;QAChC,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC;KAC1C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B,CAC1C,OAAwB,EACxB,KAAsB,EACtB,KAAK,GAAG,CAAC;IAET,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnE,6CAA6C;IAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,8BAA8B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CACxE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAC1D,CAAC;YACF,OAAO;gBACN;oBACC,IAAI,EAAE,MAAM;oBACZ,OAAO,EACN,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;oBAClE,WAAW;oBACX,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;iBAClD;aACD,CAAC;QACH,CAAC;QACD,OAAO;YACN;gBACC,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACR,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;iBACnE;gBACD,WAAW;gBACX,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;aAClD;SACD,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC;QAC5D,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,kBAAkB,GAAG,8BAA8B,CACxD,OAAO,CAAC,OAAO,CACf,CAAC,MAAM,CACP,CAAC,KAAK,EAAqD,EAAE,CAC5D,KAAK,CAAC,IAAI,KAAK,OAAO,CACvB,CAAC;YACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CACpC,CAAC;YACF,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CACpC,CAAC;YAEF,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC9C,kBAAkB,CAAC,OAAO,CAAC;oBAC1B,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;iBACjC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC;gBACpD,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAC3D,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAC7D,CAAC;gBACF,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,gBAAgB,GAAqB;gBAC1C,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,kBAAkB;gBAC3B,GAAG,EAAE,WAAW;gBAChB,QAAQ,EAAE,gBAAgB;gBAC1B,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACnB,CAAC,CAAC;wBACA,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;wBAC/B,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;wBACjC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC;wBACvC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC;wBACzC,IAAI,EAAE;4BACL,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;4BACrC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;4BACvC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC;4BAC7C,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC;4BAC/C,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;yBACrC;qBACD;oBACF,CAAC,CAAC,gBAAgB,EAAE;gBACrB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;aAClD,CAAC;YAEF,MAAM,OAAO,GAAiB,CAAC,gBAAgB,CAAC,CAAC;YACjD,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAC/C,CAAC,KAAK,EAAqB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CACvD,CAAC;YAEF,mDAAmD;YACnD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;gBACjC,MAAM,cAAc,GACnB,CAAC,IAAI,CAAC,UAAU;oBACf,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC;oBAC9D,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBAC7B,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,kBAAkB,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CACX,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CACrE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,kEAAkE;QAClE,MAAM,kBAAkB,GACvB,EAAE,CAAC;QAEJ,gCAAgC;QAChC,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;YAC9B,kBAAkB,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;aACjC,CAAC,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,IAAI,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,kBAAkB,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC;aACjD,CAAC,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC;QACpD,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAC3D,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAC7D,CAAC;QACF,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAEtC,kDAAkD;QAClD,MAAM,gBAAgB,GAAqB;YAC1C,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kBAAkB;YAC3B,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACnB,CAAC,CAAC;oBACA,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;oBAC/B,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;oBACjC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC;oBACvC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC;oBACzC,IAAI,EAAE;wBACL,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;wBACrC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;wBACvC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC;wBAC7C,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC;wBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;qBACrC;iBACD;gBACF,CAAC,CAAC,gBAAgB,EAAE;YACrB,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;SAClD,CAAC;QAEF,MAAM,OAAO,GAAiB,CAAC,gBAAgB,CAAC,CAAC;QAEjD,mDAAmD;QACnD,yDAAyD;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;YACjC,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CACX,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CACrE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;QAChD,OAAO;YACN;gBACC,IAAI,EAAE,YAAY;gBAClB,UAAU,EAAE,GAAG,QAAQ,IAAI,KAAK,EAAE;gBAClC,QAAQ;gBACR,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC;qBACjD;iBACD;gBACD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;gBACjC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;aAClD;SACD,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,wEAAwE;IACxE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACN;gBACC,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACR,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;iBACnE;gBACD,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,KAAK,EAAE,gBAAgB,EAAE;gBACzB,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;aAClD;SACD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,yBAAyB,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC3C,QAA2B,EAC3B,KAAsB;IAEtB,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,wEAAwE;QACxE,MAAM,CAAC,IAAI,CAAC,GAAG,2BAA2B,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["/**\n * Session Serialization Module\n *\n * This module handles bidirectional conversion between internal agent message\n * types (AppMessage, AssistantMessage, etc.) and the external Maestro protocol\n * messages (ComposerMessage). This conversion is essential for:\n *\n * - Web API: Converting agent output to JSON for the web client\n * - Session persistence: Storing/loading sessions in a portable format\n * - History hydration: Reconstructing agent state from saved sessions\n *\n * The conversion handles several complexities:\n * - Multi-content messages (text, images, thinking blocks, tool calls)\n * - Tool call/result pairing across message boundaries\n * - Usage/cost tracking with nested structures\n * - Timestamp normalization between formats\n *\n * Key design decisions:\n * - Images are replaced with placeholders (too large for JSON)\n * - Thinking blocks are extracted to a separate field\n * - Tool calls are serialized with their results as separate messages\n */\n\nimport type {\n\tComposerAttachment,\n\tComposerContentBlock,\n\tComposerMessage,\n\tComposerToolCall,\n\tComposerUsage,\n} from \"@evalops/contracts\";\nimport {\n\tisAssistantMessage,\n\tisToolResultMessage,\n\tisUserMessage,\n} from \"../agent/type-guards.js\";\nimport type {\n\tAppMessage,\n\tAssistantMessage,\n\tAttachment,\n\tImageContent,\n\tTextContent,\n\tThinkingContent,\n\tToolCall,\n\tToolResultMessage,\n\tUsage,\n} from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\n\n/** Direction of conversion for error context */\nexport type SessionSerializationDirection = \"app->composer\" | \"composer->app\";\n\n/**\n * Context provided in serialization errors for debugging.\n * Includes message index and direction to locate the problematic message.\n */\nexport interface SessionSerializationContext {\n\t/** Index of the message in the array (0-based) */\n\tindex?: number;\n\t/** Role of the message being converted */\n\trole?: string;\n\t/** Direction of the conversion */\n\tsource?: SessionSerializationDirection;\n}\n\n/**\n * Convert internal Usage to Maestro protocol format.\n * Handles missing/undefined fields by defaulting to zero.\n */\nfunction toComposerUsage(usage?: Usage): ComposerUsage | undefined {\n\tif (!usage) return undefined;\n\treturn {\n\t\tinput: usage.input ?? 0,\n\t\toutput: usage.output ?? 0,\n\t\tcacheRead: usage.cacheRead ?? 0,\n\t\tcacheWrite: usage.cacheWrite ?? 0,\n\t\t// Ensure cost object always has all required fields\n\t\tcost: usage.cost\n\t\t\t? {\n\t\t\t\t\tinput: usage.cost.input ?? 0,\n\t\t\t\t\toutput: usage.cost.output ?? 0,\n\t\t\t\t\tcacheRead: usage.cost.cacheRead ?? 0,\n\t\t\t\t\tcacheWrite: usage.cost.cacheWrite ?? 0,\n\t\t\t\t\ttotal: usage.cost.total ?? 0,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotal: 0,\n\t\t\t\t},\n\t};\n}\n\n/**\n * Error thrown when serialization/deserialization fails.\n * Includes context about which message caused the failure.\n */\nexport class SessionSerializationError extends Error {\n\treadonly context?: SessionSerializationContext;\n\n\tconstructor(message: string, context?: SessionSerializationContext) {\n\t\tsuper(context ? `${message} (${JSON.stringify(context)})` : message);\n\t\tthis.name = \"SessionSerializationError\";\n\t\tthis.context = context;\n\t}\n}\n\n// Placeholder strings used when images can't be serialized to JSON\nconst IMAGE_PLACEHOLDER_PREFIX = \"[image:\";\nconst UNKNOWN_IMAGE_PLACEHOLDER = \"[image]\";\n\n/**\n * Safely stringify a value, returning a placeholder if serialization fails.\n * Handles circular references and BigInt values gracefully.\n */\nfunction safeStringify(value: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn \"[unserializable]\";\n\t}\n}\n\n/** Type guard for plain objects (not arrays or null) */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction toComposerAttachments(\n\tattachments: Attachment[] | undefined,\n\toptions?: { includeAttachmentContent?: boolean },\n): ComposerAttachment[] | undefined {\n\tif (!attachments || attachments.length === 0) return undefined;\n\tconst includeAttachmentContent = options?.includeAttachmentContent !== false;\n\treturn attachments.map((a) => ({\n\t\tid: a.id,\n\t\ttype: a.type,\n\t\tfileName: a.fileName,\n\t\tmimeType: a.mimeType,\n\t\tsize: a.size,\n\t\tcontent: includeAttachmentContent ? a.content : undefined,\n\t\tcontentOmitted: includeAttachmentContent ? undefined : true,\n\t\textractedText: a.extractedText,\n\t\tpreview: a.preview,\n\t}));\n}\n\nfunction fromComposerAttachments(\n\tattachments: ComposerAttachment[] | undefined,\n): Attachment[] | undefined {\n\tif (!attachments || attachments.length === 0) return undefined;\n\n\tconst out: Attachment[] = [];\n\tfor (const a of attachments) {\n\t\tif (!a) continue;\n\t\tif (typeof a.id !== \"string\" || !a.id) continue;\n\t\tif (a.type !== \"image\" && a.type !== \"document\") continue;\n\t\tif (typeof a.fileName !== \"string\" || !a.fileName) continue;\n\t\tif (typeof a.mimeType !== \"string\" || !a.mimeType) continue;\n\t\tif (typeof a.size !== \"number\" || !Number.isFinite(a.size)) continue;\n\t\tif (typeof a.content !== \"string\" || a.content.length === 0) {\n\t\t\t// Content omitted in session responses; do not pass to agent.\n\t\t\tcontinue;\n\t\t}\n\t\tout.push({\n\t\t\tid: a.id,\n\t\t\ttype: a.type,\n\t\t\tfileName: a.fileName,\n\t\t\tmimeType: a.mimeType,\n\t\t\tsize: a.size,\n\t\t\tcontent: a.content,\n\t\t\textractedText:\n\t\t\t\ttypeof a.extractedText === \"string\" ? a.extractedText : undefined,\n\t\t\tpreview: typeof a.preview === \"string\" ? a.preview : undefined,\n\t\t});\n\t}\n\n\treturn out.length ? out : undefined;\n}\n\n/** Helper to construct error context from conversion parameters */\nfunction buildContext(\n\tsource: SessionSerializationDirection,\n\tindex: number,\n\trole?: string,\n): SessionSerializationContext {\n\treturn { source, index, role };\n}\n\n/**\n * Create a zero-initialized usage object.\n * Used when converting messages that don't have usage data.\n */\nexport function createEmptyUsage(): Usage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\tcost: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: 0,\n\t\t},\n\t};\n}\n\n/**\n * Serialize tool call content to a string for the tool result message.\n * Handles various result types: strings, primitives, objects.\n * Falls back to serializing args if result is missing.\n */\nexport function serializeToolContent(tool: ComposerToolCall): string {\n\t// String results are used directly\n\tif (typeof tool.result === \"string\") {\n\t\treturn tool.result;\n\t}\n\t// Primitives are converted to string\n\tif (typeof tool.result === \"number\" || typeof tool.result === \"boolean\") {\n\t\treturn String(tool.result);\n\t}\n\t// Objects are JSON-serialized\n\tif (tool.result && typeof tool.result === \"object\") {\n\t\treturn safeStringify(tool.result);\n\t}\n\t// Fallback: serialize the args if no result\n\tif (tool.args && typeof tool.args === \"object\") {\n\t\treturn safeStringify(tool.args);\n\t}\n\treturn \"\";\n}\n\n/**\n * Convert a timestamp to ISO string format.\n * Handles both numeric (ms since epoch) and string inputs.\n * Returns current time if input is undefined.\n */\nfunction toIsoString(\n\tinput: number | string | undefined,\n\tcontext: SessionSerializationContext,\n): string {\n\tif (typeof input === \"number\") {\n\t\t// Validate numeric timestamp (reject NaN, Infinity)\n\t\tif (!Number.isFinite(input)) {\n\t\t\tthrow new SessionSerializationError(\"Invalid numeric timestamp\", context);\n\t\t}\n\t\treturn new Date(input).toISOString();\n\t}\n\tif (typeof input === \"string\") {\n\t\t// Parse and validate string timestamp\n\t\tconst parsed = Date.parse(input);\n\t\tif (!Number.isFinite(parsed)) {\n\t\t\tthrow new SessionSerializationError(\"Invalid timestamp\", context);\n\t\t}\n\t\treturn new Date(parsed).toISOString();\n\t}\n\t// Default to current time if not provided\n\treturn new Date().toISOString();\n}\n\n/**\n * Convert an ISO string timestamp to numeric (ms since epoch).\n * Returns current time if input is undefined.\n */\nfunction toTimestamp(\n\tinput: string | undefined,\n\tcontext: SessionSerializationContext,\n): number {\n\tif (!input) return Date.now();\n\tconst parsed = Date.parse(input);\n\tif (!Number.isFinite(parsed)) {\n\t\tthrow new SessionSerializationError(\"Invalid timestamp\", context);\n\t}\n\treturn parsed;\n}\n\n/**\n * Extract text content from a message's content array.\n * Handles mixed content types:\n * - Text blocks are concatenated\n * - Images are replaced with placeholders\n * - Thinking and tool calls are skipped (handled separately)\n * - Unknown types get a placeholder\n */\nfunction extractTextContent(\n\tcontent?:\n\t\t| string\n\t\t| Array<TextContent | ThinkingContent | ToolCall | ImageContent>,\n): string {\n\tif (!content) return \"\";\n\tif (typeof content === \"string\") return content;\n\n\tconst fragments: string[] = [];\n\tfor (const block of content) {\n\t\tif (!block) continue;\n\n\t\t// Text blocks - include as-is\n\t\tif (block.type === \"text\") {\n\t\t\tfragments.push(block.text);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Image blocks - replace with placeholder (too large for JSON)\n\t\tif (block.type === \"image\") {\n\t\t\tconst descriptor = block.mimeType\n\t\t\t\t? `${IMAGE_PLACEHOLDER_PREFIX}${block.mimeType}]`\n\t\t\t\t: UNKNOWN_IMAGE_PLACEHOLDER;\n\t\t\tfragments.push(descriptor);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Thinking and tool calls are extracted separately, skip here\n\t\tif (block.type === \"thinking\" || block.type === \"toolCall\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Unknown content type - add placeholder with type info\n\t\tconst fallbackType = (block as { type?: string }).type || \"unknown\";\n\t\tfragments.push(`[content:${fallbackType}]`);\n\t}\n\n\treturn fragments.join(\"\\n\\n\");\n}\n\n/**\n * Extract thinking content from a message into a single string.\n * Returns undefined if no thinking blocks are present.\n */\nfunction extractThinking(\n\tcontent?:\n\t\t| string\n\t\t| Array<TextContent | ThinkingContent | ToolCall | ImageContent>,\n): string | undefined {\n\tif (!content || typeof content === \"string\") return undefined;\n\n\t// Filter to thinking blocks, extract text, and join\n\tconst thought = content\n\t\t.filter((block): block is ThinkingContent => block.type === \"thinking\")\n\t\t.map((block) => block.thinking.trim())\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\\n\");\n\n\treturn thought.length ? thought : undefined;\n}\n\n/**\n * Extract tool calls from a message into Maestro format.\n * Returns empty array if no tool calls are present.\n */\nfunction extractToolCalls(\n\tcontent?:\n\t\t| string\n\t\t| Array<TextContent | ThinkingContent | ToolCall | ImageContent>,\n): ComposerToolCall[] {\n\tif (!content || typeof content === \"string\") return [];\n\n\treturn content\n\t\t.filter((block): block is ToolCall => block.type === \"toolCall\")\n\t\t.map((toolCall) => ({\n\t\t\tname: toolCall.name?.trim() || \"unnamed_tool\",\n\t\t\tstatus: \"completed\",\n\t\t\targs: toolCall.arguments || {},\n\t\t\ttoolCallId: toolCall.id,\n\t\t}));\n}\n\nfunction extractComposerTextContent(\n\tcontent: ComposerMessage[\"content\"],\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n}\n\nfunction normalizeComposerContentBlocks(\n\tcontent: ComposerMessage[\"content\"],\n): Array<TextContent | ThinkingContent | ToolCall | ImageContent> {\n\tif (!Array.isArray(content)) return [];\n\tconst normalized: Array<\n\t\tTextContent | ThinkingContent | ToolCall | ImageContent\n\t> = [];\n\tfor (const block of content as ComposerContentBlock[]) {\n\t\tif (!block || typeof block !== \"object\") continue;\n\t\tif (block.type === \"text\") {\n\t\t\tnormalized.push({ type: \"text\", text: block.text });\n\t\t} else if (block.type === \"thinking\") {\n\t\t\tnormalized.push({ type: \"thinking\", thinking: block.thinking });\n\t\t} else if (block.type === \"toolCall\") {\n\t\t\tnormalized.push({\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: block.id,\n\t\t\t\tname: block.name,\n\t\t\t\targuments: block.arguments,\n\t\t\t\tthoughtSignature: block.thoughtSignature,\n\t\t\t});\n\t\t} else if (block.type === \"image\") {\n\t\t\tnormalized.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: block.data,\n\t\t\t\tmimeType: block.mimeType,\n\t\t\t});\n\t\t}\n\t}\n\treturn normalized;\n}\n\n/**\n * Convert a single internal AppMessage to Maestro protocol format.\n *\n * This is the main app -> Maestro conversion function. It handles:\n * - User messages: Extract text content\n * - Assistant messages: Extract text, thinking, and tool calls\n * - Tool results: Extract result content and error status\n * - System messages: Extract text content\n *\n * @param message - The internal message to convert\n * @param index - Position in the message array (for error context)\n */\nexport function convertAppMessageToComposer(\n\tmessage: AppMessage,\n\tindex = 0,\n\toptions?: { includeAttachmentContent?: boolean },\n): ComposerMessage {\n\tconst context = buildContext(\"app->composer\", index, message.role);\n\tconst timestamp = toIsoString(\n\t\t\"timestamp\" in message ? message.timestamp : undefined,\n\t\tcontext,\n\t);\n\n\t// User messages - simple text extraction\n\tif (isUserMessage(message)) {\n\t\tconst attachments = toComposerAttachments(\n\t\t\t\"attachments\" in message\n\t\t\t\t? (message as { attachments?: Attachment[] }).attachments\n\t\t\t\t: undefined,\n\t\t\toptions,\n\t\t);\n\t\treturn {\n\t\t\trole: \"user\",\n\t\t\tcontent: extractTextContent(message.content),\n\t\t\ttimestamp,\n\t\t\tattachments,\n\t\t};\n\t}\n\n\t// Assistant messages - extract text, thinking, and tool calls\n\tif (isAssistantMessage(message)) {\n\t\tconst tools = extractToolCalls(message.content);\n\t\treturn {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: extractTextContent(message.content),\n\t\t\tthinking: extractThinking(message.content),\n\t\t\ttimestamp,\n\t\t\ttools: tools.length ? tools : undefined,\n\t\t\tusage: toComposerUsage(message.usage),\n\t\t\tprovider: message.provider,\n\t\t\tapi: message.api,\n\t\t\tmodel: message.model,\n\t\t};\n\t}\n\n\t// Tool result messages - include tool name and error status\n\tif (isToolResultMessage(message)) {\n\t\treturn {\n\t\t\trole: \"tool\",\n\t\t\tcontent: extractTextContent(message.content),\n\t\t\ttimestamp,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t};\n\t}\n\n\t// System messages (rare, but supported)\n\tconst systemLike = message as {\n\t\trole?: string;\n\t\tcontent?: string | Array<TextContent | ImageContent>;\n\t};\n\tif (systemLike.role === \"system\") {\n\t\treturn {\n\t\t\trole: \"system\",\n\t\t\tcontent: extractTextContent(systemLike.content),\n\t\t\ttimestamp,\n\t\t};\n\t}\n\n\tthrow new SessionSerializationError(\"Unsupported App role\", context);\n}\n\n/**\n * Convert an array of AppMessages to Maestro format.\n * Preserves message order and provides index context for errors.\n */\nexport function convertAppMessagesToComposer(\n\tmessages: AppMessage[],\n\toptions?: { includeAttachmentContent?: boolean },\n): ComposerMessage[] {\n\treturn messages.map((message, index) =>\n\t\tconvertAppMessageToComposer(message, index, options),\n\t);\n}\n\n/**\n * Normalize a Maestro tool call to internal ToolCall format.\n * Generates stable IDs if not provided.\n *\n * @param tool - The Maestro tool call to normalize\n * @param messageIndex - Message position (for generating fallback IDs)\n * @param contentIndex - Content block position (for generating fallback IDs)\n */\nfunction normalizeToolCall(\n\ttool: ComposerToolCall,\n\tmessageIndex: number,\n\tcontentIndex: number,\n): ToolCall {\n\t// Generate fallback name/ID if not provided\n\tconst name = tool.name?.trim() || `tool_${messageIndex}_${contentIndex}`;\n\tconst toolCallId =\n\t\ttool.toolCallId || `web-tool-${messageIndex}-${contentIndex}`;\n\t// Ensure args is a record (not array or primitive)\n\tconst args: Record<string, unknown> = isRecord(tool.args) ? tool.args : {};\n\n\treturn {\n\t\ttype: \"toolCall\",\n\t\tid: toolCallId,\n\t\tname,\n\t\targuments: args,\n\t};\n}\n\n/**\n * Create a ToolResultMessage from a Maestro tool call.\n * The result is derived from the tool call's embedded result field.\n */\nfunction normalizeToolResult(\n\ttool: ComposerToolCall,\n\tnormalizedCall: ToolCall,\n\ttimestamp: string | undefined,\n\tcontext: SessionSerializationContext,\n): ToolResultMessage {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: normalizedCall.id,\n\t\ttoolName: normalizedCall.name,\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: serializeToolContent(tool),\n\t\t\t},\n\t\t],\n\t\tisError: tool.status === \"error\",\n\t\ttimestamp: toTimestamp(timestamp, context),\n\t};\n}\n\n/**\n * Convert a single Maestro message to internal AppMessage format.\n *\n * This is the main Maestro -> app conversion function. Note that a single\n * Maestro message may expand to multiple AppMessages when tool calls are\n * present (the assistant message + one toolResult per tool).\n *\n * @param message - The Maestro message to convert\n * @param model - Model metadata to attach to assistant messages\n * @param index - Position in the message array (for error context)\n * @returns Array of AppMessages (may be 1+ messages)\n */\nexport function convertComposerMessageToApp(\n\tmessage: ComposerMessage,\n\tmodel: RegisteredModel,\n\tindex = 0,\n): AppMessage[] {\n\tconst context = buildContext(\"composer->app\", index, message.role);\n\n\t// User messages - wrap content in text block\n\tif (message.role === \"user\") {\n\t\tconst attachments = fromComposerAttachments(message.attachments);\n\t\tif (Array.isArray(message.content)) {\n\t\t\tconst normalized = normalizeComposerContentBlocks(message.content).filter(\n\t\t\t\t(block) => block.type === \"text\" || block.type === \"image\",\n\t\t\t);\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\tnormalized.length > 0 ? normalized : [{ type: \"text\", text: \"\" }],\n\t\t\t\t\tattachments,\n\t\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: extractComposerTextContent(message.content) },\n\t\t\t\t],\n\t\t\t\tattachments,\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t},\n\t\t];\n\t}\n\n\t// Assistant messages - reconstruct content array from components\n\tif (message.role === \"assistant\") {\n\t\tconst resolvedProvider = message.provider ?? model.provider;\n\t\tconst resolvedApi = (message.api ?? model.api) as AssistantMessage[\"api\"];\n\t\tconst resolvedModel = message.model ?? model.id;\n\t\tif (Array.isArray(message.content)) {\n\t\t\tconst normalizedSequence = normalizeComposerContentBlocks(\n\t\t\t\tmessage.content,\n\t\t\t).filter(\n\t\t\t\t(block): block is TextContent | ThinkingContent | ToolCall =>\n\t\t\t\t\tblock.type !== \"image\",\n\t\t\t);\n\t\t\tconst hasThinking = normalizedSequence.some(\n\t\t\t\t(block) => block.type === \"thinking\",\n\t\t\t);\n\t\t\tconst hasToolCalls = normalizedSequence.some(\n\t\t\t\t(block) => block.type === \"toolCall\",\n\t\t\t);\n\n\t\t\tif (!hasThinking && message.thinking?.trim()) {\n\t\t\t\tnormalizedSequence.unshift({\n\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\tthinking: message.thinking.trim(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst tools = message.tools ?? [];\n\t\t\tif (!hasToolCalls && tools.length > 0) {\n\t\t\t\tconst baseContentLength = normalizedSequence.length;\n\t\t\t\tconst toolCalls: ToolCall[] = tools.map((tool, toolIndex) =>\n\t\t\t\t\tnormalizeToolCall(tool, index, baseContentLength + toolIndex),\n\t\t\t\t);\n\t\t\t\tnormalizedSequence.push(...toolCalls);\n\t\t\t}\n\n\t\t\tconst assistantMessage: AssistantMessage = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: normalizedSequence,\n\t\t\t\tapi: resolvedApi,\n\t\t\t\tprovider: resolvedProvider,\n\t\t\t\tmodel: resolvedModel,\n\t\t\t\tusage: message.usage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tinput: message.usage.input ?? 0,\n\t\t\t\t\t\t\toutput: message.usage.output ?? 0,\n\t\t\t\t\t\t\tcacheRead: message.usage.cacheRead ?? 0,\n\t\t\t\t\t\t\tcacheWrite: message.usage.cacheWrite ?? 0,\n\t\t\t\t\t\t\tcost: {\n\t\t\t\t\t\t\t\tinput: message.usage.cost?.input ?? 0,\n\t\t\t\t\t\t\t\toutput: message.usage.cost?.output ?? 0,\n\t\t\t\t\t\t\t\tcacheRead: message.usage.cost?.cacheRead ?? 0,\n\t\t\t\t\t\t\t\tcacheWrite: message.usage.cost?.cacheWrite ?? 0,\n\t\t\t\t\t\t\t\ttotal: message.usage.cost?.total ?? 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: createEmptyUsage(),\n\t\t\t\tstopReason: \"stop\",\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t};\n\n\t\t\tconst results: AppMessage[] = [assistantMessage];\n\t\t\tconst toolCallBlocks = normalizedSequence.filter(\n\t\t\t\t(block): block is ToolCall => block.type === \"toolCall\",\n\t\t\t);\n\n\t\t\t// Generate tool result messages for each tool call\n\t\t\ttools.forEach((tool, toolIndex) => {\n\t\t\t\tconst normalizedCall =\n\t\t\t\t\t(tool.toolCallId\n\t\t\t\t\t\t? toolCallBlocks.find((block) => block.id === tool.toolCallId)\n\t\t\t\t\t\t: toolCallBlocks[toolIndex]) ??\n\t\t\t\t\tnormalizeToolCall(tool, index, normalizedSequence.length + toolIndex);\n\t\t\t\tresults.push(\n\t\t\t\t\tnormalizeToolResult(tool, normalizedCall, message.timestamp, context),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn results;\n\t\t}\n\t\t// Build content array: thinking first, then text, then tool calls\n\t\tconst normalizedSequence: Array<TextContent | ThinkingContent | ToolCall> =\n\t\t\t[];\n\n\t\t// Add thinking block if present\n\t\tif (message.thinking?.trim()) {\n\t\t\tnormalizedSequence.push({\n\t\t\t\ttype: \"thinking\",\n\t\t\t\tthinking: message.thinking.trim(),\n\t\t\t});\n\t\t}\n\n\t\t// Add text content if present\n\t\tif (extractComposerTextContent(message.content)) {\n\t\t\tnormalizedSequence.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: extractComposerTextContent(message.content),\n\t\t\t});\n\t\t}\n\n\t\t// Convert and add tool calls\n\t\tconst tools = message.tools ?? [];\n\t\tconst baseContentLength = normalizedSequence.length;\n\t\tconst toolCalls: ToolCall[] = tools.map((tool, toolIndex) =>\n\t\t\tnormalizeToolCall(tool, index, baseContentLength + toolIndex),\n\t\t);\n\t\tnormalizedSequence.push(...toolCalls);\n\n\t\t// Build the assistant message with model metadata\n\t\tconst assistantMessage: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: normalizedSequence,\n\t\t\tapi: resolvedApi,\n\t\t\tprovider: resolvedProvider,\n\t\t\tmodel: resolvedModel,\n\t\t\tusage: message.usage\n\t\t\t\t? {\n\t\t\t\t\t\tinput: message.usage.input ?? 0,\n\t\t\t\t\t\toutput: message.usage.output ?? 0,\n\t\t\t\t\t\tcacheRead: message.usage.cacheRead ?? 0,\n\t\t\t\t\t\tcacheWrite: message.usage.cacheWrite ?? 0,\n\t\t\t\t\t\tcost: {\n\t\t\t\t\t\t\tinput: message.usage.cost?.input ?? 0,\n\t\t\t\t\t\t\toutput: message.usage.cost?.output ?? 0,\n\t\t\t\t\t\t\tcacheRead: message.usage.cost?.cacheRead ?? 0,\n\t\t\t\t\t\t\tcacheWrite: message.usage.cost?.cacheWrite ?? 0,\n\t\t\t\t\t\t\ttotal: message.usage.cost?.total ?? 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: createEmptyUsage(),\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t};\n\n\t\tconst results: AppMessage[] = [assistantMessage];\n\n\t\t// Generate tool result messages for each tool call\n\t\t// These follow the assistant message in the conversation\n\t\ttools.forEach((tool, toolIndex) => {\n\t\t\tconst normalizedCall = toolCalls[toolIndex]!;\n\t\t\tresults.push(\n\t\t\t\tnormalizeToolResult(tool, normalizedCall, message.timestamp, context),\n\t\t\t);\n\t\t});\n\n\t\treturn results;\n\t}\n\n\t// Standalone tool messages (less common, but supported)\n\tif (message.role === \"tool\") {\n\t\tconst toolName = message.toolName || \"web_tool\";\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: `${toolName}-${index}`,\n\t\t\t\ttoolName,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: extractComposerTextContent(message.content),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tisError: Boolean(message.isError),\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t},\n\t\t];\n\t}\n\n\t// System messages are converted to assistant messages\n\t// (internal format doesn't have a separate system role in conversation)\n\tif (message.role === \"system\") {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: extractComposerTextContent(message.content) },\n\t\t\t\t],\n\t\t\t\tapi: model.api,\n\t\t\t\tprovider: model.provider,\n\t\t\t\tmodel: model.id,\n\t\t\t\tusage: createEmptyUsage(),\n\t\t\t\tstopReason: \"stop\",\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t},\n\t\t];\n\t}\n\n\tthrow new SessionSerializationError(\"Unsupported Maestro role\", context);\n}\n\n/**\n * Convert an array of Maestro messages to internal AppMessage format.\n *\n * Note: The output array may be longer than the input because assistant\n * messages with tool calls expand to multiple AppMessages.\n */\nexport function convertComposerMessagesToApp(\n\tmessages: ComposerMessage[],\n\tmodel: RegisteredModel,\n): AppMessage[] {\n\tconst result: AppMessage[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\t// Preserve relative ordering by pushing each expanded block in sequence\n\t\tresult.push(...convertComposerMessageToApp(message, model, index));\n\t}\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-serialization.js","sourceRoot":"","sources":["../../src/server/session-serialization.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session Serialization Module\n *\n * This module handles bidirectional conversion between internal agent message\n * types (AppMessage, AssistantMessage, etc.) and the external Maestro protocol\n * messages (ComposerMessage). This conversion is essential for:\n *\n * - Web API: Converting agent output to JSON for the web client\n * - Session persistence: Storing/loading sessions in a portable format\n * - History hydration: Reconstructing agent state from saved sessions\n *\n * The conversion handles several complexities:\n * - Multi-content messages (text, images, thinking blocks, tool calls)\n * - Tool call/result pairing across message boundaries\n * - Usage/cost tracking with nested structures\n * - Timestamp normalization between formats\n *\n * Key design decisions:\n * - Images are replaced with placeholders (too large for JSON)\n * - Thinking blocks are extracted to a separate field\n * - Tool calls are serialized with their results as separate messages\n */\n\nimport type {\n\tComposerAttachment,\n\tComposerContentBlock,\n\tComposerMessage,\n\tComposerToolCall,\n\tComposerUsage,\n} from \"@evalops/contracts\";\nimport {\n\tisAssistantMessage,\n\tisToolResultMessage,\n\tisUserMessage,\n} from \"../agent/type-guards.js\";\nimport type {\n\tAppMessage,\n\tAssistantMessage,\n\tAttachment,\n\tImageContent,\n\tTextContent,\n\tThinkingContent,\n\tToolCall,\n\tToolResultMessage,\n\tUsage,\n} from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport { isRecord } from \"../utils/json.js\";\n\n/** Direction of conversion for error context */\nexport type SessionSerializationDirection = \"app->composer\" | \"composer->app\";\n\n/**\n * Context provided in serialization errors for debugging.\n * Includes message index and direction to locate the problematic message.\n */\nexport interface SessionSerializationContext {\n\t/** Index of the message in the array (0-based) */\n\tindex?: number;\n\t/** Role of the message being converted */\n\trole?: string;\n\t/** Direction of the conversion */\n\tsource?: SessionSerializationDirection;\n}\n\n/**\n * Convert internal Usage to Maestro protocol format.\n * Handles missing/undefined fields by defaulting to zero.\n */\nfunction toComposerUsage(usage?: Usage): ComposerUsage | undefined {\n\tif (!usage) return undefined;\n\treturn {\n\t\tinput: usage.input ?? 0,\n\t\toutput: usage.output ?? 0,\n\t\tcacheRead: usage.cacheRead ?? 0,\n\t\tcacheWrite: usage.cacheWrite ?? 0,\n\t\t// Ensure cost object always has all required fields\n\t\tcost: usage.cost\n\t\t\t? {\n\t\t\t\t\tinput: usage.cost.input ?? 0,\n\t\t\t\t\toutput: usage.cost.output ?? 0,\n\t\t\t\t\tcacheRead: usage.cost.cacheRead ?? 0,\n\t\t\t\t\tcacheWrite: usage.cost.cacheWrite ?? 0,\n\t\t\t\t\ttotal: usage.cost.total ?? 0,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotal: 0,\n\t\t\t\t},\n\t};\n}\n\n/**\n * Error thrown when serialization/deserialization fails.\n * Includes context about which message caused the failure.\n */\nexport class SessionSerializationError extends Error {\n\treadonly context?: SessionSerializationContext;\n\n\tconstructor(message: string, context?: SessionSerializationContext) {\n\t\tsuper(context ? `${message} (${JSON.stringify(context)})` : message);\n\t\tthis.name = \"SessionSerializationError\";\n\t\tthis.context = context;\n\t}\n}\n\n// Placeholder strings used when images can't be serialized to JSON\nconst IMAGE_PLACEHOLDER_PREFIX = \"[image:\";\nconst UNKNOWN_IMAGE_PLACEHOLDER = \"[image]\";\n\n/**\n * Safely stringify a value, returning a placeholder if serialization fails.\n * Handles circular references and BigInt values gracefully.\n */\nfunction safeStringify(value: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn \"[unserializable]\";\n\t}\n}\n\n/** Type guard for plain objects (not arrays or null) */\n\nfunction toComposerAttachments(\n\tattachments: Attachment[] | undefined,\n\toptions?: { includeAttachmentContent?: boolean },\n): ComposerAttachment[] | undefined {\n\tif (!attachments || attachments.length === 0) return undefined;\n\tconst includeAttachmentContent = options?.includeAttachmentContent !== false;\n\treturn attachments.map((a) => ({\n\t\tid: a.id,\n\t\ttype: a.type,\n\t\tfileName: a.fileName,\n\t\tmimeType: a.mimeType,\n\t\tsize: a.size,\n\t\tcontent: includeAttachmentContent ? a.content : undefined,\n\t\tcontentOmitted: includeAttachmentContent ? undefined : true,\n\t\textractedText: a.extractedText,\n\t\tpreview: a.preview,\n\t}));\n}\n\nfunction fromComposerAttachments(\n\tattachments: ComposerAttachment[] | undefined,\n): Attachment[] | undefined {\n\tif (!attachments || attachments.length === 0) return undefined;\n\n\tconst out: Attachment[] = [];\n\tfor (const a of attachments) {\n\t\tif (!a) continue;\n\t\tif (typeof a.id !== \"string\" || !a.id) continue;\n\t\tif (a.type !== \"image\" && a.type !== \"document\") continue;\n\t\tif (typeof a.fileName !== \"string\" || !a.fileName) continue;\n\t\tif (typeof a.mimeType !== \"string\" || !a.mimeType) continue;\n\t\tif (typeof a.size !== \"number\" || !Number.isFinite(a.size)) continue;\n\t\tif (typeof a.content !== \"string\" || a.content.length === 0) {\n\t\t\t// Content omitted in session responses; do not pass to agent.\n\t\t\tcontinue;\n\t\t}\n\t\tout.push({\n\t\t\tid: a.id,\n\t\t\ttype: a.type,\n\t\t\tfileName: a.fileName,\n\t\t\tmimeType: a.mimeType,\n\t\t\tsize: a.size,\n\t\t\tcontent: a.content,\n\t\t\textractedText:\n\t\t\t\ttypeof a.extractedText === \"string\" ? a.extractedText : undefined,\n\t\t\tpreview: typeof a.preview === \"string\" ? a.preview : undefined,\n\t\t});\n\t}\n\n\treturn out.length ? out : undefined;\n}\n\n/** Helper to construct error context from conversion parameters */\nfunction buildContext(\n\tsource: SessionSerializationDirection,\n\tindex: number,\n\trole?: string,\n): SessionSerializationContext {\n\treturn { source, index, role };\n}\n\n/**\n * Create a zero-initialized usage object.\n * Used when converting messages that don't have usage data.\n */\nexport function createEmptyUsage(): Usage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\tcost: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: 0,\n\t\t},\n\t};\n}\n\n/**\n * Serialize tool call content to a string for the tool result message.\n * Handles various result types: strings, primitives, objects.\n * Falls back to serializing args if result is missing.\n */\nexport function serializeToolContent(tool: ComposerToolCall): string {\n\t// String results are used directly\n\tif (typeof tool.result === \"string\") {\n\t\treturn tool.result;\n\t}\n\t// Primitives are converted to string\n\tif (typeof tool.result === \"number\" || typeof tool.result === \"boolean\") {\n\t\treturn String(tool.result);\n\t}\n\t// Objects are JSON-serialized\n\tif (tool.result && typeof tool.result === \"object\") {\n\t\treturn safeStringify(tool.result);\n\t}\n\t// Fallback: serialize the args if no result\n\tif (tool.args && typeof tool.args === \"object\") {\n\t\treturn safeStringify(tool.args);\n\t}\n\treturn \"\";\n}\n\n/**\n * Convert a timestamp to ISO string format.\n * Handles both numeric (ms since epoch) and string inputs.\n * Returns current time if input is undefined.\n */\nfunction toIsoString(\n\tinput: number | string | undefined,\n\tcontext: SessionSerializationContext,\n): string {\n\tif (typeof input === \"number\") {\n\t\t// Validate numeric timestamp (reject NaN, Infinity)\n\t\tif (!Number.isFinite(input)) {\n\t\t\tthrow new SessionSerializationError(\"Invalid numeric timestamp\", context);\n\t\t}\n\t\treturn new Date(input).toISOString();\n\t}\n\tif (typeof input === \"string\") {\n\t\t// Parse and validate string timestamp\n\t\tconst parsed = Date.parse(input);\n\t\tif (!Number.isFinite(parsed)) {\n\t\t\tthrow new SessionSerializationError(\"Invalid timestamp\", context);\n\t\t}\n\t\treturn new Date(parsed).toISOString();\n\t}\n\t// Default to current time if not provided\n\treturn new Date().toISOString();\n}\n\n/**\n * Convert an ISO string timestamp to numeric (ms since epoch).\n * Returns current time if input is undefined.\n */\nfunction toTimestamp(\n\tinput: string | undefined,\n\tcontext: SessionSerializationContext,\n): number {\n\tif (!input) return Date.now();\n\tconst parsed = Date.parse(input);\n\tif (!Number.isFinite(parsed)) {\n\t\tthrow new SessionSerializationError(\"Invalid timestamp\", context);\n\t}\n\treturn parsed;\n}\n\n/**\n * Extract text content from a message's content array.\n * Handles mixed content types:\n * - Text blocks are concatenated\n * - Images are replaced with placeholders\n * - Thinking and tool calls are skipped (handled separately)\n * - Unknown types get a placeholder\n */\nfunction extractTextContent(\n\tcontent?:\n\t\t| string\n\t\t| Array<TextContent | ThinkingContent | ToolCall | ImageContent>,\n): string {\n\tif (!content) return \"\";\n\tif (typeof content === \"string\") return content;\n\n\tconst fragments: string[] = [];\n\tfor (const block of content) {\n\t\tif (!block) continue;\n\n\t\t// Text blocks - include as-is\n\t\tif (block.type === \"text\") {\n\t\t\tfragments.push(block.text);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Image blocks - replace with placeholder (too large for JSON)\n\t\tif (block.type === \"image\") {\n\t\t\tconst descriptor = block.mimeType\n\t\t\t\t? `${IMAGE_PLACEHOLDER_PREFIX}${block.mimeType}]`\n\t\t\t\t: UNKNOWN_IMAGE_PLACEHOLDER;\n\t\t\tfragments.push(descriptor);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Thinking and tool calls are extracted separately, skip here\n\t\tif (block.type === \"thinking\" || block.type === \"toolCall\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Unknown content type - add placeholder with type info\n\t\tconst fallbackType = (block as { type?: string }).type || \"unknown\";\n\t\tfragments.push(`[content:${fallbackType}]`);\n\t}\n\n\treturn fragments.join(\"\\n\\n\");\n}\n\n/**\n * Extract thinking content from a message into a single string.\n * Returns undefined if no thinking blocks are present.\n */\nfunction extractThinking(\n\tcontent?:\n\t\t| string\n\t\t| Array<TextContent | ThinkingContent | ToolCall | ImageContent>,\n): string | undefined {\n\tif (!content || typeof content === \"string\") return undefined;\n\n\t// Filter to thinking blocks, extract text, and join\n\tconst thought = content\n\t\t.filter((block): block is ThinkingContent => block.type === \"thinking\")\n\t\t.map((block) => block.thinking.trim())\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\\n\");\n\n\treturn thought.length ? thought : undefined;\n}\n\n/**\n * Extract tool calls from a message into Maestro format.\n * Returns empty array if no tool calls are present.\n */\nfunction extractToolCalls(\n\tcontent?:\n\t\t| string\n\t\t| Array<TextContent | ThinkingContent | ToolCall | ImageContent>,\n): ComposerToolCall[] {\n\tif (!content || typeof content === \"string\") return [];\n\n\treturn content\n\t\t.filter((block): block is ToolCall => block.type === \"toolCall\")\n\t\t.map((toolCall) => ({\n\t\t\tname: toolCall.name?.trim() || \"unnamed_tool\",\n\t\t\tstatus: \"completed\",\n\t\t\targs: toolCall.arguments || {},\n\t\t\ttoolCallId: toolCall.id,\n\t\t}));\n}\n\nfunction extractComposerTextContent(\n\tcontent: ComposerMessage[\"content\"],\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n}\n\nfunction normalizeComposerContentBlocks(\n\tcontent: ComposerMessage[\"content\"],\n): Array<TextContent | ThinkingContent | ToolCall | ImageContent> {\n\tif (!Array.isArray(content)) return [];\n\tconst normalized: Array<\n\t\tTextContent | ThinkingContent | ToolCall | ImageContent\n\t> = [];\n\tfor (const block of content as ComposerContentBlock[]) {\n\t\tif (!block || typeof block !== \"object\") continue;\n\t\tif (block.type === \"text\") {\n\t\t\tnormalized.push({ type: \"text\", text: block.text });\n\t\t} else if (block.type === \"thinking\") {\n\t\t\tnormalized.push({ type: \"thinking\", thinking: block.thinking });\n\t\t} else if (block.type === \"toolCall\") {\n\t\t\tnormalized.push({\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: block.id,\n\t\t\t\tname: block.name,\n\t\t\t\targuments: block.arguments,\n\t\t\t\tthoughtSignature: block.thoughtSignature,\n\t\t\t});\n\t\t} else if (block.type === \"image\") {\n\t\t\tnormalized.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: block.data,\n\t\t\t\tmimeType: block.mimeType,\n\t\t\t});\n\t\t}\n\t}\n\treturn normalized;\n}\n\n/**\n * Convert a single internal AppMessage to Maestro protocol format.\n *\n * This is the main app -> Maestro conversion function. It handles:\n * - User messages: Extract text content\n * - Assistant messages: Extract text, thinking, and tool calls\n * - Tool results: Extract result content and error status\n * - System messages: Extract text content\n *\n * @param message - The internal message to convert\n * @param index - Position in the message array (for error context)\n */\nexport function convertAppMessageToComposer(\n\tmessage: AppMessage,\n\tindex = 0,\n\toptions?: { includeAttachmentContent?: boolean },\n): ComposerMessage {\n\tconst context = buildContext(\"app->composer\", index, message.role);\n\tconst timestamp = toIsoString(\n\t\t\"timestamp\" in message ? message.timestamp : undefined,\n\t\tcontext,\n\t);\n\n\t// User messages - simple text extraction\n\tif (isUserMessage(message)) {\n\t\tconst attachments = toComposerAttachments(\n\t\t\t\"attachments\" in message\n\t\t\t\t? (message as { attachments?: Attachment[] }).attachments\n\t\t\t\t: undefined,\n\t\t\toptions,\n\t\t);\n\t\treturn {\n\t\t\trole: \"user\",\n\t\t\tcontent: extractTextContent(message.content),\n\t\t\ttimestamp,\n\t\t\tattachments,\n\t\t};\n\t}\n\n\t// Assistant messages - extract text, thinking, and tool calls\n\tif (isAssistantMessage(message)) {\n\t\tconst tools = extractToolCalls(message.content);\n\t\treturn {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: extractTextContent(message.content),\n\t\t\tthinking: extractThinking(message.content),\n\t\t\ttimestamp,\n\t\t\ttools: tools.length ? tools : undefined,\n\t\t\tusage: toComposerUsage(message.usage),\n\t\t\tprovider: message.provider,\n\t\t\tapi: message.api,\n\t\t\tmodel: message.model,\n\t\t};\n\t}\n\n\t// Tool result messages - include tool name and error status\n\tif (isToolResultMessage(message)) {\n\t\treturn {\n\t\t\trole: \"tool\",\n\t\t\tcontent: extractTextContent(message.content),\n\t\t\ttimestamp,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t};\n\t}\n\n\t// System messages (rare, but supported)\n\tconst systemLike = message as {\n\t\trole?: string;\n\t\tcontent?: string | Array<TextContent | ImageContent>;\n\t};\n\tif (systemLike.role === \"system\") {\n\t\treturn {\n\t\t\trole: \"system\",\n\t\t\tcontent: extractTextContent(systemLike.content),\n\t\t\ttimestamp,\n\t\t};\n\t}\n\n\tthrow new SessionSerializationError(\"Unsupported App role\", context);\n}\n\n/**\n * Convert an array of AppMessages to Maestro format.\n * Preserves message order and provides index context for errors.\n */\nexport function convertAppMessagesToComposer(\n\tmessages: AppMessage[],\n\toptions?: { includeAttachmentContent?: boolean },\n): ComposerMessage[] {\n\treturn messages.map((message, index) =>\n\t\tconvertAppMessageToComposer(message, index, options),\n\t);\n}\n\n/**\n * Normalize a Maestro tool call to internal ToolCall format.\n * Generates stable IDs if not provided.\n *\n * @param tool - The Maestro tool call to normalize\n * @param messageIndex - Message position (for generating fallback IDs)\n * @param contentIndex - Content block position (for generating fallback IDs)\n */\nfunction normalizeToolCall(\n\ttool: ComposerToolCall,\n\tmessageIndex: number,\n\tcontentIndex: number,\n): ToolCall {\n\t// Generate fallback name/ID if not provided\n\tconst name = tool.name?.trim() || `tool_${messageIndex}_${contentIndex}`;\n\tconst toolCallId =\n\t\ttool.toolCallId || `web-tool-${messageIndex}-${contentIndex}`;\n\t// Ensure args is a record (not array or primitive)\n\tconst args: Record<string, unknown> = isRecord(tool.args) ? tool.args : {};\n\n\treturn {\n\t\ttype: \"toolCall\",\n\t\tid: toolCallId,\n\t\tname,\n\t\targuments: args,\n\t};\n}\n\n/**\n * Create a ToolResultMessage from a Maestro tool call.\n * The result is derived from the tool call's embedded result field.\n */\nfunction normalizeToolResult(\n\ttool: ComposerToolCall,\n\tnormalizedCall: ToolCall,\n\ttimestamp: string | undefined,\n\tcontext: SessionSerializationContext,\n): ToolResultMessage {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: normalizedCall.id,\n\t\ttoolName: normalizedCall.name,\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: serializeToolContent(tool),\n\t\t\t},\n\t\t],\n\t\tisError: tool.status === \"error\",\n\t\ttimestamp: toTimestamp(timestamp, context),\n\t};\n}\n\n/**\n * Convert a single Maestro message to internal AppMessage format.\n *\n * This is the main Maestro -> app conversion function. Note that a single\n * Maestro message may expand to multiple AppMessages when tool calls are\n * present (the assistant message + one toolResult per tool).\n *\n * @param message - The Maestro message to convert\n * @param model - Model metadata to attach to assistant messages\n * @param index - Position in the message array (for error context)\n * @returns Array of AppMessages (may be 1+ messages)\n */\nexport function convertComposerMessageToApp(\n\tmessage: ComposerMessage,\n\tmodel: RegisteredModel,\n\tindex = 0,\n): AppMessage[] {\n\tconst context = buildContext(\"composer->app\", index, message.role);\n\n\t// User messages - wrap content in text block\n\tif (message.role === \"user\") {\n\t\tconst attachments = fromComposerAttachments(message.attachments);\n\t\tif (Array.isArray(message.content)) {\n\t\t\tconst normalized = normalizeComposerContentBlocks(message.content).filter(\n\t\t\t\t(block) => block.type === \"text\" || block.type === \"image\",\n\t\t\t);\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\tnormalized.length > 0 ? normalized : [{ type: \"text\", text: \"\" }],\n\t\t\t\t\tattachments,\n\t\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: extractComposerTextContent(message.content) },\n\t\t\t\t],\n\t\t\t\tattachments,\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t},\n\t\t];\n\t}\n\n\t// Assistant messages - reconstruct content array from components\n\tif (message.role === \"assistant\") {\n\t\tconst resolvedProvider = message.provider ?? model.provider;\n\t\tconst resolvedApi = (message.api ?? model.api) as AssistantMessage[\"api\"];\n\t\tconst resolvedModel = message.model ?? model.id;\n\t\tif (Array.isArray(message.content)) {\n\t\t\tconst normalizedSequence = normalizeComposerContentBlocks(\n\t\t\t\tmessage.content,\n\t\t\t).filter(\n\t\t\t\t(block): block is TextContent | ThinkingContent | ToolCall =>\n\t\t\t\t\tblock.type !== \"image\",\n\t\t\t);\n\t\t\tconst hasThinking = normalizedSequence.some(\n\t\t\t\t(block) => block.type === \"thinking\",\n\t\t\t);\n\t\t\tconst hasToolCalls = normalizedSequence.some(\n\t\t\t\t(block) => block.type === \"toolCall\",\n\t\t\t);\n\n\t\t\tif (!hasThinking && message.thinking?.trim()) {\n\t\t\t\tnormalizedSequence.unshift({\n\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\tthinking: message.thinking.trim(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst tools = message.tools ?? [];\n\t\t\tif (!hasToolCalls && tools.length > 0) {\n\t\t\t\tconst baseContentLength = normalizedSequence.length;\n\t\t\t\tconst toolCalls: ToolCall[] = tools.map((tool, toolIndex) =>\n\t\t\t\t\tnormalizeToolCall(tool, index, baseContentLength + toolIndex),\n\t\t\t\t);\n\t\t\t\tnormalizedSequence.push(...toolCalls);\n\t\t\t}\n\n\t\t\tconst assistantMessage: AssistantMessage = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: normalizedSequence,\n\t\t\t\tapi: resolvedApi,\n\t\t\t\tprovider: resolvedProvider,\n\t\t\t\tmodel: resolvedModel,\n\t\t\t\tusage: message.usage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tinput: message.usage.input ?? 0,\n\t\t\t\t\t\t\toutput: message.usage.output ?? 0,\n\t\t\t\t\t\t\tcacheRead: message.usage.cacheRead ?? 0,\n\t\t\t\t\t\t\tcacheWrite: message.usage.cacheWrite ?? 0,\n\t\t\t\t\t\t\tcost: {\n\t\t\t\t\t\t\t\tinput: message.usage.cost?.input ?? 0,\n\t\t\t\t\t\t\t\toutput: message.usage.cost?.output ?? 0,\n\t\t\t\t\t\t\t\tcacheRead: message.usage.cost?.cacheRead ?? 0,\n\t\t\t\t\t\t\t\tcacheWrite: message.usage.cost?.cacheWrite ?? 0,\n\t\t\t\t\t\t\t\ttotal: message.usage.cost?.total ?? 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: createEmptyUsage(),\n\t\t\t\tstopReason: \"stop\",\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t};\n\n\t\t\tconst results: AppMessage[] = [assistantMessage];\n\t\t\tconst toolCallBlocks = normalizedSequence.filter(\n\t\t\t\t(block): block is ToolCall => block.type === \"toolCall\",\n\t\t\t);\n\n\t\t\t// Generate tool result messages for each tool call\n\t\t\ttools.forEach((tool, toolIndex) => {\n\t\t\t\tconst normalizedCall =\n\t\t\t\t\t(tool.toolCallId\n\t\t\t\t\t\t? toolCallBlocks.find((block) => block.id === tool.toolCallId)\n\t\t\t\t\t\t: toolCallBlocks[toolIndex]) ??\n\t\t\t\t\tnormalizeToolCall(tool, index, normalizedSequence.length + toolIndex);\n\t\t\t\tresults.push(\n\t\t\t\t\tnormalizeToolResult(tool, normalizedCall, message.timestamp, context),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn results;\n\t\t}\n\t\t// Build content array: thinking first, then text, then tool calls\n\t\tconst normalizedSequence: Array<TextContent | ThinkingContent | ToolCall> =\n\t\t\t[];\n\n\t\t// Add thinking block if present\n\t\tif (message.thinking?.trim()) {\n\t\t\tnormalizedSequence.push({\n\t\t\t\ttype: \"thinking\",\n\t\t\t\tthinking: message.thinking.trim(),\n\t\t\t});\n\t\t}\n\n\t\t// Add text content if present\n\t\tif (extractComposerTextContent(message.content)) {\n\t\t\tnormalizedSequence.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: extractComposerTextContent(message.content),\n\t\t\t});\n\t\t}\n\n\t\t// Convert and add tool calls\n\t\tconst tools = message.tools ?? [];\n\t\tconst baseContentLength = normalizedSequence.length;\n\t\tconst toolCalls: ToolCall[] = tools.map((tool, toolIndex) =>\n\t\t\tnormalizeToolCall(tool, index, baseContentLength + toolIndex),\n\t\t);\n\t\tnormalizedSequence.push(...toolCalls);\n\n\t\t// Build the assistant message with model metadata\n\t\tconst assistantMessage: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: normalizedSequence,\n\t\t\tapi: resolvedApi,\n\t\t\tprovider: resolvedProvider,\n\t\t\tmodel: resolvedModel,\n\t\t\tusage: message.usage\n\t\t\t\t? {\n\t\t\t\t\t\tinput: message.usage.input ?? 0,\n\t\t\t\t\t\toutput: message.usage.output ?? 0,\n\t\t\t\t\t\tcacheRead: message.usage.cacheRead ?? 0,\n\t\t\t\t\t\tcacheWrite: message.usage.cacheWrite ?? 0,\n\t\t\t\t\t\tcost: {\n\t\t\t\t\t\t\tinput: message.usage.cost?.input ?? 0,\n\t\t\t\t\t\t\toutput: message.usage.cost?.output ?? 0,\n\t\t\t\t\t\t\tcacheRead: message.usage.cost?.cacheRead ?? 0,\n\t\t\t\t\t\t\tcacheWrite: message.usage.cost?.cacheWrite ?? 0,\n\t\t\t\t\t\t\ttotal: message.usage.cost?.total ?? 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: createEmptyUsage(),\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t};\n\n\t\tconst results: AppMessage[] = [assistantMessage];\n\n\t\t// Generate tool result messages for each tool call\n\t\t// These follow the assistant message in the conversation\n\t\ttools.forEach((tool, toolIndex) => {\n\t\t\tconst normalizedCall = toolCalls[toolIndex]!;\n\t\t\tresults.push(\n\t\t\t\tnormalizeToolResult(tool, normalizedCall, message.timestamp, context),\n\t\t\t);\n\t\t});\n\n\t\treturn results;\n\t}\n\n\t// Standalone tool messages (less common, but supported)\n\tif (message.role === \"tool\") {\n\t\tconst toolName = message.toolName || \"web_tool\";\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: `${toolName}-${index}`,\n\t\t\t\ttoolName,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: extractComposerTextContent(message.content),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tisError: Boolean(message.isError),\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t},\n\t\t];\n\t}\n\n\t// System messages are converted to assistant messages\n\t// (internal format doesn't have a separate system role in conversation)\n\tif (message.role === \"system\") {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: extractComposerTextContent(message.content) },\n\t\t\t\t],\n\t\t\t\tapi: model.api,\n\t\t\t\tprovider: model.provider,\n\t\t\t\tmodel: model.id,\n\t\t\t\tusage: createEmptyUsage(),\n\t\t\t\tstopReason: \"stop\",\n\t\t\t\ttimestamp: toTimestamp(message.timestamp, context),\n\t\t\t},\n\t\t];\n\t}\n\n\tthrow new SessionSerializationError(\"Unsupported Maestro role\", context);\n}\n\n/**\n * Convert an array of Maestro messages to internal AppMessage format.\n *\n * Note: The output array may be longer than the input because assistant\n * messages with tool calls expand to multiple AppMessages.\n */\nexport function convertComposerMessagesToApp(\n\tmessages: ComposerMessage[],\n\tmodel: RegisteredModel,\n): AppMessage[] {\n\tconst result: AppMessage[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\t// Preserve relative ordering by pushing each expanded block in sequence\n\t\tresult.push(...convertComposerMessageToApp(message, model, index));\n\t}\n\treturn result;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/compliance/normalize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/services/compliance/normalize.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAExB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,EACtC,MAAM,YAAY,CAAC;AAEpB,qBAAa,yBAA0B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI3B;AA4BD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAQ3E;AAED,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,OAAO,GACZ,mBAAmB,EAAE,CAoBvB;AAgFD,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,gBAAgB,GACrB,iBAAiB,CAsBnB;AAED,wBAAgB,kCAAkC,CACjD,KAAK,EAAE,yBAAyB,GAC9B,0BAA0B,CAiC5B;AAED,wBAAgB,gCAAgC,CAC/C,KAAK,EAAE,uBAAuB,GAC5B,iCAAiC,CA2BnC;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;CACb,GAAG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,EAAE,CAAC,EAAE,IAAI,CAAC;CACV,CAsBA;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,EAAE,CAAC,EAAE,IAAI,CAAA;CAAE,GAC/B,OAAO,CAKT"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { isRecord } from "../../utils/json.js";
|
|
2
3
|
import { COMPLIANCE_FRAMEWORKS, } from "./types.js";
|
|
3
4
|
export class ComplianceValidationError extends Error {
|
|
4
5
|
constructor(message) {
|
|
@@ -6,9 +7,6 @@ export class ComplianceValidationError extends Error {
|
|
|
6
7
|
this.name = "ComplianceValidationError";
|
|
7
8
|
}
|
|
8
9
|
}
|
|
9
|
-
function isRecord(value) {
|
|
10
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11
|
-
}
|
|
12
10
|
function cleanOptionalString(value) {
|
|
13
11
|
if (typeof value !== "string")
|
|
14
12
|
return undefined;
|