@yanglaofish/fishtools 0.4.0 → 0.5.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 (262) 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/kernel-generation.md +97 -0
  6. package/manual/docs/modules.md +57 -0
  7. package/manual/docs/plugin-development.md +120 -10
  8. package/manual/docs/releases.md +24 -0
  9. package/manual/docs/research/2026-10-11-plugin-kernel-capabilities.md +6 -6
  10. package/manual/docs/roadmap.md +14 -3
  11. package/manual/docs/superpowers/plans/2026-10-09-workflow-mvp.md +5 -5
  12. package/manual/docs/superpowers/plans/2026-10-11-public-plugin-fixes.md +2 -2
  13. package/manual/docs/superpowers/plans/2026-10-12-kernel-generation.md +22 -0
  14. package/manual/docs/superpowers/plans/2026-10-12-modular-kernel.md +40 -0
  15. package/manual/docs/superpowers/reviews/2026-10-12-kernel-generation-review.md +27 -0
  16. package/manual/docs/superpowers/reviews/2026-10-12-modular-kernel-review.md +32 -0
  17. package/manual/docs/superpowers/reviews/2026-10-13-0.5.0-followup-review.md +67 -0
  18. package/manual/docs/superpowers/reviews/2026-10-13-kernel-runtime-release-review.md +19 -0
  19. package/manual/docs/superpowers/specs/2026-10-12-action-network-policy-design.md +52 -0
  20. package/manual/docs/superpowers/specs/2026-10-12-kernel-generation-design.md +38 -0
  21. package/manual/docs/superpowers/specs/2026-10-12-modular-kernel-design.md +70 -0
  22. package/manual/docs/superpowers/specs/2026-10-12-plugin-readiness-design.md +21 -0
  23. package/manual/docs/superpowers/specs/2026-10-12-runtime-maintenance-granularity-design.md +35 -0
  24. package/manual/docs/superpowers/specs/2026-10-12-workflow-variation-design.md +19 -0
  25. package/manual/docs/verification.md +55 -2
  26. package/manual/packages/core/README.md +44 -0
  27. package/manual/packages/core/package.json +38 -0
  28. package/manual/packages/core/src/application.js +251 -85
  29. package/manual/packages/core/src/bundle.js +2 -0
  30. package/manual/packages/core/src/development-watch-worker.js +69 -0
  31. package/manual/packages/core/src/development.js +146 -0
  32. package/manual/packages/core/src/environments.js +2 -0
  33. package/manual/packages/core/src/export-snapshot.js +42 -0
  34. package/manual/packages/core/src/plugin-update.js +108 -0
  35. package/manual/packages/core/src/process.js +2 -0
  36. package/manual/packages/core/src/resources.js +31 -0
  37. package/manual/packages/core/src/version.js +2 -0
  38. package/manual/packages/fst-cli/LICENSE +21 -0
  39. package/manual/packages/fst-cli/README.md +59 -0
  40. package/{node_modules/@mytools/core → manual/packages/fst-cli}/bin/fst.js +55 -23
  41. package/manual/packages/fst-cli/package.json +50 -0
  42. package/manual/packages/fst-cli/src/development.js +53 -0
  43. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/model.js +1 -1
  44. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/navigation.js +1 -1
  45. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/presentation.js +9 -1
  46. package/manual/packages/fst-cli/src/terminal/run-feed.js +119 -0
  47. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-viewer.js +9 -7
  48. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/schema.js +1 -1
  49. package/manual/packages/{core → fst-cli}/src/terminal/session.js +137 -9
  50. package/manual/packages/{core → fst-cli}/src/terminal/view.js +20 -3
  51. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/workflow-menu.js +17 -2
  52. package/manual/packages/fst-devtools/LICENSE +21 -0
  53. package/manual/packages/fst-devtools/README.md +28 -0
  54. package/manual/packages/fst-devtools/package.json +29 -0
  55. package/{node_modules/@mytools/core → manual/packages/fst-devtools}/src/documentation.js +3 -1
  56. package/manual/packages/fst-devtools/src/plugin-quality.js +136 -0
  57. package/{node_modules/@mytools/core → manual/packages/fst-devtools}/src/plugin-tools.js +24 -5
  58. package/manual/packages/fst-logs/LICENSE +21 -0
  59. package/manual/packages/fst-logs/README.md +67 -0
  60. package/manual/packages/fst-logs/package.json +26 -0
  61. package/manual/packages/fst-logs/src/log-bounds.js +91 -0
  62. package/manual/packages/fst-logs/src/run-logs.js +224 -0
  63. package/manual/packages/fst-logs/src/run-preview.js +18 -0
  64. package/manual/packages/fst-logs/src/step-summaries.js +28 -0
  65. package/manual/packages/fst-platform/LICENSE +21 -0
  66. package/manual/packages/fst-platform/README.md +73 -0
  67. package/manual/packages/fst-platform/package.json +33 -0
  68. package/manual/packages/fst-platform/src/bundle.js +17 -0
  69. package/manual/packages/fst-platform/src/environments.js +67 -0
  70. package/manual/packages/fst-platform/src/file-probe-engine.js +183 -0
  71. package/manual/packages/fst-platform/src/file-probe-worker.js +43 -0
  72. package/manual/packages/fst-platform/src/file-probe.js +6 -0
  73. package/manual/packages/fst-platform/src/json.js +5 -0
  74. package/manual/packages/fst-platform/src/network.js +199 -0
  75. package/manual/packages/fst-platform/src/npm.js +11 -0
  76. package/manual/packages/fst-platform/src/process.js +110 -0
  77. package/manual/packages/fst-plugin/LICENSE +21 -0
  78. package/manual/packages/fst-plugin/README.md +29 -0
  79. package/manual/packages/fst-plugin/package.json +29 -0
  80. package/{node_modules/@mytools/core → manual/packages/fst-plugin}/src/contracts.js +30 -3
  81. package/manual/packages/fst-plugin/src/host.js +235 -0
  82. package/manual/packages/fst-plugin/src/loader.js +21 -0
  83. package/manual/packages/fst-plugin/src/privileges.js +91 -0
  84. package/{node_modules/@mytools/core → manual/packages/fst-plugin}/src/runtime.js +27 -8
  85. package/manual/packages/fst-workflow/LICENSE +21 -0
  86. package/manual/packages/fst-workflow/README.md +28 -0
  87. package/manual/packages/fst-workflow/package.json +24 -0
  88. package/{node_modules/@mytools/core → manual/packages/fst-workflow}/src/control.js +3 -2
  89. package/manual/packages/{core → fst-workflow}/src/engine.js +2 -2
  90. package/manual/packages/fst-workspace/LICENSE +21 -0
  91. package/manual/packages/fst-workspace/README.md +32 -0
  92. package/manual/packages/fst-workspace/package.json +34 -0
  93. package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/bundle-workspace.js +1 -1
  94. package/manual/packages/fst-workspace/src/index.js +3 -0
  95. package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/plugins.js +6 -36
  96. package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/workflows.js +40 -7
  97. package/manual/packages/pack/LICENSE +21 -0
  98. package/manual/packages/pack/README.md +31 -0
  99. package/manual/packages/pack/archive.js +15 -0
  100. package/manual/packages/pack/dependencies.js +105 -0
  101. package/manual/packages/pack/environments.js +50 -0
  102. package/manual/packages/pack/index.js +103 -0
  103. package/manual/packages/pack/package.json +29 -0
  104. package/manual/packages/pack/runtime.js +61 -0
  105. package/manual/packages/sdk/README.md +31 -0
  106. package/manual/packages/sdk/conditions.js +1 -0
  107. package/manual/packages/sdk/package.json +23 -1
  108. package/manual/plugins/web/README.md +29 -0
  109. package/manual/tests/application.test.js +6 -4
  110. package/node_modules/@mytools/core/README.md +44 -0
  111. package/node_modules/@mytools/core/package.json +17 -17
  112. package/node_modules/@mytools/core/src/application.js +251 -85
  113. package/node_modules/@mytools/core/src/bundle.js +2 -17
  114. package/node_modules/@mytools/core/src/development-watch-worker.js +69 -0
  115. package/node_modules/@mytools/core/src/development.js +146 -0
  116. package/node_modules/@mytools/core/src/environments.js +2 -67
  117. package/node_modules/@mytools/core/src/export-snapshot.js +42 -0
  118. package/node_modules/@mytools/core/src/plugin-update.js +108 -0
  119. package/node_modules/@mytools/core/src/process.js +2 -80
  120. package/node_modules/@mytools/core/src/version.js +1 -1
  121. package/node_modules/@mytools/fst-cli/LICENSE +21 -0
  122. package/node_modules/@mytools/fst-cli/README.md +59 -0
  123. package/node_modules/@mytools/fst-cli/bin/fst.js +124 -0
  124. package/node_modules/@mytools/fst-cli/package.json +50 -0
  125. package/node_modules/@mytools/fst-cli/src/cli-run.js +12 -0
  126. package/node_modules/@mytools/fst-cli/src/development.js +53 -0
  127. package/node_modules/@mytools/fst-cli/src/terminal/conditions.js +32 -0
  128. package/node_modules/@mytools/fst-cli/src/terminal/log-viewer.js +45 -0
  129. package/node_modules/@mytools/fst-cli/src/terminal/model.js +104 -0
  130. package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +17 -0
  131. package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +50 -0
  132. package/node_modules/@mytools/fst-cli/src/terminal/run-feed.js +119 -0
  133. package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +60 -0
  134. package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +106 -0
  135. package/node_modules/@mytools/fst-cli/src/terminal/schema.js +52 -0
  136. package/node_modules/@mytools/{core → fst-cli}/src/terminal/session.js +137 -9
  137. package/node_modules/@mytools/fst-cli/src/terminal/theme.js +29 -0
  138. package/node_modules/@mytools/{core → fst-cli}/src/terminal/view.js +20 -3
  139. package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +65 -0
  140. package/node_modules/@mytools/fst-devtools/LICENSE +21 -0
  141. package/node_modules/@mytools/fst-devtools/README.md +28 -0
  142. package/node_modules/@mytools/fst-devtools/package.json +29 -0
  143. package/node_modules/@mytools/fst-devtools/src/documentation.js +67 -0
  144. package/node_modules/@mytools/fst-devtools/src/plugin-quality.js +136 -0
  145. package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +152 -0
  146. package/node_modules/@mytools/fst-logs/LICENSE +21 -0
  147. package/node_modules/@mytools/fst-logs/README.md +67 -0
  148. package/node_modules/@mytools/fst-logs/package.json +26 -0
  149. package/node_modules/@mytools/fst-logs/src/log-bounds.js +91 -0
  150. package/node_modules/@mytools/fst-logs/src/markdown-log.js +55 -0
  151. package/node_modules/@mytools/fst-logs/src/run-logs.js +224 -0
  152. package/node_modules/@mytools/fst-logs/src/run-preview.js +18 -0
  153. package/node_modules/@mytools/fst-logs/src/step-summaries.js +28 -0
  154. package/node_modules/@mytools/fst-platform/LICENSE +21 -0
  155. package/node_modules/@mytools/fst-platform/README.md +73 -0
  156. package/node_modules/@mytools/fst-platform/package.json +33 -0
  157. package/node_modules/@mytools/fst-platform/src/bundle.js +17 -0
  158. package/node_modules/@mytools/fst-platform/src/environments.js +67 -0
  159. package/node_modules/@mytools/fst-platform/src/file-probe-engine.js +183 -0
  160. package/node_modules/@mytools/fst-platform/src/file-probe-worker.js +43 -0
  161. package/node_modules/@mytools/fst-platform/src/file-probe.js +6 -0
  162. package/node_modules/@mytools/fst-platform/src/json.js +5 -0
  163. package/node_modules/@mytools/fst-platform/src/network.js +199 -0
  164. package/node_modules/@mytools/fst-platform/src/npm.js +11 -0
  165. package/node_modules/@mytools/fst-platform/src/process.js +110 -0
  166. package/node_modules/@mytools/fst-plugin/LICENSE +21 -0
  167. package/node_modules/@mytools/fst-plugin/README.md +29 -0
  168. package/node_modules/@mytools/fst-plugin/package.json +29 -0
  169. package/node_modules/@mytools/fst-plugin/src/contracts.js +86 -0
  170. package/node_modules/@mytools/fst-plugin/src/host.js +235 -0
  171. package/node_modules/@mytools/fst-plugin/src/loader.js +21 -0
  172. package/node_modules/@mytools/fst-plugin/src/privileges.js +91 -0
  173. package/{manual/packages/core → node_modules/@mytools/fst-plugin}/src/runtime.js +27 -8
  174. package/node_modules/@mytools/fst-workflow/LICENSE +21 -0
  175. package/node_modules/@mytools/fst-workflow/README.md +28 -0
  176. package/node_modules/@mytools/fst-workflow/package.json +24 -0
  177. package/node_modules/@mytools/fst-workflow/src/control.js +64 -0
  178. package/node_modules/@mytools/{core → fst-workflow}/src/engine.js +2 -2
  179. package/node_modules/@mytools/fst-workspace/LICENSE +21 -0
  180. package/node_modules/@mytools/fst-workspace/README.md +32 -0
  181. package/node_modules/@mytools/fst-workspace/package.json +34 -0
  182. package/node_modules/@mytools/fst-workspace/src/bundle-workspace.js +39 -0
  183. package/node_modules/@mytools/fst-workspace/src/index.js +3 -0
  184. package/node_modules/@mytools/fst-workspace/src/plugin-installations.js +84 -0
  185. package/node_modules/@mytools/fst-workspace/src/plugins.js +35 -0
  186. package/node_modules/@mytools/fst-workspace/src/project.js +29 -0
  187. package/node_modules/@mytools/fst-workspace/src/workflows.js +150 -0
  188. package/node_modules/@mytools/fst-workspace/templates/control-demo.yaml +47 -0
  189. package/node_modules/@mytools/fst-workspace/templates/hello.yaml +35 -0
  190. package/node_modules/@mytools/fst-workspace/templates/python-check.yaml +26 -0
  191. package/node_modules/@mytools/fst-workspace/templates/system-check.yaml +11 -0
  192. package/node_modules/@mytools/pack/README.md +31 -0
  193. package/node_modules/@mytools/pack/dependencies.js +7 -2
  194. package/node_modules/@mytools/pack/environments.js +1 -1
  195. package/node_modules/@mytools/pack/index.js +33 -25
  196. package/node_modules/@mytools/pack/package.json +29 -1
  197. package/node_modules/@mytools/sdk/README.md +31 -0
  198. package/node_modules/@mytools/sdk/conditions.js +1 -0
  199. package/node_modules/@mytools/sdk/diagnostics.js +27 -0
  200. package/node_modules/@mytools/sdk/package.json +23 -1
  201. package/node_modules/@mytools/sdk/schema-path.js +31 -0
  202. package/node_modules/@mytools/sdk/validation.js +78 -0
  203. package/node_modules/@mytools/web/README.md +29 -0
  204. package/node_modules/@mytools/web/package.json +7 -0
  205. package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1440 -1240
  206. package/node_modules/@mytools/web/public/assets/index-BaVzHycP.js +70 -0
  207. package/node_modules/@mytools/web/public/assets/index-DA8Ae92t.css +1 -0
  208. package/node_modules/@mytools/web/public/index.html +2 -2
  209. package/node_modules/@mytools/web/server.js +24 -17
  210. package/node_modules/@mytools/web/src/model.js +84 -0
  211. package/node_modules/acorn/CHANGELOG.md +1012 -0
  212. package/node_modules/acorn/LICENSE +21 -0
  213. package/node_modules/acorn/README.md +309 -0
  214. package/node_modules/acorn/bin/acorn +4 -0
  215. package/node_modules/acorn/dist/acorn.d.mts +897 -0
  216. package/node_modules/acorn/dist/acorn.d.ts +897 -0
  217. package/node_modules/acorn/dist/acorn.js +6370 -0
  218. package/node_modules/acorn/dist/acorn.mjs +6341 -0
  219. package/node_modules/acorn/dist/bin.js +90 -0
  220. package/node_modules/acorn/package.json +50 -0
  221. package/node_modules/{minipass-flush/node_modules/minipass → tar}/node_modules/yallist/README.md +8 -7
  222. package/node_modules/tar/node_modules/yallist/package.json +68 -0
  223. package/node_modules/yallist/README.md +7 -8
  224. package/node_modules/yallist/package.json +12 -51
  225. package/package.json +131 -115
  226. package/manual/packages/core/src/host.js +0 -139
  227. package/manual/packages/core/src/terminal/run-feed.js +0 -78
  228. package/node_modules/@mytools/core/src/host.js +0 -139
  229. package/node_modules/@mytools/core/src/run-logs.js +0 -63
  230. package/node_modules/@mytools/core/src/terminal/run-feed.js +0 -78
  231. package/node_modules/@mytools/web/public/assets/index-DT2B4tMV.js +0 -70
  232. package/node_modules/@mytools/web/public/assets/index-vuZvrUTT.css +0 -1
  233. package/node_modules/minipass-flush/node_modules/minipass/node_modules/yallist/package.json +0 -29
  234. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/cli-run.js +0 -0
  235. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/conditions.js +0 -0
  236. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/log-viewer.js +0 -0
  237. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-presentation.js +0 -0
  238. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/theme.js +0 -0
  239. /package/{node_modules/@mytools/core → manual/packages/fst-logs}/src/markdown-log.js +0 -0
  240. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/plugin-installations.js +0 -0
  241. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/project.js +0 -0
  242. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/control-demo.yaml +0 -0
  243. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/hello.yaml +0 -0
  244. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/python-check.yaml +0 -0
  245. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/system-check.yaml +0 -0
  246. /package/{node_modules/@mytools/core/src → manual/packages/sdk}/diagnostics.js +0 -0
  247. /package/{node_modules/@mytools/core/src → manual/packages/sdk}/schema-path.js +0 -0
  248. /package/{node_modules/@mytools/core/src → manual/packages/sdk}/validation.js +0 -0
  249. /package/node_modules/{yallist → tar/node_modules/yallist}/LICENSE.md +0 -0
  250. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.d.ts +0 -0
  251. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.d.ts.map +0 -0
  252. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.js +0 -0
  253. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.js.map +0 -0
  254. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/package.json +0 -0
  255. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.d.ts +0 -0
  256. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.d.ts.map +0 -0
  257. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.js +0 -0
  258. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.js.map +0 -0
  259. /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/package.json +0 -0
  260. /package/node_modules/{minipass-flush/node_modules/minipass/node_modules/yallist → yallist}/LICENSE +0 -0
  261. /package/node_modules/{minipass-flush/node_modules/minipass/node_modules/yallist → yallist}/iterator.js +0 -0
  262. /package/node_modules/{minipass-flush/node_modules/minipass/node_modules/yallist → yallist}/yallist.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yanglaofish/fishtools",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "Fishtools 插件式工作流工作台",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,74 +27,20 @@
27
27
  "manual"
28
28
  ],
29
29
  "dependencies": {
30
- "@mytools/core": "0.1.0",
31
- "@mariozechner/pi-tui": "0.50.0",
32
- "@types/mime-types": "2.1.4",
33
- "chalk": "5.6.2",
34
- "get-east-asian-width": "1.7.0",
35
- "marked": "15.0.12",
36
- "mime-types": "3.0.2",
37
- "mime-db": "1.54.0",
30
+ "@mytools/fst-cli": "0.1.0",
38
31
  "@mytools/sdk": "0.1.0",
39
32
  "ajv": "8.20.0",
40
33
  "fast-deep-equal": "3.1.3",
41
34
  "fast-uri": "3.1.8",
42
35
  "json-schema-traverse": "1.0.0",
43
36
  "require-from-string": "2.0.2",
44
- "commander": "14.0.3",
45
- "cordis": "3.18.1",
46
- "@cordisjs/core": "3.18.1",
47
- "cosmokit": "1.8.1",
48
- "@cordisjs/loader": "0.13.1",
49
- "dotenv": "16.6.1",
50
- "js-yaml": "4.3.2",
51
- "argparse": "2.0.1",
52
- "@cordisjs/logger": "0.3.3",
53
- "reggol": "1.7.1",
54
- "object-inspect": "1.13.4",
55
- "supports-color": "8.1.1",
56
- "has-flag": "4.0.0",
57
- "@cordisjs/schema": "0.1.1",
58
- "schemastery": "3.18.0",
59
- "@standard-schema/spec": "1.1.0",
60
- "@cordisjs/timer": "0.3.2",
61
- "cac": "6.7.14",
62
- "kleur": "4.1.5",
63
- "execa": "10.1.0",
64
- "@sindresorhus/merge-streams": "4.0.0",
65
- "figures": "6.1.0",
66
- "is-unicode-supported": "2.1.0",
67
- "get-stream": "9.0.1",
68
- "@sec-ant/readable-stream": "0.4.1",
69
- "is-stream": "4.0.1",
70
- "human-signals": "8.0.1",
71
- "is-plain-obj": "4.1.0",
72
- "npm-run-path": "6.0.0",
73
- "path-key": "4.0.0",
74
- "unicorn-magic": "0.3.0",
75
- "pretty-ms": "9.3.1",
76
- "parse-ms": "4.0.0",
77
- "signal-exit": "4.1.0",
78
- "strip-final-newline": "4.0.0",
79
- "which-command": "0.1.0",
80
- "yoctocolors": "2.2.0",
81
- "semver": "7.7.4",
82
- "tar": "7.5.22",
83
- "@isaacs/fs-minipass": "4.0.1",
84
- "minipass": "7.1.3",
85
- "chownr": "3.0.0",
86
- "minizlib": "3.1.0",
87
- "yallist": "5.0.0",
88
- "tree-kill": "1.2.2",
89
- "validate-npm-package-name": "8.0.0",
90
- "which": "7.0.0",
91
- "isexe": "4.0.0",
92
- "yaml": "2.9.1",
37
+ "@mytools/core": "0.1.0",
93
38
  "@mytools/pack": "0.1.0",
94
39
  "@npmcli/arborist": "10.0.3",
95
40
  "@gar/promise-retry": "1.0.3",
96
41
  "@isaacs/string-locale-compare": "1.1.0",
97
42
  "@npmcli/fs": "6.0.0",
43
+ "semver": "7.7.4",
98
44
  "@npmcli/installed-package-contents": "5.0.0",
99
45
  "npm-bundled": "6.0.0",
100
46
  "npm-normalize-package-bin": "6.0.0",
@@ -103,6 +49,8 @@
103
49
  "@npmcli/package-json": "8.0.0",
104
50
  "@npmcli/git": "8.0.0",
105
51
  "@npmcli/promise-spawn": "10.0.0",
52
+ "which": "7.0.0",
53
+ "isexe": "4.0.0",
106
54
  "ini": "7.0.0",
107
55
  "lru-cache": "11.5.3",
108
56
  "npm-pick-manifest": "12.0.0",
@@ -110,10 +58,12 @@
110
58
  "npm-package-arg": "14.0.0",
111
59
  "hosted-git-info": "10.1.1",
112
60
  "proc-log": "7.0.0",
61
+ "validate-npm-package-name": "8.0.0",
113
62
  "glob": "13.0.6",
114
63
  "minimatch": "10.2.6",
115
64
  "brace-expansion": "5.0.12",
116
65
  "balanced-match": "4.0.4",
66
+ "minipass": "7.1.3",
117
67
  "path-scurry": "2.0.2",
118
68
  "json-parse-even-better-errors": "6.0.0",
119
69
  "spdx-expression-parse": "4.0.0",
@@ -124,6 +74,7 @@
124
74
  "fs-minipass": "3.0.3",
125
75
  "minipass-collect": "2.0.1",
126
76
  "minipass-flush": "1.0.7",
77
+ "yallist": "4.0.0",
127
78
  "minipass-pipeline": "1.2.4",
128
79
  "p-map": "7.0.8",
129
80
  "ssri": "14.0.0",
@@ -136,6 +87,10 @@
136
87
  "graceful-fs": "4.2.11",
137
88
  "nopt": "10.0.1",
138
89
  "abbrev": "5.0.0",
90
+ "tar": "7.5.22",
91
+ "@isaacs/fs-minipass": "4.0.1",
92
+ "chownr": "3.0.0",
93
+ "minizlib": "3.1.0",
139
94
  "tinyglobby": "0.2.17",
140
95
  "fdir": "6.5.0",
141
96
  "picomatch": "4.0.7",
@@ -182,6 +137,7 @@
182
137
  "cmd-shim": "9.0.2",
183
138
  "read-cmd-shim": "7.0.1",
184
139
  "write-file-atomic": "8.0.0",
140
+ "signal-exit": "4.1.0",
185
141
  "common-ancestor-path": "2.0.0",
186
142
  "diff": "8.0.4",
187
143
  "json-stringify-nice": "1.1.4",
@@ -196,6 +152,7 @@
196
152
  "archiver": "8.0.0",
197
153
  "async": "3.2.6",
198
154
  "buffer-crc32": "1.0.0",
155
+ "is-stream": "4.0.1",
199
156
  "lazystream": "1.0.1",
200
157
  "readable-stream": "2.3.8",
201
158
  "core-util-is": "1.0.3",
@@ -229,6 +186,57 @@
229
186
  "compress-commons": "7.0.1",
230
187
  "crc-32": "1.2.2",
231
188
  "crc32-stream": "7.0.1",
189
+ "yaml": "2.9.1",
190
+ "@mytools/fst-platform": "0.1.0",
191
+ "execa": "10.1.0",
192
+ "@sindresorhus/merge-streams": "4.0.0",
193
+ "figures": "6.1.0",
194
+ "is-unicode-supported": "2.1.0",
195
+ "get-stream": "9.0.1",
196
+ "@sec-ant/readable-stream": "0.4.1",
197
+ "human-signals": "8.0.1",
198
+ "is-plain-obj": "4.1.0",
199
+ "npm-run-path": "6.0.0",
200
+ "path-key": "4.0.0",
201
+ "unicorn-magic": "0.3.0",
202
+ "pretty-ms": "9.3.1",
203
+ "parse-ms": "4.0.0",
204
+ "strip-final-newline": "4.0.0",
205
+ "which-command": "0.1.0",
206
+ "yoctocolors": "2.2.0",
207
+ "tree-kill": "1.2.2",
208
+ "@mytools/fst-devtools": "0.1.0",
209
+ "@mytools/fst-plugin": "0.1.0",
210
+ "cordis": "3.18.1",
211
+ "@cordisjs/core": "3.18.1",
212
+ "cosmokit": "1.8.1",
213
+ "@cordisjs/loader": "0.13.1",
214
+ "dotenv": "16.6.1",
215
+ "js-yaml": "4.3.2",
216
+ "argparse": "2.0.1",
217
+ "@cordisjs/logger": "0.3.3",
218
+ "reggol": "1.7.1",
219
+ "object-inspect": "1.13.4",
220
+ "supports-color": "8.1.1",
221
+ "has-flag": "4.0.0",
222
+ "@cordisjs/schema": "0.1.1",
223
+ "schemastery": "3.18.0",
224
+ "@standard-schema/spec": "1.1.0",
225
+ "@cordisjs/timer": "0.3.2",
226
+ "cac": "6.7.14",
227
+ "kleur": "4.1.5",
228
+ "acorn": "8.19.0",
229
+ "@mytools/fst-logs": "0.1.0",
230
+ "@mytools/fst-workflow": "0.1.0",
231
+ "@mytools/fst-workspace": "0.1.0",
232
+ "@mariozechner/pi-tui": "0.50.0",
233
+ "@types/mime-types": "2.1.4",
234
+ "chalk": "5.6.2",
235
+ "get-east-asian-width": "1.7.0",
236
+ "marked": "15.0.12",
237
+ "mime-types": "3.0.2",
238
+ "mime-db": "1.54.0",
239
+ "commander": "14.0.3",
232
240
  "@mytools/environment": "0.1.0",
233
241
  "@mytools/examples": "0.1.0",
234
242
  "@mytools/web": "0.1.0",
@@ -289,74 +297,20 @@
289
297
  "vary": "1.1.2"
290
298
  },
291
299
  "bundleDependencies": [
292
- "@mytools/core",
293
- "@mariozechner/pi-tui",
294
- "@types/mime-types",
295
- "chalk",
296
- "get-east-asian-width",
297
- "marked",
298
- "mime-types",
299
- "mime-db",
300
+ "@mytools/fst-cli",
300
301
  "@mytools/sdk",
301
302
  "ajv",
302
303
  "fast-deep-equal",
303
304
  "fast-uri",
304
305
  "json-schema-traverse",
305
306
  "require-from-string",
306
- "commander",
307
- "cordis",
308
- "@cordisjs/core",
309
- "cosmokit",
310
- "@cordisjs/loader",
311
- "dotenv",
312
- "js-yaml",
313
- "argparse",
314
- "@cordisjs/logger",
315
- "reggol",
316
- "object-inspect",
317
- "supports-color",
318
- "has-flag",
319
- "@cordisjs/schema",
320
- "schemastery",
321
- "@standard-schema/spec",
322
- "@cordisjs/timer",
323
- "cac",
324
- "kleur",
325
- "execa",
326
- "@sindresorhus/merge-streams",
327
- "figures",
328
- "is-unicode-supported",
329
- "get-stream",
330
- "@sec-ant/readable-stream",
331
- "is-stream",
332
- "human-signals",
333
- "is-plain-obj",
334
- "npm-run-path",
335
- "path-key",
336
- "unicorn-magic",
337
- "pretty-ms",
338
- "parse-ms",
339
- "signal-exit",
340
- "strip-final-newline",
341
- "which-command",
342
- "yoctocolors",
343
- "semver",
344
- "tar",
345
- "@isaacs/fs-minipass",
346
- "minipass",
347
- "chownr",
348
- "minizlib",
349
- "yallist",
350
- "tree-kill",
351
- "validate-npm-package-name",
352
- "which",
353
- "isexe",
354
- "yaml",
307
+ "@mytools/core",
355
308
  "@mytools/pack",
356
309
  "@npmcli/arborist",
357
310
  "@gar/promise-retry",
358
311
  "@isaacs/string-locale-compare",
359
312
  "@npmcli/fs",
313
+ "semver",
360
314
  "@npmcli/installed-package-contents",
361
315
  "npm-bundled",
362
316
  "npm-normalize-package-bin",
@@ -365,6 +319,8 @@
365
319
  "@npmcli/package-json",
366
320
  "@npmcli/git",
367
321
  "@npmcli/promise-spawn",
322
+ "which",
323
+ "isexe",
368
324
  "ini",
369
325
  "lru-cache",
370
326
  "npm-pick-manifest",
@@ -372,10 +328,12 @@
372
328
  "npm-package-arg",
373
329
  "hosted-git-info",
374
330
  "proc-log",
331
+ "validate-npm-package-name",
375
332
  "glob",
376
333
  "minimatch",
377
334
  "brace-expansion",
378
335
  "balanced-match",
336
+ "minipass",
379
337
  "path-scurry",
380
338
  "json-parse-even-better-errors",
381
339
  "spdx-expression-parse",
@@ -386,6 +344,7 @@
386
344
  "fs-minipass",
387
345
  "minipass-collect",
388
346
  "minipass-flush",
347
+ "yallist",
389
348
  "minipass-pipeline",
390
349
  "p-map",
391
350
  "ssri",
@@ -398,6 +357,10 @@
398
357
  "graceful-fs",
399
358
  "nopt",
400
359
  "abbrev",
360
+ "tar",
361
+ "@isaacs/fs-minipass",
362
+ "chownr",
363
+ "minizlib",
401
364
  "tinyglobby",
402
365
  "fdir",
403
366
  "picomatch",
@@ -444,6 +407,7 @@
444
407
  "cmd-shim",
445
408
  "read-cmd-shim",
446
409
  "write-file-atomic",
410
+ "signal-exit",
447
411
  "common-ancestor-path",
448
412
  "diff",
449
413
  "json-stringify-nice",
@@ -458,6 +422,7 @@
458
422
  "archiver",
459
423
  "async",
460
424
  "buffer-crc32",
425
+ "is-stream",
461
426
  "lazystream",
462
427
  "readable-stream",
463
428
  "core-util-is",
@@ -491,6 +456,57 @@
491
456
  "compress-commons",
492
457
  "crc-32",
493
458
  "crc32-stream",
459
+ "yaml",
460
+ "@mytools/fst-platform",
461
+ "execa",
462
+ "@sindresorhus/merge-streams",
463
+ "figures",
464
+ "is-unicode-supported",
465
+ "get-stream",
466
+ "@sec-ant/readable-stream",
467
+ "human-signals",
468
+ "is-plain-obj",
469
+ "npm-run-path",
470
+ "path-key",
471
+ "unicorn-magic",
472
+ "pretty-ms",
473
+ "parse-ms",
474
+ "strip-final-newline",
475
+ "which-command",
476
+ "yoctocolors",
477
+ "tree-kill",
478
+ "@mytools/fst-devtools",
479
+ "@mytools/fst-plugin",
480
+ "cordis",
481
+ "@cordisjs/core",
482
+ "cosmokit",
483
+ "@cordisjs/loader",
484
+ "dotenv",
485
+ "js-yaml",
486
+ "argparse",
487
+ "@cordisjs/logger",
488
+ "reggol",
489
+ "object-inspect",
490
+ "supports-color",
491
+ "has-flag",
492
+ "@cordisjs/schema",
493
+ "schemastery",
494
+ "@standard-schema/spec",
495
+ "@cordisjs/timer",
496
+ "cac",
497
+ "kleur",
498
+ "acorn",
499
+ "@mytools/fst-logs",
500
+ "@mytools/fst-workflow",
501
+ "@mytools/fst-workspace",
502
+ "@mariozechner/pi-tui",
503
+ "@types/mime-types",
504
+ "chalk",
505
+ "get-east-asian-width",
506
+ "marked",
507
+ "mime-types",
508
+ "mime-db",
509
+ "commander",
494
510
  "@mytools/environment",
495
511
  "@mytools/examples",
496
512
  "@mytools/web",
@@ -1,139 +0,0 @@
1
- import { Context } from 'cordis';
2
- import semver from 'semver';
3
- import { SDK_VERSION, FlowError } from '@mytools/sdk';
4
- import { validate, emptyObject } from './validation.js';
5
- import {validateDeclarations,validateCommands} from './contracts.js';
6
- import {prepareEnvironments,platformWarnings} from './environments.js';
7
- import path from 'node:path';
8
- import {mkdir} from 'node:fs/promises';
9
- import {createHash} from 'node:crypto';
10
- import {createRuntime} from './runtime.js';
11
- import {pluginError} from './diagnostics.js';
12
-
13
- export async function createHost({ plugins = [], config = {}, services = {}, environmentOverrides={},runtimeEnabled=true } = {}) {
14
- const ctx = new Context();
15
- const actions = new Map();
16
- const definitions = new Map();
17
- const extensions = new Map();
18
- const serviceNames = new Set();
19
- const commandNames=new Set(),commands=new Map();
20
- function bindContext(context){
21
- const bound={...services,...context},execute=bound.runProcess;
22
- // 面向用户的输出与诊断日志共用持久化通道,只区分默认可见性。
23
- bound.print=(message,data)=>Promise.resolve(bound.log?.(message,data,{audience:'user'}));
24
- if(typeof execute==='function')bound.runProcess=(file,args,options={})=>{
25
- const signal=context.signal&&options.signal?AbortSignal.any([context.signal,options.signal]):context.signal??options.signal;
26
- return execute(file,args,{...options,signal,onOutput:async({stream,message})=>{
27
- await bound.log?.(message,undefined,{stream});
28
- await options.onOutput?.({stream,message});
29
- }});
30
- };
31
- return bound;
32
- }
33
- async function pluginContext(plugin,action,context){
34
- const bound=bindContext(context),application=services.application;
35
- const projectDir=application?.projectDir;
36
- // 固定长度摘要避免 scoped 包名分隔符、大小写碰撞及合法长包名超出文件名上限。
37
- const stateDir=projectDir&&!application.project.readOnly?path.join(projectDir,'.flow','plugin-state',createHash('sha256').update(plugin.id).digest('hex')):undefined;
38
- if(stateDir)await mkdir(stateDir,{recursive:true});
39
- for(const message of platformWarnings(plugin))await bound.log?.(message,{code:'PLATFORM_MISMATCH'},{audience:'user'});
40
- const environments=await prepareEnvironments(plugin,action,environmentOverrides[plugin.id],{cwd:projectDir??process.cwd()});
41
- context.signal?.throwIfAborted();
42
- return {...bound,projectDir,stateDir,environments};
43
- }
44
- for (const entry of plugins) {
45
- const plugin = entry.plugin ?? entry;
46
- validateDeclarations(plugin);validateCommands(plugin,commandNames);
47
- if (!plugin.id || definitions.has(plugin.id)) throw new FlowError(`插件标识缺失或重复:${plugin.id}`, {code:'VALIDATION'});
48
- if (!semver.satisfies(SDK_VERSION, plugin.sdk ?? '^0.1.0')) throw new FlowError(`插件 ${plugin.id} 与 SDK ${SDK_VERSION} 不兼容`, {code:'VALIDATION'});
49
- for(const [name,action] of Object.entries(plugin.actions??{})){
50
- if(typeof action?.run!=='function')throw new FlowError(`动作 ${plugin.id}:${name} 缺少执行函数`);
51
- }
52
- for(const [name,extension] of Object.entries(plugin.services??{})){
53
- if(serviceNames.has(name))throw new FlowError(`服务重复:${name}`);
54
- if(typeof extension!=='function')throw new FlowError(`服务 ${name} 缺少执行函数`);
55
- serviceNames.add(name);
56
- }
57
- definitions.set(plugin.id, {...plugin, root:entry.root});
58
- }
59
- const settingsById=new Map();
60
- for (const plugin of definitions.values()) {
61
- for (const [id, range] of Object.entries(plugin.dependencies ?? {})) {
62
- if (!definitions.has(id) || !semver.satisfies(definitions.get(id).version,range)) throw new FlowError(`插件 ${plugin.id} 缺少兼容依赖 ${id}@${range}`,{code:'VALIDATION'});
63
- }
64
- const settings = validate(plugin.config, config[plugin.id] ?? {}, `${plugin.id} 配置`);
65
- settingsById.set(plugin.id,settings);
66
- }
67
- const runtime=createRuntime(ctx,definitions,{enabled:runtimeEnabled});
68
- try{
69
- for (const plugin of definitions.values()) {
70
- const settings=settingsById.get(plugin.id);
71
- runtime.register(plugin,settings,scope=>{
72
- for(const [name,command] of Object.entries(plugin.commands??{})){
73
- const action=command.action?plugin.actions[command.action]:command;
74
- commands.set(name,{...command,name,plugin:plugin.id,input:action.input,output:action.output,description:command.description??action.description??action.title??name,config:settings});
75
- scope.on('dispose',()=>commands.delete(name));
76
- }
77
- for (const [name, action] of Object.entries(plugin.actions ?? {})) {
78
- const id = `${plugin.id}:${name}`;
79
- if (typeof action.run !== 'function') throw new FlowError(`动作 ${id} 缺少执行函数`);
80
- actions.set(id, {...action, id, plugin:plugin.id, config:settings, root:plugin.root});
81
- scope.on('dispose', () => actions.delete(id));
82
- }
83
- for (const [name, extension] of Object.entries(plugin.services ?? {})) {
84
- if (extensions.has(name)) throw new FlowError(`服务重复:${name}`);
85
- extensions.set(name, {run:extension,plugin:plugin.id});
86
- scope.on('dispose',()=>extensions.delete(name));
87
- }
88
- });
89
- }
90
- await runtime.start();
91
- }catch(error){
92
- try{await runtime.close();}catch(cleanup){if(cleanup.message!==error.message)throw new AggregateError([error,cleanup],`${error.message};${cleanup.message}`);}
93
- throw error;
94
- }
95
- return {
96
- definitions, actions,
97
- warnings:[...definitions.values()].flatMap(plugin=>platformWarnings(plugin).map(message=>({plugin:plugin.id,message}))),
98
- hasRuntime:runtime.hasRuntime,
99
- runtimeStatus:()=>runtime.status(),
100
- commands(){return [...commands.values()].map(({run,config,...metadata})=>structuredClone(metadata));},
101
- async invokeCommand(name,input,context={}){
102
- runtime.assertOpen();
103
- const command=commands.get(name);if(!command)throw new FlowError(`命令不存在:/${name}`);
104
- if(command.action)return this.invoke(`${command.plugin}:${command.action}`,input,context);
105
- if(!context.ui)throw new FlowError(`交互命令 /${name} 需要在 TUI 中调用`);
106
- const plugin=definitions.get(command.plugin);
107
- try{
108
- const getService=runtime.bindServices(plugin.id);
109
- context.signal?.throwIfAborted();
110
- const result=await command.run(validate(command.input??emptyObject,input,`/${name} 输入`),{...await pluginContext(plugin,undefined,context),getService,config:command.config,resourceDir:plugin.root});
111
- context.signal?.throwIfAborted();
112
- return validate(command.output,JSON.parse(JSON.stringify(result??{})),`/${name} 输出`,{useDefaults:false});
113
- }catch(cause){throw pluginError(cause,{plugin:plugin.id,command:`/${name}`});}
114
- },
115
- catalog() { return [...actions.values()].map(({run,config,root,...metadata})=>structuredClone(metadata)); },
116
- async invoke(id, input, context = {}) {
117
- runtime.assertOpen();
118
- const action = actions.get(id);
119
- if (!action) throw new FlowError(`动作不存在:${id}`, {code:'VALIDATION'});
120
- try{
121
- const getService=runtime.bindServices(action.plugin);
122
- context.signal?.throwIfAborted();
123
- const result = await action.run(validate(action.input ?? emptyObject,input,`${id} 输入`), {...await pluginContext(definitions.get(action.plugin),action,context),getService, config:action.config, resourceDir:action.root});
124
- context.signal?.throwIfAborted();
125
- // 通过 JSON 边界验证返回值,避免函数、循环引用等进入工作流状态。
126
- const encoded = JSON.stringify(result);
127
- if (encoded === undefined) throw new FlowError(`${id} 输出必须可 JSON 序列化`);
128
- return validate(action.output, JSON.parse(encoded),`${id} 输出`,{useDefaults:false});
129
- }catch(cause){throw pluginError(cause,{plugin:action.plugin,action:id});}
130
- },
131
- async service(name,options) {
132
- runtime.assertOpen();
133
- if (!extensions.has(name)) throw new FlowError(`未安装提供 ${name} 的插件`);
134
- const extension=extensions.get(name);runtime.assertActive(extension.plugin);
135
- return extension.run(services,options);
136
- },
137
- close:()=>runtime.close(),
138
- };
139
- }
@@ -1,78 +0,0 @@
1
- import {readableValue,readableError,readableTimeline} from './run-presentation.js';
2
- import {runStatuses} from './run-viewer.js';
3
-
4
- // 主面板按事件到达顺序追加;运行快照另存,配置菜单不会清掉执行记录。
5
- export class RunFeed{
6
- constructor(refresh){this.refresh=refresh;this.runs=new Map();this.entries=[];this.subscriptions=new Map();this.expanded=false;}
7
- track({app,runId,title,input}){
8
- if(this.runs.has(runId))return;
9
- const record=app.getRun(runId),item={app,record,title,input,count:0,ended:false,steps:new Map(),catalog:new Map((app.catalog?.()??[]).map(action=>[action.id,action]))};
10
- this.runs.set(runId,item);
11
- this.entries.push({type:'start',item});
12
- if(!this.subscriptions.has(app))this.subscriptions.set(app,app.subscribe(event=>{
13
- const item=this.runs.get(event.runId);if(!item||item.app!==app)return;
14
- this.update(item,event);this.release(app);
15
- if(event.type==='log'&&!item.ended)this.scheduleRefresh();
16
- else this.flushRefresh();
17
- }));
18
- this.update(item);this.release(app);this.refresh();
19
- }
20
- scheduleRefresh(){
21
- if(this.refreshTimer)return;
22
- this.refreshTimer=setTimeout(()=>{this.refreshTimer=null;this.refresh();},100);
23
- }
24
- flushRefresh(){
25
- if(this.refreshTimer){clearTimeout(this.refreshTimer);this.refreshTimer=null;}
26
- this.refresh();
27
- }
28
- update(item,event){
29
- if(event?.type&&!['run.succeeded','run.failed','run.cancelled','run.stopped'].includes(event.type))item.record.events.push(event);
30
- else{
31
- const record=item.app.getRun(item.record.id);if(!record)return;
32
- item.record={...record,events:[...(record.events??[])]};
33
- }
34
- const {record}=item,events=record.events.slice(item.count);item.count=record.events.length;
35
- for(const event of events)if(event.type.startsWith('step.'))item.steps.set(event.callPath,{...item.steps.get(event.callPath),...event});
36
- if(events.length){
37
- const last=this.entries.at(-1);
38
- if(last?.type==='events'&&last.item===item)last.events.push(...events);
39
- else this.entries.push({type:'events',item,events});
40
- }
41
- if(record.status!=='running'&&!item.ended){item.ended=true;this.entries.push({type:'result',item});}
42
- }
43
- release(app){
44
- if([...this.runs.values()].some(item=>item.app===app&&!item.ended))return;
45
- this.subscriptions.get(app)?.();this.subscriptions.delete(app);
46
- }
47
- message(text){this.entries.push({type:'message',text});this.refresh();}
48
- compactEvents(entry,seen){
49
- const {item}=entry,rows=[];
50
- for(const event of entry.events){
51
- const key=`${item.record.id}\0${event.callPath}`;
52
- if(event.type.startsWith('step.')&&!seen.has(key)){
53
- seen.add(key);const latest=item.steps.get(event.callPath),action=item.catalog.get(latest.action);
54
- const status=latest.type.slice(5),symbols={started:'●',succeeded:'✓',failed:'✗',cancelled:'×',skipped:'–',stopped:'■'};
55
- const name=action?.title??latest.action??latest.stepId??latest.callPath;
56
- rows.push(`${symbols[status]??'·'} ${name} · ${status==='started'?'执行中':runStatuses[status]??status}${latest.durationMs!==undefined?' · '+latest.durationMs+' ms':''}${action?.plugin?' · '+action.plugin:''} · ${latest.callPath}`);
57
- }
58
- if(event.type==='log'&&event.audience==='user')rows.push(`[${event.callPath??item.record.workflowId}] ${event.message??''}${event.data!==undefined?'\n'+readableValue(event.data):''}`);
59
- if(event.type==='step.failed'&&![...item.steps.values()].some(step=>step.type==='step.failed'&&step.callPath?.startsWith(event.callPath+'/')))rows.push(`✗ ${event.callPath}\n${readableError(event.error??{message:event.message})}`);
60
- if(event.type==='step.stopped'||event.type==='step.skipped')rows.push(`${event.callPath}:${event.reason??event.message??''}`);
61
- }
62
- return rows.length?`${item.title??item.record.workflowId} · ${item.record.id.slice(0,8)}\n${rows.join('\n')}`:'';
63
- }
64
- text(){const seen=new Set();return this.entries.map(entry=>{
65
- if(entry.type==='message')return entry.text;
66
- const {record,title,input}=entry.item,label=`${title??record.workflowId} · ${record.id.slice(0,8)}`;
67
- if(entry.type==='start')return [
68
- `› ${record.workflowId.startsWith('/')?record.workflowId:'/run '+record.workflowId} · ${label}`,
69
- `状态:${runStatuses[record.status]??record.status}`,
70
- this.expanded&&input&&Object.keys(input).length?'输入\n'+readableValue(input):'',
71
- ].filter(Boolean).join('\n');
72
- if(entry.type==='events')return this.expanded?`${label}\n${readableTimeline(entry.events,{values:true})}`:this.compactEvents(entry,seen);
73
- return [`结果 · ${label} · ${runStatuses[record.status]??record.status}`,
74
- this.expanded&&record.output!==undefined?readableValue(record.output):'',record.error&&(this.expanded||![...entry.item.steps.values()].some(step=>step.type==='step.failed'))?readableError(record.error,{details:this.expanded}):'',record.reason??'',
75
- ].filter(Boolean).join('\n');
76
- }).filter(Boolean).join('\n\n');}
77
- close(){if(this.refreshTimer)clearTimeout(this.refreshTimer);this.refreshTimer=null;for(const unsubscribe of this.subscriptions.values())unsubscribe();this.subscriptions.clear();}
78
- }