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
@@ -11,6 +11,7 @@ export function authFixture(
11
11
  users: AuthUserRecord[],
12
12
  passwordPolicy?: () => PasswordPolicy,
13
13
  sessionTtlSeconds?: () => number,
14
+ onSessionsRevoked?: (actorId: string) => Promise<void> | void,
14
15
  ) {
15
16
  const repository = new InMemoryAuthRepository(users);
16
17
  const resolver = new RepositoryActorResolver(repository, {
@@ -21,6 +22,7 @@ export function authFixture(
21
22
  const service = new AuthService(repository, {
22
23
  passwordPolicy,
23
24
  sessionTtlSeconds,
25
+ onSessionsRevoked,
24
26
  auditWriter: {
25
27
  write(event) {
26
28
  events.push(event);
@@ -89,6 +89,24 @@ describe("platform auth API", () => {
89
89
  expect(JSON.stringify(body)).not.toContain(current.token);
90
90
  });
91
91
 
92
+ test("登出即时通知 Client Agent Session 按 canonical Actor 撤销", async () => {
93
+ const revoked: string[] = [];
94
+ const fixture = authFixture(
95
+ [activeUser()],
96
+ undefined,
97
+ undefined,
98
+ (actorId) => {
99
+ revoked.push(actorId);
100
+ },
101
+ );
102
+ const current = await login(fixture.app, "admin");
103
+ const response = await fixture.app.handle(
104
+ apiRequest("/api/auth/logout", current.token, "POST"),
105
+ );
106
+ expect(response.status).toBe(200);
107
+ expect(revoked).toEqual(["user_admin"]);
108
+ });
109
+
92
110
  test("Admin 登录只签发 Cookie,独立 API 登录才返回 Bearer Token", async () => {
93
111
  const fixture = authFixture([activeUser()]);
94
112
  const browserLogin = await fixture.app.handle(
@@ -11,6 +11,7 @@ interface AuthRuntimeInput {
11
11
  passwordPolicy?: () => PasswordPolicy;
12
12
  auditWriter: AuditEventWriter["write"];
13
13
  auditReader?: AuditEventReader;
14
+ onSessionsRevoked?: (actorId: string) => Promise<void> | void;
14
15
  }
15
16
 
16
17
  export function createAuthRuntime(input: AuthRuntimeInput) {
@@ -22,6 +23,7 @@ export function createAuthRuntime(input: AuthRuntimeInput) {
22
23
  auditWriter: { write: input.auditWriter },
23
24
  auditReader: input.auditReader,
24
25
  passwordHasher,
26
+ onSessionsRevoked: input.onSessionsRevoked,
25
27
  });
26
28
  const reauthentication = new ReauthenticationService(
27
29
  authRepository,
@@ -0,0 +1,16 @@
1
+ import type { PasswordPolicy } from "@southwind-ai/shared";
2
+ import type { AuditEventReader, AuditEventWriter } from "../runtime.js";
3
+ import type { AuthenticationProviderRegistry } from "./authentication-provider.js";
4
+ import type { PasswordHasher } from "./password.js";
5
+
6
+ export interface AuthServiceOptions {
7
+ sessionTtlSeconds?: number | (() => number);
8
+ passwordPolicy?: () => PasswordPolicy;
9
+ now?: () => Date;
10
+ tokenFactory?: () => string;
11
+ passwordHasher?: PasswordHasher;
12
+ authenticationProviders?: AuthenticationProviderRegistry;
13
+ auditWriter: AuditEventWriter;
14
+ auditReader?: AuditEventReader;
15
+ onSessionsRevoked?: (actorId: string) => Promise<void> | void;
16
+ }
@@ -6,7 +6,6 @@ import {
6
6
  type PasswordPolicy,
7
7
  } from "@southwind-ai/shared";
8
8
  import type { RequestActor } from "../guards.js";
9
- import type { AuditEventReader, AuditEventWriter } from "../runtime.js";
10
9
  import { hashSessionToken } from "./actor-resolver.js";
11
10
  import {
12
11
  AuthenticationProviderRegistry,
@@ -20,6 +19,7 @@ import {
20
19
  type PasswordUpdateResult,
21
20
  } from "./credential-service.js";
22
21
  import { OwnSessionService } from "./session-service.js";
22
+ import type { AuthServiceOptions } from "./service-options.js";
23
23
 
24
24
  export interface AuthRequestMetadata {
25
25
  ip?: string;
@@ -45,17 +45,6 @@ export type RevokeResult =
45
45
  | { ok: true; sessionId: string; currentSessionRevoked: boolean }
46
46
  | { ok: false; code: "SESSION_NOT_FOUND" | "FORBIDDEN" };
47
47
 
48
- export interface AuthServiceOptions {
49
- sessionTtlSeconds?: number | (() => number);
50
- passwordPolicy?: () => PasswordPolicy;
51
- now?: () => Date;
52
- tokenFactory?: () => string;
53
- passwordHasher?: PasswordHasher;
54
- authenticationProviders?: AuthenticationProviderRegistry;
55
- auditWriter: AuditEventWriter;
56
- auditReader?: AuditEventReader;
57
- }
58
-
59
48
  export class AuthService {
60
49
  private readonly sessionTtlSeconds: () => number;
61
50
  private readonly passwordPolicy: () => PasswordPolicy;
@@ -191,6 +180,8 @@ export class AuthService {
191
180
  const revoked = session
192
181
  ? await this.repository.revokeSession(session.id, this.now())
193
182
  : false;
183
+ if (revoked && session)
184
+ await this.options.onSessionsRevoked?.(session.userId);
194
185
  await this.recordAuthEvent({
195
186
  action: "auth.logout",
196
187
  outcome: revoked ? "success" : "failure",
@@ -267,6 +258,7 @@ export class AuthService {
267
258
  const currentSessionRevoked =
268
259
  revoked &&
269
260
  (await this.ownSessions.isCurrent(sessionId, actor, currentToken));
261
+ if (revoked) await this.options.onSessionsRevoked?.(session.userId);
270
262
  return revoked
271
263
  ? { ok: true, sessionId, currentSessionRevoked }
272
264
  : { ok: false, code: "SESSION_NOT_FOUND" };
@@ -299,6 +291,9 @@ export class AuthService {
299
291
  metadata: { scope: "all-own", includeCurrent, ...result },
300
292
  request: metadata,
301
293
  });
294
+ if (result.revokedSessions > 0) {
295
+ await this.options.onSessionsRevoked?.(actor.id);
296
+ }
302
297
  return result;
303
298
  }
304
299
 
@@ -14,15 +14,11 @@ import { createServerRuntime } from "./runtime.js";
14
14
  import { readPositiveInt } from "./runtime-config.js";
15
15
  // @windy-module system.scheduler end
16
16
  // @windy-module system.agent begin
17
- import { registerAgentPlatformRuntime } from "./agent/runtime-bootstrap.js";
18
17
  import { DeferredAgentBackgroundOperationPortFactory } from "./agent/background-operation-port.js";
19
- import {
20
- projectAiScreenshotIntakeFactoryV1,
21
- projectAiScreenshotPageRegistryV2,
22
- } from "./app/ai-screenshot-intake-binding.js";
23
- import { resolveCurrentSystemActor } from "./system/actor.js";
18
+ import { composeApplicationAgentRuntime } from "./app/agent-runtime-composition.js";
19
+ import { workflowDurableInput } from "./agent/workflow-durable-runtime-input.js";
24
20
  // @windy-module system.agent end
25
- import { createAuthRuntime } from "./auth/runtime.js";
21
+ import { createComposedAuthRuntime } from "./auth/composition.js";
26
22
  // @windy-module system.license begin
27
23
  import { createLicenseRuntimeActivation } from "./license/activation.js";
28
24
  // @windy-module system.license end
@@ -31,6 +27,7 @@ import { registerSystemOperationRoutes } from "./system/operations.js";
31
27
  import { createPostgresMonitorProbe } from "./system/postgres-monitoring.js";
32
28
  // @windy-module system.operations end
33
29
  import { registerSystemRoutes } from "./system/routes.js";
30
+ import { createAuthorizationInvalidationComposition } from "./system/authorization-invalidation-composition.js";
34
31
  // @windy-module system.scheduler begin
35
32
  import { registerSchedulerRoutes } from "./scheduler/routes.js";
36
33
  import { SchedulerWorker } from "./scheduler/worker.js";
@@ -85,10 +82,6 @@ const licenseActivation = createLicenseRuntimeActivation(
85
82
  // @windy-module system.license end
86
83
  const runtime = createServerRuntime(process.env, {
87
84
  actorResolver: persistence?.actorResolver,
88
- // @windy-module system.agent begin
89
- adkDebugActorResolver: (actorId) =>
90
- resolveCurrentSystemActor(systemRepositories, actorId),
91
- // @windy-module system.agent end
92
85
  // @windy-module system.license begin
93
86
  licenseResolver: licenseActivation.resolver,
94
87
  licenseEnforced: licenseActivation.enforced,
@@ -102,26 +95,27 @@ const runtime = createServerRuntime(process.env, {
102
95
  // @windy-module system.audit end
103
96
  });
104
97
  const observability = createHttpObservability(runtime, persistence, logger);
98
+ const authorizationInvalidation = createAuthorizationInvalidationComposition({
99
+ platformConfig,
100
+ persistence,
101
+ repositories: systemRepositories,
102
+ });
105
103
  // @windy-module system.license begin
106
104
  licenseActivation.runtime.setAuditSink(runtime.auditSink);
107
105
  // @windy-module system.license end
108
106
  const {
109
107
  authRepository,
110
108
  authService,
109
+ // @windy-module system.agent begin
110
+ bindClientAgentSessions,
111
+ // @windy-module system.agent end
111
112
  // @windy-module system.data-governance begin
112
113
  reauthentication,
113
114
  // @windy-module system.data-governance end
114
- } = createAuthRuntime({
115
- repository: persistence?.authRepository,
116
- sessionTtlSeconds: () => platformConfig.security.sessionTtlSeconds,
117
- passwordPolicy: () => ({
118
- minLength: platformConfig.security.passwordMinLength,
119
- maxLength: platformConfig.security.passwordMaxLength,
120
- }),
121
- auditWriter: (event) => runtime.auditSink.recordCriticalEvent(event),
122
- // @windy-module system.audit begin
123
- auditReader: persistence?.auditReader,
124
- // @windy-module system.audit end
115
+ } = createComposedAuthRuntime({
116
+ platformConfig,
117
+ persistence,
118
+ runtime,
125
119
  });
126
120
  // @windy-module system.storage begin
127
121
  const { storageRuntime, reportStagingRuntime } = createStorageHostRuntime(
@@ -263,9 +257,13 @@ registerFoundationRoute(app, runtime, foundationSnapshot, systemRepositories);
263
257
  // @windy-module system.data-governance begin
264
258
  registerGovernedUserExportRoutes(app, governedExportService, runtime, features);
265
259
  // @windy-module system.data-governance end
266
- registerSystemRoutes(app, systemRepositories, runtime, features, {
267
- authRepository: persistence?.authRepository,
268
- });
260
+ registerSystemRoutes(
261
+ app,
262
+ systemRepositories,
263
+ runtime,
264
+ features,
265
+ authorizationInvalidation.systemRouteOptions,
266
+ );
269
267
  // @windy-module system.operations begin
270
268
  registerSystemOperationRoutes(app, runtime, features, {
271
269
  redisHealthProbe: configurationRuntime.redisHealthProbe,
@@ -278,7 +276,7 @@ registerSystemOperationRoutes(app, runtime, features, {
278
276
  });
279
277
  // @windy-module system.operations end
280
278
  // @windy-module system.agent begin
281
- const agentRuntime = registerAgentPlatformRuntime({
279
+ const agentRuntime = composeApplicationAgentRuntime({
282
280
  app,
283
281
  platformConfig,
284
282
  modules: foundationModules,
@@ -287,13 +285,13 @@ const agentRuntime = registerAgentPlatformRuntime({
287
285
  systemRepositories,
288
286
  storage: storageRuntime,
289
287
  workflow: workflowService,
288
+ ...workflowDurableInput([durableJobRuntime, storageRuntime, logger]),
290
289
  db: persistence?.db,
291
290
  backgroundAi: moduleBackgroundAi,
292
- screenshotPageRegistry: platformConfig.enableAI
293
- ? projectAiScreenshotPageRegistryV2
294
- : undefined,
291
+ bindAuthorizationInvalidation: (target) =>
292
+ authorizationInvalidation.bind(target),
293
+ bindClientAgentSessions,
295
294
  });
296
- const { toolHandlers, aiArtifacts, aiOperations, aiReadiness } = agentRuntime;
297
295
  // @windy-module system.agent end
298
296
  // @windy-module system.scheduler begin
299
297
  registerSchedulerRoutes(app, scheduler, runtime, features);
@@ -314,12 +312,12 @@ installModuleHttpRuntime(moduleHosts, app, {
314
312
  // @windy-module system.storage end
315
313
  systemRepositories,
316
314
  // @windy-module system.agent begin
317
- aiArtifacts,
318
- aiOperations,
319
- aiReadiness,
320
- screenshots: platformConfig.enableAI
321
- ? projectAiScreenshotIntakeFactoryV1
322
- : undefined,
315
+ aiArtifacts: agentRuntime.aiArtifacts,
316
+ aiOperations: agentRuntime.aiOperations,
317
+ aiReadiness: agentRuntime.aiReadiness,
318
+ sessionMemory: agentRuntime.sessionMemory,
319
+ sourceInvalidation: agentRuntime.sourceInvalidation,
320
+ screenshots: agentRuntime.screenshots,
323
321
  // @windy-module system.agent end
324
322
  // @windy-module system.data-governance begin
325
323
  reauthenticate: (actorId, password) =>
@@ -334,7 +332,7 @@ finalizePlatformStartup({
334
332
  tasks: scheduledTaskDefinitions,
335
333
  // @windy-module system.scheduler end
336
334
  // @windy-module system.agent begin
337
- tools: toolHandlers,
335
+ tools: agentRuntime.toolHandlers,
338
336
  disposeAgentRuntime: agentRuntime.disposeAgentRuntime,
339
337
  // @windy-module system.agent end
340
338
  // @windy-module system.search begin
@@ -48,7 +48,7 @@ describe("License 手机配对会话", () => {
48
48
 
49
49
  const tampered = {
50
50
  ...fixture.license,
51
- signature: `A${fixture.license.signature.slice(1)}`,
51
+ signature: `${fixture.license.signature.startsWith("A") ? "B" : "A"}${fixture.license.signature.slice(1)}`,
52
52
  };
53
53
  await expect(
54
54
  service.deliver(
@@ -0,0 +1,91 @@
1
+ import {
2
+ MODULE_AGENT_SESSION_MEMORY_SCHEMA_VERSION,
3
+ type ModuleAgentSessionMemoryPortV1,
4
+ type ModuleSessionMemorySourceV1,
5
+ } from "@southwind-ai/server-sdk";
6
+ import type { RequestGuardContext } from "../guards.js";
7
+ import type { ContextSourceReference } from "../agent/context-memory/contracts.js";
8
+ import type { MemoryProjectionTriggerPort } from "../agent/context-memory/memory-projector.js";
9
+
10
+ export function createModuleAgentSessionMemoryPort(
11
+ moduleName: string,
12
+ context: RequestGuardContext,
13
+ signal: AbortSignal,
14
+ projector: MemoryProjectionTriggerPort,
15
+ ): ModuleAgentSessionMemoryPortV1 {
16
+ const common = (input: ModuleMemoryBase) => ({
17
+ triggerId: `${moduleName}:${input.triggerId}`,
18
+ derivation: {
19
+ sessionId: input.sessionId,
20
+ throughSequence: input.throughSequence,
21
+ },
22
+ sources: input.sources.map((source) => sourceReference(moduleName, source)),
23
+ ...(input.expiresAt ? { expiresAt: input.expiresAt } : {}),
24
+ });
25
+ return {
26
+ schemaVersion: MODULE_AGENT_SESSION_MEMORY_SCHEMA_VERSION,
27
+ async rememberUserPreference(input) {
28
+ return receipt(await projector.projectUserPreference({
29
+ ...common(input),
30
+ kind: "user-preference",
31
+ actorId: context.actor.id,
32
+ preferenceKey: input.preferenceKey,
33
+ value: input.value,
34
+ }, context, signal));
35
+ },
36
+ async proposeCaseMemory(input) {
37
+ return receipt(await projector.projectCaseMemoryCandidate({
38
+ ...common(input),
39
+ kind: "case-memory-candidate",
40
+ caseId: input.caseId,
41
+ claim: input.claim,
42
+ ...(input.confidence !== undefined
43
+ ? { confidence: input.confidence }
44
+ : {}),
45
+ }, context, signal));
46
+ },
47
+ async referenceVerifiedFact(input) {
48
+ return receipt(await projector.projectVerifiedFactReference({
49
+ ...common(input),
50
+ kind: "verified-fact-reference",
51
+ caseId: input.caseId,
52
+ fact: { moduleKey: moduleName, ...input.fact },
53
+ }, context, signal));
54
+ },
55
+ };
56
+ }
57
+
58
+ interface ModuleMemoryBase {
59
+ readonly triggerId: string;
60
+ readonly sessionId: string;
61
+ readonly throughSequence: number;
62
+ readonly sources: readonly ModuleSessionMemorySourceV1[];
63
+ readonly expiresAt?: string;
64
+ }
65
+
66
+ function sourceReference(
67
+ moduleName: string,
68
+ source: ModuleSessionMemorySourceV1,
69
+ ): ContextSourceReference {
70
+ return {
71
+ moduleKey: moduleName,
72
+ kind: source.kind as ContextSourceReference["kind"],
73
+ id: source.id,
74
+ version: source.version,
75
+ sequence: source.sequence,
76
+ digest: source.digest,
77
+ validity: {
78
+ status: "valid",
79
+ checkedAt: source.checkedAt,
80
+ ...(source.expiresAt ? { expiresAt: source.expiresAt } : {}),
81
+ },
82
+ };
83
+ }
84
+
85
+ function receipt(projection: { memoryId: string; version: string; digest: string }) {
86
+ return {
87
+ memoryId: projection.memoryId,
88
+ version: projection.version,
89
+ digest: projection.digest,
90
+ };
91
+ }
@@ -1,30 +1,32 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
  import type { ModuleManifest } from "@southwind-ai/modules";
3
3
  import {
4
+ MODULE_AGENT_SESSION_SCHEMA_VERSION,
4
5
  MODULE_DEBUG_SESSION_SCHEMA_VERSION,
6
+ type ModuleAgentSessionProviderV1,
5
7
  type ModuleDebugSessionProviderV1,
6
8
  } from "@southwind-ai/server-sdk";
7
9
  import { featureKey } from "@southwind-ai/shared";
8
10
  import { initializeModuleHosts } from "./initialize.js";
9
11
  import { manifest } from "./test-fixtures.js";
10
12
 
11
- describe("ADK 调试会话 Provider 注册", () => {
13
+ describe("Agent 会话 Provider 注册", () => {
12
14
  test("只接受同模块 Agent Operation 的 Feature 与权限绑定", async () => {
13
- const module = debugManifest();
14
- const provider = debugProvider();
15
+ const module = agentManifest();
16
+ const provider = agentProvider();
15
17
  const hosts = await initializeModuleHosts({
16
18
  modules: [module],
17
19
  installations: [
18
20
  {
19
21
  manifest: module,
20
22
  setup(host) {
21
- host.registerDebugSessionProviders([provider]);
23
+ host.registerAgentSessionProviders([provider]);
22
24
  },
23
25
  },
24
26
  ],
25
27
  });
26
28
 
27
- expect(hosts.debugSessionProviders).toEqual([
29
+ expect(hosts.agentSessionProviders).toEqual([
28
30
  { moduleName: "known", provider },
29
31
  ]);
30
32
 
@@ -45,25 +47,25 @@ describe("ADK 调试会话 Provider 注册", () => {
45
47
  test("协议版本、Manifest 审计动作、命名空间与重复 Key fail closed", async () => {
46
48
  await expect(
47
49
  initializeWith({
48
- ...debugProvider(),
50
+ ...agentProvider(),
49
51
  key: "other.history",
50
52
  }),
51
53
  ).rejects.toThrow("不属于模块 known");
52
54
  await expect(
53
55
  initializeWith({
54
- ...debugProvider(),
56
+ ...agentProvider(),
55
57
  auditAction: "known.missing",
56
58
  }),
57
59
  ).rejects.toThrow("审计动作未在 Manifest 声明");
58
60
  await expect(
59
61
  initializeWith({
60
- ...debugProvider(),
62
+ ...agentProvider(),
61
63
  schemaVersion: 2 as 1,
62
64
  }),
63
65
  ).rejects.toThrow("协议版本不受支持");
64
66
 
65
- const module = debugManifest();
66
- const provider = debugProvider();
67
+ const module = agentManifest();
68
+ const provider = agentProvider();
67
69
  await expect(
68
70
  initializeModuleHosts({
69
71
  modules: [module],
@@ -71,33 +73,56 @@ describe("ADK 调试会话 Provider 注册", () => {
71
73
  {
72
74
  manifest: module,
73
75
  setup(host) {
74
- host.registerDebugSessionProviders([provider, provider]);
76
+ host.registerAgentSessionProviders([provider, provider]);
75
77
  },
76
78
  },
77
79
  ],
78
80
  }),
79
81
  ).rejects.toThrow("重复注册");
80
82
  });
83
+
84
+ test("旧 Debug Session 名称只作为同一注册表的兼容 alias", async () => {
85
+ const module = agentManifest();
86
+ const provider: ModuleDebugSessionProviderV1 = {
87
+ ...agentProvider(),
88
+ schemaVersion: MODULE_DEBUG_SESSION_SCHEMA_VERSION,
89
+ };
90
+ const hosts = await initializeModuleHosts({
91
+ modules: [module],
92
+ installations: [
93
+ {
94
+ manifest: module,
95
+ setup(host) {
96
+ host.registerDebugSessionProviders([provider]);
97
+ },
98
+ },
99
+ ],
100
+ });
101
+
102
+ expect(hosts.agentSessionProviders).toEqual([
103
+ { moduleName: "known", provider },
104
+ ]);
105
+ });
81
106
  });
82
107
 
83
- async function initializeWith(provider: ModuleDebugSessionProviderV1) {
84
- const module = debugManifest();
108
+ async function initializeWith(provider: ModuleAgentSessionProviderV1) {
109
+ const module = agentManifest();
85
110
  return initializeModuleHosts({
86
111
  modules: [module],
87
112
  installations: [
88
113
  {
89
114
  manifest: module,
90
115
  setup(host) {
91
- host.registerDebugSessionProviders([provider]);
116
+ host.registerAgentSessionProviders([provider]);
92
117
  },
93
118
  },
94
119
  ],
95
120
  });
96
121
  }
97
122
 
98
- function debugProvider(): ModuleDebugSessionProviderV1 {
123
+ function agentProvider(): ModuleAgentSessionProviderV1 {
99
124
  return {
100
- schemaVersion: MODULE_DEBUG_SESSION_SCHEMA_VERSION,
125
+ schemaVersion: MODULE_AGENT_SESSION_SCHEMA_VERSION,
101
126
  key: "known.copilot.history",
102
127
  operationKeys: ["known.copilot.global"],
103
128
  featureKey: "known.copilot",
@@ -108,7 +133,7 @@ function debugProvider(): ModuleDebugSessionProviderV1 {
108
133
  };
109
134
  }
110
135
 
111
- function debugManifest(): ModuleManifest {
136
+ function agentManifest(): ModuleManifest {
112
137
  return manifest("known", {
113
138
  features: [
114
139
  {
@@ -1,59 +1,59 @@
1
1
  import type { ModuleManifest } from "@southwind-ai/modules";
2
2
  import {
3
- MODULE_DEBUG_SESSION_SCHEMA_VERSION,
3
+ MODULE_AGENT_SESSION_SCHEMA_VERSION,
4
4
  requireModuleNamespace,
5
- type ModuleDebugSessionProviderV1,
5
+ type ModuleAgentSessionProviderV1,
6
6
  } from "@southwind-ai/server-sdk";
7
7
 
8
- export function validateDebugSessionProviderRegistration(
8
+ export function validateAgentSessionProviderRegistration(
9
9
  manifest: ModuleManifest,
10
- provider: ModuleDebugSessionProviderV1,
10
+ provider: ModuleAgentSessionProviderV1,
11
11
  ): void {
12
12
  const moduleName = manifest.name;
13
- requireModuleNamespace("调试会话 Provider", provider.key, moduleName);
13
+ requireModuleNamespace("Agent 会话 Provider", provider.key, moduleName);
14
14
  requireModuleNamespace(
15
- "调试会话 Provider Feature",
15
+ "Agent 会话 Provider Feature",
16
16
  provider.featureKey,
17
17
  moduleName,
18
18
  );
19
19
  requireModuleNamespace(
20
- "调试会话 Provider 权限",
20
+ "Agent 会话 Provider 权限",
21
21
  provider.permissionKey,
22
22
  moduleName,
23
23
  );
24
24
  requireModuleNamespace(
25
- "调试会话 Provider 审计动作",
25
+ "Agent 会话 Provider 审计动作",
26
26
  provider.auditAction,
27
27
  moduleName,
28
28
  );
29
- if (provider.schemaVersion !== MODULE_DEBUG_SESSION_SCHEMA_VERSION) {
30
- throw new Error(`调试会话 Provider 协议版本不受支持:${provider.key}`);
29
+ if (provider.schemaVersion !== MODULE_AGENT_SESSION_SCHEMA_VERSION) {
30
+ throw new Error(`Agent 会话 Provider 协议版本不受支持:${provider.key}`);
31
31
  }
32
32
  if (!manifest.features.some(({ key }) => key === provider.featureKey)) {
33
33
  throw new Error(
34
- `调试会话 Provider Feature 未在 Manifest 声明:${provider.featureKey}`,
34
+ `Agent 会话 Provider Feature 未在 Manifest 声明:${provider.featureKey}`,
35
35
  );
36
36
  }
37
37
  if (!manifest.permissions.some(({ key }) => key === provider.permissionKey)) {
38
38
  throw new Error(
39
- `调试会话 Provider 权限未在 Manifest 声明:${provider.permissionKey}`,
39
+ `Agent 会话 Provider 权限未在 Manifest 声明:${provider.permissionKey}`,
40
40
  );
41
41
  }
42
42
  if (!manifestAuditActions(manifest).has(provider.auditAction)) {
43
43
  throw new Error(
44
- `调试会话 Provider 审计动作未在 Manifest 声明:${provider.auditAction}`,
44
+ `Agent 会话 Provider 审计动作未在 Manifest 声明:${provider.auditAction}`,
45
45
  );
46
46
  }
47
47
  if (provider.operationKeys.length === 0) {
48
48
  throw new Error(
49
- `调试会话 Provider 必须绑定至少一个 Operation:${provider.key}`,
49
+ `Agent 会话 Provider 必须绑定至少一个 Operation:${provider.key}`,
50
50
  );
51
51
  }
52
52
  const operationKeys = new Set<string>();
53
53
  for (const operationKey of provider.operationKeys) {
54
- requireModuleNamespace("调试会话 Operation", operationKey, moduleName);
54
+ requireModuleNamespace("Agent 会话 Operation", operationKey, moduleName);
55
55
  if (operationKeys.has(operationKey)) {
56
- throw new Error(`调试会话 Provider Operation 重复:${operationKey}`);
56
+ throw new Error(`Agent 会话 Provider Operation 重复:${operationKey}`);
57
57
  }
58
58
  operationKeys.add(operationKey);
59
59
  const operation = manifest.aiOperations?.find(
@@ -61,7 +61,7 @@ export function validateDebugSessionProviderRegistration(
61
61
  );
62
62
  if (!operation || operation.kind !== "agent") {
63
63
  throw new Error(
64
- `调试会话 Provider Operation 未声明为 Agent:${operationKey}`,
64
+ `Agent 会话 Provider Operation 未声明为 Agent:${operationKey}`,
65
65
  );
66
66
  }
67
67
  if (
@@ -69,7 +69,7 @@ export function validateDebugSessionProviderRegistration(
69
69
  operation.permissionKey !== provider.permissionKey
70
70
  ) {
71
71
  throw new Error(
72
- `调试会话 Provider 必须复用 Operation 的 Feature 与权限:${operationKey}`,
72
+ `Agent 会话 Provider 必须复用 Operation 的 Feature 与权限:${operationKey}`,
73
73
  );
74
74
  }
75
75
  }
@@ -0,0 +1,53 @@
1
+ import {
2
+ ModuleAuthoritativeSourceInvalidationUnavailableError,
3
+ type ModuleAuthoritativeSourceInvalidationPortV1,
4
+ } from "@southwind-ai/server-sdk";
5
+ import type { RequestGuardContext } from "../guards.js";
6
+ import type { ModuleAuthoritativeSourceAccessRegistry } from "../agent/context-memory/authoritative-source-registry.js";
7
+ import type { ModuleAuthoritativeInvalidationProducerPort } from "../agent/session-invalidation/module-authoritative-producer.js";
8
+ import type { DrizzleSessionInvalidationOutbox } from "../agent/session-persistence/drizzle-invalidation-outbox.js";
9
+ import { authorizationCoordinateForActor } from "../agent/session-projection-access.js";
10
+
11
+ export function createModuleAuthoritativeSourceInvalidationPort(
12
+ moduleName: string,
13
+ context: RequestGuardContext,
14
+ signal: AbortSignal,
15
+ sources: ModuleAuthoritativeSourceAccessRegistry,
16
+ outbox: DrizzleSessionInvalidationOutbox,
17
+ ): ModuleAuthoritativeSourceInvalidationPortV1 {
18
+ let producer: ModuleAuthoritativeInvalidationProducerPort;
19
+ try {
20
+ producer = sources.bindTransactionalInvalidationProducer({
21
+ moduleKey: moduleName,
22
+ authorization: authorizationCoordinateForActor(context.actor),
23
+ appendInTransaction: (db, envelope) =>
24
+ outbox.appendInTransaction(db, envelope),
25
+ });
26
+ } catch {
27
+ return unavailablePort();
28
+ }
29
+ return {
30
+ sourceDeleted: (input) => invoke(() => producer.sourceDeleted(input), signal),
31
+ sourceExpired: (input) => invoke(() => producer.sourceExpired(input), signal),
32
+ sourceSuperseded: (input) =>
33
+ invoke(() => producer.sourceSuperseded(input), signal),
34
+ authorizationRevoked: (input) =>
35
+ invoke(() => producer.authorizationRevoked(input), signal),
36
+ };
37
+ }
38
+
39
+ function unavailablePort(): ModuleAuthoritativeSourceInvalidationPortV1 {
40
+ const unavailable = () =>
41
+ Promise.reject(new ModuleAuthoritativeSourceInvalidationUnavailableError());
42
+ return {
43
+ sourceDeleted: unavailable,
44
+ sourceExpired: unavailable,
45
+ sourceSuperseded: unavailable,
46
+ authorizationRevoked: unavailable,
47
+ };
48
+ }
49
+
50
+ function invoke<T>(operation: () => Promise<T>, signal: AbortSignal) {
51
+ if (signal.aborted) throw new Error("权威来源失效写入暂不可用");
52
+ return operation();
53
+ }