@remodex/rmx 1.0.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/AGENTS_INSTALL.md +91 -0
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/assets/architecture.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/claude-code-models.gif +0 -0
- package/assets/codex-app-picker.png +0 -0
- package/bin/ocx.mjs +584 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-CZqebSPQ.css +1 -0
- package/gui/dist/assets/index-CkETtt7P.js +71 -0
- package/gui/dist/favicon.png +0 -0
- package/gui/dist/fonts/google-sans-cyrillic.woff2 +0 -0
- package/gui/dist/fonts/google-sans-latin.woff2 +0 -0
- package/gui/dist/icons.svg +24 -0
- package/gui/dist/index.html +25 -0
- package/gui/dist/logo.png +0 -0
- package/gui/dist/provider-icons/alibaba-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity-color.svg +1 -0
- package/gui/dist/provider-icons/claude-color.svg +1 -0
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -0
- package/gui/dist/provider-icons/cursor-color.svg +2 -0
- package/gui/dist/provider-icons/deepseek-color.svg +1 -0
- package/gui/dist/provider-icons/discord.svg +1 -0
- package/gui/dist/provider-icons/firepass-color.svg +1 -0
- package/gui/dist/provider-icons/fireworks-color.svg +1 -0
- package/gui/dist/provider-icons/gemini-color.svg +1 -0
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
- package/gui/dist/provider-icons/grok.svg +1 -0
- package/gui/dist/provider-icons/groq-color.svg +1 -0
- package/gui/dist/provider-icons/huggingface-color.svg +1 -0
- package/gui/dist/provider-icons/kimi-color.svg +1 -0
- package/gui/dist/provider-icons/kiro-color.svg +15 -0
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
- package/gui/dist/provider-icons/mistral-color.svg +1 -0
- package/gui/dist/provider-icons/moonshot-color.svg +1 -0
- package/gui/dist/provider-icons/nvidia-color.svg +1 -0
- package/gui/dist/provider-icons/ollama-color.svg +1 -0
- package/gui/dist/provider-icons/openai.svg +1 -0
- package/gui/dist/provider-icons/opencode.svg +2 -0
- package/gui/dist/provider-icons/openrouter-color.svg +1 -0
- package/gui/dist/provider-icons/pi.svg +21 -0
- package/gui/dist/provider-icons/qianfan-color.svg +1 -0
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
- package/gui/dist/provider-icons/telegram.svg +1 -0
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/vllm-color.svg +1 -0
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
- package/package.json +118 -0
- package/src/AGENTS.md +28 -0
- package/src/adapters/anthropic-image-guard.ts +251 -0
- package/src/adapters/anthropic-image-normalize.ts +518 -0
- package/src/adapters/anthropic.ts +1205 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +83 -0
- package/src/adapters/client-fingerprint.ts +59 -0
- package/src/adapters/command-code.ts +453 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/cursor-errors.ts +165 -0
- package/src/adapters/cursor/discovery.ts +276 -0
- package/src/adapters/cursor/effort-map.ts +139 -0
- package/src/adapters/cursor/exec-policy.ts +88 -0
- package/src/adapters/cursor/framing.ts +250 -0
- package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
- package/src/adapters/cursor/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +153 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1235 -0
- package/src/adapters/cursor/mcp-config.ts +42 -0
- package/src/adapters/cursor/mcp-manager.ts +333 -0
- package/src/adapters/cursor/message-mapper.ts +49 -0
- package/src/adapters/cursor/native-exec-common.ts +59 -0
- package/src/adapters/cursor/native-exec-desktop.ts +184 -0
- package/src/adapters/cursor/native-exec-fs.ts +332 -0
- package/src/adapters/cursor/native-exec-mcp.ts +153 -0
- package/src/adapters/cursor/native-exec-network.ts +43 -0
- package/src/adapters/cursor/native-exec-shell.ts +548 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +604 -0
- package/src/adapters/cursor/protobuf-events.ts +735 -0
- package/src/adapters/cursor/protobuf-request.ts +719 -0
- package/src/adapters/cursor/request-builder.ts +280 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +621 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +57 -0
- package/src/adapters/cursor/types.ts +59 -0
- package/src/adapters/cursor.ts +196 -0
- package/src/adapters/google-antigravity-replay.ts +520 -0
- package/src/adapters/google-antigravity-wire.ts +140 -0
- package/src/adapters/google-errors.ts +85 -0
- package/src/adapters/google-http.ts +100 -0
- package/src/adapters/google-tool-schema.ts +173 -0
- package/src/adapters/google-truncation.ts +24 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +859 -0
- package/src/adapters/identity.ts +77 -0
- package/src/adapters/image.ts +23 -0
- package/src/adapters/kiro-constants.ts +16 -0
- package/src/adapters/kiro-errors.ts +208 -0
- package/src/adapters/kiro-events.ts +197 -0
- package/src/adapters/kiro-images.ts +129 -0
- package/src/adapters/kiro-retry.ts +312 -0
- package/src/adapters/kiro-thinking.ts +104 -0
- package/src/adapters/kiro-tool-fallback.ts +36 -0
- package/src/adapters/kiro-tools.ts +224 -0
- package/src/adapters/kiro-truncation.ts +33 -0
- package/src/adapters/kiro-wire.ts +129 -0
- package/src/adapters/kiro.ts +1924 -0
- package/src/adapters/mimo-free.ts +263 -0
- package/src/adapters/openai-chat.ts +1265 -0
- package/src/adapters/openai-responses.ts +1309 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-catalog-nudge.ts +71 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/android-remote/assets.ts +218 -0
- package/src/android-remote/attachments.ts +168 -0
- package/src/android-remote/auth.ts +237 -0
- package/src/android-remote/cloudflare-provisioning.ts +409 -0
- package/src/android-remote/cloudflare-secret.ts +106 -0
- package/src/android-remote/cloudflare-tunnel.ts +488 -0
- package/src/android-remote/cloudflared.ts +286 -0
- package/src/android-remote/codex-app-server.ts +565 -0
- package/src/android-remote/desktop-history-page.ts +936 -0
- package/src/android-remote/desktop-ipc.ts +3643 -0
- package/src/android-remote/desktop-ownership-store.ts +98 -0
- package/src/android-remote/desktop-project-registration.ts +129 -0
- package/src/android-remote/desktop-session-stream.ts +1110 -0
- package/src/android-remote/desktop-workspace-state.ts +443 -0
- package/src/android-remote/file-change-parser.ts +112 -0
- package/src/android-remote/gateway.ts +9108 -0
- package/src/android-remote/mutation-store.ts +299 -0
- package/src/android-remote/projection.ts +1780 -0
- package/src/android-remote/queued-turn-store.ts +248 -0
- package/src/android-remote/session-command-recovery.ts +1384 -0
- package/src/android-remote/store.ts +466 -0
- package/src/android-remote/thread-reconciliation.ts +133 -0
- package/src/android-remote/thread-source-paths.ts +307 -0
- package/src/android-remote/thread-stream.ts +546 -0
- package/src/android-remote/turn-activity.ts +235 -0
- package/src/android-remote/user-message-identity.ts +94 -0
- package/src/bridge.ts +1793 -0
- package/src/chat/inbound.ts +295 -0
- package/src/chat/outbound.ts +821 -0
- package/src/claude/agents-inject.ts +267 -0
- package/src/claude/alias.ts +149 -0
- package/src/claude/auth-detect.ts +229 -0
- package/src/claude/auth-mode-migration.ts +32 -0
- package/src/claude/auth-mode.ts +62 -0
- package/src/claude/context-windows.ts +189 -0
- package/src/claude/desktop-3p-guard.ts +35 -0
- package/src/claude/desktop-3p-paths.ts +84 -0
- package/src/claude/desktop-3p.ts +601 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +70 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +519 -0
- package/src/claude/model-info.ts +154 -0
- package/src/claude/outbound.ts +898 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +296 -0
- package/src/cli/account-auth.ts +250 -0
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +476 -0
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +297 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +184 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-desktop.ts +211 -0
- package/src/cli/claude.ts +302 -0
- package/src/cli/codex-shim-autorestore.ts +45 -0
- package/src/cli/codex-shim-readiness.ts +69 -0
- package/src/cli/combo.ts +124 -0
- package/src/cli/config-command.ts +183 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/desktop-first-run.ts +25 -0
- package/src/cli/doctor.ts +1022 -0
- package/src/cli/export-command.ts +201 -0
- package/src/cli/help.ts +370 -0
- package/src/cli/index.ts +1565 -0
- package/src/cli/init.ts +224 -0
- package/src/cli/integrations.ts +225 -0
- package/src/cli/interactive-confirm.ts +133 -0
- package/src/cli/internal-dispatch.ts +35 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/models-runtime.ts +224 -0
- package/src/cli/models.ts +340 -0
- package/src/cli/observe.ts +170 -0
- package/src/cli/opencode.ts +587 -0
- package/src/cli/provider-runtime.ts +179 -0
- package/src/cli/provider.ts +476 -0
- package/src/cli/ready.ts +301 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +328 -0
- package/src/cli/star-prompt.ts +211 -0
- package/src/cli/status-oauth.ts +78 -0
- package/src/cli/status.ts +321 -0
- package/src/cli/system-command.ts +196 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +205 -0
- package/src/cli/v2.ts +200 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +1109 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +34 -0
- package/src/codex/account-lifecycle.ts +172 -0
- package/src/codex/account-namespace-match.ts +63 -0
- package/src/codex/account-namespaces.ts +195 -0
- package/src/codex/account-pause.ts +20 -0
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-runtime-state.ts +31 -0
- package/src/codex/account-store.ts +517 -0
- package/src/codex/account-usability.ts +40 -0
- package/src/codex/admission.ts +263 -0
- package/src/codex/app-server-processes.ts +799 -0
- package/src/codex/auth-api.ts +2098 -0
- package/src/codex/auth-collision.ts +107 -0
- package/src/codex/auth-context.ts +480 -0
- package/src/codex/autostart-health.ts +156 -0
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +471 -0
- package/src/codex/catalog/bundled.ts +533 -0
- package/src/codex/catalog/effort.ts +432 -0
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +287 -0
- package/src/codex/catalog/native-models.ts +7 -0
- package/src/codex/catalog/parsing.ts +503 -0
- package/src/codex/catalog/provider-fetch.ts +2267 -0
- package/src/codex/catalog/sync.ts +1606 -0
- package/src/codex/catalog-admission.ts +197 -0
- package/src/codex/catalog-refresh-status.ts +87 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +15 -0
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +593 -0
- package/src/codex/convergence.ts +580 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/data/upstream-models.json +830 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-client-processes.ts +521 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +1091 -0
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +347 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +115 -0
- package/src/codex/history-provider.ts +1075 -0
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +204 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject-coordination.ts +257 -0
- package/src/codex/inject.ts +1857 -0
- package/src/codex/injected-marker.ts +79 -0
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +105 -0
- package/src/codex/journal.ts +172 -0
- package/src/codex/main-account-cache.ts +56 -0
- package/src/codex/main-account.ts +40 -0
- package/src/codex/management-convergence.ts +114 -0
- package/src/codex/model-cache.ts +267 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +167 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +348 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +691 -0
- package/src/codex/paths.ts +78 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +295 -0
- package/src/codex/project-config-warnings.ts +426 -0
- package/src/codex/prompt-journal.ts +311 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/provider-adoption.ts +242 -0
- package/src/codex/quota-rejection.ts +224 -0
- package/src/codex/quota.ts +494 -0
- package/src/codex/refresh.ts +60 -0
- package/src/codex/routing.ts +1855 -0
- package/src/codex/runtime.ts +659 -0
- package/src/codex/shim.ts +1215 -0
- package/src/codex/subagent-defaults.ts +557 -0
- package/src/codex/subagent-model-fallback.ts +560 -0
- package/src/codex/sync.ts +238 -0
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +374 -0
- package/src/codex/warmup.ts +192 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +140 -0
- package/src/combos/index.ts +44 -0
- package/src/combos/request.ts +64 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +392 -0
- package/src/config.ts +3270 -0
- package/src/generated/model-metadata.ts +144 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +540 -0
- package/src/grok/inspect.ts +45 -0
- package/src/grok/status.ts +127 -0
- package/src/grok/sync.ts +66 -0
- package/src/images/artifacts.ts +516 -0
- package/src/images/fulfill-video.ts +163 -0
- package/src/images/fulfill.ts +149 -0
- package/src/images/index.ts +4 -0
- package/src/images/loop.ts +922 -0
- package/src/images/plan.ts +133 -0
- package/src/images/synthetic-tool.ts +133 -0
- package/src/images/types.ts +41 -0
- package/src/images/xai-client.ts +141 -0
- package/src/images/xai-video-client.ts +163 -0
- package/src/index.ts +22 -0
- package/src/integrations/config-io.ts +151 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +108 -0
- package/src/integrations/serialize.ts +235 -0
- package/src/integrations/state.ts +290 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer.ts +492 -0
- package/src/lib/abort.ts +146 -0
- package/src/lib/admin-secrets.ts +25 -0
- package/src/lib/admission.ts +83 -0
- package/src/lib/app-owned-memory-stores.ts +173 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +242 -0
- package/src/lib/bun-binary-validator.d.mts +3 -0
- package/src/lib/bun-binary-validator.mjs +18 -0
- package/src/lib/bun-runtime.ts +184 -0
- package/src/lib/bun-stream-caps.ts +127 -0
- package/src/lib/config-ownership.ts +438 -0
- package/src/lib/crash-guard.ts +344 -0
- package/src/lib/debug-log-buffer.ts +83 -0
- package/src/lib/debug-settings.ts +108 -0
- package/src/lib/debug.ts +31 -0
- package/src/lib/destination-policy.ts +316 -0
- package/src/lib/errors.ts +364 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/open-url.ts +25 -0
- package/src/lib/pinned-http.ts +182 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +168 -0
- package/src/lib/provider-environment.ts +470 -0
- package/src/lib/provider-outbound.ts +203 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +510 -0
- package/src/lib/remodex-home.ts +616 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/service-secrets.ts +178 -0
- package/src/lib/shadow-call.ts +54 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +364 -0
- package/src/lib/state-store-registrations.ts +109 -0
- package/src/lib/state-store-sweeper.ts +184 -0
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/test-home-guard.ts +98 -0
- package/src/lib/token-estimate.ts +69 -0
- package/src/lib/translator-budget.ts +366 -0
- package/src/lib/upstream-reachability.ts +91 -0
- package/src/lib/upstream-retry.ts +508 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-elevation.ts +705 -0
- package/src/lib/windows-secret-acl.ts +817 -0
- package/src/lib/windows-user-principal.ts +283 -0
- package/src/lib/winsw.ts +402 -0
- package/src/model-sources.ts +73 -0
- package/src/oauth/anthropic-routing.ts +594 -0
- package/src/oauth/anthropic.ts +177 -0
- package/src/oauth/callback-server.ts +294 -0
- package/src/oauth/chatgpt.ts +150 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +231 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +230 -0
- package/src/oauth/health.ts +443 -0
- package/src/oauth/index.ts +1280 -0
- package/src/oauth/key-providers.ts +128 -0
- package/src/oauth/kimi.ts +213 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +621 -0
- package/src/oauth/local-token-detect.ts +121 -0
- package/src/oauth/log.ts +48 -0
- package/src/oauth/login-cli.ts +163 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +655 -0
- package/src/oauth/token-guardian.ts +309 -0
- package/src/oauth/types.ts +62 -0
- package/src/oauth/xai.ts +241 -0
- package/src/providers/alibaba-region-backup.ts +75 -0
- package/src/providers/alibaba-region-migration.ts +156 -0
- package/src/providers/alibaba-region-startup.ts +36 -0
- package/src/providers/antigravity-models.ts +317 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +64 -0
- package/src/providers/codex-capacity.ts +288 -0
- package/src/providers/command-code-efforts.ts +85 -0
- package/src/providers/context-cap.ts +73 -0
- package/src/providers/derive.ts +451 -0
- package/src/providers/free-directory.ts +187 -0
- package/src/providers/github-copilot-transport.ts +56 -0
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +271 -0
- package/src/providers/kiro-models.ts +67 -0
- package/src/providers/label.ts +19 -0
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +361 -0
- package/src/providers/openai-sidecar.ts +235 -0
- package/src/providers/openai-tier-startup.ts +27 -0
- package/src/providers/openai-tiers.ts +301 -0
- package/src/providers/openai-virtual-models.ts +83 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +179 -0
- package/src/providers/quota.ts +1942 -0
- package/src/providers/reasoning-capabilities.ts +336 -0
- package/src/providers/registry.ts +2375 -0
- package/src/providers/slug-codec.ts +74 -0
- package/src/providers/xai-transport.ts +149 -0
- package/src/reasoning-effort.ts +243 -0
- package/src/responses/compaction.ts +124 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/parser.ts +714 -0
- package/src/responses/reasoning-envelope.ts +60 -0
- package/src/responses/reasoning-replay-cache.ts +106 -0
- package/src/responses/schema.ts +159 -0
- package/src/responses/spill-store.ts +431 -0
- package/src/responses/state.ts +1039 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/router.ts +802 -0
- package/src/routing/analytics.ts +377 -0
- package/src/routing/capability.ts +205 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +444 -0
- package/src/routing/health.ts +401 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +424 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +686 -0
- package/src/server/adapter-resolve.ts +83 -0
- package/src/server/auth-cors.ts +606 -0
- package/src/server/chat-completions.ts +379 -0
- package/src/server/claude-messages.ts +980 -0
- package/src/server/effort-policy.ts +251 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +152 -0
- package/src/server/image-retry.ts +42 -0
- package/src/server/images.ts +485 -0
- package/src/server/index.ts +1633 -0
- package/src/server/lifecycle.ts +482 -0
- package/src/server/live.ts +609 -0
- package/src/server/management/agent-settings-routes.ts +1180 -0
- package/src/server/management/android-remote-routes.ts +390 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +167 -0
- package/src/server/management/body.ts +35 -0
- package/src/server/management/combo-routes.ts +244 -0
- package/src/server/management/config-routes.ts +602 -0
- package/src/server/management/context.ts +88 -0
- package/src/server/management/integration-routes.ts +538 -0
- package/src/server/management/logs-usage-routes.ts +516 -0
- package/src/server/management/model-routes.ts +519 -0
- package/src/server/management/model-rows.ts +143 -0
- package/src/server/management/native-integration-routes.ts +781 -0
- package/src/server/management/oauth-account-routes.ts +573 -0
- package/src/server/management/provider-routes.ts +781 -0
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +384 -0
- package/src/server/management/shared.ts +277 -0
- package/src/server/management/sidebar-routes.ts +106 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +433 -0
- package/src/server/management/system-routes.ts +141 -0
- package/src/server/management/usage-summary-cache.ts +86 -0
- package/src/server/management-api.ts +269 -0
- package/src/server/management-auth.ts +353 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +156 -0
- package/src/server/proxy-liveness.ts +326 -0
- package/src/server/proxy-stop.ts +92 -0
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +353 -0
- package/src/server/relay.ts +1179 -0
- package/src/server/request-decompress.ts +132 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1072 -0
- package/src/server/responses/collaboration.ts +409 -0
- package/src/server/responses/compact.ts +710 -0
- package/src/server/responses/core.ts +3561 -0
- package/src/server/responses/encrypted-payload.ts +308 -0
- package/src/server/responses/fetch-helpers.ts +171 -0
- package/src/server/responses/passthrough-error.ts +78 -0
- package/src/server/responses/policy-fallback.ts +152 -0
- package/src/server/responses/terminal-guard.ts +230 -0
- package/src/server/responses/upstream-error.ts +48 -0
- package/src/server/responses-image-gen-repair.ts +132 -0
- package/src/server/responses-item-id-repair.ts +272 -0
- package/src/server/responses-json-events.ts +52 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses.ts +10 -0
- package/src/server/search.ts +181 -0
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +263 -0
- package/src/server/startup-action-control.ts +308 -0
- package/src/server/startup-health-cache.ts +119 -0
- package/src/server/system-env.ts +418 -0
- package/src/server/windows-tcp-drop.ts +184 -0
- package/src/server/windows-tray-control.ts +41 -0
- package/src/server/ws-bridge.ts +470 -0
- package/src/service-manager-probe.ts +824 -0
- package/src/service.ts +3011 -0
- package/src/stall-timeout.ts +20 -0
- package/src/storage/cleanup-job.ts +57 -0
- package/src/storage/cleanup.ts +3085 -0
- package/src/storage/policy-job.ts +457 -0
- package/src/storage/policy-scheduler.ts +40 -0
- package/src/storage/policy-worker.ts +59 -0
- package/src/storage/policy.ts +527 -0
- package/src/storage/restore-job.ts +299 -0
- package/src/storage/restore-worker.ts +58 -0
- package/src/storage/scanner.ts +238 -0
- package/src/storage/storage-mutation-coordinator.ts +139 -0
- package/src/storage/worker-lifecycle.ts +215 -0
- package/src/tray/assets/opencodex-tray-offline.ico +0 -0
- package/src/tray/assets/opencodex-tray-online.ico +0 -0
- package/src/tray/assets/opencodex-tray-warning.ico +0 -0
- package/src/tray/assets/opencodex-tray.png +0 -0
- package/src/tray/windows-tray.ps1 +364 -0
- package/src/tray/windows.ts +738 -0
- package/src/types.ts +1531 -0
- package/src/update/badge.ts +72 -0
- package/src/update/desktop-release.ts +1620 -0
- package/src/update/index.ts +402 -0
- package/src/update/job.ts +1906 -0
- package/src/update/notify.ts +261 -0
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/npm-invocation.d.mts +23 -0
- package/src/update/npm-invocation.mjs +94 -0
- package/src/update/tray-update-plan.d.mts +18 -0
- package/src/update/tray-update-plan.mjs +38 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +283 -0
- package/src/usage/log.ts +695 -0
- package/src/usage/summary.ts +585 -0
- package/src/usage/totals.ts +14 -0
- package/src/vision/anthropic-describe.ts +185 -0
- package/src/vision/describe.ts +127 -0
- package/src/vision/index.ts +558 -0
- package/src/vision/reasoning.ts +55 -0
- package/src/web-search/anthropic-executor.ts +189 -0
- package/src/web-search/executor.ts +105 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/index.ts +196 -0
- package/src/web-search/loop.ts +791 -0
- package/src/web-search/parse.ts +235 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/synthetic-tool.ts +47 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { clearCodexAccountPin } from "../codex/account-priority";
|
|
3
|
+
import { getConfigPath, readConfigDiagnostics, saveConfig, validateConfigCandidate } from "../config";
|
|
4
|
+
import { VISION_REASONING_EFFORTS, isVisionReasoningEffort } from "../reasoning-effort";
|
|
5
|
+
import type { OcxConfig } from "../types";
|
|
6
|
+
import { normalizeVisionReasoningForModel } from "../vision/reasoning";
|
|
7
|
+
import { CliUsageError, printData, rejectArgs, runCliAction, takeFlag } from "./runtime-api";
|
|
8
|
+
|
|
9
|
+
const USAGE = `Usage:
|
|
10
|
+
rmx config [show] [--json] [--source]
|
|
11
|
+
rmx config get <dot.path> [--json]
|
|
12
|
+
rmx config set <dot.path> <json-or-string> [--json]
|
|
13
|
+
rmx config unset <dot.path> [--json]
|
|
14
|
+
rmx config validate [path|-] [--json]
|
|
15
|
+
rmx config export <path|->
|
|
16
|
+
rmx config import <path|-> --yes [--json]`;
|
|
17
|
+
|
|
18
|
+
const SECRET_KEYS = /^(apiKey|key|accessToken|refreshToken|idToken|token|password|clientSecret)$/i;
|
|
19
|
+
const BLOCKED_SEGMENTS = new Set(["__proto__", "prototype", "constructor"]);
|
|
20
|
+
|
|
21
|
+
function redact(value: unknown, key = ""): unknown {
|
|
22
|
+
if (SECRET_KEYS.test(key) && typeof value === "string") return value ? "********" : value;
|
|
23
|
+
if (Array.isArray(value)) return value.map(item => redact(item));
|
|
24
|
+
if (value && typeof value === "object") {
|
|
25
|
+
return Object.fromEntries(Object.entries(value as Record<string, unknown>).map(([childKey, child]) => [childKey, redact(child, childKey)]));
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function pathSegments(path: string): string[] {
|
|
31
|
+
const segments = path.split(".").map(part => part.trim()).filter(Boolean);
|
|
32
|
+
if (segments.length === 0 || segments.some(part => BLOCKED_SEGMENTS.has(part))) throw new CliUsageError("invalid config path", USAGE);
|
|
33
|
+
return segments;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function getPath(root: unknown, path: string): unknown {
|
|
37
|
+
let current = root;
|
|
38
|
+
for (const segment of pathSegments(path)) {
|
|
39
|
+
if (!current || typeof current !== "object" || !Object.hasOwn(current, segment)) throw new CliUsageError(`config path not found: ${path}`);
|
|
40
|
+
current = (current as Record<string, unknown>)[segment];
|
|
41
|
+
}
|
|
42
|
+
return current;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function setPath(root: Record<string, unknown>, path: string, value: unknown, remove = false): void {
|
|
46
|
+
const segments = pathSegments(path);
|
|
47
|
+
let current = root;
|
|
48
|
+
for (const segment of segments.slice(0, -1)) {
|
|
49
|
+
const next = current[segment];
|
|
50
|
+
if (!next || typeof next !== "object" || Array.isArray(next)) throw new CliUsageError(`config parent path not found: ${segment}`, USAGE);
|
|
51
|
+
current = next as Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
const leaf = segments.at(-1)!;
|
|
54
|
+
if (remove && !Object.hasOwn(current, leaf)) throw new CliUsageError(`config path not found: ${path}`);
|
|
55
|
+
if (remove) delete current[leaf];
|
|
56
|
+
else current[leaf] = value;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function parseValue(raw: string): unknown {
|
|
60
|
+
try { return JSON.parse(raw); }
|
|
61
|
+
catch { return raw; }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function loadInput(path: string): unknown {
|
|
65
|
+
const raw = path === "-" ? readFileSync(0, "utf8") : readFileSync(path, "utf8");
|
|
66
|
+
try { return JSON.parse(raw); }
|
|
67
|
+
catch { throw new CliUsageError(`invalid JSON in ${path}`); }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function visionReasoningError(value: unknown): string | null {
|
|
71
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
72
|
+
const vision = (value as Record<string, unknown>).visionSidecar;
|
|
73
|
+
if (!vision || typeof vision !== "object" || Array.isArray(vision)) return null;
|
|
74
|
+
const reasoning = (vision as Record<string, unknown>).reasoning;
|
|
75
|
+
if (reasoning === undefined || isVisionReasoningEffort(reasoning)) return null;
|
|
76
|
+
return `schema_invalid: visionSidecar.reasoning: must be one of ${VISION_REASONING_EFFORTS.join(", ")}`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function validateCandidate(value: unknown): ReturnType<typeof validateConfigCandidate> {
|
|
80
|
+
const error = visionReasoningError(value);
|
|
81
|
+
return error ? { ok: false, error } : validateConfigCandidate(value);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function normalizeVisionConfig(config: OcxConfig): OcxConfig {
|
|
85
|
+
const vision = config.visionSidecar;
|
|
86
|
+
if (!vision || vision.reasoning === undefined) return config;
|
|
87
|
+
// Keep CLI import/set semantics aligned with the execution path: an omitted or blank model means
|
|
88
|
+
// the bounded OpenAI vision default, gpt-5.4-mini, not the Dashboard's web-search default.
|
|
89
|
+
const model = vision.model || "gpt-5.4-mini";
|
|
90
|
+
const normalized = normalizeVisionReasoningForModel(model, vision.reasoning);
|
|
91
|
+
if (normalized === undefined) delete vision.reasoning;
|
|
92
|
+
else vision.reasoning = normalized;
|
|
93
|
+
return config;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function validate(value: unknown): OcxConfig {
|
|
97
|
+
const result = validateCandidate(value);
|
|
98
|
+
if (!result.ok) throw new CliUsageError(result.error);
|
|
99
|
+
return normalizeVisionConfig(result.config);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function handleConfigCommand(argv: string[]): Promise<number> {
|
|
103
|
+
return runCliAction(async () => {
|
|
104
|
+
const args = [...argv];
|
|
105
|
+
const action = (args.shift() ?? "show").toLowerCase();
|
|
106
|
+
const wantsJson = takeFlag(args, "--json");
|
|
107
|
+
if (action === "show") {
|
|
108
|
+
const source = takeFlag(args, "--source");
|
|
109
|
+
rejectArgs(args, USAGE);
|
|
110
|
+
const diagnostics = readConfigDiagnostics();
|
|
111
|
+
const config = redact(diagnostics.config);
|
|
112
|
+
const result = source ? { config, source: diagnostics.source, error: diagnostics.error, warnings: diagnostics.warnings ?? [] } : config;
|
|
113
|
+
printData(result, true);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (action === "get") {
|
|
117
|
+
const path = args.shift();
|
|
118
|
+
if (!path) throw new CliUsageError("config path is required", USAGE);
|
|
119
|
+
rejectArgs(args, USAGE);
|
|
120
|
+
const value = redact(getPath(readConfigDiagnostics().config, path), path.split(".").at(-1));
|
|
121
|
+
if (wantsJson || typeof value === "object") console.log(JSON.stringify(value, null, 2));
|
|
122
|
+
else console.log(String(value));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (action === "set" || action === "unset") {
|
|
126
|
+
const path = args.shift();
|
|
127
|
+
const raw = action === "set" ? args.shift() : undefined;
|
|
128
|
+
if (!path || (action === "set" && raw === undefined)) throw new CliUsageError("config path and value are required", USAGE);
|
|
129
|
+
rejectArgs(args, USAGE);
|
|
130
|
+
const candidate = structuredClone(readConfigDiagnostics().config) as unknown as Record<string, unknown>;
|
|
131
|
+
setPath(candidate, path, raw === undefined ? undefined : parseValue(raw), action === "unset");
|
|
132
|
+
const config = validate(candidate);
|
|
133
|
+
const savedValue = action === "unset" ? null : getPath(config, path);
|
|
134
|
+
// Setting the order here is the operator restating it, exactly as through
|
|
135
|
+
// `rmx account priority` or the management route, so it releases the manual pin
|
|
136
|
+
// for the same reason those do: a pin made before any order existed would
|
|
137
|
+
// otherwise outrank every order set afterwards, capping the pool at the pinned
|
|
138
|
+
// account's tier with nothing on any surface explaining why. `import` is
|
|
139
|
+
// deliberately not covered — that file supplies its own pin, so there is no
|
|
140
|
+
// stale one to release.
|
|
141
|
+
if (pathSegments(path)[0] === "codexAccountPriorities") clearCodexAccountPin(config);
|
|
142
|
+
saveConfig(config);
|
|
143
|
+
printData({ ok: true, path, value: redact(savedValue, path.split(".").at(-1)) }, wantsJson,
|
|
144
|
+
[`${action === "unset" ? "Unset" : "Set"} ${path}.`]);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (action === "validate") {
|
|
148
|
+
const path = args.shift();
|
|
149
|
+
rejectArgs(args, USAGE);
|
|
150
|
+
const result = path ? validateCandidate(loadInput(path)) : (() => {
|
|
151
|
+
const diagnostics = readConfigDiagnostics();
|
|
152
|
+
if (diagnostics.error) return { ok: false as const, error: diagnostics.error };
|
|
153
|
+
return validateCandidate(diagnostics.config);
|
|
154
|
+
})();
|
|
155
|
+
printData(result.ok ? { ok: true, source: path ?? getConfigPath() } : result, wantsJson,
|
|
156
|
+
[result.ok ? "Config is valid." : `Config is invalid: ${result.error}`]);
|
|
157
|
+
if (!result.ok) process.exitCode = 1;
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (action === "export") {
|
|
161
|
+
const path = args.shift();
|
|
162
|
+
if (!path) throw new CliUsageError("export path is required", USAGE);
|
|
163
|
+
rejectArgs(args, USAGE);
|
|
164
|
+
const content = `${JSON.stringify(readConfigDiagnostics().config, null, 2)}\n`;
|
|
165
|
+
if (path === "-") process.stdout.write(content);
|
|
166
|
+
else { writeFileSync(path, content, { encoding: "utf8", mode: 0o600 }); console.log(`Exported config to ${path}.`); }
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (action === "import") {
|
|
170
|
+
const path = args.shift();
|
|
171
|
+
const yes = takeFlag(args, "--yes");
|
|
172
|
+
if (!path) throw new CliUsageError("import path is required", USAGE);
|
|
173
|
+
if (!yes) throw new CliUsageError("import requires --yes", USAGE);
|
|
174
|
+
rejectArgs(args, USAGE);
|
|
175
|
+
saveConfig(validate(loadInput(path)));
|
|
176
|
+
printData({ ok: true, source: path }, wantsJson, [`Imported config from ${path}. Restart or run rmx sync if needed.`]);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
throw new CliUsageError(`unknown config command ${action}`, USAGE);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export const CONFIG_USAGE = USAGE;
|
package/src/cli/debug.ts
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { findLiveProxy, probeHostname } from "../server/proxy-liveness";
|
|
2
|
+
import { DEBUG_ENV, type DebugSettingsView } from "../lib/debug-settings";
|
|
3
|
+
import { runningProxyUpdateHeaders } from "../oauth/login-cli";
|
|
4
|
+
|
|
5
|
+
type DebugScope = "provider" | "usage" | "injection" | "claude";
|
|
6
|
+
|
|
7
|
+
async function requireLiveProxy() {
|
|
8
|
+
const live = await findLiveProxy();
|
|
9
|
+
if (!live) {
|
|
10
|
+
console.error("Proxy is not running. Start it with: rmx start");
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
return live;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function fetchDebugSettings(): Promise<DebugSettingsView> {
|
|
17
|
+
const live = await requireLiveProxy();
|
|
18
|
+
try {
|
|
19
|
+
const res = await fetch(`http://${probeHostname(live.hostname)}:${live.port}/api/debug`, {
|
|
20
|
+
headers: runningProxyUpdateHeaders(),
|
|
21
|
+
});
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
console.error(`Failed to read debug settings (${res.status})`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
return await res.json() as DebugSettingsView;
|
|
27
|
+
} catch (err) {
|
|
28
|
+
console.error(`Proxy is running but /api/debug is unreachable: ${err instanceof Error ? err.message : String(err)}`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function putDebugSettings(body: Record<string, unknown>): Promise<DebugSettingsView> {
|
|
34
|
+
const live = await requireLiveProxy();
|
|
35
|
+
const res = await fetch(`http://${probeHostname(live.hostname)}:${live.port}/api/debug`, {
|
|
36
|
+
method: "PUT",
|
|
37
|
+
headers: runningProxyUpdateHeaders(),
|
|
38
|
+
body: JSON.stringify(body),
|
|
39
|
+
});
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
const text = await res.text().catch(() => "");
|
|
42
|
+
console.error(`Failed to update debug settings (${res.status})${text ? `: ${text.slice(0, 200)}` : ""}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
return await res.json() as DebugSettingsView;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function printScopeStatus(scope: DebugScope, view: DebugSettingsView): void {
|
|
49
|
+
if (scope === "provider") {
|
|
50
|
+
console.log(`Provider debug: ${view.enabled ? "ON" : "off"}`);
|
|
51
|
+
console.log(` env=${view.env.debug ? "on" : "off"}, runtime=${view.runtimeOverride.debug === undefined ? "env/default" : view.runtimeOverride.debug ? "on" : "off"}`);
|
|
52
|
+
console.log(" Tail: rmx debug provider logs [-f]");
|
|
53
|
+
} else if (scope === "usage") {
|
|
54
|
+
console.log(`Usage debug: ${view.usage ? "ON" : "off"}`);
|
|
55
|
+
console.log(` env=${view.env.usage ? "on" : "off"}, runtime=${view.runtimeOverride.usage === undefined ? "env/default" : view.runtimeOverride.usage ? "on" : "off"}`);
|
|
56
|
+
console.log(" Tail: rmx debug usage logs [-f] (via running proxy API)");
|
|
57
|
+
} else if (scope === "injection") {
|
|
58
|
+
console.log(`Injection debug: ${view.injection ? "ON" : "off"}`);
|
|
59
|
+
console.log(` env=${view.env.injection ? "on" : "off"}, runtime=${view.runtimeOverride.injection === undefined ? "env/default" : view.runtimeOverride.injection ? "on" : "off"}`);
|
|
60
|
+
console.log(" Lines appear on the proxy console when multi-agent guidance is injected.");
|
|
61
|
+
} else {
|
|
62
|
+
console.log(`Claude inbound debug: ${view.claude ? "ON" : "off"}`);
|
|
63
|
+
console.log(` env=${view.env.claude ? "on" : "off"}, runtime=${view.runtimeOverride.claude === undefined ? "env/default" : view.runtimeOverride.claude ? "on" : "off"}`);
|
|
64
|
+
console.log(" View: rmx observe claude-inbound");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function envDebugEnabled(): boolean {
|
|
69
|
+
return process.env.OCX_DEBUG === "1"
|
|
70
|
+
|| process.env.OCX_DEBUG_FRAMES === "1";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function printProviderLogs(follow: boolean): Promise<void> {
|
|
74
|
+
const live = await requireLiveProxy();
|
|
75
|
+
const base = `http://${probeHostname(live.hostname)}:${live.port}/api/debug/logs`;
|
|
76
|
+
|
|
77
|
+
let after = 0;
|
|
78
|
+
try {
|
|
79
|
+
const res = await fetch(`${base}?limit=500`, { headers: runningProxyUpdateHeaders() });
|
|
80
|
+
if (!res.ok) {
|
|
81
|
+
console.error(`Failed to read debug logs (${res.status})`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
const entries = await res.json() as { seq: number; line: string }[];
|
|
85
|
+
for (const entry of entries) console.log(entry.line);
|
|
86
|
+
if (entries.length > 0) after = entries[entries.length - 1]!.seq;
|
|
87
|
+
} catch (err) {
|
|
88
|
+
console.error(`Failed to read debug logs: ${err instanceof Error ? err.message : String(err)}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!follow) return;
|
|
93
|
+
|
|
94
|
+
while (true) {
|
|
95
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
96
|
+
try {
|
|
97
|
+
const res = await fetch(`${base}?after=${after}&limit=500`, { headers: runningProxyUpdateHeaders() });
|
|
98
|
+
if (!res.ok) continue;
|
|
99
|
+
const entries = await res.json() as { seq: number; line: string }[];
|
|
100
|
+
for (const entry of entries) console.log(entry.line);
|
|
101
|
+
if (entries.length > 0) after = entries[entries.length - 1]!.seq;
|
|
102
|
+
} catch {
|
|
103
|
+
/* keep following */
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function printUsageLogs(follow: boolean): Promise<void> {
|
|
109
|
+
const live = await requireLiveProxy();
|
|
110
|
+
const base = `http://${probeHostname(live.hostname)}:${live.port}/api/debug/usage-logs`;
|
|
111
|
+
|
|
112
|
+
let after = 0;
|
|
113
|
+
try {
|
|
114
|
+
const res = await fetch(`${base}?limit=500`, { headers: runningProxyUpdateHeaders() });
|
|
115
|
+
if (!res.ok) {
|
|
116
|
+
console.error(`Failed to read usage debug logs (${res.status})`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
const entries = await res.json() as { seq: number; line: string }[];
|
|
120
|
+
for (const entry of entries) console.log(entry.line);
|
|
121
|
+
if (entries.length === 0) console.log("(empty — enable with: rmx debug usage on)");
|
|
122
|
+
if (entries.length > 0) after = entries[entries.length - 1]!.seq;
|
|
123
|
+
} catch (err) {
|
|
124
|
+
console.error(`Failed to read usage debug logs: ${err instanceof Error ? err.message : String(err)}`);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (!follow) return;
|
|
129
|
+
|
|
130
|
+
while (true) {
|
|
131
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
132
|
+
try {
|
|
133
|
+
const res = await fetch(`${base}?after=${after}&limit=500`, { headers: runningProxyUpdateHeaders() });
|
|
134
|
+
if (!res.ok) continue;
|
|
135
|
+
const entries = await res.json() as { seq: number; line: string }[];
|
|
136
|
+
for (const entry of entries) console.log(entry.line);
|
|
137
|
+
if (entries.length > 0) after = entries[entries.length - 1]!.seq;
|
|
138
|
+
} catch {
|
|
139
|
+
/* keep following */
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async function handleScopeCommand(scope: DebugScope, actionArgv: string[]): Promise<void> {
|
|
145
|
+
const action = (actionArgv[0] ?? "status").trim().toLowerCase();
|
|
146
|
+
|
|
147
|
+
if (action === "on" || action === "off") {
|
|
148
|
+
const enabled = action === "on";
|
|
149
|
+
const body = scope === "provider" ? { debug: enabled }
|
|
150
|
+
: scope === "usage" ? { usage: enabled }
|
|
151
|
+
: scope === "injection" ? { injection: enabled }
|
|
152
|
+
: { claude: enabled };
|
|
153
|
+
printScopeStatus(scope, await putDebugSettings(body));
|
|
154
|
+
console.log(`\n${scope} debug is now ${enabled ? "enabled" : "disabled"}.`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (action === "status") {
|
|
159
|
+
printScopeStatus(scope, await fetchDebugSettings());
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (action === "reset") {
|
|
164
|
+
const resetKey = scope === "provider" ? "provider" : scope;
|
|
165
|
+
printScopeStatus(scope, await putDebugSettings({ reset: resetKey }));
|
|
166
|
+
console.log(`\nRuntime override cleared for ${scope}; effective value follows env again.`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (action === "logs") {
|
|
171
|
+
if (scope === "injection" || scope === "claude") {
|
|
172
|
+
console.error(scope === "claude"
|
|
173
|
+
? "Use: rmx observe claude-inbound"
|
|
174
|
+
: "Injection debug has no buffered log stream; use: rmx observe injection");
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const follow = actionArgv.slice(1).some(arg => arg === "-f" || arg === "--follow");
|
|
178
|
+
if (scope === "provider") await printProviderLogs(follow);
|
|
179
|
+
else await printUsageLogs(follow);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
console.error(scope === "injection" || scope === "claude"
|
|
184
|
+
? `Usage: rmx debug ${scope} on|off|status|reset`
|
|
185
|
+
: `Usage: rmx debug ${scope} on|off|status|reset|logs [-f]`);
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function printTopLevelHelp(): void {
|
|
190
|
+
console.log("Debug commands (proxy must be running):");
|
|
191
|
+
console.log("");
|
|
192
|
+
console.log(" rmx debug provider on|off|status|reset|logs [-f]");
|
|
193
|
+
console.log(" rmx debug usage on|off|status|reset|logs [-f]");
|
|
194
|
+
console.log(" rmx debug injection on|off|status|reset");
|
|
195
|
+
console.log(" rmx debug claude on|off|status|reset");
|
|
196
|
+
console.log("");
|
|
197
|
+
console.log("Env defaults on start:");
|
|
198
|
+
console.log(" provider → OCX_DEBUG=1 (legacy OCX_DEBUG_FRAMES still works)");
|
|
199
|
+
console.log(` usage → ${DEBUG_ENV.usage}=1`);
|
|
200
|
+
console.log(` injection→ ${DEBUG_ENV.injection}=1`);
|
|
201
|
+
console.log(` claude → ${DEBUG_ENV.claude}=1`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export async function handleDebugCommand(argv: string[]): Promise<void> {
|
|
205
|
+
const sub = (argv[0] ?? "").trim().toLowerCase();
|
|
206
|
+
|
|
207
|
+
if (sub === "provider" || sub === "usage" || sub === "injection" || sub === "claude") {
|
|
208
|
+
await handleScopeCommand(sub, argv.slice(1));
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (sub === "" || sub === "help" || sub === "--help" || sub === "-h") {
|
|
213
|
+
const live = await findLiveProxy();
|
|
214
|
+
if (!live) {
|
|
215
|
+
console.log("Proxy is not running — env defaults for the next start:");
|
|
216
|
+
console.log(` provider → OCX_DEBUG = ${envDebugEnabled() ? "on" : "off"}`);
|
|
217
|
+
console.log(` usage → ${DEBUG_ENV.usage} = ${process.env[DEBUG_ENV.usage] === "1" ? "on" : "off"}`);
|
|
218
|
+
console.log(` injection→ ${DEBUG_ENV.injection} = ${process.env[DEBUG_ENV.injection] === "1" ? "on" : "off"}`);
|
|
219
|
+
console.log(` claude → ${DEBUG_ENV.claude} = ${process.env[DEBUG_ENV.claude] === "1" ? "on" : "off"}`);
|
|
220
|
+
console.log("");
|
|
221
|
+
}
|
|
222
|
+
printTopLevelHelp();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
printTopLevelHelp();
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ensureConfigFile,
|
|
3
|
+
type ConfigBootstrapResult,
|
|
4
|
+
} from "../config";
|
|
5
|
+
|
|
6
|
+
export type DesktopConfigBootstrapOutcome =
|
|
7
|
+
| { ran: false }
|
|
8
|
+
| { ran: true; result: ConfigBootstrapResult };
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Persist Remodex's own safe defaults for a genuinely fresh desktop home.
|
|
12
|
+
*
|
|
13
|
+
* Generic CLI reads remain side-effect free. The desktop shell, however, is an
|
|
14
|
+
* installed application and must have one persisted authority snapshot before
|
|
15
|
+
* unattended first-launch Codex convergence can be admitted. `ensureConfigFile`
|
|
16
|
+
* is no-replace: existing, malformed, or concurrently-created files survive
|
|
17
|
+
* byte-for-byte, including an explicit `clientIntegrations.codex = false`.
|
|
18
|
+
*/
|
|
19
|
+
export function bootstrapDesktopConfigIfNeeded(
|
|
20
|
+
env: Record<string, string | undefined> = process.env as Record<string, string | undefined>,
|
|
21
|
+
bootstrap: () => ConfigBootstrapResult = ensureConfigFile,
|
|
22
|
+
): DesktopConfigBootstrapOutcome {
|
|
23
|
+
if (env.OCX_DESKTOP !== "1") return { ran: false };
|
|
24
|
+
return { ran: true, result: bootstrap() };
|
|
25
|
+
}
|