create-windy 0.8.2 → 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 (574) hide show
  1. package/dist/cli.js +855 -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/admin-catalog-bootstrap.ts +25 -0
  245. package/template/apps/server/src/agent/agent-session-bootstrap.ts +7 -8
  246. package/template/apps/server/src/agent/agent-session-facade.ts +12 -0
  247. package/template/apps/server/src/agent/agent-session-validation.ts +43 -0
  248. package/template/apps/server/src/agent/dsh-runtime-wire.test.ts +33 -0
  249. package/template/apps/server/src/agent/governance-runtime.ts +41 -0
  250. package/template/apps/server/src/agent/operation-catalog.test.ts +202 -0
  251. package/template/apps/server/src/agent/operation-catalog.ts +135 -0
  252. package/template/apps/server/src/agent/remote-runtime-response.ts +1 -1
  253. package/template/apps/server/src/agent/run-browser-visibility.test.ts +59 -0
  254. package/template/apps/server/src/agent/run-browser-visibility.ts +11 -0
  255. package/template/apps/server/src/agent/run-contracts.ts +1 -0
  256. package/template/apps/server/src/agent/run-definition-support.ts +9 -0
  257. package/template/apps/server/src/agent/run-operation-policy.ts +1 -0
  258. package/template/apps/server/src/agent/run-route-response.ts +35 -0
  259. package/template/apps/server/src/agent/run-routes.ts +46 -43
  260. package/template/apps/server/src/agent/runtime-bootstrap.ts +21 -20
  261. package/template/apps/server/src/agent/runtime-disabled-composition.ts +28 -0
  262. package/template/apps/server/src/agent/runtime-tool-composition.ts +2 -0
  263. package/template/apps/server/src/agent/session-projection-facade.ts +8 -9
  264. package/template/apps/server/src/agent/session-projection-governance.ts +10 -0
  265. package/template/apps/server/src/agent/session-projection-view.ts +19 -16
  266. package/template/apps/server/src/agent/session-recording-reader.contract.test.ts +131 -0
  267. package/template/apps/server/src/agent/session-recording-reader.ts +62 -0
  268. package/template/apps/server/src/agent/tool-catalog-audit.ts +22 -0
  269. package/template/apps/server/src/agent/tool-catalog-availability.ts +21 -0
  270. package/template/apps/server/src/agent/tool-catalog-routes.test.ts +103 -0
  271. package/template/apps/server/src/agent/tool-catalog-routes.ts +62 -0
  272. package/template/apps/server/src/agent/tool-catalog.test.ts +122 -0
  273. package/template/apps/server/src/agent/tool-catalog.ts +44 -0
  274. package/template/apps/server/src/agent/tool-registry.ts +45 -14
  275. package/template/apps/server/src/agent/workbench-bootstrap.ts +39 -0
  276. package/template/apps/server/src/agent/workbench-event-projection.ts +115 -0
  277. package/template/apps/server/src/agent/workbench-facade.contract.test.ts +189 -0
  278. package/template/apps/server/src/agent/workbench-facade.ts +339 -0
  279. package/template/apps/server/src/agent/workbench-recording.contract.test.ts +328 -0
  280. package/template/apps/server/src/agent/workbench-routes.ts +97 -0
  281. package/template/apps/server/src/agent/workbench-run-integration.test.ts +231 -0
  282. package/template/apps/server/src/agent/workbench-run-reader.ts +187 -0
  283. package/template/apps/server/src/agent/workbench-safe-result.ts +61 -0
  284. package/template/apps/server/src/agent/workbench-sse.ts +50 -0
  285. package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +9 -0
  286. package/template/apps/server/src/agent-skills/access.ts +88 -0
  287. package/template/apps/server/src/agent-skills/bootstrap.ts +49 -0
  288. package/template/apps/server/src/agent-skills/builtin-registration.ts +83 -0
  289. package/template/apps/server/src/agent-skills/builtins.ts +19 -0
  290. package/template/apps/server/src/agent-skills/bundle-zip.ts +163 -0
  291. package/template/apps/server/src/agent-skills/bundle.test.ts +79 -0
  292. package/template/apps/server/src/agent-skills/bundle.ts +133 -0
  293. package/template/apps/server/src/agent-skills/contracts.ts +46 -0
  294. package/template/apps/server/src/agent-skills/drizzle-repository.ts +125 -0
  295. package/template/apps/server/src/agent-skills/input.ts +29 -0
  296. package/template/apps/server/src/agent-skills/postgres.integration.test.ts +348 -0
  297. package/template/apps/server/src/agent-skills/read-routes.test.ts +116 -0
  298. package/template/apps/server/src/agent-skills/reader.ts +108 -0
  299. package/template/apps/server/src/agent-skills/repository.ts +105 -0
  300. package/template/apps/server/src/agent-skills/routes.ts +176 -0
  301. package/template/apps/server/src/agent-skills/service.test.ts +295 -0
  302. package/template/apps/server/src/agent-skills/service.ts +301 -0
  303. package/template/apps/server/src/agent-workflow/preset-registry.test.ts +137 -0
  304. package/template/apps/server/src/agent-workflow/preset-registry.ts +191 -0
  305. package/template/apps/server/src/agent-workflow/preset-routes.test.ts +94 -0
  306. package/template/apps/server/src/agent-workflow/preset-routes.ts +45 -0
  307. package/template/apps/server/src/agent-workflow/query-service.ts +36 -0
  308. package/template/apps/server/src/agent-workflow/recording-projection.contract.test.ts +196 -0
  309. package/template/apps/server/src/agent-workflow/recording-projection.ts +86 -0
  310. package/template/apps/server/src/ai-runtime-report/service.test.ts +10 -7
  311. package/template/apps/server/src/ai-runtime-report/service.ts +1 -1
  312. package/template/apps/server/src/app/agent-workflow-presets.ts +4 -0
  313. package/template/apps/server/src/app/dsh-skill-draft-audit.test.ts +195 -0
  314. package/template/apps/server/src/app/dsh-skill-draft-audit.ts +115 -0
  315. package/template/apps/server/src/app/dsh-workbench-audit.test.ts +71 -0
  316. package/template/apps/server/src/app/dsh-workbench-audit.ts +34 -0
  317. package/template/apps/server/src/app/dsh-workbench-handshake.test.ts +63 -0
  318. package/template/apps/server/src/app/dsh-workbench-handshake.ts +48 -0
  319. package/template/apps/server/src/app/dsh-workbench-http.test.ts +96 -0
  320. package/template/apps/server/src/app/dsh-workbench-lan-origin.test.ts +114 -0
  321. package/template/apps/server/src/app/dsh-workbench-launch.test.ts +70 -0
  322. package/template/apps/server/src/app/dsh-workbench-origin.test.ts +54 -0
  323. package/template/apps/server/src/app/dsh-workbench-proxy.ts +205 -0
  324. package/template/apps/server/src/app/dsh-workbench-session-conflict.test.ts +61 -0
  325. package/template/apps/server/src/app/dsh-workbench-session.ts +59 -0
  326. package/template/apps/server/src/app/dsh-workbench-socket-audit.test.ts +115 -0
  327. package/template/apps/server/src/app/dsh-workbench-socket.test.ts +246 -0
  328. package/template/apps/server/src/app/dsh-workbench-socket.ts +272 -0
  329. package/template/apps/server/src/app/dsh-workbench-test-support.ts +158 -0
  330. package/template/apps/server/src/app/dsh-workbench.test.ts +213 -0
  331. package/template/apps/server/src/app/dsh-workbench.ts +279 -0
  332. package/template/apps/server/src/app/workbench-public-origin.ts +16 -0
  333. package/template/apps/server/src/data-governance/user-plaintext-routes.test.ts +3 -0
  334. package/template/apps/server/src/http-app.ts +31 -0
  335. package/template/apps/server/src/mcp/adapter.ts +1 -0
  336. package/template/apps/server/src/module-composition.test.ts +23 -0
  337. package/template/apps/server/src/module-composition.ts +9 -2
  338. package/template/apps/server/src/observability/bootstrap.ts +12 -0
  339. package/template/apps/server/src/observability/diagnostic-failure-recorder.ts +94 -0
  340. package/template/apps/server/src/observability/diagnostic-http-contract.test.ts +42 -0
  341. package/template/apps/server/src/observability/diagnostic-index.test.ts +89 -0
  342. package/template/apps/server/src/observability/diagnostic-index.ts +88 -0
  343. package/template/apps/server/src/observability/diagnostic-repository.ts +67 -0
  344. package/template/apps/server/src/platform-app-bootstrap.ts +42 -0
  345. package/template/apps/server/src/platform-http-runtime.ts +6 -0
  346. package/template/apps/server/src/runtime-development.test.ts +25 -0
  347. package/template/apps/server/src/runtime-development.ts +6 -44
  348. package/template/apps/server/src/system/diagnostic-routes.test.ts +78 -0
  349. package/template/apps/server/src/system/diagnostic-routes.ts +66 -0
  350. package/template/apps/web/Dockerfile +9 -1
  351. package/template/apps/web/dev/start.ts +21 -10
  352. package/template/apps/web/dsh-workbench-location.ts +21 -0
  353. package/template/apps/web/dsh-workbench-proxy.test.ts +121 -0
  354. package/template/apps/web/dsh-workbench-proxy.ts +194 -0
  355. package/template/apps/web/package.json +3 -1
  356. package/template/apps/web/server.ts +27 -6
  357. package/template/apps/web/src/composables/useLoginFlow.ts +13 -1
  358. package/template/apps/web/src/pages/errors/PlatformErrorPage.vue +6 -0
  359. package/template/apps/web/src/pages/errors/PlatformErrorPage.webtest.ts +14 -1
  360. package/template/apps/web/src/pages/errors/error-page-extension.ts +1 -0
  361. package/template/apps/web/src/pages/system/AgentDebugPage.vue +14 -0
  362. package/template/apps/web/src/pages/system/AgentNativePage.vue +44 -0
  363. package/template/apps/web/src/pages/system/AgentSessionPage.vue +29 -8
  364. package/template/apps/web/src/pages/system/AgentToolsPage.vue +76 -0
  365. package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +20 -7
  366. package/template/apps/web/src/pages/system/DiagnosticLookupPage.vue +56 -0
  367. package/template/apps/web/src/pages/system/DiagnosticLookupPage.webtest.ts +99 -0
  368. package/template/apps/web/src/pages/system/SystemAgentSkillsPage.vue +88 -0
  369. package/template/apps/web/src/pages/system/components/DiagnosticRecordDetails.vue +52 -0
  370. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillDetailDialog.vue +166 -0
  371. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillGovernanceActionDialog.vue +51 -0
  372. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.vue +320 -0
  373. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillImportDialog.webtest.ts +96 -0
  374. package/template/apps/web/src/pages/system/components/agent-skills/AgentSkillsTable.vue +69 -0
  375. package/template/apps/web/src/pages/system/components/agent-workbench/AgentWorkbench.vue +236 -0
  376. package/template/apps/web/src/pages/system/components/agent-workbench/DraftLeaveDialog.vue +34 -0
  377. package/template/apps/web/src/pages/system/components/agent-workbench/ReplayEventDetail.vue +175 -0
  378. package/template/apps/web/src/pages/system/components/agent-workbench/SessionReplayTimeline.vue +142 -0
  379. package/template/apps/web/src/pages/system/components/agent-workbench/SessionReplayTimeline.webtest.ts +242 -0
  380. package/template/apps/web/src/pages/system/components/agent-workbench/TestRunComposer.vue +97 -0
  381. package/template/apps/web/src/pages/system/components/agent-workbench/ToolCatalogPanel.vue +100 -0
  382. package/template/apps/web/src/pages/system/components/agent-workbench/ToolCatalogPanel.webtest.ts +55 -0
  383. package/template/apps/web/src/pages/system/components/agent-workbench/ToolRuleDetail.vue +81 -0
  384. package/template/apps/web/src/pages/system/components/agent-workbench/WorkbenchSessionList.vue +57 -0
  385. package/template/apps/web/src/pages/system/components/agent-workbench/catalog-presenter.ts +20 -0
  386. package/template/apps/web/src/pages/system/components/agent-workbench/replay-presenter.ts +94 -0
  387. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.vue +82 -0
  388. package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowPresetCatalog.webtest.ts +57 -0
  389. package/template/apps/web/src/pages/system/composables/useAgentSkillsGovernance.ts +105 -0
  390. package/template/apps/web/src/pages/system/composables/useAgentWorkbench.ts +298 -0
  391. package/template/apps/web/src/pages/system/composables/useAgentWorkbench.webtest.ts +164 -0
  392. package/template/apps/web/src/pages/system/composables/useAgentWorkflowPresets.ts +44 -0
  393. package/template/apps/web/src/pages/system/composables/useDiagnosticLookup.ts +64 -0
  394. package/template/apps/web/src/pages/system/composables/useSessionReplay.ts +48 -0
  395. package/template/apps/web/src/router/error-navigation.ts +3 -1
  396. package/template/apps/web/src/router/error-navigation.webtest.ts +14 -2
  397. package/template/apps/web/src/router/index.ts +8 -45
  398. package/template/apps/web/src/router/platform-admin-pages.ts +79 -0
  399. package/template/apps/web/src/router/platform-admin-route-bindings.ts +12 -0
  400. package/template/apps/web/src/services/agent-admin-api.ts +155 -0
  401. package/template/apps/web/src/services/agent-admin-api.webtest.ts +120 -0
  402. package/template/apps/web/src/services/agent-skills-api.ts +55 -0
  403. package/template/apps/web/src/services/agent-workbench-event.ts +60 -0
  404. package/template/apps/web/src/services/agent-workflow-api.ts +12 -0
  405. package/template/apps/web/src/services/diagnostics-api.ts +12 -0
  406. package/template/apps/web/src/services/http.ts +18 -0
  407. package/template/apps/web/src/services/http.webtest.ts +51 -0
  408. package/template/apps/web/vite.config.ts +39 -0
  409. package/template/deploy/dsh/README.md +5 -0
  410. package/template/deploy/dsh/documents/README.md +9 -0
  411. package/template/deploy/dsh/documents/requirements.in +6 -0
  412. package/template/deploy/dsh/documents/requirements.lock +72 -0
  413. package/template/docker-compose.yml +24 -10
  414. package/template/docs/adr/0004-embedded-dsh-runtime.md +9 -0
  415. package/template/docs/architecture/agent-admin-workbench-implementation.md +73 -0
  416. package/template/docs/architecture/agent-admin-workbench-plan.md +41 -0
  417. package/template/docs/architecture/agent-harness.md +6 -0
  418. package/template/docs/architecture/agent-runtime-compatibility.md +2 -0
  419. package/template/docs/architecture/embedded-dsh-integration.md +44 -0
  420. package/template/docs/development/dsh-plugins.md +55 -0
  421. package/template/docs/operations/dsh-agent-migration.md +98 -0
  422. package/template/docs/platform/agent-production-store.md +5 -78
  423. package/template/docs/platform/agent-runtime-observability.md +2 -0
  424. package/template/docs/platform/agent-runtime.md +2 -0
  425. package/template/docs/platform/agent-skills.md +25 -0
  426. package/template/package.json +4 -3
  427. package/template/packages/database/drizzle/0064_dsh_skills_diagnostics.sql +42 -0
  428. package/template/packages/database/drizzle/meta/0064_snapshot.json +15349 -0
  429. package/template/packages/database/drizzle/meta/_journal.json +7 -0
  430. package/template/packages/database/package.json +2 -2
  431. package/template/packages/database/src/schema/agent-skills.ts +65 -0
  432. package/template/packages/database/src/schema/diagnostics.ts +27 -0
  433. package/template/packages/database/src/schema/index.ts +8 -0
  434. package/template/packages/modules/package.json +1 -1
  435. package/template/packages/modules/src/ai-operation-composition.ts +9 -0
  436. package/template/packages/modules/src/ai-operation-visibility.test.ts +33 -0
  437. package/template/packages/modules/src/manifest.ts +2 -0
  438. package/template/packages/modules/src/system-admin-routes.ts +40 -0
  439. package/template/packages/modules/src/system-admin-ui-catalog.ts +24 -11
  440. package/template/packages/modules/src/system-agent-admin-bindings.ts +44 -0
  441. package/template/packages/modules/src/system-agent-admin-menus.ts +46 -0
  442. package/template/packages/modules/src/system-agent-admin-registration.test.ts +52 -0
  443. package/template/packages/modules/src/system-agent-audit-actions.ts +8 -0
  444. package/template/packages/modules/src/system-agent-dsh.ts +119 -0
  445. package/template/packages/modules/src/system-ai-api-bindings.ts +2 -0
  446. package/template/packages/modules/src/system-api-permissions.ts +9 -0
  447. package/template/packages/modules/src/system-audit-actions.ts +36 -0
  448. package/template/packages/modules/src/system-features.ts +24 -0
  449. package/template/packages/modules/src/system-module-audit-selection.ts +25 -0
  450. package/template/packages/modules/src/system-module-catalog.ts +22 -40
  451. package/template/packages/modules/src/system-module-ownership.ts +12 -0
  452. package/template/packages/modules/src/system-modules.ts +16 -3
  453. package/template/packages/modules/src/system-permissions.ts +15 -0
  454. package/template/packages/server-sdk/index.ts +2 -0
  455. package/template/packages/server-sdk/package.json +2 -2
  456. package/template/packages/server-sdk/src/agent-session-provider.ts +19 -0
  457. package/template/packages/shared/index.ts +14 -0
  458. package/template/packages/shared/package.json +1 -1
  459. package/template/packages/shared/src/agent-admin-catalog.ts +73 -0
  460. package/template/packages/shared/src/agent-skills.ts +68 -0
  461. package/template/packages/shared/src/agent-workbench.ts +100 -0
  462. package/template/packages/shared/src/agent-workflow-presets.ts +26 -0
  463. package/template/packages/shared/src/diagnostics.ts +13 -0
  464. package/template/packages/shared/src/rbac.ts +1 -0
  465. package/template/apps/agent-server/install-python-dependencies.sh +0 -92
  466. package/template/apps/agent-server/pyproject.toml +0 -51
  467. package/template/apps/agent-server/src/southwind_agent_server/__init__.py +0 -5
  468. package/template/apps/agent-server/src/southwind_agent_server/app.py +0 -344
  469. package/template/apps/agent-server/src/southwind_agent_server/approval_resolution.py +0 -30
  470. package/template/apps/agent-server/src/southwind_agent_server/artifact_input.py +0 -153
  471. package/template/apps/agent-server/src/southwind_agent_server/asgi.py +0 -8
  472. package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +0 -199
  473. package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +0 -203
  474. package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +0 -61
  475. package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +0 -82
  476. package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +0 -121
  477. package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +0 -158
  478. package/template/apps/agent-server/src/southwind_agent_server/config.py +0 -267
  479. package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +0 -24
  480. package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +0 -71
  481. package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +0 -307
  482. package/template/apps/agent-server/src/southwind_agent_server/contracts.py +0 -297
  483. package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +0 -63
  484. package/template/apps/agent-server/src/southwind_agent_server/engine.py +0 -134
  485. package/template/apps/agent-server/src/southwind_agent_server/engine_capacity.py +0 -31
  486. package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +0 -2
  487. package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +0 -61
  488. package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +0 -93
  489. package/template/apps/agent-server/src/southwind_agent_server/http_helpers.py +0 -62
  490. package/template/apps/agent-server/src/southwind_agent_server/lease.py +0 -15
  491. package/template/apps/agent-server/src/southwind_agent_server/multimodal.py +0 -76
  492. package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +0 -329
  493. package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +0 -165
  494. package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +0 -345
  495. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +0 -37
  496. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +0 -235
  497. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_replay.py +0 -44
  498. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_status.py +0 -83
  499. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +0 -336
  500. package/template/apps/agent-server/src/southwind_agent_server/postgres_report_summary.py +0 -304
  501. package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +0 -335
  502. package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +0 -333
  503. package/template/apps/agent-server/src/southwind_agent_server/provider_audit.py +0 -144
  504. package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +0 -309
  505. package/template/apps/agent-server/src/southwind_agent_server/provider_output_guidance.py +0 -34
  506. package/template/apps/agent-server/src/southwind_agent_server/readiness_pin.py +0 -37
  507. package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +0 -218
  508. package/template/apps/agent-server/src/southwind_agent_server/report_metrics.py +0 -149
  509. package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +0 -300
  510. package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +0 -132
  511. package/template/apps/agent-server/src/southwind_agent_server/report_store.py +0 -298
  512. package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +0 -75
  513. package/template/apps/agent-server/src/southwind_agent_server/report_types.py +0 -118
  514. package/template/apps/agent-server/src/southwind_agent_server/run_admission.py +0 -64
  515. package/template/apps/agent-server/src/southwind_agent_server/run_capacity.py +0 -59
  516. package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +0 -74
  517. package/template/apps/agent-server/src/southwind_agent_server/runtime_compatibility.py +0 -89
  518. package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +0 -105
  519. package/template/apps/agent-server/src/southwind_agent_server/runtime_logging.py +0 -57
  520. package/template/apps/agent-server/src/southwind_agent_server/service.py +0 -325
  521. package/template/apps/agent-server/src/southwind_agent_server/service_control.py +0 -64
  522. package/template/apps/agent-server/src/southwind_agent_server/service_errors.py +0 -4
  523. package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +0 -34
  524. package/template/apps/agent-server/src/southwind_agent_server/service_tasks.py +0 -34
  525. package/template/apps/agent-server/src/southwind_agent_server/signal_events.py +0 -53
  526. package/template/apps/agent-server/src/southwind_agent_server/sqlite_catalog.py +0 -118
  527. package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +0 -2
  528. package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +0 -73
  529. package/template/apps/agent-server/src/southwind_agent_server/sqlite_serialization.py +0 -16
  530. package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +0 -350
  531. package/template/apps/agent-server/src/southwind_agent_server/sse.py +0 -41
  532. package/template/apps/agent-server/src/southwind_agent_server/store.py +0 -255
  533. package/template/apps/agent-server/src/southwind_agent_server/store_cipher.py +0 -40
  534. package/template/apps/agent-server/src/southwind_agent_server/structured_logging.py +0 -145
  535. package/template/apps/agent-server/src/southwind_agent_server/telemetry.py +0 -93
  536. package/template/apps/agent-server/src/southwind_agent_server/tool_host.py +0 -152
  537. package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +0 -137
  538. package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +0 -58
  539. package/template/apps/agent-server/src/southwind_agent_server/vision_probe.py +0 -87
  540. package/template/apps/agent-server/src/southwind_agent_server/vision_requirement.py +0 -28
  541. package/template/apps/agent-server/src/southwind_agent_server/vlm_readiness.py +0 -247
  542. package/template/apps/agent-server/tests/__init__.py +0 -1
  543. package/template/apps/agent-server/tests/openai_provider_test_support.py +0 -131
  544. package/template/apps/agent-server/tests/test_api.py +0 -305
  545. package/template/apps/agent-server/tests/test_artifact_input.py +0 -110
  546. package/template/apps/agent-server/tests/test_client_completion.py +0 -230
  547. package/template/apps/agent-server/tests/test_config.py +0 -106
  548. package/template/apps/agent-server/tests/test_fingerprint.py +0 -10
  549. package/template/apps/agent-server/tests/test_multimodal.py +0 -81
  550. package/template/apps/agent-server/tests/test_openai_provider.py +0 -320
  551. package/template/apps/agent-server/tests/test_postgres_report_status.py +0 -59
  552. package/template/apps/agent-server/tests/test_postgres_report_summary.py +0 -298
  553. package/template/apps/agent-server/tests/test_postgres_store.py +0 -135
  554. package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +0 -140
  555. package/template/apps/agent-server/tests/test_provider_governance.py +0 -276
  556. package/template/apps/agent-server/tests/test_report_attempt_lifecycle.py +0 -126
  557. package/template/apps/agent-server/tests/test_report_resilience.py +0 -183
  558. package/template/apps/agent-server/tests/test_report_routes.py +0 -143
  559. package/template/apps/agent-server/tests/test_report_store.py +0 -347
  560. package/template/apps/agent-server/tests/test_report_summary_parity.py +0 -116
  561. package/template/apps/agent-server/tests/test_report_terminal_sync.py +0 -177
  562. package/template/apps/agent-server/tests/test_run_capacity.py +0 -112
  563. package/template/apps/agent-server/tests/test_run_operational_logging.py +0 -114
  564. package/template/apps/agent-server/tests/test_runtime_compatibility.py +0 -119
  565. package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +0 -52
  566. package/template/apps/agent-server/tests/test_sqlite_store.py +0 -182
  567. package/template/apps/agent-server/tests/test_structured_logging.py +0 -142
  568. package/template/apps/agent-server/tests/test_telemetry.py +0 -25
  569. package/template/apps/agent-server/tests/test_tool_approval.py +0 -28
  570. package/template/apps/agent-server/tests/test_tool_structured_output.py +0 -347
  571. package/template/apps/agent-server/tests/test_trajectory.py +0 -91
  572. package/template/apps/agent-server/tests/test_vision_readiness_enforcement.py +0 -72
  573. package/template/apps/agent-server/tests/test_vlm_readiness.py +0 -106
  574. package/template/apps/agent-server/uv.lock +0 -831
@@ -0,0 +1,229 @@
1
+ .windy-skills {
2
+ height: 100%;
3
+ overflow: auto;
4
+ box-sizing: border-box;
5
+ padding: 28px clamp(24px, 4vw, 48px) 48px;
6
+ color: var(--dsw-alias-label-primary);
7
+ background: var(--dsw-alias-bg-base);
8
+ font-size: 14px;
9
+ }
10
+ .windy-skills-content {
11
+ max-width: 960px;
12
+ margin-inline: auto;
13
+ min-width: 0;
14
+ }
15
+ .windy-skills h1 {
16
+ font-size: 20px;
17
+ font-weight: 500;
18
+ line-height: 28px;
19
+ margin: 0;
20
+ }
21
+ .windy-skills header,
22
+ .windy-skills-actions,
23
+ .windy-skill-heading {
24
+ display: flex;
25
+ gap: 8px;
26
+ align-items: center;
27
+ flex-wrap: wrap;
28
+ }
29
+ .windy-skills header {
30
+ justify-content: space-between;
31
+ gap: 16px;
32
+ margin-bottom: 24px;
33
+ }
34
+ .windy-skills p {
35
+ line-height: 1.6;
36
+ }
37
+ .windy-skills .windy-skills-intro {
38
+ margin: 4px 0 0;
39
+ color: var(--dsw-alias-label-secondary);
40
+ font-size: 13px;
41
+ }
42
+ .windy-skills label {
43
+ display: flex;
44
+ flex-direction: column;
45
+ gap: 8px;
46
+ margin-bottom: 16px;
47
+ }
48
+ .windy-skills .windy-skills-workspace {
49
+ flex-direction: row;
50
+ align-items: center;
51
+ flex-wrap: wrap;
52
+ gap: 12px;
53
+ }
54
+ .windy-skills select,
55
+ .windy-skills textarea {
56
+ padding: 8px 12px;
57
+ border: 1px solid var(--dsw-alias-border-l2);
58
+ border-radius: var(--dsw-radius-md);
59
+ color: inherit;
60
+ background: var(--dsw-alias-bg-layer-1);
61
+ font: inherit;
62
+ }
63
+ .windy-skills select {
64
+ min-width: min(100%, 180px);
65
+ max-width: 100%;
66
+ }
67
+ .windy-skills textarea {
68
+ width: 100%;
69
+ box-sizing: border-box;
70
+ min-height: 280px;
71
+ resize: vertical;
72
+ line-height: 1.6;
73
+ }
74
+ .windy-skills :focus-visible {
75
+ outline: 2px solid var(--dsw-alias-link);
76
+ outline-offset: 2px;
77
+ }
78
+ .windy-skills-grid {
79
+ display: grid;
80
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 272px), 1fr));
81
+ gap: 16px;
82
+ padding: 0;
83
+ margin: 20px 0 0;
84
+ list-style: none;
85
+ }
86
+ .windy-skill-card {
87
+ display: flex;
88
+ flex-direction: column;
89
+ min-width: 0;
90
+ padding: 20px;
91
+ border: 1px solid var(--dsw-alias-border-l2);
92
+ border-radius: var(--dsw-radius-lg);
93
+ background: var(--dsw-alias-settings-card-fill);
94
+ }
95
+ .windy-skill-heading {
96
+ flex-wrap: nowrap;
97
+ align-items: flex-start;
98
+ }
99
+ .windy-skill-heading > svg {
100
+ flex: none;
101
+ color: var(--dsw-alias-label-secondary);
102
+ }
103
+ .windy-skill-heading h2 {
104
+ flex: 1;
105
+ min-width: 0;
106
+ overflow-wrap: anywhere;
107
+ margin: 0;
108
+ font-size: 15px;
109
+ line-height: 22px;
110
+ font-weight: 500;
111
+ }
112
+ .windy-skills small {
113
+ color: var(--dsw-alias-label-secondary);
114
+ font-size: 12px;
115
+ line-height: 22px;
116
+ white-space: nowrap;
117
+ }
118
+ .windy-skills .windy-skill-description {
119
+ flex: 1;
120
+ color: var(--dsw-alias-label-secondary);
121
+ font-size: 13px;
122
+ overflow-wrap: anywhere;
123
+ margin: 12px 0 20px;
124
+ }
125
+ .windy-skills .windy-skills-hint {
126
+ color: var(--dsw-alias-label-tertiary);
127
+ font-size: 12px;
128
+ margin: 0;
129
+ }
130
+ .windy-skills-actions > button {
131
+ white-space: nowrap;
132
+ }
133
+ .windy-skill-card .windy-skills-actions {
134
+ gap: 4px;
135
+ }
136
+ .windy-skills [role="alert"] {
137
+ color: var(--dsw-alias-state-error-primary);
138
+ }
139
+ .windy-skills-editor h2 {
140
+ font-size: 16px;
141
+ overflow-wrap: anywhere;
142
+ }
143
+ .windy-skills-form {
144
+ max-width: 720px;
145
+ }
146
+ .windy-skills-form fieldset {
147
+ border: 0;
148
+ padding: 0;
149
+ margin: 24px 0 0;
150
+ min-width: 0;
151
+ }
152
+ .windy-skills-form legend {
153
+ font-weight: 500;
154
+ font-size: 16px;
155
+ padding: 0;
156
+ }
157
+ .windy-skills-form label {
158
+ margin-bottom: 6px;
159
+ }
160
+ .windy-skills-form input,
161
+ .windy-skills-form textarea {
162
+ width: 100%;
163
+ min-width: 0;
164
+ box-sizing: border-box;
165
+ padding: 8px 12px;
166
+ border: 1px solid var(--dsw-alias-border-l2);
167
+ border-radius: var(--dsw-radius-md);
168
+ color: inherit;
169
+ background: var(--dsw-alias-bg-layer-1);
170
+ font: inherit;
171
+ line-height: 1.6;
172
+ }
173
+ .windy-skills-form textarea {
174
+ min-height: 0;
175
+ }
176
+ .windy-skills-field {
177
+ margin-block: 20px;
178
+ }
179
+ .windy-skills .windy-skills-form-hint {
180
+ font-size: 13px;
181
+ line-height: 1.6;
182
+ color: var(--dsw-alias-label-secondary);
183
+ margin: 6px 0 12px;
184
+ white-space: pre-line;
185
+ }
186
+ .windy-skills-assist {
187
+ padding-block: 16px;
188
+ border-block: 1px solid var(--dsw-alias-border-l2);
189
+ }
190
+ .windy-skills-suggestion dl {
191
+ margin-block: 16px;
192
+ }
193
+ .windy-skills-suggestion dt {
194
+ font-weight: 500;
195
+ margin-top: 12px;
196
+ }
197
+ .windy-skills-suggestion dd {
198
+ margin: 4px 0 0;
199
+ white-space: pre-wrap;
200
+ overflow-wrap: anywhere;
201
+ line-height: 1.6;
202
+ }
203
+ .windy-skills-preview {
204
+ margin-block: 20px;
205
+ }
206
+ .windy-skills-preview summary {
207
+ cursor: pointer;
208
+ padding-block: 8px;
209
+ }
210
+ .windy-skills-preview pre {
211
+ white-space: pre-wrap;
212
+ overflow-wrap: anywhere;
213
+ padding: 16px;
214
+ background: var(--dsw-alias-bg-layer-1);
215
+ border: 1px solid var(--dsw-alias-border-l2);
216
+ border-radius: var(--dsw-radius-md);
217
+ font-size: 13px;
218
+ line-height: 1.6;
219
+ }
220
+ .windy-skills-save {
221
+ padding-block: 12px;
222
+ }
223
+ .windy-skills-form :disabled {
224
+ opacity: 0.65;
225
+ cursor: wait;
226
+ }
227
+ .windy-skills-form [aria-invalid="true"] {
228
+ border-color: var(--dsw-alias-state-error-primary);
229
+ }
@@ -0,0 +1,77 @@
1
+ import { afterEach } from "bun:test";
2
+ import { mkdtemp, mkdir, realpath, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { skillResponse, type SkillContext } from "./index.mjs";
6
+ export const cleanups: (() => Promise<unknown>)[] = [];
7
+ afterEach(async () => {
8
+ for (const cleanup of cleanups.splice(0)) await cleanup();
9
+ });
10
+ export const markdown = (name = "my-skill") =>
11
+ `---\nname: ${name}\ndescription: 只处理当前用户主动选择的材料\nuser-invocable: true\ndisable-model-invocation: true\n---\n保留来源,核查结果。\n`;
12
+ export async function fixture() {
13
+ const temporary = await mkdtemp(join(tmpdir(), "windy-skills-"));
14
+ cleanups.push(() => rm(temporary, { recursive: true, force: true }));
15
+ const base = await realpath(temporary),
16
+ root = join(base, "owner"),
17
+ other = join(base, "other"),
18
+ defaults = join(base, "defaults");
19
+ for (const path of [root, other, defaults]) await mkdir(path);
20
+ await mkdir(join(defaults, "default-skill"));
21
+ await writeFile(
22
+ join(defaults, "default-skill", "SKILL.md"),
23
+ markdown("default-skill"),
24
+ );
25
+ const config = { enabled: true, defaultSkillDir: defaults };
26
+ const ctx: SkillContext = {
27
+ tools: { register: () => () => {} },
28
+ userQuestions: { ask: async () => ({ answers: [] }) },
29
+ workingDirectory: { get: () => root },
30
+ connection: {
31
+ requestRejection(request) {
32
+ const headers = request.headers;
33
+ const cookie =
34
+ headers instanceof Headers ? headers.get("cookie") : headers.cookie;
35
+ const origin =
36
+ headers instanceof Headers ? headers.get("origin") : headers.origin;
37
+ return cookie === "native=owner" && origin === "http://localhost"
38
+ ? undefined
39
+ : 403;
40
+ },
41
+ },
42
+ workspaceRegistry: {
43
+ list: () => [{ id: "owner-workspace", path: root }],
44
+ get: (id) =>
45
+ id === "owner-workspace"
46
+ ? { path: root }
47
+ : id === "other-workspace"
48
+ ? { path: other }
49
+ : undefined,
50
+ },
51
+ sandboxPolicy: { workspaceRoot: root },
52
+ on() {},
53
+ effect(callback) {
54
+ callback();
55
+ },
56
+ webServer: {
57
+ register() {
58
+ return () => {};
59
+ },
60
+ },
61
+ };
62
+ async function call(
63
+ body: Record<string, unknown>,
64
+ headers = { cookie: "native=owner", origin: "http://localhost" },
65
+ ) {
66
+ return skillResponse(
67
+ ctx,
68
+ config,
69
+ new Request("http://localhost/windy/skills", {
70
+ method: "POST",
71
+ headers: { ...headers, "content-type": "application/json" },
72
+ body: JSON.stringify({ workspaceId: "owner-workspace", ...body }),
73
+ }),
74
+ );
75
+ }
76
+ return { root, other, defaults, ctx, config, call };
77
+ }
@@ -0,0 +1,18 @@
1
+ import type { ToolRunContext } from "@deepseek-ai/dsh-tools";
2
+ import type { SkillContext, SkillConfig } from "./index.mjs";
3
+ export const workflowToolName: "save_workflow_skill";
4
+ export function workflowDocument(args: unknown): {
5
+ name: string;
6
+ displayName: string;
7
+ raw: string;
8
+ };
9
+ export function saveWorkflowSkill(
10
+ ctx: SkillContext,
11
+ config: SkillConfig,
12
+ args: unknown,
13
+ execution: Pick<ToolRunContext, "agent" | "signal">,
14
+ ): Promise<Record<string, unknown>>;
15
+ export function registerWorkflowTool(
16
+ ctx: SkillContext,
17
+ config: SkillConfig,
18
+ ): void;
@@ -0,0 +1,189 @@
1
+ import { createHash } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+ import { realpath } from "node:fs/promises";
4
+ import { fail, markdownBundle } from "./bundle.mjs";
5
+ import {
6
+ contained,
7
+ installSkill,
8
+ listSkills,
9
+ readSkill,
10
+ skillRoots,
11
+ } from "./storage.mjs";
12
+
13
+ export const workflowToolName = "save_workflow_skill";
14
+ const constraints =
15
+ "只使用当前用户获准的工具和工作文件,保留来源并核验输出。技能不授予权限;不得直连业务数据库、绕过审批或复制凭据。业务对象使用本次执行的参数,不把示例当成真实事实。取消后停止后续操作。";
16
+ function hasControls(text) {
17
+ return [...text].some((char) => {
18
+ const code = char.charCodeAt(0);
19
+ return (code < 32 && ![9, 10, 13].includes(code)) || code === 127;
20
+ });
21
+ }
22
+ export function workflowDocument(args) {
23
+ if (
24
+ !args ||
25
+ typeof args !== "object" ||
26
+ Array.isArray(args) ||
27
+ Object.keys(args).some(
28
+ (key) => !["name", "description", "workflow"].includes(key),
29
+ )
30
+ )
31
+ fail("技能参数无效。");
32
+ for (const [key, max] of [
33
+ ["name", 60],
34
+ ["description", 2048],
35
+ ["workflow", 16000],
36
+ ]) {
37
+ if (
38
+ typeof args[key] !== "string" ||
39
+ !args[key].trim() ||
40
+ args[key].length > max ||
41
+ hasControls(args[key])
42
+ )
43
+ fail("请填写完整的技能名称、说明与通用步骤。");
44
+ }
45
+ const displayName = args.name.trim().normalize("NFC");
46
+ if (
47
+ /[\r\n\t/\\]/.test(displayName) ||
48
+ displayName === "." ||
49
+ displayName === ".."
50
+ )
51
+ fail("技能名称须为单行文字,不能包含路径。");
52
+ const name = /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(displayName)
53
+ ? displayName
54
+ : `workflow-${createHash("sha256").update(displayName).digest("hex").slice(0, 16)}`;
55
+ const raw = [
56
+ "---",
57
+ `name: ${name}`,
58
+ `description: ${JSON.stringify(args.description.trim())}`,
59
+ "metadata:",
60
+ ` displayName: ${JSON.stringify(displayName)}`,
61
+ "user-invocable: true",
62
+ "disable-model-invocation: true",
63
+ "---",
64
+ "",
65
+ `# ${displayName}`,
66
+ "",
67
+ args.workflow.trim(),
68
+ "",
69
+ "## 授权与核验",
70
+ "",
71
+ constraints,
72
+ "",
73
+ ].join("\n");
74
+ return { name, displayName, raw };
75
+ }
76
+
77
+ async function workspaceFor(ctx, execution) {
78
+ if (!execution.agent?.session) fail("缺少当前会话。", 403);
79
+ const cwd = await realpath(ctx.workingDirectory.get(execution.agent.session));
80
+ const root = await realpath(ctx.sandboxPolicy.workspaceRoot);
81
+ if (!contained(root, cwd)) fail("工作区不属于当前用户。", 403);
82
+ const workspace = ctx.workspaceRegistry
83
+ .list()
84
+ .find((item) => resolve(item.path) === cwd);
85
+ if (!workspace) fail("请在当前工作区创建会话后保存技能。", 404);
86
+ return workspace.id;
87
+ }
88
+ async function assertAvailable(roots, draft) {
89
+ const items = await listSkills(roots);
90
+ if (
91
+ items.some(
92
+ (item) =>
93
+ item.name === draft.name ||
94
+ item.displayName.normalize("NFC") === draft.displayName,
95
+ )
96
+ )
97
+ fail("同名技能已存在,请更名后保存;不会覆盖已有技能。", 409);
98
+ }
99
+
100
+ export async function saveWorkflowSkill(ctx, config, args, execution) {
101
+ if (!config.enabled) fail("当前部署未开放个人技能管理。", 403);
102
+ execution.signal.throwIfAborted();
103
+ const draft = workflowDocument(args);
104
+ const workspaceId = await workspaceFor(ctx, execution);
105
+ await skillRoots(ctx, config, workspaceId, (roots) =>
106
+ assertAvailable(roots, draft),
107
+ );
108
+ const answer = await ctx.userQuestions.ask({
109
+ agent: execution.agent,
110
+ signal: execution.signal,
111
+ questions: [
112
+ {
113
+ id: "save-skill",
114
+ header: "保存个人技能",
115
+ question: `将“${draft.displayName}”保存到当前工作区的个人技能?请核对下方完整内容已去除本轮具体资料(包括合成示例)、案件标识和凭据。`,
116
+ detail: draft.raw,
117
+ options: [
118
+ {
119
+ label: "保存个人技能",
120
+ description: "仅当前用户工作区可用,不发布或共享。",
121
+ },
122
+ {
123
+ label: "暂不保存",
124
+ description: "保留当前会话,修改内容后可重新提出。",
125
+ },
126
+ ],
127
+ },
128
+ ],
129
+ });
130
+ execution.signal.throwIfAborted();
131
+ const choice = answer.answers?.find((item) => item.id === "save-skill");
132
+ if (
133
+ answer.answers?.length !== 1 ||
134
+ choice?.selected?.length !== 1 ||
135
+ choice.selected[0] !== "保存个人技能" ||
136
+ choice.custom?.trim()
137
+ )
138
+ return {
139
+ status: "cancelled",
140
+ name: draft.name,
141
+ displayName: draft.displayName,
142
+ };
143
+ if ((await workspaceFor(ctx, execution)) !== workspaceId)
144
+ fail("会话工作区已变化,请重新确认。", 409);
145
+ return skillRoots(ctx, config, workspaceId, async (roots) => {
146
+ execution.signal.throwIfAborted();
147
+ await assertAvailable(roots, draft);
148
+ await installSkill(roots, markdownBundle(draft.raw));
149
+ const saved = await readSkill(roots.personal, draft.name);
150
+ return {
151
+ status: "saved",
152
+ name: saved.name,
153
+ displayName: saved.displayName,
154
+ version: saved.version,
155
+ path: `.dsh/skills/${saved.name}/SKILL.md`,
156
+ invocation: `/${saved.name}`,
157
+ scope: "current-user-workspace",
158
+ published: false,
159
+ };
160
+ });
161
+ }
162
+
163
+ export function registerWorkflowTool(ctx, config) {
164
+ ctx.effect(() =>
165
+ ctx.tools.register({
166
+ name: workflowToolName,
167
+ description:
168
+ "用户明确要求将刚刚完成的流程沉淀为技能时调用。name保留用户给出的中文或英文名称;description写触发条件;workflow写输入参数、已验证步骤、输出格式、验证和边界。先剔除真实身份、案件ID、账号、原始材料及凭据;本轮合成或演示数据、金额算式、编号和路径也必须替换为输入参数,不作为示例固化。只保留用户明确要求的通用常量,不记录失败尝试或未经验证的参数用法。工具会向用户展示完整内容并确认后保存到当前用户工作区;同名不覆盖,不执行或公开发布技能。",
169
+ parameters: {
170
+ type: "object",
171
+ additionalProperties: false,
172
+ required: ["name", "description", "workflow"],
173
+ properties: {
174
+ name: { type: "string", minLength: 1, maxLength: 60 },
175
+ description: { type: "string", minLength: 1, maxLength: 2048 },
176
+ workflow: { type: "string", minLength: 1, maxLength: 16000 },
177
+ },
178
+ },
179
+ output: {
180
+ schema: { type: "object", additionalProperties: true },
181
+ render: (_args, value) => [
182
+ { type: "text", text: JSON.stringify(value) },
183
+ ],
184
+ },
185
+ execute: (args, execution) =>
186
+ saveWorkflowSkill(ctx, config, args, execution),
187
+ }),
188
+ );
189
+ }
@@ -0,0 +1,164 @@
1
+ import { expect, test } from "bun:test";
2
+ import { Context } from "@deepseek-ai/cordis";
3
+ import type { Agent } from "@deepseek-ai/dsh-agent";
4
+ import { FileSystemSkillProvider } from "@deepseek-ai/dsh-skill-filesystem";
5
+ import { join } from "node:path";
6
+ import { readFile, readdir } from "node:fs/promises";
7
+ import { saveWorkflowSkill, workflowDocument } from "./workflow.mjs";
8
+ import { fixture } from "./test-fixture";
9
+
10
+ const args = {
11
+ name: "每周案件简报",
12
+ description: "在用户需要每周汇总授权材料时使用。",
13
+ workflow:
14
+ "输入:本次用户选定材料。\n1. 核对范围并保留来源。\n2. 生成简报并回读核验。\n输出:附来源的简报。",
15
+ };
16
+ const consent = { answers: [{ id: "save-skill", selected: ["保存个人技能"] }] };
17
+ const execution = () => ({
18
+ agent: { session: {} } as Agent,
19
+ signal: new AbortController().signal,
20
+ });
21
+
22
+ test("Chinese workflow name is reviewed, saved to current workspace, read back and discovered by official provider", async () => {
23
+ const f = await fixture();
24
+ let asked = 0;
25
+ f.ctx.userQuestions.ask = async (request) => {
26
+ asked++;
27
+ expect(request.questions[0]?.detail).toBe(workflowDocument(args).raw);
28
+ expect((await f.call({ action: "list" })).status).toBe(200);
29
+ expect(await readdir(join(f.root, ".dsh", "skills"))).toEqual([]);
30
+ return consent;
31
+ };
32
+ const result = await saveWorkflowSkill(f.ctx, f.config, args, execution());
33
+ expect(asked).toBe(1);
34
+ expect(result).toMatchObject({
35
+ status: "saved",
36
+ displayName: args.name,
37
+ scope: "current-user-workspace",
38
+ published: false,
39
+ });
40
+ expect(result.name).toMatch(/^workflow-[a-f0-9]{16}$/);
41
+ const raw = await readFile(join(f.root, String(result.path)), "utf8");
42
+ expect(raw).toContain("disable-model-invocation: true");
43
+ expect(raw).toContain("user-invocable: true");
44
+ const provider = new FileSystemSkillProvider(
45
+ new Context(),
46
+ { signal: execution().signal, invalidate() {} },
47
+ {
48
+ watch: false,
49
+ dshHome: join(f.root, "empty-home"),
50
+ agentsHome: join(f.root, "empty-agents"),
51
+ customSkillDirs: [f.defaults],
52
+ },
53
+ );
54
+ try {
55
+ const observation = await provider.list({ cwd: f.root });
56
+ const rows = Array.isArray(observation)
57
+ ? observation
58
+ : observation.candidates;
59
+ const candidate = rows.find((row) => row.name === result.name);
60
+ expect(candidate?.invocation).toEqual({
61
+ modelInvocable: false,
62
+ userInvocable: true,
63
+ });
64
+ const skill = await provider.get(candidate!, { cwd: f.root });
65
+ expect(skill?.content).toContain(args.workflow);
66
+ expect(skill?.metadata?.displayName).toBe(args.name);
67
+ } finally {
68
+ await provider.dispose();
69
+ }
70
+ await expect(
71
+ saveWorkflowSkill(f.ctx, f.config, args, execution()),
72
+ ).rejects.toMatchObject({ status: 409 });
73
+ expect(asked).toBe(1);
74
+ expect(await readFile(join(f.root, String(result.path)), "utf8")).toBe(raw);
75
+ });
76
+
77
+ test("decline, free text and abort cannot publish a skill", async () => {
78
+ const f = await fixture();
79
+ for (const response of [
80
+ { answers: [{ id: "save-skill", selected: ["暂不保存"] }] },
81
+ { answers: [{ id: "save-skill", selected: [], custom: "先修改" }] },
82
+ {
83
+ answers: [
84
+ { id: "save-skill", selected: ["保存个人技能"], custom: "先修改" },
85
+ ],
86
+ },
87
+ ]) {
88
+ f.ctx.userQuestions.ask = async () => response;
89
+ expect(
90
+ await saveWorkflowSkill(f.ctx, f.config, args, execution()),
91
+ ).toMatchObject({ status: "cancelled" });
92
+ }
93
+ const controller = new AbortController();
94
+ f.ctx.userQuestions.ask = async () => {
95
+ controller.abort();
96
+ return consent;
97
+ };
98
+ await expect(
99
+ saveWorkflowSkill(f.ctx, f.config, args, {
100
+ ...execution(),
101
+ signal: controller.signal,
102
+ }),
103
+ ).rejects.toThrow();
104
+ expect(await readdir(join(f.root, ".dsh", "skills"))).toEqual([]);
105
+ });
106
+
107
+ test("invalid input, disabled feature, foreign workspace and changed workspace fail closed", async () => {
108
+ const f = await fixture();
109
+ let asked = 0;
110
+ f.ctx.userQuestions.ask = async () => {
111
+ asked++;
112
+ return consent;
113
+ };
114
+ for (const name of ["", "../other", "first\nsecond", "x".repeat(61)])
115
+ await expect(
116
+ saveWorkflowSkill(f.ctx, f.config, { ...args, name }, execution()),
117
+ ).rejects.toThrow();
118
+ await expect(
119
+ saveWorkflowSkill(
120
+ f.ctx,
121
+ f.config,
122
+ { ...args, workspaceId: "other" },
123
+ execution(),
124
+ ),
125
+ ).rejects.toThrow();
126
+ await expect(
127
+ saveWorkflowSkill(
128
+ f.ctx,
129
+ { ...f.config, enabled: false },
130
+ args,
131
+ execution(),
132
+ ),
133
+ ).rejects.toMatchObject({ status: 403 });
134
+ f.ctx.workingDirectory.get = () => f.other;
135
+ await expect(
136
+ saveWorkflowSkill(f.ctx, f.config, args, execution()),
137
+ ).rejects.toMatchObject({ status: 403 });
138
+ expect(asked).toBe(0);
139
+ f.ctx.workingDirectory.get = () => f.root;
140
+ f.ctx.userQuestions.ask = async () => {
141
+ f.ctx.workingDirectory.get = () => f.other;
142
+ return consent;
143
+ };
144
+ await expect(
145
+ saveWorkflowSkill(f.ctx, f.config, args, execution()),
146
+ ).rejects.toMatchObject({ status: 403 });
147
+ expect(await readdir(join(f.root, ".dsh", "skills"))).toEqual([]);
148
+ });
149
+
150
+ test("English names remain invocable and default skills cannot be overwritten", async () => {
151
+ const f = await fixture();
152
+ f.ctx.userQuestions.ask = async () => consent;
153
+ expect(workflowDocument({ ...args, name: "weekly-brief" }).name).toBe(
154
+ "weekly-brief",
155
+ );
156
+ await expect(
157
+ saveWorkflowSkill(
158
+ f.ctx,
159
+ f.config,
160
+ { ...args, name: "default-skill" },
161
+ execution(),
162
+ ),
163
+ ).rejects.toMatchObject({ status: 409 });
164
+ });
@@ -0,0 +1,5 @@
1
+ # Windy 通用技能
2
+
3
+ 只读默认技能包括文档处理、资料对照、数据汇总、显式方法沉淀和个人扩展指南。工作方法不包含业务事实,不授予权限;项目领域技能通过 `project/host.ts` 提供。
4
+
5
+ 个人技能位于当前用户工作区 `.dsh/skills`。共享技能由产品后台导入发布并记录版本、范围、摘要及审计,不能通过个人安装获得组织发布身份。技能执行始终受当前工具授权、审批和数据范围约束。
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: windy-data-summary
3
+ description: 对授权工作文件或真实工具结果进行有界统计与核算。
4
+ metadata:
5
+ displayName: 数据汇总
6
+ user-invocable: true
7
+ disable-model-invocation: false
8
+ ---
9
+
10
+ # 数据汇总
11
+
12
+ 明确字段、单位、时间和去重规则;使用实际发现的授权工具或本地计算。分页未完整时说明覆盖范围。独立回算分组和合计,保留原始编号与前导零。
13
+
14
+ 所有技能只使用当前用户获准的工具和文件,不授予权限,不能直连业务数据库,不绕过审批。保留来源和原件,取消后停止后续操作。