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,74 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+
5
+ from .contracts import RuntimeLimits
6
+ from .engine import SafeEngineError
7
+ from .report_types import UsageFacts
8
+
9
+
10
+ @dataclass
11
+ class RuntimeBudgetAdmission:
12
+ limits: RuntimeLimits
13
+ input_tokens: int = 0
14
+ output_tokens: int = 0
15
+ tool_calls: int = 0
16
+
17
+ def before_attempt(self, attempt: int) -> int | None:
18
+ if (
19
+ self.limits.max_model_attempts is not None
20
+ and attempt > self.limits.max_model_attempts
21
+ ):
22
+ self._denied("Agent 模型调用次数超过 Workflow 上限")
23
+ if self.limits.max_input_tokens is not None:
24
+ if self.input_tokens >= self.limits.max_input_tokens:
25
+ self._denied("Agent 输入 Token 已耗尽")
26
+ if self.limits.max_output_tokens is None:
27
+ return None
28
+ remaining = self.limits.max_output_tokens - self.output_tokens
29
+ if remaining <= 0:
30
+ self._denied("Agent 输出 Token 已耗尽")
31
+ return remaining
32
+
33
+ def record_usage(self, usage: UsageFacts) -> None:
34
+ if usage.input_tokens is None or usage.output_tokens is None:
35
+ if (
36
+ self.limits.max_input_tokens is not None
37
+ or self.limits.max_output_tokens is not None
38
+ ):
39
+ self._denied("Provider 未返回 Workflow Token 计量")
40
+ return
41
+ self.input_tokens += usage.input_tokens
42
+ self.output_tokens += usage.output_tokens
43
+ if (
44
+ self.limits.max_input_tokens is not None
45
+ and self.input_tokens > self.limits.max_input_tokens
46
+ ):
47
+ self._denied("Agent 输入 Token 超过 Workflow 上限")
48
+ if (
49
+ self.limits.max_output_tokens is not None
50
+ and self.output_tokens > self.limits.max_output_tokens
51
+ ):
52
+ self._denied("Agent 输出 Token 超过 Workflow 上限")
53
+
54
+ def before_provider(self, conservative_input_tokens: int) -> None:
55
+ if conservative_input_tokens < 0:
56
+ self._denied("Agent 输入 Token 上界无效")
57
+ if (
58
+ self.limits.max_input_tokens is not None
59
+ and self.input_tokens + conservative_input_tokens
60
+ > self.limits.max_input_tokens
61
+ ):
62
+ self._denied("Agent 本次输入可能超过 Workflow Token 上限")
63
+
64
+ def reserve_tools(self, count: int) -> None:
65
+ self.tool_calls += count
66
+ if (
67
+ self.limits.max_tool_calls is not None
68
+ and self.tool_calls > self.limits.max_tool_calls
69
+ ):
70
+ self._denied("Agent Tool 调用次数超过 Workflow 上限")
71
+
72
+ @staticmethod
73
+ def _denied(message: str) -> None:
74
+ raise SafeEngineError("BUDGET_EXCEEDED", message, retryable=False)
@@ -2,9 +2,10 @@ from __future__ import annotations
2
2
 
3
3
  import os
4
4
 
5
- from .adk_adapter import AdkEngineAdapter
6
5
  from .config import EnvironmentSecretResolver, OpenAiCompatibleConfig
6
+ from .context_version_port import HttpContextVersionPort, UnavailableContextVersionPort
7
7
  from .engine import AgentEngineAdapter
8
+ from .openai_engine import OpenAiCompatibleEngineAdapter
8
9
  from .openai_provider import OpenAiCompatibleProvider
9
10
  from .postgres_report_store import PostgresAgentRuntimeReportStore
10
11
  from .postgres_store import PostgresRunStore
@@ -18,6 +19,7 @@ from .sqlite_store import SqliteRunStore
18
19
  from .store import InMemoryRunStore, RunStore
19
20
  from .store_cipher import RunStoreCipher
20
21
  from .tool_host import ToolHostClient
22
+ from .unavailable_engine import UnavailableEngineAdapter
21
23
 
22
24
 
23
25
  def default_engine(
@@ -25,11 +27,12 @@ def default_engine(
25
27
  ) -> AgentEngineAdapter:
26
28
  config = OpenAiCompatibleConfig.from_environment()
27
29
  if config is None:
28
- return AdkEngineAdapter(report_store=report_store)
30
+ return UnavailableEngineAdapter()
29
31
  internal_token = os.environ.get("AGENT_SERVER_INTERNAL_TOKEN", "").strip()
30
32
  if not internal_token:
31
33
  raise ValueError("Agent Server Provider 已配置但内部 Token 缺失")
32
- return AdkEngineAdapter(
34
+ context_host_url = os.environ.get("AGENT_CONTEXT_HOST_URL", "").strip()
35
+ return OpenAiCompatibleEngineAdapter(
33
36
  OpenAiCompatibleProvider(
34
37
  config,
35
38
  EnvironmentSecretResolver(os.environ),
@@ -42,6 +45,11 @@ def default_engine(
42
45
  )
43
46
  ),
44
47
  report_store,
48
+ (
49
+ HttpContextVersionPort(context_host_url, internal_token)
50
+ if context_host_url
51
+ else UnavailableContextVersionPort()
52
+ ),
45
53
  )
46
54
 
47
55
 
@@ -23,10 +23,11 @@ from .report_lifecycle import (
23
23
  from .report_store import AgentRuntimeReportStore
24
24
  from .run_admission import RunAdmission
25
25
  from .run_capacity import RunCapacity, RunCapacityReservation
26
- from .service_errors import OperationNotFoundError, RunNotFoundError
26
+ from .service_control import AgentRunControlMixin
27
+ from .service_errors import OperationNotFoundError
27
28
  from .service_execution import build_engine_run_request
28
29
  from .service_tasks import complete_task, renew_lease, run_admitted
29
- from .signal_events import canonical_failure_fields, canonical_signal_event
30
+ from .signal_events import canonical_signal_event
30
31
  from .store import RunRecord, RunStore
31
32
  from .telemetry import AgentRunTrace
32
33
  from .vision_requirement import require_vision_readiness
@@ -34,7 +35,7 @@ from .vision_requirement import require_vision_readiness
34
35
  logger = logging.getLogger(__name__)
35
36
 
36
37
 
37
- class AgentRunService:
38
+ class AgentRunService(AgentRunControlMixin):
38
39
  def __init__(
39
40
  self,
40
41
  engine: AgentEngineAdapter,
@@ -61,6 +62,12 @@ class AgentRunService:
61
62
  request: StartRunRequest,
62
63
  idempotency_key: str,
63
64
  ) -> RunRecord:
65
+ if not getattr(self.engine, "configured", True):
66
+ raise SafeEngineError(
67
+ "RUNTIME_UNAVAILABLE",
68
+ "Agent Provider 尚未配置",
69
+ retryable=False,
70
+ )
64
71
  if not self.engine.supports(request.operation_key):
65
72
  raise OperationNotFoundError
66
73
  missing = set(request.required_capabilities) - set(self.engine.capabilities)
@@ -74,6 +81,7 @@ class AgentRunService:
74
81
  fingerprint = request_fingerprint(request)
75
82
  candidate = RunRecord(
76
83
  run_id=f"run_{uuid.uuid4().hex}",
84
+ engine_id=self.engine.engine_id,
77
85
  operation_key=request.operation_key,
78
86
  input=request.input,
79
87
  idempotency_key=idempotency_key,
@@ -86,7 +94,12 @@ class AgentRunService:
86
94
  request.model_dump(by_alias=True),
87
95
  )
88
96
  record = admission.record
89
- await ensure_run_report_safely(self.report_store, record.run_id, request)
97
+ await ensure_run_report_safely(
98
+ self.report_store,
99
+ record.run_id,
100
+ request,
101
+ self.engine.engine_id,
102
+ )
90
103
  if admission.reservation:
91
104
  await self._spawn(record, request, admission.reservation)
92
105
  return record
@@ -121,7 +134,19 @@ class AgentRunService:
121
134
  self.report_store,
122
135
  record.run_id,
123
136
  request,
137
+ record.engine_id,
124
138
  )
139
+ if record.engine_id != self.engine.engine_id:
140
+ await self._fail(
141
+ record.run_id,
142
+ SafeEngineError(
143
+ "RUNTIME_UNAVAILABLE",
144
+ "Agent Engine 已升级,旧 Run 无法安全恢复",
145
+ retryable=False,
146
+ ),
147
+ )
148
+ await self.store.clear_invocation(record.run_id)
149
+ continue
125
150
  await self._spawn(
126
151
  record,
127
152
  request,
@@ -139,43 +164,6 @@ class AgentRunService:
139
164
  except Exception:
140
165
  logger.exception("Agent Run 恢复轮询失败,将继续重试")
141
166
 
142
- async def record_evaluation(
143
- self,
144
- release_id: str,
145
- evaluation_set_key: str,
146
- evaluation_set_version: str,
147
- metrics: dict[str, float],
148
- ) -> str:
149
- return await self.store.record_evaluation(
150
- release_id,
151
- evaluation_set_key,
152
- evaluation_set_version,
153
- metrics,
154
- )
155
-
156
- async def get(self, run_id: str) -> RunRecord:
157
- record = await self.store.get(run_id)
158
- if record is None:
159
- raise RunNotFoundError
160
- return record
161
-
162
- async def probe(self) -> None:
163
- await self.store.probe()
164
-
165
- async def cancel(self, run_id: str) -> RunRecord:
166
- record = await self.get(run_id)
167
- if record.terminal:
168
- return record
169
- await self.engine.cancel(run_id)
170
- await resolve_pending_approval(self.store, record, "cancelled")
171
- await append_and_sync_canonical_event(
172
- self.report_store,
173
- self.store,
174
- run_id,
175
- "run.cancelled",
176
- )
177
- return await self.get(run_id)
178
-
179
167
  async def _execute(
180
168
  self,
181
169
  record: RunRecord,
@@ -220,21 +208,19 @@ class AgentRunService:
220
208
  if self.artifact_loader
221
209
  else ()
222
210
  )
223
- request = build_engine_run_request(record, invocation, prepared)
224
- approval_timeout = max(
225
- (
226
- tool.approval_timeout_seconds or 0
227
- for tool in invocation.allowed_tools
228
- if tool.approval == "required"
229
- ),
230
- default=0,
231
- )
232
- async with asyncio.timeout(
233
- max(
234
- invocation.limits.max_duration_seconds,
235
- approval_timeout + (5 if approval_timeout else 0),
236
- )
211
+ if await append_and_sync_canonical_event(
212
+ self.report_store,
213
+ self.store,
214
+ record.run_id,
215
+ "input.prepared",
216
+ {
217
+ "artifactCount": len(prepared),
218
+ "inputModalities": list(invocation.input_modalities),
219
+ },
237
220
  ):
221
+ return
222
+ request = build_engine_run_request(record, invocation, prepared)
223
+ async with asyncio.timeout(invocation.limits.max_duration_seconds):
238
224
  async for signal in self.engine.execute(request):
239
225
  if isinstance(signal, EngineCompleted):
240
226
  await self.store.complete(record.run_id, signal.output)
@@ -337,13 +323,3 @@ class AgentRunService:
337
323
  completed,
338
324
  )
339
325
  )
340
-
341
- async def _fail(self, run_id: str, failure: SafeEngineError) -> None:
342
- await append_and_sync_canonical_event(
343
- self.report_store,
344
- self.store,
345
- run_id,
346
- "run.failed",
347
- canonical_failure_fields(failure),
348
- fallback_safe_error_code=failure.code,
349
- )
@@ -0,0 +1,64 @@
1
+ from __future__ import annotations
2
+
3
+ from .approval_resolution import resolve_pending_approval
4
+ from .engine import AgentEngineAdapter, SafeEngineError
5
+ from .report_lifecycle import append_and_sync_canonical_event
6
+ from .report_store import AgentRuntimeReportStore
7
+ from .service_errors import RunNotFoundError
8
+ from .signal_events import canonical_failure_fields
9
+ from .store import RunRecord, RunStore
10
+
11
+
12
+ class AgentRunControlMixin:
13
+ """Queries, cancellation and terminal control shared by run execution."""
14
+
15
+ engine: AgentEngineAdapter
16
+ store: RunStore
17
+ report_store: AgentRuntimeReportStore
18
+
19
+ async def record_evaluation(
20
+ self,
21
+ release_id: str,
22
+ evaluation_set_key: str,
23
+ evaluation_set_version: str,
24
+ metrics: dict[str, float],
25
+ ) -> str:
26
+ return await self.store.record_evaluation(
27
+ release_id,
28
+ evaluation_set_key,
29
+ evaluation_set_version,
30
+ metrics,
31
+ )
32
+
33
+ async def get(self, run_id: str) -> RunRecord:
34
+ record = await self.store.get(run_id)
35
+ if record is None:
36
+ raise RunNotFoundError
37
+ return record
38
+
39
+ async def probe(self) -> None:
40
+ await self.store.probe()
41
+
42
+ async def cancel(self, run_id: str) -> RunRecord:
43
+ record = await self.get(run_id)
44
+ if record.terminal:
45
+ return record
46
+ await self.engine.cancel(run_id)
47
+ await resolve_pending_approval(self.store, record, "cancelled")
48
+ await append_and_sync_canonical_event(
49
+ self.report_store,
50
+ self.store,
51
+ run_id,
52
+ "run.cancelled",
53
+ )
54
+ return await self.get(run_id)
55
+
56
+ async def _fail(self, run_id: str, failure: SafeEngineError) -> None:
57
+ await append_and_sync_canonical_event(
58
+ self.report_store,
59
+ self.store,
60
+ run_id,
61
+ "run.failed",
62
+ canonical_failure_fields(failure),
63
+ fallback_safe_error_code=failure.code,
64
+ )
@@ -26,6 +26,9 @@ def build_engine_run_request(
26
26
  provider_egress=invocation.provider_egress,
27
27
  provider_data_policy=invocation.provider_data_policy,
28
28
  tool_network_policy=invocation.tool_network_policy,
29
+ model_pin=invocation.model_pin,
29
30
  execution_grant=invocation.execution_grant,
30
31
  tool_host_url=invocation.tool_host_url,
32
+ long_session=invocation.long_session,
33
+ prompt_version=invocation.release.prompt_version,
31
34
  )
@@ -0,0 +1,2 @@
1
+ class RunStoreCapacityError(Exception):
2
+ """Raised when the bounded local run store cannot accept more data."""
@@ -2,13 +2,16 @@ from __future__ import annotations
2
2
 
3
3
  import sqlite3
4
4
 
5
+ from .engine_identity import DIRECT_ENGINE_ID, HISTORICAL_ADK_ENGINE_ID
6
+
5
7
 
6
8
  def initialize_database(database: sqlite3.Connection) -> None:
7
9
  database.execute("pragma foreign_keys = on")
8
10
  database.executescript(
9
- """
11
+ f"""
10
12
  create table if not exists agent_runs (
11
13
  run_id text primary key,
14
+ engine_id text not null default '{DIRECT_ENGINE_ID}',
12
15
  operation_key text not null,
13
16
  input_json text not null,
14
17
  idempotency_key text not null unique,
@@ -43,6 +46,11 @@ def initialize_database(database: sqlite3.Connection) -> None:
43
46
  database.execute(
44
47
  "alter table agent_runs add column trace_id text not null default ''"
45
48
  )
49
+ if "engine_id" not in columns:
50
+ database.execute(
51
+ "alter table agent_runs add column engine_id "
52
+ f"text not null default '{HISTORICAL_ADK_ENGINE_ID}'"
53
+ )
46
54
  database.executescript(
47
55
  """
48
56
  create table if not exists agent_releases (
@@ -9,6 +9,7 @@ from typing import cast
9
9
 
10
10
  from .contracts import AgentError, AgentErrorCode, JsonValue, RunStatus
11
11
  from .sqlite_catalog import SqliteCatalogMixin
12
+ from .sqlite_errors import RunStoreCapacityError as RunStoreCapacityError
12
13
  from .sqlite_schema import initialize_database
13
14
  from .sqlite_serialization import encode, sequence_of
14
15
  from .store import (
@@ -19,9 +20,7 @@ from .store import (
19
20
  )
20
21
  from .store_cipher import RunStoreCipher
21
22
 
22
-
23
- class RunStoreCapacityError(Exception):
24
- pass
23
+ __all__ = ["RunStoreCapacityError", "SqliteRunStore"]
25
24
 
26
25
 
27
26
  class SqliteRunStore(SqliteCatalogMixin):
@@ -75,13 +74,14 @@ class SqliteRunStore(SqliteCatalogMixin):
75
74
  self._database.execute(
76
75
  """
77
76
  insert into agent_runs (
78
- run_id, operation_key, input_json, idempotency_key,
77
+ run_id, engine_id, operation_key, input_json, idempotency_key,
79
78
  fingerprint, status, output_json, created_at, updated_at,
80
79
  release_json, trace_id, invocation_cipher
81
- ) values (?, ?, ?, ?, ?, 'accepted', 'null', ?, ?, ?, ?, ?)
80
+ ) values (?, ?, ?, ?, ?, ?, 'accepted', 'null', ?, ?, ?, ?, ?)
82
81
  """,
83
82
  (
84
83
  record.run_id,
84
+ record.engine_id,
85
85
  record.operation_key,
86
86
  "null",
87
87
  record.idempotency_key,
@@ -282,6 +282,7 @@ class SqliteRunStore(SqliteCatalogMixin):
282
282
  ]
283
283
  return RunRecord(
284
284
  run_id=str(row["run_id"]),
285
+ engine_id=str(row["engine_id"]),
285
286
  operation_key=str(row["operation_key"]),
286
287
  input=json.loads(str(row["input_json"])),
287
288
  idempotency_key=str(row["idempotency_key"]),
@@ -5,6 +5,7 @@ from dataclasses import dataclass, field
5
5
  from typing import Protocol
6
6
 
7
7
  from .contracts import JsonValue, RunStatus
8
+ from .engine_identity import DIRECT_ENGINE_ID
8
9
 
9
10
  CanonicalEvent = dict[str, object]
10
11
  TERMINAL_STATUSES = frozenset({"completed", "failed", "cancelled"})
@@ -17,6 +18,7 @@ class RunRecord:
17
18
  input: JsonValue
18
19
  idempotency_key: str
19
20
  fingerprint: str
21
+ engine_id: str = DIRECT_ENGINE_ID
20
22
  release: JsonValue = None
21
23
  trace_id: str = ""
22
24
  status: RunStatus = "accepted"
@@ -0,0 +1,137 @@
1
+ from __future__ import annotations
2
+
3
+ from .store import CanonicalEvent, RunRecord
4
+
5
+
6
+ def project_run_trajectory(record: RunRecord | None) -> dict[str, object]:
7
+ if record is None:
8
+ return {"available": False, "events": []}
9
+ projected: list[dict[str, object]] = []
10
+ tool_keys: dict[str, str] = {}
11
+ output: dict[str, object] | None = None
12
+ for event in record.events:
13
+ event_type = text(event.get("type"))
14
+ sequence = integer(event.get("sequence"))
15
+ if not event_type or sequence is None:
16
+ continue
17
+ if event_type == "output.delta":
18
+ delta = event.get("text")
19
+ if not isinstance(delta, str):
20
+ continue
21
+ if output is None:
22
+ output = item(sequence, event_type, "模型生成输出")
23
+ output.update(
24
+ {
25
+ "sequenceEnd": sequence,
26
+ "deltaCount": 0,
27
+ "outputCharacters": 0,
28
+ }
29
+ )
30
+ projected.append(output)
31
+ output["sequenceEnd"] = sequence
32
+ delta_count = integer(output.get("deltaCount"), 0)
33
+ output_characters = integer(output.get("outputCharacters"), 0)
34
+ if delta_count is None or output_characters is None:
35
+ continue
36
+ output["deltaCount"] = delta_count + 1
37
+ output["outputCharacters"] = output_characters + len(delta)
38
+ continue
39
+ output = None
40
+ current = event_item(event_type, sequence, event, tool_keys)
41
+ if current is not None:
42
+ projected.append(current)
43
+ return {"available": True, "events": projected}
44
+
45
+
46
+ def event_item(
47
+ event_type: str,
48
+ sequence: int,
49
+ event: CanonicalEvent,
50
+ tool_keys: dict[str, str],
51
+ ) -> dict[str, object] | None:
52
+ if event_type in {"run.started", "run.resumed"}:
53
+ return item(
54
+ sequence,
55
+ event_type,
56
+ "开始执行" if event_type == "run.started" else "恢复执行",
57
+ )
58
+ if event_type == "input.prepared":
59
+ result = item(sequence, event_type, "输入已准备")
60
+ result["artifactCount"] = integer(event.get("artifactCount"), 0)
61
+ modalities = event.get("inputModalities")
62
+ result["inputModalities"] = (
63
+ [value for value in modalities if isinstance(value, str)]
64
+ if isinstance(modalities, list)
65
+ else []
66
+ )
67
+ return result
68
+ if event_type == "tool.requested":
69
+ call_id = text(event.get("toolCallId"))
70
+ tool_key = text(event.get("toolKey"))
71
+ if call_id and tool_key:
72
+ tool_keys[call_id] = tool_key
73
+ result = item(sequence, event_type, "请求 Tool")
74
+ if tool_key:
75
+ result["toolKey"] = tool_key
76
+ return result
77
+ if event_type in {"tool.completed", "approval.required", "approval.resolved"}:
78
+ result = item(
79
+ sequence,
80
+ event_type,
81
+ {
82
+ "tool.completed": "Tool 已完成",
83
+ "approval.required": "等待审批",
84
+ "approval.resolved": "审批已处理",
85
+ }[event_type],
86
+ )
87
+ call_id = text(event.get("toolCallId"))
88
+ tool_key = tool_keys.get(call_id or "")
89
+ if tool_key:
90
+ result["toolKey"] = tool_key
91
+ outcome = text(event.get("outcome"))
92
+ if event_type == "approval.resolved" and outcome:
93
+ result["approvalOutcome"] = outcome
94
+ return result
95
+ if event_type == "usage.reported":
96
+ result = item(sequence, event_type, "Provider 用量已上报")
97
+ attempt = integer(event.get("attemptSequence"))
98
+ usage = event.get("usage")
99
+ total = integer(usage.get("totalTokens")) if isinstance(usage, dict) else None
100
+ if attempt is not None:
101
+ result["attemptSequence"] = attempt
102
+ if total is not None:
103
+ result["totalTokens"] = total
104
+ return result
105
+ if event_type in {"run.completed", "run.cancelled", "run.failed"}:
106
+ result = item(
107
+ sequence,
108
+ event_type,
109
+ {
110
+ "run.completed": "执行完成",
111
+ "run.cancelled": "执行已取消",
112
+ "run.failed": "执行失败",
113
+ }[event_type],
114
+ )
115
+ error = event.get("error")
116
+ code = text(error.get("code")) if isinstance(error, dict) else None
117
+ if code:
118
+ result["errorCode"] = code
119
+ return result
120
+ return None
121
+
122
+
123
+ def item(sequence: int, event_type: str, title: str) -> dict[str, object]:
124
+ return {
125
+ "sequence": sequence,
126
+ "sequenceEnd": sequence,
127
+ "type": event_type,
128
+ "title": title,
129
+ }
130
+
131
+
132
+ def text(value: object) -> str | None:
133
+ return value if isinstance(value, str) and value else None
134
+
135
+
136
+ def integer(value: object, fallback: int | None = None) -> int | None:
137
+ return value if isinstance(value, int) and value >= 0 else fallback
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import AsyncIterator
4
+
5
+ from .engine import AgentEngineAdapter, EngineRunRequest, EngineSignal, SafeEngineError
6
+ from .vlm_readiness import unavailable_vlm_snapshot
7
+
8
+
9
+ class UnavailableEngineAdapter(AgentEngineAdapter):
10
+ """Explicit fail-closed runtime used when no Provider deployment is configured."""
11
+
12
+ ENGINE_ID = "windy.unavailable.v1"
13
+
14
+ @property
15
+ def engine_id(self) -> str:
16
+ return self.ENGINE_ID
17
+
18
+ @property
19
+ def configured(self) -> bool:
20
+ return False
21
+
22
+ @property
23
+ def capabilities(self) -> tuple[str, ...]:
24
+ return ()
25
+
26
+ @property
27
+ def input_modalities(self) -> tuple[str, ...]:
28
+ return ("text",)
29
+
30
+ @property
31
+ def max_concurrent_runs(self) -> int:
32
+ return 1
33
+
34
+ @property
35
+ def max_queue_depth(self) -> int:
36
+ return 0
37
+
38
+ def supports(self, operation_key: str) -> bool:
39
+ return bool(operation_key.strip())
40
+
41
+ async def execute(
42
+ self,
43
+ request: EngineRunRequest,
44
+ ) -> AsyncIterator[EngineSignal]:
45
+ del request
46
+ raise SafeEngineError(
47
+ "RUNTIME_UNAVAILABLE",
48
+ "Agent Provider 尚未配置",
49
+ retryable=False,
50
+ )
51
+ if False:
52
+ yield
53
+
54
+ async def cancel(self, run_id: str) -> None:
55
+ del run_id
56
+
57
+ async def readiness(self) -> dict[str, object]:
58
+ return unavailable_vlm_snapshot(configured=False)