anypick 1.0.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/LICENSE +21 -0
- package/README.md +589 -0
- package/dist/adapters.d.ts +4 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +2 -0
- package/dist/catalog/model-fetch.d.ts +34 -0
- package/dist/catalog/model-fetch.d.ts.map +1 -0
- package/dist/catalog/model-fetch.js +99 -0
- package/dist/catalog/model-fetch.js.map +1 -0
- package/dist/catalog/providers.d.ts +42 -0
- package/dist/catalog/providers.d.ts.map +1 -0
- package/dist/catalog/providers.js +424 -0
- package/dist/catalog/providers.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +3 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +78 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/commands.d.ts +29 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1043 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/completion.d.ts +6 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +202 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/errors.d.ts +20 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +47 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/format.d.ts +6 -0
- package/dist/cli/format.d.ts.map +1 -0
- package/dist/cli/format.js +75 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/help.d.ts +6 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +66 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/interactive-accounts.d.ts +3 -0
- package/dist/cli/interactive-accounts.d.ts.map +1 -0
- package/dist/cli/interactive-accounts.js +86 -0
- package/dist/cli/interactive-accounts.js.map +1 -0
- package/dist/cli/interactive-maintenance.d.ts +4 -0
- package/dist/cli/interactive-maintenance.d.ts.map +1 -0
- package/dist/cli/interactive-maintenance.js +30 -0
- package/dist/cli/interactive-maintenance.js.map +1 -0
- package/dist/cli/interactive.d.ts +14 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +242 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/launch-client.d.ts +18 -0
- package/dist/cli/launch-client.d.ts.map +1 -0
- package/dist/cli/launch-client.js +117 -0
- package/dist/cli/launch-client.js.map +1 -0
- package/dist/cli/launcher-model.d.ts +64 -0
- package/dist/cli/launcher-model.d.ts.map +1 -0
- package/dist/cli/launcher-model.js +200 -0
- package/dist/cli/launcher-model.js.map +1 -0
- package/dist/cli/launcher-render.d.ts +22 -0
- package/dist/cli/launcher-render.d.ts.map +1 -0
- package/dist/cli/launcher-render.js +113 -0
- package/dist/cli/launcher-render.js.map +1 -0
- package/dist/cli/launcher.d.ts +27 -0
- package/dist/cli/launcher.d.ts.map +1 -0
- package/dist/cli/launcher.js +93 -0
- package/dist/cli/launcher.js.map +1 -0
- package/dist/cli/local-health.d.ts +17 -0
- package/dist/cli/local-health.d.ts.map +1 -0
- package/dist/cli/local-health.js +31 -0
- package/dist/cli/local-health.js.map +1 -0
- package/dist/cli/plugin-commands.d.ts +4 -0
- package/dist/cli/plugin-commands.d.ts.map +1 -0
- package/dist/cli/plugin-commands.js +160 -0
- package/dist/cli/plugin-commands.js.map +1 -0
- package/dist/cli/primary.d.ts +18 -0
- package/dist/cli/primary.d.ts.map +1 -0
- package/dist/cli/primary.js +593 -0
- package/dist/cli/primary.js.map +1 -0
- package/dist/cli/render-util.d.ts +24 -0
- package/dist/cli/render-util.d.ts.map +1 -0
- package/dist/cli/render-util.js +58 -0
- package/dist/cli/render-util.js.map +1 -0
- package/dist/cli/ux.d.ts +43 -0
- package/dist/cli/ux.d.ts.map +1 -0
- package/dist/cli/ux.js +114 -0
- package/dist/cli/ux.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +35 -0
- package/dist/cli.js.map +1 -0
- package/dist/clients/claude-client-apply.d.ts +8 -0
- package/dist/clients/claude-client-apply.d.ts.map +1 -0
- package/dist/clients/claude-client-apply.js +108 -0
- package/dist/clients/claude-client-apply.js.map +1 -0
- package/dist/clients/claude-code.d.ts +5 -0
- package/dist/clients/claude-code.d.ts.map +1 -0
- package/dist/clients/claude-code.js +189 -0
- package/dist/clients/claude-code.js.map +1 -0
- package/dist/clients/claude-settings-guard.d.ts +18 -0
- package/dist/clients/claude-settings-guard.d.ts.map +1 -0
- package/dist/clients/codex-desktop-catalog.d.ts +67 -0
- package/dist/clients/codex-desktop-catalog.d.ts.map +1 -0
- package/dist/clients/codex-desktop-catalog.js +212 -0
- package/dist/clients/codex-desktop-catalog.js.map +1 -0
- package/dist/clients/codex.d.ts +181 -0
- package/dist/clients/codex.d.ts.map +1 -0
- package/dist/clients/codex.js +783 -0
- package/dist/clients/codex.js.map +1 -0
- package/dist/clients/env-files.d.ts +14 -0
- package/dist/clients/env-files.d.ts.map +1 -0
- package/dist/clients/env-files.js +50 -0
- package/dist/clients/env-files.js.map +1 -0
- package/dist/clients/gemini-client-utils.d.ts +4 -0
- package/dist/clients/gemini-client-utils.d.ts.map +1 -0
- package/dist/clients/gemini-client-utils.js +33 -0
- package/dist/clients/gemini-client-utils.js.map +1 -0
- package/dist/clients/gemini.d.ts +16 -0
- package/dist/clients/gemini.d.ts.map +1 -0
- package/dist/clients/gemini.js +233 -0
- package/dist/clients/gemini.js.map +1 -0
- package/dist/clients/index.d.ts +14 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +18 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/isolation.d.ts +28 -0
- package/dist/clients/isolation.d.ts.map +1 -0
- package/dist/clients/isolation.js +131 -0
- package/dist/clients/isolation.js.map +1 -0
- package/dist/clients/kiro.d.ts +10 -0
- package/dist/clients/kiro.d.ts.map +1 -0
- package/dist/clients/kiro.js +168 -0
- package/dist/clients/kiro.js.map +1 -0
- package/dist/clients/model-roles.d.ts +58 -0
- package/dist/clients/model-roles.d.ts.map +1 -0
- package/dist/clients/model-roles.js +139 -0
- package/dist/clients/model-roles.js.map +1 -0
- package/dist/clients/registry.d.ts +7 -0
- package/dist/clients/registry.d.ts.map +1 -0
- package/dist/clients/registry.js +16 -0
- package/dist/clients/registry.js.map +1 -0
- package/dist/clients/resolve.d.ts +27 -0
- package/dist/clients/resolve.d.ts.map +1 -0
- package/dist/clients/resolve.js +49 -0
- package/dist/clients/resolve.js.map +1 -0
- package/dist/core/account-codec.d.ts +32 -0
- package/dist/core/account-codec.d.ts.map +1 -0
- package/dist/core/account-codec.js +134 -0
- package/dist/core/account-codec.js.map +1 -0
- package/dist/core/account-transfer.d.ts +20 -0
- package/dist/core/account-transfer.d.ts.map +1 -0
- package/dist/core/account-transfer.js +136 -0
- package/dist/core/account-transfer.js.map +1 -0
- package/dist/core/activation-executor.d.ts +72 -0
- package/dist/core/activation-executor.d.ts.map +1 -0
- package/dist/core/activation-executor.js +690 -0
- package/dist/core/activation-executor.js.map +1 -0
- package/dist/core/activation-models.d.ts +6 -0
- package/dist/core/activation-models.d.ts.map +1 -0
- package/dist/core/activation-models.js +33 -0
- package/dist/core/activation-models.js.map +1 -0
- package/dist/core/activation-planner.d.ts +38 -0
- package/dist/core/activation-planner.d.ts.map +1 -0
- package/dist/core/activation-planner.js +248 -0
- package/dist/core/activation-planner.js.map +1 -0
- package/dist/core/activation-protocol.d.ts +3 -0
- package/dist/core/activation-protocol.d.ts.map +1 -0
- package/dist/core/activation-protocol.js +9 -0
- package/dist/core/activation-protocol.js.map +1 -0
- package/dist/core/activation-transport.d.ts +15 -0
- package/dist/core/activation-transport.d.ts.map +1 -0
- package/dist/core/activation-transport.js +23 -0
- package/dist/core/activation-transport.js.map +1 -0
- package/dist/core/app.d.ts +149 -0
- package/dist/core/app.d.ts.map +1 -0
- package/dist/core/app.js +372 -0
- package/dist/core/app.js.map +1 -0
- package/dist/core/binding-service.d.ts +93 -0
- package/dist/core/binding-service.d.ts.map +1 -0
- package/dist/core/binding-service.js +281 -0
- package/dist/core/binding-service.js.map +1 -0
- package/dist/core/binding-store.d.ts +23 -0
- package/dist/core/binding-store.d.ts.map +1 -0
- package/dist/core/binding-store.js +154 -0
- package/dist/core/binding-store.js.map +1 -0
- package/dist/core/brand.d.ts +18 -0
- package/dist/core/brand.d.ts.map +1 -0
- package/dist/core/brand.js +22 -0
- package/dist/core/brand.js.map +1 -0
- package/dist/core/capabilities.d.ts +30 -0
- package/dist/core/capabilities.d.ts.map +1 -0
- package/dist/core/capabilities.js +27 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/client-state-store.d.ts +17 -0
- package/dist/core/client-state-store.d.ts.map +1 -0
- package/dist/core/client-state-store.js +47 -0
- package/dist/core/client-state-store.js.map +1 -0
- package/dist/core/codec/account.d.ts +52 -0
- package/dist/core/codec/account.d.ts.map +1 -0
- package/dist/core/codec/account.js +69 -0
- package/dist/core/codec/account.js.map +1 -0
- package/dist/core/codec/bindings.d.ts +38 -0
- package/dist/core/codec/bindings.d.ts.map +1 -0
- package/dist/core/codec/bindings.js +79 -0
- package/dist/core/codec/bindings.js.map +1 -0
- package/dist/core/codec/operations.d.ts +36 -0
- package/dist/core/codec/operations.d.ts.map +1 -0
- package/dist/core/codec/operations.js +82 -0
- package/dist/core/codec/operations.js.map +1 -0
- package/dist/core/codec/primitives.d.ts +59 -0
- package/dist/core/codec/primitives.d.ts.map +1 -0
- package/dist/core/codec/primitives.js +123 -0
- package/dist/core/codec/primitives.js.map +1 -0
- package/dist/core/codec/proxy-hub.d.ts +43 -0
- package/dist/core/codec/proxy-hub.d.ts.map +1 -0
- package/dist/core/codec/proxy-hub.js +69 -0
- package/dist/core/codec/proxy-hub.js.map +1 -0
- package/dist/core/codec/runtime.d.ts +41 -0
- package/dist/core/codec/runtime.d.ts.map +1 -0
- package/dist/core/codec/runtime.js +66 -0
- package/dist/core/codec/runtime.js.map +1 -0
- package/dist/core/codec.d.ts +43 -0
- package/dist/core/codec.d.ts.map +1 -0
- package/dist/core/codec.js +69 -0
- package/dist/core/codec.js.map +1 -0
- package/dist/core/codex-live-config.d.ts +92 -0
- package/dist/core/codex-live-config.d.ts.map +1 -0
- package/dist/core/codex-live-config.js +263 -0
- package/dist/core/codex-live-config.js.map +1 -0
- package/dist/core/config-service.d.ts +35 -0
- package/dist/core/config-service.d.ts.map +1 -0
- package/dist/core/config-service.js +87 -0
- package/dist/core/config-service.js.map +1 -0
- package/dist/core/config.d.ts +14 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +45 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/db-schema.d.ts +30 -0
- package/dist/core/db-schema.d.ts.map +1 -0
- package/dist/core/db-schema.js +278 -0
- package/dist/core/db-schema.js.map +1 -0
- package/dist/core/db.d.ts +72 -0
- package/dist/core/db.d.ts.map +1 -0
- package/dist/core/db.js +192 -0
- package/dist/core/db.js.map +1 -0
- package/dist/core/doctor-fixes.d.ts +3 -0
- package/dist/core/doctor-fixes.d.ts.map +1 -0
- package/dist/core/doctor-fixes.js +102 -0
- package/dist/core/doctor-fixes.js.map +1 -0
- package/dist/core/doctor-format.d.ts +10 -0
- package/dist/core/doctor-format.d.ts.map +1 -0
- package/dist/core/doctor-format.js +45 -0
- package/dist/core/doctor-format.js.map +1 -0
- package/dist/core/doctor-report.d.ts +3 -0
- package/dist/core/doctor-report.d.ts.map +1 -0
- package/dist/core/doctor-report.js +174 -0
- package/dist/core/doctor-report.js.map +1 -0
- package/dist/core/doctor-scan.d.ts +7 -0
- package/dist/core/doctor-scan.d.ts.map +1 -0
- package/dist/core/doctor-scan.js +139 -0
- package/dist/core/doctor-scan.js.map +1 -0
- package/dist/core/doctor-types.d.ts +89 -0
- package/dist/core/doctor-types.d.ts.map +1 -0
- package/dist/core/doctor-types.js +14 -0
- package/dist/core/doctor-types.js.map +1 -0
- package/dist/core/doctor-utils.d.ts +3 -0
- package/dist/core/doctor-utils.d.ts.map +1 -0
- package/dist/core/doctor-utils.js +36 -0
- package/dist/core/doctor-utils.js.map +1 -0
- package/dist/core/doctor.d.ts +14 -0
- package/dist/core/doctor.d.ts.map +1 -0
- package/dist/core/doctor.js +127 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/events.d.ts +58 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +88 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/journal.d.ts +23 -0
- package/dist/core/journal.d.ts.map +1 -0
- package/dist/core/journal.js +93 -0
- package/dist/core/journal.js.map +1 -0
- package/dist/core/lease-store.d.ts +22 -0
- package/dist/core/lease-store.d.ts.map +1 -0
- package/dist/core/lease-store.js +81 -0
- package/dist/core/lease-store.js.map +1 -0
- package/dist/core/migrate-bindings.d.ts +10 -0
- package/dist/core/migrate-bindings.d.ts.map +1 -0
- package/dist/core/migrate-bindings.js +98 -0
- package/dist/core/migrate-bindings.js.map +1 -0
- package/dist/core/migrate-fs.d.ts +11 -0
- package/dist/core/migrate-fs.d.ts.map +1 -0
- package/dist/core/migrate-fs.js +184 -0
- package/dist/core/migrate-fs.js.map +1 -0
- package/dist/core/model-cache-store.d.ts +27 -0
- package/dist/core/model-cache-store.d.ts.map +1 -0
- package/dist/core/model-cache-store.js +50 -0
- package/dist/core/model-cache-store.js.map +1 -0
- package/dist/core/model-discovery.d.ts +66 -0
- package/dist/core/model-discovery.d.ts.map +1 -0
- package/dist/core/model-discovery.js +127 -0
- package/dist/core/model-discovery.js.map +1 -0
- package/dist/core/model-policy.d.ts +40 -0
- package/dist/core/model-policy.d.ts.map +1 -0
- package/dist/core/model-policy.js +77 -0
- package/dist/core/model-policy.js.map +1 -0
- package/dist/core/model-roles.d.ts +9 -0
- package/dist/core/model-roles.d.ts.map +1 -0
- package/dist/core/model-roles.js +20 -0
- package/dist/core/model-roles.js.map +1 -0
- package/dist/core/mutation-lock.d.ts +31 -0
- package/dist/core/mutation-lock.d.ts.map +1 -0
- package/dist/core/mutation-lock.js +69 -0
- package/dist/core/mutation-lock.js.map +1 -0
- package/dist/core/paths.d.ts +49 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +110 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/plugin-loader.d.ts +40 -0
- package/dist/core/plugin-loader.d.ts.map +1 -0
- package/dist/core/plugin-loader.js +184 -0
- package/dist/core/plugin-loader.js.map +1 -0
- package/dist/core/plugin-service.d.ts +32 -0
- package/dist/core/plugin-service.d.ts.map +1 -0
- package/dist/core/plugin-service.js +110 -0
- package/dist/core/plugin-service.js.map +1 -0
- package/dist/core/plugin-store.d.ts +18 -0
- package/dist/core/plugin-store.d.ts.map +1 -0
- package/dist/core/plugin-store.js +50 -0
- package/dist/core/plugin-store.js.map +1 -0
- package/dist/core/pool-store.d.ts +44 -0
- package/dist/core/pool-store.d.ts.map +1 -0
- package/dist/core/pool-store.js +198 -0
- package/dist/core/pool-store.js.map +1 -0
- package/dist/core/preset-store.d.ts +29 -0
- package/dist/core/preset-store.d.ts.map +1 -0
- package/dist/core/preset-store.js +105 -0
- package/dist/core/preset-store.js.map +1 -0
- package/dist/core/profile-service.d.ts +50 -0
- package/dist/core/profile-service.d.ts.map +1 -0
- package/dist/core/profile-service.js +149 -0
- package/dist/core/profile-service.js.map +1 -0
- package/dist/core/profile-store.d.ts +20 -0
- package/dist/core/profile-store.d.ts.map +1 -0
- package/dist/core/profile-store.js +92 -0
- package/dist/core/profile-store.js.map +1 -0
- package/dist/core/profile-synth.d.ts +24 -0
- package/dist/core/profile-synth.d.ts.map +1 -0
- package/dist/core/profile-synth.js +30 -0
- package/dist/core/profile-synth.js.map +1 -0
- package/dist/core/project-root.d.ts +7 -0
- package/dist/core/project-root.d.ts.map +1 -0
- package/dist/core/project-root.js +23 -0
- package/dist/core/project-root.js.map +1 -0
- package/dist/core/proxy-hub-cli.d.ts +3 -0
- package/dist/core/proxy-hub-cli.d.ts.map +1 -0
- package/dist/core/proxy-hub-cli.js +80 -0
- package/dist/core/proxy-hub-cli.js.map +1 -0
- package/dist/core/proxy-hub-routes.d.ts +22 -0
- package/dist/core/proxy-hub-routes.d.ts.map +1 -0
- package/dist/core/proxy-hub-routes.js +92 -0
- package/dist/core/proxy-hub-routes.js.map +1 -0
- package/dist/core/proxy-hub-server.d.ts +59 -0
- package/dist/core/proxy-hub-server.d.ts.map +1 -0
- package/dist/core/proxy-hub-server.js +409 -0
- package/dist/core/proxy-hub-server.js.map +1 -0
- package/dist/core/proxy-hub-service.d.ts +97 -0
- package/dist/core/proxy-hub-service.d.ts.map +1 -0
- package/dist/core/proxy-hub-service.js +553 -0
- package/dist/core/proxy-hub-service.js.map +1 -0
- package/dist/core/proxy-hub-store.d.ts +28 -0
- package/dist/core/proxy-hub-store.d.ts.map +1 -0
- package/dist/core/proxy-hub-store.js +152 -0
- package/dist/core/proxy-hub-store.js.map +1 -0
- package/dist/core/proxy-lifecycle.d.ts +26 -0
- package/dist/core/proxy-lifecycle.d.ts.map +1 -0
- package/dist/core/proxy-lifecycle.js +33 -0
- package/dist/core/proxy-lifecycle.js.map +1 -0
- package/dist/core/proxy-ports.d.ts +50 -0
- package/dist/core/proxy-ports.d.ts.map +1 -0
- package/dist/core/proxy-ports.js +86 -0
- package/dist/core/proxy-ports.js.map +1 -0
- package/dist/core/proxy-service.d.ts +184 -0
- package/dist/core/proxy-service.d.ts.map +1 -0
- package/dist/core/proxy-service.js +860 -0
- package/dist/core/proxy-service.js.map +1 -0
- package/dist/core/quota-guard-policy.d.ts +8 -0
- package/dist/core/quota-guard-policy.d.ts.map +1 -0
- package/dist/core/quota-guard-policy.js +21 -0
- package/dist/core/quota-guard-policy.js.map +1 -0
- package/dist/core/realign-proxy-clients.d.ts +19 -0
- package/dist/core/realign-proxy-clients.d.ts.map +1 -0
- package/dist/core/realign-proxy-clients.js +40 -0
- package/dist/core/realign-proxy-clients.js.map +1 -0
- package/dist/core/refs.d.ts +84 -0
- package/dist/core/refs.d.ts.map +1 -0
- package/dist/core/refs.js +250 -0
- package/dist/core/refs.js.map +1 -0
- package/dist/core/registry.d.ts +46 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +70 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/resolve-source.d.ts +54 -0
- package/dist/core/resolve-source.d.ts.map +1 -0
- package/dist/core/resolve-source.js +148 -0
- package/dist/core/resolve-source.js.map +1 -0
- package/dist/core/runtime-service.d.ts +158 -0
- package/dist/core/runtime-service.d.ts.map +1 -0
- package/dist/core/runtime-service.js +422 -0
- package/dist/core/runtime-service.js.map +1 -0
- package/dist/core/service.d.ts +200 -0
- package/dist/core/service.d.ts.map +1 -0
- package/dist/core/service.js +643 -0
- package/dist/core/service.js.map +1 -0
- package/dist/core/store-snapshot.d.ts +10 -0
- package/dist/core/store-snapshot.d.ts.map +1 -0
- package/dist/core/store-snapshot.js +79 -0
- package/dist/core/store-snapshot.js.map +1 -0
- package/dist/core/store.d.ts +68 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +159 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/tray-runtime.d.ts +15 -0
- package/dist/core/tray-runtime.d.ts.map +1 -0
- package/dist/core/tray-runtime.js +33 -0
- package/dist/core/tray-runtime.js.map +1 -0
- package/dist/core/tray-settings-service.d.ts +7 -0
- package/dist/core/tray-settings-service.d.ts.map +1 -0
- package/dist/core/tray-settings-service.js +24 -0
- package/dist/core/tray-settings-service.js.map +1 -0
- package/dist/core/update.d.ts +26 -0
- package/dist/core/update.d.ts.map +1 -0
- package/dist/core/update.js +128 -0
- package/dist/core/update.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/network/egress/allowlist.d.ts +2 -0
- package/dist/network/egress/allowlist.d.ts.map +1 -0
- package/dist/network/egress/allowlist.js +14 -0
- package/dist/network/egress/allowlist.js.map +1 -0
- package/dist/network/egress/direct.d.ts +17 -0
- package/dist/network/egress/direct.d.ts.map +1 -0
- package/dist/network/egress/direct.js +28 -0
- package/dist/network/egress/direct.js.map +1 -0
- package/dist/network/egress/errors.d.ts +4 -0
- package/dist/network/egress/errors.d.ts.map +1 -0
- package/dist/network/egress/errors.js +8 -0
- package/dist/network/egress/errors.js.map +1 -0
- package/dist/network/egress/index.d.ts +6 -0
- package/dist/network/egress/index.d.ts.map +1 -0
- package/dist/network/egress/index.js +11 -0
- package/dist/network/egress/index.js.map +1 -0
- package/dist/network/egress/types.d.ts +16 -0
- package/dist/network/egress/types.d.ts.map +1 -0
- package/dist/presentation/client-name.d.ts +14 -0
- package/dist/presentation/client-name.d.ts.map +1 -0
- package/dist/presentation/client-name.js +22 -0
- package/dist/presentation/client-name.js.map +1 -0
- package/dist/presentation/layout.d.ts +7 -0
- package/dist/presentation/layout.d.ts.map +1 -0
- package/dist/presentation/layout.js +10 -0
- package/dist/presentation/layout.js.map +1 -0
- package/dist/providers/auth-fingerprint.d.ts +56 -0
- package/dist/providers/auth-fingerprint.d.ts.map +1 -0
- package/dist/providers/auth-fingerprint.js +163 -0
- package/dist/providers/auth-fingerprint.js.map +1 -0
- package/dist/providers/claude.d.ts +43 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +191 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/codex-identity.d.ts +13 -0
- package/dist/providers/codex-identity.d.ts.map +1 -0
- package/dist/providers/codex-identity.js +69 -0
- package/dist/providers/codex-identity.js.map +1 -0
- package/dist/providers/codex-refresh.d.ts +30 -0
- package/dist/providers/codex-refresh.d.ts.map +1 -0
- package/dist/providers/codex-refresh.js +64 -0
- package/dist/providers/codex-refresh.js.map +1 -0
- package/dist/providers/codex-usage.d.ts +3 -0
- package/dist/providers/codex-usage.d.ts.map +1 -0
- package/dist/providers/codex-usage.js +42 -0
- package/dist/providers/codex-usage.js.map +1 -0
- package/dist/providers/codex.d.ts +61 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +212 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/gemini-antigravity-oauth.d.ts +83 -0
- package/dist/providers/gemini-antigravity-oauth.d.ts.map +1 -0
- package/dist/providers/gemini-antigravity-oauth.js +343 -0
- package/dist/providers/gemini-antigravity-oauth.js.map +1 -0
- package/dist/providers/gemini-antigravity-state.d.ts +35 -0
- package/dist/providers/gemini-antigravity-state.d.ts.map +1 -0
- package/dist/providers/gemini-antigravity-state.js +433 -0
- package/dist/providers/gemini-antigravity-state.js.map +1 -0
- package/dist/providers/gemini-env.d.ts +8 -0
- package/dist/providers/gemini-env.d.ts.map +1 -0
- package/dist/providers/gemini-env.js +78 -0
- package/dist/providers/gemini-env.js.map +1 -0
- package/dist/providers/gemini-identity.d.ts +2 -0
- package/dist/providers/gemini-identity.d.ts.map +1 -0
- package/dist/providers/gemini-identity.js +14 -0
- package/dist/providers/gemini-identity.js.map +1 -0
- package/dist/providers/gemini-proxy/main.d.ts +3 -0
- package/dist/providers/gemini-proxy/main.d.ts.map +1 -0
- package/dist/providers/gemini-proxy/main.js +176 -0
- package/dist/providers/gemini-proxy/main.js.map +1 -0
- package/dist/providers/gemini-proxy/server.d.ts +57 -0
- package/dist/providers/gemini-proxy/server.d.ts.map +1 -0
- package/dist/providers/gemini-proxy/server.js +1240 -0
- package/dist/providers/gemini-proxy/server.js.map +1 -0
- package/dist/providers/gemini-proxy-entry.d.ts +2 -0
- package/dist/providers/gemini-proxy-entry.d.ts.map +1 -0
- package/dist/providers/gemini-proxy-entry.js +16 -0
- package/dist/providers/gemini-proxy-entry.js.map +1 -0
- package/dist/providers/gemini-proxy-lifecycle.d.ts +11 -0
- package/dist/providers/gemini-proxy-lifecycle.d.ts.map +1 -0
- package/dist/providers/gemini-proxy-lifecycle.js +131 -0
- package/dist/providers/gemini-proxy-lifecycle.js.map +1 -0
- package/dist/providers/gemini.d.ts +137 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +471 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/grok-proxy/auth.d.ts +27 -0
- package/dist/providers/grok-proxy/auth.d.ts.map +1 -0
- package/dist/providers/grok-proxy/auth.js +123 -0
- package/dist/providers/grok-proxy/auth.js.map +1 -0
- package/dist/providers/grok-proxy/main.d.ts +3 -0
- package/dist/providers/grok-proxy/main.d.ts.map +1 -0
- package/dist/providers/grok-proxy/main.js +111 -0
- package/dist/providers/grok-proxy/main.js.map +1 -0
- package/dist/providers/grok-proxy/server.d.ts +46 -0
- package/dist/providers/grok-proxy/server.d.ts.map +1 -0
- package/dist/providers/grok-proxy/server.js +595 -0
- package/dist/providers/grok-proxy/server.js.map +1 -0
- package/dist/providers/grok.d.ts +38 -0
- package/dist/providers/grok.d.ts.map +1 -0
- package/dist/providers/grok.js +250 -0
- package/dist/providers/grok.js.map +1 -0
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +23 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/kiro-secret-store.d.ts +39 -0
- package/dist/providers/kiro-secret-store.d.ts.map +1 -0
- package/dist/providers/kiro-secret-store.js +168 -0
- package/dist/providers/kiro-secret-store.js.map +1 -0
- package/dist/providers/kiro.d.ts +50 -0
- package/dist/providers/kiro.d.ts.map +1 -0
- package/dist/providers/kiro.js +373 -0
- package/dist/providers/kiro.js.map +1 -0
- package/dist/providers/model-policy.d.ts +15 -0
- package/dist/providers/model-policy.d.ts.map +1 -0
- package/dist/providers/model-policy.js +26 -0
- package/dist/providers/model-policy.js.map +1 -0
- package/dist/providers/opencode-auth.d.ts +67 -0
- package/dist/providers/opencode-auth.d.ts.map +1 -0
- package/dist/providers/opencode-auth.js +146 -0
- package/dist/providers/opencode-auth.js.map +1 -0
- package/dist/providers/opencode-cli-entry.d.ts +36 -0
- package/dist/providers/opencode-cli-entry.d.ts.map +1 -0
- package/dist/providers/opencode-cli-entry.js +90 -0
- package/dist/providers/opencode-cli-entry.js.map +1 -0
- package/dist/providers/opencode-proxy/abort.d.ts +8 -0
- package/dist/providers/opencode-proxy/abort.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/abort.js +42 -0
- package/dist/providers/opencode-proxy/abort.js.map +1 -0
- package/dist/providers/opencode-proxy/anthropic-handler.d.ts +4 -0
- package/dist/providers/opencode-proxy/anthropic-handler.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/anthropic-handler.js +108 -0
- package/dist/providers/opencode-proxy/anthropic-handler.js.map +1 -0
- package/dist/providers/opencode-proxy/auth.d.ts +38 -0
- package/dist/providers/opencode-proxy/auth.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/auth.js +128 -0
- package/dist/providers/opencode-proxy/auth.js.map +1 -0
- package/dist/providers/opencode-proxy/body.d.ts +9 -0
- package/dist/providers/opencode-proxy/body.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/body.js +69 -0
- package/dist/providers/opencode-proxy/body.js.map +1 -0
- package/dist/providers/opencode-proxy/catalog-handlers.d.ts +7 -0
- package/dist/providers/opencode-proxy/catalog-handlers.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/catalog-handlers.js +132 -0
- package/dist/providers/opencode-proxy/catalog-handlers.js.map +1 -0
- package/dist/providers/opencode-proxy/catalog.d.ts +41 -0
- package/dist/providers/opencode-proxy/catalog.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/catalog.js +146 -0
- package/dist/providers/opencode-proxy/catalog.js.map +1 -0
- package/dist/providers/opencode-proxy/cli.d.ts +2 -0
- package/dist/providers/opencode-proxy/cli.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/cli.js +162 -0
- package/dist/providers/opencode-proxy/cli.js.map +1 -0
- package/dist/providers/opencode-proxy/constants.d.ts +13 -0
- package/dist/providers/opencode-proxy/constants.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/constants.js +15 -0
- package/dist/providers/opencode-proxy/constants.js.map +1 -0
- package/dist/providers/opencode-proxy/context-budget.d.ts +31 -0
- package/dist/providers/opencode-proxy/context-budget.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/context-budget.js +165 -0
- package/dist/providers/opencode-proxy/context-budget.js.map +1 -0
- package/dist/providers/opencode-proxy/errors.d.ts +5 -0
- package/dist/providers/opencode-proxy/errors.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/errors.js +45 -0
- package/dist/providers/opencode-proxy/errors.js.map +1 -0
- package/dist/providers/opencode-proxy/forwarders.d.ts +7 -0
- package/dist/providers/opencode-proxy/forwarders.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/forwarders.js +214 -0
- package/dist/providers/opencode-proxy/forwarders.js.map +1 -0
- package/dist/providers/opencode-proxy/http.d.ts +11 -0
- package/dist/providers/opencode-proxy/http.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/http.js +97 -0
- package/dist/providers/opencode-proxy/http.js.map +1 -0
- package/dist/providers/opencode-proxy/models.d.ts +42 -0
- package/dist/providers/opencode-proxy/models.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/models.js +148 -0
- package/dist/providers/opencode-proxy/models.js.map +1 -0
- package/dist/providers/opencode-proxy/openai-handler.d.ts +5 -0
- package/dist/providers/opencode-proxy/openai-handler.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/openai-handler.js +115 -0
- package/dist/providers/opencode-proxy/openai-handler.js.map +1 -0
- package/dist/providers/opencode-proxy/router.d.ts +4 -0
- package/dist/providers/opencode-proxy/router.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/router.js +65 -0
- package/dist/providers/opencode-proxy/router.js.map +1 -0
- package/dist/providers/opencode-proxy/runtime.d.ts +23 -0
- package/dist/providers/opencode-proxy/runtime.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/runtime.js +158 -0
- package/dist/providers/opencode-proxy/runtime.js.map +1 -0
- package/dist/providers/opencode-proxy/server.d.ts +13 -0
- package/dist/providers/opencode-proxy/server.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/server.js +52 -0
- package/dist/providers/opencode-proxy/server.js.map +1 -0
- package/dist/providers/opencode-proxy/stream.d.ts +4 -0
- package/dist/providers/opencode-proxy/stream.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/stream.js +71 -0
- package/dist/providers/opencode-proxy/stream.js.map +1 -0
- package/dist/providers/opencode-proxy/translate-stream.d.ts +3 -0
- package/dist/providers/opencode-proxy/translate-stream.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/translate-stream.js +205 -0
- package/dist/providers/opencode-proxy/translate-stream.js.map +1 -0
- package/dist/providers/opencode-proxy/translate.d.ts +11 -0
- package/dist/providers/opencode-proxy/translate.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/translate.js +250 -0
- package/dist/providers/opencode-proxy/translate.js.map +1 -0
- package/dist/providers/opencode-proxy/types.d.ts +110 -0
- package/dist/providers/opencode-proxy/types.d.ts.map +1 -0
- package/dist/providers/opencode-proxy/types.js +38 -0
- package/dist/providers/opencode-proxy/types.js.map +1 -0
- package/dist/providers/opencode-proxy-lifecycle.d.ts +11 -0
- package/dist/providers/opencode-proxy-lifecycle.d.ts.map +1 -0
- package/dist/providers/opencode-proxy-lifecycle.js +144 -0
- package/dist/providers/opencode-proxy-lifecycle.js.map +1 -0
- package/dist/providers/opencode.d.ts +40 -0
- package/dist/providers/opencode.d.ts.map +1 -0
- package/dist/providers/opencode.js +190 -0
- package/dist/providers/opencode.js.map +1 -0
- package/dist/providers/protocol/anthropic-convert.d.ts +12 -0
- package/dist/providers/protocol/anthropic-convert.d.ts.map +1 -0
- package/dist/providers/protocol/anthropic-convert.js +113 -0
- package/dist/providers/protocol/anthropic-convert.js.map +1 -0
- package/dist/providers/protocol/anthropic-helpers.d.ts +13 -0
- package/dist/providers/protocol/anthropic-helpers.d.ts.map +1 -0
- package/dist/providers/protocol/anthropic-helpers.js +179 -0
- package/dist/providers/protocol/anthropic-helpers.js.map +1 -0
- package/dist/providers/protocol/anthropic-stream-reader.d.ts +13 -0
- package/dist/providers/protocol/anthropic-stream-reader.d.ts.map +1 -0
- package/dist/providers/protocol/anthropic-stream-reader.js +46 -0
- package/dist/providers/protocol/anthropic-stream-reader.js.map +1 -0
- package/dist/providers/protocol/anthropic-stream.d.ts +7 -0
- package/dist/providers/protocol/anthropic-stream.d.ts.map +1 -0
- package/dist/providers/protocol/anthropic-stream.js +318 -0
- package/dist/providers/protocol/anthropic-stream.js.map +1 -0
- package/dist/providers/protocol/anthropic-types.d.ts +240 -0
- package/dist/providers/protocol/anthropic-types.d.ts.map +1 -0
- package/dist/providers/protocol/anthropic.d.ts +20 -0
- package/dist/providers/protocol/anthropic.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-anthropic.d.ts +15 -0
- package/dist/providers/protocol/gemini/translate-anthropic.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-anthropic.js +84 -0
- package/dist/providers/protocol/gemini/translate-anthropic.js.map +1 -0
- package/dist/providers/protocol/gemini/translate-chat.d.ts +5 -0
- package/dist/providers/protocol/gemini/translate-chat.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-chat.js +142 -0
- package/dist/providers/protocol/gemini/translate-chat.js.map +1 -0
- package/dist/providers/protocol/gemini/translate-models.d.ts +40 -0
- package/dist/providers/protocol/gemini/translate-models.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-models.js +186 -0
- package/dist/providers/protocol/gemini/translate-models.js.map +1 -0
- package/dist/providers/protocol/gemini/translate-responses.d.ts +6 -0
- package/dist/providers/protocol/gemini/translate-responses.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-responses.js +187 -0
- package/dist/providers/protocol/gemini/translate-responses.js.map +1 -0
- package/dist/providers/protocol/gemini/translate-schema.d.ts +9 -0
- package/dist/providers/protocol/gemini/translate-schema.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-schema.js +48 -0
- package/dist/providers/protocol/gemini/translate-schema.js.map +1 -0
- package/dist/providers/protocol/gemini/translate-shared.d.ts +8 -0
- package/dist/providers/protocol/gemini/translate-shared.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-shared.js +47 -0
- package/dist/providers/protocol/gemini/translate-shared.js.map +1 -0
- package/dist/providers/protocol/gemini/translate-thinking.d.ts +7 -0
- package/dist/providers/protocol/gemini/translate-thinking.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate-thinking.js +65 -0
- package/dist/providers/protocol/gemini/translate-thinking.js.map +1 -0
- package/dist/providers/protocol/gemini/translate-types.d.ts +133 -0
- package/dist/providers/protocol/gemini/translate-types.d.ts.map +1 -0
- package/dist/providers/protocol/gemini/translate.d.ts +7 -0
- package/dist/providers/protocol/gemini/translate.d.ts.map +1 -0
- package/dist/providers/protocol/json-schema.d.ts +52 -0
- package/dist/providers/protocol/json-schema.d.ts.map +1 -0
- package/dist/providers/protocol/json-schema.js +189 -0
- package/dist/providers/protocol/json-schema.js.map +1 -0
- package/dist/providers/protocol/token-estimate.d.ts +15 -0
- package/dist/providers/protocol/token-estimate.d.ts.map +1 -0
- package/dist/providers/protocol/token-estimate.js +34 -0
- package/dist/providers/protocol/token-estimate.js.map +1 -0
- package/dist/providers/proxy-hub-backend.d.ts +4 -0
- package/dist/providers/proxy-hub-backend.d.ts.map +1 -0
- package/dist/providers/proxy-hub-backend.js +11 -0
- package/dist/providers/proxy-hub-backend.js.map +1 -0
- package/dist/providers/proxy-process.d.ts +35 -0
- package/dist/providers/proxy-process.d.ts.map +1 -0
- package/dist/providers/proxy-process.js +119 -0
- package/dist/providers/proxy-process.js.map +1 -0
- package/dist/providers/proxy-shared.d.ts +43 -0
- package/dist/providers/proxy-shared.d.ts.map +1 -0
- package/dist/providers/proxy-shared.js +128 -0
- package/dist/providers/proxy-shared.js.map +1 -0
- package/dist/providers/quota-guard.d.ts +49 -0
- package/dist/providers/quota-guard.d.ts.map +1 -0
- package/dist/providers/quota-guard.js +107 -0
- package/dist/providers/quota-guard.js.map +1 -0
- package/dist/providers/reasoning.d.ts +27 -0
- package/dist/providers/reasoning.d.ts.map +1 -0
- package/dist/providers/reasoning.js +61 -0
- package/dist/providers/reasoning.js.map +1 -0
- package/dist/providers/upstream-policy.d.ts +33 -0
- package/dist/providers/upstream-policy.d.ts.map +1 -0
- package/dist/providers/upstream-policy.js +97 -0
- package/dist/providers/upstream-policy.js.map +1 -0
- package/dist/public-types.d.ts +3 -0
- package/dist/public-types.d.ts.map +1 -0
- package/dist/public.d.ts +19 -0
- package/dist/public.d.ts.map +1 -0
- package/dist/public.js +16 -0
- package/dist/public.js.map +1 -0
- package/dist/sources/account-adapters.d.ts +64 -0
- package/dist/sources/account-adapters.d.ts.map +1 -0
- package/dist/sources/account-adapters.js +205 -0
- package/dist/sources/account-adapters.js.map +1 -0
- package/dist/sources/gateway-adapters.d.ts +26 -0
- package/dist/sources/gateway-adapters.d.ts.map +1 -0
- package/dist/sources/gateway-adapters.js +43 -0
- package/dist/sources/gateway-adapters.js.map +1 -0
- package/dist/sources/kiro-proxy-bin.d.ts +41 -0
- package/dist/sources/kiro-proxy-bin.d.ts.map +1 -0
- package/dist/sources/kiro-proxy-bin.js +140 -0
- package/dist/sources/kiro-proxy-bin.js.map +1 -0
- package/dist/sources/proxy-hub-adapters.d.ts +7 -0
- package/dist/sources/proxy-hub-adapters.d.ts.map +1 -0
- package/dist/sources/proxy-hub-adapters.js +26 -0
- package/dist/sources/proxy-hub-adapters.js.map +1 -0
- package/dist/testing.d.ts +9 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +6 -0
- package/dist/tray/AnyPickTray.swift +3 -0
- package/dist/tray/activity.d.ts +18 -0
- package/dist/tray/activity.d.ts.map +1 -0
- package/dist/tray/activity.js +51 -0
- package/dist/tray/activity.js.map +1 -0
- package/dist/tray/app-icons/icon-1024.png +0 -0
- package/dist/tray/app-icons/icon-128.png +0 -0
- package/dist/tray/app-icons/icon-16.png +0 -0
- package/dist/tray/app-icons/icon-256.png +0 -0
- package/dist/tray/app-icons/icon-32.png +0 -0
- package/dist/tray/app-icons/icon-512.png +0 -0
- package/dist/tray/app-icons/icon-64.png +0 -0
- package/dist/tray/icons/claude.svg +1 -0
- package/dist/tray/icons/googlegemini.svg +1 -0
- package/dist/tray/icons/grok.svg +1 -0
- package/dist/tray/icons/kiro.svg +1 -0
- package/dist/tray/icons/openai.svg +1 -0
- package/dist/tray/icons/opencode.svg +1 -0
- package/dist/tray/icons/openrouter.svg +1 -0
- package/dist/tray/model-role-actions.d.ts +15 -0
- package/dist/tray/model-role-actions.d.ts.map +1 -0
- package/dist/tray/model-role-actions.js +41 -0
- package/dist/tray/model-role-actions.js.map +1 -0
- package/dist/tray/native/AccountsPanel.swift +434 -0
- package/dist/tray/native/AppEntry.swift +229 -0
- package/dist/tray/native/MainWindow.swift +300 -0
- package/dist/tray/native/ManageFormChrome.swift +332 -0
- package/dist/tray/native/ManageForms.swift +472 -0
- package/dist/tray/native/ManagePanel.swift +356 -0
- package/dist/tray/native/Models.swift +259 -0
- package/dist/tray/native/ModelsEditor.swift +390 -0
- package/dist/tray/native/ModelsOverview.swift +76 -0
- package/dist/tray/native/ModelsPickers.swift +273 -0
- package/dist/tray/native/ModelsRoutePickers.swift +718 -0
- package/dist/tray/native/MonitorPanel.swift +375 -0
- package/dist/tray/native/ProxyPanel.swift +326 -0
- package/dist/tray/native/QuickActivityRow.swift +40 -0
- package/dist/tray/native/QuickNav.swift +62 -0
- package/dist/tray/native/QuickPanel.swift +447 -0
- package/dist/tray/native/QuickRouteRow.swift +189 -0
- package/dist/tray/native/QuickServiceRows.swift +292 -0
- package/dist/tray/native/RoutingIssues.swift +293 -0
- package/dist/tray/native/SettingsPanel.swift +225 -0
- package/dist/tray/native/SharedUI.swift +681 -0
- package/dist/tray/native/Store.swift +540 -0
- package/dist/tray/native/Theme.swift +139 -0
- package/dist/tray/native/TrayChrome.swift +657 -0
- package/dist/tray/native/TrayControls.swift +475 -0
- package/dist/tray/native/TrayPreferences.swift +46 -0
- package/dist/tray/native/sources.txt +26 -0
- package/dist/tray/native-sources.d.ts +8 -0
- package/dist/tray/native-sources.d.ts.map +1 -0
- package/dist/tray/native-sources.js +19 -0
- package/dist/tray/native-sources.js.map +1 -0
- package/dist/tray/protocol.d.ts +79 -0
- package/dist/tray/protocol.d.ts.map +1 -0
- package/dist/tray/protocol.js +145 -0
- package/dist/tray/protocol.js.map +1 -0
- package/dist/tray/settings.d.ts +15 -0
- package/dist/tray/settings.d.ts.map +1 -0
- package/dist/tray/settings.js +72 -0
- package/dist/tray/settings.js.map +1 -0
- package/dist/tray/snapshot-client-routes.d.ts +11 -0
- package/dist/tray/snapshot-client-routes.d.ts.map +1 -0
- package/dist/tray/snapshot-client-routes.js +305 -0
- package/dist/tray/snapshot-client-routes.js.map +1 -0
- package/dist/tray/snapshot-helpers.d.ts +20 -0
- package/dist/tray/snapshot-helpers.d.ts.map +1 -0
- package/dist/tray/snapshot-helpers.js +74 -0
- package/dist/tray/snapshot-helpers.js.map +1 -0
- package/dist/tray/snapshot-hub.d.ts +7 -0
- package/dist/tray/snapshot-hub.d.ts.map +1 -0
- package/dist/tray/snapshot-hub.js +93 -0
- package/dist/tray/snapshot-hub.js.map +1 -0
- package/dist/tray/snapshot-resources.d.ts +19 -0
- package/dist/tray/snapshot-resources.d.ts.map +1 -0
- package/dist/tray/snapshot-resources.js +216 -0
- package/dist/tray/snapshot-resources.js.map +1 -0
- package/dist/tray/snapshot-types.d.ts +229 -0
- package/dist/tray/snapshot-types.d.ts.map +1 -0
- package/dist/tray/snapshot-usage.d.ts +9 -0
- package/dist/tray/snapshot-usage.d.ts.map +1 -0
- package/dist/tray/snapshot-usage.js +35 -0
- package/dist/tray/snapshot-usage.js.map +1 -0
- package/dist/tray/snapshot.d.ts +7 -0
- package/dist/tray/snapshot.d.ts.map +1 -0
- package/dist/tray/snapshot.js +48 -0
- package/dist/tray/snapshot.js.map +1 -0
- package/dist/tray/supervisor-actions.d.ts +19 -0
- package/dist/tray/supervisor-actions.d.ts.map +1 -0
- package/dist/tray/supervisor-actions.js +224 -0
- package/dist/tray/supervisor-actions.js.map +1 -0
- package/dist/tray/supervisor-activity.d.ts +5 -0
- package/dist/tray/supervisor-activity.d.ts.map +1 -0
- package/dist/tray/supervisor-activity.js +19 -0
- package/dist/tray/supervisor-activity.js.map +1 -0
- package/dist/tray/supervisor-errors.d.ts +9 -0
- package/dist/tray/supervisor-errors.d.ts.map +1 -0
- package/dist/tray/supervisor-errors.js +91 -0
- package/dist/tray/supervisor-errors.js.map +1 -0
- package/dist/tray/supervisor-logs.d.ts +6 -0
- package/dist/tray/supervisor-logs.d.ts.map +1 -0
- package/dist/tray/supervisor-logs.js +52 -0
- package/dist/tray/supervisor-logs.js.map +1 -0
- package/dist/tray/supervisor-mutations.d.ts +14 -0
- package/dist/tray/supervisor-mutations.d.ts.map +1 -0
- package/dist/tray/supervisor-mutations.js +218 -0
- package/dist/tray/supervisor-mutations.js.map +1 -0
- package/dist/tray/supervisor-native.d.ts +22 -0
- package/dist/tray/supervisor-native.d.ts.map +1 -0
- package/dist/tray/supervisor-native.js +227 -0
- package/dist/tray/supervisor-native.js.map +1 -0
- package/dist/tray/supervisor-proxies.d.ts +6 -0
- package/dist/tray/supervisor-proxies.d.ts.map +1 -0
- package/dist/tray/supervisor-proxies.js +37 -0
- package/dist/tray/supervisor-proxies.js.map +1 -0
- package/dist/tray/supervisor-tauri.d.ts +13 -0
- package/dist/tray/supervisor-tauri.d.ts.map +1 -0
- package/dist/tray/supervisor-tauri.js +36 -0
- package/dist/tray/supervisor-tauri.js.map +1 -0
- package/dist/tray/supervisor.d.ts +17 -0
- package/dist/tray/supervisor.d.ts.map +1 -0
- package/dist/tray/supervisor.js +372 -0
- package/dist/tray/supervisor.js.map +1 -0
- package/dist/tray/terminal-launcher.d.ts +12 -0
- package/dist/tray/terminal-launcher.d.ts.map +1 -0
- package/dist/tray/terminal-launcher.js +130 -0
- package/dist/tray/terminal-launcher.js.map +1 -0
- package/dist/tui/actions/ensure-proxy-up.d.ts +15 -0
- package/dist/tui/actions/ensure-proxy-up.d.ts.map +1 -0
- package/dist/tui/actions/ensure-proxy-up.js +41 -0
- package/dist/tui/actions/ensure-proxy-up.js.map +1 -0
- package/dist/tui/actions/use-account-actions.d.ts +35 -0
- package/dist/tui/actions/use-account-actions.d.ts.map +1 -0
- package/dist/tui/actions/use-account-actions.js +527 -0
- package/dist/tui/actions/use-account-actions.js.map +1 -0
- package/dist/tui/actions/use-app-bindings.d.ts +83 -0
- package/dist/tui/actions/use-app-bindings.d.ts.map +1 -0
- package/dist/tui/actions/use-app-bindings.js +472 -0
- package/dist/tui/actions/use-app-bindings.js.map +1 -0
- package/dist/tui/actions/use-gateway-actions.d.ts +45 -0
- package/dist/tui/actions/use-gateway-actions.d.ts.map +1 -0
- package/dist/tui/actions/use-gateway-actions.js +370 -0
- package/dist/tui/actions/use-gateway-actions.js.map +1 -0
- package/dist/tui/actions/use-home-filter.d.ts +24 -0
- package/dist/tui/actions/use-home-filter.d.ts.map +1 -0
- package/dist/tui/actions/use-home-filter.js +48 -0
- package/dist/tui/actions/use-home-filter.js.map +1 -0
- package/dist/tui/actions/use-model-role-editor.d.ts +44 -0
- package/dist/tui/actions/use-model-role-editor.d.ts.map +1 -0
- package/dist/tui/actions/use-model-role-editor.js +68 -0
- package/dist/tui/actions/use-model-role-editor.js.map +1 -0
- package/dist/tui/actions/use-provider-filter.d.ts +10 -0
- package/dist/tui/actions/use-provider-filter.d.ts.map +1 -0
- package/dist/tui/actions/use-provider-filter.js +22 -0
- package/dist/tui/actions/use-provider-filter.js.map +1 -0
- package/dist/tui/actions/use-proxy-actions.d.ts +31 -0
- package/dist/tui/actions/use-proxy-actions.d.ts.map +1 -0
- package/dist/tui/actions/use-proxy-actions.js +474 -0
- package/dist/tui/actions/use-proxy-actions.js.map +1 -0
- package/dist/tui/actions/use-text-input-submit.d.ts +16 -0
- package/dist/tui/actions/use-text-input-submit.d.ts.map +1 -0
- package/dist/tui/actions/use-text-input-submit.js +96 -0
- package/dist/tui/actions/use-text-input-submit.js.map +1 -0
- package/dist/tui/actions/use-tray-runtime-actions.d.ts +18 -0
- package/dist/tui/actions/use-tray-runtime-actions.d.ts.map +1 -0
- package/dist/tui/actions/use-tray-runtime-actions.js +78 -0
- package/dist/tui/actions/use-tray-runtime-actions.js.map +1 -0
- package/dist/tui/app-ui-helpers.d.ts +14 -0
- package/dist/tui/app-ui-helpers.d.ts.map +1 -0
- package/dist/tui/app-ui-helpers.js +48 -0
- package/dist/tui/app-ui-helpers.js.map +1 -0
- package/dist/tui/app-ui.d.ts +19 -0
- package/dist/tui/app-ui.d.ts.map +1 -0
- package/dist/tui/app-ui.js +98 -0
- package/dist/tui/app-ui.js.map +1 -0
- package/dist/tui/components/chrome/header.d.ts +39 -0
- package/dist/tui/components/chrome/header.d.ts.map +1 -0
- package/dist/tui/components/chrome/header.js +161 -0
- package/dist/tui/components/chrome/header.js.map +1 -0
- package/dist/tui/components/chrome/inputs.d.ts +34 -0
- package/dist/tui/components/chrome/inputs.d.ts.map +1 -0
- package/dist/tui/components/chrome/inputs.js +82 -0
- package/dist/tui/components/chrome/inputs.js.map +1 -0
- package/dist/tui/components/chrome/layout.d.ts +61 -0
- package/dist/tui/components/chrome/layout.d.ts.map +1 -0
- package/dist/tui/components/chrome/layout.js +119 -0
- package/dist/tui/components/chrome/layout.js.map +1 -0
- package/dist/tui/components/chrome/legacy.d.ts +84 -0
- package/dist/tui/components/chrome/legacy.d.ts.map +1 -0
- package/dist/tui/components/chrome/legacy.js +6 -0
- package/dist/tui/components/chrome/rows.d.ts +89 -0
- package/dist/tui/components/chrome/rows.d.ts.map +1 -0
- package/dist/tui/components/chrome/rows.js +151 -0
- package/dist/tui/components/chrome/rows.js.map +1 -0
- package/dist/tui/components/chrome/status.d.ts +50 -0
- package/dist/tui/components/chrome/status.d.ts.map +1 -0
- package/dist/tui/components/chrome/status.js +157 -0
- package/dist/tui/components/chrome/status.js.map +1 -0
- package/dist/tui/components/chrome.d.ts +7 -0
- package/dist/tui/components/chrome.d.ts.map +1 -0
- package/dist/tui/components/chrome.js +7 -0
- package/dist/tui/components.d.ts +26 -0
- package/dist/tui/components.d.ts.map +1 -0
- package/dist/tui/components.js +182 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/model/anypick.d.ts +106 -0
- package/dist/tui/model/anypick.d.ts.map +1 -0
- package/dist/tui/model/anypick.js +116 -0
- package/dist/tui/model/anypick.js.map +1 -0
- package/dist/tui/model/bindings.d.ts +39 -0
- package/dist/tui/model/bindings.d.ts.map +1 -0
- package/dist/tui/model/bindings.js +102 -0
- package/dist/tui/model/bindings.js.map +1 -0
- package/dist/tui/model/detail.d.ts +6 -0
- package/dist/tui/model/detail.d.ts.map +1 -0
- package/dist/tui/model/detail.js +85 -0
- package/dist/tui/model/detail.js.map +1 -0
- package/dist/tui/model/gateway.d.ts +46 -0
- package/dist/tui/model/gateway.d.ts.map +1 -0
- package/dist/tui/model/gateway.js +134 -0
- package/dist/tui/model/gateway.js.map +1 -0
- package/dist/tui/model/home-format.d.ts +52 -0
- package/dist/tui/model/home-format.d.ts.map +1 -0
- package/dist/tui/model/home-format.js +64 -0
- package/dist/tui/model/home-format.js.map +1 -0
- package/dist/tui/model/home-load.d.ts +8 -0
- package/dist/tui/model/home-load.d.ts.map +1 -0
- package/dist/tui/model/home-load.js +244 -0
- package/dist/tui/model/home-load.js.map +1 -0
- package/dist/tui/model/identity.d.ts +53 -0
- package/dist/tui/model/identity.d.ts.map +1 -0
- package/dist/tui/model/identity.js +176 -0
- package/dist/tui/model/identity.js.map +1 -0
- package/dist/tui/model/line-editor.d.ts +99 -0
- package/dist/tui/model/line-editor.d.ts.map +1 -0
- package/dist/tui/model/line-editor.js +186 -0
- package/dist/tui/model/line-editor.js.map +1 -0
- package/dist/tui/model/names.d.ts +28 -0
- package/dist/tui/model/names.d.ts.map +1 -0
- package/dist/tui/model/names.js +42 -0
- package/dist/tui/model/names.js.map +1 -0
- package/dist/tui/model/pool.d.ts +11 -0
- package/dist/tui/model/pool.d.ts.map +1 -0
- package/dist/tui/model/pool.js +115 -0
- package/dist/tui/model/pool.js.map +1 -0
- package/dist/tui/model/provider-filter.d.ts +14 -0
- package/dist/tui/model/provider-filter.d.ts.map +1 -0
- package/dist/tui/model/provider-filter.js +46 -0
- package/dist/tui/model/provider-filter.js.map +1 -0
- package/dist/tui/model/proxy-hub.d.ts +23 -0
- package/dist/tui/model/proxy-hub.d.ts.map +1 -0
- package/dist/tui/model/proxy-hub.js +69 -0
- package/dist/tui/model/proxy-hub.js.map +1 -0
- package/dist/tui/model/proxy-labels.d.ts +5 -0
- package/dist/tui/model/proxy-labels.d.ts.map +1 -0
- package/dist/tui/model/proxy-labels.js +18 -0
- package/dist/tui/model/proxy-labels.js.map +1 -0
- package/dist/tui/model/proxy.d.ts +15 -0
- package/dist/tui/model/proxy.d.ts.map +1 -0
- package/dist/tui/model/proxy.js +214 -0
- package/dist/tui/model/proxy.js.map +1 -0
- package/dist/tui/model/root.d.ts +20 -0
- package/dist/tui/model/root.d.ts.map +1 -0
- package/dist/tui/model/root.js +126 -0
- package/dist/tui/model/root.js.map +1 -0
- package/dist/tui/model/route-builder.d.ts +25 -0
- package/dist/tui/model/route-builder.d.ts.map +1 -0
- package/dist/tui/model/route-builder.js +199 -0
- package/dist/tui/model/route-builder.js.map +1 -0
- package/dist/tui/model/screen.d.ts +260 -0
- package/dist/tui/model/screen.d.ts.map +1 -0
- package/dist/tui/model/types.d.ts +179 -0
- package/dist/tui/model/types.d.ts.map +1 -0
- package/dist/tui/model.d.ts +18 -0
- package/dist/tui/model.d.ts.map +1 -0
- package/dist/tui/model.js +17 -0
- package/dist/tui/proxy-models-fetch.d.ts +34 -0
- package/dist/tui/proxy-models-fetch.d.ts.map +1 -0
- package/dist/tui/proxy-models-fetch.js +87 -0
- package/dist/tui/proxy-models-fetch.js.map +1 -0
- package/dist/tui/routes/account.d.ts +4 -0
- package/dist/tui/routes/account.d.ts.map +1 -0
- package/dist/tui/routes/account.js +327 -0
- package/dist/tui/routes/account.js.map +1 -0
- package/dist/tui/routes/apps.d.ts +3 -0
- package/dist/tui/routes/apps.d.ts.map +1 -0
- package/dist/tui/routes/apps.js +296 -0
- package/dist/tui/routes/apps.js.map +1 -0
- package/dist/tui/routes/common.d.ts +4 -0
- package/dist/tui/routes/common.d.ts.map +1 -0
- package/dist/tui/routes/common.js +117 -0
- package/dist/tui/routes/common.js.map +1 -0
- package/dist/tui/routes/context.d.ts +43 -0
- package/dist/tui/routes/context.d.ts.map +1 -0
- package/dist/tui/routes/gateway.d.ts +3 -0
- package/dist/tui/routes/gateway.d.ts.map +1 -0
- package/dist/tui/routes/gateway.js +199 -0
- package/dist/tui/routes/gateway.js.map +1 -0
- package/dist/tui/routes/proxy.d.ts +3 -0
- package/dist/tui/routes/proxy.d.ts.map +1 -0
- package/dist/tui/routes/proxy.js +234 -0
- package/dist/tui/routes/proxy.js.map +1 -0
- package/dist/tui/screens/account-detail.d.ts +14 -0
- package/dist/tui/screens/account-detail.d.ts.map +1 -0
- package/dist/tui/screens/account-detail.js +98 -0
- package/dist/tui/screens/account-detail.js.map +1 -0
- package/dist/tui/screens/accounts-home.d.ts +42 -0
- package/dist/tui/screens/accounts-home.d.ts.map +1 -0
- package/dist/tui/screens/accounts-home.js +321 -0
- package/dist/tui/screens/accounts-home.js.map +1 -0
- package/dist/tui/screens/add-account.d.ts +70 -0
- package/dist/tui/screens/add-account.d.ts.map +1 -0
- package/dist/tui/screens/add-account.js +323 -0
- package/dist/tui/screens/add-account.js.map +1 -0
- package/dist/tui/screens/anypick-home.d.ts +39 -0
- package/dist/tui/screens/anypick-home.d.ts.map +1 -0
- package/dist/tui/screens/anypick-home.js +253 -0
- package/dist/tui/screens/anypick-home.js.map +1 -0
- package/dist/tui/screens/anypick-preview.d.ts +13 -0
- package/dist/tui/screens/anypick-preview.d.ts.map +1 -0
- package/dist/tui/screens/anypick-preview.js +49 -0
- package/dist/tui/screens/anypick-preview.js.map +1 -0
- package/dist/tui/screens/app-route-preview.d.ts +14 -0
- package/dist/tui/screens/app-route-preview.d.ts.map +1 -0
- package/dist/tui/screens/app-route-preview.js +35 -0
- package/dist/tui/screens/app-route-preview.js.map +1 -0
- package/dist/tui/screens/app-route-source.d.ts +15 -0
- package/dist/tui/screens/app-route-source.d.ts.map +1 -0
- package/dist/tui/screens/app-route-source.js +97 -0
- package/dist/tui/screens/app-route-source.js.map +1 -0
- package/dist/tui/screens/apps-home.d.ts +22 -0
- package/dist/tui/screens/apps-home.d.ts.map +1 -0
- package/dist/tui/screens/apps-home.js +111 -0
- package/dist/tui/screens/apps-home.js.map +1 -0
- package/dist/tui/screens/confirm.d.ts +19 -0
- package/dist/tui/screens/confirm.d.ts.map +1 -0
- package/dist/tui/screens/confirm.js +42 -0
- package/dist/tui/screens/confirm.js.map +1 -0
- package/dist/tui/screens/credential-form.d.ts +30 -0
- package/dist/tui/screens/credential-form.d.ts.map +1 -0
- package/dist/tui/screens/credential-form.js +241 -0
- package/dist/tui/screens/credential-form.js.map +1 -0
- package/dist/tui/screens/gateway-connection-form.d.ts +16 -0
- package/dist/tui/screens/gateway-connection-form.d.ts.map +1 -0
- package/dist/tui/screens/gateway-connection-form.js +127 -0
- package/dist/tui/screens/gateway-connection-form.js.map +1 -0
- package/dist/tui/screens/gateway-pick-provider.d.ts +19 -0
- package/dist/tui/screens/gateway-pick-provider.d.ts.map +1 -0
- package/dist/tui/screens/gateway-pick-provider.js +62 -0
- package/dist/tui/screens/gateway-pick-provider.js.map +1 -0
- package/dist/tui/screens/gateways-home.d.ts +38 -0
- package/dist/tui/screens/gateways-home.d.ts.map +1 -0
- package/dist/tui/screens/gateways-home.js +247 -0
- package/dist/tui/screens/gateways-home.js.map +1 -0
- package/dist/tui/screens/health.d.ts +16 -0
- package/dist/tui/screens/health.d.ts.map +1 -0
- package/dist/tui/screens/health.js +109 -0
- package/dist/tui/screens/health.js.map +1 -0
- package/dist/tui/screens/help.d.ts +10 -0
- package/dist/tui/screens/help.d.ts.map +1 -0
- package/dist/tui/screens/help.js +213 -0
- package/dist/tui/screens/help.js.map +1 -0
- package/dist/tui/screens/manage-apps.d.ts +29 -0
- package/dist/tui/screens/manage-apps.d.ts.map +1 -0
- package/dist/tui/screens/manage-apps.js +165 -0
- package/dist/tui/screens/manage-apps.js.map +1 -0
- package/dist/tui/screens/proxy-board-helpers.d.ts +9 -0
- package/dist/tui/screens/proxy-board-helpers.d.ts.map +1 -0
- package/dist/tui/screens/proxy-board-helpers.js +70 -0
- package/dist/tui/screens/proxy-board-helpers.js.map +1 -0
- package/dist/tui/screens/proxy-board.d.ts +43 -0
- package/dist/tui/screens/proxy-board.d.ts.map +1 -0
- package/dist/tui/screens/proxy-board.js +351 -0
- package/dist/tui/screens/proxy-board.js.map +1 -0
- package/dist/tui/screens/proxy-hub.d.ts +21 -0
- package/dist/tui/screens/proxy-hub.d.ts.map +1 -0
- package/dist/tui/screens/proxy-hub.js +150 -0
- package/dist/tui/screens/proxy-hub.js.map +1 -0
- package/dist/tui/screens/proxy-models-utils.d.ts +13 -0
- package/dist/tui/screens/proxy-models-utils.d.ts.map +1 -0
- package/dist/tui/screens/proxy-models-utils.js +53 -0
- package/dist/tui/screens/proxy-models-utils.js.map +1 -0
- package/dist/tui/screens/proxy-models.d.ts +65 -0
- package/dist/tui/screens/proxy-models.d.ts.map +1 -0
- package/dist/tui/screens/proxy-models.js +252 -0
- package/dist/tui/screens/proxy-models.js.map +1 -0
- package/dist/tui/screens/proxy.d.ts +26 -0
- package/dist/tui/screens/proxy.d.ts.map +1 -0
- package/dist/tui/screens/text-input.d.ts +18 -0
- package/dist/tui/screens/text-input.d.ts.map +1 -0
- package/dist/tui/screens/text-input.js +67 -0
- package/dist/tui/screens/text-input.js.map +1 -0
- package/dist/tui/screens/tray-runtime.d.ts +19 -0
- package/dist/tui/screens/tray-runtime.d.ts.map +1 -0
- package/dist/tui/screens/tray-runtime.js +108 -0
- package/dist/tui/screens/tray-runtime.js.map +1 -0
- package/dist/tui/use-tui-nav.d.ts +40 -0
- package/dist/tui/use-tui-nav.d.ts.map +1 -0
- package/dist/tui/use-tui-nav.js +256 -0
- package/dist/tui/use-tui-nav.js.map +1 -0
- package/dist/tui/use-tui-shell.d.ts +46 -0
- package/dist/tui/use-tui-shell.d.ts.map +1 -0
- package/dist/tui/use-tui-shell.js +95 -0
- package/dist/tui/use-tui-shell.js.map +1 -0
- package/dist/types/account.d.ts +410 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +7 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/bindings.d.ts +300 -0
- package/dist/types/bindings.d.ts.map +1 -0
- package/dist/types/catalog.d.ts +165 -0
- package/dist/types/catalog.d.ts.map +1 -0
- package/dist/types/clients.d.ts +174 -0
- package/dist/types/clients.d.ts.map +1 -0
- package/dist/types/clients.js +11 -0
- package/dist/types/clients.js.map +1 -0
- package/dist/types/plugins.d.ts +89 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/plugins.js +14 -0
- package/dist/types/plugins.js.map +1 -0
- package/dist/types/proxy-hub.d.ts +109 -0
- package/dist/types/proxy-hub.d.ts.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/utils/errors.d.ts +61 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +119 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fs.d.ts +39 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +126 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/lock.d.ts +33 -0
- package/dist/utils/lock.d.ts.map +1 -0
- package/dist/utils/lock.js +95 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/log.d.ts +10 -0
- package/dist/utils/log.d.ts.map +1 -0
- package/dist/utils/log.js +21 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/network.d.ts +3 -0
- package/dist/utils/network.d.ts.map +1 -0
- package/dist/utils/network.js +13 -0
- package/dist/utils/network.js.map +1 -0
- package/dist/utils/process/binary.d.ts +14 -0
- package/dist/utils/process/binary.d.ts.map +1 -0
- package/dist/utils/process/binary.js +29 -0
- package/dist/utils/process/binary.js.map +1 -0
- package/dist/utils/process/follow.d.ts +2 -0
- package/dist/utils/process/follow.d.ts.map +1 -0
- package/dist/utils/process/follow.js +90 -0
- package/dist/utils/process/follow.js.map +1 -0
- package/dist/utils/process/health.d.ts +43 -0
- package/dist/utils/process/health.d.ts.map +1 -0
- package/dist/utils/process/health.js +132 -0
- package/dist/utils/process/health.js.map +1 -0
- package/dist/utils/process/pid.d.ts +95 -0
- package/dist/utils/process/pid.d.ts.map +1 -0
- package/dist/utils/process/pid.js +243 -0
- package/dist/utils/process/pid.js.map +1 -0
- package/dist/utils/process.d.ts +5 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +5 -0
- package/dist/utils/slug.d.ts +18 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +42 -0
- package/dist/utils/slug.js.map +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export declare const PID_RECORD_VERSION: 1;
|
|
2
|
+
/**
|
|
3
|
+
* Structured ownership record replacing the old numeric PID file (PROC-01).
|
|
4
|
+
*
|
|
5
|
+
* A numeric PID is not verifiable: PID reuse (ABA) could make AnyPick signal an
|
|
6
|
+
* unrelated live process. The structured record carries a random instance id,
|
|
7
|
+
* so a process is only ever treated as owned after its health endpoint echoes
|
|
8
|
+
* the matching instance id — not merely after the PID is alive.
|
|
9
|
+
*/
|
|
10
|
+
export interface PidRecord {
|
|
11
|
+
recordVersion: number;
|
|
12
|
+
instanceId: string;
|
|
13
|
+
pid: number;
|
|
14
|
+
endpoint?: string;
|
|
15
|
+
provider?: string;
|
|
16
|
+
account?: string;
|
|
17
|
+
command?: string;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SpawnDetachedOptions {
|
|
21
|
+
cwd?: string;
|
|
22
|
+
env?: NodeJS.ProcessEnv;
|
|
23
|
+
/** Append stdout/stderr here. */
|
|
24
|
+
logPath: string;
|
|
25
|
+
/** Write the owner-only structured record here. */
|
|
26
|
+
pidPath: string;
|
|
27
|
+
/** Endpoint the child will serve a health check on (for identity verify). */
|
|
28
|
+
endpoint?: string;
|
|
29
|
+
/** Provider/account owning the process (recorded, never trusted as proof). */
|
|
30
|
+
provider?: string;
|
|
31
|
+
account?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Spawn a long-running process detached from the CLI.
|
|
35
|
+
* stdout/stderr are appended to logPath; an owner-only structured record is
|
|
36
|
+
* written to pidPath (mode 0o600). Returns the child pid and its instance id.
|
|
37
|
+
*/
|
|
38
|
+
export declare function spawnDetached(command: string, args: string[], opts: SpawnDetachedOptions): Promise<{
|
|
39
|
+
pid: number;
|
|
40
|
+
instanceId: string;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Write an owner-only (0o600) structured pid record. Any failure throws rather
|
|
44
|
+
* than leaving a half-written, world-readable record.
|
|
45
|
+
*/
|
|
46
|
+
export declare function writePidRecord(pidPath: string, record: Omit<PidRecord, 'recordVersion' | 'createdAt'>): void;
|
|
47
|
+
/**
|
|
48
|
+
* Read a structured pid record. Returns null when:
|
|
49
|
+
* - the file is absent,
|
|
50
|
+
* - it is not valid JSON or is missing required fields (corrupt/partial),
|
|
51
|
+
* - it is a legacy numeric PID file (untrusted — fail closed so PID reuse
|
|
52
|
+
* cannot make us signal an unrelated live process).
|
|
53
|
+
*/
|
|
54
|
+
export declare function readPidRecord(pidPath: string): Promise<PidRecord | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Backward-compatible pid reader. Prefers the structured record; returns its
|
|
57
|
+
* pid. Legacy numeric files are UNTRUSTED and yield null (fail closed).
|
|
58
|
+
*/
|
|
59
|
+
export declare function readPidFile(pidPath: string): Promise<number | null>;
|
|
60
|
+
export declare function isProcessRunning(pid: number): boolean;
|
|
61
|
+
export interface StopPidFileOptions {
|
|
62
|
+
/** Time allowed for SIGTERM cleanup before SIGKILL. */
|
|
63
|
+
graceMs?: number;
|
|
64
|
+
/** Detached processes own a process group; signal it so grandchildren exit too. */
|
|
65
|
+
processGroup?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Verify the recorded instance id through the child's health endpoint before
|
|
68
|
+
* signalling. Defaults to true; only supervisors with a separate ownership
|
|
69
|
+
* channel (for example the macOS tray state file) may opt out explicitly.
|
|
70
|
+
*/
|
|
71
|
+
verifyHealth?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Whether the child echoes ANYPICK_INSTANCE_ID from /health. Defaults to true.
|
|
74
|
+
*
|
|
75
|
+
* A third-party binary cannot, so demanding it would leave every external
|
|
76
|
+
* proxy unstoppable. Ownership is then proved from the process start time
|
|
77
|
+
* instead: the record is written at spawn, so a live process whose start time
|
|
78
|
+
* matches `createdAt` cannot be a recycled PID — reuse only happens after the
|
|
79
|
+
* original exits, which is necessarily later. This is a different proof of
|
|
80
|
+
* the same fact, not a relaxation of PROC-01.
|
|
81
|
+
*/
|
|
82
|
+
expectInstanceId?: boolean;
|
|
83
|
+
}
|
|
84
|
+
/** Wall-clock start of a live process, or null if it cannot be determined. */
|
|
85
|
+
export declare function processStartedAt(pid: number): Promise<number | null>;
|
|
86
|
+
/**
|
|
87
|
+
* Stop a process recorded in pidPath. Returns true if a signal was sent.
|
|
88
|
+
* Waits until the process is gone (or force-kills) so the listen port can free.
|
|
89
|
+
*
|
|
90
|
+
* PROC-01 (fail closed): if the record is absent or unverifiable, stopPidFile
|
|
91
|
+
* returns false and signals nothing — it must never kill a process it cannot
|
|
92
|
+
* prove it owns (PID reuse / ABA).
|
|
93
|
+
*/
|
|
94
|
+
export declare function stopPidFile(pidPath: string, opts?: StopPidFileOptions): Promise<boolean>;
|
|
95
|
+
//# sourceMappingURL=pid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid.d.ts","sourceRoot":"","sources":["../../../src/utils/process/pid.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,kBAAkB,EAAG,CAAU,CAAC;AAsB7C;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAgD9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,GAAG,WAAW,CAAC,GACrD,IAAI,CASN;AAaD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA2B9E;AAiBD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGzE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,8EAA8E;AAC9E,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAe1E;AA0CD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAyGlB"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { ensureDir, pathExists } from "../fs.js";
|
|
2
|
+
import { sleep, verifyProcessHealth } from "./health.js";
|
|
3
|
+
import { chmodSync, existsSync, renameSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { open, readFile, unlink } from "node:fs/promises";
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
/**
|
|
9
|
+
* How far a process start time may sit from the pid record's `createdAt` and
|
|
10
|
+
* still count as the process we spawned. `ps` reports whole seconds, and the
|
|
11
|
+
* record is written moments after the fork, so this only has to absorb spawn
|
|
12
|
+
* latency — it is deliberately far smaller than any realistic PID-reuse gap.
|
|
13
|
+
*/
|
|
14
|
+
var START_TIME_TOLERANCE_MS = 6e4;
|
|
15
|
+
/**
|
|
16
|
+
* Budget for one ownership proof: a loopback health probe plus, for a
|
|
17
|
+
* third-party child, a `ps` fork.
|
|
18
|
+
*
|
|
19
|
+
* Deliberately not derived from `graceMs`. That is how long a caller will wait
|
|
20
|
+
* for a cooperative exit; this is how long the *proof* may take, and on a loaded
|
|
21
|
+
* machine the probe alone can exceed a second. Folding the two together let a
|
|
22
|
+
* caller asking for a fast kill make ownership unprovable, and an unprovable
|
|
23
|
+
* stop fails closed — leaking a live proxy that still holds its port.
|
|
24
|
+
*/
|
|
25
|
+
var VERIFY_OWNERSHIP_TIMEOUT_MS = 5e3;
|
|
26
|
+
/**
|
|
27
|
+
* Spawn a long-running process detached from the CLI.
|
|
28
|
+
* stdout/stderr are appended to logPath; an owner-only structured record is
|
|
29
|
+
* written to pidPath (mode 0o600). Returns the child pid and its instance id.
|
|
30
|
+
*/
|
|
31
|
+
async function spawnDetached(command, args, opts) {
|
|
32
|
+
await ensureDir(dirname(opts.logPath));
|
|
33
|
+
await ensureDir(dirname(opts.pidPath));
|
|
34
|
+
const logFd = await open(opts.logPath, "a");
|
|
35
|
+
const instanceId = randomUUID();
|
|
36
|
+
const childEnv = {
|
|
37
|
+
...opts.env ?? process.env,
|
|
38
|
+
ANYPICK_INSTANCE_ID: instanceId
|
|
39
|
+
};
|
|
40
|
+
const child = spawn(command, args, {
|
|
41
|
+
cwd: opts.cwd,
|
|
42
|
+
env: childEnv,
|
|
43
|
+
detached: true,
|
|
44
|
+
stdio: [
|
|
45
|
+
"ignore",
|
|
46
|
+
logFd.fd,
|
|
47
|
+
logFd.fd
|
|
48
|
+
]
|
|
49
|
+
});
|
|
50
|
+
child.unref();
|
|
51
|
+
await logFd.close();
|
|
52
|
+
if (child.pid == null) throw new Error(`Failed to spawn ${command}`);
|
|
53
|
+
try {
|
|
54
|
+
writePidRecord(opts.pidPath, {
|
|
55
|
+
instanceId,
|
|
56
|
+
pid: child.pid,
|
|
57
|
+
endpoint: opts.endpoint,
|
|
58
|
+
provider: opts.provider,
|
|
59
|
+
account: opts.account,
|
|
60
|
+
command
|
|
61
|
+
});
|
|
62
|
+
} catch (err) {
|
|
63
|
+
signalProcess(child.pid, "SIGTERM", true);
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
pid: child.pid,
|
|
68
|
+
instanceId
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Write an owner-only (0o600) structured pid record. Any failure throws rather
|
|
73
|
+
* than leaving a half-written, world-readable record.
|
|
74
|
+
*/
|
|
75
|
+
function writePidRecord(pidPath, record) {
|
|
76
|
+
const full = {
|
|
77
|
+
recordVersion: 1,
|
|
78
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
79
|
+
...record
|
|
80
|
+
};
|
|
81
|
+
writeFileSyncAtomic(`${pidPath}.${randomUUID()}.tmp`, JSON.stringify(full), pidPath);
|
|
82
|
+
}
|
|
83
|
+
function writeFileSyncAtomic(tmp, contents, target) {
|
|
84
|
+
writeFileSync(tmp, contents, { mode: 384 });
|
|
85
|
+
renameSync(tmp, target);
|
|
86
|
+
try {
|
|
87
|
+
chmodSync(target, 384);
|
|
88
|
+
} catch {}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Read a structured pid record. Returns null when:
|
|
92
|
+
* - the file is absent,
|
|
93
|
+
* - it is not valid JSON or is missing required fields (corrupt/partial),
|
|
94
|
+
* - it is a legacy numeric PID file (untrusted — fail closed so PID reuse
|
|
95
|
+
* cannot make us signal an unrelated live process).
|
|
96
|
+
*/
|
|
97
|
+
async function readPidRecord(pidPath) {
|
|
98
|
+
if (!await pathExists(pidPath)) return null;
|
|
99
|
+
let raw;
|
|
100
|
+
try {
|
|
101
|
+
raw = (await readFile(pidPath, "utf8")).trim();
|
|
102
|
+
} catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
if (!raw) return null;
|
|
106
|
+
if (/^\d+\s*$/.test(raw)) return null;
|
|
107
|
+
let parsed;
|
|
108
|
+
try {
|
|
109
|
+
parsed = JSON.parse(raw);
|
|
110
|
+
} catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (!isPidRecord(parsed)) return null;
|
|
114
|
+
return parsed;
|
|
115
|
+
}
|
|
116
|
+
function isPidRecord(v) {
|
|
117
|
+
if (typeof v !== "object" || v === null) return false;
|
|
118
|
+
const r = v;
|
|
119
|
+
return typeof r.instanceId === "string" && r.instanceId.length > 0 && typeof r.pid === "number" && Number.isInteger(r.pid) && r.pid > 0 && typeof r.recordVersion === "number";
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Backward-compatible pid reader. Prefers the structured record; returns its
|
|
123
|
+
* pid. Legacy numeric files are UNTRUSTED and yield null (fail closed).
|
|
124
|
+
*/
|
|
125
|
+
async function readPidFile(pidPath) {
|
|
126
|
+
const rec = await readPidRecord(pidPath);
|
|
127
|
+
return rec ? rec.pid : null;
|
|
128
|
+
}
|
|
129
|
+
function isProcessRunning(pid) {
|
|
130
|
+
try {
|
|
131
|
+
process.kill(pid, 0);
|
|
132
|
+
return true;
|
|
133
|
+
} catch {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Wall-clock start of a live process, or null if it cannot be determined. */
|
|
138
|
+
async function processStartedAt(pid) {
|
|
139
|
+
if (process.platform === "win32") return null;
|
|
140
|
+
try {
|
|
141
|
+
const { execFile } = await import("node:child_process");
|
|
142
|
+
const { promisify } = await import("node:util");
|
|
143
|
+
const { stdout } = await promisify(execFile)("/bin/ps", [
|
|
144
|
+
"-p",
|
|
145
|
+
String(pid),
|
|
146
|
+
"-o",
|
|
147
|
+
"lstart="
|
|
148
|
+
], { timeout: 2e3 });
|
|
149
|
+
const parsed = Date.parse(stdout.trim());
|
|
150
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
151
|
+
} catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function signalProcess(pid, signal, processGroup) {
|
|
156
|
+
if (processGroup && process.platform !== "win32") try {
|
|
157
|
+
process.kill(-pid, signal);
|
|
158
|
+
return true;
|
|
159
|
+
} catch {}
|
|
160
|
+
try {
|
|
161
|
+
process.kill(pid, signal);
|
|
162
|
+
return true;
|
|
163
|
+
} catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Whether `pid` is still the process that was proven owned before SIGTERM.
|
|
169
|
+
*
|
|
170
|
+
* Prefers the start time captured while the child was demonstrably ours: it
|
|
171
|
+
* stays valid through a shutdown that has already closed the health listener.
|
|
172
|
+
* Falls back to the health proof only when the platform cannot report a start
|
|
173
|
+
* time (Windows), and fails closed when neither is available (PROC-01).
|
|
174
|
+
*/
|
|
175
|
+
async function stillSameProcess(pid, ownedStartedAt, verifyViaHealth) {
|
|
176
|
+
if (ownedStartedAt == null) return verifyViaHealth();
|
|
177
|
+
const current = await processStartedAt(pid);
|
|
178
|
+
if (current == null) return false;
|
|
179
|
+
return Math.abs(current - ownedStartedAt) <= START_TIME_TOLERANCE_MS;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Stop a process recorded in pidPath. Returns true if a signal was sent.
|
|
183
|
+
* Waits until the process is gone (or force-kills) so the listen port can free.
|
|
184
|
+
*
|
|
185
|
+
* PROC-01 (fail closed): if the record is absent or unverifiable, stopPidFile
|
|
186
|
+
* returns false and signals nothing — it must never kill a process it cannot
|
|
187
|
+
* prove it owns (PID reuse / ABA).
|
|
188
|
+
*/
|
|
189
|
+
async function stopPidFile(pidPath, opts = {}) {
|
|
190
|
+
const rec = await readPidRecord(pidPath);
|
|
191
|
+
if (rec == null) return false;
|
|
192
|
+
const pid = rec.pid;
|
|
193
|
+
const byInstanceId = opts.expectInstanceId !== false;
|
|
194
|
+
let healthEndpoint;
|
|
195
|
+
const verifyOwned = async (timeoutMs) => {
|
|
196
|
+
if (opts.verifyHealth === false) return true;
|
|
197
|
+
if (!healthEndpoint) return false;
|
|
198
|
+
const healthy = await verifyProcessHealth(healthEndpoint, {
|
|
199
|
+
...byInstanceId ? { expectInstanceId: rec.instanceId } : {},
|
|
200
|
+
requirePid: pid,
|
|
201
|
+
timeoutMs,
|
|
202
|
+
intervalMs: 50
|
|
203
|
+
});
|
|
204
|
+
if (!healthy || byInstanceId) return healthy;
|
|
205
|
+
const startedAt = await processStartedAt(pid);
|
|
206
|
+
if (startedAt == null) return false;
|
|
207
|
+
return Math.abs(startedAt - Date.parse(rec.createdAt)) <= START_TIME_TOLERANCE_MS;
|
|
208
|
+
};
|
|
209
|
+
if (opts.verifyHealth !== false) {
|
|
210
|
+
if (!rec.endpoint || !rec.instanceId) return false;
|
|
211
|
+
try {
|
|
212
|
+
const url = new URL(rec.endpoint);
|
|
213
|
+
if (url.pathname === "" || url.pathname === "/") url.pathname = "/health";
|
|
214
|
+
else if (!url.pathname.endsWith("/health")) url.pathname = `${url.pathname.replace(/\/$/, "")}/health`;
|
|
215
|
+
healthEndpoint = url.toString();
|
|
216
|
+
} catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
if (!await verifyOwned(VERIFY_OWNERSHIP_TIMEOUT_MS)) return false;
|
|
220
|
+
}
|
|
221
|
+
let signaled = false;
|
|
222
|
+
if (isProcessRunning(pid)) {
|
|
223
|
+
if (!await verifyOwned(VERIFY_OWNERSHIP_TIMEOUT_MS)) return false;
|
|
224
|
+
const ownedStartedAt = await processStartedAt(pid);
|
|
225
|
+
signaled = signalProcess(pid, "SIGTERM", opts.processGroup ?? true);
|
|
226
|
+
const deadline = Date.now() + (opts.graceMs ?? 3e3);
|
|
227
|
+
while (isProcessRunning(pid) && Date.now() < deadline) await sleep(50);
|
|
228
|
+
if (isProcessRunning(pid)) {
|
|
229
|
+
if (!await stillSameProcess(pid, ownedStartedAt, () => verifyOwned(VERIFY_OWNERSHIP_TIMEOUT_MS))) return signaled;
|
|
230
|
+
signalProcess(pid, "SIGKILL", opts.processGroup ?? true);
|
|
231
|
+
const killDeadline = Date.now() + 1e3;
|
|
232
|
+
while (isProcessRunning(pid) && Date.now() < killDeadline) await sleep(25);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (!isProcessRunning(pid) && existsSync(pidPath)) try {
|
|
236
|
+
await unlink(pidPath);
|
|
237
|
+
} catch {}
|
|
238
|
+
return signaled;
|
|
239
|
+
}
|
|
240
|
+
//#endregion
|
|
241
|
+
export { isProcessRunning, processStartedAt, readPidFile, readPidRecord, spawnDetached, stopPidFile, writePidRecord };
|
|
242
|
+
|
|
243
|
+
//# sourceMappingURL=pid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid.js","names":[],"sources":["../../../src/utils/process/pid.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { open, readFile, unlink } from 'node:fs/promises';\nimport { writeFileSync, renameSync, chmodSync, existsSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { ensureDir, pathExists } from '../fs';\nimport { dirname } from 'node:path';\nimport { sleep, verifyProcessHealth } from './health';\n\nexport const PID_RECORD_VERSION = 1 as const;\n\n/**\n * How far a process start time may sit from the pid record's `createdAt` and\n * still count as the process we spawned. `ps` reports whole seconds, and the\n * record is written moments after the fork, so this only has to absorb spawn\n * latency — it is deliberately far smaller than any realistic PID-reuse gap.\n */\nconst START_TIME_TOLERANCE_MS = 60_000;\n\n/**\n * Budget for one ownership proof: a loopback health probe plus, for a\n * third-party child, a `ps` fork.\n *\n * Deliberately not derived from `graceMs`. That is how long a caller will wait\n * for a cooperative exit; this is how long the *proof* may take, and on a loaded\n * machine the probe alone can exceed a second. Folding the two together let a\n * caller asking for a fast kill make ownership unprovable, and an unprovable\n * stop fails closed — leaking a live proxy that still holds its port.\n */\nconst VERIFY_OWNERSHIP_TIMEOUT_MS = 5000;\n\n/**\n * Structured ownership record replacing the old numeric PID file (PROC-01).\n *\n * A numeric PID is not verifiable: PID reuse (ABA) could make AnyPick signal an\n * unrelated live process. The structured record carries a random instance id,\n * so a process is only ever treated as owned after its health endpoint echoes\n * the matching instance id — not merely after the PID is alive.\n */\nexport interface PidRecord {\n recordVersion: number;\n instanceId: string;\n pid: number;\n endpoint?: string;\n provider?: string;\n account?: string;\n command?: string;\n createdAt: string;\n}\n\nexport interface SpawnDetachedOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n /** Append stdout/stderr here. */\n logPath: string;\n /** Write the owner-only structured record here. */\n pidPath: string;\n /** Endpoint the child will serve a health check on (for identity verify). */\n endpoint?: string;\n /** Provider/account owning the process (recorded, never trusted as proof). */\n provider?: string;\n account?: string;\n}\n\n/**\n * Spawn a long-running process detached from the CLI.\n * stdout/stderr are appended to logPath; an owner-only structured record is\n * written to pidPath (mode 0o600). Returns the child pid and its instance id.\n */\nexport async function spawnDetached(\n command: string,\n args: string[],\n opts: SpawnDetachedOptions,\n): Promise<{ pid: number; instanceId: string }> {\n await ensureDir(dirname(opts.logPath));\n await ensureDir(dirname(opts.pidPath));\n\n const logFd = await open(opts.logPath, 'a');\n\n const instanceId = randomUUID();\n\n // Inject the instance id into the child's env so the proxy can echo it at\n // /health. Identity verification (not just pid liveness) is what lets us\n // treat a process as genuinely ours (PROC-01, ABA-safe).\n const childEnv: NodeJS.ProcessEnv = {\n ...(opts.env ?? process.env),\n ANYPICK_INSTANCE_ID: instanceId,\n };\n\n const child = spawn(command, args, {\n cwd: opts.cwd,\n env: childEnv,\n detached: true,\n stdio: ['ignore', logFd.fd, logFd.fd],\n });\n\n child.unref();\n await logFd.close();\n\n if (child.pid == null) {\n throw new Error(`Failed to spawn ${command}`);\n }\n\n try {\n writePidRecord(opts.pidPath, {\n instanceId,\n pid: child.pid,\n endpoint: opts.endpoint,\n provider: opts.provider,\n account: opts.account,\n command,\n });\n } catch (err) {\n // The caller cannot later discover an unrecorded detached child. This PID\n // came directly from this spawn, so cleanup is safe even without a health\n // endpoint/record verification.\n signalProcess(child.pid, 'SIGTERM', true);\n throw err;\n }\n\n return { pid: child.pid, instanceId };\n}\n\n/**\n * Write an owner-only (0o600) structured pid record. Any failure throws rather\n * than leaving a half-written, world-readable record.\n */\nexport function writePidRecord(\n pidPath: string,\n record: Omit<PidRecord, 'recordVersion' | 'createdAt'>,\n): void {\n const full: PidRecord = {\n recordVersion: PID_RECORD_VERSION,\n createdAt: new Date().toISOString(),\n ...record,\n };\n // Write atomically to a sibling, then rename over the target.\n const tmp = `${pidPath}.${randomUUID()}.tmp`;\n writeFileSyncAtomic(tmp, JSON.stringify(full), pidPath);\n}\n\nfunction writeFileSyncAtomic(tmp: string, contents: string, target: string): void {\n // Synchronous so the record is durable before spawnDetached returns.\n writeFileSync(tmp, contents, { mode: 0o600 });\n renameSync(tmp, target);\n try {\n chmodSync(target, 0o600);\n } catch {\n // best-effort; rename already applied 0o600 on POSIX\n }\n}\n\n/**\n * Read a structured pid record. Returns null when:\n * - the file is absent,\n * - it is not valid JSON or is missing required fields (corrupt/partial),\n * - it is a legacy numeric PID file (untrusted — fail closed so PID reuse\n * cannot make us signal an unrelated live process).\n */\nexport async function readPidRecord(pidPath: string): Promise<PidRecord | null> {\n if (!(await pathExists(pidPath))) {\n return null;\n }\n let raw: string;\n try {\n raw = (await readFile(pidPath, 'utf8')).trim();\n } catch {\n return null;\n }\n if (!raw) {\n return null;\n }\n // Legacy numeric record: never trust it as a pid.\n if (/^\\d+\\s*$/.test(raw)) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!isPidRecord(parsed)) {\n return null;\n }\n return parsed;\n}\n\nfunction isPidRecord(v: unknown): v is PidRecord {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n const r = v as Record<string, unknown>;\n return (\n typeof r.instanceId === 'string' &&\n r.instanceId.length > 0 &&\n typeof r.pid === 'number' &&\n Number.isInteger(r.pid) &&\n r.pid > 0 &&\n typeof r.recordVersion === 'number'\n );\n}\n\n/**\n * Backward-compatible pid reader. Prefers the structured record; returns its\n * pid. Legacy numeric files are UNTRUSTED and yield null (fail closed).\n */\nexport async function readPidFile(pidPath: string): Promise<number | null> {\n const rec = await readPidRecord(pidPath);\n return rec ? rec.pid : null;\n}\n\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface StopPidFileOptions {\n /** Time allowed for SIGTERM cleanup before SIGKILL. */\n graceMs?: number;\n /** Detached processes own a process group; signal it so grandchildren exit too. */\n processGroup?: boolean;\n /**\n * Verify the recorded instance id through the child's health endpoint before\n * signalling. Defaults to true; only supervisors with a separate ownership\n * channel (for example the macOS tray state file) may opt out explicitly.\n */\n verifyHealth?: boolean;\n /**\n * Whether the child echoes ANYPICK_INSTANCE_ID from /health. Defaults to true.\n *\n * A third-party binary cannot, so demanding it would leave every external\n * proxy unstoppable. Ownership is then proved from the process start time\n * instead: the record is written at spawn, so a live process whose start time\n * matches `createdAt` cannot be a recycled PID — reuse only happens after the\n * original exits, which is necessarily later. This is a different proof of\n * the same fact, not a relaxation of PROC-01.\n */\n expectInstanceId?: boolean;\n}\n\n/** Wall-clock start of a live process, or null if it cannot be determined. */\nexport async function processStartedAt(pid: number): Promise<number | null> {\n if (process.platform === 'win32') {\n return null;\n }\n try {\n const { execFile } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const { stdout } = await promisify(execFile)('/bin/ps', ['-p', String(pid), '-o', 'lstart='], {\n timeout: 2000,\n });\n const parsed = Date.parse(stdout.trim());\n return Number.isNaN(parsed) ? null : parsed;\n } catch {\n return null;\n }\n}\n\nfunction signalProcess(pid: number, signal: NodeJS.Signals, processGroup: boolean): boolean {\n if (processGroup && process.platform !== 'win32') {\n try {\n process.kill(-pid, signal);\n return true;\n } catch {\n // The process may not be a group leader (legacy runtime); fall back to its PID.\n }\n }\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Whether `pid` is still the process that was proven owned before SIGTERM.\n *\n * Prefers the start time captured while the child was demonstrably ours: it\n * stays valid through a shutdown that has already closed the health listener.\n * Falls back to the health proof only when the platform cannot report a start\n * time (Windows), and fails closed when neither is available (PROC-01).\n */\nasync function stillSameProcess(\n pid: number,\n ownedStartedAt: number | null,\n verifyViaHealth: () => Promise<boolean>,\n): Promise<boolean> {\n if (ownedStartedAt == null) {\n return verifyViaHealth();\n }\n const current = await processStartedAt(pid);\n if (current == null) {\n return false;\n }\n return Math.abs(current - ownedStartedAt) <= START_TIME_TOLERANCE_MS;\n}\n\n/**\n * Stop a process recorded in pidPath. Returns true if a signal was sent.\n * Waits until the process is gone (or force-kills) so the listen port can free.\n *\n * PROC-01 (fail closed): if the record is absent or unverifiable, stopPidFile\n * returns false and signals nothing — it must never kill a process it cannot\n * prove it owns (PID reuse / ABA).\n */\nexport async function stopPidFile(\n pidPath: string,\n opts: StopPidFileOptions = {},\n): Promise<boolean> {\n const rec = await readPidRecord(pidPath);\n if (rec == null) {\n return false;\n }\n const pid = rec.pid;\n\n // A syntactically valid PID record is not proof of ownership: the PID may\n // have been recycled since the record was written. Built-in proxies echo\n // ANYPICK_INSTANCE_ID from /health, so require that identity match before any\n // signal. If the endpoint/health check is unavailable, fail closed and leave\n // the record for doctor/recovery rather than risking an unrelated process.\n const byInstanceId = opts.expectInstanceId !== false;\n let healthEndpoint: string | undefined;\n const verifyOwned = async (timeoutMs: number): Promise<boolean> => {\n if (opts.verifyHealth === false) {\n return true;\n }\n if (!healthEndpoint) {\n return false;\n }\n const healthy = await verifyProcessHealth(healthEndpoint, {\n ...(byInstanceId ? { expectInstanceId: rec.instanceId } : {}),\n requirePid: pid,\n timeoutMs,\n intervalMs: 50,\n });\n if (!healthy || byInstanceId) {\n return healthy;\n }\n const startedAt = await processStartedAt(pid);\n if (startedAt == null) {\n return false;\n }\n return Math.abs(startedAt - Date.parse(rec.createdAt)) <= START_TIME_TOLERANCE_MS;\n };\n\n if (opts.verifyHealth !== false) {\n if (!rec.endpoint || !rec.instanceId) {\n return false;\n }\n try {\n const url = new URL(rec.endpoint);\n if (url.pathname === '' || url.pathname === '/') {\n url.pathname = '/health';\n } else if (!url.pathname.endsWith('/health')) {\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/health`;\n }\n healthEndpoint = url.toString();\n } catch {\n return false;\n }\n const owned = await verifyOwned(VERIFY_OWNERSHIP_TIMEOUT_MS);\n if (!owned) {\n return false;\n }\n }\n\n let signaled = false;\n if (isProcessRunning(pid)) {\n // Re-check immediately before signalling. A process can exit and its PID\n // be recycled during the initial health probe.\n if (!(await verifyOwned(VERIFY_OWNERSHIP_TIMEOUT_MS))) {\n return false;\n }\n // Ownership is proven here, while the child is still serving. Capture its\n // start time now: escalation below cannot re-prove ownership through\n // /health, because a child that honors SIGTERM closes its listener first\n // and would then look unowned while it is still shutting down. Start time\n // is the same PROC-01 proof that survives that window — a recycled PID\n // necessarily starts later than the process it replaced.\n const ownedStartedAt = await processStartedAt(pid);\n signaled = signalProcess(pid, 'SIGTERM', opts.processGroup ?? true);\n // Wait for graceful exit\n const deadline = Date.now() + (opts.graceMs ?? 3000);\n while (isProcessRunning(pid) && Date.now() < deadline) {\n await sleep(50);\n }\n if (isProcessRunning(pid)) {\n // Never escalate to SIGKILL after a PID-reuse window without proving the\n // same instance still owns the endpoint.\n if (\n !(await stillSameProcess(pid, ownedStartedAt, () =>\n verifyOwned(VERIFY_OWNERSHIP_TIMEOUT_MS),\n ))\n ) {\n return signaled;\n }\n signalProcess(pid, 'SIGKILL', opts.processGroup ?? true);\n const killDeadline = Date.now() + 1000;\n while (isProcessRunning(pid) && Date.now() < killDeadline) {\n await sleep(25);\n }\n }\n }\n\n // Never discard the only ownership record while the process is still alive.\n if (!isProcessRunning(pid) && existsSync(pidPath)) {\n try {\n await unlink(pidPath);\n } catch {\n // ignore\n }\n }\n return signaled;\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAM,0BAA0B;;;;;;;;;;;AAYhC,IAAM,8BAA8B;;;;;;AAwCpC,eAAsB,cACpB,SACA,MACA,MAC8C;CAC9C,MAAM,UAAU,QAAQ,KAAK,OAAO,CAAC;CACrC,MAAM,UAAU,QAAQ,KAAK,OAAO,CAAC;CAErC,MAAM,QAAQ,MAAM,KAAK,KAAK,SAAS,GAAG;CAE1C,MAAM,aAAa,WAAW;CAK9B,MAAM,WAA8B;EAClC,GAAI,KAAK,OAAO,QAAQ;EACxB,qBAAqB;CACvB;CAEA,MAAM,QAAQ,MAAM,SAAS,MAAM;EACjC,KAAK,KAAK;EACV,KAAK;EACL,UAAU;EACV,OAAO;GAAC;GAAU,MAAM;GAAI,MAAM;EAAE;CACtC,CAAC;CAED,MAAM,MAAM;CACZ,MAAM,MAAM,MAAM;CAElB,IAAI,MAAM,OAAO,MACf,MAAM,IAAI,MAAM,mBAAmB,SAAS;CAG9C,IAAI;EACF,eAAe,KAAK,SAAS;GAC3B;GACA,KAAK,MAAM;GACX,UAAU,KAAK;GACf,UAAU,KAAK;GACf,SAAS,KAAK;GACd;EACF,CAAC;CACH,SAAS,KAAK;EAIZ,cAAc,MAAM,KAAK,WAAW,IAAI;EACxC,MAAM;CACR;CAEA,OAAO;EAAE,KAAK,MAAM;EAAK;CAAW;AACtC;;;;;AAMA,SAAgB,eACd,SACA,QACM;CACN,MAAM,OAAkB;EACtB,eAAA;EACA,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;EAClC,GAAG;CACL;CAGA,oBAAoB,GADL,QAAQ,GAAG,WAAW,EAAE,OACd,KAAK,UAAU,IAAI,GAAG,OAAO;AACxD;AAEA,SAAS,oBAAoB,KAAa,UAAkB,QAAsB;CAEhF,cAAc,KAAK,UAAU,EAAE,MAAM,IAAM,CAAC;CAC5C,WAAW,KAAK,MAAM;CACtB,IAAI;EACF,UAAU,QAAQ,GAAK;CACzB,QAAQ,CAER;AACF;;;;;;;;AASA,eAAsB,cAAc,SAA4C;CAC9E,IAAI,CAAE,MAAM,WAAW,OAAO,GAC5B,OAAO;CAET,IAAI;CACJ,IAAI;EACF,OAAO,MAAM,SAAS,SAAS,MAAM,EAAA,CAAG,KAAK;CAC/C,QAAQ;EACN,OAAO;CACT;CACA,IAAI,CAAC,KACH,OAAO;CAGT,IAAI,WAAW,KAAK,GAAG,GACrB,OAAO;CAET,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,GAAG;CACzB,QAAQ;EACN,OAAO;CACT;CACA,IAAI,CAAC,YAAY,MAAM,GACrB,OAAO;CAET,OAAO;AACT;AAEA,SAAS,YAAY,GAA4B;CAC/C,IAAI,OAAO,MAAM,YAAY,MAAM,MACjC,OAAO;CAET,MAAM,IAAI;CACV,OACE,OAAO,EAAE,eAAe,YACxB,EAAE,WAAW,SAAS,KACtB,OAAO,EAAE,QAAQ,YACjB,OAAO,UAAU,EAAE,GAAG,KACtB,EAAE,MAAM,KACR,OAAO,EAAE,kBAAkB;AAE/B;;;;;AAMA,eAAsB,YAAY,SAAyC;CACzE,MAAM,MAAM,MAAM,cAAc,OAAO;CACvC,OAAO,MAAM,IAAI,MAAM;AACzB;AAEA,SAAgB,iBAAiB,KAAsB;CACrD,IAAI;EACF,QAAQ,KAAK,KAAK,CAAC;EACnB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;AA2BA,eAAsB,iBAAiB,KAAqC;CAC1E,IAAI,QAAQ,aAAa,SACvB,OAAO;CAET,IAAI;EACF,MAAM,EAAE,aAAa,MAAM,OAAO;EAClC,MAAM,EAAE,cAAc,MAAM,OAAO;EACnC,MAAM,EAAE,WAAW,MAAM,UAAU,QAAQ,CAAC,CAAC,WAAW;GAAC;GAAM,OAAO,GAAG;GAAG;GAAM;EAAS,GAAG,EAC5F,SAAS,IACX,CAAC;EACD,MAAM,SAAS,KAAK,MAAM,OAAO,KAAK,CAAC;EACvC,OAAO,OAAO,MAAM,MAAM,IAAI,OAAO;CACvC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAAc,KAAa,QAAwB,cAAgC;CAC1F,IAAI,gBAAgB,QAAQ,aAAa,SACvC,IAAI;EACF,QAAQ,KAAK,CAAC,KAAK,MAAM;EACzB,OAAO;CACT,QAAQ,CAER;CAEF,IAAI;EACF,QAAQ,KAAK,KAAK,MAAM;EACxB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;;AAUA,eAAe,iBACb,KACA,gBACA,iBACkB;CAClB,IAAI,kBAAkB,MACpB,OAAO,gBAAgB;CAEzB,MAAM,UAAU,MAAM,iBAAiB,GAAG;CAC1C,IAAI,WAAW,MACb,OAAO;CAET,OAAO,KAAK,IAAI,UAAU,cAAc,KAAK;AAC/C;;;;;;;;;AAUA,eAAsB,YACpB,SACA,OAA2B,CAAC,GACV;CAClB,MAAM,MAAM,MAAM,cAAc,OAAO;CACvC,IAAI,OAAO,MACT,OAAO;CAET,MAAM,MAAM,IAAI;CAOhB,MAAM,eAAe,KAAK,qBAAqB;CAC/C,IAAI;CACJ,MAAM,cAAc,OAAO,cAAwC;EACjE,IAAI,KAAK,iBAAiB,OACxB,OAAO;EAET,IAAI,CAAC,gBACH,OAAO;EAET,MAAM,UAAU,MAAM,oBAAoB,gBAAgB;GACxD,GAAI,eAAe,EAAE,kBAAkB,IAAI,WAAW,IAAI,CAAC;GAC3D,YAAY;GACZ;GACA,YAAY;EACd,CAAC;EACD,IAAI,CAAC,WAAW,cACd,OAAO;EAET,MAAM,YAAY,MAAM,iBAAiB,GAAG;EAC5C,IAAI,aAAa,MACf,OAAO;EAET,OAAO,KAAK,IAAI,YAAY,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK;CAC5D;CAEA,IAAI,KAAK,iBAAiB,OAAO;EAC/B,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,YACxB,OAAO;EAET,IAAI;GACF,MAAM,MAAM,IAAI,IAAI,IAAI,QAAQ;GAChC,IAAI,IAAI,aAAa,MAAM,IAAI,aAAa,KAC1C,IAAI,WAAW;QACV,IAAI,CAAC,IAAI,SAAS,SAAS,SAAS,GACzC,IAAI,WAAW,GAAG,IAAI,SAAS,QAAQ,OAAO,EAAE,EAAE;GAEpD,iBAAiB,IAAI,SAAS;EAChC,QAAQ;GACN,OAAO;EACT;EAEA,IAAI,CAAC,MADe,YAAY,2BAA2B,GAEzD,OAAO;CAEX;CAEA,IAAI,WAAW;CACf,IAAI,iBAAiB,GAAG,GAAG;EAGzB,IAAI,CAAE,MAAM,YAAY,2BAA2B,GACjD,OAAO;EAQT,MAAM,iBAAiB,MAAM,iBAAiB,GAAG;EACjD,WAAW,cAAc,KAAK,WAAW,KAAK,gBAAgB,IAAI;EAElE,MAAM,WAAW,KAAK,IAAI,KAAK,KAAK,WAAW;EAC/C,OAAO,iBAAiB,GAAG,KAAK,KAAK,IAAI,IAAI,UAC3C,MAAM,MAAM,EAAE;EAEhB,IAAI,iBAAiB,GAAG,GAAG;GAGzB,IACE,CAAE,MAAM,iBAAiB,KAAK,sBAC5B,YAAY,2BAA2B,CACzC,GAEA,OAAO;GAET,cAAc,KAAK,WAAW,KAAK,gBAAgB,IAAI;GACvD,MAAM,eAAe,KAAK,IAAI,IAAI;GAClC,OAAO,iBAAiB,GAAG,KAAK,KAAK,IAAI,IAAI,cAC3C,MAAM,MAAM,EAAE;EAElB;CACF;CAGA,IAAI,CAAC,iBAAiB,GAAG,KAAK,WAAW,OAAO,GAC9C,IAAI;EACF,MAAM,OAAO,OAAO;CACtB,QAAQ,CAER;CAEF,OAAO;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { isListenPortFree, listenPidsOnPort, sleep, verifyProcessHealth, waitForHttp } from "./process/health.js";
|
|
2
|
+
import { isProcessRunning, processStartedAt, readPidFile, readPidRecord, spawnDetached, stopPidFile, writePidRecord } from "./process/pid.js";
|
|
3
|
+
import { resolveBinary } from "./process/binary.js";
|
|
4
|
+
import { followFile } from "./process/follow.js";
|
|
5
|
+
export { followFile, isListenPortFree, isProcessRunning, listenPidsOnPort, processStartedAt, readPidFile, readPidRecord, resolveBinary, sleep, spawnDetached, stopPidFile, verifyProcessHealth, waitForHttp, writePidRecord };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize a slug used for account or profile directory names.
|
|
3
|
+
*
|
|
4
|
+
* Human-friendly input is accepted and auto-slugified instead of rejected:
|
|
5
|
+
* "Kiro Key - 1k" → "kiro-key-1k"
|
|
6
|
+
* "Work Team" → "work-team"
|
|
7
|
+
*
|
|
8
|
+
* Result is safe for filesystem paths: lowercase, [a-z0-9._-], no spaces.
|
|
9
|
+
*/
|
|
10
|
+
export declare function normalizeSlug(raw: string, kind?: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Original display form of a name (trimmed), for use as a human label.
|
|
13
|
+
* Returns undefined when it is empty or identical to the slug.
|
|
14
|
+
*/
|
|
15
|
+
export declare function displayLabelFromName(raw: string, slug: string): string | undefined;
|
|
16
|
+
export declare function normalizeAccountName(raw: string): string;
|
|
17
|
+
export declare function normalizeProfileName(raw: string): string;
|
|
18
|
+
//# sourceMappingURL=slug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAS,GAAG,MAAM,CAsChE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//#region src/utils/slug.ts
|
|
2
|
+
/**
|
|
3
|
+
* Normalize a slug used for account or profile directory names.
|
|
4
|
+
*
|
|
5
|
+
* Human-friendly input is accepted and auto-slugified instead of rejected:
|
|
6
|
+
* "Kiro Key - 1k" → "kiro-key-1k"
|
|
7
|
+
* "Work Team" → "work-team"
|
|
8
|
+
*
|
|
9
|
+
* Result is safe for filesystem paths: lowercase, [a-z0-9._-], no spaces.
|
|
10
|
+
*/
|
|
11
|
+
var MAX_SLUG_LEN = 64;
|
|
12
|
+
function normalizeSlug(raw, kind = "name") {
|
|
13
|
+
if (raw == null || String(raw).trim() === "") throw new Error(`${kind} is required.`);
|
|
14
|
+
let name = String(raw).trim().normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
|
|
15
|
+
name = name.replace(/[/\\]+/g, "-").replace(/\.\.+/g, ".");
|
|
16
|
+
name = name.replace(/[^a-z0-9._-]+/g, "-");
|
|
17
|
+
name = name.replace(/-+/g, "-").replace(/_+/g, "_").replace(/\.+/g, ".");
|
|
18
|
+
name = name.replace(/^[-._]+|[-._]+$/g, "");
|
|
19
|
+
if (!name) throw new Error(`${kind} "${raw}" has no usable characters. Use letters or digits.`);
|
|
20
|
+
if (name.length > MAX_SLUG_LEN) name = name.slice(0, MAX_SLUG_LEN).replace(/[-._]+$/g, "");
|
|
21
|
+
if (!/^[a-z0-9]/.test(name)) throw new Error(`${kind} "${raw}" must start with a letter or digit after normalization.`);
|
|
22
|
+
return name;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Original display form of a name (trimmed), for use as a human label.
|
|
26
|
+
* Returns undefined when it is empty or identical to the slug.
|
|
27
|
+
*/
|
|
28
|
+
function displayLabelFromName(raw, slug) {
|
|
29
|
+
const label = String(raw).trim();
|
|
30
|
+
if (!label || label === slug) return;
|
|
31
|
+
return label;
|
|
32
|
+
}
|
|
33
|
+
function normalizeAccountName(raw) {
|
|
34
|
+
return normalizeSlug(raw, "Account name");
|
|
35
|
+
}
|
|
36
|
+
function normalizeProfileName(raw) {
|
|
37
|
+
return normalizeSlug(raw, "Profile name");
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { displayLabelFromName, normalizeAccountName, normalizeProfileName, normalizeSlug };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","names":[],"sources":["../../src/utils/slug.ts"],"sourcesContent":["/**\n * Normalize a slug used for account or profile directory names.\n *\n * Human-friendly input is accepted and auto-slugified instead of rejected:\n * \"Kiro Key - 1k\" → \"kiro-key-1k\"\n * \"Work Team\" → \"work-team\"\n *\n * Result is safe for filesystem paths: lowercase, [a-z0-9._-], no spaces.\n */\n\nconst MAX_SLUG_LEN = 64;\n\nexport function normalizeSlug(raw: string, kind = 'name'): string {\n if (raw == null || String(raw).trim() === '') {\n throw new Error(`${kind} is required.`);\n }\n\n // Unicode normalize + strip combining marks so \"café\" → \"cafe\"\n let name = String(raw)\n .trim()\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n\n // Path separators and parent refs must never survive\n name = name.replace(/[/\\\\]+/g, '-').replace(/\\.\\.+/g, '.');\n\n // Everything that is not a safe slug char → hyphen (spaces, punctuation, …)\n name = name.replace(/[^a-z0-9._-]+/g, '-');\n\n // Collapse runs of separators (keep dots as single dots when repeated)\n name = name.replace(/-+/g, '-').replace(/_+/g, '_').replace(/\\.+/g, '.');\n\n // Trim leading/trailing separators\n name = name.replace(/^[-._]+|[-._]+$/g, '');\n\n if (!name) {\n throw new Error(`${kind} \"${raw}\" has no usable characters. Use letters or digits.`);\n }\n\n if (name.length > MAX_SLUG_LEN) {\n name = name.slice(0, MAX_SLUG_LEN).replace(/[-._]+$/g, '');\n }\n\n // Must start with alphanumeric after cleanup\n if (!/^[a-z0-9]/.test(name)) {\n throw new Error(`${kind} \"${raw}\" must start with a letter or digit after normalization.`);\n }\n\n return name;\n}\n\n/**\n * Original display form of a name (trimmed), for use as a human label.\n * Returns undefined when it is empty or identical to the slug.\n */\nexport function displayLabelFromName(raw: string, slug: string): string | undefined {\n const label = String(raw).trim();\n if (!label || label === slug) {\n return undefined;\n }\n return label;\n}\n\nexport function normalizeAccountName(raw: string): string {\n return normalizeSlug(raw, 'Account name');\n}\n\nexport function normalizeProfileName(raw: string): string {\n return normalizeSlug(raw, 'Profile name');\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAM,eAAe;AAErB,SAAgB,cAAc,KAAa,OAAO,QAAgB;CAChE,IAAI,OAAO,QAAQ,OAAO,GAAG,CAAC,CAAC,KAAK,MAAM,IACxC,MAAM,IAAI,MAAM,GAAG,KAAK,cAAc;CAIxC,IAAI,OAAO,OAAO,GAAG,CAAC,CACnB,KAAK,CAAC,CACN,UAAU,MAAM,CAAC,CACjB,QAAQ,oBAAoB,EAAE,CAAC,CAC/B,YAAY;CAGf,OAAO,KAAK,QAAQ,WAAW,GAAG,CAAC,CAAC,QAAQ,UAAU,GAAG;CAGzD,OAAO,KAAK,QAAQ,kBAAkB,GAAG;CAGzC,OAAO,KAAK,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG;CAGvE,OAAO,KAAK,QAAQ,oBAAoB,EAAE;CAE1C,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,mDAAmD;CAGrF,IAAI,KAAK,SAAS,cAChB,OAAO,KAAK,MAAM,GAAG,YAAY,CAAC,CAAC,QAAQ,YAAY,EAAE;CAI3D,IAAI,CAAC,YAAY,KAAK,IAAI,GACxB,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,yDAAyD;CAG3F,OAAO;AACT;;;;;AAMA,SAAgB,qBAAqB,KAAa,MAAkC;CAClF,MAAM,QAAQ,OAAO,GAAG,CAAC,CAAC,KAAK;CAC/B,IAAI,CAAC,SAAS,UAAU,MACtB;CAEF,OAAO;AACT;AAEA,SAAgB,qBAAqB,KAAqB;CACxD,OAAO,cAAc,KAAK,cAAc;AAC1C;AAEA,SAAgB,qBAAqB,KAAqB;CACxD,OAAO,cAAc,KAAK,cAAc;AAC1C"}
|
package/package.json
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "anypick",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Switch accounts, route providers and keep your AI coding tools moving.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"accounts",
|
|
7
|
+
"auth",
|
|
8
|
+
"bindings",
|
|
9
|
+
"claude",
|
|
10
|
+
"cli",
|
|
11
|
+
"clients",
|
|
12
|
+
"codex",
|
|
13
|
+
"gateways",
|
|
14
|
+
"gemini",
|
|
15
|
+
"grok",
|
|
16
|
+
"kiro",
|
|
17
|
+
"opencode",
|
|
18
|
+
"proxy"
|
|
19
|
+
],
|
|
20
|
+
"homepage": "https://anypick.dev",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/outof0/anypick/issues"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/outof0/anypick.git"
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"anypick": "./dist/cli.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"type": "module",
|
|
36
|
+
"main": "./dist/index.js",
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"exports": {
|
|
39
|
+
".": {
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"default": "./dist/index.js"
|
|
43
|
+
},
|
|
44
|
+
"./adapters": {
|
|
45
|
+
"types": "./dist/adapters.d.ts",
|
|
46
|
+
"import": "./dist/adapters.js",
|
|
47
|
+
"default": "./dist/adapters.js"
|
|
48
|
+
},
|
|
49
|
+
"./testing": {
|
|
50
|
+
"types": "./dist/testing.d.ts",
|
|
51
|
+
"import": "./dist/testing.js",
|
|
52
|
+
"default": "./dist/testing.js"
|
|
53
|
+
},
|
|
54
|
+
"./types": {
|
|
55
|
+
"types": "./dist/public-types.d.ts",
|
|
56
|
+
"import": "./dist/types.js",
|
|
57
|
+
"default": "./dist/types.js"
|
|
58
|
+
},
|
|
59
|
+
"./package.json": "./package.json",
|
|
60
|
+
"./internal/*": null
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@clack/core": "0.4.2",
|
|
64
|
+
"@clack/prompts": "^0.10.1",
|
|
65
|
+
"commander": "^13.1.0",
|
|
66
|
+
"ink": "^7.1.1",
|
|
67
|
+
"picocolors": "^1.1.1",
|
|
68
|
+
"react": "^19.2.7",
|
|
69
|
+
"react-dom": "^19.2.7"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
73
|
+
"@types/node": "^22.15.21",
|
|
74
|
+
"@types/react": "^19.2.17",
|
|
75
|
+
"@types/react-dom": "^19.2.3",
|
|
76
|
+
"@vitejs/plugin-react": "^6.0.5",
|
|
77
|
+
"changelogithub": "^14.0.0",
|
|
78
|
+
"ink-testing-library": "^4.0.0",
|
|
79
|
+
"oxfmt": "^0.59.0",
|
|
80
|
+
"oxlint": "^1.74.0",
|
|
81
|
+
"oxlint-tsgolint": "^0.24.0",
|
|
82
|
+
"playwright": "1.55.0",
|
|
83
|
+
"tailwindcss": "^4.3.3",
|
|
84
|
+
"tsx": "^4.19.4",
|
|
85
|
+
"typescript": "7.0.2",
|
|
86
|
+
"vite": "8.1.5",
|
|
87
|
+
"vitest": "4.1.10"
|
|
88
|
+
},
|
|
89
|
+
"engines": {
|
|
90
|
+
"node": ">=22.5.0"
|
|
91
|
+
},
|
|
92
|
+
"scripts": {
|
|
93
|
+
"dev": "node scripts/dev.mjs",
|
|
94
|
+
"start": "node dist/cli.js",
|
|
95
|
+
"build": "pnpm clean && tsc -p tsconfig.json --emitDeclarationOnly && node scripts/rewrite-declaration-specifiers.mjs && vite build && node scripts/copy-native-assets.mjs && node scripts/check-native-tray.mjs",
|
|
96
|
+
"clean": "node scripts/clean-dist.mjs",
|
|
97
|
+
"check": "oxfmt --check && pnpm lint && pnpm typecheck && pnpm release:check && pnpm test",
|
|
98
|
+
"format": "oxfmt",
|
|
99
|
+
"lint": "oxlint --type-aware",
|
|
100
|
+
"lint:fix": "oxlint --type-aware --fix",
|
|
101
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
102
|
+
"test": "vitest run",
|
|
103
|
+
"test:watch": "vitest",
|
|
104
|
+
"package": "pnpm build && pnpm pack --pack-destination dist",
|
|
105
|
+
"package:smoke": "pnpm package && node scripts/pack-smoke.mjs",
|
|
106
|
+
"release": "pnpm release:plan",
|
|
107
|
+
"release:check": "node scripts/release-plan.mjs check",
|
|
108
|
+
"release:plan": "node scripts/release-plan.mjs plan",
|
|
109
|
+
"tray:build": "pnpm tray:ui:build && node scripts/build-tauri-tray.mjs",
|
|
110
|
+
"tray:check": "pnpm tray:ui:check && pnpm tray:ui:build && cargo check --manifest-path src/tray/tauri/src-tauri/Cargo.toml",
|
|
111
|
+
"tray:demo": "node scripts/demo-tauri-tray.mjs",
|
|
112
|
+
"tray:macos": "node scripts/demo-macos-tray.mjs",
|
|
113
|
+
"tray:smoke": "node scripts/smoke-tauri-tray.mjs",
|
|
114
|
+
"tray:smoke:probe": "node scripts/smoke-tauri-tray.mjs",
|
|
115
|
+
"tray:smoke:only": "node scripts/smoke-tauri-tray.mjs --smoke-only",
|
|
116
|
+
"tray:e2e:ui": "node scripts/e2e-tray-ui.mjs",
|
|
117
|
+
"tray:ui": "vite --config src/tray/tauri/ui/vite.config.ts",
|
|
118
|
+
"tray:ui:build": "vite build --config src/tray/tauri/ui/vite.config.ts",
|
|
119
|
+
"tray:ui:check": "tsc -p src/tray/tauri/ui/tsconfig.json --noEmit"
|
|
120
|
+
}
|
|
121
|
+
}
|