@jsonstudio/rcc 0.89.2239 → 0.90.89
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 +27 -0
- package/dist/build-info.js +2 -2
- package/dist/build-info.js.map +1 -1
- package/dist/cli/commands/claude.js +4 -8
- package/dist/cli/commands/claude.js.map +1 -1
- package/dist/cli/commands/codex.js +6 -3
- package/dist/cli/commands/codex.js.map +1 -1
- package/dist/cli/commands/guardian-daemon.d.ts +2 -0
- package/dist/cli/commands/guardian-daemon.js +299 -0
- package/dist/cli/commands/guardian-daemon.js.map +1 -0
- package/dist/cli/commands/init/camoufox.js +1 -1
- package/dist/cli/commands/init/camoufox.js.map +1 -1
- package/dist/cli/commands/launcher/index.d.ts +1 -1
- package/dist/cli/commands/launcher/types.d.ts +7 -1
- package/dist/cli/commands/launcher/utils.d.ts +4 -1
- package/dist/cli/commands/launcher/utils.js +18 -8
- package/dist/cli/commands/launcher/utils.js.map +1 -1
- package/dist/cli/commands/launcher-kernel.d.ts +1 -1
- package/dist/cli/commands/launcher-kernel.js +608 -249
- package/dist/cli/commands/launcher-kernel.js.map +1 -1
- package/dist/cli/commands/port.js +28 -8
- package/dist/cli/commands/port.js.map +1 -1
- package/dist/cli/commands/restart.d.ts +4 -0
- package/dist/cli/commands/restart.js +91 -42
- package/dist/cli/commands/restart.js.map +1 -1
- package/dist/cli/commands/{clock-admin.d.ts → session-admin.d.ts} +2 -2
- package/dist/cli/commands/{clock-admin.js → session-admin.js} +17 -17
- package/dist/cli/commands/session-admin.js.map +1 -0
- package/dist/cli/commands/{tmux-inject.d.ts → session-inject.d.ts} +2 -2
- package/dist/cli/commands/{tmux-inject.js → session-inject.js} +12 -12
- package/dist/cli/commands/session-inject.js.map +1 -0
- package/dist/cli/commands/start-types.d.ts +4 -0
- package/dist/cli/commands/start-utils.d.ts +1 -0
- package/dist/cli/commands/start-utils.js +3 -0
- package/dist/cli/commands/start-utils.js.map +1 -1
- package/dist/cli/commands/start.js +122 -72
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +30 -63
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/config/init-provider-catalog.js +8 -3
- package/dist/cli/config/init-provider-catalog.js.map +1 -1
- package/dist/cli/guardian/client.d.ts +38 -0
- package/dist/cli/guardian/client.js +237 -0
- package/dist/cli/guardian/client.js.map +1 -0
- package/dist/cli/guardian/paths.d.ts +7 -0
- package/dist/cli/guardian/paths.js +13 -0
- package/dist/cli/guardian/paths.js.map +1 -0
- package/dist/cli/guardian/types.d.ts +30 -0
- package/dist/cli/guardian/types.js +2 -0
- package/dist/cli/guardian/types.js.map +1 -0
- package/dist/cli/register/guardian-daemon-command.d.ts +2 -0
- package/dist/cli/register/guardian-daemon-command.js +5 -0
- package/dist/cli/register/guardian-daemon-command.js.map +1 -0
- package/dist/cli/register/session-admin-command.d.ts +3 -0
- package/dist/cli/register/session-admin-command.js +5 -0
- package/dist/cli/register/session-admin-command.js.map +1 -0
- package/dist/cli/register/session-inject-command.d.ts +3 -0
- package/dist/cli/register/session-inject-command.js +5 -0
- package/dist/cli/register/session-inject-command.js.map +1 -0
- package/dist/cli/server/port-utils.js +57 -1
- package/dist/cli/server/port-utils.js.map +1 -1
- package/dist/cli.js +52 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/oauth.js +6 -6
- package/dist/commands/oauth.js.map +1 -1
- package/dist/config/provider-v2-loader.js +18 -3
- package/dist/config/provider-v2-loader.js.map +1 -1
- package/dist/config/routecodex-config-loader.js +184 -9
- package/dist/config/routecodex-config-loader.js.map +1 -1
- package/dist/config/unified-config-paths.js +22 -0
- package/dist/config/unified-config-paths.js.map +1 -1
- package/dist/config/virtual-router-builder.js +18 -5
- package/dist/config/virtual-router-builder.js.map +1 -1
- package/dist/config/virtual-router-types.js +20 -5
- package/dist/config/virtual-router-types.js.map +1 -1
- package/dist/daemon-admin-ui/assets/index-C8vP_c5E.js +15 -0
- package/dist/daemon-admin-ui/assets/index-DjIoHmNv.css +1 -0
- package/dist/daemon-admin-ui/index.html +13 -0
- package/dist/docs/daemon-admin-ui.html +334 -63
- package/dist/index.d.ts +9 -0
- package/dist/index.js +268 -10
- package/dist/index.js.map +1 -1
- package/dist/manager/modules/quota/provider-key-normalization.js +1 -10
- package/dist/manager/modules/quota/provider-key-normalization.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.d.ts +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js +36 -0
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.events.js +89 -49
- package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js +2 -16
- package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js.map +1 -1
- package/dist/manager/modules/token/index.d.ts +1 -0
- package/dist/manager/modules/token/index.js +6 -1
- package/dist/manager/modules/token/index.js.map +1 -1
- package/dist/manager/types.d.ts +1 -0
- package/dist/modules/llmswitch/bridge/state-integrations.js +1 -1
- package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -1
- package/dist/providers/auth/antigravity-user-agent.js +78 -31
- package/dist/providers/auth/antigravity-user-agent.js.map +1 -1
- package/dist/providers/auth/gemini-cli-userinfo-helper.js +94 -63
- package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/iflow-userinfo-helper.js +1 -1
- package/dist/providers/auth/iflow-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/oauth-error-message.d.ts +1 -0
- package/dist/providers/auth/oauth-error-message.js +44 -0
- package/dist/providers/auth/oauth-error-message.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle/error-detection.js +42 -8
- package/dist/providers/auth/oauth-lifecycle/error-detection.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle/token-io.d.ts +1 -0
- package/dist/providers/auth/oauth-lifecycle/token-io.js +12 -0
- package/dist/providers/auth/oauth-lifecycle/token-io.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +502 -87
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/oauth-repair-env.js +3 -5
- package/dist/providers/auth/oauth-repair-env.js.map +1 -1
- package/dist/providers/auth/oauth-utils/error-extraction.js +42 -8
- package/dist/providers/auth/oauth-utils/error-extraction.js.map +1 -1
- package/dist/providers/core/config/camoufox-actions.d.ts +31 -0
- package/dist/providers/core/config/camoufox-actions.js +470 -0
- package/dist/providers/core/config/camoufox-actions.js.map +1 -0
- package/dist/providers/core/config/camoufox-launcher.d.ts +3 -0
- package/dist/providers/core/config/camoufox-launcher.js +553 -159
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/oauth-flows.js +6 -44
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/provider-oauth-configs.js +51 -7
- package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +2 -2
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/base-provider-runtime-helpers.js +15 -2
- package/dist/providers/core/runtime/base-provider-runtime-helpers.js.map +1 -1
- package/dist/providers/core/runtime/provider-error-classifier.js +32 -15
- package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
- package/dist/providers/core/runtime/provider-family-profile-utils.js +1 -1
- package/dist/providers/core/runtime/provider-family-profile-utils.js.map +1 -1
- package/dist/providers/core/runtime/provider-response-postprocessor.js +61 -14
- package/dist/providers/core/runtime/provider-response-postprocessor.js.map +1 -1
- package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -0
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +124 -19
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/strategies/oauth-device-flow.js +32 -6
- package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
- package/dist/providers/core/utils/provider-error-reporter.js +51 -0
- package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
- package/dist/providers/profile/families/iflow-profile.js +83 -10
- package/dist/providers/profile/families/iflow-profile.js.map +1 -1
- package/dist/scripts/camoufox/launch-auth.mjs +112 -5
- package/dist/server/handlers/config-admin-handler.js +9 -2
- package/dist/server/handlers/config-admin-handler.js.map +1 -1
- package/dist/server/handlers/handler-response-utils.js +3 -6
- package/dist/server/handlers/handler-response-utils.js.map +1 -1
- package/dist/server/handlers/handler-utils.js +14 -17
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/handlers/logging.js +3 -4
- package/dist/server/handlers/logging.js.map +1 -1
- package/dist/server/handlers/responses-handler.js +5 -3
- package/dist/server/handlers/responses-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +5 -3
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js +104 -15
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +2 -2
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.d.ts +24 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js +316 -70
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +190 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/routing-policy.d.ts +1 -1
- package/dist/server/runtime/http-server/daemon-admin/routing-policy.js +21 -32
- package/dist/server/runtime/http-server/daemon-admin/routing-policy.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/stats-handler.js +2 -0
- package/dist/server/runtime/http-server/daemon-admin/stats-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +8 -1
- package/dist/server/runtime/http-server/daemon-admin-routes.js +30 -0
- package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
- package/dist/server/runtime/http-server/executor/client-injection-flow.d.ts +14 -0
- package/dist/server/runtime/http-server/executor/client-injection-flow.js +297 -0
- package/dist/server/runtime/http-server/executor/client-injection-flow.js.map +1 -0
- package/dist/server/runtime/http-server/executor/index.d.ts +1 -1
- package/dist/server/runtime/http-server/executor/index.js +1 -1
- package/dist/server/runtime/http-server/executor/index.js.map +1 -1
- package/dist/server/runtime/http-server/executor/provider-response-converter.js +281 -70
- package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +8 -6
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -1
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.d.ts +1 -0
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.js +12 -0
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.js.map +1 -1
- package/dist/server/runtime/http-server/executor/request-retry-helpers.d.ts +1 -1
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js +23 -19
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -1
- package/dist/server/runtime/http-server/executor/retry-engine.d.ts +2 -2
- package/dist/server/runtime/http-server/executor/retry-engine.js +2 -2
- package/dist/server/runtime/http-server/executor/retry-engine.js.map +1 -1
- package/dist/server/runtime/http-server/executor/sse-error-handler.d.ts +1 -0
- package/dist/server/runtime/http-server/executor/sse-error-handler.js +13 -2
- package/dist/server/runtime/http-server/executor/sse-error-handler.js.map +1 -1
- package/dist/server/runtime/http-server/executor/usage-aggregator.d.ts +0 -12
- package/dist/server/runtime/http-server/executor/usage-aggregator.js +89 -90
- package/dist/server/runtime/http-server/executor/usage-aggregator.js.map +1 -1
- package/dist/server/runtime/http-server/executor-metadata.js +318 -17
- package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
- package/dist/server/runtime/http-server/executor-provider.d.ts +1 -0
- package/dist/server/runtime/http-server/executor-provider.js +5 -1
- package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
- package/dist/server/runtime/http-server/executor-response.d.ts +1 -0
- package/dist/server/runtime/http-server/executor-response.js +52 -58
- package/dist/server/runtime/http-server/executor-response.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-bootstrap.js +50 -6
- package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-lifecycle.js +6 -5
- package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-runtime-setup.js +1 -1
- package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-session-daemon.d.ts +6 -0
- package/dist/server/runtime/http-server/http-server-session-daemon.js +404 -0
- package/dist/server/runtime/http-server/http-server-session-daemon.js.map +1 -0
- package/dist/server/runtime/http-server/hub-shadow-compare.js +1 -1
- package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -1
- package/dist/server/runtime/http-server/index.d.ts +11 -10
- package/dist/server/runtime/http-server/index.js +21 -20
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/managed-process-probe.js +1 -1
- package/dist/server/runtime/http-server/managed-process-probe.js.map +1 -1
- package/dist/server/runtime/http-server/middleware.js +91 -5
- package/dist/server/runtime/http-server/middleware.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +19 -9
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.d.ts +2 -1
- package/dist/server/runtime/http-server/routes.js +7 -5
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/{clock-client-reaper.d.ts → session-client-reaper.d.ts} +6 -6
- package/dist/server/runtime/http-server/{clock-client-reaper.js → session-client-reaper.js} +26 -49
- package/dist/server/runtime/http-server/session-client-reaper.js.map +1 -0
- package/dist/server/runtime/http-server/{clock-client-registry-utils.d.ts → session-client-registry-utils.d.ts} +14 -10
- package/dist/server/runtime/http-server/{clock-client-registry-utils.js → session-client-registry-utils.js} +77 -19
- package/dist/server/runtime/http-server/session-client-registry-utils.js.map +1 -0
- package/dist/server/runtime/http-server/{clock-client-registry.d.ts → session-client-registry.d.ts} +26 -11
- package/dist/server/runtime/http-server/{clock-client-registry.js → session-client-registry.js} +305 -11
- package/dist/server/runtime/http-server/session-client-registry.js.map +1 -0
- package/dist/server/runtime/http-server/{clock-client-route-utils.d.ts → session-client-route-utils.d.ts} +1 -1
- package/dist/server/runtime/http-server/{clock-client-route-utils.js → session-client-route-utils.js} +4 -4
- package/dist/server/runtime/http-server/session-client-route-utils.js.map +1 -0
- package/dist/server/runtime/http-server/session-client-routes.d.ts +2 -0
- package/dist/server/runtime/http-server/{clock-client-routes.js → session-client-routes.js} +107 -59
- package/dist/server/runtime/http-server/session-client-routes.js.map +1 -0
- package/dist/server/runtime/http-server/session-daemon-inject-config.d.ts +1 -0
- package/dist/server/runtime/http-server/{clock-daemon-inject-config.js → session-daemon-inject-config.js} +2 -2
- package/dist/server/runtime/http-server/session-daemon-inject-config.js.map +1 -0
- package/dist/server/runtime/http-server/session-daemon-log-throttle.d.ts +28 -0
- package/dist/server/runtime/http-server/session-daemon-log-throttle.js +105 -0
- package/dist/server/runtime/http-server/session-daemon-log-throttle.js.map +1 -0
- package/dist/server/runtime/http-server/session-dir.js +12 -1
- package/dist/server/runtime/http-server/session-dir.js.map +1 -1
- package/dist/server/runtime/http-server/session-scope-resolution.d.ts +14 -0
- package/dist/server/runtime/http-server/session-scope-resolution.js +208 -0
- package/dist/server/runtime/http-server/session-scope-resolution.js.map +1 -0
- package/dist/server/runtime/http-server/stats-manager.d.ts +35 -0
- package/dist/server/runtime/http-server/stats-manager.js +269 -21
- package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
- package/dist/server/runtime/http-server/stopmessage-scope-rebind.d.ts +21 -0
- package/dist/server/runtime/http-server/stopmessage-scope-rebind.js +197 -0
- package/dist/server/runtime/http-server/stopmessage-scope-rebind.js.map +1 -0
- package/dist/server/runtime/http-server/tmux-session-probe.d.ts +10 -0
- package/dist/server/runtime/http-server/tmux-session-probe.js +98 -1
- package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -1
- package/dist/server-lifecycle/port-utils.d.ts +2 -1
- package/dist/server-lifecycle/port-utils.js +84 -4
- package/dist/server-lifecycle/port-utils.js.map +1 -1
- package/dist/token-daemon/index.d.ts +1 -0
- package/dist/token-daemon/index.js +17 -12
- package/dist/token-daemon/index.js.map +1 -1
- package/dist/token-daemon/token-daemon.d.ts +2 -0
- package/dist/token-daemon/token-daemon.js +18 -10
- package/dist/token-daemon/token-daemon.js.map +1 -1
- package/dist/utils/llms-engine-shadow.js +1 -1
- package/dist/utils/llms-engine-shadow.js.map +1 -1
- package/dist/utils/log-helpers.js +46 -0
- package/dist/utils/log-helpers.js.map +1 -1
- package/dist/utils/session-client-token.d.ts +4 -0
- package/dist/utils/session-client-token.js +93 -0
- package/dist/utils/session-client-token.js.map +1 -0
- package/dist/utils/session-scope-trace.d.ts +11 -0
- package/dist/utils/session-scope-trace.js +41 -0
- package/dist/utils/session-scope-trace.js.map +1 -0
- package/docs/CLOCK.md +0 -1
- package/docs/DAEMON_CONTROL_PLANE.md +1 -0
- package/docs/PORTS.md +2 -2
- package/docs/ROUTING_POLICY_SCHEMA.md +5 -3
- package/docs/antigravity-routing-contract.md +2 -2
- package/docs/daemon-admin-ui.html +334 -63
- package/docs/design/servertool-stopmessage-lifecycle.md +109 -0
- package/docs/exec-command-guard-policy.example.v1.json +7 -1
- package/docs/providers/antigravity-gemini-provider-compat.md +2 -2
- package/docs/{clock-client-daemon-design.md → session-client-daemon-design.md} +34 -34
- package/package.json +23 -7
- package/scripts/build-core.mjs +12 -0
- package/scripts/camoufox/launch-auth.mjs +112 -5
- package/scripts/ci/repo-sanity.mjs +1 -0
- package/scripts/compare-responses-sse.mjs +267 -0
- package/scripts/install-global.sh +6 -0
- package/scripts/install-verify.mjs +33 -16
- package/scripts/replay-codex-sample.mjs +52 -6
- package/scripts/run-bg.sh +226 -43
- package/scripts/run-fg-gtimeout.sh +158 -14
- package/scripts/tests/blackbox-rcc-vs-routecodex-antigravity.mjs +3 -3
- package/scripts/tests/ci-jest.mjs +9 -1
- package/scripts/triage-errorsamples.mjs +216 -0
- package/scripts/verify-codex-error-samples.mjs +92 -15
- package/scripts/verify-install-e2e.mjs +57 -27
- package/scripts/virtual-router-dryrun.mjs +7 -1
- package/dist/cli/commands/clock-admin.js.map +0 -1
- package/dist/cli/commands/tmux-inject.js.map +0 -1
- package/dist/cli/register/clock-admin-command.d.ts +0 -3
- package/dist/cli/register/clock-admin-command.js +0 -5
- package/dist/cli/register/clock-admin-command.js.map +0 -1
- package/dist/cli/register/tmux-inject-command.d.ts +0 -3
- package/dist/cli/register/tmux-inject-command.js +0 -5
- package/dist/cli/register/tmux-inject-command.js.map +0 -1
- package/dist/server/runtime/http-server/clock-client-reaper.js.map +0 -1
- package/dist/server/runtime/http-server/clock-client-registry-utils.js.map +0 -1
- package/dist/server/runtime/http-server/clock-client-registry.js.map +0 -1
- package/dist/server/runtime/http-server/clock-client-route-utils.js.map +0 -1
- package/dist/server/runtime/http-server/clock-client-routes.d.ts +0 -2
- package/dist/server/runtime/http-server/clock-client-routes.js.map +0 -1
- package/dist/server/runtime/http-server/clock-daemon-inject-config.d.ts +0 -1
- package/dist/server/runtime/http-server/clock-daemon-inject-config.js.map +0 -1
- package/dist/server/runtime/http-server/clock-daemon-log-throttle.d.ts +0 -12
- package/dist/server/runtime/http-server/clock-daemon-log-throttle.js +0 -56
- package/dist/server/runtime/http-server/clock-daemon-log-throttle.js.map +0 -1
- package/dist/server/runtime/http-server/http-server-clock-daemon.d.ts +0 -5
- package/dist/server/runtime/http-server/http-server-clock-daemon.js +0 -255
- package/dist/server/runtime/http-server/http-server-clock-daemon.js.map +0 -1
- package/dist/utils/clock-client-token.d.ts +0 -3
- package/dist/utils/clock-client-token.js +0 -54
- package/dist/utils/clock-client-token.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Session Client Daemon + Private Clock Marker Design (routecodex-119)
|
|
2
2
|
|
|
3
3
|
## 1. Background
|
|
4
4
|
|
|
@@ -49,13 +49,13 @@ We need a controlled path where:
|
|
|
49
49
|
5. **Daemon auth model**
|
|
50
50
|
- Localhost-only access guard for daemon control endpoints.
|
|
51
51
|
|
|
52
|
-
6. **
|
|
52
|
+
6. **Session inject session binding**
|
|
53
53
|
- Daemon routing key is `tmuxSessionId` (tmux session domain), not conversation `sessionId`.
|
|
54
54
|
- Conversation `sessionId` is bound separately to a tmux session in server registry (mapping domain separation).
|
|
55
|
-
- Launcher appends daemon identity suffix to proxied api key (`::rcc-
|
|
56
|
-
- HTTP auth middleware extracts daemon suffix and attaches `x-routecodex-
|
|
55
|
+
- Launcher appends daemon identity suffix to proxied api key (`::rcc-sessiond:<daemonId>`).
|
|
56
|
+
- HTTP auth middleware extracts daemon suffix and attaches `x-routecodex-session-daemon-id` request hint.
|
|
57
57
|
- Executor metadata binds `conversationSessionId -> daemonId/tmuxSessionId` deterministically before due injection tick.
|
|
58
|
-
- `/daemon/
|
|
58
|
+
- `/daemon/session-client/inject` remains strict and never falls back to unrelated alive daemons.
|
|
59
59
|
|
|
60
60
|
## 4. Architecture
|
|
61
61
|
|
|
@@ -64,7 +64,7 @@ We need a controlled path where:
|
|
|
64
64
|
- **Launcher (`rcc codex/claude`)**
|
|
65
65
|
- Detects tmux capability.
|
|
66
66
|
- Starts/attaches client daemon if available.
|
|
67
|
-
- **
|
|
67
|
+
- **Session Client Daemon**
|
|
68
68
|
- Maintains registration + heartbeat with server.
|
|
69
69
|
- Executes `tmux send-keys` for injection + Enter.
|
|
70
70
|
- Self-terminates when parent/client exits.
|
|
@@ -116,19 +116,19 @@ please remind me
|
|
|
116
116
|
|
|
117
117
|
## 6. Server Daemon Control Endpoints (localhost only)
|
|
118
118
|
|
|
119
|
-
- `POST /daemon/
|
|
120
|
-
- `POST /daemon/
|
|
121
|
-
- `POST /daemon/
|
|
122
|
-
- `POST /daemon/
|
|
119
|
+
- `POST /daemon/session-client/register`
|
|
120
|
+
- `POST /daemon/session-client/heartbeat`
|
|
121
|
+
- `POST /daemon/session-client/inject`
|
|
122
|
+
- `POST /daemon/session-client/unregister`
|
|
123
123
|
|
|
124
124
|
Payload fields include session/client type/tmux target/request id/injection text as needed.
|
|
125
125
|
|
|
126
126
|
### 6.1 External injection CLI
|
|
127
127
|
|
|
128
|
-
- Command: `routecodex
|
|
128
|
+
- Command: `routecodex session-inject` / `rcc session-inject`
|
|
129
129
|
- Common usage:
|
|
130
|
-
- `rcc
|
|
131
|
-
- `rcc
|
|
130
|
+
- `rcc session-inject --port 5520 --list`
|
|
131
|
+
- `rcc session-inject --port 5520 --text "hello" --tmux-session-id <tmuxSessionId>`
|
|
132
132
|
- Target resolution rules:
|
|
133
133
|
- Prefer explicit `--tmux-session-id` (or legacy `--session-id` alias);
|
|
134
134
|
- else resolve via `--daemon-id`;
|
|
@@ -169,7 +169,7 @@ To ensure due tasks are actually delivered to the client input surface (not only
|
|
|
169
169
|
- Source of truth: `clock/*.json` under server-scoped `ROUTECODEX_SESSION_DIR`.
|
|
170
170
|
- Runtime config parsing: delegated to llmswitch-core `resolveClockConfig` bridge API.
|
|
171
171
|
- Due reservation: delegated to llmswitch-core `reserveDueTasksForRequest` bridge API.
|
|
172
|
-
- Delivery path: host `
|
|
172
|
+
- Delivery path: host `SessionClientRegistry.inject({ sessionId, ... })`, where `sessionId` can be conversation ID and is resolved to mapped `tmuxSessionId`.
|
|
173
173
|
- Commit rule: call `commitClockReservation` only after successful daemon injection.
|
|
174
174
|
|
|
175
175
|
### 10.1 Lifecycle
|
|
@@ -195,10 +195,10 @@ Fix:
|
|
|
195
195
|
- `sharedmodule/llmswitch-core`: `npm run build` ✅
|
|
196
196
|
- RouteCodex targeted suite (via `npm run jest:run -- --runTestsByPath ...`) ✅
|
|
197
197
|
- `tests/servertool/servertool-clock.spec.ts` (includes new provider pin regression)
|
|
198
|
-
- `tests/server/http-server/
|
|
198
|
+
- `tests/server/http-server/session-client-routes.spec.ts`
|
|
199
199
|
- `tests/server/http-server/hub-policy-injection.spec.ts`
|
|
200
200
|
- `tests/server/http-server/quota-view-injection.spec.ts`
|
|
201
|
-
- `tests/cli/
|
|
201
|
+
- `tests/cli/session-inject-command.spec.ts`
|
|
202
202
|
- `tests/cli/codex-command.spec.ts`
|
|
203
203
|
- `tests/cli/claude-command.spec.ts`
|
|
204
204
|
- `npm run build:dev` ✅
|
|
@@ -212,11 +212,11 @@ Using a temporary server on port `5630` + mock callback daemon:
|
|
|
212
212
|
2. Schedule one due task for `conv_clock_live` in task-store.
|
|
213
213
|
3. Observe callback payload auto-arrival from server loop:
|
|
214
214
|
|
|
215
|
-
- `source: "
|
|
215
|
+
- `source: "session.daemon.inject"`
|
|
216
216
|
- `tmuxSessionId: "rcc_test_tmux"`
|
|
217
217
|
- text includes `[Clock Reminder]` and scheduled task details.
|
|
218
218
|
|
|
219
|
-
4. `/daemon/
|
|
219
|
+
4. `/daemon/session-client/list` shows `lastInjectAtMs` updated.
|
|
220
220
|
|
|
221
221
|
## 13. Submit-key reliability hardening (routecodex-128)
|
|
222
222
|
|
|
@@ -234,13 +234,13 @@ Fix applied in launcher daemon path:
|
|
|
234
234
|
|
|
235
235
|
Validation:
|
|
236
236
|
|
|
237
|
-
- `npm run jest:run -- --runInBand --runTestsByPath tests/cli/codex-command.spec.ts tests/cli/claude-command.spec.ts tests/cli/
|
|
238
|
-
- `npm run jest:run -- --runInBand --runTestsByPath tests/server/http-server/
|
|
237
|
+
- `npm run jest:run -- --runInBand --runTestsByPath tests/cli/codex-command.spec.ts tests/cli/claude-command.spec.ts tests/cli/session-inject-command.spec.ts` ✅
|
|
238
|
+
- `npm run jest:run -- --runInBand --runTestsByPath tests/server/http-server/session-client-routes.spec.ts tests/server/http-server/executor-metadata.spec.ts tests/server/http-server/httpserver-apikey-env-resolution.spec.ts tests/utils/session-client-token.spec.ts` ✅
|
|
239
239
|
- `npx tsc --noEmit` ✅
|
|
240
240
|
|
|
241
241
|
## 14. Precise trigger mode (routecodex-129)
|
|
242
242
|
|
|
243
|
-
|
|
243
|
+
Session daemon delivery now runs in exact due-time mode by default:
|
|
244
244
|
|
|
245
245
|
- host daemon inject loop rewrites effective clock config to `dueWindowMs=0` before reservation;
|
|
246
246
|
- this prevents early-fire behavior from legacy wide due windows in request-driven paths;
|
|
@@ -305,21 +305,21 @@ Cleanup behavior:
|
|
|
305
305
|
|
|
306
306
|
Added management endpoints:
|
|
307
307
|
|
|
308
|
-
- `GET /daemon/
|
|
309
|
-
- `POST /daemon/
|
|
310
|
-
- `PATCH /daemon/
|
|
311
|
-
- `DELETE /daemon/
|
|
312
|
-
- `POST /daemon/
|
|
308
|
+
- `GET /daemon/session/tasks` (list)
|
|
309
|
+
- `POST /daemon/session/tasks` (create)
|
|
310
|
+
- `PATCH /daemon/session/tasks` (update)
|
|
311
|
+
- `DELETE /daemon/session/tasks` (delete one / clear session)
|
|
312
|
+
- `POST /daemon/session/cleanup` (`mode=dead_tmux|unbind`)
|
|
313
313
|
|
|
314
314
|
CLI management command:
|
|
315
315
|
|
|
316
|
-
- `rcc
|
|
317
|
-
- `rcc
|
|
318
|
-
- `rcc
|
|
319
|
-
- `rcc
|
|
320
|
-
- `rcc
|
|
321
|
-
- `rcc
|
|
322
|
-
- `rcc
|
|
316
|
+
- `rcc session-admin --list`
|
|
317
|
+
- `rcc session-admin --create --session-id <sid> --due-at <iso> --task <text> --recurrence interval --every-minutes 5 --max-runs 10`
|
|
318
|
+
- `rcc session-admin --update --session-id <sid> --task-id <tid> --due-at <iso> --task "..."`
|
|
319
|
+
- `rcc session-admin --delete --session-id <sid> --task-id <tid>`
|
|
320
|
+
- `rcc session-admin --clear --session-id <sid>`
|
|
321
|
+
- `rcc session-admin --cleanup-dead-tmux`
|
|
322
|
+
- `rcc session-admin --unbind-session <conversationSessionId> [--clear-tasks]`
|
|
323
323
|
|
|
324
324
|
WebUI management entry:
|
|
325
325
|
|
|
@@ -332,7 +332,7 @@ Clock tool now supports `action=update` (with `taskId` + `items[0]`) so models c
|
|
|
332
332
|
|
|
333
333
|
### 15.6 Trigger precision and reminder guidance
|
|
334
334
|
|
|
335
|
-
|
|
335
|
+
Session daemon inject loop uses exact due matching (`dueWindowMs=0`) to avoid early delivery.
|
|
336
336
|
Reminder payload includes guidance text:
|
|
337
337
|
|
|
338
338
|
- `MANDATORY: if waiting is needed, use the clock tool to schedule wake-up (clock.schedule) now; do not only promise to wait.`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsonstudio/rcc",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.90.089",
|
|
4
4
|
"description": "Multi-provider OpenAI proxy server with anthropic/responses/chat support (release)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,9 +29,11 @@
|
|
|
29
29
|
"node": ">=20 <26"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
|
-
"build": "npm run llmswitch:ensure && node scripts/build-core.mjs && node scripts/vendor-core.mjs && npm run clean && node scripts/gen-build-info.mjs && tsc && node scripts/copy-compat-assets.mjs && node scripts/copy-modules-config.mjs && npm run fix:cli-permission",
|
|
33
|
-
"build:dev": "bash -lc 'export BUILD_MODE=dev
|
|
34
|
-
"build:
|
|
32
|
+
"build": "npm run llmswitch:ensure && node scripts/build-core.mjs && node scripts/vendor-core.mjs && npm run clean && node scripts/gen-build-info.mjs && tsc && npm run build:webui && node scripts/copy-compat-assets.mjs && node scripts/copy-modules-config.mjs && npm run fix:cli-permission",
|
|
33
|
+
"build:dev": "bash -lc 'export BUILD_MODE=dev ROUTECODEX_BUILD_RESTART_ONLY=1; npm run build && npm run fix:cli-permission && npm run install:global'",
|
|
34
|
+
"build:dev:full": "bash -lc 'export BUILD_MODE=dev ROUTECODEX_BUILD_RESTART_ONLY=1; npm run cleanup:stale-server-pids || true; trap \"npm run cleanup:stale-server-pids >/dev/null 2>&1 || true\" EXIT; npm run build && npm run fix:cli-permission && npm run test:unified-hub-shadow && npm run verify:e2e-toolcall && npm run verify:apply-patch && npm run verify:apply-patch-regressions && npm run verify:exec-command && npm run test:routing-instructions && npm run test:cli && npm run install:global && npm run mock:regressions && npm run test:blackbox-antigravity-parity && npm run verify:errorsamples && npm run verify:e2e-gemini-followup-sample'",
|
|
35
|
+
"build:min": "npm run llmswitch:ensure && node scripts/build-core.mjs && node scripts/vendor-core.mjs && npm run clean && node scripts/gen-build-info.mjs && tsc && npm run build:webui && node scripts/copy-compat-assets.mjs && node scripts/copy-modules-config.mjs && npm run fix:cli-permission",
|
|
36
|
+
"build:webui": "vite build --config webui/vite.config.ts",
|
|
35
37
|
"prepack": "echo skip-prepack",
|
|
36
38
|
"postbuild": "node scripts/ensure-cli-executable.mjs",
|
|
37
39
|
"build:watch": "tsc --watch",
|
|
@@ -39,6 +41,7 @@
|
|
|
39
41
|
"dev": "tsx watch src/index.ts",
|
|
40
42
|
"jest:run": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js",
|
|
41
43
|
"test": "npm run test:routing-instructions && npm run mock:regressions",
|
|
44
|
+
"test:regressions": "npm run test:unified-hub-shadow && npm run mock:regressions && npm run test:blackbox-antigravity-parity && npm run verify:errorsamples",
|
|
42
45
|
"test:blackbox-antigravity-parity": "node scripts/tests/blackbox-rcc-vs-routecodex-antigravity.mjs",
|
|
43
46
|
"test:ci:jest": "node scripts/tests/ci-jest.mjs",
|
|
44
47
|
"test:ci:jest:coverage": "node scripts/tests/ci-jest.mjs --coverage",
|
|
@@ -47,12 +50,14 @@
|
|
|
47
50
|
"verify:repo-sanity": "node scripts/ci/repo-sanity.mjs",
|
|
48
51
|
"verify:file-line-limit": "node scripts/ci/check-file-line-limit.mjs",
|
|
49
52
|
"vr:dryrun": "node scripts/virtual-router-dryrun.mjs",
|
|
50
|
-
"test:routing-instructions": "npm run jest:run -- --runTestsByPath tests/token-daemon/token-daemon.auto-refresh-noninteractive.spec.ts tests/token-daemon/token-daemon.refresh-ahead.spec.ts tests/commands/oauth-command.qwen-auto.spec.ts tests/token-daemon/interactive-refresh.spec.ts tests/server/runtime/request-executor.single-attempt.spec.ts tests/server/runtime/executor-provider.retryable.spec.ts tests/server/runtime/http-server/executor/usage-aggregator.spec.ts tests/providers/auth/tokenfile-auth.iflow.spec.ts tests/providers/auth/antigravity-user-agent.unit.test.ts tests/providers/auth/antigravity-fingerprint.unit.test.ts tests/providers/auth/antigravity-warmup.unit.test.ts tests/providers/core/runtime/gemini-cli-http-provider.unit.test.ts tests/providers/core/runtime/deepseek-http-provider.unit.test.ts tests/providers/core/runtime/antigravity-quota-client.unit.test.ts tests/manager/quota/provider-quota-center.spec.ts tests/manager/quota/provider-quota-store.spec.ts tests/manager/quota/quota-manager-refresh.spec.ts tests/manager/quota/provider-quota-daemon-module.spec.ts tests/manager/quota/provider-key-normalization.spec.ts tests/server/http-server/daemon-admin.e2e.spec.ts tests/server/http-server/
|
|
53
|
+
"test:routing-instructions": "npm run jest:run -- --runTestsByPath tests/token-daemon/token-daemon.auto-refresh-noninteractive.spec.ts tests/token-daemon/token-daemon.refresh-ahead.spec.ts tests/commands/oauth-command.qwen-auto.spec.ts tests/token-daemon/interactive-refresh.spec.ts tests/server/runtime/request-executor.single-attempt.spec.ts tests/server/runtime/executor-provider.retryable.spec.ts tests/server/runtime/http-server/executor/usage-aggregator.spec.ts tests/providers/auth/tokenfile-auth.iflow.spec.ts tests/providers/auth/antigravity-user-agent.unit.test.ts tests/providers/auth/antigravity-fingerprint.unit.test.ts tests/providers/auth/antigravity-warmup.unit.test.ts tests/providers/core/runtime/gemini-cli-http-provider.unit.test.ts tests/providers/core/runtime/deepseek-http-provider.unit.test.ts tests/providers/core/runtime/antigravity-quota-client.unit.test.ts tests/manager/quota/provider-quota-center.spec.ts tests/manager/quota/provider-quota-store.spec.ts tests/manager/quota/quota-manager-refresh.spec.ts tests/manager/quota/provider-quota-daemon-module.spec.ts tests/manager/quota/provider-key-normalization.spec.ts tests/server/http-server/daemon-admin.e2e.spec.ts tests/server/http-server/session-client-routes.spec.ts tests/server/http-server/quota-view-injection.spec.ts tests/server/http-server/quota-refresh-triggers.e2e.spec.ts tests/server/http-server/hub-policy-injection.spec.ts tests/server/http-server/session-header-injection.spec.ts tests/server/http-server/session-dir.spec.ts tests/server/handlers/sse-timeout.spec.ts tests/utils/is-direct-execution.test.ts tests/utils/windows-netstat.test.ts tests/servertool/virtual-router-context-fallback.spec.ts tests/servertool/virtual-router-longcontext-fallback.spec.ts tests/servertool/virtual-router-series-cooldown.spec.ts tests/servertool/recursive-detection-guard.spec.ts tests/servertool/routing-instructions.spec.ts tests/servertool/stop-message-sample-replay.spec.ts tests/servertool/stop-message-auto.spec.ts tests/servertool/stopmessage-session-scope.spec.ts tests/servertool/stopmessage-anthropic-stop-sequence.spec.ts tests/servertool/stopmessage-compaction-false-positive.spec.ts tests/servertool/servertool-progress-logging.spec.ts tests/servertool/servertool-clock.spec.ts tests/servertool/antigravity-thought-signature-bootstrap.spec.ts tests/compat/tabglm-claude-code-profile.spec.ts tests/compat/antigravity-thought-signature.spec.ts tests/sharedmodule/mcp-tool-descriptions.spec.ts tests/sharedmodule/virtual-router-hit-log.spec.ts tests/sharedmodule/virtual-router-routing-model-validation.spec.ts tests/unified-hub/hub-v1-single-path-imports.spec.ts",
|
|
51
54
|
"test:cli": "npm run jest:run -- --runTestsByPath tests/cli/camoufox-command.spec.ts tests/cli/clean-command.spec.ts tests/cli/code-command.spec.ts tests/cli/config-command.spec.ts tests/cli/env-command.spec.ts tests/cli/env-output.spec.ts tests/cli/examples-command.spec.ts tests/cli/port-command.spec.ts tests/cli/port-utils.spec.ts tests/cli/restart-command.spec.ts tests/cli/smoke.spec.ts tests/cli/start-command.spec.ts tests/cli/status-command.spec.ts tests/cli/stop-command.spec.ts",
|
|
52
55
|
"test:watch": "npm run jest:run -- --watch",
|
|
53
56
|
"test:coverage": "npm run jest:run -- --coverage",
|
|
54
57
|
"test:integration": "npm run jest:run -- --testPathPattern=integration",
|
|
55
58
|
"test:e2e": "npm run jest:run -- --testPathPattern=e2e",
|
|
59
|
+
"test:webui": "npm run jest:run -- --runTestsByPath tests/frontend/webui-app.utils.spec.ts tests/frontend/webui-app.render.spec.tsx tests/frontend/webui-app.integration.spec.tsx tests/frontend/webui-app.pages.spec.tsx tests/frontend/webui-app.edge.spec.tsx",
|
|
60
|
+
"test:webui:coverage": "npm run jest:run -- --runTestsByPath tests/frontend/webui-app.utils.spec.ts tests/frontend/webui-app.render.spec.tsx tests/frontend/webui-app.integration.spec.tsx tests/frontend/webui-app.pages.spec.tsx tests/frontend/webui-app.edge.spec.tsx --coverage --collectCoverageFrom=webui/src/App.tsx",
|
|
56
61
|
"test:performance": "npm run jest:run -- --testPathPattern=performance",
|
|
57
62
|
"test:protocol": "npm run jest:run -- --testPathPattern=protocol-tools-e2e.spec.ts --runInBand --detectOpenHandles --forceExit",
|
|
58
63
|
"test:dry-run": "node tests/basic-dry-run.mjs",
|
|
@@ -71,6 +76,7 @@
|
|
|
71
76
|
"verify:apply-patch-regressions": "node scripts/verify-apply-patch-regressions.mjs",
|
|
72
77
|
"verify:exec-command": "node scripts/tests/exec-command-loop.mjs",
|
|
73
78
|
"verify:errorsamples": "node scripts/verify-codex-error-samples.mjs",
|
|
79
|
+
"triage:errorsamples": "node scripts/triage-errorsamples.mjs",
|
|
74
80
|
"verify:e2e-gemini-followup-sample": "node scripts/verify-e2e-gemini-followup-sample.mjs",
|
|
75
81
|
"install:global": "./scripts/install-global.sh",
|
|
76
82
|
"install:release": "./scripts/install-release.sh",
|
|
@@ -151,7 +157,7 @@
|
|
|
151
157
|
},
|
|
152
158
|
"dependencies": {
|
|
153
159
|
"@anthropic-ai/sdk": "^0.65.0",
|
|
154
|
-
"@jsonstudio/llms": "
|
|
160
|
+
"@jsonstudio/llms": "0.6.3214",
|
|
155
161
|
"@lmstudio/sdk": "^1.5.0",
|
|
156
162
|
"@radix-ui/react-switch": "^1.2.6",
|
|
157
163
|
"@types/socket.io": "^3.0.1",
|
|
@@ -188,28 +194,38 @@
|
|
|
188
194
|
},
|
|
189
195
|
"devDependencies": {
|
|
190
196
|
"@jest/globals": "^30.1.2",
|
|
197
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
198
|
+
"@testing-library/react": "^16.3.2",
|
|
199
|
+
"@testing-library/user-event": "^14.6.1",
|
|
191
200
|
"@types/cors": "^2.8.13",
|
|
192
201
|
"@types/express": "^4.17.17",
|
|
193
202
|
"@types/jest": "^29.5.5",
|
|
194
203
|
"@types/node": "^20.19.25",
|
|
204
|
+
"@types/react": "^19.2.2",
|
|
205
|
+
"@types/react-dom": "^19.2.2",
|
|
195
206
|
"@typescript-eslint/eslint-plugin": "^6.7.4",
|
|
196
207
|
"@typescript-eslint/parser": "^6.7.4",
|
|
197
208
|
"@typescript-eslint/typescript-estree": "^6.7.4",
|
|
209
|
+
"@vitejs/plugin-react": "^5.1.0",
|
|
198
210
|
"complexity-report": "^2.0.0-alpha",
|
|
199
211
|
"depcheck": "^1.4.7",
|
|
200
212
|
"eslint": "^8.50.0",
|
|
201
213
|
"eslint-plugin-complexity": "^1.0.2",
|
|
202
214
|
"husky": "^9.0.0",
|
|
203
215
|
"jest": "^29.7.0",
|
|
216
|
+
"jest-environment-jsdom": "^30.2.0",
|
|
204
217
|
"jscpd": "^4.0.5",
|
|
205
218
|
"lint-staged": "^15.0.0",
|
|
206
219
|
"npm-check-updates": "^18.3.0",
|
|
207
220
|
"package-json-validator": "^0.30.0",
|
|
208
221
|
"prettier": "^3.6.2",
|
|
222
|
+
"react": "^19.2.0",
|
|
223
|
+
"react-dom": "^19.2.0",
|
|
209
224
|
"ts-jest": "^29.1.1",
|
|
210
225
|
"ts-node": "^10.9.2",
|
|
211
226
|
"tsx": "^4.0.0",
|
|
212
|
-
"typescript": "^5.9.3"
|
|
227
|
+
"typescript": "^5.9.3",
|
|
228
|
+
"vite": "^7.1.12"
|
|
213
229
|
},
|
|
214
230
|
"bundleDependencies": []
|
|
215
231
|
}
|
package/scripts/build-core.mjs
CHANGED
|
@@ -10,6 +10,7 @@ const buildMode = buildModeRaw === 'dev' ? 'dev' : 'release';
|
|
|
10
10
|
const tsc = path.join(root, 'node_modules', 'typescript', 'bin', 'tsc');
|
|
11
11
|
const proj = path.join(root, 'sharedmodule', 'llmswitch-core', 'tsconfig.json');
|
|
12
12
|
const coreRoot = path.join(root, 'sharedmodule', 'llmswitch-core');
|
|
13
|
+
const nativeBuildScript = path.join(coreRoot, 'scripts', 'build-native-hotpath.mjs');
|
|
13
14
|
const outDir = path.join(coreRoot, 'dist');
|
|
14
15
|
const requiredOutputs = [
|
|
15
16
|
path.join(outDir, 'bridge', 'routecodex-adapter.js'),
|
|
@@ -75,6 +76,16 @@ function shouldSkipBuild() {
|
|
|
75
76
|
return distMtime >= srcMtime;
|
|
76
77
|
}
|
|
77
78
|
|
|
79
|
+
function runNativeBuild() {
|
|
80
|
+
if (!fs.existsSync(nativeBuildScript)) {
|
|
81
|
+
fail(`native build script missing: ${nativeBuildScript}`);
|
|
82
|
+
}
|
|
83
|
+
const res = spawnSync(process.execPath, [nativeBuildScript], { stdio: 'inherit', cwd: coreRoot });
|
|
84
|
+
if ((res.status ?? 0) !== 0) {
|
|
85
|
+
fail('native build failed for llmswitch-core');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
78
89
|
if (!fs.existsSync(tsc)) fail('TypeScript not installed in root node_modules. Run npm i.');
|
|
79
90
|
if (!fs.existsSync(proj)) {
|
|
80
91
|
console.log('[build-core] llmswitch-core source not found under sharedmodule; skip local core build (依赖包将用于运行/打包)');
|
|
@@ -92,6 +103,7 @@ if (skip === '1' || skip === 'true' || skip === 'yes') {
|
|
|
92
103
|
console.log('[build-core] skip requested by env (ROUTECODEX_SKIP_CORE_BUILD/SKIP_CORE_BUILD)');
|
|
93
104
|
process.exit(0);
|
|
94
105
|
}
|
|
106
|
+
runNativeBuild();
|
|
95
107
|
if (shouldSkipBuild()) {
|
|
96
108
|
console.log('[build-core] dist up-to-date; skip rebuild:', outDir);
|
|
97
109
|
process.exit(0);
|
|
@@ -13,6 +13,30 @@ function isTruthy(value) {
|
|
|
13
13
|
return v === '1' || v === 'true' || v === 'yes' || v === 'on';
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
function isFalsy(value) {
|
|
17
|
+
if (!value) return false;
|
|
18
|
+
const v = String(value).trim().toLowerCase();
|
|
19
|
+
return v === '0' || v === 'false' || v === 'no' || v === 'off';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function resolveIflowHeadlessMode(devMode) {
|
|
23
|
+
if (devMode) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const raw = String(
|
|
27
|
+
process.env.ROUTECODEX_CAMOUFOX_IFLOW_HEADLESS ||
|
|
28
|
+
process.env.RCC_CAMOUFOX_IFLOW_HEADLESS ||
|
|
29
|
+
''
|
|
30
|
+
).trim();
|
|
31
|
+
if (!raw) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (isFalsy(raw)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return isTruthy(raw);
|
|
38
|
+
}
|
|
39
|
+
|
|
16
40
|
function parseArgs(argv) {
|
|
17
41
|
const args = { profile: 'default', url: '', autoMode: '', devMode: false };
|
|
18
42
|
const list = argv.slice(2);
|
|
@@ -260,13 +284,44 @@ function cleanupExistingCamoufox(profileDir) {
|
|
|
260
284
|
if (!profileDir) {
|
|
261
285
|
return;
|
|
262
286
|
}
|
|
263
|
-
|
|
264
|
-
|
|
287
|
+
// 清理已知进程,不使用 pkill 普杀
|
|
288
|
+
// 使用 pgrep 查找匹配的进程,然后逐个验证后终止
|
|
265
289
|
try {
|
|
266
|
-
spawnSync('
|
|
290
|
+
const probe = spawnSync('pgrep', ['-f', profileDir], {
|
|
291
|
+
encoding: 'utf8',
|
|
292
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
if (probe.status === 0 && probe.stdout) {
|
|
296
|
+
const selfPid = process.pid;
|
|
297
|
+
const lines = String(probe.stdout).split(/\r?\n/).filter(Boolean);
|
|
298
|
+
|
|
299
|
+
for (const line of lines) {
|
|
300
|
+
const pid = Number.parseInt(line.trim(), 10);
|
|
301
|
+
if (!Number.isFinite(pid) || pid <= 0 || pid === selfPid) {
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
// 验证进程命令包含 camoufox
|
|
305
|
+
try {
|
|
306
|
+
const cmdProbe = spawnSync('ps', ['-p', String(pid), '-o', 'command='], { encoding: 'utf8' });
|
|
307
|
+
const cmd = String(cmdProbe.stdout || '').toLowerCase();
|
|
308
|
+
if (cmd.includes('camoufox')) {
|
|
309
|
+
console.log(`[camoufox-launch-auth] Stopping known Camoufox process PID ${pid}`);
|
|
310
|
+
try {
|
|
311
|
+
process.kill(pid, 'SIGTERM');
|
|
312
|
+
} catch {
|
|
313
|
+
// 忽略终止失败
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
} catch {
|
|
317
|
+
// 忽略 ps 查询失败
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
267
321
|
} catch {
|
|
268
|
-
//
|
|
322
|
+
// pgrep 可能不存在,忽略
|
|
269
323
|
}
|
|
324
|
+
console.log('[camoufox-launch-auth] Ensuring Camoufox profile is clean before launch...');
|
|
270
325
|
const lockNames = ['.parentlock', 'parent.lock', 'lock'];
|
|
271
326
|
for (const name of lockNames) {
|
|
272
327
|
const target = path.join(profileDir, name);
|
|
@@ -754,7 +809,9 @@ async function runIflowAutoFlow({ url, profileDir, profileId, camoufoxBinary, de
|
|
|
754
809
|
);
|
|
755
810
|
}
|
|
756
811
|
|
|
757
|
-
|
|
812
|
+
// iFlow OAuth has poor reliability under headless mode (often returns anti-bot/garbled pages).
|
|
813
|
+
// Keep default headed to match camo CLI behavior; allow opt-in headless via env.
|
|
814
|
+
const headless = resolveIflowHeadlessMode(devMode);
|
|
758
815
|
const timeoutMs = Number(process.env.ROUTECODEX_CAMOUFOX_IFLOW_TIMEOUT_MS || 300_000);
|
|
759
816
|
console.log(`[camoufox-launch-auth] Launching Camoufox in ${headless ? 'headless' : 'headed'} mode...`);
|
|
760
817
|
cleanupExistingCamoufox(profileDir);
|
|
@@ -1172,6 +1229,8 @@ async function runQwenAutoFlow({ url, profileDir, camoufoxBinary, devMode }) {
|
|
|
1172
1229
|
}
|
|
1173
1230
|
|
|
1174
1231
|
const timeoutMs = Number(process.env.ROUTECODEX_CAMOUFOX_QWEN_TIMEOUT_MS || 120_000);
|
|
1232
|
+
const accountPreference = (process.env.ROUTECODEX_CAMOUFOX_ACCOUNT_TEXT || '').trim();
|
|
1233
|
+
const accountWaitMs = Number(process.env.ROUTECODEX_CAMOUFOX_QWEN_ACCOUNT_TIMEOUT_MS || 15_000);
|
|
1175
1234
|
cleanupExistingCamoufox(profileDir);
|
|
1176
1235
|
const context = await firefox.launchPersistentContext(profileDir, {
|
|
1177
1236
|
executablePath: camoufoxBinary,
|
|
@@ -1231,6 +1290,54 @@ async function runQwenAutoFlow({ url, profileDir, camoufoxBinary, devMode }) {
|
|
|
1231
1290
|
await authPage.waitForLoadState('domcontentloaded', { timeout: pageLoadTimeoutMs }).catch(() => {});
|
|
1232
1291
|
}
|
|
1233
1292
|
|
|
1293
|
+
const qwenAccountSelectors = [
|
|
1294
|
+
'div.yAlK0b[jsname="bQIQze"]',
|
|
1295
|
+
'div.pGzURd[jsname="V1ur5d"]',
|
|
1296
|
+
'span.accountName--ZKlffRBc',
|
|
1297
|
+
'span[class^="accountName--"]',
|
|
1298
|
+
'span[class*="accountName--"]',
|
|
1299
|
+
'.account-item',
|
|
1300
|
+
'[class*="account-item"]',
|
|
1301
|
+
'[class*="accountItem"]',
|
|
1302
|
+
'[data-testid*="account"]',
|
|
1303
|
+
'[data-test*="account"]'
|
|
1304
|
+
];
|
|
1305
|
+
const accountResult = await waitForAnyElementInPages(context, qwenAccountSelectors, accountWaitMs);
|
|
1306
|
+
if (accountResult) {
|
|
1307
|
+
let targetAccount = accountResult.locator.first();
|
|
1308
|
+
if (accountPreference) {
|
|
1309
|
+
const preferred = accountResult.locator.filter({ hasText: accountPreference });
|
|
1310
|
+
if (await preferred.count()) {
|
|
1311
|
+
console.log(`[camoufox-launch-auth] Qwen selecting account matching preference "${accountPreference}"`);
|
|
1312
|
+
targetAccount = preferred.first();
|
|
1313
|
+
} else {
|
|
1314
|
+
console.warn(
|
|
1315
|
+
`[camoufox-launch-auth] Qwen preferred account text "${accountPreference}" not found; falling back to first account`
|
|
1316
|
+
);
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
await targetAccount.scrollIntoViewIfNeeded().catch(() => {});
|
|
1320
|
+
await targetAccount.hover({ force: true }).catch(() => {});
|
|
1321
|
+
const handle = await targetAccount.elementHandle();
|
|
1322
|
+
const accountText = await targetAccount.innerText().catch(() => '');
|
|
1323
|
+
if (handle) {
|
|
1324
|
+
console.log(
|
|
1325
|
+
`[camoufox-launch-auth] Qwen account element detected (${accountText || 'unknown label'}), clicking...`
|
|
1326
|
+
);
|
|
1327
|
+
await accountResult.page.evaluate((el) => {
|
|
1328
|
+
const events = ['mouseenter', 'mouseover', 'mousemove', 'mousedown', 'mouseup', 'click'];
|
|
1329
|
+
for (const type of events) {
|
|
1330
|
+
el.dispatchEvent(new MouseEvent(type, { bubbles: true, cancelable: true, view: window }));
|
|
1331
|
+
}
|
|
1332
|
+
}, handle);
|
|
1333
|
+
} else {
|
|
1334
|
+
await targetAccount.click({ timeout: Math.min(timeoutMs, 10_000) }).catch(() => {});
|
|
1335
|
+
}
|
|
1336
|
+
await accountResult.page.waitForLoadState('domcontentloaded', { timeout: Math.min(timeoutMs, 15_000) }).catch(() => {});
|
|
1337
|
+
} else {
|
|
1338
|
+
console.log('[camoufox-launch-auth] Qwen account selector not detected; proceeding to confirm step...');
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1234
1341
|
console.log('[camoufox-launch-auth] Qwen authorize page loaded, waiting for confirm button...');
|
|
1235
1342
|
const confirmSelector = 'button.qwen-confirm-btn';
|
|
1236
1343
|
const confirmResult = await waitForElementInPages(context, confirmSelector, timeoutMs);
|