@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":"render-model.js","sourceRoot":"","sources":["../../src/conversation/render-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Render Model - Transforms raw messages into UI-ready format with content deduplication\n *\n * This module provides the transformation layer between raw agent messages and the\n * renderable structures consumed by the TUI. Its primary responsibilities:\n *\n * 1. **Message Normalization**: Extracts text, thinking blocks, tool calls, and\n * attachments into consistent, typed structures.\n *\n * 2. **Content Deduplication**: Removes repeated lines that occur during streaming,\n * particularly when LLM providers resend cumulative content on each delta.\n *\n * 3. **Clean Mode Support**: Three levels of content cleaning (off/soft/aggressive)\n * to balance rendering accuracy vs visual cleanliness.\n *\n * ## The Duplicate Line Problem\n *\n * When streaming responses, some LLM providers (especially for reasoning/thinking\n * blocks) resend all previous content with each update rather than just the delta.\n * This manifests as:\n * - Numbered list items appearing multiple times\n * - Paragraph beginnings repeated\n * - Code blocks with duplicated lines\n *\n * ## Deduplication Strategy\n *\n * We maintain a sliding window of recently-seen lines. Each new line is checked\n * against this window; if found, it's collapsed. The window size varies by mode:\n * - **Soft mode**: Small window (40 lines) catches local repetition\n * - **Aggressive mode**: Large window (120 lines) catches re-sent blocks\n *\n * Cross-block mode shares history between text blocks in the same message,\n * catching duplicates that span the streaming chunk boundaries.\n *\n * @module conversation/render-model\n */\n\nimport type {\n\tAppMessage,\n\tAssistantMessage,\n\tAttachment,\n\tStopReason,\n\tToolResultMessage,\n\tUserMessageWithAttachments,\n} from \"../agent/types.js\";\n\nexport type RenderableMessage =\n\t| RenderableUserMessage\n\t| RenderableAssistantMessage\n\t| RenderableToolResultMessage;\n\n/**\n * Content cleaning modes for handling streaming artifacts\n *\n * - `off`: No cleaning, render exactly as received (for debugging)\n * - `soft`: Light deduplication for adjacent duplicate lines\n * - `aggressive`: Heavy deduplication with large sliding window and cross-block history\n */\nexport type CleanMode = \"off\" | \"soft\" | \"aggressive\";\n\nexport interface RenderOptions {\n\tcleanMode?: CleanMode;\n}\n\n/**\n * Collapse Duplicate Lines - Removes streaming-induced repetition\n *\n * Primary entry point for line deduplication. Creates a fresh history array\n * for single-block use, or delegates to the history-sharing variant for\n * cross-block deduplication.\n *\n * @param text - The text content to deduplicate\n * @param options - Configuration for deduplication behavior\n * @param options.windowSize - How many recent lines to remember (default: 1)\n * @param options.crossBlock - If true, initializes shared history for cross-block mode\n * @returns Object with deduplicated text and whether any changes were made\n */\nexport function collapseRepeatedLines(\n\ttext: string,\n\toptions: { windowSize?: number; crossBlock?: boolean } = {},\n): { text: string; changed: boolean } {\n\treturn collapseRepeatedLinesWithHistory(text, {\n\t\t...options,\n\t\tsharedHistory: options.crossBlock ? [] : undefined,\n\t});\n}\n\n/**\n * History-Aware Line Deduplication - Core algorithm with shared state\n *\n * This is the workhorse function that actually performs deduplication. It maintains\n * a sliding window of recently-seen lines and filters out repetitions.\n *\n * ## Algorithm\n *\n * For each line in the input:\n * 1. Normalize by trimming trailing whitespace (leading preserved for code)\n * 2. Collapse consecutive blank lines to single blank\n * 3. Check if line exists in recent history window\n * 4. If duplicate: skip it (and any trailing blank before it)\n * 5. If unique: add to output and update history window\n *\n * ## Window Semantics\n *\n * The `windowSize` parameter controls how far back we look for duplicates:\n * - windowSize=1: Only catches immediately consecutive duplicates\n * - windowSize=40: Catches duplicates within ~40 lines (soft mode)\n * - windowSize=120: Catches duplicates from large re-sent blocks (aggressive)\n *\n * The window is FIFO: oldest lines drop off as new ones are added.\n *\n * ## Cross-Block Mode\n *\n * When `sharedHistory` is provided, the history array persists across multiple\n * calls. This is essential for streaming where content arrives in chunks:\n *\n * Chunk 1: \"1. First item\\n2. Second item\"\n * Chunk 2: \"2. Second item\\n3. Third item\" <- \"2. Second item\" is duplicate\n *\n * Without cross-block mode, chunk 2's duplicate wouldn't be detected since\n * each call would start with empty history.\n *\n * ## Blank Line Handling\n *\n * Blank lines receive special treatment:\n * - Multiple consecutive blanks collapse to one (visual spacing)\n * - Trailing blanks before duplicates are also removed (prevents orphan whitespace)\n * - Empty lines don't enter the history window (they're never \"duplicate content\")\n *\n * @param text - The text content to deduplicate\n * @param options.windowSize - Size of the sliding history window (default: 1)\n * @param options.crossBlock - Whether we're in cross-block mode (affects duplicate check)\n * @param options.sharedHistory - External history array for cross-block persistence\n * @returns Object with deduplicated text and whether any changes were made\n */\nexport function collapseRepeatedLinesWithHistory(\n\ttext: string,\n\toptions: {\n\t\twindowSize?: number;\n\t\tcrossBlock?: boolean;\n\t\tsharedHistory?: string[];\n\t} = {},\n): { text: string; changed: boolean } {\n\t// Split on both Unix and Windows line endings\n\tconst lines = text.split(/\\r?\\n/);\n\tconst result: string[] = [];\n\tconst windowSize = options.windowSize ?? 1;\n\t// Use shared history if provided (cross-block mode), otherwise local array\n\tconst recent: string[] = options.sharedHistory ?? [];\n\tlet changed = false;\n\n\tfor (const line of lines) {\n\t\t// Normalize: trim trailing whitespace but preserve leading (for code indentation)\n\t\tconst normalized = line.trimEnd();\n\t\tconst isEmpty = normalized.length === 0;\n\n\t\t// Rule 1: Collapse runs of blank lines to a single blank\n\t\t// This prevents visual gaps from accumulating during streaming\n\t\tif (\n\t\t\tisEmpty &&\n\t\t\tresult.length > 0 &&\n\t\t\tresult[result.length - 1]!.length === 0\n\t\t) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Rule 2: Check for duplicate content lines\n\t\t// In cross-block mode: search entire history window\n\t\t// In local mode: only check the immediately previous line\n\t\tconst isDuplicate =\n\t\t\t!isEmpty &&\n\t\t\t(options.crossBlock\n\t\t\t\t? recent.includes(normalized)\n\t\t\t\t: recent.length > 0 && recent[recent.length - 1] === normalized);\n\n\t\tif (isDuplicate) {\n\t\t\t// Clean up trailing blank that precedes the duplicate\n\t\t\t// This prevents orphaned whitespace when duplicates are removed\n\t\t\tif (result.length > 0 && result[result.length - 1]!.length === 0) {\n\t\t\t\tresult.pop();\n\t\t\t}\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Line is unique - add to output\n\t\tresult.push(line);\n\n\t\t// Update sliding window history (only for non-empty lines)\n\t\tif (!isEmpty) {\n\t\t\trecent.push(normalized);\n\t\t\t// Maintain window size by dropping oldest entry\n\t\t\tif (recent.length > windowSize) {\n\t\t\t\trecent.shift();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { text: result.join(\"\\n\"), changed };\n}\n\nexport interface RenderableUserMessage {\n\tkind: \"user\";\n\ttext: string;\n\tattachments: RenderableAttachment[];\n\traw: UserMessageWithAttachments;\n}\n\nexport interface RenderableAssistantMessage {\n\tkind: \"assistant\";\n\ttextBlocks: string[];\n\tthinkingBlocks: string[];\n\ttoolCalls: RenderableToolCall[];\n\tstopReason: StopReason;\n\terrorMessage?: string;\n\tcleaned: boolean;\n\traw: AssistantMessage;\n}\n\nexport interface RenderableToolCall {\n\tid: string;\n\tname: string;\n\targuments: Record<string, unknown>;\n}\n\nexport interface RenderableToolResultMessage {\n\tkind: \"toolResult\";\n\ttoolCallId: string;\n\ttoolName: string;\n\ttextContent: string;\n\timages: RenderableImageContent[];\n\tisError: boolean;\n\tdetails?: unknown;\n\traw: ToolResultMessage;\n}\n\nexport interface RenderableAttachment {\n\tid: string;\n\ttype: Attachment[\"type\"];\n\tfileName: string;\n\tmimeType: string;\n\tsize: number;\n\tpreview?: string;\n}\n\nexport interface RenderableImageContent {\n\tmimeType: string;\n\tdata: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isAssistantContentBlock(\n\tvalue: unknown,\n): value is AssistantMessage[\"content\"][number] {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\tswitch (value.type) {\n\t\tcase \"text\":\n\t\t\treturn typeof value.text === \"string\";\n\t\tcase \"thinking\":\n\t\t\treturn typeof value.thinking === \"string\";\n\t\tcase \"toolCall\":\n\t\t\treturn (\n\t\t\t\ttypeof value.id === \"string\" &&\n\t\t\t\ttypeof value.name === \"string\" &&\n\t\t\t\tisRecord(value.arguments)\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction normalizeAssistantContent(\n\tcontent: unknown,\n): AssistantMessage[\"content\"] {\n\tif (typeof content === \"string\") {\n\t\treturn content.trim() ? [{ type: \"text\", text: content }] : [];\n\t}\n\tif (!Array.isArray(content)) {\n\t\treturn [];\n\t}\n\treturn content.filter(isAssistantContentBlock);\n}\n\nfunction isToolResultContentBlock(\n\tvalue: unknown,\n): value is ToolResultMessage[\"content\"][number] {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\tif (value.type === \"text\") {\n\t\treturn typeof value.text === \"string\";\n\t}\n\tif (value.type === \"image\") {\n\t\treturn typeof value.data === \"string\" && typeof value.mimeType === \"string\";\n\t}\n\treturn false;\n}\n\nfunction normalizeToolResultContent(\n\tcontent: unknown,\n): ToolResultMessage[\"content\"] {\n\tif (typeof content === \"string\") {\n\t\treturn content.trim() ? [{ type: \"text\", text: content }] : [];\n\t}\n\tif (!Array.isArray(content)) {\n\t\treturn [];\n\t}\n\treturn content.filter(isToolResultContentBlock);\n}\n\nfunction collapseProgressiveBlocks(blocks: string[]): {\n\tblocks: string[];\n\tcollapsed: boolean;\n} {\n\tif (blocks.length <= 1) return { blocks, collapsed: false };\n\n\tconst result: string[] = [];\n\tlet current = \"\";\n\tlet collapsed = false;\n\n\tfor (const block of blocks) {\n\t\tif (!current) {\n\t\t\tcurrent = block;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the new block is an extension of the current one (progressive snapshot),\n\t\t// keep only the longer block.\n\t\tif (block.startsWith(current)) {\n\t\t\tcurrent = block;\n\t\t\tcollapsed = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the current block is an extension of the new one, drop the shorter snapshot.\n\t\tif (current.startsWith(block)) {\n\t\t\tcollapsed = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Otherwise the block is distinct – commit the current block and start a new one.\n\t\tresult.push(current);\n\t\tcurrent = block;\n\t}\n\n\tif (current) {\n\t\tresult.push(current);\n\t}\n\n\treturn { blocks: result, collapsed };\n}\n\nexport function toRenderableUserMessage(\n\tmessage: UserMessageWithAttachments,\n): RenderableUserMessage {\n\treturn {\n\t\tkind: \"user\",\n\t\ttext: extractTextFromUserContent(message),\n\t\tattachments:\n\t\t\tmessage.attachments?.map((attachment) => ({\n\t\t\t\tid: attachment.id,\n\t\t\t\ttype: attachment.type,\n\t\t\t\tfileName: attachment.fileName,\n\t\t\t\tmimeType: attachment.mimeType,\n\t\t\t\tsize: attachment.size,\n\t\t\t\tpreview: attachment.preview,\n\t\t\t})) ?? [],\n\t\traw: message,\n\t};\n}\n\nexport function toRenderableAssistantMessage(\n\tmessage: AssistantMessage,\n\toptions: RenderOptions = {},\n): RenderableAssistantMessage {\n\tconst textBlocks: string[] = [];\n\tconst thinkingBlocks: string[] = [];\n\tconst toolCalls: RenderableToolCall[] = [];\n\tconst cleanMode = options.cleanMode ?? \"off\";\n\tlet cleaned = false;\n\t// Share recent-line history across blocks so duplicated numbered items that\n\t// arrive as separate chunks during streaming get collapsed.\n\tconst recentLines: string[] = [];\n\n\tconst cleanText = (value: string): { text: string; changed: boolean } => {\n\t\tif (cleanMode === \"off\") {\n\t\t\treturn { text: value, changed: false };\n\t\t}\n\t\t// Keep a larger recent-line window so we can collapse content when\n\t\t// providers resend cumulative chunks (e.g., entire bullet lists on each\n\t\t// delta). Soft mode gets a generous window; aggressive mode gets an\n\t\t// even larger one, but both are bounded to avoid unbounded growth.\n\t\tconst windowSize = cleanMode === \"aggressive\" ? 120 : 40;\n\t\treturn collapseRepeatedLinesWithHistory(value, {\n\t\t\twindowSize,\n\t\t\tcrossBlock: true,\n\t\t\tsharedHistory: recentLines,\n\t\t});\n\t};\n\n\tfor (const content of normalizeAssistantContent(message.content)) {\n\t\tif (content.type === \"text\" && content.text.trim()) {\n\t\t\tconst { text, changed } = cleanText(content.text.trim());\n\t\t\ttextBlocks.push(text);\n\t\t\tcleaned = cleaned || changed;\n\t\t} else if (content.type === \"thinking\" && content.thinking.trim()) {\n\t\t\tconst { text, changed } = cleanText(content.thinking.trim());\n\t\t\tthinkingBlocks.push(text);\n\t\t\tcleaned = cleaned || changed;\n\t\t} else if (content.type === \"toolCall\") {\n\t\t\ttoolCalls.push({\n\t\t\t\tid: content.id,\n\t\t\t\tname: content.name,\n\t\t\t\targuments: content.arguments,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst collapsedText = collapseProgressiveBlocks(textBlocks);\n\tconst collapsedThinking = collapseProgressiveBlocks(thinkingBlocks);\n\n\treturn {\n\t\tkind: \"assistant\",\n\t\ttextBlocks: collapsedText.blocks,\n\t\tthinkingBlocks: collapsedThinking.blocks,\n\t\ttoolCalls,\n\t\tstopReason: message.stopReason,\n\t\terrorMessage: message.errorMessage,\n\t\tcleaned: cleaned || collapsedText.collapsed || collapsedThinking.collapsed,\n\t\traw: message,\n\t};\n}\n\nfunction maybeCleanText(\n\ttext: string,\n\tmode: CleanMode,\n): { text: string; changed: boolean } {\n\tif (mode === \"off\") {\n\t\treturn { text, changed: false };\n\t}\n\tif (mode === \"soft\") {\n\t\treturn collapseRepeatedLines(text);\n\t}\n\t// aggressive: dedupe within a sliding window across blocks\n\treturn collapseRepeatedLines(text, { windowSize: 8, crossBlock: true });\n}\n\nexport function toRenderableToolResultMessage(\n\tmessage: ToolResultMessage,\n): RenderableToolResultMessage {\n\tconst textContent = extractTextFromToolResult(message);\n\tconst images = normalizeToolResultContent(message.content)\n\t\t.filter((content) => content.type === \"image\")\n\t\t.map((content) => ({\n\t\t\tmimeType: content.mimeType,\n\t\t\tdata: content.data,\n\t\t}));\n\n\treturn {\n\t\tkind: \"toolResult\",\n\t\ttoolCallId: message.toolCallId,\n\t\ttoolName: message.toolName,\n\t\ttextContent,\n\t\timages,\n\t\tisError: message.isError,\n\t\tdetails: message.details,\n\t\traw: message,\n\t};\n}\n\nexport function createRenderableMessage(\n\tmessage: AppMessage,\n\toptions: RenderOptions = {},\n): RenderableMessage | null {\n\tif (message.role === \"user\") {\n\t\treturn toRenderableUserMessage(message as UserMessageWithAttachments);\n\t}\n\tif (message.role === \"assistant\") {\n\t\treturn toRenderableAssistantMessage(message, options);\n\t}\n\tif (message.role === \"toolResult\") {\n\t\treturn toRenderableToolResultMessage(message);\n\t}\n\treturn null;\n}\n\nexport function buildConversationModel(\n\tmessages: AppMessage[],\n\toptions: RenderOptions = {},\n): RenderableMessage[] {\n\tconst renderables: RenderableMessage[] = [];\n\tfor (const message of messages) {\n\t\tconst renderable = createRenderableMessage(message, options);\n\t\tif (renderable) {\n\t\t\trenderables.push(renderable);\n\t\t}\n\t}\n\treturn renderables;\n}\n\nexport function isRenderableUserMessage(\n\tmessage: RenderableMessage,\n): message is RenderableUserMessage {\n\treturn message.kind === \"user\";\n}\n\nexport function isRenderableAssistantMessage(\n\tmessage: RenderableMessage,\n): message is RenderableAssistantMessage {\n\treturn message.kind === \"assistant\";\n}\n\nexport function isRenderableToolResultMessage(\n\tmessage: RenderableMessage,\n): message is RenderableToolResultMessage {\n\treturn message.kind === \"toolResult\";\n}\n\nexport function renderMessageToPlainText(message: RenderableMessage): string {\n\tif (isRenderableUserMessage(message)) {\n\t\tconst attachmentNotes = message.attachments.map(\n\t\t\t(attachment) =>\n\t\t\t\t`[attachment] ${attachment.fileName} (${attachment.mimeType})`,\n\t\t);\n\t\treturn [message.text, ...attachmentNotes]\n\t\t\t.filter((part) => Boolean(part?.trim()))\n\t\t\t.join(\"\\n\")\n\t\t\t.trim();\n\t}\n\tif (isRenderableAssistantMessage(message)) {\n\t\tconst lines: string[] = [];\n\t\tlines.push(...message.textBlocks);\n\t\tlines.push(\n\t\t\t...message.thinkingBlocks.map((thinking) => `[thinking] ${thinking}`),\n\t\t);\n\t\tlines.push(...message.toolCalls.map((call) => `[tool call] ${call.name}`));\n\t\treturn lines.filter((part) => Boolean(part?.trim())).join(\"\\n\");\n\t}\n\tif (isRenderableToolResultMessage(message)) {\n\t\tconst imageLines = message.images.map(\n\t\t\t(image) => `[image] ${image.mimeType || \"attachment\"}`,\n\t\t);\n\t\treturn [message.textContent, ...imageLines]\n\t\t\t.filter((part) => Boolean(part?.trim()))\n\t\t\t.join(\"\\n\")\n\t\t\t.trim();\n\t}\n\treturn \"\";\n}\n\nfunction extractTextFromUserContent(\n\tmessage: UserMessageWithAttachments,\n): string {\n\tif (typeof message.content === \"string\") {\n\t\treturn message.content;\n\t}\n\tif (Array.isArray(message.content)) {\n\t\treturn message.content\n\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t.map((block) => block.text)\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\nfunction extractTextFromToolResult(message: ToolResultMessage): string {\n\treturn normalizeToolResultContent(message.content)\n\t\t.filter((content) => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render-model.js","sourceRoot":"","sources":["../../src/conversation/render-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Render Model - Transforms raw messages into UI-ready format with content deduplication\n *\n * This module provides the transformation layer between raw agent messages and the\n * renderable structures consumed by the TUI. Its primary responsibilities:\n *\n * 1. **Message Normalization**: Extracts text, thinking blocks, tool calls, and\n * attachments into consistent, typed structures.\n *\n * 2. **Content Deduplication**: Removes repeated lines that occur during streaming,\n * particularly when LLM providers resend cumulative content on each delta.\n *\n * 3. **Clean Mode Support**: Three levels of content cleaning (off/soft/aggressive)\n * to balance rendering accuracy vs visual cleanliness.\n *\n * ## The Duplicate Line Problem\n *\n * When streaming responses, some LLM providers (especially for reasoning/thinking\n * blocks) resend all previous content with each update rather than just the delta.\n * This manifests as:\n * - Numbered list items appearing multiple times\n * - Paragraph beginnings repeated\n * - Code blocks with duplicated lines\n *\n * ## Deduplication Strategy\n *\n * We maintain a sliding window of recently-seen lines. Each new line is checked\n * against this window; if found, it's collapsed. The window size varies by mode:\n * - **Soft mode**: Small window (40 lines) catches local repetition\n * - **Aggressive mode**: Large window (120 lines) catches re-sent blocks\n *\n * Cross-block mode shares history between text blocks in the same message,\n * catching duplicates that span the streaming chunk boundaries.\n *\n * @module conversation/render-model\n */\nimport { isRecord } from \"../utils/json.js\";\n\nimport type {\n\tAppMessage,\n\tAssistantMessage,\n\tAttachment,\n\tStopReason,\n\tToolResultMessage,\n\tUserMessageWithAttachments,\n} from \"../agent/types.js\";\n\nexport type RenderableMessage =\n\t| RenderableUserMessage\n\t| RenderableAssistantMessage\n\t| RenderableToolResultMessage;\n\n/**\n * Content cleaning modes for handling streaming artifacts\n *\n * - `off`: No cleaning, render exactly as received (for debugging)\n * - `soft`: Light deduplication for adjacent duplicate lines\n * - `aggressive`: Heavy deduplication with large sliding window and cross-block history\n */\nexport type CleanMode = \"off\" | \"soft\" | \"aggressive\";\n\nexport interface RenderOptions {\n\tcleanMode?: CleanMode;\n}\n\n/**\n * Collapse Duplicate Lines - Removes streaming-induced repetition\n *\n * Primary entry point for line deduplication. Creates a fresh history array\n * for single-block use, or delegates to the history-sharing variant for\n * cross-block deduplication.\n *\n * @param text - The text content to deduplicate\n * @param options - Configuration for deduplication behavior\n * @param options.windowSize - How many recent lines to remember (default: 1)\n * @param options.crossBlock - If true, initializes shared history for cross-block mode\n * @returns Object with deduplicated text and whether any changes were made\n */\nexport function collapseRepeatedLines(\n\ttext: string,\n\toptions: { windowSize?: number; crossBlock?: boolean } = {},\n): { text: string; changed: boolean } {\n\treturn collapseRepeatedLinesWithHistory(text, {\n\t\t...options,\n\t\tsharedHistory: options.crossBlock ? [] : undefined,\n\t});\n}\n\n/**\n * History-Aware Line Deduplication - Core algorithm with shared state\n *\n * This is the workhorse function that actually performs deduplication. It maintains\n * a sliding window of recently-seen lines and filters out repetitions.\n *\n * ## Algorithm\n *\n * For each line in the input:\n * 1. Normalize by trimming trailing whitespace (leading preserved for code)\n * 2. Collapse consecutive blank lines to single blank\n * 3. Check if line exists in recent history window\n * 4. If duplicate: skip it (and any trailing blank before it)\n * 5. If unique: add to output and update history window\n *\n * ## Window Semantics\n *\n * The `windowSize` parameter controls how far back we look for duplicates:\n * - windowSize=1: Only catches immediately consecutive duplicates\n * - windowSize=40: Catches duplicates within ~40 lines (soft mode)\n * - windowSize=120: Catches duplicates from large re-sent blocks (aggressive)\n *\n * The window is FIFO: oldest lines drop off as new ones are added.\n *\n * ## Cross-Block Mode\n *\n * When `sharedHistory` is provided, the history array persists across multiple\n * calls. This is essential for streaming where content arrives in chunks:\n *\n * Chunk 1: \"1. First item\\n2. Second item\"\n * Chunk 2: \"2. Second item\\n3. Third item\" <- \"2. Second item\" is duplicate\n *\n * Without cross-block mode, chunk 2's duplicate wouldn't be detected since\n * each call would start with empty history.\n *\n * ## Blank Line Handling\n *\n * Blank lines receive special treatment:\n * - Multiple consecutive blanks collapse to one (visual spacing)\n * - Trailing blanks before duplicates are also removed (prevents orphan whitespace)\n * - Empty lines don't enter the history window (they're never \"duplicate content\")\n *\n * @param text - The text content to deduplicate\n * @param options.windowSize - Size of the sliding history window (default: 1)\n * @param options.crossBlock - Whether we're in cross-block mode (affects duplicate check)\n * @param options.sharedHistory - External history array for cross-block persistence\n * @returns Object with deduplicated text and whether any changes were made\n */\nexport function collapseRepeatedLinesWithHistory(\n\ttext: string,\n\toptions: {\n\t\twindowSize?: number;\n\t\tcrossBlock?: boolean;\n\t\tsharedHistory?: string[];\n\t} = {},\n): { text: string; changed: boolean } {\n\t// Split on both Unix and Windows line endings\n\tconst lines = text.split(/\\r?\\n/);\n\tconst result: string[] = [];\n\tconst windowSize = options.windowSize ?? 1;\n\t// Use shared history if provided (cross-block mode), otherwise local array\n\tconst recent: string[] = options.sharedHistory ?? [];\n\tlet changed = false;\n\n\tfor (const line of lines) {\n\t\t// Normalize: trim trailing whitespace but preserve leading (for code indentation)\n\t\tconst normalized = line.trimEnd();\n\t\tconst isEmpty = normalized.length === 0;\n\n\t\t// Rule 1: Collapse runs of blank lines to a single blank\n\t\t// This prevents visual gaps from accumulating during streaming\n\t\tif (\n\t\t\tisEmpty &&\n\t\t\tresult.length > 0 &&\n\t\t\tresult[result.length - 1]!.length === 0\n\t\t) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Rule 2: Check for duplicate content lines\n\t\t// In cross-block mode: search entire history window\n\t\t// In local mode: only check the immediately previous line\n\t\tconst isDuplicate =\n\t\t\t!isEmpty &&\n\t\t\t(options.crossBlock\n\t\t\t\t? recent.includes(normalized)\n\t\t\t\t: recent.length > 0 && recent[recent.length - 1] === normalized);\n\n\t\tif (isDuplicate) {\n\t\t\t// Clean up trailing blank that precedes the duplicate\n\t\t\t// This prevents orphaned whitespace when duplicates are removed\n\t\t\tif (result.length > 0 && result[result.length - 1]!.length === 0) {\n\t\t\t\tresult.pop();\n\t\t\t}\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Line is unique - add to output\n\t\tresult.push(line);\n\n\t\t// Update sliding window history (only for non-empty lines)\n\t\tif (!isEmpty) {\n\t\t\trecent.push(normalized);\n\t\t\t// Maintain window size by dropping oldest entry\n\t\t\tif (recent.length > windowSize) {\n\t\t\t\trecent.shift();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { text: result.join(\"\\n\"), changed };\n}\n\nexport interface RenderableUserMessage {\n\tkind: \"user\";\n\ttext: string;\n\tattachments: RenderableAttachment[];\n\traw: UserMessageWithAttachments;\n}\n\nexport interface RenderableAssistantMessage {\n\tkind: \"assistant\";\n\ttextBlocks: string[];\n\tthinkingBlocks: string[];\n\ttoolCalls: RenderableToolCall[];\n\tstopReason: StopReason;\n\terrorMessage?: string;\n\tcleaned: boolean;\n\traw: AssistantMessage;\n}\n\nexport interface RenderableToolCall {\n\tid: string;\n\tname: string;\n\targuments: Record<string, unknown>;\n}\n\nexport interface RenderableToolResultMessage {\n\tkind: \"toolResult\";\n\ttoolCallId: string;\n\ttoolName: string;\n\ttextContent: string;\n\timages: RenderableImageContent[];\n\tisError: boolean;\n\tdetails?: unknown;\n\traw: ToolResultMessage;\n}\n\nexport interface RenderableAttachment {\n\tid: string;\n\ttype: Attachment[\"type\"];\n\tfileName: string;\n\tmimeType: string;\n\tsize: number;\n\tpreview?: string;\n}\n\nexport interface RenderableImageContent {\n\tmimeType: string;\n\tdata: string;\n}\n\nfunction isAssistantContentBlock(\n\tvalue: unknown,\n): value is AssistantMessage[\"content\"][number] {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\tswitch (value.type) {\n\t\tcase \"text\":\n\t\t\treturn typeof value.text === \"string\";\n\t\tcase \"thinking\":\n\t\t\treturn typeof value.thinking === \"string\";\n\t\tcase \"toolCall\":\n\t\t\treturn (\n\t\t\t\ttypeof value.id === \"string\" &&\n\t\t\t\ttypeof value.name === \"string\" &&\n\t\t\t\tisRecord(value.arguments)\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction normalizeAssistantContent(\n\tcontent: unknown,\n): AssistantMessage[\"content\"] {\n\tif (typeof content === \"string\") {\n\t\treturn content.trim() ? [{ type: \"text\", text: content }] : [];\n\t}\n\tif (!Array.isArray(content)) {\n\t\treturn [];\n\t}\n\treturn content.filter(isAssistantContentBlock);\n}\n\nfunction isToolResultContentBlock(\n\tvalue: unknown,\n): value is ToolResultMessage[\"content\"][number] {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\tif (value.type === \"text\") {\n\t\treturn typeof value.text === \"string\";\n\t}\n\tif (value.type === \"image\") {\n\t\treturn typeof value.data === \"string\" && typeof value.mimeType === \"string\";\n\t}\n\treturn false;\n}\n\nfunction normalizeToolResultContent(\n\tcontent: unknown,\n): ToolResultMessage[\"content\"] {\n\tif (typeof content === \"string\") {\n\t\treturn content.trim() ? [{ type: \"text\", text: content }] : [];\n\t}\n\tif (!Array.isArray(content)) {\n\t\treturn [];\n\t}\n\treturn content.filter(isToolResultContentBlock);\n}\n\nfunction collapseProgressiveBlocks(blocks: string[]): {\n\tblocks: string[];\n\tcollapsed: boolean;\n} {\n\tif (blocks.length <= 1) return { blocks, collapsed: false };\n\n\tconst result: string[] = [];\n\tlet current = \"\";\n\tlet collapsed = false;\n\n\tfor (const block of blocks) {\n\t\tif (!current) {\n\t\t\tcurrent = block;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the new block is an extension of the current one (progressive snapshot),\n\t\t// keep only the longer block.\n\t\tif (block.startsWith(current)) {\n\t\t\tcurrent = block;\n\t\t\tcollapsed = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the current block is an extension of the new one, drop the shorter snapshot.\n\t\tif (current.startsWith(block)) {\n\t\t\tcollapsed = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Otherwise the block is distinct – commit the current block and start a new one.\n\t\tresult.push(current);\n\t\tcurrent = block;\n\t}\n\n\tif (current) {\n\t\tresult.push(current);\n\t}\n\n\treturn { blocks: result, collapsed };\n}\n\nexport function toRenderableUserMessage(\n\tmessage: UserMessageWithAttachments,\n): RenderableUserMessage {\n\treturn {\n\t\tkind: \"user\",\n\t\ttext: extractTextFromUserContent(message),\n\t\tattachments:\n\t\t\tmessage.attachments?.map((attachment) => ({\n\t\t\t\tid: attachment.id,\n\t\t\t\ttype: attachment.type,\n\t\t\t\tfileName: attachment.fileName,\n\t\t\t\tmimeType: attachment.mimeType,\n\t\t\t\tsize: attachment.size,\n\t\t\t\tpreview: attachment.preview,\n\t\t\t})) ?? [],\n\t\traw: message,\n\t};\n}\n\nexport function toRenderableAssistantMessage(\n\tmessage: AssistantMessage,\n\toptions: RenderOptions = {},\n): RenderableAssistantMessage {\n\tconst textBlocks: string[] = [];\n\tconst thinkingBlocks: string[] = [];\n\tconst toolCalls: RenderableToolCall[] = [];\n\tconst cleanMode = options.cleanMode ?? \"off\";\n\tlet cleaned = false;\n\t// Share recent-line history across blocks so duplicated numbered items that\n\t// arrive as separate chunks during streaming get collapsed.\n\tconst recentLines: string[] = [];\n\n\tconst cleanText = (value: string): { text: string; changed: boolean } => {\n\t\tif (cleanMode === \"off\") {\n\t\t\treturn { text: value, changed: false };\n\t\t}\n\t\t// Keep a larger recent-line window so we can collapse content when\n\t\t// providers resend cumulative chunks (e.g., entire bullet lists on each\n\t\t// delta). Soft mode gets a generous window; aggressive mode gets an\n\t\t// even larger one, but both are bounded to avoid unbounded growth.\n\t\tconst windowSize = cleanMode === \"aggressive\" ? 120 : 40;\n\t\treturn collapseRepeatedLinesWithHistory(value, {\n\t\t\twindowSize,\n\t\t\tcrossBlock: true,\n\t\t\tsharedHistory: recentLines,\n\t\t});\n\t};\n\n\tfor (const content of normalizeAssistantContent(message.content)) {\n\t\tif (content.type === \"text\" && content.text.trim()) {\n\t\t\tconst { text, changed } = cleanText(content.text.trim());\n\t\t\ttextBlocks.push(text);\n\t\t\tcleaned = cleaned || changed;\n\t\t} else if (content.type === \"thinking\" && content.thinking.trim()) {\n\t\t\tconst { text, changed } = cleanText(content.thinking.trim());\n\t\t\tthinkingBlocks.push(text);\n\t\t\tcleaned = cleaned || changed;\n\t\t} else if (content.type === \"toolCall\") {\n\t\t\ttoolCalls.push({\n\t\t\t\tid: content.id,\n\t\t\t\tname: content.name,\n\t\t\t\targuments: content.arguments,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst collapsedText = collapseProgressiveBlocks(textBlocks);\n\tconst collapsedThinking = collapseProgressiveBlocks(thinkingBlocks);\n\n\treturn {\n\t\tkind: \"assistant\",\n\t\ttextBlocks: collapsedText.blocks,\n\t\tthinkingBlocks: collapsedThinking.blocks,\n\t\ttoolCalls,\n\t\tstopReason: message.stopReason,\n\t\terrorMessage: message.errorMessage,\n\t\tcleaned: cleaned || collapsedText.collapsed || collapsedThinking.collapsed,\n\t\traw: message,\n\t};\n}\n\nfunction maybeCleanText(\n\ttext: string,\n\tmode: CleanMode,\n): { text: string; changed: boolean } {\n\tif (mode === \"off\") {\n\t\treturn { text, changed: false };\n\t}\n\tif (mode === \"soft\") {\n\t\treturn collapseRepeatedLines(text);\n\t}\n\t// aggressive: dedupe within a sliding window across blocks\n\treturn collapseRepeatedLines(text, { windowSize: 8, crossBlock: true });\n}\n\nexport function toRenderableToolResultMessage(\n\tmessage: ToolResultMessage,\n): RenderableToolResultMessage {\n\tconst textContent = extractTextFromToolResult(message);\n\tconst images = normalizeToolResultContent(message.content)\n\t\t.filter((content) => content.type === \"image\")\n\t\t.map((content) => ({\n\t\t\tmimeType: content.mimeType,\n\t\t\tdata: content.data,\n\t\t}));\n\n\treturn {\n\t\tkind: \"toolResult\",\n\t\ttoolCallId: message.toolCallId,\n\t\ttoolName: message.toolName,\n\t\ttextContent,\n\t\timages,\n\t\tisError: message.isError,\n\t\tdetails: message.details,\n\t\traw: message,\n\t};\n}\n\nexport function createRenderableMessage(\n\tmessage: AppMessage,\n\toptions: RenderOptions = {},\n): RenderableMessage | null {\n\tif (message.role === \"user\") {\n\t\treturn toRenderableUserMessage(message as UserMessageWithAttachments);\n\t}\n\tif (message.role === \"assistant\") {\n\t\treturn toRenderableAssistantMessage(message, options);\n\t}\n\tif (message.role === \"toolResult\") {\n\t\treturn toRenderableToolResultMessage(message);\n\t}\n\treturn null;\n}\n\nexport function buildConversationModel(\n\tmessages: AppMessage[],\n\toptions: RenderOptions = {},\n): RenderableMessage[] {\n\tconst renderables: RenderableMessage[] = [];\n\tfor (const message of messages) {\n\t\tconst renderable = createRenderableMessage(message, options);\n\t\tif (renderable) {\n\t\t\trenderables.push(renderable);\n\t\t}\n\t}\n\treturn renderables;\n}\n\nexport function isRenderableUserMessage(\n\tmessage: RenderableMessage,\n): message is RenderableUserMessage {\n\treturn message.kind === \"user\";\n}\n\nexport function isRenderableAssistantMessage(\n\tmessage: RenderableMessage,\n): message is RenderableAssistantMessage {\n\treturn message.kind === \"assistant\";\n}\n\nexport function isRenderableToolResultMessage(\n\tmessage: RenderableMessage,\n): message is RenderableToolResultMessage {\n\treturn message.kind === \"toolResult\";\n}\n\nexport function renderMessageToPlainText(message: RenderableMessage): string {\n\tif (isRenderableUserMessage(message)) {\n\t\tconst attachmentNotes = message.attachments.map(\n\t\t\t(attachment) =>\n\t\t\t\t`[attachment] ${attachment.fileName} (${attachment.mimeType})`,\n\t\t);\n\t\treturn [message.text, ...attachmentNotes]\n\t\t\t.filter((part) => Boolean(part?.trim()))\n\t\t\t.join(\"\\n\")\n\t\t\t.trim();\n\t}\n\tif (isRenderableAssistantMessage(message)) {\n\t\tconst lines: string[] = [];\n\t\tlines.push(...message.textBlocks);\n\t\tlines.push(\n\t\t\t...message.thinkingBlocks.map((thinking) => `[thinking] ${thinking}`),\n\t\t);\n\t\tlines.push(...message.toolCalls.map((call) => `[tool call] ${call.name}`));\n\t\treturn lines.filter((part) => Boolean(part?.trim())).join(\"\\n\");\n\t}\n\tif (isRenderableToolResultMessage(message)) {\n\t\tconst imageLines = message.images.map(\n\t\t\t(image) => `[image] ${image.mimeType || \"attachment\"}`,\n\t\t);\n\t\treturn [message.textContent, ...imageLines]\n\t\t\t.filter((part) => Boolean(part?.trim()))\n\t\t\t.join(\"\\n\")\n\t\t\t.trim();\n\t}\n\treturn \"\";\n}\n\nfunction extractTextFromUserContent(\n\tmessage: UserMessageWithAttachments,\n): string {\n\tif (typeof message.content === \"string\") {\n\t\treturn message.content;\n\t}\n\tif (Array.isArray(message.content)) {\n\t\treturn message.content\n\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t.map((block) => block.text)\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\nfunction extractTextFromToolResult(message: ToolResultMessage): string {\n\treturn normalizeToolResultContent(message.content)\n\t\t.filter((content) => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { RuntimeEnv } from "../runtime/env.js";
|
|
2
|
+
import type { CustomerValueRange, CustomerValueReport, MultiAgentValue, TrustCard } from "./report.js";
|
|
3
|
+
export declare function ambientLearnerPresenceCommand(learnerPath: string): string;
|
|
4
|
+
export interface AmbientLearnerFlushResult {
|
|
5
|
+
flushed: boolean;
|
|
6
|
+
learnerPath?: string;
|
|
7
|
+
collectionGap?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AmbientAutomationOpportunity {
|
|
10
|
+
id: "a2a-followup-watchdog" | "failed-tool-digest" | "memory-gap-digest" | "ambient-learner-review";
|
|
11
|
+
customerOutcome: string;
|
|
12
|
+
triggerEvidence: string;
|
|
13
|
+
recommendedCadence: "hourly" | "daily" | "weekly";
|
|
14
|
+
scriptGate: string;
|
|
15
|
+
delivery: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PlaybookLearningOpportunity {
|
|
18
|
+
id: "protect-transient-failures" | "capture-successful-pattern" | "repair-low-success-pattern" | "multi-agent-verification-playbook" | "handoff-memory-playbook";
|
|
19
|
+
customerOutcome: string;
|
|
20
|
+
evidenceSignal: string;
|
|
21
|
+
guardrail: string;
|
|
22
|
+
recommendedArtifact: string;
|
|
23
|
+
}
|
|
24
|
+
export interface AmbientCustomerValue {
|
|
25
|
+
learnerPath: string;
|
|
26
|
+
outcomeCount: number;
|
|
27
|
+
successCount: number;
|
|
28
|
+
failureCount: number;
|
|
29
|
+
successRate: number | null;
|
|
30
|
+
totalCostUsd: number;
|
|
31
|
+
patternCount: number;
|
|
32
|
+
actionablePatternCount: number;
|
|
33
|
+
protectedTransientFailureCount: number;
|
|
34
|
+
automationOpportunities: AmbientAutomationOpportunity[];
|
|
35
|
+
playbookLearningOpportunities: PlaybookLearningOpportunity[];
|
|
36
|
+
collectionGaps: string[];
|
|
37
|
+
}
|
|
38
|
+
interface AmbientLearningSummary {
|
|
39
|
+
learnerPath: string;
|
|
40
|
+
outcomes: AmbientLearnerOutcome[];
|
|
41
|
+
patterns: AmbientLearnerPattern[];
|
|
42
|
+
collectionGaps: string[];
|
|
43
|
+
}
|
|
44
|
+
interface AmbientLearnerOutcome {
|
|
45
|
+
success: boolean;
|
|
46
|
+
failureReason?: string;
|
|
47
|
+
labels: string[];
|
|
48
|
+
repo?: string;
|
|
49
|
+
taskType?: string;
|
|
50
|
+
eventType?: string;
|
|
51
|
+
costUsd: number;
|
|
52
|
+
timestamp?: number;
|
|
53
|
+
}
|
|
54
|
+
interface AmbientLearnerPattern {
|
|
55
|
+
patternType: string;
|
|
56
|
+
key: string;
|
|
57
|
+
successRate: number;
|
|
58
|
+
sampleCount: number;
|
|
59
|
+
successCount: number;
|
|
60
|
+
transientFailureCount: number;
|
|
61
|
+
nonTransientFailureCount: number;
|
|
62
|
+
nonTransientSampleCount: number;
|
|
63
|
+
nonTransientSuccessRate: number | null;
|
|
64
|
+
}
|
|
65
|
+
export declare function flushAmbientLearnerForReport(env: RuntimeEnv, _learnerPath: string, flush: (env: RuntimeEnv) => Promise<AmbientLearnerFlushResult>): Promise<AmbientLearnerFlushResult>;
|
|
66
|
+
export declare function flushAmbientLearnerBeforeRead(env: RuntimeEnv): Promise<AmbientLearnerFlushResult>;
|
|
67
|
+
export declare function summarizeAmbientLearning(learnerPath: string, range: CustomerValueRange, flushResult?: AmbientLearnerFlushResult, requestedLearnerPath?: string): Promise<AmbientLearningSummary>;
|
|
68
|
+
export declare function buildAmbientCustomerValue(input: {
|
|
69
|
+
learning: AmbientLearningSummary;
|
|
70
|
+
multiAgent: MultiAgentValue;
|
|
71
|
+
trustCards: TrustCard[];
|
|
72
|
+
handoffs: CustomerValueReport["handoffs"];
|
|
73
|
+
}): AmbientCustomerValue;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=ambient-learning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambient-learning.d.ts","sourceRoot":"","sources":["../../src/customer-value/ambient-learning.ts"],"names":[],"mappings":"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"}
|