@yanglaofish/fishtools 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +33 -5
  2. package/bin/fst.js +1 -1
  3. package/manual/README.md +33 -5
  4. package/manual/docs/deployment.md +3 -3
  5. package/manual/docs/examples/script-plugin/LICENSE +21 -0
  6. package/manual/docs/examples/script-plugin/README.md +64 -0
  7. package/manual/docs/examples/script-plugin/index.js +39 -0
  8. package/manual/docs/examples/script-plugin/package.json +9 -0
  9. package/manual/docs/examples/script-plugin/scripts/benchmark.py +23 -0
  10. package/manual/docs/kernel-generation.md +97 -0
  11. package/manual/docs/modules.md +57 -0
  12. package/manual/docs/plugin-development.md +163 -12
  13. package/manual/docs/releases.md +23 -0
  14. package/manual/docs/research/2026-10-11-plugin-kernel-capabilities.md +6 -6
  15. package/manual/docs/roadmap.md +16 -3
  16. package/manual/docs/superpowers/plans/2026-10-09-workflow-mvp.md +5 -5
  17. package/manual/docs/superpowers/plans/2026-10-11-public-plugin-fixes.md +2 -2
  18. package/manual/docs/superpowers/plans/2026-10-12-kernel-generation.md +22 -0
  19. package/manual/docs/superpowers/plans/2026-10-12-modular-kernel.md +40 -0
  20. package/manual/docs/superpowers/plans/2026-10-12-plugin-developer-experience.md +50 -0
  21. package/manual/docs/superpowers/reviews/2026-10-12-kernel-generation-review.md +27 -0
  22. package/manual/docs/superpowers/reviews/2026-10-12-modular-kernel-review.md +32 -0
  23. package/manual/docs/superpowers/reviews/2026-10-12-plugin-release-review.md +20 -0
  24. package/manual/docs/superpowers/reviews/2026-10-13-kernel-runtime-release-review.md +19 -0
  25. package/manual/docs/superpowers/specs/2026-10-12-action-network-policy-design.md +52 -0
  26. package/manual/docs/superpowers/specs/2026-10-12-kernel-generation-design.md +38 -0
  27. package/manual/docs/superpowers/specs/2026-10-12-modular-kernel-design.md +70 -0
  28. package/manual/docs/superpowers/specs/2026-10-12-plugin-developer-experience.md +22 -0
  29. package/manual/docs/superpowers/specs/2026-10-12-plugin-readiness-design.md +21 -0
  30. package/manual/docs/superpowers/specs/2026-10-12-runtime-maintenance-granularity-design.md +35 -0
  31. package/manual/docs/superpowers/specs/2026-10-12-workflow-variation-design.md +19 -0
  32. package/manual/docs/verification.md +58 -1
  33. package/manual/packages/core/README.md +44 -0
  34. package/manual/packages/core/package.json +38 -0
  35. package/manual/packages/core/src/application.js +268 -87
  36. package/manual/packages/core/src/bundle.js +2 -0
  37. package/manual/packages/core/src/development-watch-worker.js +69 -0
  38. package/manual/packages/core/src/development.js +146 -0
  39. package/manual/packages/core/src/environments.js +2 -0
  40. package/manual/packages/core/src/export-snapshot.js +42 -0
  41. package/manual/packages/core/src/plugin-update.js +108 -0
  42. package/manual/packages/core/src/process.js +2 -0
  43. package/manual/packages/core/src/resources.js +31 -0
  44. package/manual/packages/core/src/version.js +2 -0
  45. package/manual/packages/fst-cli/LICENSE +21 -0
  46. package/manual/packages/fst-cli/README.md +54 -0
  47. package/manual/packages/fst-cli/bin/fst.js +124 -0
  48. package/manual/packages/fst-cli/package.json +49 -0
  49. package/manual/packages/fst-cli/src/development.js +53 -0
  50. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/model.js +1 -1
  51. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/navigation.js +1 -1
  52. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/presentation.js +9 -1
  53. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-feed.js +31 -5
  54. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-viewer.js +9 -7
  55. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/schema.js +1 -1
  56. package/manual/packages/{core → fst-cli}/src/terminal/session.js +137 -9
  57. package/manual/packages/{core → fst-cli}/src/terminal/view.js +20 -3
  58. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/workflow-menu.js +17 -2
  59. package/manual/packages/fst-devtools/LICENSE +21 -0
  60. package/manual/packages/fst-devtools/README.md +28 -0
  61. package/manual/packages/fst-devtools/package.json +29 -0
  62. package/{node_modules/@mytools/core → manual/packages/fst-devtools}/src/documentation.js +3 -1
  63. package/manual/packages/fst-devtools/src/plugin-quality.js +136 -0
  64. package/manual/packages/fst-devtools/src/plugin-tools.js +152 -0
  65. package/manual/packages/fst-logs/LICENSE +21 -0
  66. package/manual/packages/fst-logs/README.md +56 -0
  67. package/manual/packages/fst-logs/package.json +24 -0
  68. package/manual/packages/fst-logs/src/log-bounds.js +91 -0
  69. package/manual/packages/fst-logs/src/run-logs.js +239 -0
  70. package/manual/packages/fst-platform/LICENSE +21 -0
  71. package/manual/packages/fst-platform/README.md +67 -0
  72. package/manual/packages/fst-platform/package.json +33 -0
  73. package/manual/packages/fst-platform/src/bundle.js +17 -0
  74. package/manual/packages/fst-platform/src/environments.js +67 -0
  75. package/manual/packages/fst-platform/src/file-probe-engine.js +183 -0
  76. package/manual/packages/fst-platform/src/file-probe-worker.js +43 -0
  77. package/manual/packages/fst-platform/src/file-probe.js +6 -0
  78. package/manual/packages/fst-platform/src/json.js +5 -0
  79. package/manual/packages/fst-platform/src/network.js +199 -0
  80. package/manual/packages/fst-platform/src/npm.js +11 -0
  81. package/manual/packages/fst-platform/src/process.js +110 -0
  82. package/manual/packages/fst-plugin/LICENSE +21 -0
  83. package/manual/packages/fst-plugin/README.md +29 -0
  84. package/manual/packages/fst-plugin/package.json +29 -0
  85. package/manual/packages/fst-plugin/src/contracts.js +86 -0
  86. package/manual/packages/fst-plugin/src/host.js +232 -0
  87. package/manual/packages/fst-plugin/src/loader.js +21 -0
  88. package/manual/packages/fst-plugin/src/privileges.js +91 -0
  89. package/manual/packages/{core → fst-plugin}/src/runtime.js +20 -4
  90. package/manual/packages/fst-workflow/LICENSE +21 -0
  91. package/manual/packages/fst-workflow/README.md +28 -0
  92. package/manual/packages/fst-workflow/package.json +24 -0
  93. package/{node_modules/@mytools/core → manual/packages/fst-workflow}/src/control.js +3 -2
  94. package/manual/packages/{core → fst-workflow}/src/engine.js +2 -2
  95. package/manual/packages/fst-workspace/LICENSE +21 -0
  96. package/manual/packages/fst-workspace/README.md +32 -0
  97. package/manual/packages/fst-workspace/package.json +34 -0
  98. package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/bundle-workspace.js +1 -1
  99. package/manual/packages/fst-workspace/src/index.js +3 -0
  100. package/manual/packages/fst-workspace/src/plugin-installations.js +84 -0
  101. package/manual/packages/fst-workspace/src/plugins.js +35 -0
  102. package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/workflows.js +41 -21
  103. package/manual/packages/pack/LICENSE +21 -0
  104. package/manual/packages/pack/README.md +31 -0
  105. package/manual/packages/pack/archive.js +15 -0
  106. package/manual/packages/pack/dependencies.js +105 -0
  107. package/manual/packages/pack/environments.js +50 -0
  108. package/manual/packages/pack/index.js +103 -0
  109. package/manual/packages/pack/package.json +29 -0
  110. package/manual/packages/pack/runtime.js +61 -0
  111. package/manual/packages/sdk/README.md +31 -0
  112. package/manual/packages/sdk/conditions.js +1 -0
  113. package/manual/packages/sdk/package.json +23 -1
  114. package/manual/packages/sdk/schema-path.js +31 -0
  115. package/{node_modules/@mytools/core/src → manual/packages/sdk}/validation.js +22 -9
  116. package/manual/plugins/web/README.md +29 -0
  117. package/manual/tests/application.test.js +6 -4
  118. package/node_modules/@mytools/core/README.md +44 -0
  119. package/node_modules/@mytools/core/package.json +17 -15
  120. package/node_modules/@mytools/core/src/application.js +268 -87
  121. package/node_modules/@mytools/core/src/bundle.js +2 -17
  122. package/node_modules/@mytools/core/src/development-watch-worker.js +69 -0
  123. package/node_modules/@mytools/core/src/development.js +146 -0
  124. package/node_modules/@mytools/core/src/environments.js +2 -29
  125. package/node_modules/@mytools/core/src/export-snapshot.js +42 -0
  126. package/node_modules/@mytools/core/src/plugin-update.js +108 -0
  127. package/node_modules/@mytools/core/src/process.js +2 -71
  128. package/node_modules/@mytools/core/src/version.js +1 -1
  129. package/node_modules/@mytools/fst-cli/LICENSE +21 -0
  130. package/node_modules/@mytools/fst-cli/README.md +54 -0
  131. package/node_modules/@mytools/fst-cli/bin/fst.js +124 -0
  132. package/node_modules/@mytools/fst-cli/package.json +49 -0
  133. package/node_modules/@mytools/fst-cli/src/cli-run.js +12 -0
  134. package/node_modules/@mytools/fst-cli/src/development.js +53 -0
  135. package/node_modules/@mytools/fst-cli/src/terminal/conditions.js +32 -0
  136. package/node_modules/@mytools/fst-cli/src/terminal/log-viewer.js +45 -0
  137. package/node_modules/@mytools/fst-cli/src/terminal/model.js +104 -0
  138. package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +17 -0
  139. package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +50 -0
  140. package/{manual/packages/core → node_modules/@mytools/fst-cli}/src/terminal/run-feed.js +31 -5
  141. package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +60 -0
  142. package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +106 -0
  143. package/node_modules/@mytools/fst-cli/src/terminal/schema.js +52 -0
  144. package/node_modules/@mytools/{core → fst-cli}/src/terminal/session.js +137 -9
  145. package/node_modules/@mytools/fst-cli/src/terminal/theme.js +29 -0
  146. package/node_modules/@mytools/{core → fst-cli}/src/terminal/view.js +20 -3
  147. package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +65 -0
  148. package/node_modules/@mytools/fst-devtools/LICENSE +21 -0
  149. package/node_modules/@mytools/fst-devtools/README.md +28 -0
  150. package/node_modules/@mytools/fst-devtools/package.json +29 -0
  151. package/node_modules/@mytools/fst-devtools/src/documentation.js +67 -0
  152. package/node_modules/@mytools/fst-devtools/src/plugin-quality.js +136 -0
  153. package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +152 -0
  154. package/node_modules/@mytools/fst-logs/LICENSE +21 -0
  155. package/node_modules/@mytools/fst-logs/README.md +56 -0
  156. package/node_modules/@mytools/fst-logs/package.json +24 -0
  157. package/node_modules/@mytools/fst-logs/src/log-bounds.js +91 -0
  158. package/node_modules/@mytools/fst-logs/src/markdown-log.js +55 -0
  159. package/node_modules/@mytools/fst-logs/src/run-logs.js +239 -0
  160. package/node_modules/@mytools/fst-platform/LICENSE +21 -0
  161. package/node_modules/@mytools/fst-platform/README.md +67 -0
  162. package/node_modules/@mytools/fst-platform/package.json +33 -0
  163. package/node_modules/@mytools/fst-platform/src/bundle.js +17 -0
  164. package/node_modules/@mytools/fst-platform/src/environments.js +67 -0
  165. package/node_modules/@mytools/fst-platform/src/file-probe-engine.js +183 -0
  166. package/node_modules/@mytools/fst-platform/src/file-probe-worker.js +43 -0
  167. package/node_modules/@mytools/fst-platform/src/file-probe.js +6 -0
  168. package/node_modules/@mytools/fst-platform/src/json.js +5 -0
  169. package/node_modules/@mytools/fst-platform/src/network.js +199 -0
  170. package/node_modules/@mytools/fst-platform/src/npm.js +11 -0
  171. package/node_modules/@mytools/fst-platform/src/process.js +110 -0
  172. package/node_modules/@mytools/fst-plugin/LICENSE +21 -0
  173. package/node_modules/@mytools/fst-plugin/README.md +29 -0
  174. package/node_modules/@mytools/fst-plugin/package.json +29 -0
  175. package/node_modules/@mytools/fst-plugin/src/contracts.js +86 -0
  176. package/node_modules/@mytools/fst-plugin/src/host.js +232 -0
  177. package/node_modules/@mytools/fst-plugin/src/loader.js +21 -0
  178. package/node_modules/@mytools/fst-plugin/src/privileges.js +91 -0
  179. package/node_modules/@mytools/{core → fst-plugin}/src/runtime.js +20 -4
  180. package/node_modules/@mytools/fst-workflow/LICENSE +21 -0
  181. package/node_modules/@mytools/fst-workflow/README.md +28 -0
  182. package/node_modules/@mytools/fst-workflow/package.json +24 -0
  183. package/node_modules/@mytools/fst-workflow/src/control.js +64 -0
  184. package/node_modules/@mytools/{core → fst-workflow}/src/engine.js +2 -2
  185. package/node_modules/@mytools/fst-workspace/LICENSE +21 -0
  186. package/node_modules/@mytools/fst-workspace/README.md +32 -0
  187. package/node_modules/@mytools/fst-workspace/package.json +34 -0
  188. package/node_modules/@mytools/fst-workspace/src/bundle-workspace.js +39 -0
  189. package/node_modules/@mytools/fst-workspace/src/index.js +3 -0
  190. package/node_modules/@mytools/fst-workspace/src/plugin-installations.js +84 -0
  191. package/node_modules/@mytools/fst-workspace/src/plugins.js +35 -0
  192. package/node_modules/@mytools/fst-workspace/src/project.js +29 -0
  193. package/node_modules/@mytools/fst-workspace/src/workflows.js +150 -0
  194. package/node_modules/@mytools/fst-workspace/templates/control-demo.yaml +47 -0
  195. package/node_modules/@mytools/fst-workspace/templates/hello.yaml +35 -0
  196. package/node_modules/@mytools/fst-workspace/templates/python-check.yaml +26 -0
  197. package/node_modules/@mytools/fst-workspace/templates/system-check.yaml +11 -0
  198. package/node_modules/@mytools/pack/README.md +31 -0
  199. package/node_modules/@mytools/pack/dependencies.js +15 -3
  200. package/node_modules/@mytools/pack/environments.js +1 -1
  201. package/node_modules/@mytools/pack/index.js +33 -25
  202. package/node_modules/@mytools/pack/package.json +29 -1
  203. package/node_modules/@mytools/sdk/README.md +31 -0
  204. package/node_modules/@mytools/sdk/conditions.js +1 -0
  205. package/node_modules/@mytools/sdk/diagnostics.js +27 -0
  206. package/node_modules/@mytools/sdk/package.json +23 -1
  207. package/node_modules/@mytools/sdk/schema-path.js +31 -0
  208. package/node_modules/@mytools/sdk/validation.js +78 -0
  209. package/node_modules/@mytools/web/README.md +29 -0
  210. package/node_modules/@mytools/web/package.json +7 -0
  211. package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1275 -1076
  212. package/node_modules/@mytools/web/public/assets/index-BaVzHycP.js +70 -0
  213. package/node_modules/@mytools/web/public/assets/index-DA8Ae92t.css +1 -0
  214. package/node_modules/@mytools/web/public/index.html +2 -2
  215. package/node_modules/@mytools/web/server.js +24 -17
  216. package/node_modules/@mytools/web/src/model.js +84 -0
  217. package/node_modules/acorn/CHANGELOG.md +1012 -0
  218. package/node_modules/acorn/LICENSE +21 -0
  219. package/node_modules/acorn/README.md +309 -0
  220. package/node_modules/acorn/bin/acorn +4 -0
  221. package/node_modules/acorn/dist/acorn.d.mts +897 -0
  222. package/node_modules/acorn/dist/acorn.d.ts +897 -0
  223. package/node_modules/acorn/dist/acorn.js +6370 -0
  224. package/node_modules/acorn/dist/acorn.mjs +6341 -0
  225. package/node_modules/acorn/dist/bin.js +90 -0
  226. package/node_modules/acorn/package.json +50 -0
  227. package/package.json +117 -101
  228. package/manual/packages/core/src/host.js +0 -124
  229. package/node_modules/@mytools/core/bin/fst.js +0 -70
  230. package/node_modules/@mytools/core/src/contracts.js +0 -41
  231. package/node_modules/@mytools/core/src/host.js +0 -124
  232. package/node_modules/@mytools/core/src/plugins.js +0 -55
  233. package/node_modules/@mytools/core/src/run-logs.js +0 -63
  234. package/node_modules/@mytools/web/public/assets/index-DT2B4tMV.js +0 -70
  235. package/node_modules/@mytools/web/public/assets/index-vuZvrUTT.css +0 -1
  236. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/cli-run.js +0 -0
  237. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/conditions.js +0 -0
  238. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/log-viewer.js +0 -0
  239. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-presentation.js +0 -0
  240. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/theme.js +0 -0
  241. /package/{node_modules/@mytools/core → manual/packages/fst-logs}/src/markdown-log.js +0 -0
  242. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/project.js +0 -0
  243. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/control-demo.yaml +0 -0
  244. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/hello.yaml +0 -0
  245. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/python-check.yaml +0 -0
  246. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/system-check.yaml +0 -0
  247. /package/{node_modules/@mytools/core/src → manual/packages/sdk}/diagnostics.js +0 -0
@@ -1 +0,0 @@
1
- @font-face{font-family:Geist;font-style:normal;font-display:swap;font-weight:400;src:url(./geist-latin-400-normal-B40WzpMT.woff2)format("woff2"),url(./geist-latin-400-normal-akEymXtG.woff)format("woff")}@font-face{font-family:Geist;font-style:normal;font-display:swap;font-weight:500;src:url(./geist-latin-500-normal-CTWBw9NS.woff2)format("woff2"),url(./geist-latin-500-normal-BDXIbFrL.woff)format("woff")}@font-face{font-family:Geist;font-style:normal;font-display:swap;font-weight:600;src:url(./geist-latin-600-normal-CSETrqM2.woff2)format("woff2"),url(./geist-latin-600-normal-DsPlZH-9.woff)format("woff")}input:not([type=checkbox]),select,textarea{color:#304d3e;background:#fff;border:1px solid #cfdbd2;border-radius:6px;padding:9px 10px}input::placeholder,textarea::placeholder{color:#7b8d81}input:disabled{color:#68758c;background:0 0}fieldset{border:0;min-width:0;margin:0;padding:0}.rjsf{font-size:13px}.rjsf .form-group{margin-bottom:13px}.rjsf .control-label{color:#476253;margin-bottom:7px;font-size:13px;display:block}.rjsf input:not([type=checkbox]),.rjsf select,.rjsf textarea{width:100%;font-size:13px}.rjsf legend{margin:13px 0;padding:0;font-size:12px;font-weight:600}.rjsf .help-block,.rjsf .field-description{color:#657571;margin:5px 0 8px;font-size:12px;line-height:1.6}.rjsf .checkbox label{align-items:center;gap:7px;font-size:13px;display:flex}.rjsf input[type=checkbox]{accent-color:#137566}.rjsf .required{color:#c18678;margin-left:3px}.rjsf ul.error-detail{color:#b36359;padding-left:17px;font-size:12px}.rjsf .btn{color:#647799;font:inherit;cursor:pointer;background:#f5f7fb;border:1px solid #e0e6f0;border-radius:5px;padding:7px 11px}.rjsf .array-item{border:1px solid #e7ebf2;border-radius:6px;margin:8px 0;padding:10px}.rjsf .field-object{margin-bottom:10px}.rjsf .text-danger{color:#b46258}.rjsf .row{flex-wrap:wrap;display:flex}.rjsf .col-xs-9{width:75%}.rjsf .col-xs-3{width:25%}.rjsf .col-xs-12{width:100%}.rjsf .btn-group{gap:3px;display:flex}.rjsf .glyphicon-plus:before{content:"+"}.rjsf .glyphicon-remove:before{content:"×"}.rjsf .glyphicon-arrow-up:before{content:"↑"}.rjsf .glyphicon-arrow-down:before{content:"↓"}.rjsf .glyphicon-copy:before{content:"复制"}:root{color:#233734;font-synthesis:none;--ink:#233734;--muted:#657571;--line:#dce4e0;--accent:#137566;background:#f5f7f6;font-family:Geist,Segoe UI,Microsoft YaHei,sans-serif}*{box-sizing:border-box}body{margin:0;font-size:14px}button,input,select,textarea{font:inherit}button{cursor:pointer;transition:background .16s,border-color .16s,color .16s}button:disabled{cursor:not-allowed;opacity:.45}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline-offset:3px;outline:3px solid #58ad9c}button svg{flex-shrink:0}input,select,textarea{min-width:0}p{line-height:1.75}h1,h2,h3,p{margin-top:0}button,a{-webkit-tap-highlight-color:transparent}.topbar{border-bottom:1px solid var(--line);background:#fff;justify-content:space-between;align-items:center;gap:20px;min-height:76px;padding:14px 32px;display:flex}.brand{color:var(--ink);text-align:left;background:0 0;border:0;align-items:center;gap:12px;padding:0;display:flex}.brand-mark{color:#fff;background:#153e35;border-radius:12px;place-items:center;width:42px;height:42px;display:grid}.brand strong{letter-spacing:-.6px;font-size:21px;font-weight:600}.brand strong span{letter-spacing:1px;color:var(--muted);margin-top:3px;font-size:11px;font-weight:400;display:block}.topbar-actions{align-items:center;gap:24px;display:flex}.local-label{color:var(--muted);align-items:center;gap:8px;font-size:12px;display:flex}.local-label i{background:#278772;border-radius:50%;width:6px;height:6px}.button{color:var(--ink);white-space:nowrap;background:#fff;border:1px solid #cfdad4;border-radius:8px;justify-content:center;align-items:center;gap:7px;min-height:40px;padding:10px 14px;font-size:13px;font-weight:500;display:inline-flex}.button:hover{background:#edf3f0;border-color:#aabfb4}.button.primary{color:#fff;background:var(--accent);border-color:var(--accent)}.button.primary:hover{background:#0d5b4e}.button.quiet{background:#f5f7f6;border-color:#e9eeeb}.count{color:#66796e;border-left:1px solid #d5dfd8;margin-left:3px;padding-left:9px;font-size:12px}.eyebrow{color:#58756a;letter-spacing:1px;font-size:12px;font-weight:500}.text-button{color:var(--accent);background:0 0;border:0;align-items:center;gap:6px;padding:6px 0;font-size:13px;display:inline-flex}.text-button:hover{color:#083d33}.icon{color:#61756b;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:7px;display:inline-flex}.icon:hover{color:var(--ink);background:#e7eeea}.muted{color:var(--muted);font-size:13px}.home{max-width:1240px;margin:0 auto;padding:52px 40px 28px}.welcome{border-bottom:1px solid var(--line);grid-template-columns:1.25fr 1fr;align-items:center;gap:64px;padding:4px 0 44px;display:grid}.welcome h1{letter-spacing:-1.8px;max-width:760px;margin:17px 0;font-size:clamp(32px,3.8vw,48px);font-weight:600;line-height:1.3}.welcome p{color:var(--muted);margin-bottom:0}.quick-guide{border-left:1px solid #d3dfd7;gap:23px;padding-left:26px;display:grid}.quick-guide>div{align-items:flex-start;gap:15px;display:flex}.quick-guide>div>span{color:#4f7362;border:1px solid #b6cdc0;border-radius:50%;flex-shrink:0;place-items:center;width:29px;height:29px;font-size:12px;display:grid}.quick-guide strong{font-size:14px;font-weight:600;line-height:29px}.quick-guide p{margin:3px 0 0;font-size:12px}.workflow-section{padding-top:34px}.section-heading{justify-content:space-between;align-items:center;gap:18px;margin-bottom:20px;display:flex}.section-heading h2{letter-spacing:-.4px;margin-bottom:6px;font-size:21px}.section-heading h2 span{color:#65816e;margin-left:8px;font-size:13px;font-weight:400}.section-heading p{color:var(--muted);margin-bottom:0;font-size:13px}.search{color:#7d9085;border:1px solid var(--line);background:#fff;border-radius:8px;align-items:center;gap:9px;padding:0 12px;display:flex}.search input:not([type=checkbox]){background:0 0;border:0;border-radius:0;width:100%;padding:12px 0;font-size:13px}.search input:focus-visible{outline-offset:0}.home-search{margin-bottom:20px}.home-search>span{white-space:nowrap;color:var(--muted);font-size:12px}.workflow-grid{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-flow:dense;gap:18px;display:grid}.workflow-card{border:1px solid var(--line);background:#fff;border-radius:12px;flex-direction:column;min-width:0;padding:22px 22px 0;transition:border-color .18s,box-shadow .18s;display:flex}.workflow-card:hover,.workflow-card:focus-within{border-color:#8bb7a3;box-shadow:0 5px 20px #20392e08}.workflow-card>header{justify-content:space-between;align-items:center;margin-bottom:21px;display:flex}.workflow-icon{color:#44715a;background:#edf4ee;border-radius:10px;place-items:center;width:40px;height:40px;display:grid}.step-count{color:var(--muted);font-size:12px}.workflow-card h3{overflow-wrap:anywhere;margin-bottom:9px;font-size:17px;font-weight:600}.workflow-card>p{color:var(--muted);flex:1;margin-bottom:22px;font-size:13px}.workflow-card dl{gap:8px;margin:0 0 20px;font-size:12px;display:grid}.workflow-card dl>div{gap:13px;display:flex}.workflow-card dt{color:#758b7d;flex-shrink:0}.workflow-card dd{color:#486050;overflow-wrap:anywhere;margin:0}.card-open{width:100%;color:var(--accent);background:0 0;border:0;border-top:1px solid #e9eeeb;justify-content:space-between;align-items:center;padding:15px 0;font-weight:500;display:flex}.card-open:hover{color:#073b2b}.home-empty{text-align:center;color:var(--muted);padding:45px 15px}.home-empty h3{color:var(--ink);margin:15px 0 8px;font-size:16px}.home-footer{color:#6a7e72;justify-content:space-between;gap:18px;margin-top:36px;font-size:12px;display:flex}.home-footer span{align-items:center;gap:8px;display:inline-flex}.workspace{grid-template-columns:258px minmax(0,1fr) 320px;min-height:calc(100vh - 76px);display:grid}.library{border-right:1px solid var(--line);background:#fafcfb;min-width:0;padding:27px 18px}.library-heading h2{margin-bottom:6px;font-size:18px}.library-heading p{color:var(--muted);margin-bottom:21px;font-size:12px}.tabs{border-bottom:1px solid var(--line);gap:10px;margin:20px 0 16px;display:flex}.tabs button{color:var(--muted);background:0 0;border:0;border-bottom:2px solid #0000;flex:1;padding:0 0 12px;font-size:12px}.tabs button.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.tabs span{margin-left:4px;font-size:11px}.library-items{flex-direction:column;gap:12px;display:flex}.capability{border:1px solid var(--line);background:#fff;border-radius:9px;min-width:0;padding:15px}.capability:hover{border-color:#9dbeac}.capability-title{color:#395548;align-items:center;gap:8px;display:flex}.capability-title strong{color:var(--ink);font-size:13px;font-weight:500}.capability p{color:var(--muted);margin:11px 0 16px;font-size:12px}.capability-footer{justify-content:space-between;align-items:center;gap:10px;display:flex}.capability-footer>span{color:#728278;overflow-wrap:anywhere;min-width:0;font-size:11px}.capability-footer button{color:#14624b;white-space:nowrap;background:#eaf3ed;border:0;border-radius:5px;align-items:center;gap:3px;padding:6px 9px;font-size:12px;display:flex}.capability-footer button:hover{background:#d6e8dc}.library-open{margin-top:8px;font-size:11px}.library-note{color:#74867a;align-items:flex-start;gap:9px;padding-top:25px;font-size:11px;line-height:1.75;display:flex}.library-note svg{flex-shrink:0;margin-top:2px}.library-empty{padding:20px 0}.canvas{min-width:0;padding:0 34px 44px}.canvas-toolbar{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:12px;height:65px;display:flex}.back-button{color:#5e7566;font-size:12px}.draft-tag{color:#627b6a;font-size:11px}.draft-tag.unsaved{color:#926027}.flow-heading{padding:24px 0 20px}.flow-heading input.flow-title{letter-spacing:-.8px;width:100%;color:var(--ink);background:0 0;border:1px solid #0000;border-radius:5px;padding:6px 0;font-size:28px;font-weight:600;display:block}.flow-heading input.flow-description{width:100%;color:var(--muted);background:0 0;border:1px solid #0000;padding:6px 0;font-size:13px;display:block}.flow-heading input:hover:not(:disabled),.flow-heading input:focus-visible{border-bottom-color:#a6c3b1}.editor-guide{border-bottom:1px solid var(--line);color:#687f6e;flex-wrap:wrap;gap:10px 20px;margin-bottom:22px;padding-bottom:22px;font-size:11px;display:flex}.editor-guide span{align-items:center;gap:7px;display:inline-flex}.editor-guide b{border:1px solid #bacdc0;border-radius:50%;place-items:center;width:18px;height:18px;font-size:10px;font-weight:500;display:grid}.flow-actions{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:15px;margin-bottom:20px;display:flex}.flow-meta{color:#748579;flex-wrap:wrap;align-items:center;gap:8px;font-size:11px;display:flex}.flow-meta strong{color:#3f5f4e;font-size:12px;font-weight:500}.flow-meta .saved{color:#187754;align-items:center;gap:4px;display:flex}.action-group{flex-wrap:wrap;gap:7px;display:flex}.action-group .button{padding:9px 12px;font-size:12px}.step{cursor:pointer;background:#fff;border:1px solid #d6e1d9;border-radius:10px;align-items:center;gap:10px;min-width:0;padding:18px 12px;transition:border-color .18s,background .18s;display:flex;position:relative}.step:hover{border-color:#8eb89f}.step.selected{background:#fcfefd;border-color:#198260;box-shadow:0 0 0 2px #d7eae0}.step-number{color:#58725f;background:#eff4ef;border-radius:7px;flex-shrink:0;place-items:center;width:30px;height:30px;font-size:12px;display:grid}.step-text{min-width:0;color:var(--ink);text-align:left;background:0 0;border:0;flex:1;padding:3px 0}.step-text strong{font-size:14px;font-weight:500;display:block}.step-text>span{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;margin-top:5px;font-size:12px;display:block;overflow:hidden}.step-text small{color:#2b7960;margin-top:8px;font-size:11px;display:block}.step-buttons{gap:0;display:flex}.step-buttons .icon{padding:6px}.grip{cursor:grab;touch-action:none;color:#8a9d90;padding:2px}.connector{color:#a5bcae;align-items:center;height:25px;padding-left:46px;display:flex}.step.succeeded .step-number{color:#21855a;background:#e0f1e7}.step.failed{border-color:#d09c91}.step.failed .step-number{color:#ae4937;background:#f9e8e4}.status-dot{background:#d7e4da;border-radius:50%;width:5px;height:5px}.status-dot.succeeded{background:#299a65}.status-dot.failed{background:#be6654}.status-dot.started{background:#299a65;animation:1s infinite pulse}.list-hint{color:#708576;text-align:center;padding:17px 0 4px;font-size:11px}.add-step-button{color:#397557;background:0 0;border:1px dashed #afc7b7;border-radius:8px;flex-wrap:wrap;justify-content:center;align-items:center;gap:7px;width:100%;margin:18px 0;padding:15px;font-size:13px;display:flex}.add-step-button span{color:var(--muted);margin-left:5px;font-size:11px}.add-step-button:hover{background:#edf5ef}.empty-editor{text-align:center;padding:28px 12px 18px}.empty-icon{color:#6b9476;background:#e6efe7;border-radius:12px;place-items:center;width:46px;height:46px;margin:0 auto 18px;display:grid}.empty-editor h3{margin-bottom:8px;font-size:17px}.empty-editor p{color:var(--muted);font-size:13px}.inspector{border-left:1px solid var(--line);background:#fff;min-width:0}.inspector-top{border-bottom:1px solid var(--line);justify-content:space-between;padding:24px;font-size:13px;font-weight:500;display:flex}.inspector-top span{color:var(--muted);font-size:11px;font-weight:400}.inspector-heading{padding:27px 24px 5px}.inspector-heading h2{margin:10px 0;font-size:19px;line-height:1.5}.inspector-heading p{color:var(--muted);font-size:12px}.inspector-section{border-top:1px solid #e9eeeb;padding:20px 24px}.inspector-section h3{margin-bottom:15px;font-size:13px;font-weight:500}.inspector-placeholder{text-align:center;color:#8da394;padding:80px 25px}.inspector-placeholder h3{color:#607e6a;margin:20px 0 10px;font-size:15px}.inspector-placeholder p{color:var(--muted);font-size:13px}.input-sources summary{cursor:pointer;font-size:13px}.input-sources summary span{color:var(--muted);margin:6px 0 0 14px;font-size:11px;display:block}.source-field{margin:17px 0 0;display:block}.source-field>span{justify-content:space-between;gap:10px;margin-bottom:8px;font-size:12px;display:flex}.source-field small{color:var(--muted);overflow-wrap:anywhere;font-size:10px}.source-field select{width:100%;font-size:12px}.output-field{flex-wrap:wrap;justify-content:space-between;gap:4px;margin-bottom:15px;font-size:12px;display:flex}.output-field code{color:#687f6c;background:#eef3ef;border-radius:3px;padding:2px 5px;font-size:10px}.output-field small{width:100%;color:var(--muted);font-size:10px}.workflow-outputs{border-top:1px solid var(--line);color:#4e6b59;padding:20px 0;font-size:12px}.workflow-outputs summary{cursor:pointer}.workflow-outputs summary span{color:var(--muted);margin-left:8px;font-size:11px}.output-binding{align-items:center;gap:8px;margin:14px 0;display:flex}.output-binding .output-name{width:100px}.output-binding select{flex:1;width:0;min-width:0;font-size:12px}.run-panel{border-top:1px solid var(--line);margin-top:0;padding-top:23px}.run-panel>header{justify-content:space-between;align-items:center;margin-bottom:16px;display:flex}.run-panel h3{margin:10px 0 0;font-size:17px;font-weight:500}.run-panel.succeeded h3{color:#197149}.run-panel.failed h3{color:#a74734}.run-events{flex-direction:column;gap:10px;display:flex}.event{color:#387f56;align-items:center;gap:8px;font-size:12px;display:flex}.event small{color:var(--muted);margin-left:auto}.event.bad{color:#aa5140}.result{margin-top:24px;font-size:12px}.result>span{color:var(--muted)}.result-value{border-left:3px solid #8fbea3;margin-top:12px;padding:4px 0 4px 14px}.result-value strong{color:#62816b;font-size:11px;font-weight:400}.result-value p{color:#254b34;white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0 0;font-size:17px}.result pre,.run-error pre,.step-results pre{color:#425e4e;white-space:pre-wrap;overflow-wrap:anywhere;background:#edf2ee;border-radius:6px;max-height:260px;padding:14px;font-size:12px;line-height:1.7;overflow:auto}.run-error{color:#aa5140;overflow-wrap:anywhere;margin-top:15px;font-size:13px}.run-error summary,.step-results summary{cursor:pointer}.step-results{color:#5c7665;margin-top:22px;font-size:12px}.step-results strong{margin-top:17px;font-size:12px;font-weight:500;display:block}.run-id{color:#778c7c;overflow-wrap:anywhere;margin-top:18px;font-size:10px;display:block}.alert{border-radius:8px;align-items:center;gap:10px;padding:14px 18px;font-size:13px;line-height:1.7;display:flex}.alert.error{color:#a54a36;background:#fbeee9}.alert>span{overflow-wrap:anywhere;flex:1}.global-alert{margin:18px 30px}.loading-state{color:var(--muted);justify-content:center;gap:12px;padding:90px 20px;display:flex}.modal{width:560px;max-width:calc(100vw - 32px);max-height:calc(100dvh - 40px);color:var(--ink);background:#fff;border:1px solid #dce5de;border-radius:16px;padding:0;box-shadow:0 24px 100px #14271d33}.modal::backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#172c2466}.modal[open]{animation:.16s ease-out appear}.modal-content{padding:27px}.modal-content>header{justify-content:space-between;align-items:center;gap:15px;margin-bottom:22px;display:flex}.modal h2{margin:0;font-size:20px}.modal-footer{border-top:1px solid var(--line);justify-content:flex-end;gap:10px;margin-top:24px;padding-top:20px;display:flex}.modal .library-heading{display:none}.inspector-dialog{width:490px}.inspector-dialog .inspector-heading{padding:0 0 14px}.inspector-dialog .inspector-section{padding:20px 0}.plugin-list>div{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;padding:18px 0;display:flex}.plugin-list strong{font-size:14px}.plugin-list p{color:var(--muted);overflow-wrap:anywhere;margin:6px 0 0;font-size:12px}.install-form{margin-top:25px}.install-form>label{font-size:14px;font-weight:500}.install-form>div{gap:9px;display:flex}.install-form input{flex:1;min-width:0}.danger{color:#ac503c}.check-row{align-items:center;gap:10px;padding:13px 0;font-size:13px;display:flex}.check-row input{accent-color:var(--accent);width:16px;height:16px}.check-row small{color:var(--muted);margin-left:auto}.export-options{border:1px solid var(--line);border-radius:8px;margin:20px 0;padding:5px 15px}.form-label{margin-top:20px;font-size:13px;display:block}.form-label select{width:100%;margin-top:10px;display:block}.export-status{background:#eef5f0;border-radius:8px;margin-top:20px;padding:16px;font-size:13px}.export-status p{overflow-wrap:anywhere;margin:10px 0;font-size:12px}.export-status.failed{background:#fbeee9}.field-error{overflow-wrap:anywhere;font-size:12px;line-height:1.7;display:block;color:#a34b34!important}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.4}}@keyframes appear{0%{opacity:.5;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}@media (width>=1600px){.workspace{grid-template-columns:280px minmax(0,1fr) 360px}.canvas{padding-left:60px;padding-right:60px}}@media (width<=1199px){.workspace{grid-template-columns:250px minmax(0,1fr)}.canvas{padding-left:26px;padding-right:26px}.home{padding:40px 30px 26px}.welcome{gap:35px}.workflow-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=760px){.topbar{padding:14px 20px}.local-label{display:none}.home{padding:28px 20px}.welcome{grid-template-columns:1fr;gap:28px;padding-bottom:28px}.welcome h1{font-size:35px}.quick-guide{border:0;gap:18px;padding:0;display:flex}.quick-guide>div{flex:1;display:block}.quick-guide strong{margin-top:6px;font-size:12px;line-height:1.6;display:block}.quick-guide p{font-size:11px}.quick-guide>div>span{width:24px;height:24px;font-size:11px}.workspace{display:block}.workspace>.library{display:none}.canvas{padding:0 20px 30px}.home-footer{flex-direction:column;gap:8px}.step-buttons{flex-direction:column}.home-search>span{display:none}}@media (width<=480px){.workflow-grid{grid-template-columns:1fr}.workflow-card{padding:20px 20px 0}.welcome h1{font-size:32px}.welcome p{font-size:13px}.brand strong{font-size:19px}.brand strong span{display:none}.brand-mark{border-radius:9px;width:35px;height:35px}.topbar{gap:12px;min-height:64px;padding:12px 16px}.topbar .button{padding:8px 10px;font-size:12px}.topbar .count{display:none}.section-heading{align-items:flex-start}.section-heading h2{font-size:18px}.section-heading p{font-size:12px}.section-heading .button{padding:9px 11px;font-size:12px}.flow-heading input.flow-title{font-size:25px}.editor-guide{gap:10px}.editor-guide span{gap:4px;font-size:10px}.editor-guide b{width:16px;height:16px}.action-group{width:100%}.action-group .primary{flex:1}.add-step-button span{display:none}.modal-content{padding:20px}.modal h2{font-size:18px}.step{gap:7px;padding:12px 9px}.step-text>span{max-width:100%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}.nested-steps{border-left:2px solid #bcd3c7;min-width:0;margin:10px 0 14px 15px;padding:10px 0 8px 12px}.nested-steps>header{color:#436653;justify-content:space-between;gap:10px;margin-bottom:12px;font-size:12px;display:flex}.nested-steps>header>span{color:var(--muted)}.nested-steps .empty-editor{text-align:left;padding:8px 0;font-size:12px}.nested-steps .step{flex-wrap:wrap}.nested-steps .step-buttons{margin-left:auto}.nested-steps .step-text{flex-basis:90px}.condition-editor{min-width:0}.condition-editor label{margin:10px 0;font-size:12px;display:block}.condition-editor select,.condition-editor input,.form-label>input{width:100%;margin-top:7px;font-size:12px;display:block}.condition-child{border-left:2px solid var(--line);min-width:0;margin:12px 0 10px 4px;padding:0 0 0 10px}.condition-node,.condition-operand{min-width:0}.condition-editor .muted{font-size:11px}.step.skipped{opacity:.65}.step.stopped .step-number{color:#8b5e18;background:#f8ead2}.step.cancelled .step-number{color:#657571;background:#e5e9e7}.run-reason{color:#775721;overflow-wrap:anywhere;background:#fbf1df;border-radius:7px;padding:12px}.observation-dialog{width:850px}.observation-dialog .run-panel{border:0;padding-top:0}.observation-filter{margin:12px 0 16px;font-size:12px;display:block}.observation-filter select{width:100%;margin-top:7px;font-size:12px;display:block}.run-step-list{border:1px solid var(--line);border-radius:8px;max-height:350px;overflow:auto}.run-step{border:0;border-bottom:1px solid var(--line);text-align:left;width:100%;color:var(--ink);background:#fff;justify-content:space-between;align-items:center;gap:12px;padding:12px;font-size:12px;display:flex}.run-step:hover,.run-step.selected{background:#eaf3ed}.run-step-name{min-width:0}.run-step-name strong{font-weight:500;display:block}.run-step-name small{color:var(--muted);overflow-wrap:anywhere;margin-top:4px;display:block}.run-step>span:last-child{color:var(--muted);flex-shrink:0}.run-step.succeeded>span:last-child{color:#187754}.run-step.failed>span:last-child{color:#b24b36}.run-step.started>span:last-child{color:#137566}.observation-details pre,.live-logs{white-space:pre-wrap;overflow-wrap:anywhere;background:#edf2ee;border-radius:7px;max-height:320px;padding:14px;font-size:12px;line-height:1.7;overflow:auto}.observation-details h5{margin:12px 0 6px;font-weight:500}.live-logs{color:#deeee3;scrollbar-gutter:stable;background:#142d25;height:300px}.log-toolbar{color:var(--muted);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;font-size:11px;display:flex}.log-path{color:#9dc4ac;font-size:10px}.log-stderr{color:#ffb5a1}@media (width<=760px){.topbar-actions{flex-wrap:wrap;justify-content:flex-end;gap:7px}.nested-steps{margin-left:4px;padding-left:8px}.nested-steps .step-buttons{flex-direction:row}.step-list .nested-steps .nested-steps .nested-steps{margin-left:0;padding-left:5px}}