@kaitranntt/ccs 8.2.0 → 8.3.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/config/base-claude.settings.json +1 -5
- package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
- package/dist/api/services/cliproxy-profile-bridge.js +6 -0
- package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
- package/dist/api/services/profile-writer.d.ts.map +1 -1
- package/dist/api/services/profile-writer.js +18 -8
- package/dist/api/services/profile-writer.js.map +1 -1
- package/dist/auth/commands/create-command.d.ts.map +1 -1
- package/dist/auth/commands/create-command.js +11 -0
- package/dist/auth/commands/create-command.js.map +1 -1
- package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts +41 -0
- package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts.map +1 -0
- package/dist/cliproxy/accounts/account-safety-cross-lane.js +177 -0
- package/dist/cliproxy/accounts/account-safety-cross-lane.js.map +1 -0
- package/dist/cliproxy/accounts/account-safety.d.ts +29 -1
- package/dist/cliproxy/accounts/account-safety.d.ts.map +1 -1
- package/dist/cliproxy/accounts/account-safety.js +41 -7
- package/dist/cliproxy/accounts/account-safety.js.map +1 -1
- package/dist/cliproxy/accounts/drain-order.d.ts +277 -0
- package/dist/cliproxy/accounts/drain-order.d.ts.map +1 -0
- package/dist/cliproxy/accounts/drain-order.js +575 -0
- package/dist/cliproxy/accounts/drain-order.js.map +1 -0
- package/dist/cliproxy/accounts/pool-state.d.ts +132 -0
- package/dist/cliproxy/accounts/pool-state.d.ts.map +1 -0
- package/dist/cliproxy/accounts/pool-state.js +201 -0
- package/dist/cliproxy/accounts/pool-state.js.map +1 -0
- package/dist/cliproxy/accounts/registry.d.ts +17 -1
- package/dist/cliproxy/accounts/registry.d.ts.map +1 -1
- package/dist/cliproxy/accounts/registry.js +47 -1
- package/dist/cliproxy/accounts/registry.js.map +1 -1
- package/dist/cliproxy/accounts/types.d.ts +20 -0
- package/dist/cliproxy/accounts/types.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.js +29 -0
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
- package/dist/cliproxy/binary/platform-detector.d.ts.map +1 -1
- package/dist/cliproxy/binary/platform-detector.js +34 -1
- package/dist/cliproxy/binary/platform-detector.js.map +1 -1
- package/dist/cliproxy/binary/types.d.ts +3 -0
- package/dist/cliproxy/binary/types.d.ts.map +1 -1
- package/dist/cliproxy/binary/types.js +7 -2
- package/dist/cliproxy/binary/types.js.map +1 -1
- package/dist/cliproxy/binary/version-cache.d.ts.map +1 -1
- package/dist/cliproxy/binary/version-cache.js +4 -0
- package/dist/cliproxy/binary/version-cache.js.map +1 -1
- package/dist/cliproxy/claude-shadow-warning.d.ts +39 -0
- package/dist/cliproxy/claude-shadow-warning.d.ts.map +1 -0
- package/dist/cliproxy/claude-shadow-warning.js +187 -0
- package/dist/cliproxy/claude-shadow-warning.js.map +1 -0
- package/dist/cliproxy/config/base-config-loader.d.ts +6 -5
- package/dist/cliproxy/config/base-config-loader.d.ts.map +1 -1
- package/dist/cliproxy/config/base-config-loader.js +19 -12
- package/dist/cliproxy/config/base-config-loader.js.map +1 -1
- package/dist/cliproxy/config/env-builder.d.ts +3 -0
- package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
- package/dist/cliproxy/config/env-builder.js +158 -20
- package/dist/cliproxy/config/env-builder.js.map +1 -1
- package/dist/cliproxy/config/generator.d.ts +2 -1
- package/dist/cliproxy/config/generator.d.ts.map +1 -1
- package/dist/cliproxy/config/generator.js +66 -9
- package/dist/cliproxy/config/generator.js.map +1 -1
- package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
- package/dist/cliproxy/config/thinking-config.js +2 -0
- package/dist/cliproxy/config/thinking-config.js.map +1 -1
- package/dist/cliproxy/executor/account-resolution.d.ts.map +1 -1
- package/dist/cliproxy/executor/account-resolution.js +5 -0
- package/dist/cliproxy/executor/account-resolution.js.map +1 -1
- package/dist/cliproxy/executor/auth-coordinator.d.ts +4 -0
- package/dist/cliproxy/executor/auth-coordinator.d.ts.map +1 -1
- package/dist/cliproxy/executor/auth-coordinator.js +5 -1
- package/dist/cliproxy/executor/auth-coordinator.js.map +1 -1
- package/dist/cliproxy/executor/index.d.ts.map +1 -1
- package/dist/cliproxy/executor/index.js +20 -0
- package/dist/cliproxy/executor/index.js.map +1 -1
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +15 -0
- package/dist/cliproxy/model-catalog.js.map +1 -1
- package/dist/cliproxy/proxy/upstream-response-timeout.d.ts.map +1 -1
- package/dist/cliproxy/proxy/upstream-response-timeout.js +8 -1
- package/dist/cliproxy/proxy/upstream-response-timeout.js.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher-claude.d.ts +9 -0
- package/dist/cliproxy/quota/quota-fetcher-claude.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher-claude.js +53 -16
- package/dist/cliproxy/quota/quota-fetcher-claude.js.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher.js +4 -0
- package/dist/cliproxy/quota/quota-fetcher.js.map +1 -1
- package/dist/cliproxy/quota/quota-manager.d.ts +7 -0
- package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-manager.js +51 -2
- package/dist/cliproxy/quota/quota-manager.js.map +1 -1
- package/dist/cliproxy/routing/pool-onboarding-hint.d.ts +95 -0
- package/dist/cliproxy/routing/pool-onboarding-hint.d.ts.map +1 -0
- package/dist/cliproxy/routing/pool-onboarding-hint.js +172 -0
- package/dist/cliproxy/routing/pool-onboarding-hint.js.map +1 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts +50 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts.map +1 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.js +232 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.js.map +1 -0
- package/dist/cliproxy/routing/routing-strategy.d.ts +132 -0
- package/dist/cliproxy/routing/routing-strategy.d.ts.map +1 -1
- package/dist/cliproxy/routing/routing-strategy.js +342 -5
- package/dist/cliproxy/routing/routing-strategy.js.map +1 -1
- package/dist/cliproxy/services/stats-fetcher.d.ts +13 -0
- package/dist/cliproxy/services/stats-fetcher.d.ts.map +1 -1
- package/dist/cliproxy/services/stats-fetcher.js +25 -1
- package/dist/cliproxy/services/stats-fetcher.js.map +1 -1
- package/dist/commands/bar/bar-paths.d.ts +32 -0
- package/dist/commands/bar/bar-paths.d.ts.map +1 -0
- package/dist/commands/bar/bar-paths.js +62 -0
- package/dist/commands/bar/bar-paths.js.map +1 -0
- package/dist/commands/bar/bar-server-probe.d.ts +27 -0
- package/dist/commands/bar/bar-server-probe.d.ts.map +1 -0
- package/dist/commands/bar/bar-server-probe.js +94 -0
- package/dist/commands/bar/bar-server-probe.js.map +1 -0
- package/dist/commands/bar/help-subcommand.d.ts +2 -0
- package/dist/commands/bar/help-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/help-subcommand.js +69 -0
- package/dist/commands/bar/help-subcommand.js.map +1 -0
- package/dist/commands/bar/index.d.ts +12 -0
- package/dist/commands/bar/index.d.ts.map +1 -0
- package/dist/commands/bar/index.js +93 -0
- package/dist/commands/bar/index.js.map +1 -0
- package/dist/commands/bar/install-subcommand.d.ts +100 -0
- package/dist/commands/bar/install-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/install-subcommand.js +629 -0
- package/dist/commands/bar/install-subcommand.js.map +1 -0
- package/dist/commands/bar/launch-subcommand.d.ts +66 -0
- package/dist/commands/bar/launch-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/launch-subcommand.js +257 -0
- package/dist/commands/bar/launch-subcommand.js.map +1 -0
- package/dist/commands/bar/serve-subcommand.d.ts +47 -0
- package/dist/commands/bar/serve-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/serve-subcommand.js +192 -0
- package/dist/commands/bar/serve-subcommand.js.map +1 -0
- package/dist/commands/bar/status-subcommand.d.ts +32 -0
- package/dist/commands/bar/status-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/status-subcommand.js +128 -0
- package/dist/commands/bar/status-subcommand.js.map +1 -0
- package/dist/commands/bar/stop-subcommand.d.ts +24 -0
- package/dist/commands/bar/stop-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/stop-subcommand.js +107 -0
- package/dist/commands/bar/stop-subcommand.js.map +1 -0
- package/dist/commands/bar/uninstall-subcommand.d.ts +13 -0
- package/dist/commands/bar/uninstall-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/uninstall-subcommand.js +78 -0
- package/dist/commands/bar/uninstall-subcommand.js.map +1 -0
- package/dist/commands/bar/version-subcommand.d.ts +8 -0
- package/dist/commands/bar/version-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/version-subcommand.js +62 -0
- package/dist/commands/bar/version-subcommand.js.map +1 -0
- package/dist/commands/cliproxy/help-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/help-subcommand.js +20 -1
- package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/index.d.ts.map +1 -1
- package/dist/commands/cliproxy/index.js +20 -0
- package/dist/commands/cliproxy/index.js.map +1 -1
- package/dist/commands/cliproxy/order-subcommand.d.ts +16 -0
- package/dist/commands/cliproxy/order-subcommand.d.ts.map +1 -0
- package/dist/commands/cliproxy/order-subcommand.js +520 -0
- package/dist/commands/cliproxy/order-subcommand.js.map +1 -0
- package/dist/commands/cliproxy/pool-state-renderer.d.ts +40 -0
- package/dist/commands/cliproxy/pool-state-renderer.d.ts.map +1 -0
- package/dist/commands/cliproxy/pool-state-renderer.js +220 -0
- package/dist/commands/cliproxy/pool-state-renderer.js.map +1 -0
- package/dist/commands/cliproxy/pool-subcommand.d.ts +10 -0
- package/dist/commands/cliproxy/pool-subcommand.d.ts.map +1 -0
- package/dist/commands/cliproxy/pool-subcommand.js +112 -0
- package/dist/commands/cliproxy/pool-subcommand.js.map +1 -0
- package/dist/commands/cliproxy/quota-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/quota-subcommand.js +7 -0
- package/dist/commands/cliproxy/quota-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/routing-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/routing-subcommand.js +19 -0
- package/dist/commands/cliproxy/routing-subcommand.js.map +1 -1
- package/dist/commands/command-catalog.d.ts.map +1 -1
- package/dist/commands/command-catalog.js +7 -0
- package/dist/commands/command-catalog.js.map +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +6 -1
- package/dist/commands/help-command.js.map +1 -1
- package/dist/commands/root-command-router.d.ts.map +1 -1
- package/dist/commands/root-command-router.js +7 -0
- package/dist/commands/root-command-router.js.map +1 -1
- package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
- package/dist/config/loader/yaml-serializer.js +13 -0
- package/dist/config/loader/yaml-serializer.js.map +1 -1
- package/dist/config/schemas/cliproxy.d.ts +37 -0
- package/dist/config/schemas/cliproxy.d.ts.map +1 -1
- package/dist/config/schemas/quota.d.ts +26 -2
- package/dist/config/schemas/quota.d.ts.map +1 -1
- package/dist/config/schemas/quota.js +20 -1
- package/dist/config/schemas/quota.js.map +1 -1
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +3 -0
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/dispatcher/flows/account-flow.d.ts.map +1 -1
- package/dist/dispatcher/flows/account-flow.js +9 -0
- package/dist/dispatcher/flows/account-flow.js.map +1 -1
- package/dist/glmt/delta-accumulator.d.ts.map +1 -1
- package/dist/glmt/delta-accumulator.js +1 -0
- package/dist/glmt/delta-accumulator.js.map +1 -1
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +10 -0
- package/dist/management/doctor.js.map +1 -1
- package/dist/proxy/profile-router.d.ts +14 -0
- package/dist/proxy/profile-router.d.ts.map +1 -1
- package/dist/proxy/profile-router.js +1 -0
- package/dist/proxy/profile-router.js.map +1 -1
- package/dist/proxy/server/http-helpers.d.ts +5 -0
- package/dist/proxy/server/http-helpers.d.ts.map +1 -1
- package/dist/proxy/server/http-helpers.js +40 -1
- package/dist/proxy/server/http-helpers.js.map +1 -1
- package/dist/proxy/server/messages-route.d.ts.map +1 -1
- package/dist/proxy/server/messages-route.js +173 -10
- package/dist/proxy/server/messages-route.js.map +1 -1
- package/dist/proxy/upstream-url.d.ts +42 -2
- package/dist/proxy/upstream-url.d.ts.map +1 -1
- package/dist/proxy/upstream-url.js +83 -4
- package/dist/proxy/upstream-url.js.map +1 -1
- package/dist/ui/assets/{Trans-DsGR5Bhb.js → Trans-RG_sMDEu.js} +1 -1
- package/dist/ui/assets/accounts-yTXURc-q.js +1 -0
- package/dist/ui/assets/{alert-dialog-Do0XfN46.js → alert-dialog-DjvPgzFs.js} +1 -1
- package/dist/ui/assets/{api-B7OYas_V.js → api-Ck1dtNEM.js} +3 -3
- package/dist/ui/assets/{auth-section-BmTeNetL.js → auth-section-DBnY_LPz.js} +1 -1
- package/dist/ui/assets/{backups-section-COawLfTr.js → backups-section-Ci-uL4Of.js} +1 -1
- package/dist/ui/assets/{channels-C9LVYmNJ.js → channels-BeS9O5q0.js} +1 -1
- package/dist/ui/assets/{checkbox-BkFzg8C-.js → checkbox-DFeFDZBp.js} +1 -1
- package/dist/ui/assets/{claude-extension-Ch7L4lTF.js → claude-extension-DS5qN19Z.js} +1 -1
- package/dist/ui/assets/{cliproxy-B3uWt6gn.js → cliproxy-D7HJH4mZ.js} +1 -1
- package/dist/ui/assets/{cliproxy-ai-providers-Bn1_AdKD.js → cliproxy-ai-providers-oJQZXrtc.js} +1 -1
- package/dist/ui/assets/{cliproxy-control-panel-DC4pOOfY.js → cliproxy-control-panel-2mRPEcRj.js} +1 -1
- package/dist/ui/assets/codex-D0AUQ6jA.js +30 -0
- package/dist/ui/assets/{confirm-dialog-4rb-E8-R.js → confirm-dialog-B37-CVuq.js} +1 -1
- package/dist/ui/assets/{copilot-zgPXNkMw.js → copilot-KaaW-mko.js} +2 -2
- package/dist/ui/assets/{cursor-lRPpppk-.js → cursor-BKiTgYi5.js} +1 -1
- package/dist/ui/assets/{droid-koOj34SB.js → droid-DHdqGnFw.js} +2 -2
- package/dist/ui/assets/{globalenv-section-jOkPVwvN.js → globalenv-section-SfZO97nU.js} +1 -1
- package/dist/ui/assets/health-CSRS9O0D.js +1 -0
- package/dist/ui/assets/icons-DSLG1YsC.js +1 -0
- package/dist/ui/assets/{index-D7crOfea.js → index-CGgavq2X.js} +37 -37
- package/dist/ui/assets/{index-BLC5PyZn.js → index-ChTYEBCZ.js} +1 -1
- package/dist/ui/assets/index-Cu_F55_O.js +1 -0
- package/dist/ui/assets/{index-CRhKyfnS.js → index-DJ66NrBH.js} +1 -1
- package/dist/ui/assets/index-DWUuSBUe.js +1 -0
- package/dist/ui/assets/{index-BK-PSsqi.js → index-DycwEe96.js} +1 -1
- package/dist/ui/assets/index-DzFlVVV3.css +1 -0
- package/dist/ui/assets/{index-De3yNJ94.js → index-iQuEEGbH.js} +1 -1
- package/dist/ui/assets/{logs-BplpQHRb.js → logs-tiZ_51mo.js} +1 -1
- package/dist/ui/assets/{masked-input-DuLL3EwS.js → masked-input-D9FVoeMA.js} +1 -1
- package/dist/ui/assets/proxy-status-widget-2k26d8pS.js +1 -0
- package/dist/ui/assets/{raw-json-settings-editor-panel-ClPqZ6iZ.js → raw-json-settings-editor-panel-CguBh93H.js} +1 -1
- package/dist/ui/assets/{searchable-select-BH1b065u.js → searchable-select-C4wShshD.js} +1 -1
- package/dist/ui/assets/{separator-BOiJ0l4s.js → separator-mvGlDdEW.js} +1 -1
- package/dist/ui/assets/{shared-CunXigZu.js → shared-Ck0yAwbs.js} +1 -1
- package/dist/ui/assets/{table-C7ysR1Xz.js → table-DrUJOxKL.js} +1 -1
- package/dist/ui/assets/updates-BVHBFcq8.js +1 -0
- package/dist/ui/assets/{use-accounts-CwRU3ln9.js → use-accounts-DLtuaniS.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/utils/browser/mcp-installer.d.ts.map +1 -1
- package/dist/utils/browser/mcp-installer.js +5 -34
- package/dist/utils/browser/mcp-installer.js.map +1 -1
- package/dist/utils/claude-user-config-lock.d.ts +9 -0
- package/dist/utils/claude-user-config-lock.d.ts.map +1 -0
- package/dist/utils/claude-user-config-lock.js +96 -0
- package/dist/utils/claude-user-config-lock.js.map +1 -0
- package/dist/utils/image-analysis/mcp-installer.d.ts.map +1 -1
- package/dist/utils/image-analysis/mcp-installer.js +5 -34
- package/dist/utils/image-analysis/mcp-installer.js.map +1 -1
- package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
- package/dist/utils/websearch/mcp-installer.js +112 -78
- package/dist/utils/websearch/mcp-installer.js.map +1 -1
- package/dist/web-server/model-pricing.d.ts.map +1 -1
- package/dist/web-server/model-pricing.js +7 -0
- package/dist/web-server/model-pricing.js.map +1 -1
- package/dist/web-server/routes/account-routes.d.ts.map +1 -1
- package/dist/web-server/routes/account-routes.js +116 -0
- package/dist/web-server/routes/account-routes.js.map +1 -1
- package/dist/web-server/routes/bar-routes.d.ts +149 -0
- package/dist/web-server/routes/bar-routes.d.ts.map +1 -0
- package/dist/web-server/routes/bar-routes.js +415 -0
- package/dist/web-server/routes/bar-routes.js.map +1 -0
- package/dist/web-server/routes/index.d.ts.map +1 -1
- package/dist/web-server/routes/index.js +18 -0
- package/dist/web-server/routes/index.js.map +1 -1
- package/dist/web-server/usage/bar-analytics.d.ts +101 -0
- package/dist/web-server/usage/bar-analytics.d.ts.map +1 -0
- package/dist/web-server/usage/bar-analytics.js +315 -0
- package/dist/web-server/usage/bar-analytics.js.map +1 -0
- package/dist/web-server/usage/claude-native-credentials.d.ts +56 -0
- package/dist/web-server/usage/claude-native-credentials.d.ts.map +1 -0
- package/dist/web-server/usage/claude-native-credentials.js +140 -0
- package/dist/web-server/usage/claude-native-credentials.js.map +1 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts +24 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts.map +1 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.js +82 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.js.map +1 -0
- package/dist/web-server/usage/cliproxy-usage-syncer.d.ts +3 -2
- package/dist/web-server/usage/cliproxy-usage-syncer.d.ts.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-syncer.js +14 -2
- package/dist/web-server/usage/cliproxy-usage-syncer.js.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.d.ts +8 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.d.ts.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.js +31 -4
- package/dist/web-server/usage/cliproxy-usage-transformer.js.map +1 -1
- package/dist/web-server/usage/codex-local-quota-collector.d.ts +74 -0
- package/dist/web-server/usage/codex-local-quota-collector.d.ts.map +1 -0
- package/dist/web-server/usage/codex-local-quota-collector.js +250 -0
- package/dist/web-server/usage/codex-local-quota-collector.js.map +1 -0
- package/dist/web-server/usage/data-aggregator.d.ts +11 -0
- package/dist/web-server/usage/data-aggregator.d.ts.map +1 -1
- package/dist/web-server/usage/data-aggregator.js +29 -1
- package/dist/web-server/usage/data-aggregator.js.map +1 -1
- package/dist/web-server/usage/native-quota-collector.d.ts +44 -0
- package/dist/web-server/usage/native-quota-collector.d.ts.map +1 -0
- package/dist/web-server/usage/native-quota-collector.js +378 -0
- package/dist/web-server/usage/native-quota-collector.js.map +1 -0
- package/dist/web-server/usage/types.d.ts +2 -0
- package/dist/web-server/usage/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/run-test-bucket.js +183 -17
- package/dist/ui/assets/accounts-DHBmHeH-.js +0 -1
- package/dist/ui/assets/codex-CcODhykP.js +0 -30
- package/dist/ui/assets/health-CxHauE3Y.js +0 -1
- package/dist/ui/assets/icons-DzKUh8vG.js +0 -1
- package/dist/ui/assets/index-DOfPoKe_.css +0 -1
- package/dist/ui/assets/index-DUGnoURR.js +0 -1
- package/dist/ui/assets/index-I_ek1xyD.js +0 -1
- package/dist/ui/assets/proxy-status-widget-BruRPTSl.js +0 -1
- package/dist/ui/assets/updates-BtBCV2xk.js +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ccs bar launch` — start the CCS Bar server detached, write bar.json, open the app.
|
|
3
|
+
*
|
|
4
|
+
* bar.json shape (v1):
|
|
5
|
+
* { baseUrl: string, port: number, authMode: "loopback" }
|
|
6
|
+
*
|
|
7
|
+
* Detached model (replaces the old in-process model):
|
|
8
|
+
* 1. Probe candidate ports (bar.json port first, then 3000/3001/3002/8000/8080).
|
|
9
|
+
* 2. If a live server is found → reuse it, write bar.json, open app, return.
|
|
10
|
+
* 3. Else → refresh launch.json, getPort to pick a free port, spawn
|
|
11
|
+
* `ccs bar serve --port N` detached with stdio → serve.log, poll
|
|
12
|
+
* /api/bar/summary until 200 (timeout ~10 s), write bar.json, open app,
|
|
13
|
+
* return. The CLI process exits; the server continues as a detached child.
|
|
14
|
+
*
|
|
15
|
+
* All side-effectful deps are injectable so tests can run without real
|
|
16
|
+
* servers, ports, or file-system writes.
|
|
17
|
+
*/
|
|
18
|
+
import type { LaunchJson } from './bar-paths';
|
|
19
|
+
import { defaultFindRunningServer as _defaultFindRunningServer, resolveBarPort as _resolveBarPort } from './bar-server-probe';
|
|
20
|
+
import type { DashboardInfo as _DashboardInfo } from './bar-server-probe';
|
|
21
|
+
export { _defaultFindRunningServer as defaultFindRunningServer };
|
|
22
|
+
export { _resolveBarPort as resolveBarPort };
|
|
23
|
+
export interface BarDiscoveryJson {
|
|
24
|
+
baseUrl: string;
|
|
25
|
+
port: number;
|
|
26
|
+
authMode: 'loopback';
|
|
27
|
+
}
|
|
28
|
+
export type DashboardInfo = _DashboardInfo;
|
|
29
|
+
export interface LaunchDeps {
|
|
30
|
+
/**
|
|
31
|
+
* Probe candidate ports for a running CCS server.
|
|
32
|
+
* Returns { port, baseUrl } of the first live server found, or null if none.
|
|
33
|
+
* Never throws — any error is treated as "not found".
|
|
34
|
+
*/
|
|
35
|
+
findRunningServer: () => Promise<DashboardInfo | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Find a free port from the candidate list.
|
|
38
|
+
* Used to pre-select a port before spawning the detached server.
|
|
39
|
+
*/
|
|
40
|
+
getPort: (opts: {
|
|
41
|
+
port: number[];
|
|
42
|
+
host: string;
|
|
43
|
+
}) => Promise<number>;
|
|
44
|
+
/**
|
|
45
|
+
* Spawn the `ccs bar serve --port N` process detached and return immediately.
|
|
46
|
+
* The spawned process must be unref()ed so the launcher can exit.
|
|
47
|
+
*/
|
|
48
|
+
spawnDetachedServer: (port: number, logPath: string) => void;
|
|
49
|
+
/**
|
|
50
|
+
* Poll GET {baseUrl}/api/bar/summary until HTTP 200 or timeout.
|
|
51
|
+
* Returns the live baseUrl on success, throws on timeout.
|
|
52
|
+
*/
|
|
53
|
+
waitForServerLive: (baseUrl: string) => Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Write launch.json so the Swift app can spawn the server independently.
|
|
56
|
+
*/
|
|
57
|
+
writeLaunchDescriptor: (jsonPath: string, descriptor: LaunchJson) => void;
|
|
58
|
+
/** Open the installed .app bundle. Throws if the app is not found. */
|
|
59
|
+
openApp: (appPath: string) => Promise<void>;
|
|
60
|
+
/** Returns path to ~/.ccs (respects CCS_HOME for test isolation). */
|
|
61
|
+
getCcsDir: () => string;
|
|
62
|
+
/** Full path where the .app should be installed, e.g. ~/Applications/CCS Bar.app */
|
|
63
|
+
appInstallPath: string;
|
|
64
|
+
}
|
|
65
|
+
export declare function handleBarLaunch(_args: string[], deps?: Partial<LaunchDeps>): Promise<void>;
|
|
66
|
+
//# sourceMappingURL=launch-subcommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,wBAAwB,IAAI,yBAAyB,EACrD,cAAc,IAAI,eAAe,EAClC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQ1E,OAAO,EAAE,yBAAyB,IAAI,wBAAwB,EAAE,CAAC;AACjE,OAAO,EAAE,eAAe,IAAI,cAAc,EAAE,CAAC;AAM7C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACvD;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE;;;OAGG;IACH,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D;;;OAGG;IACH,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD;;OAEG;IACH,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1E,sEAAsE;IACtE,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,qEAAqE;IACrE,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,oFAAoF;IACpF,cAAc,EAAE,MAAM,CAAC;CACxB;AAoFD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,GAAE,OAAO,CAAC,UAAU,CAAM,GAC7B,OAAO,CAAC,IAAI,CAAC,CAqHf"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `ccs bar launch` — start the CCS Bar server detached, write bar.json, open the app.
|
|
4
|
+
*
|
|
5
|
+
* bar.json shape (v1):
|
|
6
|
+
* { baseUrl: string, port: number, authMode: "loopback" }
|
|
7
|
+
*
|
|
8
|
+
* Detached model (replaces the old in-process model):
|
|
9
|
+
* 1. Probe candidate ports (bar.json port first, then 3000/3001/3002/8000/8080).
|
|
10
|
+
* 2. If a live server is found → reuse it, write bar.json, open app, return.
|
|
11
|
+
* 3. Else → refresh launch.json, getPort to pick a free port, spawn
|
|
12
|
+
* `ccs bar serve --port N` detached with stdio → serve.log, poll
|
|
13
|
+
* /api/bar/summary until 200 (timeout ~10 s), write bar.json, open app,
|
|
14
|
+
* return. The CLI process exits; the server continues as a detached child.
|
|
15
|
+
*
|
|
16
|
+
* All side-effectful deps are injectable so tests can run without real
|
|
17
|
+
* servers, ports, or file-system writes.
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.handleBarLaunch = exports.resolveBarPort = exports.defaultFindRunningServer = void 0;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const os = __importStar(require("os"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const config_loader_facade_1 = require("../../config/config-loader-facade");
|
|
48
|
+
const bar_paths_1 = require("./bar-paths");
|
|
49
|
+
const bar_server_probe_1 = require("./bar-server-probe");
|
|
50
|
+
Object.defineProperty(exports, "defaultFindRunningServer", { enumerable: true, get: function () { return bar_server_probe_1.defaultFindRunningServer; } });
|
|
51
|
+
Object.defineProperty(exports, "resolveBarPort", { enumerable: true, get: function () { return bar_server_probe_1.resolveBarPort; } });
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Default production dependencies
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
async function defaultGetPort(opts) {
|
|
56
|
+
const getPort = (await Promise.resolve().then(() => __importStar(require('get-port')))).default;
|
|
57
|
+
return getPort(opts);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Spawn `ccs bar serve --port N` detached so it outlives this CLI process.
|
|
61
|
+
*
|
|
62
|
+
* stdio is redirected to serve.log so server output is preserved for
|
|
63
|
+
* debugging without a terminal. unref() lets the launcher exit immediately.
|
|
64
|
+
*/
|
|
65
|
+
function defaultSpawnDetachedServer(port, logPath) {
|
|
66
|
+
const { spawn } = require('child_process');
|
|
67
|
+
// Open (or create) the log file for appending.
|
|
68
|
+
const logFd = fs.openSync(logPath, 'a');
|
|
69
|
+
const child = spawn(process.execPath, [process.argv[1], 'bar', 'serve', '--port', String(port)], {
|
|
70
|
+
detached: true,
|
|
71
|
+
stdio: ['ignore', logFd, logFd],
|
|
72
|
+
cwd: os.homedir(),
|
|
73
|
+
env: process.env,
|
|
74
|
+
});
|
|
75
|
+
child.unref();
|
|
76
|
+
// Close our copy of the fd — the child has its own reference.
|
|
77
|
+
fs.closeSync(logFd);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Poll GET {baseUrl}/api/bar/summary every 250 ms until HTTP 200 or ~10 s.
|
|
81
|
+
* Resolves when the server is live. Rejects on timeout.
|
|
82
|
+
*/
|
|
83
|
+
async function defaultWaitForServerLive(baseUrl) {
|
|
84
|
+
const { request } = await Promise.resolve().then(() => __importStar(require('undici')));
|
|
85
|
+
const INTERVAL_MS = 250;
|
|
86
|
+
const TIMEOUT_MS = 10000;
|
|
87
|
+
const deadline = Date.now() + TIMEOUT_MS;
|
|
88
|
+
while (Date.now() < deadline) {
|
|
89
|
+
try {
|
|
90
|
+
const { statusCode, body } = await request(`${baseUrl}/api/bar/summary`, {
|
|
91
|
+
method: 'GET',
|
|
92
|
+
headersTimeout: 1500,
|
|
93
|
+
bodyTimeout: 1500,
|
|
94
|
+
});
|
|
95
|
+
await body.text();
|
|
96
|
+
if (statusCode === 200)
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
/* not yet live — keep polling */
|
|
101
|
+
}
|
|
102
|
+
await new Promise((resolve) => setTimeout(resolve, INTERVAL_MS));
|
|
103
|
+
}
|
|
104
|
+
throw new Error(`CCS Bar server did not become live at ${baseUrl} within ${TIMEOUT_MS / 1000}s`);
|
|
105
|
+
}
|
|
106
|
+
function defaultWriteLaunchDescriptor(jsonPath, descriptor) {
|
|
107
|
+
fs.mkdirSync(path.dirname(jsonPath), { recursive: true });
|
|
108
|
+
fs.writeFileSync(jsonPath, JSON.stringify(descriptor, null, 2));
|
|
109
|
+
}
|
|
110
|
+
async function defaultOpenApp(appPath) {
|
|
111
|
+
const { execFile } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
112
|
+
const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
|
|
113
|
+
const execFileAsync = promisify(execFile);
|
|
114
|
+
await execFileAsync('open', ['-a', appPath]);
|
|
115
|
+
}
|
|
116
|
+
function defaultGetCcsDir() {
|
|
117
|
+
return (0, config_loader_facade_1.getCcsDir)();
|
|
118
|
+
}
|
|
119
|
+
// Fix #5: use os.homedir() to match install-subcommand.ts and uninstall-subcommand.ts.
|
|
120
|
+
const DEFAULT_APP_INSTALL_PATH = path.join(os.homedir(), 'Applications', 'CCS Bar.app');
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Implementation
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
async function handleBarLaunch(_args, deps = {}) {
|
|
125
|
+
const ccsDir = (deps.getCcsDir ?? defaultGetCcsDir)();
|
|
126
|
+
const openApp = deps.openApp ?? defaultOpenApp;
|
|
127
|
+
const appInstallPath = deps.appInstallPath ?? DEFAULT_APP_INSTALL_PATH;
|
|
128
|
+
const getPortFn = deps.getPort ?? defaultGetPort;
|
|
129
|
+
const spawnDetachedServer = deps.spawnDetachedServer ?? defaultSpawnDetachedServer;
|
|
130
|
+
const waitForServerLive = deps.waitForServerLive ?? defaultWaitForServerLive;
|
|
131
|
+
const writeLaunchDescriptor = deps.writeLaunchDescriptor ?? defaultWriteLaunchDescriptor;
|
|
132
|
+
// Wire findRunningServer after ccsDir is resolved.
|
|
133
|
+
const findRunningServer = deps.findRunningServer ?? (() => (0, bar_server_probe_1.defaultFindRunningServer)(ccsDir));
|
|
134
|
+
const barJsonPath = (0, bar_paths_1.getBarJsonPath)(ccsDir);
|
|
135
|
+
const launchJsonPath = (0, bar_paths_1.getLaunchJsonPath)(ccsDir);
|
|
136
|
+
// 1. Probe for an already-running server.
|
|
137
|
+
let running = null;
|
|
138
|
+
try {
|
|
139
|
+
running = await findRunningServer();
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
/* any probe error counts as null */
|
|
143
|
+
}
|
|
144
|
+
if (running !== null) {
|
|
145
|
+
// Reuse the live server — write bar.json and open the app.
|
|
146
|
+
const barJson = {
|
|
147
|
+
baseUrl: running.baseUrl,
|
|
148
|
+
port: running.port,
|
|
149
|
+
authMode: 'loopback',
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
fs.mkdirSync(ccsDir, { recursive: true });
|
|
153
|
+
fs.writeFileSync(barJsonPath, JSON.stringify(barJson, null, 2));
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
157
|
+
console.error(`[X] Failed to write bar.json: ${msg}`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
console.log(`[OK] Reusing running CCS web-server at ${running.baseUrl}`);
|
|
161
|
+
console.log(`[i] Discovery file written: ${barJsonPath}`);
|
|
162
|
+
await _openAppWithFallback(appInstallPath, openApp);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// 2. No live server — pick a port, write/refresh launch.json, spawn detached.
|
|
166
|
+
// 2a. Pick a free port.
|
|
167
|
+
let port;
|
|
168
|
+
try {
|
|
169
|
+
port = await getPortFn({ port: [3000, 3001, 3002, 8000, 8080], host: '127.0.0.1' });
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
173
|
+
console.error(`[X] Could not find a free port: ${msg}`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// 2b. Write/refresh launch.json so the Swift app can self-start next time.
|
|
177
|
+
const launchDescriptor = {
|
|
178
|
+
schema: bar_paths_1.LAUNCH_JSON_SCHEMA,
|
|
179
|
+
runtime: process.execPath,
|
|
180
|
+
args: [process.argv[1], 'bar', 'serve'],
|
|
181
|
+
home: os.homedir(),
|
|
182
|
+
...(process.env.CCS_HOME ? { ccsHome: process.env.CCS_HOME } : {}),
|
|
183
|
+
};
|
|
184
|
+
try {
|
|
185
|
+
writeLaunchDescriptor(launchJsonPath, launchDescriptor);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
// Non-fatal — the Swift app falls back to resolving `ccs` via PATH.
|
|
189
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
190
|
+
console.error(`[!] Could not write launch.json: ${msg}`);
|
|
191
|
+
}
|
|
192
|
+
// 2c. Spawn the detached server.
|
|
193
|
+
const serveLogPath = (0, bar_paths_1.getServeLogPath)(ccsDir);
|
|
194
|
+
const baseUrl = `http://127.0.0.1:${port}`;
|
|
195
|
+
try {
|
|
196
|
+
fs.mkdirSync((0, bar_paths_1.getBarDir)(ccsDir), { recursive: true });
|
|
197
|
+
spawnDetachedServer(port, serveLogPath);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
201
|
+
console.error(`[X] Could not start CCS web-server: ${msg}`);
|
|
202
|
+
console.error('[i] Run `ccs config` to start the dashboard manually.');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
console.log('[i] Starting CCS Bar server...');
|
|
206
|
+
// 2d. Poll until live or timeout.
|
|
207
|
+
try {
|
|
208
|
+
await waitForServerLive(baseUrl);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
212
|
+
console.error(`[X] Could not connect to CCS web-server: ${msg}`);
|
|
213
|
+
console.error(`[i] Check logs at ${serveLogPath}`);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// 2e. Write bar.json.
|
|
217
|
+
const barJson = {
|
|
218
|
+
baseUrl,
|
|
219
|
+
port,
|
|
220
|
+
authMode: 'loopback',
|
|
221
|
+
};
|
|
222
|
+
try {
|
|
223
|
+
fs.mkdirSync(ccsDir, { recursive: true });
|
|
224
|
+
fs.writeFileSync(barJsonPath, JSON.stringify(barJson, null, 2));
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
228
|
+
console.error(`[X] Failed to write bar.json: ${msg}`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
console.log(`[OK] CCS web-server running at ${baseUrl}`);
|
|
232
|
+
console.log(`[i] Discovery file written: ${barJsonPath}`);
|
|
233
|
+
// 3. Open the app — then return (process exits; server continues detached).
|
|
234
|
+
await _openAppWithFallback(appInstallPath, openApp);
|
|
235
|
+
}
|
|
236
|
+
exports.handleBarLaunch = handleBarLaunch;
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Internal helper — open app with graceful degraded path
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
async function _openAppWithFallback(appInstallPath, openApp) {
|
|
241
|
+
try {
|
|
242
|
+
await openApp(appInstallPath);
|
|
243
|
+
console.log('[OK] CCS Bar launched.');
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
if (!fs.existsSync(appInstallPath)) {
|
|
247
|
+
console.log('[!] CCS Bar app is not installed.');
|
|
248
|
+
console.log('[i] Run `ccs bar install` to install it.');
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
console.log('[!] Could not open CCS Bar. Try right-clicking and selecting Open.');
|
|
252
|
+
console.log('[i] If Gatekeeper blocks the app, run:');
|
|
253
|
+
console.log(` xattr -dr com.apple.quarantine "${appInstallPath}"`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=launch-subcommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ccs bar serve` — long-lived server host for CCS Bar.
|
|
3
|
+
*
|
|
4
|
+
* Reuse-or-start: probe candidate ports first. If a live server exists,
|
|
5
|
+
* write bar.json pointing at it and exit 0 (no double-start). Otherwise
|
|
6
|
+
* pick a free port, call startServer(), write bar.json + server.pid,
|
|
7
|
+
* then stay alive until SIGINT/SIGTERM.
|
|
8
|
+
*
|
|
9
|
+
* This is the process that `ccs bar launch` spawns detached. The Swift
|
|
10
|
+
* app also spawns it directly via launch.json.
|
|
11
|
+
*
|
|
12
|
+
* Accepts: --port N (honours a port the launcher pre-selected via getPort).
|
|
13
|
+
*/
|
|
14
|
+
import type { DashboardInfo } from './bar-server-probe';
|
|
15
|
+
export interface ServeDeps {
|
|
16
|
+
/** Probe candidate ports for a running CCS server. Never throws. */
|
|
17
|
+
findRunningServer: () => Promise<DashboardInfo | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Start the CCS web-server on the given port.
|
|
20
|
+
* Returns { port, baseUrl } of the bound server.
|
|
21
|
+
* The returned server keeps the process event loop alive while listening.
|
|
22
|
+
*/
|
|
23
|
+
startServer: (opts: {
|
|
24
|
+
port: number;
|
|
25
|
+
host: string;
|
|
26
|
+
}) => Promise<DashboardInfo>;
|
|
27
|
+
/**
|
|
28
|
+
* Find a free port from the candidate list.
|
|
29
|
+
* Returns one of the candidates or another free port.
|
|
30
|
+
*/
|
|
31
|
+
getPort: (opts: {
|
|
32
|
+
port: number[];
|
|
33
|
+
host: string;
|
|
34
|
+
}) => Promise<number>;
|
|
35
|
+
/** Returns ~/.ccs dir (respects CCS_HOME). */
|
|
36
|
+
getCcsDir: () => string;
|
|
37
|
+
/** Write a file, creating parent dirs as needed. */
|
|
38
|
+
writeFile: (filePath: string, content: string) => void;
|
|
39
|
+
/** Remove a file if it exists (for cleanup on exit). */
|
|
40
|
+
removeFile: (filePath: string) => void;
|
|
41
|
+
/** Register process signal handlers. */
|
|
42
|
+
onSignal: (signal: 'SIGINT' | 'SIGTERM', handler: () => void) => void;
|
|
43
|
+
/** Exit the process. */
|
|
44
|
+
exit: (code: number) => never;
|
|
45
|
+
}
|
|
46
|
+
export declare function handleBarServe(args: string[], deps?: Partial<ServeDeps>): Promise<void>;
|
|
47
|
+
//# sourceMappingURL=serve-subcommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/serve-subcommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACvD;;;;OAIG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9E;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,8CAA8C;IAC9C,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,oDAAoD;IACpD,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,wDAAwD;IACxD,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,wCAAwC;IACxC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACtE,wBAAwB;IACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAC/B;AA8DD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGjG"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `ccs bar serve` — long-lived server host for CCS Bar.
|
|
4
|
+
*
|
|
5
|
+
* Reuse-or-start: probe candidate ports first. If a live server exists,
|
|
6
|
+
* write bar.json pointing at it and exit 0 (no double-start). Otherwise
|
|
7
|
+
* pick a free port, call startServer(), write bar.json + server.pid,
|
|
8
|
+
* then stay alive until SIGINT/SIGTERM.
|
|
9
|
+
*
|
|
10
|
+
* This is the process that `ccs bar launch` spawns detached. The Swift
|
|
11
|
+
* app also spawns it directly via launch.json.
|
|
12
|
+
*
|
|
13
|
+
* Accepts: --port N (honours a port the launcher pre-selected via getPort).
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.handleBarServe = void 0;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const config_loader_facade_1 = require("../../config/config-loader-facade");
|
|
43
|
+
const bar_paths_1 = require("./bar-paths");
|
|
44
|
+
const bar_server_probe_1 = require("./bar-server-probe");
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Default implementations
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
async function defaultStartServer(opts) {
|
|
49
|
+
const { startServer } = await Promise.resolve().then(() => __importStar(require('../../web-server')));
|
|
50
|
+
const { server } = await startServer({ port: opts.port, host: opts.host });
|
|
51
|
+
const addr = server.address();
|
|
52
|
+
const resolvedPort = addr && typeof addr === 'object' ? addr.port : opts.port;
|
|
53
|
+
const baseUrl = `http://127.0.0.1:${resolvedPort}`;
|
|
54
|
+
return { port: resolvedPort, baseUrl };
|
|
55
|
+
}
|
|
56
|
+
async function defaultGetPort(opts) {
|
|
57
|
+
const getPort = (await Promise.resolve().then(() => __importStar(require('get-port')))).default;
|
|
58
|
+
return getPort(opts);
|
|
59
|
+
}
|
|
60
|
+
function defaultWriteFile(filePath, content) {
|
|
61
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
62
|
+
fs.writeFileSync(filePath, content);
|
|
63
|
+
}
|
|
64
|
+
function defaultRemoveFile(filePath) {
|
|
65
|
+
try {
|
|
66
|
+
fs.unlinkSync(filePath);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
/* ignore — file may already be gone */
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function defaultOnSignal(signal, handler) {
|
|
73
|
+
process.on(signal, handler);
|
|
74
|
+
}
|
|
75
|
+
function defaultExit(code) {
|
|
76
|
+
process.exit(code);
|
|
77
|
+
}
|
|
78
|
+
function defaultGetCcsDir() {
|
|
79
|
+
return (0, config_loader_facade_1.getCcsDir)();
|
|
80
|
+
}
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Argument parsing helpers
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
function parsePortArg(args) {
|
|
85
|
+
const idx = args.indexOf('--port');
|
|
86
|
+
if (idx !== -1 && idx + 1 < args.length) {
|
|
87
|
+
const n = parseInt(args[idx + 1], 10);
|
|
88
|
+
return Number.isFinite(n) && n > 0 && n < 65536 ? n : null;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Implementation
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
async function handleBarServe(args, deps = {}) {
|
|
96
|
+
const ccsDir = (deps.getCcsDir ?? defaultGetCcsDir)();
|
|
97
|
+
const findRunningServer = deps.findRunningServer ?? (() => (0, bar_server_probe_1.defaultFindRunningServer)(ccsDir));
|
|
98
|
+
const startServerFn = deps.startServer ?? defaultStartServer;
|
|
99
|
+
const getPortFn = deps.getPort ?? defaultGetPort;
|
|
100
|
+
const writeFile = deps.writeFile ?? defaultWriteFile;
|
|
101
|
+
const removeFile = deps.removeFile ?? defaultRemoveFile;
|
|
102
|
+
const onSignal = deps.onSignal ?? defaultOnSignal;
|
|
103
|
+
const exit = deps.exit ?? defaultExit;
|
|
104
|
+
const barJsonPath = (0, bar_paths_1.getBarJsonPath)(ccsDir);
|
|
105
|
+
const serverPidPath = (0, bar_paths_1.getServerPidPath)(ccsDir);
|
|
106
|
+
// 1. Reuse-or-start: probe candidate ports first.
|
|
107
|
+
let running = null;
|
|
108
|
+
try {
|
|
109
|
+
running = await findRunningServer();
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
/* probe errors count as null */
|
|
113
|
+
}
|
|
114
|
+
if (running !== null) {
|
|
115
|
+
// A live server is already running — write bar.json and exit cleanly.
|
|
116
|
+
const barJson = {
|
|
117
|
+
baseUrl: running.baseUrl,
|
|
118
|
+
port: running.port,
|
|
119
|
+
authMode: 'loopback',
|
|
120
|
+
};
|
|
121
|
+
try {
|
|
122
|
+
writeFile(barJsonPath, JSON.stringify(barJson, null, 2));
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
126
|
+
console.error(`[X] Failed to write bar.json: ${msg}`);
|
|
127
|
+
exit(1);
|
|
128
|
+
}
|
|
129
|
+
console.log(`[OK] CCS server already running at ${running.baseUrl} — reusing.`);
|
|
130
|
+
exit(0);
|
|
131
|
+
}
|
|
132
|
+
// 2. No live server found — start one.
|
|
133
|
+
// Honor --port N from the launcher (it pre-selected via getPort to avoid races).
|
|
134
|
+
const requestedPort = parsePortArg(args);
|
|
135
|
+
let port;
|
|
136
|
+
if (requestedPort !== null) {
|
|
137
|
+
port = requestedPort;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
port = await getPortFn({ port: [3000, 3001, 3002, 8000, 8080], host: '127.0.0.1' });
|
|
141
|
+
}
|
|
142
|
+
// TypeScript cannot infer that exit(1) is `never` when it is injected as a dep,
|
|
143
|
+
// so we use a definite-assignment assertion on dashboardInfo.
|
|
144
|
+
let dashboardInfo;
|
|
145
|
+
try {
|
|
146
|
+
dashboardInfo = await startServerFn({ port, host: '127.0.0.1' });
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
150
|
+
console.error(`[X] Failed to start CCS server: ${msg}`);
|
|
151
|
+
exit(1);
|
|
152
|
+
}
|
|
153
|
+
// 3. Write bar.json and server.pid.
|
|
154
|
+
const barJson = {
|
|
155
|
+
baseUrl: dashboardInfo.baseUrl,
|
|
156
|
+
port: dashboardInfo.port,
|
|
157
|
+
authMode: 'loopback',
|
|
158
|
+
};
|
|
159
|
+
try {
|
|
160
|
+
writeFile(barJsonPath, JSON.stringify(barJson, null, 2));
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
164
|
+
console.error(`[X] Failed to write bar.json: ${msg}`);
|
|
165
|
+
exit(1);
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
writeFile(serverPidPath, String(process.pid));
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
// Non-fatal — stop/status will just degrade gracefully.
|
|
172
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
173
|
+
console.error(`[!] Failed to write server.pid: ${msg}`);
|
|
174
|
+
}
|
|
175
|
+
console.log(`[OK] CCS Bar server started at ${dashboardInfo.baseUrl}`);
|
|
176
|
+
console.log(`[i] PID ${process.pid} — stop with \`ccs bar stop\``);
|
|
177
|
+
// 4. Clean shutdown on SIGINT / SIGTERM.
|
|
178
|
+
const shutdown = () => {
|
|
179
|
+
removeFile(serverPidPath);
|
|
180
|
+
// bar.json is intentionally left in place on clean shutdown so
|
|
181
|
+
// the Swift app self-heal poll can detect the server is gone via
|
|
182
|
+
// the liveness check, not a stale discovery file.
|
|
183
|
+
console.log('\n[OK] CCS Bar server stopped.');
|
|
184
|
+
exit(0);
|
|
185
|
+
};
|
|
186
|
+
onSignal('SIGINT', shutdown);
|
|
187
|
+
onSignal('SIGTERM', shutdown);
|
|
188
|
+
// 5. Stay alive — the startServer() HTTP server keeps the Node/Bun event loop
|
|
189
|
+
// alive while listening. Nothing else needed here.
|
|
190
|
+
}
|
|
191
|
+
exports.handleBarServe = handleBarServe;
|
|
192
|
+
//# sourceMappingURL=serve-subcommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/serve-subcommand.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,4EAA8D;AAC9D,2CAA+D;AAC/D,yDAA8D;AAkC9D,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,KAAK,UAAU,kBAAkB,CAAC,IAAoC;IACpE,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,kBAAkB,GAAC,CAAC;IACzD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9E,MAAM,OAAO,GAAG,oBAAoB,YAAY,EAAE,CAAC;IACnD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAsC;IAClE,MAAM,OAAO,GAAG,CAAC,wDAAa,UAAU,GAAC,CAAC,CAAC,OAAO,CAAC;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAA4B,EAAE,OAAmB;IACxE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAA,gCAAS,GAAE,CAAC;AACrB,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAEvE,KAAK,UAAU,cAAc,CAAC,IAAc,EAAE,OAA2B,EAAE;IAChF,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC,EAAE,CAAC;IACtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,2CAAwB,EAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IAEtC,MAAM,WAAW,GAAG,IAAA,0BAAc,EAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,IAAA,4BAAgB,EAAC,MAAM,CAAC,CAAC;IAE/C,kDAAkD;IAClD,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,sEAAsE;QACtE,MAAM,OAAO,GAAqB;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,UAAU;SACrB,CAAC;QACF,IAAI,CAAC;YACH,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,CAAC,CAAC,CAAC;QACV,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sCAAsC,OAAO,CAAC,OAAO,aAAa,CAAC,CAAC;QAChF,IAAI,CAAC,CAAC,CAAC,CAAC;IACV,CAAC;IAED,uCAAuC;IACvC,iFAAiF;IACjF,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,IAAY,CAAC;IACjB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,GAAG,aAAa,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,gFAAgF;IAChF,8DAA8D;IAE9D,IAAI,aAA6B,CAAC;IAClC,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,CAAC,CAAC,CAAC;IACV,CAAC;IAED,oCAAoC;IACpC,MAAM,OAAO,GAAqB;QAChC,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,QAAQ,EAAE,UAAU;KACrB,CAAC;IACF,IAAI,CAAC;QACH,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,CAAC,CAAC;IACV,CAAC;IAED,IAAI,CAAC;QACH,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wDAAwD;QACxD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,GAAG,+BAA+B,CAAC,CAAC;IAEpE,yCAAyC;IACzC,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,UAAU,CAAC,aAAa,CAAC,CAAC;QAC1B,+DAA+D;QAC/D,iEAAiE;QACjE,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,IAAI,CAAC,CAAC,CAAC,CAAC;IACV,CAAC,CAAC;IAEF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE9B,8EAA8E;IAC9E,sDAAsD;AACxD,CAAC;AArGD,wCAqGC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ccs bar status` — report whether the CCS Bar server is running.
|
|
3
|
+
*
|
|
4
|
+
* Checks server.pid for the PID, then verifies the process is alive and
|
|
5
|
+
* the server is reachable at GET /api/bar/summary. ASCII output only.
|
|
6
|
+
*/
|
|
7
|
+
export interface StatusDeps {
|
|
8
|
+
/** Returns ~/.ccs dir (respects CCS_HOME). */
|
|
9
|
+
getCcsDir: () => string;
|
|
10
|
+
/**
|
|
11
|
+
* Read the server.pid file. Returns the raw string content, or null when
|
|
12
|
+
* absent or unreadable.
|
|
13
|
+
*/
|
|
14
|
+
readPidFile: (pidPath: string) => string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Check whether a process is alive.
|
|
17
|
+
* Uses kill(pid, 0) semantics: no error = alive, ESRCH = gone.
|
|
18
|
+
* Returns true when alive, false otherwise.
|
|
19
|
+
*/
|
|
20
|
+
isProcessAlive: (pid: number) => boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Probe whether the server is reachable at GET {baseUrl}/api/bar/summary.
|
|
23
|
+
* Returns true on HTTP 200, false otherwise. Never throws.
|
|
24
|
+
*/
|
|
25
|
+
probeServer: (baseUrl: string) => Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Read bar.json and return the baseUrl field, or null when absent/malformed.
|
|
28
|
+
*/
|
|
29
|
+
readBarJsonBaseUrl: (barJsonPath: string) => string | null;
|
|
30
|
+
}
|
|
31
|
+
export declare function handleBarStatus(_args: string[], deps?: Partial<StatusDeps>): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=status-subcommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/status-subcommand.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB;;;OAGG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAChD;;;;OAIG;IACH,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC;;;OAGG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD;;OAEG;IACH,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC5D;AA2DD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,GAAE,OAAO,CAAC,UAAU,CAAM,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|