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
@@ -16,6 +16,8 @@ import type { AiArtifactRuntime } from "../ai-artifact/runtime.js";
16
16
  import type { ModuleAiOperationPort } from "@southwind-ai/server-sdk";
17
17
  import type { ModuleAiOperationReadinessPortV1 } from "@southwind-ai/server-sdk";
18
18
  import type { ModuleAiScreenshotIntakePortV1 } from "@southwind-ai/server-sdk";
19
+ import type { ModuleAgentSessionMemoryPortV1 } from "@southwind-ai/server-sdk";
20
+ import type { ModuleAuthoritativeSourceInvalidationPortV1 } from "@southwind-ai/server-sdk";
19
21
  // @windy-module system.agent end
20
22
  import { installModuleRoutes } from "./route-installer.js";
21
23
  import type { InitializedModuleHosts } from "./initialize.js";
@@ -59,6 +61,16 @@ export function installModuleHttpRuntime(
59
61
  guardContext: RequestGuardContext,
60
62
  signal: AbortSignal,
61
63
  ) => ModuleAiScreenshotIntakePortV1;
64
+ sessionMemory?: (
65
+ moduleName: string,
66
+ guardContext: RequestGuardContext,
67
+ signal: AbortSignal,
68
+ ) => ModuleAgentSessionMemoryPortV1;
69
+ sourceInvalidation?: (
70
+ moduleName: string,
71
+ guardContext: RequestGuardContext,
72
+ signal: AbortSignal,
73
+ ) => ModuleAuthoritativeSourceInvalidationPortV1;
62
74
  // @windy-module system.agent end
63
75
  // @windy-module system.data-governance begin
64
76
  reauthenticate(actorId: string, password: string): Promise<boolean>;
@@ -103,6 +115,8 @@ export function installModuleHttpRuntime(
103
115
  aiOperations: context.aiOperations,
104
116
  aiReadiness: context.aiReadiness,
105
117
  screenshots: context.screenshots,
118
+ sessionMemory: context.sessionMemory,
119
+ sourceInvalidation: context.sourceInvalidation,
106
120
  // @windy-module system.agent end
107
121
  });
108
122
  // @windy-module system.data-governance begin
@@ -6,7 +6,7 @@ import type {
6
6
  import type {
7
7
  InstallableServerModule,
8
8
  ModuleAiOperationHandlerRegistration,
9
- ModuleDebugSessionProviderV1,
9
+ ModuleAgentSessionProviderV1,
10
10
  ModuleDurableHandlerDefinition,
11
11
  ModuleInitializer,
12
12
  ModuleGovernedResourceRegistration,
@@ -70,11 +70,10 @@ export interface RegisteredModuleSearchProvider {
70
70
  readonly provider: ModuleSearchProvider;
71
71
  }
72
72
 
73
- export interface RegisteredModuleDebugSessionProvider {
73
+ export interface RegisteredModuleAgentSessionProvider {
74
74
  readonly moduleName: string;
75
- readonly provider: ModuleDebugSessionProviderV1;
75
+ readonly provider: ModuleAgentSessionProviderV1;
76
76
  }
77
-
78
77
  export interface InitializeModuleHostsInput {
79
78
  modules: readonly ModuleManifest[];
80
79
  /** Manifest 与 setup 由同一业务模块安装单元贡献。 */
@@ -101,7 +100,7 @@ export interface InitializedModuleHosts {
101
100
  readonly governedResources: readonly RegisteredModuleGovernedResource[];
102
101
  readonly rolePresets: readonly RegisteredModuleRolePreset[];
103
102
  readonly searchProviders: readonly RegisteredModuleSearchProvider[];
104
- readonly debugSessionProviders: readonly RegisteredModuleDebugSessionProvider[];
103
+ readonly agentSessionProviders: readonly RegisteredModuleAgentSessionProvider[];
105
104
  manifestOf(moduleName: string): ModuleManifest;
106
105
  /** 该模块经 Host 注册的上传用途集合(不含平台基础用途)。 */
107
106
  uploadPurposesOf(moduleName: string): ReadonlySet<string>;
@@ -19,7 +19,7 @@ export type {
19
19
  InitializedModuleHosts,
20
20
  InitializeModuleHostsInput,
21
21
  RegisteredModuleAiOperationHandler,
22
- RegisteredModuleDebugSessionProvider,
22
+ RegisteredModuleAgentSessionProvider,
23
23
  RegisteredModuleDurableHandler,
24
24
  RegisteredModuleGovernedResource,
25
25
  RegisteredModuleRolePreset,
@@ -94,8 +94,8 @@ export async function initializeModuleHosts(
94
94
  rolePresetKeys: new Set<string>(),
95
95
  searchProviders: [],
96
96
  searchProviderKeys: new Set<string>(),
97
- debugSessionProviders: [],
98
- debugSessionProviderKeys: new Set<string>(),
97
+ agentSessionProviders: [],
98
+ agentSessionProviderKeys: new Set<string>(),
99
99
  };
100
100
 
101
101
  const installations = [
@@ -155,7 +155,7 @@ export async function initializeModuleHosts(
155
155
  governedResources: [...state.governedResources],
156
156
  rolePresets: [...state.rolePresets],
157
157
  searchProviders: [...state.searchProviders],
158
- debugSessionProviders: [...state.debugSessionProviders],
158
+ agentSessionProviders: [...state.agentSessionProviders],
159
159
  manifestOf(moduleName) {
160
160
  const manifest = manifests.get(moduleName);
161
161
  if (!manifest) throw new Error(`模块未安装:${moduleName}`);
@@ -79,13 +79,13 @@ describe("模块 Actor 运行时边界", () => {
79
79
  });
80
80
 
81
81
  // @windy-module system.agent begin
82
- test("开发调试委托只向业务 Module 投影真实用户,核心主体保持不变", () => {
82
+ test("客户端 Agent 委托只向业务 Module 投影真实用户,核心主体保持不变", () => {
83
83
  const requestActor = bindModuleUserProjection(
84
84
  {
85
- id: "service_adk_debug",
85
+ id: "service_page_agent",
86
86
  type: "service",
87
- name: "ADK 开发调试",
88
- roleCodes: ["adk-debug"],
87
+ name: "PageAgent 客户端",
88
+ roleCodes: ["client-agent"],
89
89
  permissionKeys: ["analysis.copilot.execute"],
90
90
  },
91
91
  "user_dev_admin",
@@ -96,7 +96,7 @@ describe("模块 Actor 运行时边界", () => {
96
96
  expect(actor).toMatchObject({
97
97
  id: "user_dev_admin",
98
98
  type: "user",
99
- name: "ADK 开发调试",
99
+ name: "PageAgent 客户端",
100
100
  });
101
101
  expect(requestActorFromModule(actor)).toBe(requestActor);
102
102
  });
@@ -6,6 +6,8 @@ import type {
6
6
  ModuleAiOperationPort,
7
7
  ModuleAiOperationReadinessPortV1,
8
8
  ModuleAiScreenshotIntakePortV1,
9
+ ModuleAgentSessionMemoryPortV1,
10
+ ModuleAuthoritativeSourceInvalidationPortV1,
9
11
  ModuleAuditEmitInput,
10
12
  ModuleAuditEmitter,
11
13
  ModuleRequestContext,
@@ -105,6 +107,8 @@ export interface ModuleRequestContextInput {
105
107
  aiOperations?: ModuleAiOperationPort;
106
108
  aiReadiness?: ModuleAiOperationReadinessPortV1;
107
109
  screenshots?: ModuleAiScreenshotIntakePortV1;
110
+ sessionMemory?: ModuleAgentSessionMemoryPortV1;
111
+ sourceInvalidation?: ModuleAuthoritativeSourceInvalidationPortV1;
108
112
  onAuditEmit?: (action: string) => void;
109
113
  }
110
114
 
@@ -128,6 +132,10 @@ export function buildModuleRequestContext(
128
132
  ...(input.screenshots
129
133
  ? { screenshots: narrowModuleScreenshotIntakePort(input.screenshots) }
130
134
  : {}),
135
+ ...(input.sessionMemory ? { sessionMemory: input.sessionMemory } : {}),
136
+ ...(input.sourceInvalidation
137
+ ? { sourceInvalidation: input.sourceInvalidation }
138
+ : {}),
131
139
  jobs: createModuleJobPort({
132
140
  moduleName: input.moduleName,
133
141
  guardContext: input.guardContext,
@@ -0,0 +1,65 @@
1
+ import type { DurableJobs } from "@southwind-ai/jobs";
2
+ import type {
3
+ ModuleAiArtifactRef,
4
+ ModuleAiArtifactPort,
5
+ ModuleAiOperationPort,
6
+ ModuleAiOperationReadinessPortV1,
7
+ ModuleAiScreenshotIntakePortV1,
8
+ ModuleAgentSessionMemoryPortV1,
9
+ ModuleAuthoritativeSourceInvalidationPortV1,
10
+ } from "@southwind-ai/server-sdk";
11
+ import type { FeatureFlagDefinition } from "@southwind-ai/shared";
12
+ import type { createServerRuntime } from "../runtime.js";
13
+ import type { routeContext } from "../system/route-helpers.js";
14
+ import type { ModuleJobControlRuntime } from "./job-port.js";
15
+ import type { ModuleStorageServices } from "./storage-port.js";
16
+ import type { ModuleUserDirectoryServices } from "./user-directory-port.js";
17
+
18
+ type GuardContext = ReturnType<typeof routeContext>["guardContext"];
19
+
20
+ export interface ModuleRouteInstallContext {
21
+ runtime: ReturnType<typeof createServerRuntime>;
22
+ features: readonly FeatureFlagDefinition[];
23
+ jobs?: DurableJobs;
24
+ jobControl?: ModuleJobControlRuntime;
25
+ storage?: ModuleStorageServices;
26
+ // @windy-module system.storage begin
27
+ reportStaging?: import("../report-staging/service.js").ReportStagingService;
28
+ // @windy-module system.storage end
29
+ userDirectory?: Omit<ModuleUserDirectoryServices, "runtime" | "features">;
30
+ aiArtifacts?: (
31
+ moduleName: string,
32
+ guardContext: GuardContext,
33
+ signal: AbortSignal,
34
+ ) => ModuleAiArtifactPort;
35
+ validateAiArtifact?: (
36
+ reference: ModuleAiArtifactRef,
37
+ moduleName: string,
38
+ guardContext: GuardContext,
39
+ ) => ModuleAiArtifactRef;
40
+ aiOperations?: (
41
+ moduleName: string,
42
+ guardContext: GuardContext,
43
+ signal: AbortSignal,
44
+ ) => ModuleAiOperationPort;
45
+ aiReadiness?: (
46
+ moduleName: string,
47
+ guardContext: GuardContext,
48
+ signal: AbortSignal,
49
+ ) => ModuleAiOperationReadinessPortV1;
50
+ screenshots?: (
51
+ moduleName: string,
52
+ guardContext: GuardContext,
53
+ signal: AbortSignal,
54
+ ) => ModuleAiScreenshotIntakePortV1;
55
+ sessionMemory?: (
56
+ moduleName: string,
57
+ guardContext: GuardContext,
58
+ signal: AbortSignal,
59
+ ) => ModuleAgentSessionMemoryPortV1;
60
+ sourceInvalidation?: (
61
+ moduleName: string,
62
+ guardContext: GuardContext,
63
+ signal: AbortSignal,
64
+ ) => ModuleAuthoritativeSourceInvalidationPortV1;
65
+ }
@@ -1,84 +1,29 @@
1
- import type { DurableJobs } from "@southwind-ai/jobs";
2
- import type { FeatureFlagDefinition } from "@southwind-ai/shared";
3
1
  import { evaluateRouteGuards, findFeature } from "../route-guards.js";
4
2
  import { forbidden, routeContext } from "../system/route-helpers.js";
5
3
  import type { RouteApp } from "../system/route-types.js";
6
- import type { createServerRuntime } from "../runtime.js";
7
4
  import type { InitializedModuleHosts } from "./initialize.js";
8
- import type {
9
- ModuleAiArtifactRef,
10
- ModuleAiArtifactPort,
11
- ModuleAiOperationPort,
12
- ModuleAiOperationReadinessPortV1,
13
- ModuleAiScreenshotIntakePortV1,
14
- } from "@southwind-ai/server-sdk";
15
5
  // @windy-module system.storage begin
16
6
  import { ModuleReportStagingError } from "@southwind-ai/server-sdk";
17
7
  // @windy-module system.storage end
18
8
  import { buildModuleRequestContext } from "./request-context.js";
19
9
  import {
20
10
  createModuleStoragePort,
21
- type ModuleStorageServices,
22
11
  } from "./storage-port.js";
23
12
  import {
24
13
  createModuleUserDirectoryPort,
25
- type ModuleUserDirectoryServices,
26
14
  } from "./user-directory-port.js";
27
15
  import { createModuleStorageScope } from "./storage-scope.js";
28
16
  import { createModuleStorageWritePort } from "./storage-write-port.js";
29
- import type { ModuleJobControlRuntime } from "./job-port.js";
30
17
  import { createModuleSecretPort } from "./module-secret-port.js";
31
18
  import { createGovernedModuleScreenshotIntakePort } from "./screenshot-intake-port.js";
32
19
  import { ScreenshotIntakePlanStore } from "./screenshot-intake-store.js";
33
20
  // @windy-module system.storage begin
34
- import type { ReportStagingService } from "../report-staging/service.js";
35
21
  import { createModuleReportStagingPort } from "./report-staging-port.js";
36
22
  // @windy-module system.storage end
37
-
38
- type ServerRuntime = ReturnType<typeof createServerRuntime>;
23
+ import type { ModuleRouteInstallContext } from "./route-install-context.js";
39
24
 
40
25
  type RouteMethod = "get" | "post" | "put" | "delete";
41
26
 
42
- export interface ModuleRouteInstallContext {
43
- runtime: ServerRuntime;
44
- features: readonly FeatureFlagDefinition[];
45
- jobs?: DurableJobs;
46
- jobControl?: ModuleJobControlRuntime;
47
- /** 平台存储服务;提供后模块获得受限 Upload/BlobRead Port。 */
48
- storage?: ModuleStorageServices;
49
- // @windy-module system.storage begin
50
- /** Host 持有的大报告暂存生命周期;模块只获得作用域 Port。 */
51
- reportStaging?: ReportStagingService;
52
- // @windy-module system.storage end
53
- /** 平台身份目录;Adapter 会绑定当前请求 Actor 与服务端数据范围。 */
54
- userDirectory?: Omit<ModuleUserDirectoryServices, "runtime" | "features">;
55
- aiArtifacts?: (
56
- moduleName: string,
57
- guardContext: ReturnType<typeof routeContext>["guardContext"],
58
- signal: AbortSignal,
59
- ) => ModuleAiArtifactPort;
60
- validateAiArtifact?: (
61
- reference: ModuleAiArtifactRef,
62
- moduleName: string,
63
- guardContext: ReturnType<typeof routeContext>["guardContext"],
64
- ) => ModuleAiArtifactRef;
65
- aiOperations?: (
66
- moduleName: string,
67
- guardContext: ReturnType<typeof routeContext>["guardContext"],
68
- signal: AbortSignal,
69
- ) => ModuleAiOperationPort;
70
- aiReadiness?: (
71
- moduleName: string,
72
- guardContext: ReturnType<typeof routeContext>["guardContext"],
73
- signal: AbortSignal,
74
- ) => ModuleAiOperationReadinessPortV1;
75
- screenshots?: (
76
- moduleName: string,
77
- guardContext: ReturnType<typeof routeContext>["guardContext"],
78
- signal: AbortSignal,
79
- ) => ModuleAiScreenshotIntakePortV1;
80
- }
81
-
82
27
  /**
83
28
  * 把模块经 Host 注册的路由定义安装为走统一 Guard 的 API 路由。
84
29
  * Guard(权限 / Feature / License)与 security.denied 审计由
@@ -217,6 +162,16 @@ export function installModuleRoutes(
217
162
  ),
218
163
  })
219
164
  : undefined,
165
+ sessionMemory: context.sessionMemory?.(
166
+ moduleName,
167
+ route.guardContext,
168
+ route.request.signal,
169
+ ),
170
+ sourceInvalidation: context.sourceInvalidation?.(
171
+ moduleName,
172
+ route.guardContext,
173
+ route.request.signal,
174
+ ),
220
175
  jobs: context.jobs,
221
176
  jobControl: context.jobControl,
222
177
  reauthorizeJobs: async () =>
@@ -11,7 +11,7 @@ import {
11
11
  } from "@southwind-ai/server-sdk";
12
12
  import type {
13
13
  RegisteredModuleAiOperationHandler,
14
- RegisteredModuleDebugSessionProvider,
14
+ RegisteredModuleAgentSessionProvider,
15
15
  RegisteredModuleDurableHandler,
16
16
  RegisteredModuleGovernedResource,
17
17
  RegisteredModuleRolePreset,
@@ -21,7 +21,7 @@ import type {
21
21
  RegisteredModuleTaskHandler,
22
22
  RegisteredModuleToolHandler,
23
23
  } from "./initialize-contracts.js";
24
- import { validateDebugSessionProviderRegistration } from "./debug-session-provider-registration.js";
24
+ import { validateAgentSessionProviderRegistration } from "./agent-session-provider-registration.js";
25
25
  import { registerModuleDurableHandler } from "./durable-handler-registration.js";
26
26
  import { registerGovernedResources } from "./governed-resources.js";
27
27
  import { registerResourceFileAccessPolicies } from "./resource-file-policies.js";
@@ -62,8 +62,8 @@ export interface HostCollections {
62
62
  rolePresetKeys: Set<string>;
63
63
  searchProviders: RegisteredModuleSearchProvider[];
64
64
  searchProviderKeys: Set<string>;
65
- debugSessionProviders: RegisteredModuleDebugSessionProvider[];
66
- debugSessionProviderKeys: Set<string>;
65
+ agentSessionProviders: RegisteredModuleAgentSessionProvider[];
66
+ agentSessionProviderKeys: Set<string>;
67
67
  }
68
68
 
69
69
  export function createScopedHost(
@@ -71,6 +71,17 @@ export function createScopedHost(
71
71
  state: HostCollections,
72
72
  ): ModuleHost {
73
73
  const moduleName = manifest.name;
74
+ const registerAgentSessionProviders: ModuleHost["registerAgentSessionProviders"] =
75
+ (providers) => {
76
+ for (const provider of providers) {
77
+ validateAgentSessionProviderRegistration(manifest, provider);
78
+ if (state.agentSessionProviderKeys.has(provider.key)) {
79
+ throw new Error(`Agent 会话 Provider 重复注册:${provider.key}`);
80
+ }
81
+ state.agentSessionProviderKeys.add(provider.key);
82
+ state.agentSessionProviders.push({ moduleName, provider });
83
+ }
84
+ };
74
85
  return {
75
86
  moduleName,
76
87
  registerUploadPolicy(policy) {
@@ -219,15 +230,9 @@ export function createScopedHost(
219
230
  state.searchProviders.push({ moduleName, provider });
220
231
  }
221
232
  },
233
+ registerAgentSessionProviders,
222
234
  registerDebugSessionProviders(providers) {
223
- for (const provider of providers) {
224
- validateDebugSessionProviderRegistration(manifest, provider);
225
- if (state.debugSessionProviderKeys.has(provider.key)) {
226
- throw new Error(`调试会话 Provider 重复注册:${provider.key}`);
227
- }
228
- state.debugSessionProviderKeys.add(provider.key);
229
- state.debugSessionProviders.push({ moduleName, provider });
230
- }
235
+ registerAgentSessionProviders(providers);
231
236
  },
232
237
  };
233
238
  }
@@ -157,10 +157,10 @@ describe("模块上传会话授权绑定", () => {
157
157
  ]);
158
158
  const actor = bindModuleUserProjection(
159
159
  {
160
- id: "service_adk_debug",
160
+ id: "service_page_agent",
161
161
  type: "service",
162
- name: "调试服务",
163
- roleCodes: ["adk-debug"],
162
+ name: "PageAgent 客户端",
163
+ roleCodes: ["client-agent"],
164
164
  permissionKeys: ["shop.upload.manage"],
165
165
  scopeContext,
166
166
  },
@@ -9,17 +9,15 @@ export {
9
9
  type RegisteredModuleTaskHandler,
10
10
  type RegisteredModuleToolHandler,
11
11
  type RegisteredModuleAiOperationHandler,
12
- type RegisteredModuleDebugSessionProvider,
12
+ type RegisteredModuleAgentSessionProvider,
13
13
  } from "./module-host/initialize.js";
14
14
  export {
15
15
  buildModuleRequestContext,
16
16
  requestActorFromModule,
17
17
  toModuleActor,
18
18
  } from "./module-host/request-context.js";
19
- export {
20
- installModuleRoutes,
21
- type ModuleRouteInstallContext,
22
- } from "./module-host/route-installer.js";
19
+ export { installModuleRoutes } from "./module-host/route-installer.js";
20
+ export type { ModuleRouteInstallContext } from "./module-host/route-install-context.js";
23
21
  export {
24
22
  moduleRolePresetId,
25
23
  synchronizeModuleRolePresets,
@@ -31,17 +31,10 @@ import {
31
31
  requestSourcePolicyFromEnv,
32
32
  resolveRequestSource,
33
33
  } from "./http/request-source.js";
34
- import { resolveRequestActor } from "./runtime-request-actor.js";
35
34
  import {
36
35
  matchesAuditQuery,
37
36
  type AuditEventListQuery,
38
37
  } from "./runtime-audit-query.js";
39
- // @windy-module system.agent begin
40
- import {
41
- createAdkDebugRuntime,
42
- type AdkDebugActorResolver,
43
- } from "./runtime-adk-debug.js";
44
- // @windy-module system.agent end
45
38
 
46
39
  export type {
47
40
  FeatureFlagRuntimeResolver,
@@ -79,9 +72,6 @@ export interface ServerRuntimeOptions {
79
72
  disabledModuleNames?: ReadonlySet<string>;
80
73
  auditWriter?: AuditEventWriter;
81
74
  auditReader?: AuditEventReader;
82
- // @windy-module system.agent begin
83
- adkDebugActorResolver?: AdkDebugActorResolver;
84
- // @windy-module system.agent end
85
75
  }
86
76
 
87
77
  export class InMemorySessionStore {
@@ -190,19 +180,6 @@ export function createServerRuntime(
190
180
  options: ServerRuntimeOptions = {},
191
181
  ) {
192
182
  const developmentAuth = readDevelopmentAuthBypass(env);
193
- // @windy-module system.agent begin
194
- const adkDebug = createAdkDebugRuntime(
195
- env,
196
- undefined,
197
- options.adkDebugActorResolver,
198
- );
199
- if (adkDebug.usesToken(developmentAuth.token)) {
200
- throw new Error("ADK Web 调试 Token 不能复用开发管理员 Token");
201
- }
202
- if (adkDebug.usesToken(env.AGENT_SERVER_INTERNAL_TOKEN?.trim())) {
203
- throw new Error("ADK Web 调试 Token 不能复用 Agent 内部服务 Token");
204
- }
205
- // @windy-module system.agent end
206
183
  const sessionStore = new InMemorySessionStore(
207
184
  developmentAuth.token
208
185
  ? [{ token: developmentAuth.token, actor: developmentAdminActor() }]
@@ -234,15 +211,9 @@ export function createServerRuntime(
234
211
  metadata.clientIp,
235
212
  requestSourcePolicy,
236
213
  );
237
- const actor = await resolveRequestActor(
238
- request,
239
- async () =>
240
- (await options.actorResolver?.resolve(request)) ||
241
- sessionStore.resolve(request),
242
- // @windy-module system.agent begin
243
- adkDebug,
244
- // @windy-module system.agent end
245
- );
214
+ const actor =
215
+ (await options.actorResolver?.resolve(request)) ||
216
+ sessionStore.resolve(request);
246
217
  const license =
247
218
  (await options.licenseResolver?.resolve()) || licenseStore.resolve();
248
219
  return createRequestGuardContext(request, {
@@ -252,10 +223,6 @@ export function createServerRuntime(
252
223
  licenseEnforced: options.licenseEnforced,
253
224
  });
254
225
  },
255
- // @windy-module system.agent begin
256
- resolveEphemeralActor: adkDebug.resolveActor,
257
- agentDebugOperationForActor: adkDebug.operationForActor,
258
- // @windy-module system.agent end
259
226
  async createGuardContextForActor(
260
227
  request: Request,
261
228
  actor: RequestActor,
@@ -69,6 +69,25 @@ describe("legacy Storage 分片路由取消未读请求体", () => {
69
69
  ).rejects.toThrow("injected guard failure");
70
70
  expect(request.cancelled()).toBe(true);
71
71
  });
72
+
73
+ test("运行时请求体缺少 cancel 时 Guard 拒绝仍保留 403", async () => {
74
+ const fixture = setup();
75
+ const request = new Request("http://localhost/api/system/storage/upload", {
76
+ method: "PUT",
77
+ });
78
+ Object.defineProperty(request, "body", {
79
+ value: {},
80
+ configurable: true,
81
+ });
82
+
83
+ const response = await fixture.invoke(
84
+ actor([]),
85
+ "upload_44444444444444444444444444444444",
86
+ request,
87
+ );
88
+
89
+ expect(response.status).toBe(403);
90
+ });
72
91
  });
73
92
 
74
93
  function setup(guardFailure = false) {
@@ -311,7 +311,9 @@ async function cancelUnreadBody(
311
311
  body: ReadableStream<Uint8Array> | null | undefined,
312
312
  reason: string,
313
313
  ): Promise<void> {
314
- await body?.cancel(reason).catch(() => undefined);
314
+ const cancel = body?.cancel;
315
+ if (typeof cancel !== "function") return;
316
+ await cancel.call(body, reason).catch(() => undefined);
315
317
  }
316
318
 
317
319
  function record(
@@ -1,5 +1,6 @@
1
1
  import { buildActorScopeContexts } from "../data-access/context.js";
2
2
  import type { RequestActor } from "../guards.js";
3
+ import type { ManagedRole, ManagedUser } from "./entities.js";
3
4
  import type { SystemRepositories } from "./seed.js";
4
5
 
5
6
  export async function resolveCurrentSystemActor(
@@ -7,9 +8,21 @@ export async function resolveCurrentSystemActor(
7
8
  actorId: string,
8
9
  ): Promise<RequestActor | undefined> {
9
10
  const user = await repositories.users.get(actorId);
10
- if (!user || user.status !== "active") return undefined;
11
+ if (!user) return undefined;
12
+ return resolveSystemActorForUser(repositories, user);
13
+ }
14
+
15
+ export async function resolveSystemActorForUser(
16
+ repositories: Pick<SystemRepositories, "roles">,
17
+ user: ManagedUser,
18
+ roleOverrides: readonly ManagedRole[] = [],
19
+ ): Promise<RequestActor | undefined> {
20
+ if (user.status !== "active") return undefined;
21
+ const overrides = new Map(roleOverrides.map((role) => [role.id, role]));
11
22
  const roles = (
12
- await Promise.all(user.roleIds.map((id) => repositories.roles.get(id)))
23
+ await Promise.all(
24
+ user.roleIds.map((id) => overrides.get(id) ?? repositories.roles.get(id)),
25
+ )
13
26
  ).filter(
14
27
  (role): role is NonNullable<typeof role> => role?.status === "active",
15
28
  );
@@ -0,0 +1,30 @@
1
+ import type { NodePgDatabase } from "drizzle-orm/node-postgres";
2
+ import type { RequestActor } from "../guards.js";
3
+
4
+ export interface AgentAuthorizationInvalidationInput {
5
+ readonly previousActor: RequestActor;
6
+ readonly eventId: string;
7
+ readonly occurredAt: string;
8
+ readonly database: NodePgDatabase;
9
+ }
10
+
11
+ export type AgentAuthorizationInvalidationTarget = (
12
+ input: AgentAuthorizationInvalidationInput,
13
+ ) => Promise<void>;
14
+
15
+ /** Routes are registered before Agent composition, so startup binds this once. */
16
+ export class DeferredAgentAuthorizationInvalidation {
17
+ #target?: AgentAuthorizationInvalidationTarget;
18
+
19
+ bind(target: AgentAuthorizationInvalidationTarget | undefined) {
20
+ if (this.#target) throw new Error("Agent 授权失效传播已绑定");
21
+ this.#target = target;
22
+ }
23
+
24
+ async publish(input: AgentAuthorizationInvalidationInput) {
25
+ if (!this.#target) {
26
+ throw new Error("Agent 授权失效传播暂不可用");
27
+ }
28
+ await this.#target(input);
29
+ }
30
+ }
@@ -0,0 +1,36 @@
1
+ import type { PlatformConfig } from "@southwind-ai/config";
2
+ import type { AgentAuthorizationInvalidationTarget } from "./authorization-invalidation-bridge.js";
3
+ import { DeferredAgentAuthorizationInvalidation } from "./authorization-invalidation-bridge.js";
4
+ import type { ServerPersistence } from "../persistence.js";
5
+ import type { SystemRepositories } from "./seed.js";
6
+
7
+ export function createAuthorizationInvalidationComposition(input: {
8
+ readonly platformConfig: PlatformConfig;
9
+ readonly persistence?: ServerPersistence;
10
+ readonly repositories: SystemRepositories;
11
+ }) {
12
+ const bridge = new DeferredAgentAuthorizationInvalidation();
13
+ const authorizationRevocations =
14
+ input.platformConfig.enableAI && input.persistence?.db
15
+ ? {
16
+ publish: (
17
+ event: Omit<Parameters<typeof bridge.publish>[0], "database">,
18
+ ) =>
19
+ bridge.publish({
20
+ ...event,
21
+ database:
22
+ input.repositories.organizationTransaction?.currentDatabase() ??
23
+ input.persistence!.db!,
24
+ }),
25
+ }
26
+ : undefined;
27
+ return {
28
+ systemRouteOptions: {
29
+ authRepository: input.persistence?.authRepository,
30
+ ...(authorizationRevocations ? { authorizationRevocations } : {}),
31
+ },
32
+ bind(target: AgentAuthorizationInvalidationTarget | undefined) {
33
+ bridge.bind(target);
34
+ },
35
+ };
36
+ }
@@ -55,6 +55,9 @@ export interface DrizzleSystemRepositories {
55
55
  licenses: EntityRepository<ManagedLicense>;
56
56
  // @windy-module system.license end
57
57
  organizationMutationRunner: MutationRunner;
58
+ organizationTransaction: {
59
+ currentDatabase(): NodePgDatabase;
60
+ };
58
61
  }
59
62
 
60
63
  export function createDrizzleSystemRepositories(
@@ -62,7 +65,7 @@ export function createDrizzleSystemRepositories(
62
65
  seeds: DrizzleSystemRepositorySeeds,
63
66
  ): DrizzleSystemRepositories {
64
67
  const transactionContext = new DrizzleTransactionContext();
65
- return {
68
+ const repositories = {
66
69
  users: new DrizzleScopedEntityRepository(
67
70
  db,
68
71
  userConfig(seeds.users),
@@ -107,5 +110,9 @@ export function createDrizzleSystemRepositories(
107
110
  "windy:system:organization",
108
111
  transactionContext,
109
112
  ),
113
+ organizationTransaction: {
114
+ currentDatabase: () => transactionContext.current(db),
115
+ },
110
116
  };
117
+ return repositories;
111
118
  }