create-windy 0.6.12 → 0.6.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/dist/cli.js +572 -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,184 @@
1
+ import { randomUUIDv7 } from "bun";
2
+ import {
3
+ ContextMemoryError,
4
+ type BuiltContext,
5
+ type ContextBuildRequest,
6
+ type ContextSourcePort,
7
+ type ContextSourceReference,
8
+ type ContextVersion,
9
+ type ContextVersionRecorder,
10
+ type ResolvedContextSource,
11
+ } from "./contracts.js";
12
+ import { stableDigest } from "./digest.js";
13
+
14
+ export interface ContextBuilderOptions {
15
+ readonly now?: () => Date;
16
+ readonly idFactory?: () => string;
17
+ }
18
+
19
+ export class ContextBuilder {
20
+ readonly #now: () => Date;
21
+ readonly #idFactory: () => string;
22
+
23
+ constructor(
24
+ private readonly source: ContextSourcePort,
25
+ private readonly recorder: ContextVersionRecorder,
26
+ options: ContextBuilderOptions = {},
27
+ ) {
28
+ this.#now = options.now ?? (() => new Date());
29
+ this.#idFactory = options.idFactory ?? (() => `context_${randomUUIDv7()}`);
30
+ }
31
+
32
+ async build(
33
+ request: ContextBuildRequest,
34
+ signal: AbortSignal,
35
+ ): Promise<BuiltContext> {
36
+ const resolved = await this.resolve(request, signal);
37
+ const references = resolved.map(({ reference }) => reference);
38
+ const version = immutableClone<ContextVersion>({
39
+ contextVersionId: this.#idFactory(),
40
+ sessionId: request.sessionId,
41
+ turnId: request.turnId,
42
+ runId: request.runId,
43
+ modelAttemptId: request.modelAttemptId,
44
+ sources: references,
45
+ digest: contextDigest(request, references),
46
+ createdAt: this.#now().toISOString(),
47
+ });
48
+ try {
49
+ await this.recorder.record(version);
50
+ } catch {
51
+ throw unavailable("Context Version 无法写入 Session 事实源");
52
+ }
53
+ return immutableClone({ version, sources: resolved });
54
+ }
55
+
56
+ /** Resolve and validate sources without claiming a Provider attempt was sent. */
57
+ async resolve(
58
+ request: ContextBuildRequest,
59
+ signal: AbortSignal,
60
+ ): Promise<readonly ResolvedContextSource[]> {
61
+ validateRequest(request);
62
+ if (signal.aborted) throw unavailable("Context 构建已取消");
63
+ const resolved: ResolvedContextSource[] = [];
64
+ for (const sourceRequest of request.sources) {
65
+ let source: ResolvedContextSource;
66
+ try {
67
+ source = await this.source.resolve(
68
+ sourceRequest,
69
+ request.guardContext,
70
+ signal,
71
+ );
72
+ } catch (error) {
73
+ if (error instanceof ContextMemoryError) throw error;
74
+ throw unavailable("Context 来源暂不可用");
75
+ }
76
+ validateResolvedSource(sourceRequest, source, this.#now());
77
+ resolved.push(immutableClone(source));
78
+ }
79
+
80
+ return immutableClone(resolved);
81
+ }
82
+ }
83
+
84
+ export function contextDigest(
85
+ request: Pick<
86
+ ContextBuildRequest,
87
+ "sessionId" | "turnId" | "runId" | "modelAttemptId"
88
+ >,
89
+ sources: readonly ContextSourceReference[],
90
+ ): string {
91
+ return stableDigest({
92
+ contractVersion: 1,
93
+ sessionId: request.sessionId,
94
+ turnId: request.turnId,
95
+ runId: request.runId,
96
+ modelAttemptId: request.modelAttemptId,
97
+ sources,
98
+ });
99
+ }
100
+
101
+ function validateRequest(request: ContextBuildRequest): void {
102
+ for (const value of [
103
+ request.sessionId,
104
+ request.turnId,
105
+ request.runId,
106
+ request.modelAttemptId,
107
+ ]) {
108
+ if (!value?.trim()) throw invalid("Context 坐标不完整");
109
+ }
110
+ if (!request.sources.length) throw invalid("Context 来源不能为空");
111
+ if (!request.guardContext?.actor?.id?.trim()) {
112
+ throw invalid("Context 缺少当前 Actor");
113
+ }
114
+ const keys = new Set<string>();
115
+ for (const source of request.sources) {
116
+ if (!source.moduleKey?.trim() || !source.id?.trim() || !source.kind) {
117
+ throw invalid("Context 来源坐标无效");
118
+ }
119
+ const key = `${source.moduleKey}\u0000${source.kind}\u0000${source.id}`;
120
+ if (keys.has(key)) throw invalid("Context 来源不能重复");
121
+ keys.add(key);
122
+ }
123
+ }
124
+
125
+ function validateResolvedSource(
126
+ requested: ContextBuildRequest["sources"][number],
127
+ source: ResolvedContextSource,
128
+ now: Date,
129
+ ): void {
130
+ const { reference } = source;
131
+ if (
132
+ reference.moduleKey !== requested.moduleKey ||
133
+ reference.kind !== requested.kind ||
134
+ reference.id !== requested.id ||
135
+ !reference.version?.trim() ||
136
+ !Number.isSafeInteger(reference.sequence) ||
137
+ reference.sequence < 1 ||
138
+ !source.content?.trim() ||
139
+ !/^[a-f0-9]{64}$/.test(reference.digest) ||
140
+ !["system", "user", "assistant", "tool"].includes(source.role) ||
141
+ reference.digest !== stableDigest({ role: source.role, content: source.content }) ||
142
+ !Number.isFinite(Date.parse(reference.validity.checkedAt))
143
+ ) {
144
+ throw new ContextMemoryError(
145
+ "SOURCE_INVALID",
146
+ "Context 来源投影与声明不一致",
147
+ );
148
+ }
149
+ const expiresAt = reference.validity.expiresAt
150
+ ? Date.parse(reference.validity.expiresAt)
151
+ : undefined;
152
+ if (
153
+ reference.validity.status !== "valid" ||
154
+ (expiresAt !== undefined &&
155
+ (!Number.isFinite(expiresAt) || expiresAt <= now.getTime()))
156
+ ) {
157
+ throw new ContextMemoryError(
158
+ "SOURCE_INVALID",
159
+ "Context 来源已失效或过期",
160
+ );
161
+ }
162
+ }
163
+
164
+ function immutableClone<T>(value: T): T {
165
+ return deepFreeze(structuredClone(value));
166
+ }
167
+
168
+ function deepFreeze<T>(value: T): T {
169
+ if (!value || typeof value !== "object" || Object.isFrozen(value)) {
170
+ return value;
171
+ }
172
+ for (const child of Object.values(value as Record<string, unknown>)) {
173
+ deepFreeze(child);
174
+ }
175
+ return Object.freeze(value);
176
+ }
177
+
178
+ function invalid(message: string): ContextMemoryError {
179
+ return new ContextMemoryError("INVALID_REQUEST", message);
180
+ }
181
+
182
+ function unavailable(message: string): ContextMemoryError {
183
+ return new ContextMemoryError("SOURCE_UNAVAILABLE", message);
184
+ }
@@ -0,0 +1,284 @@
1
+ import type { FeatureFlagDefinition } from "@southwind-ai/shared";
2
+ import type { RequestActor, RequestGuardContext } from "../../guards.js";
3
+
4
+ export const MEMORY_KINDS = [
5
+ "working-context",
6
+ "session-summary",
7
+ "user-preference",
8
+ "case-memory-candidate",
9
+ "verified-fact-reference",
10
+ ] as const;
11
+
12
+ export type MemoryKind = (typeof MEMORY_KINDS)[number];
13
+
14
+ export type ContextSourceKind =
15
+ | "system-instruction"
16
+ | "operation-instruction"
17
+ | "recent-event"
18
+ | "run-result"
19
+ | "skill"
20
+ | "artifact-summary"
21
+ | MemoryKind;
22
+
23
+ export interface ContextSourceValidity {
24
+ readonly status: "valid" | "invalid";
25
+ readonly checkedAt: string;
26
+ readonly expiresAt?: string;
27
+ readonly reason?:
28
+ | "revoked"
29
+ | "deleted"
30
+ | "archived"
31
+ | "expired"
32
+ | "superseded"
33
+ | "authorization-denied"
34
+ | "unavailable";
35
+ }
36
+
37
+ export interface ContextSourceReference {
38
+ readonly moduleKey: string;
39
+ readonly kind: ContextSourceKind;
40
+ readonly id: string;
41
+ readonly version: string;
42
+ readonly sequence: number;
43
+ /** SHA-256 of the exact model-visible projection, never of hidden source data. */
44
+ readonly digest: string;
45
+ readonly validity: ContextSourceValidity;
46
+ }
47
+
48
+ export interface ResolvedContextSource {
49
+ readonly reference: ContextSourceReference;
50
+ readonly role: "system" | "user" | "assistant" | "tool";
51
+ /** Authorized, redacted model input. It must not contain raw reasoning traces. */
52
+ readonly content: string;
53
+ }
54
+
55
+ export interface ContextSourceRequest {
56
+ readonly moduleKey: string;
57
+ readonly kind: ContextSourceKind;
58
+ readonly id: string;
59
+ }
60
+
61
+ export interface ContextBuildRequest {
62
+ readonly sessionId: string;
63
+ readonly turnId: string;
64
+ readonly runId: string;
65
+ readonly modelAttemptId: string;
66
+ readonly guardContext: RequestGuardContext;
67
+ readonly sources: readonly ContextSourceRequest[];
68
+ }
69
+
70
+ export interface ContextVersion {
71
+ readonly contextVersionId: string;
72
+ readonly sessionId: string;
73
+ readonly turnId: string;
74
+ readonly runId: string;
75
+ readonly modelAttemptId: string;
76
+ /** Exact business Case coordinate for this attempt; absent means no Case context. */
77
+ readonly currentCaseId?: string;
78
+ readonly sources: readonly ContextSourceReference[];
79
+ readonly digest: string;
80
+ readonly createdAt: string;
81
+ }
82
+
83
+ export interface BuiltContext {
84
+ readonly version: ContextVersion;
85
+ readonly sources: readonly ResolvedContextSource[];
86
+ }
87
+
88
+ export interface ContextSourcePort {
89
+ resolve(
90
+ request: ContextSourceRequest,
91
+ guardContext: RequestGuardContext,
92
+ signal: AbortSignal,
93
+ ): Promise<ResolvedContextSource>;
94
+ }
95
+
96
+ /** Append-only Session Event Store adapter; implementations reject duplicate attempts. */
97
+ export interface ContextVersionRecorder {
98
+ record(version: ContextVersion): Promise<void>;
99
+ }
100
+
101
+ export type MemoryScope =
102
+ | { readonly kind: "session"; readonly sessionId: string }
103
+ | { readonly kind: "user"; readonly actorId: string }
104
+ | { readonly kind: "case"; readonly caseId: string };
105
+
106
+ interface MemoryProjectionBase {
107
+ readonly memoryId: string;
108
+ readonly version: string;
109
+ /** SHA-256 of memoryProjectionContent(projection). */
110
+ readonly digest: string;
111
+ readonly sources: readonly ContextSourceReference[];
112
+ readonly validity: ContextSourceValidity;
113
+ readonly createdAt: string;
114
+ readonly expiresAt?: string;
115
+ /** Case affinity of the derived content, independent of its retrieval scope. */
116
+ readonly currentCaseId?: string;
117
+ /** Session lineage which produced this projection, independent of retrieval scope. */
118
+ readonly derivation: {
119
+ readonly sessionId: string;
120
+ readonly throughSequence: number;
121
+ };
122
+ }
123
+
124
+ export interface WorkingContextMemory extends MemoryProjectionBase {
125
+ readonly kind: "working-context";
126
+ readonly scope: Extract<MemoryScope, { kind: "session" }>;
127
+ readonly content: string;
128
+ /** Working Context is temporary even when a producer omits an explicit TTL. */
129
+ readonly expiresAt: string;
130
+ }
131
+
132
+ export interface SessionSummaryMemory extends MemoryProjectionBase {
133
+ readonly kind: "session-summary";
134
+ readonly scope: Extract<MemoryScope, { kind: "session" }>;
135
+ readonly summary: string;
136
+ readonly coveredThroughSequence: number;
137
+ }
138
+
139
+ export interface UserPreferenceMemory extends MemoryProjectionBase {
140
+ readonly kind: "user-preference";
141
+ readonly scope: Extract<MemoryScope, { kind: "user" }>;
142
+ readonly preferenceKey: string;
143
+ readonly value: string;
144
+ }
145
+
146
+ export interface CaseMemoryCandidate extends MemoryProjectionBase {
147
+ readonly kind: "case-memory-candidate";
148
+ readonly scope: Extract<MemoryScope, { kind: "case" }>;
149
+ readonly claim: string;
150
+ /** A candidate can be rejected, but never mutates itself into a verified fact. */
151
+ readonly reviewStatus: "pending" | "rejected";
152
+ readonly confidence?: number;
153
+ }
154
+
155
+ export interface VerifiedFactReferenceMemory extends MemoryProjectionBase {
156
+ readonly kind: "verified-fact-reference";
157
+ readonly scope: Extract<MemoryScope, { kind: "case" }>;
158
+ /** Reference only: the authoritative domain fact remains in its owning module. */
159
+ readonly fact: {
160
+ readonly moduleKey: string;
161
+ readonly resourceType: string;
162
+ readonly resourceId: string;
163
+ readonly version: string;
164
+ readonly digest: string;
165
+ };
166
+ }
167
+
168
+ export type MemoryProjection =
169
+ | WorkingContextMemory
170
+ | SessionSummaryMemory
171
+ | UserPreferenceMemory
172
+ | CaseMemoryCandidate
173
+ | VerifiedFactReferenceMemory;
174
+
175
+ export interface MemoryRetrievalRequest {
176
+ readonly query: string;
177
+ readonly sessionId: string;
178
+ /** Required to return Case Memory; the owning module still reauthorizes this coordinate. */
179
+ readonly caseId?: string;
180
+ readonly kinds: readonly MemoryKind[];
181
+ readonly limit: number;
182
+ readonly feature: FeatureFlagDefinition;
183
+ readonly permissionKey: string;
184
+ readonly guardContext: RequestGuardContext;
185
+ }
186
+
187
+ export interface AuthorizationDecision {
188
+ readonly allowed: boolean;
189
+ readonly reason: string;
190
+ }
191
+
192
+ export interface MemoryCapabilityDecision {
193
+ readonly allowed: boolean;
194
+ readonly actor: AuthorizationDecision;
195
+ readonly scope: AuthorizationDecision;
196
+ readonly feature: AuthorizationDecision;
197
+ readonly permission: AuthorizationDecision;
198
+ readonly license: AuthorizationDecision;
199
+ }
200
+
201
+ export interface MemoryCapabilityAuthorizer {
202
+ authorize(request: MemoryRetrievalRequest): Promise<MemoryCapabilityDecision>;
203
+ }
204
+
205
+ export interface MemorySearchHit {
206
+ readonly memoryId: string;
207
+ readonly score?: number;
208
+ }
209
+
210
+ export interface MemorySearchPort {
211
+ search(
212
+ query: string,
213
+ limit: number,
214
+ actor: RequestActor,
215
+ requestId: string,
216
+ signal: AbortSignal,
217
+ scope?: MemorySearchScope,
218
+ ): Promise<readonly MemorySearchHit[]>;
219
+ }
220
+
221
+ export interface MemorySearchScope {
222
+ readonly sessionId: string;
223
+ /** Case Memory is excluded without an explicit coordinate; lineage is not a substitute. */
224
+ readonly caseId?: string;
225
+ readonly kinds: readonly MemoryKind[];
226
+ }
227
+
228
+ export interface MemoryProjectionPort {
229
+ read(
230
+ memoryId: string,
231
+ guardContext: RequestGuardContext,
232
+ signal: AbortSignal,
233
+ ): Promise<MemoryProjection | undefined>;
234
+ }
235
+
236
+ /** Projectors append new versions; they never update a candidate into a fact. */
237
+ export interface MemoryProjectionRecorder {
238
+ append(projection: MemoryProjection): Promise<void>;
239
+ }
240
+
241
+ export interface MemoryObjectAuthorizationPort {
242
+ authorize(
243
+ projection: MemoryProjection,
244
+ guardContext: RequestGuardContext,
245
+ signal: AbortSignal,
246
+ ): Promise<AuthorizationDecision>;
247
+ }
248
+
249
+ export interface GovernedMemoryResult {
250
+ readonly projection: MemoryProjection;
251
+ readonly score?: number;
252
+ readonly authorization: {
253
+ readonly capability: MemoryCapabilityDecision;
254
+ readonly object: AuthorizationDecision;
255
+ readonly ttl: AuthorizationDecision;
256
+ };
257
+ }
258
+
259
+ export interface MemoryRetrievalResult {
260
+ readonly items: readonly GovernedMemoryResult[];
261
+ readonly excluded: {
262
+ readonly missing: number;
263
+ readonly objectDenied: number;
264
+ readonly expired: number;
265
+ readonly outOfScope: number;
266
+ readonly invalid: number;
267
+ };
268
+ }
269
+
270
+ export class ContextMemoryError extends Error {
271
+ constructor(
272
+ readonly code:
273
+ | "INVALID_REQUEST"
274
+ | "SOURCE_UNAVAILABLE"
275
+ | "SOURCE_INVALID"
276
+ | "AUTHORIZATION_DENIED"
277
+ | "AUTHORIZATION_UNAVAILABLE"
278
+ | "INVALID_PROJECTION",
279
+ message: string,
280
+ ) {
281
+ super(message);
282
+ this.name = "ContextMemoryError";
283
+ }
284
+ }
@@ -0,0 +1,22 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ export function sha256(value: string): string {
4
+ return createHash("sha256").update(value).digest("hex");
5
+ }
6
+
7
+ export function stableDigest(value: unknown): string {
8
+ return sha256(stableJson(value));
9
+ }
10
+
11
+ function stableJson(value: unknown): string {
12
+ if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
13
+ if (value && typeof value === "object") {
14
+ const entries = Object.entries(value as Record<string, unknown>)
15
+ .filter(([, item]) => item !== undefined)
16
+ .sort(([left], [right]) => left.localeCompare(right));
17
+ return `{${entries
18
+ .map(([key, item]) => `${JSON.stringify(key)}:${stableJson(item)}`)
19
+ .join(",")}}`;
20
+ }
21
+ return JSON.stringify(value);
22
+ }
@@ -0,0 +1,82 @@
1
+ import { evaluateAccessGuards } from "../../access-guards.js";
2
+ import { isServerScopeContext } from "../../data-access/context.js";
3
+ import type { GuardDecision } from "../../guards.js";
4
+ import type { createServerRuntime } from "../../runtime.js";
5
+ import type {
6
+ AuthorizationDecision,
7
+ MemoryCapabilityAuthorizer,
8
+ MemoryCapabilityDecision,
9
+ MemoryRetrievalRequest,
10
+ } from "./contracts.js";
11
+
12
+ type GuardRuntime = Pick<
13
+ ReturnType<typeof createServerRuntime>,
14
+ "recordDecisions" | "resolveFeature"
15
+ >;
16
+
17
+ export class AccessGuardMemoryCapabilityAuthorizer
18
+ implements MemoryCapabilityAuthorizer
19
+ {
20
+ constructor(private readonly runtime: GuardRuntime) {}
21
+
22
+ async authorize(
23
+ request: MemoryRetrievalRequest,
24
+ ): Promise<MemoryCapabilityDecision> {
25
+ const actor = request.guardContext.actor;
26
+ const actorDecision = decision(
27
+ actor.type !== "anonymous" && actor.id.trim().length > 0,
28
+ actor.type === "anonymous" ? "anonymous" : "allowed",
29
+ );
30
+ const scopeDecision = decision(
31
+ isServerScopeContext(actor.scopeContext),
32
+ isServerScopeContext(actor.scopeContext)
33
+ ? "allowed"
34
+ : "missing-server-scope",
35
+ );
36
+ const guards = await evaluateAccessGuards(
37
+ this.runtime,
38
+ request.guardContext,
39
+ {
40
+ permission: { permissionKey: request.permissionKey },
41
+ feature: request.feature,
42
+ },
43
+ );
44
+ const featureDecision = fromGuard(guards.feature);
45
+ const permissionDecision = fromGuard(guards.permission);
46
+ const licenseParts = [
47
+ guards.license,
48
+ guards.licenseVersion,
49
+ guards.entitlement,
50
+ ];
51
+ const deniedLicense = licenseParts.find((item) => item && !item.allowed);
52
+ const licenseDecision = deniedLicense
53
+ ? fromGuard(deniedLicense)
54
+ : decision(
55
+ licenseParts.every((item) => item?.allowed === true),
56
+ licenseParts.every((item) => item?.allowed === true)
57
+ ? "allowed"
58
+ : "not-evaluated",
59
+ );
60
+ const decisions = {
61
+ actor: actorDecision,
62
+ scope: scopeDecision,
63
+ feature: featureDecision,
64
+ permission: permissionDecision,
65
+ license: licenseDecision,
66
+ };
67
+ return {
68
+ allowed: Object.values(decisions).every(({ allowed }) => allowed),
69
+ ...decisions,
70
+ };
71
+ }
72
+ }
73
+
74
+ function fromGuard(value: GuardDecision | undefined): AuthorizationDecision {
75
+ return value
76
+ ? { allowed: value.allowed, reason: value.reason }
77
+ : { allowed: false, reason: "not-evaluated" };
78
+ }
79
+
80
+ function decision(allowed: boolean, reason: string): AuthorizationDecision {
81
+ return { allowed, reason };
82
+ }
@@ -0,0 +1,69 @@
1
+ import type { MemoryProjection } from "./contracts.js";
2
+
3
+ export function memoryProjectionContent(projection: MemoryProjection): string {
4
+ switch (projection.kind) {
5
+ case "working-context":
6
+ return JSON.stringify({
7
+ kind: projection.kind,
8
+ content: projection.content,
9
+ });
10
+ case "session-summary":
11
+ return JSON.stringify({
12
+ kind: projection.kind,
13
+ summary: projection.summary,
14
+ coveredThroughSequence: projection.coveredThroughSequence,
15
+ });
16
+ case "user-preference":
17
+ return JSON.stringify({
18
+ kind: projection.kind,
19
+ preferenceKey: projection.preferenceKey,
20
+ value: projection.value,
21
+ });
22
+ case "case-memory-candidate":
23
+ return JSON.stringify({
24
+ kind: projection.kind,
25
+ claim: projection.claim,
26
+ reviewStatus: projection.reviewStatus,
27
+ ...(projection.confidence !== undefined
28
+ ? { confidence: projection.confidence }
29
+ : {}),
30
+ });
31
+ case "verified-fact-reference":
32
+ return JSON.stringify({ kind: projection.kind, fact: projection.fact });
33
+ }
34
+ }
35
+
36
+ export function memoryProjectionScopeId(projection: MemoryProjection) {
37
+ switch (projection.scope.kind) {
38
+ case "session":
39
+ return projection.scope.sessionId;
40
+ case "user":
41
+ return projection.scope.actorId;
42
+ case "case":
43
+ return projection.scope.caseId;
44
+ }
45
+ }
46
+
47
+ export function sameMemoryProjectionCoordinates(
48
+ left: MemoryProjection,
49
+ right: MemoryProjection,
50
+ ) {
51
+ return (
52
+ left.kind === right.kind &&
53
+ memoryProjectionScopeId(left) === memoryProjectionScopeId(right) &&
54
+ left.currentCaseId === right.currentCaseId &&
55
+ left.sources.length === right.sources.length &&
56
+ left.sources.every((source, index) => {
57
+ const candidate = right.sources[index];
58
+ return (
59
+ candidate !== undefined &&
60
+ source.moduleKey === candidate.moduleKey &&
61
+ source.kind === candidate.kind &&
62
+ source.id === candidate.id &&
63
+ source.version === candidate.version &&
64
+ source.sequence === candidate.sequence &&
65
+ source.digest === candidate.digest
66
+ );
67
+ })
68
+ );
69
+ }