@yanglaofish/fishtools 0.5.2 → 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.
- package/README.md +23 -11
- package/manual/README.md +23 -11
- package/manual/docs/deployment.md +3 -3
- package/manual/docs/examples/action-plugin/package.json +1 -1
- package/manual/docs/plugin-development.md +15 -4
- package/manual/docs/releases.md +24 -0
- package/manual/docs/superpowers/plans/2026-10-13-command-shortcuts.md +3 -2
- package/manual/docs/superpowers/plans/2026-10-13-global-plugins.md +56 -0
- package/manual/docs/superpowers/plans/2026-10-13-tui-readable-sessions.md +21 -0
- package/manual/docs/superpowers/reviews/2026-10-13-0.5.3-review.md +28 -0
- package/manual/docs/superpowers/reviews/2026-10-13-command-shortcuts-review.md +7 -0
- package/manual/docs/superpowers/reviews/2026-10-13-tui-sessions-review.md +55 -0
- package/manual/docs/superpowers/specs/2026-10-13-issue-4-workflow-menu.md +23 -0
- package/manual/docs/superpowers/specs/2026-10-13-issue-5-results-and-history.md +20 -0
- package/manual/docs/terminal-commands.md +8 -0
- package/manual/docs/verification.md +30 -0
- package/manual/packages/core/README.md +2 -0
- package/manual/packages/core/package.json +1 -1
- package/manual/packages/core/src/application.js +100 -51
- package/manual/packages/core/src/development-watch-worker.js +10 -1
- package/manual/packages/core/src/development.js +1 -1
- package/manual/packages/core/src/plugin-catalog.js +42 -0
- package/manual/packages/core/src/version.js +1 -1
- package/manual/packages/fst-cli/README.md +4 -0
- package/manual/packages/fst-cli/bin/fst.js +7 -6
- package/manual/packages/fst-cli/package.json +1 -1
- package/manual/packages/fst-cli/src/development.js +6 -1
- package/manual/packages/fst-cli/src/terminal/command-menu.js +8 -3
- package/manual/packages/fst-cli/src/terminal/navigation.js +2 -0
- package/manual/packages/fst-cli/src/terminal/presentation.js +4 -3
- package/manual/packages/fst-cli/src/terminal/run-feed.js +69 -13
- package/manual/packages/fst-cli/src/terminal/run-presentation.js +55 -12
- package/manual/packages/fst-cli/src/terminal/run-viewer.js +26 -10
- package/manual/packages/fst-cli/src/terminal/session-history.js +82 -0
- package/manual/packages/fst-cli/src/terminal/session.js +119 -40
- package/manual/packages/fst-cli/src/terminal/view.js +31 -8
- package/manual/packages/fst-cli/src/terminal/workflow-menu.js +14 -9
- package/manual/packages/fst-devtools/package.json +2 -2
- package/manual/packages/fst-devtools/src/plugin-tools.js +1 -1
- package/manual/packages/fst-logs/README.md +23 -2
- package/manual/packages/fst-logs/package.json +2 -1
- package/manual/packages/fst-logs/src/file-identity.js +23 -0
- package/manual/packages/fst-logs/src/markdown-log.js +4 -3
- package/manual/packages/fst-logs/src/run-logs.js +3 -2
- package/manual/packages/fst-logs/src/session-history.js +180 -0
- package/manual/packages/fst-platform/README.md +4 -0
- package/manual/packages/fst-platform/package.json +3 -3
- package/manual/packages/fst-platform/src/process.js +4 -1
- package/manual/packages/fst-platform/src/shell.js +46 -1
- package/manual/packages/fst-plugin/package.json +1 -1
- package/manual/packages/fst-plugin/src/host.js +31 -23
- package/manual/packages/fst-workflow/package.json +1 -1
- package/manual/packages/fst-workflow/src/engine.js +1 -1
- package/manual/packages/fst-workspace/README.md +2 -0
- package/manual/packages/fst-workspace/package.json +2 -1
- package/manual/packages/fst-workspace/src/plugin-registry.js +58 -0
- package/manual/packages/fst-workspace/src/plugins.js +7 -4
- package/manual/packages/fst-workspace/src/workflows.js +5 -3
- package/manual/packages/pack/package.json +3 -3
- package/manual/packages/pack/runtime-cache.js +26 -0
- package/manual/packages/pack/runtime.js +6 -10
- package/manual/plugins/commands/package.json +1 -1
- package/node_modules/@mytools/commands/package.json +1 -1
- package/node_modules/@mytools/core/README.md +2 -0
- package/node_modules/@mytools/core/package.json +1 -1
- package/node_modules/@mytools/core/src/application.js +100 -51
- package/node_modules/@mytools/core/src/development-watch-worker.js +10 -1
- package/node_modules/@mytools/core/src/development.js +1 -1
- package/node_modules/@mytools/core/src/plugin-catalog.js +42 -0
- package/node_modules/@mytools/core/src/version.js +1 -1
- package/node_modules/@mytools/fst-cli/README.md +4 -0
- package/node_modules/@mytools/fst-cli/bin/fst.js +7 -6
- package/node_modules/@mytools/fst-cli/package.json +1 -1
- package/node_modules/@mytools/fst-cli/src/development.js +6 -1
- package/node_modules/@mytools/fst-cli/src/terminal/command-menu.js +8 -3
- package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +2 -0
- package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +4 -3
- package/node_modules/@mytools/fst-cli/src/terminal/run-feed.js +69 -13
- package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +55 -12
- package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +26 -10
- package/node_modules/@mytools/fst-cli/src/terminal/session-history.js +82 -0
- package/node_modules/@mytools/fst-cli/src/terminal/session.js +119 -40
- package/node_modules/@mytools/fst-cli/src/terminal/view.js +31 -8
- package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +14 -9
- package/node_modules/@mytools/fst-devtools/package.json +2 -2
- package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +1 -1
- package/node_modules/@mytools/fst-logs/README.md +23 -2
- package/node_modules/@mytools/fst-logs/package.json +2 -1
- package/node_modules/@mytools/fst-logs/src/file-identity.js +23 -0
- package/node_modules/@mytools/fst-logs/src/markdown-log.js +4 -3
- package/node_modules/@mytools/fst-logs/src/run-logs.js +3 -2
- package/node_modules/@mytools/fst-logs/src/session-history.js +180 -0
- package/node_modules/@mytools/fst-platform/README.md +4 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/LICENSE +21 -0
- package/node_modules/{undici/docs/docs/index.md → @mytools/fst-platform/node_modules/undici/README.md} +85 -137
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Agent.md +84 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/CacheStore.md +164 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Client.md +288 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ClientStats.md +27 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Connector.md +115 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ContentType.md +57 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Cookies.md +128 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Debug.md +62 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +317 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Dispatcher.md +1393 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +159 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Errors.md +49 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/EventSource.md +45 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Fetch.md +60 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/GlobalInstallation.md +139 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/H2CClient.md +263 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockAgent.md +603 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockCallHistory.md +197 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +43 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockClient.md +81 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockPool.md +555 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Pool.md +84 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ProxyAgent.md +229 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RedirectHandler.md +93 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RetryAgent.md +50 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RetryHandler.md +118 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RoundRobinPool.md +145 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/SnapshotAgent.md +616 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +275 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Util.md +25 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/WebSocket.md +141 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/docs/docs/best-practices/crawling.md +1 -3
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/mocking-request.md +190 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/docs/docs/best-practices/undici-vs-builtin-fetch.md +8 -10
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/writing-tests.md +63 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/index-fetch.js +65 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/index.d.ts +3 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/index.js +234 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/abort-signal.js +59 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-connect.js +110 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-pipeline.js +252 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-request.js +214 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-stream.js +209 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-upgrade.js +111 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/index.js +7 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/readable.js +580 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/cache/memory-cache-store.js +3 -3
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/cache/sqlite-cache-store.js +1 -3
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/connect.js +153 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/constants.js +143 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/diagnostics.js +227 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/errors.js +477 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/request.js +485 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/symbols.js +75 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/tree.js +160 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/util.js +992 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/agent.js +158 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/balanced-pool.js +221 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client-h1.js +1746 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client-h2.js +1060 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client.js +668 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/dispatcher-base.js +184 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/dispatcher.js +48 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +146 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/h2c-client.js +4 -4
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/pool-base.js +214 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/pool.js +118 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/proxy-agent.js +319 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/round-robin-pool.js +10 -32
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/socks5-proxy-agent.js +63 -153
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/global.js +59 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/cache-handler.js +7 -49
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/cache-revalidation-handler.js +0 -10
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/decorator-handler.js +67 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/deduplication-handler.js +10 -29
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/redirect-handler.js +238 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/retry-handler.js +504 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/unwrap-handler.js +106 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/wrap-handler.js +105 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/cache.js +26 -79
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/decompress.js +3 -13
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/deduplicate.js +4 -5
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/dns.js +571 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/dump.js +99 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/redirect.js +21 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/response-error.js +95 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/retry.js +19 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/constants.js +531 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/utils.js +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-agent.js +232 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/mock-call-history.js +1 -1
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-client.js +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-errors.js +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-interceptor.js +209 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-pool.js +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-symbols.js +32 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-utils.js +486 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-agent.js +7 -25
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-recorder.js +3 -38
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/cache.js +10 -92
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/util/promise.js +28 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/runtime-features.js +34 -3
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/util/timers.js +425 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/cache.js +864 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/util.js +45 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/constants.js +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/index.js +199 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/parse.js +314 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/util.js +352 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/eventsource-stream.js +494 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/eventsource.js +501 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/util.js +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/LICENSE +21 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/body.js +509 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/constants.js +131 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/data-url.js +596 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/formdata-parser.js +586 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/formdata.js +259 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/global.js +40 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/headers.js +719 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/index.js +2413 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/request.js +1115 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/response.js +641 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/util.js +1522 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/infra/index.js +1 -16
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/webidl/index.js +21 -7
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/connection.js +339 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/constants.js +126 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/events.js +331 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/frame.js +133 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/permessage-deflate.js +105 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/receiver.js +507 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/sender.js +109 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/websocket/stream/websocketerror.js +10 -13
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/websocket/stream/websocketstream.js +14 -29
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/util.js +347 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/websocket.js +758 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/package.json +152 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/scripts/strip-comments.js +10 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/README.md +6 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/agent.d.ts +32 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/api.d.ts +43 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/balanced-pool.d.ts +30 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/cache.d.ts +36 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/client.d.ts +139 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/connector.d.ts +36 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/content-type.d.ts +21 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/cookies.d.ts +30 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/diagnostics-channel.d.ts +74 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/dispatcher.d.ts +275 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/errors.d.ts +177 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/eventsource.d.ts +66 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/fetch.d.ts +231 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/formdata.d.ts +114 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/global-dispatcher.d.ts +9 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/global-origin.d.ts +7 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/h2c-client.d.ts +6 -6
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/handlers.d.ts +14 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/header.d.ts +160 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/index.d.ts +91 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/interceptors.d.ts +82 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-agent.d.ts +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-client.d.ts +27 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-errors.d.ts +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-interceptor.d.ts +94 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-pool.d.ts +27 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/patch.d.ts +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/pool-stats.d.ts +19 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/pool.d.ts +41 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/proxy-agent.d.ts +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/readable.d.ts +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/retry-agent.d.ts +8 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/retry-handler.d.ts +125 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/round-robin-pool.d.ts +2 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/snapshot-agent.d.ts +0 -4
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/socks5-proxy-agent.d.ts +2 -4
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/util.d.ts +18 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/webidl.d.ts +347 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/websocket.d.ts +188 -0
- package/node_modules/@mytools/fst-platform/package.json +3 -3
- package/node_modules/@mytools/fst-platform/src/process.js +4 -1
- package/node_modules/@mytools/fst-platform/src/shell.js +46 -1
- package/node_modules/@mytools/fst-plugin/package.json +1 -1
- package/node_modules/@mytools/fst-plugin/src/host.js +31 -23
- package/node_modules/@mytools/fst-workflow/package.json +1 -1
- package/node_modules/@mytools/fst-workflow/src/engine.js +1 -1
- package/node_modules/@mytools/fst-workspace/README.md +2 -0
- package/node_modules/@mytools/fst-workspace/package.json +2 -1
- package/node_modules/@mytools/fst-workspace/src/plugin-registry.js +58 -0
- package/node_modules/@mytools/fst-workspace/src/plugins.js +7 -4
- package/node_modules/@mytools/fst-workspace/src/workflows.js +5 -3
- package/node_modules/@mytools/pack/package.json +3 -3
- package/node_modules/@mytools/pack/runtime-cache.js +26 -0
- package/node_modules/@mytools/pack/runtime.js +6 -10
- package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +953 -963
- package/node_modules/@npmcli/agent/lib/agents.js +0 -10
- package/node_modules/@npmcli/agent/package.json +12 -11
- package/node_modules/@npmcli/arborist/README.md +2 -2
- package/node_modules/@npmcli/arborist/bin/index.js +2 -1
- package/node_modules/@npmcli/arborist/bin/shrinkwrap.js +7 -0
- package/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js +25 -159
- package/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js +49 -11
- package/node_modules/@npmcli/arborist/lib/arborist/load-actual.js +0 -67
- package/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js +37 -5
- package/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +8 -15
- package/node_modules/@npmcli/arborist/lib/arborist/reify.js +42 -59
- package/node_modules/@npmcli/arborist/lib/consistent-resolve.js +1 -1
- package/node_modules/@npmcli/arborist/lib/diff.js +22 -17
- package/node_modules/@npmcli/arborist/lib/edge.js +2 -22
- package/node_modules/@npmcli/arborist/lib/index.js +0 -2
- package/node_modules/@npmcli/arborist/lib/isolated-classes.js +1 -4
- package/node_modules/@npmcli/arborist/lib/node.js +9 -13
- package/node_modules/@npmcli/arborist/lib/place-dep.js +0 -6
- package/node_modules/@npmcli/arborist/lib/printable.js +5 -0
- package/node_modules/@npmcli/arborist/lib/shrinkwrap.js +32 -55
- package/node_modules/@npmcli/arborist/package.json +26 -32
- package/node_modules/@npmcli/fs/lib/move-file.js +5 -5
- package/node_modules/@npmcli/fs/package.json +5 -5
- package/node_modules/@npmcli/git/package.json +12 -13
- package/node_modules/@npmcli/installed-package-contents/package.json +7 -7
- package/node_modules/@npmcli/map-workspaces/package.json +7 -7
- package/node_modules/@npmcli/metavuln-calculator/package.json +16 -10
- package/node_modules/@npmcli/name-from-folder/package.json +16 -13
- package/node_modules/@npmcli/node-gyp/package.json +5 -5
- package/node_modules/@npmcli/package-json/lib/index.js +1 -2
- package/node_modules/@npmcli/package-json/lib/normalize.js +22 -23
- package/node_modules/@npmcli/package-json/package.json +10 -11
- package/node_modules/@npmcli/promise-spawn/README.md +2 -1
- package/node_modules/@npmcli/promise-spawn/package.json +5 -5
- package/node_modules/@npmcli/redact/package.json +4 -4
- package/node_modules/@npmcli/run-script/lib/is-server-package.js +11 -0
- package/node_modules/@npmcli/run-script/lib/make-spawn-args.js +6 -5
- package/node_modules/@npmcli/run-script/lib/run-script-pkg.js +13 -4
- package/node_modules/@npmcli/run-script/lib/run-script.js +2 -1
- package/node_modules/@npmcli/run-script/package.json +11 -12
- package/node_modules/@sigstore/bundle/README.md +1 -1
- package/node_modules/@sigstore/bundle/dist/error.js +0 -1
- package/node_modules/@sigstore/bundle/package.json +2 -2
- package/node_modules/@sigstore/core/README.md +1 -1
- package/node_modules/@sigstore/core/dist/asn1/length.js +1 -12
- package/node_modules/@sigstore/core/dist/asn1/obj.js +7 -25
- package/node_modules/@sigstore/core/dist/asn1/parse.js +5 -24
- package/node_modules/@sigstore/core/package.json +2 -2
- package/node_modules/@sigstore/sign/README.md +1 -1
- package/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js +1 -1
- package/node_modules/@sigstore/sign/package.json +9 -9
- package/node_modules/@sigstore/tuf/README.md +1 -1
- package/node_modules/@sigstore/tuf/package.json +4 -4
- package/node_modules/@sigstore/tuf/seeds.json +1 -1
- package/node_modules/@sigstore/verify/README.md +1 -1
- package/node_modules/@sigstore/verify/dist/bundle/dsse.d.ts +0 -1
- package/node_modules/@sigstore/verify/dist/bundle/dsse.js +0 -6
- package/node_modules/@sigstore/verify/dist/bundle/message.d.ts +0 -1
- package/node_modules/@sigstore/verify/dist/bundle/message.js +0 -5
- package/node_modules/@sigstore/verify/dist/policy.d.ts +1 -1
- package/node_modules/@sigstore/verify/dist/policy.js +2 -0
- package/node_modules/@sigstore/verify/dist/shared.types.d.ts +1 -6
- package/node_modules/@sigstore/verify/dist/tlog/checkpoint.js +3 -17
- package/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js +4 -4
- package/node_modules/@sigstore/verify/dist/tlog/index.js +1 -13
- package/node_modules/@sigstore/verify/dist/tlog/merkle.js +1 -12
- package/node_modules/@sigstore/verify/dist/verifier.js +5 -13
- package/node_modules/@sigstore/verify/package.json +5 -5
- package/node_modules/@tufjs/models/package.json +3 -3
- package/node_modules/abbrev/package.json +8 -9
- package/node_modules/agent-base/dist/helpers.d.ts +5 -0
- package/node_modules/agent-base/dist/helpers.d.ts.map +1 -1
- package/node_modules/agent-base/dist/helpers.js +34 -5
- package/node_modules/agent-base/dist/helpers.js.map +1 -1
- package/node_modules/agent-base/dist/index.d.ts +5 -1
- package/node_modules/agent-base/dist/index.d.ts.map +1 -1
- package/node_modules/agent-base/dist/index.js +40 -8
- package/node_modules/agent-base/dist/index.js.map +1 -1
- package/node_modules/agent-base/package.json +12 -12
- package/node_modules/bin-links/README.md +4 -5
- package/node_modules/bin-links/lib/fix-bin.js +1 -3
- package/node_modules/bin-links/lib/index.js +16 -8
- package/node_modules/bin-links/lib/link-mans.js +53 -0
- package/node_modules/bin-links/package.json +12 -11
- package/node_modules/cacache/lib/content/write.js +0 -2
- package/node_modules/cacache/lib/entry-index.js +0 -3
- package/node_modules/cacache/lib/rm.js +0 -1
- package/node_modules/cacache/lib/util/tmp.js +1 -5
- package/node_modules/cacache/lib/verify.js +2 -2
- package/node_modules/cacache/package.json +7 -7
- package/node_modules/cmd-shim/lib/index.js +32 -67
- package/node_modules/cmd-shim/package.json +5 -5
- package/node_modules/hosted-git-info/README.md +1 -1
- package/node_modules/hosted-git-info/lib/parse-url.js +3 -1
- package/node_modules/hosted-git-info/package.json +4 -4
- package/node_modules/http-proxy-agent/dist/index.d.ts +5 -8
- package/node_modules/http-proxy-agent/dist/index.d.ts.map +1 -1
- package/node_modules/http-proxy-agent/dist/index.js +42 -26
- package/node_modules/http-proxy-agent/dist/index.js.map +1 -1
- package/node_modules/http-proxy-agent/package.json +14 -15
- package/node_modules/https-proxy-agent/dist/index.d.ts +5 -9
- package/node_modules/https-proxy-agent/dist/index.d.ts.map +1 -1
- package/node_modules/https-proxy-agent/dist/index.js +44 -98
- package/node_modules/https-proxy-agent/dist/index.js.map +1 -1
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +3 -0
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts.map +1 -1
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.js +10 -3
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -1
- package/node_modules/https-proxy-agent/package.json +15 -16
- package/node_modules/ignore-walk/package.json +4 -4
- package/node_modules/ini/package.json +5 -5
- package/node_modules/ip-address/README.md +70 -70
- package/node_modules/ip-address/dist/ipv6.js +7 -4
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.d.ts +3 -0
- package/node_modules/ip-address/dist/v6/constants.js +3 -0
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +2 -1
- package/node_modules/json-parse-even-better-errors/lib/index.js +1 -3
- package/node_modules/json-parse-even-better-errors/package.json +17 -13
- package/node_modules/make-fetch-happen/package.json +11 -11
- package/node_modules/minipass-fetch/package.json +4 -4
- package/node_modules/node-gyp/.release-please-manifest.json +1 -1
- package/node_modules/node-gyp/CHANGELOG.md +0 -102
- package/node_modules/node-gyp/README.md +2 -3
- package/node_modules/node-gyp/eslint.config.js +1 -4
- package/node_modules/node-gyp/gyp/.release-please-manifest.json +1 -1
- package/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +19 -14
- package/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +2 -7
- package/node_modules/node-gyp/gyp/pyproject.toml +1 -1
- package/node_modules/node-gyp/lib/build.js +6 -18
- package/node_modules/node-gyp/lib/create-config-gypi.js +0 -5
- package/node_modules/node-gyp/lib/node-gyp.js +2 -9
- package/node_modules/node-gyp/lib/rebuild.js +3 -3
- package/node_modules/node-gyp/package.json +9 -11
- package/node_modules/nopt/README.md +4 -2
- package/node_modules/nopt/lib/debug.js +5 -0
- package/node_modules/nopt/lib/nopt-lib.js +43 -7
- package/node_modules/nopt/lib/nopt.js +4 -2
- package/node_modules/nopt/lib/type-defs.js +13 -8
- package/node_modules/nopt/package.json +17 -15
- package/node_modules/npm-bundled/package.json +6 -6
- package/node_modules/npm-install-checks/package.json +5 -5
- package/node_modules/npm-normalize-package-bin/package.json +16 -13
- package/node_modules/npm-package-arg/package.json +7 -7
- package/node_modules/npm-packlist/README.md +30 -45
- package/node_modules/npm-packlist/lib/index.js +47 -115
- package/node_modules/npm-packlist/package.json +8 -10
- package/node_modules/npm-pick-manifest/package.json +19 -15
- package/node_modules/npm-registry-fetch/lib/errors.js +3 -8
- package/node_modules/npm-registry-fetch/package.json +12 -12
- package/node_modules/pacote/lib/dir.js +5 -60
- package/node_modules/pacote/lib/fetcher.js +0 -4
- package/node_modules/pacote/lib/git.js +3 -11
- package/node_modules/pacote/lib/util/add-git-sha.js +1 -1
- package/node_modules/pacote/package.json +18 -19
- package/node_modules/parse-conflict-json/package.json +6 -6
- package/node_modules/proc-log/package.json +4 -4
- package/node_modules/read-cmd-shim/lib/index.js +1 -1
- package/node_modules/read-cmd-shim/package.json +18 -14
- package/node_modules/sigstore/README.md +1 -1
- package/node_modules/sigstore/package.json +10 -10
- package/node_modules/socks-proxy-agent/dist/index.d.ts +3 -1
- package/node_modules/socks-proxy-agent/dist/index.d.ts.map +1 -1
- package/node_modules/socks-proxy-agent/dist/index.js +43 -17
- package/node_modules/socks-proxy-agent/dist/index.js.map +1 -1
- package/node_modules/socks-proxy-agent/package.json +15 -15
- package/node_modules/ssri/package.json +4 -4
- package/node_modules/tuf-js/dist/config.d.ts +2 -2
- package/node_modules/tuf-js/dist/fetcher.d.ts +4 -4
- package/node_modules/tuf-js/dist/fetcher.js +16 -55
- package/node_modules/tuf-js/dist/updater.js +2 -2
- package/node_modules/tuf-js/package.json +8 -8
- package/node_modules/undici/README.md +72 -405
- package/node_modules/undici/docs/docs/api/Agent.md +41 -252
- package/node_modules/undici/docs/docs/api/BalancedPool.md +48 -246
- package/node_modules/undici/docs/docs/api/CacheStorage.md +13 -171
- package/node_modules/undici/docs/docs/api/Client.md +139 -395
- package/node_modules/undici/docs/docs/api/Connector.md +35 -118
- package/node_modules/undici/docs/docs/api/ContentType.md +25 -65
- package/node_modules/undici/docs/docs/api/Cookies.md +47 -125
- package/node_modules/undici/docs/docs/api/Debug.md +31 -47
- package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +97 -409
- package/node_modules/undici/docs/docs/api/DispatchInterceptor.md +60 -0
- package/node_modules/undici/docs/docs/api/Dispatcher.md +1011 -500
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +96 -105
- package/node_modules/undici/docs/docs/api/Errors.md +28 -528
- package/node_modules/undici/docs/docs/api/EventSource.md +13 -326
- package/node_modules/undici/docs/docs/api/Fetch.md +24 -693
- package/node_modules/undici/docs/docs/api/MockAgent.md +264 -346
- package/node_modules/undici/docs/docs/api/MockClient.md +31 -153
- package/node_modules/undici/docs/docs/api/MockErrors.md +5 -56
- package/node_modules/undici/docs/docs/api/MockPool.md +253 -324
- package/node_modules/undici/docs/docs/api/Pool.md +41 -235
- package/node_modules/undici/docs/docs/api/PoolStats.md +13 -119
- package/node_modules/undici/docs/docs/api/ProxyAgent.md +81 -198
- package/node_modules/undici/docs/docs/api/RedirectHandler.md +58 -238
- package/node_modules/undici/docs/docs/api/RetryAgent.md +28 -119
- package/node_modules/undici/docs/docs/api/RetryHandler.md +78 -161
- package/node_modules/undici/docs/docs/api/Util.md +11 -68
- package/node_modules/undici/docs/docs/api/WebSocket.md +24 -509
- package/node_modules/undici/docs/docs/api/api-lifecycle.md +33 -101
- package/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -2
- package/node_modules/undici/docs/docs/best-practices/mocking-request.md +2 -58
- package/node_modules/undici/docs/docs/best-practices/proxy.md +1 -3
- package/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -45
- package/node_modules/undici/index-fetch.js +4 -34
- package/node_modules/undici/index.d.ts +1 -1
- package/node_modules/undici/index.js +20 -87
- package/node_modules/undici/lib/api/abort-signal.js +0 -2
- package/node_modules/undici/lib/api/api-connect.js +11 -15
- package/node_modules/undici/lib/api/api-pipeline.js +19 -33
- package/node_modules/undici/lib/api/api-request.js +59 -89
- package/node_modules/undici/lib/api/api-stream.js +64 -114
- package/node_modules/undici/lib/api/api-upgrade.js +13 -26
- package/node_modules/undici/lib/api/readable.js +87 -317
- package/node_modules/undici/lib/api/util.js +93 -0
- package/node_modules/undici/lib/core/connect.js +125 -77
- package/node_modules/undici/lib/core/constants.js +9 -11
- package/node_modules/undici/lib/core/diagnostics.js +129 -154
- package/node_modules/undici/lib/core/errors.js +50 -122
- package/node_modules/undici/lib/core/request.js +87 -172
- package/node_modules/undici/lib/core/symbols.js +2 -14
- package/node_modules/undici/lib/core/tree.js +2 -10
- package/node_modules/undici/lib/core/util.js +190 -481
- package/node_modules/undici/lib/dispatcher/agent.js +35 -83
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +38 -46
- package/node_modules/undici/lib/dispatcher/client-h1.js +199 -492
- package/node_modules/undici/lib/dispatcher/client-h2.js +380 -1409
- package/node_modules/undici/lib/dispatcher/client.js +130 -253
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +52 -50
- package/node_modules/undici/lib/dispatcher/dispatcher.js +24 -17
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +45 -75
- package/node_modules/undici/lib/dispatcher/fixed-queue.js +50 -68
- package/node_modules/undici/lib/dispatcher/pool-base.js +54 -153
- package/node_modules/undici/lib/dispatcher/pool-stats.js +34 -0
- package/node_modules/undici/lib/dispatcher/pool.js +16 -135
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +41 -175
- package/node_modules/undici/lib/dispatcher/retry-agent.js +0 -3
- package/node_modules/undici/lib/global.js +9 -59
- package/node_modules/undici/lib/handler/decorator-handler.js +15 -43
- package/node_modules/undici/lib/handler/redirect-handler.js +116 -127
- package/node_modules/undici/lib/handler/retry-handler.js +182 -398
- package/node_modules/undici/lib/interceptor/dns.js +47 -254
- package/node_modules/undici/lib/interceptor/dump.js +56 -32
- package/node_modules/undici/lib/interceptor/redirect-interceptor.js +21 -0
- package/node_modules/undici/lib/interceptor/redirect.js +14 -11
- package/node_modules/undici/lib/interceptor/response-error.js +22 -31
- package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/undici/lib/llhttp/constants.js +193 -446
- package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -11
- package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -11
- package/node_modules/undici/lib/llhttp/utils.js +12 -9
- package/node_modules/undici/lib/mock/mock-agent.js +22 -106
- package/node_modules/undici/lib/mock/mock-client.js +4 -13
- package/node_modules/undici/lib/mock/mock-errors.js +2 -3
- package/node_modules/undici/lib/mock/mock-interceptor.js +13 -33
- package/node_modules/undici/lib/mock/mock-pool.js +4 -13
- package/node_modules/undici/lib/mock/mock-symbols.js +1 -10
- package/node_modules/undici/lib/mock/mock-utils.js +51 -404
- package/node_modules/undici/lib/mock/pluralizer.js +29 -0
- package/node_modules/undici/lib/util/timers.js +9 -11
- package/node_modules/undici/lib/web/cache/cache.js +51 -63
- package/node_modules/undici/lib/web/cache/cachestorage.js +7 -13
- package/node_modules/undici/lib/web/cache/symbols.js +5 -0
- package/node_modules/undici/lib/web/cookies/index.js +18 -45
- package/node_modules/undici/lib/web/cookies/parse.js +149 -157
- package/node_modules/undici/lib/web/cookies/util.js +2 -4
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +9 -37
- package/node_modules/undici/lib/web/eventsource/eventsource.js +64 -108
- package/node_modules/undici/lib/web/eventsource/util.js +5 -28
- package/node_modules/undici/lib/web/fetch/body.js +148 -173
- package/node_modules/undici/lib/web/fetch/constants.js +6 -13
- package/node_modules/undici/lib/web/fetch/data-url.js +167 -19
- package/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +46 -0
- package/node_modules/undici/lib/web/fetch/file.js +126 -0
- package/node_modules/undici/lib/web/fetch/formdata-parser.js +117 -229
- package/node_modules/undici/lib/web/fetch/formdata.js +65 -85
- package/node_modules/undici/lib/web/fetch/headers.js +108 -143
- package/node_modules/undici/lib/web/fetch/index.js +446 -627
- package/node_modules/undici/lib/web/fetch/request.js +115 -217
- package/node_modules/undici/lib/web/fetch/response.js +82 -110
- package/node_modules/undici/lib/web/fetch/symbols.js +9 -0
- package/node_modules/undici/lib/web/fetch/util.js +393 -291
- package/node_modules/undici/lib/web/fetch/webidl.js +695 -0
- package/node_modules/undici/lib/web/fileapi/encoding.js +290 -0
- package/node_modules/undici/lib/web/fileapi/filereader.js +344 -0
- package/node_modules/undici/lib/web/fileapi/progressevent.js +78 -0
- package/node_modules/undici/lib/web/fileapi/symbols.js +10 -0
- package/node_modules/undici/lib/web/fileapi/util.js +391 -0
- package/node_modules/undici/lib/web/websocket/connection.js +160 -139
- package/node_modules/undici/lib/web/websocket/constants.js +10 -70
- package/node_modules/undici/lib/web/websocket/events.js +30 -49
- package/node_modules/undici/lib/web/websocket/frame.js +20 -51
- package/node_modules/undici/lib/web/websocket/receiver.js +87 -83
- package/node_modules/undici/lib/web/websocket/sender.js +13 -18
- package/node_modules/undici/lib/web/websocket/symbols.js +12 -0
- package/node_modules/undici/lib/web/websocket/util.js +90 -115
- package/node_modules/undici/lib/web/websocket/websocket.js +171 -359
- package/node_modules/undici/package.json +57 -49
- package/node_modules/undici/scripts/strip-comments.js +1 -3
- package/node_modules/undici/types/agent.d.ts +13 -12
- package/node_modules/undici/types/api.d.ts +26 -26
- package/node_modules/undici/types/balanced-pool.d.ts +12 -13
- package/node_modules/undici/types/client.d.ts +39 -98
- package/node_modules/undici/types/connector.d.ts +2 -5
- package/node_modules/undici/types/cookies.d.ts +1 -3
- package/node_modules/undici/types/diagnostics-channel.d.ts +11 -20
- package/node_modules/undici/types/dispatcher.d.ts +139 -136
- package/node_modules/undici/types/env-http-proxy-agent.d.ts +3 -4
- package/node_modules/undici/types/errors.d.ts +54 -86
- package/node_modules/undici/types/eventsource.d.ts +4 -9
- package/node_modules/undici/types/fetch.d.ts +25 -51
- package/node_modules/undici/types/file.d.ts +39 -0
- package/node_modules/undici/types/filereader.d.ts +54 -0
- package/node_modules/undici/types/formdata.d.ts +7 -7
- package/node_modules/undici/types/global-dispatcher.d.ts +4 -4
- package/node_modules/undici/types/global-origin.d.ts +5 -5
- package/node_modules/undici/types/handlers.d.ts +9 -10
- package/node_modules/undici/types/header.d.ts +1 -162
- package/node_modules/undici/types/index.d.ts +47 -69
- package/node_modules/undici/types/interceptors.d.ts +12 -62
- package/node_modules/undici/types/mock-agent.d.ts +27 -46
- package/node_modules/undici/types/mock-client.d.ts +4 -6
- package/node_modules/undici/types/mock-errors.d.ts +3 -3
- package/node_modules/undici/types/mock-interceptor.d.ts +21 -26
- package/node_modules/undici/types/mock-pool.d.ts +4 -6
- package/node_modules/undici/types/patch.d.ts +4 -0
- package/node_modules/undici/types/pool-stats.d.ts +8 -8
- package/node_modules/undici/types/pool.d.ts +14 -14
- package/node_modules/undici/types/proxy-agent.d.ts +6 -13
- package/node_modules/undici/types/readable.d.ts +16 -19
- package/node_modules/undici/types/retry-agent.d.ts +1 -1
- package/node_modules/undici/types/retry-handler.d.ts +9 -18
- package/node_modules/undici/types/util.d.ts +3 -3
- package/node_modules/undici/types/webidl.d.ts +32 -156
- package/node_modules/undici/types/websocket.d.ts +10 -48
- package/node_modules/validate-npm-package-name/package.json +4 -4
- package/node_modules/which/package.json +4 -4
- package/node_modules/write-file-atomic/package.json +4 -4
- package/package.json +56 -60
- package/node_modules/@npmcli/arborist/lib/npm-extension.js +0 -237
- package/node_modules/@npmcli/arborist/lib/package-extensions.js +0 -236
- package/node_modules/@npmcli/arborist/lib/patch.js +0 -111
- package/node_modules/@npmcli/arborist/lib/patched-dependencies.js +0 -168
- package/node_modules/cacache/lib/util/cache-dir.js +0 -29
- package/node_modules/diff/CONTRIBUTING.md +0 -28
- package/node_modules/diff/LICENSE +0 -29
- package/node_modules/diff/README.md +0 -388
- package/node_modules/diff/dist/diff.js +0 -1782
- package/node_modules/diff/dist/diff.min.js +0 -1
- package/node_modules/diff/eslint.config.mjs +0 -182
- package/node_modules/diff/libcjs/convert/dmp.d.ts +0 -8
- package/node_modules/diff/libcjs/convert/dmp.d.ts.map +0 -1
- package/node_modules/diff/libcjs/convert/dmp.js +0 -24
- package/node_modules/diff/libcjs/convert/xml.d.ts +0 -6
- package/node_modules/diff/libcjs/convert/xml.d.ts.map +0 -1
- package/node_modules/diff/libcjs/convert/xml.js +0 -34
- package/node_modules/diff/libcjs/diff/array.d.ts +0 -19
- package/node_modules/diff/libcjs/diff/array.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/array.js +0 -40
- package/node_modules/diff/libcjs/diff/base.d.ts +0 -20
- package/node_modules/diff/libcjs/diff/base.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/base.js +0 -265
- package/node_modules/diff/libcjs/diff/character.d.ts +0 -19
- package/node_modules/diff/libcjs/diff/character.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/character.js +0 -31
- package/node_modules/diff/libcjs/diff/css.d.ts +0 -18
- package/node_modules/diff/libcjs/diff/css.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/css.js +0 -34
- package/node_modules/diff/libcjs/diff/json.d.ts +0 -24
- package/node_modules/diff/libcjs/diff/json.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/json.js +0 -105
- package/node_modules/diff/libcjs/diff/line.d.ts +0 -24
- package/node_modules/diff/libcjs/diff/line.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/line.js +0 -89
- package/node_modules/diff/libcjs/diff/sentence.d.ts +0 -21
- package/node_modules/diff/libcjs/diff/sentence.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/sentence.js +0 -67
- package/node_modules/diff/libcjs/diff/word.d.ts +0 -35
- package/node_modules/diff/libcjs/diff/word.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/word.js +0 -312
- package/node_modules/diff/libcjs/index.d.ts +0 -20
- package/node_modules/diff/libcjs/index.d.ts.map +0 -1
- package/node_modules/diff/libcjs/index.js +0 -64
- package/node_modules/diff/libcjs/package.json +0 -1
- package/node_modules/diff/libcjs/patch/apply.d.ts +0 -62
- package/node_modules/diff/libcjs/patch/apply.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/apply.js +0 -267
- package/node_modules/diff/libcjs/patch/create.d.ts +0 -122
- package/node_modules/diff/libcjs/patch/create.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/create.js +0 -251
- package/node_modules/diff/libcjs/patch/line-endings.d.ts +0 -17
- package/node_modules/diff/libcjs/patch/line-endings.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/line-endings.js +0 -61
- package/node_modules/diff/libcjs/patch/parse.d.ts +0 -8
- package/node_modules/diff/libcjs/patch/parse.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/parse.js +0 -150
- package/node_modules/diff/libcjs/patch/reverse.d.ts +0 -9
- package/node_modules/diff/libcjs/patch/reverse.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/reverse.js +0 -37
- package/node_modules/diff/libcjs/types.d.ts +0 -213
- package/node_modules/diff/libcjs/types.d.ts.map +0 -1
- package/node_modules/diff/libcjs/types.js +0 -2
- package/node_modules/diff/libcjs/util/array.d.ts +0 -3
- package/node_modules/diff/libcjs/util/array.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/array.js +0 -21
- package/node_modules/diff/libcjs/util/distance-iterator.d.ts +0 -2
- package/node_modules/diff/libcjs/util/distance-iterator.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/distance-iterator.js +0 -40
- package/node_modules/diff/libcjs/util/params.d.ts +0 -4
- package/node_modules/diff/libcjs/util/params.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/params.js +0 -17
- package/node_modules/diff/libcjs/util/string.d.ts +0 -30
- package/node_modules/diff/libcjs/util/string.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/string.js +0 -200
- package/node_modules/diff/libesm/convert/dmp.d.ts +0 -8
- package/node_modules/diff/libesm/convert/dmp.d.ts.map +0 -1
- package/node_modules/diff/libesm/convert/dmp.js +0 -21
- package/node_modules/diff/libesm/convert/xml.d.ts +0 -6
- package/node_modules/diff/libesm/convert/xml.d.ts.map +0 -1
- package/node_modules/diff/libesm/convert/xml.js +0 -31
- package/node_modules/diff/libesm/diff/array.d.ts +0 -19
- package/node_modules/diff/libesm/diff/array.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/array.js +0 -16
- package/node_modules/diff/libesm/diff/base.d.ts +0 -20
- package/node_modules/diff/libesm/diff/base.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/base.js +0 -253
- package/node_modules/diff/libesm/diff/character.d.ts +0 -19
- package/node_modules/diff/libesm/diff/character.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/character.js +0 -7
- package/node_modules/diff/libesm/diff/css.d.ts +0 -18
- package/node_modules/diff/libesm/diff/css.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/css.js +0 -10
- package/node_modules/diff/libesm/diff/json.d.ts +0 -24
- package/node_modules/diff/libesm/diff/json.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/json.js +0 -78
- package/node_modules/diff/libesm/diff/line.d.ts +0 -24
- package/node_modules/diff/libesm/diff/line.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/line.js +0 -65
- package/node_modules/diff/libesm/diff/sentence.d.ts +0 -21
- package/node_modules/diff/libesm/diff/sentence.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/sentence.js +0 -43
- package/node_modules/diff/libesm/diff/word.d.ts +0 -35
- package/node_modules/diff/libesm/diff/word.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/word.js +0 -281
- package/node_modules/diff/libesm/index.d.ts +0 -20
- package/node_modules/diff/libesm/index.d.ts.map +0 -1
- package/node_modules/diff/libesm/index.js +0 -30
- package/node_modules/diff/libesm/package.json +0 -1
- package/node_modules/diff/libesm/patch/apply.d.ts +0 -62
- package/node_modules/diff/libesm/patch/apply.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/apply.js +0 -257
- package/node_modules/diff/libesm/patch/create.d.ts +0 -122
- package/node_modules/diff/libesm/patch/create.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/create.js +0 -228
- package/node_modules/diff/libesm/patch/line-endings.d.ts +0 -17
- package/node_modules/diff/libesm/patch/line-endings.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/line-endings.js +0 -44
- package/node_modules/diff/libesm/patch/parse.d.ts +0 -8
- package/node_modules/diff/libesm/patch/parse.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/parse.js +0 -147
- package/node_modules/diff/libesm/patch/reverse.d.ts +0 -9
- package/node_modules/diff/libesm/patch/reverse.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/reverse.js +0 -23
- package/node_modules/diff/libesm/types.d.ts +0 -213
- package/node_modules/diff/libesm/types.d.ts.map +0 -1
- package/node_modules/diff/libesm/types.js +0 -1
- package/node_modules/diff/libesm/util/array.d.ts +0 -3
- package/node_modules/diff/libesm/util/array.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/array.js +0 -17
- package/node_modules/diff/libesm/util/distance-iterator.d.ts +0 -2
- package/node_modules/diff/libesm/util/distance-iterator.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/distance-iterator.js +0 -37
- package/node_modules/diff/libesm/util/params.d.ts +0 -4
- package/node_modules/diff/libesm/util/params.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/params.js +0 -14
- package/node_modules/diff/libesm/util/string.d.ts +0 -30
- package/node_modules/diff/libesm/util/string.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/string.js +0 -184
- package/node_modules/diff/package.json +0 -130
- package/node_modules/diff/release-notes.md +0 -432
- package/node_modules/node-gyp/commitlint.config.mjs +0 -3
- package/node_modules/node-gyp/gyp/commitlint.config.js +0 -6
- package/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake_test.py +0 -105
- package/node_modules/node-gyp/zizmor.yml +0 -5
- package/node_modules/proxy-agent-negotiate/dist/index.d.ts +0 -14
- package/node_modules/proxy-agent-negotiate/dist/index.d.ts.map +0 -1
- package/node_modules/proxy-agent-negotiate/dist/index.js +0 -35
- package/node_modules/proxy-agent-negotiate/dist/index.js.map +0 -1
- package/node_modules/proxy-agent-negotiate/package.json +0 -47
- package/node_modules/undici/docs/docs/api/CacheStore.md +0 -360
- package/node_modules/undici/docs/docs/api/ClientStats.md +0 -93
- package/node_modules/undici/docs/docs/api/GlobalInstallation.md +0 -121
- package/node_modules/undici/docs/docs/api/H2CClient.md +0 -385
- package/node_modules/undici/docs/docs/api/Interceptors.md +0 -419
- package/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -371
- package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -206
- package/node_modules/undici/docs/docs/api/RoundRobinPool.md +0 -239
- package/node_modules/undici/docs/docs/api/SnapshotAgent.md +0 -361
- package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +0 -256
- package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +0 -233
- package/node_modules/undici/docs/docs/getting-started.md +0 -281
- package/node_modules/undici/docs/docs/site.json +0 -125
- package/node_modules/undici/docs/docs/type-map.json +0 -79
- package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +0 -110
- package/node_modules/undici/types/dispatcher1-wrapper.d.ts +0 -7
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/core/socks5-client.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/core/socks5-utils.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/encoding/index.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/llhttp/constants.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/llhttp/utils.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-utils.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/date.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/stats.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/subresource-integrity/Readme.md +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/subresource-integrity/subresource-integrity.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/cache-interceptor.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/client-stats.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/mock-call-history.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/utility.d.ts +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Issue #5:插件范围、生成文件与执行记录
|
|
2
|
+
|
|
3
|
+
来源:[发现严重缺陷](https://github.com/yanglaofish/Fishtools/issues/5)。已读取正文、完整评论列表(当前无评论)以及私有附件截图;截图确实显示 `environment-report.md/json` 保存到工作区 `.flow/runs/运行ID/`。
|
|
4
|
+
|
|
5
|
+
## 事实与修改范围
|
|
6
|
+
|
|
7
|
+
- 用户确认普通安装应全局可用。CLI/TUI 默认安装和链接到用户级插件库,普通工作区自动读取同一份插件版本。工作流、插件参数、代理规则和运行状态仍由各工作区保存。
|
|
8
|
+
- 已有工作区安装兼容读取;同名全局插件优先。全局卸载后不自动复活旧工作区同名版本。未配置的全局插件显示“待配置”,不能阻止无关工作区启动。卸载检查已登记工作区的工作流引用,原插件状态保留恢复备份,活动安装批次由租约保护。
|
|
9
|
+
- 离线分发包继续使用包内代码快照及其可写工作区,不读取机器上的全局插件库。程序调用 `createApplication` 可通过 `pluginRegistryDir` 接入共享库;未传时保留原有工作区安装兼容行为。
|
|
10
|
+
- 插件 `ctx.outputDir` 与日志目录相同是实际问题。新增真实插件探针保存 `result.json` 时,业务文件会被内核的同名记录覆盖;这构成数据覆盖风险。
|
|
11
|
+
- 新运行的业务文件改为工作区 `results/运行ID/`,每次运行独立;日志继续在 `.flow/runs/运行ID/`。显式 `--output` 或 `FLOW_OUTPUT_DIR` 的日志路径保持兼容,业务文件放到其 `files/运行ID/`。只读运行包使用可写输出目录。
|
|
12
|
+
- `ctx.outputDir` 继续表示可写业务输出目录,新增 `ctx.logDir` 明确日志路径;`app.outputDir` 继续指向日志根,`app.resultsDir` 表示业务结果根。插件仍须通过返回值或 `print()` 报告文件路径。
|
|
13
|
+
- 不移动、覆盖或删除历史目录与业务文件;日志保留策略继续只清理日志,不清理新业务结果。只移除本次创建且保持为空的结果目录。
|
|
14
|
+
- 暂无重复运行记录的证据:真实工作流内嵌子工作流和插件动作仍只生成一条顶层记录。原列表混列不同入口且没有会话标识,确实难以区分。
|
|
15
|
+
- 新记录保留执行类型、名称与应用启动会话。TUI 标明四类入口及本次/历史启动,支持筛选本次启动、工作流、插件调用或系统命令;默认显示最近 20 条,可继续加载。旧记录可读,按旧目标标识推断类型,不推断未知会话。
|
|
16
|
+
|
|
17
|
+
## 验证
|
|
18
|
+
|
|
19
|
+
先补失败探针,确认业务文件与日志隔离、同名文件不覆盖、日志清理保留结果、空目录回收、嵌套调用不重复记录、类型与会话在重启后持久可读、TUI 筛选准确。
|
|
20
|
+
修改后覆盖原有日志写入失败注入、实时落盘、保留策略与 TUI 会话回归。日志故障注入明确操作 `logDir`,不再通过业务输出同名文件模拟故障。
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
Windows 默认使用 Windows PowerShell,Linux 默认使用 sh。命令按照所选 Shell 的语法解释;管道、引号、重定向和换行保持原样。此入口适合无需交互输入的命令,暂不接管需要 stdin 或全屏界面的程序。
|
|
8
8
|
|
|
9
|
+
Windows 自动模式下,简单单行 `!ipconfig`、`!ipconfig /all` 使用系统程序及其 OEM 编码,中文输出可以直接在主面板阅读,不改变主终端编码。含管道、展开或重定向的复杂脚本继续按 PowerShell 语法执行;其他程序仍保留 UTF-8 输出,不能把整个混合脚本统一按 GBK 解释。当前自动适配支持系统代码页 866、874、932、936、949、950、65001,其他代码页沿用原 Shell。
|
|
10
|
+
|
|
9
11
|
## 多行编辑
|
|
10
12
|
|
|
11
13
|
| 按键 | 行为 |
|
|
@@ -31,6 +33,8 @@ Windows PowerShell 请使用其续行符反引号或括号语法,也可粘贴
|
|
|
31
33
|
|
|
32
34
|
输入 `/commands` → **注册常用命令**,填写名称和命令文本,选择保存即可。名称合法时自动建立同名快捷入口。例如 Linux 中注册“查看本机IP”,文本填 `ifconfig`,以后输入 `/查看本机IP` 就能运行。目标机器需已经安装 `ifconfig`;也可注册机器实际具备的 `ip address` 或 Windows `ipconfig`。
|
|
33
35
|
|
|
36
|
+
编辑已有命令或快捷名称后,内容没有变化时直接返回,不创建备份、不重启插件;已有命令未设置快捷名称时也不会自动补上。只在新注册命令时按合法名称建立默认快捷入口。
|
|
37
|
+
|
|
34
38
|
高级设置可选择 Shell、超时时间、参数及 Linux root 权限要求。超时时间为秒,`0` 表示不限时。root 需求会在执行前检查,工具不会自动提权。修改命令仍保留原有动作 ID,已保存工作流继续引用它;被工作流使用的命令不能直接删除,需先调整引用。
|
|
35
39
|
|
|
36
40
|
不填写参数时无需编写输入 schema,也不会弹出空 JSON 输入框。需要参数时添加简单字段(文本、数字、是/否,可设置默认值及必填),脚本通过环境变量读取:
|
|
@@ -59,6 +63,10 @@ Write-Output $env:FST_INPUT_name
|
|
|
59
63
|
|
|
60
64
|
常用命令和快捷名称保存在 `flow.project.json` 的 `commandPresets`、`shortcuts` 字段。修改前原文件备份到 `.flow/backups/`,同一字段被其他实例改动时拒绝覆盖并提示重新打开工作区。
|
|
61
65
|
|
|
66
|
+
`/logs` 中每次顶层执行只有一条记录,标明工作流、插件动作、插件命令或系统命令,可筛选本次启动的执行或某类调用。条件、并行和子工作流的内部步骤放在同一条运行记录里;菜单浏览及本次 TUI 命令历史不会产生持久化运行记录。旧记录继续可读,没有会话标识的旧记录不冒充本次启动。
|
|
67
|
+
|
|
68
|
+
输入与反馈另外保存为 TUI 会话:`/history` 可恢复并继续,或分页阅读完整交互;不会重跑历史指令。工作区内 `.flow/sessions/` 保存快照与追加日志,只读包保存到可写日志目录下。恢复近期面板和命令历史,较大结果和完整指令执行过程从 `/logs` 读取;在详情中按 m 格式化阅读,j 查看原始诊断。
|
|
69
|
+
|
|
62
70
|
命令快捷项由界面同时保存 `command` 与目标 `plugin` 标识,以免同名能力接管入口;填写参数和确认权限后,执行前再次核对提供者身份。配置 API 可为新建或改变目标的快捷名补齐当前提供者;手工导入却未提供 `plugin` 的旧项需重新选择目标,修改名称、默认参数或保存其他设置都不会顺带启用它。保存或复制工作流草稿时也会核对最新注册项,避免另一实例删除命令后保存悬空引用。
|
|
63
71
|
|
|
64
72
|
导出选定工作流时携带其使用的命令定义和相关快捷名称;便携工作台携带全部注册能力。导出后的可编辑工作区可修改并再次导出;只读运行包可以执行,不能修改。外部程序和 Shell 需由目标机器提供,不会因为注册命令就把它们包含在包内。
|
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# 验收记录
|
|
2
2
|
|
|
3
|
+
## 0.5.3 全局插件、结果保护与准确提示(2026-10-13)
|
|
4
|
+
|
|
5
|
+
- 分支 `codex/issue-4-node-compat`,固定基线 `46a897450e122054dcfab882de5be061b311570f`;读取 issue #4 正文、评论及截图和 issue #5 正文及截图,采用用户确认的普通插件全局安装范围。
|
|
6
|
+
- 实际复现业务 `result.json` 被内核记录覆盖,新增独立 `results/运行ID/`,日志保留只作用于日志;类型、名称及启动会话随执行记录保存,嵌套调用仍只生成一条顶层记录。历史业务文件没有移动或删除。
|
|
7
|
+
- 全局安装和开发链接在多个工作区共享,参数仍由工作区保存;配置缺失只影响对应插件及其消费者。测试覆盖并发状态、跨工作区引用、待配置启用、全局开发监听和离线分发隔离。
|
|
8
|
+
- TUI 全面核对工作流脏状态、备份删除、无实际修改的配置保存、默认值、完成任务取消入口及草稿打包提示。只保留与实际状态相符的提醒。
|
|
9
|
+
- Standards / Spec 两轴独立审查共确认 3 个不同问题,均补失败探针后修正:活动旧安装目录的租约、跨工作区本地消费者的间接依赖、被全局覆盖或屏蔽的旧源码导入。额外自检统一待配置项静态校验;相关回归 **71/71** 通过,详见[审查记录](superpowers/reviews/2026-10-13-0.5.3-review.md)。
|
|
10
|
+
- 全局插件阶段 `npm run dist:npm` 成功,本地归档 **9,825,324 字节、284 个生产包**。Windows/Node 24.15.0 完整测试 **536 项:534 通过、0 失败、2 跳过**,201.7 秒,使用该阶段归档验证离线安装、脱离源码运行及再次导出。
|
|
11
|
+
- Node 22.12.0 的 Windows 再导出试验多次出现原生进程崩溃,没有确认其底层原因;22.22.2 与 24.11.1 的同一测试通过。产品声明为 `^22.22.2 || >=24.0.0`,便携版仍固定使用经过 SHA 校验的 Node 24.15.0。
|
|
12
|
+
- 验收脚本适配 npm 11.19.1 发布预演按包名返回的 JSON;实际安装仍使用 `--engine-strict`,不放宽不兼容依赖检查。完整兼容验收与正式发布结果完成后追加。
|
|
13
|
+
- 后续合入用户要求的可读步骤、指令追踪、结果渲染、面板计时、完整会话恢复、TUI 内平台提示和 Windows 中文 ipconfig。独立 Standards / Spec 复核均无剩余发布阻塞问题,详见[增量审查记录](superpowers/reviews/2026-10-13-tui-sessions-review.md)。
|
|
14
|
+
- 实际 TUI 处理路径执行 `!ipconfig` 与 `!ipconfig /all` 均显示中文,替换字符 0 个,stdout 流与同次返回正文一致。日志收尾失败、历史磁盘优先及关闭页面内存回收均经历失败复现再修复;最终相关回归 Node 24.15.0 **27/27**、Node 22.22.2 **34/34**。
|
|
15
|
+
- 可读会话阶段完整回归 **576 项:574 通过、0 失败、2 跳过**,185.4 秒;后续历史优先及 GC 专项修正通过上述定向回归。正式发布从最终提交重建同一归档,在支持的平台和 Node 版本执行完整验收后才上传 npm。
|
|
16
|
+
- 首次正式发布验收的 Windows / Node 24.0 出现日志文件身份误判,调查发现官方源码中路径和句柄查询的卷编号宽度不同;其余 7 组完整兼容验收及双平台便携包通过,发布步骤跳过,npm 0.5.3 尚未上传。修复保持完整 BigInt 文件 ID,并统一 Windows 卷编号低 32 位;两轴独立复核均无阻塞。本地相关用例在 24.0 与 24.15 各 41 通过、1 跳过,正式原平台复跑待完成。
|
|
17
|
+
- Linux 停止进程的测试探针遇到进程已退出但 `/proc` 读取返回 ESRCH 的竞争窗口;将 ESRCH 与 ENOENT 同样视为已退出,其余错误继续传播,存活及心跳业务断言保留。[四组主分支 CI](https://github.com/yanglaofish/Fishtools/actions/runs/38393256411) 已全部通过。
|
|
18
|
+
- Windows / Node 24.0 后续本地完整回归 580 项:577 通过、1 失败、2 跳过;唯一失败为有效打包缓存仍被截断重写导致并发读到半成品。增加失败断言后修复为缓存命中只读、冷缓存先校验再原子替换,Node 24.0 定向 7/7 通过。最终完整验收及发布结果完成后追加,不把该次失败记录当作通过证据。
|
|
19
|
+
- Windows 并发原子替换的 EPERM 经独立探针复现并修正,仅接受目标完整内容完全相同的胜出缓存,真实替换错误仍传播。最终缓存回归 Node 24.0 与 24.15 各 4/4 通过。
|
|
20
|
+
- 缓存及文件身份修复后的最终本地 Node 24.0 完整回归 **584 项:582 通过、0 失败、2 跳过**,214.9 秒。`dist:npm` 生成 **9,855,545 字节、284 个生产包**的本地归档,完整测试使用该归档执行离线安装与再次导出;最终文档归档后正式发布流程会从 tag 重新生成并对同一发行归档执行完整矩阵。
|
|
21
|
+
- [第二次正式验收](https://github.com/yanglaofish/Fishtools/actions/runs/38397457051)中,其余 6 组兼容验收与双平台便携包通过,发布步骤仍跳过。Windows / Node 24.0 的真实诊断为路径设备编号 `0`、句柄设备编号 `742408122`,完整文件 ID 同为 `7036874418249441`;因此此前卷编号宽度推断不足以解释此平台失败。新增第二个只读路径句柄,严格比较两个句柄的完整 BigInt 身份,并重新检查路径仍为普通非链接文件;不把未知编号 `0` 当成通配符,原归属及读取预算继续生效。
|
|
22
|
+
- 同次 Windows / Node 24.11.1 唯一失败为 Web 测试过早断言仍运行中的任务。只把约 600 毫秒的固定轮询改为 10 秒内等待真实结束;成功状态、输出、鉴权和路由断言保留。
|
|
23
|
+
- 上述增量包含真实路径替换拒绝和链接拒绝探针。Windows 本地 Node 24.0、24.11.1、24.15.0 各执行同一组定向回归 **54 项:52 通过、0 失败、2 项文件链接权限跳过**。新增 Windows 24.0/24.11 定向 CI,保留原全量矩阵,真实失败文件系统及最终发行归档复验待完成。
|
|
24
|
+
- 新增定向 CI 首次提交因 job 级 `env` 无法使用 `runner.temp` 而未启动测试;按 GitHub 官方上下文范围把隔离目录变量移至测试步骤级,不改变测试内容和原全量门禁,重新执行远端验收。
|
|
25
|
+
|
|
3
26
|
## 0.5.2 命令注册与快捷名称(2026-10-13)
|
|
4
27
|
|
|
5
28
|
- 分支 `codex/0.5.2-command-shortcuts`,固定基线 `68a84cd`;按用户指定目标集中实现 `!` 系统命令、`/commands` 注册动作、`/shortcuts` 任意动作或命令的中文快捷名称与默认参数。
|
|
@@ -18,6 +41,13 @@
|
|
|
18
41
|
合入后本地重建归档 **9,806,640 字节、285 个生产包**,指定该归档完整 `npm test` **489 项:487 通过、0 失败、2 跳过**,186.3 秒。
|
|
19
42
|
补充范围 `8223bad...c567534` 的独立 Standards / Spec 复审均通过,新增确认问题均为 0。
|
|
20
43
|
最终双平台验收重新执行,完成后核对正式发布产物;待发布 tag 更新前检查旧对象和未发布状态,不覆盖已发布版本。
|
|
44
|
+
- 合入后的 [正式发布流程](https://github.com/yanglaofish/Fishtools/actions/runs/38361266757)全部成功;同一 npm 归档在 Windows 和 Ubuntu 均为 **489 项:488 通过、0 失败、1 项平台专用跳过**。
|
|
45
|
+
两平台自包含包、无 Node 的断网只读 Debian 容器通过;[主分支 CI](https://github.com/yanglaofish/Fishtools/actions/runs/38361020862)两平台也通过。
|
|
46
|
+
最终发布 tag 固定于 `fdb62c1367fe80d985d3292a5fe92f4e88dbb813`;之后的验收记录不改变发行产物。
|
|
47
|
+
- npm 官方注册表 `latest` 为 **0.5.2**;独立下载公开 tarball 为 **9,806,832 字节**,SHA-512 与注册表 integrity 一致,
|
|
48
|
+
SHA-256 `e48954b03a455bcc9997b2b6075b1c4a8a29e343c2eb1af342e8ca51cf0d649c` 与 [Release](https://github.com/yanglaofish/Fishtools/releases/tag/v0.5.2) 的 `SHA256SUMS` 一致。
|
|
49
|
+
- Release 已公开于仓库访问范围,含 npm、Windows(52,523,594 字节)、Linux(58,075,911 字节)归档及校验文件。
|
|
50
|
+
issue #4 修正与 Shift+Enter / Enter 按键说明进入同一 0.5.2;没有另发版本或覆盖已发布包。
|
|
21
51
|
|
|
22
52
|
## 0.5.1 全代际复核修正(2026-10-13)
|
|
23
53
|
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
|
|
26
26
|
## 维护与验证
|
|
27
27
|
|
|
28
|
+
`createApplication({projectDir,pluginRegistryDir})` 可让多个工作区读取同一插件库;CLI 默认接入用户级全局库,程序未传此选项时保留工作区模式。分发包始终使用自身工作区安装状态。`listPlugins()` 返回 scope/source 和待配置原因;`pluginDefinition(id)` 返回作者声明。`app.resultsDir` 是业务文件根,`app.outputDir` 保留为日志根;插件 `ctx.outputDir` 与 `ctx.logDir` 分别对应本次业务目录和日志目录。
|
|
29
|
+
|
|
28
30
|
`app.startShell(script,options)` 执行临时命令,`app.startAction(id,input,context)` 调用任意动作,两者均纳入运行记录与关闭等待。`startCommand(name,input,{expectedPlugin,...context})` 可固定命令提供者,启动时再次检查,防止参数填写期间被其他同名能力替换。`configureCommandPresets` 和 `configureShortcuts` 在备份、冲突检查与变更锁内保存项目设置;命令快捷项在用户明确设置时绑定提供者 ID,普通安装/卸载和未改变目标的整组保存不会重新绑定;已有未绑定项必须明确提供 plugin 或在界面重新选择目标。注册项变化通过定向宿主更新生效,导出快照保留所需定义与有效快捷项。
|
|
29
31
|
|
|
30
32
|
本模块负责上述职责的实现、文档与回归;跨模块接口调整需要同时检查生产者与消费者。具体维护人员尚未指定。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, readFile, writeFile, rename, rm } from 'node:fs/promises';
|
|
1
|
+
import { mkdir, readFile, writeFile, rename, rm, rmdir } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { EventEmitter } from 'node:events';
|
|
@@ -25,6 +25,8 @@ import {openPluginState,withPluginMutation,assertPluginState,savePluginState,lea
|
|
|
25
25
|
import {planPluginUpdate,changedPluginSources} from './plugin-update.js';
|
|
26
26
|
import {validateNetworkPolicy,inspectNetworkPolicy,resolveNetworkPolicy,buildProcessEnv} from '@mytools/fst-platform/network';
|
|
27
27
|
import {resolvePrivilegeRequirement,checkStaticPrivilege} from '@mytools/fst-plugin/privileges';
|
|
28
|
+
import {registerWorkspace,registryWorkflowReferences,registryPluginReferences} from '@mytools/fst-workspace/registry';
|
|
29
|
+
import {mergePluginEntries,preparePluginCatalog} from './plugin-catalog.js';
|
|
28
30
|
|
|
29
31
|
function declaredCommands(entries){
|
|
30
32
|
return entries.flatMap(entry=>{const plugin=entry.plugin??entry;return Object.keys(plugin.commands??{}).map(name=>({name,plugin:plugin.id}));});
|
|
@@ -39,10 +41,13 @@ function workflowActions(steps,found=new Set()){
|
|
|
39
41
|
return found;
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
export async function createApplication({projectDir=process.cwd(),workspace,outputDir,plugins,config={},maintenance=false,omitInstalledPlugin,allowUnknownPrivileges=false}={}) {
|
|
44
|
+
export async function createApplication({projectDir=process.cwd(),workspace,pluginRegistryDir,outputDir,plugins,config={},maintenance=false,omitInstalledPlugin,allowUnknownPrivileges=false}={}) {
|
|
43
45
|
projectDir=await prepareBundleWorkspace(path.resolve(projectDir),workspace);
|
|
44
46
|
const project=await readJson(path.join(projectDir,'flow.project.json'),{plugins:[]});
|
|
45
|
-
const
|
|
47
|
+
const requestedOutput=outputDir??process.env.FLOW_OUTPUT_DIR;
|
|
48
|
+
const output=path.resolve(requestedOutput??(project.readOnly?path.join(process.cwd(),'flow-results'):path.join(projectDir,'.flow','runs')));
|
|
49
|
+
const results=path.resolve(requestedOutput||project.readOnly?path.join(output,'files'):path.join(projectDir,'results'));
|
|
50
|
+
const sessionId=randomUUID();
|
|
46
51
|
const store=new WorkflowStore(path.join(projectDir,'workflows'));
|
|
47
52
|
const emitter=new EventEmitter(), runs=new Map(),journals=new WeakMap();
|
|
48
53
|
const resources=createResources(),operations=new Set();let closing,launching=0;
|
|
@@ -51,17 +56,24 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
51
56
|
if(!Number.isSafeInteger(maxCachedRuns)||maxCachedRuns<1||maxCachedRuns>1000)throw new FlowError('maxCachedRuns 必须为 1 到 1000 的整数');
|
|
52
57
|
const fileProbe=createFileProbe(project.fileAccess);
|
|
53
58
|
validateKeepRuns(project.logs?.keepRuns??null);
|
|
54
|
-
const
|
|
55
|
-
|
|
59
|
+
const registryDir=path.resolve(pluginRegistryDir&&!project.readOnly&&!project.baseBundle?pluginRegistryDir:projectDir),shared=registryDir!==projectDir;
|
|
60
|
+
if(shared)await registerWorkspace(registryDir,projectDir);
|
|
61
|
+
const opened=await openPluginState(registryDir,{readOnly:project.readOnly});
|
|
62
|
+
const localOpened=shared?await openPluginState(projectDir):null;
|
|
63
|
+
let host,state=opened.state,localState=localOpened?.state,busy=false,pending=new Map(),catalogEntries=[],localEntries=[];
|
|
56
64
|
const installationLeases=new Map();
|
|
57
65
|
if(state.root)installationLeases.set(path.resolve(state.root),opened.release);
|
|
66
|
+
if(localState?.root)installationLeases.set(path.resolve(localState.root),localOpened.release);
|
|
67
|
+
const withRegistryMutation=callback=>withPluginMutation(registryDir,()=>shared?withPluginMutation(projectDir,callback):callback());
|
|
68
|
+
const assertStates=async()=>{await assertPluginState(registryDir,state);if(shared)await assertPluginState(projectDir,localState);};
|
|
58
69
|
const app={
|
|
59
|
-
projectDir,project,outputDir:output,store,
|
|
70
|
+
projectDir,project,pluginRegistryDir:registryDir,pluginScope:shared?'global':'workspace',outputDir:output,resultsDir:results,sessionId,store,
|
|
60
71
|
get host(){return host;},
|
|
61
72
|
get maintenance(){return maintenance;},
|
|
62
73
|
developmentStatus:()=>({running:launching+writingRuns.size+operations.size,busy,closing:!!closing}),
|
|
63
74
|
catalog:()=>host.catalog(),
|
|
64
|
-
|
|
75
|
+
pluginDefinition:id=>host.definitions.get(id)??pending.get(id)?.entry.plugin,
|
|
76
|
+
listPlugins:()=>catalogEntries.map(entry=>{const p=entry.plugin??entry,scope=entry.scope??'preset',installed=scope==='global'?state:scope==='workspace'?(shared?localState:state):{};return {id:p.id,version:p.version,title:p.title,description:p.description,scope,source:entry.root,platforms:p.platforms,architectures:p.architectures,environments:p.environments,config:p.config,requirements:p.requirements,privileges:pluginPrivileges(p),runtime:{...(pending.has(p.id)?{status:'unconfigured'}:host.runtimeStatus().find(r=>r.id===p.id)),...(p.runtime?{updatePolicy:p.runtime.updatePolicy??'maintenance'}:{})},...(pending.has(p.id)?{configurationError:pending.get(p.id).message}:{}),removable:!!(installed.dependencies?.[p.id]||installed.links?.[p.id]),development:!!installed.links?.[p.id],warnings:host.warnings.filter(item=>item.plugin===p.id).map(item=>item.message)};}),
|
|
65
77
|
listCommands:()=>host.commands(),
|
|
66
78
|
listShortcuts:()=>describeShortcuts(project.shortcuts??{},{actions:host.catalog(),commands:host.commands()}),
|
|
67
79
|
async configureShortcuts(value){return updateUserCommands({shortcuts:value});},
|
|
@@ -71,7 +83,7 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
71
83
|
listWorkflows:()=>store.list(),
|
|
72
84
|
async saveWorkflow(w){return mutateWorkflow(()=>store.save(w),w);},
|
|
73
85
|
async duplicateWorkflow(definition,options){return mutateWorkflow(()=>store.duplicate(definition,options),definition);},
|
|
74
|
-
async removeWorkflow(id){return mutateWorkflow(()=>store.remove(id));},
|
|
86
|
+
async removeWorkflow(id,options){return mutateWorkflow(()=>store.remove(id,options));},
|
|
75
87
|
async checkWorkflow(id){
|
|
76
88
|
host.assertHealthy();
|
|
77
89
|
const closure=await store.resolve([id],host);
|
|
@@ -87,22 +99,24 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
87
99
|
return app.executeTracked(id,(activeHost,context,event)=>{
|
|
88
100
|
if(blocked.length)throw new FlowError(`工作流缺少运行权限:${blocked.map(item=>item.action).join('、')}`,{code:'INSUFFICIENT_PRIVILEGE',details:{actions:blocked}});
|
|
89
101
|
return runWorkflow({store:snapshotStore,host:activeHost,id,input,signal:context.signal,onEvent:event,runId:context.runId,context:{...context,allowUnknownPrivileges:!!options.allowUnknownPrivileges,networkPolicy}});
|
|
90
|
-
});
|
|
102
|
+
},{kind:'workflow',title:closure.workflows.find(flow=>flow.id===id)?.title??id,input});
|
|
91
103
|
},
|
|
92
104
|
async startCommand(name,input={},context={}){
|
|
93
105
|
if(busy)throw new FlowError('插件更新中,请稍后调用');
|
|
106
|
+
for(const [id,{entry}] of pending)if(Object.hasOwn(entry.plugin.commands??{},name))assertConfigured(id);
|
|
94
107
|
const networkPolicy=structuredClone(project.network??{});
|
|
95
108
|
return app.executeTracked(`/${name}`,(activeHost,runContext)=>{
|
|
96
109
|
if(context.expectedPlugin!==undefined&&!activeHost.commands().some(command=>command.name===name&&command.plugin===context.expectedPlugin)){
|
|
97
110
|
throw new FlowError('命令目标插件已变更,请重新选择目标后执行',{code:'COMMAND_TARGET_CHANGED',details:{command:name,plugin:context.expectedPlugin}});
|
|
98
111
|
}
|
|
99
112
|
return activeHost.invokeCommand(name,input,{...context,...runContext,networkPolicy});
|
|
100
|
-
});
|
|
113
|
+
},{kind:'command',title:host.commands().find(command=>command.name===name)?.description??`/${name}`,input});
|
|
101
114
|
},
|
|
102
115
|
async startAction(id,input={},context={}){
|
|
103
116
|
if(busy)throw new FlowError('插件更新中,请稍后调用');
|
|
117
|
+
assertConfigured(id.slice(0,id.lastIndexOf(':')));
|
|
104
118
|
const networkPolicy=structuredClone(project.network??{});
|
|
105
|
-
return app.executeTracked(id,(activeHost,runContext)=>activeHost.invoke(id,input,{...context,...runContext,networkPolicy}));
|
|
119
|
+
return app.executeTracked(id,(activeHost,runContext)=>activeHost.invoke(id,input,{...context,...runContext,networkPolicy}),{kind:'action',title:host.catalog().find(action=>action.id===id)?.title??id,input});
|
|
106
120
|
},
|
|
107
121
|
async startShell(script,{shell='auto',timeout=30000}={}){
|
|
108
122
|
if(busy)throw new FlowError('项目更新中,请稍后执行命令');
|
|
@@ -111,15 +125,16 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
111
125
|
const env=buildProcessEnv(policy);
|
|
112
126
|
return app.executeTracked('!命令',async(_host,context)=>{
|
|
113
127
|
const result=await runShell(script,{shell,temporaryDir:context.outputDir,cwd:projectDir,env,extendEnv:false,signal:context.signal,timeout,outputMode:'stream',summaryBytes:65536,
|
|
114
|
-
|
|
128
|
+
onStart:invocation=>context.log('执行程序',invocation,{kind:'process'}),
|
|
129
|
+
onOutput:({stream,message})=>context.log(message,undefined,{stream,audience:'user'})});
|
|
115
130
|
if(result.exitCode!==0)throw new FlowError(`命令执行失败,退出码 ${result.exitCode}`,{code:'EXECUTION_FAILED',details:result});
|
|
116
131
|
return result;
|
|
117
|
-
});
|
|
132
|
+
},{kind:'shell',title:'系统命令'});
|
|
118
133
|
},
|
|
119
|
-
async executeTracked(id,execute){
|
|
134
|
+
async executeTracked(id,execute,{kind='workflow',title=id,input}={}){
|
|
120
135
|
const runId=randomUUID(),controller=new AbortController();
|
|
121
|
-
const run={id:runId,workflowId:id,logOwner:runLogs.owner,status:'running',startedAt:new Date().toISOString(),controller};
|
|
122
|
-
const journal=await runLogs.start({id:runId,workflowId:id,status:run.status,startedAt:run.startedAt},{onEvent:event=>emitter.emit('event',event)});
|
|
136
|
+
const run={id:runId,workflowId:id,kind,title,sessionId,resultDir:path.join(results,runId),logOwner:runLogs.owner,status:'running',startedAt:new Date().toISOString(),controller};
|
|
137
|
+
const journal=await runLogs.start({id:runId,workflowId:id,kind,title,sessionId,status:run.status,startedAt:run.startedAt},{onEvent:event=>emitter.emit('event',event)});
|
|
123
138
|
journals.set(run,journal);
|
|
124
139
|
// 兼容运行句柄的事件读取;外部修改不影响日志模块的缓存。
|
|
125
140
|
Object.defineProperty(run,'events',{get:()=>journal.snapshot().events});
|
|
@@ -128,9 +143,12 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
128
143
|
const event=e=>journal.append(e);
|
|
129
144
|
const activeHost=host;
|
|
130
145
|
run.done=(async()=>{
|
|
146
|
+
let createdResults=false;
|
|
131
147
|
try {
|
|
148
|
+
createdResults=(await mkdir(run.resultDir,{recursive:true}))!==undefined;
|
|
132
149
|
await event({type:'run.started'});
|
|
133
|
-
|
|
150
|
+
if(input!==undefined)await event({type:'run.input',input});
|
|
151
|
+
run.output=await execute(activeHost,{outputDir:run.resultDir,logDir:journal.directory,signal:controller.signal,runId,log:(message,data,meta={})=>event({...meta,type:'log',message,data})},event);
|
|
134
152
|
run.status='succeeded';await event({type:'run.succeeded'});
|
|
135
153
|
} catch(error) {
|
|
136
154
|
if(error?.code==='WORKFLOW_STOPPED'){
|
|
@@ -143,9 +161,16 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
143
161
|
}
|
|
144
162
|
} finally {
|
|
145
163
|
run.finishedAt=new Date().toISOString();
|
|
164
|
+
if(createdResults){
|
|
165
|
+
try{await rmdir(run.resultDir);run.resultDir=undefined;}
|
|
166
|
+
catch(error){
|
|
167
|
+
if(error.code==='ENOENT')run.resultDir=undefined;
|
|
168
|
+
else if(!['ENOTEMPTY','EEXIST'].includes(error.code))run.warnings=[{code:'RESULT_CLEANUP_FAILED',message:`空结果目录无法移除:${error.message}`}];
|
|
169
|
+
}
|
|
170
|
+
}
|
|
146
171
|
try{await journal.finish(runState(run));}finally{writingRuns.delete(runId);}
|
|
147
172
|
try{await pruneLogs();}catch(error){
|
|
148
|
-
run.warnings=[{code:'LOG_PRUNE_FAILED',message:`日志自动清理失败:${error.message}`}];
|
|
173
|
+
run.warnings=[...(run.warnings??[]),{code:'LOG_PRUNE_FAILED',message:`日志自动清理失败:${error.message}`}];
|
|
149
174
|
await journal.save(runState(run));
|
|
150
175
|
}
|
|
151
176
|
}
|
|
@@ -225,29 +250,32 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
225
250
|
async configurePlugin(id,value,options={}){
|
|
226
251
|
if(project.readOnly)throw new FlowError('只读项目不能保存配置');
|
|
227
252
|
if(busy||launching||app.listRuns().some(r=>r.status==='running'))throw new FlowError('请等待运行或安装结束');
|
|
228
|
-
if(!
|
|
229
|
-
value=validate(
|
|
253
|
+
if(!app.pluginDefinition(id))throw new FlowError(`插件不存在:${id}`);
|
|
254
|
+
value=validate(app.pluginDefinition(id).config,value,`${id} 配置`);
|
|
230
255
|
busy=true;let backup;
|
|
231
256
|
try{
|
|
232
|
-
await
|
|
233
|
-
await
|
|
257
|
+
await withRegistryMutation(async()=>{
|
|
258
|
+
await assertStates();
|
|
234
259
|
const file=path.join(projectDir,'flow.project.json'),latest=await readJson(file,project);
|
|
235
260
|
if(latest.readOnly)throw new FlowError('只读项目不能保存配置');
|
|
236
261
|
const nextConfig={...latest.config,[id]:value};
|
|
237
262
|
const oldConfig={...project.config,...config},effectiveNext={...nextConfig,...config};
|
|
238
|
-
const
|
|
239
|
-
const
|
|
263
|
+
const prepared=preparePluginCatalog(catalogEntries,effectiveNext);
|
|
264
|
+
const nextDefinitions=new Map(prepared.active.map(entry=>[(entry.plugin??entry).id,entry.plugin??entry]));
|
|
265
|
+
const entries=prepared.active,oldEntries=[...host.definitions.values()].map(p=>({plugin:p,root:p.root}));
|
|
266
|
+
const plan=planPluginUpdate(host.definitions,nextDefinitions,oldConfig,effectiveNext,new Set([id]));
|
|
240
267
|
assertMaintenance(plan,options);
|
|
241
268
|
backup=await backupProjectFile(file,latest,'config');
|
|
242
269
|
if(plan.affected.length)await host.replace({plugins:entries,config:effectiveNext,affected:plan.affected});
|
|
243
270
|
const nextProject={...latest,config:nextConfig},temp=`${file}.${randomUUID()}.tmp`;
|
|
244
271
|
try{await writeFile(temp,JSON.stringify(nextProject,null,2));await rename(temp,file);}
|
|
245
272
|
catch(error){
|
|
246
|
-
if(plan.affected.length)try{await host.replace({plugins:
|
|
273
|
+
if(plan.affected.length)try{await host.replace({plugins:oldEntries,config:oldConfig,affected:plan.affected});}
|
|
247
274
|
catch(recovery){host.invalidate();throw new AggregateError([error,recovery],`配置保存失败且插件恢复失败:${error.message};${recovery.message}`);}
|
|
248
275
|
throw error;
|
|
249
276
|
}
|
|
250
277
|
for(const key of Object.keys(project))delete project[key];Object.assign(project,nextProject);
|
|
278
|
+
pending=prepared.pending;
|
|
251
279
|
});
|
|
252
280
|
}finally{busy=false;}
|
|
253
281
|
return {backup};
|
|
@@ -285,21 +313,29 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
285
313
|
});return closing;
|
|
286
314
|
},
|
|
287
315
|
};
|
|
288
|
-
let initial;
|
|
316
|
+
let initial,globalEntries=[];
|
|
289
317
|
const services={application:app,runProcess,fs:fileProbe};
|
|
290
318
|
const hostProject=()=>({directory:projectDir,readOnly:!!project.readOnly});
|
|
291
319
|
const build=extra=>{
|
|
292
|
-
|
|
320
|
+
catalogEntries=entriesWithPresets(mergePluginEntries(initial,shared?localEntries:extra,shared?extra:[],state.disabledLegacy,{shared}),project.commandPresets??{});
|
|
321
|
+
const entries=catalogEntries;
|
|
293
322
|
validateShortcuts(project.shortcuts??{},{reservedNames:declaredCommands(entries).map(command=>command.name)});
|
|
294
|
-
|
|
323
|
+
const prepared=preparePluginCatalog(entries,{...project.config,...config});pending=prepared.pending;
|
|
324
|
+
return createHost({plugins:prepared.active,config:{...project.config,...config},services,project:hostProject(),network:()=>project.network,environmentOverrides:project.environments,runtimeEnabled:!maintenance,allowUnknownPrivileges});
|
|
295
325
|
};
|
|
296
326
|
try{
|
|
297
327
|
initial=plugins??await Promise.all((project.plugins??[]).map(spec=>loadPlugin(spec,project.baseBundle?.root??projectDir)));
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
328
|
+
globalEntries=await loadInstalled(state,registryDir);
|
|
329
|
+
if(shared)localEntries=await loadInstalled(localState,projectDir,new Set([...Object.keys(state.dependencies??{}),...Object.keys(state.links??{}),...(state.disabledLegacy??[])]));
|
|
330
|
+
host=await build(globalEntries);
|
|
331
|
+
}catch(error){await fileProbe.close();await opened.release();await localOpened?.release();throw error;}
|
|
332
|
+
async function loadInstalled(current,base,excluded=new Set()){
|
|
333
|
+
const loaded=[];
|
|
334
|
+
for(const name of Object.keys(current.dependencies??{}))if(!excluded.has(name)&&(!maintenance||name!==omitInstalledPlugin))loaded.push(await loadPlugin(name,current.root));
|
|
335
|
+
for(const [name,source] of Object.entries(current.links??{}))if(!excluded.has(name)&&(!maintenance||name!==omitInstalledPlugin))loaded.push(await loadPlugin(source,base));
|
|
336
|
+
return loaded;
|
|
337
|
+
}
|
|
338
|
+
function assertConfigured(id){if(pending.has(id))throw new FlowError(`插件 ${id} 尚未配置:${pending.get(id).message}`,{code:'PLUGIN_NOT_CONFIGURED',details:{plugin:id}});}
|
|
303
339
|
for(const name of ['startRun','startCommand','startAction','startShell','startWeb','saveWorkflow','duplicateWorkflow','removeWorkflow','installPlugin','linkPlugin','removePlugin','configurePlugin','configureNetworkPolicy','configureLogs','configureCommandPresets','configureShortcuts','setMaintenance','pack']){
|
|
304
340
|
const original=app[name],isRun=['startRun','startCommand','startAction','startShell'].includes(name);
|
|
305
341
|
app[name]=async(...args)=>{
|
|
@@ -312,8 +348,8 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
312
348
|
async function mutateWorkflow(operation,definition){
|
|
313
349
|
if(project.readOnly)throw new FlowError('只读运行包不能修改工作流');
|
|
314
350
|
if(busy)throw new FlowError('插件变更期间暂不能修改工作流',{code:'PLUGIN_BUSY'});
|
|
315
|
-
return
|
|
316
|
-
await
|
|
351
|
+
return withRegistryMutation(async()=>{
|
|
352
|
+
await assertStates();
|
|
317
353
|
if(definition){
|
|
318
354
|
const workflow=store.validateShape(definition),latest=await readJson(path.join(projectDir,'flow.project.json'),project);
|
|
319
355
|
const missing=[...workflowActions(workflow.steps)].filter(id=>id.startsWith(`${COMMANDS_PLUGIN_ID}:`)&&!Object.hasOwn(latest.commandPresets??{},id.slice(COMMANDS_PLUGIN_ID.length+1)));
|
|
@@ -344,8 +380,8 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
344
380
|
const requested=structuredClone(changes);
|
|
345
381
|
if(Object.hasOwn(requested,'commandPresets'))requested.commandPresets=validateCommandPresets(requested.commandPresets);
|
|
346
382
|
busy=true;
|
|
347
|
-
try{return await
|
|
348
|
-
await
|
|
383
|
+
try{return await withRegistryMutation(async()=>{
|
|
384
|
+
await assertStates();
|
|
349
385
|
const file=path.join(projectDir,'flow.project.json'),latest=await readJson(file,project);
|
|
350
386
|
if(latest.readOnly)throw new FlowError('只读运行包不能修改注册命令或快捷名称');
|
|
351
387
|
for(const field of Object.keys(requested))if(!isDeepStrictEqual(latest[field]??{},project[field]??{})){
|
|
@@ -354,7 +390,8 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
354
390
|
const nextProject={...latest,...requested};
|
|
355
391
|
const presets=validateCommandPresets(nextProject.commandPresets??{});
|
|
356
392
|
const oldEntries=[...host.definitions.values()].map(plugin=>({plugin,root:plugin.root}));
|
|
357
|
-
const
|
|
393
|
+
const nextCatalog=entriesWithPresets(catalogEntries,presets),prepared=preparePluginCatalog(nextCatalog,{...latest.config,...config});
|
|
394
|
+
const entries=prepared.active;
|
|
358
395
|
const reservedNames=declaredCommands(entries).map(command=>command.name);
|
|
359
396
|
const shortcuts=Object.hasOwn(requested,'shortcuts')?bindShortcutCommands(nextProject.shortcuts??{},{commands:declaredCommands(entries),previous:latest.shortcuts??{}}):nextProject.shortcuts??{};
|
|
360
397
|
nextProject.shortcuts=validateShortcuts(shortcuts,{reservedNames});
|
|
@@ -378,6 +415,7 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
378
415
|
throw error;
|
|
379
416
|
}finally{await rm(temp,{force:true});}
|
|
380
417
|
for(const key of Object.keys(project))delete project[key];Object.assign(project,nextProject);
|
|
418
|
+
catalogEntries=nextCatalog;pending=prepared.pending;
|
|
381
419
|
return {backup,commandPresets:structuredClone(presets),shortcuts:structuredClone(nextProject.shortcuts)};
|
|
382
420
|
});}finally{busy=false;}
|
|
383
421
|
}
|
|
@@ -453,40 +491,51 @@ export async function createApplication({projectDir=process.cwd(),workspace,outp
|
|
|
453
491
|
if(busy || launching || [...runs.values()].some(r=>r.status==='running'))throw new FlowError('请等待当前运行或安装结束');
|
|
454
492
|
busy=true;let candidate,nextRelease;
|
|
455
493
|
try {
|
|
456
|
-
return await
|
|
457
|
-
await
|
|
494
|
+
return await withRegistryMutation(async()=>{
|
|
495
|
+
await assertStates();
|
|
496
|
+
const targetDir=shared&&operation.remove&&!state.dependencies?.[operation.remove]&&!state.links?.[operation.remove]?projectDir:registryDir;
|
|
497
|
+
const targetState=targetDir===registryDir?state:localState;
|
|
458
498
|
const latest=await readJson(path.join(projectDir,'flow.project.json'),project);
|
|
459
499
|
if(latest.readOnly)throw new FlowError('运行包不支持安装或移除插件');
|
|
460
500
|
if(operation.remove){
|
|
461
501
|
const name=operation.remove;
|
|
462
502
|
if(resources.active(name))throw new FlowError('请先停止此插件提供的 Web');
|
|
463
|
-
if(!
|
|
464
|
-
const dependents=
|
|
503
|
+
if(!targetState.dependencies?.[name]&&!targetState.links?.[name])throw new FlowError('此插件来自发行配置,不能在此移除');
|
|
504
|
+
const dependents=catalogEntries.map(entry=>entry.plugin??entry).filter(p=>p.id!==name&&Object.hasOwn(p.dependencies??{},name)).map(p=>p.id);
|
|
465
505
|
if(dependents.length)throw new FlowError(`插件仍被其他插件依赖:${dependents.join('、')}`,{code:'PLUGIN_IN_USE',details:{dependencies:dependents}});
|
|
466
|
-
|
|
506
|
+
if(shared&&targetDir===registryDir){
|
|
507
|
+
const references=await registryPluginReferences(registryDir,name,{globalPlugins:catalogEntries.filter(entry=>entry.scope==='global').map(entry=>entry.plugin)});
|
|
508
|
+
if(references.length){const dependencies=references.map(item=>`${item.plugin}(${item.projectDir})`);throw new FlowError(`插件仍被其他工作区插件依赖:${dependencies.join('、')}`,{code:'PLUGIN_IN_USE',details:{dependencies}});}
|
|
509
|
+
}
|
|
510
|
+
const workflows=shared&&targetDir===registryDir?await registryWorkflowReferences(registryDir,name):await findPluginWorkflowReferences(name);
|
|
467
511
|
if(workflows.length&&!options.force)throw new FlowError(`插件 ${name} 仍被工作流引用:${workflows.map(w=>w.id).join('、')}`,{code:'PLUGIN_IN_USE',details:{workflows}});
|
|
468
512
|
}
|
|
469
|
-
const next=await installGeneration(
|
|
470
|
-
const
|
|
513
|
+
const next=await installGeneration(targetDir,{...operation,sourceDir:projectDir,state:shared&&targetDir===registryDir?{...targetState,global:true}:targetState});
|
|
514
|
+
const nextLocal=shared?(targetDir===projectDir?next.loaded:localEntries):next.loaded,nextGlobal=shared?(targetDir===registryDir?next.loaded:globalEntries):[];
|
|
515
|
+
const nextState=targetDir===registryDir?next.state:state;
|
|
516
|
+
const nextCatalog=entriesWithPresets(mergePluginEntries(initial,nextLocal,nextGlobal,nextState.disabledLegacy,{shared}),latest.commandPresets??{}),activeConfig={...project.config,...config},effectiveConfig={...latest.config,...config};
|
|
517
|
+
const prepared=preparePluginCatalog(nextCatalog,effectiveConfig),nextEntries=prepared.active;
|
|
471
518
|
candidate=await createHost({plugins:nextEntries,config:effectiveConfig,services,project:hostProject(),network:()=>project.network,environmentOverrides:project.environments,runtimeEnabled:false,allowUnknownPrivileges});
|
|
472
519
|
validateShortcuts(latest.shortcuts??{},{reservedNames:declaredCommands(nextEntries).map(command=>command.name)});
|
|
473
|
-
const sourceChanges=await changedPluginSources(host.definitions,candidate.definitions,{oldInstallationRoot:
|
|
520
|
+
const sourceChanges=await changedPluginSources(host.definitions,candidate.definitions,{oldInstallationRoot:targetState.root,newInstallationRoot:next.state.root});
|
|
474
521
|
const plan=planPluginUpdate(host.definitions,candidate.definitions,activeConfig,effectiveConfig,sourceChanges);
|
|
475
522
|
assertMaintenance(plan,options);
|
|
476
523
|
await candidate.close();candidate=null;
|
|
477
|
-
nextRelease=await leaseInstallation(
|
|
524
|
+
nextRelease=await leaseInstallation(targetDir,next.state.root);
|
|
478
525
|
const oldEntries=[...host.definitions.values()].map(p=>({plugin:p,root:p.root}));
|
|
479
526
|
if(plan.affected.length)await host.replace({plugins:nextEntries,config:effectiveConfig,affected:plan.affected});
|
|
480
|
-
try{await savePluginState(
|
|
527
|
+
try{await savePluginState(targetDir,next.state,targetState);}
|
|
481
528
|
catch(error){
|
|
482
529
|
if(plan.affected.length)try{await host.replace({plugins:oldEntries,config:activeConfig,affected:plan.affected});}
|
|
483
530
|
catch(recovery){host.invalidate();throw new AggregateError([error,recovery],`插件状态保存失败且恢复失败:${error.message};${recovery.message}`);}
|
|
484
531
|
throw error;
|
|
485
532
|
}
|
|
486
|
-
state=next.state;
|
|
533
|
+
if(targetDir===registryDir){state=next.state;globalEntries=next.loaded;}else{localState=next.state;localEntries=next.loaded;}
|
|
534
|
+
catalogEntries=nextCatalog;pending=prepared.pending;
|
|
487
535
|
for(const key of Object.keys(project))delete project[key];Object.assign(project,latest);
|
|
488
|
-
installationLeases.set(path.resolve(state.root),nextRelease);nextRelease=null;
|
|
489
|
-
|
|
536
|
+
installationLeases.set(path.resolve(next.state.root),nextRelease);nextRelease=null;
|
|
537
|
+
const usedRoots=[...host.definitions.values(),...catalogEntries];
|
|
538
|
+
for(const [root,release] of installationLeases)if(root!==path.resolve(next.state.root)&&!usedRoots.some(entry=>entry.root&&path.resolve(entry.root).startsWith(root+path.sep))){
|
|
490
539
|
try{await release();installationLeases.delete(root);}
|
|
491
540
|
catch(error){emitter.emit('event',{type:'plugin.cleanup.warning',message:`旧安装批次租约暂未清理:${error.message}`,root});}
|
|
492
541
|
}
|
|
@@ -34,7 +34,16 @@ async function scan(){
|
|
|
34
34
|
try{
|
|
35
35
|
project=await json(path.join(options.projectDir,'flow.project.json'),{});
|
|
36
36
|
const state=await json(path.join(stateDirectory,'plugins.json'),{});
|
|
37
|
-
|
|
37
|
+
let sources={...state.links};
|
|
38
|
+
if(options.pluginRegistryDir&&!project.baseBundle&&!project.readOnly&&options.pluginRegistryDir!==options.projectDir){
|
|
39
|
+
const globalDirectory=path.join(options.pluginRegistryDir,'.flow');
|
|
40
|
+
addWatch('global-state',globalDirectory,(_event,name)=>{if(name===null||String(name)==='plugins.json'){change(path.join(globalDirectory,'plugins.json'));void scan();}},wanted);
|
|
41
|
+
const global=await json(path.join(globalDirectory,'plugins.json'),{});
|
|
42
|
+
for(const id of global.disabledLegacy??[])delete sources[id];
|
|
43
|
+
sources={...sources,...global.links};
|
|
44
|
+
for(const id of Object.keys(global.dependencies??{}))delete sources[id];
|
|
45
|
+
}
|
|
46
|
+
links=Object.values(sources).filter(value=>typeof value==='string').map(value=>path.resolve(options.projectDir,value));
|
|
38
47
|
}catch(error){send({type:'warning',message:`开发配置暂不可读,保留已有源码监听:${error.message}`});}
|
|
39
48
|
incomplete=links.length>options.maxDirectories;
|
|
40
49
|
const queue=links.slice(0,options.maxDirectories).map(directory=>({directory,depth:0})),seen=new Set();
|
|
@@ -91,7 +91,7 @@ export async function createDevelopmentSupervisor(options={}){
|
|
|
91
91
|
})();return closing;
|
|
92
92
|
},
|
|
93
93
|
};
|
|
94
|
-
const watchOptions={projectDir,configFile:options.configFile?path.resolve(options.configFile):undefined,
|
|
94
|
+
const watchOptions={projectDir,pluginRegistryDir:options.pluginRegistryDir?path.resolve(options.pluginRegistryDir):undefined,configFile:options.configFile?path.resolve(options.configFile):undefined,
|
|
95
95
|
maxDirectories:positive(options.maxDirectories,512,'maxDirectories'),maxEntries:positive(options.maxEntries,20000,'maxEntries'),maxDepth:positive(options.maxDepth,24,'maxDepth')};
|
|
96
96
|
try{
|
|
97
97
|
await new Promise((resolve,reject)=>{
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {validate,assertSchema} from '@mytools/sdk/schema';
|
|
2
|
+
import {FlowError} from '@mytools/sdk';
|
|
3
|
+
import {validatePluginDefinitions} from '@mytools/fst-plugin';
|
|
4
|
+
|
|
5
|
+
export function mergePluginEntries(initial,local,global,disabledLegacy=[],{shared=true}={}){
|
|
6
|
+
const result=new Map();
|
|
7
|
+
for(const entry of initial){
|
|
8
|
+
const plugin=entry.plugin??entry;
|
|
9
|
+
if(result.has(plugin.id))throw new FlowError(`插件标识重复:${plugin.id}`,{code:'VALIDATION'});
|
|
10
|
+
result.set(plugin.id,{...('plugin' in entry?entry:{plugin:entry}),scope:'preset'});
|
|
11
|
+
}
|
|
12
|
+
for(const entry of local)if(!disabledLegacy.includes(entry.plugin.id)){
|
|
13
|
+
if(!shared&&result.has(entry.plugin.id))throw new FlowError(`插件标识重复:${entry.plugin.id}`,{code:'VALIDATION'});
|
|
14
|
+
result.set(entry.plugin.id,{...entry,scope:'workspace'});
|
|
15
|
+
}
|
|
16
|
+
for(const entry of global)result.set(entry.plugin.id,{...entry,scope:'global'});
|
|
17
|
+
return [...result.values()];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function preparePluginCatalog(entries,config){
|
|
21
|
+
const pending=new Map();validatePluginDefinitions(entries);
|
|
22
|
+
for(const entry of entries){
|
|
23
|
+
const plugin=entry.plugin??entry;
|
|
24
|
+
if(plugin.config!==undefined)assertSchema(plugin.config,`${plugin.id} 配置`);
|
|
25
|
+
try{validate(plugin.config,config[plugin.id]??{},`${plugin.id} 配置`);}
|
|
26
|
+
catch(error){
|
|
27
|
+
if(entry.scope!=='global'||error.code!=='VALIDATION')throw error;
|
|
28
|
+
pending.set(plugin.id,{entry,message:error.message});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// 缺配置的服务提供者暂不启用,相关消费者也等待;无关插件正常装配。
|
|
32
|
+
let changed;
|
|
33
|
+
do{
|
|
34
|
+
changed=false;
|
|
35
|
+
for(const entry of entries){
|
|
36
|
+
const plugin=entry.plugin??entry;
|
|
37
|
+
const missing=Object.keys(plugin.dependencies??{}).filter(id=>pending.has(id));
|
|
38
|
+
if(!pending.has(plugin.id)&&missing.length){pending.set(plugin.id,{entry,message:`依赖插件尚未配置:${missing.join('、')}`});changed=true;}
|
|
39
|
+
}
|
|
40
|
+
}while(changed);
|
|
41
|
+
return {active:entries.filter(entry=>!pending.has((entry.plugin??entry).id)),pending};
|
|
42
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// 由 npm version 的生命周期脚本同步,内部插件 API 版本独立维护。
|
|
2
|
-
export const VERSION="0.5.
|
|
2
|
+
export const VERSION="0.5.3";
|
|
@@ -35,6 +35,10 @@ fst 命令入口、交互终端、输入呈现和运行观察。通过公开应
|
|
|
35
35
|
|
|
36
36
|
TUI 支持 `!` 系统命令、`/commands` 常用命令注册和 `/shortcuts` 任意插件能力快捷名。主输入框与命令编辑框使用 Shift+Enter / Alt+Enter 换行、Enter 提交;真实多行粘贴保持换行及缩进。使用说明可通过 `fst docs commands` 离线阅读。
|
|
37
37
|
|
|
38
|
+
运行和步骤附近提示 Ctrl+O,展开后按 schema 字段标题阅读结果;受管进程显示实际程序、参数、目录和原始命令。`/logs` 中按 m 单独格式化阅读输出,j 仍保留原始 JSON。总耗时在执行期间每秒更新,结束或关闭界面后回收刷新计时器。平台声明提示直接显示在 TUI。
|
|
39
|
+
|
|
40
|
+
`/history` 或 `/tools` → 历史会话恢复输入、反馈与结果,不重跑指令;与已有插件或快捷名 `history` 冲突时保留原入口。通过 `fst-logs/sessions` 在所属工作区保存有界快照与完整追加交互记录,只读包改用可写输出目录。较早的内容分页读取,运行日志仍独立保存并遵循其保留策略。恢复创建当前会话的继续记录,不覆盖来源会话;未提交草稿和配置表单不保存。
|
|
41
|
+
|
|
38
42
|
本模块负责上述职责的实现、文档与回归;跨模块接口调整需要同时检查生产者与消费者。具体维护人员尚未指定。
|
|
39
43
|
|
|
40
44
|
在仓库根目录执行:
|