create-windy 0.5.2 → 0.6.0

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 (570) hide show
  1. package/dist/cli.js +288 -154
  2. package/package.json +2 -1
  3. package/template/.windy-template.json +2 -2
  4. package/template/apps/agent-server/README.md +25 -6
  5. package/template/apps/agent-server/src/southwind_agent_server/adk_adapter.py +15 -2
  6. package/template/apps/agent-server/src/southwind_agent_server/app.py +13 -34
  7. package/template/apps/agent-server/src/southwind_agent_server/config.py +49 -0
  8. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +13 -0
  9. package/template/apps/agent-server/src/southwind_agent_server/engine_capacity.py +31 -0
  10. package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +5 -0
  11. package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +50 -0
  12. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +11 -2
  13. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +3 -9
  14. package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +5 -0
  15. package/template/apps/agent-server/src/southwind_agent_server/readiness_pin.py +37 -0
  16. package/template/apps/agent-server/src/southwind_agent_server/run_admission.py +64 -0
  17. package/template/apps/agent-server/src/southwind_agent_server/run_capacity.py +59 -0
  18. package/template/apps/agent-server/src/southwind_agent_server/service.py +42 -43
  19. package/template/apps/agent-server/src/southwind_agent_server/service_errors.py +4 -0
  20. package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +31 -0
  21. package/template/apps/agent-server/src/southwind_agent_server/service_tasks.py +34 -0
  22. package/template/apps/agent-server/src/southwind_agent_server/sqlite_catalog.py +11 -0
  23. package/template/apps/agent-server/src/southwind_agent_server/store.py +6 -0
  24. package/template/apps/agent-server/src/southwind_agent_server/vision_probe.py +87 -0
  25. package/template/apps/agent-server/src/southwind_agent_server/vision_requirement.py +28 -0
  26. package/template/apps/agent-server/src/southwind_agent_server/vlm_readiness.py +247 -0
  27. package/template/apps/agent-server/tests/test_api.py +16 -3
  28. package/template/apps/agent-server/tests/test_openai_provider.py +21 -4
  29. package/template/apps/agent-server/tests/test_postgres_store.py +3 -0
  30. package/template/apps/agent-server/tests/test_run_capacity.py +110 -0
  31. package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +37 -0
  32. package/template/apps/agent-server/tests/test_sqlite_store.py +3 -0
  33. package/template/apps/agent-server/tests/test_vision_readiness_enforcement.py +72 -0
  34. package/template/apps/agent-server/tests/test_vlm_readiness.py +106 -0
  35. package/template/apps/document-server/src/southwind_document_server/adapter.py +117 -205
  36. package/template/apps/document-server/src/southwind_document_server/adapter_errors.py +13 -0
  37. package/template/apps/document-server/src/southwind_document_server/app.py +62 -14
  38. package/template/apps/document-server/src/southwind_document_server/artifacts.py +27 -0
  39. package/template/apps/document-server/src/southwind_document_server/config.py +96 -2
  40. package/template/apps/document-server/src/southwind_document_server/contracts.py +168 -13
  41. package/template/apps/document-server/src/southwind_document_server/fingerprint.py +128 -0
  42. package/template/apps/document-server/src/southwind_document_server/grants.py +81 -0
  43. package/template/apps/document-server/src/southwind_document_server/multipart_output.py +265 -0
  44. package/template/apps/document-server/src/southwind_document_server/output_validation.py +202 -0
  45. package/template/apps/document-server/src/southwind_document_server/progress.py +27 -0
  46. package/template/apps/document-server/src/southwind_document_server/readiness.py +280 -0
  47. package/template/apps/document-server/src/southwind_document_server/readiness_contracts.py +280 -0
  48. package/template/apps/document-server/src/southwind_document_server/readiness_http.py +87 -0
  49. package/template/apps/document-server/src/southwind_document_server/readiness_support.py +120 -0
  50. package/template/apps/document-server/src/southwind_document_server/request_validation.py +48 -0
  51. package/template/apps/document-server/src/southwind_document_server/service.py +297 -96
  52. package/template/apps/document-server/src/southwind_document_server/service_recovery.py +183 -0
  53. package/template/apps/document-server/src/southwind_document_server/sink.py +316 -0
  54. package/template/apps/document-server/src/southwind_document_server/store.py +301 -141
  55. package/template/apps/document-server/src/southwind_document_server/store_events.py +40 -0
  56. package/template/apps/document-server/src/southwind_document_server/store_models.py +62 -0
  57. package/template/apps/document-server/src/southwind_document_server/store_recovery.py +247 -0
  58. package/template/apps/document-server/src/southwind_document_server/store_schema.py +50 -0
  59. package/template/apps/document-server/tests/recovery_support.py +230 -0
  60. package/template/apps/document-server/tests/support.py +210 -0
  61. package/template/apps/document-server/tests/test_adapter.py +251 -0
  62. package/template/apps/document-server/tests/test_config.py +43 -0
  63. package/template/apps/document-server/tests/test_contracts.py +80 -0
  64. package/template/apps/document-server/tests/test_fingerprint.py +125 -0
  65. package/template/apps/document-server/tests/test_grants.py +46 -0
  66. package/template/apps/document-server/tests/test_handshake.py +154 -0
  67. package/template/apps/document-server/tests/test_integration.py +192 -0
  68. package/template/apps/document-server/tests/test_multipart_security.py +259 -0
  69. package/template/apps/document-server/tests/test_readiness.py +311 -0
  70. package/template/apps/document-server/tests/test_readiness_contracts.py +131 -0
  71. package/template/apps/document-server/tests/test_recovery.py +222 -0
  72. package/template/apps/document-server/tests/test_recovery_faults.py +101 -0
  73. package/template/apps/document-server/tests/test_recovery_races.py +283 -0
  74. package/template/apps/document-server/tests/test_service.py +16 -13
  75. package/template/apps/document-server/tests/test_service_artifacts.py +296 -0
  76. package/template/apps/document-server/tests/test_sink.py +253 -0
  77. package/template/apps/document-server/tests/test_store.py +199 -0
  78. package/template/apps/embedding-server/pyproject.toml +5 -0
  79. package/template/apps/embedding-server/src/southwind_embedding_server/adapter.py +38 -2
  80. package/template/apps/embedding-server/src/southwind_embedding_server/app.py +111 -3
  81. package/template/apps/embedding-server/src/southwind_embedding_server/config.py +27 -0
  82. package/template/apps/embedding-server/src/southwind_embedding_server/image_input.py +16 -5
  83. package/template/apps/embedding-server/src/southwind_embedding_server/run_cipher.py +31 -0
  84. package/template/apps/embedding-server/src/southwind_embedding_server/run_service.py +130 -0
  85. package/template/apps/embedding-server/src/southwind_embedding_server/run_store.py +250 -0
  86. package/template/apps/embedding-server/tests/test_adapter.py +25 -0
  87. package/template/apps/embedding-server/tests/test_run_http.py +185 -0
  88. package/template/apps/embedding-server/tests/test_run_service.py +200 -0
  89. package/template/apps/embedding-server/uv.lock +71 -0
  90. package/template/apps/server/Dockerfile +13 -0
  91. package/template/apps/server/package.json +1 -0
  92. package/template/apps/server/src/agent/drizzle-screenshot-intake-repository.integration.test.ts +283 -0
  93. package/template/apps/server/src/agent/drizzle-screenshot-intake-repository.ts +175 -0
  94. package/template/apps/server/src/agent/persistent-screenshot-intake-producer.ts +320 -0
  95. package/template/apps/server/src/agent/remote-runtime.ts +8 -1
  96. package/template/apps/server/src/agent/required-environment.ts +5 -0
  97. package/template/apps/server/src/agent/run-attach.ts +41 -0
  98. package/template/apps/server/src/agent/run-audit.ts +49 -0
  99. package/template/apps/server/src/agent/run-contracts.ts +6 -1
  100. package/template/apps/server/src/agent/run-facade.ts +66 -68
  101. package/template/apps/server/src/agent/run-route-input.ts +26 -1
  102. package/template/apps/server/src/agent/run-routes.ts +1 -0
  103. package/template/apps/server/src/agent/runtime-bootstrap-report.test.ts +1 -1
  104. package/template/apps/server/src/agent/runtime-bootstrap.ts +110 -60
  105. package/template/apps/server/src/agent/runtime-readiness-sources.test.ts +27 -0
  106. package/template/apps/server/src/agent/runtime-readiness-sources.ts +31 -0
  107. package/template/apps/server/src/agent/runtime-reporting-bootstrap.ts +40 -0
  108. package/template/apps/server/src/agent/screenshot-intake-authorization.ts +29 -0
  109. package/template/apps/server/src/agent/screenshot-intake-bootstrap.ts +61 -0
  110. package/template/apps/server/src/agent/screenshot-intake-durable.ts +53 -0
  111. package/template/apps/server/src/agent/screenshot-intake-errors.ts +9 -0
  112. package/template/apps/server/src/agent/screenshot-intake-producer.ts +41 -0
  113. package/template/apps/server/src/agent/screenshot-intake-record.ts +44 -0
  114. package/template/apps/server/src/agent/screenshot-intake-recovery.ts +106 -0
  115. package/template/apps/server/src/agent/screenshot-intake-repository.ts +64 -0
  116. package/template/apps/server/src/agent/screenshot-intake-reservation.ts +24 -0
  117. package/template/apps/server/src/agent/screenshot-intake-routes.ts +171 -0
  118. package/template/apps/server/src/agent/screenshot-intake-runtime-types.ts +6 -0
  119. package/template/apps/server/src/agent/screenshot-intake-sweep.ts +26 -0
  120. package/template/apps/server/src/agent/screenshot-intake-test-support.ts +87 -0
  121. package/template/apps/server/src/agent/screenshot-intake-v2-validation.ts +152 -0
  122. package/template/apps/server/src/agent/screenshot-intake-v2.test.ts +338 -0
  123. package/template/apps/server/src/agent/screenshot-intake-v2.ts +350 -0
  124. package/template/apps/server/src/agent/screenshot-png.ts +15 -0
  125. package/template/apps/server/src/agent/screenshot-run-binding.ts +34 -0
  126. package/template/apps/server/src/agent/unavailable-routes.ts +9 -0
  127. package/template/apps/server/src/agent/vision-facade.test.ts +98 -8
  128. package/template/apps/server/src/agent/vision-input.ts +5 -2
  129. package/template/apps/server/src/agent/vision-readiness-pin.ts +74 -0
  130. package/template/apps/server/src/agent/vision-readiness.ts +58 -0
  131. package/template/apps/server/src/ai-artifact/runtime-reference.test.ts +135 -0
  132. package/template/apps/server/src/ai-artifact/runtime.ts +134 -5
  133. package/template/apps/server/src/ai-output-artifact/cleanup.ts +214 -0
  134. package/template/apps/server/src/ai-output-artifact/contracts.ts +152 -0
  135. package/template/apps/server/src/ai-output-artifact/drizzle-cleanup.ts +37 -0
  136. package/template/apps/server/src/ai-output-artifact/drizzle-complete.ts +71 -0
  137. package/template/apps/server/src/ai-output-artifact/drizzle-grant-cleanup.ts +45 -0
  138. package/template/apps/server/src/ai-output-artifact/drizzle-grants.ts +109 -0
  139. package/template/apps/server/src/ai-output-artifact/drizzle-mapping.ts +77 -0
  140. package/template/apps/server/src/ai-output-artifact/drizzle-readiness.ts +46 -0
  141. package/template/apps/server/src/ai-output-artifact/drizzle-repository.ts +350 -0
  142. package/template/apps/server/src/ai-output-artifact/drizzle-seal.ts +64 -0
  143. package/template/apps/server/src/ai-output-artifact/grant.ts +30 -0
  144. package/template/apps/server/src/ai-output-artifact/host-registry.ts +53 -0
  145. package/template/apps/server/src/ai-output-artifact/memory-cleanup.ts +47 -0
  146. package/template/apps/server/src/ai-output-artifact/memory-grants.ts +98 -0
  147. package/template/apps/server/src/ai-output-artifact/memory-readiness.ts +26 -0
  148. package/template/apps/server/src/ai-output-artifact/memory-repository.ts +348 -0
  149. package/template/apps/server/src/ai-output-artifact/policy.test.ts +67 -0
  150. package/template/apps/server/src/ai-output-artifact/policy.ts +125 -0
  151. package/template/apps/server/src/ai-output-artifact/postgres-test-support.ts +147 -0
  152. package/template/apps/server/src/ai-output-artifact/postgres.integration.test.ts +349 -0
  153. package/template/apps/server/src/ai-output-artifact/reference-codec.ts +128 -0
  154. package/template/apps/server/src/ai-output-artifact/repository-grant-invariants.test-support.ts +165 -0
  155. package/template/apps/server/src/ai-output-artifact/repository-invariants.test-support.ts +239 -0
  156. package/template/apps/server/src/ai-output-artifact/repository-invariants.test.ts +18 -0
  157. package/template/apps/server/src/ai-output-artifact/repository.ts +107 -0
  158. package/template/apps/server/src/ai-output-artifact/route-input.ts +173 -0
  159. package/template/apps/server/src/ai-output-artifact/routes-delete.test.ts +287 -0
  160. package/template/apps/server/src/ai-output-artifact/routes-grant.test.ts +116 -0
  161. package/template/apps/server/src/ai-output-artifact/routes-nonblocking-body.test.ts +136 -0
  162. package/template/apps/server/src/ai-output-artifact/routes-security.test.ts +176 -0
  163. package/template/apps/server/src/ai-output-artifact/routes-storage-error.test.ts +105 -0
  164. package/template/apps/server/src/ai-output-artifact/routes.test-support.ts +84 -0
  165. package/template/apps/server/src/ai-output-artifact/routes.test.ts +198 -0
  166. package/template/apps/server/src/ai-output-artifact/routes.ts +280 -0
  167. package/template/apps/server/src/ai-output-artifact/service-completion.ts +60 -0
  168. package/template/apps/server/src/ai-output-artifact/service-grants.test.ts +169 -0
  169. package/template/apps/server/src/ai-output-artifact/service-grants.ts +217 -0
  170. package/template/apps/server/src/ai-output-artifact/service-input.ts +175 -0
  171. package/template/apps/server/src/ai-output-artifact/service-read.ts +89 -0
  172. package/template/apps/server/src/ai-output-artifact/service-recovery.test.ts +238 -0
  173. package/template/apps/server/src/ai-output-artifact/service-support.ts +240 -0
  174. package/template/apps/server/src/ai-output-artifact/service.test.ts +283 -0
  175. package/template/apps/server/src/ai-output-artifact/service.ts +334 -0
  176. package/template/apps/server/src/ai-output-artifact/storage-recovery.ts +33 -0
  177. package/template/apps/server/src/ai-output-artifact/storage-writer.ts +103 -0
  178. package/template/apps/server/src/ai-output-artifact/test-support.ts +161 -0
  179. package/template/apps/server/src/ai-runtime-readiness/health-response.ts +92 -0
  180. package/template/apps/server/src/ai-runtime-readiness/operation-port-trust.test.ts +66 -0
  181. package/template/apps/server/src/ai-runtime-readiness/operation-port.test-support.ts +143 -0
  182. package/template/apps/server/src/ai-runtime-readiness/operation-port.test.ts +193 -0
  183. package/template/apps/server/src/ai-runtime-readiness/operation-port.ts +172 -0
  184. package/template/apps/server/src/ai-runtime-readiness/trust-store.ts +61 -0
  185. package/template/apps/server/src/app/ai-screenshot-intake-binding.ts +22 -0
  186. package/template/apps/server/src/app/document-output-artifact-bindings.ts +5 -0
  187. package/template/apps/server/src/app/speech-output-artifact-bindings.ts +5 -0
  188. package/template/apps/server/src/application-services.ts +9 -3
  189. package/template/apps/server/src/audit/redaction.ts +1 -0
  190. package/template/apps/server/src/audit/reliable-writer.test.ts +8 -0
  191. package/template/apps/server/src/auth/password-change-license-restriction.test.ts +156 -0
  192. package/template/apps/server/src/document/cancel-response.ts +33 -0
  193. package/template/apps/server/src/document/contracts.ts +6 -0
  194. package/template/apps/server/src/document/errors.ts +11 -0
  195. package/template/apps/server/src/document/facade-cancel.test.ts +226 -0
  196. package/template/apps/server/src/document/facade-cancel.ts +110 -0
  197. package/template/apps/server/src/document/facade-grant-handoff.test.ts +113 -0
  198. package/template/apps/server/src/document/facade-idempotency.test.ts +195 -0
  199. package/template/apps/server/src/document/facade-invocation.ts +46 -0
  200. package/template/apps/server/src/document/facade-output-artifact.test.ts +310 -0
  201. package/template/apps/server/src/document/facade-read-response.ts +116 -0
  202. package/template/apps/server/src/document/facade-readiness.test.ts +95 -0
  203. package/template/apps/server/src/document/facade-support.ts +297 -0
  204. package/template/apps/server/src/document/facade.ts +164 -173
  205. package/template/apps/server/src/document/output-artifact-composition.test.ts +64 -0
  206. package/template/apps/server/src/document/output-artifact-composition.ts +78 -0
  207. package/template/apps/server/src/document/output-artifact-fingerprint.contract.test.ts +110 -0
  208. package/template/apps/server/src/document/output-artifact-fingerprint.ts +150 -0
  209. package/template/apps/server/src/document/output-artifact-host-registry.ts +44 -0
  210. package/template/apps/server/src/document/output-artifact-host.test.ts +332 -0
  211. package/template/apps/server/src/document/output-artifact-host.ts +331 -0
  212. package/template/apps/server/src/document/output-artifact-manifest.test-support.ts +71 -0
  213. package/template/apps/server/src/document/output-artifact-publish.test-support.ts +48 -0
  214. package/template/apps/server/src/document/output-artifact-readiness-probe.ts +347 -0
  215. package/template/apps/server/src/document/output-artifact-readiness-timeout.ts +30 -0
  216. package/template/apps/server/src/document/output-artifact-readiness.test.ts +264 -0
  217. package/template/apps/server/src/document/output-artifact-readiness.ts +87 -0
  218. package/template/apps/server/src/document/output-artifact-route-composition.test.ts +27 -0
  219. package/template/apps/server/src/document/output-artifact-route-composition.ts +14 -0
  220. package/template/apps/server/src/document/output-artifact-runtime.test-support.ts +8 -0
  221. package/template/apps/server/src/document/output-artifact-runtime.test.ts +124 -0
  222. package/template/apps/server/src/document/output-artifact-runtime.ts +275 -0
  223. package/template/apps/server/src/document/output-artifact.test-support.ts +350 -0
  224. package/template/apps/server/src/document/remote-response.ts +162 -0
  225. package/template/apps/server/src/document/remote-runtime.test.ts +100 -4
  226. package/template/apps/server/src/document/remote-runtime.ts +37 -85
  227. package/template/apps/server/src/document/routes-read-response.test.ts +267 -0
  228. package/template/apps/server/src/document/routes.test.ts +109 -0
  229. package/template/apps/server/src/document/routes.ts +23 -14
  230. package/template/apps/server/src/embedding/audit.ts +46 -0
  231. package/template/apps/server/src/embedding/contracts.ts +13 -0
  232. package/template/apps/server/src/embedding/drizzle-run-binding-repository.integration.test.ts +100 -0
  233. package/template/apps/server/src/embedding/drizzle-run-binding-repository.ts +102 -0
  234. package/template/apps/server/src/embedding/facade-types.ts +18 -0
  235. package/template/apps/server/src/embedding/facade.ts +242 -111
  236. package/template/apps/server/src/embedding/operation-authorization.ts +23 -0
  237. package/template/apps/server/src/embedding/remote-runtime.test.ts +18 -0
  238. package/template/apps/server/src/embedding/remote-runtime.ts +77 -0
  239. package/template/apps/server/src/embedding/routes.test.ts +118 -0
  240. package/template/apps/server/src/embedding/routes.ts +98 -0
  241. package/template/apps/server/src/embedding/run-artifact.ts +18 -0
  242. package/template/apps/server/src/embedding/run-authorization.test.ts +133 -0
  243. package/template/apps/server/src/embedding/run-authorization.ts +91 -0
  244. package/template/apps/server/src/embedding/run-binding-repository.ts +75 -0
  245. package/template/apps/server/src/embedding/run-fingerprint.test.ts +52 -0
  246. package/template/apps/server/src/embedding/run-fingerprint.ts +39 -0
  247. package/template/apps/server/src/embedding/terminal-observer.test.ts +26 -0
  248. package/template/apps/server/src/embedding/terminal-observer.ts +44 -0
  249. package/template/apps/server/src/index.ts +38 -31
  250. package/template/apps/server/src/module-host/ai-operation-port.ts +3 -3
  251. package/template/apps/server/src/module-host/durable-context.ts +194 -16
  252. package/template/apps/server/src/module-host/durable-handler-registration.ts +1 -0
  253. package/template/apps/server/src/module-host/durable-storage-filesystem-restart.test.ts +265 -0
  254. package/template/apps/server/src/module-host/durable-storage-write.test.ts +345 -0
  255. package/template/apps/server/src/module-host/http-runtime.ts +25 -0
  256. package/template/apps/server/src/module-host/initialize-contracts.ts +18 -1
  257. package/template/apps/server/src/module-host/initialize.test.ts +18 -0
  258. package/template/apps/server/src/module-host/initialize.ts +42 -2
  259. package/template/apps/server/src/module-host/module-secret-audit-version.test.ts +73 -0
  260. package/template/apps/server/src/module-host/module-secret-binding-resolution.ts +60 -0
  261. package/template/apps/server/src/module-host/module-secret-durable.test.ts +206 -0
  262. package/template/apps/server/src/module-host/module-secret-port.test-support.ts +125 -0
  263. package/template/apps/server/src/module-host/module-secret-port.test.ts +161 -0
  264. package/template/apps/server/src/module-host/module-secret-port.ts +249 -0
  265. package/template/apps/server/src/module-host/module-secret-result.test.ts +324 -0
  266. package/template/apps/server/src/module-host/module-secret-result.ts +274 -0
  267. package/template/apps/server/src/module-host/module-secret-tool-boundary.test.ts +143 -0
  268. package/template/apps/server/src/module-host/project-composition.ts +1 -0
  269. package/template/apps/server/src/module-host/report-staging-port.ts +55 -0
  270. package/template/apps/server/src/module-host/report-staging-registration.test.ts +104 -0
  271. package/template/apps/server/src/module-host/request-context.ts +58 -1
  272. package/template/apps/server/src/module-host/route-declaration.ts +11 -4
  273. package/template/apps/server/src/module-host/route-installer.test-fixture.ts +246 -0
  274. package/template/apps/server/src/module-host/route-installer.test.ts +47 -211
  275. package/template/apps/server/src/module-host/route-installer.ts +192 -21
  276. package/template/apps/server/src/module-host/route-registration.test.ts +44 -4
  277. package/template/apps/server/src/module-host/runtime-composition.ts +2 -0
  278. package/template/apps/server/src/module-host/scoped-host.ts +84 -0
  279. package/template/apps/server/src/module-host/screenshot-artifact-ref.ts +91 -0
  280. package/template/apps/server/src/module-host/screenshot-intake-composition.test.ts +292 -0
  281. package/template/apps/server/src/module-host/screenshot-intake-deadline.ts +38 -0
  282. package/template/apps/server/src/module-host/screenshot-intake-plan.ts +75 -0
  283. package/template/apps/server/src/module-host/screenshot-intake-port.ts +297 -0
  284. package/template/apps/server/src/module-host/screenshot-intake-security.test.ts +311 -0
  285. package/template/apps/server/src/module-host/screenshot-intake-store.ts +76 -0
  286. package/template/apps/server/src/module-host/screenshot-intake-test-support.ts +68 -0
  287. package/template/apps/server/src/module-host/secret-bindings.test.ts +167 -0
  288. package/template/apps/server/src/module-host/secret-bindings.ts +184 -0
  289. package/template/apps/server/src/module-host/storage-authorization-binding.test.ts +242 -0
  290. package/template/apps/server/src/module-host/storage-port.test.ts +8 -1
  291. package/template/apps/server/src/module-host/storage-port.ts +84 -8
  292. package/template/apps/server/src/module-host/storage-restart-fixture.test-support.ts +242 -0
  293. package/template/apps/server/src/module-host/storage-restart-postgres.integration.test.ts +280 -0
  294. package/template/apps/server/src/module-host/storage-scope-drift-http.test.ts +68 -0
  295. package/template/apps/server/src/module-host/storage-scope.ts +52 -1
  296. package/template/apps/server/src/module-host/storage-stream-route.test.ts +282 -0
  297. package/template/apps/server/src/module-host/storage-write-error.test.ts +174 -0
  298. package/template/apps/server/src/module-host/storage-write-error.ts +62 -0
  299. package/template/apps/server/src/module-host/storage-write-port.test.ts +323 -0
  300. package/template/apps/server/src/module-host/storage-write-port.ts +320 -0
  301. package/template/apps/server/src/module-host/storage-write-unavailable.ts +21 -0
  302. package/template/apps/server/src/module-host/storage-writer-retention.test.ts +109 -0
  303. package/template/apps/server/src/module-host/user-directory-composition.test.ts +1 -0
  304. package/template/apps/server/src/module-preflight-secret.test.ts +79 -0
  305. package/template/apps/server/src/module-preflight.ts +5 -0
  306. package/template/apps/server/src/platform-http-runtime.ts +16 -4
  307. package/template/apps/server/src/report-staging/archive-frame-stream.test.ts +209 -0
  308. package/template/apps/server/src/report-staging/archive-frame-stream.ts +341 -0
  309. package/template/apps/server/src/report-staging/archive-process.test.ts +302 -0
  310. package/template/apps/server/src/report-staging/archive-process.ts +257 -0
  311. package/template/apps/server/src/report-staging/archive-volumes.ts +30 -0
  312. package/template/apps/server/src/report-staging/cancellation.ts +13 -0
  313. package/template/apps/server/src/report-staging/contracts.ts +94 -0
  314. package/template/apps/server/src/report-staging/drizzle-lifecycle.ts +278 -0
  315. package/template/apps/server/src/report-staging/drizzle-mapping.ts +140 -0
  316. package/template/apps/server/src/report-staging/drizzle-repository.integration.test.ts +346 -0
  317. package/template/apps/server/src/report-staging/drizzle-repository.ts +255 -0
  318. package/template/apps/server/src/report-staging/drizzle-seal.integration.test.ts +267 -0
  319. package/template/apps/server/src/report-staging/drizzle-seal.ts +177 -0
  320. package/template/apps/server/src/report-staging/filesystem-cleanup.test.ts +68 -0
  321. package/template/apps/server/src/report-staging/filesystem-cleanup.ts +102 -0
  322. package/template/apps/server/src/report-staging/filesystem-errors.ts +15 -0
  323. package/template/apps/server/src/report-staging/filesystem-identifiers.ts +19 -0
  324. package/template/apps/server/src/report-staging/filesystem-io.test.ts +85 -0
  325. package/template/apps/server/src/report-staging/filesystem-io.ts +206 -0
  326. package/template/apps/server/src/report-staging/filesystem-scan.ts +85 -0
  327. package/template/apps/server/src/report-staging/filesystem-store.ts +346 -0
  328. package/template/apps/server/src/report-staging/heartbeat.test.ts +47 -0
  329. package/template/apps/server/src/report-staging/heartbeat.ts +53 -0
  330. package/template/apps/server/src/report-staging/manifest-stream.ts +46 -0
  331. package/template/apps/server/src/report-staging/memory-repository.ts +256 -0
  332. package/template/apps/server/src/report-staging/metadata-catalog.ts +89 -0
  333. package/template/apps/server/src/report-staging/metadata-spool-paths.ts +195 -0
  334. package/template/apps/server/src/report-staging/metadata-spool-schema.ts +54 -0
  335. package/template/apps/server/src/report-staging/metadata-spool.test.ts +214 -0
  336. package/template/apps/server/src/report-staging/metadata-spool.ts +305 -0
  337. package/template/apps/server/src/report-staging/native/archive-frame-helper.c +309 -0
  338. package/template/apps/server/src/report-staging/path-policy.test.ts +127 -0
  339. package/template/apps/server/src/report-staging/path-policy.ts +263 -0
  340. package/template/apps/server/src/report-staging/repository-fence.test.ts +114 -0
  341. package/template/apps/server/src/report-staging/repository.ts +75 -0
  342. package/template/apps/server/src/report-staging/runtime.ts +31 -0
  343. package/template/apps/server/src/report-staging/sealed-file.test.ts +34 -0
  344. package/template/apps/server/src/report-staging/sealed-file.ts +137 -0
  345. package/template/apps/server/src/report-staging/service-input-limits.test.ts +62 -0
  346. package/template/apps/server/src/report-staging/service-input.ts +204 -0
  347. package/template/apps/server/src/report-staging/service-lifecycle.test.ts +132 -0
  348. package/template/apps/server/src/report-staging/service-read-fence.test.ts +37 -0
  349. package/template/apps/server/src/report-staging/service-read.ts +172 -0
  350. package/template/apps/server/src/report-staging/service-support.ts +149 -0
  351. package/template/apps/server/src/report-staging/service.test-fixture.ts +226 -0
  352. package/template/apps/server/src/report-staging/service.test.ts +314 -0
  353. package/template/apps/server/src/report-staging/service.ts +255 -0
  354. package/template/apps/server/src/report-staging/supervised-process.ts +194 -0
  355. package/template/apps/server/src/speech/contracts.ts +8 -0
  356. package/template/apps/server/src/speech/errors.ts +10 -0
  357. package/template/apps/server/src/speech/facade-contract.ts +49 -0
  358. package/template/apps/server/src/speech/facade-output.test.ts +299 -0
  359. package/template/apps/server/src/speech/facade-output.ts +298 -0
  360. package/template/apps/server/src/speech/facade-validation.ts +127 -0
  361. package/template/apps/server/src/speech/facade.ts +185 -151
  362. package/template/apps/server/src/speech/fingerprint.test.ts +42 -0
  363. package/template/apps/server/src/speech/fingerprint.ts +28 -0
  364. package/template/apps/server/src/speech/output-artifact-binding.test.ts +11 -0
  365. package/template/apps/server/src/speech/output-artifact-binding.ts +30 -0
  366. package/template/apps/server/src/speech/output-artifact-error.ts +9 -0
  367. package/template/apps/server/src/speech/output-artifact-host.test-support.ts +73 -0
  368. package/template/apps/server/src/speech/output-artifact-host.test.ts +302 -0
  369. package/template/apps/server/src/speech/output-artifact-host.ts +279 -0
  370. package/template/apps/server/src/speech/output-artifact-policy.ts +114 -0
  371. package/template/apps/server/src/speech/output-artifact-replay.ts +91 -0
  372. package/template/apps/server/src/speech/remote-response.ts +158 -0
  373. package/template/apps/server/src/speech/remote-runtime.test.ts +90 -0
  374. package/template/apps/server/src/speech/remote-runtime.ts +36 -78
  375. package/template/apps/server/src/speech/routes.ts +60 -16
  376. package/template/apps/server/src/startup-finalization.ts +52 -0
  377. package/template/apps/server/src/startup-preflight.ts +2 -0
  378. package/template/apps/server/src/startup-shutdown.test.ts +69 -0
  379. package/template/apps/server/src/startup-shutdown.ts +61 -0
  380. package/template/apps/server/src/storage/drizzle-upload-purge.ts +61 -0
  381. package/template/apps/server/src/storage/drizzle-upload-references.ts +23 -0
  382. package/template/apps/server/src/storage/drizzle-upload-repository.integration.test.ts +103 -0
  383. package/template/apps/server/src/storage/drizzle-upload-repository.ts +109 -14
  384. package/template/apps/server/src/storage/host-runtime.ts +15 -0
  385. package/template/apps/server/src/storage/routes-stream-cancellation.test.ts +154 -0
  386. package/template/apps/server/src/storage/routes.test.ts +13 -2
  387. package/template/apps/server/src/storage/routes.ts +57 -18
  388. package/template/apps/server/src/storage/runtime.ts +17 -4
  389. package/template/apps/server/src/system/route-types.ts +5 -1
  390. package/template/apps/server/src/system/system-resource-monitoring.test.ts +47 -0
  391. package/template/apps/server/src/system/system-resource-monitoring.ts +60 -10
  392. package/template/apps/server/src/work-order/routes.test.ts +1 -0
  393. package/template/apps/speech-server/src/southwind_speech_server/adapter.py +58 -17
  394. package/template/apps/speech-server/src/southwind_speech_server/app.py +24 -17
  395. package/template/apps/speech-server/src/southwind_speech_server/bounded_json.py +60 -0
  396. package/template/apps/speech-server/src/southwind_speech_server/config.py +122 -2
  397. package/template/apps/speech-server/src/southwind_speech_server/contracts.py +58 -0
  398. package/template/apps/speech-server/src/southwind_speech_server/errors.py +8 -0
  399. package/template/apps/speech-server/src/southwind_speech_server/normalizer.py +14 -0
  400. package/template/apps/speech-server/src/southwind_speech_server/output_artifact.py +190 -0
  401. package/template/apps/speech-server/src/southwind_speech_server/output_validation.py +54 -0
  402. package/template/apps/speech-server/src/southwind_speech_server/pin_cli.py +83 -0
  403. package/template/apps/speech-server/src/southwind_speech_server/readiness.py +266 -0
  404. package/template/apps/speech-server/src/southwind_speech_server/readiness_contracts.py +268 -0
  405. package/template/apps/speech-server/src/southwind_speech_server/readiness_http.py +91 -0
  406. package/template/apps/speech-server/src/southwind_speech_server/readiness_local.py +161 -0
  407. package/template/apps/speech-server/src/southwind_speech_server/readiness_support.py +106 -0
  408. package/template/apps/speech-server/src/southwind_speech_server/service.py +118 -13
  409. package/template/apps/speech-server/src/southwind_speech_server/store.py +7 -0
  410. package/template/apps/speech-server/tests/test_bounded_json.py +55 -0
  411. package/template/apps/speech-server/tests/test_config.py +22 -0
  412. package/template/apps/speech-server/tests/test_output_artifact.py +60 -0
  413. package/template/apps/speech-server/tests/test_output_validation.py +44 -0
  414. package/template/apps/speech-server/tests/test_readiness.py +315 -0
  415. package/template/apps/speech-server/tests/test_readiness_http.py +48 -0
  416. package/template/apps/speech-server/tests/test_readiness_local.py +43 -0
  417. package/template/apps/speech-server/tests/test_service.py +211 -36
  418. package/template/apps/web/src/pages/system/components/OperationGpuMonitor.vue +2 -1
  419. package/template/apps/web/src/pages/system/components/OperationGpuMonitor.webtest.ts +29 -0
  420. package/template/apps/web/src/pages/system/components/OperationServiceMonitor.vue +2 -1
  421. package/template/apps/web/src/pages/system/components/OperationServiceMonitor.webtest.ts +4 -1
  422. package/template/docker-compose.yml +38 -1
  423. package/template/docs/architecture/ai-runtime-readiness.md +498 -0
  424. package/template/docs/architecture/ai-runtime.md +20 -4
  425. package/template/docs/architecture/durable-jobs.md +54 -5
  426. package/template/docs/architecture/module-host.md +72 -9
  427. package/template/docs/architecture/module-manifest-composition.md +5 -2
  428. package/template/docs/architecture/module-secret-resolution.md +250 -0
  429. package/template/docs/architecture/object-storage.md +144 -3
  430. package/template/docs/architecture/report-staging.md +158 -0
  431. package/template/docs/architecture/server-module-interface.md +29 -0
  432. package/template/docs/architecture/speech-variants.md +45 -0
  433. package/template/docs/platform/agent-tools.md +16 -0
  434. package/template/docs/platform/document-ai-runtime.md +199 -17
  435. package/template/docs/platform/module-configuration.md +5 -0
  436. package/template/docs/platform/speech-ai-runtime.md +34 -5
  437. package/template/docs/platform/vision-ai-runtime.md +24 -0
  438. package/template/package.json +4 -1
  439. package/template/packages/ai-client/package.json +1 -1
  440. package/template/packages/ai-client/src/agent/client/client.ts +3 -0
  441. package/template/packages/ai-client/src/agent/client/index.ts +1 -0
  442. package/template/packages/ai-client/src/agent/client/screenshot.test.ts +40 -0
  443. package/template/packages/ai-client/src/agent/client/screenshot.ts +146 -0
  444. package/template/packages/ai-client/src/agent/client/types.ts +2 -0
  445. package/template/packages/ai-client/src/agent/contracts/runs.ts +1 -0
  446. package/template/packages/ai-client/src/embedding/client.test.ts +52 -0
  447. package/template/packages/ai-client/src/embedding/client.ts +69 -0
  448. package/template/packages/ai-client/src/embedding/contracts.ts +47 -0
  449. package/template/packages/ai-client/src/embedding/index.ts +1 -0
  450. package/template/packages/ai-client/src/embedding/run.ts +130 -0
  451. package/template/packages/ai-client/src/speech/client.test.ts +26 -0
  452. package/template/packages/ai-client/src/speech/client.ts +25 -1
  453. package/template/packages/ai-client/src/speech/contracts.ts +19 -0
  454. package/template/packages/config/package.json +1 -1
  455. package/template/packages/database/drizzle/0048_illegal_magneto.sql +11 -0
  456. package/template/packages/database/drizzle/0049_right_lenny_balinger.sql +79 -0
  457. package/template/packages/database/drizzle/0050_greedy_sister_grimm.sql +92 -0
  458. package/template/packages/database/drizzle/0051_lame_shockwave.sql +19 -0
  459. package/template/packages/database/drizzle/0052_tiresome_komodo.sql +1 -0
  460. package/template/packages/database/drizzle/0053_calm_victor_mancha.sql +1 -0
  461. package/template/packages/database/drizzle/0054_tough_thanos.sql +29 -0
  462. package/template/packages/database/drizzle/meta/0048_snapshot.json +8852 -0
  463. package/template/packages/database/drizzle/meta/0049_snapshot.json +9410 -0
  464. package/template/packages/database/drizzle/meta/0050_snapshot.json +10115 -0
  465. package/template/packages/database/drizzle/meta/0051_snapshot.json +10257 -0
  466. package/template/packages/database/drizzle/meta/0052_snapshot.json +10263 -0
  467. package/template/packages/database/drizzle/meta/0053_snapshot.json +10270 -0
  468. package/template/packages/database/drizzle/meta/0054_snapshot.json +10468 -0
  469. package/template/packages/database/drizzle/meta/_journal.json +49 -0
  470. package/template/packages/database/package.json +1 -1
  471. package/template/packages/database/src/agent-runtime-schema.test.ts +15 -0
  472. package/template/packages/database/src/ai-output-artifacts.test.ts +57 -0
  473. package/template/packages/database/src/schema/agent-runtime.ts +43 -0
  474. package/template/packages/database/src/schema/ai-output-artifacts.ts +182 -0
  475. package/template/packages/database/src/schema/embedding-runtime.ts +62 -0
  476. package/template/packages/database/src/schema/file-storage.ts +18 -0
  477. package/template/packages/database/src/schema/index.ts +3 -0
  478. package/template/packages/database/src/schema/report-staging.ts +212 -0
  479. package/template/packages/database/src/schema.test.ts +19 -0
  480. package/template/packages/jobs/package.json +1 -1
  481. package/template/packages/modules/index.ts +1 -0
  482. package/template/packages/modules/package.json +1 -1
  483. package/template/packages/modules/src/ai-operation-composition.test.ts +37 -0
  484. package/template/packages/modules/src/ai-operation-composition.ts +2 -0
  485. package/template/packages/modules/src/ai-operation-readiness-contract.test.ts +38 -0
  486. package/template/packages/modules/src/ai-operation-readiness-contract.ts +34 -0
  487. package/template/packages/modules/src/capability-audit-validation.ts +20 -0
  488. package/template/packages/modules/src/capability-guard-validation.ts +41 -0
  489. package/template/packages/modules/src/composition.ts +11 -0
  490. package/template/packages/modules/src/manifest.ts +40 -0
  491. package/template/packages/modules/src/secret-composition.test.ts +308 -0
  492. package/template/packages/modules/src/secret-composition.ts +176 -0
  493. package/template/packages/modules/src/system-api-control-plane.ts +17 -1
  494. package/template/packages/modules/src/system-module-catalog.test.ts +52 -0
  495. package/template/packages/modules/src/system-module-catalog.ts +1 -1
  496. package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/document-python-parity.json +12 -0
  497. package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/document.json +70 -0
  498. package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/embedding.json +68 -0
  499. package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/speech.json +80 -0
  500. package/template/packages/server-sdk/contracts/ai-runtime-readiness/v1/vlm.json +70 -0
  501. package/template/packages/server-sdk/contracts/document-runtime/v1/fingerprint-fixture.json +101 -0
  502. package/template/packages/server-sdk/index.ts +109 -0
  503. package/template/packages/server-sdk/package.json +22 -3
  504. package/template/packages/server-sdk/src/ai-runtime-readiness-capture.ts +168 -0
  505. package/template/packages/server-sdk/src/ai-runtime-readiness-digest.ts +49 -0
  506. package/template/packages/server-sdk/src/ai-runtime-readiness-identity.ts +16 -0
  507. package/template/packages/server-sdk/src/ai-runtime-readiness-keys.ts +23 -0
  508. package/template/packages/server-sdk/src/ai-runtime-readiness-limits.ts +141 -0
  509. package/template/packages/server-sdk/src/ai-runtime-readiness-projection.ts +326 -0
  510. package/template/packages/server-sdk/src/ai-runtime-readiness-requirement.ts +31 -0
  511. package/template/packages/server-sdk/src/ai-runtime-readiness-time.ts +16 -0
  512. package/template/packages/server-sdk/src/ai-runtime-readiness-trust.ts +84 -0
  513. package/template/packages/server-sdk/src/ai-runtime-readiness-validation-values.ts +147 -0
  514. package/template/packages/server-sdk/src/ai-runtime-readiness-validation.ts +299 -0
  515. package/template/packages/server-sdk/src/ai-runtime-readiness-values.ts +42 -0
  516. package/template/packages/server-sdk/src/ai-runtime-readiness.adversarial-input.contract.test.ts +146 -0
  517. package/template/packages/server-sdk/src/ai-runtime-readiness.contract-support.ts +139 -0
  518. package/template/packages/server-sdk/src/ai-runtime-readiness.contract.test.ts +314 -0
  519. package/template/packages/server-sdk/src/ai-runtime-readiness.digest-safety.contract.test.ts +131 -0
  520. package/template/packages/server-sdk/src/ai-runtime-readiness.fail-closed.contract.test.ts +215 -0
  521. package/template/packages/server-sdk/src/ai-runtime-readiness.identity.contract.test.ts +138 -0
  522. package/template/packages/server-sdk/src/ai-runtime-readiness.input-safety.contract.test.ts +314 -0
  523. package/template/packages/server-sdk/src/ai-runtime-readiness.public-api.test.ts +18 -0
  524. package/template/packages/server-sdk/src/ai-runtime-readiness.python-parity.contract.test.ts +160 -0
  525. package/template/packages/server-sdk/src/ai-runtime-readiness.trust.contract.test.ts +135 -0
  526. package/template/packages/server-sdk/src/ai-runtime-readiness.ts +198 -0
  527. package/template/packages/server-sdk/src/ai-screenshot-intake-port.ts +58 -0
  528. package/template/packages/server-sdk/src/data-governance-registration.ts +1 -3
  529. package/template/packages/server-sdk/src/durable-handler.ts +12 -0
  530. package/template/packages/server-sdk/src/module-adapter.test.ts +10 -0
  531. package/template/packages/server-sdk/src/module-adapter.ts +3 -0
  532. package/template/packages/server-sdk/src/module-host.ts +8 -0
  533. package/template/packages/server-sdk/src/report-staging-context-compatibility.test.ts +25 -0
  534. package/template/packages/server-sdk/src/report-staging-port.ts +190 -0
  535. package/template/packages/server-sdk/src/request-context.ts +27 -1
  536. package/template/packages/server-sdk/src/route-definition.ts +6 -0
  537. package/template/packages/server-sdk/src/secret-binding.test.ts +66 -0
  538. package/template/packages/server-sdk/src/secret-binding.ts +54 -0
  539. package/template/packages/server-sdk/src/secret-context-compatibility.test.ts +77 -0
  540. package/template/packages/server-sdk/src/secret-port.ts +80 -0
  541. package/template/packages/server-sdk/src/storage-port.ts +129 -9
  542. package/template/packages/server-sdk/src/storage-v052-source-compatibility.test.ts +61 -0
  543. package/template/packages/shared/index.ts +2 -0
  544. package/template/packages/shared/package.json +4 -1
  545. package/template/packages/shared/src/ai-operation-readiness.test.ts +75 -0
  546. package/template/packages/shared/src/ai-operation-readiness.ts +170 -0
  547. package/template/packages/shared/src/license-catalog.ts +14 -9
  548. package/template/packages/shared/src/stable-key.ts +26 -0
  549. package/template/packages/shared/tsconfig.json +16 -0
  550. package/template/packages/storage/index.ts +2 -0
  551. package/template/packages/storage/package.json +1 -1
  552. package/template/packages/storage/src/in-memory-upload-repository.ts +105 -2
  553. package/template/packages/storage/src/local-file-blob-store.test.ts +58 -0
  554. package/template/packages/storage/src/local-file-blob-store.ts +5 -71
  555. package/template/packages/storage/src/local-file-blob-writer.ts +96 -0
  556. package/template/packages/storage/src/upload-abort-recovery.test.ts +234 -0
  557. package/template/packages/storage/src/upload-abort.ts +130 -0
  558. package/template/packages/storage/src/upload-cleanup-race.test.ts +207 -0
  559. package/template/packages/storage/src/upload-cleanup.ts +85 -0
  560. package/template/packages/storage/src/upload-completion.ts +52 -0
  561. package/template/packages/storage/src/upload-purge.test.ts +163 -0
  562. package/template/packages/storage/src/upload-purge.ts +261 -0
  563. package/template/packages/storage/src/upload-repository-v052-compatibility.test.ts +31 -0
  564. package/template/packages/storage/src/upload-repository.ts +61 -0
  565. package/template/packages/storage/src/upload-service-recovery.test.ts +296 -0
  566. package/template/packages/storage/src/upload-service.ts +138 -150
  567. package/template/packages/storage/src/upload-streams.ts +126 -30
  568. package/template/packages/storage/src/upload-types.ts +13 -0
  569. package/template/packages/storage/src/upload-validation.ts +127 -0
  570. package/template/scripts/provision-speech-readiness.ts +147 -0
@@ -0,0 +1,158 @@
1
+ # 受治理的大报告暂存
2
+
3
+ `ModuleReportStagingPortV1` 用于模块读取体积较大、需要随机访问内部文件的报告。
4
+ 模块提交的只能是已注册 Storage Resource File 引用和报告内业务相对路径;Host 独占
5
+ 物理目录、归档进程、资源上限、授权重检、保留期与清理状态机。
6
+
7
+ 该能力随 `system.storage` 物理分发。未选择 Storage 的 Starter 不包含 Server 实现、
8
+ 数据库表、迁移 DDL、文档或容器内的 libarchive;SDK 中的可选契约可以继续用于跨版本
9
+ 编译,`requireModuleReportStagingPortV1()` 会稳定返回
10
+ `REPORT_STAGING_UNAVAILABLE`。
11
+
12
+ ## 模块接入
13
+
14
+ 模块先注册 Resource File 读取策略和报告策略。报告 `purpose` 必须属于模块命名空间,
15
+ 每个 `sourcePurpose` 必须已由同一模块注册:
16
+
17
+ ```ts
18
+ host.registerReportStagingPolicy({
19
+ purpose: "evidence.report-staging",
20
+ sourcePurposes: ["evidence.original"],
21
+ retentionMs: 24 * 60 * 60_000,
22
+ claimTtlMs: 60_000,
23
+ maxReadLeaseMs: 5 * 60_000,
24
+ maxProcessMs: 30 * 60_000,
25
+ maxSources: 16,
26
+ maxArchiveBytes: 4 * 1024 ** 3,
27
+ maxExpandedBytes: 16 * 1024 ** 3,
28
+ maxEntryBytes: 2 * 1024 ** 3,
29
+ maxEntries: 100_000,
30
+ maxCompressionRatio: 200,
31
+ maxPathDepth: 16,
32
+ });
33
+ ```
34
+
35
+ HTTP Route 与 Durable Handler 都从 Context 取得相同的 V1 Port。创建时必须显式选择
36
+ `sourceMode`,Host 不根据扩展名或内容猜测:
37
+
38
+ - `archive`:`sources` 是单卷或多卷归档,`entrypoint` 必须等于 `sources[0]`。Host
39
+ 将这组路径按调用方给出的顺序交给固定 libarchive helper;preflight 和 extraction
40
+ 使用完全相同的卷集合和顺序,不扫描或猜测相邻卷。
41
+ - `expanded`:每个 `source` 就是一个待封存的普通 entry,`entrypoint` 是主页面或业务
42
+ manifest。Host 不启动 libarchive;这适用于供应商已经交付展开目录的报告。
43
+
44
+ 两种模式都要求 `entrypoint` 属于显式 `sources`,都不会递归扫描 Storage 目录或猜测
45
+ 相邻文件。模块不会得到 Host 文件路径,也不能传入 Actor、Scope、暂存根目录或任意
46
+ 进程参数。示例:
47
+
48
+ ```ts
49
+ await context.reportStaging?.createOrResume({
50
+ purpose: "evidence.report-staging",
51
+ idempotencyKey: "import-2026-08-01-001",
52
+ sourceMode: "expanded",
53
+ entrypoint: "report/index.html",
54
+ sources: selectedFiles.map(({ file, relativePath }) => ({
55
+ file,
56
+ relativePath,
57
+ })),
58
+ });
59
+ ```
60
+
61
+ V1 Host 还施加与单个模块策略无关的协议硬上限:规范化相对路径最多 4096 UTF-8
62
+ bytes,源文件总数最多 10,000,归档卷最多 256,显式 entry 与隐式目录合计最多
63
+ 200,000。模块策略可以进一步收紧这些值,不能放宽 Host 上限。
64
+
65
+ ## 封存流程
66
+
67
+ 1. Host 用 `module + owner + authorization scope + purpose + idempotency`
68
+ 创建或复用持久 group,并取得带过期时间的独占 claim。
69
+ 2. 每个源文件都重新经过 Storage Port 授权,随后完整流式复制、计数并计算 SHA-256;
70
+ 声明大小或摘要漂移会立即失败。
71
+ 3. `archive` 模式下,Host 用固定 helper 实际读取一个 RAR5 fixture,并核对展开后的文件
72
+ 名、大小与内容。只有 `binary realpath + device + inode + size + mtime + ctime` 相同且
73
+ 真实读取成功时才缓存能力结果;可执行文件存在本身不代表 RAR5 可用。
74
+ 4. helper 通过 libarchive 的 callback data/switch API 按序打开显式卷,并用 raw logical
75
+ position 证明解析位置至少触达每个卷;只输出带固定 magic/version 的二进制 frames:
76
+ 文件/目录元数据、最多 64 KiB 的长度前缀数据块、entry 结束和归档结束。它不经过
77
+ shell、不写磁盘,并拒绝 link、特殊文件、加密、超长路径及任何 libarchive
78
+ WARN/error;没有产生任何 entry 的空或截断输入同样 fail closed。
79
+ 5. Host 第一遍完整消费 frames 但不写 entry,把显式节点及其隐式目录逐项写入 claim
80
+ 专属 SQLite metadata spool;唯一索引在数据库内 fail closed 地验证 UTF-8、NFC、
81
+ Unicode casefold、绝对路径、`..`、Windows/UNC 路径、路径深度、重复路径、文件/目录
82
+ 前缀冲突、条目大小、条目数、隐式目录数、实际展开大小和压缩比。第二遍按 ordinal
83
+ 游标逐项核对相同的 path/type/size/order;每个 data frame 在读取 payload 和写盘前先
84
+ 同时检查 entry 与聚合剩余配额,超限时不会写入可接受前缀。普通文件以 `wx`、`0600`
85
+ 打开,partial write 必须循环到完整 chunk,并按实际 `bytesWritten` 扣减。
86
+ 6. framing 总字节、元数据、data frame 数、运行时间、claim heartbeat、取消、stderr、
87
+ SIGTERM grace 和 SIGKILL 均有硬边界。helper failure、截断、尾随数据、两遍元数据漂移
88
+ 或缺少结束标记都会失败。timeout/取消会协作 abort Host consumer、destroy pipe,并
89
+ 有界终止 helper;既有 attempt 清理随后 unlink 工作目录。Node 不能强杀已经进入内核的
90
+ 本地文件 I/O,但该 I/O 返回后会再次检查取消,且未封存 inode 不会被发布。
91
+ 7. Host 不递归解包内部归档。顶层解包完成后用 DFS 重新遍历全部节点,拒绝链接和特殊
92
+ 文件,逐文件计算 SHA-256,并在 spool 中标记扫描结果、逐项核对 preflight 的路径、
93
+ 大小、条目数和展开总量;Node heap 不保留全量 `files[]` 或 `directories[]`。
94
+ `expanded` 模式直接把每个已授权 source 流式写入 entry 路径,再执行同一轮核对;
95
+ HTML 等普通文件不会进入归档命令。
96
+ 8. spool 使用 4096-byte page、关闭 journal/synchronous/mmap、文件型临时存储,并按
97
+ `min(4 GiB, 16 MiB + maxEntries * (4096 + 768) * 4)` 限制 page count;容量耗尽统一
98
+ 返回 `REPORT_STAGING_LIMIT`。扫描完成后它从 `0600` 收紧为 `0400`,随整个 claim
99
+ 工作目录原子移动到 sealed 目录。PostgreSQL seal 事务以最多 1000 条的 batch 流式
100
+ 写入 entry 和增量 manifest hash,并在开始及最终发布 `ready` 前使用数据库
101
+ `clock_timestamp()` 复核 group/claim fence。任一后批写入、冲突或最终 fence 失败都会
102
+ 回滚整个事务,过期 attempt 不能发布或删除接管者输出。
103
+
104
+ seal 提交返回未知时,Host 会读取持久 group 状态:只有同一 seal 已成为 `ready` 才按
105
+ 成功恢复,否则只删除本 attempt 的精确目录并走 fenced failure。每次新 claim 会先清理
106
+ 该 group 的旧 `.work` 和 seal;成功或恢复后再清理除当前 seal 外的 sibling,避免进程
107
+ 崩溃留下的 orphan 无限累积。
108
+
109
+ Solid RAR 无法安全地从任意条目恢复。取消、timeout、进程故障或 claim 丢失后,Host
110
+ 会删除未封存目录并释放 claim;同一幂等请求再次执行时从首卷重新扫描和解包,不复用
111
+ 部分输出。
112
+
113
+ 为兼容统一的配额和观测字段,`expanded` 模式的 `archiveByteSize` 表示输入 source
114
+ 总字节数,并与 `expandedByteSize` 相等。其 manifest 的 `sources` 为空,调用方应通过
115
+ 分页 entry 清单读取文件;归档模式的 manifest 仍提供卷摘要。
116
+
117
+ ## 读取与清理
118
+
119
+ 读取方必须先获取持久 read lease。`inspect`、lease、manifest、分页和打开 entry 每次
120
+ 都会重新执行当前 Route/Durable Guard,并核对模块、owner、authorization scope 及
121
+ 当前策略摘要。`closeReadLease` 和 `discard` 仍重新执行 Guard 并核对所有权,但刻意不
122
+ 要求旧 group 的策略摘要继续存在或相同,使策略收紧后仍能释放读取 fence 和清理数据。
123
+ `openEntry` 以 `O_RDONLY | O_NOFOLLOW` 打开一次文件描述符,并在同一描述符上完成
124
+ `fstat`、完整 SHA-256 和后续 stream,不会按路径重新打开。摘要完成后还会再次执行
125
+ Guard,并复核当前 seal 与 read lease 尚未到期;任一复核失败都先关闭描述符再拒绝。
126
+
127
+ 到期 group 由 Storage cleanup task 分批清理。有效 claim 或 read lease 都是 purge
128
+ fence;清理先持久化 `discarding`,删除文件成功后再写入 `discarded`,进程重启后可安全
129
+ 重试。`ready`、失败、lease、claim、entry 和 source 元数据都在 PostgreSQL 中持久化,
130
+ 临时或封存内容默认位于 `WINDY_STORAGE_ROOT/report-staging`。如需独立挂载,可显式
131
+ 设置 `WINDY_REPORT_STAGING_ROOT`。
132
+
133
+ 审计只记录 opaque group/entry ID、结果、错误码、数量和字节数,不记录 Host 路径、
134
+ 文件内容、Storage `fileId` 或 Secret。
135
+
136
+ 生产环境没有 PostgreSQL 时,Host 不装配 `ModuleReportStagingPortV1`,调用方得到稳定的
137
+ unavailable 语义;仅开发和测试环境允许使用进程内 repository 作为短生命周期 fixture,
138
+ 不会把它伪装成生产持久能力。
139
+
140
+ ## 容器与运维
141
+
142
+ Server Alpine 镜像固定安装运行时 `libarchive=3.8.3-r0` 和
143
+ `libarchive-tools=3.8.3-r0`,并用固定
144
+ `libarchive-dev=3.8.3-r0` 与 build toolchain 编译
145
+ `/usr/local/bin/windy-report-archive-stream`;编译后只删除 build 依赖,保留 helper
146
+ 所需的共享库。未选择 Storage 的
147
+ Starter 会同时裁剪 helper 源码、编译步骤和依赖。非官方镜像或本地直接运行 Server 时,
148
+ 需要自行提供同一 helper;缺失或 RAR5 真实读取失败会返回
149
+ `REPORT_STAGING_UNSUPPORTED_ARCHIVE`,不会回退旧 `bsdtar -x` 或其他外部命令。
150
+
151
+ 相较老 DSP/原先 `bsdtar` 直接解压,当前实现保留已由真实 probe 验证的 RAR5 streaming
152
+ reader,但把落盘所有权和逐 write 配额检查收回 Host,并用可严格解析的 framing 取代
153
+ 人类可读 listing。V1 callback 刻意不提供 seek/reopen;需要随机 seek 的 RAR4、ZIP 或
154
+ 其他格式会 fail closed,当前不承诺与通用 `archive_read_open_filenames` 格式等价。
155
+ 聚焦验收把一个单卷 RAR5 fixture 的字节流拆成两个 synthetic volume,覆盖了正确顺序、
156
+ 缺卷、逆序,以及“完整首卷后附无关第二文件”负例;这只验证有序 volume boundary 与
157
+ 每个显式 source 至少被解析位置触达,不要求消费最终卷的 padding,也不是供应商生成的
158
+ split-RAR 样本,因此不宣称 RAR 多卷已完成供应商样本验收。
@@ -84,6 +84,11 @@ Feature 与 Permission 执行请求时 Guard。只有显式 `immutableCoreAccess
84
84
  - **持久任务每次领取都重新授权**:Host 冻结注册时通过校验的 Durable Handler
85
85
  能力绑定;首次执行、重试和进程恢复后的领取都重新解析当前 Actor,并按当前
86
86
  License、Feature 与 RBAC 状态执行 Guard。提交时曾获授权不能成为永久通行证。
87
+ - **Secret 逻辑声明与物理绑定分离**:业务 Manifest 只声明稳定三元组,project-owned
88
+ Composition 绑定 `SecretRef` / `SecretResolver`。Request 与 Durable Port 每次调用
89
+ 重新解析,Tool Context 默认没有 Secret Port。公开 Context 为旧 object literal
90
+ 保留 optional 字段;需要该能力的模块调用 `requireModuleSecretPort()`,缺失时稳定
91
+ fail closed,Windy Host 在实际 Request 和每个 Durable attempt 始终注入 Port。
87
92
  - **审计白名单**:模块只能 emit 自己 Manifest 注册的审计动作;Guard 拒绝(`security.denied`)由宿主统一记录,模块无法关闭。
88
93
  - **存储最小授权**:上传 purpose 强制属于本模块已注册 Upload Policy,Owner 由宿主
89
94
  以当前 Actor 补齐。Owner 读取保持用途约束;跨上传者读取的 purpose 只可来自当前
@@ -91,6 +96,30 @@ Feature 与 Permission 执行请求时 Guard。只有显式 `immutableCoreAccess
91
96
  Actor/Scope、消费者 Manifest Feature/Permission 和 project-owned 资源绑定
92
97
  Resolver。返回值移除 Owner 与 ArtifactRef,模块接触不到 `BlobStore`、Upload
93
98
  Repository 或任意 manage 能力。
99
+ - **流式写入最小 DTO**:`ModuleStorageWritePortV1` 只接受 purpose、文件业务元数据、
100
+ 声明大小/SHA-256、opaque session ID 和分片流,不接受 tenant、Actor、Owner、Scope、
101
+ Permission、ArtifactRef、bucket/key、路径、URL 或其它物理 locator。Request 使用
102
+ Writer 通过 Context 的可选 `storageWriter` 独立注入;既有 `storage` 保持 0.5.2
103
+ 源码兼容。Durable Storage 只保留 `openResourceFile()`。
104
+ - **HTTP 流显式选择**:Module Route 仅可在 `POST` / `PUT` 上声明
105
+ `bodyMode: "stream"`,声明后才获得 `ModuleRequestContext.bodyStream`;同 Context 的
106
+ `signal` 同时绑定 Writer。普通 JSON Route 不提供原始 body stream。Host 不缓冲完整
107
+ 请求,`appendUploadPart` 复用底层 `ReadableStream` 背压和 SHA/大小校验。
108
+ - **恢复不等于授权继承**:业务只能持久化 opaque session ID。HTTP 的每个请求与
109
+ Durable 的每个 attempt 都以当前 Actor、License、Feature、Permission、Scope 和 Host
110
+ purpose 重新授权,再允许 `getUploadSession`、`appendUploadPart`、`completeUpload`
111
+ 或 `abortUpload`。会话还持久化 creation-time module/canonical Scope hash,任一漂移
112
+ 或历史 binding 缺失都 fail closed;重复 `completeUpload` 只返回首次发布文件。
113
+ - **稳定错误投影**:Writer 只抛 SDK 的 `ModuleStorageError`。调用方可按稳定 code
114
+ 处理取消、校验、偏移、过期和并发;未知 Blob/文件系统失败统一为
115
+ `STORAGE_WRITE_FAILED`,不暴露主机路径、物理 locator 或底层异常正文。
116
+ - **取消保留可恢复事实**:取消只清当前尚未提交的临时 Blob,已提交分片继续保留;业务
117
+ 明确放弃时必须由后续重新 Guard 的 Request/attempt 调用 `abortUpload`;已取消的旧
118
+ Context 连 abort 也 fail closed。进程退出后的遗留会话由平台 TTL 和 orphan grace
119
+ 清理,模块不能取得 Repository 后自行清理。
120
+ - **Tool 不继承 Writer**:`ModuleToolContext.storage` 保持既有 create/read Port,不因
121
+ Request / Durable 新增 Writer 而获得 append/complete/abort。Agent 或 MCP 写入能力
122
+ 必须另行完成 Manifest、审批、幂等和可追踪结果契约。
94
123
  - **角色预设非破坏性合并**:预设随内置角色同步,手工追加的授权保留;与既有角色 Code 冲突直接启动失败,不做静默覆盖。
95
124
 
96
125
  ## 当前边界
@@ -0,0 +1,45 @@
1
+ # Speech V2 variants
2
+
3
+ Speech 的旧请求没有 `contractVersion` 时保持 V1 语义:只执行 `transcribe`。V2
4
+ 请求必须同时带 `contractVersion: 2` 与固定 `variant`,取值只能是
5
+ `normalize`、`transcribe` 或 `translate`;两字段任一缺失或时间戳使用布尔值均返回
6
+ `INVALID_INPUT`。
7
+
8
+ `timestamps` 只接受 `segment` 或 `word`。`translate` 额外要求
9
+ `targetLanguage`,输出每个 segment 的 `source`、`translation`、`startMs`、`endMs`;
10
+ 词级时间戳只属于原文。运行时以 canonical JSON 计算幂等指纹,包含版本、variant、
11
+ 输入 Artifact 元数据、options、能力、完整 limits 和 provider 治理策略,因此不同语义
12
+ 不能重放到同一 Run。
13
+
14
+ ## 归一化与限额
15
+
16
+ 运行时先以 `ffprobe` 读取真实时长,拒绝超过 `maxMediaDurationSeconds` 的输入,再以
17
+ `ffmpeg` 生成 `pcm_s16le`、16 kHz、单声道 WAV。`maxOutputBytes` 限制 inline JSON;
18
+ 派生 WAV 必须由 Host 预分配 Output Artifact Sink,并使用 Sink 自己的 artifact/total
19
+ limits。当前未配置该 Sink 的项目会让 `normalize` fail closed,不会把音频塞进 JSON 或
20
+ 未受治理的本地存储。
21
+
22
+ 项目必须在 project-owned 的
23
+ `apps/server/src/app/speech-output-artifact-bindings.ts` 显式绑定允许派生
24
+ `normalized-audio` 的 Operation。Server 在调用 Speech Runtime 前先按 Actor、模块、
25
+ Operation、planned Run、授权范围和幂等语义创建短时 scope,并只通过内部 Header 交接
26
+ 一次性 grant;Runtime 必须在接受任务前同步确认 grant。调用失败会回滚 pending grant,
27
+ 失败或取消终态只撤销仍 open 的 scope,和并发 seal 竞态时保留已封存成品。
28
+
29
+ Runtime 返回的 Artifact ref 不作为平台事实源。`result` 与 canonical JSON `artifact`
30
+ 响应会丢弃远端引用,重新从 Host claim sealed scope,并再次校验当前 Actor、Feature、
31
+ Permission、授权范围、模块、Operation、Run、purpose、媒体类型和限额。scope 未封存、
32
+ 引用过期或任一治理事实漂移时均失败关闭。
33
+
34
+ ## Readiness
35
+
36
+ `/health/ready` 是受内部 token 保护的 V1 readiness snapshot。它不会把 URL 可达当作
37
+ ready:除本地 `ffmpeg`/`ffprobe` 外,还会探测下游 `/health/ready` 并采纳下游明确声明
38
+ 的 capabilities。只有配置 deployment key、identity、release digest 与 offers digest 时才
39
+ 发布 ready snapshot;Host 通过 operation readiness Port 比对固定 variant、模态、limits
40
+ 与 deployment pin。Host 的 Speech source 位于 runtime composition 中,不使用统一
41
+ 跨 Runtime aggregator。
42
+
43
+ 当前 Host 只接受包含 `speech.output-artifact.v1` 的单一 `normalize` 原子 offer;在
44
+ Speech producer 完成 Output Sink 真实探测、digest attestation 与 FFmpeg 实执行探测前,
45
+ 该 offer 必须保持 unavailable,不能用已配置 URL、二进制路径存在或环境变量冒充 ready。
@@ -22,6 +22,22 @@ Composition 在 Server 监听前失败。
22
22
  Handler。Handler 的 `scopeMode` 必须与 Manifest 相同,并收到宿主提供的 Actor、
23
23
  Request ID 和超时 AbortSignal,不能接收客户端提交的权限或数据范围。
24
24
 
25
+ 普通 `ModuleToolContext` 不提供模块 Secret Port;模块即使在 Manifest 声明并由项目
26
+ 绑定 Secret,Tool 也不能取得原始值。外部连接能力应由可信服务端业务操作封装,并只向
27
+ Tool 返回脱敏结果。完整边界见[模块 Secret 解析 Port](../architecture/module-secret-resolution.md)。
28
+
29
+ `ModuleToolContext.storage` 保持既有 create/read Port:可以创建 Host 限定 purpose 的
30
+ 上传会话,以及执行既有 Owner/公开/资源绑定读取,但不会因为 Request 与 Durable
31
+ Context 新增可选 `storageWriter: ModuleStorageWritePortV1` 而自动获得 `getUploadSession`、
32
+ `appendUploadPart`、`completeUpload` 或 `abortUpload`。Tool JSON Schema 也不能声明
33
+ `bodyMode: "stream"`、取得 HTTP `bodyStream`,或把 tenant、Actor、Owner、Scope、
34
+ ArtifactRef 和物理 locator 当作 Storage 授权输入。
35
+
36
+ 这条边界避免普通 Agent Tool、Runtime Tool Host 或 MCP Adapter 因 SDK 接口扩展而获得
37
+ 新的字节写入能力。未来若要让模型发起写入,必须单独设计 Manifest 声明、写操作审批、
38
+ 强制幂等键、Durable 结果追踪、取消/补偿和专用审计,再由 Host 显式提供新的受治理
39
+ Adapter;不能把 `ModuleStorageWritePortV1` 直接加入现有 Tool Context。
40
+
25
41
  纯计算 Tool 可通过 `InstallableServerModule.setupSandbox()` 注册到独立 Tool Worker。
26
42
  该入口只提供 Tool Key、输入、幂等键与取消信号,不提供 Actor、Repository、Secret、
27
43
  Storage 或平台 Runtime。完整隔离模型见
@@ -1,6 +1,6 @@
1
1
  # Document AI Runtime
2
2
 
3
- 更新时间:2026-07-27。
3
+ 更新时间:2026-08-01。
4
4
 
5
5
  Windy 的 Document AI 是可选的独立故障域。业务模块声明稳定的
6
6
  `kind=document` Operation,并先把当前 Actor 有权读取的业务资源换成短时
@@ -8,9 +8,12 @@ Windy 的 Document AI 是可选的独立故障域。业务模块声明稳定的
8
8
  和审计后,才把任务交给 Document Server。未安装或未配置 Document Server 时,对应
9
9
  Operation 稳定返回 `CAPABILITY_UNAVAILABLE`,普通业务和文本 Agent 仍可启动。
10
10
 
11
- 首个实现返回受输出 Schema 约束的结构化 JSON:页级文本、坐标、Block、版面树、表格和
12
- 标量元数据。搜索型 PDF 等二进制派生物必须等平台输出 Artifact Sink 签发后再作为
13
- `ArtifactRef` 返回;Document Adapter 不得自行返回文件 URL、主机路径或伪造引用。
11
+ Document Runtime 支持受输出 Schema 约束的结构化 JSON:页级文本、坐标、Block、
12
+ 版面树、表格和标量元数据;也已实现搜索型 PDF 等二进制派生物的 Output Artifact
13
+ producer 协议。派生物只能经平台 Sink 密封后作为 `ArtifactRef` 返回,Document
14
+ Adapter 不得自行返回文件 URL、主机路径或伪造引用。协议、Runtime producer、Host、
15
+ 生产 bootstrap 与生成器 composition 接缝已经交付;默认 project-owned binding 为空,
16
+ 具体项目完成真实 binding 与 provisioning 前仍不能宣称生产链路接通。
14
17
 
15
18
  ## 责任边界
16
19
 
@@ -38,7 +41,13 @@ Document Server 负责:
38
41
  - 持久化 Run、事件 cursor、幂等指纹和终态结果;
39
42
  - 调用已配置的本地/内网 Document Adapter;
40
43
  - 校验页级结构、坐标、版面树、表格、输出大小和页数;
41
- - 重启时把未完成任务稳定终止,防止把半成品误报为成功。
44
+ - 对 accepted/running/terminal 状态和事件执行单调事务写入;
45
+ - 重启时把没有 Output Sink 的遗留非终态 Run 事务性终结为
46
+ `RUNTIME_UNAVAILABLE`;有 Sink 的 Run 冻结一次恢复期限,只允许同一语义、同一
47
+ Run、同一 scope 且严格更高 grant generation 的内部创建请求恢复;
48
+ - ACK 传输结果不确定时,只允许当前进程用同 generation、同 raw grant 精确重试;
49
+ 重启后的同/低 generation、语义或 scope 漂移一律失败关闭,恢复期限不会因重试或
50
+ 再次启动而顺延。
42
51
 
43
52
  业务不得导入 OCR SDK、启动模型进程、传 Base64、Blob Key、宿主绝对路径或任意公网
44
53
  URL,也不得把文本 Agent 或浏览器文本提取宣称为 OCR。
@@ -120,9 +129,115 @@ fail closed;Adapter 的单源 multipart 字段为 `file`,多源字段为重
120
129
  每个事件都有单调 `sequence`。客户端断线后使用最后确认的 sequence 恢复,不重新提交
121
130
  任务。取消会记录终态并取消当前 Adapter 协程;已进入终态的 Run 不会再次完成。
122
131
 
132
+ ### Output Artifact 握手
133
+
134
+ Output Sink 启用时,Southwind Host 在调用 Runtime 前冻结:
135
+
136
+ - 预分配的 `runId`;
137
+ - 不含 credential 的 Sink Descriptor,包括 scope、output kind、部署/Release/Offer/
138
+ Policy 摘要、MIME allowlist、limits、expiry 和 `grantGeneration`;
139
+ - 只经内部 Header `x-ai-output-artifact-grant` 发送的 raw grant。
140
+
141
+ Runtime 先在一个 SQLite 事务中写入 accepted Run、完整语义指纹、scope 和固定恢复
142
+ deadline,再把 raw grant 安装到进程内 generation CAS,并在 ACK 前持久化已消费的
143
+ generation。generation 持久化异常会立即丢弃该 exact credential,Run 仍由既有固定
144
+ deadline 收口。它随后调用 Host 的 grant accept endpoint;只有 Host 返回真正空正文的
145
+ `204` ACK,Runtime 才会先调度 Adapter、再同步清除恢复状态,创建请求随后返回 `202`;
146
+ 带任何正文的 `204` 也按明确拒绝处理,且不会创建 Adapter task。raw grant 不进入
147
+ 请求 JSON、SQLite、事件、结果、日志或错误,也不传给 Adapter。进程重启后不会从磁盘
148
+ 恢复 credential;恢复请求必须带严格更高 generation,Host 每次 Sink 请求仍按当前
149
+ 进程内 token 校验。
150
+
151
+ 恢复状态、固定 deadline 和 cleanup 状态只保存在 Runtime 内部 SQLite,不进入公开
152
+ DTO、事件、结果或指纹。`GET events/result` 仍是 cursor/read-only 接口,不触发恢复;
153
+ Host 使用原内部创建命令携带完整相同语义与新 generation 重新派发。后台 reconciler
154
+ 在期限到达时以单个事务写入一次 `run.failed`;若当前进程仍持有精确 generation 的
155
+ credential,则执行授权 `DELETE scope`,否则只记录 `pending-host-ttl`,不伪装删除
156
+ 成功并依赖 Host TTL。应用退出会取消并等待该 reconciler。
157
+
158
+ 幂等指纹覆盖 Run、Operation、选项、有序输入的 MIME/字节/hash、capability、数据分类、
159
+ Runtime limits、Provider egress/data policy,以及 Sink 的稳定 output kind、部署、
160
+ Release、Offer、Policy、MIME 和 limits。输入 ref、scope、raw grant、临时 URL/路径、
161
+ expiry 和 generation 不进入指纹,允许 credential 正常轮换但不允许治理语义漂移。
162
+ TypeScript 与 Python 使用同一固定向量验证该契约;非有限数、超过安全整数范围的
163
+ integer-valued number(包括浮点表示)和孤立 Unicode surrogate 均在指纹前拒绝,并
164
+ 映射为 `INVALID_INPUT`。
165
+
123
166
  ## Document Adapter 契约
124
167
 
125
168
  `DOCUMENT_ADAPTER_URL` 只允许 localhost、私网 IP 或 `.internal` 主机。Document Server
169
+ 先使用与执行相同的可选内部 Bearer Token,有界调用:
170
+
171
+ ```text
172
+ GET <DOCUMENT_ADAPTER_URL>/v1/document/readiness
173
+ ```
174
+
175
+ 响应最多 64 KiB,禁止重定向、重复 JSON key、非有限数、未知字段和超过公共 V1
176
+ cardinality 的集合。Adapter 必须返回独立于 Windy Host Registry 的真实 downstream
177
+ 事实:
178
+
179
+ ```json
180
+ {
181
+ "contractVersion": 1,
182
+ "status": "ready",
183
+ "runtimeKind": "document",
184
+ "deployment": {
185
+ "identity": "windy-deployment-v1_8c98de28-5af2-44ae-9d37-2a54173284bf",
186
+ "releaseDigest": "sha256:<adapter-and-model-release>"
187
+ },
188
+ "offers": [
189
+ {
190
+ "variant": "ocr",
191
+ "capabilityVersion": "intranet-ocr-2026-07",
192
+ "capabilities": ["document.ocr", "document.layout", "document.table"],
193
+ "inputModalities": ["document", "image"],
194
+ "outputModalities": ["document", "text"],
195
+ "limits": {
196
+ "maxDurationSeconds": 1200,
197
+ "maxInputBytes": 134217728,
198
+ "maxOutputBytes": 33554432,
199
+ "maxUnits": 500,
200
+ "maxArtifacts": 16,
201
+ "maxConcurrentRuns": 4,
202
+ "maxQueueDepth": 32
203
+ },
204
+ "outputArtifactContractVersion": 1
205
+ }
206
+ ]
207
+ }
208
+ ```
209
+
210
+ `capabilityVersion` 是影响 OCR、版面、表格或模型语义的稳定版本;Adapter/模型变化必须
211
+ 同时改变 downstream `releaseDigest` 或该版本。Document Runtime 把自身 readiness
212
+ release、downstream identity/release、每个 `variant → capabilityVersion` 映射,以及
213
+ 实际 Sink 的 immutable identity、release digest 和 protocol version 组成 canonical
214
+ release digest;只交换两个 variant 的 capability version,或替换任一 Sink fact,都会
215
+ 使旧 producer digest 失效。最终原子 offers 交给公共 V1 同构算法计算 offers digest。
216
+ 两者必须与部署时写入 Runtime 的 producer facts 完全一致,否则 snapshot unavailable。
217
+ Host 的 project-owned expected pin 是另一份独立事实,仍由公共 projector 比较,不能从
218
+ Runtime 环境变量反向生成。
219
+
220
+ `outputArtifactContractVersion=1` 只是 Adapter 声明它会产生受管派生文件。Runtime 只有
221
+ 在内部认证的
222
+ `GET /api/internal/ai/output-artifacts/health/ready` 使用专用
223
+ `ai-runtime-output-readiness` purpose 实际完成 scope/grant、upload session、流式写入、
224
+ complete、seal、授权 open/read、hash 校验和清理;只有 Repository、Storage writer、
225
+ Blob open/read 与清理链全部成功且没有留下 scope、artifact、session、file 或 blob,才
226
+ 返回 Sink 的 immutable identity、release digest、protocol version,并向最终 offer 添加
227
+ `document.output-artifact.v1`。探测失败时整个原子 Deployment snapshot unavailable;
228
+ 未声明派生文件的 offer 不探测 Sink,也不获得该 capability。Output Artifact Host
229
+ 还会再次要求被选择的唯一 offer 包含该 capability。
230
+
231
+ 探测响应正文最多 64 KiB;每个响应 chunk 在复制进聚合 buffer 前先按剩余预算拒绝。
232
+ Probe 的完成时间和 Run 执行前复核都采用半开有效期:完成或执行时
233
+ `now >= validUntil` 立即返回 stale/unavailable,不能消费临界点上的旧证明。
234
+
235
+ Document Server 在每次 Run 执行前重复同一探测,并要求单个 offer 独立满足全部
236
+ capability、输入/输出 modality 和 limit。带 Output Sink 的请求还必须与当前 snapshot
237
+ 的 producer identity、release digest 和 offers digest 完全相同,避免 readiness 与
238
+ 执行之间使用漂移后的派生文件协议。
239
+
240
+ 探测通过后,Document Server
126
241
  以 `multipart/form-data` 调用:
127
242
 
128
243
  ```text
@@ -130,7 +245,10 @@ POST <DOCUMENT_ADAPTER_URL>/v1/document/process
130
245
  ```
131
246
 
132
247
  请求包含单个 `file` 以及 `operationKey`、`options`、`dataClassification`、
133
- `providerEgress`、`providerDataPolicy` 和 `limits`。Adapter 返回 JSON:
248
+ `providerEgress`、`providerDataPolicy` 和 `limits`。文件使用 Runtime 生成的通用名称;
249
+ Adapter 看不到输入 ArtifactRef、Host URL、路径、Sink Descriptor 或 raw grant。
250
+
251
+ 不产生派生文件时,Adapter 返回 JSON:
134
252
 
135
253
  ```json
136
254
  {
@@ -162,8 +280,28 @@ POST <DOCUMENT_ADAPTER_URL>/v1/document/process
162
280
  ```
163
281
 
164
282
  页码必须唯一且不超过 `maxUnits`;坐标非负,置信度在 0–1,版面树深度最多 32。表格只能
165
- 引用已存在页码,单元格必须是字符串。当前 `artifacts` 必须为空,防止 Adapter 绕过
166
- 平台签发链。
283
+ 引用已存在页码,单元格必须是字符串。`application/json` 是兼容格式,其中
284
+ `artifacts` 必须为空。
285
+
286
+ 需要派生文件时,Adapter 返回有界 `multipart/related`:第一 part 必须是带明确
287
+ `Content-Length` 的 JSON manifest,后续 part 必须严格按 manifest 声明顺序提供
288
+ `Content-ID`、MIME、字节数与 SHA-256。Runtime 边读边写临时文件并同时执行单文件、
289
+ 总字节、数量、MIME、Header、framing 和 hash 校验;公开 `maxOutputBytes` 是 manifest
290
+ JSON 字节与全部 Artifact 字节共享的单一业务内容预算,协议 framing 只有独立的小型
291
+ 固定余量,不能把可用业务内容放大到两倍。Runtime 在落盘前先校验声明总量,拒绝重复
292
+ Header、内容编码、尾随 part、路径字段和非有限数值。输入下载或任一输出 part 在截断、
293
+ hash/I/O 失败、超时或协程取消时都会删除当前及先前临时文件,并原样继续传播取消。
294
+ 校验成功后才按 `begin → part → complete → seal` 写入 Host Sink,最终用 Host 返回的
295
+ opaque refs 替换 manifest 声明。
296
+
297
+ 每个 Sink 请求都读取当前 generation token。begin/part/complete/seal 均按稳定标识幂等,
298
+ 允许 Runtime 在响应丢失后安全重试一次。失败、超时或取消会用当前授权执行
299
+ `DELETE scope`;若 seal 已成功但终态持久化失败,也执行同一补偿删除。DELETE 与本地
300
+ credential 清理都绑定精确 generation,避免并发轮换时误删新授权。成功路径只有在
301
+ completed 终态持久化后才清除 grant;失败或取消路径只有在授权删除成功后才标记
302
+ `deleted`,否则保留 `pending-host-ttl`。`deleted` 是吸收态,不会因迟到 ACK 或重复
303
+ 补偿倒退为 pending;同 generation 的并发 exact retry 若已完成,只共享该 completed
304
+ 结果,不再次删除 scope。
167
305
 
168
306
  ## 配置与启动
169
307
 
@@ -176,29 +314,73 @@ AGENT_SERVER_INTERNAL_TOKEN=<随机内部令牌>
176
314
  AI_ARTIFACT_ENCRYPTION_SECRET=<至少 32 字符的随机值>
177
315
  DOCUMENT_SERVER_URL=http://document-server:8090
178
316
  DOCUMENT_ARTIFACT_URL=http://server:9747/api/internal/ai/artifacts
317
+ DOCUMENT_OUTPUT_ARTIFACT_URL=http://server:9747/api/internal/ai/output-artifacts
179
318
  DOCUMENT_ADAPTER_URL=http://ocr.internal:9000
180
319
  DOCUMENT_ADAPTER_TOKEN=<可选内部令牌>
181
320
  DOCUMENT_ADAPTER_CAPABILITIES=document.ocr,document.layout,document.table
182
321
  DOCUMENT_MAX_UNITS=500
322
+ DOCUMENT_DEPLOYMENT_KEY=document.intranet-ocr
323
+ DOCUMENT_DEPLOYMENT_IDENTITY=windy-deployment-v1_<immutable-uuidv4>
324
+ DOCUMENT_RELEASE_DIGEST=sha256:<runtime-adapter-model-sink-release>
325
+ DOCUMENT_OFFERS_DIGEST=sha256:<canonical-final-offers>
326
+ # DOCUMENT_READINESS_TIMEOUT_SECONDS=2
327
+ # DOCUMENT_READINESS_TTL_SECONDS=60
183
328
  ```
184
329
 
185
- 受控 Provider Deployment 还要设置 `DOCUMENT_DEPLOYMENT_KEY`,并与 Manifest 的稳定
186
- Key 完全一致。启动:
330
+ 四项 `DOCUMENT_DEPLOYMENT_*` / digest 都是 Runtime 自身报告的 producer facts;缺少
331
+ 任一项时,即使 URL 存在也只返回 `RUNTIME_NOT_CONFIGURED`。Provisioning 必须一次生成
332
+ immutable UUIDv4 identity,并使用实际 Adapter/model/Sink release 与最终 offers
333
+ 计算两个 digest。Host Registry 另行保存 expected pin。受控 Provider Deployment 还
334
+ 要求 `DOCUMENT_DEPLOYMENT_KEY` 与 Manifest 的稳定 Key 完全一致。启动:
187
335
 
188
336
  ```bash
189
337
  bun run dev:document
190
338
  ```
191
339
 
192
- Document Server 的 `/health/ready` 需要内部 Bearer Token,只返回 ready/unavailable、
193
- capability 和非敏感 limits。没有 Adapter 时返回 unavailable;不会回显 Token、内部
194
- 文件 URL、业务正文或底层异常。
340
+ Document Server 的 `/health/ready` 需要内部 Bearer Token,返回完整 AI Runtime
341
+ Readiness V1 snapshot。每次请求都执行真实 downstream probe,不缓存旧 ready;
342
+ 未配置、认证失败、不可达、超时、Sink 不可用、未知字段、contract/digest 漂移分别
343
+ 收敛为稳定且不含原始 detail 的 structured unavailable。响应不会回显 Token、内部
344
+ 文件 URL、业务正文、Adapter body 或底层异常。
345
+
346
+ ### 当前 Composition 接缝
347
+
348
+ Server 私有组合入口只接受已 provisioning 的不可变 Sink facts:
349
+
350
+ ```ts
351
+ createDocumentOutputArtifactRuntime({
352
+ // 其它既有依赖省略
353
+ readinessIdentity: {
354
+ identity: "windy-deployment-v1_<immutable-uuidv4>",
355
+ releaseDigest: "sha256:<sink-service-release>",
356
+ protocolVersion: 1,
357
+ },
358
+ });
359
+ ```
360
+
361
+ 显式创建了 Output Runtime 但未注入 `readinessIdentity` 时,其 Sink readiness 固定
362
+ `503`,不会用进程存活或 Repository 查询伪装 ready。统一生产 Composition 的边界更
363
+ 严格:只有非空 project-owned binding、持久 Repository、Artifact reference secret、
364
+ Sink immutable identity 和 release digest 同时存在,才创建 Output Runtime 并注册
365
+ 内部 Sink readiness route。任一前置事实缺失时,两者都不安装,而不是额外暴露一个
366
+ 无实现的 `503` endpoint。生产缺少持久 Repository 时不得回退到 InMemory,也不得给
367
+ 带 Output Artifact binding 的 Operation 标记生产就绪。
368
+
369
+ 不带 Output Artifact binding 的既有 Document Operation 保持兼容:Host capability
370
+ 检查可消费 0.5.2 legacy `status/capabilities`,也可对 `schemaVersion=1` snapshot 使用
371
+ 公共 parser/projector 验证完整原子 offer;出现未知 `schemaVersion` 时失败关闭。legacy
372
+ 路径只维持既有无输出执行,不产生 operation-level Registry pin,也不能证明 Sink 或新
373
+ Runtime 已生产就绪。
195
374
 
196
375
  ## 运维与取舍
197
376
 
198
- - Run 与事件当前使用 Document Server 自有 SQLite,适合单副本;多副本持久化与平台侧
199
- Run 授权恢复由统一 Agent 持久化能力继续收敛。
377
+ - Run 与事件当前使用 Document Server 自有 SQLite,适合单副本。它持久化语义指纹、
378
+ scope、最后接受的 generation、单调状态/事件和密封后的 refs,不持久化 raw grant;
379
+ 多副本协调仍由统一 Agent 持久化能力继续收敛。
200
380
  - Artifact 默认短时有效,并在每次读取时重算授权;任务时长不能超过 3600 秒。
201
381
  - Adapter 地址被限制为本地/内网。需要云 Provider 时由受审计的内网 Adapter 承接,
202
382
  不允许业务直接配置公网 URL。
203
- - 当前选择结构化 JSON 作为首个稳定结果,不伪造搜索型 PDF Artifact。后续输出文件必须
204
- 通过平台 Artifact Sink、TTL、下载权限和审计后再开放。
383
+ - Output Artifact producer、真实 Sink lifecycle probe、生产 bootstrap、Starter/env 与
384
+ 统一 Host Composition 接缝已实现。默认 project-owned binding 为空;项目完成真实
385
+ binding、持久 Repository 和 producer/Sink facts provisioning 前仍只能使用空
386
+ `artifacts` 的结构化 JSON,不得绕过 Sink、TTL、下载权限和审计自行返回文件。
@@ -35,6 +35,11 @@ Secret 配置分成引用和运行时值两层:
35
35
  - Registry 的公开描述只返回逻辑字段路径、是否 Secret、是否必填,不返回 env key、文件路径、引用 locator 或有效值;
36
36
  - 解析后的 Secret 只能进入进程内的 typed runtime config,禁止交给普通 API、结构化日志、审计 metadata 或配置 diff。
37
37
 
38
+ 业务模块运行时连接凭据不通过配置 Registry 增加任意字段。模块使用 Manifest 声明驱动
39
+ 的 [Secret 解析 Port](../architecture/module-secret-resolution.md):project-owned
40
+ Composition 才能把本节的 `SecretRef` / `SecretResolver` 绑定到逻辑
41
+ handle/connection/purpose,业务模块看不到物理 locator。
42
+
38
43
  平台 Server 在创建数据库连接、初始化审计恢复和监听端口前加载 `platform.runtime`。数据库、平台 Redis、RuoYi 连接和机器码通过 env Resolver 解析;Server 的 foundation 快照只投影名称、Feature 等非敏感字段。独立签名服务在连接 Vault 和监听端口前加载 `license.signing-service`,Bearer/Vault Token 只经受保护文件 Resolver 进入对应客户端。
39
44
 
40
45
  ## 新模块接入规则
@@ -127,6 +127,13 @@ canonical JSON 字节流,包含 `content-length` 与 `x-content-sha256`。Arti
127
127
  业务可以在通过输出 Schema 后把结果导入自己的事实表、保存来源回链并进入人工校正;
128
128
  平台不会替业务保存消息关系或翻译状态。
129
129
 
130
+ `normalize` 的 WAV 不进入 Speech Runtime 的 SQLite 结果库。项目在
131
+ `apps/server/src/app/speech-output-artifact-bindings.ts` 显式选择 Operation 后,Host
132
+ 在 create 前预分配 operation-bound Output Artifact scope、grant 与 TTL;Runtime 同步
133
+ ACK grant 后才能接受任务。失败/取消只清理 open scope,sealed 成品由 Host 在每次结果
134
+ 读取时按当前 Actor、模块、Operation、Run、purpose、限额、Feature、Permission 和数据
135
+ 范围重新 claim。远端响应中的引用会被丢弃,不能绕过 Host claim。
136
+
130
137
  ## 部署
131
138
 
132
139
  选择 `system.agent` 的 Starter 会分发独立 Speech Server。配置:
@@ -137,20 +144,42 @@ AGENT_SERVER_INTERNAL_TOKEN=<随机内部令牌>
137
144
  AI_ARTIFACT_ENCRYPTION_SECRET=<至少 32 字符>
138
145
  SPEECH_SERVER_URL=http://speech-server:8091
139
146
  SPEECH_ARTIFACT_URL=http://server:9747/api/internal/ai/artifacts
147
+ SPEECH_OUTPUT_ARTIFACT_URL=http://server:9747/api/internal/ai/output-artifacts
140
148
  SPEECH_ADAPTER_URL=http://asr.internal:9001
141
149
  SPEECH_ADAPTER_TOKEN=<可选内部令牌>
142
- SPEECH_ADAPTER_CAPABILITIES=speech.transcribe.batch,speech.normalize,speech.vad,speech.timestamps
150
+ SPEECH_DEPLOYMENT_KEY=speech.primary
151
+ SPEECH_DEPLOYMENT_IDENTITY=windy-deployment-v1_<uuid-v4>
152
+ SPEECH_RELEASE_DIGEST=sha256:<由实际探针事实计算>
153
+ SPEECH_OFFERS_DIGEST=sha256:<由原子 offers 计算>
154
+ SPEECH_ADAPTER_CAPABILITIES=speech.transcribe.batch,speech.translate,speech.vad,speech.timestamps
143
155
  SPEECH_MAX_UNITS=100000
144
156
  SPEECH_MAX_MEDIA_DURATION_SECONDS=86400
157
+ SPEECH_MAX_INPUT_ARTIFACT_BYTES=2147483648
158
+ SPEECH_MAX_INLINE_OUTPUT_BYTES=67108864
159
+ SPEECH_MAX_OUTPUT_ARTIFACT_BYTES=536870912
145
160
  ```
146
161
 
147
- 受控 Provider 还需配置 `SPEECH_DEPLOYMENT_KEY`,且必须与 Manifest 完全一致。启动:
162
+ `maxInputArtifactBytes` 约束输入 Artifact,`maxInlineOutputBytes` 只约束 Adapter
163
+ 返回的 JSON,`maxOutputArtifactBytes` 只约束 normalize WAV;三者不可互相替代。
164
+ 受控 Provider 的 `SPEECH_DEPLOYMENT_KEY` 必须与 Manifest 完全一致。启动:
148
165
 
149
166
  ```bash
167
+ bun run speech:pins
150
168
  bun run dev:speech
151
169
  ```
152
170
 
171
+ `speech:pins` 会在 Speech 镜像内执行真实 synthetic WAV 转换、ffprobe、Adapter 和
172
+ Output Sink full probe,只在全部通过后原子更新本机 `.env` 中的 deployment identity、
173
+ release digest 与完整 offers digest,并保持文件权限 `0600`。不得手工猜测 digest。
174
+
153
175
  Speech Server 自有 SQLite 保存 Run、cursor、终态转写和结果 Artifact,适合单副本。
154
- 健康检查需要内部 Bearer Token,只返回 capability 与非敏感 limits。Adapter、FFmpeg
155
- 或 FFprobe 不可用时返回 unavailable;完全断网 profile 使用已包含 FFmpeg 的镜像和
156
- 本地/内网 ASR Adapter,运行时不需要公网。
176
+ 健康检查需要内部 Bearer Token,只返回 capability 与非敏感 limits。它会真实执行
177
+ 受限 synthetic PCM 转 WAV,再让 ffprobe 读取实际输出,并分别严格探测 Adapter 的
178
+ `/v1/speech/readiness` 与 Output Sink;响应必须是状态 200、有界 JSON 且满足 V1
179
+ 契约。normalize 只在本地工具与 Sink 都通过时出现,transcribe/translate 只按 Adapter
180
+ 逐项证明的原子 offer 出现。Runtime 从这些事实重算 release/offers digest,与部署 pin
181
+ 不一致即 fail closed。进程必须先完成一次与 full pin 一致的全量探针;Server Host 也
182
+ 必须亲自看到这次完整证明并独立保存完整 offers,之后 Adapter 或 Sink 短时单点故障时,
183
+ 只允许当前实测 offers 相对 Host 历史只减不增,因此 normalize 与 transcribe/translate
184
+ 不互相拖垮。Runtime payload 自报历史 pin 不构成证明;任一进程重启后都不会沿用旧证明。
185
+ 完全断网 profile 使用已包含 FFmpeg 的镜像和本地/内网 Adapter。