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
package/dist/cli.js CHANGED
@@ -34,8 +34,8 @@ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports,
34
34
  var __require = import.meta.require;
35
35
 
36
36
  // ../../node_modules/.bun/cli-width@4.1.0/node_modules/cli-width/index.js
37
- var require_cli_width = __commonJS((exports, module3) => {
38
- module3.exports = cliWidth;
37
+ var require_cli_width = __commonJS((exports, module2) => {
38
+ module2.exports = cliWidth;
39
39
  function normalizeOpts(options) {
40
40
  const defaultOpts = {
41
41
  defaultWidth: 0,
@@ -74,7 +74,7 @@ var require_cli_width = __commonJS((exports, module3) => {
74
74
  });
75
75
 
76
76
  // ../../node_modules/.bun/mute-stream@3.0.0/node_modules/mute-stream/lib/index.js
77
- var require_lib = __commonJS((exports, module3) => {
77
+ var require_lib = __commonJS((exports, module2) => {
78
78
  var Stream = __require("stream");
79
79
 
80
80
  class MuteStream extends Stream {
@@ -190,7 +190,7 @@ var require_lib = __commonJS((exports, module3) => {
190
190
  return this.#proxy("close", ...args);
191
191
  }
192
192
  }
193
- module3.exports = MuteStream;
193
+ module2.exports = MuteStream;
194
194
  });
195
195
 
196
196
  // src/arguments.ts
@@ -239,29 +239,89 @@ function validateModuleDistributionCatalog(manifests) {
239
239
  return manifests;
240
240
  }
241
241
 
242
+ // src/optional-module-base.ts
243
+ function optionalModule(name, label, description, dependencies) {
244
+ const selection = "optional";
245
+ return {
246
+ name,
247
+ version: "0.1.0",
248
+ windyRange: "^0.5.0",
249
+ label,
250
+ description,
251
+ selection,
252
+ runtimeActivation: "toggle",
253
+ deploymentInstall: "project-composition-required",
254
+ dependencies,
255
+ conflicts: [],
256
+ runtimePackage: null,
257
+ packages: [],
258
+ registryDependencies: [],
259
+ fileRoots: [],
260
+ documentation: [],
261
+ schemaFiles: [],
262
+ migrationRoots: [],
263
+ databaseTables: [],
264
+ databaseLineageOwner: "platform",
265
+ transientDatabaseTables: [],
266
+ databaseStatementTokens: [],
267
+ uninstallPolicy: "retain-data",
268
+ installRecipe: `module-${name}-install`,
269
+ updateRecipes: [`module-${name}-update-0.1.0`],
270
+ uninstallRecipe: `module-${name}-uninstall`
271
+ };
272
+ }
273
+
274
+ // src/optional-module-storage.ts
275
+ var storageOptionalModule = {
276
+ ...optionalModule("system.storage", "\u6587\u4EF6\u5B58\u50A8", "\u4E0A\u4F20\u3001\u4E0B\u8F7D\u548C\u5BF9\u8C61\u751F\u547D\u5468\u671F\u3002", ["system", "system.settings", "system.scheduler"]),
277
+ runtimeActivation: "physical-only",
278
+ registryDependencies: [
279
+ {
280
+ sourceName: "unicode-case-folding",
281
+ name: "unicode-case-folding",
282
+ version: "1.1.1"
283
+ }
284
+ ],
285
+ fileRoots: [
286
+ "apps/server/src/storage",
287
+ "apps/server/src/report-staging",
288
+ "apps/server/src/module-host/durable-storage-filesystem-restart.test.ts",
289
+ "apps/server/src/module-host/durable-storage-write.test.ts",
290
+ "apps/server/src/module-host/report-staging-port.ts",
291
+ "apps/server/src/module-host/route-installer.test.ts",
292
+ "apps/server/src/module-host/route-installer.test-fixture.ts",
293
+ "apps/server/src/module-host/storage-authorization-binding.test.ts",
294
+ "apps/server/src/module-host/storage-port.test.ts",
295
+ "apps/server/src/module-host/storage-restart-fixture.test-support.ts",
296
+ "apps/server/src/module-host/storage-restart-postgres.integration.test.ts",
297
+ "apps/server/src/module-host/storage-scope-drift-http.test.ts",
298
+ "apps/server/src/module-host/storage-stream-route.test.ts"
299
+ ],
300
+ documentation: [
301
+ "docs/architecture/object-storage.md",
302
+ "docs/architecture/report-staging.md"
303
+ ],
304
+ schemaFiles: [
305
+ "packages/database/src/schema/file-storage.ts",
306
+ "packages/database/src/schema/report-staging.ts"
307
+ ],
308
+ databaseTables: [
309
+ "file_upload_sessions",
310
+ "file_upload_parts",
311
+ "file_metadata",
312
+ "report_staging_groups",
313
+ "report_staging_sources",
314
+ "report_staging_entries",
315
+ "report_staging_read_leases",
316
+ "report_staging_claims"
317
+ ]
318
+ };
319
+
242
320
  // src/optional-module-distribution.ts
243
321
  var optionalModuleManifests = [
322
+ storageOptionalModule,
244
323
  {
245
- ...module("system.storage", "\u6587\u4EF6\u5B58\u50A8", "\u4E0A\u4F20\u3001\u4E0B\u8F7D\u548C\u5BF9\u8C61\u751F\u547D\u5468\u671F\u3002", [
246
- "system",
247
- "system.settings"
248
- ]),
249
- runtimeActivation: "physical-only",
250
- fileRoots: [
251
- "apps/server/src/storage",
252
- "apps/server/src/module-host/route-installer.test.ts",
253
- "apps/server/src/module-host/storage-port.test.ts"
254
- ],
255
- documentation: ["docs/architecture/object-storage.md"],
256
- schemaFiles: ["packages/database/src/schema/file-storage.ts"],
257
- databaseTables: [
258
- "file_upload_sessions",
259
- "file_upload_parts",
260
- "file_metadata"
261
- ]
262
- },
263
- {
264
- ...module("system.agent", "Agent Tool", "\u53D7\u63A7 Agent \u5DE5\u5177\u5BBF\u4E3B\u3002", [
324
+ ...optionalModule("system.agent", "Agent Tool", "\u53D7\u63A7 Agent \u5DE5\u5177\u5BBF\u4E3B\u3002", [
265
325
  "system",
266
326
  "system.audit",
267
327
  "system.storage",
@@ -287,7 +347,12 @@ var optionalModuleManifests = [
287
347
  "apps/embedding-server",
288
348
  "apps/server/src/agent",
289
349
  "apps/server/src/ai-runtime-report",
350
+ "apps/server/src/ai-runtime-readiness",
351
+ "apps/server/src/app/ai-screenshot-intake-binding.ts",
352
+ "apps/server/src/app/document-output-artifact-bindings.ts",
353
+ "apps/server/src/app/speech-output-artifact-bindings.ts",
290
354
  "apps/server/src/ai-artifact",
355
+ "apps/server/src/ai-output-artifact",
291
356
  "apps/server/src/document",
292
357
  "apps/server/src/speech",
293
358
  "apps/server/src/embedding",
@@ -298,6 +363,7 @@ var optionalModuleManifests = [
298
363
  "apps/server/src/module-host/ai-operation-port.test.ts",
299
364
  "apps/server/src/module-host/tool-handlers.ts",
300
365
  "apps/server/src/module-host/tool-handlers.test.ts",
366
+ "apps/server/src/module-host/module-secret-tool-boundary.test.ts",
301
367
  "apps/web/src/pages/system/AiRuntimePage.vue",
302
368
  "apps/web/src/pages/system/ai-runtime-presenter.ts",
303
369
  "apps/web/src/pages/system/ai-runtime-presenter.webtest.ts",
@@ -308,8 +374,10 @@ var optionalModuleManifests = [
308
374
  "apps/web/src/services/ai-runtime-api.webtest.ts",
309
375
  "docker-compose.agent-debug.yml",
310
376
  "scripts/dev-adk-web.ts",
377
+ "scripts/provision-speech-readiness.ts",
311
378
  "packages/modules/src/system-agent-tools.ts",
312
379
  "packages/database/src/agent-runtime-schema.test.ts",
380
+ "packages/database/src/ai-output-artifacts.test.ts",
313
381
  "packages/shared/src/ai-runtime-report.ts"
314
382
  ],
315
383
  documentation: [
@@ -328,22 +396,27 @@ var optionalModuleManifests = [
328
396
  "docs/platform/speech-ai-runtime.md",
329
397
  "docs/platform/embedding-ai-runtime.md"
330
398
  ],
331
- schemaFiles: ["packages/database/src/schema/agent-runtime.ts"],
399
+ schemaFiles: [
400
+ "packages/database/src/schema/agent-runtime.ts",
401
+ "packages/database/src/schema/embedding-runtime.ts",
402
+ "packages/database/src/schema/ai-output-artifacts.ts"
403
+ ],
332
404
  databaseTables: [
333
405
  "agent_operation_releases",
334
406
  "agent_runtime_runs",
335
407
  "agent_runtime_events",
336
408
  "agent_evaluation_results",
337
409
  "agent_run_bindings",
410
+ "agent_screenshot_intakes",
338
411
  "agent_runtime_report_runs",
339
- "agent_runtime_report_attempts"
412
+ "agent_runtime_report_attempts",
413
+ "embedding_run_bindings",
414
+ "ai_output_artifact_scopes",
415
+ "ai_output_artifacts"
340
416
  ]
341
417
  },
342
418
  {
343
- ...module("system.scheduler", "\u4EFB\u52A1\u8C03\u5EA6", "\u4EFB\u52A1\u3001\u91CD\u8BD5\u3001\u5386\u53F2\u548C\u6062\u590D\u3002", [
344
- "system",
345
- "system.audit"
346
- ]),
419
+ ...optionalModule("system.scheduler", "\u4EFB\u52A1\u8C03\u5EA6", "\u4EFB\u52A1\u3001\u91CD\u8BD5\u3001\u5386\u53F2\u548C\u6062\u590D\u3002", ["system", "system.audit"]),
347
420
  fileRoots: [
348
421
  "apps/server/src/scheduler",
349
422
  "apps/server/src/jobs",
@@ -352,6 +425,7 @@ var optionalModuleManifests = [
352
425
  "apps/server/src/module-host/durable-context.test.ts",
353
426
  "apps/server/src/module-host/durable-context-guard.test.ts",
354
427
  "apps/server/src/module-host/durable-context-unavailable.test.ts",
428
+ "apps/server/src/module-host/module-secret-durable.test.ts",
355
429
  "apps/server/src/module-host/job-port.test.ts",
356
430
  "apps/server/src/module-host/task-definitions.ts",
357
431
  "packages/database/src/schema-durable-recovery.test.ts",
@@ -386,7 +460,7 @@ var optionalModuleManifests = [
386
460
  ]
387
461
  },
388
462
  {
389
- ...module("system.notification", "\u7AD9\u5185\u901A\u77E5", "\u901A\u77E5\u5B9A\u5411\u4E0E\u5B9A\u65F6\u53D1\u5E03\u3001\u7528\u6237\u504F\u597D\u3001\u5916\u90E8\u6E20\u9053\u6295\u9012\u3001\u4FEE\u6539\u5386\u53F2\u3001\u9605\u8BFB\u3001\u6536\u85CF\u548C\u5F52\u6863\u3002", ["system", "system.identity", "system.scheduler"]),
463
+ ...optionalModule("system.notification", "\u7AD9\u5185\u901A\u77E5", "\u901A\u77E5\u5B9A\u5411\u4E0E\u5B9A\u65F6\u53D1\u5E03\u3001\u7528\u6237\u504F\u597D\u3001\u5916\u90E8\u6E20\u9053\u6295\u9012\u3001\u4FEE\u6539\u5386\u53F2\u3001\u9605\u8BFB\u3001\u6536\u85CF\u548C\u5F52\u6863\u3002", ["system", "system.identity", "system.scheduler"]),
390
464
  registryDependencies: [
391
465
  {
392
466
  sourceName: "nodemailer",
@@ -431,12 +505,7 @@ var optionalModuleManifests = [
431
505
  ]
432
506
  },
433
507
  {
434
- ...module("system.workflow", "\u5BA1\u6279\u5DE5\u4F5C\u6D41", "\u5BA1\u6279\u3001\u8F6C\u4EA4\u3001\u8D85\u65F6\u548C\u8865\u507F\u3002", [
435
- "system",
436
- "system.identity",
437
- "system.notification",
438
- "system.scheduler"
439
- ]),
508
+ ...optionalModule("system.workflow", "\u5BA1\u6279\u5DE5\u4F5C\u6D41", "\u5BA1\u6279\u3001\u8F6C\u4EA4\u3001\u8D85\u65F6\u548C\u8865\u507F\u3002", ["system", "system.identity", "system.notification", "system.scheduler"]),
440
509
  fileRoots: [
441
510
  "apps/server/src/workflow",
442
511
  "packages/database/src/schema-workflow-notification.test.ts"
@@ -446,11 +515,7 @@ var optionalModuleManifests = [
446
515
  databaseTables: ["workflow_work_items", "workflow_transitions"]
447
516
  },
448
517
  {
449
- ...module("system.bulk-data", "\u6279\u91CF\u6570\u636E", "\u6279\u91CF\u5BFC\u5165\u5BFC\u51FA\u4E0E\u7ED3\u679C\u7559\u5B58\u3002", [
450
- "system",
451
- "system.storage",
452
- "system.scheduler"
453
- ]),
518
+ ...optionalModule("system.bulk-data", "\u6279\u91CF\u6570\u636E", "\u6279\u91CF\u5BFC\u5165\u5BFC\u51FA\u4E0E\u7ED3\u679C\u7559\u5B58\u3002", ["system", "system.storage", "system.scheduler"]),
454
519
  fileRoots: [
455
520
  "apps/server/src/bulk-data",
456
521
  "apps/server/src/jobs/legacy-adapter.integration.test.ts",
@@ -465,9 +530,7 @@ var optionalModuleManifests = [
465
530
  databaseTables: ["bulk_data_jobs", "bulk_data_artifacts"]
466
531
  },
467
532
  {
468
- ...module("system.search", "\u5E73\u53F0\u641C\u7D22", "\u6743\u9650\u611F\u77E5\u641C\u7D22\u4E0E Provider \u805A\u5408\u3002", [
469
- "system"
470
- ]),
533
+ ...optionalModule("system.search", "\u5E73\u53F0\u641C\u7D22", "\u6743\u9650\u611F\u77E5\u641C\u7D22\u4E0E Provider \u805A\u5408\u3002", ["system"]),
471
534
  fileRoots: [
472
535
  "apps/server/src/search",
473
536
  "apps/server/src/module-host/search-providers.ts",
@@ -480,7 +543,7 @@ var optionalModuleManifests = [
480
543
  documentation: ["docs/architecture/search-provider-protocol.md"]
481
544
  },
482
545
  {
483
- ...module("system.data-governance", "\u6570\u636E\u6CBB\u7406", "\u654F\u611F\u5B57\u6BB5\u3001\u660E\u6587\u8BBF\u95EE\u548C\u6CBB\u7406\u5BFC\u51FA\u3002", [
546
+ ...optionalModule("system.data-governance", "\u6570\u636E\u6CBB\u7406", "\u654F\u611F\u5B57\u6BB5\u3001\u660E\u6587\u8BBF\u95EE\u548C\u6CBB\u7406\u5BFC\u51FA\u3002", [
484
547
  "system",
485
548
  "system.identity",
486
549
  "system.audit",
@@ -506,7 +569,7 @@ var optionalModuleManifests = [
506
569
  databaseTables: ["governed_export_requests"]
507
570
  },
508
571
  {
509
- ...module("work-order", "\u793A\u4F8B\u5DE5\u5355", "\u53EF\u66FF\u6362\u7684\u4E1A\u52A1\u6A21\u5757\u63A5\u5165\u793A\u4F8B\u3002", [
572
+ ...optionalModule("work-order", "\u793A\u4F8B\u5DE5\u5355", "\u53EF\u66FF\u6362\u7684\u4E1A\u52A1\u6A21\u5757\u63A5\u5165\u793A\u4F8B\u3002", [
510
573
  "system",
511
574
  "system.identity",
512
575
  "system.search",
@@ -532,36 +595,6 @@ var optionalModuleManifests = [
532
595
  databaseLineageOwner: "module"
533
596
  }
534
597
  ];
535
- function module(name, label, description, dependencies) {
536
- const selection = "optional";
537
- return {
538
- name,
539
- version: "0.1.0",
540
- windyRange: "^0.5.0",
541
- label,
542
- description,
543
- selection,
544
- runtimeActivation: "toggle",
545
- deploymentInstall: "project-composition-required",
546
- dependencies,
547
- conflicts: [],
548
- runtimePackage: null,
549
- packages: [],
550
- registryDependencies: [],
551
- fileRoots: [],
552
- documentation: [],
553
- schemaFiles: [],
554
- migrationRoots: [],
555
- databaseTables: [],
556
- databaseLineageOwner: "platform",
557
- transientDatabaseTables: [],
558
- databaseStatementTokens: [],
559
- uninstallPolicy: "retain-data",
560
- installRecipe: `module-${name}-install`,
561
- updateRecipes: [`module-${name}-update-0.1.0`],
562
- uninstallRecipe: `module-${name}-uninstall`
563
- };
564
- }
565
598
 
566
599
  // src/module-distribution.ts
567
600
  var requiredModuleNames = ["system", "system.identity"];
@@ -572,10 +605,10 @@ var recommendedModuleNames = [
572
605
  "system.operations"
573
606
  ];
574
607
  var platformModules = [
575
- module2("system", "\u7CFB\u7EDF\u6838\u5FC3", "Admin \u51C6\u5165\u3001Feature \u4E0E\u6570\u636E\u5E93\u57FA\u7EBF\u3002", "required"),
576
- module2("system.identity", "\u8EAB\u4EFD\u4E0E\u6743\u9650", "\u8BA4\u8BC1\u3001\u7528\u6237\u3001\u89D2\u8272\u3001\u7EC4\u7EC7\u548C\u6570\u636E\u8303\u56F4\u3002", "required", ["system"]),
608
+ module("system", "\u7CFB\u7EDF\u6838\u5FC3", "Admin \u51C6\u5165\u3001Feature \u4E0E\u6570\u636E\u5E93\u57FA\u7EBF\u3002", "required"),
609
+ module("system.identity", "\u8EAB\u4EFD\u4E0E\u6743\u9650", "\u8BA4\u8BC1\u3001\u7528\u6237\u3001\u89D2\u8272\u3001\u7EC4\u7EC7\u548C\u6570\u636E\u8303\u56F4\u3002", "required", ["system"]),
577
610
  {
578
- ...module2("system.settings", "\u5E73\u53F0\u8BBE\u7F6E", "\u54C1\u724C\u3001Logo \u4E0E\u6C34\u5370\u3002", "recommended", ["system"]),
611
+ ...module("system.settings", "\u5E73\u53F0\u8BBE\u7F6E", "\u54C1\u724C\u3001Logo \u4E0E\u6C34\u5370\u3002", "recommended", ["system"]),
579
612
  runtimeActivation: "physical-only",
580
613
  fileRoots: [
581
614
  "apps/server/src/settings",
@@ -598,7 +631,7 @@ var platformModules = [
598
631
  ]
599
632
  },
600
633
  {
601
- ...module2("system.configuration", "\u914D\u7F6E\u7248\u672C", "\u7C7B\u578B\u5316\u914D\u7F6E\u3001\u5E94\u7528\u548C\u56DE\u6EDA\u3002", "recommended", ["system"]),
634
+ ...module("system.configuration", "\u914D\u7F6E\u7248\u672C", "\u7C7B\u578B\u5316\u914D\u7F6E\u3001\u5E94\u7528\u548C\u56DE\u6EDA\u3002", "recommended", ["system"]),
602
635
  fileRoots: [
603
636
  "apps/server/src/configuration",
604
637
  "apps/web/src/pages/configuration",
@@ -613,7 +646,7 @@ var platformModules = [
613
646
  ]
614
647
  },
615
648
  {
616
- ...module2("system.license", "\u79BB\u7EBF License", "\u79BB\u7EBF\u9A8C\u7B7E\u3001\u5B89\u88C5\u548C\u9650\u5236\u6001\u3002", "optional", ["system"]),
649
+ ...module("system.license", "\u79BB\u7EBF License", "\u79BB\u7EBF\u9A8C\u7B7E\u3001\u5B89\u88C5\u548C\u9650\u5236\u6001\u3002", "optional", ["system"]),
617
650
  registryDependencies: [
618
651
  {
619
652
  sourceName: "@southwind-ai/license",
@@ -665,7 +698,7 @@ var platformModules = [
665
698
  ]
666
699
  },
667
700
  {
668
- ...module2("system.audit", "\u5BA1\u8BA1\u65E5\u5FD7", "\u5BA1\u8BA1\u67E5\u8BE2\u3001\u53EF\u9760\u5199\u5165\u548C\u6062\u590D\u3002", "recommended", ["system"]),
701
+ ...module("system.audit", "\u5BA1\u8BA1\u65E5\u5FD7", "\u5BA1\u8BA1\u67E5\u8BE2\u3001\u53EF\u9760\u5199\u5165\u548C\u6062\u590D\u3002", "recommended", ["system"]),
669
702
  fileRoots: [
670
703
  "apps/server/src/audit/drizzle-log-store.ts",
671
704
  "apps/server/src/audit/recovery-queue.ts",
@@ -689,7 +722,7 @@ var platformModules = [
689
722
  databaseStatementTokens: ["idx_audit_logs_"]
690
723
  },
691
724
  {
692
- ...module2("system.operations", "\u8FD0\u7EF4\u76D1\u63A7", "\u670D\u52A1\u3001\u6570\u636E\u5E93\u3001\u7F13\u5B58\u3001\u78C1\u76D8\u548C\u4F1A\u8BDD\u76D1\u63A7\u3002", "recommended", ["system", "system.configuration"]),
725
+ ...module("system.operations", "\u8FD0\u7EF4\u76D1\u63A7", "\u670D\u52A1\u3001\u6570\u636E\u5E93\u3001\u7F13\u5B58\u3001\u78C1\u76D8\u548C\u4F1A\u8BDD\u76D1\u63A7\u3002", "recommended", ["system", "system.configuration"]),
693
726
  fileRoots: [
694
727
  "apps/server/src/system/operation-monitoring.ts",
695
728
  "apps/server/src/system/operation-monitoring.test.ts",
@@ -765,7 +798,7 @@ function selectedModuleManifests(names) {
765
798
  }
766
799
  return moduleDistributionCatalog.filter(({ name }) => selected.has(name));
767
800
  }
768
- function module2(name, label, description, selection, dependencies = []) {
801
+ function module(name, label, description, selection, dependencies = []) {
769
802
  return {
770
803
  name,
771
804
  version: "0.1.0",
@@ -912,9 +945,10 @@ class CommandExecutionError extends Error {
912
945
  this.name = "CommandExecutionError";
913
946
  }
914
947
  }
915
- async function runCommand(command, args, cwd) {
948
+ async function runCommand(command, args, cwd, options = {}) {
916
949
  const child = Bun.spawn([command, ...args], {
917
950
  cwd,
951
+ env: options.env ?? process.env,
918
952
  stderr: "inherit",
919
953
  stdin: "inherit",
920
954
  stdout: "inherit"
@@ -1059,7 +1093,9 @@ var managedSecretKeys = [
1059
1093
  "AGENT_SERVER_INTERNAL_TOKEN",
1060
1094
  "ADK_DEBUG_PLATFORM_TOKEN",
1061
1095
  "AGENT_RUN_ENCRYPTION_SECRET",
1062
- "AI_ARTIFACT_ENCRYPTION_SECRET"
1096
+ "AI_ARTIFACT_ENCRYPTION_SECRET",
1097
+ "EMBEDDING_RUN_ENCRYPTION_SECRET",
1098
+ "AI_OUTPUT_ARTIFACT_REFERENCE_SECRET"
1063
1099
  ];
1064
1100
  async function initializeLocalEnvironment(projectRoot, generateSecret = defaultSecret) {
1065
1101
  const target = join(projectRoot, ".env");
@@ -1083,6 +1119,12 @@ async function initializeLocalEnvironment(projectRoot, generateSecret = defaultS
1083
1119
  if (/^AI_ARTIFACT_ENCRYPTION_SECRET=[ \t\r]*$/m.test(content)) {
1084
1120
  content = setEmptyVariable(content, "AI_ARTIFACT_ENCRYPTION_SECRET", generateSecret());
1085
1121
  }
1122
+ if (/^EMBEDDING_RUN_ENCRYPTION_SECRET=[ \t\r]*$/m.test(content)) {
1123
+ content = setEmptyVariable(content, "EMBEDDING_RUN_ENCRYPTION_SECRET", generateSecret());
1124
+ }
1125
+ if (/^AI_OUTPUT_ARTIFACT_REFERENCE_SECRET=[ \t\r]*$/m.test(content)) {
1126
+ content = setEmptyVariable(content, "AI_OUTPUT_ARTIFACT_REFERENCE_SECRET", generateSecret());
1127
+ }
1086
1128
  let handle;
1087
1129
  try {
1088
1130
  handle = await open(target, "wx", 384);
@@ -2584,8 +2626,9 @@ function collapseRemovalRoots(paths) {
2584
2626
  }
2585
2627
  async function stripModuleBlocks(root, selected) {
2586
2628
  for (const path of await collectFiles2(root)) {
2587
- if (!textExtensions.has(extname(path)))
2629
+ if (basename3(path) !== "Dockerfile" && !textExtensions.has(extname(path))) {
2588
2630
  continue;
2631
+ }
2589
2632
  const source = await readFile6(path, "utf8");
2590
2633
  if (!source.includes("@windy-module"))
2591
2634
  continue;
@@ -2762,6 +2805,31 @@ Skill \u4ECD\u53EF\u7528\u4E8E\u666E\u901A\u4E1A\u52A1\u6A21\u5757\u5F00\u53D1\u
2762
2805
  `;
2763
2806
  }
2764
2807
 
2808
+ // src/runtime-profile-opensearch.ts
2809
+ var openSearchComposeService = ` opensearch:
2810
+ profiles: ["search"]
2811
+ image: opensearchproject/opensearch:2.19.3
2812
+ environment:
2813
+ discovery.type: single-node
2814
+ DISABLE_INSTALL_DEMO_CONFIG: "true"
2815
+ DISABLE_SECURITY_PLUGIN: "true"
2816
+ OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"
2817
+ ports:
2818
+ - "127.0.0.1:19200:9200"
2819
+ volumes:
2820
+ - opensearch-data:/usr/share/opensearch/data
2821
+ healthcheck:
2822
+ test:
2823
+ [
2824
+ "CMD-SHELL",
2825
+ "curl -fsS http://127.0.0.1:9200/_cluster/health?wait_for_status=yellow",
2826
+ ]
2827
+ interval: 10s
2828
+ timeout: 5s
2829
+ retries: 12
2830
+
2831
+ `;
2832
+
2765
2833
  // src/runtime-profile-files.ts
2766
2834
  var starterComposeBase = `services:
2767
2835
  postgres:
@@ -2804,6 +2872,7 @@ var starterComposeBase = `services:
2804
2872
  DATABASE_URL: postgresql://windy:\${POSTGRES_PASSWORD}@postgres:5432/windy
2805
2873
  WINDY_BOOTSTRAP_ADMIN_PASSWORD: \${WINDY_BOOTSTRAP_ADMIN_PASSWORD:?\u8BF7\u5728 .env \u4E2D\u8BBE\u7F6E\u7BA1\u7406\u5458\u521D\u59CB\u5BC6\u7801}
2806
2874
  WINDY_AUDIT_QUEUE_FILE: /app/data/audit/recovery-queue.json
2875
+ __STORAGE_SERVER_ENV__
2807
2876
  WINDY_CONTAINERIZED: "1"
2808
2877
  BUN_CONFIG_NO_CLEAR_TERMINAL_ON_RELOAD: "true"
2809
2878
  WINDY_SYSTEM_USAGE_PATHS: /app/data/audit
@@ -2815,6 +2884,9 @@ __TOOL_SANDBOX_SERVER_ENV__
2815
2884
  AI_ARTIFACT_URL: http://server:9747/api/internal/ai/artifacts
2816
2885
  AI_ARTIFACT_ENCRYPTION_SECRET: \${AI_ARTIFACT_ENCRYPTION_SECRET:-}
2817
2886
  DOCUMENT_SERVER_URL: \${DOCUMENT_SERVER_URL:-}
2887
+ AI_OUTPUT_ARTIFACT_REFERENCE_SECRET: \${AI_OUTPUT_ARTIFACT_REFERENCE_SECRET:-}
2888
+ DOCUMENT_OUTPUT_ARTIFACT_SINK_IDENTITY: \${DOCUMENT_OUTPUT_ARTIFACT_SINK_IDENTITY:-}
2889
+ DOCUMENT_OUTPUT_ARTIFACT_SINK_RELEASE_DIGEST: \${DOCUMENT_OUTPUT_ARTIFACT_SINK_RELEASE_DIGEST:-}
2818
2890
  SPEECH_SERVER_URL: \${SPEECH_SERVER_URL:-}
2819
2891
  EMBEDDING_SERVER_URL: \${EMBEDDING_SERVER_URL:-}
2820
2892
  __OPENSEARCH_SERVER_ENV__
@@ -2824,6 +2896,7 @@ __OPENSEARCH_SERVER_ENV__
2824
2896
  - ./apps/server:/app/apps/server
2825
2897
  - ./packages:/app/packages
2826
2898
  - server-audit-data:/app/data/audit
2899
+ __STORAGE_SERVER_VOLUME__
2827
2900
  __TOOL_SANDBOX_SERVER_VOLUME__
2828
2901
  depends_on:
2829
2902
  migrate:
@@ -2864,29 +2937,6 @@ volumes:
2864
2937
  postgres-data:
2865
2938
  server-audit-data:
2866
2939
  __OPTIONAL_VOLUMES__
2867
- `;
2868
- var openSearchComposeService = ` opensearch:
2869
- profiles: ["search"]
2870
- image: opensearchproject/opensearch:2.19.3
2871
- environment:
2872
- discovery.type: single-node
2873
- DISABLE_INSTALL_DEMO_CONFIG: "true"
2874
- DISABLE_SECURITY_PLUGIN: "true"
2875
- OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"
2876
- ports:
2877
- - "127.0.0.1:19200:9200"
2878
- volumes:
2879
- - opensearch-data:/usr/share/opensearch/data
2880
- healthcheck:
2881
- test:
2882
- [
2883
- "CMD-SHELL",
2884
- "curl -fsS http://127.0.0.1:9200/_cluster/health?wait_for_status=yellow",
2885
- ]
2886
- interval: 10s
2887
- timeout: 5s
2888
- retries: 12
2889
-
2890
2940
  `;
2891
2941
  var agentComposeService = ` tool-sandbox-init:
2892
2942
  profiles: ["agent"]
@@ -2955,8 +3005,17 @@ var agentComposeService = ` tool-sandbox-init:
2955
3005
  AI_PROVIDER_CONNECT_TIMEOUT_MS: \${AI_PROVIDER_CONNECT_TIMEOUT_MS:-5000}
2956
3006
  AI_PROVIDER_REQUEST_TIMEOUT_MS: \${AI_PROVIDER_REQUEST_TIMEOUT_MS:-60000}
2957
3007
  AI_PROVIDER_MAX_RESPONSE_BYTES: \${AI_PROVIDER_MAX_RESPONSE_BYTES:-2097152}
3008
+ AI_PROVIDER_MAX_DURATION_SECONDS: \${AI_PROVIDER_MAX_DURATION_SECONDS:-300}
3009
+ AI_PROVIDER_MAX_INPUT_BYTES: \${AI_PROVIDER_MAX_INPUT_BYTES:-67108864}
3010
+ AI_PROVIDER_MAX_ARTIFACTS: \${AI_PROVIDER_MAX_ARTIFACTS:-16}
3011
+ AI_PROVIDER_MAX_PIXELS_PER_ARTIFACT: \${AI_PROVIDER_MAX_PIXELS_PER_ARTIFACT:-100000000}
2958
3012
  AI_PROVIDER_CAPABILITIES: \${AI_PROVIDER_CAPABILITIES:-text-generation}
2959
3013
  AI_PROVIDER_INPUT_MODALITIES: \${AI_PROVIDER_INPUT_MODALITIES:-text}
3014
+ AI_PROVIDER_DEPLOYMENT_IDENTITY: \${AI_PROVIDER_DEPLOYMENT_IDENTITY:-}
3015
+ AI_PROVIDER_RELEASE_DIGEST: \${AI_PROVIDER_RELEASE_DIGEST:-}
3016
+ AI_PROVIDER_READINESS_TTL_SECONDS: \${AI_PROVIDER_READINESS_TTL_SECONDS:-60}
3017
+ AI_PROVIDER_MAX_CONCURRENT_RUNS: \${AI_PROVIDER_MAX_CONCURRENT_RUNS:-1}
3018
+ AI_PROVIDER_MAX_QUEUE_DEPTH: \${AI_PROVIDER_MAX_QUEUE_DEPTH:-0}
2960
3019
  volumes:
2961
3020
  - agent-run-data:/app/data/agent
2962
3021
  depends_on:
@@ -2974,9 +3033,13 @@ var agentComposeService = ` tool-sandbox-init:
2974
3033
  DOCUMENT_SERVER_INTERNAL_TOKEN: \${AGENT_SERVER_INTERNAL_TOKEN:-}
2975
3034
  DOCUMENT_RUN_STORE_PATH: /app/data/document/runs.sqlite3
2976
3035
  DOCUMENT_ARTIFACT_URL: \${DOCUMENT_ARTIFACT_URL:-http://server:9747/api/internal/ai/artifacts}
3036
+ DOCUMENT_OUTPUT_ARTIFACT_URL: \${DOCUMENT_OUTPUT_ARTIFACT_URL:-http://server:9747/api/internal/ai/output-artifacts}
2977
3037
  DOCUMENT_ADAPTER_URL: \${DOCUMENT_ADAPTER_URL:-}
2978
3038
  DOCUMENT_ADAPTER_TOKEN: \${DOCUMENT_ADAPTER_TOKEN:-}
2979
3039
  DOCUMENT_DEPLOYMENT_KEY: \${DOCUMENT_DEPLOYMENT_KEY:-}
3040
+ DOCUMENT_DEPLOYMENT_IDENTITY: \${DOCUMENT_DEPLOYMENT_IDENTITY:-}
3041
+ DOCUMENT_RELEASE_DIGEST: \${DOCUMENT_RELEASE_DIGEST:-}
3042
+ DOCUMENT_OFFERS_DIGEST: \${DOCUMENT_OFFERS_DIGEST:-}
2980
3043
  DOCUMENT_ADAPTER_CAPABILITIES: \${DOCUMENT_ADAPTER_CAPABILITIES:-document.ocr,document.layout,document.table}
2981
3044
  DOCUMENT_MAX_UNITS: \${DOCUMENT_MAX_UNITS:-500}
2982
3045
  volumes:
@@ -2994,12 +3057,23 @@ var agentComposeService = ` tool-sandbox-init:
2994
3057
  SPEECH_SERVER_INTERNAL_TOKEN: \${AGENT_SERVER_INTERNAL_TOKEN:-}
2995
3058
  SPEECH_RUN_STORE_PATH: /app/data/speech/runs.sqlite3
2996
3059
  SPEECH_ARTIFACT_URL: \${SPEECH_ARTIFACT_URL:-http://server:9747/api/internal/ai/artifacts}
3060
+ SPEECH_OUTPUT_ARTIFACT_URL: \${SPEECH_OUTPUT_ARTIFACT_URL:-http://server:9747/api/internal/ai/output-artifacts}
2997
3061
  SPEECH_ADAPTER_URL: \${SPEECH_ADAPTER_URL:-}
2998
3062
  SPEECH_ADAPTER_TOKEN: \${SPEECH_ADAPTER_TOKEN:-}
2999
3063
  SPEECH_DEPLOYMENT_KEY: \${SPEECH_DEPLOYMENT_KEY:-}
3000
- SPEECH_ADAPTER_CAPABILITIES: \${SPEECH_ADAPTER_CAPABILITIES:-speech.transcribe.batch,speech.normalize,speech.vad,speech.timestamps}
3064
+ SPEECH_DEPLOYMENT_IDENTITY: \${SPEECH_DEPLOYMENT_IDENTITY:-}
3065
+ SPEECH_RELEASE_DIGEST: \${SPEECH_RELEASE_DIGEST:-}
3066
+ SPEECH_OFFERS_DIGEST: \${SPEECH_OFFERS_DIGEST:-}
3067
+ SPEECH_ADAPTER_CAPABILITIES: \${SPEECH_ADAPTER_CAPABILITIES:-speech.transcribe.batch,speech.translate,speech.vad,speech.timestamps}
3001
3068
  SPEECH_MAX_UNITS: \${SPEECH_MAX_UNITS:-100000}
3002
3069
  SPEECH_MAX_MEDIA_DURATION_SECONDS: \${SPEECH_MAX_MEDIA_DURATION_SECONDS:-86400}
3070
+ SPEECH_MAX_INPUT_ARTIFACT_BYTES: \${SPEECH_MAX_INPUT_ARTIFACT_BYTES:-2147483648}
3071
+ SPEECH_MAX_INLINE_OUTPUT_BYTES: \${SPEECH_MAX_INLINE_OUTPUT_BYTES:-67108864}
3072
+ SPEECH_MAX_OUTPUT_ARTIFACT_BYTES: \${SPEECH_MAX_OUTPUT_ARTIFACT_BYTES:-536870912}
3073
+ SPEECH_MAX_CONCURRENT_RUNS: \${SPEECH_MAX_CONCURRENT_RUNS:-1}
3074
+ SPEECH_MAX_QUEUE_DEPTH: \${SPEECH_MAX_QUEUE_DEPTH:-0}
3075
+ SPEECH_READINESS_TIMEOUT_SECONDS: \${SPEECH_READINESS_TIMEOUT_SECONDS:-5}
3076
+ SPEECH_READINESS_TTL_SECONDS: \${SPEECH_READINESS_TTL_SECONDS:-60}
3003
3077
  volumes:
3004
3078
  - speech-run-data:/app/data/speech
3005
3079
  depends_on:
@@ -3014,6 +3088,7 @@ var agentComposeService = ` tool-sandbox-init:
3014
3088
  environment:
3015
3089
  EMBEDDING_SERVER_INTERNAL_TOKEN: \${AGENT_SERVER_INTERNAL_TOKEN:-}
3016
3090
  EMBEDDING_ARTIFACT_URL: \${EMBEDDING_ARTIFACT_URL:-http://server:9747/api/internal/ai/artifacts}
3091
+ EMBEDDING_RUN_ARTIFACT_URL: \${EMBEDDING_RUN_ARTIFACT_URL:-http://server:9747/api/internal/embeddings/runs}
3017
3092
  EMBEDDING_ADAPTER_URL: \${EMBEDDING_ADAPTER_URL:-}
3018
3093
  EMBEDDING_ADAPTER_TOKEN: \${EMBEDDING_ADAPTER_TOKEN:-}
3019
3094
  EMBEDDING_DEPLOYMENT_KEY: \${EMBEDDING_DEPLOYMENT_KEY:-}
@@ -3024,15 +3099,20 @@ var agentComposeService = ` tool-sandbox-init:
3024
3099
  EMBEDDING_NORMALIZED: \${EMBEDDING_NORMALIZED:-true}
3025
3100
  EMBEDDING_CAPABILITIES: \${EMBEDDING_CAPABILITIES:-embedding.text}
3026
3101
  EMBEDDING_MAX_UNITS: \${EMBEDDING_MAX_UNITS:-256}
3102
+ EMBEDDING_RUN_ENCRYPTION_SECRET: \${EMBEDDING_RUN_ENCRYPTION_SECRET:-}
3103
+ EMBEDDING_MAX_CONCURRENT_RUNS: \${EMBEDDING_MAX_CONCURRENT_RUNS:-1}
3104
+ EMBEDDING_RUN_TERMINAL_TTL_SECONDS: \${EMBEDDING_RUN_TERMINAL_TTL_SECONDS:-604800}
3105
+ volumes:
3106
+ - embedding-run-data:/app/data/embedding
3027
3107
  depends_on:
3028
3108
  server:
3029
3109
  condition: service_started
3030
3110
 
3031
3111
  `;
3032
- function starterComposeFor(includeAgent, includeSearch = true) {
3112
+ function starterComposeFor(includeAgent, includeSearch = true, includeStorage = true) {
3033
3113
  return starterComposeBase.replace(` web:
3034
3114
  `, `${includeAgent ? agentComposeService : ""} web:
3035
- `).replace("__TOOL_SANDBOX_SERVER_ENV__", includeAgent ? " TOOL_SANDBOX_SOCKET: /run/windy-tool-sandbox/worker.sock" : "").replace("__TOOL_SANDBOX_SERVER_VOLUME__", includeAgent ? " - tool-sandbox-ipc:/run/windy-tool-sandbox" : "").replace("__OPENSEARCH_SERVER_ENV__", includeSearch ? ` OPENSEARCH_URL: \${OPENSEARCH_URL:-}
3115
+ `).replace("__TOOL_SANDBOX_SERVER_ENV__", includeAgent ? " TOOL_SANDBOX_SOCKET: /run/windy-tool-sandbox/worker.sock" : "").replace("__TOOL_SANDBOX_SERVER_VOLUME__", includeAgent ? " - tool-sandbox-ipc:/run/windy-tool-sandbox" : "").replace("__STORAGE_SERVER_ENV__", includeStorage ? " WINDY_STORAGE_ROOT: /app/data/storage" : "").replace("__STORAGE_SERVER_VOLUME__", includeStorage ? " - server-storage-data:/app/data/storage" : "").replace("__OPENSEARCH_SERVER_ENV__", includeSearch ? ` OPENSEARCH_URL: \${OPENSEARCH_URL:-}
3036
3116
  OPENSEARCH_USERNAME: \${OPENSEARCH_USERNAME:-}
3037
3117
  OPENSEARCH_PASSWORD: \${OPENSEARCH_PASSWORD:-}
3038
3118
  OPENSEARCH_WORK_ORDER_INDEX: \${OPENSEARCH_WORK_ORDER_INDEX:-windy-work-orders-v1}` : "").replace("__OPENSEARCH_SERVICE__", includeSearch ? openSearchComposeService : "").replace("__OPTIONAL_VOLUMES__", [
@@ -3040,16 +3120,23 @@ function starterComposeFor(includeAgent, includeSearch = true) {
3040
3120
  includeAgent ? " tool-sandbox-ipc:" : "",
3041
3121
  includeAgent ? " document-run-data:" : "",
3042
3122
  includeAgent ? " speech-run-data:" : "",
3043
- includeSearch ? " opensearch-data:" : ""
3123
+ includeAgent ? " embedding-run-data:" : "",
3124
+ includeSearch ? " opensearch-data:" : "",
3125
+ includeStorage ? " server-storage-data:" : ""
3044
3126
  ].filter(Boolean).join(`
3045
3127
  `));
3046
3128
  }
3047
3129
  var starterCompose = starterComposeFor(true);
3048
3130
  // src/runtime-environment-example.ts
3049
- function environmentExample(includeExample, includeAgent = true, includeSearch = true) {
3131
+ function environmentExample(includeExample, includeAgent = true, includeSearch = true, includeStorage = true) {
3050
3132
  return `# \u590D\u5236\u4E3A .env \u540E\u586B\u5199\u3002\u4E0D\u8981\u63D0\u4EA4\u771F\u5B9E\u5BC6\u7801\u3002
3051
3133
  POSTGRES_PASSWORD=
3052
3134
  WINDY_BOOTSTRAP_ADMIN_PASSWORD=
3135
+ ${includeStorage ? `
3136
+ # Compose \u9ED8\u8BA4\u628A Storage \u4E0E\u62A5\u544A\u6682\u5B58\u6301\u4E45\u5316\u5230 /app/data/storage\u3002
3137
+ # \u5982\u9700\u72EC\u7ACB\u6302\u8F7D\u62A5\u544A\u6682\u5B58\u76EE\u5F55\uFF0C\u8BF7\u540C\u65F6\u4FEE\u6539 Compose volume\u3002
3138
+ # WINDY_REPORT_STAGING_ROOT=/app/data/storage/report-staging
3139
+ ` : ""}
3053
3140
  ${includeAgent ? `
3054
3141
  # Agent profile \u4EC5\u7531\u670D\u52A1\u7AEF Agent Runtime \u8BFB\u53D6\uFF1B\u4E0D\u8981\u4F7F\u7528 VITE_ \u524D\u7F00\u3002
3055
3142
  # ADK Web \u901A\u8FC7 canonical Run API \u8C03\u8BD5\u9879\u76EE\u9009\u62E9\u7684\u771F\u5B9E\u6587\u672C Operation\uFF1B\u8C03\u8BD5 Token
@@ -3066,21 +3153,40 @@ OTEL_EXPORTER_OTLP_HEADERS=
3066
3153
  AI_ARTIFACT_ENCRYPTION_SECRET=
3067
3154
  DOCUMENT_SERVER_URL=
3068
3155
  DOCUMENT_ARTIFACT_URL=
3156
+ DOCUMENT_OUTPUT_ARTIFACT_URL=
3069
3157
  DOCUMENT_ADAPTER_URL=
3070
3158
  DOCUMENT_ADAPTER_TOKEN=
3071
3159
  DOCUMENT_DEPLOYMENT_KEY=
3160
+ DOCUMENT_DEPLOYMENT_IDENTITY=
3161
+ DOCUMENT_RELEASE_DIGEST=
3162
+ DOCUMENT_OFFERS_DIGEST=
3163
+ AI_OUTPUT_ARTIFACT_REFERENCE_SECRET=
3164
+ DOCUMENT_OUTPUT_ARTIFACT_SINK_IDENTITY=
3165
+ DOCUMENT_OUTPUT_ARTIFACT_SINK_RELEASE_DIGEST=
3072
3166
  # DOCUMENT_ADAPTER_CAPABILITIES=document.ocr,document.layout,document.table
3073
3167
  # DOCUMENT_MAX_UNITS=500
3074
3168
  SPEECH_SERVER_URL=
3075
3169
  SPEECH_ARTIFACT_URL=
3170
+ SPEECH_OUTPUT_ARTIFACT_URL=
3076
3171
  SPEECH_ADAPTER_URL=
3077
3172
  SPEECH_ADAPTER_TOKEN=
3078
3173
  SPEECH_DEPLOYMENT_KEY=
3079
- # SPEECH_ADAPTER_CAPABILITIES=speech.transcribe.batch,speech.normalize,speech.vad,speech.timestamps
3174
+ SPEECH_DEPLOYMENT_IDENTITY=
3175
+ SPEECH_RELEASE_DIGEST=
3176
+ SPEECH_OFFERS_DIGEST=
3177
+ # SPEECH_ADAPTER_CAPABILITIES=speech.transcribe.batch,speech.translate,speech.vad,speech.timestamps
3080
3178
  # SPEECH_MAX_UNITS=100000
3081
3179
  # SPEECH_MAX_MEDIA_DURATION_SECONDS=86400
3180
+ # SPEECH_MAX_INPUT_ARTIFACT_BYTES=2147483648
3181
+ # SPEECH_MAX_INLINE_OUTPUT_BYTES=67108864
3182
+ # SPEECH_MAX_OUTPUT_ARTIFACT_BYTES=536870912
3183
+ # SPEECH_MAX_CONCURRENT_RUNS=1
3184
+ # SPEECH_MAX_QUEUE_DEPTH=0
3185
+ # SPEECH_READINESS_TIMEOUT_SECONDS=5
3186
+ # SPEECH_READINESS_TTL_SECONDS=60
3082
3187
  EMBEDDING_SERVER_URL=
3083
3188
  EMBEDDING_ARTIFACT_URL=
3189
+ EMBEDDING_RUN_ARTIFACT_URL=
3084
3190
  EMBEDDING_ADAPTER_URL=
3085
3191
  EMBEDDING_ADAPTER_TOKEN=
3086
3192
  EMBEDDING_DEPLOYMENT_KEY=
@@ -3091,6 +3197,9 @@ EMBEDDING_DIMENSIONS=
3091
3197
  # EMBEDDING_NORMALIZED=true
3092
3198
  # EMBEDDING_CAPABILITIES=embedding.text,embedding.image
3093
3199
  # EMBEDDING_MAX_UNITS=256
3200
+ EMBEDDING_RUN_ENCRYPTION_SECRET=
3201
+ # EMBEDDING_MAX_CONCURRENT_RUNS=1
3202
+ # EMBEDDING_RUN_TERMINAL_TTL_SECONDS=604800
3094
3203
  QWEN_API_URL=
3095
3204
  QWEN_API_KEY=
3096
3205
  QWEN_MODEL=
@@ -3098,10 +3207,19 @@ AI_PROVIDER_HTTPS_HOST_ALLOWLIST=
3098
3207
  # VLM Deployment \u793A\u4F8B\uFF1Atext-generation,vision\uFF1B\u8F93\u5165\u6A21\u6001\uFF1Atext,image
3099
3208
  # AI_PROVIDER_CAPABILITIES=text-generation
3100
3209
  # AI_PROVIDER_INPUT_MODALITIES=text
3210
+ # AI_PROVIDER_DEPLOYMENT_IDENTITY=
3211
+ # AI_PROVIDER_RELEASE_DIGEST=
3212
+ # AI_PROVIDER_READINESS_TTL_SECONDS=60
3213
+ # AI_PROVIDER_MAX_CONCURRENT_RUNS=1
3214
+ # AI_PROVIDER_MAX_QUEUE_DEPTH=0
3101
3215
  # AI_PROVIDER_AUDIT_RETENTION_DAYS=90
3102
3216
  # AI_PROVIDER_CONNECT_TIMEOUT_MS=5000
3103
3217
  # AI_PROVIDER_REQUEST_TIMEOUT_MS=60000
3104
3218
  # AI_PROVIDER_MAX_RESPONSE_BYTES=2097152
3219
+ # AI_PROVIDER_MAX_DURATION_SECONDS=300
3220
+ # AI_PROVIDER_MAX_INPUT_BYTES=67108864
3221
+ # AI_PROVIDER_MAX_ARTIFACTS=16
3222
+ # AI_PROVIDER_MAX_PIXELS_PER_ARTIFACT=100000000
3105
3223
  ` : ""}
3106
3224
 
3107
3225
  ${includeSearch ? `# OpenSearch profile \u9ED8\u8BA4\u4E0D\u542F\u52A8\uFF1Bbun run dev:search \u4F1A\u53EA\u5411 Server \u6CE8\u5165\u5BB9\u5668\u5185\u5730\u5740\u3002
@@ -3120,8 +3238,8 @@ OPENSEARCH_PASSWORD=
3120
3238
  ` : ""}
3121
3239
  `;
3122
3240
  }
3123
- // src/project-files.ts
3124
- function starterDocsReadme(includeOfflineLicense = true, includeAgent = true, includeOperations = true) {
3241
+ // src/starter-docs-readme.ts
3242
+ function starterDocsReadme(includeOfflineLicense = true, includeAgent = true, includeOperations = true, includeStorage = true) {
3125
3243
  return `# Windy Starter \u6587\u6863
3126
3244
 
3127
3245
  \u672C\u76EE\u5F55\u53EA\u5305\u542B\u5BA2\u6237\u8FD0\u884C\u9879\u76EE\u9700\u8981\u7684\u5E73\u53F0\u67B6\u6784\u3001\u5F00\u53D1\u63A5\u5165\u548C\u8FD0\u7EF4\u53EF\u89C2\u6D4B\u6027\u6587\u6863\u3002
@@ -3129,17 +3247,20 @@ License \u7B7E\u53D1\u4E2D\u5FC3\u3001\u72EC\u7ACB\u7B7E\u540D\u670D\u52A1\u3001
3129
3247
  \u89C4\u5212\u5C5E\u4E8E\u8F6F\u4EF6\u4F9B\u5E94\u65B9\u63A7\u5236\u9762\uFF0C\u4E0D\u8FDB\u5165\u5BA2\u6237 Starter\u3002
3130
3248
 
3131
3249
  - \u67B6\u6784\uFF1A\u4ECE [Module Manifest \u7EC4\u5408](./architecture/module-manifest-composition.md) \u5F00\u59CB\u3002
3250
+ - \u5916\u90E8\u51ED\u636E\uFF1A[\u6A21\u5757 Secret \u89E3\u6790 Port](./architecture/module-secret-resolution.md)\u3002
3132
3251
  - \u6570\u636E\u5E93\uFF1A\u4E1A\u52A1\u8868\u4F7F\u7528 [Migration Bundle \u4E0E\u72EC\u7ACB Drizzle lineage](./architecture/migration-bundle.md)\u3002
3133
3252
  - \u5E73\u53F0\u5F00\u53D1\uFF1A\u4ECE [\u7CFB\u7EDF CRUD API](./platform/system-crud-api.md) \u548C [CRUD \u751F\u6210\u5668](./development/crud-generator.md) \u5F00\u59CB\u3002
3134
3253
  - Web \u4E1A\u52A1\u9875\u9762\uFF1A[project-owned \u4E1A\u52A1 Web \u8DEF\u7531](./development/business-web-routes.md)\u3002
3135
3254
  - \u90E8\u7F72\u671F\u6A21\u5757\u7BA1\u7406\uFF1A[\u6A21\u5757\u751F\u547D\u5468\u671F](./development/module-lifecycle.md)\u3002
3136
3255
  - \u4E1A\u52A1\u6A21\u5757\u5F00\u53D1\uFF1A[windy-business-module Skill](../.agents/skills/windy-business-module/SKILL.md)\u3002
3256
+ ${includeStorage ? "- \u5927\u62A5\u544A\u5BFC\u5165\uFF1A[\u53D7\u6CBB\u7406\u7684\u5927\u62A5\u544A\u6682\u5B58](./architecture/report-staging.md)\u3002" : ""}
3137
3257
  ${includeOfflineLicense ? "- License \u6D88\u8D39\u7AEF\uFF1A[\u79BB\u7EBF\u6FC0\u6D3B\u4E0E\u5B89\u88C5\u534F\u8BAE](./license/license-offline-activation-code.md)\uFF1B\u8FD0\u884C\u65F6\u80FD\u529B\u7531 npm \u4F9D\u8D56 `@southwind-ai/license` \u63D0\u4F9B\u3002" : ""}
3138
3258
  - \u8FD0\u7EF4\uFF1A[\u53EF\u89C2\u6D4B\u6027](./operations/observability.md)${includeOperations ? " \u4E0E [\u8FD0\u7EF4\u603B\u89C8](./platform/operations-overview.md)" : ""}\u3002
3139
3259
  ${includeAgent ? "- Agent\u3001\u591A\u6A21\u6001 Runtime \u4E0E MCP\uFF1A[Agent Runtime \u63A5\u5165](./platform/agent-runtime.md)\u3001[Document AI Runtime](./platform/document-ai-runtime.md)\u3001[Speech AI Runtime](./platform/speech-ai-runtime.md)\u3001[\u53D7\u63A7\u5DE5\u5177](./platform/agent-tools.md)\u4E0E[MCP \u4E1A\u52A1\u80FD\u529B](./architecture/mcp-business-capabilities.md)\u3002" : ""}
3140
3260
  - \u517C\u5BB9\uFF1A[RuoYi-Vue Adapter](./adapters/ruoyi-vue-compatibility.md)\u3002
3141
3261
  `;
3142
3262
  }
3263
+ // src/project-files.ts
3143
3264
  function starterReadme(projectName, includeExample = true, includeOxc = true, projectLicense = "UNLICENSED", selectedModules = []) {
3144
3265
  const selected = new Set(selectedModules);
3145
3266
  const includeAgent = selected.has("system.agent");
@@ -3438,6 +3559,8 @@ function createStarterPackage(source, projectName, includeOxc = true, projectLic
3438
3559
  } : {},
3439
3560
  ...selectedModules.includes("system.agent") ? {
3440
3561
  "dev:agent": "docker compose --profile agent up --build",
3562
+ "dev:speech": "PLATFORM_ENABLE_AI=true SPEECH_SERVER_URL=http://speech-server:8091 docker compose --profile agent --profile speech up --build",
3563
+ "speech:pins": "bun run scripts/provision-speech-readiness.ts",
3441
3564
  "dev:adk-web": "bun run scripts/dev-adk-web.ts"
3442
3565
  } : {},
3443
3566
  ...generatorVersion ? { windy: "create-windy" } : {},
@@ -3452,6 +3575,7 @@ function createStarterPackage(source, projectName, includeOxc = true, projectLic
3452
3575
  "bun run --cwd apps/server typecheck",
3453
3576
  "bun run --cwd packages/ai-client typecheck",
3454
3577
  "bun run --cwd packages/jobs typecheck",
3578
+ "bun run --cwd packages/shared typecheck",
3455
3579
  "bun run --cwd packages/server-sdk typecheck",
3456
3580
  "bun run --cwd packages/storage typecheck",
3457
3581
  "bun run --cwd packages/database typecheck",
@@ -3488,7 +3612,8 @@ var templateRootFiles = [
3488
3612
  "package.json",
3489
3613
  "scripts/notification-postgres-regression.ts",
3490
3614
  "scripts/lib/postgres-regression.ts",
3491
- "scripts/dev-adk-web.ts"
3615
+ "scripts/dev-adk-web.ts",
3616
+ "scripts/provision-speech-readiness.ts"
3492
3617
  ];
3493
3618
  var templateDirectories = [
3494
3619
  ".agents/skills/windy-business-module",
@@ -3515,6 +3640,7 @@ var templateDocumentationFiles = [
3515
3640
  "docs/architecture/admin-surface-boundary.md",
3516
3641
  "docs/architecture/ai-egress.md",
3517
3642
  "docs/architecture/ai-runtime.md",
3643
+ "docs/architecture/ai-runtime-readiness.md",
3518
3644
  "docs/architecture/data-scope-query-enforcement.md",
3519
3645
  "docs/architecture/durable-jobs.md",
3520
3646
  "docs/architecture/foundation-infrastructure.md",
@@ -3523,8 +3649,11 @@ var templateDocumentationFiles = [
3523
3649
  "docs/architecture/migration-bundle.md",
3524
3650
  "docs/architecture/module-host.md",
3525
3651
  "docs/architecture/module-manifest-composition.md",
3652
+ "docs/architecture/module-secret-resolution.md",
3526
3653
  "docs/architecture/object-storage.md",
3654
+ "docs/architecture/report-staging.md",
3527
3655
  "docs/architecture/search-provider-protocol.md",
3656
+ "docs/architecture/speech-variants.md",
3528
3657
  "docs/architecture/server-module-interface.md",
3529
3658
  "docs/architecture/web-access-snapshot-resilience.md",
3530
3659
  "docs/development/business-web-routes.md",
@@ -3674,8 +3803,8 @@ function isGenerationProvenance(value) {
3674
3803
  function isModuleVersion(value) {
3675
3804
  if (!value || typeof value !== "object")
3676
3805
  return false;
3677
- const module3 = value;
3678
- return typeof module3.name === "string" && module3.name.length > 0 && typeof module3.version === "string" && module3.version.length > 0;
3806
+ const module2 = value;
3807
+ return typeof module2.name === "string" && module2.name.length > 0 && typeof module2.version === "string" && module2.version.length > 0;
3679
3808
  }
3680
3809
 
3681
3810
  // src/registry-dependencies.ts
@@ -3876,10 +4005,10 @@ async function generateProject(input) {
3876
4005
  const packageJson = JSON.parse(await readFile10(packagePath, "utf8"));
3877
4006
  await writeFile9(packagePath, `${JSON.stringify(createStarterPackage(packageJson, input.projectName, includeOxc, projectLicense, selectedModules, templateMetadata.generatorVersion), null, 2)}
3878
4007
  `);
3879
- await writeFile9(join11(input.targetDirectory, "docker-compose.yml"), starterComposeFor(selectedModules.includes("system.agent"), selectedModules.includes("system.search")));
3880
- await writeFile9(join11(input.targetDirectory, ".env.example"), environmentExample(includeExample, selectedModules.includes("system.agent"), selectedModules.includes("system.search")));
4008
+ await writeFile9(join11(input.targetDirectory, "docker-compose.yml"), starterComposeFor(selectedModules.includes("system.agent"), selectedModules.includes("system.search"), selectedModules.includes("system.storage")));
4009
+ await writeFile9(join11(input.targetDirectory, ".env.example"), environmentExample(includeExample, selectedModules.includes("system.agent"), selectedModules.includes("system.search"), selectedModules.includes("system.storage")));
3881
4010
  await writeFile9(join11(input.targetDirectory, "README.md"), starterReadme(input.projectName, includeExample, includeOxc, projectLicense, selectedModules));
3882
- await writeFile9(join11(input.targetDirectory, "docs/README.md"), starterDocsReadme(selectedModules.includes("system.license"), selectedModules.includes("system.agent"), selectedModules.includes("system.operations")));
4011
+ await writeFile9(join11(input.targetDirectory, "docs/README.md"), starterDocsReadme(selectedModules.includes("system.license"), selectedModules.includes("system.agent"), selectedModules.includes("system.operations"), selectedModules.includes("system.storage")));
3883
4012
  await reflectCodeQualityChoice(input.targetDirectory, includeOxc);
3884
4013
  await applyWindyBaseLicense(input.targetDirectory);
3885
4014
  await applyProjectLicense(input.targetDirectory, projectLicense, input.licenseHolder);
@@ -7589,6 +7718,11 @@ var recipes = [
7589
7718
  id: "starter-0.5.1-to-0.5.2",
7590
7719
  from: "0.5.1",
7591
7720
  to: "0.5.2"
7721
+ },
7722
+ {
7723
+ id: "starter-0.5.2-to-0.6.0",
7724
+ from: "0.5.2",
7725
+ to: "0.6.0"
7592
7726
  }
7593
7727
  ];
7594
7728
  function resolveRecipeChain(sourceVersion, targetVersion) {
@@ -9156,7 +9290,7 @@ var oxcManagedPaths = new Set([
9156
9290
  ".oxlintrc.json",
9157
9291
  ".husky/pre-commit"
9158
9292
  ]);
9159
- async function createUpdatePlan(request, artifacts) {
9293
+ async function createUpdatePlan(request, artifacts, dependencies = {}) {
9160
9294
  await assertProjectReadyForUpdate(request.projectDirectory);
9161
9295
  const manifestPath = join25(request.projectDirectory, ".windy/files.json");
9162
9296
  const expectedManifestHash = hashContent(await readFile21(manifestPath));
@@ -9169,7 +9303,7 @@ async function createUpdatePlan(request, artifacts) {
9169
9303
  if (targetVersion !== targetProvenance.generatorVersion) {
9170
9304
  throw new Error(`\u5F53\u524D CLI \u53EA\u80FD\u66F4\u65B0\u5230 ${targetProvenance.generatorVersion}\uFF0C\u8BF7\u8FD0\u884C create-windy@${targetVersion}`);
9171
9305
  }
9172
- const versionRecipes = resolveRecipeChain(provenance.windyVersion, targetVersion);
9306
+ const versionRecipes = (dependencies.resolveVersionRecipes ?? resolveRecipeChain)(provenance.windyVersion, targetVersion);
9173
9307
  const moduleRecipes = resolveModuleRecipeIds(request);
9174
9308
  const recipes2 = [...versionRecipes.map(({ id }) => id), ...moduleRecipes];
9175
9309
  const [rawSourceManifest, rawTargetManifest] = await Promise.all([
@@ -10364,7 +10498,7 @@ async function runUpdate(args, projectDirectory) {
10364
10498
  console.log(recipes2.length ? `\u53EF\u66F4\u65B0\uFF1A${current.windyVersion} \u2192 ${target}\uFF08${recipes2.length} \u4E2A\u8FDE\u7EED recipe\uFF09` : `\u5DF2\u662F\u5F53\u524D CLI \u652F\u6301\u7684\u6700\u65B0\u7248\u672C ${current.windyVersion}`);
10365
10499
  return;
10366
10500
  }
10367
- if (!recipes2.length) {
10501
+ if (!recipes2.length && current.templateCommit === template.templateCommit) {
10368
10502
  console.log(`\u9879\u76EE\u5DF2\u7ECF\u662F ${target}\uFF0C\u65E0\u9700\u66F4\u65B0`);
10369
10503
  return;
10370
10504
  }
@@ -10554,8 +10688,8 @@ function isPlatform(value) {
10554
10688
  function isModule(value) {
10555
10689
  if (!value || typeof value !== "object")
10556
10690
  return false;
10557
- const module3 = value;
10558
- return typeof module3.key === "string" && /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$/.test(module3.key) && isStringList(module3.schema) && typeof module3.out === "string" && isStringList(module3.legacyPlatformTables) && module3.legacyPlatformTables.every(isTableName);
10691
+ const module2 = value;
10692
+ return typeof module2.key === "string" && /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$/.test(module2.key) && isStringList(module2.schema) && typeof module2.out === "string" && isStringList(module2.legacyPlatformTables) && module2.legacyPlatformTables.every(isTableName);
10559
10693
  }
10560
10694
  function isStringList(value) {
10561
10695
  return Array.isArray(value) && value.length > 0 && value.every((item) => typeof item === "string" && item.length > 0);
@@ -10572,10 +10706,10 @@ function validatePaths(projectDirectory, config) {
10572
10706
  resolveProjectPath(projectDirectory, path2);
10573
10707
  }
10574
10708
  const platformOut = resolveProjectPath(projectDirectory, config.platform.out);
10575
- for (const module3 of config.modules) {
10576
- const moduleOut = resolveProjectPath(projectDirectory, module3.out);
10709
+ for (const module2 of config.modules) {
10710
+ const moduleOut = resolveProjectPath(projectDirectory, module2.out);
10577
10711
  if (moduleOut === platformOut || moduleOut.startsWith(`${platformOut}/`) || platformOut.startsWith(`${moduleOut}/`)) {
10578
- throw new Error(`${module3.key} \u7684 lineage \u8F93\u51FA\u4E0D\u80FD\u4E0E\u5E73\u53F0\u76EE\u5F55\u91CD\u53E0`);
10712
+ throw new Error(`${module2.key} \u7684 lineage \u8F93\u51FA\u4E0D\u80FD\u4E0E\u5E73\u53F0\u76EE\u5F55\u91CD\u53E0`);
10579
10713
  }
10580
10714
  }
10581
10715
  }
@@ -10583,14 +10717,14 @@ function validateUniqueness(config) {
10583
10717
  const keys = new Set;
10584
10718
  const outputs = new Set;
10585
10719
  const tables = new Set;
10586
- for (const module3 of config.modules) {
10587
- if (keys.has(module3.key))
10588
- throw new Error(`Module key \u91CD\u590D\uFF1A${module3.key}`);
10589
- if (outputs.has(module3.out))
10590
- throw new Error(`Module lineage \u8F93\u51FA\u91CD\u590D\uFF1A${module3.out}`);
10591
- keys.add(module3.key);
10592
- outputs.add(module3.out);
10593
- for (const table of module3.legacyPlatformTables) {
10720
+ for (const module2 of config.modules) {
10721
+ if (keys.has(module2.key))
10722
+ throw new Error(`Module key \u91CD\u590D\uFF1A${module2.key}`);
10723
+ if (outputs.has(module2.out))
10724
+ throw new Error(`Module lineage \u8F93\u51FA\u91CD\u590D\uFF1A${module2.out}`);
10725
+ keys.add(module2.key);
10726
+ outputs.add(module2.out);
10727
+ for (const table of module2.legacyPlatformTables) {
10594
10728
  if (tables.has(table))
10595
10729
  throw new Error(`\u65E7\u5E73\u53F0\u8868\u91CD\u590D\u58F0\u660E\uFF1A${table}`);
10596
10730
  tables.add(table);
@@ -10646,27 +10780,27 @@ async function handoffModuleSchemaLineages(options) {
10646
10780
  }
10647
10781
  return {
10648
10782
  moduleCount: config.modules.length,
10649
- tableCount: config.modules.reduce((total, module3) => total + module3.legacyPlatformTables.length, 0)
10783
+ tableCount: config.modules.reduce((total, module2) => total + module2.legacyPlatformTables.length, 0)
10650
10784
  };
10651
10785
  }
10652
10786
  async function stageModuleLineages(project, temporaryRoot, config, execute) {
10653
10787
  const outputs = [];
10654
- for (const [index, module3] of config.modules.entries()) {
10788
+ for (const [index, module2] of config.modules.entries()) {
10655
10789
  const output = join28(temporaryRoot, `module-${index}`);
10656
10790
  await mkdir9(output, { recursive: true });
10657
10791
  const generatedConfig = join28(temporaryRoot, `module-${index}.config.ts`);
10658
- await writeDrizzleConfig(generatedConfig, project, module3.schema, relative6(temporaryRoot, output));
10792
+ await writeDrizzleConfig(generatedConfig, project, module2.schema, relative6(temporaryRoot, output));
10659
10793
  await execute(generatedConfig, temporaryRoot);
10660
10794
  const sqlFiles = await listSqlFiles(output);
10661
10795
  if (sqlFiles.length !== 1) {
10662
- throw new Error(`${module3.key} baseline \u5FC5\u987B\u6070\u597D\u751F\u6210\u4E00\u4E2A migration`);
10796
+ throw new Error(`${module2.key} baseline \u5FC5\u987B\u6070\u597D\u751F\u6210\u4E00\u4E2A migration`);
10663
10797
  }
10664
10798
  await writeFile14(join28(output, sqlFiles[0]), metadataOnlySql("module"));
10665
10799
  await writeFile14(join28(output, "lineage.json"), `${JSON.stringify({
10666
10800
  schemaVersion: 1,
10667
- moduleKey: module3.key,
10668
- schema: module3.schema,
10669
- legacyPlatformTables: module3.legacyPlatformTables,
10801
+ moduleKey: module2.key,
10802
+ schema: module2.schema,
10803
+ legacyPlatformTables: module2.legacyPlatformTables,
10670
10804
  productionExecutor: "module-migration-bundle"
10671
10805
  }, null, 2)}
10672
10806
  `);
@@ -10699,10 +10833,10 @@ async function installStagedLineages(project, temporaryRoot, config, stagedModul
10699
10833
  await rename2(platform, backup);
10700
10834
  try {
10701
10835
  await rename2(stagedPlatform, platform);
10702
- for (const [index, module3] of config.modules.entries()) {
10703
- const output = resolveProjectPath(project, module3.out);
10836
+ for (const [index, module2] of config.modules.entries()) {
10837
+ const output = resolveProjectPath(project, module2.out);
10704
10838
  if (await exists(output)) {
10705
- throw new Error(`${module3.key} lineage \u8F93\u51FA\u5DF2\u5B58\u5728\uFF0C\u7981\u6B62\u8986\u76D6`);
10839
+ throw new Error(`${module2.key} lineage \u8F93\u51FA\u5DF2\u5B58\u5728\uFF0C\u7981\u6B62\u8986\u76D6`);
10706
10840
  }
10707
10841
  await mkdir9(dirname9(output), { recursive: true });
10708
10842
  await rename2(stagedModules[index], output);
@@ -10734,9 +10868,9 @@ async function validateSchemaSources(project, config) {
10734
10868
  ]) {
10735
10869
  await access3(resolveProjectPath(project, schema));
10736
10870
  }
10737
- for (const module3 of config.modules) {
10738
- if (await exists(resolveProjectPath(project, module3.out))) {
10739
- throw new Error(`${module3.key} lineage \u8F93\u51FA\u5DF2\u5B58\u5728\uFF0C\u7981\u6B62\u8986\u76D6`);
10871
+ for (const module2 of config.modules) {
10872
+ if (await exists(resolveProjectPath(project, module2.out))) {
10873
+ throw new Error(`${module2.key} lineage \u8F93\u51FA\u5DF2\u5B58\u5728\uFF0C\u7981\u6B62\u8986\u76D6`);
10740
10874
  }
10741
10875
  }
10742
10876
  }