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,146 @@
1
+ /** Application policy around public DSH events; upstream owns child execution. */
2
+ export const name = "windy-parallel-policy";
3
+ export const inject = ["agents", "subagents", "tools"];
4
+ export function apply(ctx, config = {}) {
5
+ const maximumCalls = config.maxModelCalls ?? 32;
6
+ const maximumTools = config.maxToolCalls ?? 64;
7
+ const maximumChildren = config.maxChildren ?? 8;
8
+ const durationMs = config.durationMs ?? 300000;
9
+ const states = new Map();
10
+ const observed = new WeakSet();
11
+ // Only the official live activation event establishes a delegation edge.
12
+ // parentSession alone is also used by ordinary historical conversation forks.
13
+ const managed = new Map();
14
+ ctx.on("subagent/start", (info) => {
15
+ const agent = ctx.agents.get(info.id);
16
+ const parent = agent && ctx.agents.get(agent.session.header.parentSession);
17
+ if (agent && parent) managed.set(agent.id, { agent, parent });
18
+ });
19
+ ctx.on("subagent/end", (info) => managed.delete(info.id));
20
+ const rootOf = (agent) => {
21
+ let root = agent;
22
+ for (let depth = 0; depth < 8; depth++) {
23
+ const edge = managed.get(root.id);
24
+ if (!edge || edge.agent !== root) {
25
+ if (root.session.header.origin === "subagent")
26
+ throw new Error("WINDY_UNMANAGED_CHILD");
27
+ return root;
28
+ }
29
+ if (ctx.agents.get(edge.parent.id) !== edge.parent)
30
+ throw new Error("WINDY_PARENT_UNAVAILABLE");
31
+ root = edge.parent;
32
+ }
33
+ throw new Error("WINDY_DELEGATION_DEPTH");
34
+ };
35
+ const children = (root) =>
36
+ [...managed.values()]
37
+ .filter(({ agent }) => {
38
+ try {
39
+ return rootOf(agent) === root;
40
+ } catch {
41
+ return false;
42
+ }
43
+ })
44
+ .map(({ agent }) => agent);
45
+ const stopChildren = (root) => {
46
+ const descendants = children(root);
47
+ for (const child of descendants) child.cancel({ kind: "parent" });
48
+ void ctx.subagents
49
+ .drainChildren(
50
+ root,
51
+ descendants.map((child) => child.id),
52
+ )
53
+ .catch(() => ctx.logger.warn("windy: child teardown failed"));
54
+ };
55
+ const close = (root, state) => {
56
+ if (state.closed) return;
57
+ state.closed = true;
58
+ clearTimeout(state.timer);
59
+ root.cancel({ kind: "user" });
60
+ stopChildren(root);
61
+ };
62
+ const fresh = (root) => {
63
+ const previous = states.get(root);
64
+ if (previous) clearTimeout(previous.timer);
65
+ const state = {
66
+ calls: 0,
67
+ tools: 0,
68
+ spawned: 0,
69
+ closed: false,
70
+ timer: undefined,
71
+ };
72
+ state.timer = setTimeout(() => close(root, state), durationMs);
73
+ state.timer.unref?.();
74
+ states.set(root, state);
75
+ return state;
76
+ };
77
+ const stateOf = (agent) => {
78
+ const root = rootOf(agent);
79
+ return { root, state: states.get(root) ?? fresh(root) };
80
+ };
81
+ ctx.on("agent/pre-step", async (payload, next) => {
82
+ const { agent, messages, signal } = payload;
83
+ const root = rootOf(agent);
84
+ if (
85
+ agent === root &&
86
+ messages.some((message) => message.source.kind === "user") &&
87
+ !children(root).some((child) => child.status === "running")
88
+ )
89
+ fresh(root);
90
+ if (agent === root && !observed.has(signal)) {
91
+ observed.add(signal);
92
+ signal.addEventListener("abort", () => stopChildren(root), {
93
+ once: true,
94
+ });
95
+ }
96
+ return next();
97
+ });
98
+ ctx.on("agent/request", async ({ agent }, next) => {
99
+ const { root, state } = stateOf(agent);
100
+ if (state.closed || ++state.calls > maximumCalls) {
101
+ close(root, state);
102
+ throw new Error("WINDY_SHARED_MODEL_BUDGET_EXCEEDED");
103
+ }
104
+ return next();
105
+ });
106
+ ctx.tools.guard((exec) => {
107
+ if (!exec.agent) return "WINDY_AGENT_REQUIRED";
108
+ const { root, state } = stateOf(exec.agent);
109
+ if (state.closed || ++state.tools > maximumTools) {
110
+ close(root, state);
111
+ return "WINDY_SHARED_TOOL_BUDGET_EXCEEDED";
112
+ }
113
+ if (exec.name === "subagent" && ++state.spawned > maximumChildren)
114
+ return "WINDY_SHARED_CHILD_BUDGET_EXCEEDED";
115
+ });
116
+ // alpha.3 can leave a root idle while children continue. Its public cancel
117
+ // method otherwise cancels only the root turn, so extend this one UI seam.
118
+ ctx.inject(["sessionController"], (host) => {
119
+ const controller = host.sessionController;
120
+ const original = controller.cancel;
121
+ const cancel = function (request) {
122
+ const result = original.call(this, request);
123
+ const agent = host.agents.get(request.sessionId);
124
+ if (agent && agent.session.header.origin !== "subagent")
125
+ stopChildren(agent);
126
+ return result;
127
+ };
128
+ controller.cancel = cancel;
129
+ host.effect(() => () => {
130
+ if (controller.cancel === cancel) controller.cancel = original;
131
+ });
132
+ });
133
+ ctx.on("agent/disposed", ({ agent }) => {
134
+ managed.delete(agent.id);
135
+ const state = states.get(agent);
136
+ if (state) {
137
+ clearTimeout(state.timer);
138
+ states.delete(agent);
139
+ }
140
+ });
141
+ ctx.effect(() => () => {
142
+ for (const state of states.values()) clearTimeout(state.timer);
143
+ states.clear();
144
+ managed.clear();
145
+ });
146
+ }
@@ -0,0 +1,2 @@
1
+ import AgentPresetRegistry from "@deepseek-ai/dsh-agent-preset-registry";
2
+ export default class WindyPresetRegistry extends AgentPresetRegistry {}
@@ -0,0 +1,41 @@
1
+ import AgentPresetRegistry from "@deepseek-ai/dsh-agent-preset-registry";
2
+ import { RemoteError } from "@deepseek-ai/dsh-typert-protocol";
3
+
4
+ function requirePreset(expected, id) {
5
+ if (id !== undefined && id !== expected)
6
+ throw new RemoteError(
7
+ "remote-access/denied",
8
+ "Windy Agent 使用固定业务预设。",
9
+ {},
10
+ );
11
+ }
12
+
13
+ /** The application overlay owns the only executable preset, independently of UI. */
14
+ export default class WindyPresetRegistry extends AgentPresetRegistry {
15
+ constructor(ctx, config) {
16
+ const id = config?.default ?? "windy";
17
+ if (!/^[a-z][a-z0-9-]{0,63}$/.test(id))
18
+ throw new Error("Invalid deployment preset identity");
19
+ super(ctx, config);
20
+ Object.defineProperty(this, "deploymentPresetId", { value: id });
21
+ }
22
+ get defaultId() {
23
+ return this.deploymentPresetId ?? this.config?.default ?? "windy";
24
+ }
25
+ async register(definition) {
26
+ requirePreset(this.defaultId, definition.id);
27
+ return super.register(definition);
28
+ }
29
+ async select(agent, id) {
30
+ requirePreset(this.defaultId, id);
31
+ return super.select(agent, this.defaultId);
32
+ }
33
+ async mount(ctx, id) {
34
+ requirePreset(this.defaultId, id);
35
+ return super.mount(ctx, this.defaultId);
36
+ }
37
+ async acquireScope(id) {
38
+ requirePreset(this.defaultId, id);
39
+ return super.acquireScope(this.defaultId);
40
+ }
41
+ }
@@ -0,0 +1,46 @@
1
+ import { expect, test } from "bun:test";
2
+ import WindyPresetRegistry from "./preset-registry.mjs";
3
+ import WindySettingsController from "./settings-controller.mjs";
4
+ import { nativeProfile } from "../native/profile.js";
5
+ import { defaultHostFixture } from "../native/host-test-fixture.js";
6
+
7
+ test("managed preset rejects changes before registry or settings provider access", async () => {
8
+ const registry = Object.create(WindyPresetRegistry.prototype);
9
+ expect(registry.defaultId).toBe("windy");
10
+ for (const action of [
11
+ () => registry.register({ id: "custom" }),
12
+ () => registry.select({}, "cordis"),
13
+ () => registry.mount({}, "standard"),
14
+ () => registry.acquireScope("custom"),
15
+ ])
16
+ await expect(action()).rejects.toMatchObject({
17
+ code: "remote-access/denied",
18
+ });
19
+ const settings = Object.create(WindySettingsController.prototype);
20
+ for (const method of ["update", "replace", "mutate"]) {
21
+ await expect(
22
+ settings[method]("agent-preset-registry", {}),
23
+ ).rejects.toMatchObject({ code: "remote-access/denied" });
24
+ }
25
+ });
26
+
27
+ test("product disables the presentation-only preset UI while retaining its host registry", () => {
28
+ const rows = nativeProfile(
29
+ {
30
+ appRoot: "/app",
31
+ gateUrl: "http://gate",
32
+ model: "synthetic",
33
+ contextWindow: 32768,
34
+ maxOutputTokens: 4096,
35
+ },
36
+ defaultHostFixture,
37
+ );
38
+ expect(rows).toContainEqual({ id: "ui-agent-preset", disabled: true });
39
+ expect(rows).toContainEqual({ id: "agent-preset-registry", disabled: true });
40
+ const inserted = rows.flatMap((row) => ("insert" in row ? row.insert : []));
41
+ expect(inserted).toContainEqual({
42
+ id: "windy-agent-preset-registry",
43
+ name: "/app/plugins/preset-registry.mjs",
44
+ config: { default: "windy" },
45
+ });
46
+ });
@@ -0,0 +1,25 @@
1
+ import type {
2
+ AskUserQuestionAnswer,
3
+ AskUserQuestionRequest,
4
+ } from "@deepseek-ai/dsh-user-questions";
5
+ export function validateAnswer(
6
+ questions: AskUserQuestionRequest["questions"],
7
+ value: unknown,
8
+ ): AskUserQuestionAnswer;
9
+ export function createQuestionBridge(): {
10
+ close(): void;
11
+ list(sessionId: string): {
12
+ id: string;
13
+ questions: AskUserQuestionRequest["questions"];
14
+ createdAt: string;
15
+ }[];
16
+ answer(sessionId: string, id: string, answer: unknown): void;
17
+ ask(
18
+ request: AskUserQuestionRequest,
19
+ next: () => Promise<AskUserQuestionAnswer>,
20
+ ): Promise<AskUserQuestionAnswer>;
21
+ };
22
+ export function projectQuestions<T>(
23
+ conversation: T,
24
+ bridge?: ReturnType<typeof createQuestionBridge>,
25
+ ): T;
@@ -0,0 +1,142 @@
1
+ import { randomUUID } from "node:crypto";
2
+
3
+ function invalid(message = "请完整回答当前问题。", status = 400) {
4
+ throw Object.assign(new Error(message), { status });
5
+ }
6
+ export function validateAnswer(questions, value) {
7
+ if (
8
+ !value ||
9
+ typeof value !== "object" ||
10
+ Array.isArray(value) ||
11
+ Object.keys(value).some((key) => key !== "answers") ||
12
+ !Array.isArray(value.answers) ||
13
+ value.answers.length !== questions.length
14
+ )
15
+ invalid();
16
+ const seen = new Set();
17
+ for (const item of value.answers) {
18
+ if (
19
+ !item ||
20
+ typeof item !== "object" ||
21
+ Array.isArray(item) ||
22
+ Object.keys(item).some(
23
+ (key) => !["id", "selected", "custom"].includes(key),
24
+ )
25
+ )
26
+ invalid();
27
+ const question = questions.find((entry) => entry.id === item.id);
28
+ if (
29
+ !question ||
30
+ seen.has(item.id) ||
31
+ !Array.isArray(item.selected) ||
32
+ new Set(item.selected).size !== item.selected.length ||
33
+ item.selected.some(
34
+ (label) => !question.options?.some((option) => option.label === label),
35
+ ) ||
36
+ (item.custom !== undefined &&
37
+ (typeof item.custom !== "string" || item.custom.length > 4000)) ||
38
+ (!item.selected.length && !item.custom?.trim()) ||
39
+ (!question.multiSelect &&
40
+ item.selected.length + Number(Boolean(item.custom?.trim())) > 1)
41
+ )
42
+ invalid();
43
+ seen.add(item.id);
44
+ }
45
+ return value;
46
+ }
47
+
48
+ /** One live request, two answer surfaces; whichever human answers first settles it. */
49
+ export function createQuestionBridge() {
50
+ const pending = new Map();
51
+ return {
52
+ close() {
53
+ for (const item of pending.values()) item.cancel();
54
+ pending.clear();
55
+ },
56
+ list(sessionId) {
57
+ return [...pending.values()]
58
+ .filter((item) => item.sessionId === sessionId)
59
+ .map(({ id, questions, createdAt }) => ({ id, questions, createdAt }));
60
+ },
61
+ answer(sessionId, id, answer) {
62
+ const item = pending.get(id);
63
+ if (!item || item.sessionId !== sessionId)
64
+ invalid("问题已结束,请刷新会话。", 409);
65
+ validateAnswer(item.questions, answer);
66
+ pending.delete(id);
67
+ item.resolve(answer);
68
+ },
69
+ async ask(request, next) {
70
+ const sessionId = request.agent?.session?.id;
71
+ if (!sessionId) return next();
72
+ if (
73
+ new Set(request.questions.map((question) => question.id)).size !==
74
+ request.questions.length
75
+ )
76
+ invalid("问题标识重复,请重新组织追问。");
77
+ // Provider call IDs are not globally unique across sessions or child agents.
78
+ const id = randomUUID();
79
+ const controller = new AbortController();
80
+ const originalSignal = request.signal;
81
+ const signal = originalSignal
82
+ ? AbortSignal.any([originalSignal, controller.signal])
83
+ : controller.signal;
84
+ signal.throwIfAborted();
85
+ // The public waterfall payload is separate from the service request. The
86
+ // same lifetime closes the official UI when the floating surface answers.
87
+ request.signal = signal;
88
+ let abort;
89
+ const local = new Promise((resolve, reject) => {
90
+ abort = () =>
91
+ reject(
92
+ Object.assign(new Error("Question cancelled"), {
93
+ code: "ASK_ABORTED",
94
+ }),
95
+ );
96
+ signal.addEventListener("abort", abort, { once: true });
97
+ pending.set(id, {
98
+ id,
99
+ sessionId,
100
+ questions: structuredClone(request.questions),
101
+ createdAt: new Date().toISOString(),
102
+ resolve,
103
+ cancel: () => controller.abort(),
104
+ });
105
+ });
106
+ const official = Promise.resolve()
107
+ .then(next)
108
+ .catch((error) => {
109
+ if (error?.code === "NO_PROVIDER") return local;
110
+ throw error;
111
+ });
112
+ try {
113
+ return await Promise.race([local, official]);
114
+ } finally {
115
+ pending.delete(id);
116
+ signal.removeEventListener("abort", abort);
117
+ controller.abort();
118
+ }
119
+ },
120
+ };
121
+ }
122
+
123
+ export function projectQuestions(conversation, bridge) {
124
+ const questions = bridge?.list(conversation.id) ?? [];
125
+ if (!questions.length) return conversation;
126
+ return {
127
+ ...conversation,
128
+ messages: [
129
+ ...conversation.messages.filter(
130
+ (message) => message.id !== `pending-${conversation.id}`,
131
+ ),
132
+ ...questions.map((question) => ({
133
+ id: `question-${question.id}`,
134
+ role: "assistant",
135
+ content: "",
136
+ createdAt: question.createdAt,
137
+ status: "pending",
138
+ clarification: question,
139
+ })),
140
+ ],
141
+ };
142
+ }
@@ -0,0 +1,105 @@
1
+ import { expect, test } from "bun:test";
2
+ import type { Agent } from "@deepseek-ai/dsh-agent";
3
+ import { SessionId } from "@deepseek-ai/dsh-session";
4
+ import { ToolCallId } from "@deepseek-ai/dsh-llm";
5
+ import { createQuestionBridge, validateAnswer } from "./questions.mjs";
6
+
7
+ const questions = [
8
+ {
9
+ id: "format",
10
+ question: "需要哪种格式?",
11
+ options: [{ label: "HTML" }, { label: "PPT" }],
12
+ },
13
+ ];
14
+ const answer = { answers: [{ id: "format", selected: ["HTML"] }] };
15
+ const agent = { session: { id: SessionId("own-session") } } as Agent;
16
+ const noProvider = async () => {
17
+ throw Object.assign(new Error(), { code: "NO_PROVIDER" });
18
+ };
19
+
20
+ test("answers settle only the owning session exactly once", async () => {
21
+ const bridge = createQuestionBridge();
22
+ const waiting = bridge.ask(
23
+ { agent, questions, signal: new AbortController().signal },
24
+ noProvider,
25
+ );
26
+ const question = bridge.list("own-session")[0]!;
27
+ expect(bridge.list("other-session")).toEqual([]);
28
+ expect(() => bridge.answer("other-session", question.id, answer)).toThrow();
29
+ bridge.answer("own-session", question.id, answer);
30
+ expect(await waiting).toEqual(answer);
31
+ expect(() => bridge.answer("own-session", question.id, answer)).toThrow();
32
+ });
33
+
34
+ test("official workbench response wins without duplicate floating reply; cancellation and disposal clear pending", async () => {
35
+ const bridge = createQuestionBridge();
36
+ expect(await bridge.ask({ agent, questions }, async () => answer)).toEqual(
37
+ answer,
38
+ );
39
+ expect(bridge.list("own-session")).toEqual([]);
40
+ for (const dispose of [false, true]) {
41
+ const controller = new AbortController();
42
+ const waiting = bridge.ask(
43
+ { agent, questions, signal: controller.signal },
44
+ noProvider,
45
+ );
46
+ const rejected = waiting.catch((error: unknown) => error);
47
+ if (dispose) bridge.close();
48
+ else controller.abort();
49
+ expect(await rejected).toMatchObject({ code: "ASK_ABORTED" });
50
+ expect(bridge.list("own-session")).toEqual([]);
51
+ }
52
+ });
53
+
54
+ test("server rejects omitted, duplicated, unknown and contradictory choices before settling", () => {
55
+ for (const invalid of [
56
+ {},
57
+ { answers: [] },
58
+ { answers: [{ id: "other", selected: ["HTML"] }] },
59
+ { answers: [{ id: "format", selected: ["forged"] }] },
60
+ { answers: [{ id: "format", selected: ["HTML", "PPT"] }] },
61
+ { answers: [{ id: "format", selected: ["HTML"], custom: "different" }] },
62
+ { answers: [{ id: "format", selected: [], custom: " " }] },
63
+ { answers: [{ id: "format", selected: [], custom: "x".repeat(4001) }] },
64
+ { answers: [{ id: "format", selected: ["HTML"], approved: true }] },
65
+ ])
66
+ expect(() => validateAnswer(questions, invalid)).toThrow();
67
+ expect(
68
+ validateAnswer(questions, {
69
+ answers: [{ id: "format", selected: [], custom: "Word" }],
70
+ }),
71
+ ).toBeDefined();
72
+ expect(
73
+ validateAnswer([{ ...questions[0]!, multiSelect: true }], {
74
+ answers: [{ id: "format", selected: ["HTML", "PPT"], custom: "附来源" }],
75
+ }),
76
+ ).toBeDefined();
77
+ });
78
+
79
+ test("duplicate question identities fail before creating an impossible answer form", async () => {
80
+ const bridge = createQuestionBridge();
81
+ await expect(
82
+ bridge.ask(
83
+ { agent, questions: [questions[0]!, questions[0]!] },
84
+ noProvider,
85
+ ),
86
+ ).rejects.toThrow("问题标识重复");
87
+ expect(bridge.list("own-session")).toEqual([]);
88
+ });
89
+
90
+ test("concurrent sessions do not share a question identity or answer", async () => {
91
+ const bridge = createQuestionBridge();
92
+ const other = { session: { id: SessionId("other-session") } } as Agent;
93
+ const wait = { callId: ToolCallId("same-provider-call") };
94
+ const first = bridge.ask({ agent, questions, wait }, noProvider);
95
+ const second = bridge.ask({ agent: other, questions, wait }, noProvider);
96
+ const a = bridge.list("own-session")[0]!,
97
+ b = bridge.list("other-session")[0]!;
98
+ expect(a.id).not.toBe(b.id);
99
+ expect(() => bridge.answer("own-session", b.id, answer)).toThrow();
100
+ bridge.answer("own-session", a.id, answer);
101
+ expect(await first).toEqual(answer);
102
+ expect(bridge.list("other-session")).toHaveLength(1);
103
+ bridge.answer("other-session", b.id, answer);
104
+ expect(await second).toEqual(answer);
105
+ });
@@ -0,0 +1,17 @@
1
+ # Windy工作台设置策略
2
+
3
+ 适用于固定 DSH `0.2.1-rc.2`。使用官方 Host profile 禁用账号/API 登录 UI、官方 Session Log 上传实现和对应设置 UI,以及服务端打开本机应用能力。Windy统一认证和模型代理保持产品管理;独立的 SettingsController Adapter 在 RPC 层拒绝打开服务器配置文件。
4
+
5
+ Client 使用公开 slot 的 priority shadowing 隐藏 `settings.action/open-document` 与 `settings.general.item/current-version`。换行图标按钮位于配置预览框右上方,不占设置页标题栏;保留 `aria-pressed`、Tooltip 与 `Alt+Z`。默认换行,关闭后横向滚动。alpha.3 未提供预览工具栏插槽,因此适配器仅观察语义 `[role="dialog"] pre`,在代码块前插入自有工具栏,不移动或复制上游 React 节点,不匹配中文文案或打包类名。关闭对话框或卸载时清理按钮、快捷键与样式;升级 DSH 后需要核对这个窄 DOM 边界。
6
+
7
+ 默认预设显示名为「Windy Agent」,内部 ID 仍为 `windy`,历史会话与子任务配置继续兼容。输入框的轮次/步数、用量及上下文状态沿用上游原位布局,不再挪到模型选择旁;输入区域使用公开 `data-composer-seat` 增加至少 16px 的底部留白,并兼容设备安全区。
8
+
9
+ “权限”是 DSH 对工作目录文件写入、命令执行以及执行前确认的权限预设,不是Windy业务 RBAC。业务数据仍逐次经过当前用户的Windy MCP 授权;选择 DSH 权限模式不会提高业务数据权限。Host 未连接时权限目录不可用,应恢复连接,而不是放宽模式。
10
+
11
+ “内置插件”是上游只读运行清单,显示停用通常来自部署 profile 或缺少依赖,不提供任意开关。用户安装/管理扩展由独立插件管理入口承载;部署禁用的模型、联网和上传插件不能靠该清单开启。
12
+
13
+ ## 固定业务预设
14
+
15
+ `native/profile.ts` 禁用官方纯展示插件 `ui-agent-preset`,因此首页不提供预设选择,设置页也不登记预设导航;不以空组件 shadow 留下空白导航。服务端 `preset-registry.mjs` 将默认值固定为 `windy`,拒绝选择、注册或挂载其它 ID;`settings-controller.mjs` 拒绝写入 `agent-preset-registry` 命名空间。界面隐藏和 RPC 策略分别验证。
16
+
17
+ `windy` 是产品自定义业务预设,复用标准任务执行工具并按业务收敛,叠加当前用户获准的业务查询、文件处理、受治理协作与中文摘要。它既不是上游 `standard` 的别名,也不开放 `cordis` 创造模式的运行时检查和预设创作能力。个人技能与可信插件管理沿用原权限边界,不能通过设置写入改变固定默认值。
@@ -0,0 +1,102 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "@southwind-ai/dsh-settings",
3
+ factory() {
4
+ // alpha.3 has no preset viewer toolbar slot. Bind to semantic dialog/pre
5
+ // boundaries and add only our own sibling; React still owns its code node.
6
+ function mountConfigurationWrap(pre) {
7
+ let wrap = true;
8
+ const toolbar = document.createElement("div");
9
+ toolbar.className = "windy-config-toolbar";
10
+ const button = document.createElement("button");
11
+ button.type = "button";
12
+ button.className = "windy-config-wrap";
13
+ button.setAttribute("aria-label", "配置换行");
14
+ button.setAttribute("aria-keyshortcuts", "Alt+Z");
15
+ button.innerHTML =
16
+ '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><path d="M3 5h18M3 10h13a4 4 0 0 1 0 8h-4m3-3-3 3 3 3M3 15h4"/></svg>';
17
+ toolbar.append(button);
18
+ pre.before(toolbar);
19
+ pre.classList.add("windy-config-code");
20
+ function render() {
21
+ button.setAttribute("aria-pressed", String(wrap));
22
+ button.title = `配置换行:${wrap ? "开" : "关"}(Alt+Z)`;
23
+ pre.style.whiteSpace = wrap ? "pre-wrap" : "pre";
24
+ pre.style.overflowWrap = wrap ? "anywhere" : "normal";
25
+ }
26
+ const before = {
27
+ whiteSpace: pre.style.whiteSpace,
28
+ overflowWrap: pre.style.overflowWrap,
29
+ };
30
+ const toggle = () => {
31
+ wrap = !wrap;
32
+ render();
33
+ };
34
+ const onKey = (event) => {
35
+ if (
36
+ !event.altKey ||
37
+ event.ctrlKey ||
38
+ event.metaKey ||
39
+ event.shiftKey ||
40
+ event.repeat ||
41
+ event.isComposing ||
42
+ event.code !== "KeyZ"
43
+ )
44
+ return;
45
+ const previews = document.querySelectorAll('[role="dialog"] pre');
46
+ if (previews[previews.length - 1] !== pre) return;
47
+ event.preventDefault();
48
+ event.stopPropagation();
49
+ toggle();
50
+ };
51
+ button.addEventListener("click", toggle);
52
+ window.addEventListener("keydown", onKey, true);
53
+ render();
54
+ return () => {
55
+ button.removeEventListener("click", toggle);
56
+ window.removeEventListener("keydown", onKey, true);
57
+ toolbar.remove();
58
+ pre.classList.remove("windy-config-code");
59
+ Object.assign(pre.style, before);
60
+ };
61
+ }
62
+ function observeConfiguration() {
63
+ const bound = new Map();
64
+ function reconcile() {
65
+ for (const [pre, dispose] of bound) {
66
+ if (!pre.isConnected || !pre.closest('[role="dialog"]')) {
67
+ dispose();
68
+ bound.delete(pre);
69
+ }
70
+ }
71
+ for (const pre of document.querySelectorAll('[role="dialog"] pre')) {
72
+ if (!bound.has(pre)) bound.set(pre, mountConfigurationWrap(pre));
73
+ }
74
+ }
75
+ const observer = new MutationObserver(reconcile);
76
+ observer.observe(document.body, { childList: true, subtree: true });
77
+ reconcile();
78
+ return () => {
79
+ observer.disconnect();
80
+ for (const dispose of bound.values()) dispose();
81
+ bound.clear();
82
+ };
83
+ }
84
+ function apply(ctx) {
85
+ for (const [name, id] of [
86
+ ["settings.general.item", "current-version"],
87
+ ["settings.action", "open-document"],
88
+ ]) {
89
+ ctx.slots.inject(name, () =>
90
+ ctx.slots.register({ name, id, priority: -100 }, () => null),
91
+ );
92
+ }
93
+ ctx.effect(observeConfiguration, "windy-settings.configuration-wrap");
94
+ }
95
+ return {
96
+ inject: ["slots"],
97
+ apply,
98
+ mountConfigurationWrap,
99
+ observeConfiguration,
100
+ };
101
+ },
102
+ });
@@ -0,0 +1,17 @@
1
+ export const name = "windy-settings";
2
+ export const inject = ["webServer"];
3
+
4
+ export function apply(ctx) {
5
+ ctx.on("webserver/index-inject", (table) => {
6
+ table.push({
7
+ kind: "style",
8
+ text: `
9
+ .windy-config-toolbar { display:flex; justify-content:flex-end; margin-bottom:6px; }
10
+ .windy-config-wrap { display:inline-flex; align-items:center; justify-content:center; width:32px; height:32px; padding:0; border:0; border-radius:var(--dsw-radius-sm); background:transparent; color:var(--dsw-alias-label-tertiary); cursor:pointer; }
11
+ .windy-config-wrap:hover, .windy-config-wrap[aria-pressed="true"] { background:var(--dsw-alias-interactive-bg-hover); color:var(--dsw-alias-label-primary); }
12
+ .windy-config-wrap:focus-visible { outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, currentColor); outline-offset:2px; }
13
+ .windy-config-code { min-width:0; overflow:auto; }
14
+ `,
15
+ });
16
+ });
17
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@southwind-ai/dsh-settings",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./index.mjs",
8
+ "./client": "./client.js",
9
+ "./package.json": "./package.json"
10
+ },
11
+ "dsh": {
12
+ "client": {
13
+ "platform": "web",
14
+ "inject": [
15
+ "@deepseek-ai/dsh-client-ui-settings-general"
16
+ ]
17
+ }
18
+ }
19
+ }