create-windy 0.8.3 → 0.9.1

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 (505) hide show
  1. package/dist/cli.js +838 -560
  2. package/package.json +1 -1
  3. package/template/.windy-template.json +2 -2
  4. package/template/apps/agent-server/Dockerfile +92 -22
  5. package/template/apps/agent-server/README.md +47 -85
  6. package/template/apps/agent-server/documents/office.py +216 -0
  7. package/template/apps/agent-server/documents/query_report.py +136 -0
  8. package/template/apps/agent-server/documents/smoke.py +177 -0
  9. package/template/apps/agent-server/documents/test_boundaries.py +185 -0
  10. package/template/apps/agent-server/host-contracts.ts +56 -0
  11. package/template/apps/agent-server/install-native.ts +167 -0
  12. package/template/apps/agent-server/main.ts +179 -0
  13. package/template/apps/agent-server/native/EXTENSIONS.md +46 -0
  14. package/template/apps/agent-server/native/admission.ts +73 -0
  15. package/template/apps/agent-server/native/authorization.test.ts +176 -0
  16. package/template/apps/agent-server/native/authorization.ts +118 -0
  17. package/template/apps/agent-server/native/boundary-io.ts +93 -0
  18. package/template/apps/agent-server/native/boundary-product.ts +107 -0
  19. package/template/apps/agent-server/native/boundary-project.test.ts +247 -0
  20. package/template/apps/agent-server/native/boundary-project.ts +188 -0
  21. package/template/apps/agent-server/native/boundary.ts +188 -0
  22. package/template/apps/agent-server/native/compaction-policy.test.ts +175 -0
  23. package/template/apps/agent-server/native/config.ts +95 -0
  24. package/template/apps/agent-server/native/conversation-instructions.ts +9 -0
  25. package/template/apps/agent-server/native/extensions.test.ts +190 -0
  26. package/template/apps/agent-server/native/extensions.ts +31 -0
  27. package/template/apps/agent-server/native/host-profile.test.ts +91 -0
  28. package/template/apps/agent-server/native/host-profile.ts +33 -0
  29. package/template/apps/agent-server/native/host-test-fixture.ts +13 -0
  30. package/template/apps/agent-server/native/http.ts +129 -0
  31. package/template/apps/agent-server/native/lifecycle.test.ts +285 -0
  32. package/template/apps/agent-server/native/lifecycle.ts +136 -0
  33. package/template/apps/agent-server/native/manager.ts +292 -0
  34. package/template/apps/agent-server/native/native.test.ts +207 -0
  35. package/template/apps/agent-server/native/office-preview.test.ts +50 -0
  36. package/template/apps/agent-server/native/office-preview.ts +25 -0
  37. package/template/apps/agent-server/native/parallel-harness.ts +242 -0
  38. package/template/apps/agent-server/native/parallel-mcp-fixture.ts +97 -0
  39. package/template/apps/agent-server/native/parallel.test.ts +256 -0
  40. package/template/apps/agent-server/native/profile-composition.test.ts +147 -0
  41. package/template/apps/agent-server/native/profile.ts +307 -0
  42. package/template/apps/agent-server/native/request.ts +61 -0
  43. package/template/apps/agent-server/native/session-conflict.test.ts +235 -0
  44. package/template/apps/agent-server/native/session-conflict.ts +21 -0
  45. package/template/apps/agent-server/native/shared-skills.test.ts +128 -0
  46. package/template/apps/agent-server/native/shared-skills.ts +240 -0
  47. package/template/apps/agent-server/native/socket-lifecycle.test.ts +48 -0
  48. package/template/apps/agent-server/native/socket.ts +130 -0
  49. package/template/apps/agent-server/native/storage-lifecycle.test.ts +217 -0
  50. package/template/apps/agent-server/native/storage.ts +188 -0
  51. package/template/apps/agent-server/native/stream-authorization.test.ts +89 -0
  52. package/template/apps/agent-server/native/worker.ts +77 -0
  53. package/template/apps/agent-server/native-download.test.ts +119 -0
  54. package/template/apps/agent-server/native-download.ts +145 -0
  55. package/template/apps/agent-server/package.json +63 -0
  56. package/template/apps/agent-server/plugins/access.mjs +126 -0
  57. package/template/apps/agent-server/plugins/branding/README.md +9 -0
  58. package/template/apps/agent-server/plugins/branding/brand.css +85 -0
  59. package/template/apps/agent-server/plugins/branding/client.js +338 -0
  60. package/template/apps/agent-server/plugins/branding/index.mjs +35 -0
  61. package/template/apps/agent-server/plugins/branding/loading.d.mts +2 -0
  62. package/template/apps/agent-server/plugins/branding/loading.mjs +66 -0
  63. package/template/apps/agent-server/plugins/branding/loading.test.ts +89 -0
  64. package/template/apps/agent-server/plugins/branding/package.json +21 -0
  65. package/template/apps/agent-server/plugins/branding.test.ts +294 -0
  66. package/template/apps/agent-server/plugins/compaction.mjs +83 -0
  67. package/template/apps/agent-server/plugins/compaction.test.ts +91 -0
  68. package/template/apps/agent-server/plugins/confine-network.py +57 -0
  69. package/template/apps/agent-server/plugins/default-skills.test.ts +62 -0
  70. package/template/apps/agent-server/plugins/downloads/README.md +28 -0
  71. package/template/apps/agent-server/plugins/downloads/client.js +126 -0
  72. package/template/apps/agent-server/plugins/downloads/downloads.test.ts +222 -0
  73. package/template/apps/agent-server/plugins/downloads/index.d.mts +19 -0
  74. package/template/apps/agent-server/plugins/downloads/index.mjs +180 -0
  75. package/template/apps/agent-server/plugins/downloads/package.json +20 -0
  76. package/template/apps/agent-server/plugins/drop-overlay/README.md +24 -0
  77. package/template/apps/agent-server/plugins/drop-overlay/drop-overlay.test.ts +199 -0
  78. package/template/apps/agent-server/plugins/drop-overlay/index.d.mts +8 -0
  79. package/template/apps/agent-server/plugins/drop-overlay/index.mjs +12 -0
  80. package/template/apps/agent-server/plugins/drop-overlay/style.css +102 -0
  81. package/template/apps/agent-server/plugins/locale/client.js +61 -0
  82. package/template/apps/agent-server/plugins/locale/index.d.mts +9 -0
  83. package/template/apps/agent-server/plugins/locale/index.mjs +16 -0
  84. package/template/apps/agent-server/plugins/locale/locale.test.ts +217 -0
  85. package/template/apps/agent-server/plugins/locale/package.json +19 -0
  86. package/template/apps/agent-server/plugins/parallel.mjs +146 -0
  87. package/template/apps/agent-server/plugins/preset-registry.d.mts +2 -0
  88. package/template/apps/agent-server/plugins/preset-registry.mjs +41 -0
  89. package/template/apps/agent-server/plugins/preset-registry.test.ts +46 -0
  90. package/template/apps/agent-server/plugins/questions.d.mts +25 -0
  91. package/template/apps/agent-server/plugins/questions.mjs +142 -0
  92. package/template/apps/agent-server/plugins/questions.test.ts +105 -0
  93. package/template/apps/agent-server/plugins/settings/README.md +17 -0
  94. package/template/apps/agent-server/plugins/settings/client.js +102 -0
  95. package/template/apps/agent-server/plugins/settings/index.mjs +17 -0
  96. package/template/apps/agent-server/plugins/settings/package.json +19 -0
  97. package/template/apps/agent-server/plugins/settings/settings.test.ts +129 -0
  98. package/template/apps/agent-server/plugins/settings-controller.d.mts +4 -0
  99. package/template/apps/agent-server/plugins/settings-controller.mjs +31 -0
  100. package/template/apps/agent-server/plugins/settings-controller.test.ts +17 -0
  101. package/template/apps/agent-server/plugins/settings-dispatch.test.ts +34 -0
  102. package/template/apps/agent-server/plugins/shared-skills.d.mts +15 -0
  103. package/template/apps/agent-server/plugins/shared-skills.mjs +82 -0
  104. package/template/apps/agent-server/plugins/shared-skills.test.ts +51 -0
  105. package/template/apps/agent-server/plugins/skill-library/README.md +11 -0
  106. package/template/apps/agent-server/plugins/skill-library/archive.test.ts +43 -0
  107. package/template/apps/agent-server/plugins/skill-library/bundle.mjs +234 -0
  108. package/template/apps/agent-server/plugins/skill-library/client-chunks.test.ts +107 -0
  109. package/template/apps/agent-server/plugins/skill-library/client-form-mount.test.ts +139 -0
  110. package/template/apps/agent-server/plugins/skill-library/client-form.test.ts +261 -0
  111. package/template/apps/agent-server/plugins/skill-library/client-ui.test.ts +268 -0
  112. package/template/apps/agent-server/plugins/skill-library/client-use.test.ts +158 -0
  113. package/template/apps/agent-server/plugins/skill-library/client.editor.js +93 -0
  114. package/template/apps/agent-server/plugins/skill-library/client.form.js +316 -0
  115. package/template/apps/agent-server/plugins/skill-library/client.js +348 -0
  116. package/template/apps/agent-server/plugins/skill-library/client.request.js +52 -0
  117. package/template/apps/agent-server/plugins/skill-library/client.transfer.js +48 -0
  118. package/template/apps/agent-server/plugins/skill-library/client.use.js +46 -0
  119. package/template/apps/agent-server/plugins/skill-library/default-roots.test.ts +84 -0
  120. package/template/apps/agent-server/plugins/skill-library/draft.d.mts +17 -0
  121. package/template/apps/agent-server/plugins/skill-library/draft.mjs +152 -0
  122. package/template/apps/agent-server/plugins/skill-library/draft.test.ts +287 -0
  123. package/template/apps/agent-server/plugins/skill-library/index.d.mts +49 -0
  124. package/template/apps/agent-server/plugins/skill-library/index.mjs +226 -0
  125. package/template/apps/agent-server/plugins/skill-library/package.json +24 -0
  126. package/template/apps/agent-server/plugins/skill-library/presentation/README.md +27 -0
  127. package/template/apps/agent-server/plugins/skill-library/presentation/UPSTREAM.md +54 -0
  128. package/template/apps/agent-server/plugins/skill-library/presentation/boot.test.ts +150 -0
  129. package/template/apps/agent-server/plugins/skill-library/presentation/client.js +146 -0
  130. package/template/apps/agent-server/plugins/skill-library/presentation/client.test.ts +195 -0
  131. package/template/apps/agent-server/plugins/skill-library/presentation/index.d.mts +9 -0
  132. package/template/apps/agent-server/plugins/skill-library/presentation/index.mjs +30 -0
  133. package/template/apps/agent-server/plugins/skill-library/presentation/metadata.test.ts +82 -0
  134. package/template/apps/agent-server/plugins/skill-library/presentation/package.json +21 -0
  135. package/template/apps/agent-server/plugins/skill-library/presentation/react-boot.test.ts +162 -0
  136. package/template/apps/agent-server/plugins/skill-library/skills.test.ts +342 -0
  137. package/template/apps/agent-server/plugins/skill-library/storage.mjs +293 -0
  138. package/template/apps/agent-server/plugins/skill-library/style.css +229 -0
  139. package/template/apps/agent-server/plugins/skill-library/test-fixture.ts +77 -0
  140. package/template/apps/agent-server/plugins/skill-library/workflow.d.mts +18 -0
  141. package/template/apps/agent-server/plugins/skill-library/workflow.mjs +189 -0
  142. package/template/apps/agent-server/plugins/skill-library/workflow.test.ts +164 -0
  143. package/template/apps/agent-server/plugins/skills/README.md +5 -0
  144. package/template/apps/agent-server/plugins/skills/windy-data-summary/SKILL.md +14 -0
  145. package/template/apps/agent-server/plugins/skills/windy-extension-guide/SKILL.md +14 -0
  146. package/template/apps/agent-server/plugins/skills/windy-office/SKILL.md +14 -0
  147. package/template/apps/agent-server/plugins/skills/windy-skill-capture/SKILL.md +14 -0
  148. package/template/apps/agent-server/plugins/skills/windy-source-compare/SKILL.md +14 -0
  149. package/template/apps/agent-server/plugins/subprocess.mjs +40 -0
  150. package/template/apps/agent-server/plugins/theme/README.md +18 -0
  151. package/template/apps/agent-server/plugins/theme/client.js +18 -0
  152. package/template/apps/agent-server/plugins/theme/index.d.mts +9 -0
  153. package/template/apps/agent-server/plugins/theme/index.mjs +18 -0
  154. package/template/apps/agent-server/plugins/theme/package.json +19 -0
  155. package/template/apps/agent-server/plugins/theme/source-tokens.ts +82 -0
  156. package/template/apps/agent-server/plugins/theme/sync-tokens.ts +12 -0
  157. package/template/apps/agent-server/plugins/theme/theme.test.ts +193 -0
  158. package/template/apps/agent-server/plugins/theme/tokens.json +166 -0
  159. package/template/apps/agent-server/plugins/tool-catalog/README.md +79 -0
  160. package/template/apps/agent-server/plugins/tool-catalog/categories.mjs +111 -0
  161. package/template/apps/agent-server/plugins/tool-catalog/categories.test.ts +118 -0
  162. package/template/apps/agent-server/plugins/tool-catalog/client-cache.test.ts +264 -0
  163. package/template/apps/agent-server/plugins/tool-catalog/client.js +333 -0
  164. package/template/apps/agent-server/plugins/tool-catalog/client.test.ts +136 -0
  165. package/template/apps/agent-server/plugins/tool-catalog/discovery.d.mts +42 -0
  166. package/template/apps/agent-server/plugins/tool-catalog/discovery.mjs +242 -0
  167. package/template/apps/agent-server/plugins/tool-catalog/discovery.test.ts +229 -0
  168. package/template/apps/agent-server/plugins/tool-catalog/index.d.mts +5 -0
  169. package/template/apps/agent-server/plugins/tool-catalog/index.mjs +91 -0
  170. package/template/apps/agent-server/plugins/tool-catalog/package.json +23 -0
  171. package/template/apps/agent-server/plugins/tool-catalog/presentation.d.mts +21 -0
  172. package/template/apps/agent-server/plugins/tool-catalog/presentation.mjs +153 -0
  173. package/template/apps/agent-server/plugins/tool-catalog/presentation.test.ts +166 -0
  174. package/template/apps/agent-server/plugins/tool-catalog/routes.test.ts +209 -0
  175. package/template/apps/agent-server/plugins/tool-catalog/style.css +155 -0
  176. package/template/apps/agent-server/plugins/tool-catalog/use-tool.test.ts +160 -0
  177. package/template/apps/agent-server/plugins/tool-presentation/README.md +7 -0
  178. package/template/apps/agent-server/plugins/tool-presentation/build-client.ts +29 -0
  179. package/template/apps/agent-server/plugins/tool-presentation/client.js +312 -0
  180. package/template/apps/agent-server/plugins/tool-presentation/client.results.js +9 -0
  181. package/template/apps/agent-server/plugins/tool-presentation/client.test.ts +178 -0
  182. package/template/apps/agent-server/plugins/tool-presentation/index.mjs +10 -0
  183. package/template/apps/agent-server/plugins/tool-presentation/package.json +24 -0
  184. package/template/apps/agent-server/plugins/tool-presentation/result-discovery.mjs +43 -0
  185. package/template/apps/agent-server/plugins/tool-presentation/result-model.d.mts +51 -0
  186. package/template/apps/agent-server/plugins/tool-presentation/result-model.mjs +96 -0
  187. package/template/apps/agent-server/plugins/workspace/README.md +5 -0
  188. package/template/apps/agent-server/plugins/workspace/index.mjs +8 -0
  189. package/template/apps/agent-server/plugins/workspace/package.json +10 -0
  190. package/template/apps/agent-server/plugins/workspace/style.css +124 -0
  191. package/template/apps/agent-server/project/host.ts +13 -0
  192. package/template/apps/agent-server/runtime/artifacts.ts +115 -0
  193. package/template/apps/agent-server/runtime/audit.nodecheck.ts +60 -0
  194. package/template/apps/agent-server/runtime/capacity.ts +61 -0
  195. package/template/apps/agent-server/runtime/client-completion-budget.nodecheck.ts +92 -0
  196. package/template/apps/agent-server/runtime/compatibility.ts +33 -0
  197. package/template/apps/agent-server/runtime/completions.ts +320 -0
  198. package/template/apps/agent-server/runtime/config.ts +246 -0
  199. package/template/apps/agent-server/runtime/context-budget.ts +70 -0
  200. package/template/apps/agent-server/runtime/context-plugin.ts +306 -0
  201. package/template/apps/agent-server/runtime/context.nodecheck.ts +241 -0
  202. package/template/apps/agent-server/runtime/contracts.ts +201 -0
  203. package/template/apps/agent-server/runtime/dsh-engine.ts +196 -0
  204. package/template/apps/agent-server/runtime/evaluation-plugin.ts +115 -0
  205. package/template/apps/agent-server/runtime/evaluation.nodecheck.ts +194 -0
  206. package/template/apps/agent-server/runtime/events.ts +71 -0
  207. package/template/apps/agent-server/runtime/governance.ts +194 -0
  208. package/template/apps/agent-server/runtime/index.ts +339 -0
  209. package/template/apps/agent-server/runtime/internal-output.ts +37 -0
  210. package/template/apps/agent-server/runtime/isolation.nodecheck.ts +287 -0
  211. package/template/apps/agent-server/runtime/model-payload.ts +97 -0
  212. package/template/apps/agent-server/runtime/model-plugin.ts +308 -0
  213. package/template/apps/agent-server/runtime/model-route.ts +34 -0
  214. package/template/apps/agent-server/runtime/model-usage.ts +51 -0
  215. package/template/apps/agent-server/runtime/model-wire.ts +45 -0
  216. package/template/apps/agent-server/runtime/native-authorization.nodecheck.ts +126 -0
  217. package/template/apps/agent-server/runtime/native-completion.nodecheck.ts +81 -0
  218. package/template/apps/agent-server/runtime/output-validation.ts +66 -0
  219. package/template/apps/agent-server/runtime/production-capacity.nodecheck.ts +121 -0
  220. package/template/apps/agent-server/runtime/questions-workflow.nodecheck.ts +249 -0
  221. package/template/apps/agent-server/runtime/report-breakdown.ts +79 -0
  222. package/template/apps/agent-server/runtime/reporting.ts +219 -0
  223. package/template/apps/agent-server/runtime/run-completion.ts +39 -0
  224. package/template/apps/agent-server/runtime/run-request-digest.ts +18 -0
  225. package/template/apps/agent-server/runtime/runtime-test-fixtures.ts +264 -0
  226. package/template/apps/agent-server/runtime/runtime.nodecheck.ts +150 -0
  227. package/template/apps/agent-server/runtime/store-idempotency.nodecheck.ts +74 -0
  228. package/template/apps/agent-server/runtime/store.ts +324 -0
  229. package/template/apps/agent-server/runtime/structured-output-mode.nodecheck.ts +51 -0
  230. package/template/apps/agent-server/runtime/tool-name.ts +6 -0
  231. package/template/apps/agent-server/runtime/tool-plugin.ts +201 -0
  232. package/template/apps/agent-server/runtime/vision-readiness.ts +200 -0
  233. package/template/apps/agent-server/scripts/confinement-check.mjs +103 -0
  234. package/template/apps/agent-server/scripts/coordinator-check.mjs +344 -0
  235. package/template/apps/agent-server/scripts/documents-delivery-check.mjs +309 -0
  236. package/template/apps/agent-server/scripts/office-preview-check.mjs +92 -0
  237. package/template/apps/agent-server/scripts/test-confinement.ts +58 -0
  238. package/template/apps/agent-server/scripts/test-coordinator.ts +36 -0
  239. package/template/apps/agent-server/scripts/test-runtime.ts +46 -0
  240. package/template/apps/agent-server/tsconfig.json +21 -0
  241. package/template/apps/server/Dockerfile +3 -0
  242. package/template/apps/server/package.json +5 -1
  243. package/template/apps/server/scripts/check-dsh-platform-example.ts +251 -0
  244. package/template/apps/server/src/agent/dsh-runtime-wire.test.ts +33 -0
  245. package/template/apps/server/src/agent/governance-runtime.ts +41 -0
  246. package/template/apps/server/src/agent/remote-runtime-response.ts +1 -1
  247. package/template/apps/server/src/agent/run-contracts.ts +1 -0
  248. package/template/apps/server/src/agent/run-definition-support.ts +9 -0
  249. package/template/apps/server/src/agent/runtime-tool-composition.ts +2 -0
  250. package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +9 -0
  251. package/template/apps/server/src/agent-skills/access.ts +88 -0
  252. package/template/apps/server/src/agent-skills/bootstrap.ts +49 -0
  253. package/template/apps/server/src/agent-skills/builtin-registration.ts +83 -0
  254. package/template/apps/server/src/agent-skills/builtins.ts +19 -0
  255. package/template/apps/server/src/agent-skills/bundle-zip.ts +163 -0
  256. package/template/apps/server/src/agent-skills/bundle.test.ts +79 -0
  257. package/template/apps/server/src/agent-skills/bundle.ts +133 -0
  258. package/template/apps/server/src/agent-skills/contracts.ts +46 -0
  259. package/template/apps/server/src/agent-skills/drizzle-repository.ts +125 -0
  260. package/template/apps/server/src/agent-skills/input.ts +29 -0
  261. package/template/apps/server/src/agent-skills/postgres.integration.test.ts +348 -0
  262. package/template/apps/server/src/agent-skills/read-routes.test.ts +116 -0
  263. package/template/apps/server/src/agent-skills/reader.ts +108 -0
  264. package/template/apps/server/src/agent-skills/repository.ts +105 -0
  265. package/template/apps/server/src/agent-skills/routes.ts +176 -0
  266. package/template/apps/server/src/agent-skills/service.test.ts +295 -0
  267. package/template/apps/server/src/agent-skills/service.ts +301 -0
  268. package/template/apps/server/src/agent-workflow/preset-registry.test.ts +137 -0
  269. package/template/apps/server/src/agent-workflow/preset-registry.ts +191 -0
  270. package/template/apps/server/src/agent-workflow/preset-routes.test.ts +94 -0
  271. package/template/apps/server/src/agent-workflow/preset-routes.ts +45 -0
  272. package/template/apps/server/src/ai-runtime-report/service.test.ts +10 -7
  273. package/template/apps/server/src/ai-runtime-report/service.ts +1 -1
  274. package/template/apps/server/src/app/agent-workflow-presets.ts +4 -0
  275. package/template/apps/server/src/app/dsh-skill-draft-audit.test.ts +195 -0
  276. package/template/apps/server/src/app/dsh-skill-draft-audit.ts +115 -0
  277. package/template/apps/server/src/app/dsh-workbench-audit.test.ts +71 -0
  278. package/template/apps/server/src/app/dsh-workbench-audit.ts +34 -0
  279. package/template/apps/server/src/app/dsh-workbench-handshake.test.ts +63 -0
  280. package/template/apps/server/src/app/dsh-workbench-handshake.ts +48 -0
  281. package/template/apps/server/src/app/dsh-workbench-http.test.ts +96 -0
  282. package/template/apps/server/src/app/dsh-workbench-lan-origin.test.ts +114 -0
  283. package/template/apps/server/src/app/dsh-workbench-launch.test.ts +70 -0
  284. package/template/apps/server/src/app/dsh-workbench-origin.test.ts +54 -0
  285. package/template/apps/server/src/app/dsh-workbench-proxy.ts +205 -0
  286. package/template/apps/server/src/app/dsh-workbench-session-conflict.test.ts +61 -0
  287. package/template/apps/server/src/app/dsh-workbench-session.ts +59 -0
  288. package/template/apps/server/src/app/dsh-workbench-socket-audit.test.ts +115 -0
  289. package/template/apps/server/src/app/dsh-workbench-socket.test.ts +246 -0
  290. package/template/apps/server/src/app/dsh-workbench-socket.ts +272 -0
  291. package/template/apps/server/src/app/dsh-workbench-test-support.ts +158 -0
  292. package/template/apps/server/src/app/dsh-workbench.test.ts +213 -0
  293. package/template/apps/server/src/app/dsh-workbench.ts +279 -0
  294. package/template/apps/server/src/app/workbench-public-origin.ts +16 -0
  295. package/template/apps/server/src/data-governance/user-plaintext-routes.test.ts +3 -0
  296. package/template/apps/server/src/http-app.ts +31 -0
  297. package/template/apps/server/src/mcp/adapter.ts +1 -0
  298. package/template/apps/server/src/module-composition.test.ts +23 -0
  299. package/template/apps/server/src/module-composition.ts +9 -2
  300. package/template/apps/server/src/observability/bootstrap.ts +12 -0
  301. package/template/apps/server/src/observability/diagnostic-failure-recorder.ts +94 -0
  302. package/template/apps/server/src/observability/diagnostic-http-contract.test.ts +42 -0
  303. package/template/apps/server/src/observability/diagnostic-index.test.ts +89 -0
  304. package/template/apps/server/src/observability/diagnostic-index.ts +88 -0
  305. package/template/apps/server/src/observability/diagnostic-repository.ts +67 -0
  306. package/template/apps/server/src/platform-app-bootstrap.ts +42 -0
  307. package/template/apps/server/src/platform-http-runtime.ts +6 -0
  308. package/template/apps/server/src/runtime-development.test.ts +25 -0
  309. package/template/apps/server/src/runtime-development.ts +6 -44
  310. package/template/apps/server/src/system/diagnostic-routes.test.ts +78 -0
  311. package/template/apps/server/src/system/diagnostic-routes.ts +66 -0
  312. package/template/apps/web/Dockerfile +9 -1
  313. package/template/apps/web/dev/start.ts +21 -10
  314. package/template/apps/web/dsh-workbench-location.ts +21 -0
  315. package/template/apps/web/dsh-workbench-proxy.test.ts +121 -0
  316. package/template/apps/web/dsh-workbench-proxy.ts +194 -0
  317. package/template/apps/web/package.json +3 -1
  318. package/template/apps/web/server.ts +27 -6
  319. package/template/apps/web/src/composables/useLoginFlow.ts +13 -1
  320. package/template/apps/web/src/pages/errors/PlatformErrorPage.vue +6 -0
  321. package/template/apps/web/src/pages/errors/PlatformErrorPage.webtest.ts +14 -1
  322. package/template/apps/web/src/pages/errors/error-page-extension.ts +1 -0
  323. package/template/apps/web/src/pages/system/AgentNativePage.vue +44 -0
  324. package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +20 -7
  325. package/template/apps/web/src/pages/system/DiagnosticLookupPage.vue +56 -0
  326. package/template/apps/web/src/pages/system/DiagnosticLookupPage.webtest.ts +99 -0
  327. package/template/apps/web/src/pages/system/SystemAgentSkillsPage.vue +88 -0
  328. package/template/apps/web/src/pages/system/components/DiagnosticRecordDetails.vue +52 -0
  329. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillDetailDialog.vue +166 -0
  330. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillGovernanceActionDialog.vue +51 -0
  331. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.vue +320 -0
  332. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.webtest.ts +96 -0
  333. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillsTable.vue +69 -0
  334. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.vue +82 -0
  335. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.webtest.ts +57 -0
  336. package/template/apps/web/src/pages/system/composables/useAgentSkillsGovernance.ts +105 -0
  337. package/template/apps/web/src/pages/system/composables/useAgentWorkflowPresets.ts +44 -0
  338. package/template/apps/web/src/pages/system/composables/useDiagnosticLookup.ts +64 -0
  339. package/template/apps/web/src/router/error-navigation.ts +3 -1
  340. package/template/apps/web/src/router/error-navigation.webtest.ts +14 -2
  341. package/template/apps/web/src/router/index.ts +8 -49
  342. package/template/apps/web/src/router/platform-admin-pages.ts +79 -0
  343. package/template/apps/web/src/router/platform-admin-route-bindings.ts +8 -0
  344. package/template/apps/web/src/services/agent-skills-api.ts +55 -0
  345. package/template/apps/web/src/services/agent-workflow-api.ts +12 -0
  346. package/template/apps/web/src/services/diagnostics-api.ts +12 -0
  347. package/template/apps/web/src/services/http.ts +18 -0
  348. package/template/apps/web/src/services/http.webtest.ts +51 -0
  349. package/template/apps/web/vite.config.ts +39 -0
  350. package/template/deploy/dsh/README.md +5 -0
  351. package/template/deploy/dsh/documents/README.md +9 -0
  352. package/template/deploy/dsh/documents/requirements.in +6 -0
  353. package/template/deploy/dsh/documents/requirements.lock +72 -0
  354. package/template/docker-compose.yml +24 -10
  355. package/template/docs/adr/0004-embedded-dsh-runtime.md +9 -0
  356. package/template/docs/architecture/agent-admin-workbench-implementation.md +73 -0
  357. package/template/docs/architecture/agent-admin-workbench-plan.md +41 -0
  358. package/template/docs/architecture/agent-harness.md +2 -0
  359. package/template/docs/architecture/agent-runtime-compatibility.md +2 -0
  360. package/template/docs/architecture/embedded-dsh-integration.md +44 -0
  361. package/template/docs/development/dsh-plugins.md +55 -0
  362. package/template/docs/operations/dsh-agent-migration.md +98 -0
  363. package/template/docs/platform/agent-production-store.md +5 -78
  364. package/template/docs/platform/agent-runtime-observability.md +2 -0
  365. package/template/docs/platform/agent-runtime.md +2 -0
  366. package/template/docs/platform/agent-skills.md +25 -0
  367. package/template/package.json +4 -3
  368. package/template/packages/database/drizzle/0064_dsh_skills_diagnostics.sql +42 -0
  369. package/template/packages/database/drizzle/meta/0064_snapshot.json +15349 -0
  370. package/template/packages/database/drizzle/meta/_journal.json +7 -0
  371. package/template/packages/database/package.json +2 -2
  372. package/template/packages/database/src/schema/agent-skills.ts +65 -0
  373. package/template/packages/database/src/schema/diagnostics.ts +27 -0
  374. package/template/packages/database/src/schema/index.ts +8 -0
  375. package/template/packages/modules/package.json +1 -1
  376. package/template/packages/modules/src/system-admin-routes.ts +24 -0
  377. package/template/packages/modules/src/system-admin-ui-catalog.ts +17 -10
  378. package/template/packages/modules/src/system-agent-admin-bindings.ts +2 -0
  379. package/template/packages/modules/src/system-agent-admin-menus.ts +20 -0
  380. package/template/packages/modules/src/system-agent-audit-actions.ts +3 -0
  381. package/template/packages/modules/src/system-agent-dsh.ts +119 -0
  382. package/template/packages/modules/src/system-api-permissions.ts +9 -0
  383. package/template/packages/modules/src/system-audit-actions.ts +11 -0
  384. package/template/packages/modules/src/system-features.ts +5 -0
  385. package/template/packages/modules/src/system-module-audit-selection.ts +25 -0
  386. package/template/packages/modules/src/system-module-catalog.ts +12 -32
  387. package/template/packages/modules/src/system-modules.ts +14 -3
  388. package/template/packages/modules/src/system-permissions.ts +10 -0
  389. package/template/packages/server-sdk/package.json +2 -2
  390. package/template/packages/shared/index.ts +12 -0
  391. package/template/packages/shared/package.json +1 -1
  392. package/template/packages/shared/src/agent-skills.ts +68 -0
  393. package/template/packages/shared/src/agent-workflow-presets.ts +26 -0
  394. package/template/packages/shared/src/diagnostics.ts +13 -0
  395. package/template/packages/shared/src/rbac.ts +1 -0
  396. package/template/apps/agent-server/install-python-dependencies.sh +0 -92
  397. package/template/apps/agent-server/pyproject.toml +0 -51
  398. package/template/apps/agent-server/src/southwind_agent_server/__init__.py +0 -5
  399. package/template/apps/agent-server/src/southwind_agent_server/app.py +0 -344
  400. package/template/apps/agent-server/src/southwind_agent_server/approval_resolution.py +0 -30
  401. package/template/apps/agent-server/src/southwind_agent_server/artifact_input.py +0 -153
  402. package/template/apps/agent-server/src/southwind_agent_server/asgi.py +0 -8
  403. package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +0 -199
  404. package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +0 -203
  405. package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +0 -61
  406. package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +0 -82
  407. package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +0 -121
  408. package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +0 -158
  409. package/template/apps/agent-server/src/southwind_agent_server/config.py +0 -267
  410. package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +0 -24
  411. package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +0 -71
  412. package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +0 -307
  413. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +0 -297
  414. package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +0 -63
  415. package/template/apps/agent-server/src/southwind_agent_server/engine.py +0 -134
  416. package/template/apps/agent-server/src/southwind_agent_server/engine_capacity.py +0 -31
  417. package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +0 -2
  418. package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +0 -61
  419. package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +0 -93
  420. package/template/apps/agent-server/src/southwind_agent_server/http_helpers.py +0 -62
  421. package/template/apps/agent-server/src/southwind_agent_server/lease.py +0 -15
  422. package/template/apps/agent-server/src/southwind_agent_server/multimodal.py +0 -76
  423. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +0 -329
  424. package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +0 -165
  425. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +0 -345
  426. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +0 -37
  427. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +0 -235
  428. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_replay.py +0 -44
  429. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_status.py +0 -83
  430. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +0 -336
  431. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_summary.py +0 -304
  432. package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +0 -335
  433. package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +0 -333
  434. package/template/apps/agent-server/src/southwind_agent_server/provider_audit.py +0 -144
  435. package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +0 -309
  436. package/template/apps/agent-server/src/southwind_agent_server/provider_output_guidance.py +0 -34
  437. package/template/apps/agent-server/src/southwind_agent_server/readiness_pin.py +0 -37
  438. package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +0 -218
  439. package/template/apps/agent-server/src/southwind_agent_server/report_metrics.py +0 -149
  440. package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +0 -300
  441. package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +0 -132
  442. package/template/apps/agent-server/src/southwind_agent_server/report_store.py +0 -298
  443. package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +0 -75
  444. package/template/apps/agent-server/src/southwind_agent_server/report_types.py +0 -118
  445. package/template/apps/agent-server/src/southwind_agent_server/run_admission.py +0 -64
  446. package/template/apps/agent-server/src/southwind_agent_server/run_capacity.py +0 -59
  447. package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +0 -74
  448. package/template/apps/agent-server/src/southwind_agent_server/runtime_compatibility.py +0 -89
  449. package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +0 -105
  450. package/template/apps/agent-server/src/southwind_agent_server/runtime_logging.py +0 -57
  451. package/template/apps/agent-server/src/southwind_agent_server/service.py +0 -325
  452. package/template/apps/agent-server/src/southwind_agent_server/service_control.py +0 -64
  453. package/template/apps/agent-server/src/southwind_agent_server/service_errors.py +0 -4
  454. package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +0 -34
  455. package/template/apps/agent-server/src/southwind_agent_server/service_tasks.py +0 -34
  456. package/template/apps/agent-server/src/southwind_agent_server/signal_events.py +0 -53
  457. package/template/apps/agent-server/src/southwind_agent_server/sqlite_catalog.py +0 -118
  458. package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +0 -2
  459. package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +0 -73
  460. package/template/apps/agent-server/src/southwind_agent_server/sqlite_serialization.py +0 -16
  461. package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +0 -350
  462. package/template/apps/agent-server/src/southwind_agent_server/sse.py +0 -41
  463. package/template/apps/agent-server/src/southwind_agent_server/store.py +0 -255
  464. package/template/apps/agent-server/src/southwind_agent_server/store_cipher.py +0 -40
  465. package/template/apps/agent-server/src/southwind_agent_server/structured_logging.py +0 -145
  466. package/template/apps/agent-server/src/southwind_agent_server/telemetry.py +0 -93
  467. package/template/apps/agent-server/src/southwind_agent_server/tool_host.py +0 -152
  468. package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +0 -137
  469. package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +0 -58
  470. package/template/apps/agent-server/src/southwind_agent_server/vision_probe.py +0 -87
  471. package/template/apps/agent-server/src/southwind_agent_server/vision_requirement.py +0 -28
  472. package/template/apps/agent-server/src/southwind_agent_server/vlm_readiness.py +0 -247
  473. package/template/apps/agent-server/tests/__init__.py +0 -1
  474. package/template/apps/agent-server/tests/openai_provider_test_support.py +0 -131
  475. package/template/apps/agent-server/tests/test_api.py +0 -305
  476. package/template/apps/agent-server/tests/test_artifact_input.py +0 -110
  477. package/template/apps/agent-server/tests/test_client_completion.py +0 -230
  478. package/template/apps/agent-server/tests/test_config.py +0 -106
  479. package/template/apps/agent-server/tests/test_fingerprint.py +0 -10
  480. package/template/apps/agent-server/tests/test_multimodal.py +0 -81
  481. package/template/apps/agent-server/tests/test_openai_provider.py +0 -320
  482. package/template/apps/agent-server/tests/test_postgres_report_status.py +0 -59
  483. package/template/apps/agent-server/tests/test_postgres_report_summary.py +0 -298
  484. package/template/apps/agent-server/tests/test_postgres_store.py +0 -135
  485. package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +0 -140
  486. package/template/apps/agent-server/tests/test_provider_governance.py +0 -276
  487. package/template/apps/agent-server/tests/test_report_attempt_lifecycle.py +0 -126
  488. package/template/apps/agent-server/tests/test_report_resilience.py +0 -183
  489. package/template/apps/agent-server/tests/test_report_routes.py +0 -143
  490. package/template/apps/agent-server/tests/test_report_store.py +0 -347
  491. package/template/apps/agent-server/tests/test_report_summary_parity.py +0 -116
  492. package/template/apps/agent-server/tests/test_report_terminal_sync.py +0 -177
  493. package/template/apps/agent-server/tests/test_run_capacity.py +0 -112
  494. package/template/apps/agent-server/tests/test_run_operational_logging.py +0 -114
  495. package/template/apps/agent-server/tests/test_runtime_compatibility.py +0 -119
  496. package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +0 -52
  497. package/template/apps/agent-server/tests/test_sqlite_store.py +0 -182
  498. package/template/apps/agent-server/tests/test_structured_logging.py +0 -142
  499. package/template/apps/agent-server/tests/test_telemetry.py +0 -25
  500. package/template/apps/agent-server/tests/test_tool_approval.py +0 -28
  501. package/template/apps/agent-server/tests/test_tool_structured_output.py +0 -347
  502. package/template/apps/agent-server/tests/test_trajectory.py +0 -91
  503. package/template/apps/agent-server/tests/test_vision_readiness_enforcement.py +0 -72
  504. package/template/apps/agent-server/tests/test_vlm_readiness.py +0 -106
  505. package/template/apps/agent-server/uv.lock +0 -831
@@ -1,89 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import hashlib
4
- import json
5
- import re
6
-
7
- SCHEMA_VERSION = 1
8
- PROTOCOL_VERSION = 1
9
- RUNTIME_KIND = "agent"
10
- COMPATIBILITY_PATH = "/api/agent/runtime/compatibility"
11
- PROTOCOL_HEADER = "X-Windy-Agent-Runtime-Protocol"
12
- OFFER_DIGEST_HEADER = "X-Windy-Agent-Runtime-Offer-Digest"
13
- TOOL_CALLBACK_CONTRACT_VERSION = 1
14
- TOOL_CALLBACK_AUTHENTICATION = "windy-internal-bearer-v1"
15
- PROTOCOL_FEATURES = (
16
- "canonical-sse-replay.v1",
17
- "execution-grant-forwarding.v1",
18
- "operation-release-attestation.v1",
19
- "run-cancel.v1",
20
- "run-lifecycle.v1",
21
- "runtime-reporting.v1",
22
- "tool-callback.v1",
23
- )
24
-
25
- _STABLE_VALUE = re.compile(r"^[a-z0-9][a-z0-9._-]{0,159}$")
26
-
27
-
28
- class RuntimeCompatibilityError(ValueError):
29
- pass
30
-
31
-
32
- def runtime_compatibility_offer(engine_id: str) -> dict[str, object]:
33
- if not _STABLE_VALUE.fullmatch(engine_id):
34
- raise RuntimeCompatibilityError("Agent Runtime engineId invalid")
35
- protocol_versions = [PROTOCOL_VERSION]
36
- protocol_features = sorted(PROTOCOL_FEATURES)
37
- tool_callback: dict[str, object] = {
38
- "contractVersion": TOOL_CALLBACK_CONTRACT_VERSION,
39
- "authentication": TOOL_CALLBACK_AUTHENTICATION,
40
- }
41
- release_digest = _digest(
42
- {
43
- "runtimeKind": RUNTIME_KIND,
44
- "engineId": engine_id,
45
- "protocolVersions": protocol_versions,
46
- }
47
- )
48
- capabilities_digest = _digest(
49
- {
50
- "protocolFeatures": protocol_features,
51
- "toolCallback": tool_callback,
52
- }
53
- )
54
- body: dict[str, object] = {
55
- "schemaVersion": SCHEMA_VERSION,
56
- "runtimeKind": RUNTIME_KIND,
57
- "engineId": engine_id,
58
- "protocolVersions": protocol_versions,
59
- "protocolFeatures": protocol_features,
60
- "toolCallback": tool_callback,
61
- "releaseDigest": release_digest,
62
- "capabilitiesDigest": capabilities_digest,
63
- }
64
- return {**body, "offerDigest": _digest(body)}
65
-
66
-
67
- def validate_runtime_compatibility_pin(
68
- protocol_header: str | None,
69
- offer_digest_header: str | None,
70
- engine_id: str,
71
- ) -> None:
72
- if protocol_header is None and offer_digest_header is None:
73
- return
74
- if protocol_header is None or offer_digest_header is None:
75
- raise RuntimeCompatibilityError("Agent Runtime compatibility pin incomplete")
76
- if protocol_header != str(PROTOCOL_VERSION):
77
- raise RuntimeCompatibilityError("Agent Runtime protocol unsupported")
78
- expected = runtime_compatibility_offer(engine_id)["offerDigest"]
79
- if offer_digest_header != expected:
80
- raise RuntimeCompatibilityError("Agent Runtime offer digest mismatch")
81
-
82
-
83
- def _digest(value: object) -> str:
84
- encoded = json.dumps(
85
- value,
86
- ensure_ascii=False,
87
- separators=(",", ":"),
88
- ).encode()
89
- return f"sha256:{hashlib.sha256(encoded).hexdigest()}"
@@ -1,105 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import os
4
-
5
- from .config import EnvironmentSecretResolver, OpenAiCompatibleConfig
6
- from .context_version_port import HttpContextVersionPort, UnavailableContextVersionPort
7
- from .engine import AgentEngineAdapter
8
- from .openai_engine import OpenAiCompatibleEngineAdapter
9
- from .openai_provider import OpenAiCompatibleProvider
10
- from .postgres_report_store import PostgresAgentRuntimeReportStore
11
- from .postgres_store import PostgresRunStore
12
- from .provider_audit import ProviderAuditStore
13
- from .provider_governance import ProviderRequestGovernance
14
- from .report_store import (
15
- AgentRuntimeReportStore,
16
- InMemoryAgentRuntimeReportStore,
17
- )
18
- from .sqlite_store import SqliteRunStore
19
- from .store import InMemoryRunStore, RunStore
20
- from .store_cipher import RunStoreCipher
21
- from .tool_host import ToolHostClient
22
- from .unavailable_engine import UnavailableEngineAdapter
23
-
24
-
25
- def default_engine(
26
- report_store: AgentRuntimeReportStore | None = None,
27
- ) -> AgentEngineAdapter:
28
- config = OpenAiCompatibleConfig.from_environment()
29
- if config is None:
30
- return UnavailableEngineAdapter()
31
- internal_token = os.environ.get("AGENT_SERVER_INTERNAL_TOKEN", "").strip()
32
- if not internal_token:
33
- raise ValueError("Agent Server Provider 已配置但内部 Token 缺失")
34
- context_host_url = os.environ.get("AGENT_CONTEXT_HOST_URL", "").strip()
35
- return OpenAiCompatibleEngineAdapter(
36
- OpenAiCompatibleProvider(
37
- config,
38
- EnvironmentSecretResolver(os.environ),
39
- ),
40
- ToolHostClient(internal_token),
41
- ProviderRequestGovernance(
42
- ProviderAuditStore(
43
- required_environment("AI_PROVIDER_AUDIT_STORE_PATH"),
44
- retention_days=provider_audit_retention_days(),
45
- )
46
- ),
47
- report_store,
48
- (
49
- HttpContextVersionPort(context_host_url, internal_token)
50
- if context_host_url
51
- else UnavailableContextVersionPort()
52
- ),
53
- )
54
-
55
-
56
- def default_store() -> RunStore:
57
- database_url = os.environ.get("AGENT_DATABASE_URL", "").strip()
58
- path = os.environ.get("AGENT_RUN_STORE_PATH", "").strip()
59
- if not database_url and not path:
60
- return InMemoryRunStore()
61
- cipher = RunStoreCipher(required_environment("AGENT_RUN_ENCRYPTION_SECRET"))
62
- return (
63
- PostgresRunStore(database_url, cipher)
64
- if database_url
65
- else SqliteRunStore(path, cipher)
66
- )
67
-
68
-
69
- def default_report_store() -> AgentRuntimeReportStore:
70
- database_url = os.environ.get("AGENT_DATABASE_URL", "").strip()
71
- retention_days = report_retention_days()
72
- return (
73
- PostgresAgentRuntimeReportStore(database_url, retention_days)
74
- if database_url
75
- else InMemoryAgentRuntimeReportStore(retention_days)
76
- )
77
-
78
-
79
- def required_environment(key: str) -> str:
80
- value = os.environ.get(key, "").strip()
81
- if not value:
82
- raise ValueError(f"Provider 已配置但缺少 {key}")
83
- return value
84
-
85
-
86
- def provider_audit_retention_days() -> int:
87
- raw = os.environ.get("AI_PROVIDER_AUDIT_RETENTION_DAYS", "90")
88
- try:
89
- value = int(raw)
90
- except ValueError as error:
91
- raise ValueError("AI_PROVIDER_AUDIT_RETENTION_DAYS 必须是整数") from error
92
- if not 1 <= value <= 3650:
93
- raise ValueError("AI_PROVIDER_AUDIT_RETENTION_DAYS 超出允许范围")
94
- return value
95
-
96
-
97
- def report_retention_days() -> int:
98
- raw = os.environ.get("AI_RUNTIME_REPORT_RETENTION_DAYS", "90")
99
- try:
100
- value = int(raw)
101
- except ValueError as error:
102
- raise ValueError("AI_RUNTIME_REPORT_RETENTION_DAYS 必须是整数") from error
103
- if not 1 <= value <= 3650:
104
- raise ValueError("AI_RUNTIME_REPORT_RETENTION_DAYS 超出允许范围")
105
- return value
@@ -1,57 +0,0 @@
1
- """Safe attempt diagnostics, separate from the canonical Run store and audit."""
2
-
3
- from __future__ import annotations
4
-
5
- import logging
6
- import time
7
-
8
- from .store import RunRecord
9
-
10
- logger = logging.getLogger(__name__)
11
-
12
-
13
- class AgentOperationalAttempt:
14
- def __init__(self, record: RunRecord) -> None:
15
- self._run_id = record.run_id
16
- self._trace_id = record.trace_id
17
- self._started_at: float | None = None
18
- self._finished = False
19
-
20
- def start(self) -> None:
21
- if self._started_at is not None:
22
- return
23
- self._started_at = time.monotonic()
24
- self._emit("agent.run.attempt.started")
25
-
26
- def finish(self, status: str) -> None:
27
- if self._started_at is None or self._finished:
28
- return
29
- self._finished = True
30
- self._emit(
31
- "agent.run.attempt.completed",
32
- operational_status=status,
33
- operational_duration_ms=round(
34
- (time.monotonic() - self._started_at) * 1_000, 3
35
- ),
36
- )
37
-
38
- def _emit(self, event: str, **fields: str | float) -> None:
39
- try:
40
- emit = (
41
- logger.warning
42
- if event == "agent.run.attempt.completed"
43
- and fields.get("operational_status") != "completed"
44
- else logger.info
45
- )
46
- emit(
47
- "Agent 执行阶段",
48
- extra={
49
- "operational_event": event,
50
- "run_id": self._run_id,
51
- "trace_id": self._trace_id,
52
- **fields,
53
- },
54
- )
55
- except Exception:
56
- # 日志出口失败不能改变 Run 或租约的业务结果。
57
- return
@@ -1,325 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- import logging
5
- import uuid
6
-
7
- from .approval_resolution import resolve_pending_approval
8
- from .artifact_input import ArtifactLoader
9
- from .contracts import StartRunRequest
10
- from .engine import (
11
- AgentEngineAdapter,
12
- EngineCompleted,
13
- SafeEngineError,
14
- )
15
- from .fingerprint import request_fingerprint, resolved_release
16
- from .lease import cancel_on_lease_loss, lease_failed
17
- from .report_lifecycle import (
18
- append_and_sync_canonical_event,
19
- ensure_run_report_safely,
20
- start_run_report_safely,
21
- sync_terminal_from_canonical,
22
- )
23
- from .report_store import AgentRuntimeReportStore
24
- from .run_admission import RunAdmission
25
- from .run_capacity import RunCapacity, RunCapacityReservation
26
- from .service_control import AgentRunControlMixin
27
- from .service_errors import OperationNotFoundError
28
- from .service_execution import build_engine_run_request
29
- from .service_tasks import complete_task, renew_lease, run_admitted
30
- from .signal_events import canonical_signal_event
31
- from .store import RunRecord, RunStore
32
- from .telemetry import AgentRunTrace
33
- from .vision_requirement import require_vision_readiness
34
-
35
- logger = logging.getLogger(__name__)
36
-
37
-
38
- class AgentRunService(AgentRunControlMixin):
39
- def __init__(
40
- self,
41
- engine: AgentEngineAdapter,
42
- store: RunStore,
43
- report_store: AgentRuntimeReportStore,
44
- artifact_loader: ArtifactLoader | None = None,
45
- max_concurrent_runs: int = 1,
46
- max_queue_depth: int = 0,
47
- ) -> None:
48
- self.engine = engine
49
- self.store = store
50
- self.report_store = report_store
51
- self.artifact_loader = artifact_loader
52
- self._tasks: set[asyncio.Task[None]] = set()
53
- self._active_run_ids: set[str] = set()
54
- self._recovery_task: asyncio.Task[None] | None = None
55
- self._admission = RunAdmission(
56
- store,
57
- RunCapacity(max_concurrent_runs, max_queue_depth),
58
- )
59
-
60
- async def start(
61
- self,
62
- request: StartRunRequest,
63
- idempotency_key: str,
64
- ) -> RunRecord:
65
- if not getattr(self.engine, "configured", True):
66
- raise SafeEngineError(
67
- "RUNTIME_UNAVAILABLE",
68
- "Agent Provider 尚未配置",
69
- retryable=False,
70
- )
71
- if not self.engine.supports(request.operation_key):
72
- raise OperationNotFoundError
73
- missing = set(request.required_capabilities) - set(self.engine.capabilities)
74
- unsupported = set(request.input_modalities) - set(self.engine.input_modalities)
75
- if missing or unsupported:
76
- raise SafeEngineError(
77
- "MODEL_ROUTE_UNAVAILABLE",
78
- "模型 Deployment 缺少 Operation 所需能力或输入模态",
79
- retryable=True,
80
- )
81
- fingerprint = request_fingerprint(request)
82
- candidate = RunRecord(
83
- run_id=f"run_{uuid.uuid4().hex}",
84
- engine_id=self.engine.engine_id,
85
- operation_key=request.operation_key,
86
- input=request.input,
87
- idempotency_key=idempotency_key,
88
- fingerprint=fingerprint,
89
- release=resolved_release(request),
90
- trace_id=request.trace_id,
91
- )
92
- admission = await self._admission.admit(
93
- candidate,
94
- request.model_dump(by_alias=True),
95
- )
96
- record = admission.record
97
- await ensure_run_report_safely(
98
- self.report_store,
99
- record.run_id,
100
- request,
101
- self.engine.engine_id,
102
- )
103
- if admission.reservation:
104
- await self._spawn(record, request, admission.reservation)
105
- return record
106
-
107
- async def recover(self) -> None:
108
- await self._recover_once()
109
- if self._recovery_task is None:
110
- self._recovery_task = asyncio.create_task(self._recovery_loop())
111
-
112
- async def close(self) -> None:
113
- if self._recovery_task:
114
- self._recovery_task.cancel()
115
- for task in list(self._tasks):
116
- task.cancel()
117
- await asyncio.gather(
118
- *([self._recovery_task] if self._recovery_task else []),
119
- *self._tasks,
120
- return_exceptions=True,
121
- )
122
- await self.store.close()
123
- await self.report_store.close()
124
-
125
- async def _recover_once(self) -> None:
126
- for record, raw in await self.store.recoverable():
127
- if record.run_id in self._active_run_ids:
128
- continue
129
- request = StartRunRequest.model_validate(raw)
130
- reservation = await self._admission.reserve_recovery()
131
- if not reservation:
132
- return
133
- await ensure_run_report_safely(
134
- self.report_store,
135
- record.run_id,
136
- request,
137
- record.engine_id,
138
- )
139
- if record.engine_id != self.engine.engine_id:
140
- await self._fail(
141
- record.run_id,
142
- SafeEngineError(
143
- "RUNTIME_UNAVAILABLE",
144
- "Agent Engine 已升级,旧 Run 无法安全恢复",
145
- retryable=False,
146
- ),
147
- )
148
- await self.store.clear_invocation(record.run_id)
149
- continue
150
- await self._spawn(
151
- record,
152
- request,
153
- reservation,
154
- resumed=True,
155
- )
156
-
157
- async def _recovery_loop(self) -> None:
158
- while True:
159
- await asyncio.sleep(10)
160
- try:
161
- await self._recover_once()
162
- except asyncio.CancelledError:
163
- raise
164
- except Exception:
165
- logger.exception("Agent Run 恢复轮询失败,将继续重试")
166
-
167
- async def _execute(
168
- self,
169
- record: RunRecord,
170
- invocation: StartRunRequest,
171
- resumed: bool = False,
172
- ) -> None:
173
- execution_task = asyncio.current_task()
174
- if execution_task is None:
175
- raise RuntimeError("Agent Run 缺少执行任务")
176
- lease_task = asyncio.create_task(renew_lease(self.store, record.run_id))
177
- run_trace = AgentRunTrace(record)
178
- run_trace.start()
179
- final_status = "unknown"
180
- lease_task.add_done_callback(
181
- lambda completed: cancel_on_lease_loss(completed, execution_task)
182
- )
183
- try:
184
- await asyncio.wait_for(
185
- require_vision_readiness(self.engine, invocation),
186
- timeout=invocation.limits.max_duration_seconds,
187
- )
188
- await start_run_report_safely(self.report_store, record.run_id)
189
- if await append_and_sync_canonical_event(
190
- self.report_store,
191
- self.store,
192
- record.run_id,
193
- "run.resumed" if resumed else "run.started",
194
- ):
195
- return
196
- if invocation.artifacts and not self.artifact_loader:
197
- raise SafeEngineError(
198
- "RUNTIME_UNAVAILABLE",
199
- "Agent Artifact Runtime 未配置",
200
- retryable=True,
201
- )
202
- prepared = (
203
- await self.artifact_loader.prepare(
204
- invocation.artifacts,
205
- invocation.input_modalities,
206
- invocation.limits,
207
- )
208
- if self.artifact_loader
209
- else ()
210
- )
211
- if await append_and_sync_canonical_event(
212
- self.report_store,
213
- self.store,
214
- record.run_id,
215
- "input.prepared",
216
- {
217
- "artifactCount": len(prepared),
218
- "inputModalities": list(invocation.input_modalities),
219
- },
220
- ):
221
- return
222
- request = build_engine_run_request(record, invocation, prepared)
223
- async with asyncio.timeout(invocation.limits.max_duration_seconds):
224
- async for signal in self.engine.execute(request):
225
- if isinstance(signal, EngineCompleted):
226
- await self.store.complete(record.run_id, signal.output)
227
- await sync_terminal_from_canonical(
228
- self.report_store,
229
- self.store,
230
- record.run_id,
231
- )
232
- return
233
- event_type, fields = canonical_signal_event(signal)
234
- if await append_and_sync_canonical_event(
235
- self.report_store,
236
- self.store,
237
- record.run_id,
238
- event_type,
239
- fields,
240
- ):
241
- return
242
- await self._fail(
243
- record.run_id,
244
- SafeEngineError(
245
- "STREAM_INTERRUPTED",
246
- "Agent Runtime 未返回终态",
247
- retryable=True,
248
- ),
249
- )
250
- except SafeEngineError as error:
251
- await self._fail(record.run_id, error)
252
- except TimeoutError:
253
- current = await self.get(record.run_id)
254
- await resolve_pending_approval(self.store, current, "timed-out")
255
- await self._fail(
256
- record.run_id,
257
- SafeEngineError(
258
- "RUN_TIMEOUT",
259
- "Agent Run 执行超时",
260
- retryable=True,
261
- ),
262
- )
263
- except asyncio.CancelledError:
264
- if lease_failed(lease_task):
265
- await self._fail(
266
- record.run_id,
267
- SafeEngineError(
268
- "RUNTIME_UNAVAILABLE",
269
- "Agent Run 租约已丢失",
270
- retryable=True,
271
- ),
272
- )
273
- return
274
- raise
275
- except Exception:
276
- await self._fail(
277
- record.run_id,
278
- SafeEngineError(
279
- "RUNTIME_UNAVAILABLE",
280
- "Agent Runtime 执行失败",
281
- retryable=True,
282
- ),
283
- )
284
- finally:
285
- try:
286
- lease_task.cancel()
287
- await asyncio.gather(lease_task, return_exceptions=True)
288
- final_record = await self.store.get(record.run_id)
289
- if final_record and final_record.terminal:
290
- await self.store.clear_invocation(record.run_id)
291
- if final_record:
292
- final_status = final_record.status
293
- try:
294
- await self.store.release_lease(record.run_id)
295
- except KeyError:
296
- pass
297
- finally:
298
- run_trace.finish(final_status)
299
-
300
- async def _spawn(
301
- self,
302
- record: RunRecord,
303
- request: StartRunRequest,
304
- reservation: RunCapacityReservation,
305
- resumed: bool = False,
306
- ) -> None:
307
- if record.run_id in self._active_run_ids:
308
- await reservation.release()
309
- return
310
- self._active_run_ids.add(record.run_id)
311
- task = asyncio.create_task(
312
- run_admitted(
313
- reservation,
314
- lambda: self._execute(record, request, resumed),
315
- )
316
- )
317
- self._tasks.add(task)
318
- task.add_done_callback(
319
- lambda completed: complete_task(
320
- self._tasks,
321
- self._active_run_ids,
322
- record.run_id,
323
- completed,
324
- )
325
- )
@@ -1,64 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from .approval_resolution import resolve_pending_approval
4
- from .engine import AgentEngineAdapter, SafeEngineError
5
- from .report_lifecycle import append_and_sync_canonical_event
6
- from .report_store import AgentRuntimeReportStore
7
- from .service_errors import RunNotFoundError
8
- from .signal_events import canonical_failure_fields
9
- from .store import RunRecord, RunStore
10
-
11
-
12
- class AgentRunControlMixin:
13
- """Queries, cancellation and terminal control shared by run execution."""
14
-
15
- engine: AgentEngineAdapter
16
- store: RunStore
17
- report_store: AgentRuntimeReportStore
18
-
19
- async def record_evaluation(
20
- self,
21
- release_id: str,
22
- evaluation_set_key: str,
23
- evaluation_set_version: str,
24
- metrics: dict[str, float],
25
- ) -> str:
26
- return await self.store.record_evaluation(
27
- release_id,
28
- evaluation_set_key,
29
- evaluation_set_version,
30
- metrics,
31
- )
32
-
33
- async def get(self, run_id: str) -> RunRecord:
34
- record = await self.store.get(run_id)
35
- if record is None:
36
- raise RunNotFoundError
37
- return record
38
-
39
- async def probe(self) -> None:
40
- await self.store.probe()
41
-
42
- async def cancel(self, run_id: str) -> RunRecord:
43
- record = await self.get(run_id)
44
- if record.terminal:
45
- return record
46
- await self.engine.cancel(run_id)
47
- await resolve_pending_approval(self.store, record, "cancelled")
48
- await append_and_sync_canonical_event(
49
- self.report_store,
50
- self.store,
51
- run_id,
52
- "run.cancelled",
53
- )
54
- return await self.get(run_id)
55
-
56
- async def _fail(self, run_id: str, failure: SafeEngineError) -> None:
57
- await append_and_sync_canonical_event(
58
- self.report_store,
59
- self.store,
60
- run_id,
61
- "run.failed",
62
- canonical_failure_fields(failure),
63
- fallback_safe_error_code=failure.code,
64
- )
@@ -1,4 +0,0 @@
1
- class RunNotFoundError(Exception): ...
2
-
3
-
4
- class OperationNotFoundError(Exception): ...
@@ -1,34 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from .contracts import StartRunRequest
4
- from .engine import EngineRunRequest, PreparedArtifact
5
- from .store import RunRecord
6
-
7
-
8
- def build_engine_run_request(
9
- record: RunRecord,
10
- invocation: StartRunRequest,
11
- artifacts: tuple[PreparedArtifact, ...],
12
- ) -> EngineRunRequest:
13
- return EngineRunRequest(
14
- run_id=record.run_id,
15
- operation_key=record.operation_key,
16
- input=invocation.input,
17
- input_modalities=tuple(invocation.input_modalities),
18
- required_capabilities=tuple(invocation.required_capabilities),
19
- artifacts=artifacts,
20
- instructions=invocation.instructions,
21
- user_prompt=invocation.user_prompt,
22
- output_schema_key=invocation.output_schema_key,
23
- output_schema=invocation.output_schema,
24
- allowed_tools=tuple(invocation.allowed_tools),
25
- limits=invocation.limits,
26
- provider_egress=invocation.provider_egress,
27
- provider_data_policy=invocation.provider_data_policy,
28
- tool_network_policy=invocation.tool_network_policy,
29
- model_pin=invocation.model_pin,
30
- execution_grant=invocation.execution_grant,
31
- tool_host_url=invocation.tool_host_url,
32
- long_session=invocation.long_session,
33
- prompt_version=invocation.release.prompt_version,
34
- )