@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,235 @@
|
|
|
1
|
+
type JsonRecord = Record<string, unknown>;
|
|
2
|
+
|
|
3
|
+
export type CanonicalTurnActivitySnapshot = {
|
|
4
|
+
active: boolean;
|
|
5
|
+
activeTurnId: string;
|
|
6
|
+
activeWithoutId: boolean;
|
|
7
|
+
latestTurnId: string;
|
|
8
|
+
hasTurns: boolean;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type ProjectedTurnLifecycleMarker = {
|
|
12
|
+
state: unknown;
|
|
13
|
+
turnId?: unknown;
|
|
14
|
+
occurredAt?: unknown;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const ANDROID_REMOTE_TURN_ERROR_LIMIT = 4096;
|
|
18
|
+
|
|
19
|
+
function record(value: unknown): JsonRecord | null {
|
|
20
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
21
|
+
? value as JsonRecord
|
|
22
|
+
: null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function stringValue(value: unknown, maximum = 128): string {
|
|
26
|
+
return typeof value === "string" ? value.trim().slice(0, maximum) : "";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Keep provider/runtime failures useful on the phone without projecting an
|
|
31
|
+
* unbounded or structured upstream error object into shell and turn state.
|
|
32
|
+
*/
|
|
33
|
+
export function boundedTurnErrorMessage(value: unknown): string {
|
|
34
|
+
const error = record(value);
|
|
35
|
+
return stringValue(
|
|
36
|
+
typeof value === "string" ? value : error?.message,
|
|
37
|
+
ANDROID_REMOTE_TURN_ERROR_LIMIT,
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function normalizedCanonicalTurnStatus(value: unknown): string {
|
|
42
|
+
return stringValue(value, 64).replace(/[^a-z0-9]/giu, "").toLowerCase();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function canonicalTurnStatusIsActive(value: unknown): boolean {
|
|
46
|
+
const status = normalizedCanonicalTurnStatus(value);
|
|
47
|
+
return status.includes("inprogress")
|
|
48
|
+
|| status.includes("running")
|
|
49
|
+
|| status.includes("pending")
|
|
50
|
+
|| status.includes("started")
|
|
51
|
+
|| status.includes("starting")
|
|
52
|
+
|| status === "active";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function canonicalTurnStatusIsTerminal(value: unknown): boolean {
|
|
56
|
+
const status = normalizedCanonicalTurnStatus(value);
|
|
57
|
+
return status === "idle"
|
|
58
|
+
|| status === "notloaded"
|
|
59
|
+
|| status === "inactive"
|
|
60
|
+
|| status.includes("complete")
|
|
61
|
+
|| status.includes("failed")
|
|
62
|
+
|| status.includes("error")
|
|
63
|
+
|| status.includes("interrupt")
|
|
64
|
+
|| status.includes("cancel")
|
|
65
|
+
|| status.includes("stopped")
|
|
66
|
+
|| status.includes("aborted")
|
|
67
|
+
|| status === "ready"
|
|
68
|
+
|| status === "done";
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function canonicalTurnId(value: unknown): string {
|
|
72
|
+
const turn = record(value);
|
|
73
|
+
if (!turn) return "";
|
|
74
|
+
const turnId = stringValue(turn.id ?? turn.turnId ?? turn.turn_id);
|
|
75
|
+
return turnId && !turnId.startsWith("opencodex-pending-") ? turnId : "";
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function canonicalTurnIsHistoryCompactionMarker(value: unknown): boolean {
|
|
79
|
+
const turn = record(value);
|
|
80
|
+
if (!turn) return false;
|
|
81
|
+
const turnId = canonicalTurnId(turn);
|
|
82
|
+
return turn.remodexHistoryCompacted === true
|
|
83
|
+
|| turn.remodex_history_compacted === true
|
|
84
|
+
|| turnId.startsWith("remodex-history-compacted-");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function canonicalTurnsNewestFirst(
|
|
88
|
+
value: unknown,
|
|
89
|
+
newestFirst = false,
|
|
90
|
+
): JsonRecord[] {
|
|
91
|
+
const turns = (Array.isArray(value) ? value : []).flatMap(candidate => {
|
|
92
|
+
const turn = record(candidate);
|
|
93
|
+
return turn && !canonicalTurnIsHistoryCompactionMarker(turn) ? [turn] : [];
|
|
94
|
+
});
|
|
95
|
+
return newestFirst ? turns : turns.reverse();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function lifecycleTimestampMs(value: unknown): number | null {
|
|
99
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
100
|
+
return value > 10_000_000_000 ? value : value * 1_000;
|
|
101
|
+
}
|
|
102
|
+
if (typeof value !== "string" || value.trim().length === 0) return null;
|
|
103
|
+
const parsed = Date.parse(value);
|
|
104
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function canonicalTurnLifecycleTimestampMs(turn: JsonRecord): number | null {
|
|
108
|
+
const status = turn.status ?? turn.state ?? turn.turnStatus ?? turn.turn_status;
|
|
109
|
+
const candidates = canonicalTurnStatusIsTerminal(status)
|
|
110
|
+
? [
|
|
111
|
+
turn.completedAt,
|
|
112
|
+
turn.completed_at,
|
|
113
|
+
turn.endedAt,
|
|
114
|
+
turn.ended_at,
|
|
115
|
+
turn.finishedAt,
|
|
116
|
+
turn.finished_at,
|
|
117
|
+
turn.updatedAt,
|
|
118
|
+
turn.updated_at,
|
|
119
|
+
turn.startedAt,
|
|
120
|
+
turn.started_at,
|
|
121
|
+
turn.createdAt,
|
|
122
|
+
turn.created_at,
|
|
123
|
+
]
|
|
124
|
+
: [
|
|
125
|
+
turn.startedAt,
|
|
126
|
+
turn.started_at,
|
|
127
|
+
turn.createdAt,
|
|
128
|
+
turn.created_at,
|
|
129
|
+
turn.updatedAt,
|
|
130
|
+
turn.updated_at,
|
|
131
|
+
];
|
|
132
|
+
for (const candidate of candidates) {
|
|
133
|
+
const timestamp = lifecycleTimestampMs(candidate);
|
|
134
|
+
if (timestamp !== null) return timestamp;
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Decide whether a Desktop/session-file lifecycle marker is newer than the
|
|
141
|
+
* bounded canonical turn history.
|
|
142
|
+
*
|
|
143
|
+
* A terminal state always closes the same turn, regardless of which source
|
|
144
|
+
* published first. A marker for an older canonical row cannot supersede the
|
|
145
|
+
* latest row. Different-turn conflicts use lifecycle timestamps; when neither
|
|
146
|
+
* side can prove ordering, the active side wins so Android cannot start a
|
|
147
|
+
* competing writer.
|
|
148
|
+
*/
|
|
149
|
+
export function projectedTurnLifecycleWins(
|
|
150
|
+
value: unknown,
|
|
151
|
+
marker: ProjectedTurnLifecycleMarker,
|
|
152
|
+
newestFirst = false,
|
|
153
|
+
): boolean {
|
|
154
|
+
const markerActive = canonicalTurnStatusIsActive(marker.state);
|
|
155
|
+
const markerTerminal = canonicalTurnStatusIsTerminal(marker.state);
|
|
156
|
+
if (!markerActive && !markerTerminal) return false;
|
|
157
|
+
|
|
158
|
+
const turns = canonicalTurnsNewestFirst(value, newestFirst);
|
|
159
|
+
const latestTurn = turns[0];
|
|
160
|
+
if (!latestTurn) return true;
|
|
161
|
+
|
|
162
|
+
const latestStatus = latestTurn.status
|
|
163
|
+
?? latestTurn.state
|
|
164
|
+
?? latestTurn.turnStatus
|
|
165
|
+
?? latestTurn.turn_status;
|
|
166
|
+
const canonicalTerminal = canonicalTurnStatusIsTerminal(latestStatus);
|
|
167
|
+
const canonicalActive = canonicalTurnStatusIsActive(latestStatus) || !canonicalTerminal;
|
|
168
|
+
const markerTurnId = stringValue(marker.turnId);
|
|
169
|
+
const latestTurnId = canonicalTurnId(latestTurn);
|
|
170
|
+
|
|
171
|
+
if (markerTurnId) {
|
|
172
|
+
const canonicalIndex = turns.findIndex(turn => canonicalTurnId(turn) === markerTurnId);
|
|
173
|
+
if (canonicalIndex > 0) return false;
|
|
174
|
+
if (canonicalIndex === 0 || (latestTurnId && markerTurnId === latestTurnId)) {
|
|
175
|
+
if (markerActive !== canonicalActive) return markerTerminal;
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const markerAt = lifecycleTimestampMs(marker.occurredAt);
|
|
181
|
+
const canonicalAt = canonicalTurnLifecycleTimestampMs(latestTurn);
|
|
182
|
+
if (markerAt !== null && canonicalAt !== null && markerAt !== canonicalAt) {
|
|
183
|
+
return markerAt > canonicalAt;
|
|
184
|
+
}
|
|
185
|
+
if (markerAt !== null && canonicalAt === null) return true;
|
|
186
|
+
if (markerAt === null && canonicalAt !== null) return false;
|
|
187
|
+
|
|
188
|
+
if (markerActive !== canonicalActive) return markerActive;
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Resolve activity from a bounded canonical turn list.
|
|
194
|
+
*
|
|
195
|
+
* A terminal newest turn is a sequential-history boundary: an older running
|
|
196
|
+
* or status-less row must not revive the task. A status-less newest row stays
|
|
197
|
+
* conservatively active until the runtime publishes its terminal state.
|
|
198
|
+
*/
|
|
199
|
+
export function canonicalTurnActivitySnapshot(
|
|
200
|
+
value: unknown,
|
|
201
|
+
newestFirst = false,
|
|
202
|
+
): CanonicalTurnActivitySnapshot {
|
|
203
|
+
const turns = canonicalTurnsNewestFirst(value, newestFirst);
|
|
204
|
+
let latestTurnId = "";
|
|
205
|
+
let encounteredTerminalBoundary = false;
|
|
206
|
+
|
|
207
|
+
for (const turn of turns) {
|
|
208
|
+
const turnId = canonicalTurnId(turn);
|
|
209
|
+
if (!latestTurnId && turnId) latestTurnId = turnId;
|
|
210
|
+
const status = turn.status ?? turn.state ?? turn.turnStatus ?? turn.turn_status;
|
|
211
|
+
if (canonicalTurnStatusIsTerminal(status)) {
|
|
212
|
+
encounteredTerminalBoundary = true;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (encounteredTerminalBoundary) continue;
|
|
216
|
+
|
|
217
|
+
// Known active statuses and unknown/missing statuses are both potentially
|
|
218
|
+
// interruptible. Only a recognized terminal status closes the boundary.
|
|
219
|
+
return {
|
|
220
|
+
active: true,
|
|
221
|
+
activeTurnId: turnId,
|
|
222
|
+
activeWithoutId: !turnId,
|
|
223
|
+
latestTurnId,
|
|
224
|
+
hasTurns: true,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
active: false,
|
|
230
|
+
activeTurnId: "",
|
|
231
|
+
activeWithoutId: false,
|
|
232
|
+
latestTurnId,
|
|
233
|
+
hasTurns: turns.length > 0,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export type AttachmentUserMessageIdentity = {
|
|
2
|
+
readonly text: string;
|
|
3
|
+
readonly attachmentCount: number;
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
const CODEX_FILES_MENTIONED_HEADER = /^#\s+Files mentioned by the user:\s*$/imu;
|
|
7
|
+
const CODEX_REQUEST_HEADER = /^##\s+My request(?:\s+for\s+Codex)?:\s*$/imu;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Codex Desktop stores attachment prompts with a private transport envelope:
|
|
11
|
+
* a list of local paths followed by a "My request" section. The Desktop UI
|
|
12
|
+
* hides that envelope, so Android must expose only the request as well.
|
|
13
|
+
*
|
|
14
|
+
* Match the complete, generated heading pair instead of a loose substring so
|
|
15
|
+
* an ordinary prompt that merely discusses these words remains untouched.
|
|
16
|
+
*/
|
|
17
|
+
export function publicUserMessageText(value: unknown): string {
|
|
18
|
+
if (typeof value !== "string") return "";
|
|
19
|
+
const normalized = value.replaceAll("\r\n", "\n");
|
|
20
|
+
const filesHeader = CODEX_FILES_MENTIONED_HEADER.exec(normalized);
|
|
21
|
+
if (!filesHeader || normalized.slice(0, filesHeader.index).trim()) return normalized;
|
|
22
|
+
const remainderOffset = filesHeader.index + filesHeader[0].length;
|
|
23
|
+
const remainder = normalized.slice(remainderOffset);
|
|
24
|
+
const requestHeader = CODEX_REQUEST_HEADER.exec(remainder);
|
|
25
|
+
if (!requestHeader) return normalized;
|
|
26
|
+
const privateEnvelope = remainder.slice(0, requestHeader.index);
|
|
27
|
+
// A real generated envelope contains at least one secondary Markdown
|
|
28
|
+
// heading with an absolute attachment path. This keeps the unwrap narrow.
|
|
29
|
+
if (!/^##\s+[^\n:]+:\s+(?:\/|[A-Za-z]:[\\/]|\\\\)/mu.test(privateEnvelope)) {
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
return remainder
|
|
33
|
+
.slice(requestHeader.index + requestHeader[0].length)
|
|
34
|
+
.replace(/^\n+/u, "");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Canonical visible prompt text used only to reconcile transport echoes. */
|
|
38
|
+
export function canonicalUserMessageText(value: unknown): string {
|
|
39
|
+
let normalized = publicUserMessageText(value);
|
|
40
|
+
normalized = normalized.replace(/<image\b[^>]*>/giu, "");
|
|
41
|
+
normalized = normalized.replace(/<\/image>/giu, "");
|
|
42
|
+
normalized = normalized.replace(/\[Image:\s*[^\]\n]+\]/giu, "");
|
|
43
|
+
normalized = normalized.replace(/\[File attached:\s*[^\]\n]+\]/giu, "");
|
|
44
|
+
normalized = normalized.replace(
|
|
45
|
+
/(^|\n)Files uploaded from Android and staged on this PC:\n(?:[ \t]*-[^\n]*(?:\n|$))+/giu,
|
|
46
|
+
"$1",
|
|
47
|
+
);
|
|
48
|
+
return normalized.replace(/\n{3,}/gu, "\n\n").trim();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Codex Desktop and app-server serialize the same attachment differently.
|
|
53
|
+
* Reduce only messages that actually contain attachment markers to a stable
|
|
54
|
+
* identity; ordinary user text remains byte-for-byte significant.
|
|
55
|
+
*/
|
|
56
|
+
export function attachmentUserMessageIdentity(
|
|
57
|
+
value: unknown,
|
|
58
|
+
): AttachmentUserMessageIdentity | null {
|
|
59
|
+
if (typeof value !== "string") return null;
|
|
60
|
+
let attachmentCount = 0;
|
|
61
|
+
let normalized = publicUserMessageText(value);
|
|
62
|
+
normalized = normalized.replace(/<image\b[^>]*>/giu, () => {
|
|
63
|
+
attachmentCount += 1;
|
|
64
|
+
return "";
|
|
65
|
+
});
|
|
66
|
+
normalized = normalized.replace(/<\/image>/giu, "");
|
|
67
|
+
normalized = normalized.replace(/\[Image:\s*[^\]\n]+\]/giu, () => {
|
|
68
|
+
attachmentCount += 1;
|
|
69
|
+
return "";
|
|
70
|
+
});
|
|
71
|
+
normalized = normalized.replace(/\[File attached:\s*[^\]\n]+\]/giu, () => {
|
|
72
|
+
attachmentCount += 1;
|
|
73
|
+
return "";
|
|
74
|
+
});
|
|
75
|
+
normalized = normalized.replace(
|
|
76
|
+
/(^|\n)Files uploaded from Android and staged on this PC:\n((?:[ \t]*-[^\n]*(?:\n|$))+)/giu,
|
|
77
|
+
(_match, prefix: string, paths: string) => {
|
|
78
|
+
attachmentCount += paths.split("\n").filter(line => /^\s*-/u.test(line)).length;
|
|
79
|
+
return prefix;
|
|
80
|
+
},
|
|
81
|
+
);
|
|
82
|
+
if (attachmentCount === 0) return null;
|
|
83
|
+
return {
|
|
84
|
+
text: normalized.replace(/\n{3,}/gu, "\n\n").trim(),
|
|
85
|
+
attachmentCount,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function attachmentUserMessageIdentityKey(value: unknown): string | null {
|
|
90
|
+
const identity = attachmentUserMessageIdentity(value);
|
|
91
|
+
return identity === null
|
|
92
|
+
? null
|
|
93
|
+
: `${identity.attachmentCount}\u0000${identity.text}`;
|
|
94
|
+
}
|