create-windy 0.6.12 → 0.6.14
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/cli.js +572 -269
- package/package.json +1 -1
- package/template/.agents/skills/windy-business-module/SKILL.md +98 -70
- package/template/.windy-template.json +3 -3
- package/template/AGENTS.md +3 -6
- package/template/apps/agent-server/Dockerfile +2 -3
- package/template/apps/agent-server/README.md +38 -54
- package/template/apps/agent-server/pyproject.toml +0 -1
- package/template/apps/agent-server/src/southwind_agent_server/app.py +4 -2
- package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +191 -0
- package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +203 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +61 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +82 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +121 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +158 -0
- package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +24 -0
- package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +71 -0
- package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +307 -0
- package/template/apps/agent-server/src/southwind_agent_server/contracts.py +39 -0
- package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/engine.py +9 -1
- package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +15 -0
- package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +37 -3
- package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +46 -26
- package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +32 -0
- package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +7 -0
- package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +5 -2
- package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +1 -0
- package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +6 -1
- package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +3 -2
- package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +1 -0
- package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +21 -0
- package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +2 -1
- package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +1 -0
- package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +7 -1
- package/template/apps/agent-server/src/southwind_agent_server/report_store.py +10 -56
- package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +75 -0
- package/template/apps/agent-server/src/southwind_agent_server/report_types.py +9 -2
- package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +74 -0
- package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +11 -3
- package/template/apps/agent-server/src/southwind_agent_server/service.py +41 -65
- package/template/apps/agent-server/src/southwind_agent_server/service_control.py +64 -0
- package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +3 -0
- package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +9 -1
- package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +6 -5
- package/template/apps/agent-server/src/southwind_agent_server/store.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +137 -0
- package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +58 -0
- package/template/apps/agent-server/tests/test_api.py +30 -11
- package/template/apps/agent-server/tests/test_client_completion.py +230 -0
- package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +12 -24
- package/template/apps/agent-server/tests/test_report_resilience.py +2 -0
- package/template/apps/agent-server/tests/test_report_routes.py +58 -1
- package/template/apps/agent-server/tests/test_report_summary_parity.py +1 -0
- package/template/apps/agent-server/tests/test_run_capacity.py +2 -0
- package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +18 -3
- package/template/apps/agent-server/tests/test_trajectory.py +91 -0
- package/template/apps/agent-server/uv.lock +0 -259
- package/template/apps/server/Dockerfile +9 -4
- package/template/apps/server/src/agent/actor-projection-audit.ts +6 -0
- package/template/apps/server/src/agent/agent-run-delegation-policy.ts +115 -0
- package/template/apps/server/src/agent/agent-session-bootstrap.ts +23 -0
- package/template/apps/server/src/agent/{debug-session-facade-provider-failure.test.ts → agent-session-facade-provider-failure.test.ts} +24 -33
- package/template/apps/server/src/agent/{debug-session-facade.test.ts → agent-session-facade.test.ts} +34 -45
- package/template/apps/server/src/agent/{debug-session-facade.ts → agent-session-facade.ts} +50 -57
- package/template/apps/server/src/agent/{debug-session-id.test.ts → agent-session-id.test.ts} +5 -5
- package/template/apps/server/src/agent/{debug-session-id.ts → agent-session-id.ts} +7 -7
- package/template/apps/server/src/agent/{debug-session-provider-reader.ts → agent-session-provider-reader.ts} +18 -15
- package/template/apps/server/src/agent/{debug-session-routes.test.ts → agent-session-routes.test.ts} +16 -16
- package/template/apps/server/src/agent/{debug-session-routes.ts → agent-session-routes.ts} +12 -12
- package/template/apps/server/src/agent/{debug-session-validation.ts → agent-session-validation.ts} +13 -11
- package/template/apps/server/src/agent/client-session/authorization.ts +47 -0
- package/template/apps/server/src/agent/client-session/bootstrap.ts +96 -0
- package/template/apps/server/src/agent/client-session/capabilities.ts +19 -0
- package/template/apps/server/src/agent/client-session/completion.ts +299 -0
- package/template/apps/server/src/agent/client-session/contracts.ts +136 -0
- package/template/apps/server/src/agent/client-session/digest.ts +39 -0
- package/template/apps/server/src/agent/client-session/drizzle-repository.integration.test.ts +170 -0
- package/template/apps/server/src/agent/client-session/drizzle-repository.ts +345 -0
- package/template/apps/server/src/agent/client-session/errors.ts +28 -0
- package/template/apps/server/src/agent/client-session/fixtures/page-agent-1.12.2-request.json +52 -0
- package/template/apps/server/src/agent/client-session/host-auth.test.ts +144 -0
- package/template/apps/server/src/agent/client-session/host-auth.ts +110 -0
- package/template/apps/server/src/agent/client-session/manifest-admission.ts +240 -0
- package/template/apps/server/src/agent/client-session/openai-stream.ts +123 -0
- package/template/apps/server/src/agent/client-session/presentation.ts +46 -0
- package/template/apps/server/src/agent/client-session/remote-provider.test.ts +144 -0
- package/template/apps/server/src/agent/client-session/remote-provider.ts +216 -0
- package/template/apps/server/src/agent/client-session/repository.ts +225 -0
- package/template/apps/server/src/agent/client-session/request.test.ts +69 -0
- package/template/apps/server/src/agent/client-session/request.ts +289 -0
- package/template/apps/server/src/agent/client-session/revocation.ts +23 -0
- package/template/apps/server/src/agent/client-session/routes.ts +315 -0
- package/template/apps/server/src/agent/client-session/runtime-audit.ts +42 -0
- package/template/apps/server/src/agent/client-session/service.test-support.ts +226 -0
- package/template/apps/server/src/agent/client-session/service.test.ts +268 -0
- package/template/apps/server/src/agent/client-session/service.ts +346 -0
- package/template/apps/server/src/agent/context-memory/attempt-context-contracts.ts +60 -0
- package/template/apps/server/src/agent/context-memory/authoritative-source-registry.ts +127 -0
- package/template/apps/server/src/agent/context-memory/context-builder.test.ts +160 -0
- package/template/apps/server/src/agent/context-memory/context-builder.ts +184 -0
- package/template/apps/server/src/agent/context-memory/contracts.ts +284 -0
- package/template/apps/server/src/agent/context-memory/digest.ts +22 -0
- package/template/apps/server/src/agent/context-memory/memory-authorization.ts +82 -0
- package/template/apps/server/src/agent/context-memory/memory-content.ts +69 -0
- package/template/apps/server/src/agent/context-memory/memory-object-registry.ts +87 -0
- package/template/apps/server/src/agent/context-memory/memory-projector-contracts.ts +121 -0
- package/template/apps/server/src/agent/context-memory/memory-projector-validation.ts +155 -0
- package/template/apps/server/src/agent/context-memory/memory-projector.test.ts +19 -0
- package/template/apps/server/src/agent/context-memory/memory-projector.ts +259 -0
- package/template/apps/server/src/agent/context-memory/memory-retrieval-policy.ts +195 -0
- package/template/apps/server/src/agent/context-memory/memory-retriever.test.ts +339 -0
- package/template/apps/server/src/agent/context-memory/memory-retriever.ts +184 -0
- package/template/apps/server/src/agent/context-memory/search-provider-port.test.ts +62 -0
- package/template/apps/server/src/agent/context-memory/search-provider-port.ts +75 -0
- package/template/apps/server/src/agent/context-memory/working-context-expiry.ts +95 -0
- package/template/apps/server/src/agent/context-message-recovery.ts +23 -0
- package/template/apps/server/src/agent/context-version-routes.ts +241 -0
- package/template/apps/server/src/agent/context-version-runtime.ts +332 -0
- package/template/apps/server/src/agent/context-version-support.ts +93 -0
- package/template/apps/server/src/agent/context-version-validation.ts +118 -0
- package/template/apps/server/src/agent/drizzle-run-binding-repository.ts +11 -0
- package/template/apps/server/src/agent/idempotency-key.ts +9 -1
- package/template/apps/server/src/agent/memory-runtime-adapters.ts +266 -0
- package/template/apps/server/src/agent/memory-scope-binding.ts +14 -0
- package/template/apps/server/src/agent/module-ai-port-factory.ts +41 -0
- package/template/apps/server/src/agent/provider-input-governance.ts +19 -0
- package/template/apps/server/src/agent/remote-runtime-response.ts +162 -0
- package/template/apps/server/src/agent/remote-runtime.ts +53 -153
- package/template/apps/server/src/agent/run-audit.ts +2 -2
- package/template/apps/server/src/agent/run-authorization.test.ts +27 -0
- package/template/apps/server/src/agent/run-authorization.ts +60 -1
- package/template/apps/server/src/agent/run-binding-repository.ts +9 -0
- package/template/apps/server/src/agent/run-browser-authorization.ts +79 -0
- package/template/apps/server/src/agent/run-contracts.ts +23 -0
- package/template/apps/server/src/agent/run-facade.ts +139 -139
- package/template/apps/server/src/agent/run-failure-cleanup.ts +58 -0
- package/template/apps/server/src/agent/run-operation-policy.ts +20 -0
- package/template/apps/server/src/agent/run-route-input.ts +19 -1
- package/template/apps/server/src/agent/run-routes.ts +133 -5
- package/template/apps/server/src/agent/run-runtime-request.ts +89 -0
- package/template/apps/server/src/agent/run-session-authorization.ts +95 -0
- package/template/apps/server/src/agent/run-start-preparation.ts +71 -0
- package/template/apps/server/src/agent/runtime-bootstrap-input.ts +42 -0
- package/template/apps/server/src/agent/runtime-bootstrap-report.test.ts +53 -1
- package/template/apps/server/src/agent/runtime-bootstrap.ts +114 -111
- package/template/apps/server/src/agent/runtime-tool-composition.ts +38 -0
- package/template/apps/server/src/agent/session-context-source-support.ts +38 -0
- package/template/apps/server/src/agent/session-context-source.ts +346 -0
- package/template/apps/server/src/agent/session-invalidation/contracts.ts +217 -0
- package/template/apps/server/src/agent/session-invalidation/dispatcher.contract.test.ts +333 -0
- package/template/apps/server/src/agent/session-invalidation/dispatcher.ts +205 -0
- package/template/apps/server/src/agent/session-invalidation/module-authoritative-producer.test.ts +127 -0
- package/template/apps/server/src/agent/session-invalidation/module-authoritative-producer.ts +202 -0
- package/template/apps/server/src/agent/session-invalidation/read-guard.ts +39 -0
- package/template/apps/server/src/agent/session-invalidation/runtime.ts +69 -0
- package/template/apps/server/src/agent/session-invalidation/test-envelopes.ts +24 -0
- package/template/apps/server/src/agent/session-invalidation/worker.contract.test.ts +135 -0
- package/template/apps/server/src/agent/session-invalidation/worker.ts +76 -0
- package/template/apps/server/src/agent/session-log/checkpoint-digest.ts +36 -0
- package/template/apps/server/src/agent/session-log/domain.ts +123 -0
- package/template/apps/server/src/agent/session-log/events.ts +229 -0
- package/template/apps/server/src/agent/session-log/history.ts +143 -0
- package/template/apps/server/src/agent/session-log/in-memory-repository.ts +340 -0
- package/template/apps/server/src/agent/session-log/lifecycle.ts +67 -0
- package/template/apps/server/src/agent/session-log/replay-policy.ts +76 -0
- package/template/apps/server/src/agent/session-log/repository.ts +103 -0
- package/template/apps/server/src/agent/session-log/service.ts +349 -0
- package/template/apps/server/src/agent/session-log/session-log.test.ts +282 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-context-memory.ts +348 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-governed-context.ts +328 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-invalidation-outbox.ts +260 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-memory-projection-deletion.ts +56 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-run-projection-receipt.ts +80 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-fork.ts +147 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-list.ts +24 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-mapping.ts +154 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-mutations.ts +64 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-repository.ts +335 -0
- package/template/apps/server/src/agent/session-persistence/invalidation-projections.ts +229 -0
- package/template/apps/server/src/agent/session-persistence/payload-codec.ts +90 -0
- package/template/apps/server/src/agent/session-projection-access.ts +155 -0
- package/template/apps/server/src/agent/session-projection-bootstrap.ts +87 -0
- package/template/apps/server/src/agent/session-projection-errors.ts +22 -0
- package/template/apps/server/src/agent/session-projection-facade.ts +349 -0
- package/template/apps/server/src/agent/session-projection-routes.ts +215 -0
- package/template/apps/server/src/agent/session-projection-view.ts +137 -0
- package/template/apps/server/src/agent/session-result-memory.ts +228 -0
- package/template/apps/server/src/agent/session-run-lifecycle.ts +85 -0
- package/template/apps/server/src/agent/session-run-link-contracts.ts +56 -0
- package/template/apps/server/src/agent/session-run-link.ts +343 -0
- package/template/apps/server/src/agent/session-run-recovery.ts +16 -0
- package/template/apps/server/src/agent/session-runtime-composition.ts +265 -0
- package/template/apps/server/src/agent/session-source-chain-authorizer.ts +141 -0
- package/template/apps/server/src/agent/session-terminal-reconciler.ts +100 -0
- package/template/apps/server/src/agent/session-turn-state.ts +49 -0
- package/template/apps/server/src/agent/tool-audit.ts +3 -3
- package/template/apps/server/src/agent/tool-execution-receipt.ts +13 -0
- package/template/apps/server/src/agent/tool-host.ts +41 -4
- package/template/apps/server/src/agent/tool-registry-composition.ts +52 -0
- package/template/apps/server/src/agent/tool-registry.test.ts +5 -5
- package/template/apps/server/src/agent/tool-registry.ts +53 -59
- package/template/apps/server/src/agent/unavailable-routes.ts +49 -5
- package/template/apps/server/src/agent/workflow-durable-runtime-input.ts +32 -0
- package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +59 -0
- package/template/apps/server/src/agent-workflow/adapter-dispatch.ts +148 -0
- package/template/apps/server/src/agent-workflow/approval-node-adapter.ts +77 -0
- package/template/apps/server/src/agent-workflow/artifact-access-error.ts +9 -0
- package/template/apps/server/src/agent-workflow/artifact-node-adapter.ts +67 -0
- package/template/apps/server/src/agent-workflow/artifact-policy.ts +71 -0
- package/template/apps/server/src/agent-workflow/artifact-source-authorization.ts +85 -0
- package/template/apps/server/src/agent-workflow/authorization.ts +238 -0
- package/template/apps/server/src/agent-workflow/budget-ledger.ts +118 -0
- package/template/apps/server/src/agent-workflow/budget-validation.ts +305 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-binding.ts +17 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-evidence.ts +142 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-port.ts +304 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-remote.ts +64 -0
- package/template/apps/server/src/agent-workflow/canonical-json.ts +16 -0
- package/template/apps/server/src/agent-workflow/command-drive.ts +195 -0
- package/template/apps/server/src/agent-workflow/command-error.ts +9 -0
- package/template/apps/server/src/agent-workflow/command-facade.ts +290 -0
- package/template/apps/server/src/agent-workflow/command-input.ts +133 -0
- package/template/apps/server/src/agent-workflow/condition-node-adapter.ts +69 -0
- package/template/apps/server/src/agent-workflow/definition-budget-validation.ts +41 -0
- package/template/apps/server/src/agent-workflow/definition-node-validation.ts +197 -0
- package/template/apps/server/src/agent-workflow/definition-validation.ts +198 -0
- package/template/apps/server/src/agent-workflow/delegated-tool-authorization.ts +15 -0
- package/template/apps/server/src/agent-workflow/delegation-child-delivery.ts +129 -0
- package/template/apps/server/src/agent-workflow/delegation-execution-authorization.ts +218 -0
- package/template/apps/server/src/agent-workflow/delegation-policy-validation.ts +253 -0
- package/template/apps/server/src/agent-workflow/delegation-policy.ts +179 -0
- package/template/apps/server/src/agent-workflow/drizzle-artifact-port.ts +211 -0
- package/template/apps/server/src/agent-workflow/drizzle-artifact-support.ts +152 -0
- package/template/apps/server/src/agent-workflow/drizzle-budget-ledger-settlement.ts +271 -0
- package/template/apps/server/src/agent-workflow/drizzle-budget-ledger-support.ts +226 -0
- package/template/apps/server/src/agent-workflow/drizzle-budget-ledger.ts +189 -0
- package/template/apps/server/src/agent-workflow/drizzle-cancellation-reconcile.ts +177 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegated-tool-authorization.ts +155 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegation-completion.ts +84 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegation-lifecycle.ts +139 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegation-port.ts +288 -0
- package/template/apps/server/src/agent-workflow/drizzle-effect-command-fence.ts +333 -0
- package/template/apps/server/src/agent-workflow/drizzle-evaluation-repository.ts +214 -0
- package/template/apps/server/src/agent-workflow/drizzle-event-validation.ts +43 -0
- package/template/apps/server/src/agent-workflow/drizzle-recovery-admission.ts +115 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository-lineage.ts +103 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository-mappers.ts +317 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository-write.ts +311 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository.ts +285 -0
- package/template/apps/server/src/agent-workflow/drizzle-side-effect-repository.ts +83 -0
- package/template/apps/server/src/agent-workflow/drizzle-write-support.ts +101 -0
- package/template/apps/server/src/agent-workflow/durable-continuation-authorization.ts +109 -0
- package/template/apps/server/src/agent-workflow/durable-continuation-driver.ts +97 -0
- package/template/apps/server/src/agent-workflow/durable-continuation-runtime.ts +173 -0
- package/template/apps/server/src/agent-workflow/durable-job-node-adapter.ts +106 -0
- package/template/apps/server/src/agent-workflow/effect-command-fence.ts +250 -0
- package/template/apps/server/src/agent-workflow/evaluation-evidence-coordinates.ts +225 -0
- package/template/apps/server/src/agent-workflow/evaluation-evidence-metrics.ts +280 -0
- package/template/apps/server/src/agent-workflow/evaluation-evidence-reader.ts +326 -0
- package/template/apps/server/src/agent-workflow/evaluation-metrics-validation.ts +85 -0
- package/template/apps/server/src/agent-workflow/evaluation-projection.ts +70 -0
- package/template/apps/server/src/agent-workflow/evaluation-repository.ts +134 -0
- package/template/apps/server/src/agent-workflow/evaluation-service.ts +292 -0
- package/template/apps/server/src/agent-workflow/evaluation-tool-registration.ts +95 -0
- package/template/apps/server/src/agent-workflow/evaluation-validation.ts +331 -0
- package/template/apps/server/src/agent-workflow/event-validation.ts +277 -0
- package/template/apps/server/src/agent-workflow/governed-tool-schema.ts +55 -0
- package/template/apps/server/src/agent-workflow/in-memory-evaluation-repository.ts +123 -0
- package/template/apps/server/src/agent-workflow/in-memory-mutation-validation.ts +154 -0
- package/template/apps/server/src/agent-workflow/in-memory-repository-support.ts +277 -0
- package/template/apps/server/src/agent-workflow/in-memory-repository.ts +339 -0
- package/template/apps/server/src/agent-workflow/in-memory-side-effect-store.ts +78 -0
- package/template/apps/server/src/agent-workflow/input-receipt.ts +55 -0
- package/template/apps/server/src/agent-workflow/model-node-adapter.ts +86 -0
- package/template/apps/server/src/agent-workflow/model-pricing-catalog.ts +215 -0
- package/template/apps/server/src/agent-workflow/node-adapter-factory.ts +83 -0
- package/template/apps/server/src/agent-workflow/node-adapters.ts +50 -0
- package/template/apps/server/src/agent-workflow/node-execution-ports.ts +185 -0
- package/template/apps/server/src/agent-workflow/node-input-receipt-port.ts +42 -0
- package/template/apps/server/src/agent-workflow/node-result-receipt.ts +50 -0
- package/template/apps/server/src/agent-workflow/platform-node-adapter-support.ts +185 -0
- package/template/apps/server/src/agent-workflow/platform-node-adapters.ts +256 -0
- package/template/apps/server/src/agent-workflow/platform-node-approval.ts +146 -0
- package/template/apps/server/src/agent-workflow/platform-node-direct-adapters.ts +65 -0
- package/template/apps/server/src/agent-workflow/production-delegation-scope.ts +58 -0
- package/template/apps/server/src/agent-workflow/production-node-policies.ts +62 -0
- package/template/apps/server/src/agent-workflow/query-service.ts +198 -0
- package/template/apps/server/src/agent-workflow/release.ts +96 -0
- package/template/apps/server/src/agent-workflow/repository.ts +157 -0
- package/template/apps/server/src/agent-workflow/routes.ts +307 -0
- package/template/apps/server/src/agent-workflow/runtime-composition.ts +308 -0
- package/template/apps/server/src/agent-workflow/scheduler-cancellation-reconcile.ts +253 -0
- package/template/apps/server/src/agent-workflow/scheduler-cancellation-support.ts +145 -0
- package/template/apps/server/src/agent-workflow/scheduler-cancellation.ts +2 -0
- package/template/apps/server/src/agent-workflow/scheduler-context.ts +85 -0
- package/template/apps/server/src/agent-workflow/scheduler-deadline.ts +65 -0
- package/template/apps/server/src/agent-workflow/scheduler-effect-result.ts +205 -0
- package/template/apps/server/src/agent-workflow/scheduler-execution-convergence.ts +174 -0
- package/template/apps/server/src/agent-workflow/scheduler-execution.ts +211 -0
- package/template/apps/server/src/agent-workflow/scheduler-failure.ts +102 -0
- package/template/apps/server/src/agent-workflow/scheduler-join-cancellation.ts +282 -0
- package/template/apps/server/src/agent-workflow/scheduler-mutation-queue.ts +13 -0
- package/template/apps/server/src/agent-workflow/scheduler-node-timeout.ts +139 -0
- package/template/apps/server/src/agent-workflow/scheduler-parallel-dispatch.ts +99 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-activation.ts +63 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-budget.ts +41 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-effect.ts +331 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-event-time.ts +26 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-failed-policy.ts +129 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-node.ts +208 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-policy-convergence.ts +140 -0
- package/template/apps/server/src/agent-workflow/scheduler-reservation-convergence.ts +40 -0
- package/template/apps/server/src/agent-workflow/scheduler-side-effect-execution.ts +249 -0
- package/template/apps/server/src/agent-workflow/scheduler-support.ts +235 -0
- package/template/apps/server/src/agent-workflow/scheduler-workflow-cancellation.ts +296 -0
- package/template/apps/server/src/agent-workflow/scheduler.ts +289 -0
- package/template/apps/server/src/agent-workflow/service-completion.ts +102 -0
- package/template/apps/server/src/agent-workflow/service-mutation-identity.ts +94 -0
- package/template/apps/server/src/agent-workflow/service-node-admission.ts +36 -0
- package/template/apps/server/src/agent-workflow/service-node-run-update.ts +55 -0
- package/template/apps/server/src/agent-workflow/service-recovery-events.ts +38 -0
- package/template/apps/server/src/agent-workflow/service-recovery.ts +264 -0
- package/template/apps/server/src/agent-workflow/service-retry.ts +86 -0
- package/template/apps/server/src/agent-workflow/service-run-command.ts +131 -0
- package/template/apps/server/src/agent-workflow/service-state-error.ts +21 -0
- package/template/apps/server/src/agent-workflow/service-state-invariants.ts +44 -0
- package/template/apps/server/src/agent-workflow/service-support.ts +152 -0
- package/template/apps/server/src/agent-workflow/service.ts +307 -0
- package/template/apps/server/src/agent-workflow/side-effect-state.ts +226 -0
- package/template/apps/server/src/agent-workflow/state-machine.ts +321 -0
- package/template/apps/server/src/agent-workflow/subagent-node-adapter.ts +229 -0
- package/template/apps/server/src/agent-workflow/tool-node-adapter.ts +259 -0
- package/template/apps/server/src/agent-workflow/usage.ts +149 -0
- package/template/apps/server/src/agent-workflow/wait-signal-service.ts +147 -0
- package/template/apps/server/src/agent-workflow/workflow-artifact-token.ts +109 -0
- package/template/apps/server/src/agent-workflow/workflow-value-validation.ts +101 -0
- package/template/apps/server/src/agent-workflow/workspace-policy.ts +109 -0
- package/template/apps/server/src/ai-runtime-report/remote-parser.ts +41 -0
- package/template/apps/server/src/ai-runtime-report/service.test.ts +2 -0
- package/template/apps/server/src/app/agent-runtime-composition.ts +38 -0
- package/template/apps/server/src/app/client-agent-host-auth-binding.ts +10 -0
- package/template/apps/server/src/auth/actor-resolver.test.ts +33 -0
- package/template/apps/server/src/auth/actor-resolver.ts +6 -1
- package/template/apps/server/src/auth/composition.ts +36 -0
- package/template/apps/server/src/auth/routes.test-support.ts +2 -0
- package/template/apps/server/src/auth/routes.test.ts +18 -0
- package/template/apps/server/src/auth/runtime.ts +2 -0
- package/template/apps/server/src/auth/service-options.ts +16 -0
- package/template/apps/server/src/auth/service.ts +7 -12
- package/template/apps/server/src/index.ts +35 -37
- package/template/apps/server/src/license/pairing-service.test.ts +1 -1
- package/template/apps/server/src/module-host/agent-session-memory-port.ts +91 -0
- package/template/apps/server/src/module-host/{debug-session-provider-registration.test.ts → agent-session-provider-registration.test.ts} +42 -17
- package/template/apps/server/src/module-host/{debug-session-provider-registration.ts → agent-session-provider-registration.ts} +18 -18
- package/template/apps/server/src/module-host/agent-source-invalidation-port.ts +53 -0
- package/template/apps/server/src/module-host/http-runtime.ts +14 -0
- package/template/apps/server/src/module-host/initialize-contracts.ts +4 -5
- package/template/apps/server/src/module-host/initialize.ts +4 -4
- package/template/apps/server/src/module-host/request-context.test.ts +5 -5
- package/template/apps/server/src/module-host/request-context.ts +8 -0
- package/template/apps/server/src/module-host/route-install-context.ts +65 -0
- package/template/apps/server/src/module-host/route-installer.ts +11 -56
- package/template/apps/server/src/module-host/scoped-host.ts +17 -12
- package/template/apps/server/src/module-host/storage-authorization-binding.test.ts +3 -3
- package/template/apps/server/src/module-host.ts +3 -5
- package/template/apps/server/src/runtime.ts +3 -36
- package/template/apps/server/src/storage/routes-stream-cancellation.test.ts +19 -0
- package/template/apps/server/src/storage/routes.ts +3 -1
- package/template/apps/server/src/system/actor.ts +15 -2
- package/template/apps/server/src/system/authorization-invalidation-bridge.ts +30 -0
- package/template/apps/server/src/system/authorization-invalidation-composition.ts +36 -0
- package/template/apps/server/src/system/drizzle-system.ts +8 -1
- package/template/apps/server/src/system/identity-route-config.ts +9 -1
- package/template/apps/server/src/system/routes.ts +3 -0
- package/template/apps/server/src/system/seed.ts +3 -0
- package/template/apps/server/src/system/user-account-policy.ts +91 -0
- package/template/apps/web/package.json +1 -0
- package/template/apps/web/src/layout/AppSidebar.vue +2 -0
- package/template/apps/web/src/pages/system/AgentSessionPage.vue +73 -0
- package/template/apps/web/src/pages/system/AgentSessionPage.webtest.ts +66 -0
- package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +69 -0
- package/template/apps/web/src/pages/system/components/agent-session/AgentSessionDetail.vue +114 -0
- package/template/apps/web/src/pages/system/components/agent-session/AgentSessionList.vue +84 -0
- package/template/apps/web/src/pages/system/components/agent-session/ContextVersionPanel.vue +119 -0
- package/template/apps/web/src/pages/system/components/agent-session/ContextVersionPanel.webtest.ts +46 -0
- package/template/apps/web/src/pages/system/components/agent-session/MemoryProjectionPanel.vue +163 -0
- package/template/apps/web/src/pages/system/components/agent-session/MemoryProjectionPanel.webtest.ts +62 -0
- package/template/apps/web/src/pages/system/components/agent-session/SessionTimeline.vue +71 -0
- package/template/apps/web/src/pages/system/components/agent-session/SessionTimeline.webtest.ts +34 -0
- package/template/apps/web/src/pages/system/components/agent-session/agent-session-presenter.ts +56 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowNodeCard.vue +39 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowNodeDetail.vue +172 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunDetail.vue +151 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunGraph.vue +96 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunList.vue +100 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunSummary.vue +148 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/agent-workflow-presenter.ts +74 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/workflow-graph-layout.ts +108 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunDetailDialog.vue +9 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunDetailDialog.webtest.ts +22 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunTable.webtest.ts +2 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeTrajectory.vue +118 -0
- package/template/apps/web/src/pages/system/composables/useAgentSessions.ts +209 -0
- package/template/apps/web/src/pages/system/composables/useAgentSessions.webtest.ts +138 -0
- package/template/apps/web/src/pages/system/composables/useAgentWorkflowRuns.ts +173 -0
- package/template/apps/web/src/router/index.ts +4 -0
- package/template/apps/web/src/router/platform-admin-route-bindings.ts +6 -0
- package/template/apps/web/src/services/agent-session-api.ts +159 -0
- package/template/apps/web/src/services/agent-session-api.webtest.ts +65 -0
- package/template/apps/web/src/services/agent-workflow-api.ts +181 -0
- package/template/apps/web/src/services/ai-runtime-api.ts +4 -0
- package/template/docker-compose.yml +11 -8
- package/template/docs/adr/0003-agent-session-event-source.md +3 -0
- package/template/docs/architecture/agent-harness.md +464 -0
- package/template/docs/architecture/agent-workflow.md +99 -0
- package/template/docs/architecture/ai-runtime.md +55 -47
- package/template/docs/architecture/module-host.md +4 -3
- package/template/docs/operations/adk-retirement.md +98 -0
- package/template/docs/operations/agent-session-memory.md +162 -0
- package/template/docs/operations/agent-session-troubleshooting.md +196 -0
- package/template/docs/operations/agent-workflow-recovery.md +74 -0
- package/template/docs/operations/incremental-delivery.md +1 -1
- package/template/docs/platform/agent-production-store.md +82 -0
- package/template/docs/platform/agent-run-reattachment.md +52 -0
- package/template/docs/platform/agent-runtime-observability.md +4 -3
- package/template/docs/platform/agent-runtime.md +116 -281
- package/template/docs/platform/agent-tool-approval.md +61 -0
- package/template/docs/platform/background-ai-operations.md +50 -0
- package/template/docs/platform/client-agent-session.md +173 -0
- package/template/docs/platform/embedding-ai-runtime.md +94 -0
- package/template/docs/platform/platform-authentication.md +5 -8
- package/template/package.json +0 -1
- package/template/packages/ai-client/index.ts +1 -0
- package/template/packages/ai-client/package.json +2 -1
- package/template/packages/ai-client/src/agent/client/client.ts +15 -2
- package/template/packages/ai-client/src/agent/client/run-protocol.test.ts +39 -25
- package/template/packages/ai-client/src/agent/client/types.ts +4 -0
- package/template/packages/ai-client/src/agent/contracts/contracts.test.ts +49 -7
- package/template/packages/ai-client/src/agent/contracts/events.ts +61 -0
- package/template/packages/ai-client/src/agent/contracts/runs.ts +1 -0
- package/template/packages/ai-client/src/client-agent/contracts.ts +131 -0
- package/template/packages/ai-client/src/client-agent/http.test.ts +60 -0
- package/template/packages/ai-client/src/client-agent/http.ts +66 -0
- package/template/packages/ai-client/src/client-agent/index.ts +3 -0
- package/template/packages/ai-client/src/client-agent/validation.test.ts +57 -0
- package/template/packages/ai-client/src/client-agent/validation.ts +152 -0
- package/template/packages/config/index.test.ts +18 -0
- package/template/packages/config/package.json +1 -1
- package/template/packages/config/src/platform-validation.ts +8 -0
- package/template/packages/config/src/platform.ts +22 -9
- package/template/packages/database/drizzle/0055_square_yellowjacket.sql +47 -0
- package/template/packages/database/drizzle/0056_tricky_living_mummy.sql +2 -0
- package/template/packages/database/drizzle/0057_mature_doomsday.sql +4 -0
- package/template/packages/database/drizzle/0058_agent_session_memory.sql +159 -0
- package/template/packages/database/drizzle/0059_agent_source_module_key.sql +16 -0
- package/template/packages/database/drizzle/0060_slimy_rocket_raccoon.sql +43 -0
- package/template/packages/database/drizzle/0061_agent_workflow.sql +303 -0
- package/template/packages/database/drizzle/meta/0055_snapshot.json +11071 -0
- package/template/packages/database/drizzle/meta/0056_snapshot.json +11098 -0
- package/template/packages/database/drizzle/meta/0057_snapshot.json +10878 -0
- package/template/packages/database/drizzle/meta/0058_snapshot.json +12294 -0
- package/template/packages/database/drizzle/meta/0059_snapshot.json +12344 -0
- package/template/packages/database/drizzle/meta/0060_snapshot.json +12326 -0
- package/template/packages/database/drizzle/meta/0061_snapshot.json +14395 -0
- package/template/packages/database/drizzle/meta/_journal.json +49 -0
- package/template/packages/database/package.json +1 -1
- package/template/packages/database/src/agent-runtime-schema.test.ts +26 -0
- package/template/packages/database/src/schema/agent-context-message.ts +38 -0
- package/template/packages/database/src/schema/agent-runtime.ts +7 -0
- package/template/packages/database/src/schema/agent-session-receipt.ts +36 -0
- package/template/packages/database/src/schema/agent-session.ts +344 -0
- package/template/packages/database/src/schema/agent-workflow-delegation.ts +126 -0
- package/template/packages/database/src/schema/agent-workflow-effects.ts +213 -0
- package/template/packages/database/src/schema/agent-workflow-evaluation.ts +67 -0
- package/template/packages/database/src/schema/agent-workflow.ts +270 -0
- package/template/packages/database/src/schema/client-agent.ts +95 -0
- package/template/packages/database/src/schema/index.ts +8 -0
- package/template/packages/jobs/package.json +1 -1
- package/template/packages/modules/index.ts +2 -0
- package/template/packages/modules/package.json +1 -1
- package/template/packages/modules/src/ai-client-execution-composition.test.ts +98 -0
- package/template/packages/modules/src/ai-client-execution-policy.ts +54 -0
- package/template/packages/modules/src/ai-operation-composition.ts +2 -0
- package/template/packages/modules/src/manifest.ts +15 -0
- package/template/packages/modules/src/system-admin-routes.ts +16 -0
- package/template/packages/modules/src/system-admin-ui-catalog.ts +4 -1
- package/template/packages/modules/src/system-agent-audit-actions.ts +26 -0
- package/template/packages/modules/src/system-ai-api-bindings.ts +262 -0
- package/template/packages/modules/src/system-api-control-plane.ts +4 -78
- package/template/packages/modules/src/system-audit-actions.ts +113 -0
- package/template/packages/modules/src/system-features.ts +17 -0
- package/template/packages/modules/src/system-module-catalog.ts +21 -11
- package/template/packages/modules/src/system-modules.ts +22 -0
- package/template/packages/modules/src/system-permissions.ts +8 -0
- package/template/packages/server-sdk/index.ts +43 -0
- package/template/packages/server-sdk/package.json +5 -1
- package/template/packages/server-sdk/src/agent-session-memory-port.ts +64 -0
- package/template/packages/server-sdk/src/agent-session-provider.ts +63 -0
- package/template/packages/server-sdk/src/agent-source-invalidation-port.ts +54 -0
- package/template/packages/server-sdk/src/ai-operation-registration.ts +2 -0
- package/template/packages/server-sdk/src/client-agent-session.ts +95 -0
- package/template/packages/server-sdk/src/debug-session-provider.ts +14 -63
- package/template/packages/server-sdk/src/module-host.ts +7 -3
- package/template/packages/server-sdk/src/request-context.ts +6 -0
- package/template/packages/shared/index.ts +3 -0
- package/template/packages/shared/package.json +1 -1
- package/template/packages/shared/src/agent-workflow-definition.ts +113 -0
- package/template/packages/shared/src/agent-workflow-delegation.ts +123 -0
- package/template/packages/shared/src/agent-workflow-evaluation.ts +159 -0
- package/template/packages/shared/src/agent-workflow-events.ts +99 -0
- package/template/packages/shared/src/agent-workflow-run.ts +259 -0
- package/template/packages/shared/src/agent-workflow.ts +3 -0
- package/template/packages/shared/src/ai-runtime-report.ts +25 -0
- package/template/packages/shared/src/rbac.ts +24 -0
- package/template/packages/storage/package.json +1 -1
- package/template/packages/storage/src/upload-streams.test.ts +31 -0
- package/template/packages/storage/src/upload-streams.ts +20 -6
- package/template/apps/agent-server/adk_web_agents/__init__.py +0 -1
- package/template/apps/agent-server/adk_web_agents/canonical_debug/__init__.py +0 -1
- package/template/apps/agent-server/adk_web_agents/canonical_debug/agent.py +0 -145
- package/template/apps/agent-server/adk_web_agents/safe_debug/__init__.py +0 -3
- package/template/apps/agent-server/adk_web_agents/safe_debug/agent.py +0 -40
- package/template/apps/agent-server/adk_web_agents/services.py +0 -25
- package/template/apps/agent-server/project/adk-web-debug.json +0 -4
- package/template/apps/agent-server/src/southwind_agent_server/adk_adapter.py +0 -333
- package/template/apps/agent-server/src/southwind_agent_server/adk_debug.py +0 -348
- package/template/apps/agent-server/src/southwind_agent_server/adk_debug_sessions.py +0 -325
- package/template/apps/agent-server/src/southwind_agent_server/adk_failure.py +0 -13
- package/template/apps/agent-server/src/southwind_agent_server/adk_model.py +0 -304
- package/template/apps/agent-server/src/southwind_agent_server/adk_tools.py +0 -143
- package/template/apps/agent-server/tests/test_adk_adapter.py +0 -307
- package/template/apps/agent-server/tests/test_adk_debug_result_polling.py +0 -139
- package/template/apps/agent-server/tests/test_adk_debug_sessions.py +0 -215
- package/template/apps/agent-server/tests/test_adk_web_agent.py +0 -12
- package/template/apps/agent-server/tests/test_adk_web_canonical_debug.py +0 -282
- package/template/apps/server/src/agent/run-debug-authorization.ts +0 -27
- package/template/apps/server/src/agent/run-facade-adk-debug.test.ts +0 -95
- package/template/apps/server/src/runtime-adk-debug.test.ts +0 -270
- package/template/apps/server/src/runtime-adk-debug.ts +0 -164
- package/template/apps/server/src/runtime-request-actor.test.ts +0 -55
- package/template/apps/server/src/runtime-request-actor.ts +0 -22
- package/template/docker-compose.agent-debug.yml +0 -58
- package/template/scripts/dev-adk-web.ts +0 -107
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Governed Client Agent Session
|
|
2
|
+
|
|
3
|
+
更新时间:2026-08-26。
|
|
4
|
+
|
|
5
|
+
## 目的与边界
|
|
6
|
+
|
|
7
|
+
Client Agent Session 是 Windy 为浏览器、桌面壳和扩展等“宿主本地编排模型循环”提供的
|
|
8
|
+
通用治理协议。它不是 PageAgent 专属实现,也不允许下游产品复制 Provider 凭据或
|
|
9
|
+
Agent Server 的 Tool execution grant。下游只负责业务 Composition 和浏览器 binding;
|
|
10
|
+
Windy 拥有会话、模型代理、receipt、终态和审计语义。
|
|
11
|
+
|
|
12
|
+
生产闭环已经提供:
|
|
13
|
+
|
|
14
|
+
- `ModuleAiOperationDefinition.clientExecution` 显式 opt-in 与组合门禁;
|
|
15
|
+
- `@southwind-ai/server-sdk` 的宿主 Port 和 `@southwind-ai/ai-client/client-agent` DTO;
|
|
16
|
+
- 单 Run opaque bearer、Actor/Operation/Release/Input/Binding 承诺;
|
|
17
|
+
- `/chat/completions` 请求的 role、字段、model、字节、step 和并发约束;
|
|
18
|
+
- Manifest `providerDataPolicy` envelope allowlist 与 DLP;
|
|
19
|
+
- opaque Provider response receipt、exactly-once finalize/cancel/status/result;
|
|
20
|
+
- Provider 优先结果投影,以及不可冒充 Provider 证明的 `clientProjected` 标记;
|
|
21
|
+
- Actor、binding、权限漂移、TTL 和显式撤销后的 fail-closed 状态机。
|
|
22
|
+
- Windy Server 到 Agent Server 的 internal-token SSE Adapter;Agent Server 固定管理面
|
|
23
|
+
deployment、物理 model、Provider URL 和 Key;
|
|
24
|
+
- PostgreSQL/Drizzle `client_agent_sessions` 与 `client_agent_receipts` 事务仓储、前向
|
|
25
|
+
migration 和进程重启恢复;
|
|
26
|
+
- 登录会话撤销、权限漂移、TTL、binding revoke 与 Abort 的联动;
|
|
27
|
+
- `pageAgentClientRun` readiness 协商。只有 Agent Server Provider 与已配对的 Browser
|
|
28
|
+
Assistant Host Auth Adapter 同时就绪时才返回该 capability。
|
|
29
|
+
|
|
30
|
+
## Manifest opt-in
|
|
31
|
+
|
|
32
|
+
只有 `kind=agent`、`providerEgress.mode=configured-endpoint` 且已有
|
|
33
|
+
`providerDataPolicy` 的 Operation 能声明:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
clientExecution: {
|
|
37
|
+
mode: "governed-session",
|
|
38
|
+
maxSteps: 12,
|
|
39
|
+
maxRequestBytes: 262_144,
|
|
40
|
+
maxResponseBytes: 262_144,
|
|
41
|
+
maxConcurrentRequests: 1,
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
这些上限不能突破 Operation 的输入/输出边界;`maxSteps` 最大 128,并发最大 4。
|
|
46
|
+
Manifest 不声明 Provider URL、物理模型或 Secret。客户端收到的 `modelAlias` 只是本次
|
|
47
|
+
Session 的固定逻辑别名。
|
|
48
|
+
|
|
49
|
+
## HTTP 契约
|
|
50
|
+
|
|
51
|
+
创建与 capability 请求使用配对后短期 `bax_` installation session:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
POST /api/agent/client-sessions
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
请求只包含 `operationKey`、符合 Operation input schema 的 `input`,以及宿主计算的
|
|
58
|
+
`clientBindingDigest`。binding 应覆盖 installation、conversation、tab 和 document
|
|
59
|
+
epoch 或宿主等价的服务切换 epoch;Windy 只保存 digest,不依赖当前浏览网页 origin 的
|
|
60
|
+
人工授权。创建时自动执行 License、Feature、Permission、Scope、
|
|
61
|
+
Provider egress 与 data policy 检查,并返回:
|
|
62
|
+
|
|
63
|
+
- `clientRunId`、`sessionId`;
|
|
64
|
+
- 受信 `trustedBaseUrl` 和固定 `modelAlias`;
|
|
65
|
+
- steps/request bytes/response bytes/duration/concurrency 上限;
|
|
66
|
+
- `expiresAt` 和 `car_` 前缀的单 Run bearer。
|
|
67
|
+
- `capabilities: ["pageAgentClientRun"]`。
|
|
68
|
+
|
|
69
|
+
浏览器扩展不需要也不持有宿主 Web cookie。`Authorization: Bearer bax_...` 只由
|
|
70
|
+
Client Agent Host Auth Adapter 在这些 route 上解析,再按 `actorId` 加载 canonical
|
|
71
|
+
Actor、最新 RBAC 与 Scope;普通业务 API 的 Actor resolver 明确拒绝 `bax_` 和 `car_`。
|
|
72
|
+
调用创建前可探测生产 readiness:
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
GET /api/agent/client-sessions/capabilities
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
成功响应为 `{ capabilities: ["pageAgentClientRun"], modelAlias }`。Provider 未配置、
|
|
79
|
+
Agent Server 不可达或未登录时不协商该能力。此流程没有逐动作 approval,也不要求用户
|
|
80
|
+
复制 token;宿主把 grant 只保存在受信内存中。
|
|
81
|
+
|
|
82
|
+
带 `:sessionId` 的后续 Route 使用 `Authorization: Bearer car_...`,同时通过
|
|
83
|
+
`X-Windy-Host-Authorization: Bearer bax_...` 提供配对 Host Actor,并在
|
|
84
|
+
`x-windy-client-binding-digest` 中重申 binding:
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
POST /api/agent/client-sessions/:sessionId/v1/chat/completions
|
|
88
|
+
POST /api/agent/client-sessions/:sessionId/finalize
|
|
89
|
+
POST /api/agent/client-sessions/:sessionId/cancel
|
|
90
|
+
GET /api/agent/client-sessions/:sessionId
|
|
91
|
+
GET /api/agent/client-sessions/:sessionId/result
|
|
92
|
+
POST /api/agent/client-sessions/revoke
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`trustedBaseUrl` 是带当前 `sessionId` 的 OpenAI-compatible baseURL,例如
|
|
96
|
+
`https://windy.example/api/agent/client-sessions/cas_x/v1/`。PageAgent 只向其
|
|
97
|
+
`chat/completions` 子路径发送请求。`revoke` 使用 `bax_` Host Auth 和
|
|
98
|
+
`{ clientBindingDigest }`,只撤销当前 Actor 的匹配 binding;服务切换、installation
|
|
99
|
+
撤销或宿主 session 关闭时应调用它。登出和登录会话撤销会由平台自动执行 Actor revoke。
|
|
100
|
+
|
|
101
|
+
bax/car bearer 只匹配 Client Agent Route,不能调用普通业务 API 或 Tool Host。服务端只保存其
|
|
102
|
+
SHA-256 hash。客户端请求只能使用固定 model alias 和允许的 OpenAI-compatible 字段;
|
|
103
|
+
URL、endpoint、未知 body 字段、未知 role、越界 Tool schema 都会被拒绝。
|
|
104
|
+
|
|
105
|
+
PageAgent Core 1.12.2 的通用 envelope 已锁定:`parallel_tool_calls` 必须为 `false`;
|
|
106
|
+
`tool_choice` 可为 `auto`、`none`,或引用当次 `tools` 中 function 的命名选择(包括
|
|
107
|
+
MacroTool `AgentOutput`);assistant 历史可携带经校验的 `tool_calls`,后续 tool message
|
|
108
|
+
必须以 `tool_call_id/name` 匹配该调用。并行调用、未知命名 function 或断裂的 tool history
|
|
109
|
+
都会 fail closed。
|
|
110
|
+
|
|
111
|
+
流式响应转发标准 OpenAI SSE chunk;成功末尾追加
|
|
112
|
+
`event: windy.receipt`,其 data 为 receipt,再发送 `[DONE]`。非流式响应在
|
|
113
|
+
`windy_receipt` 字段和 `x-windy-provider-receipt-id` 响应头返回相同 receipt。Abort 会
|
|
114
|
+
向 Agent Server 和 Provider 传播;取消或撤权后迟到 chunk 不能生成 receipt。
|
|
115
|
+
|
|
116
|
+
## Receipt 与终态
|
|
117
|
+
|
|
118
|
+
每次成功 Provider attempt 生成一个 `receipt_` opaque ID,并持有以下不可变绑定:
|
|
119
|
+
|
|
120
|
+
- Client Run、Actor、Operation、Release、binding digest;
|
|
121
|
+
- attempt 序号、request/response/deployment digest;
|
|
122
|
+
- issuedAt 和可选的服务端 canonical result 投影。
|
|
123
|
+
|
|
124
|
+
Repository 不保存 raw prompt、Provider response、Secret 或 bearer。HTTP 只公开 receipt
|
|
125
|
+
所需的 opaque ID 与 digest,不公开 Actor、Scope、Release 内部快照。
|
|
126
|
+
|
|
127
|
+
`finalize` 必须按 attempt 顺序提交本 Run 的完整 receipt 链,且没有在途请求。Gateway
|
|
128
|
+
能够从最终 Provider response 得到 schema-valid 投影时,结果标为
|
|
129
|
+
`provider-observed`;否则可以接受有界、schema-valid 的客户端投影,但必须标为
|
|
130
|
+
`client-projected`,`providerAttested=false`。客户端 DTO 没有 `runtimeVerified` 字段。
|
|
131
|
+
|
|
132
|
+
完成、取消、撤销和过期都是不可改写终态。重复的相同 finalize 返回同一结果;不同
|
|
133
|
+
finalize、终态后的模型调用和跨 Run/Actor/binding receipt 重放均被拒绝。取消会 abort
|
|
134
|
+
在途 Provider 请求;即使响应随后到达,也不能再追加 receipt 或改变终态。
|
|
135
|
+
|
|
136
|
+
## 部署与稳定错误
|
|
137
|
+
|
|
138
|
+
生产 Server 必须配置 `WINDY_PUBLIC_BASE_URL=https://windy.example`。它只用于生成受信
|
|
139
|
+
Windy baseURL,不能指向 Provider。Provider URL、Key、物理 model 和 deployment 只通过
|
|
140
|
+
Agent Server 管理面环境配置;公共 DTO 没有 BYOK 字段,也不支持客户端 model override。
|
|
141
|
+
|
|
142
|
+
稳定错误 code 为 `INVALID_INPUT`、`FORBIDDEN`、`NOT_FOUND`、`CONFLICT`、
|
|
143
|
+
`LIMIT_EXCEEDED`、`PROVIDER_FAILED`、`INTERNAL_ERROR`。message 使用简体中文安全文案,不透传 Provider
|
|
144
|
+
正文、URL、Key、物理 model 或内部错误。License/Feature/Permission/Scope 不满足统一
|
|
145
|
+
fail closed,不进入人工审批状态机。
|
|
146
|
+
|
|
147
|
+
PostgreSQL 集成回归使用 `CLIENT_AGENT_TEST_DATABASE_URL`,覆盖并发预留、receipt 原子写入、
|
|
148
|
+
重启恢复与终态不可改写;Agent Server contract 回归覆盖 tool calls、DLP、SSE、Abort 和
|
|
149
|
+
Provider 错误脱敏。
|
|
150
|
+
|
|
151
|
+
## 升级说明
|
|
152
|
+
|
|
153
|
+
从不含生产 Client Agent Session 的版本升级时:
|
|
154
|
+
|
|
155
|
+
1. 先执行标准 `windy update` / migration 流程,确认 migration 0055 已创建 session 与
|
|
156
|
+
receipt 两张表,0056 已加入 Host Session digest;不要手工回填 token 或 Provider 响应;
|
|
157
|
+
2. Server 配置 `WINDY_PUBLIC_BASE_URL`,生产必须是最终用户可访问的 HTTPS 利剑服务 origin;
|
|
158
|
+
3. Agent Server 继续使用现有 `QWEN_API_URL`、`QWEN_API_KEY`、`QWEN_MODEL` 与 deployment
|
|
159
|
+
配置,绝不把这些值复制到 Web、扩展或业务模块;
|
|
160
|
+
4. 业务模块仅在目标 Agent Operation 上声明 `clientExecution`,同时保留原
|
|
161
|
+
Feature/Permission/License/Scope 与 `providerDataPolicy`;
|
|
162
|
+
5. 在 project-owned `client-agent-host-auth-binding.ts` 装配实现
|
|
163
|
+
`ModuleClientAgentHostAuthAdapter` 的 P-256 pairing/bax Adapter;其 `authenticate` 只返回
|
|
164
|
+
actor/installation/session 标识,权限仍由 Windy canonical Actor 加载,并通过
|
|
165
|
+
`bindRevocations` 把 installation/session 撤销推给 Session Service。未装配或未 ready 时
|
|
166
|
+
不注册/不协商 capability;
|
|
167
|
+
6. 客户端先请求 capabilities;只有出现 `pageAgentClientRun` 才切换 PageAgent 路径,否则
|
|
168
|
+
保持旧路径或明确不可用;
|
|
169
|
+
7. 服务地址或 installation pairing 切换前调用 binding revoke,清除内存中的 grant;无法
|
|
170
|
+
联系旧服务时不得复用旧 token,等待其短 TTL 到期。
|
|
171
|
+
|
|
172
|
+
协议没有 BYOK、用户模型选择、逐动作审批或逐目标网页 origin 授权字段。宿主配对只负责
|
|
173
|
+
识别目标 Windy 服务、当前登录 actor、installation 和撤销边界。
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Embedding AI Runtime
|
|
2
|
+
|
|
3
|
+
Windy 提供受治理的文本与图片 Embedding 调用边界,不提供业务向量库。业务模块仍负责向量表、索引版本、增量更新、案件权限过滤、重建和排序。
|
|
4
|
+
|
|
5
|
+
## 调用链
|
|
6
|
+
|
|
7
|
+
业务模块在 Manifest 注册 `kind=embedding` Operation,同时声明稳定的 Feature、Permission、License、审计动作、数据分类、输入模态、能力和预算。模块 `setup(host)` 通过 `prepareEmbedding` 生成领域选项;浏览器只调用同源 `/api/embeddings`。
|
|
8
|
+
|
|
9
|
+
文本经过 Provider 数据字段治理后进入 Runtime。图片必须是当前 Actor 有权读取的 `ArtifactRef`;平台重新签发短时引用,Runtime 校验大小、哈希、MIME 和像素预算,移除元数据后才交给内网 Adapter。业务代码不能提交文件路径、任意 URL 或 Base64。
|
|
10
|
+
|
|
11
|
+
`POST /api/embeddings/runs` 创建持久 Run;轮询 events/result 或取消时都会重新验证当前 Actor、Module、Feature、Permission、License 和 scope。图片 Run 在 worker 实际读图前仅以 `runId/itemId` 回调 Server;Server 从持久绑定恢复密封引用、重建当前 Guard 并刷新读取授权。客户端与 Embedding Runtime 都不能提交 Actor、scope 或新的 Artifact token。授权、资源完整性或部署限制发生漂移时,该操作 fail-closed。
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
const operation = {
|
|
15
|
+
key: "analysis.embedding.multimodal",
|
|
16
|
+
kind: "embedding",
|
|
17
|
+
featureKey: "analysis.embedding",
|
|
18
|
+
permissionKey: "analysis.embedding.execute",
|
|
19
|
+
licenseFeatureKey: "analysis.embedding",
|
|
20
|
+
auditAction: "analysis.embedding.execute",
|
|
21
|
+
dataClassification: "sensitive",
|
|
22
|
+
inputModalities: ["text", "image"],
|
|
23
|
+
outputModalities: ["embedding"],
|
|
24
|
+
requiredCapabilities: ["embedding.text", "embedding.image"],
|
|
25
|
+
limits: {
|
|
26
|
+
maxDurationSeconds: 60,
|
|
27
|
+
maxInputBytes: 20_000_000,
|
|
28
|
+
maxOutputBytes: 20_000_000,
|
|
29
|
+
maxUnits: 64,
|
|
30
|
+
maxArtifacts: 16,
|
|
31
|
+
maxPixelsPerArtifact: 20_000_000,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 固定输出契约
|
|
37
|
+
|
|
38
|
+
每个批次返回稳定 `batchId`、逐项输入 SHA-256 和向量,以及由 Runtime 配置固定的:
|
|
39
|
+
|
|
40
|
+
- `deploymentAlias`
|
|
41
|
+
- `model`
|
|
42
|
+
- `version`
|
|
43
|
+
- `dimensions`
|
|
44
|
+
- `normalized`
|
|
45
|
+
|
|
46
|
+
Runtime 拒绝 ID/顺序漂移、维度漂移、非有限数值和与归一化声明不一致的向量。Adapter 响应不能覆盖上述部署元数据。这些字段使业务索引可重现、可判断何时需要重建。
|
|
47
|
+
|
|
48
|
+
## 部署
|
|
49
|
+
|
|
50
|
+
Adapter URL 只允许本机、Compose 服务名、`.internal` 或私网 IP。平台不允许把敏感输入发往任意公网端点。
|
|
51
|
+
|
|
52
|
+
```dotenv
|
|
53
|
+
EMBEDDING_SERVER_URL=http://embedding-server:8092
|
|
54
|
+
EMBEDDING_ARTIFACT_URL=http://server:9747/api/internal/ai/artifacts
|
|
55
|
+
EMBEDDING_RUN_ARTIFACT_URL=http://server:9747/api/internal/embeddings/runs
|
|
56
|
+
EMBEDDING_ADAPTER_URL=http://embedding-adapter:9000
|
|
57
|
+
EMBEDDING_ADAPTER_TOKEN=
|
|
58
|
+
EMBEDDING_DEPLOYMENT_KEY=local-embedding
|
|
59
|
+
EMBEDDING_DEPLOYMENT_IDENTITY=windy-deployment-v1_<uuidv4>
|
|
60
|
+
EMBEDDING_RELEASE_DIGEST=sha256:<64位小写十六进制>
|
|
61
|
+
EMBEDDING_OFFERS_DIGEST=sha256:<64位小写十六进制>
|
|
62
|
+
EMBEDDING_DEPLOYMENT_ALIAS=intranet-multimodal-v1
|
|
63
|
+
EMBEDDING_MODEL=local-model
|
|
64
|
+
EMBEDDING_MODEL_VERSION=2026-07
|
|
65
|
+
EMBEDDING_DIMENSIONS=1024
|
|
66
|
+
EMBEDDING_NORMALIZED=true
|
|
67
|
+
EMBEDDING_CAPABILITIES=embedding.text,embedding.image
|
|
68
|
+
EMBEDDING_MAX_UNITS=256
|
|
69
|
+
EMBEDDING_RUN_ENCRYPTION_SECRET=至少32字符的独立密钥
|
|
70
|
+
EMBEDDING_MAX_CONCURRENT_RUNS=1
|
|
71
|
+
EMBEDDING_MAX_QUEUE_DEPTH=0
|
|
72
|
+
EMBEDDING_READINESS_TIMEOUT_SECONDS=5
|
|
73
|
+
EMBEDDING_READINESS_TTL_SECONDS=60
|
|
74
|
+
EMBEDDING_RUN_TERMINAL_TTL_SECONDS=604800
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
启动可选服务:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
bun run dev:embedding
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
健康端点需要内部 Bearer Token,只在 `/v1/embedding/readiness` 真实探测 Adapter、
|
|
84
|
+
重算完整原子 offers 与 release digest,并与配置 pin 完全一致时发布 readiness V1。
|
|
85
|
+
可用 `python -m southwind_embedding_server.pin_cli` 从同一真实探测事实计算部署 pins;
|
|
86
|
+
命令只输出 pins,不写 `.env`。Host 在业务 prepare、Artifact/Run 创建前固定
|
|
87
|
+
deployment pin,Remote 与 Embedding Runtime 在实际调用前再次核对。未配置 Adapter、
|
|
88
|
+
缺失 pin、探测失败或部署漂移时返回 503,不回退到假向量或其它模型。
|
|
89
|
+
|
|
90
|
+
## 错误与审计
|
|
91
|
+
|
|
92
|
+
稳定错误码包括 `INVALID_INPUT`、`FORBIDDEN`、`CAPABILITY_UNAVAILABLE`、`BUDGET_EXCEEDED`、`OUTPUT_VALIDATION_FAILED` 和 `RUNTIME_UNAVAILABLE`。错误响应不透传 Adapter 正文。
|
|
93
|
+
|
|
94
|
+
成功审计记录 Operation、Actor、批次、输入数量、部署别名、模型版本、维度和归一化状态,不记录原文、图片或向量。
|
|
@@ -99,14 +99,11 @@ Server 会幂等创建默认开发管理员和 `developer` 角色;仅当默认
|
|
|
99
99
|
|
|
100
100
|
Web 不提供默认开发 Token。只有 Vite 开发模式同时设置 `VITE_DEV_AUTH_BYPASS=1` 和非空 `VITE_DEV_ADMIN_TOKEN` 时,前端才会携带显式 Bearer Token,并在登录页和应用壳持续显示警告;生产构建无条件忽略这两个变量。完成一次真实密码登录后,当前页面生命周期内会停用开发 Token,后续请求只使用 Cookie。
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
`GET /api/agent/debug/sessions/v1/**` 路径把它解析成 `service_adk_debug`,权限收敛为
|
|
108
|
-
项目选择的 Operation 与 allowed Tools 权限闭包。该 Token 不进入 Web、Agent
|
|
109
|
-
Server、Provider 或生产 Compose;非 development Server 即使误配也会拒绝。
|
|
102
|
+
Agent Runtime 调试与历史会话读取复用 Windy 主站的真实登录身份,不创建第二种调试
|
|
103
|
+
Token、专用服务身份或开发认证旁路。`GET /api/agent/sessions/v1/**` 按 Provider 所绑定
|
|
104
|
+
Operation 的 Feature、Permission 与当前 Actor 数据范围逐次授权;主站 Runtime Report
|
|
105
|
+
继续要求 `system.ai-runtime.read`。这些接口不接受 `WINDY_DEV_ADMIN_TOKEN` 以外的新型
|
|
106
|
+
Bearer 方案,也不会把内部服务 Token 下发给浏览器。
|
|
110
107
|
|
|
111
108
|
未配置 `DATABASE_URL` 时不会注册真实登录 API;只允许显式的非生产开发直通,不存在内存生产账号或默认生产密码。
|
|
112
109
|
|
package/template/package.json
CHANGED
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"dev:speech": "PLATFORM_ENABLE_AI=true SPEECH_SERVER_URL=http://speech-server:8091 docker compose --profile agent --profile speech up --build",
|
|
21
21
|
"speech:pins": "bun run scripts/provision-speech-readiness.ts",
|
|
22
22
|
"dev:embedding": "PLATFORM_ENABLE_AI=true EMBEDDING_SERVER_URL=http://embedding-server:8092 docker compose --profile agent --profile embedding up --build",
|
|
23
|
-
"dev:adk-web": "bun run scripts/dev-adk-web.ts",
|
|
24
23
|
"dev:search": "OPENSEARCH_URL=http://opensearch:9200 docker compose --profile search up --build",
|
|
25
24
|
"dev:license": "bun run --cwd apps/license dev",
|
|
26
25
|
"dev:license:docker": "docker compose --profile license up license",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@southwind-ai/ai-client",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"exports": {
|
|
19
19
|
".": "./index.ts",
|
|
20
20
|
"./agent": "./src/agent/index.ts",
|
|
21
|
+
"./client-agent": "./src/client-agent/index.ts",
|
|
21
22
|
"./contracts": "./src/agent/contracts/index.ts",
|
|
22
23
|
"./document": "./src/document/index.ts",
|
|
23
24
|
"./embedding": "./src/embedding/index.ts",
|
|
@@ -74,6 +74,7 @@ export class HttpAgentCaller implements AgentCaller {
|
|
|
74
74
|
...(options.screenshotIntakeToken
|
|
75
75
|
? { screenshotIntakeToken: options.screenshotIntakeToken }
|
|
76
76
|
: {}),
|
|
77
|
+
...(options.sessionId ? { sessionId: options.sessionId } : {}),
|
|
77
78
|
};
|
|
78
79
|
let response: Response;
|
|
79
80
|
try {
|
|
@@ -103,6 +104,7 @@ export class HttpAgentCaller implements AgentCaller {
|
|
|
103
104
|
const created = parseCreatedRun(await safeJson(response, "创建 Agent Run"));
|
|
104
105
|
return this.createRun(operation, created.runId, created.eventsUrl, {
|
|
105
106
|
signal: options.signal,
|
|
107
|
+
sessionId: options.sessionId,
|
|
106
108
|
});
|
|
107
109
|
}
|
|
108
110
|
|
|
@@ -120,7 +122,11 @@ export class HttpAgentCaller implements AgentCaller {
|
|
|
120
122
|
{
|
|
121
123
|
method: "POST",
|
|
122
124
|
headers: { "content-type": "application/json" },
|
|
123
|
-
body: JSON.stringify({
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
operationKey: operation.key,
|
|
127
|
+
cursor,
|
|
128
|
+
...(options.sessionId ? { sessionId: options.sessionId } : {}),
|
|
129
|
+
}),
|
|
124
130
|
signal: options.signal,
|
|
125
131
|
},
|
|
126
132
|
);
|
|
@@ -154,6 +160,7 @@ export class HttpAgentCaller implements AgentCaller {
|
|
|
154
160
|
signal: options.signal,
|
|
155
161
|
initialSequence: cursor,
|
|
156
162
|
initialTerminal: attached.terminalEvent,
|
|
163
|
+
sessionId: options.sessionId,
|
|
157
164
|
});
|
|
158
165
|
}
|
|
159
166
|
|
|
@@ -173,9 +180,15 @@ export class HttpAgentCaller implements AgentCaller {
|
|
|
173
180
|
signal?: AbortSignal;
|
|
174
181
|
initialSequence?: number;
|
|
175
182
|
initialTerminal?: TerminalAgentEvent;
|
|
183
|
+
sessionId?: string;
|
|
176
184
|
},
|
|
177
185
|
): AgentRun<Output> {
|
|
178
|
-
const operationQuery =
|
|
186
|
+
const operationQuery = [
|
|
187
|
+
`operationKey=${encodeURIComponent(operation.key)}`,
|
|
188
|
+
...(state.sessionId
|
|
189
|
+
? [`sessionId=${encodeURIComponent(state.sessionId)}`]
|
|
190
|
+
: []),
|
|
191
|
+
].join("&");
|
|
179
192
|
return new HttpAgentRun<Output>({
|
|
180
193
|
id: runId,
|
|
181
194
|
eventsUrl: this.endpoint(eventsPath),
|
|
@@ -29,17 +29,31 @@ describe("Agent Run protocol safety", () => {
|
|
|
29
29
|
expect(fake.calls).toBe(1);
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
test("跨 chunk
|
|
33
|
-
const
|
|
34
|
-
type: "run.started",
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
32
|
+
test("从 sequence 0 跨 chunk 解码完整 canonical 事件流", async () => {
|
|
33
|
+
const canonicalEvents: AgentEvent[] = [
|
|
34
|
+
{ type: "run.started", runId: "run-chunks", sequence: 1 },
|
|
35
|
+
{
|
|
36
|
+
type: "input.prepared",
|
|
37
|
+
runId: "run-chunks",
|
|
38
|
+
sequence: 2,
|
|
39
|
+
artifactCount: 0,
|
|
40
|
+
inputModalities: ["text"],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: "output.delta",
|
|
44
|
+
runId: "run-chunks",
|
|
45
|
+
sequence: 3,
|
|
46
|
+
text: "完成",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: "usage.reported",
|
|
50
|
+
runId: "run-chunks",
|
|
51
|
+
sequence: 4,
|
|
52
|
+
usage: { source: "unknown" },
|
|
53
|
+
},
|
|
54
|
+
{ type: "run.completed", runId: "run-chunks", sequence: 5 },
|
|
55
|
+
];
|
|
56
|
+
const stream = `: heartbeat\n\n${canonicalEvents.map(frame).join("")}`;
|
|
43
57
|
const fake = plannedFetch([
|
|
44
58
|
() =>
|
|
45
59
|
json({
|
|
@@ -47,23 +61,21 @@ describe("Agent Run protocol safety", () => {
|
|
|
47
61
|
status: "accepted",
|
|
48
62
|
eventsUrl: "/events",
|
|
49
63
|
}),
|
|
50
|
-
() =>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
])
|
|
64
|
+
(input, init) => {
|
|
65
|
+
const url = new URL(
|
|
66
|
+
input instanceof Request ? input.url : input.toString(),
|
|
67
|
+
);
|
|
68
|
+
expect(url.searchParams.has("after")).toBe(false);
|
|
69
|
+
expect(new Headers(init?.headers).has("last-event-id")).toBe(false);
|
|
70
|
+
return sse([stream.slice(0, 8), stream.slice(8, 41), stream.slice(41)]);
|
|
71
|
+
},
|
|
57
72
|
() => json({ runId: "run-chunks", status: "completed", output: "ok" }),
|
|
58
73
|
]);
|
|
59
74
|
const run = await start(fake.fetch, "chunks");
|
|
60
75
|
const events = collect(run.events);
|
|
61
76
|
|
|
62
77
|
await expect(run.result()).resolves.toBe("ok");
|
|
63
|
-
expect(
|
|
64
|
-
"run.started",
|
|
65
|
-
"run.completed",
|
|
66
|
-
]);
|
|
78
|
+
expect(await events).toEqual(canonicalEvents);
|
|
67
79
|
});
|
|
68
80
|
|
|
69
81
|
test("run.failed 返回 canonical 安全错误且不请求 result", async () => {
|
|
@@ -186,16 +198,18 @@ function start(fetch: AgentFetch, idempotencyKey: string) {
|
|
|
186
198
|
}).start(operation, null, { idempotencyKey });
|
|
187
199
|
}
|
|
188
200
|
|
|
189
|
-
function plannedFetch(
|
|
201
|
+
function plannedFetch(
|
|
202
|
+
plans: Array<(...args: Parameters<AgentFetch>) => Response>,
|
|
203
|
+
): {
|
|
190
204
|
fetch: AgentFetch;
|
|
191
205
|
readonly calls: number;
|
|
192
206
|
} {
|
|
193
207
|
let calls = 0;
|
|
194
208
|
return {
|
|
195
|
-
fetch: async () => {
|
|
209
|
+
fetch: async (...args) => {
|
|
196
210
|
const plan = plans[calls++];
|
|
197
211
|
if (!plan) throw new Error("unexpected fetch");
|
|
198
|
-
return plan();
|
|
212
|
+
return plan(...args);
|
|
199
213
|
},
|
|
200
214
|
get calls() {
|
|
201
215
|
return calls;
|
|
@@ -7,11 +7,15 @@ export interface StartAgentRunOptions {
|
|
|
7
7
|
artifacts?: readonly ArtifactRef[];
|
|
8
8
|
/** Host-issued one-shot screenshot intake; never an Artifact URL or Run owner. */
|
|
9
9
|
screenshotIntakeToken?: string;
|
|
10
|
+
/** 可选的长期 Session;服务端会重新校验当前 Actor 与授权范围。 */
|
|
11
|
+
sessionId?: string;
|
|
10
12
|
signal?: AbortSignal;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
export interface AttachAgentRunOptions {
|
|
14
16
|
cursor?: number;
|
|
17
|
+
/** 恢复长期 Session 关联;服务端仍会校验 Run、Actor 与 Scope。 */
|
|
18
|
+
sessionId?: string;
|
|
15
19
|
signal?: AbortSignal;
|
|
16
20
|
}
|
|
17
21
|
|
|
@@ -24,34 +24,41 @@ const error = {
|
|
|
24
24
|
|
|
25
25
|
const events: AgentEvent[] = [
|
|
26
26
|
{ type: "run.started", runId: "run-1", sequence: 1 },
|
|
27
|
-
{
|
|
27
|
+
{
|
|
28
|
+
type: "input.prepared",
|
|
29
|
+
runId: "run-1",
|
|
30
|
+
sequence: 2,
|
|
31
|
+
artifactCount: 1,
|
|
32
|
+
inputModalities: ["text", "image"],
|
|
33
|
+
},
|
|
34
|
+
{ type: "output.delta", runId: "run-1", sequence: 3, text: "你好" },
|
|
28
35
|
{
|
|
29
36
|
type: "tool.requested",
|
|
30
37
|
runId: "run-1",
|
|
31
|
-
sequence:
|
|
38
|
+
sequence: 4,
|
|
32
39
|
toolCallId: "call-1",
|
|
33
40
|
toolKey: "work-order.ticket.read",
|
|
34
41
|
},
|
|
35
42
|
{
|
|
36
43
|
type: "approval.required",
|
|
37
44
|
runId: "run-1",
|
|
38
|
-
sequence:
|
|
45
|
+
sequence: 5,
|
|
39
46
|
workItemId: "work-1",
|
|
40
47
|
toolCallId: "tool-call-1",
|
|
41
48
|
},
|
|
42
49
|
{
|
|
43
50
|
type: "tool.completed",
|
|
44
51
|
runId: "run-1",
|
|
45
|
-
sequence:
|
|
52
|
+
sequence: 6,
|
|
46
53
|
toolCallId: "call-1",
|
|
47
54
|
},
|
|
48
55
|
{
|
|
49
56
|
type: "usage.reported",
|
|
50
57
|
runId: "run-1",
|
|
51
|
-
sequence:
|
|
58
|
+
sequence: 7,
|
|
52
59
|
usage: { source: "provider-reported", inputTokens: 10 },
|
|
53
60
|
},
|
|
54
|
-
{ type: "run.completed", runId: "run-1", sequence:
|
|
61
|
+
{ type: "run.completed", runId: "run-1", sequence: 8 },
|
|
55
62
|
{ type: "run.failed", runId: "run-2", sequence: 1, error },
|
|
56
63
|
{ type: "run.cancelled", runId: "run-3", sequence: 1 },
|
|
57
64
|
];
|
|
@@ -121,6 +128,41 @@ describe("Agent contract", () => {
|
|
|
121
128
|
expect(() =>
|
|
122
129
|
parseAgentEvent({ type: "output.delta", runId: "run-1", sequence: 1 }),
|
|
123
130
|
).toThrow(AgentContractParseError);
|
|
131
|
+
expect(() =>
|
|
132
|
+
parseAgentEvent({
|
|
133
|
+
type: "input.prepared",
|
|
134
|
+
runId: "run-1",
|
|
135
|
+
sequence: 2,
|
|
136
|
+
inputModalities: ["text"],
|
|
137
|
+
}),
|
|
138
|
+
).toThrow(AgentContractParseError);
|
|
139
|
+
expect(() =>
|
|
140
|
+
parseAgentEvent({
|
|
141
|
+
type: "input.prepared",
|
|
142
|
+
runId: "run-1",
|
|
143
|
+
sequence: 2,
|
|
144
|
+
artifactCount: -1,
|
|
145
|
+
inputModalities: ["text"],
|
|
146
|
+
}),
|
|
147
|
+
).toThrow(AgentContractParseError);
|
|
148
|
+
expect(() =>
|
|
149
|
+
parseAgentEvent({
|
|
150
|
+
type: "input.prepared",
|
|
151
|
+
runId: "run-1",
|
|
152
|
+
sequence: 2,
|
|
153
|
+
artifactCount: 0,
|
|
154
|
+
inputModalities: ["binary"],
|
|
155
|
+
}),
|
|
156
|
+
).toThrow(AgentContractParseError);
|
|
157
|
+
expect(() =>
|
|
158
|
+
parseAgentEvent({
|
|
159
|
+
type: "input.prepared",
|
|
160
|
+
runId: "run-1",
|
|
161
|
+
sequence: 2,
|
|
162
|
+
artifactCount: 0,
|
|
163
|
+
inputModalities: [],
|
|
164
|
+
}),
|
|
165
|
+
).toThrow(AgentContractParseError);
|
|
124
166
|
expect(() =>
|
|
125
167
|
parseAgentEvent({
|
|
126
168
|
type: "run.started",
|
|
@@ -185,7 +227,7 @@ describe("Agent SSE", () => {
|
|
|
185
227
|
comment: "heartbeat",
|
|
186
228
|
});
|
|
187
229
|
const event = events[1]!;
|
|
188
|
-
const frame = `id: 2\nevent:
|
|
230
|
+
const frame = `id: 2\nevent: input.prepared\ndata: ${JSON.stringify(event)}`;
|
|
189
231
|
expect(decodeAgentSseFrame(frame)).toEqual({
|
|
190
232
|
kind: "event",
|
|
191
233
|
id: 2,
|