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
@@ -35,3 +35,15 @@ export * from "./src/stable-key.js";
35
35
  export * from "./src/workflow.js";
36
36
 
37
37
  export * from "./src/license-console-capabilities.js";
38
+
39
+ // @windy-module system.agent begin
40
+ export * from "./src/agent-skills.js";
41
+ // @windy-module system.agent end
42
+
43
+ // @windy-module system.audit begin
44
+ export * from "./src/diagnostics.js";
45
+ // @windy-module system.audit end
46
+
47
+ // @windy-module system.agent begin
48
+ export * from "./src/agent-workflow-presets.js";
49
+ // @windy-module system.agent end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@southwind-ai/shared",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "engines": {
@@ -0,0 +1,68 @@
1
+ /** DSH 技能是工作方法与文件包,不能授予业务权限或承载可执行授权。 */
2
+ export type AgentSkillScope = "personal" | "department" | "tenant";
3
+ export type AgentSkillOrigin = "builtin" | "shared";
4
+ export type AgentSkillStatus = "published" | "disabled";
5
+ export interface AgentSkillRequirement {
6
+ readonly toolKey: string;
7
+ readonly featureKey: string;
8
+ readonly permissionKey: string;
9
+ }
10
+ export interface AgentSkillFile {
11
+ readonly path: string;
12
+ readonly contentBase64: string;
13
+ }
14
+ export interface AgentSkillBundle {
15
+ readonly name: string;
16
+ readonly displayName: string;
17
+ readonly description: string;
18
+ readonly digest: string;
19
+ readonly files: readonly AgentSkillFile[];
20
+ }
21
+ export interface AgentSkillVersion {
22
+ readonly key: string;
23
+ readonly version: number;
24
+ readonly tenantId: string;
25
+ readonly ownerActorId: string;
26
+ readonly departmentId?: string;
27
+ readonly scope: AgentSkillScope;
28
+ readonly origin: AgentSkillOrigin;
29
+ readonly status: AgentSkillStatus;
30
+ readonly name: string;
31
+ readonly description: string;
32
+ readonly digest: string;
33
+ readonly requirements: readonly AgentSkillRequirement[];
34
+ readonly safetyConstraints: readonly string[];
35
+ readonly createdAt: string;
36
+ readonly createdBy: string;
37
+ readonly restoredFromVersion?: number;
38
+ readonly source: string;
39
+ }
40
+ export interface AgentSkillGovernanceItem {
41
+ readonly skill: AgentSkillVersion;
42
+ readonly available: boolean;
43
+ readonly governable: boolean;
44
+ }
45
+ export interface ImportAgentSkillRequest {
46
+ readonly format: "markdown" | "zip";
47
+ /** SKILL.md 正文,或 ZIP 的标准 base64。 */
48
+ readonly content: string;
49
+ readonly scope: AgentSkillScope;
50
+ readonly expectedVersion: number;
51
+ readonly requirements?: readonly AgentSkillRequirement[];
52
+ readonly safetyConstraints?: readonly string[];
53
+ }
54
+ export interface AgentSkillCommandRequest {
55
+ readonly expectedVersion: number;
56
+ readonly version?: number;
57
+ }
58
+ export interface PublishedAgentSkillBundle {
59
+ readonly skill: AgentSkillVersion;
60
+ readonly bundle: AgentSkillBundle;
61
+ }
62
+
63
+ export interface AgentSkillRuntimeBundle {
64
+ readonly key: string;
65
+ readonly version: number;
66
+ readonly digest: string;
67
+ readonly files: readonly AgentSkillFile[];
68
+ }
@@ -0,0 +1,26 @@
1
+ import type { AgentWorkflowBudget } from "./agent-workflow-run.js";
2
+ import type { AgentWorkflowNodeType } from "./agent-workflow-definition.js";
3
+
4
+ export interface AgentWorkflowPresetSummary {
5
+ readonly key: string;
6
+ readonly moduleKey: string;
7
+ readonly label: string;
8
+ readonly description: string;
9
+ readonly workflowKey: string;
10
+ readonly version: string;
11
+ readonly budget: AgentWorkflowBudget;
12
+ readonly nodes: readonly {
13
+ readonly id: string;
14
+ readonly label: string;
15
+ readonly type: AgentWorkflowNodeType;
16
+ }[];
17
+ readonly availability: "available" | "unavailable";
18
+ readonly safeCode?: string;
19
+ readonly blockedReason?: string;
20
+ /** 由所属模块注册的业务入口;目录本身不发布或启动 Workflow。 */
21
+ readonly entry?: { readonly path: string; readonly label: string };
22
+ }
23
+
24
+ export interface AgentWorkflowPresetListResponse {
25
+ readonly items: readonly AgentWorkflowPresetSummary[];
26
+ }
@@ -0,0 +1,13 @@
1
+ /** 可向授权运维人员公开的失败索引,不包含业务正文、异常堆栈或身份凭据。 */
2
+ export interface DiagnosticRecord {
3
+ readonly diagnosticId: string;
4
+ readonly requestId: string;
5
+ readonly occurredAt: string;
6
+ readonly expiresAt: string;
7
+ readonly service: "server";
8
+ readonly stage: "http";
9
+ readonly method: string;
10
+ readonly route: string;
11
+ readonly statusCode: number;
12
+ readonly errorCode: string;
13
+ }
@@ -24,6 +24,7 @@ export type PermissionAction =
24
24
  | "reveal"
25
25
  | "approve"
26
26
  | "execute"
27
+ | "use"
27
28
  | "retry"
28
29
  | "manage";
29
30
 
@@ -1,92 +0,0 @@
1
- #!/bin/sh
2
- set -eu
3
-
4
- index_url="${WINDY_PYPI_INDEX_URL:-}"
5
- total_timeout_seconds="${WINDY_PYPI_TOTAL_TIMEOUT_SECONDS:-}"
6
-
7
- case "$index_url" in
8
- http://* | https://*) ;;
9
- *)
10
- echo "Agent Server Python index 必须是 credential-free HTTP(S) URL" >&2
11
- exit 64
12
- ;;
13
- esac
14
- case "$index_url" in
15
- *"@"* | *"?"* | *"#"*)
16
- echo "Agent Server Python index 不得内嵌 credential、query 或 fragment" >&2
17
- exit 64
18
- ;;
19
- esac
20
-
21
- index_address="${index_url#*://}"
22
- index_host="${index_address%%/*}"
23
- case "$index_address" in
24
- "" | *[!A-Za-z0-9._~:/%-]*)
25
- echo "Agent Server Python index 含有不安全字符" >&2
26
- exit 64
27
- ;;
28
- esac
29
- case "$index_host" in
30
- "" | *[!A-Za-z0-9.:-]*)
31
- echo "Agent Server Python index host 无效" >&2
32
- exit 64
33
- ;;
34
- esac
35
- case "$total_timeout_seconds" in
36
- "" | *[!0-9]*)
37
- echo "WINDY_PYPI_TOTAL_TIMEOUT_SECONDS 必须是 1 到 600 的整数" >&2
38
- exit 64
39
- ;;
40
- esac
41
- if [ "$total_timeout_seconds" -lt 1 ] || [ "$total_timeout_seconds" -gt 600 ]; then
42
- echo "WINDY_PYPI_TOTAL_TIMEOUT_SECONDS 必须是 1 到 600 的整数" >&2
43
- exit 64
44
- fi
45
-
46
- trusted_host=""
47
- insecure_host=""
48
- case "$index_url" in
49
- http://*)
50
- trusted_host="$index_host"
51
- insecure_host="$index_host"
52
- ;;
53
- esac
54
-
55
- run_uv_network() {
56
- operation="$1"
57
- shift
58
- if ! timeout --kill-after=5s "${total_timeout_seconds}s" env \
59
- UV_DEFAULT_INDEX="$index_url" \
60
- UV_INSECURE_HOST="$insecure_host" \
61
- UV_CONCURRENT_DOWNLOADS=1 \
62
- UV_HTTP_TIMEOUT=30 \
63
- UV_HTTP_RETRIES=2 \
64
- UV_NO_PROGRESS=1 \
65
- sh -c 'attempt=1; while [ "$attempt" -le 3 ]; do "$@" && exit 0; if [ "$attempt" -lt 3 ]; then echo "[windy] Python 网络操作失败,2 秒后重试" >&2; sleep 2; fi; attempt=$((attempt + 1)); done; exit 1' windy-python "$@"; then
66
- echo "Agent Server Python index 不可用或总时限已到:${operation}失败" >&2
67
- exit 70
68
- fi
69
- }
70
-
71
- case "${1:-}" in
72
- install-uv)
73
- if ! timeout --kill-after=5s "${total_timeout_seconds}s" env \
74
- PIP_INDEX_URL="$index_url" \
75
- PIP_TRUSTED_HOST="$trusted_host" \
76
- pip install --no-cache-dir --timeout 30 --retries 2 uv==0.9.27; then
77
- echo "Agent Server Python index 不可用或总时限已到:无法安装 uv" >&2
78
- exit 70
79
- fi
80
- ;;
81
- lock)
82
- run_uv_network "lock index 刷新" uv lock
83
- ;;
84
- sync)
85
- shift
86
- run_uv_network "依赖同步" uv sync "$@"
87
- ;;
88
- *)
89
- echo "未知的 Agent Server Python 安装阶段" >&2
90
- exit 64
91
- ;;
92
- esac
@@ -1,51 +0,0 @@
1
- [project]
2
- name = "southwind-agent-server"
3
- version = "0.1.0"
4
- description = "Southwind AI canonical Agent Runtime server"
5
- requires-python = ">=3.12,<3.13"
6
- dependencies = [
7
- "cryptography==49.0.0",
8
- "fastapi==0.139.2",
9
- "httpx==0.28.1",
10
- "jsonschema==4.26.0",
11
- "opentelemetry-api==1.42.1",
12
- "opentelemetry-exporter-otlp-proto-http==1.42.1",
13
- "opentelemetry-sdk==1.42.1",
14
- "pillow==12.3.0",
15
- "psycopg[binary,pool]==3.3.4",
16
- "pydantic==2.13.4",
17
- "uvicorn==0.51.0",
18
- ]
19
-
20
- [dependency-groups]
21
- dev = [
22
- "mypy==2.3.0",
23
- "pytest==9.1.1",
24
- "pytest-asyncio==1.4.0",
25
- "ruff==0.15.22",
26
- "types-jsonschema==4.26.0.20260518",
27
- ]
28
-
29
- [tool.pytest.ini_options]
30
- asyncio_mode = "auto"
31
- pythonpath = [".", "src"]
32
- testpaths = ["tests"]
33
-
34
- [tool.ruff]
35
- line-length = 88
36
- target-version = "py312"
37
-
38
- [tool.ruff.lint]
39
- select = ["E", "F", "I", "UP", "B", "ASYNC"]
40
-
41
- [tool.mypy]
42
- python_version = "3.12"
43
- strict = true
44
- files = ["src", "tests"]
45
-
46
- [build-system]
47
- requires = ["hatchling"]
48
- build-backend = "hatchling.build"
49
-
50
- [tool.hatch.build.targets.wheel]
51
- packages = ["src/southwind_agent_server"]
@@ -1,5 +0,0 @@
1
- """Southwind AI Agent Server."""
2
-
3
- from .app import create_app
4
-
5
- __all__ = ["create_app"]
@@ -1,344 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import os
4
- from collections.abc import AsyncIterator
5
- from contextlib import asynccontextmanager
6
- from typing import Annotated, cast
7
-
8
- from fastapi import FastAPI, Header, Query, Request
9
- from fastapi.exceptions import RequestValidationError
10
- from fastapi.responses import JSONResponse, StreamingResponse
11
- from pydantic import ValidationError
12
-
13
- from .artifact_input import ArtifactLoader
14
- from .client_completion_routes import install_client_completion_routes
15
- from .contracts import (
16
- CancelRunRequest,
17
- CancelRunResponse,
18
- EvaluationResultRequest,
19
- EvaluationResultResponse,
20
- JsonValue,
21
- RunResultResponse,
22
- RunStatusResponse,
23
- StartRunRequest,
24
- StartRunResponse,
25
- )
26
- from .engine import AgentEngineAdapter, SafeEngineError
27
- from .engine_capacity import engine_capacity
28
- from .health_routes import install_health_routes
29
- from .http_helpers import (
30
- authorized,
31
- parse_cursor,
32
- provider_governance_snapshot,
33
- safe_error,
34
- )
35
- from .report_routes import create_report_router
36
- from .report_store import AgentRuntimeReportStore
37
- from .runtime_compatibility import (
38
- OFFER_DIGEST_HEADER,
39
- PROTOCOL_HEADER,
40
- RuntimeCompatibilityError,
41
- validate_runtime_compatibility_pin,
42
- )
43
- from .runtime_factory import (
44
- default_engine,
45
- default_report_store,
46
- default_store,
47
- )
48
- from .service import AgentRunService
49
- from .service_errors import OperationNotFoundError, RunNotFoundError
50
- from .sqlite_store import RunStoreCapacityError
51
- from .sse import event_stream
52
- from .store import IdempotencyConflictError, ReleaseNotFoundError, RunStore
53
- from .telemetry import configure_telemetry
54
- from .vision_requirement import require_vision_readiness
55
-
56
-
57
- def create_app(
58
- engine: AgentEngineAdapter | None = None,
59
- *,
60
- heartbeat_seconds: float = 15.0,
61
- internal_token: str | None = None,
62
- store: RunStore | None = None,
63
- report_store: AgentRuntimeReportStore | None = None,
64
- ) -> FastAPI:
65
- configure_telemetry()
66
- runtime_report_store = report_store or default_report_store()
67
- runtime_engine = engine or default_engine(runtime_report_store)
68
- capacity = engine_capacity(runtime_engine)
69
- runtime = AgentRunService(
70
- runtime_engine,
71
- store or default_store(),
72
- runtime_report_store,
73
- (
74
- ArtifactLoader(
75
- os.environ.get(
76
- "AI_ARTIFACT_URL",
77
- "http://server:9747/api/internal/ai/artifacts",
78
- ),
79
- internal_token,
80
- )
81
- if internal_token
82
- else None
83
- ),
84
- max_concurrent_runs=capacity.max_concurrent_runs,
85
- max_queue_depth=capacity.max_queue_depth,
86
- )
87
-
88
- @asynccontextmanager
89
- async def lifespan(_application: FastAPI) -> AsyncIterator[None]:
90
- await runtime.recover()
91
- try:
92
- yield
93
- finally:
94
- await runtime.close()
95
-
96
- application = FastAPI(
97
- title="Southwind AI Agent Server",
98
- version="0.1.0",
99
- lifespan=lifespan,
100
- )
101
- application.include_router(
102
- create_report_router(runtime_report_store, runtime.store, internal_token)
103
- )
104
-
105
- install_health_routes(application, runtime, runtime_engine, internal_token)
106
- install_client_completion_routes(application, runtime_engine, internal_token)
107
-
108
- @application.get("/health/provider-governance", response_model=None)
109
- async def provider_governance_health(
110
- authorization: Annotated[str | None, Header()] = None,
111
- ) -> dict[str, int | float | str | None] | JSONResponse:
112
- if not authorized(authorization, internal_token):
113
- return safe_error(403, "FORBIDDEN", "内部调用认证失败", False)
114
- health = getattr(runtime_engine, "governance_health", None)
115
- if not health:
116
- return safe_error(
117
- 503,
118
- "RUNTIME_UNAVAILABLE",
119
- "Provider 字段治理尚未配置",
120
- True,
121
- )
122
- return provider_governance_snapshot(
123
- cast(dict[str, int | float | str | None], health())
124
- )
125
-
126
- @application.exception_handler(OperationNotFoundError)
127
- async def operation_not_found(
128
- _request: Request,
129
- _error: OperationNotFoundError,
130
- ) -> JSONResponse:
131
- return safe_error(404, "OPERATION_NOT_FOUND", "Agent Operation 不存在", False)
132
-
133
- @application.exception_handler(RunNotFoundError)
134
- async def run_not_found(
135
- _request: Request,
136
- _error: RunNotFoundError,
137
- ) -> JSONResponse:
138
- return safe_error(404, "RUN_CONFLICT", "Agent Run 不存在", False)
139
-
140
- @application.exception_handler(IdempotencyConflictError)
141
- async def idempotency_conflict(
142
- _request: Request,
143
- _error: IdempotencyConflictError,
144
- ) -> JSONResponse:
145
- return safe_error(409, "RUN_CONFLICT", "幂等键已用于其他请求", False)
146
-
147
- @application.exception_handler(ReleaseNotFoundError)
148
- async def release_not_found(
149
- _request: Request,
150
- _error: ReleaseNotFoundError,
151
- ) -> JSONResponse:
152
- return safe_error(404, "RUN_CONFLICT", "Agent Release 不存在", False)
153
-
154
- @application.exception_handler(RunStoreCapacityError)
155
- async def run_store_capacity(
156
- _request: Request,
157
- _error: RunStoreCapacityError,
158
- ) -> JSONResponse:
159
- return safe_error(
160
- 429,
161
- "BUDGET_EXCEEDED",
162
- "Agent Run 存储容量已满",
163
- True,
164
- )
165
-
166
- @application.exception_handler(SafeEngineError)
167
- async def safe_engine_error(
168
- _request: Request,
169
- error: SafeEngineError,
170
- ) -> JSONResponse:
171
- status = 403 if error.code == "FORBIDDEN" else 503
172
- if error.code in {"INVALID_INPUT", "BUDGET_EXCEEDED"}:
173
- status = 400
174
- return safe_error(
175
- status,
176
- error.code,
177
- error.safe_message,
178
- error.retryable,
179
- )
180
-
181
- @application.exception_handler(ValidationError)
182
- async def validation_error(
183
- _request: Request,
184
- _error: ValidationError,
185
- ) -> JSONResponse:
186
- return safe_error(400, "INVALID_INPUT", "请求格式无效", False)
187
-
188
- @application.exception_handler(RequestValidationError)
189
- async def request_validation_error(
190
- _request: Request,
191
- _error: RequestValidationError,
192
- ) -> JSONResponse:
193
- return safe_error(400, "INVALID_INPUT", "请求格式无效", False)
194
-
195
- @application.post("/api/agent/runs", response_model=StartRunResponse)
196
- async def start_run(
197
- request: StartRunRequest,
198
- idempotency_key: Annotated[str, Header(alias="Idempotency-Key")],
199
- authorization: Annotated[str | None, Header()] = None,
200
- runtime_protocol: Annotated[str | None, Header(alias=PROTOCOL_HEADER)] = None,
201
- runtime_offer_digest: Annotated[
202
- str | None, Header(alias=OFFER_DIGEST_HEADER)
203
- ] = None,
204
- ) -> StartRunResponse | JSONResponse:
205
- if not authorized(authorization, internal_token):
206
- return safe_error(403, "FORBIDDEN", "内部调用认证失败", False)
207
- if not idempotency_key.strip():
208
- return safe_error(400, "INVALID_INPUT", "幂等键不能为空", False)
209
- try:
210
- validate_runtime_compatibility_pin(
211
- runtime_protocol,
212
- runtime_offer_digest,
213
- runtime_engine.engine_id,
214
- )
215
- except RuntimeCompatibilityError:
216
- return safe_error(
217
- 409,
218
- "RUNTIME_UNAVAILABLE",
219
- "Agent Runtime compatibility pin 不匹配",
220
- False,
221
- )
222
- try:
223
- await require_vision_readiness(runtime_engine, request)
224
- except SafeEngineError as error:
225
- return safe_error(503, error.code, error.safe_message, error.retryable)
226
- record = await runtime.start(
227
- request,
228
- idempotency_key,
229
- )
230
- return StartRunResponse(
231
- run_id=record.run_id,
232
- status=record.status,
233
- events_url=f"/api/agent/runs/{record.run_id}/events",
234
- )
235
-
236
- @application.get(
237
- "/api/agent/runs/{run_id}",
238
- response_model=RunStatusResponse,
239
- )
240
- async def get_run_status(
241
- run_id: str,
242
- authorization: Annotated[str | None, Header()] = None,
243
- ) -> RunStatusResponse | JSONResponse:
244
- if not authorized(authorization, internal_token):
245
- return safe_error(403, "FORBIDDEN", "内部调用认证失败", False)
246
- record = await runtime.get(run_id)
247
- terminal_event = cast(
248
- dict[str, JsonValue] | None,
249
- record.events[-1] if record.terminal and record.events else None,
250
- )
251
- return RunStatusResponse(
252
- run_id=record.run_id,
253
- status=record.status,
254
- last_sequence=len(record.events),
255
- terminal_event=terminal_event,
256
- )
257
-
258
- @application.get("/api/agent/runs/{run_id}/events", response_model=None)
259
- async def get_events(
260
- run_id: str,
261
- after: Annotated[int | None, Query(ge=0)] = None,
262
- last_event_id: Annotated[str | None, Header(alias="Last-Event-ID")] = None,
263
- authorization: Annotated[str | None, Header()] = None,
264
- ) -> StreamingResponse | JSONResponse:
265
- if not authorized(authorization, internal_token):
266
- return safe_error(403, "FORBIDDEN", "内部调用认证失败", False)
267
- await runtime.get(run_id)
268
- try:
269
- cursor = parse_cursor(after, last_event_id)
270
- except ValueError:
271
- return safe_error(400, "INVALID_INPUT", "事件游标无效", False)
272
- return StreamingResponse(
273
- event_stream(runtime, run_id, cursor, heartbeat_seconds),
274
- media_type="text/event-stream",
275
- headers={
276
- "Cache-Control": "no-cache, no-transform",
277
- "X-Accel-Buffering": "no",
278
- },
279
- )
280
-
281
- @application.get(
282
- "/api/agent/runs/{run_id}/result",
283
- response_model=RunResultResponse,
284
- )
285
- async def get_result(
286
- run_id: str,
287
- authorization: Annotated[str | None, Header()] = None,
288
- ) -> RunResultResponse | JSONResponse:
289
- if not authorized(authorization, internal_token):
290
- return safe_error(403, "FORBIDDEN", "内部调用认证失败", False)
291
- record = await runtime.get(run_id)
292
- if record.status == "completed":
293
- return RunResultResponse(
294
- run_id=record.run_id,
295
- status="completed",
296
- output=record.output,
297
- )
298
- if record.status == "cancelled":
299
- return safe_error(409, "RUN_CANCELLED", "Agent Run 已取消", False)
300
- if record.status == "failed":
301
- return safe_error(409, "RUNTIME_UNAVAILABLE", "Agent Run 执行失败", True)
302
- return safe_error(409, "RUN_CONFLICT", "Agent Run 尚未完成", True)
303
-
304
- @application.post(
305
- "/api/agent/runs/{run_id}/cancel",
306
- response_model=CancelRunResponse,
307
- )
308
- async def cancel_run(
309
- run_id: str,
310
- _request: CancelRunRequest,
311
- authorization: Annotated[str | None, Header()] = None,
312
- ) -> CancelRunResponse | JSONResponse:
313
- if not authorized(authorization, internal_token):
314
- return safe_error(403, "FORBIDDEN", "内部调用认证失败", False)
315
- record = await runtime.cancel(run_id)
316
- return CancelRunResponse(run_id=record.run_id, status=record.status)
317
-
318
- @application.post(
319
- "/api/agent/evaluations",
320
- response_model=EvaluationResultResponse,
321
- )
322
- async def record_evaluation(
323
- request: EvaluationResultRequest,
324
- authorization: Annotated[str | None, Header()] = None,
325
- ) -> EvaluationResultResponse | JSONResponse:
326
- if not authorized(authorization, internal_token):
327
- return safe_error(403, "FORBIDDEN", "内部调用认证失败", False)
328
- evaluation_id = await runtime.record_evaluation(
329
- request.release_id,
330
- request.evaluation_set_key,
331
- request.evaluation_set_version,
332
- request.metrics,
333
- )
334
- return EvaluationResultResponse(
335
- evaluation_id=evaluation_id,
336
- release_id=request.release_id,
337
- )
338
-
339
- application.state.run_service = runtime
340
- application.state.report_store = runtime_report_store
341
- return application
342
-
343
-
344
- app = create_app(internal_token=os.environ.get("AGENT_SERVER_INTERNAL_TOKEN"))
@@ -1,30 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from .store import RunRecord, RunStore
4
-
5
-
6
- async def resolve_pending_approval(
7
- store: RunStore,
8
- record: RunRecord,
9
- outcome: str,
10
- ) -> None:
11
- pending: dict[str, object] | None = None
12
- for event in record.events:
13
- if event.get("type") == "approval.required":
14
- pending = event
15
- elif event.get("type") == "approval.resolved":
16
- pending = None
17
- if not pending:
18
- return
19
- work_item_id = pending.get("workItemId")
20
- tool_call_id = pending.get("toolCallId")
21
- if isinstance(work_item_id, str) and isinstance(tool_call_id, str):
22
- await store.append(
23
- record.run_id,
24
- "approval.resolved",
25
- {
26
- "workItemId": work_item_id,
27
- "toolCallId": tool_call_id,
28
- "outcome": outcome,
29
- },
30
- )