@yanglaofish/fishtools 0.5.1 → 0.5.3

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 (846) hide show
  1. package/README.md +25 -11
  2. package/manual/README.md +25 -11
  3. package/manual/docs/deployment.md +3 -3
  4. package/manual/docs/examples/action-plugin/package.json +1 -1
  5. package/manual/docs/modules.md +2 -0
  6. package/manual/docs/plugin-development.md +18 -5
  7. package/manual/docs/releases.md +56 -6
  8. package/manual/docs/superpowers/plans/2026-10-13-command-shortcuts.md +108 -0
  9. package/manual/docs/superpowers/plans/2026-10-13-global-plugins.md +56 -0
  10. package/manual/docs/superpowers/plans/2026-10-13-tui-readable-sessions.md +21 -0
  11. package/manual/docs/superpowers/reviews/2026-10-13-0.5.0-followup-review.md +4 -1
  12. package/manual/docs/superpowers/reviews/2026-10-13-0.5.3-review.md +28 -0
  13. package/manual/docs/superpowers/reviews/2026-10-13-command-shortcuts-review.md +70 -0
  14. package/manual/docs/superpowers/reviews/2026-10-13-tui-sessions-review.md +55 -0
  15. package/manual/docs/superpowers/specs/2026-10-12-workflow-variation-design.md +1 -1
  16. package/manual/docs/superpowers/specs/2026-10-13-command-shortcuts-design.md +56 -0
  17. package/manual/docs/superpowers/specs/2026-10-13-issue-4-workflow-menu.md +51 -0
  18. package/manual/docs/superpowers/specs/2026-10-13-issue-5-results-and-history.md +20 -0
  19. package/manual/docs/terminal-commands.md +72 -0
  20. package/manual/docs/verification.md +56 -1
  21. package/manual/packages/core/README.md +5 -1
  22. package/manual/packages/core/package.json +2 -1
  23. package/manual/packages/core/src/application.js +203 -57
  24. package/manual/packages/core/src/development-watch-worker.js +10 -1
  25. package/manual/packages/core/src/development.js +1 -1
  26. package/manual/packages/core/src/export-snapshot.js +20 -1
  27. package/manual/packages/core/src/plugin-catalog.js +42 -0
  28. package/manual/packages/core/src/version.js +1 -1
  29. package/manual/packages/fst-cli/README.md +6 -0
  30. package/manual/packages/fst-cli/bin/fst.js +7 -6
  31. package/manual/packages/fst-cli/package.json +1 -1
  32. package/manual/packages/fst-cli/src/development.js +6 -1
  33. package/manual/packages/fst-cli/src/terminal/command-menu.js +191 -0
  34. package/manual/packages/fst-cli/src/terminal/navigation.js +6 -3
  35. package/manual/packages/fst-cli/src/terminal/presentation.js +4 -3
  36. package/manual/packages/fst-cli/src/terminal/run-feed.js +69 -13
  37. package/manual/packages/fst-cli/src/terminal/run-presentation.js +55 -12
  38. package/manual/packages/fst-cli/src/terminal/run-viewer.js +26 -10
  39. package/manual/packages/fst-cli/src/terminal/session-history.js +82 -0
  40. package/manual/packages/fst-cli/src/terminal/session.js +153 -43
  41. package/manual/packages/fst-cli/src/terminal/view.js +74 -16
  42. package/manual/packages/fst-cli/src/terminal/workflow-menu.js +15 -15
  43. package/manual/packages/fst-devtools/package.json +2 -2
  44. package/manual/packages/fst-devtools/src/documentation.js +2 -1
  45. package/manual/packages/fst-devtools/src/plugin-tools.js +1 -1
  46. package/manual/packages/fst-logs/README.md +23 -2
  47. package/manual/packages/fst-logs/package.json +2 -1
  48. package/manual/packages/fst-logs/src/file-identity.js +23 -0
  49. package/manual/packages/fst-logs/src/markdown-log.js +4 -3
  50. package/manual/packages/fst-logs/src/run-logs.js +3 -2
  51. package/manual/packages/fst-logs/src/session-history.js +180 -0
  52. package/manual/packages/fst-platform/README.md +15 -0
  53. package/manual/packages/fst-platform/package.json +4 -3
  54. package/manual/packages/fst-platform/src/process.js +15 -8
  55. package/manual/packages/fst-platform/src/shell.js +103 -0
  56. package/manual/packages/fst-plugin/package.json +1 -1
  57. package/manual/packages/fst-plugin/src/contracts.js +6 -2
  58. package/manual/packages/fst-plugin/src/host.js +31 -23
  59. package/manual/packages/fst-workflow/package.json +1 -1
  60. package/manual/packages/fst-workflow/src/engine.js +1 -1
  61. package/manual/packages/fst-workspace/README.md +5 -0
  62. package/manual/packages/fst-workspace/package.json +3 -1
  63. package/manual/packages/fst-workspace/src/plugin-registry.js +58 -0
  64. package/manual/packages/fst-workspace/src/plugins.js +7 -4
  65. package/manual/packages/fst-workspace/src/shortcuts.js +119 -0
  66. package/manual/packages/fst-workspace/src/workflows.js +5 -3
  67. package/manual/packages/pack/index.js +1 -1
  68. package/manual/packages/pack/package.json +3 -3
  69. package/manual/packages/pack/runtime-cache.js +26 -0
  70. package/manual/packages/pack/runtime.js +6 -10
  71. package/manual/plugins/commands/LICENSE +21 -0
  72. package/manual/plugins/commands/README.md +41 -0
  73. package/manual/plugins/commands/index.js +94 -0
  74. package/manual/plugins/commands/package.json +17 -0
  75. package/node_modules/@mytools/commands/LICENSE +21 -0
  76. package/node_modules/@mytools/commands/README.md +41 -0
  77. package/node_modules/@mytools/commands/index.js +94 -0
  78. package/node_modules/@mytools/commands/package.json +17 -0
  79. package/node_modules/@mytools/core/README.md +5 -1
  80. package/node_modules/@mytools/core/package.json +2 -1
  81. package/node_modules/@mytools/core/src/application.js +203 -57
  82. package/node_modules/@mytools/core/src/development-watch-worker.js +10 -1
  83. package/node_modules/@mytools/core/src/development.js +1 -1
  84. package/node_modules/@mytools/core/src/export-snapshot.js +20 -1
  85. package/node_modules/@mytools/core/src/plugin-catalog.js +42 -0
  86. package/node_modules/@mytools/core/src/version.js +1 -1
  87. package/node_modules/@mytools/fst-cli/README.md +6 -0
  88. package/node_modules/@mytools/fst-cli/bin/fst.js +7 -6
  89. package/node_modules/@mytools/fst-cli/package.json +1 -1
  90. package/node_modules/@mytools/fst-cli/src/development.js +6 -1
  91. package/node_modules/@mytools/fst-cli/src/terminal/command-menu.js +191 -0
  92. package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +6 -3
  93. package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +4 -3
  94. package/node_modules/@mytools/fst-cli/src/terminal/run-feed.js +69 -13
  95. package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +55 -12
  96. package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +26 -10
  97. package/node_modules/@mytools/fst-cli/src/terminal/session-history.js +82 -0
  98. package/node_modules/@mytools/fst-cli/src/terminal/session.js +153 -43
  99. package/node_modules/@mytools/fst-cli/src/terminal/view.js +74 -16
  100. package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +15 -15
  101. package/node_modules/@mytools/fst-devtools/package.json +2 -2
  102. package/node_modules/@mytools/fst-devtools/src/documentation.js +2 -1
  103. package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +1 -1
  104. package/node_modules/@mytools/fst-logs/README.md +23 -2
  105. package/node_modules/@mytools/fst-logs/package.json +2 -1
  106. package/node_modules/@mytools/fst-logs/src/file-identity.js +23 -0
  107. package/node_modules/@mytools/fst-logs/src/markdown-log.js +4 -3
  108. package/node_modules/@mytools/fst-logs/src/run-logs.js +3 -2
  109. package/node_modules/@mytools/fst-logs/src/session-history.js +180 -0
  110. package/node_modules/@mytools/fst-platform/README.md +15 -0
  111. package/node_modules/@mytools/fst-platform/node_modules/undici/LICENSE +21 -0
  112. package/node_modules/{undici/docs/docs/index.md → @mytools/fst-platform/node_modules/undici/README.md} +85 -137
  113. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Agent.md +84 -0
  114. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
  115. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
  116. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/CacheStore.md +164 -0
  117. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Client.md +288 -0
  118. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ClientStats.md +27 -0
  119. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Connector.md +115 -0
  120. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ContentType.md +57 -0
  121. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Cookies.md +128 -0
  122. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Debug.md +62 -0
  123. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +317 -0
  124. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Dispatcher.md +1393 -0
  125. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +159 -0
  126. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Errors.md +49 -0
  127. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/EventSource.md +45 -0
  128. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Fetch.md +60 -0
  129. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/GlobalInstallation.md +139 -0
  130. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/H2CClient.md +263 -0
  131. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockAgent.md +603 -0
  132. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockCallHistory.md +197 -0
  133. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +43 -0
  134. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockClient.md +81 -0
  135. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
  136. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockPool.md +555 -0
  137. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Pool.md +84 -0
  138. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
  139. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ProxyAgent.md +229 -0
  140. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RedirectHandler.md +93 -0
  141. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RetryAgent.md +50 -0
  142. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RetryHandler.md +118 -0
  143. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RoundRobinPool.md +145 -0
  144. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/SnapshotAgent.md +616 -0
  145. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +275 -0
  146. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Util.md +25 -0
  147. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/WebSocket.md +141 -0
  148. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
  149. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
  150. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/docs/docs/best-practices/crawling.md +1 -3
  151. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/mocking-request.md +190 -0
  152. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
  153. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/docs/docs/best-practices/undici-vs-builtin-fetch.md +8 -10
  154. package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/writing-tests.md +63 -0
  155. package/node_modules/@mytools/fst-platform/node_modules/undici/index-fetch.js +65 -0
  156. package/node_modules/@mytools/fst-platform/node_modules/undici/index.d.ts +3 -0
  157. package/node_modules/@mytools/fst-platform/node_modules/undici/index.js +234 -0
  158. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/abort-signal.js +59 -0
  159. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-connect.js +110 -0
  160. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-pipeline.js +252 -0
  161. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-request.js +214 -0
  162. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-stream.js +209 -0
  163. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-upgrade.js +111 -0
  164. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/index.js +7 -0
  165. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/readable.js +580 -0
  166. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/cache/memory-cache-store.js +3 -3
  167. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/cache/sqlite-cache-store.js +1 -3
  168. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/connect.js +153 -0
  169. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/constants.js +143 -0
  170. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/diagnostics.js +227 -0
  171. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/errors.js +477 -0
  172. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/request.js +485 -0
  173. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/symbols.js +75 -0
  174. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/tree.js +160 -0
  175. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/util.js +992 -0
  176. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/agent.js +158 -0
  177. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/balanced-pool.js +221 -0
  178. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client-h1.js +1746 -0
  179. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client-h2.js +1060 -0
  180. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client.js +668 -0
  181. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/dispatcher-base.js +184 -0
  182. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/dispatcher.js +48 -0
  183. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +146 -0
  184. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
  185. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/h2c-client.js +4 -4
  186. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/pool-base.js +214 -0
  187. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/pool.js +118 -0
  188. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/proxy-agent.js +319 -0
  189. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  190. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/round-robin-pool.js +10 -32
  191. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/socks5-proxy-agent.js +63 -153
  192. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/global.js +59 -0
  193. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/cache-handler.js +7 -49
  194. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/cache-revalidation-handler.js +0 -10
  195. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/decorator-handler.js +67 -0
  196. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/deduplication-handler.js +10 -29
  197. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/redirect-handler.js +238 -0
  198. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/retry-handler.js +504 -0
  199. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/unwrap-handler.js +106 -0
  200. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/wrap-handler.js +105 -0
  201. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/cache.js +26 -79
  202. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/decompress.js +3 -13
  203. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/deduplicate.js +4 -5
  204. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/dns.js +571 -0
  205. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/dump.js +99 -0
  206. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/redirect.js +21 -0
  207. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/response-error.js +95 -0
  208. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/retry.js +19 -0
  209. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  210. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/constants.js +531 -0
  211. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
  212. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
  213. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/utils.js +12 -0
  214. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-agent.js +232 -0
  215. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/mock-call-history.js +1 -1
  216. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-client.js +68 -0
  217. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-errors.js +29 -0
  218. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-interceptor.js +209 -0
  219. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-pool.js +68 -0
  220. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-symbols.js +32 -0
  221. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-utils.js +486 -0
  222. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  223. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-agent.js +7 -25
  224. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-recorder.js +3 -38
  225. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/cache.js +10 -92
  226. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/util/promise.js +28 -0
  227. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/runtime-features.js +34 -3
  228. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/util/timers.js +425 -0
  229. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/cache.js +864 -0
  230. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  231. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/util.js +45 -0
  232. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/constants.js +12 -0
  233. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/index.js +199 -0
  234. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/parse.js +314 -0
  235. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/util.js +352 -0
  236. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/eventsource-stream.js +494 -0
  237. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/eventsource.js +501 -0
  238. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/util.js +29 -0
  239. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/LICENSE +21 -0
  240. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/body.js +509 -0
  241. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/constants.js +131 -0
  242. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/data-url.js +596 -0
  243. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/formdata-parser.js +586 -0
  244. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/formdata.js +259 -0
  245. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/global.js +40 -0
  246. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/headers.js +719 -0
  247. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/index.js +2413 -0
  248. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/request.js +1115 -0
  249. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/response.js +641 -0
  250. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/util.js +1522 -0
  251. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/infra/index.js +1 -16
  252. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/webidl/index.js +21 -7
  253. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/connection.js +339 -0
  254. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/constants.js +126 -0
  255. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/events.js +331 -0
  256. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/frame.js +133 -0
  257. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/permessage-deflate.js +105 -0
  258. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/receiver.js +507 -0
  259. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/sender.js +109 -0
  260. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/websocket/stream/websocketerror.js +10 -13
  261. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/websocket/stream/websocketstream.js +14 -29
  262. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/util.js +347 -0
  263. package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/websocket.js +758 -0
  264. package/node_modules/@mytools/fst-platform/node_modules/undici/package.json +152 -0
  265. package/node_modules/@mytools/fst-platform/node_modules/undici/scripts/strip-comments.js +10 -0
  266. package/node_modules/@mytools/fst-platform/node_modules/undici/types/README.md +6 -0
  267. package/node_modules/@mytools/fst-platform/node_modules/undici/types/agent.d.ts +32 -0
  268. package/node_modules/@mytools/fst-platform/node_modules/undici/types/api.d.ts +43 -0
  269. package/node_modules/@mytools/fst-platform/node_modules/undici/types/balanced-pool.d.ts +30 -0
  270. package/node_modules/@mytools/fst-platform/node_modules/undici/types/cache.d.ts +36 -0
  271. package/node_modules/@mytools/fst-platform/node_modules/undici/types/client.d.ts +139 -0
  272. package/node_modules/@mytools/fst-platform/node_modules/undici/types/connector.d.ts +36 -0
  273. package/node_modules/@mytools/fst-platform/node_modules/undici/types/content-type.d.ts +21 -0
  274. package/node_modules/@mytools/fst-platform/node_modules/undici/types/cookies.d.ts +30 -0
  275. package/node_modules/@mytools/fst-platform/node_modules/undici/types/diagnostics-channel.d.ts +74 -0
  276. package/node_modules/@mytools/fst-platform/node_modules/undici/types/dispatcher.d.ts +275 -0
  277. package/node_modules/@mytools/fst-platform/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
  278. package/node_modules/@mytools/fst-platform/node_modules/undici/types/errors.d.ts +177 -0
  279. package/node_modules/@mytools/fst-platform/node_modules/undici/types/eventsource.d.ts +66 -0
  280. package/node_modules/@mytools/fst-platform/node_modules/undici/types/fetch.d.ts +231 -0
  281. package/node_modules/@mytools/fst-platform/node_modules/undici/types/formdata.d.ts +114 -0
  282. package/node_modules/@mytools/fst-platform/node_modules/undici/types/global-dispatcher.d.ts +9 -0
  283. package/node_modules/@mytools/fst-platform/node_modules/undici/types/global-origin.d.ts +7 -0
  284. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/h2c-client.d.ts +6 -6
  285. package/node_modules/@mytools/fst-platform/node_modules/undici/types/handlers.d.ts +14 -0
  286. package/node_modules/@mytools/fst-platform/node_modules/undici/types/header.d.ts +160 -0
  287. package/node_modules/@mytools/fst-platform/node_modules/undici/types/index.d.ts +91 -0
  288. package/node_modules/@mytools/fst-platform/node_modules/undici/types/interceptors.d.ts +82 -0
  289. package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-agent.d.ts +68 -0
  290. package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-client.d.ts +27 -0
  291. package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-errors.d.ts +12 -0
  292. package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-interceptor.d.ts +94 -0
  293. package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-pool.d.ts +27 -0
  294. package/node_modules/@mytools/fst-platform/node_modules/undici/types/patch.d.ts +29 -0
  295. package/node_modules/@mytools/fst-platform/node_modules/undici/types/pool-stats.d.ts +19 -0
  296. package/node_modules/@mytools/fst-platform/node_modules/undici/types/pool.d.ts +41 -0
  297. package/node_modules/@mytools/fst-platform/node_modules/undici/types/proxy-agent.d.ts +29 -0
  298. package/node_modules/@mytools/fst-platform/node_modules/undici/types/readable.d.ts +68 -0
  299. package/node_modules/@mytools/fst-platform/node_modules/undici/types/retry-agent.d.ts +8 -0
  300. package/node_modules/@mytools/fst-platform/node_modules/undici/types/retry-handler.d.ts +125 -0
  301. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/round-robin-pool.d.ts +2 -0
  302. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/snapshot-agent.d.ts +0 -4
  303. package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/socks5-proxy-agent.d.ts +2 -4
  304. package/node_modules/@mytools/fst-platform/node_modules/undici/types/util.d.ts +18 -0
  305. package/node_modules/@mytools/fst-platform/node_modules/undici/types/webidl.d.ts +347 -0
  306. package/node_modules/@mytools/fst-platform/node_modules/undici/types/websocket.d.ts +188 -0
  307. package/node_modules/@mytools/fst-platform/package.json +4 -3
  308. package/node_modules/@mytools/fst-platform/src/process.js +15 -8
  309. package/node_modules/@mytools/fst-platform/src/shell.js +103 -0
  310. package/node_modules/@mytools/fst-plugin/package.json +1 -1
  311. package/node_modules/@mytools/fst-plugin/src/contracts.js +6 -2
  312. package/node_modules/@mytools/fst-plugin/src/host.js +31 -23
  313. package/node_modules/@mytools/fst-workflow/package.json +1 -1
  314. package/node_modules/@mytools/fst-workflow/src/engine.js +1 -1
  315. package/node_modules/@mytools/fst-workspace/README.md +5 -0
  316. package/node_modules/@mytools/fst-workspace/package.json +3 -1
  317. package/node_modules/@mytools/fst-workspace/src/plugin-registry.js +58 -0
  318. package/node_modules/@mytools/fst-workspace/src/plugins.js +7 -4
  319. package/node_modules/@mytools/fst-workspace/src/shortcuts.js +119 -0
  320. package/node_modules/@mytools/fst-workspace/src/workflows.js +5 -3
  321. package/node_modules/@mytools/pack/index.js +1 -1
  322. package/node_modules/@mytools/pack/package.json +3 -3
  323. package/node_modules/@mytools/pack/runtime-cache.js +26 -0
  324. package/node_modules/@mytools/pack/runtime.js +6 -10
  325. package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1246 -1232
  326. package/node_modules/@npmcli/agent/lib/agents.js +0 -10
  327. package/node_modules/@npmcli/agent/package.json +12 -11
  328. package/node_modules/@npmcli/arborist/README.md +2 -2
  329. package/node_modules/@npmcli/arborist/bin/index.js +2 -1
  330. package/node_modules/@npmcli/arborist/bin/shrinkwrap.js +7 -0
  331. package/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js +25 -159
  332. package/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js +49 -11
  333. package/node_modules/@npmcli/arborist/lib/arborist/load-actual.js +0 -67
  334. package/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js +37 -5
  335. package/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +8 -15
  336. package/node_modules/@npmcli/arborist/lib/arborist/reify.js +42 -59
  337. package/node_modules/@npmcli/arborist/lib/consistent-resolve.js +1 -1
  338. package/node_modules/@npmcli/arborist/lib/diff.js +22 -17
  339. package/node_modules/@npmcli/arborist/lib/edge.js +2 -22
  340. package/node_modules/@npmcli/arborist/lib/index.js +0 -2
  341. package/node_modules/@npmcli/arborist/lib/isolated-classes.js +1 -4
  342. package/node_modules/@npmcli/arborist/lib/node.js +9 -13
  343. package/node_modules/@npmcli/arborist/lib/place-dep.js +0 -6
  344. package/node_modules/@npmcli/arborist/lib/printable.js +5 -0
  345. package/node_modules/@npmcli/arborist/lib/shrinkwrap.js +32 -55
  346. package/node_modules/@npmcli/arborist/package.json +26 -32
  347. package/node_modules/@npmcli/fs/lib/move-file.js +5 -5
  348. package/node_modules/@npmcli/fs/package.json +5 -5
  349. package/node_modules/@npmcli/git/package.json +12 -13
  350. package/node_modules/@npmcli/installed-package-contents/package.json +7 -7
  351. package/node_modules/@npmcli/map-workspaces/package.json +7 -7
  352. package/node_modules/@npmcli/metavuln-calculator/package.json +16 -10
  353. package/node_modules/@npmcli/name-from-folder/package.json +16 -13
  354. package/node_modules/@npmcli/node-gyp/package.json +5 -5
  355. package/node_modules/@npmcli/package-json/lib/index.js +1 -2
  356. package/node_modules/@npmcli/package-json/lib/normalize.js +22 -23
  357. package/node_modules/@npmcli/package-json/package.json +10 -11
  358. package/node_modules/@npmcli/promise-spawn/README.md +2 -1
  359. package/node_modules/@npmcli/promise-spawn/package.json +5 -5
  360. package/node_modules/@npmcli/redact/package.json +4 -4
  361. package/node_modules/@npmcli/run-script/lib/is-server-package.js +11 -0
  362. package/node_modules/@npmcli/run-script/lib/make-spawn-args.js +6 -5
  363. package/node_modules/@npmcli/run-script/lib/run-script-pkg.js +13 -4
  364. package/node_modules/@npmcli/run-script/lib/run-script.js +2 -1
  365. package/node_modules/@npmcli/run-script/package.json +11 -12
  366. package/node_modules/@sigstore/bundle/README.md +1 -1
  367. package/node_modules/@sigstore/bundle/dist/error.js +0 -1
  368. package/node_modules/@sigstore/bundle/package.json +2 -2
  369. package/node_modules/@sigstore/core/README.md +1 -1
  370. package/node_modules/@sigstore/core/dist/asn1/length.js +1 -12
  371. package/node_modules/@sigstore/core/dist/asn1/obj.js +7 -25
  372. package/node_modules/@sigstore/core/dist/asn1/parse.js +5 -24
  373. package/node_modules/@sigstore/core/package.json +2 -2
  374. package/node_modules/@sigstore/sign/README.md +1 -1
  375. package/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js +1 -1
  376. package/node_modules/@sigstore/sign/package.json +9 -9
  377. package/node_modules/@sigstore/tuf/README.md +1 -1
  378. package/node_modules/@sigstore/tuf/package.json +4 -4
  379. package/node_modules/@sigstore/tuf/seeds.json +1 -1
  380. package/node_modules/@sigstore/verify/README.md +1 -1
  381. package/node_modules/@sigstore/verify/dist/bundle/dsse.d.ts +0 -1
  382. package/node_modules/@sigstore/verify/dist/bundle/dsse.js +0 -6
  383. package/node_modules/@sigstore/verify/dist/bundle/message.d.ts +0 -1
  384. package/node_modules/@sigstore/verify/dist/bundle/message.js +0 -5
  385. package/node_modules/@sigstore/verify/dist/policy.d.ts +1 -1
  386. package/node_modules/@sigstore/verify/dist/policy.js +2 -0
  387. package/node_modules/@sigstore/verify/dist/shared.types.d.ts +1 -6
  388. package/node_modules/@sigstore/verify/dist/tlog/checkpoint.js +3 -17
  389. package/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js +4 -4
  390. package/node_modules/@sigstore/verify/dist/tlog/index.js +1 -13
  391. package/node_modules/@sigstore/verify/dist/tlog/merkle.js +1 -12
  392. package/node_modules/@sigstore/verify/dist/verifier.js +5 -13
  393. package/node_modules/@sigstore/verify/package.json +5 -5
  394. package/node_modules/@tufjs/models/package.json +3 -3
  395. package/node_modules/abbrev/package.json +8 -9
  396. package/node_modules/agent-base/dist/helpers.d.ts +5 -0
  397. package/node_modules/agent-base/dist/helpers.d.ts.map +1 -1
  398. package/node_modules/agent-base/dist/helpers.js +34 -5
  399. package/node_modules/agent-base/dist/helpers.js.map +1 -1
  400. package/node_modules/agent-base/dist/index.d.ts +5 -1
  401. package/node_modules/agent-base/dist/index.d.ts.map +1 -1
  402. package/node_modules/agent-base/dist/index.js +40 -8
  403. package/node_modules/agent-base/dist/index.js.map +1 -1
  404. package/node_modules/agent-base/package.json +12 -12
  405. package/node_modules/bin-links/README.md +4 -5
  406. package/node_modules/bin-links/lib/fix-bin.js +1 -3
  407. package/node_modules/bin-links/lib/index.js +16 -8
  408. package/node_modules/bin-links/lib/link-mans.js +53 -0
  409. package/node_modules/bin-links/package.json +12 -11
  410. package/node_modules/cacache/lib/content/write.js +0 -2
  411. package/node_modules/cacache/lib/entry-index.js +0 -3
  412. package/node_modules/cacache/lib/rm.js +0 -1
  413. package/node_modules/cacache/lib/util/tmp.js +1 -5
  414. package/node_modules/cacache/lib/verify.js +2 -2
  415. package/node_modules/cacache/package.json +7 -7
  416. package/node_modules/cmd-shim/lib/index.js +32 -67
  417. package/node_modules/cmd-shim/package.json +5 -5
  418. package/node_modules/hosted-git-info/README.md +1 -1
  419. package/node_modules/hosted-git-info/lib/parse-url.js +3 -1
  420. package/node_modules/hosted-git-info/package.json +4 -4
  421. package/node_modules/http-proxy-agent/dist/index.d.ts +5 -8
  422. package/node_modules/http-proxy-agent/dist/index.d.ts.map +1 -1
  423. package/node_modules/http-proxy-agent/dist/index.js +42 -26
  424. package/node_modules/http-proxy-agent/dist/index.js.map +1 -1
  425. package/node_modules/http-proxy-agent/package.json +14 -15
  426. package/node_modules/https-proxy-agent/dist/index.d.ts +5 -9
  427. package/node_modules/https-proxy-agent/dist/index.d.ts.map +1 -1
  428. package/node_modules/https-proxy-agent/dist/index.js +44 -98
  429. package/node_modules/https-proxy-agent/dist/index.js.map +1 -1
  430. package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +3 -0
  431. package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts.map +1 -1
  432. package/node_modules/https-proxy-agent/dist/parse-proxy-response.js +10 -3
  433. package/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -1
  434. package/node_modules/https-proxy-agent/package.json +15 -16
  435. package/node_modules/ignore-walk/package.json +4 -4
  436. package/node_modules/ini/package.json +5 -5
  437. package/node_modules/ip-address/README.md +70 -70
  438. package/node_modules/ip-address/dist/ipv6.js +7 -4
  439. package/node_modules/ip-address/dist/ipv6.js.map +1 -1
  440. package/node_modules/ip-address/dist/v6/constants.d.ts +3 -0
  441. package/node_modules/ip-address/dist/v6/constants.js +3 -0
  442. package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  443. package/node_modules/ip-address/package.json +2 -1
  444. package/node_modules/json-parse-even-better-errors/lib/index.js +1 -3
  445. package/node_modules/json-parse-even-better-errors/package.json +17 -13
  446. package/node_modules/make-fetch-happen/package.json +11 -11
  447. package/node_modules/minipass-fetch/package.json +4 -4
  448. package/node_modules/node-gyp/.release-please-manifest.json +1 -1
  449. package/node_modules/node-gyp/CHANGELOG.md +0 -102
  450. package/node_modules/node-gyp/README.md +2 -3
  451. package/node_modules/node-gyp/eslint.config.js +1 -4
  452. package/node_modules/node-gyp/gyp/.release-please-manifest.json +1 -1
  453. package/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +19 -14
  454. package/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +2 -7
  455. package/node_modules/node-gyp/gyp/pyproject.toml +1 -1
  456. package/node_modules/node-gyp/lib/build.js +6 -18
  457. package/node_modules/node-gyp/lib/create-config-gypi.js +0 -5
  458. package/node_modules/node-gyp/lib/node-gyp.js +2 -9
  459. package/node_modules/node-gyp/lib/rebuild.js +3 -3
  460. package/node_modules/node-gyp/package.json +9 -11
  461. package/node_modules/nopt/README.md +4 -2
  462. package/node_modules/nopt/lib/debug.js +5 -0
  463. package/node_modules/nopt/lib/nopt-lib.js +43 -7
  464. package/node_modules/nopt/lib/nopt.js +4 -2
  465. package/node_modules/nopt/lib/type-defs.js +13 -8
  466. package/node_modules/nopt/package.json +17 -15
  467. package/node_modules/npm-bundled/package.json +6 -6
  468. package/node_modules/npm-install-checks/package.json +5 -5
  469. package/node_modules/npm-normalize-package-bin/package.json +16 -13
  470. package/node_modules/npm-package-arg/package.json +7 -7
  471. package/node_modules/npm-packlist/README.md +30 -45
  472. package/node_modules/npm-packlist/lib/index.js +47 -115
  473. package/node_modules/npm-packlist/package.json +8 -10
  474. package/node_modules/npm-pick-manifest/package.json +19 -15
  475. package/node_modules/npm-registry-fetch/lib/errors.js +3 -8
  476. package/node_modules/npm-registry-fetch/package.json +12 -12
  477. package/node_modules/pacote/lib/dir.js +5 -60
  478. package/node_modules/pacote/lib/fetcher.js +0 -4
  479. package/node_modules/pacote/lib/git.js +3 -11
  480. package/node_modules/pacote/lib/util/add-git-sha.js +1 -1
  481. package/node_modules/pacote/package.json +18 -19
  482. package/node_modules/parse-conflict-json/package.json +6 -6
  483. package/node_modules/proc-log/package.json +4 -4
  484. package/node_modules/read-cmd-shim/lib/index.js +1 -1
  485. package/node_modules/read-cmd-shim/package.json +18 -14
  486. package/node_modules/sigstore/README.md +1 -1
  487. package/node_modules/sigstore/package.json +10 -10
  488. package/node_modules/socks-proxy-agent/dist/index.d.ts +3 -1
  489. package/node_modules/socks-proxy-agent/dist/index.d.ts.map +1 -1
  490. package/node_modules/socks-proxy-agent/dist/index.js +43 -17
  491. package/node_modules/socks-proxy-agent/dist/index.js.map +1 -1
  492. package/node_modules/socks-proxy-agent/package.json +15 -15
  493. package/node_modules/ssri/package.json +4 -4
  494. package/node_modules/tuf-js/dist/config.d.ts +2 -2
  495. package/node_modules/tuf-js/dist/fetcher.d.ts +4 -4
  496. package/node_modules/tuf-js/dist/fetcher.js +16 -55
  497. package/node_modules/tuf-js/dist/updater.js +2 -2
  498. package/node_modules/tuf-js/package.json +8 -8
  499. package/node_modules/undici/README.md +72 -405
  500. package/node_modules/undici/docs/docs/api/Agent.md +41 -252
  501. package/node_modules/undici/docs/docs/api/BalancedPool.md +48 -246
  502. package/node_modules/undici/docs/docs/api/CacheStorage.md +13 -171
  503. package/node_modules/undici/docs/docs/api/Client.md +139 -395
  504. package/node_modules/undici/docs/docs/api/Connector.md +35 -118
  505. package/node_modules/undici/docs/docs/api/ContentType.md +25 -65
  506. package/node_modules/undici/docs/docs/api/Cookies.md +47 -125
  507. package/node_modules/undici/docs/docs/api/Debug.md +31 -47
  508. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +97 -409
  509. package/node_modules/undici/docs/docs/api/DispatchInterceptor.md +60 -0
  510. package/node_modules/undici/docs/docs/api/Dispatcher.md +1011 -500
  511. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +96 -105
  512. package/node_modules/undici/docs/docs/api/Errors.md +28 -528
  513. package/node_modules/undici/docs/docs/api/EventSource.md +13 -326
  514. package/node_modules/undici/docs/docs/api/Fetch.md +24 -693
  515. package/node_modules/undici/docs/docs/api/MockAgent.md +264 -346
  516. package/node_modules/undici/docs/docs/api/MockClient.md +31 -153
  517. package/node_modules/undici/docs/docs/api/MockErrors.md +5 -56
  518. package/node_modules/undici/docs/docs/api/MockPool.md +253 -324
  519. package/node_modules/undici/docs/docs/api/Pool.md +41 -235
  520. package/node_modules/undici/docs/docs/api/PoolStats.md +13 -119
  521. package/node_modules/undici/docs/docs/api/ProxyAgent.md +81 -198
  522. package/node_modules/undici/docs/docs/api/RedirectHandler.md +58 -238
  523. package/node_modules/undici/docs/docs/api/RetryAgent.md +28 -119
  524. package/node_modules/undici/docs/docs/api/RetryHandler.md +78 -161
  525. package/node_modules/undici/docs/docs/api/Util.md +11 -68
  526. package/node_modules/undici/docs/docs/api/WebSocket.md +24 -509
  527. package/node_modules/undici/docs/docs/api/api-lifecycle.md +33 -101
  528. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -2
  529. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +2 -58
  530. package/node_modules/undici/docs/docs/best-practices/proxy.md +1 -3
  531. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -45
  532. package/node_modules/undici/index-fetch.js +4 -34
  533. package/node_modules/undici/index.d.ts +1 -1
  534. package/node_modules/undici/index.js +20 -87
  535. package/node_modules/undici/lib/api/abort-signal.js +0 -2
  536. package/node_modules/undici/lib/api/api-connect.js +11 -15
  537. package/node_modules/undici/lib/api/api-pipeline.js +19 -33
  538. package/node_modules/undici/lib/api/api-request.js +59 -89
  539. package/node_modules/undici/lib/api/api-stream.js +64 -114
  540. package/node_modules/undici/lib/api/api-upgrade.js +13 -26
  541. package/node_modules/undici/lib/api/readable.js +87 -317
  542. package/node_modules/undici/lib/api/util.js +93 -0
  543. package/node_modules/undici/lib/core/connect.js +125 -77
  544. package/node_modules/undici/lib/core/constants.js +9 -11
  545. package/node_modules/undici/lib/core/diagnostics.js +129 -154
  546. package/node_modules/undici/lib/core/errors.js +50 -122
  547. package/node_modules/undici/lib/core/request.js +87 -172
  548. package/node_modules/undici/lib/core/symbols.js +2 -14
  549. package/node_modules/undici/lib/core/tree.js +2 -10
  550. package/node_modules/undici/lib/core/util.js +190 -481
  551. package/node_modules/undici/lib/dispatcher/agent.js +35 -83
  552. package/node_modules/undici/lib/dispatcher/balanced-pool.js +38 -46
  553. package/node_modules/undici/lib/dispatcher/client-h1.js +199 -492
  554. package/node_modules/undici/lib/dispatcher/client-h2.js +380 -1409
  555. package/node_modules/undici/lib/dispatcher/client.js +130 -253
  556. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +52 -50
  557. package/node_modules/undici/lib/dispatcher/dispatcher.js +24 -17
  558. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +45 -75
  559. package/node_modules/undici/lib/dispatcher/fixed-queue.js +50 -68
  560. package/node_modules/undici/lib/dispatcher/pool-base.js +54 -153
  561. package/node_modules/undici/lib/dispatcher/pool-stats.js +34 -0
  562. package/node_modules/undici/lib/dispatcher/pool.js +16 -135
  563. package/node_modules/undici/lib/dispatcher/proxy-agent.js +41 -175
  564. package/node_modules/undici/lib/dispatcher/retry-agent.js +0 -3
  565. package/node_modules/undici/lib/global.js +9 -59
  566. package/node_modules/undici/lib/handler/decorator-handler.js +15 -43
  567. package/node_modules/undici/lib/handler/redirect-handler.js +116 -127
  568. package/node_modules/undici/lib/handler/retry-handler.js +182 -398
  569. package/node_modules/undici/lib/interceptor/dns.js +47 -254
  570. package/node_modules/undici/lib/interceptor/dump.js +56 -32
  571. package/node_modules/undici/lib/interceptor/redirect-interceptor.js +21 -0
  572. package/node_modules/undici/lib/interceptor/redirect.js +14 -11
  573. package/node_modules/undici/lib/interceptor/response-error.js +22 -31
  574. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  575. package/node_modules/undici/lib/llhttp/constants.js +193 -446
  576. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -11
  577. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -11
  578. package/node_modules/undici/lib/llhttp/utils.js +12 -9
  579. package/node_modules/undici/lib/mock/mock-agent.js +22 -106
  580. package/node_modules/undici/lib/mock/mock-client.js +4 -13
  581. package/node_modules/undici/lib/mock/mock-errors.js +2 -3
  582. package/node_modules/undici/lib/mock/mock-interceptor.js +13 -33
  583. package/node_modules/undici/lib/mock/mock-pool.js +4 -13
  584. package/node_modules/undici/lib/mock/mock-symbols.js +1 -10
  585. package/node_modules/undici/lib/mock/mock-utils.js +51 -404
  586. package/node_modules/undici/lib/mock/pluralizer.js +29 -0
  587. package/node_modules/undici/lib/util/timers.js +9 -11
  588. package/node_modules/undici/lib/web/cache/cache.js +51 -63
  589. package/node_modules/undici/lib/web/cache/cachestorage.js +7 -13
  590. package/node_modules/undici/lib/web/cache/symbols.js +5 -0
  591. package/node_modules/undici/lib/web/cookies/index.js +18 -45
  592. package/node_modules/undici/lib/web/cookies/parse.js +149 -157
  593. package/node_modules/undici/lib/web/cookies/util.js +2 -4
  594. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +9 -37
  595. package/node_modules/undici/lib/web/eventsource/eventsource.js +64 -108
  596. package/node_modules/undici/lib/web/eventsource/util.js +5 -28
  597. package/node_modules/undici/lib/web/fetch/body.js +148 -173
  598. package/node_modules/undici/lib/web/fetch/constants.js +6 -13
  599. package/node_modules/undici/lib/web/fetch/data-url.js +167 -19
  600. package/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +46 -0
  601. package/node_modules/undici/lib/web/fetch/file.js +126 -0
  602. package/node_modules/undici/lib/web/fetch/formdata-parser.js +117 -229
  603. package/node_modules/undici/lib/web/fetch/formdata.js +65 -85
  604. package/node_modules/undici/lib/web/fetch/headers.js +108 -143
  605. package/node_modules/undici/lib/web/fetch/index.js +446 -627
  606. package/node_modules/undici/lib/web/fetch/request.js +115 -217
  607. package/node_modules/undici/lib/web/fetch/response.js +82 -110
  608. package/node_modules/undici/lib/web/fetch/symbols.js +9 -0
  609. package/node_modules/undici/lib/web/fetch/util.js +393 -291
  610. package/node_modules/undici/lib/web/fetch/webidl.js +695 -0
  611. package/node_modules/undici/lib/web/fileapi/encoding.js +290 -0
  612. package/node_modules/undici/lib/web/fileapi/filereader.js +344 -0
  613. package/node_modules/undici/lib/web/fileapi/progressevent.js +78 -0
  614. package/node_modules/undici/lib/web/fileapi/symbols.js +10 -0
  615. package/node_modules/undici/lib/web/fileapi/util.js +391 -0
  616. package/node_modules/undici/lib/web/websocket/connection.js +160 -139
  617. package/node_modules/undici/lib/web/websocket/constants.js +10 -70
  618. package/node_modules/undici/lib/web/websocket/events.js +30 -49
  619. package/node_modules/undici/lib/web/websocket/frame.js +20 -51
  620. package/node_modules/undici/lib/web/websocket/receiver.js +87 -83
  621. package/node_modules/undici/lib/web/websocket/sender.js +13 -18
  622. package/node_modules/undici/lib/web/websocket/symbols.js +12 -0
  623. package/node_modules/undici/lib/web/websocket/util.js +90 -115
  624. package/node_modules/undici/lib/web/websocket/websocket.js +171 -359
  625. package/node_modules/undici/package.json +57 -49
  626. package/node_modules/undici/scripts/strip-comments.js +1 -3
  627. package/node_modules/undici/types/agent.d.ts +13 -12
  628. package/node_modules/undici/types/api.d.ts +26 -26
  629. package/node_modules/undici/types/balanced-pool.d.ts +12 -13
  630. package/node_modules/undici/types/client.d.ts +39 -98
  631. package/node_modules/undici/types/connector.d.ts +2 -5
  632. package/node_modules/undici/types/cookies.d.ts +1 -3
  633. package/node_modules/undici/types/diagnostics-channel.d.ts +11 -20
  634. package/node_modules/undici/types/dispatcher.d.ts +139 -136
  635. package/node_modules/undici/types/env-http-proxy-agent.d.ts +3 -4
  636. package/node_modules/undici/types/errors.d.ts +54 -86
  637. package/node_modules/undici/types/eventsource.d.ts +4 -9
  638. package/node_modules/undici/types/fetch.d.ts +25 -51
  639. package/node_modules/undici/types/file.d.ts +39 -0
  640. package/node_modules/undici/types/filereader.d.ts +54 -0
  641. package/node_modules/undici/types/formdata.d.ts +7 -7
  642. package/node_modules/undici/types/global-dispatcher.d.ts +4 -4
  643. package/node_modules/undici/types/global-origin.d.ts +5 -5
  644. package/node_modules/undici/types/handlers.d.ts +9 -10
  645. package/node_modules/undici/types/header.d.ts +1 -162
  646. package/node_modules/undici/types/index.d.ts +47 -69
  647. package/node_modules/undici/types/interceptors.d.ts +12 -62
  648. package/node_modules/undici/types/mock-agent.d.ts +27 -46
  649. package/node_modules/undici/types/mock-client.d.ts +4 -6
  650. package/node_modules/undici/types/mock-errors.d.ts +3 -3
  651. package/node_modules/undici/types/mock-interceptor.d.ts +21 -26
  652. package/node_modules/undici/types/mock-pool.d.ts +4 -6
  653. package/node_modules/undici/types/patch.d.ts +4 -0
  654. package/node_modules/undici/types/pool-stats.d.ts +8 -8
  655. package/node_modules/undici/types/pool.d.ts +14 -14
  656. package/node_modules/undici/types/proxy-agent.d.ts +6 -13
  657. package/node_modules/undici/types/readable.d.ts +16 -19
  658. package/node_modules/undici/types/retry-agent.d.ts +1 -1
  659. package/node_modules/undici/types/retry-handler.d.ts +9 -18
  660. package/node_modules/undici/types/util.d.ts +3 -3
  661. package/node_modules/undici/types/webidl.d.ts +32 -156
  662. package/node_modules/undici/types/websocket.d.ts +10 -48
  663. package/node_modules/validate-npm-package-name/package.json +4 -4
  664. package/node_modules/which/package.json +4 -4
  665. package/node_modules/write-file-atomic/package.json +4 -4
  666. package/package.json +58 -60
  667. package/node_modules/@npmcli/arborist/lib/npm-extension.js +0 -237
  668. package/node_modules/@npmcli/arborist/lib/package-extensions.js +0 -236
  669. package/node_modules/@npmcli/arborist/lib/patch.js +0 -111
  670. package/node_modules/@npmcli/arborist/lib/patched-dependencies.js +0 -168
  671. package/node_modules/cacache/lib/util/cache-dir.js +0 -29
  672. package/node_modules/diff/CONTRIBUTING.md +0 -28
  673. package/node_modules/diff/LICENSE +0 -29
  674. package/node_modules/diff/README.md +0 -388
  675. package/node_modules/diff/dist/diff.js +0 -1782
  676. package/node_modules/diff/dist/diff.min.js +0 -1
  677. package/node_modules/diff/eslint.config.mjs +0 -182
  678. package/node_modules/diff/libcjs/convert/dmp.d.ts +0 -8
  679. package/node_modules/diff/libcjs/convert/dmp.d.ts.map +0 -1
  680. package/node_modules/diff/libcjs/convert/dmp.js +0 -24
  681. package/node_modules/diff/libcjs/convert/xml.d.ts +0 -6
  682. package/node_modules/diff/libcjs/convert/xml.d.ts.map +0 -1
  683. package/node_modules/diff/libcjs/convert/xml.js +0 -34
  684. package/node_modules/diff/libcjs/diff/array.d.ts +0 -19
  685. package/node_modules/diff/libcjs/diff/array.d.ts.map +0 -1
  686. package/node_modules/diff/libcjs/diff/array.js +0 -40
  687. package/node_modules/diff/libcjs/diff/base.d.ts +0 -20
  688. package/node_modules/diff/libcjs/diff/base.d.ts.map +0 -1
  689. package/node_modules/diff/libcjs/diff/base.js +0 -265
  690. package/node_modules/diff/libcjs/diff/character.d.ts +0 -19
  691. package/node_modules/diff/libcjs/diff/character.d.ts.map +0 -1
  692. package/node_modules/diff/libcjs/diff/character.js +0 -31
  693. package/node_modules/diff/libcjs/diff/css.d.ts +0 -18
  694. package/node_modules/diff/libcjs/diff/css.d.ts.map +0 -1
  695. package/node_modules/diff/libcjs/diff/css.js +0 -34
  696. package/node_modules/diff/libcjs/diff/json.d.ts +0 -24
  697. package/node_modules/diff/libcjs/diff/json.d.ts.map +0 -1
  698. package/node_modules/diff/libcjs/diff/json.js +0 -105
  699. package/node_modules/diff/libcjs/diff/line.d.ts +0 -24
  700. package/node_modules/diff/libcjs/diff/line.d.ts.map +0 -1
  701. package/node_modules/diff/libcjs/diff/line.js +0 -89
  702. package/node_modules/diff/libcjs/diff/sentence.d.ts +0 -21
  703. package/node_modules/diff/libcjs/diff/sentence.d.ts.map +0 -1
  704. package/node_modules/diff/libcjs/diff/sentence.js +0 -67
  705. package/node_modules/diff/libcjs/diff/word.d.ts +0 -35
  706. package/node_modules/diff/libcjs/diff/word.d.ts.map +0 -1
  707. package/node_modules/diff/libcjs/diff/word.js +0 -312
  708. package/node_modules/diff/libcjs/index.d.ts +0 -20
  709. package/node_modules/diff/libcjs/index.d.ts.map +0 -1
  710. package/node_modules/diff/libcjs/index.js +0 -64
  711. package/node_modules/diff/libcjs/package.json +0 -1
  712. package/node_modules/diff/libcjs/patch/apply.d.ts +0 -62
  713. package/node_modules/diff/libcjs/patch/apply.d.ts.map +0 -1
  714. package/node_modules/diff/libcjs/patch/apply.js +0 -267
  715. package/node_modules/diff/libcjs/patch/create.d.ts +0 -122
  716. package/node_modules/diff/libcjs/patch/create.d.ts.map +0 -1
  717. package/node_modules/diff/libcjs/patch/create.js +0 -251
  718. package/node_modules/diff/libcjs/patch/line-endings.d.ts +0 -17
  719. package/node_modules/diff/libcjs/patch/line-endings.d.ts.map +0 -1
  720. package/node_modules/diff/libcjs/patch/line-endings.js +0 -61
  721. package/node_modules/diff/libcjs/patch/parse.d.ts +0 -8
  722. package/node_modules/diff/libcjs/patch/parse.d.ts.map +0 -1
  723. package/node_modules/diff/libcjs/patch/parse.js +0 -150
  724. package/node_modules/diff/libcjs/patch/reverse.d.ts +0 -9
  725. package/node_modules/diff/libcjs/patch/reverse.d.ts.map +0 -1
  726. package/node_modules/diff/libcjs/patch/reverse.js +0 -37
  727. package/node_modules/diff/libcjs/types.d.ts +0 -213
  728. package/node_modules/diff/libcjs/types.d.ts.map +0 -1
  729. package/node_modules/diff/libcjs/types.js +0 -2
  730. package/node_modules/diff/libcjs/util/array.d.ts +0 -3
  731. package/node_modules/diff/libcjs/util/array.d.ts.map +0 -1
  732. package/node_modules/diff/libcjs/util/array.js +0 -21
  733. package/node_modules/diff/libcjs/util/distance-iterator.d.ts +0 -2
  734. package/node_modules/diff/libcjs/util/distance-iterator.d.ts.map +0 -1
  735. package/node_modules/diff/libcjs/util/distance-iterator.js +0 -40
  736. package/node_modules/diff/libcjs/util/params.d.ts +0 -4
  737. package/node_modules/diff/libcjs/util/params.d.ts.map +0 -1
  738. package/node_modules/diff/libcjs/util/params.js +0 -17
  739. package/node_modules/diff/libcjs/util/string.d.ts +0 -30
  740. package/node_modules/diff/libcjs/util/string.d.ts.map +0 -1
  741. package/node_modules/diff/libcjs/util/string.js +0 -200
  742. package/node_modules/diff/libesm/convert/dmp.d.ts +0 -8
  743. package/node_modules/diff/libesm/convert/dmp.d.ts.map +0 -1
  744. package/node_modules/diff/libesm/convert/dmp.js +0 -21
  745. package/node_modules/diff/libesm/convert/xml.d.ts +0 -6
  746. package/node_modules/diff/libesm/convert/xml.d.ts.map +0 -1
  747. package/node_modules/diff/libesm/convert/xml.js +0 -31
  748. package/node_modules/diff/libesm/diff/array.d.ts +0 -19
  749. package/node_modules/diff/libesm/diff/array.d.ts.map +0 -1
  750. package/node_modules/diff/libesm/diff/array.js +0 -16
  751. package/node_modules/diff/libesm/diff/base.d.ts +0 -20
  752. package/node_modules/diff/libesm/diff/base.d.ts.map +0 -1
  753. package/node_modules/diff/libesm/diff/base.js +0 -253
  754. package/node_modules/diff/libesm/diff/character.d.ts +0 -19
  755. package/node_modules/diff/libesm/diff/character.d.ts.map +0 -1
  756. package/node_modules/diff/libesm/diff/character.js +0 -7
  757. package/node_modules/diff/libesm/diff/css.d.ts +0 -18
  758. package/node_modules/diff/libesm/diff/css.d.ts.map +0 -1
  759. package/node_modules/diff/libesm/diff/css.js +0 -10
  760. package/node_modules/diff/libesm/diff/json.d.ts +0 -24
  761. package/node_modules/diff/libesm/diff/json.d.ts.map +0 -1
  762. package/node_modules/diff/libesm/diff/json.js +0 -78
  763. package/node_modules/diff/libesm/diff/line.d.ts +0 -24
  764. package/node_modules/diff/libesm/diff/line.d.ts.map +0 -1
  765. package/node_modules/diff/libesm/diff/line.js +0 -65
  766. package/node_modules/diff/libesm/diff/sentence.d.ts +0 -21
  767. package/node_modules/diff/libesm/diff/sentence.d.ts.map +0 -1
  768. package/node_modules/diff/libesm/diff/sentence.js +0 -43
  769. package/node_modules/diff/libesm/diff/word.d.ts +0 -35
  770. package/node_modules/diff/libesm/diff/word.d.ts.map +0 -1
  771. package/node_modules/diff/libesm/diff/word.js +0 -281
  772. package/node_modules/diff/libesm/index.d.ts +0 -20
  773. package/node_modules/diff/libesm/index.d.ts.map +0 -1
  774. package/node_modules/diff/libesm/index.js +0 -30
  775. package/node_modules/diff/libesm/package.json +0 -1
  776. package/node_modules/diff/libesm/patch/apply.d.ts +0 -62
  777. package/node_modules/diff/libesm/patch/apply.d.ts.map +0 -1
  778. package/node_modules/diff/libesm/patch/apply.js +0 -257
  779. package/node_modules/diff/libesm/patch/create.d.ts +0 -122
  780. package/node_modules/diff/libesm/patch/create.d.ts.map +0 -1
  781. package/node_modules/diff/libesm/patch/create.js +0 -228
  782. package/node_modules/diff/libesm/patch/line-endings.d.ts +0 -17
  783. package/node_modules/diff/libesm/patch/line-endings.d.ts.map +0 -1
  784. package/node_modules/diff/libesm/patch/line-endings.js +0 -44
  785. package/node_modules/diff/libesm/patch/parse.d.ts +0 -8
  786. package/node_modules/diff/libesm/patch/parse.d.ts.map +0 -1
  787. package/node_modules/diff/libesm/patch/parse.js +0 -147
  788. package/node_modules/diff/libesm/patch/reverse.d.ts +0 -9
  789. package/node_modules/diff/libesm/patch/reverse.d.ts.map +0 -1
  790. package/node_modules/diff/libesm/patch/reverse.js +0 -23
  791. package/node_modules/diff/libesm/types.d.ts +0 -213
  792. package/node_modules/diff/libesm/types.d.ts.map +0 -1
  793. package/node_modules/diff/libesm/types.js +0 -1
  794. package/node_modules/diff/libesm/util/array.d.ts +0 -3
  795. package/node_modules/diff/libesm/util/array.d.ts.map +0 -1
  796. package/node_modules/diff/libesm/util/array.js +0 -17
  797. package/node_modules/diff/libesm/util/distance-iterator.d.ts +0 -2
  798. package/node_modules/diff/libesm/util/distance-iterator.d.ts.map +0 -1
  799. package/node_modules/diff/libesm/util/distance-iterator.js +0 -37
  800. package/node_modules/diff/libesm/util/params.d.ts +0 -4
  801. package/node_modules/diff/libesm/util/params.d.ts.map +0 -1
  802. package/node_modules/diff/libesm/util/params.js +0 -14
  803. package/node_modules/diff/libesm/util/string.d.ts +0 -30
  804. package/node_modules/diff/libesm/util/string.d.ts.map +0 -1
  805. package/node_modules/diff/libesm/util/string.js +0 -184
  806. package/node_modules/diff/package.json +0 -130
  807. package/node_modules/diff/release-notes.md +0 -432
  808. package/node_modules/node-gyp/commitlint.config.mjs +0 -3
  809. package/node_modules/node-gyp/gyp/commitlint.config.js +0 -6
  810. package/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake_test.py +0 -105
  811. package/node_modules/node-gyp/zizmor.yml +0 -5
  812. package/node_modules/proxy-agent-negotiate/dist/index.d.ts +0 -14
  813. package/node_modules/proxy-agent-negotiate/dist/index.d.ts.map +0 -1
  814. package/node_modules/proxy-agent-negotiate/dist/index.js +0 -35
  815. package/node_modules/proxy-agent-negotiate/dist/index.js.map +0 -1
  816. package/node_modules/proxy-agent-negotiate/package.json +0 -47
  817. package/node_modules/undici/docs/docs/api/CacheStore.md +0 -360
  818. package/node_modules/undici/docs/docs/api/ClientStats.md +0 -93
  819. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +0 -121
  820. package/node_modules/undici/docs/docs/api/H2CClient.md +0 -385
  821. package/node_modules/undici/docs/docs/api/Interceptors.md +0 -419
  822. package/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -371
  823. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -206
  824. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +0 -239
  825. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +0 -361
  826. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +0 -256
  827. package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +0 -233
  828. package/node_modules/undici/docs/docs/getting-started.md +0 -281
  829. package/node_modules/undici/docs/docs/site.json +0 -125
  830. package/node_modules/undici/docs/docs/type-map.json +0 -79
  831. package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +0 -110
  832. package/node_modules/undici/types/dispatcher1-wrapper.d.ts +0 -7
  833. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/core/socks5-client.js +0 -0
  834. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/core/socks5-utils.js +0 -0
  835. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/encoding/index.js +0 -0
  836. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/llhttp/constants.d.ts +0 -0
  837. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/llhttp/utils.d.ts +0 -0
  838. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-utils.js +0 -0
  839. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/date.js +0 -0
  840. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/stats.js +0 -0
  841. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/subresource-integrity/Readme.md +0 -0
  842. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/subresource-integrity/subresource-integrity.js +0 -0
  843. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/cache-interceptor.d.ts +0 -0
  844. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/client-stats.d.ts +0 -0
  845. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/mock-call-history.d.ts +0 -0
  846. /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/utility.d.ts +0 -0
@@ -76,7 +76,20 @@ export class TerminalView{
76
76
  input(data);
77
77
  },resize);
78
78
  this.header=new Text('',1,0);this.transcript=new Text('',1,0);this.prompt=new Container();this.hint=new Text('',1,0);
79
- this.hint.render=width=>['',fitLine(' '+palette.muted(this.homeInput?(width<45?`/ 操作 · Ctrl+O ${this.feed.expanded?'收起':'展开'}`:`/ 操作 · Ctrl+O ${this.feed.expanded?'收起':'展开'}详情 · /logs 回看 · Ctrl+C 退出`):(width<45?'↑↓ 选择 Enter 确认 Esc 返回':'↑↓ 选择 Enter 确认 Tab 补全 Esc 返回 Ctrl+C 退出')),width)];
79
+ this.hint.render=width=>{
80
+ const lines=[''];
81
+ if(this.editor&&(this.homeInput||this.multilineInput)){
82
+ // 按完整按键分组换行,窄屏也能看清主键和备用键。
83
+ let line='';
84
+ for(const hint of ['Shift+Enter 换行','Enter 提交','Alt+Enter 备用换行']){
85
+ const next=line?line+' · '+hint:hint;
86
+ if(line&&visibleWidth(next)>width-1){lines.push(line);line=hint;}else line=next;
87
+ }
88
+ lines.push(line);
89
+ }
90
+ lines.push(this.homeInput?(width<45?`/ 操作 · ! 命令 · Ctrl+O ${this.feed.expanded?'收起':'展开'}`:`/ 操作 · ! 命令 · Ctrl+O ${this.feed.expanded?'收起':'展开'}详情 · /logs 回看 · Ctrl+C 退出`):this.editor&&this.multilineInput?'↑↓ 移动 · Tab 补全 · Esc 返回 · Ctrl+C 退出':(width<45?'↑↓ 选择 Enter 确认 Esc 返回':'↑↓ 选择 Enter 确认 Tab 补全 Esc 返回 Ctrl+C 退出'));
91
+ return lines.map(line=>line?fitLine(' '+palette.muted(line),width):'');
92
+ };
80
93
  const renderTranscript=this.transcript.render.bind(this.transcript);
81
94
  this.headingLines=(width,mark='FISHtools')=>{
82
95
  const room=Math.max(1,width-2),lines=[''];
@@ -127,7 +140,7 @@ export class TerminalView{
127
140
  browseCommands(data){
128
141
  const direction=matchesKey(data,'up')?-1:matchesKey(data,'down')?1:0;
129
142
  // 补全菜单保留方向键;多行编辑保留光标移动,不把配置值放进命令历史。
130
- if(!direction||!this.editor||this.editor.isShowingAutocomplete()||this.editor.getText().includes('\n')||!this.commandHistory.length)return false;
143
+ if(!direction||!this.editor||this.editor.isShowingAutocomplete()||this.editor.getExpandedText().includes('\n')||!this.commandHistory.length)return false;
131
144
  const current=this.commandHistoryIndex??this.commandHistory.length;
132
145
  const next=Math.max(0,Math.min(this.commandHistory.length,current+direction));
133
146
  if(next===current)return true;
@@ -160,14 +173,14 @@ export class TerminalView{
160
173
  const width=this.terminal.columns,previous=this.transcript.render===undefined?0:new Text(safe(this.lastTranscript??''),1,0).render(width).length;
161
174
  const text=safe(this.transcriptText());
162
175
  if(this.historyOffset>0)this.historyOffset=Math.max(0,this.historyOffset+new Text(text,1,0).render(width).length-previous);
163
- this.lastTranscript=text;this.transcript.setText(text.split('\n').map(line=>line.startsWith('✗ ')?palette.error(line):/^[›✓●] /.test(line)?palette.brand(line):line.startsWith('↩ ')?palette.muted(line):line).join('\n'));this.tui.requestRender();
176
+ this.lastTranscript=text;this.transcript.setText(text.split('\n').map(line=>line.startsWith('✗ ')?palette.error(line):/^[›✓●] /.test(line)?palette.brand(line):line.startsWith('↩ ')?palette.muted(line):line).join('\n'));this.tui.requestRender();this.onHistoryChange?.();
164
177
  }
165
178
  trackRun(options){this.feed.track(options);}
166
179
  clearMessages(){this.logs=[];this.refreshTranscript();}
167
180
  show(message,{kind='message'}={}){
168
181
  const text=safe(message).slice(0,6000);
169
182
  const formatted=kind==='welcome'?text.split('\n').map((line,i)=>i===0?palette.text(line):palette.muted(line)).join('\n'):text;
170
- if(kind!=='welcome'){this.feed.message(formatted);return;}
183
+ if(kind!=='welcome'){this.feed.message(safe(message));return;}
171
184
  this.logs.push(formatted);this.logs=this.logs.slice(-6);this.refreshTranscript();
172
185
  }
173
186
  async viewMarkdown(title,text){
@@ -191,25 +204,47 @@ export class TerminalView{
191
204
  }
192
205
  }
193
206
  async observeRun({app,runId,record,flow,workflows=[],initialView}){
194
- const previousPending=this.pending??null,children=this.tui.children;let overlay,unsubscribe,readPages=false;
207
+ let options={app,runId,record,flow,workflows,initialView};
208
+ for(;;){
209
+ const output=await this.observeRunPage(options);if(output===undefined)return;
210
+ await this.viewMarkdown('执行结果',output);options={...options,record:undefined,initialView:undefined};
211
+ }
212
+ }
213
+ async observeRunPage({app,runId,record,flow,workflows=[],initialView}){
214
+ const previousPending=this.pending??null,children=this.tui.children;let overlay,unsubscribe,unsubscribeFinished,elapsedTimer,readPages=false,renderedOutput;
195
215
  const initial=app.getRun(runId)??record??await app.readRun(runId);
196
216
  if(!initial)throw new Error('这次运行记录已不存在');
197
217
  try{
198
218
  await new Promise((resolve,reject)=>{
199
219
  this.pending={resolve,reject};
200
- this.runViewer=new RunViewer({record:initial,flow:initial.status==='running'?flow:undefined,workflows,catalog:app.catalog?.()??[],terminal:this.terminal,onClose:resolve,onCancel:()=>app.cancelRun(runId),onReadLogs:app.readLogPage?()=>{readPages=true;resolve();}:undefined,requestRender:()=>this.tui.requestRender()});
201
- Object.assign(this.runViewer,this.runViews.get(runId)??{});
202
- if(initialView!==undefined){this.runViewer.view=initialView;this.runViewer.offset=0;}
203
- unsubscribe=app.subscribe(event=>{if(event.runId===runId)this.runViewer?.update(app.getRun(runId));});
220
+ const viewer=new RunViewer({record:initial,flow:initial.status==='running'?flow:undefined,workflows,catalog:app.catalog?.()??[],terminal:this.terminal,onClose:resolve,onCancel:()=>app.cancelRun(runId),onReadLogs:app.readLogPage?()=>{readPages=true;resolve();}:undefined,onReadOutput:()=>{renderedOutput=viewer.getRenderedOutput();resolve();},requestRender:()=>this.tui.requestRender()});
221
+ this.runViewer=viewer;Object.assign(viewer,this.runViews.get(runId)??{});
222
+ if(initialView!==undefined){viewer.view=initialView;viewer.offset=0;}
223
+ const stopElapsed=()=>{if(elapsedTimer){clearInterval(elapsedTimer);elapsedTimer=null;}};
224
+ const finish=record=>{
225
+ if(this.runViewer!==viewer)return;
226
+ viewer.update(record);stopElapsed();
227
+ };
228
+ // 收尾晚于终态事件时补最终状态;关闭页面解除监听,不让长任务留住旧阅读器。
229
+ unsubscribeFinished=this.feed.subscribeFinished(runId,finish);
230
+ unsubscribe=app.subscribe(event=>{if(event.runId===runId&&this.runViewer===viewer)viewer.update(app.getRun(runId));});
231
+ if(initial.status==='running')elapsedTimer=setInterval(()=>{
232
+ const record=app.getRun(runId)??this.feed.runs.get(runId)?.record;viewer.update(record);
233
+ if(!record||record.status!=='running')stopElapsed();
234
+ if(!record&&app.readRun)void app.readRun(runId).then(record=>{if(this.runViewer===viewer)viewer.update(record);},()=>{});
235
+ },1000);
236
+ elapsedTimer?.unref?.();
204
237
  this.tui.children=[];this.terminal.write(mouseOn);
205
238
  overlay=this.tui.showOverlay(this.runViewer,{width:'100%',maxHeight:'100%',anchor:'top-left',margin:0});this.tui.requestRender(true);
206
239
  });
207
240
  }finally{
208
241
  if(this.runViewer){const {view,selected,offset,follow,allLogs,raw}=this.runViewer;this.runViews.set(runId,{view,selected,offset,follow,allLogs,raw});}
209
242
  if(this.runViews.size>30)this.runViews.delete(this.runViews.keys().next().value);
210
- unsubscribe?.();this.runViewer=null;this.tui.children=children;this.pending=previousPending;overlay?.hide();this.terminal.write(mouseOff);this.tui.requestRender(true);
243
+ unsubscribe?.();unsubscribeFinished?.();this.runViewer=null;this.tui.children=children;this.pending=previousPending;overlay?.hide();this.terminal.write(mouseOff);this.tui.requestRender(true);
244
+ if(elapsedTimer)clearInterval(elapsedTimer);
211
245
  }
212
246
  if(readPages)await this.viewLogPages(app,runId);
247
+ return renderedOutput;
213
248
  }
214
249
  async viewLogPages(app,id){
215
250
  let cursor=0;const previous=[];
@@ -235,19 +270,41 @@ export class TerminalView{
235
270
  if(message.startsWith('fst >'))title.render=()=>[];
236
271
  this.prompt.clear();this.prompt.addChild(title);this.prompt.addChild(component);this.tui.setFocus(component);this.tui.requestRender();
237
272
  try{return await new Promise((resolve,reject)=>{this.pending={resolve,reject};component.onSubmit=text=>{
238
- if(this.homeInput&&text.trim()&&this.commandHistory.at(-1)!==text.trim()){
239
- this.commandHistory.push(text.trim());if(this.commandHistory.length>100)this.commandHistory.shift();
273
+ // Shell 历史保留末尾换行,避免再次执行时改变反斜杠续行等语义。
274
+ const historyText=text.trimStart().startsWith('!')?text:text.trim();
275
+ if(this.homeInput&&historyText&&this.commandHistory.at(-1)!==historyText){
276
+ this.commandHistory.push(historyText);if(this.commandHistory.length>100)this.commandHistory.shift();
277
+ this.onHistoryChange?.();
240
278
  }
241
279
  resolve(text);
242
280
  };component.onSelect=item=>resolve(item.value);component.onCancel=()=>reject(cancelled());});}
243
- finally{if(this.homeInput)this.terminal.write(mouseOff);this.pending=null;this.editor=null;this.homeInput=false;this.prompt.clear();this.tui.requestRender();}
281
+ finally{if(this.homeInput)this.terminal.write(mouseOff);this.pending=null;this.editor=null;this.homeInput=false;this.multilineInput=false;this.prompt.clear();this.tui.requestRender();}
244
282
  }
245
- input(message,{value='',commands=[],files=true,workflows=[]}={}){
283
+ input(message,{value='',commands=[],files=true,workflows=[],multiline=false}={}){
246
284
  const editor=new Editor(this.tui,{borderColor:palette.border,selectList:theme},{paddingX:1});
285
+ const handleInput=editor.handleInput.bind(editor);
286
+ editor.handleInput=data=>{
287
+ // ProcessTerminal 已把分段粘贴合并为完整事件;公开插入接口保留脚本制表符和换行。
288
+ if(data.startsWith('\x1b[200~')&&data.endsWith('\x1b[201~')){
289
+ const text=safe(data.slice(6,-6).replace(/\r\n?/g,'\n'));
290
+ if(this.homeInput||multiline||text.includes('\n')){editor.insertTextAtCursor(text);return;}
291
+ }
292
+ if(matchesKey(data,'shift+enter')||matchesKey(data,'alt+enter')||data==='\x1b[13;2~'){
293
+ editor.insertTextAtCursor('\n');return;
294
+ }
295
+ // 反斜杠属于命令原文,不能触发上游的“反斜杠后 Enter 换行”兼容键位。
296
+ if(data==='\\'){editor.insertTextAtCursor(data);return;}
297
+ if(matchesKey(data,'enter')&&!editor.isShowingAutocomplete()){
298
+ if(!editor.disableSubmit){const text=editor.getExpandedText();editor.setText('');editor.onSubmit?.(text);}
299
+ return;
300
+ }
301
+ handleInput(data);
302
+ };
247
303
  const renderEditor=editor.render.bind(editor);
248
304
  editor.render=width=>{
249
- if(width<8)return renderEditor(width);
250
- const inner=width-4,lines=renderEditor(inner);let closed=false;
305
+ // 上游 visibleWidth 按三个空格计算 Tab;只扩展显示,提交仍保留原始 Tab。
306
+ if(width<8)return renderEditor(width).map(line=>line.replaceAll('\t',' '));
307
+ const inner=width-4,lines=renderEditor(inner).map(line=>line.replaceAll('\t',' '));let closed=false;
251
308
  return lines.map((line,i)=>{
252
309
  if(i===0)return ' '+palette.border('╭'+'─'.repeat(inner)+'╮');
253
310
  if(!closed&&/^─+$/.test(safe(line))){closed=true;return ' '+palette.border('╰'+'─'.repeat(inner)+'╯');}
@@ -256,6 +313,7 @@ export class TerminalView{
256
313
  });
257
314
  };
258
315
  this.homeInput=message.startsWith('fst >');
316
+ this.multilineInput=multiline;
259
317
  this.commandHistoryIndex=null;
260
318
  if(this.homeInput)editor.onChange=text=>{
261
319
  if(this.commandHistoryIndex!==null&&text!==this.commandHistory[this.commandHistoryIndex])this.commandHistoryIndex=null;
@@ -4,7 +4,6 @@ export async function workflowMenu(session){
4
4
  const workflows=await app.listWorkflows();
5
5
  const choice=await ui.select('工作流 · 选择后编辑或执行',[
6
6
  ...workflows.map(flow=>({value:`workflow:${flow.id}`,label:flow.title??flow.id,description:`${flow.id} · ${flow.steps.length} 步`})),
7
- ...(!app.project.readOnly?workflows.map(flow=>({value:`duplicate:${flow.id}`,label:`复制 ${flow.title??flow.id} 为新工作流`,description:`从已保存版本 ${flow.id} 创建副本` })):[]),
8
7
  ...(!app.project.readOnly?[{value:'new',label:'+ 新建工作流'}]:[]),
9
8
  ...(session.dirty?[{value:'draft',label:`继续编辑草稿:${session.flow.title}`}]:[]),
10
9
  {value:'back',label:'返回主面板'},
@@ -12,14 +11,10 @@ export async function workflowMenu(session){
12
11
  if(choice==='back')return;
13
12
  try{
14
13
  const id=choice.startsWith('workflow:')?choice.slice(9):null;
15
- if(choice.startsWith('duplicate:')){
16
- if(!await session.discard())continue;
17
- await duplicateIntoSession(session,workflows.find(flow=>flow.id===choice.slice(10)));
18
- }
19
- else if(choice==='new'){if(await session.execute('/new')===false)continue;}
14
+ if(choice==='new'){if(await session.execute('/new')===false)continue;}
20
15
  else if(choice!=='draft'&&session.flow?.id!==id){
21
16
  if(!await session.discard())continue;
22
- session.flow=structuredClone(workflows.find(flow=>flow.id===id));session.dirty=false;
17
+ session.loadWorkflow(workflows.find(flow=>flow.id===id));
23
18
  }
24
19
  if(await editWorkflow(session)==='running')return;
25
20
  }catch(error){if(error.code!=='PROMPT_CANCELLED')throw error;}
@@ -35,18 +30,23 @@ async function editWorkflow(session){
35
30
  ...(!app.project.readOnly?[
36
31
  {value:'add',label:'添加步骤 / 控制流'}, {value:'steps',label:'编辑步骤、参数与顺序'},
37
32
  {value:'outputs',label:'设置最终输出'},{value:'save',label:'保存工作流'},
38
- {value:'duplicate',label:'复制为新工作流(包含当前未保存修改)'},
39
- {value:'delete',label:'删除工作流(保留可恢复备份)'},
33
+ {value:'duplicate',label:`复制为新工作流${session.dirty?'(包含当前未保存修改)':''}`},
34
+ {value:'delete',label:'删除工作流'},
40
35
  ]:[{value:'steps',label:'查看步骤'}]),
41
- {value:'back',label:'返回工作流列表(保留草稿)'},
36
+ {value:'back',label:`返回工作流列表${session.dirty?'(保留草稿)':''}`},
42
37
  ]);
43
38
  if(choice==='back')return;
44
39
  try{
45
40
  if(choice==='delete'){
46
- if(!await ui.confirm(`删除 ${flow.title??flow.id}?已保存文件会移入备份,未保存修改将放弃。`))continue;
47
41
  const exists=(await app.listWorkflows()).some(w=>w.id===flow.id);
48
- const backup=exists?await app.removeWorkflow(flow.id):null;
49
- session.flow=null;session.dirty=false;ui.show(backup?`工作流已移入备份:${backup}`:'未保存的草稿已删除。');return;
42
+ const operation=await ui.select(`删除 ${flow.title??flow.id}?${session.dirty?'当前未保存修改将放弃。':''}`, [
43
+ {value:'cancel',label:'取消,返回'},
44
+ ...(exists?[{value:'backup',label:'备份后删除',description:'保留已保存文件,可恢复'},
45
+ {value:'delete',label:'直接删除',description:'不创建本次删除的备份'}]:[{value:'delete',label:'丢弃未保存的草稿'}]),
46
+ ]);
47
+ if(operation==='cancel')continue;
48
+ const backup=exists?await app.removeWorkflow(flow.id,{backup:operation==='backup'}):null;
49
+ session.loadWorkflow(null);ui.show(backup?`工作流已移入备份:${backup}`:exists?'工作流已删除,未创建本次删除的备份。':'未保存的草稿已丢弃。');return;
50
50
  }
51
51
  if(choice==='run'){
52
52
  if(await session.startRun([],{draft:true}))return 'running';
@@ -60,6 +60,6 @@ async function duplicateIntoSession(session,source){
60
60
  const title=(await session.ui.input('新工作流名称',{value:`${source.title??source.id} 副本`,files:false})).trim();
61
61
  if(!title)throw new Error('名称不能为空');
62
62
  const {definition}=await session.app.duplicateWorkflow(source,{title});
63
- session.flow=structuredClone(definition);session.dirty=false;
64
- session.ui.show(`已创建副本:${definition.title}(${definition.id})。原工作流 ${source.id} 未修改。可在父工作流中依次加入原版和副本两个子流程步骤,比较输出和耗时。`);
63
+ session.loadWorkflow(definition);
64
+ session.ui.show(`已创建副本:${definition.title}(${definition.id})。原工作流 ${source.id} 未修改。`);
65
65
  }
@@ -16,14 +16,14 @@
16
16
  ],
17
17
  "license": "MIT",
18
18
  "engines": {
19
- "node": ">=24.15.0"
19
+ "node": "^22.22.2 || >=24.0.0"
20
20
  },
21
21
  "dependencies": {
22
22
  "@mytools/sdk": "0.1.0",
23
23
  "@mytools/fst-platform": "0.1.0",
24
24
  "@mytools/fst-plugin": "0.1.0",
25
25
  "semver": "7.7.4",
26
- "validate-npm-package-name": "8.0.0",
26
+ "validate-npm-package-name": "7.0.2",
27
27
  "acorn": "8.19.0"
28
28
  }
29
29
  }
@@ -3,6 +3,7 @@ import {fileURLToPath} from 'node:url';
3
3
  import {access,readFile,readdir,lstat,mkdir,copyFile,realpath} from 'node:fs/promises';
4
4
 
5
5
  const topics=[
6
+ ['commands','系统命令与快捷名称','docs/terminal-commands.md'],
6
7
  ['plugins','插件开发规范','docs/plugin-development.md'],
7
8
  ['deployment','安装与部署','docs/deployment.md'],
8
9
  ['control','控制流与运行观察规范','docs/superpowers/specs/2026-10-11-control-observation.md'],
@@ -14,7 +15,7 @@ const topics=[
14
15
  ['readme','Fishtools 使用说明','README.md'],
15
16
  ];
16
17
  // 保留文档链接所需的目录布局;参考代码仅供阅读,不是第二份运行时。
17
- const assets=['README.md','LICENSE','THIRD_PARTY_NOTICES.md','docs','examples/service-plugins','plugins/examples','plugins/environment','plugins/web/README.md','packages/sdk','packages/core','packages/pack','packages/fst-logs','packages/fst-platform','packages/fst-workflow','packages/fst-plugin','packages/fst-workspace','packages/fst-devtools','packages/fst-cli','tests/application.test.js'];
18
+ const assets=['README.md','LICENSE','THIRD_PARTY_NOTICES.md','docs','examples/service-plugins','plugins/examples','plugins/environment','plugins/commands','plugins/web/README.md','packages/sdk','packages/core','packages/pack','packages/fst-logs','packages/fst-platform','packages/fst-workflow','packages/fst-plugin','packages/fst-workspace','packages/fst-devtools','packages/fst-cli','tests/application.test.js'];
18
19
  const excluded=new Set(['node_modules','dist','.git','.cache','__pycache__','.pytest_cache','coverage','public']);
19
20
  const inside=(parent,child)=>{const relative=path.relative(parent,child);return relative===''||(!relative.startsWith(`..${path.sep}`)&&relative!=='..'&&!path.isAbsolute(relative));};
20
21
 
@@ -125,7 +125,7 @@ async function inspectPluginDirectory(directory,quality){
125
125
  }
126
126
 
127
127
  function scaffold(name){
128
- const packageJson={name,version:'1.0.0',type:'module',main:'index.js',files:['index.js','test','README.md','LICENSE'],scripts:{test:'node --test'},license:'MIT',engines:{node:'>=24.15.0'}};
128
+ const packageJson={name,version:'1.0.0',type:'module',main:'index.js',files:['index.js','test','README.md','LICENSE'],scripts:{test:'node --test'},license:'MIT',engines:{node:'^22.22.2 || >=24.0.0'}};
129
129
  const plugin=`// 直接导出插件定义,无需安装内部 SDK。\nexport default {\n id:${JSON.stringify(name)},version:'1.0.0',sdk:'^0.1.0',\n title:'嵌套输入示例',description:'演示业务结果、嵌套输入和判定预设。',\n platforms:['win32','linux','darwin'],architectures:['x64','arm64'],\n actions:{\n check:{\n title:'检查请求',description:'根据嵌套请求生成业务结果。',\n input:{type:'object',properties:{request:{type:'object',properties:{name:{type:'string',minLength:1,title:'姓名'},enabled:{type:'boolean',title:'启用'}},required:['name','enabled'],additionalProperties:false}},required:['request'],additionalProperties:false},\n output:{type:'object',properties:{ok:{type:'boolean'},message:{type:'string'}},required:['ok','message'],additionalProperties:false},\n conditions:{passed:{title:'业务通过',path:'ok',op:'eq',value:true}},\n requirements:{privilege:{win32:{level:'user'},linux:{level:'user'}}},\n async run({request},{signal}={}){\n signal?.throwIfAborted?.();\n return request.enabled?{ok:true,message:\`你好,\${request.name}\`}:{ok:false,message:'已禁用'};\n },\n },\n },\n};\n`;
130
130
  const testSource=`import test from 'node:test';\nimport assert from 'node:assert/strict';\nimport plugin from '../index.js';\n\ntest('嵌套参数和业务判定',async()=>{\n assert.deepEqual(await plugin.actions.check.run({request:{name:'阿青',enabled:true}}),{ok:true,message:'你好,阿青'});\n assert.deepEqual(await plugin.actions.check.run({request:{name:'阿青',enabled:false}}),{ok:false,message:'已禁用'});\n});\n`;
131
131
  const readme=`# ${name}\n\n可独立安装的 Fishtools 插件示例,不依赖尚未公开发布的 SDK。\n\n## 使用\n\n在本目录运行 \`npm test\`,并运行 \`fst plugin validate .\` 检查声明。安装后可将 \`${name}:check\` 加入工作流。\n\n输入示例:\n\n\`\`\`json\n{"request":{"name":"阿青","enabled":true}}\n\`\`\`\n\n输出含 \`ok\` 与 \`message\`。\`ok:false\` 表示业务未通过,但动作仍正常返回;\`conditions.passed\` 可供工作流分支使用。请同步修改 package.json 和 index.js 中的名称、版本,并根据实际支持情况调整 platforms / architectures。\n`;
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 职责与边界
6
6
 
7
- 运行日志写入器、串行落盘、有界事件缓存、快照、历史分页、保留和体积统计。运行调度由 core 负责。
7
+ 运行日志写入器、串行落盘、有界事件缓存、快照、历史分页、保留和体积统计,以及 TUI 会话元数据和完整交互摘要存储。运行调度由 core 负责。
8
8
 
9
9
  内部依赖:`@mytools/sdk`。
10
10
  ## 公开入口
@@ -15,6 +15,7 @@
15
15
  | `@mytools/fst-logs/markdown` | `./src/markdown-log.js` |
16
16
  | `@mytools/fst-logs/steps` | `./src/step-summaries.js` |
17
17
  | `@mytools/fst-logs/preview` | `./src/run-preview.js` |
18
+ | `@mytools/fst-logs/sessions` | `./src/session-history.js` |
18
19
  | `@mytools/fst-logs/package.json` | `./package.json` |
19
20
 
20
21
  仅依赖 exports 声明的入口,禁止消费者跨包读取 src/bin 私有文件。入口路径由本模块维护,修改协议时同步消费方回归。
@@ -56,6 +57,26 @@ maxValueBytes 至少为 2,连预览本身也容不下时省略字段值并保
56
57
 
57
58
  拒绝日志根目录、运行目录或正文文件链接,已有同 ID 日志拒绝覆盖。体积统计和保留策略仅涉及 `run.md`、`events.jsonl`、`result.json`、`run.meta.json` 四个约定文件;业务文件和子目录保持保留。统计不递归、不读取正文。普通文件系统检查不能提供针对恶意并发路径替换的操作系统安全沙箱。
58
59
 
60
+ ## TUI 会话持久化
61
+
62
+ `createSessionHistory(directory,{projectDir,maxBytes=2097152,maxEntryBytes=65536,maxPageBytes=524288,maxPendingBytes=8388608})` 从 `/sessions` 入口创建会话存储器。调用方决定本地会话目录,测试必须使用临时目录,不能写入真实 `FISHTOOLS_HOME`。会话使用严格 UUID 格式的 ID,按工作区绝对路径保存 `sessionOwner`;Windows 路径比较忽略大小写。
63
+
64
+ 每个会话有两个文件:`<id>.json` 保存轻量元数据和最近视图,`<id>.jsonl` 持续追加全部交互摘要。输入、反馈、运行开始和最终结果都应由 TUI 逐条追加;最近视图的条目数量限制不会删除 JSONL 中更早的交互。完整进程输出继续放在原运行日志中,会话摘要只保存有界结果预览与对应运行 ID。会话文件默认使用可直接读取的 UTF-8 JSON,不自动加密、压缩或删除历史。
65
+
66
+ | 方法 | 行为 |
67
+ | --- | --- |
68
+ | `save(snapshot)` | 保存 `schemaVersion:1`、UUID `id`、`startedAt`、`updatedAt`、可选 `resumedFrom`、`commandHistory` 字符串数组和 `feed` 最近视图数组,并自动写入 `sessionOwner`;其余 JSON 字段同样保留 |
69
+ | `read(id)` | 校验归属后返回当前元数据;不加载完整交互正文 |
70
+ | `list()` | 按最近更新时间列出轻量摘要:`schemaVersion`、`id`、`sessionOwner`、`startedAt`、`updatedAt`、可选 `resumedFrom`、`commandCount`、`feedCount` |
71
+ | `append(id,entry)` | 在已保存元数据的会话中追加一个 JSON 对象;保留条目原结构,并等待文件写入和同步完成 |
72
+ | `page(id,{cursor=0,limit=100})` | 返回 `{entries,cursor,nextCursor,hasMore,totalBytes}`;`cursor` 是完整 JSONL 记录边界的字节位置,`limit` 是条目数,上限 200 |
73
+
74
+ 同一进程中,同目录、同 ID 的保存、追加和分页按调用顺序串行执行,包括多个存储器实例。保存通过独占创建临时文件、同步写入和原子替换完成;更新时间更旧的快照被跳过,同一毫秒的快照按调用顺序保存。已有会话不能改变开始时间。恢复必须新建 UUID、复制所需视图,并将旧 ID 写入 `resumedFrom`,原会话和交互日志继续保留。
75
+
76
+ `maxBytes` 限制每份元数据,`maxEntryBytes` 限制每条 JSON 正文,`maxPageBytes` 限制每页 JSONL 原始字节,`maxPendingBytes` 限制尚未完成的写入队列。分页预算必须容纳单条最大记录及换行。交互日志总长度可持续增长,每次分页只读取有界窗口;不会为了查看会话把整份 JSONL 加载进内存。超限分别返回 `SESSION_METADATA_LIMIT`、`SESSION_ENTRY_LIMIT` 或 `SESSION_QUEUE_LIMIT`,不静默截断用户记录;调用方应保留错误反馈并提示用户。一次失败不会阻止后续读取或重试。
77
+
78
+ 元数据损坏、过大或来自其他工作区时,`list()` 跳过该会话,直接 `read()` 明确报错。损坏的已有元数据拒绝覆盖。根目录或文件链接、不安全 ID、非法游标均被拒绝;JSONL 末尾缺少换行时拒绝继续追加,避免把新输入接到未完成的旧记录后。普通文件系统检查无法替代针对恶意并发路径替换的操作系统安全沙箱。
79
+
59
80
  ## 维护与验证
60
81
 
61
82
  本模块负责上述职责的实现、文档与回归;跨模块接口调整需要同时检查生产者与消费者。具体维护人员尚未指定。
@@ -63,5 +84,5 @@ maxValueBytes 至少为 2,连预览本身也容不下时省略字段值并保
63
84
  在仓库根目录执行:
64
85
 
65
86
  ```sh
66
- node --test tests/log-streaming.test.js tests/modules.test.js tests/module-interfaces.test.js tests/run-logs.test.js tests/live-output.test.js
87
+ node --test tests/session-history.test.js tests/log-streaming.test.js tests/modules.test.js tests/module-interfaces.test.js tests/run-logs.test.js tests/live-output.test.js
67
88
  ```
@@ -8,6 +8,7 @@
8
8
  ".": "./src/run-logs.js",
9
9
  "./steps": "./src/step-summaries.js",
10
10
  "./preview": "./src/run-preview.js",
11
+ "./sessions": "./src/session-history.js",
11
12
  "./markdown": "./src/markdown-log.js",
12
13
  "./package.json": "./package.json"
13
14
  },
@@ -18,7 +19,7 @@
18
19
  ],
19
20
  "license": "MIT",
20
21
  "engines": {
21
- "node": ">=24.15.0"
22
+ "node": "^22.22.2 || >=24.0.0"
22
23
  },
23
24
  "dependencies": {
24
25
  "@mytools/sdk": "0.1.0"
@@ -0,0 +1,23 @@
1
+ import {lstat,open} from 'node:fs/promises';
2
+
3
+ export function sameFileIdentity(pathStat,handleStat,platform=process.platform){
4
+ if(pathStat.ino!==handleStat.ino)return false;
5
+ // 早期 libuv 的 Windows 路径查询返回 64 位卷号,句柄查询只有低 32 位。
6
+ // 与维护版本的 VolumeSerialNumber.LowPart 口径一致;文件 ID 仍完整比较。
7
+ const device=stat=>platform==='win32'?BigInt.asUintN(32,stat.dev):stat.dev;
8
+ return device(pathStat)===device(handleStat);
9
+ }
10
+
11
+ export async function samePathFileIdentity(file,pathStat,handleStat,platform=process.platform){
12
+ if(sameFileIdentity(pathStat,handleStat,platform))return true;
13
+ if(platform!=='win32'||pathStat.dev!==0n||pathStat.ino!==handleStat.ino)return false;
14
+ // 某些 Windows 文件系统的早期路径查询缺少卷号,不能直接将 0 当作通配符。
15
+ // 用第二个只读句柄证明当前路径与主句柄的完整身份,再确认路径仍非链接。
16
+ const probe=await open(file,'r');
17
+ try{
18
+ const proof=await probe.stat({bigint:true});
19
+ if(!proof.isFile()||proof.ino!==handleStat.ino||proof.dev!==handleStat.dev)return false;
20
+ const current=await lstat(file,{bigint:true});
21
+ return current.isFile()&&!current.isSymbolicLink()&&current.ino===pathStat.ino&&(current.dev===0n||sameFileIdentity(current,handleStat,platform));
22
+ }finally{await probe.close();}
23
+ }
@@ -1,5 +1,5 @@
1
1
  const names={
2
- 'run.started':'运行开始','run.succeeded':'运行成功','run.failed':'运行失败','run.cancelled':'运行取消','run.stopped':'运行停止',
2
+ 'run.started':'运行开始','run.input':'运行输入','run.succeeded':'运行成功','run.failed':'运行失败','run.cancelled':'运行取消','run.stopped':'运行停止',
3
3
  'workflow.started':'工作流开始','workflow.succeeded':'工作流完成','workflow.stopped':'工作流停止',
4
4
  'step.started':'步骤开始','step.succeeded':'步骤成功','step.failed':'步骤失败','step.cancelled':'步骤取消','step.skipped':'步骤跳过','step.stopped':'步骤停止',log:'插件日志',
5
5
  };
@@ -28,7 +28,8 @@ function errorText(error){
28
28
  }
29
29
 
30
30
  export function markdownHeader(run){
31
- return '# Fishtools 运行日志\n\n'+block(`运行 ID:${run.id}\n工作流或命令:${run.workflowId}\n开始时间:${run.startedAt}`)+'## 执行过程\n\n';
31
+ const kind={workflow:'工作流',action:'插件动作',command:'插件命令',shell:'系统命令'}[run.kind];
32
+ return '# Fishtools 运行日志\n\n'+block(`运行 ID:${run.id}\n工作流或命令:${run.workflowId}${kind?`\n执行类型:${kind}`:''}${run.sessionId?`\n启动会话:${run.sessionId}`:''}\n开始时间:${run.startedAt}`)+'## 执行过程\n\n';
32
33
  }
33
34
 
34
35
  export function markdownEvent(event){
@@ -41,7 +42,7 @@ export function markdownEvent(event){
41
42
  if(event.message)output+=block(event.message);
42
43
  if(event.reason!==undefined)output+='停止或跳过原因:\n\n'+block(event.reason);
43
44
  if(event.data!==undefined)output+='附加信息:\n\n'+block(event.data,'json');
44
- if(event.input!==undefined)output+='步骤输入:\n\n'+block(event.input,'json');
45
+ if(event.input!==undefined)output+=(event.type==='run.input'?'运行输入:\n\n':'步骤输入:\n\n')+block(event.input,'json');
45
46
  if(event.output!==undefined)output+='步骤输出:\n\n'+block(event.output,'json');
46
47
  if(event.error)output+=errorText(event.error);
47
48
  return output;
@@ -5,6 +5,7 @@ import {markdownHeader,markdownEvent,markdownResult} from './markdown-log.js';
5
5
  import {logPolicy,jsonSize,eventPreview} from './log-bounds.js';
6
6
  import {createStepSummaries} from './step-summaries.js';
7
7
  import {previewRun} from './run-preview.js';
8
+ import {samePathFileIdentity} from './file-identity.js';
8
9
 
9
10
  const validId=id=>typeof id==='string'&&/^[a-f0-9-]{36}$/.test(id);
10
11
  const logFiles=['run.md','events.jsonl','result.json','run.meta.json'];
@@ -33,9 +34,9 @@ export function createRunLogs(directory,{projectDir,allowLegacy=false,...options
33
34
  return dir;
34
35
  }
35
36
  async function safeFile(file){
36
- const before=await lstat(file);if(!before.isFile()||before.isSymbolicLink())throw new FlowError('日志文件无效');
37
+ const before=await lstat(file,{bigint:true});if(!before.isFile()||before.isSymbolicLink())throw new FlowError('日志文件无效');
37
38
  const handle=await open(file,'r');
38
- try{const after=await handle.stat();if(!after.isFile()||before.ino!==after.ino||before.dev!==after.dev)throw new FlowError('日志文件无效');return handle;}
39
+ try{const after=await handle.stat({bigint:true});if(!after.isFile()||!(await samePathFileIdentity(file,before,after)))throw new FlowError('日志文件无效');return handle;}
39
40
  catch(error){await handle.close();throw error;}
40
41
  }
41
42
  async function read(id){
@@ -0,0 +1,180 @@
1
+ import path from 'node:path';
2
+ import {constants} from 'node:fs';
3
+ import {lstat,mkdir,open,readdir,rename,unlink} from 'node:fs/promises';
4
+ import {randomUUID} from 'node:crypto';
5
+ import {FlowError} from '@mytools/sdk';
6
+ import {jsonSize} from './log-bounds.js';
7
+ import {samePathFileIdentity} from './file-identity.js';
8
+
9
+ const validId=id=>typeof id==='string'&&/^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/.test(id);
10
+ const normalize=directory=>process.platform==='win32'?path.resolve(directory).toLowerCase():path.resolve(directory);
11
+ const queues=new Map();
12
+ const decoder=new TextDecoder('utf-8',{fatal:true});
13
+ const failure=(message,code,cause)=>new FlowError(message,{code,cause});
14
+ const plain=value=>value!==null&&typeof value==='object'&&!Array.isArray(value);
15
+
16
+ function checkId(id){if(!validId(id))throw failure('会话 ID 无效','SESSION_ID_INVALID');}
17
+ function checkSnapshot(record,id){
18
+ if(!plain(record)||record.schemaVersion!==1||record.id!==id||!Number.isFinite(Date.parse(record.startedAt))||!Number.isFinite(Date.parse(record.updatedAt))||Date.parse(record.updatedAt)<Date.parse(record.startedAt)||!Array.isArray(record.commandHistory)||!record.commandHistory.every(command=>typeof command==='string')||!Array.isArray(record.feed))throw failure('会话元数据格式无效','SESSION_RECORD_INVALID');
19
+ if(record.resumedFrom!==undefined&&(!validId(record.resumedFrom)||record.resumedFrom===id))throw failure('会话恢复来源 ID 无效','SESSION_RECORD_INVALID');
20
+ }
21
+ function encoded(value,limit,code){
22
+ try{
23
+ // 预估器会多计容器末尾分隔符,先用双倍预算拒绝巨大输入,再按实际 JSON 字节精确判断。
24
+ if(jsonSize(value,limit*2)>limit*2)throw failure('会话记录超过字节预算',code);
25
+ const text=JSON.stringify(value);
26
+ if(typeof text!=='string')throw failure('会话记录必须可以序列化为 JSON','SESSION_RECORD_INVALID');
27
+ if(Buffer.byteLength(text)>limit)throw failure('会话记录超过字节预算',code);
28
+ return text;
29
+ }catch(error){if(error instanceof FlowError)throw error;throw failure('会话记录不能序列化为 JSON','SESSION_RECORD_INVALID',error);}
30
+ }
31
+ function parsed(buffer){
32
+ try{return JSON.parse(decoder.decode(buffer));}
33
+ catch(error){throw failure('会话记录损坏或不是有效的 UTF-8 JSON','SESSION_RECORD_INVALID',error);}
34
+ }
35
+
36
+ export function createSessionHistory(directory,{projectDir,maxBytes=2*1024*1024,maxEntryBytes=65536,maxPageBytes=512*1024,maxPendingBytes=8*1024*1024}={}){
37
+ if(typeof directory!=='string'||!directory||typeof projectDir!=='string'||!projectDir)throw failure('会话目录和工作区目录必须为非空路径','SESSION_PATH_INVALID');
38
+ const policy={maxBytes,maxEntryBytes,maxPageBytes,maxPendingBytes};
39
+ for(const [key,value] of Object.entries(policy))if(!Number.isSafeInteger(value)||value<2)throw failure(`会话 ${key} 必须为至少 2 的整数字节数`,'SESSION_RECORD_INVALID');
40
+ if(maxPageBytes<maxEntryBytes+1)throw failure('会话分页预算必须容纳一条记录及换行','SESSION_PAGE_LIMIT');
41
+ const root=path.resolve(directory),owner=normalize(projectDir);
42
+ const location=(id,suffix)=>{checkId(id);return path.join(root,`${id}.${suffix}`);};
43
+
44
+ function queue(id,bytes,operation){
45
+ checkId(id);const key=`${normalize(root)}\0${id}`;
46
+ let state=queues.get(key);
47
+ if(!state)state={tail:Promise.resolve(),bytes:0,jobs:0};
48
+ if(state.bytes+bytes>maxPendingBytes)return Promise.reject(failure('会话待写队列超过字节预算','SESSION_QUEUE_LIMIT'));
49
+ queues.set(key,state);
50
+ state.bytes+=bytes;state.jobs++;
51
+ const job=state.tail.then(operation).finally(()=>{state.bytes-=bytes;state.jobs--;if(!state.jobs&&queues.get(key)===state)queues.delete(key);});
52
+ // 一次失败只影响对应调用,后续操作仍可以读取原文件或重试。
53
+ state.tail=job.catch(()=>{});return job;
54
+ }
55
+ async function safeRoot(create=false){
56
+ if(create)await mkdir(root,{recursive:true});
57
+ const stat=await lstat(root);
58
+ if(!stat.isDirectory()||stat.isSymbolicLink())throw failure('会话根目录无效,不能使用目录链接','SESSION_PATH_INVALID');
59
+ }
60
+ async function regular(file,missing=false){
61
+ let stat;
62
+ try{stat=await lstat(file,{bigint:true});}catch(error){if(missing&&error.code==='ENOENT')return null;throw error;}
63
+ if(!stat.isFile()||stat.isSymbolicLink())throw failure('会话文件无效,不能使用文件链接','SESSION_PATH_INVALID');
64
+ return stat;
65
+ }
66
+ async function safeFile(file,{append=false}={}){
67
+ const before=await regular(file,append);
68
+ const flags=(append?constants.O_RDWR|constants.O_APPEND|constants.O_CREAT:constants.O_RDONLY)|(constants.O_NOFOLLOW??0);
69
+ const handle=await open(file,flags,0o600);
70
+ try{
71
+ const after=await handle.stat({bigint:true}),current=await regular(file);
72
+ if(!after.isFile()||(before&&!(await samePathFileIdentity(file,before,after)))||!(await samePathFileIdentity(file,current,after)))throw failure('会话文件在访问期间发生替换','SESSION_PATH_INVALID');
73
+ return handle;
74
+ }catch(error){await handle.close();throw error;}
75
+ }
76
+ async function readRecord(id){
77
+ checkId(id);await safeRoot();const handle=await safeFile(location(id,'json'));
78
+ let record;
79
+ try{
80
+ const size=(await handle.stat()).size;
81
+ if(size>maxBytes)throw failure('会话元数据超过读取字节预算','SESSION_METADATA_LIMIT');
82
+ const buffer=Buffer.alloc(Math.min(size+1,maxBytes+1));let offset=0;
83
+ while(offset<buffer.length){const {bytesRead}=await handle.read(buffer,offset,buffer.length-offset,offset);if(!bytesRead)break;offset+=bytesRead;}
84
+ if(offset>maxBytes)throw failure('会话元数据超过读取字节预算','SESSION_METADATA_LIMIT');
85
+ record=parsed(buffer.subarray(0,offset));
86
+ }finally{await handle.close();}
87
+ checkSnapshot(record,id);
88
+ if(record.sessionOwner!==owner)throw failure('会话记录不属于此工作区','SESSION_OWNER_MISMATCH');
89
+ return record;
90
+ }
91
+ async function saveRecord(record,text){
92
+ await safeRoot(true);
93
+ let existing;
94
+ try{existing=await readRecord(record.id);}catch(error){if(error.code!=='ENOENT')throw error;}
95
+ if(existing){
96
+ if(existing.startedAt!==record.startedAt)throw failure('已有会话的开始时间不能改变;恢复会话请使用新 ID','SESSION_RECORD_INVALID');
97
+ if(Date.parse(record.updatedAt)<Date.parse(existing.updatedAt))return existing;
98
+ }else{
99
+ // 缺少元数据的旧追加日志也不能被新会话接管。
100
+ if(await regular(location(record.id,'jsonl'),true))throw failure('会话追加日志已存在但缺少有效元数据,请使用新 ID','SESSION_RECORD_INVALID');
101
+ }
102
+ const target=location(record.id,'json'),temporary=path.join(root,`.${record.id}.${randomUUID()}.tmp`);
103
+ let handle;
104
+ try{
105
+ handle=await open(temporary,'wx',0o600);await handle.writeFile(text,'utf8');await handle.sync();await handle.close();handle=null;
106
+ await safeRoot();await regular(target,true);await rename(temporary,target);
107
+ }finally{if(handle)await handle.close();try{await unlink(temporary);}catch(error){if(error.code!=='ENOENT')throw error;}}
108
+ return record;
109
+ }
110
+ async function appendRecord(id,text){
111
+ await readRecord(id);await safeRoot();const handle=await safeFile(location(id,'jsonl'),{append:true});
112
+ try{
113
+ const size=(await handle.stat()).size;
114
+ if(size){const last=Buffer.alloc(1);await handle.read(last,0,1,size-1);if(last[0]!==10)throw failure('会话追加日志末尾存在未完成记录,拒绝继续写入','SESSION_RECORD_INVALID');}
115
+ await handle.writeFile(text+'\n','utf8');await handle.sync();
116
+ }finally{await handle.close();}
117
+ }
118
+ async function readPage(id,{cursor=0,limit=100}={}){
119
+ if(!Number.isSafeInteger(cursor)||cursor<0)throw failure('会话 cursor 必须为非负整数字节位置','SESSION_CURSOR_INVALID');
120
+ if(!Number.isSafeInteger(limit)||limit<1)throw failure('会话 limit 必须为正整数条目数','SESSION_PAGE_LIMIT');
121
+ limit=Math.min(limit,200);await readRecord(id);
122
+ let handle;
123
+ try{handle=await safeFile(location(id,'jsonl'));}
124
+ catch(error){if(error.code!=='ENOENT')throw error;if(cursor!==0)throw failure('会话 cursor 超过记录长度','SESSION_CURSOR_INVALID');return {entries:[],cursor,nextCursor:0,hasMore:false,totalBytes:0};}
125
+ try{
126
+ const totalBytes=(await handle.stat()).size;
127
+ if(cursor>totalBytes)throw failure('会话 cursor 超过记录长度','SESSION_CURSOR_INVALID');
128
+ if(cursor){const previous=Buffer.alloc(1);await handle.read(previous,0,1,cursor-1);if(previous[0]!==10)throw failure('会话 cursor 必须位于完整记录边界','SESSION_CURSOR_INVALID');}
129
+ const buffer=Buffer.alloc(Math.min(maxPageBytes+1,totalBytes-cursor));let readBytes=0;
130
+ while(readBytes<buffer.length){const {bytesRead}=await handle.read(buffer,readBytes,buffer.length-readBytes,cursor+readBytes);if(!bytesRead)break;readBytes+=bytesRead;}
131
+ let offset=0;const entries=[];
132
+ while(offset<readBytes&&entries.length<limit){
133
+ const newline=buffer.indexOf(10,offset);
134
+ if(newline===-1||newline>=readBytes){
135
+ if(readBytes-offset>maxEntryBytes)throw failure('会话单条记录超过读取字节预算','SESSION_ENTRY_LIMIT');
136
+ if(cursor+readBytes<totalBytes&&entries.length)break;
137
+ throw failure('会话追加日志存在未完成记录','SESSION_RECORD_INVALID');
138
+ }
139
+ if(newline-offset>maxEntryBytes)throw failure('会话单条记录超过读取字节预算','SESSION_ENTRY_LIMIT');
140
+ if(newline+1>maxPageBytes)break;
141
+ const entry=parsed(buffer.subarray(offset,newline));
142
+ if(!plain(entry))throw failure('会话追加记录必须为 JSON 对象','SESSION_RECORD_INVALID');
143
+ entries.push(entry);offset=newline+1;
144
+ }
145
+ const nextCursor=cursor+offset;
146
+ return {entries,cursor,nextCursor,hasMore:nextCursor<totalBytes,totalBytes};
147
+ }finally{await handle.close();}
148
+ }
149
+
150
+ return {
151
+ owner,policy:Object.freeze({...policy}),
152
+ async save(snapshot){
153
+ checkId(snapshot?.id);checkSnapshot(snapshot,snapshot.id);
154
+ const text=encoded({...snapshot,sessionOwner:owner},maxBytes,'SESSION_METADATA_LIMIT'),record=JSON.parse(text);
155
+ checkSnapshot(record,record.id);return queue(record.id,Buffer.byteLength(text),()=>saveRecord(record,text));
156
+ },
157
+ async read(id){checkId(id);return queue(id,0,()=>readRecord(id));},
158
+ async list(){
159
+ let entries;
160
+ try{await safeRoot();entries=await readdir(root,{withFileTypes:true});}catch(error){if(error.code==='ENOENT')return [];throw error;}
161
+ const records=[];
162
+ for(const entry of entries){
163
+ if(!entry.isFile()||!entry.name.endsWith('.json'))continue;
164
+ const id=entry.name.slice(0,-5);if(!validId(id))continue;
165
+ try{
166
+ const record=await queue(id,0,()=>readRecord(id));
167
+ records.push({schemaVersion:1,id,sessionOwner:record.sessionOwner,startedAt:record.startedAt,updatedAt:record.updatedAt,...(record.resumedFrom?{resumedFrom:record.resumedFrom}:{}),commandCount:record.commandHistory.length,feedCount:record.feed.length});
168
+ }catch(error){if(error.code==='EACCES'||error.code==='EPERM')throw error;}
169
+ }
170
+ return records.sort((a,b)=>Date.parse(b.updatedAt)-Date.parse(a.updatedAt)||b.id.localeCompare(a.id));
171
+ },
172
+ async append(id,entry){
173
+ checkId(id);if(!plain(entry))throw failure('会话追加记录必须为 JSON 对象','SESSION_RECORD_INVALID');
174
+ const text=encoded(entry,maxEntryBytes,'SESSION_ENTRY_LIMIT');
175
+ if(!plain(JSON.parse(text)))throw failure('会话追加记录必须为 JSON 对象','SESSION_RECORD_INVALID');
176
+ return queue(id,Buffer.byteLength(text)+1,()=>appendRecord(id,text));
177
+ },
178
+ async page(id,options={}){checkId(id);return queue(id,0,()=>readPage(id,options));},
179
+ };
180
+ }