create-windy 0.6.11 → 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.
Files changed (546) hide show
  1. package/dist/cli.js +580 -269
  2. package/package.json +1 -1
  3. package/template/.agents/skills/windy-business-module/SKILL.md +98 -70
  4. package/template/.windy-template.json +3 -3
  5. package/template/AGENTS.md +3 -6
  6. package/template/apps/agent-server/Dockerfile +2 -3
  7. package/template/apps/agent-server/README.md +38 -54
  8. package/template/apps/agent-server/pyproject.toml +0 -1
  9. package/template/apps/agent-server/src/southwind_agent_server/app.py +4 -2
  10. package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +191 -0
  11. package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +203 -0
  12. package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +61 -0
  13. package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +82 -0
  14. package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +121 -0
  15. package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +158 -0
  16. package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +24 -0
  17. package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +71 -0
  18. package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +307 -0
  19. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +39 -0
  20. package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +2 -0
  21. package/template/apps/agent-server/src/southwind_agent_server/engine.py +9 -1
  22. package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +2 -0
  23. package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +15 -0
  24. package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +37 -3
  25. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +46 -26
  26. package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +32 -0
  27. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +7 -0
  28. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +5 -2
  29. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +1 -0
  30. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +6 -1
  31. package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +3 -2
  32. package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +1 -0
  33. package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +21 -0
  34. package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +2 -1
  35. package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +1 -0
  36. package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +7 -1
  37. package/template/apps/agent-server/src/southwind_agent_server/report_store.py +10 -56
  38. package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +75 -0
  39. package/template/apps/agent-server/src/southwind_agent_server/report_types.py +9 -2
  40. package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +74 -0
  41. package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +11 -3
  42. package/template/apps/agent-server/src/southwind_agent_server/service.py +41 -65
  43. package/template/apps/agent-server/src/southwind_agent_server/service_control.py +64 -0
  44. package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +3 -0
  45. package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +2 -0
  46. package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +9 -1
  47. package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +6 -5
  48. package/template/apps/agent-server/src/southwind_agent_server/store.py +2 -0
  49. package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +137 -0
  50. package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +58 -0
  51. package/template/apps/agent-server/tests/test_api.py +30 -11
  52. package/template/apps/agent-server/tests/test_client_completion.py +230 -0
  53. package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +12 -24
  54. package/template/apps/agent-server/tests/test_report_resilience.py +2 -0
  55. package/template/apps/agent-server/tests/test_report_routes.py +58 -1
  56. package/template/apps/agent-server/tests/test_report_summary_parity.py +1 -0
  57. package/template/apps/agent-server/tests/test_run_capacity.py +2 -0
  58. package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +18 -3
  59. package/template/apps/agent-server/tests/test_trajectory.py +91 -0
  60. package/template/apps/agent-server/uv.lock +0 -259
  61. package/template/apps/server/Dockerfile +9 -4
  62. package/template/apps/server/src/agent/actor-projection-audit.ts +6 -0
  63. package/template/apps/server/src/agent/agent-run-delegation-policy.ts +115 -0
  64. package/template/apps/server/src/agent/agent-session-bootstrap.ts +23 -0
  65. package/template/apps/server/src/agent/{debug-session-facade-provider-failure.test.ts → agent-session-facade-provider-failure.test.ts} +24 -33
  66. package/template/apps/server/src/agent/{debug-session-facade.test.ts → agent-session-facade.test.ts} +34 -45
  67. package/template/apps/server/src/agent/{debug-session-facade.ts → agent-session-facade.ts} +50 -57
  68. package/template/apps/server/src/agent/{debug-session-id.test.ts → agent-session-id.test.ts} +5 -5
  69. package/template/apps/server/src/agent/{debug-session-id.ts → agent-session-id.ts} +7 -7
  70. package/template/apps/server/src/agent/{debug-session-provider-reader.ts → agent-session-provider-reader.ts} +18 -15
  71. package/template/apps/server/src/agent/{debug-session-routes.test.ts → agent-session-routes.test.ts} +16 -16
  72. package/template/apps/server/src/agent/{debug-session-routes.ts → agent-session-routes.ts} +12 -12
  73. package/template/apps/server/src/agent/{debug-session-validation.ts → agent-session-validation.ts} +13 -11
  74. package/template/apps/server/src/agent/client-session/authorization.ts +47 -0
  75. package/template/apps/server/src/agent/client-session/bootstrap.ts +96 -0
  76. package/template/apps/server/src/agent/client-session/capabilities.ts +19 -0
  77. package/template/apps/server/src/agent/client-session/completion.ts +299 -0
  78. package/template/apps/server/src/agent/client-session/contracts.ts +136 -0
  79. package/template/apps/server/src/agent/client-session/digest.ts +39 -0
  80. package/template/apps/server/src/agent/client-session/drizzle-repository.integration.test.ts +170 -0
  81. package/template/apps/server/src/agent/client-session/drizzle-repository.ts +345 -0
  82. package/template/apps/server/src/agent/client-session/errors.ts +28 -0
  83. package/template/apps/server/src/agent/client-session/fixtures/page-agent-1.12.2-request.json +52 -0
  84. package/template/apps/server/src/agent/client-session/host-auth.test.ts +144 -0
  85. package/template/apps/server/src/agent/client-session/host-auth.ts +110 -0
  86. package/template/apps/server/src/agent/client-session/manifest-admission.ts +240 -0
  87. package/template/apps/server/src/agent/client-session/openai-stream.ts +123 -0
  88. package/template/apps/server/src/agent/client-session/presentation.ts +46 -0
  89. package/template/apps/server/src/agent/client-session/remote-provider.test.ts +144 -0
  90. package/template/apps/server/src/agent/client-session/remote-provider.ts +216 -0
  91. package/template/apps/server/src/agent/client-session/repository.ts +225 -0
  92. package/template/apps/server/src/agent/client-session/request.test.ts +69 -0
  93. package/template/apps/server/src/agent/client-session/request.ts +289 -0
  94. package/template/apps/server/src/agent/client-session/revocation.ts +23 -0
  95. package/template/apps/server/src/agent/client-session/routes.ts +315 -0
  96. package/template/apps/server/src/agent/client-session/runtime-audit.ts +42 -0
  97. package/template/apps/server/src/agent/client-session/service.test-support.ts +226 -0
  98. package/template/apps/server/src/agent/client-session/service.test.ts +268 -0
  99. package/template/apps/server/src/agent/client-session/service.ts +346 -0
  100. package/template/apps/server/src/agent/context-memory/attempt-context-contracts.ts +60 -0
  101. package/template/apps/server/src/agent/context-memory/authoritative-source-registry.ts +127 -0
  102. package/template/apps/server/src/agent/context-memory/context-builder.test.ts +160 -0
  103. package/template/apps/server/src/agent/context-memory/context-builder.ts +184 -0
  104. package/template/apps/server/src/agent/context-memory/contracts.ts +284 -0
  105. package/template/apps/server/src/agent/context-memory/digest.ts +22 -0
  106. package/template/apps/server/src/agent/context-memory/memory-authorization.ts +82 -0
  107. package/template/apps/server/src/agent/context-memory/memory-content.ts +69 -0
  108. package/template/apps/server/src/agent/context-memory/memory-object-registry.ts +87 -0
  109. package/template/apps/server/src/agent/context-memory/memory-projector-contracts.ts +121 -0
  110. package/template/apps/server/src/agent/context-memory/memory-projector-validation.ts +155 -0
  111. package/template/apps/server/src/agent/context-memory/memory-projector.test.ts +19 -0
  112. package/template/apps/server/src/agent/context-memory/memory-projector.ts +259 -0
  113. package/template/apps/server/src/agent/context-memory/memory-retrieval-policy.ts +195 -0
  114. package/template/apps/server/src/agent/context-memory/memory-retriever.test.ts +339 -0
  115. package/template/apps/server/src/agent/context-memory/memory-retriever.ts +184 -0
  116. package/template/apps/server/src/agent/context-memory/search-provider-port.test.ts +62 -0
  117. package/template/apps/server/src/agent/context-memory/search-provider-port.ts +75 -0
  118. package/template/apps/server/src/agent/context-memory/working-context-expiry.ts +95 -0
  119. package/template/apps/server/src/agent/context-message-recovery.ts +23 -0
  120. package/template/apps/server/src/agent/context-version-routes.ts +241 -0
  121. package/template/apps/server/src/agent/context-version-runtime.ts +332 -0
  122. package/template/apps/server/src/agent/context-version-support.ts +93 -0
  123. package/template/apps/server/src/agent/context-version-validation.ts +118 -0
  124. package/template/apps/server/src/agent/drizzle-run-binding-repository.ts +11 -0
  125. package/template/apps/server/src/agent/idempotency-key.ts +9 -1
  126. package/template/apps/server/src/agent/memory-runtime-adapters.ts +266 -0
  127. package/template/apps/server/src/agent/memory-scope-binding.ts +14 -0
  128. package/template/apps/server/src/agent/module-ai-port-factory.ts +41 -0
  129. package/template/apps/server/src/agent/provider-input-governance.ts +19 -0
  130. package/template/apps/server/src/agent/remote-runtime-response.ts +162 -0
  131. package/template/apps/server/src/agent/remote-runtime.ts +53 -153
  132. package/template/apps/server/src/agent/run-audit.ts +2 -2
  133. package/template/apps/server/src/agent/run-authorization.test.ts +27 -0
  134. package/template/apps/server/src/agent/run-authorization.ts +60 -1
  135. package/template/apps/server/src/agent/run-binding-repository.ts +9 -0
  136. package/template/apps/server/src/agent/run-browser-authorization.ts +79 -0
  137. package/template/apps/server/src/agent/run-contracts.ts +23 -0
  138. package/template/apps/server/src/agent/run-facade.ts +139 -139
  139. package/template/apps/server/src/agent/run-failure-cleanup.ts +58 -0
  140. package/template/apps/server/src/agent/run-operation-policy.ts +20 -0
  141. package/template/apps/server/src/agent/run-route-input.ts +19 -1
  142. package/template/apps/server/src/agent/run-routes.ts +133 -5
  143. package/template/apps/server/src/agent/run-runtime-request.ts +89 -0
  144. package/template/apps/server/src/agent/run-session-authorization.ts +95 -0
  145. package/template/apps/server/src/agent/run-start-preparation.ts +71 -0
  146. package/template/apps/server/src/agent/runtime-bootstrap-input.ts +42 -0
  147. package/template/apps/server/src/agent/runtime-bootstrap-report.test.ts +53 -1
  148. package/template/apps/server/src/agent/runtime-bootstrap.ts +114 -111
  149. package/template/apps/server/src/agent/runtime-tool-composition.ts +38 -0
  150. package/template/apps/server/src/agent/session-context-source-support.ts +38 -0
  151. package/template/apps/server/src/agent/session-context-source.ts +346 -0
  152. package/template/apps/server/src/agent/session-invalidation/contracts.ts +217 -0
  153. package/template/apps/server/src/agent/session-invalidation/dispatcher.contract.test.ts +333 -0
  154. package/template/apps/server/src/agent/session-invalidation/dispatcher.ts +205 -0
  155. package/template/apps/server/src/agent/session-invalidation/module-authoritative-producer.test.ts +127 -0
  156. package/template/apps/server/src/agent/session-invalidation/module-authoritative-producer.ts +202 -0
  157. package/template/apps/server/src/agent/session-invalidation/read-guard.ts +39 -0
  158. package/template/apps/server/src/agent/session-invalidation/runtime.ts +69 -0
  159. package/template/apps/server/src/agent/session-invalidation/test-envelopes.ts +24 -0
  160. package/template/apps/server/src/agent/session-invalidation/worker.contract.test.ts +135 -0
  161. package/template/apps/server/src/agent/session-invalidation/worker.ts +76 -0
  162. package/template/apps/server/src/agent/session-log/checkpoint-digest.ts +36 -0
  163. package/template/apps/server/src/agent/session-log/domain.ts +123 -0
  164. package/template/apps/server/src/agent/session-log/events.ts +229 -0
  165. package/template/apps/server/src/agent/session-log/history.ts +143 -0
  166. package/template/apps/server/src/agent/session-log/in-memory-repository.ts +340 -0
  167. package/template/apps/server/src/agent/session-log/lifecycle.ts +67 -0
  168. package/template/apps/server/src/agent/session-log/replay-policy.ts +76 -0
  169. package/template/apps/server/src/agent/session-log/repository.ts +103 -0
  170. package/template/apps/server/src/agent/session-log/service.ts +349 -0
  171. package/template/apps/server/src/agent/session-log/session-log.test.ts +282 -0
  172. package/template/apps/server/src/agent/session-persistence/drizzle-context-memory.ts +348 -0
  173. package/template/apps/server/src/agent/session-persistence/drizzle-governed-context.ts +328 -0
  174. package/template/apps/server/src/agent/session-persistence/drizzle-invalidation-outbox.ts +260 -0
  175. package/template/apps/server/src/agent/session-persistence/drizzle-memory-projection-deletion.ts +56 -0
  176. package/template/apps/server/src/agent/session-persistence/drizzle-run-projection-receipt.ts +80 -0
  177. package/template/apps/server/src/agent/session-persistence/drizzle-session-fork.ts +147 -0
  178. package/template/apps/server/src/agent/session-persistence/drizzle-session-list.ts +24 -0
  179. package/template/apps/server/src/agent/session-persistence/drizzle-session-mapping.ts +154 -0
  180. package/template/apps/server/src/agent/session-persistence/drizzle-session-mutations.ts +64 -0
  181. package/template/apps/server/src/agent/session-persistence/drizzle-session-repository.ts +335 -0
  182. package/template/apps/server/src/agent/session-persistence/invalidation-projections.ts +229 -0
  183. package/template/apps/server/src/agent/session-persistence/payload-codec.ts +90 -0
  184. package/template/apps/server/src/agent/session-projection-access.ts +155 -0
  185. package/template/apps/server/src/agent/session-projection-bootstrap.ts +87 -0
  186. package/template/apps/server/src/agent/session-projection-errors.ts +22 -0
  187. package/template/apps/server/src/agent/session-projection-facade.ts +349 -0
  188. package/template/apps/server/src/agent/session-projection-routes.ts +215 -0
  189. package/template/apps/server/src/agent/session-projection-view.ts +137 -0
  190. package/template/apps/server/src/agent/session-result-memory.ts +228 -0
  191. package/template/apps/server/src/agent/session-run-lifecycle.ts +85 -0
  192. package/template/apps/server/src/agent/session-run-link-contracts.ts +56 -0
  193. package/template/apps/server/src/agent/session-run-link.ts +343 -0
  194. package/template/apps/server/src/agent/session-run-recovery.ts +16 -0
  195. package/template/apps/server/src/agent/session-runtime-composition.ts +265 -0
  196. package/template/apps/server/src/agent/session-source-chain-authorizer.ts +141 -0
  197. package/template/apps/server/src/agent/session-terminal-reconciler.ts +100 -0
  198. package/template/apps/server/src/agent/session-turn-state.ts +49 -0
  199. package/template/apps/server/src/agent/tool-audit.ts +3 -3
  200. package/template/apps/server/src/agent/tool-execution-receipt.ts +13 -0
  201. package/template/apps/server/src/agent/tool-host.ts +41 -4
  202. package/template/apps/server/src/agent/tool-registry-composition.ts +52 -0
  203. package/template/apps/server/src/agent/tool-registry.test.ts +5 -5
  204. package/template/apps/server/src/agent/tool-registry.ts +53 -59
  205. package/template/apps/server/src/agent/unavailable-routes.ts +49 -5
  206. package/template/apps/server/src/agent/workflow-durable-runtime-input.ts +32 -0
  207. package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +59 -0
  208. package/template/apps/server/src/agent-workflow/adapter-dispatch.ts +148 -0
  209. package/template/apps/server/src/agent-workflow/approval-node-adapter.ts +77 -0
  210. package/template/apps/server/src/agent-workflow/artifact-access-error.ts +9 -0
  211. package/template/apps/server/src/agent-workflow/artifact-node-adapter.ts +67 -0
  212. package/template/apps/server/src/agent-workflow/artifact-policy.ts +71 -0
  213. package/template/apps/server/src/agent-workflow/artifact-source-authorization.ts +85 -0
  214. package/template/apps/server/src/agent-workflow/authorization.ts +238 -0
  215. package/template/apps/server/src/agent-workflow/budget-ledger.ts +118 -0
  216. package/template/apps/server/src/agent-workflow/budget-validation.ts +305 -0
  217. package/template/apps/server/src/agent-workflow/canonical-agent-run-binding.ts +17 -0
  218. package/template/apps/server/src/agent-workflow/canonical-agent-run-evidence.ts +142 -0
  219. package/template/apps/server/src/agent-workflow/canonical-agent-run-port.ts +304 -0
  220. package/template/apps/server/src/agent-workflow/canonical-agent-run-remote.ts +64 -0
  221. package/template/apps/server/src/agent-workflow/canonical-json.ts +16 -0
  222. package/template/apps/server/src/agent-workflow/command-drive.ts +195 -0
  223. package/template/apps/server/src/agent-workflow/command-error.ts +9 -0
  224. package/template/apps/server/src/agent-workflow/command-facade.ts +290 -0
  225. package/template/apps/server/src/agent-workflow/command-input.ts +133 -0
  226. package/template/apps/server/src/agent-workflow/condition-node-adapter.ts +69 -0
  227. package/template/apps/server/src/agent-workflow/definition-budget-validation.ts +41 -0
  228. package/template/apps/server/src/agent-workflow/definition-node-validation.ts +197 -0
  229. package/template/apps/server/src/agent-workflow/definition-validation.ts +198 -0
  230. package/template/apps/server/src/agent-workflow/delegated-tool-authorization.ts +15 -0
  231. package/template/apps/server/src/agent-workflow/delegation-child-delivery.ts +129 -0
  232. package/template/apps/server/src/agent-workflow/delegation-execution-authorization.ts +218 -0
  233. package/template/apps/server/src/agent-workflow/delegation-policy-validation.ts +253 -0
  234. package/template/apps/server/src/agent-workflow/delegation-policy.ts +179 -0
  235. package/template/apps/server/src/agent-workflow/drizzle-artifact-port.ts +211 -0
  236. package/template/apps/server/src/agent-workflow/drizzle-artifact-support.ts +152 -0
  237. package/template/apps/server/src/agent-workflow/drizzle-budget-ledger-settlement.ts +271 -0
  238. package/template/apps/server/src/agent-workflow/drizzle-budget-ledger-support.ts +226 -0
  239. package/template/apps/server/src/agent-workflow/drizzle-budget-ledger.ts +189 -0
  240. package/template/apps/server/src/agent-workflow/drizzle-cancellation-reconcile.ts +177 -0
  241. package/template/apps/server/src/agent-workflow/drizzle-delegated-tool-authorization.ts +155 -0
  242. package/template/apps/server/src/agent-workflow/drizzle-delegation-completion.ts +84 -0
  243. package/template/apps/server/src/agent-workflow/drizzle-delegation-lifecycle.ts +139 -0
  244. package/template/apps/server/src/agent-workflow/drizzle-delegation-port.ts +288 -0
  245. package/template/apps/server/src/agent-workflow/drizzle-effect-command-fence.ts +333 -0
  246. package/template/apps/server/src/agent-workflow/drizzle-evaluation-repository.ts +214 -0
  247. package/template/apps/server/src/agent-workflow/drizzle-event-validation.ts +43 -0
  248. package/template/apps/server/src/agent-workflow/drizzle-recovery-admission.ts +115 -0
  249. package/template/apps/server/src/agent-workflow/drizzle-repository-lineage.ts +103 -0
  250. package/template/apps/server/src/agent-workflow/drizzle-repository-mappers.ts +317 -0
  251. package/template/apps/server/src/agent-workflow/drizzle-repository-write.ts +311 -0
  252. package/template/apps/server/src/agent-workflow/drizzle-repository.ts +285 -0
  253. package/template/apps/server/src/agent-workflow/drizzle-side-effect-repository.ts +83 -0
  254. package/template/apps/server/src/agent-workflow/drizzle-write-support.ts +101 -0
  255. package/template/apps/server/src/agent-workflow/durable-continuation-authorization.ts +109 -0
  256. package/template/apps/server/src/agent-workflow/durable-continuation-driver.ts +97 -0
  257. package/template/apps/server/src/agent-workflow/durable-continuation-runtime.ts +173 -0
  258. package/template/apps/server/src/agent-workflow/durable-job-node-adapter.ts +106 -0
  259. package/template/apps/server/src/agent-workflow/effect-command-fence.ts +250 -0
  260. package/template/apps/server/src/agent-workflow/evaluation-evidence-coordinates.ts +225 -0
  261. package/template/apps/server/src/agent-workflow/evaluation-evidence-metrics.ts +280 -0
  262. package/template/apps/server/src/agent-workflow/evaluation-evidence-reader.ts +326 -0
  263. package/template/apps/server/src/agent-workflow/evaluation-metrics-validation.ts +85 -0
  264. package/template/apps/server/src/agent-workflow/evaluation-projection.ts +70 -0
  265. package/template/apps/server/src/agent-workflow/evaluation-repository.ts +134 -0
  266. package/template/apps/server/src/agent-workflow/evaluation-service.ts +292 -0
  267. package/template/apps/server/src/agent-workflow/evaluation-tool-registration.ts +95 -0
  268. package/template/apps/server/src/agent-workflow/evaluation-validation.ts +331 -0
  269. package/template/apps/server/src/agent-workflow/event-validation.ts +277 -0
  270. package/template/apps/server/src/agent-workflow/governed-tool-schema.ts +55 -0
  271. package/template/apps/server/src/agent-workflow/in-memory-evaluation-repository.ts +123 -0
  272. package/template/apps/server/src/agent-workflow/in-memory-mutation-validation.ts +154 -0
  273. package/template/apps/server/src/agent-workflow/in-memory-repository-support.ts +277 -0
  274. package/template/apps/server/src/agent-workflow/in-memory-repository.ts +339 -0
  275. package/template/apps/server/src/agent-workflow/in-memory-side-effect-store.ts +78 -0
  276. package/template/apps/server/src/agent-workflow/input-receipt.ts +55 -0
  277. package/template/apps/server/src/agent-workflow/model-node-adapter.ts +86 -0
  278. package/template/apps/server/src/agent-workflow/model-pricing-catalog.ts +215 -0
  279. package/template/apps/server/src/agent-workflow/node-adapter-factory.ts +83 -0
  280. package/template/apps/server/src/agent-workflow/node-adapters.ts +50 -0
  281. package/template/apps/server/src/agent-workflow/node-execution-ports.ts +185 -0
  282. package/template/apps/server/src/agent-workflow/node-input-receipt-port.ts +42 -0
  283. package/template/apps/server/src/agent-workflow/node-result-receipt.ts +50 -0
  284. package/template/apps/server/src/agent-workflow/platform-node-adapter-support.ts +185 -0
  285. package/template/apps/server/src/agent-workflow/platform-node-adapters.ts +256 -0
  286. package/template/apps/server/src/agent-workflow/platform-node-approval.ts +146 -0
  287. package/template/apps/server/src/agent-workflow/platform-node-direct-adapters.ts +65 -0
  288. package/template/apps/server/src/agent-workflow/production-delegation-scope.ts +58 -0
  289. package/template/apps/server/src/agent-workflow/production-node-policies.ts +62 -0
  290. package/template/apps/server/src/agent-workflow/query-service.ts +198 -0
  291. package/template/apps/server/src/agent-workflow/release.ts +96 -0
  292. package/template/apps/server/src/agent-workflow/repository.ts +157 -0
  293. package/template/apps/server/src/agent-workflow/routes.ts +307 -0
  294. package/template/apps/server/src/agent-workflow/runtime-composition.ts +308 -0
  295. package/template/apps/server/src/agent-workflow/scheduler-cancellation-reconcile.ts +253 -0
  296. package/template/apps/server/src/agent-workflow/scheduler-cancellation-support.ts +145 -0
  297. package/template/apps/server/src/agent-workflow/scheduler-cancellation.ts +2 -0
  298. package/template/apps/server/src/agent-workflow/scheduler-context.ts +85 -0
  299. package/template/apps/server/src/agent-workflow/scheduler-deadline.ts +65 -0
  300. package/template/apps/server/src/agent-workflow/scheduler-effect-result.ts +205 -0
  301. package/template/apps/server/src/agent-workflow/scheduler-execution-convergence.ts +174 -0
  302. package/template/apps/server/src/agent-workflow/scheduler-execution.ts +211 -0
  303. package/template/apps/server/src/agent-workflow/scheduler-failure.ts +102 -0
  304. package/template/apps/server/src/agent-workflow/scheduler-join-cancellation.ts +282 -0
  305. package/template/apps/server/src/agent-workflow/scheduler-mutation-queue.ts +13 -0
  306. package/template/apps/server/src/agent-workflow/scheduler-node-timeout.ts +139 -0
  307. package/template/apps/server/src/agent-workflow/scheduler-parallel-dispatch.ts +99 -0
  308. package/template/apps/server/src/agent-workflow/scheduler-recovery-activation.ts +63 -0
  309. package/template/apps/server/src/agent-workflow/scheduler-recovery-budget.ts +41 -0
  310. package/template/apps/server/src/agent-workflow/scheduler-recovery-effect.ts +331 -0
  311. package/template/apps/server/src/agent-workflow/scheduler-recovery-event-time.ts +26 -0
  312. package/template/apps/server/src/agent-workflow/scheduler-recovery-failed-policy.ts +129 -0
  313. package/template/apps/server/src/agent-workflow/scheduler-recovery-node.ts +208 -0
  314. package/template/apps/server/src/agent-workflow/scheduler-recovery-policy-convergence.ts +140 -0
  315. package/template/apps/server/src/agent-workflow/scheduler-reservation-convergence.ts +40 -0
  316. package/template/apps/server/src/agent-workflow/scheduler-side-effect-execution.ts +249 -0
  317. package/template/apps/server/src/agent-workflow/scheduler-support.ts +235 -0
  318. package/template/apps/server/src/agent-workflow/scheduler-workflow-cancellation.ts +296 -0
  319. package/template/apps/server/src/agent-workflow/scheduler.ts +289 -0
  320. package/template/apps/server/src/agent-workflow/service-completion.ts +102 -0
  321. package/template/apps/server/src/agent-workflow/service-mutation-identity.ts +94 -0
  322. package/template/apps/server/src/agent-workflow/service-node-admission.ts +36 -0
  323. package/template/apps/server/src/agent-workflow/service-node-run-update.ts +55 -0
  324. package/template/apps/server/src/agent-workflow/service-recovery-events.ts +38 -0
  325. package/template/apps/server/src/agent-workflow/service-recovery.ts +264 -0
  326. package/template/apps/server/src/agent-workflow/service-retry.ts +86 -0
  327. package/template/apps/server/src/agent-workflow/service-run-command.ts +131 -0
  328. package/template/apps/server/src/agent-workflow/service-state-error.ts +21 -0
  329. package/template/apps/server/src/agent-workflow/service-state-invariants.ts +44 -0
  330. package/template/apps/server/src/agent-workflow/service-support.ts +152 -0
  331. package/template/apps/server/src/agent-workflow/service.ts +307 -0
  332. package/template/apps/server/src/agent-workflow/side-effect-state.ts +226 -0
  333. package/template/apps/server/src/agent-workflow/state-machine.ts +321 -0
  334. package/template/apps/server/src/agent-workflow/subagent-node-adapter.ts +229 -0
  335. package/template/apps/server/src/agent-workflow/tool-node-adapter.ts +259 -0
  336. package/template/apps/server/src/agent-workflow/usage.ts +149 -0
  337. package/template/apps/server/src/agent-workflow/wait-signal-service.ts +147 -0
  338. package/template/apps/server/src/agent-workflow/workflow-artifact-token.ts +109 -0
  339. package/template/apps/server/src/agent-workflow/workflow-value-validation.ts +101 -0
  340. package/template/apps/server/src/agent-workflow/workspace-policy.ts +109 -0
  341. package/template/apps/server/src/ai-runtime-report/remote-parser.ts +41 -0
  342. package/template/apps/server/src/ai-runtime-report/service.test.ts +2 -0
  343. package/template/apps/server/src/app/agent-runtime-composition.ts +38 -0
  344. package/template/apps/server/src/app/client-agent-host-auth-binding.ts +10 -0
  345. package/template/apps/server/src/auth/actor-resolver.test.ts +33 -0
  346. package/template/apps/server/src/auth/actor-resolver.ts +6 -1
  347. package/template/apps/server/src/auth/composition.ts +36 -0
  348. package/template/apps/server/src/auth/routes.test-support.ts +2 -0
  349. package/template/apps/server/src/auth/routes.test.ts +18 -0
  350. package/template/apps/server/src/auth/runtime.ts +2 -0
  351. package/template/apps/server/src/auth/service-options.ts +16 -0
  352. package/template/apps/server/src/auth/service.ts +7 -12
  353. package/template/apps/server/src/index.ts +35 -37
  354. package/template/apps/server/src/license/pairing-service.test.ts +1 -1
  355. package/template/apps/server/src/module-host/agent-session-memory-port.ts +91 -0
  356. package/template/apps/server/src/module-host/{debug-session-provider-registration.test.ts → agent-session-provider-registration.test.ts} +42 -17
  357. package/template/apps/server/src/module-host/{debug-session-provider-registration.ts → agent-session-provider-registration.ts} +18 -18
  358. package/template/apps/server/src/module-host/agent-source-invalidation-port.ts +53 -0
  359. package/template/apps/server/src/module-host/http-runtime.ts +14 -0
  360. package/template/apps/server/src/module-host/initialize-contracts.ts +4 -5
  361. package/template/apps/server/src/module-host/initialize.ts +4 -4
  362. package/template/apps/server/src/module-host/request-context.test.ts +5 -5
  363. package/template/apps/server/src/module-host/request-context.ts +8 -0
  364. package/template/apps/server/src/module-host/route-install-context.ts +65 -0
  365. package/template/apps/server/src/module-host/route-installer.ts +11 -56
  366. package/template/apps/server/src/module-host/scoped-host.ts +17 -12
  367. package/template/apps/server/src/module-host/storage-authorization-binding.test.ts +3 -3
  368. package/template/apps/server/src/module-host.ts +3 -5
  369. package/template/apps/server/src/runtime.ts +3 -36
  370. package/template/apps/server/src/storage/routes-stream-cancellation.test.ts +19 -0
  371. package/template/apps/server/src/storage/routes.ts +3 -1
  372. package/template/apps/server/src/system/actor.ts +15 -2
  373. package/template/apps/server/src/system/authorization-invalidation-bridge.ts +30 -0
  374. package/template/apps/server/src/system/authorization-invalidation-composition.ts +36 -0
  375. package/template/apps/server/src/system/drizzle-system.ts +8 -1
  376. package/template/apps/server/src/system/identity-route-config.ts +9 -1
  377. package/template/apps/server/src/system/routes.ts +3 -0
  378. package/template/apps/server/src/system/seed.ts +3 -0
  379. package/template/apps/server/src/system/user-account-policy.ts +91 -0
  380. package/template/apps/web/package.json +1 -0
  381. package/template/apps/web/src/layout/AppSidebar.vue +2 -0
  382. package/template/apps/web/src/pages/system/AgentSessionPage.vue +73 -0
  383. package/template/apps/web/src/pages/system/AgentSessionPage.webtest.ts +66 -0
  384. package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +69 -0
  385. package/template/apps/web/src/pages/system/components/agent-session/AgentSessionDetail.vue +114 -0
  386. package/template/apps/web/src/pages/system/components/agent-session/AgentSessionList.vue +84 -0
  387. package/template/apps/web/src/pages/system/components/agent-session/ContextVersionPanel.vue +119 -0
  388. package/template/apps/web/src/pages/system/components/agent-session/ContextVersionPanel.webtest.ts +46 -0
  389. package/template/apps/web/src/pages/system/components/agent-session/MemoryProjectionPanel.vue +163 -0
  390. package/template/apps/web/src/pages/system/components/agent-session/MemoryProjectionPanel.webtest.ts +62 -0
  391. package/template/apps/web/src/pages/system/components/agent-session/SessionTimeline.vue +71 -0
  392. package/template/apps/web/src/pages/system/components/agent-session/SessionTimeline.webtest.ts +34 -0
  393. package/template/apps/web/src/pages/system/components/agent-session/agent-session-presenter.ts +56 -0
  394. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowNodeCard.vue +39 -0
  395. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowNodeDetail.vue +172 -0
  396. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunDetail.vue +151 -0
  397. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunGraph.vue +96 -0
  398. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunList.vue +100 -0
  399. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunSummary.vue +148 -0
  400. package/template/apps/web/src/pages/system/components/agent-workflow/agent-workflow-presenter.ts +74 -0
  401. package/template/apps/web/src/pages/system/components/agent-workflow/workflow-graph-layout.ts +108 -0
  402. package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunDetailDialog.vue +9 -0
  403. package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunDetailDialog.webtest.ts +22 -0
  404. package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunTable.webtest.ts +2 -0
  405. package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeTrajectory.vue +118 -0
  406. package/template/apps/web/src/pages/system/composables/useAgentSessions.ts +209 -0
  407. package/template/apps/web/src/pages/system/composables/useAgentSessions.webtest.ts +138 -0
  408. package/template/apps/web/src/pages/system/composables/useAgentWorkflowRuns.ts +173 -0
  409. package/template/apps/web/src/router/index.ts +4 -0
  410. package/template/apps/web/src/router/platform-admin-route-bindings.ts +6 -0
  411. package/template/apps/web/src/services/agent-session-api.ts +159 -0
  412. package/template/apps/web/src/services/agent-session-api.webtest.ts +65 -0
  413. package/template/apps/web/src/services/agent-workflow-api.ts +181 -0
  414. package/template/apps/web/src/services/ai-runtime-api.ts +4 -0
  415. package/template/docker-compose.yml +11 -8
  416. package/template/docs/adr/0003-agent-session-event-source.md +3 -0
  417. package/template/docs/architecture/agent-harness.md +464 -0
  418. package/template/docs/architecture/agent-workflow.md +99 -0
  419. package/template/docs/architecture/ai-runtime.md +55 -47
  420. package/template/docs/architecture/module-host.md +4 -3
  421. package/template/docs/operations/adk-retirement.md +98 -0
  422. package/template/docs/operations/agent-session-memory.md +162 -0
  423. package/template/docs/operations/agent-session-troubleshooting.md +196 -0
  424. package/template/docs/operations/agent-workflow-recovery.md +74 -0
  425. package/template/docs/operations/incremental-delivery.md +1 -1
  426. package/template/docs/platform/agent-production-store.md +82 -0
  427. package/template/docs/platform/agent-run-reattachment.md +52 -0
  428. package/template/docs/platform/agent-runtime-observability.md +4 -3
  429. package/template/docs/platform/agent-runtime.md +116 -281
  430. package/template/docs/platform/agent-tool-approval.md +61 -0
  431. package/template/docs/platform/background-ai-operations.md +50 -0
  432. package/template/docs/platform/client-agent-session.md +173 -0
  433. package/template/docs/platform/embedding-ai-runtime.md +94 -0
  434. package/template/docs/platform/platform-authentication.md +5 -8
  435. package/template/package.json +0 -1
  436. package/template/packages/ai-client/index.ts +1 -0
  437. package/template/packages/ai-client/package.json +2 -1
  438. package/template/packages/ai-client/src/agent/client/client.ts +15 -2
  439. package/template/packages/ai-client/src/agent/client/run-protocol.test.ts +39 -25
  440. package/template/packages/ai-client/src/agent/client/types.ts +4 -0
  441. package/template/packages/ai-client/src/agent/contracts/contracts.test.ts +49 -7
  442. package/template/packages/ai-client/src/agent/contracts/events.ts +61 -0
  443. package/template/packages/ai-client/src/agent/contracts/runs.ts +1 -0
  444. package/template/packages/ai-client/src/client-agent/contracts.ts +131 -0
  445. package/template/packages/ai-client/src/client-agent/http.test.ts +60 -0
  446. package/template/packages/ai-client/src/client-agent/http.ts +66 -0
  447. package/template/packages/ai-client/src/client-agent/index.ts +3 -0
  448. package/template/packages/ai-client/src/client-agent/validation.test.ts +57 -0
  449. package/template/packages/ai-client/src/client-agent/validation.ts +152 -0
  450. package/template/packages/config/index.test.ts +18 -0
  451. package/template/packages/config/package.json +1 -1
  452. package/template/packages/config/src/platform-validation.ts +8 -0
  453. package/template/packages/config/src/platform.ts +22 -9
  454. package/template/packages/database/drizzle/0055_square_yellowjacket.sql +47 -0
  455. package/template/packages/database/drizzle/0056_tricky_living_mummy.sql +2 -0
  456. package/template/packages/database/drizzle/0057_mature_doomsday.sql +4 -0
  457. package/template/packages/database/drizzle/0058_agent_session_memory.sql +159 -0
  458. package/template/packages/database/drizzle/0059_agent_source_module_key.sql +16 -0
  459. package/template/packages/database/drizzle/0060_slimy_rocket_raccoon.sql +43 -0
  460. package/template/packages/database/drizzle/0061_agent_workflow.sql +303 -0
  461. package/template/packages/database/drizzle/meta/0055_snapshot.json +11071 -0
  462. package/template/packages/database/drizzle/meta/0056_snapshot.json +11098 -0
  463. package/template/packages/database/drizzle/meta/0057_snapshot.json +10878 -0
  464. package/template/packages/database/drizzle/meta/0058_snapshot.json +12294 -0
  465. package/template/packages/database/drizzle/meta/0059_snapshot.json +12344 -0
  466. package/template/packages/database/drizzle/meta/0060_snapshot.json +12326 -0
  467. package/template/packages/database/drizzle/meta/0061_snapshot.json +14395 -0
  468. package/template/packages/database/drizzle/meta/_journal.json +49 -0
  469. package/template/packages/database/package.json +1 -1
  470. package/template/packages/database/src/agent-runtime-schema.test.ts +26 -0
  471. package/template/packages/database/src/schema/agent-context-message.ts +38 -0
  472. package/template/packages/database/src/schema/agent-runtime.ts +7 -0
  473. package/template/packages/database/src/schema/agent-session-receipt.ts +36 -0
  474. package/template/packages/database/src/schema/agent-session.ts +344 -0
  475. package/template/packages/database/src/schema/agent-workflow-delegation.ts +126 -0
  476. package/template/packages/database/src/schema/agent-workflow-effects.ts +213 -0
  477. package/template/packages/database/src/schema/agent-workflow-evaluation.ts +67 -0
  478. package/template/packages/database/src/schema/agent-workflow.ts +270 -0
  479. package/template/packages/database/src/schema/client-agent.ts +95 -0
  480. package/template/packages/database/src/schema/index.ts +8 -0
  481. package/template/packages/jobs/package.json +1 -1
  482. package/template/packages/modules/index.ts +2 -0
  483. package/template/packages/modules/package.json +1 -1
  484. package/template/packages/modules/src/ai-client-execution-composition.test.ts +98 -0
  485. package/template/packages/modules/src/ai-client-execution-policy.ts +54 -0
  486. package/template/packages/modules/src/ai-operation-composition.ts +2 -0
  487. package/template/packages/modules/src/manifest.ts +15 -0
  488. package/template/packages/modules/src/system-admin-routes.ts +16 -0
  489. package/template/packages/modules/src/system-admin-ui-catalog.ts +4 -1
  490. package/template/packages/modules/src/system-agent-audit-actions.ts +26 -0
  491. package/template/packages/modules/src/system-ai-api-bindings.ts +262 -0
  492. package/template/packages/modules/src/system-api-control-plane.ts +4 -78
  493. package/template/packages/modules/src/system-audit-actions.ts +113 -0
  494. package/template/packages/modules/src/system-features.ts +17 -0
  495. package/template/packages/modules/src/system-module-catalog.ts +21 -11
  496. package/template/packages/modules/src/system-modules.ts +22 -0
  497. package/template/packages/modules/src/system-permissions.ts +8 -0
  498. package/template/packages/server-sdk/index.ts +43 -0
  499. package/template/packages/server-sdk/package.json +5 -1
  500. package/template/packages/server-sdk/src/agent-session-memory-port.ts +64 -0
  501. package/template/packages/server-sdk/src/agent-session-provider.ts +63 -0
  502. package/template/packages/server-sdk/src/agent-source-invalidation-port.ts +54 -0
  503. package/template/packages/server-sdk/src/ai-operation-registration.ts +2 -0
  504. package/template/packages/server-sdk/src/client-agent-session.ts +95 -0
  505. package/template/packages/server-sdk/src/debug-session-provider.ts +14 -63
  506. package/template/packages/server-sdk/src/module-host.ts +7 -3
  507. package/template/packages/server-sdk/src/request-context.ts +6 -0
  508. package/template/packages/shared/index.ts +3 -0
  509. package/template/packages/shared/package.json +1 -1
  510. package/template/packages/shared/src/agent-workflow-definition.ts +113 -0
  511. package/template/packages/shared/src/agent-workflow-delegation.ts +123 -0
  512. package/template/packages/shared/src/agent-workflow-evaluation.ts +159 -0
  513. package/template/packages/shared/src/agent-workflow-events.ts +99 -0
  514. package/template/packages/shared/src/agent-workflow-run.ts +259 -0
  515. package/template/packages/shared/src/agent-workflow.ts +3 -0
  516. package/template/packages/shared/src/ai-runtime-report.ts +25 -0
  517. package/template/packages/shared/src/rbac.ts +24 -0
  518. package/template/packages/storage/package.json +1 -1
  519. package/template/packages/storage/src/upload-streams.test.ts +31 -0
  520. package/template/packages/storage/src/upload-streams.ts +20 -6
  521. package/template/apps/agent-server/adk_web_agents/__init__.py +0 -1
  522. package/template/apps/agent-server/adk_web_agents/canonical_debug/__init__.py +0 -1
  523. package/template/apps/agent-server/adk_web_agents/canonical_debug/agent.py +0 -145
  524. package/template/apps/agent-server/adk_web_agents/safe_debug/__init__.py +0 -3
  525. package/template/apps/agent-server/adk_web_agents/safe_debug/agent.py +0 -40
  526. package/template/apps/agent-server/adk_web_agents/services.py +0 -25
  527. package/template/apps/agent-server/project/adk-web-debug.json +0 -4
  528. package/template/apps/agent-server/src/southwind_agent_server/adk_adapter.py +0 -333
  529. package/template/apps/agent-server/src/southwind_agent_server/adk_debug.py +0 -348
  530. package/template/apps/agent-server/src/southwind_agent_server/adk_debug_sessions.py +0 -325
  531. package/template/apps/agent-server/src/southwind_agent_server/adk_failure.py +0 -13
  532. package/template/apps/agent-server/src/southwind_agent_server/adk_model.py +0 -304
  533. package/template/apps/agent-server/src/southwind_agent_server/adk_tools.py +0 -143
  534. package/template/apps/agent-server/tests/test_adk_adapter.py +0 -307
  535. package/template/apps/agent-server/tests/test_adk_debug_result_polling.py +0 -139
  536. package/template/apps/agent-server/tests/test_adk_debug_sessions.py +0 -215
  537. package/template/apps/agent-server/tests/test_adk_web_agent.py +0 -12
  538. package/template/apps/agent-server/tests/test_adk_web_canonical_debug.py +0 -282
  539. package/template/apps/server/src/agent/run-debug-authorization.ts +0 -27
  540. package/template/apps/server/src/agent/run-facade-adk-debug.test.ts +0 -95
  541. package/template/apps/server/src/runtime-adk-debug.test.ts +0 -270
  542. package/template/apps/server/src/runtime-adk-debug.ts +0 -164
  543. package/template/apps/server/src/runtime-request-actor.test.ts +0 -55
  544. package/template/apps/server/src/runtime-request-actor.ts +0 -22
  545. package/template/docker-compose.agent-debug.yml +0 -58
  546. 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
- 选择 Agent 模块的新项目会在本机 `.env` 自动生成独立随机
103
- `ADK_DEBUG_PLATFORM_TOKEN`。只有 `bun run dev:adk-web` 加载的开发 Compose Wrapper
104
- 会把它作为 `WINDY_ADK_DEBUG_TOKEN` 注入 Server,并注入 localhost-only ADK Web;它
105
- 不会复用 `WINDY_DEV_ADMIN_TOKEN`,也不会启用固定 `dev-admin-token` 或 `user:` 直通。
106
- Server 仅在 canonical Agent Run 路径和只读
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
 
@@ -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,4 +1,5 @@
1
1
  export * from "./src/agent/index.js";
2
+ export * from "./src/client-agent/index.js";
2
3
  export type { ArtifactRef } from "./src/artifact-ref.js";
3
4
  export * from "./src/document/index.js";
4
5
  export * from "./src/embedding/index.js";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@southwind-ai/ai-client",
3
- "version": "0.2.1",
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({ operationKey: operation.key, cursor }),
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 = `operationKey=${encodeURIComponent(operation.key)}`;
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 解析 heartbeat 和事件 frame", async () => {
33
- const started = frame({
34
- type: "run.started",
35
- runId: "run-chunks",
36
- sequence: 1,
37
- });
38
- const completed = frame({
39
- type: "run.completed",
40
- runId: "run-chunks",
41
- sequence: 2,
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
- sse([
52
- ": heart",
53
- "beat\n\n" + started.slice(0, 9),
54
- started.slice(9) + completed.slice(0, 17),
55
- completed.slice(17),
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((await events).map(({ type }) => type)).toEqual([
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(plans: Array<() => Response>): {
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
- { type: "output.delta", runId: "run-1", sequence: 2, text: "你好" },
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: 3,
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: 4,
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: 5,
52
+ sequence: 6,
46
53
  toolCallId: "call-1",
47
54
  },
48
55
  {
49
56
  type: "usage.reported",
50
57
  runId: "run-1",
51
- sequence: 6,
58
+ sequence: 7,
52
59
  usage: { source: "provider-reported", inputTokens: 10 },
53
60
  },
54
- { type: "run.completed", runId: "run-1", sequence: 7 },
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: output.delta\ndata: ${JSON.stringify(event)}`;
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,