@yanglaofish/fishtools 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -12
- package/manual/README.md +24 -12
- package/manual/docs/deployment.md +3 -3
- package/manual/docs/examples/action-plugin/package.json +1 -1
- package/manual/docs/modules.md +2 -0
- package/manual/docs/plans/2026-10-13-effective-inputs-and-tables.md +39 -0
- package/manual/docs/plans/2026-10-13-plugin-defaults.md +45 -0
- package/manual/docs/plans/2026-10-14-issue7-recovery.md +33 -0
- package/manual/docs/plans/2026-10-14-issue8-10-workflows.md +26 -0
- package/manual/docs/plans/2026-10-14-issue9-completion.md +47 -0
- package/manual/docs/plans/2026-10-14-managed-execution.md +58 -0
- package/manual/docs/plans/2026-10-14-plugin-discovery-history.md +41 -0
- package/manual/docs/plans/2026-10-14-structured-reports.md +77 -0
- package/manual/docs/plans/2026-10-14-unreleased-review.md +47 -0
- package/manual/docs/plugin-development.md +175 -11
- package/manual/docs/releases.md +49 -6
- 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 +57 -0
- package/manual/docs/superpowers/reviews/2026-10-14-0.6.0-release-review.md +19 -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 +47 -0
- package/manual/packages/core/README.md +8 -0
- package/manual/packages/core/package.json +1 -1
- package/manual/packages/core/src/application.js +108 -53
- 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 +60 -0
- package/manual/packages/core/src/plugin-loading.js +24 -0
- package/manual/packages/core/src/version.js +1 -1
- package/manual/packages/fst-cli/README.md +8 -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 +11 -5
- package/manual/packages/fst-cli/src/terminal/file-autocomplete.js +106 -0
- package/manual/packages/fst-cli/src/terminal/log-viewer.js +4 -3
- package/manual/packages/fst-cli/src/terminal/navigation.js +25 -1
- package/manual/packages/fst-cli/src/terminal/presentation.js +5 -3
- package/manual/packages/fst-cli/src/terminal/report-presentation.js +38 -0
- package/manual/packages/fst-cli/src/terminal/result-table.js +66 -0
- package/manual/packages/fst-cli/src/terminal/run-feed.js +104 -23
- package/manual/packages/fst-cli/src/terminal/run-presentation.js +91 -14
- package/manual/packages/fst-cli/src/terminal/run-viewer.js +34 -15
- package/manual/packages/fst-cli/src/terminal/schema.js +114 -4
- package/manual/packages/fst-cli/src/terminal/session-history.js +82 -0
- package/manual/packages/fst-cli/src/terminal/session.js +158 -54
- package/manual/packages/fst-cli/src/terminal/view.js +108 -73
- package/manual/packages/fst-cli/src/terminal/workflow-menu.js +17 -10
- package/manual/packages/fst-devtools/README.md +2 -0
- package/manual/packages/fst-devtools/package.json +2 -2
- package/manual/packages/fst-devtools/src/plugin-quality.js +4 -1
- package/manual/packages/fst-devtools/src/plugin-tools.js +2 -1
- package/manual/packages/fst-devtools/src/process-usage.js +62 -0
- 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 +9 -0
- package/manual/packages/fst-platform/package.json +4 -3
- package/manual/packages/fst-platform/src/managed-process.js +36 -0
- package/manual/packages/fst-platform/src/process.js +11 -3
- package/manual/packages/fst-platform/src/shell.js +46 -1
- package/manual/packages/fst-plugin/README.md +4 -0
- package/manual/packages/fst-plugin/package.json +1 -1
- package/manual/packages/fst-plugin/src/contracts.js +3 -0
- package/manual/packages/fst-plugin/src/host.js +54 -31
- package/manual/packages/fst-plugin/src/runtime.js +14 -8
- 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 +6 -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 +10 -5
- package/manual/packages/fst-workspace/src/workflows.js +32 -12
- 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/packages/sdk/README.md +10 -0
- package/manual/packages/sdk/inputs.js +53 -0
- package/manual/packages/sdk/package.json +2 -0
- package/manual/packages/sdk/reports.js +53 -0
- package/manual/plugins/commands/package.json +1 -1
- package/node_modules/@mytools/commands/package.json +1 -1
- package/node_modules/@mytools/core/README.md +8 -0
- package/node_modules/@mytools/core/package.json +1 -1
- package/node_modules/@mytools/core/src/application.js +108 -53
- 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 +60 -0
- package/node_modules/@mytools/core/src/plugin-loading.js +24 -0
- package/node_modules/@mytools/core/src/version.js +1 -1
- package/node_modules/@mytools/fst-cli/README.md +8 -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 +11 -5
- package/node_modules/@mytools/fst-cli/src/terminal/file-autocomplete.js +106 -0
- package/node_modules/@mytools/fst-cli/src/terminal/log-viewer.js +4 -3
- package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +25 -1
- package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +5 -3
- package/node_modules/@mytools/fst-cli/src/terminal/report-presentation.js +38 -0
- package/node_modules/@mytools/fst-cli/src/terminal/result-table.js +66 -0
- package/node_modules/@mytools/fst-cli/src/terminal/run-feed.js +104 -23
- package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +91 -14
- package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +34 -15
- package/node_modules/@mytools/fst-cli/src/terminal/schema.js +114 -4
- package/node_modules/@mytools/fst-cli/src/terminal/session-history.js +82 -0
- package/node_modules/@mytools/fst-cli/src/terminal/session.js +158 -54
- package/node_modules/@mytools/fst-cli/src/terminal/view.js +108 -73
- package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +17 -10
- package/node_modules/@mytools/fst-devtools/README.md +2 -0
- package/node_modules/@mytools/fst-devtools/package.json +2 -2
- package/node_modules/@mytools/fst-devtools/src/plugin-quality.js +4 -1
- package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +2 -1
- package/node_modules/@mytools/fst-devtools/src/process-usage.js +62 -0
- 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 +9 -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 +4 -3
- package/node_modules/@mytools/fst-platform/src/managed-process.js +36 -0
- package/node_modules/@mytools/fst-platform/src/process.js +11 -3
- package/node_modules/@mytools/fst-platform/src/shell.js +46 -1
- package/node_modules/@mytools/fst-plugin/README.md +4 -0
- package/node_modules/@mytools/fst-plugin/package.json +1 -1
- package/node_modules/@mytools/fst-plugin/src/contracts.js +3 -0
- package/node_modules/@mytools/fst-plugin/src/host.js +54 -31
- package/node_modules/@mytools/fst-plugin/src/runtime.js +14 -8
- 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 +6 -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 +10 -5
- package/node_modules/@mytools/fst-workspace/src/workflows.js +32 -12
- 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/sdk/README.md +10 -0
- package/node_modules/@mytools/sdk/inputs.js +53 -0
- package/node_modules/@mytools/sdk/package.json +2 -0
- package/node_modules/@mytools/sdk/reports.js +53 -0
- package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1197 -1207
- 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
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import { TUI, Text, Container, Editor, SelectList, ProcessTerminal, CombinedAutocompleteProvider, matchesKey, truncateToWidth, visibleWidth } from '@mariozechner/pi-tui';
|
|
1
|
+
import {FileAutocomplete,createAutocompleteProbe} from './file-autocomplete.js';
|
|
2
|
+
export {FileAutocomplete} from './file-autocomplete.js';
|
|
3
|
+
import { TUI, Text, Container, Editor, SelectList, ProcessTerminal, matchesKey, truncateToWidth, visibleWidth } from '@mariozechner/pi-tui';
|
|
5
4
|
import { MarkdownLogViewer } from './log-viewer.js';
|
|
6
5
|
import { RunViewer, mouseOn, mouseOff, mouseWheel } from './run-viewer.js';
|
|
7
6
|
import {RunFeed} from './run-feed.js';
|
|
7
|
+
import {presentationCatalog} from './run-presentation.js';
|
|
8
8
|
import { logo } from './presentation.js';
|
|
9
9
|
import { VERSION } from '@mytools/core/version';
|
|
10
10
|
import {cleanText as safe,palette,menuTheme as theme,fitLine,shortenPath} from './theme.js';
|
|
@@ -13,44 +13,9 @@ export const cancelled=()=>Object.assign(new Error('已返回主菜单'),{code:'
|
|
|
13
13
|
// 上游菜单按字符数分配描述宽度,中文双宽字符需要再按终端列宽收口。
|
|
14
14
|
function fit(component){const render=component.render.bind(component);component.render=width=>render(width).map(line=>truncateToWidth(line,width));return component;}
|
|
15
15
|
|
|
16
|
-
// Pi 的 @ 模糊搜索依赖额外的 fd 程序。这里按目录补全,离线目标机无需安装 fd。
|
|
17
|
-
export class FileAutocomplete extends CombinedAutocompleteProvider{
|
|
18
|
-
constructor(commands,baseDir,workflows=[]){super(commands,baseDir);this.baseDir=baseDir;this.workflows=workflows;}
|
|
19
|
-
getSuggestions(lines,line,col){
|
|
20
|
-
const run=lines[line].slice(0,col).match(/^\/run\s+([^@"\s]*)$/);
|
|
21
|
-
if(run){
|
|
22
|
-
const query=run[1].toLowerCase(),items=this.workflows.filter(flow=>`${flow.id} ${flow.title??''}`.toLowerCase().includes(query)).map(flow=>({value:flow.id,label:flow.title??flow.id,description:flow.id,workflow:true}));
|
|
23
|
-
return items.length?{prefix:run[1],items}:null;
|
|
24
|
-
}
|
|
25
|
-
const prefix=lines[line].slice(0,col).match(/(?:^|\s)(@"[^"\n]*|@[^\s]*)$/)?.[1];
|
|
26
|
-
if(!prefix)return super.getSuggestions(lines,line,col);
|
|
27
|
-
const raw=prefix.slice(1).replace(/^"/,'').replaceAll('\\','/');
|
|
28
|
-
const expanded=raw.startsWith('~/')?path.join(homedir(),raw.slice(2)):raw;
|
|
29
|
-
const absolute=path.resolve(this.baseDir,expanded||'.');
|
|
30
|
-
const directory=!raw||raw.endsWith('/')?absolute:path.dirname(absolute);
|
|
31
|
-
const query=!raw||raw.endsWith('/')?'':path.basename(absolute).toLowerCase();
|
|
32
|
-
try{
|
|
33
|
-
const items=readdirSync(directory,{withFileTypes:true}).filter(e=>e.name.toLowerCase().startsWith(query)).map(e=>{
|
|
34
|
-
let dir=e.isDirectory();if(e.isSymbolicLink()){try{dir=statSync(path.join(directory,e.name)).isDirectory();}catch{}}
|
|
35
|
-
const head=raw.slice(0,raw.lastIndexOf('/')+1),file=head+e.name+(dir?'/':'');
|
|
36
|
-
return {value:`@${/[\s"]/.test(file)?JSON.stringify(file):file}`,label:safe(e.name)+(dir?'/':''),description:dir?'目录':'文件',directory:dir};
|
|
37
|
-
}).sort((a,b)=>(b.description==='目录')-(a.description==='目录')||a.label.localeCompare(b.label)).slice(0,100);
|
|
38
|
-
return items.length?{prefix,items}:null;
|
|
39
|
-
}catch{return null;}
|
|
40
|
-
}
|
|
41
|
-
getForceFileSuggestions(lines,line,col){return this.getSuggestions(lines,line,col);}
|
|
42
|
-
applyCompletion(lines,line,col,item,prefix){
|
|
43
|
-
if(item.workflow){const next=[...lines],before=lines[line].slice(0,col-prefix.length),text=item.value+' ';next[line]=before+text+lines[line].slice(col);return {lines:next,cursorLine:line,cursorCol:before.length+text.length};}
|
|
44
|
-
if(!prefix.startsWith('@'))return super.applyCompletion(lines,line,col,item,prefix);
|
|
45
|
-
const before=lines[line].slice(0,col-prefix.length);
|
|
46
|
-
let after=lines[line].slice(col);if(after.startsWith('"'))after=after.slice(1);
|
|
47
|
-
const completed=item.value+(item.directory?'':' '),next=[...lines];next[line]=before+completed+after;
|
|
48
|
-
return {lines:next,cursorLine:line,cursorCol:before.length+completed.length-(item.directory&&item.value.endsWith('"')?1:0)};
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
16
|
export class TerminalView{
|
|
53
|
-
constructor({baseDir,previewLabel,terminal=new ProcessTerminal()}={}){
|
|
17
|
+
constructor({baseDir,previewLabel,terminal=new ProcessTerminal(),fileAutocompleteOptions={}}={}){
|
|
18
|
+
this.fileAutocompleteOptions=fileAutocompleteOptions;this.fileProviders=new Set();
|
|
54
19
|
this.baseDir=baseDir;this.terminal=terminal;this.tui=new TUI(terminal);this.logs=[];this.runViews=new Map();
|
|
55
20
|
this.historyOffset=0;this.commandHistory=[];this.commandHistoryIndex=null;this.feed=new RunFeed(()=>this.refreshTranscript());
|
|
56
21
|
const originalStart=terminal.start.bind(terminal);
|
|
@@ -69,6 +34,7 @@ export class TerminalView{
|
|
|
69
34
|
}
|
|
70
35
|
if(matchesKey(data,'ctrl+c')){if(this.runViewer){this.runViewer.onClose();return;}if(this.cancelRun)this.cancelRun();this.pending?.reject(cancelled());return;}
|
|
71
36
|
if(matchesKey(data,'escape')&&this.pending&&!this.logViewer&&!this.runViewer){
|
|
37
|
+
this.editor?.autocompleteProvider?.cancelPending?.();
|
|
72
38
|
// 编辑器自己处理补全菜单 Escape,第二次 Escape 返回上一级。
|
|
73
39
|
if(this.editor?.isShowingAutocomplete?.()){input(data);return;}
|
|
74
40
|
this.pending.reject(cancelled());return;
|
|
@@ -87,10 +53,11 @@ export class TerminalView{
|
|
|
87
53
|
}
|
|
88
54
|
lines.push(line);
|
|
89
55
|
}
|
|
90
|
-
lines.push(this.homeInput?(width<45?`/ 操作 · ! 命令 · Ctrl+O ${this.feed.expanded?'收起':'展开'}`:`/ 操作 · ! 命令 · Ctrl+O ${this.feed.expanded?'收起':'展开'}
|
|
56
|
+
lines.push(this.homeInput?(width<45?`/ 操作 · ! 命令 · Ctrl+O ${this.feed.expanded?'收起':'展开'}`:`/ 操作 · ! 命令 · Ctrl+O ${this.feed.expanded?'收起':'展开'}原始输出 · /logs 回看 · Ctrl+C 退出`):this.editor&&this.multilineInput?'↑↓ 移动 · Tab 补全 · Esc 返回 · Ctrl+C 退出':(width<45?'↑↓ 选择 Enter 确认 Esc 返回':'↑↓ 选择 Enter 确认 Tab 补全 Esc 返回 Ctrl+C 退出'));
|
|
91
57
|
return lines.map(line=>line?fitLine(' '+palette.muted(line),width):'');
|
|
92
58
|
};
|
|
93
|
-
const
|
|
59
|
+
const renderText=this.transcript.render.bind(this.transcript);
|
|
60
|
+
const renderTranscript=width=>{if(this.transcriptWidth!==width)this.updateTranscript(width);return renderText(width);};
|
|
94
61
|
this.headingLines=(width,mark='FISHtools')=>{
|
|
95
62
|
const room=Math.max(1,width-2),lines=[''];
|
|
96
63
|
const summary=(this.summaryText??'').split('\n');
|
|
@@ -151,14 +118,31 @@ export class TerminalView{
|
|
|
151
118
|
this.tui.requestRender();return true;
|
|
152
119
|
}
|
|
153
120
|
async close(){
|
|
154
|
-
if(this.
|
|
155
|
-
this.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
121
|
+
if(this.closing)return this.closing;this.closed=true;
|
|
122
|
+
return this.closing=(async()=>{
|
|
123
|
+
try{
|
|
124
|
+
await Promise.all([...this.fileProviders].map(provider=>provider.close()));this.fileProviders.clear();
|
|
125
|
+
return await this.fileProbe?.close();
|
|
126
|
+
}finally{
|
|
127
|
+
this.feed.close();
|
|
128
|
+
// Pi 的渲染排在 nextTick;先排空最后一帧,再恢复终端,避免退出后隐藏光标。
|
|
129
|
+
await new Promise(resolve=>process.nextTick(resolve));this.tui.stop();
|
|
130
|
+
if(this.started)this.terminal.write(mouseOff+'\x1b[?1049l');
|
|
131
|
+
if(this.terminal instanceof ProcessTerminal)process.stdin.pause();
|
|
132
|
+
}
|
|
133
|
+
})();
|
|
160
134
|
}
|
|
161
135
|
summary(text){this.summaryText=safe(text);this.tui.requestRender();}
|
|
136
|
+
recordCommand(text,{display=false}={}){
|
|
137
|
+
// 表单参数不写入可召回命令;Shell 原文仍保留末尾换行。
|
|
138
|
+
const command=text.trimStart().startsWith('!')?text:text.trim();
|
|
139
|
+
if(!command)return;
|
|
140
|
+
if(this.commandHistory.at(-1)!==command){
|
|
141
|
+
this.commandHistory.push(command);if(this.commandHistory.length>100)this.commandHistory.shift();
|
|
142
|
+
this.commandHistoryIndex=null;this.onHistoryChange?.();
|
|
143
|
+
}
|
|
144
|
+
if(display)this.feed.message('› '+safe(command));
|
|
145
|
+
}
|
|
162
146
|
beginCommand(text){
|
|
163
147
|
const name=text.trim().split(/\s+/)[0].replace(/^\//,'');
|
|
164
148
|
const labels={workflows:'工作流',run:'运行工作流',plugin:'插件管理',plugins:'插件管理',config:'工具配置',pack:'打包',logs:'执行记录',runs:'执行记录',tools:'工具',help:'帮助',exit:'退出'};
|
|
@@ -168,19 +152,22 @@ export class TerminalView{
|
|
|
168
152
|
endCommand(){
|
|
169
153
|
this.commandLocation=null;this.tui.requestRender();
|
|
170
154
|
}
|
|
171
|
-
transcriptText(){return [...this.logs,this.feed.text()].filter(Boolean).join('\n\n');}
|
|
155
|
+
transcriptText(width=this.terminal.columns){return [...this.logs,this.feed.text(Math.max(1,width-2))].filter(Boolean).join('\n\n');}
|
|
172
156
|
refreshTranscript(){
|
|
173
157
|
const width=this.terminal.columns,previous=this.transcript.render===undefined?0:new Text(safe(this.lastTranscript??''),1,0).render(width).length;
|
|
174
|
-
const text=safe(this.transcriptText());
|
|
158
|
+
const text=safe(this.transcriptText(width));
|
|
175
159
|
if(this.historyOffset>0)this.historyOffset=Math.max(0,this.historyOffset+new Text(text,1,0).render(width).length-previous);
|
|
176
|
-
this.
|
|
160
|
+
this.updateTranscript(width,text);this.tui.requestRender();this.onHistoryChange?.();
|
|
161
|
+
}
|
|
162
|
+
updateTranscript(width,text=safe(this.transcriptText(width))){
|
|
163
|
+
this.transcriptWidth=width;this.lastTranscript=text;this.transcript.setText(text.split('\n').map(line=>line.startsWith('✗ ')?palette.error(line):/^[›✓●] /.test(line)?palette.brand(line):line.startsWith('↩ ')?palette.muted(line):line).join('\n'));
|
|
177
164
|
}
|
|
178
165
|
trackRun(options){this.feed.track(options);}
|
|
179
166
|
clearMessages(){this.logs=[];this.refreshTranscript();}
|
|
180
167
|
show(message,{kind='message'}={}){
|
|
181
168
|
const text=safe(message).slice(0,6000);
|
|
182
169
|
const formatted=kind==='welcome'?text.split('\n').map((line,i)=>i===0?palette.text(line):palette.muted(line)).join('\n'):text;
|
|
183
|
-
if(kind!=='welcome'){this.feed.message(
|
|
170
|
+
if(kind!=='welcome'){this.feed.message(safe(message));return;}
|
|
184
171
|
this.logs.push(formatted);this.logs=this.logs.slice(-6);this.refreshTranscript();
|
|
185
172
|
}
|
|
186
173
|
async viewMarkdown(title,text){
|
|
@@ -190,7 +177,7 @@ export class TerminalView{
|
|
|
190
177
|
try{
|
|
191
178
|
await new Promise((resolve,reject)=>{
|
|
192
179
|
this.pending={resolve,reject};
|
|
193
|
-
this.logViewer=new MarkdownLogViewer({title:safe(title),text
|
|
180
|
+
this.logViewer=new MarkdownLogViewer({title:safe(title),text,terminal:this.terminal,onClose:resolve,requestRender:()=>this.tui.requestRender()});
|
|
194
181
|
this.terminal.write(mouseOn);
|
|
195
182
|
// Overlay 的基底为空,旧 transcript 不再撑高滚动区域;关闭后原样恢复。
|
|
196
183
|
this.tui.children=[];
|
|
@@ -204,25 +191,47 @@ export class TerminalView{
|
|
|
204
191
|
}
|
|
205
192
|
}
|
|
206
193
|
async observeRun({app,runId,record,flow,workflows=[],initialView}){
|
|
207
|
-
|
|
194
|
+
let options={app,runId,record,flow,workflows,initialView};
|
|
195
|
+
for(;;){
|
|
196
|
+
const output=await this.observeRunPage(options);if(output===undefined)return;
|
|
197
|
+
await this.viewMarkdown('执行结果',output);options={...options,record:undefined,initialView:undefined};
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async observeRunPage({app,runId,record,flow,workflows=[],initialView}){
|
|
201
|
+
const previousPending=this.pending??null,children=this.tui.children;let overlay,unsubscribe,unsubscribeFinished,elapsedTimer,readPages=false,renderedOutput;
|
|
208
202
|
const initial=app.getRun(runId)??record??await app.readRun(runId);
|
|
209
203
|
if(!initial)throw new Error('这次运行记录已不存在');
|
|
210
204
|
try{
|
|
211
205
|
await new Promise((resolve,reject)=>{
|
|
212
206
|
this.pending={resolve,reject};
|
|
213
|
-
|
|
214
|
-
Object.assign(
|
|
215
|
-
if(initialView!==undefined){
|
|
216
|
-
|
|
207
|
+
const viewer=new RunViewer({record:initial,flow:initial.status==='running'?flow:undefined,workflows,catalog:presentationCatalog(app),terminal:this.terminal,onClose:resolve,onCancel:()=>app.cancelRun(runId),onReadLogs:app.readLogPage?()=>{readPages=true;resolve();}:undefined,onReadOutput:()=>{renderedOutput=width=>viewer.getRenderedOutput(width,{markdown:true});resolve();},requestRender:()=>this.tui.requestRender()});
|
|
208
|
+
this.runViewer=viewer;Object.assign(viewer,this.runViews.get(runId)??{});
|
|
209
|
+
if(initialView!==undefined){viewer.view=initialView;viewer.offset=0;}
|
|
210
|
+
const stopElapsed=()=>{if(elapsedTimer){clearInterval(elapsedTimer);elapsedTimer=null;}};
|
|
211
|
+
const finish=record=>{
|
|
212
|
+
if(this.runViewer!==viewer)return;
|
|
213
|
+
viewer.update(record);stopElapsed();
|
|
214
|
+
};
|
|
215
|
+
// 收尾晚于终态事件时补最终状态;关闭页面解除监听,不让长任务留住旧阅读器。
|
|
216
|
+
unsubscribeFinished=this.feed.subscribeFinished(runId,finish);
|
|
217
|
+
unsubscribe=app.subscribe(event=>{if(event.runId===runId&&this.runViewer===viewer)viewer.update(app.getRun(runId));});
|
|
218
|
+
if(initial.status==='running')elapsedTimer=setInterval(()=>{
|
|
219
|
+
const record=app.getRun(runId)??this.feed.runs.get(runId)?.record;viewer.update(record);
|
|
220
|
+
if(!record||record.status!=='running')stopElapsed();
|
|
221
|
+
if(!record&&app.readRun)void app.readRun(runId).then(record=>{if(this.runViewer===viewer)viewer.update(record);},()=>{});
|
|
222
|
+
},1000);
|
|
223
|
+
elapsedTimer?.unref?.();
|
|
217
224
|
this.tui.children=[];this.terminal.write(mouseOn);
|
|
218
225
|
overlay=this.tui.showOverlay(this.runViewer,{width:'100%',maxHeight:'100%',anchor:'top-left',margin:0});this.tui.requestRender(true);
|
|
219
226
|
});
|
|
220
227
|
}finally{
|
|
221
228
|
if(this.runViewer){const {view,selected,offset,follow,allLogs,raw}=this.runViewer;this.runViews.set(runId,{view,selected,offset,follow,allLogs,raw});}
|
|
222
229
|
if(this.runViews.size>30)this.runViews.delete(this.runViews.keys().next().value);
|
|
223
|
-
unsubscribe?.();this.runViewer=null;this.tui.children=children;this.pending=previousPending;overlay?.hide();this.terminal.write(mouseOff);this.tui.requestRender(true);
|
|
230
|
+
unsubscribe?.();unsubscribeFinished?.();this.runViewer=null;this.tui.children=children;this.pending=previousPending;overlay?.hide();this.terminal.write(mouseOff);this.tui.requestRender(true);
|
|
231
|
+
if(elapsedTimer)clearInterval(elapsedTimer);
|
|
224
232
|
}
|
|
225
233
|
if(readPages)await this.viewLogPages(app,runId);
|
|
234
|
+
return renderedOutput;
|
|
226
235
|
}
|
|
227
236
|
async viewLogPages(app,id){
|
|
228
237
|
let cursor=0;const previous=[];
|
|
@@ -242,17 +251,16 @@ export class TerminalView{
|
|
|
242
251
|
}
|
|
243
252
|
async ask(message,component){
|
|
244
253
|
fit(component);
|
|
245
|
-
const title=new Text(
|
|
246
|
-
|
|
247
|
-
title.render=width=>
|
|
248
|
-
|
|
254
|
+
const title=new Text('',1,0);
|
|
255
|
+
// 参数预览可随窗口尺寸重新排版;普通字符串标题保持原有行为。
|
|
256
|
+
title.render=width=>{
|
|
257
|
+
const text=typeof message==='function'?message(width,this.terminal.rows):message;
|
|
258
|
+
return [fitLine(' '+palette.border('─'.repeat(Math.max(1,width-2))),width),...new Text(palette.brand('› ')+palette.text(safe(text)),1,0).render(width)];
|
|
259
|
+
};
|
|
260
|
+
if(typeof message==='string'&&message.startsWith('fst >'))title.render=()=>[];
|
|
249
261
|
this.prompt.clear();this.prompt.addChild(title);this.prompt.addChild(component);this.tui.setFocus(component);this.tui.requestRender();
|
|
250
262
|
try{return await new Promise((resolve,reject)=>{this.pending={resolve,reject};component.onSubmit=text=>{
|
|
251
|
-
|
|
252
|
-
const historyText=text.trimStart().startsWith('!')?text:text.trim();
|
|
253
|
-
if(this.homeInput&&historyText&&this.commandHistory.at(-1)!==historyText){
|
|
254
|
-
this.commandHistory.push(historyText);if(this.commandHistory.length>100)this.commandHistory.shift();
|
|
255
|
-
}
|
|
263
|
+
if(this.homeInput)this.recordCommand(text);
|
|
256
264
|
resolve(text);
|
|
257
265
|
};component.onSelect=item=>resolve(item.value);component.onCancel=()=>reject(cancelled());});}
|
|
258
266
|
finally{if(this.homeInput)this.terminal.write(mouseOff);this.pending=null;this.editor=null;this.homeInput=false;this.multilineInput=false;this.prompt.clear();this.tui.requestRender();}
|
|
@@ -298,14 +306,41 @@ export class TerminalView{
|
|
|
298
306
|
if(this.homeInput)this.terminal.write(mouseOn);
|
|
299
307
|
this.editor=editor;editor.setText(this.homeInput?(this.homeDraft??value):value);
|
|
300
308
|
if(this.homeInput)this.homeDraft=undefined;
|
|
301
|
-
|
|
302
|
-
|
|
309
|
+
let provider;
|
|
310
|
+
if(files||commands.length){
|
|
311
|
+
// 预算属于整个终端;未退出的 worker 不能因切换输入框而被遗忘。
|
|
312
|
+
this.fileProbe??=createAutocompleteProbe(this.fileAutocompleteOptions);
|
|
313
|
+
provider=new FileAutocomplete(commands,this.baseDir,workflows,{...this.fileAutocompleteOptions,probe:this.fileProbe,ownsProbe:false,files,onUpdate:snapshot=>{
|
|
314
|
+
const cursor=editor.getCursor();
|
|
315
|
+
if(this.closed||this.editor!==editor||!this.pending||this.logViewer||this.runViewer||editor.getText()!==snapshot.lines.join('\n')||cursor.line!==snapshot.line||cursor.col!==snapshot.col)return;
|
|
316
|
+
// pi-tui 的 updateAutocomplete 只更新已打开的菜单;冷缓存要用此入口重新建立候选。
|
|
317
|
+
// 此调用只更新菜单,绝不调用 applyCompletion 或合成 Tab 按键。
|
|
318
|
+
editor.tryTriggerAutocomplete();this.tui.requestRender();
|
|
319
|
+
}});
|
|
320
|
+
this.fileProviders.add(provider);editor.setAutocompleteProvider(provider);
|
|
321
|
+
const input=editor.handleInput.bind(editor);
|
|
322
|
+
editor.handleInput=data=>{
|
|
323
|
+
const before=editor.getText();provider.cancelPending();input(data);
|
|
324
|
+
const cursor=editor.getCursor(),text=editor.getLines()[cursor.line].slice(0,cursor.col);
|
|
325
|
+
// 冷缓存时上游已收起菜单,继续输入不会走 updateAutocomplete,需再次触发查询。
|
|
326
|
+
if(editor.getText()!==before&&text&&!/\s$/.test(text)&&!editor.isShowingAutocomplete())editor.tryTriggerAutocomplete();
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
return this.ask(message,editor).finally(async()=>{if(provider){await provider.close();this.fileProviders.delete(provider);}});
|
|
303
330
|
}
|
|
304
331
|
async select(message,items){
|
|
305
332
|
if(!items.length)throw new Error('当前没有可选择的项目');
|
|
306
|
-
const
|
|
333
|
+
const visibleItems=()=>items.filter(item=>!item.hidden?.()).map(i=>({...i,label:safe(i.label).replace(/\s+/g,' '),description:i.description?safe(i.description).replace(/\s+/g,' '):undefined}));
|
|
334
|
+
const list=new SelectList(visibleItems(),8,theme);
|
|
307
335
|
list.render=width=>{
|
|
308
|
-
|
|
336
|
+
// 缩放窗口后保留当前选项;只显示此刻确实需要的展开入口。
|
|
337
|
+
const selected=list.getSelectedItem()?.value;
|
|
338
|
+
const previousIndex=list.selectedIndex;
|
|
339
|
+
list.filteredItems=visibleItems();
|
|
340
|
+
const selectedIndex=list.filteredItems.findIndex(item=>item.value===selected);
|
|
341
|
+
list.selectedIndex=selectedIndex>=0?selectedIndex:Math.min(previousIndex,list.filteredItems.length-1);
|
|
342
|
+
const text=typeof message==='function'?message(width,this.terminal.rows):message;
|
|
343
|
+
const reserved=this.headingLines(width).length+new Text(palette.text(safe(text)),1,0).render(width).length+this.hint.render(width).length+2;
|
|
309
344
|
list.maxVisible=Math.max(1,Math.min(8,this.terminal.rows-reserved));
|
|
310
345
|
const start=Math.max(0,Math.min(list.selectedIndex-Math.floor(list.maxVisible/2),list.filteredItems.length-list.maxVisible));
|
|
311
346
|
const end=Math.min(start+list.maxVisible,list.filteredItems.length),lines=[];
|
|
@@ -3,7 +3,7 @@ export async function workflowMenu(session){
|
|
|
3
3
|
while(true){
|
|
4
4
|
const workflows=await app.listWorkflows();
|
|
5
5
|
const choice=await ui.select('工作流 · 选择后编辑或执行',[
|
|
6
|
-
...workflows.map(flow=>({value:`workflow:${flow.id}`,label:flow.title??flow.id,description:`${flow.id} · ${flow.steps.length} 步`})),
|
|
6
|
+
...workflows.map(flow=>({value:`workflow:${flow.id}`,label:flow.title??flow.id,description:flow.status==='invalid'?flow.diagnostic.message:`${flow.id} · ${flow.steps.length} 步`})),
|
|
7
7
|
...(!app.project.readOnly?[{value:'new',label:'+ 新建工作流'}]:[]),
|
|
8
8
|
...(session.dirty?[{value:'draft',label:`继续编辑草稿:${session.flow.title}`}]:[]),
|
|
9
9
|
{value:'back',label:'返回主面板'},
|
|
@@ -11,10 +11,12 @@ export async function workflowMenu(session){
|
|
|
11
11
|
if(choice==='back')return;
|
|
12
12
|
try{
|
|
13
13
|
const id=choice.startsWith('workflow:')?choice.slice(9):null;
|
|
14
|
+
const selected=workflows.find(flow=>flow.id===id);
|
|
15
|
+
if(selected?.status==='invalid'){ui.show(`工作流不可用:${selected.diagnostic.message}`);continue;}
|
|
14
16
|
if(choice==='new'){if(await session.execute('/new')===false)continue;}
|
|
15
17
|
else if(choice!=='draft'&&session.flow?.id!==id){
|
|
16
18
|
if(!await session.discard())continue;
|
|
17
|
-
session.
|
|
19
|
+
session.loadWorkflow(workflows.find(flow=>flow.id===id));
|
|
18
20
|
}
|
|
19
21
|
if(await editWorkflow(session)==='running')return;
|
|
20
22
|
}catch(error){if(error.code!=='PROMPT_CANCELLED')throw error;}
|
|
@@ -30,18 +32,23 @@ async function editWorkflow(session){
|
|
|
30
32
|
...(!app.project.readOnly?[
|
|
31
33
|
{value:'add',label:'添加步骤 / 控制流'}, {value:'steps',label:'编辑步骤、参数与顺序'},
|
|
32
34
|
{value:'outputs',label:'设置最终输出'},{value:'save',label:'保存工作流'},
|
|
33
|
-
{value:'duplicate',label:'
|
|
34
|
-
{value:'delete',label:'
|
|
35
|
+
{value:'duplicate',label:`复制为新工作流${session.dirty?'(包含当前未保存修改)':''}`},
|
|
36
|
+
{value:'delete',label:'删除工作流'},
|
|
35
37
|
]:[{value:'steps',label:'查看步骤'}]),
|
|
36
|
-
{value:'back',label:'
|
|
38
|
+
{value:'back',label:`返回工作流列表${session.dirty?'(保留草稿)':''}`},
|
|
37
39
|
]);
|
|
38
40
|
if(choice==='back')return;
|
|
39
41
|
try{
|
|
40
42
|
if(choice==='delete'){
|
|
41
|
-
if(!await ui.confirm(`删除 ${flow.title??flow.id}?已保存文件会移入备份,未保存修改将放弃。`))continue;
|
|
42
43
|
const exists=(await app.listWorkflows()).some(w=>w.id===flow.id);
|
|
43
|
-
const
|
|
44
|
-
|
|
44
|
+
const operation=await ui.select(`删除 ${flow.title??flow.id}?${session.dirty?'当前未保存修改将放弃。':''}`, [
|
|
45
|
+
{value:'cancel',label:'取消,返回'},
|
|
46
|
+
...(exists?[{value:'backup',label:'备份后删除',description:'保留已保存文件,可恢复'},
|
|
47
|
+
{value:'delete',label:'直接删除',description:'不创建本次删除的备份'}]:[{value:'delete',label:'丢弃未保存的草稿'}]),
|
|
48
|
+
]);
|
|
49
|
+
if(operation==='cancel')continue;
|
|
50
|
+
const backup=exists?await app.removeWorkflow(flow.id,{backup:operation==='backup'}):null;
|
|
51
|
+
session.loadWorkflow(null);ui.show(backup?`工作流已移入备份:${backup}`:exists?'工作流已删除,未创建本次删除的备份。':'未保存的草稿已丢弃。');return;
|
|
45
52
|
}
|
|
46
53
|
if(choice==='run'){
|
|
47
54
|
if(await session.startRun([],{draft:true}))return 'running';
|
|
@@ -55,6 +62,6 @@ async function duplicateIntoSession(session,source){
|
|
|
55
62
|
const title=(await session.ui.input('新工作流名称',{value:`${source.title??source.id} 副本`,files:false})).trim();
|
|
56
63
|
if(!title)throw new Error('名称不能为空');
|
|
57
64
|
const {definition}=await session.app.duplicateWorkflow(source,{title});
|
|
58
|
-
session.
|
|
59
|
-
session.ui.show(`已创建副本:${definition.title}(${definition.id})。原工作流 ${source.id}
|
|
65
|
+
session.loadWorkflow(definition);
|
|
66
|
+
session.ui.show(`已创建副本:${definition.title}(${definition.id})。原工作流 ${source.id} 未修改。`);
|
|
60
67
|
}
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
|
|
20
20
|
## 维护与验证
|
|
21
21
|
|
|
22
|
+
`plugin lint` 的 `UNMANAGED_PROCESS` 迁移警告识别可追溯的 child_process、execa、cross-spawn、shelljs.exec 及平台底层 runProcess 调用,指向文件行列并建议上下文 ctx.runProcess。只导入未调用、注释、字符串及无法确认的局部重名不据此告警。诊断保持 warning,不拒绝旧插件;复杂动态代码、依赖内部和解释器内部不保证覆盖,不构成安全隔离。
|
|
23
|
+
|
|
22
24
|
本模块负责上述职责的实现、文档与回归;跨模块接口调整需要同时检查生产者与消费者。具体维护人员尚未指定。
|
|
23
25
|
|
|
24
26
|
在仓库根目录执行:
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
],
|
|
17
17
|
"license": "MIT",
|
|
18
18
|
"engines": {
|
|
19
|
-
"node": ">=24.
|
|
19
|
+
"node": "^22.22.2 || >=24.0.0"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@mytools/sdk": "0.1.0",
|
|
23
23
|
"@mytools/fst-platform": "0.1.0",
|
|
24
24
|
"@mytools/fst-plugin": "0.1.0",
|
|
25
25
|
"semver": "7.7.4",
|
|
26
|
-
"validate-npm-package-name": "
|
|
26
|
+
"validate-npm-package-name": "7.0.2",
|
|
27
27
|
"acorn": "8.19.0"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -3,6 +3,7 @@ import {readFile,realpath} from 'node:fs/promises';
|
|
|
3
3
|
import {isBuiltin,createRequire} from 'node:module';
|
|
4
4
|
import {fileURLToPath,pathToFileURL} from 'node:url';
|
|
5
5
|
import {parse} from 'acorn';
|
|
6
|
+
import {inspectProcessUsage} from './process-usage.js';
|
|
6
7
|
|
|
7
8
|
const nonempty=value=>typeof value==='string'&&value.trim().length>0;
|
|
8
9
|
function inspectSchema(schema,location,warning,seen=new WeakSet()){
|
|
@@ -84,6 +85,8 @@ function sourceReferences(ast,commonjs,warning,location){
|
|
|
84
85
|
base?.type==='MemberExpression'&&!base.computed&&base.property.name==='url'&&base.object.type==='MetaProperty'&&base.object.meta.name==='import')loaders.add(node.id.name);
|
|
85
86
|
});
|
|
86
87
|
// 保守跳过文件内重名绑定;不把局部对象当作 Node 全局对象。
|
|
88
|
+
const isRequire=node=>node.callee?.type==='Identifier'&&((commonjs&&!bindings.has('require')&&node.callee.name==='require')||loaders.has(node.callee.name));
|
|
89
|
+
inspectProcessUsage(ast,{bindings,isRequire,walk},warning,location);
|
|
87
90
|
walk(ast,node=>{
|
|
88
91
|
const at=`${location}:${node.loc.start.line}:${node.loc.start.column+1}`;
|
|
89
92
|
if(['ImportDeclaration','ExportNamedDeclaration','ExportAllDeclaration','ImportExpression'].includes(node.type)&&typeof node.source?.value==='string'){
|
|
@@ -91,7 +94,7 @@ function sourceReferences(ast,commonjs,warning,location){
|
|
|
91
94
|
}
|
|
92
95
|
if(node.type!=='CallExpression')return;
|
|
93
96
|
const callee=node.callee;
|
|
94
|
-
if(
|
|
97
|
+
if(isRequire(node)&&typeof node.arguments[0]?.value==='string'){
|
|
95
98
|
references.push({specifier:node.arguments[0].value,at,commonjs:true});
|
|
96
99
|
}
|
|
97
100
|
if(!bindings.has('console')&&callee.type==='MemberExpression'&&callee.object.type==='Identifier'&&callee.object.name==='console'&&
|
|
@@ -38,6 +38,7 @@ export async function lintPluginDirectory(directory){
|
|
|
38
38
|
const quality=await import('./plugin-quality.js');
|
|
39
39
|
return {...await inspectPluginDirectory(directory,quality),notes:[...validationNotes(),
|
|
40
40
|
{code:'STATIC_SCAN_LIMITS',message:'源码检查仅覆盖入口可达的本地 JavaScript 和字面量依赖;动态加载、别名调用和局部重名可能无法识别。质量警告不会修改文件,也不代表运行结果或安全保证。'},
|
|
41
|
+
{code:'UNMANAGED_PROCESS_LIMITS',message:'进程检查只定位可识别的直接调用;动态计算、复杂别名、依赖包及 Python/Shell 内部执行不保证覆盖。迁移警告不阻止旧插件加载,不构成安全隔离或自动提权。'},
|
|
41
42
|
]};
|
|
42
43
|
}
|
|
43
44
|
|
|
@@ -125,7 +126,7 @@ async function inspectPluginDirectory(directory,quality){
|
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
function scaffold(name){
|
|
128
|
-
const packageJson={name,version:'1.0.0',type:'module',main:'index.js',files:['index.js','test','README.md','LICENSE'],scripts:{test:'node --test'},license:'MIT',engines:{node:'>=24.
|
|
129
|
+
const packageJson={name,version:'1.0.0',type:'module',main:'index.js',files:['index.js','test','README.md','LICENSE'],scripts:{test:'node --test'},license:'MIT',engines:{node:'^22.22.2 || >=24.0.0'}};
|
|
129
130
|
const plugin=`// 直接导出插件定义,无需安装内部 SDK。\nexport default {\n id:${JSON.stringify(name)},version:'1.0.0',sdk:'^0.1.0',\n title:'嵌套输入示例',description:'演示业务结果、嵌套输入和判定预设。',\n platforms:['win32','linux','darwin'],architectures:['x64','arm64'],\n actions:{\n check:{\n title:'检查请求',description:'根据嵌套请求生成业务结果。',\n input:{type:'object',properties:{request:{type:'object',properties:{name:{type:'string',minLength:1,title:'姓名'},enabled:{type:'boolean',title:'启用'}},required:['name','enabled'],additionalProperties:false}},required:['request'],additionalProperties:false},\n output:{type:'object',properties:{ok:{type:'boolean'},message:{type:'string'}},required:['ok','message'],additionalProperties:false},\n conditions:{passed:{title:'业务通过',path:'ok',op:'eq',value:true}},\n requirements:{privilege:{win32:{level:'user'},linux:{level:'user'}}},\n async run({request},{signal}={}){\n signal?.throwIfAborted?.();\n return request.enabled?{ok:true,message:\`你好,\${request.name}\`}:{ok:false,message:'已禁用'};\n },\n },\n },\n};\n`;
|
|
130
131
|
const testSource=`import test from 'node:test';\nimport assert from 'node:assert/strict';\nimport plugin from '../index.js';\n\ntest('嵌套参数和业务判定',async()=>{\n assert.deepEqual(await plugin.actions.check.run({request:{name:'阿青',enabled:true}}),{ok:true,message:'你好,阿青'});\n assert.deepEqual(await plugin.actions.check.run({request:{name:'阿青',enabled:false}}),{ok:false,message:'已禁用'});\n});\n`;
|
|
131
132
|
const readme=`# ${name}\n\n可独立安装的 Fishtools 插件示例,不依赖尚未公开发布的 SDK。\n\n## 使用\n\n在本目录运行 \`npm test\`,并运行 \`fst plugin validate .\` 检查声明。安装后可将 \`${name}:check\` 加入工作流。\n\n输入示例:\n\n\`\`\`json\n{"request":{"name":"阿青","enabled":true}}\n\`\`\`\n\n输出含 \`ok\` 与 \`message\`。\`ok:false\` 表示业务未通过,但动作仍正常返回;\`conditions.passed\` 可供工作流分支使用。请同步修改 package.json 和 index.js 中的名称、版本,并根据实际支持情况调整 platforms / architectures。\n`;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const processMembers=new Set(['spawn','spawnSync','exec','execSync','execFile','execFileSync','fork']);
|
|
2
|
+
const sources=new Set(['node:child_process','child_process','execa','cross-spawn','shelljs','@mytools/fst-platform']);
|
|
3
|
+
const property=node=>node.computed?node.property?.value:node.property?.name;
|
|
4
|
+
|
|
5
|
+
function launches({source,members}){
|
|
6
|
+
const names=members[0]==='default'?members.slice(1):members;
|
|
7
|
+
if(['node:child_process','child_process'].includes(source))return names.length===1&&processMembers.has(names[0]);
|
|
8
|
+
if(source==='execa')return names.length===0||names.length===1&&['execa','execaSync','execaCommand','execaCommandSync','execaNode','$'].includes(names[0]);
|
|
9
|
+
if(source==='cross-spawn')return names.length===0||names.length===1&&['spawn','sync'].includes(names[0]);
|
|
10
|
+
if(source==='shelljs')return names.length===1&&names[0]==='exec';
|
|
11
|
+
return source==='@mytools/fst-platform'&&names.length===1&&names[0]==='runProcess';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 仅诊断能追溯到已知模块的调用,不以模块导入本身判定违规,也不执行源码。
|
|
15
|
+
export function inspectProcessUsage(ast,{bindings,isRequire,walk},warning,location){
|
|
16
|
+
const imported=new Map(),variables=new Map(),mutated=new Set();
|
|
17
|
+
const rootName=node=>node?.type==='Identifier'?node.name:node?.type==='MemberExpression'?rootName(node.object):undefined;
|
|
18
|
+
walk(ast,node=>{
|
|
19
|
+
if(node.type==='ImportDeclaration'&&sources.has(node.source.value))for(const spec of node.specifiers){
|
|
20
|
+
imported.set(spec.local.name,{source:node.source.value,members:spec.type==='ImportNamespaceSpecifier'?[]:[spec.type==='ImportDefaultSpecifier'?'default':spec.imported.name??spec.imported.value]});
|
|
21
|
+
}
|
|
22
|
+
if(node.type==='VariableDeclarator'){
|
|
23
|
+
if(node.id.type==='Identifier')variables.set(node.id.name,{value:node.init,members:[]});
|
|
24
|
+
else if(node.id.type==='ObjectPattern')for(const spec of node.id.properties){
|
|
25
|
+
if(spec.type==='Property'&&spec.value.type==='Identifier'&&(!spec.computed||typeof spec.key.value==='string'))variables.set(spec.value.name,{value:node.init,members:[spec.computed?spec.key.value:spec.key.name??spec.key.value]});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if(['AssignmentExpression','UpdateExpression','UnaryExpression'].includes(node.type)){
|
|
29
|
+
const target=node.left??node.argument;
|
|
30
|
+
if(target?.type==='MemberExpression'&&(node.type!=='UnaryExpression'||node.operator==='delete'))mutated.add(rootName(target));
|
|
31
|
+
if(node.type==='UpdateExpression'&&target?.type==='Identifier')mutated.add(target.name);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
function resolve(node,seen=new Set()){
|
|
35
|
+
if(!node)return;
|
|
36
|
+
if(node.type==='AwaitExpression'||node.type==='ChainExpression')return resolve(node.argument??node.expression,seen);
|
|
37
|
+
if(node.type==='Identifier'){
|
|
38
|
+
if(bindings.get(node.name)!==1||mutated.has(node.name)||seen.has(node.name))return;
|
|
39
|
+
if(imported.has(node.name))return imported.get(node.name);
|
|
40
|
+
const variable=variables.get(node.name);if(!variable)return;
|
|
41
|
+
const result=resolve(variable.value,new Set([...seen,node.name]));
|
|
42
|
+
return result&&{source:result.source,members:[...result.members,...variable.members]};
|
|
43
|
+
}
|
|
44
|
+
if(node.type==='MemberExpression'){
|
|
45
|
+
const name=property(node);if(typeof name!=='string')return;
|
|
46
|
+
const result=resolve(node.object,seen);return result&&{source:result.source,members:[...result.members,name]};
|
|
47
|
+
}
|
|
48
|
+
// Execa 的对象参数只绑定选项,返回的函数被调用时才启动程序。
|
|
49
|
+
if(node.type==='CallExpression'&&node.arguments[0]?.type==='ObjectExpression'){
|
|
50
|
+
const target=resolve(node.callee,seen);
|
|
51
|
+
if(target?.source==='execa'&&launches(target))return target;
|
|
52
|
+
}
|
|
53
|
+
const source=node.type==='ImportExpression'?node.source?.value:node.type==='CallExpression'&&isRequire(node)?node.arguments[0]?.value:undefined;
|
|
54
|
+
if(sources.has(source))return {source,members:[]};
|
|
55
|
+
}
|
|
56
|
+
walk(ast,node=>{
|
|
57
|
+
if(!['CallExpression','TaggedTemplateExpression'].includes(node.type))return;
|
|
58
|
+
const target=resolve(node.callee??node.tag);if(!target||!launches(target))return;
|
|
59
|
+
if(target.source==='execa'&&node.type==='CallExpression'&&node.arguments[0]?.type==='ObjectExpression')return;
|
|
60
|
+
warning('UNMANAGED_PROCESS',`直接调用 ${target.source}${target.members.length?'.'+target.members.join('.'):''} 可能绕过统一执行记录、取消与代理规则;执行外部程序请改用 ctx.runProcess(file, args, options)。此提示不代表该调用已执行`,`${location}:${node.loc.start.line}:${node.loc.start.column+1}`);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 职责与边界
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
运行日志写入器、串行落盘、有界事件缓存、快照、历史分页、保留和体积统计,以及 TUI 会话元数据和完整交互摘要存储。运行调度由 core 负责。
|
|
8
8
|
|
|
9
9
|
内部依赖:`@mytools/sdk`。
|
|
10
10
|
## 公开入口
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
| `@mytools/fst-logs/markdown` | `./src/markdown-log.js` |
|
|
16
16
|
| `@mytools/fst-logs/steps` | `./src/step-summaries.js` |
|
|
17
17
|
| `@mytools/fst-logs/preview` | `./src/run-preview.js` |
|
|
18
|
+
| `@mytools/fst-logs/sessions` | `./src/session-history.js` |
|
|
18
19
|
| `@mytools/fst-logs/package.json` | `./package.json` |
|
|
19
20
|
|
|
20
21
|
仅依赖 exports 声明的入口,禁止消费者跨包读取 src/bin 私有文件。入口路径由本模块维护,修改协议时同步消费方回归。
|
|
@@ -56,6 +57,26 @@ maxValueBytes 至少为 2,连预览本身也容不下时省略字段值并保
|
|
|
56
57
|
|
|
57
58
|
拒绝日志根目录、运行目录或正文文件链接,已有同 ID 日志拒绝覆盖。体积统计和保留策略仅涉及 `run.md`、`events.jsonl`、`result.json`、`run.meta.json` 四个约定文件;业务文件和子目录保持保留。统计不递归、不读取正文。普通文件系统检查不能提供针对恶意并发路径替换的操作系统安全沙箱。
|
|
58
59
|
|
|
60
|
+
## TUI 会话持久化
|
|
61
|
+
|
|
62
|
+
`createSessionHistory(directory,{projectDir,maxBytes=2097152,maxEntryBytes=65536,maxPageBytes=524288,maxPendingBytes=8388608})` 从 `/sessions` 入口创建会话存储器。调用方决定本地会话目录,测试必须使用临时目录,不能写入真实 `FISHTOOLS_HOME`。会话使用严格 UUID 格式的 ID,按工作区绝对路径保存 `sessionOwner`;Windows 路径比较忽略大小写。
|
|
63
|
+
|
|
64
|
+
每个会话有两个文件:`<id>.json` 保存轻量元数据和最近视图,`<id>.jsonl` 持续追加全部交互摘要。输入、反馈、运行开始和最终结果都应由 TUI 逐条追加;最近视图的条目数量限制不会删除 JSONL 中更早的交互。完整进程输出继续放在原运行日志中,会话摘要只保存有界结果预览与对应运行 ID。会话文件默认使用可直接读取的 UTF-8 JSON,不自动加密、压缩或删除历史。
|
|
65
|
+
|
|
66
|
+
| 方法 | 行为 |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| `save(snapshot)` | 保存 `schemaVersion:1`、UUID `id`、`startedAt`、`updatedAt`、可选 `resumedFrom`、`commandHistory` 字符串数组和 `feed` 最近视图数组,并自动写入 `sessionOwner`;其余 JSON 字段同样保留 |
|
|
69
|
+
| `read(id)` | 校验归属后返回当前元数据;不加载完整交互正文 |
|
|
70
|
+
| `list()` | 按最近更新时间列出轻量摘要:`schemaVersion`、`id`、`sessionOwner`、`startedAt`、`updatedAt`、可选 `resumedFrom`、`commandCount`、`feedCount` |
|
|
71
|
+
| `append(id,entry)` | 在已保存元数据的会话中追加一个 JSON 对象;保留条目原结构,并等待文件写入和同步完成 |
|
|
72
|
+
| `page(id,{cursor=0,limit=100})` | 返回 `{entries,cursor,nextCursor,hasMore,totalBytes}`;`cursor` 是完整 JSONL 记录边界的字节位置,`limit` 是条目数,上限 200 |
|
|
73
|
+
|
|
74
|
+
同一进程中,同目录、同 ID 的保存、追加和分页按调用顺序串行执行,包括多个存储器实例。保存通过独占创建临时文件、同步写入和原子替换完成;更新时间更旧的快照被跳过,同一毫秒的快照按调用顺序保存。已有会话不能改变开始时间。恢复必须新建 UUID、复制所需视图,并将旧 ID 写入 `resumedFrom`,原会话和交互日志继续保留。
|
|
75
|
+
|
|
76
|
+
`maxBytes` 限制每份元数据,`maxEntryBytes` 限制每条 JSON 正文,`maxPageBytes` 限制每页 JSONL 原始字节,`maxPendingBytes` 限制尚未完成的写入队列。分页预算必须容纳单条最大记录及换行。交互日志总长度可持续增长,每次分页只读取有界窗口;不会为了查看会话把整份 JSONL 加载进内存。超限分别返回 `SESSION_METADATA_LIMIT`、`SESSION_ENTRY_LIMIT` 或 `SESSION_QUEUE_LIMIT`,不静默截断用户记录;调用方应保留错误反馈并提示用户。一次失败不会阻止后续读取或重试。
|
|
77
|
+
|
|
78
|
+
元数据损坏、过大或来自其他工作区时,`list()` 跳过该会话,直接 `read()` 明确报错。损坏的已有元数据拒绝覆盖。根目录或文件链接、不安全 ID、非法游标均被拒绝;JSONL 末尾缺少换行时拒绝继续追加,避免把新输入接到未完成的旧记录后。普通文件系统检查无法替代针对恶意并发路径替换的操作系统安全沙箱。
|
|
79
|
+
|
|
59
80
|
## 维护与验证
|
|
60
81
|
|
|
61
82
|
本模块负责上述职责的实现、文档与回归;跨模块接口调整需要同时检查生产者与消费者。具体维护人员尚未指定。
|
|
@@ -63,5 +84,5 @@ maxValueBytes 至少为 2,连预览本身也容不下时省略字段值并保
|
|
|
63
84
|
在仓库根目录执行:
|
|
64
85
|
|
|
65
86
|
```sh
|
|
66
|
-
node --test tests/log-streaming.test.js tests/modules.test.js tests/module-interfaces.test.js tests/run-logs.test.js tests/live-output.test.js
|
|
87
|
+
node --test tests/session-history.test.js tests/log-streaming.test.js tests/modules.test.js tests/module-interfaces.test.js tests/run-logs.test.js tests/live-output.test.js
|
|
67
88
|
```
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
".": "./src/run-logs.js",
|
|
9
9
|
"./steps": "./src/step-summaries.js",
|
|
10
10
|
"./preview": "./src/run-preview.js",
|
|
11
|
+
"./sessions": "./src/session-history.js",
|
|
11
12
|
"./markdown": "./src/markdown-log.js",
|
|
12
13
|
"./package.json": "./package.json"
|
|
13
14
|
},
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
],
|
|
19
20
|
"license": "MIT",
|
|
20
21
|
"engines": {
|
|
21
|
-
"node": ">=24.
|
|
22
|
+
"node": "^22.22.2 || >=24.0.0"
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {
|
|
24
25
|
"@mytools/sdk": "0.1.0"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {lstat,open} from 'node:fs/promises';
|
|
2
|
+
|
|
3
|
+
export function sameFileIdentity(pathStat,handleStat,platform=process.platform){
|
|
4
|
+
if(pathStat.ino!==handleStat.ino)return false;
|
|
5
|
+
// 早期 libuv 的 Windows 路径查询返回 64 位卷号,句柄查询只有低 32 位。
|
|
6
|
+
// 与维护版本的 VolumeSerialNumber.LowPart 口径一致;文件 ID 仍完整比较。
|
|
7
|
+
const device=stat=>platform==='win32'?BigInt.asUintN(32,stat.dev):stat.dev;
|
|
8
|
+
return device(pathStat)===device(handleStat);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function samePathFileIdentity(file,pathStat,handleStat,platform=process.platform){
|
|
12
|
+
if(sameFileIdentity(pathStat,handleStat,platform))return true;
|
|
13
|
+
if(platform!=='win32'||pathStat.dev!==0n||pathStat.ino!==handleStat.ino)return false;
|
|
14
|
+
// 某些 Windows 文件系统的早期路径查询缺少卷号,不能直接将 0 当作通配符。
|
|
15
|
+
// 用第二个只读句柄证明当前路径与主句柄的完整身份,再确认路径仍非链接。
|
|
16
|
+
const probe=await open(file,'r');
|
|
17
|
+
try{
|
|
18
|
+
const proof=await probe.stat({bigint:true});
|
|
19
|
+
if(!proof.isFile()||proof.ino!==handleStat.ino||proof.dev!==handleStat.dev)return false;
|
|
20
|
+
const current=await lstat(file,{bigint:true});
|
|
21
|
+
return current.isFile()&&!current.isSymbolicLink()&¤t.ino===pathStat.ino&&(current.dev===0n||sameFileIdentity(current,handleStat,platform));
|
|
22
|
+
}finally{await probe.close();}
|
|
23
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const names={
|
|
2
|
-
'run.started':'运行开始','run.succeeded':'运行成功','run.failed':'运行失败','run.cancelled':'运行取消','run.stopped':'运行停止',
|
|
2
|
+
'run.started':'运行开始','run.input':'运行输入','run.succeeded':'运行成功','run.failed':'运行失败','run.cancelled':'运行取消','run.stopped':'运行停止',
|
|
3
3
|
'workflow.started':'工作流开始','workflow.succeeded':'工作流完成','workflow.stopped':'工作流停止',
|
|
4
4
|
'step.started':'步骤开始','step.succeeded':'步骤成功','step.failed':'步骤失败','step.cancelled':'步骤取消','step.skipped':'步骤跳过','step.stopped':'步骤停止',log:'插件日志',
|
|
5
5
|
};
|
|
@@ -28,7 +28,8 @@ function errorText(error){
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export function markdownHeader(run){
|
|
31
|
-
|
|
31
|
+
const kind={workflow:'工作流',action:'插件动作',command:'插件命令',shell:'系统命令'}[run.kind];
|
|
32
|
+
return '# Fishtools 运行日志\n\n'+block(`运行 ID:${run.id}\n工作流或命令:${run.workflowId}${kind?`\n执行类型:${kind}`:''}${run.sessionId?`\n启动会话:${run.sessionId}`:''}\n开始时间:${run.startedAt}`)+'## 执行过程\n\n';
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
export function markdownEvent(event){
|
|
@@ -41,7 +42,7 @@ export function markdownEvent(event){
|
|
|
41
42
|
if(event.message)output+=block(event.message);
|
|
42
43
|
if(event.reason!==undefined)output+='停止或跳过原因:\n\n'+block(event.reason);
|
|
43
44
|
if(event.data!==undefined)output+='附加信息:\n\n'+block(event.data,'json');
|
|
44
|
-
if(event.input!==undefined)output+='步骤输入:\n\n'+block(event.input,'json');
|
|
45
|
+
if(event.input!==undefined)output+=(event.type==='run.input'?'运行输入:\n\n':'步骤输入:\n\n')+block(event.input,'json');
|
|
45
46
|
if(event.output!==undefined)output+='步骤输出:\n\n'+block(event.output,'json');
|
|
46
47
|
if(event.error)output+=errorText(event.error);
|
|
47
48
|
return output;
|