From 52707f471d289f743cf886bb2d85c6a343af0e40 Mon Sep 17 00:00:00 2001 From: kumarabhirup Date: Sun, 1 Mar 2026 16:11:40 -0800 Subject: [PATCH] refactor!: IronClaw v2.0 - external OpenClaw runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: Convert repository to IronClaw-only package with strict external dependency on globally installed `openclaw` runtime. ### Changes - Remove entire OpenClaw core source from repository (src/agents/*, src/acp/*, src/commands/*, and related modules) - Implement CLI delegation: non-bootstrap commands now delegate to global `openclaw` binary via external contract - Remove local OpenClaw path resolution from web app; always spawn global `openclaw` binary instead of local scripts - Rename package.json scripts: `pnpm openclaw` → `pnpm ironclaw`, `openclaw:rpc` → `ironclaw:rpc` - Update bootstrap flow to verify and install global OpenClaw when missing - Migrate web workspace/profile logic to align with OpenClaw state paths - Add migration contract tests for stream-json, session subscribe, and profile resolution behaviors - Update build/release pipeline for IronClaw-only artifacts - Update documentation for new peer + global installation model ### Architecture IronClaw is now strictly a frontend/UI/bootstrap layer: - `npx ironclaw` bootstraps OpenClaw (if missing), runs guided onboarding - IronClaw UI serves on localhost:3100 - OpenClaw Gateway runs on standard port 18789 - Communication via stable CLI contracts and Gateway WebSocket protocol only ### Migration Users must have `openclaw` installed globally: npm install -g openclaw Existing IronClaw profiles and sessions remain compatible through gateway protocol stability. Refs: bootstrap_dev_testing, ironclaw_frontend_split, strict-external-openclaw --- .../bootstrap_dev_testing_0b5817e5.plan.md | 146 ++ .../ironclaw_frontend_split_1c02d591.plan.md | 122 + .../strict-external-openclaw_7c0d1717.plan.md | 135 + README.md | 10 +- apps/web/app/api/chat/chat.test.ts | 3 +- apps/web/app/api/profiles/route.test.ts | 8 +- apps/web/app/api/workspace/objects.test.ts | 2 + .../web/app/api/workspace/tree-browse.test.ts | 13 +- apps/web/lib/active-runs.ts | 34 +- apps/web/lib/agent-runner.test.ts | 207 +- apps/web/lib/agent-runner.ts | 103 +- apps/web/lib/subagent-runs.ts | 24 +- apps/web/lib/workspace-chat-isolation.test.ts | 98 +- apps/web/lib/workspace-profiles.test.ts | 197 +- apps/web/lib/workspace.ts | 229 +- docs/install/updating.md | 2 + docs/reference/RELEASING.md | 6 +- package.json | 28 +- scripts/canvas-a2ui-copy.ts | 40 - scripts/copy-export-html-templates.ts | 59 - scripts/copy-hook-metadata.ts | 55 - scripts/deploy.sh | 4 +- scripts/e2e/Dockerfile | 2 +- scripts/protocol-gen-swift.ts | 4 +- scripts/release-check.ts | 69 +- scripts/write-cli-compat.ts | 74 - scripts/write-plugin-sdk-entry-dts.ts | 15 - src/acp/client.test.ts | 217 -- src/acp/client.ts | 428 --- src/acp/commands.ts | 40 - src/acp/event-mapper.ts | 133 - src/acp/index.ts | 4 - src/acp/meta.ts | 47 - src/acp/secret-file.ts | 22 - src/acp/server.ts | 212 -- src/acp/session-mapper.test.ts | 56 - src/acp/session-mapper.ts | 98 - src/acp/session.test.ts | 146 -- src/acp/session.ts | 190 -- src/acp/translator.prompt-prefix.test.ts | 70 - src/acp/translator.session-rate-limit.test.ts | 135 - src/acp/translator.ts | 498 ---- src/acp/types.ts | 34 - src/agents/agent-paths.e2e.test.ts | 85 - src/agents/agent-paths.ts | 25 - src/agents/agent-scope.e2e.test.ts | 283 -- src/agents/agent-scope.ts | 211 -- src/agents/aisdk/event-adapter.ts | 403 --- src/agents/aisdk/index.ts | 56 - src/agents/aisdk/provider.test.ts | 151 -- src/agents/aisdk/provider.ts | 262 -- src/agents/aisdk/run.test.ts | 46 - src/agents/aisdk/run.ts | 360 --- src/agents/aisdk/tools.ts | 180 -- src/agents/aisdk/types.ts | 133 - src/agents/announce-idempotency.ts | 25 - src/agents/anthropic-payload-log.ts | 185 -- src/agents/anthropic.setup-token.live.test.ts | 249 -- src/agents/api-key-rotation.ts | 72 - src/agents/apply-patch-update.ts | 205 -- src/agents/apply-patch.e2e.test.ts | 257 -- src/agents/apply-patch.ts | 532 ---- src/agents/auth-health.e2e.test.ts | 100 - src/agents/auth-health.ts | 261 -- src/agents/auth-profiles.chutes.e2e.test.ts | 84 - ...auth-profiles.cooldown-auto-expiry.test.ts | 159 -- ...rofiles.ensureauthprofilestore.e2e.test.ts | 125 - ...-profiles.getsoonestcooldownexpiry.test.ts | 77 - ...rofiles.markauthprofilefailure.e2e.test.ts | 139 - ...-lastgood-round-robin-ordering.e2e.test.ts | 218 -- ...les.resolve-auth-profile-order.fixtures.ts | 27 - ...alizes-z-ai-aliases-auth-order.e2e.test.ts | 103 - ...tused-no-explicit-order-exists.e2e.test.ts | 72 - ...ored-profiles-no-config-exists.e2e.test.ts | 220 -- src/agents/auth-profiles.ts | 44 - src/agents/auth-profiles/constants.ts | 26 - src/agents/auth-profiles/display.ts | 17 - src/agents/auth-profiles/doctor.ts | 47 - src/agents/auth-profiles/external-cli-sync.ts | 135 - .../oauth.fallback-to-main-agent.e2e.test.ts | 360 --- src/agents/auth-profiles/oauth.test.ts | 161 -- src/agents/auth-profiles/oauth.ts | 376 --- src/agents/auth-profiles/order.ts | 189 -- src/agents/auth-profiles/paths.ts | 33 - src/agents/auth-profiles/profiles.ts | 116 - src/agents/auth-profiles/repair.ts | 164 -- .../session-override.e2e.test.ts | 53 - src/agents/auth-profiles/session-override.ts | 151 -- src/agents/auth-profiles/store.ts | 346 --- src/agents/auth-profiles/types.ts | 75 - src/agents/auth-profiles/usage.test.ts | 347 --- src/agents/auth-profiles/usage.ts | 427 --- src/agents/bash-process-registry.e2e.test.ts | 117 - .../bash-process-registry.test-helpers.ts | 42 - src/agents/bash-process-registry.ts | 309 --- src/agents/bash-tools.e2e.test.ts | 535 ---- .../bash-tools.exec-approval-request.test.ts | 83 - .../bash-tools.exec-approval-request.ts | 44 - src/agents/bash-tools.exec-host-gateway.ts | 339 --- src/agents/bash-tools.exec-host-node.ts | 316 --- src/agents/bash-tools.exec-runtime.ts | 548 ---- src/agents/bash-tools.exec-types.ts | 57 - .../bash-tools.exec.approval-id.e2e.test.ts | 185 -- ...sh-tools.exec.background-abort.e2e.test.ts | 148 -- src/agents/bash-tools.exec.path.e2e.test.ts | 130 - .../bash-tools.exec.pty-cleanup.test.ts | 78 - ...sh-tools.exec.pty-fallback-failure.test.ts | 39 - .../bash-tools.exec.pty-fallback.e2e.test.ts | 29 - src/agents/bash-tools.exec.pty.e2e.test.ts | 19 - .../bash-tools.exec.script-preflight.test.ts | 102 - src/agents/bash-tools.exec.ts | 545 ---- .../bash-tools.process.poll-timeout.test.ts | 137 - .../bash-tools.process.send-keys.e2e.test.ts | 78 - .../bash-tools.process.supervisor.test.ts | 137 - src/agents/bash-tools.process.ts | 680 ----- src/agents/bash-tools.shared.ts | 246 -- src/agents/bash-tools.ts | 9 - src/agents/bedrock-discovery.e2e.test.ts | 142 - src/agents/bedrock-discovery.ts | 226 -- src/agents/bootstrap-files.e2e.test.ts | 56 - src/agents/bootstrap-files.ts | 66 - src/agents/bootstrap-hooks.e2e.test.ts | 47 - src/agents/bootstrap-hooks.ts | 31 - src/agents/byteplus-models.ts | 108 - src/agents/byteplus.live.test.ts | 47 - src/agents/cache-trace.e2e.test.ts | 92 - src/agents/cache-trace.ts | 256 -- src/agents/channel-tools.e2e.test.ts | 52 - src/agents/channel-tools.ts | 121 - src/agents/chutes-oauth.e2e.test.ts | 140 - src/agents/chutes-oauth.test.ts | 52 - src/agents/chutes-oauth.ts | 226 -- src/agents/claude-cli-runner.e2e.test.ts | 165 -- src/agents/claude-cli-runner.ts | 3 - src/agents/cli-backends.test.ts | 36 - src/agents/cli-backends.ts | 195 -- src/agents/cli-credentials.test.ts | 296 --- src/agents/cli-credentials.ts | 572 ---- src/agents/cli-runner.e2e.test.ts | 221 -- src/agents/cli-runner.ts | 396 --- src/agents/cli-runner/helpers.ts | 401 --- src/agents/cli-runner/reliability.ts | 88 - src/agents/cli-session.ts | 37 - src/agents/cli-watchdog-defaults.ts | 13 - src/agents/cloudflare-ai-gateway.ts | 44 - src/agents/command-poll-backoff.test.ts | 173 -- src/agents/command-poll-backoff.ts | 82 - src/agents/compaction.e2e.test.ts | 266 -- src/agents/compaction.retry.test.ts | 182 -- ...compaction.tool-result-details.e2e.test.ts | 67 - src/agents/compaction.ts | 401 --- src/agents/content-blocks.test.ts | 19 - src/agents/content-blocks.ts | 16 - src/agents/context-window-guard.e2e.test.ts | 149 -- src/agents/context-window-guard.ts | 74 - src/agents/context.test.ts | 77 - src/agents/context.ts | 111 - src/agents/current-time.ts | 39 - src/agents/date-time.ts | 193 -- src/agents/defaults.ts | 6 - src/agents/docs-path.ts | 30 - src/agents/doubao-models.ts | 132 - src/agents/engine-router.test.ts | 44 - src/agents/engine-router.ts | 118 - src/agents/failover-error.e2e.test.ts | 74 - src/agents/failover-error.ts | 240 -- src/agents/glob-pattern.ts | 56 - src/agents/google-gemini-switch.live.test.ts | 80 - src/agents/huggingface-models.test.ts | 44 - src/agents/huggingface-models.ts | 230 -- src/agents/identity-avatar.e2e.test.ts | 146 -- src/agents/identity-avatar.ts | 102 - src/agents/identity-file.e2e.test.ts | 36 - src/agents/identity-file.ts | 107 - src/agents/identity.e2e.test.ts | 27 - .../identity.per-channel-prefix.e2e.test.ts | 300 --- src/agents/identity.test.ts | 79 - src/agents/identity.ts | 171 -- src/agents/image-sanitization.test.ts | 20 - src/agents/image-sanitization.ts | 17 - src/agents/lanes.ts | 4 - src/agents/live-auth-keys.e2e.test.ts | 35 - src/agents/live-auth-keys.ts | 202 -- src/agents/live-model-filter.test.ts | 14 - src/agents/live-model-filter.ts | 104 - src/agents/memory-search.e2e.test.ts | 261 -- src/agents/memory-search.ts | 357 --- ...minimax-vlm.normalizes-api-key.e2e.test.ts | 38 - src/agents/minimax-vlm.ts | 113 - src/agents/minimax.live.test.ts | 46 - src/agents/model-alias-lines.ts | 20 - src/agents/model-auth-label.ts | 79 - src/agents/model-auth.e2e.test.ts | 342 --- src/agents/model-auth.test.ts | 107 - src/agents/model-auth.ts | 413 --- src/agents/model-catalog.e2e.test.ts | 21 - src/agents/model-catalog.test-harness.ts | 43 - src/agents/model-catalog.test.ts | 106 - src/agents/model-catalog.ts | 192 -- src/agents/model-compat.e2e.test.ts | 48 - src/agents/model-compat.ts | 24 - src/agents/model-fallback.e2e.test.ts | 612 ----- src/agents/model-fallback.probe.test.ts | 343 --- src/agents/model-fallback.ts | 478 ---- src/agents/model-forward-compat.test.ts | 59 - src/agents/model-forward-compat.ts | 293 --- src/agents/model-scan.e2e.test.ts | 83 - src/agents/model-scan.ts | 498 ---- src/agents/model-selection.e2e.test.ts | 187 -- src/agents/model-selection.ts | 550 ---- ...thub-copilot-provider-token-is.e2e.test.ts | 55 - src/agents/models-config.e2e-harness.ts | 138 - ...t-baseurl-token-exchange-fails.e2e.test.ts | 75 - ...g-provider-apikey-from-env-var.e2e.test.ts | 107 - ...3-ids-preview-google-providers.e2e.test.ts | 60 - ...odels-config.providers.kimi-coding.test.ts | 45 - .../models-config.providers.nvidia.test.ts | 85 - ...models-config.providers.ollama.e2e.test.ts | 88 - ...odels-config.providers.qianfan.e2e.test.ts | 17 - src/agents/models-config.providers.ts | 1012 -------- ....providers.volcengine-byteplus.e2e.test.ts | 40 - ...iting-models-json-no-env-token.e2e.test.ts | 118 - src/agents/models-config.ts | 144 -- ...hub-copilot-profile-env-tokens.e2e.test.ts | 79 - src/agents/models.profiles.live.test.ts | 535 ---- src/agents/ollama-stream.test.ts | 386 --- src/agents/ollama-stream.ts | 551 ---- .../openai-responses.reasoning-replay.test.ts | 187 -- src/agents/openclaw-gateway-tool.e2e.test.ts | 201 -- src/agents/openclaw-tools.agents.e2e.test.ts | 168 -- src/agents/openclaw-tools.camera.e2e.test.ts | 232 -- .../openclaw-tools.session-status.e2e.test.ts | 240 -- ...claw-tools.sessions-visibility.e2e.test.ts | 118 - .../openclaw-tools.sessions.e2e.test.ts | 1027 -------- ...spawn-applies-thinking-default.e2e.test.ts | 91 - ...agents.sessions-spawn-depth-limits.test.ts | 274 -- ...gents.sessions-spawn.allowlist.e2e.test.ts | 162 -- ...gents.sessions-spawn.lifecycle.e2e.test.ts | 523 ---- ...subagents.sessions-spawn.model.e2e.test.ts | 317 --- ...s.subagents.sessions-spawn.test-harness.ts | 70 - ...s.steer-failure-clears-suppression.test.ts | 80 - .../openclaw-tools.subagents.test-harness.ts | 36 - src/agents/openclaw-tools.ts | 191 -- src/agents/opencode-zen-models.e2e.test.ts | 101 - src/agents/opencode-zen-models.ts | 319 --- src/agents/pi-auth-json.test.ts | 206 -- src/agents/pi-auth-json.ts | 158 -- .../pi-embedded-block-chunker.e2e.test.ts | 130 - src/agents/pi-embedded-block-chunker.ts | 387 --- ...ers.buildbootstrapcontextfiles.e2e.test.ts | 164 -- ...lpers.formatassistanterrortext.e2e.test.ts | 140 - ...-helpers.isbillingerrormessage.e2e.test.ts | 387 --- ...tant-text-blocks-but-preserves.e2e.test.ts | 281 -- ...helpers.sanitizeuserfacingtext.e2e.test.ts | 378 --- src/agents/pi-embedded-helpers.ts | 65 - ...mbedded-helpers.validate-turns.e2e.test.ts | 338 --- src/agents/pi-embedded-helpers/bootstrap.ts | 266 -- src/agents/pi-embedded-helpers/errors.ts | 840 ------ src/agents/pi-embedded-helpers/google.ts | 22 - src/agents/pi-embedded-helpers/images.ts | 154 -- .../pi-embedded-helpers/messaging-dedupe.ts | 46 - src/agents/pi-embedded-helpers/openai.ts | 130 - src/agents/pi-embedded-helpers/thinking.ts | 45 - src/agents/pi-embedded-helpers/turns.ts | 108 - src/agents/pi-embedded-helpers/types.ts | 10 - src/agents/pi-embedded-messaging.ts | 41 - src/agents/pi-embedded-payloads.ts | 8 - ...pi-embedded-runner-extraparams.e2e.test.ts | 326 --- ...i-embedded-runner-extraparams.live.test.ts | 64 - ...ner.applygoogleturnorderingfix.e2e.test.ts | 61 - ...unner.buildembeddedsandboxinfo.e2e.test.ts | 81 - ...d-runner.compaction-safety-timeout.test.ts | 45 - ...ner.createsystempromptoverride.e2e.test.ts | 14 - src/agents/pi-embedded-runner.e2e.test.ts | 548 ---- ...ck-provider-default-per-dm-not.e2e.test.ts | 60 - ...efined-sessionkey-is-undefined.e2e.test.ts | 198 -- ...unner.google-sanitize-thinking.e2e.test.ts | 339 --- .../pi-embedded-runner.guard.e2e.test.ts | 38 - ...ner.guard.waitforidle-before-flush.test.ts | 114 - ...ner.history-limit-from-session-key.test.ts | 31 - ...edded-runner.limithistoryturns.e2e.test.ts | 127 - ...er.openai-tool-id-preservation.e2e.test.ts | 50 - ...-runner.resolvesessionagentids.e2e.test.ts | 51 - ...pi-agent.auth-profile-rotation.e2e.test.ts | 620 ----- ...unner.sanitize-session-history.e2e.test.ts | 71 - ...r.sanitize-session-history.test-harness.ts | 153 -- ...ed-runner.sanitize-session-history.test.ts | 455 ---- ...-embedded-runner.splitsdktools.e2e.test.ts | 54 - src/agents/pi-embedded-runner.ts | 28 - src/agents/pi-embedded-runner/abort.ts | 17 - src/agents/pi-embedded-runner/cache-ttl.ts | 61 - src/agents/pi-embedded-runner/compact.ts | 757 ------ .../compaction-safety-timeout.ts | 10 - src/agents/pi-embedded-runner/extensions.ts | 94 - ...tra-params.cache-retention-default.test.ts | 154 -- src/agents/pi-embedded-runner/extra-params.ts | 375 --- .../extra-params.zai-tool-stream.test.ts | 93 - .../pi-embedded-runner/google.e2e.test.ts | 69 - src/agents/pi-embedded-runner/google.ts | 502 ---- src/agents/pi-embedded-runner/history.ts | 115 - src/agents/pi-embedded-runner/lanes.ts | 15 - src/agents/pi-embedded-runner/logger.ts | 3 - .../pi-embedded-runner/model.e2e.test.ts | 63 - .../pi-embedded-runner/model.test-harness.ts | 47 - src/agents/pi-embedded-runner/model.test.ts | 394 --- src/agents/pi-embedded-runner/model.ts | 133 - .../run.overflow-compaction.e2e.test.ts | 369 --- .../run.overflow-compaction.fixture.ts | 66 - .../run.overflow-compaction.mocks.shared.ts | 170 -- .../run.overflow-compaction.test.ts | 136 - src/agents/pi-embedded-runner/run.ts | 1129 -------- .../run/attempt.e2e.test.ts | 60 - src/agents/pi-embedded-runner/run/attempt.ts | 1342 ---------- .../run/compaction-timeout.e2e.test.ts | 62 - .../run/compaction-timeout.ts | 54 - .../pi-embedded-runner/run/images.e2e.test.ts | 276 -- src/agents/pi-embedded-runner/run/images.ts | 474 ---- src/agents/pi-embedded-runner/run/params.ts | 104 - .../run/payloads.e2e.test.ts | 322 --- .../pi-embedded-runner/run/payloads.test.ts | 52 - src/agents/pi-embedded-runner/run/payloads.ts | 317 --- src/agents/pi-embedded-runner/run/types.ts | 53 - src/agents/pi-embedded-runner/runs.ts | 153 -- src/agents/pi-embedded-runner/sandbox-info.ts | 31 - ...on-history.tool-result-details.e2e.test.ts | 51 - .../session-manager-cache.ts | 69 - .../session-manager-init.ts | 53 - .../pi-embedded-runner/system-prompt.ts | 106 - src/agents/pi-embedded-runner/thinking.ts | 47 - .../tool-result-context-guard.e2e.test.ts | 270 -- .../tool-result-context-guard.ts | 336 --- .../tool-result-truncation.e2e.test.ts | 215 -- .../tool-result-truncation.ts | 328 --- src/agents/pi-embedded-runner/tool-split.ts | 17 - src/agents/pi-embedded-runner/types.ts | 105 - .../usage-reporting.test.ts | 61 - src/agents/pi-embedded-runner/utils.ts | 27 - .../wait-for-idle-before-flush.ts | 45 - ...-subscribe.code-span-awareness.e2e.test.ts | 62 - .../pi-embedded-subscribe.e2e-harness.ts | 183 -- ...-embedded-subscribe.handlers.compaction.ts | 77 - ...edded-subscribe.handlers.lifecycle.test.ts | 76 - ...i-embedded-subscribe.handlers.lifecycle.ts | 86 - ...bedded-subscribe.handlers.messages.test.ts | 31 - ...pi-embedded-subscribe.handlers.messages.ts | 429 --- ...cribe.handlers.tools.media.test-helpers.ts | 68 - ...ded-subscribe.handlers.tools.media.test.ts | 233 -- ...-embedded-subscribe.handlers.tools.test.ts | 303 --- .../pi-embedded-subscribe.handlers.tools.ts | 417 --- src/agents/pi-embedded-subscribe.handlers.ts | 66 - .../pi-embedded-subscribe.handlers.types.ts | 170 -- ...scribe.lifecycle-billing-error.e2e.test.ts | 35 - .../pi-embedded-subscribe.raw-stream.ts | 30 - ...-embedded-subscribe.reply-tags.e2e.test.ts | 91 - ...-tool-execution-start-preserve.e2e.test.ts | 91 - ...not-append-text-end-content-is.e2e.test.ts | 52 - ...lockreplyflush-callback-is-not.e2e.test.ts | 40 - ...uplicate-text-end-repeats-full.e2e.test.ts | 41 - ...t-duplicate-block-replies-text.e2e.test.ts | 109 - ...lock-replies-text-end-does-not.e2e.test.ts | 57 - ...ng-as-separate-message-enabled.e2e.test.ts | 71 - ...esses-output-without-start-tag.e2e.test.ts | 93 - ...action-metadata-tool-summaries.e2e.test.ts | 71 - ...final-answer-block-replies-are.e2e.test.ts | 69 - ...-indented-fenced-blocks-intact.e2e.test.ts | 50 - ...d-blocks-splitting-inside-them.e2e.test.ts | 39 - ...ngle-line-fenced-blocks-reopen.e2e.test.ts | 118 - ...ft-chunks-paragraph-preference.e2e.test.ts | 46 - ...ion.subscribeembeddedpisession.e2e.test.ts | 513 ---- ...end-block-replies-message-tool.e2e.test.ts | 97 - ...ction-retries-before-resolving.e2e.test.ts | 195 -- .../pi-embedded-subscribe.tools.e2e.test.ts | 38 - .../pi-embedded-subscribe.tools.media.test.ts | 220 -- .../pi-embedded-subscribe.tools.test.ts | 15 - src/agents/pi-embedded-subscribe.tools.ts | 345 --- src/agents/pi-embedded-subscribe.ts | 718 ------ src/agents/pi-embedded-subscribe.types.ts | 36 - src/agents/pi-embedded-utils.e2e.test.ts | 559 ---- src/agents/pi-embedded-utils.ts | 421 --- src/agents/pi-embedded.ts | 16 - .../compaction-safeguard-runtime.ts | 12 - .../compaction-safeguard.e2e.test.ts | 251 -- .../pi-extensions/compaction-safeguard.ts | 387 --- .../pi-extensions/context-pruning.e2e.test.ts | 452 ---- src/agents/pi-extensions/context-pruning.ts | 19 - .../context-pruning/extension.ts | 41 - .../pi-extensions/context-pruning/pruner.ts | 346 --- .../pi-extensions/context-pruning/runtime.ts | 17 - .../pi-extensions/context-pruning/settings.ts | 123 - .../pi-extensions/context-pruning/tools.ts | 26 - .../session-manager-runtime-registry.ts | 29 - src/agents/pi-model-discovery.ts | 21 - src/agents/pi-settings.e2e.test.ts | 142 - src/agents/pi-settings.ts | 97 - ...nition-adapter.after-tool-call.e2e.test.ts | 151 -- .../pi-tool-definition-adapter.e2e.test.ts | 49 - src/agents/pi-tool-definition-adapter.ts | 231 -- src/agents/pi-tools-agent-config.e2e.test.ts | 680 ----- src/agents/pi-tools.abort.ts | 67 - .../pi-tools.before-tool-call.e2e.test.ts | 235 -- src/agents/pi-tools.before-tool-call.test.ts | 308 --- src/agents/pi-tools.before-tool-call.ts | 251 -- ...ses-schemas-without-dropping-b.e2e.test.ts | 133 - ...ses-schemas-without-dropping-d.e2e.test.ts | 117 - ...ses-schemas-without-dropping-f.e2e.test.ts | 170 -- ...iases-schemas-without-dropping.e2e.test.ts | 622 ----- src/agents/pi-tools.policy.e2e.test.ts | 132 - src/agents/pi-tools.policy.ts | 299 --- src/agents/pi-tools.read.ts | 678 ----- src/agents/pi-tools.safe-bins.e2e.test.ts | 285 -- ...ndbox-mounted-paths.workspace-only.test.ts | 142 - src/agents/pi-tools.schema.ts | 202 -- src/agents/pi-tools.ts | 507 ---- src/agents/pi-tools.types.ts | 4 - ...pi-tools.whatsapp-login-gating.e2e.test.ts | 41 - .../pi-tools.workspace-paths.e2e.test.ts | 202 -- src/agents/pty-dsr.ts | 15 - src/agents/pty-keys.e2e.test.ts | 53 - src/agents/pty-keys.ts | 291 --- src/agents/queued-file-writer.ts | 34 - ....agent-specific-sandbox-config.e2e.test.ts | 478 ---- src/agents/sandbox-create-args.e2e.test.ts | 230 -- src/agents/sandbox-explain.e2e.test.ts | 119 - src/agents/sandbox-merge.e2e.test.ts | 127 - src/agents/sandbox-paths.test.ts | 128 - src/agents/sandbox-paths.ts | 161 -- src/agents/sandbox-skills.e2e.test.ts | 83 - src/agents/sandbox-tool-policy.ts | 37 - .../sandbox.resolveSandboxContext.e2e.test.ts | 87 - src/agents/sandbox.ts | 44 - src/agents/sandbox/browser-bridges.ts | 11 - src/agents/sandbox/browser.create.test.ts | 186 -- src/agents/sandbox/browser.novnc-url.test.ts | 46 - src/agents/sandbox/browser.ts | 389 --- src/agents/sandbox/config-hash.test.ts | 190 -- src/agents/sandbox/config-hash.ts | 56 - src/agents/sandbox/config.ts | 195 -- src/agents/sandbox/constants.ts | 54 - src/agents/sandbox/context.ts | 181 -- .../docker.config-hash-recreate.test.ts | 192 -- src/agents/sandbox/docker.ts | 482 ---- src/agents/sandbox/fs-bridge.test.ts | 106 - src/agents/sandbox/fs-bridge.ts | 247 -- src/agents/sandbox/fs-paths.test.ts | 105 - src/agents/sandbox/fs-paths.ts | 268 -- src/agents/sandbox/hash.ts | 5 - src/agents/sandbox/manage.ts | 106 - src/agents/sandbox/novnc-auth.ts | 81 - src/agents/sandbox/prune.ts | 112 - src/agents/sandbox/registry.test.ts | 257 -- src/agents/sandbox/registry.ts | 205 -- src/agents/sandbox/runtime-status.ts | 138 - src/agents/sandbox/sanitize-env-vars.test.ts | 57 - src/agents/sandbox/sanitize-env-vars.ts | 110 - src/agents/sandbox/shared.ts | 46 - src/agents/sandbox/test-fixtures.ts | 42 - src/agents/sandbox/tool-policy.ts | 109 - src/agents/sandbox/types.docker.ts | 22 - src/agents/sandbox/types.ts | 90 - .../sandbox/validate-sandbox-security.test.ts | 185 -- .../sandbox/validate-sandbox-security.ts | 195 -- src/agents/sandbox/workspace.ts | 51 - src/agents/sanitize-for-prompt.test.ts | 55 - src/agents/sanitize-for-prompt.ts | 18 - src/agents/schema/clean-for-gemini.ts | 409 --- src/agents/schema/typebox.ts | 43 - src/agents/session-dirs.ts | 22 - src/agents/session-file-repair.e2e.test.ts | 100 - src/agents/session-file-repair.ts | 109 - src/agents/session-slug.e2e.test.ts | 26 - src/agents/session-slug.ts | 143 - .../session-tool-result-guard-wrapper.ts | 71 - .../session-tool-result-guard.e2e.test.ts | 323 --- ...guard.tool-result-persist-hook.e2e.test.ts | 179 -- src/agents/session-tool-result-guard.ts | 252 -- .../session-transcript-repair.e2e.test.ts | 263 -- src/agents/session-transcript-repair.ts | 309 --- src/agents/session-write-lock.e2e.test.ts | 268 -- src/agents/session-write-lock.ts | 457 ---- src/agents/sessions-spawn-hooks.test.ts | 373 --- .../sessions-spawn-threadid.e2e.test.ts | 69 - src/agents/shell-utils.e2e.test.ts | 115 - src/agents/shell-utils.ts | 172 -- src/agents/skills-install-download.ts | 294 --- .../skills-install-fallback.e2e.test.ts | 240 -- src/agents/skills-install-output.ts | 40 - ...skills-install.download-tarbz2.e2e.test.ts | 215 -- .../skills-install.download-test-utils.ts | 66 - .../skills-install.download.e2e.test.ts | 248 -- src/agents/skills-install.e2e.test.ts | 108 - src/agents/skills-install.ts | 470 ---- src/agents/skills-status.e2e.test.ts | 43 - src/agents/skills-status.ts | 255 -- ...skills.agents-skills-directory.e2e.test.ts | 141 - ...out-affecting-workspace-skills.e2e.test.ts | 37 - ...orkspace-skills-managed-skills.e2e.test.ts | 128 - ...d-skills-into-target-workspace.e2e.test.ts | 177 -- ...ls.buildworkspaceskillsnapshot.e2e.test.ts | 225 -- ...ills.buildworkspaceskillstatus.e2e.test.ts | 113 - src/agents/skills.compact-skill-paths.test.ts | 67 - src/agents/skills.e2e-test-helpers.test.ts | 76 - src/agents/skills.e2e-test-helpers.ts | 30 - src/agents/skills.e2e.test.ts | 411 --- ...ills.loadworkspaceskillentries.e2e.test.ts | 96 - ...ills.resolveskillspromptforrun.e2e.test.ts | 32 - ...ls.summarize-skill-description.e2e.test.ts | 17 - src/agents/skills.test-helpers.ts | 23 - src/agents/skills.ts | 46 - src/agents/skills/bundled-context.ts | 40 - src/agents/skills/bundled-dir.e2e.test.ts | 57 - src/agents/skills/bundled-dir.ts | 90 - src/agents/skills/config.ts | 112 - src/agents/skills/env-overrides.ts | 196 -- src/agents/skills/filter.test.ts | 35 - src/agents/skills/filter.ts | 31 - src/agents/skills/frontmatter.e2e.test.ts | 19 - src/agents/skills/frontmatter.ts | 119 - src/agents/skills/plugin-skills.ts | 74 - src/agents/skills/refresh.test.ts | 92 - src/agents/skills/refresh.ts | 214 -- src/agents/skills/serialize.ts | 14 - src/agents/skills/tools-dir.ts | 11 - src/agents/skills/types.ts | 101 - src/agents/skills/workspace.ts | 837 ------ src/agents/stable-stringify.ts | 12 - src/agents/subagent-announce-queue.test.ts | 119 - src/agents/subagent-announce-queue.ts | 214 -- .../subagent-announce.format.e2e.test.ts | 1835 ------------- src/agents/subagent-announce.ts | 1230 --------- src/agents/subagent-depth.test.ts | 100 - src/agents/subagent-depth.ts | 176 -- src/agents/subagent-lifecycle-events.ts | 47 - src/agents/subagent-registry-cleanup.ts | 67 - .../subagent-registry-completion.test.ts | 79 - src/agents/subagent-registry-completion.ts | 96 - src/agents/subagent-registry-queries.ts | 146 -- src/agents/subagent-registry-state.ts | 56 - ...agent-registry.announce-loop-guard.test.ts | 154 -- src/agents/subagent-registry.archive.test.ts | 90 - src/agents/subagent-registry.mocks.shared.ts | 15 - src/agents/subagent-registry.nested.test.ts | 165 -- .../subagent-registry.persistence.e2e.test.ts | 278 -- .../subagent-registry.steer-restart.test.ts | 578 ----- src/agents/subagent-registry.store.ts | 131 - src/agents/subagent-registry.ts | 940 ------- src/agents/subagent-registry.types.ts | 35 - src/agents/subagent-spawn.ts | 527 ---- src/agents/synthetic-models.ts | 196 -- src/agents/system-prompt-params.e2e.test.ts | 104 - src/agents/system-prompt-params.ts | 95 - src/agents/system-prompt-report.test.ts | 84 - src/agents/system-prompt-report.ts | 172 -- src/agents/system-prompt-stability.test.ts | 155 -- src/agents/system-prompt.e2e.test.ts | 656 ----- src/agents/system-prompt.ts | 779 ------ .../assistant-message-fixtures.ts | 34 - src/agents/test-helpers/fast-coding-tools.ts | 1 - src/agents/test-helpers/fast-core-tools.ts | 10 - src/agents/test-helpers/fast-tool-stubs.ts | 30 - .../test-helpers/host-sandbox-fs-bridge.ts | 80 - .../pi-tools-sandbox-context.test.ts | 43 - .../test-helpers/pi-tools-sandbox-context.ts | 43 - src/agents/timeout.ts | 49 - src/agents/together-models.ts | 133 - src/agents/tool-call-id.e2e.test.ts | 216 -- src/agents/tool-call-id.ts | 268 -- src/agents/tool-display-common.ts | 1120 -------- src/agents/tool-display.e2e.test.ts | 297 --- src/agents/tool-display.json | 316 --- src/agents/tool-display.ts | 153 -- src/agents/tool-images.e2e.test.ts | 110 - src/agents/tool-images.log.test.ts | 66 - src/agents/tool-images.ts | 353 --- src/agents/tool-loop-detection.test.ts | 540 ---- src/agents/tool-loop-detection.ts | 623 ----- src/agents/tool-mutation.test.ts | 74 - src/agents/tool-mutation.ts | 206 -- src/agents/tool-policy-pipeline.test.ts | 66 - src/agents/tool-policy-pipeline.ts | 108 - src/agents/tool-policy.conformance.ts | 17 - src/agents/tool-policy.e2e.test.ts | 202 -- ...l-policy.plugin-only-allowlist.e2e.test.ts | 56 - src/agents/tool-policy.ts | 313 --- src/agents/tool-summaries.ts | 13 - src/agents/tools/agent-step.test.ts | 49 - src/agents/tools/agent-step.ts | 80 - src/agents/tools/agents-list-tool.ts | 97 - src/agents/tools/browser-tool.e2e.test.ts | 436 ---- src/agents/tools/browser-tool.schema.ts | 112 - src/agents/tools/browser-tool.ts | 828 ------ src/agents/tools/canvas-tool.ts | 215 -- src/agents/tools/common.e2e.test.ts | 90 - src/agents/tools/common.test.ts | 28 - src/agents/tools/common.ts | 322 --- src/agents/tools/cron-tool.e2e.test.ts | 539 ---- .../tools/cron-tool.flat-params.test.ts | 39 - src/agents/tools/cron-tool.ts | 487 ---- src/agents/tools/discord-actions-guild.ts | 529 ---- src/agents/tools/discord-actions-messaging.ts | 522 ---- .../discord-actions-moderation-shared.ts | 48 - .../discord-actions-moderation.authz.test.ts | 157 -- .../tools/discord-actions-moderation.ts | 120 - .../discord-actions-presence.e2e.test.ts | 160 -- src/agents/tools/discord-actions-presence.ts | 111 - src/agents/tools/discord-actions.e2e.test.ts | 678 ----- src/agents/tools/discord-actions.ts | 79 - src/agents/tools/gateway-tool.ts | 222 -- src/agents/tools/gateway.e2e.test.ts | 81 - src/agents/tools/gateway.ts | 126 - src/agents/tools/image-tool.e2e.test.ts | 679 ----- src/agents/tools/image-tool.helpers.ts | 88 - src/agents/tools/image-tool.ts | 584 ----- src/agents/tools/memory-tool.e2e.test.ts | 219 -- src/agents/tools/memory-tool.test.ts | 84 - src/agents/tools/memory-tool.ts | 242 -- src/agents/tools/message-tool.e2e.test.ts | 350 --- src/agents/tools/message-tool.ts | 678 ----- src/agents/tools/nodes-tool.ts | 576 ----- src/agents/tools/nodes-utils.ts | 80 - src/agents/tools/self-update-tool.ts | 63 - src/agents/tools/session-status-tool.ts | 398 --- src/agents/tools/sessions-access.test.ts | 143 - src/agents/tools/sessions-access.ts | 240 -- src/agents/tools/sessions-announce-target.ts | 58 - src/agents/tools/sessions-helpers.ts | 168 -- src/agents/tools/sessions-history-tool.ts | 251 -- src/agents/tools/sessions-list-tool.ts | 243 -- src/agents/tools/sessions-resolution.test.ts | 77 - src/agents/tools/sessions-resolution.ts | 257 -- src/agents/tools/sessions-send-helpers.ts | 166 -- src/agents/tools/sessions-send-tool.a2a.ts | 149 -- src/agents/tools/sessions-send-tool.ts | 363 --- src/agents/tools/sessions-spawn-tool.ts | 93 - src/agents/tools/sessions.e2e.test.ts | 223 -- src/agents/tools/slack-actions.e2e.test.ts | 585 ----- src/agents/tools/slack-actions.ts | 347 --- src/agents/tools/subagents-tool.ts | 680 ----- src/agents/tools/telegram-actions.e2e.test.ts | 680 ----- src/agents/tools/telegram-actions.ts | 374 --- src/agents/tools/tts-tool.test.ts | 16 - src/agents/tools/tts-tool.ts | 61 - src/agents/tools/web-fetch-utils.ts | 249 -- .../tools/web-fetch.cf-markdown.test.ts | 147 -- ...irecrawl-api-key-normalization.e2e.test.ts | 61 - .../tools/web-fetch.response-limit.test.ts | 34 - src/agents/tools/web-fetch.ssrf.e2e.test.ts | 145 -- src/agents/tools/web-fetch.test-harness.ts | 49 - src/agents/tools/web-fetch.test-mocks.ts | 14 - src/agents/tools/web-fetch.ts | 773 ------ src/agents/tools/web-search.e2e.test.ts | 244 -- src/agents/tools/web-search.ts | 828 ------ src/agents/tools/web-shared.ts | 170 -- .../web-tools.enabled-defaults.e2e.test.ts | 355 --- src/agents/tools/web-tools.fetch.e2e.test.ts | 413 --- .../tools/web-tools.readability.e2e.test.ts | 48 - src/agents/tools/web-tools.ts | 2 - src/agents/tools/whatsapp-actions.e2e.test.ts | 180 -- src/agents/tools/whatsapp-actions.ts | 50 - src/agents/tools/whatsapp-target-auth.ts | 27 - src/agents/transcript-policy.e2e.test.ts | 24 - src/agents/transcript-policy.test.ts | 42 - src/agents/transcript-policy.ts | 132 - src/agents/usage.e2e.test.ts | 92 - src/agents/usage.test.ts | 144 -- src/agents/usage.ts | 143 - src/agents/venice-models.ts | 403 --- .../workspace-context-awareness.live.test.ts | 136 - .../workspace-context-awareness.test.ts | 255 -- src/agents/workspace-dir.ts | 20 - src/agents/workspace-dirs.ts | 16 - src/agents/workspace-run.e2e.test.ts | 141 - src/agents/workspace-run.ts | 116 - src/agents/workspace-seed.ts | 237 -- src/agents/workspace-templates.e2e.test.ts | 59 - src/agents/workspace-templates.ts | 63 - src/agents/workspace.bootstrap-cache.test.ts | 130 - src/agents/workspace.defaults.e2e.test.ts | 19 - src/agents/workspace.e2e.test.ts | 143 - ...rkspace.load-extra-bootstrap-files.test.ts | 72 - src/agents/workspace.ts | 596 ----- src/agents/zai.live.test.ts | 40 - src/auto-reply/chunk.test.ts | 411 --- src/auto-reply/chunk.ts | 475 ---- src/auto-reply/command-auth.ts | 343 --- src/auto-reply/command-control.test.ts | 517 ---- src/auto-reply/command-detection.ts | 88 - src/auto-reply/commands-args.test.ts | 49 - src/auto-reply/commands-args.ts | 130 - src/auto-reply/commands-registry.data.ts | 736 ------ src/auto-reply/commands-registry.test.ts | 327 --- src/auto-reply/commands-registry.ts | 525 ---- src/auto-reply/commands-registry.types.ts | 86 - src/auto-reply/dispatch.test.ts | 91 - src/auto-reply/dispatch.ts | 97 - src/auto-reply/envelope.test.ts | 165 -- src/auto-reply/envelope.ts | 253 -- src/auto-reply/fallback-state.test.ts | 123 - src/auto-reply/fallback-state.ts | 180 -- src/auto-reply/group-activation.ts | 34 - src/auto-reply/heartbeat-reply-payload.ts | 22 - src/auto-reply/heartbeat.test.ts | 239 -- src/auto-reply/heartbeat.ts | 171 -- src/auto-reply/inbound-debounce.ts | 110 - src/auto-reply/inbound.test.ts | 406 --- src/auto-reply/media-note.test.ts | 179 -- src/auto-reply/media-note.ts | 154 -- .../media-understanding.test-fixtures.ts | 25 - src/auto-reply/model-runtime.ts | 93 - src/auto-reply/model.test.ts | 153 -- src/auto-reply/model.ts | 50 - src/auto-reply/reply.block-streaming.test.ts | 218 -- ...ts-thinking-xhigh-codex-models.e2e.test.ts | 208 -- ...ixed-messages-acks-immediately.e2e.test.ts | 171 -- ...ow-reasoning-capable-models-no.e2e.test.ts | 132 - ...irective.directive-behavior.e2e-harness.ts | 170 -- ....directive.directive-behavior.e2e-mocks.ts | 14 - ...nline-model-uses-default-model.e2e.test.ts | 111 - ...-allowlisted-models-model-list.e2e.test.ts | 198 -- ...s-fuzzy-selection-is-ambiguous.e2e.test.ts | 189 -- ...gent-allowlist-addition-global.e2e.test.ts | 160 -- ...-alongside-directive-only-acks.e2e.test.ts | 163 -- ...nt-elevated-level-as-off-after.e2e.test.ts | 77 - ...t-verbose-level-verbose-has-no.e2e.test.ts | 147 -- ...-model-matches-model-directive.e2e.test.ts | 203 -- ...rbose-during-flight-run-toggle.e2e.test.ts | 141 - src/auto-reply/reply.directive.parse.test.ts | 224 -- src/auto-reply/reply.heartbeat-typing.test.ts | 82 - src/auto-reply/reply.media-note.test.ts | 82 - src/auto-reply/reply.raw-body.test.ts | 93 - src/auto-reply/reply.test-harness.ts | 97 - ...y.triggers.group-intro-prompts.e2e.test.ts | 125 - ...tivation-from-allowfrom-groups.e2e.test.ts | 95 - ...ed-sender-toggle-elevated-mode.e2e.test.ts | 85 - ...ted-off-groups-without-mention.e2e.test.ts | 86 - ...summary-current-model-provider.e2e.test.ts | 263 -- ...ommands-strips-it-before-agent.e2e.test.ts | 131 - ...ed-directive-unapproved-sender.e2e.test.ts | 140 - ...or-cause-embedded-agent-throws.e2e.test.ts | 173 -- ...ne-status-unauthorized-senders.e2e.test.ts | 159 -- ...uth-profile-key-snippet-status.e2e.test.ts | 140 - ....runs-compact-as-gated-command.e2e.test.ts | 167 -- ...uns-greeting-prompt-bare-reset.e2e.test.ts | 77 - ...lt-model-status-not-configured.e2e.test.ts | 116 - ...-model-picker-grouped-by-model.e2e.test.ts | 135 - ...bound-media-into-sandbox-workspace.test.ts | 121 - ...ets-active-session-native-stop.e2e.test.ts | 218 -- ....triggers.trigger-handling.test-harness.ts | 263 -- src/auto-reply/reply.ts | 11 - src/auto-reply/reply/abort.test.ts | 415 --- src/auto-reply/reply/abort.ts | 271 -- .../reply/agent-runner-execution.ts | 586 ----- .../reply/agent-runner-helpers.test.ts | 112 - src/auto-reply/reply/agent-runner-helpers.ts | 82 - src/auto-reply/reply/agent-runner-memory.ts | 172 -- .../reply/agent-runner-payloads.test.ts | 46 - src/auto-reply/reply/agent-runner-payloads.ts | 120 - .../reply/agent-runner-utils.test.ts | 152 -- src/auto-reply/reply/agent-runner-utils.ts | 251 -- .../agent-runner.misc.runreplyagent.test.ts | 1362 ---------- .../reply/agent-runner.runreplyagent.test.ts | 1613 ------------ src/auto-reply/reply/agent-runner.ts | 730 ------ src/auto-reply/reply/audio-tags.ts | 1 - src/auto-reply/reply/bash-command.ts | 402 --- src/auto-reply/reply/block-reply-coalescer.ts | 149 -- src/auto-reply/reply/block-reply-pipeline.ts | 242 -- src/auto-reply/reply/block-streaming.ts | 165 -- src/auto-reply/reply/body.ts | 44 - src/auto-reply/reply/command-gates.ts | 49 - src/auto-reply/reply/commands-allowlist.ts | 713 ----- src/auto-reply/reply/commands-approve.ts | 125 - src/auto-reply/reply/commands-bash.ts | 29 - src/auto-reply/reply/commands-compact.ts | 143 - src/auto-reply/reply/commands-config.ts | 267 -- .../reply/commands-context-report.test.ts | 79 - .../reply/commands-context-report.ts | 267 -- src/auto-reply/reply/commands-context.ts | 45 - src/auto-reply/reply/commands-core.ts | 183 -- .../reply/commands-export-session.ts | 201 -- src/auto-reply/reply/commands-info.ts | 228 -- src/auto-reply/reply/commands-models.ts | 387 --- src/auto-reply/reply/commands-plugin.ts | 53 - src/auto-reply/reply/commands-ptt.ts | 208 -- .../reply/commands-session-ttl.test.ts | 147 -- src/auto-reply/reply/commands-session.ts | 550 ---- .../reply/commands-setunset-standard.ts | 23 - .../reply/commands-setunset.test.ts | 141 - src/auto-reply/reply/commands-setunset.ts | 101 - src/auto-reply/reply/commands-slash-parse.ts | 46 - .../reply/commands-spawn.test-harness.ts | 11 - src/auto-reply/reply/commands-status.ts | 203 -- .../reply/commands-subagents-focus.test.ts | 331 --- .../reply/commands-subagents-spawn.test.ts | 227 -- src/auto-reply/reply/commands-subagents.ts | 91 - .../reply/commands-subagents/action-agents.ts | 55 - .../reply/commands-subagents/action-focus.ts | 90 - .../reply/commands-subagents/action-help.ts | 6 - .../reply/commands-subagents/action-info.ts | 59 - .../reply/commands-subagents/action-kill.ts | 86 - .../reply/commands-subagents/action-list.ts | 66 - .../reply/commands-subagents/action-log.ts | 43 - .../reply/commands-subagents/action-send.ts | 159 -- .../reply/commands-subagents/action-spawn.ts | 65 - .../commands-subagents/action-unfocus.ts | 42 - .../reply/commands-subagents/shared.ts | 432 ---- .../reply/commands-system-prompt.ts | 133 - src/auto-reply/reply/commands-tts.ts | 279 -- src/auto-reply/reply/commands-types.ts | 64 - src/auto-reply/reply/commands.test-harness.ts | 51 - src/auto-reply/reply/commands.test.ts | 1353 ---------- src/auto-reply/reply/commands.ts | 8 - src/auto-reply/reply/config-commands.ts | 22 - src/auto-reply/reply/config-value.ts | 48 - src/auto-reply/reply/debug-commands.ts | 26 - .../reply/directive-handling.auth.ts | 211 -- .../reply/directive-handling.fast-lane.ts | 93 - .../reply/directive-handling.impl.ts | 466 ---- .../reply/directive-handling.levels.ts | 41 - .../reply/directive-handling.model-picker.ts | 97 - .../reply/directive-handling.model.test.ts | 211 -- .../reply/directive-handling.model.ts | 444 ---- .../reply/directive-handling.params.ts | 55 - .../reply/directive-handling.parse.ts | 215 -- .../reply/directive-handling.persist.ts | 235 -- .../directive-handling.queue-validation.ts | 78 - .../reply/directive-handling.shared.ts | 89 - src/auto-reply/reply/directive-handling.ts | 6 - src/auto-reply/reply/directive-parsing.ts | 40 - src/auto-reply/reply/directives.ts | 192 -- .../reply/dispatch-from-config.test.ts | 541 ---- src/auto-reply/reply/dispatch-from-config.ts | 499 ---- src/auto-reply/reply/dispatcher-registry.ts | 58 - src/auto-reply/reply/elevated-unavailable.ts | 30 - src/auto-reply/reply/exec.ts | 1 - src/auto-reply/reply/exec/directive.ts | 210 -- src/auto-reply/reply/export-html/template.css | 1060 -------- .../reply/export-html/template.html | 88 - src/auto-reply/reply/export-html/template.js | 1820 ------------- .../reply/export-html/vendor/highlight.min.js | 1213 --------- .../reply/export-html/vendor/marked.min.js | 6 - src/auto-reply/reply/followup-runner.test.ts | 300 --- src/auto-reply/reply/followup-runner.ts | 294 --- .../reply/get-reply-directives-apply.ts | 291 --- .../reply/get-reply-directives-utils.ts | 58 - src/auto-reply/reply/get-reply-directives.ts | 482 ---- ...ine-actions.skip-when-config-empty.test.ts | 86 - .../reply/get-reply-inline-actions.ts | 381 --- .../reply/get-reply-run.media-only.test.ts | 193 -- src/auto-reply/reply/get-reply-run.ts | 479 ---- src/auto-reply/reply/get-reply.ts | 372 --- src/auto-reply/reply/groups.ts | 151 -- src/auto-reply/reply/history.ts | 193 -- src/auto-reply/reply/inbound-context.ts | 124 - src/auto-reply/reply/inbound-dedupe.ts | 55 - src/auto-reply/reply/inbound-meta.test.ts | 182 -- src/auto-reply/reply/inbound-meta.ts | 197 -- src/auto-reply/reply/inbound-text.ts | 6 - src/auto-reply/reply/line-directives.ts | 342 --- src/auto-reply/reply/memory-flush.test.ts | 37 - src/auto-reply/reply/memory-flush.ts | 144 -- src/auto-reply/reply/mentions.ts | 160 -- src/auto-reply/reply/model-selection.test.ts | 266 -- src/auto-reply/reply/model-selection.ts | 591 ----- src/auto-reply/reply/normalize-reply.ts | 94 - .../reply/post-compaction-audit.test.ts | 197 -- src/auto-reply/reply/post-compaction-audit.ts | 111 - .../reply/post-compaction-context.test.ts | 169 -- .../reply/post-compaction-context.ts | 117 - src/auto-reply/reply/provider-dispatcher.ts | 44 - src/auto-reply/reply/queue.ts | 14 - src/auto-reply/reply/queue/cleanup.ts | 29 - src/auto-reply/reply/queue/directive.ts | 176 -- src/auto-reply/reply/queue/drain.ts | 145 -- src/auto-reply/reply/queue/enqueue.ts | 69 - src/auto-reply/reply/queue/normalize.ts | 44 - src/auto-reply/reply/queue/settings.ts | 68 - src/auto-reply/reply/queue/state.ts | 75 - src/auto-reply/reply/queue/types.ts | 91 - src/auto-reply/reply/reply-delivery.ts | 132 - src/auto-reply/reply/reply-directives.ts | 49 - src/auto-reply/reply/reply-dispatcher.ts | 236 -- src/auto-reply/reply/reply-elevated.ts | 195 -- src/auto-reply/reply/reply-flow.test.ts | 1301 ---------- src/auto-reply/reply/reply-inline.ts | 41 - src/auto-reply/reply/reply-payloads.test.ts | 61 - src/auto-reply/reply/reply-payloads.ts | 160 -- src/auto-reply/reply/reply-plumbing.test.ts | 286 -- src/auto-reply/reply/reply-reference.ts | 60 - src/auto-reply/reply/reply-state.test.ts | 404 --- src/auto-reply/reply/reply-tags.ts | 22 - src/auto-reply/reply/reply-threading.ts | 69 - src/auto-reply/reply/reply-utils.test.ts | 729 ------ .../reply/response-prefix-template.ts | 101 - src/auto-reply/reply/route-reply.test.ts | 452 ---- src/auto-reply/reply/route-reply.ts | 166 -- src/auto-reply/reply/session-reset-model.ts | 198 -- src/auto-reply/reply/session-reset-prompt.ts | 2 - .../reply/session-run-accounting.ts | 35 - src/auto-reply/reply/session-updates.ts | 288 --- src/auto-reply/reply/session-usage.ts | 129 - src/auto-reply/reply/session.test.ts | 1269 --------- src/auto-reply/reply/session.ts | 493 ---- src/auto-reply/reply/stage-sandbox-media.ts | 231 -- src/auto-reply/reply/streaming-directives.ts | 138 - .../reply/strip-inbound-meta.test.ts | 105 - src/auto-reply/reply/subagents-utils.test.ts | 132 - src/auto-reply/reply/subagents-utils.ts | 105 - src/auto-reply/reply/test-ctx.ts | 17 - src/auto-reply/reply/test-helpers.ts | 18 - src/auto-reply/reply/typing-mode.ts | 142 - src/auto-reply/reply/typing.ts | 196 -- src/auto-reply/reply/untrusted-context.ts | 16 - src/auto-reply/send-policy.ts | 44 - src/auto-reply/skill-commands.test.ts | 131 - src/auto-reply/skill-commands.ts | 147 -- .../stage-sandbox-media.test-harness.ts | 45 - src/auto-reply/status.test.ts | 655 ----- src/auto-reply/status.ts | 857 ------ src/auto-reply/templating.ts | 204 -- src/auto-reply/thinking.test.ts | 85 - src/auto-reply/thinking.ts | 227 -- src/auto-reply/tokens.ts | 40 - src/auto-reply/tool-meta.test.ts | 61 - src/auto-reply/tool-meta.ts | 143 - src/auto-reply/types.ts | 71 - src/browser/bridge-auth-registry.ts | 34 - src/browser/bridge-server.auth.test.ts | 86 - src/browser/bridge-server.ts | 110 - src/browser/browser-utils.test.ts | 247 -- src/browser/cdp.helpers.ts | 180 -- src/browser/cdp.test.ts | 255 -- src/browser/cdp.ts | 462 ---- src/browser/chrome.default-browser.test.ts | 82 - src/browser/chrome.executables.ts | 625 ----- src/browser/chrome.profile-decoration.ts | 198 -- src/browser/chrome.test.ts | 287 --- src/browser/chrome.ts | 350 --- src/browser/client-actions-core.ts | 259 -- src/browser/client-actions-observe.ts | 184 -- src/browser/client-actions-state.ts | 284 -- src/browser/client-actions-types.ts | 16 - src/browser/client-actions-url.ts | 11 - src/browser/client-actions.ts | 4 - .../client-fetch.loopback-auth.test.ts | 107 - src/browser/client-fetch.ts | 252 -- src/browser/client.test.ts | 273 -- src/browser/client.ts | 337 --- src/browser/config.test.ts | 190 -- src/browser/config.ts | 301 --- src/browser/constants.ts | 8 - src/browser/control-auth.auto-token.test.ts | 128 - src/browser/control-auth.test.ts | 97 - src/browser/control-auth.ts | 95 - src/browser/control-service.ts | 80 - src/browser/csrf.ts | 87 - src/browser/extension-relay-auth.test.ts | 120 - src/browser/extension-relay-auth.ts | 65 - src/browser/extension-relay.test.ts | 479 ---- src/browser/extension-relay.ts | 817 ------ src/browser/http-auth.ts | 63 - src/browser/navigation-guard.test.ts | 104 - src/browser/navigation-guard.ts | 63 - src/browser/paths.test.ts | 194 -- src/browser/paths.ts | 92 - src/browser/profiles-service.test.ts | 147 -- src/browser/profiles-service.ts | 187 -- src/browser/profiles.test.ts | 236 -- src/browser/profiles.ts | 113 - src/browser/proxy-files.ts | 40 - src/browser/pw-ai-module.ts | 51 - src/browser/pw-ai-state.ts | 9 - src/browser/pw-ai.test.ts | 184 -- src/browser/pw-ai.ts | 65 - src/browser/pw-role-snapshot.test.ts | 90 - src/browser/pw-role-snapshot.ts | 434 ---- .../pw-session.browserless.live.test.ts | 45 - ...ssion.create-page.navigation-guard.test.ts | 95 - ...ge-for-targetid.extension-fallback.test.ts | 61 - src/browser/pw-session.test.ts | 141 - src/browser/pw-session.ts | 806 ------ src/browser/pw-tools-core.activity.ts | 68 - ...re.clamps-timeoutms-scrollintoview.test.ts | 95 - src/browser/pw-tools-core.downloads.ts | 280 -- ...s-core.interactions.evaluate.abort.test.ts | 92 - src/browser/pw-tools-core.interactions.ts | 646 ----- ...ls-core.last-file-chooser-arm-wins.test.ts | 134 - src/browser/pw-tools-core.responses.ts | 123 - ...-core.screenshots-element-selector.test.ts | 123 - src/browser/pw-tools-core.shared.ts | 70 - ...tools-core.snapshot.navigate-guard.test.ts | 47 - src/browser/pw-tools-core.snapshot.ts | 212 -- src/browser/pw-tools-core.state.ts | 209 -- src/browser/pw-tools-core.storage.ts | 128 - src/browser/pw-tools-core.test-harness.ts | 64 - src/browser/pw-tools-core.trace.ts | 37 - src/browser/pw-tools-core.ts | 8 - ...-core.waits-next-download-saves-it.test.ts | 225 -- src/browser/resolved-config-refresh.ts | 58 - src/browser/routes/agent.act.shared.ts | 52 - src/browser/routes/agent.act.ts | 575 ----- src/browser/routes/agent.debug.ts | 149 -- src/browser/routes/agent.shared.test.ts | 39 - src/browser/routes/agent.shared.ts | 143 - src/browser/routes/agent.snapshot.ts | 333 --- src/browser/routes/agent.storage.test.ts | 65 - src/browser/routes/agent.storage.ts | 451 ---- src/browser/routes/agent.ts | 13 - src/browser/routes/basic.ts | 202 -- src/browser/routes/dispatcher.abort.test.ts | 49 - src/browser/routes/dispatcher.ts | 126 - src/browser/routes/index.ts | 11 - src/browser/routes/path-output.ts | 1 - src/browser/routes/tabs.ts | 217 -- src/browser/routes/types.ts | 26 - src/browser/routes/utils.ts | 73 - src/browser/screenshot.e2e.test.ts | 50 - src/browser/screenshot.ts | 58 - .../server-context.chrome-test-harness.ts | 24 - ...-tab-available.prefers-last-target.test.ts | 123 - ...server-context.hot-reload-profiles.test.ts | 169 -- .../server-context.remote-tab-ops.test.ts | 277 -- src/browser/server-context.ts | 685 ----- src/browser/server-context.types.ts | 65 - src/browser/server-lifecycle.test.ts | 123 - src/browser/server-lifecycle.ts | 48 - src/browser/server-middleware.ts | 37 - ...-contract-form-layout-act-commands.test.ts | 305 --- ....agent-contract-snapshot-endpoints.test.ts | 160 -- .../server.agent-contract.test-harness.ts | 26 - .../server.auth-token-gates-http.test.ts | 64 - .../server.control-server.test-harness.ts | 356 --- ...te-disabled-does-not-block-storage.test.ts | 160 -- ...s-open-profile-unknown-returns-404.test.ts | 164 -- src/browser/server.ts | 110 - src/browser/target-id.ts | 30 - src/browser/test-port.ts | 18 - src/browser/trash.ts | 21 - src/canvas-host/a2ui.ts | 209 -- src/canvas-host/a2ui/index.html | 307 --- src/canvas-host/file-resolver.ts | 50 - src/canvas-host/server.state-dir.test.ts | 28 - src/canvas-host/server.test.ts | 323 --- src/canvas-host/server.ts | 478 ---- src/channel-web.ts | 33 - src/channels/account-summary.ts | 36 - src/channels/ack-reactions.test.ts | 224 -- src/channels/ack-reactions.ts | 103 - src/channels/allow-from.test.ts | 89 - src/channels/allow-from.ts | 36 - src/channels/allowlist-match.ts | 52 - src/channels/allowlists/resolve-utils.test.ts | 87 - src/channels/allowlists/resolve-utils.ts | 169 -- src/channels/channel-config.test.ts | 216 -- src/channels/channel-config.ts | 182 -- src/channels/channel-helpers.test.ts | 193 -- src/channels/channels-misc.test.ts | 58 - src/channels/command-gating.test.ts | 97 - src/channels/command-gating.ts | 45 - src/channels/conversation-label.ts | 69 - src/channels/dock.ts | 617 ----- src/channels/draft-stream-loop.ts | 104 - src/channels/location.test.ts | 57 - src/channels/location.ts | 76 - src/channels/logging.ts | 33 - src/channels/mention-gating.test.ts | 69 - src/channels/mention-gating.ts | 59 - src/channels/model-overrides.test.ts | 69 - src/channels/model-overrides.ts | 142 - .../plugins/account-action-gate.test.ts | 34 - src/channels/plugins/account-action-gate.ts | 21 - src/channels/plugins/account-helpers.test.ts | 71 - src/channels/plugins/account-helpers.ts | 31 - src/channels/plugins/actions/actions.test.ts | 894 ------- src/channels/plugins/actions/discord.ts | 116 - .../discord/handle-action.guild-admin.ts | 451 ---- .../plugins/actions/discord/handle-action.ts | 272 -- src/channels/plugins/actions/signal.ts | 146 -- src/channels/plugins/actions/telegram.ts | 228 -- .../plugins/agent-tools/whatsapp-login.ts | 72 - src/channels/plugins/allowlist-match.ts | 2 - src/channels/plugins/bluebubbles-actions.ts | 34 - src/channels/plugins/catalog.ts | 307 --- src/channels/plugins/channel-config.ts | 10 - src/channels/plugins/config-helpers.ts | 113 - src/channels/plugins/config-schema.ts | 11 - src/channels/plugins/config-writes.ts | 40 - src/channels/plugins/directory-config.ts | 235 -- src/channels/plugins/group-mentions.test.ts | 55 - src/channels/plugins/group-mentions.ts | 375 --- src/channels/plugins/helpers.ts | 20 - src/channels/plugins/index.ts | 84 - src/channels/plugins/load.ts | 29 - src/channels/plugins/media-limits.ts | 25 - src/channels/plugins/message-action-names.ts | 55 - .../plugins/message-actions.security.test.ts | 82 - src/channels/plugins/message-actions.ts | 87 - src/channels/plugins/normalize/discord.ts | 47 - src/channels/plugins/normalize/imessage.ts | 49 - src/channels/plugins/normalize/signal.ts | 70 - src/channels/plugins/normalize/slack.ts | 26 - src/channels/plugins/normalize/telegram.ts | 39 - src/channels/plugins/normalize/whatsapp.ts | 23 - src/channels/plugins/onboarding-types.ts | 86 - .../plugins/onboarding/channel-access.ts | 100 - src/channels/plugins/onboarding/discord.ts | 450 ---- .../plugins/onboarding/helpers.test.ts | 69 - src/channels/plugins/onboarding/helpers.ts | 81 - src/channels/plugins/onboarding/imessage.ts | 273 -- src/channels/plugins/onboarding/signal.ts | 357 --- src/channels/plugins/onboarding/slack.ts | 484 ---- src/channels/plugins/onboarding/telegram.ts | 335 --- src/channels/plugins/onboarding/whatsapp.ts | 352 --- src/channels/plugins/outbound/discord.test.ts | 270 -- src/channels/plugins/outbound/discord.ts | 136 - .../plugins/outbound/imessage.test.ts | 69 - src/channels/plugins/outbound/imessage.ts | 46 - src/channels/plugins/outbound/load.ts | 37 - src/channels/plugins/outbound/signal.ts | 43 - src/channels/plugins/outbound/slack.test.ts | 183 -- src/channels/plugins/outbound/slack.ts | 130 - src/channels/plugins/outbound/telegram.ts | 98 - src/channels/plugins/outbound/whatsapp.ts | 42 - src/channels/plugins/pairing-message.ts | 2 - src/channels/plugins/pairing.ts | 69 - src/channels/plugins/plugins-channel.test.ts | 212 -- src/channels/plugins/plugins-core.test.ts | 448 ---- src/channels/plugins/setup-helpers.ts | 121 - src/channels/plugins/slack.actions.ts | 22 - .../plugins/status-issues/bluebubbles.ts | 108 - src/channels/plugins/status-issues/discord.ts | 166 -- src/channels/plugins/status-issues/shared.ts | 43 - .../plugins/status-issues/telegram.ts | 145 -- .../plugins/status-issues/whatsapp.ts | 73 - src/channels/plugins/status.ts | 36 - src/channels/plugins/types.adapters.ts | 320 --- src/channels/plugins/types.core.ts | 368 --- src/channels/plugins/types.plugin.ts | 84 - src/channels/plugins/types.ts | 65 - .../plugins/whatsapp-heartbeat.test.ts | 136 - src/channels/plugins/whatsapp-heartbeat.ts | 94 - src/channels/registry.ts | 191 -- src/channels/reply-prefix.ts | 62 - src/channels/sender-identity.ts | 41 - src/channels/sender-label.ts | 57 - src/channels/session.ts | 51 - src/channels/status-reactions.test.ts | 476 ---- src/channels/status-reactions.ts | 390 --- src/channels/targets.ts | 100 - src/channels/telegram/allow-from.test.ts | 26 - src/channels/telegram/allow-from.ts | 11 - src/channels/telegram/api.test.ts | 57 - src/channels/telegram/api.ts | 24 - src/channels/typing.ts | 30 - src/channels/web/index.ts | 13 - src/cli/acp-cli.option-collisions.test.ts | 154 -- src/cli/acp-cli.ts | 115 - src/cli/argv.test.ts | 284 -- src/cli/bootstrap-external.ts | 853 ++++++ src/cli/bootstrap.ts | 1 + src/cli/browser-cli-actions-input.ts | 1 - .../register.element.ts | 238 -- .../register.files-downloads.ts | 207 -- .../register.form-wait-eval.ts | 131 - .../register.navigation.ts | 70 - src/cli/browser-cli-actions-input/register.ts | 16 - src/cli/browser-cli-actions-input/shared.ts | 88 - src/cli/browser-cli-actions-observe.ts | 116 - src/cli/browser-cli-debug.ts | 225 -- src/cli/browser-cli-examples.ts | 34 - src/cli/browser-cli-extension.test.ts | 189 -- src/cli/browser-cli-extension.ts | 140 - src/cli/browser-cli-inspect.test.ts | 153 -- src/cli/browser-cli-inspect.ts | 160 -- src/cli/browser-cli-manage.ts | 492 ---- src/cli/browser-cli-resize.ts | 37 - src/cli/browser-cli-shared.ts | 84 - src/cli/browser-cli-state.cookies-storage.ts | 234 -- ...rowser-cli-state.option-collisions.test.ts | 143 - src/cli/browser-cli-state.ts | 276 -- src/cli/browser-cli.test.ts | 59 - src/cli/browser-cli.ts | 55 - src/cli/channel-auth.ts | 63 - src/cli/channel-options.ts | 33 - src/cli/channels-cli.ts | 256 -- src/cli/clawbot-cli.ts | 7 - src/cli/cli-utils.test.ts | 108 - src/cli/command-format.ts | 25 - src/cli/command-options.test.ts | 91 - src/cli/command-options.ts | 44 - src/cli/completion-cli.ts | 664 ----- src/cli/config-cli.test.ts | 227 -- src/cli/config-cli.ts | 351 --- src/cli/cron-cli.test.ts | 507 ---- src/cli/cron-cli.ts | 1 - src/cli/cron-cli/register.cron-add.ts | 275 -- src/cli/cron-cli/register.cron-edit.ts | 261 -- src/cli/cron-cli/register.cron-simple.ts | 109 - src/cli/cron-cli/register.ts | 27 - src/cli/cron-cli/shared.test.ts | 113 - src/cli/cron-cli/shared.ts | 234 -- src/cli/daemon-cli-compat.test.ts | 42 - src/cli/daemon-cli-compat.ts | 99 - src/cli/daemon-cli.coverage.e2e.test.ts | 236 -- src/cli/daemon-cli.ts | 15 - src/cli/daemon-cli/install.ts | 200 -- src/cli/daemon-cli/lifecycle-core.test.ts | 93 - src/cli/daemon-cli/lifecycle-core.ts | 328 --- src/cli/daemon-cli/lifecycle.test.ts | 131 - src/cli/daemon-cli/lifecycle.ts | 127 - src/cli/daemon-cli/probe.ts | 39 - .../register-service-commands.test.ts | 72 - .../daemon-cli/register-service-commands.ts | 101 - src/cli/daemon-cli/register.ts | 19 - src/cli/daemon-cli/response.ts | 110 - src/cli/daemon-cli/restart-health.ts | 172 -- src/cli/daemon-cli/runners.ts | 8 - src/cli/daemon-cli/shared.test.ts | 16 - src/cli/daemon-cli/shared.ts | 182 -- src/cli/daemon-cli/status.gather.ts | 298 --- src/cli/daemon-cli/status.print.ts | 310 --- src/cli/daemon-cli/status.ts | 20 - src/cli/daemon-cli/types.ts | 27 - src/cli/deps.test.ts | 93 - src/cli/deps.ts | 52 - src/cli/devices-cli.test.ts | 305 --- src/cli/devices-cli.ts | 453 ---- src/cli/directory-cli.ts | 268 -- src/cli/dns-cli.ts | 262 -- src/cli/docs-cli.ts | 23 - src/cli/exec-approvals-cli.test.ts | 145 -- src/cli/exec-approvals-cli.ts | 478 ---- src/cli/gateway-cli.coverage.e2e.test.ts | 257 -- src/cli/gateway-cli.ts | 1 - src/cli/gateway-cli/call.ts | 43 - src/cli/gateway-cli/dev.ts | 130 - src/cli/gateway-cli/discover.ts | 111 - .../register.option-collisions.test.ts | 155 -- src/cli/gateway-cli/register.ts | 277 -- src/cli/gateway-cli/run-loop.test.ts | 179 -- src/cli/gateway-cli/run-loop.ts | 164 -- .../gateway-cli/run.option-collisions.test.ts | 155 -- src/cli/gateway-cli/run.ts | 399 --- src/cli/gateway-cli/shared.ts | 109 - src/cli/gateway-rpc.ts | 47 - src/cli/gateway.sigterm.e2e.test.ts | 160 -- src/cli/help-format.ts | 27 - src/cli/hooks-cli.test.ts | 72 - src/cli/hooks-cli.ts | 833 ------ src/cli/logs-cli.test.ts | 153 -- src/cli/logs-cli.ts | 328 --- src/cli/memory-cli.test.ts | 406 --- src/cli/memory-cli.ts | 762 ------ src/cli/models-cli.test.ts | 112 - src/cli/models-cli.ts | 443 ---- src/cli/node-cli.ts | 1 - src/cli/node-cli/daemon.ts | 304 --- src/cli/node-cli/register.ts | 110 - src/cli/nodes-camera.test.ts | 262 -- src/cli/nodes-camera.ts | 165 -- src/cli/nodes-canvas.ts | 24 - src/cli/nodes-cli.coverage.test.ts | 221 -- src/cli/nodes-cli.ts | 1 - src/cli/nodes-cli/a2ui-jsonl.ts | 89 - src/cli/nodes-cli/cli-utils.ts | 30 - src/cli/nodes-cli/format.ts | 16 - src/cli/nodes-cli/pairing-render.ts | 38 - src/cli/nodes-cli/register.camera.ts | 250 -- src/cli/nodes-cli/register.canvas.ts | 245 -- ....invoke.nodes-run-approval-timeout.test.ts | 115 - src/cli/nodes-cli/register.invoke.ts | 368 --- src/cli/nodes-cli/register.location.ts | 81 - src/cli/nodes-cli/register.notify.ts | 57 - src/cli/nodes-cli/register.pairing.ts | 100 - src/cli/nodes-cli/register.push.ts | 88 - src/cli/nodes-cli/register.screen.ts | 82 - src/cli/nodes-cli/register.status.ts | 408 --- src/cli/nodes-cli/register.ts | 39 - src/cli/nodes-cli/rpc.ts | 97 - src/cli/nodes-cli/types.ts | 51 - src/cli/nodes-media-utils.test.ts | 30 - src/cli/nodes-media-utils.ts | 35 - src/cli/nodes-run.ts | 25 - src/cli/nodes-screen.ts | 38 - src/cli/outbound-send-deps.ts | 11 - src/cli/outbound-send-mapping.test.ts | 29 - src/cli/outbound-send-mapping.ts | 22 - src/cli/pairing-cli.test.ts | 227 -- src/cli/pairing-cli.ts | 173 -- src/cli/parse-bytes.ts | 46 - src/cli/parse-duration.ts | 39 - src/cli/parse-timeout.ts | 18 - src/cli/plugin-registry.ts | 39 - src/cli/plugins-cli.ts | 762 ------ src/cli/profile.test.ts | 163 -- src/cli/program.force.test.ts | 143 - src/cli/program.nodes-basic.e2e.test.ts | 298 --- src/cli/program.nodes-media.e2e.test.ts | 440 ---- src/cli/program.smoke.e2e.test.ts | 255 -- src/cli/program.test-mocks.ts | 78 - src/cli/program/action-reparse.test.ts | 78 - src/cli/program/build-program.test.ts | 62 - .../build-program.version-alias.test.ts | 39 - src/cli/program/command-registry.test.ts | 146 -- src/cli/program/command-registry.ts | 286 +- src/cli/program/command-tree.test.ts | 39 - src/cli/program/config-guard.test.ts | 103 - src/cli/program/config-guard.ts | 95 - src/cli/program/context.test.ts | 37 - src/cli/program/context.ts | 5 +- src/cli/program/help.test.ts | 125 - src/cli/program/help.ts | 6 +- src/cli/program/helpers.test.ts | 41 - src/cli/program/message/helpers.test.ts | 221 -- src/cli/program/message/helpers.ts | 87 - src/cli/program/message/register.broadcast.ts | 16 - .../program/message/register.discord-admin.ts | 157 -- .../program/message/register.emoji-sticker.ts | 57 - .../message/register.permissions-search.ts | 30 - src/cli/program/message/register.pins.ts | 35 - src/cli/program/message/register.poll.ts | 32 - src/cli/program/message/register.reactions.ts | 33 - .../message/register.read-edit-delete.ts | 50 - src/cli/program/message/register.send.ts | 36 - src/cli/program/message/register.thread.ts | 55 - src/cli/program/preaction.test.ts | 162 -- src/cli/program/preaction.ts | 40 +- src/cli/program/program-context.test.ts | 38 - src/cli/program/register.agent.test.ts | 216 -- src/cli/program/register.agent.ts | 228 -- src/cli/program/register.bootstrap.ts | 41 + src/cli/program/register.configure.test.ts | 52 - src/cli/program/register.configure.ts | 31 - src/cli/program/register.maintenance.test.ts | 164 -- src/cli/program/register.maintenance.ts | 113 - src/cli/program/register.message.test.ts | 123 - src/cli/program/register.message.ts | 68 - src/cli/program/register.onboard.test.ts | 114 - src/cli/program/register.onboard.ts | 186 -- src/cli/program/register.setup.test.ts | 89 - src/cli/program/register.setup.ts | 53 - .../register.status-health-sessions.test.ts | 136 - .../register.status-health-sessions.ts | 149 -- src/cli/program/register.subclis.e2e.test.ts | 98 - src/cli/program/register.subclis.ts | 339 --- src/cli/program/routes.test.ts | 82 - src/cli/program/routes.ts | 256 -- src/cli/progress.test.ts | 46 - src/cli/progress.ts | 230 -- src/cli/prompt.test.ts | 48 - src/cli/prompt.ts | 21 - src/cli/qr-cli.test.ts | 195 -- src/cli/qr-cli.ts | 183 -- src/cli/requirements-test-fixtures.ts | 18 - src/cli/route.ts | 40 - src/cli/run-main.exit.test.ts | 50 - src/cli/run-main.test.ts | 127 - src/cli/run-main.ts | 199 +- src/cli/sandbox-cli.ts | 174 -- src/cli/security-cli.ts | 164 -- src/cli/shared/parse-port.ts | 19 - src/cli/skills-cli.e2e.test.ts | 85 - src/cli/skills-cli.format.ts | 301 --- src/cli/skills-cli.test.ts | 219 -- src/cli/skills-cli.ts | 96 - src/cli/system-cli.test.ts | 91 - src/cli/system-cli.ts | 132 - src/cli/test-runtime-capture.ts | 33 - src/cli/tui-cli.ts | 50 - src/cli/update-cli.option-collisions.test.ts | 73 - src/cli/update-cli.test.ts | 764 ------ src/cli/update-cli.ts | 154 -- src/cli/update-cli/progress.ts | 156 -- src/cli/update-cli/restart-helper.test.ts | 213 -- src/cli/update-cli/restart-helper.ts | 142 - .../update-cli/shared.command-runner.test.ts | 52 - src/cli/update-cli/shared.ts | 287 --- src/cli/update-cli/status.ts | 128 - src/cli/update-cli/suppress-deprecations.ts | 16 - src/cli/update-cli/update-command.ts | 781 ------ src/cli/update-cli/wizard.ts | 151 -- src/cli/wait.ts | 8 - src/cli/webhooks-cli.ts | 197 -- src/commands/agent-via-gateway.e2e.test.ts | 335 --- src/commands/agent-via-gateway.ts | 545 ---- src/commands/agent.delivery.e2e.test.ts | 217 -- src/commands/agent.e2e.test.ts | 537 ---- src/commands/agent.ts | 704 ----- src/commands/agent/delivery.ts | 205 -- src/commands/agent/run-context.ts | 55 - src/commands/agent/session-store.ts | 89 - src/commands/agent/session.test.ts | 179 -- src/commands/agent/session.ts | 166 -- src/commands/agent/types.ts | 83 - src/commands/agents.add.e2e.test.ts | 73 - src/commands/agents.bindings.ts | 162 -- src/commands/agents.command-shared.ts | 11 - src/commands/agents.commands.add.ts | 367 --- src/commands/agents.commands.delete.ts | 101 - src/commands/agents.commands.identity.ts | 233 -- src/commands/agents.commands.list.ts | 134 - src/commands/agents.config.ts | 210 -- src/commands/agents.e2e.test.ts | 140 - src/commands/agents.identity.e2e.test.ts | 211 -- src/commands/agents.providers.ts | 188 -- src/commands/agents.ts | 6 - src/commands/auth-choice-legacy.ts | 28 - src/commands/auth-choice-options.e2e.test.ts | 91 - src/commands/auth-choice-options.ts | 372 --- src/commands/auth-choice-prompt.ts | 60 - src/commands/auth-choice.api-key.ts | 48 - src/commands/auth-choice.apply-helpers.ts | 15 - src/commands/auth-choice.apply.anthropic.ts | 110 - .../auth-choice.apply.api-providers.ts | 957 ------- src/commands/auth-choice.apply.byteplus.ts | 73 - .../auth-choice.apply.copilot-proxy.ts | 14 - .../auth-choice.apply.github-copilot.ts | 64 - .../auth-choice.apply.google-antigravity.ts | 14 - .../auth-choice.apply.google-gemini-cli.ts | 14 - .../auth-choice.apply.huggingface.test.ts | 130 - src/commands/auth-choice.apply.huggingface.ts | 158 -- src/commands/auth-choice.apply.minimax.ts | 148 -- src/commands/auth-choice.apply.oauth.ts | 94 - src/commands/auth-choice.apply.openai.ts | 146 -- src/commands/auth-choice.apply.openrouter.ts | 95 - .../auth-choice.apply.plugin-provider.ts | 129 - src/commands/auth-choice.apply.qwen-portal.ts | 14 - src/commands/auth-choice.apply.ts | 64 - src/commands/auth-choice.apply.vllm.ts | 46 - src/commands/auth-choice.apply.volcengine.ts | 73 - src/commands/auth-choice.apply.xai.ts | 79 - src/commands/auth-choice.default-model.ts | 30 - src/commands/auth-choice.e2e.test.ts | 886 ------- src/commands/auth-choice.model-check.ts | 80 - src/commands/auth-choice.moonshot.e2e.test.ts | 98 - .../auth-choice.preferred-provider.ts | 53 - src/commands/auth-choice.ts | 3 - src/commands/auth-token.ts | 38 - src/commands/channel-test-helpers.ts | 20 - src/commands/channels.add.test.ts | 62 - ...s-non-default-telegram-account.e2e.test.ts | 516 ---- src/commands/channels.mock-harness.ts | 33 - ...-errors-channels-status-output.e2e.test.ts | 65 - src/commands/channels.ts | 14 - src/commands/channels/add-mutators.ts | 33 - src/commands/channels/add.ts | 236 -- .../channels/capabilities.e2e.test.ts | 138 - src/commands/channels/capabilities.ts | 556 ---- src/commands/channels/list.ts | 183 -- src/commands/channels/logs.ts | 113 - src/commands/channels/remove.ts | 148 -- src/commands/channels/resolve.ts | 149 -- src/commands/channels/shared.ts | 47 - src/commands/channels/status.ts | 286 -- src/commands/chutes-oauth.e2e.test.ts | 179 -- src/commands/chutes-oauth.ts | 217 -- src/commands/cleanup-plan.ts | 25 - src/commands/cleanup-utils.test.ts | 52 - src/commands/cleanup-utils.ts | 109 - src/commands/config-validation.ts | 20 - src/commands/configure.channels.ts | 82 - src/commands/configure.commands.ts | 37 - src/commands/configure.daemon.ts | 136 - .../configure.gateway-auth.e2e.test.ts | 165 -- src/commands/configure.gateway-auth.ts | 134 - src/commands/configure.gateway.e2e.test.ts | 157 -- src/commands/configure.gateway.ts | 289 --- src/commands/configure.shared.ts | 96 - src/commands/configure.ts | 12 - src/commands/configure.wizard.e2e.test.ts | 166 -- src/commands/configure.wizard.ts | 606 ----- .../daemon-install-helpers.e2e.test.ts | 244 -- src/commands/daemon-install-helpers.ts | 81 - .../daemon-install-runtime-warning.test.ts | 71 - .../daemon-install-runtime-warning.ts | 20 - src/commands/daemon-runtime.ts | 19 - src/commands/dashboard.e2e.test.ts | 118 - src/commands/dashboard.test.ts | 126 - src/commands/dashboard.ts | 69 - src/commands/docs.ts | 195 -- ...r-auth.deprecated-cli-profiles.e2e.test.ts | 103 - src/commands/doctor-auth.ts | 334 --- src/commands/doctor-completion.ts | 179 -- src/commands/doctor-config-flow.e2e.test.ts | 471 ---- ...doctor-config-flow.include-warning.test.ts | 38 - src/commands/doctor-config-flow.ts | 936 ------- src/commands/doctor-format.ts | 84 - src/commands/doctor-gateway-daemon-flow.ts | 260 -- src/commands/doctor-gateway-health.ts | 58 - src/commands/doctor-gateway-services.test.ts | 165 -- src/commands/doctor-gateway-services.ts | 295 --- src/commands/doctor-install.ts | 40 - src/commands/doctor-legacy-config.e2e.test.ts | 225 -- src/commands/doctor-legacy-config.ts | 378 --- src/commands/doctor-memory-search.test.ts | 116 - src/commands/doctor-memory-search.ts | 147 -- ...-notes.launchctl-env-overrides.e2e.test.ts | 59 - src/commands/doctor-platform-notes.ts | 142 - src/commands/doctor-prompter.ts | 113 - src/commands/doctor-sandbox.ts | 288 --- src/commands/doctor-security.e2e.test.ts | 105 - src/commands/doctor-security.ts | 178 -- src/commands/doctor-session-locks.test.ts | 80 - src/commands/doctor-session-locks.ts | 85 - src/commands/doctor-state-integrity.test.ts | 133 - src/commands/doctor-state-integrity.ts | 458 ---- .../doctor-state-migrations.e2e.test.ts | 551 ---- src/commands/doctor-state-migrations.ts | 12 - src/commands/doctor-ui.ts | 154 -- src/commands/doctor-update.ts | 88 - src/commands/doctor-workspace-status.ts | 68 - src/commands/doctor-workspace.ts | 60 - src/commands/doctor.e2e-harness.ts | 426 --- ...om-channels-whatsapp-allowfrom.e2e.test.ts | 144 -- ...lack-discord-dm-policy-aliases.e2e.test.ts | 54 - ...te-migrations-yes-mode-without.e2e.test.ts | 95 - src/commands/doctor.ts | 320 --- ...t-sandbox-docker-browser-prune.e2e.test.ts | 89 - ...rns-state-directory-is-missing.e2e.test.ts | 87 - src/commands/gateway-presence.ts | 27 - src/commands/gateway-status.e2e.test.ts | 315 --- src/commands/gateway-status.ts | 408 --- src/commands/gateway-status/helpers.ts | 286 -- src/commands/google-gemini-model-default.ts | 11 - src/commands/health-format.ts | 49 - .../health.command.coverage.e2e.test.ts | 134 - src/commands/health.e2e.test.ts | 189 -- src/commands/health.snapshot.e2e.test.ts | 253 -- src/commands/health.ts | 751 ------ src/commands/message-format.ts | 422 --- src/commands/message.e2e.test.ts | 272 -- src/commands/message.ts | 67 - src/commands/model-allowlist.ts | 41 - src/commands/model-default.ts | 45 - src/commands/model-picker.e2e.test.ts | 251 -- src/commands/model-picker.ts | 570 ---- .../models.auth.provider-resolution.test.ts | 48 - src/commands/models.list.auth-sync.test.ts | 135 - src/commands/models.list.test.ts | 500 ---- src/commands/models.set.e2e.test.ts | 93 - src/commands/models.ts | 33 - src/commands/models/aliases.ts | 118 - src/commands/models/auth-order.ts | 131 - src/commands/models/auth.ts | 389 --- src/commands/models/fallbacks-shared.ts | 158 -- src/commands/models/fallbacks.ts | 42 - src/commands/models/image-fallbacks.ts | 42 - src/commands/models/list.auth-overview.ts | 116 - src/commands/models/list.configured.ts | 107 - src/commands/models/list.errors.ts | 16 - src/commands/models/list.format.ts | 58 - .../list.list-command.forward-compat.test.ts | 96 - src/commands/models/list.list-command.ts | 142 - src/commands/models/list.probe.ts | 487 ---- src/commands/models/list.registry.ts | 239 -- src/commands/models/list.status-command.ts | 691 ----- src/commands/models/list.status.e2e.test.ts | 277 -- src/commands/models/list.table.ts | 91 - src/commands/models/list.ts | 2 - src/commands/models/list.types.ts | 34 - src/commands/models/scan.ts | 362 --- src/commands/models/set-image.ts | 12 - src/commands/models/set.ts | 12 - src/commands/models/shared.test.ts | 63 - src/commands/models/shared.ts | 219 -- src/commands/node-daemon-install-helpers.ts | 65 - src/commands/node-daemon-runtime.ts | 16 - src/commands/oauth-env.ts | 22 - src/commands/oauth-flow.ts | 53 - src/commands/onboard-auth.config-core.ts | 488 ---- src/commands/onboard-auth.config-gateways.ts | 91 - src/commands/onboard-auth.config-litellm.ts | 65 - src/commands/onboard-auth.config-minimax.ts | 213 -- src/commands/onboard-auth.config-opencode.ts | 28 - src/commands/onboard-auth.config-shared.ts | 186 -- src/commands/onboard-auth.credentials.ts | 362 --- src/commands/onboard-auth.e2e.test.ts | 649 ----- src/commands/onboard-auth.models.ts | 182 -- src/commands/onboard-auth.ts | 109 - src/commands/onboard-channels.e2e.test.ts | 202 -- src/commands/onboard-channels.ts | 679 ----- src/commands/onboard-config.ts | 21 - src/commands/onboard-custom.e2e.test.ts | 273 -- src/commands/onboard-custom.ts | 721 ------ src/commands/onboard-helpers.e2e.test.ts | 155 -- src/commands/onboard-helpers.ts | 487 ---- src/commands/onboard-hooks.e2e.test.ts | 236 -- src/commands/onboard-hooks.ts | 85 - src/commands/onboard-interactive.test.ts | 85 - src/commands/onboard-interactive.ts | 31 - ...nboard-non-interactive.gateway.e2e.test.ts | 259 -- ...-non-interactive.provider-auth.e2e.test.ts | 532 ---- .../onboard-non-interactive.test-helpers.ts | 54 - src/commands/onboard-non-interactive.ts | 37 - .../onboard-non-interactive/api-keys.ts | 92 - src/commands/onboard-non-interactive/local.ts | 135 - .../local/auth-choice-inference.ts | 73 - .../local/auth-choice.ts | 785 ------ .../local/daemon-install.ts | 74 - .../local/gateway-config.ts | 115 - .../onboard-non-interactive/local/output.ts | 40 - .../local/skills-config.ts | 31 - .../local/workspace.ts | 16 - .../onboard-non-interactive/remote.ts | 53 - src/commands/onboard-provider-auth-flags.ts | 185 -- src/commands/onboard-remote.ts | 157 -- src/commands/onboard-skills.e2e.test.ts | 185 -- src/commands/onboard-skills.ts | 222 -- src/commands/onboard-types.ts | 153 -- src/commands/onboard.ts | 78 - .../onboarding/__tests__/test-utils.ts | 24 - .../onboarding/plugin-install.e2e.test.ts | 166 -- src/commands/onboarding/plugin-install.ts | 223 -- src/commands/onboarding/registry.ts | 26 - src/commands/onboarding/types.ts | 1 - src/commands/openai-codex-model-default.ts | 58 - src/commands/openai-codex-oauth.test.ts | 98 - src/commands/openai-codex-oauth.ts | 55 - src/commands/openai-model-default.e2e.test.ts | 259 -- src/commands/openai-model-default.ts | 47 - src/commands/opencode-zen-model-default.ts | 19 - src/commands/provider-auth-helpers.ts | 82 - src/commands/reset.ts | 145 -- src/commands/sandbox-display.ts | 136 - src/commands/sandbox-explain.e2e.test.ts | 46 - src/commands/sandbox-explain.ts | 337 --- src/commands/sandbox-formatters.e2e.test.ts | 137 - src/commands/sandbox-formatters.ts | 37 - src/commands/sandbox.e2e.test.ts | 328 --- src/commands/sandbox.ts | 200 -- src/commands/sessions.e2e.test.ts | 151 -- .../sessions.model-resolution.test.ts | 63 - src/commands/sessions.test-helpers.ts | 84 - src/commands/sessions.ts | 282 -- src/commands/setup.ts | 75 - src/commands/signal-install.test.ts | 194 -- src/commands/signal-install.ts | 302 --- src/commands/status-all.ts | 346 --- src/commands/status-all/agents.ts | 72 - .../channels.mattermost-token-summary.test.ts | 137 - src/commands/status-all/channels.ts | 493 ---- src/commands/status-all/diagnosis.ts | 247 -- src/commands/status-all/format.ts | 36 - src/commands/status-all/gateway.ts | 183 -- src/commands/status-all/report-lines.ts | 196 -- src/commands/status.agent-local.ts | 88 - src/commands/status.command.ts | 626 ----- src/commands/status.daemon.ts | 43 - src/commands/status.e2e.test.ts | 535 ---- src/commands/status.format.ts | 80 - src/commands/status.gateway-probe.ts | 28 - src/commands/status.link-channel.ts | 55 - src/commands/status.scan.ts | 203 -- src/commands/status.summary.redaction.test.ts | 56 - src/commands/status.summary.ts | 223 -- src/commands/status.ts | 3 - src/commands/status.types.ts | 61 - src/commands/status.update.test.ts | 147 -- src/commands/status.update.ts | 133 - src/commands/systemd-linger.ts | 121 - src/commands/test-runtime-config-helpers.ts | 31 - src/commands/test-wizard-helpers.ts | 92 - src/commands/uninstall.ts | 194 -- src/commands/vllm-setup.ts | 78 - src/commands/zai-endpoint-detect.e2e.test.ts | 66 - src/commands/zai-endpoint-detect.ts | 148 -- src/compat/legacy-names.ts | 15 - src/config/agent-dirs.test.ts | 47 - src/config/agent-dirs.ts | 112 - src/config/agent-limits.ts | 22 - src/config/backup-rotation.ts | 26 - src/config/cache-utils.ts | 27 - src/config/channel-capabilities.test.ts | 165 -- src/config/channel-capabilities.ts | 73 - src/config/commands.test.ts | 134 - src/config/commands.ts | 90 - src/config/config-misc.test.ts | 316 --- src/config/config-paths.ts | 82 - .../config.agent-concurrency-defaults.test.ts | 65 - src/config/config.backup-rotation.test.ts | 52 - src/config/config.compaction-settings.test.ts | 107 - src/config/config.discord-presence.test.ts | 67 - src/config/config.discord.test.ts | 99 - src/config/config.dm-policy-alias.test.ts | 38 - src/config/config.env-vars.test.ts | 107 - src/config/config.hooks-module-paths.test.ts | 58 - src/config/config.identity-avatar.test.ts | 52 - src/config/config.identity-defaults.test.ts | 174 -- src/config/config.irc.test.ts | 133 - ...tion.accepts-imessage-dmpolicy.e2e.test.ts | 424 --- ...tion.rejects-routing-allowfrom.e2e.test.ts | 640 ----- src/config/config.msteams.test.ts | 37 - ...ig.multi-agent-agentdir-validation.test.ts | 54 - ...onfig.nix-integration-u3-u5-u9.e2e.test.ts | 272 -- src/config/config.plugin-validation.test.ts | 180 -- src/config/config.pruning-defaults.test.ts | 85 - src/config/config.sandbox-docker.test.ts | 222 -- src/config/config.schema-regressions.test.ts | 94 - .../config.skills-entries-config.test.ts | 47 - .../config.talk-api-key-fallback.test.ts | 45 - .../config.telegram-custom-commands.test.ts | 42 - src/config/config.tools-alsoAllow.test.ts | 52 - src/config/config.ts | 21 - src/config/defaults.ts | 470 ---- src/config/discord-preview-streaming.ts | 144 -- src/config/env-preserve-io.test.ts | 171 -- src/config/env-preserve.test.ts | 182 -- src/config/env-preserve.ts | 134 - src/config/env-substitution.test.ts | 289 --- src/config/env-substitution.ts | 171 -- src/config/env-vars.ts | 72 - src/config/group-policy.ts | 238 -- src/config/home-env.test-harness.ts | 14 - src/config/includes-scan.ts | 87 - src/config/includes.test.ts | 611 ----- src/config/includes.ts | 286 -- src/config/io.compat.test.ts | 80 - src/config/io.ts | 1227 --------- src/config/io.write-config.test.ts | 371 --- src/config/legacy-migrate.test.ts | 106 - src/config/legacy-migrate.ts | 19 - src/config/legacy.migrations.part-1.ts | 494 ---- src/config/legacy.migrations.part-2.ts | 426 --- src/config/legacy.migrations.part-3.ts | 221 -- src/config/legacy.migrations.ts | 9 - src/config/legacy.rules.ts | 136 - src/config/legacy.shared.test.ts | 23 - src/config/legacy.shared.ts | 130 - src/config/legacy.ts | 43 - src/config/logging.ts | 18 - src/config/markdown-tables.ts | 68 - src/config/merge-config.ts | 38 - .../merge-patch.proto-pollution.test.ts | 42 - src/config/merge-patch.test.ts | 181 -- src/config/merge-patch.ts | 97 - src/config/model-alias-defaults.test.ts | 107 - src/config/normalize-paths.test.ts | 65 - src/config/normalize-paths.ts | 69 - src/config/paths.test.ts | 152 -- src/config/plugin-auto-enable.test.ts | 157 -- src/config/plugin-auto-enable.ts | 458 ---- src/config/plugins-allowlist.ts | 15 - src/config/plugins-runtime-boundary.test.ts | 38 - src/config/port-defaults.ts | 43 - src/config/prototype-keys.ts | 5 - src/config/redact-snapshot.test.ts | 942 ------- src/config/redact-snapshot.ts | 598 ----- src/config/runtime-overrides.test.ts | 79 - src/config/runtime-overrides.ts | 91 - src/config/schema.help.ts | 490 ---- src/config/schema.hints.test.ts | 115 - src/config/schema.hints.ts | 234 -- src/config/schema.irc.ts | 26 - src/config/schema.labels.ts | 354 --- src/config/schema.test.ts | 120 - src/config/schema.ts | 367 --- src/config/sessions.cache.test.ts | 220 -- src/config/sessions.test.ts | 594 ----- src/config/sessions.ts | 11 - src/config/sessions/cache-fields.test.ts | 68 - src/config/sessions/delivery-info.test.ts | 113 - src/config/sessions/delivery-info.ts | 57 - src/config/sessions/group.ts | 107 - src/config/sessions/main-session.ts | 79 - src/config/sessions/metadata.ts | 172 -- src/config/sessions/paths.ts | 236 -- src/config/sessions/reset.ts | 176 -- src/config/sessions/session-file.ts | 50 - src/config/sessions/session-key.ts | 47 - src/config/sessions/sessions.test.ts | 251 -- src/config/sessions/store.pruning.e2e.test.ts | 184 -- src/config/sessions/store.pruning.test.ts | 121 - src/config/sessions/store.ts | 934 ------- src/config/sessions/transcript.ts | 158 -- src/config/sessions/types.ts | 209 -- src/config/slack-http-config.test.ts | 64 - src/config/slack-token-validation.test.ts | 71 - src/config/talk.ts | 49 - src/config/telegram-custom-commands.ts | 95 - src/config/telegram-webhook-secret.test.ts | 64 - src/config/test-helpers.ts | 34 - src/config/types.agent-defaults.ts | 3 +- src/config/types.googlechat.ts | 112 - src/config/types.ts | 32 - src/config/validation.ts | 438 ---- src/config/version.ts | 49 - src/config/zod-schema.agent-defaults.ts | 173 -- src/config/zod-schema.agent-model.ts | 11 - src/config/zod-schema.agent-runtime.ts | 713 ----- src/config/zod-schema.agents.ts | 60 - src/config/zod-schema.allowdeny.ts | 40 - src/config/zod-schema.approvals.ts | 28 - src/config/zod-schema.channels.ts | 10 - src/config/zod-schema.core.ts | 514 ---- src/config/zod-schema.hooks.ts | 161 -- src/config/zod-schema.installs.ts | 22 - src/config/zod-schema.providers-core.ts | 1104 -------- src/config/zod-schema.providers-whatsapp.ts | 120 - src/config/zod-schema.providers.ts | 47 - src/config/zod-schema.sensitive.ts | 5 - src/config/zod-schema.session.ts | 180 -- src/config/zod-schema.ts | 715 ----- src/cron/cron-protocol-conformance.test.ts | 91 - src/cron/delivery.test.ts | 57 - src/cron/delivery.ts | 79 - ...onse-has-heartbeat-ok-but-includes.test.ts | 136 - ...ent.delivery-target-thread-session.test.ts | 131 - src/cron/isolated-agent.mocks.ts | 15 - ...cipient-besteffortdeliver-true.e2e.test.ts | 302 --- src/cron/isolated-agent.test-harness.ts | 67 - src/cron/isolated-agent.test-setup.ts | 25 - src/cron/isolated-agent.ts | 1 - ...s-last-non-empty-agent-text-as.e2e.test.ts | 511 ---- .../isolated-agent/delivery-target.test.ts | 280 -- src/cron/isolated-agent/delivery-target.ts | 155 -- src/cron/isolated-agent/helpers.ts | 82 - .../isolated-agent/run.skill-filter.test.ts | 395 --- src/cron/isolated-agent/run.ts | 783 ------ src/cron/isolated-agent/session.test.ts | 160 -- src/cron/isolated-agent/session.ts | 70 - src/cron/isolated-agent/skills-snapshot.ts | 37 - src/cron/isolated-agent/subagent-followup.ts | 152 -- src/cron/legacy-delivery.ts | 48 - src/cron/normalize.test.ts | 424 --- src/cron/normalize.ts | 482 ---- src/cron/parse.ts | 31 - src/cron/payload-migration.ts | 40 - src/cron/run-log.test.ts | 184 -- src/cron/run-log.ts | 146 -- src/cron/schedule.test.ts | 100 - src/cron/schedule.ts | 77 - src/cron/service.delivery-plan.test.ts | 153 -- src/cron/service.every-jobs-fire.test.ts | 202 -- src/cron/service.get-job.test.ts | 70 - .../service.issue-13992-regression.test.ts | 183 -- ...ervice.issue-16156-list-skips-cron.test.ts | 196 -- .../service.issue-17852-daily-skip.test.ts | 100 - src/cron/service.issue-regressions.test.ts | 815 ------ src/cron/service.jobs.test.ts | 254 -- .../service.jobs.top-of-hour-stagger.test.ts | 93 - .../service.persists-delivered-status.test.ts | 210 -- .../service.prevents-duplicate-timers.test.ts | 66 - src/cron/service.read-ops-nonblocking.test.ts | 236 -- .../service.rearm-timer-when-running.test.ts | 84 - src/cron/service.restart-catchup.test.ts | 140 - ...runs-one-shot-main-job-disables-it.test.ts | 789 ------ ...s-main-jobs-empty-systemevent-text.test.ts | 135 - src/cron/service.store-migration.test.ts | 157 -- src/cron/service.store.migration.test.ts | 196 -- src/cron/service.test-harness.ts | 138 - src/cron/service.ts | 52 - .../jobs.schedule-error-isolation.test.ts | 204 -- src/cron/service/jobs.ts | 603 ----- src/cron/service/locked.ts | 22 - src/cron/service/normalize.ts | 87 - src/cron/service/ops.ts | 229 -- src/cron/service/state.ts | 133 - src/cron/service/store.ts | 496 ---- src/cron/service/timer.ts | 784 ------ src/cron/session-reaper.test.ts | 203 -- src/cron/session-reaper.ts | 115 - src/cron/stagger.test.ts | 45 - src/cron/stagger.ts | 47 - src/cron/store.test.ts | 46 - src/cron/store.ts | 62 - src/cron/types.ts | 132 - src/cron/validate-timestamp.ts | 66 - src/cron/webhook-url.ts | 22 - src/daemon/arg-split.ts | 48 - src/daemon/cmd-argv.test.ts | 42 - src/daemon/cmd-argv.ts | 26 - src/daemon/cmd-set.ts | 64 - src/daemon/constants.test.ts | 130 - src/daemon/constants.ts | 110 - src/daemon/diagnostics.ts | 44 - src/daemon/exec-file.ts | 32 - src/daemon/inspect.ts | 420 --- src/daemon/launchd-plist.ts | 110 - src/daemon/launchd.test.ts | 255 -- src/daemon/launchd.ts | 434 ---- src/daemon/node-service.ts | 66 - src/daemon/output.ts | 21 - src/daemon/paths.ts | 42 - src/daemon/program-args.test.ts | 90 - src/daemon/program-args.ts | 287 --- src/daemon/runtime-format.ts | 44 - src/daemon/runtime-parse.ts | 20 - src/daemon/runtime-paths.test.ts | 201 -- src/daemon/runtime-paths.ts | 185 -- src/daemon/schtasks-exec.ts | 7 - src/daemon/schtasks.install.test.ts | 136 - src/daemon/schtasks.test.ts | 229 -- src/daemon/schtasks.ts | 318 --- src/daemon/service-audit.test.ts | 139 - src/daemon/service-audit.ts | 414 --- src/daemon/service-env.test.ts | 367 --- src/daemon/service-env.ts | 257 -- src/daemon/service-runtime.ts | 13 - src/daemon/service-types.ts | 38 - src/daemon/service.ts | 114 - src/daemon/systemd-hints.ts | 29 - src/daemon/systemd-linger.ts | 73 - src/daemon/systemd-unit.test.ts | 26 - src/daemon/systemd-unit.ts | 118 - src/daemon/systemd.test.ts | 205 -- src/daemon/systemd.ts | 410 --- src/discord/accounts.ts | 75 - src/discord/api.test.ts | 75 - src/discord/api.ts | 136 - src/discord/audit.test.ts | 56 - src/discord/audit.ts | 136 - src/discord/chunk.test.ts | 133 - src/discord/chunk.ts | 277 -- src/discord/client.ts | 60 - src/discord/components-registry.ts | 89 - src/discord/components.test.ts | 98 - src/discord/components.ts | 1145 -------- src/discord/directory-live.ts | 108 - src/discord/draft-chunking.ts | 41 - src/discord/draft-stream.ts | 161 -- src/discord/gateway-logging.test.ts | 89 - src/discord/gateway-logging.ts | 67 - src/discord/guilds.ts | 29 - src/discord/index.ts | 2 - src/discord/monitor.gateway.test.ts | 84 - src/discord/monitor.gateway.ts | 69 - src/discord/monitor.test.ts | 1103 -------- ...messages-mentionpatterns-match.e2e.test.ts | 523 ---- ...ends-status-replies-responseprefix.test.ts | 240 -- .../monitor.tool-result.test-harness.ts | 41 - src/discord/monitor.ts | 28 - src/discord/monitor/agent-components.ts | 1656 ------------ src/discord/monitor/allow-list.ts | 527 ---- src/discord/monitor/commands.test.ts | 24 - src/discord/monitor/commands.ts | 9 - src/discord/monitor/exec-approvals.test.ts | 683 ----- src/discord/monitor/exec-approvals.ts | 811 ------ src/discord/monitor/format.ts | 45 - src/discord/monitor/gateway-plugin.ts | 64 - src/discord/monitor/gateway-registry.ts | 37 - src/discord/monitor/listeners.ts | 459 ---- .../message-handler.inbound-contract.test.ts | 80 - .../monitor/message-handler.preflight.test.ts | 209 -- .../monitor/message-handler.preflight.ts | 730 ------ .../message-handler.preflight.types.ts | 111 - .../monitor/message-handler.process.test.ts | 494 ---- .../monitor/message-handler.process.ts | 751 ------ .../monitor/message-handler.test-harness.ts | 74 - src/discord/monitor/message-handler.ts | 138 - src/discord/monitor/message-utils.test.ts | 301 --- src/discord/monitor/message-utils.ts | 518 ---- .../monitor/model-picker-preferences.ts | 189 -- src/discord/monitor/model-picker.test.ts | 626 ----- src/discord/monitor/model-picker.ts | 937 ------- src/discord/monitor/monitor.test.ts | 888 ------- .../native-command.model-picker.test.ts | 487 ---- src/discord/monitor/native-command.ts | 1708 ------------ src/discord/monitor/presence-cache.ts | 61 - src/discord/monitor/presence.ts | 49 - .../monitor/provider.allowlist.test.ts | 57 - src/discord/monitor/provider.allowlist.ts | 275 -- .../monitor/provider.lifecycle.test.ts | 106 - src/discord/monitor/provider.lifecycle.ts | 132 - src/discord/monitor/provider.proxy.test.ts | 130 - .../monitor/provider.rest-proxy.test.ts | 62 - .../monitor/provider.skill-dedupe.test.ts | 61 - src/discord/monitor/provider.test.ts | 293 --- src/discord/monitor/provider.ts | 627 ----- src/discord/monitor/reply-context.ts | 53 - src/discord/monitor/reply-delivery.test.ts | 255 -- src/discord/monitor/reply-delivery.ts | 241 -- src/discord/monitor/rest-fetch.ts | 27 - src/discord/monitor/sender-identity.ts | 82 - src/discord/monitor/system-events.ts | 55 - .../thread-bindings.discord-api.test.ts | 85 - .../monitor/thread-bindings.discord-api.ts | 289 --- .../monitor/thread-bindings.lifecycle.ts | 225 -- .../monitor/thread-bindings.manager.ts | 515 ---- .../monitor/thread-bindings.messages.ts | 72 - .../thread-bindings.shared-state.test.ts | 49 - src/discord/monitor/thread-bindings.state.ts | 444 ---- src/discord/monitor/thread-bindings.ts | 28 - .../monitor/thread-bindings.ttl.test.ts | 541 ---- src/discord/monitor/thread-bindings.types.ts | 69 - .../monitor/threading.auto-thread.test.ts | 91 - src/discord/monitor/threading.ts | 449 ---- src/discord/monitor/typing.ts | 11 - src/discord/pluralkit.test.ts | 67 - src/discord/pluralkit.ts | 58 - src/discord/probe.intents.test.ts | 39 - src/discord/probe.ts | 175 -- src/discord/resolve-channels.test.ts | 152 -- src/discord/resolve-channels.ts | 308 --- src/discord/resolve-users.test.ts | 242 -- src/discord/resolve-users.ts | 174 -- src/discord/send.channels.ts | 132 - src/discord/send.components.test.ts | 53 - src/discord/send.components.ts | 169 -- src/discord/send.creates-thread.test.ts | 482 ---- src/discord/send.emojis-stickers.ts | 57 - src/discord/send.guild.ts | 140 - src/discord/send.messages.ts | 190 -- src/discord/send.outbound.ts | 551 ---- src/discord/send.permissions.authz.test.ts | 155 -- src/discord/send.permissions.ts | 211 -- src/discord/send.reactions.ts | 122 - .../send.sends-basic-channel-messages.test.ts | 562 ---- src/discord/send.shared.ts | 488 ---- src/discord/send.test-harness.ts | 56 - src/discord/send.ts | 81 - src/discord/send.types.ts | 172 -- src/discord/send.webhook-activity.test.ts | 50 - src/discord/targets.test.ts | 110 - src/discord/targets.ts | 167 -- src/discord/token.test.ts | 46 - src/discord/token.ts | 51 - src/discord/ui.ts | 45 - src/discord/voice-message.ts | 323 --- src/discord/voice/command.ts | 341 --- src/discord/voice/manager.ts | 676 ----- src/docker-image-digests.test.ts | 61 - src/docker-setup.test.ts | 225 -- src/dockerfile.test.ts | 23 - src/docs/slash-commands-doc.test.ts | 36 - src/extensionAPI.ts | 14 - src/gateway/agent-event-assistant-text.ts | 7 - src/gateway/agent-prompt.e2e.test.ts | 48 - src/gateway/agent-prompt.ts | 43 - src/gateway/assistant-identity.test.ts | 43 - src/gateway/assistant-identity.ts | 133 - src/gateway/auth-rate-limit.test.ts | 213 -- src/gateway/auth-rate-limit.ts | 218 -- src/gateway/auth.test.ts | 545 ---- src/gateway/auth.ts | 482 ---- src/gateway/boot.test.ts | 249 -- src/gateway/boot.ts | 202 -- src/gateway/call.test.ts | 567 ---- src/gateway/call.ts | 525 ---- src/gateway/canvas-capability.ts | 87 - src/gateway/channel-health-monitor.test.ts | 309 --- src/gateway/channel-health-monitor.ts | 177 -- src/gateway/chat-abort.test.ts | 122 - src/gateway/chat-abort.ts | 136 - src/gateway/chat-attachments.test.ts | 180 -- src/gateway/chat-attachments.ts | 184 -- src/gateway/chat-sanitize.test.ts | 92 - src/gateway/chat-sanitize.ts | 88 - src/gateway/client.e2e.test.ts | 181 -- src/gateway/client.test.ts | 261 -- src/gateway/client.ts | 490 ---- src/gateway/config-reload.test.ts | 165 -- src/gateway/config-reload.ts | 384 --- src/gateway/control-plane-audit.ts | 40 - src/gateway/control-plane-rate-limit.ts | 79 - src/gateway/control-ui-csp.test.ts | 12 - src/gateway/control-ui-csp.ts | 15 - src/gateway/control-ui-shared.ts | 69 - src/gateway/control-ui.http.test.ts | 305 --- src/gateway/control-ui.ts | 481 ---- src/gateway/exec-approval-manager.ts | 154 -- src/gateway/gateway-cli-backend.live.test.ts | 419 --- src/gateway/gateway-config-prompts.shared.ts | 27 - src/gateway/gateway-misc.test.ts | 376 --- .../gateway-models.profiles.live.test.ts | 1242 --------- src/gateway/gateway.e2e.test.ts | 243 -- src/gateway/hooks-mapping.test.ts | 449 ---- src/gateway/hooks-mapping.ts | 482 ---- src/gateway/hooks.test.ts | 327 --- src/gateway/hooks.ts | 385 --- src/gateway/http-auth-helpers.test.ts | 77 - src/gateway/http-auth-helpers.ts | 29 - src/gateway/http-common.ts | 100 - src/gateway/http-endpoint-helpers.test.ts | 80 - src/gateway/http-endpoint-helpers.ts | 47 - src/gateway/http-utils.ts | 79 - src/gateway/live-image-probe.ts | 130 - src/gateway/method-scopes.test.ts | 61 - src/gateway/method-scopes.ts | 199 -- src/gateway/net.test.ts | 349 --- src/gateway/net.ts | 474 ---- src/gateway/node-command-policy.ts | 173 -- src/gateway/node-invoke-sanitize.ts | 21 - .../node-invoke-system-run-approval.test.ts | 85 - .../node-invoke-system-run-approval.ts | 251 -- src/gateway/node-registry.ts | 209 -- src/gateway/open-responses.schema.ts | 354 --- src/gateway/openai-http.e2e.test.ts | 474 ---- src/gateway/openai-http.ts | 386 --- src/gateway/openresponses-http.e2e.test.ts | 707 ----- src/gateway/openresponses-http.ts | 909 ------- src/gateway/openresponses-parity.e2e.test.ts | 305 --- src/gateway/origin-check.test.ts | 45 - src/gateway/origin-check.ts | 52 - src/gateway/probe-auth.ts | 32 - src/gateway/probe.test.ts | 53 - src/gateway/probe.ts | 121 - src/gateway/protocol/cron-validators.test.ts | 49 - src/gateway/protocol/index.test.ts | 64 - src/gateway/protocol/index.ts | 626 ----- src/gateway/protocol/schema.ts | 17 - src/gateway/protocol/schema/agent.ts | 144 -- .../protocol/schema/agents-models-skills.ts | 209 -- src/gateway/protocol/schema/channels.ts | 153 -- src/gateway/protocol/schema/config.ts | 62 - src/gateway/protocol/schema/cron.ts | 253 -- src/gateway/protocol/schema/devices.ts | 66 - src/gateway/protocol/schema/error-codes.ts | 23 - src/gateway/protocol/schema/exec-approvals.ts | 113 - src/gateway/protocol/schema/frames.ts | 164 -- src/gateway/protocol/schema/logs-chat.ts | 81 - src/gateway/protocol/schema/nodes.ts | 101 - src/gateway/protocol/schema/primitives.ts | 17 - .../protocol/schema/protocol-schemas.ts | 267 -- src/gateway/protocol/schema/push.ts | 27 - src/gateway/protocol/schema/sessions.ts | 131 - src/gateway/protocol/schema/snapshot.ts | 72 - src/gateway/protocol/schema/types.ts | 253 -- src/gateway/protocol/schema/wizard.ts | 103 - src/gateway/role-policy.test.ts | 28 - src/gateway/role-policy.ts | 23 - src/gateway/server-broadcast.ts | 131 - src/gateway/server-browser.ts | 31 - src/gateway/server-channels.test.ts | 168 -- src/gateway/server-channels.ts | 414 --- src/gateway/server-chat.agent-events.test.ts | 404 --- src/gateway/server-chat.ts | 637 ----- src/gateway/server-close.ts | 133 - src/gateway/server-constants.ts | 36 - src/gateway/server-cron.test.ts | 142 - src/gateway/server-cron.ts | 315 --- src/gateway/server-discovery-runtime.ts | 100 - src/gateway/server-discovery.test.ts | 45 - src/gateway/server-discovery.ts | 90 - .../server-http.hooks-request-timeout.test.ts | 99 - src/gateway/server-http.ts | 695 ----- src/gateway/server-lanes.ts | 10 - src/gateway/server-maintenance.ts | 133 - src/gateway/server-methods-list.ts | 124 - ...r-methods.control-plane-rate-limit.test.ts | 124 - src/gateway/server-methods.ts | 145 -- src/gateway/server-methods/AGENTS.md | 3 - src/gateway/server-methods/CLAUDE.md | 1 - src/gateway/server-methods/agent-job.ts | 242 -- src/gateway/server-methods/agent-timestamp.ts | 80 - src/gateway/server-methods/agent.test.ts | 438 ---- src/gateway/server-methods/agent.ts | 742 ------ .../server-methods/agents-mutate.test.ts | 461 ---- src/gateway/server-methods/agents.ts | 529 ---- .../server-methods/attachment-normalize.ts | 32 - src/gateway/server-methods/base-hash.ts | 8 - src/gateway/server-methods/browser.ts | 245 -- src/gateway/server-methods/channels.ts | 292 --- .../chat.abort-persistence.test.ts | 300 --- .../chat.inject.parentid.e2e.test.ts | 75 - src/gateway/server-methods/chat.ts | 1185 --------- src/gateway/server-methods/config.ts | 466 ---- src/gateway/server-methods/connect.ts | 12 - src/gateway/server-methods/cron.ts | 227 -- src/gateway/server-methods/devices.ts | 215 -- src/gateway/server-methods/exec-approval.ts | 208 -- src/gateway/server-methods/exec-approvals.ts | 193 -- src/gateway/server-methods/health.ts | 37 - src/gateway/server-methods/logs.ts | 180 -- src/gateway/server-methods/models.ts | 39 - .../nodes.handlers.invoke-result.ts | 71 - src/gateway/server-methods/nodes.helpers.ts | 78 - .../server-methods/nodes.invoke-wake.test.ts | 232 -- src/gateway/server-methods/nodes.ts | 786 ------ src/gateway/server-methods/push.test.ts | 101 - src/gateway/server-methods/push.ts | 73 - src/gateway/server-methods/restart-request.ts | 20 - src/gateway/server-methods/send.test.ts | 289 --- src/gateway/server-methods/send.ts | 433 ---- .../server-methods/server-methods.test.ts | 547 ---- src/gateway/server-methods/sessions.ts | 585 ----- src/gateway/server-methods/skills.ts | 204 -- .../skills.update.normalizes-api-key.test.ts | 53 - src/gateway/server-methods/system.ts | 134 - src/gateway/server-methods/talk.ts | 135 - src/gateway/server-methods/tts.ts | 157 -- src/gateway/server-methods/types.ts | 112 - src/gateway/server-methods/update.test.ts | 192 -- src/gateway/server-methods/update.ts | 134 - .../usage.sessions-usage.test.ts | 248 -- src/gateway/server-methods/usage.test.ts | 161 -- src/gateway/server-methods/usage.ts | 944 ------- src/gateway/server-methods/validation.ts | 27 - src/gateway/server-methods/voicewake.ts | 34 - src/gateway/server-methods/web.ts | 118 - src/gateway/server-methods/wizard.ts | 118 - src/gateway/server-mobile-nodes.ts | 14 - src/gateway/server-model-catalog.ts | 19 - src/gateway/server-node-events-types.ts | 36 - src/gateway/server-node-events.test.ts | 363 --- src/gateway/server-node-events.ts | 542 ---- src/gateway/server-node-subscriptions.ts | 164 -- src/gateway/server-plugins.test.ts | 60 - src/gateway/server-plugins.ts | 49 - src/gateway/server-reload-handlers.ts | 225 -- src/gateway/server-restart-deferral.test.ts | 164 -- src/gateway/server-restart-sentinel.ts | 97 - src/gateway/server-runtime-config.test.ts | 165 -- src/gateway/server-runtime-config.ts | 138 - src/gateway/server-runtime-state.ts | 214 -- src/gateway/server-session-key.ts | 22 - src/gateway/server-shared.ts | 8 - src/gateway/server-startup-log.ts | 40 - src/gateway/server-startup-memory.test.ts | 100 - src/gateway/server-startup-memory.ts | 30 - src/gateway/server-startup.ts | 204 -- src/gateway/server-tailscale.ts | 58 - src/gateway/server-utils.ts | 40 - src/gateway/server-web-app.test.ts | 526 ---- src/gateway/server-web-app.ts | 569 ---- src/gateway/server-wizard-sessions.ts | 27 - src/gateway/server-ws-runtime.ts | 53 - ...r.agent.gateway-server-agent-a.e2e.test.ts | 517 ---- ...r.agent.gateway-server-agent-b.e2e.test.ts | 406 --- ...server.agent.gateway-server-agent.mocks.ts | 39 - src/gateway/server.auth.e2e.test.ts | 1407 ---------- src/gateway/server.canvas-auth.e2e.test.ts | 442 ---- src/gateway/server.channels.e2e.test.ts | 204 -- ...ver.chat.gateway-server-chat-b.e2e.test.ts | 452 ---- ...erver.chat.gateway-server-chat.e2e.test.ts | 495 ---- src/gateway/server.config-apply.e2e.test.ts | 71 - src/gateway/server.config-patch.e2e.test.ts | 242 -- src/gateway/server.cron.e2e.test.ts | 649 ----- src/gateway/server.e2e-registry-helpers.ts | 1 - src/gateway/server.e2e-ws-harness.ts | 36 - src/gateway/server.health.e2e.test.ts | 311 --- src/gateway/server.hooks.e2e.test.ts | 464 ---- src/gateway/server.impl.ts | 793 ------ src/gateway/server.ios-client-id.e2e.test.ts | 84 - .../server.models-voicewake-misc.e2e.test.ts | 465 ---- ...er.node-invoke-approval-bypass.e2e.test.ts | 314 --- src/gateway/server.plugin-http-auth.test.ts | 145 -- src/gateway/server.reload.e2e.test.ts | 316 --- .../server.roles-allowlist-update.e2e.test.ts | 321 --- src/gateway/server.sessions-send.e2e.test.ts | 219 -- ...ions.gateway-server-sessions-a.e2e.test.ts | 1092 -------- src/gateway/server.skills-status.e2e.test.ts | 49 - src/gateway/server.talk-config.e2e.test.ts | 115 - src/gateway/server.ts | 3 - src/gateway/server/__tests__/test-utils.ts | 11 - src/gateway/server/close-reason.ts | 14 - src/gateway/server/health-state.ts | 84 - src/gateway/server/hooks.ts | 117 - src/gateway/server/http-listen.ts | 37 - src/gateway/server/plugins-http.test.ts | 99 - src/gateway/server/plugins-http.ts | 61 - src/gateway/server/presence-events.test.ts | 35 - src/gateway/server/presence-events.ts | 22 - src/gateway/server/tls.ts | 14 - src/gateway/server/ws-connection.ts | 304 --- .../server/ws-connection/auth-messages.ts | 64 - .../ws-connection/connect-policy.test.ts | 154 -- .../server/ws-connection/connect-policy.ts | 78 - .../server/ws-connection/message-handler.ts | 1000 ------- src/gateway/server/ws-types.ts | 12 - src/gateway/session-preview.test-helpers.ts | 11 - src/gateway/session-utils.fs.test.ts | 779 ------ src/gateway/session-utils.fs.ts | 737 ------ src/gateway/session-utils.test.ts | 491 ---- src/gateway/session-utils.ts | 878 ------- src/gateway/session-utils.types.ts | 92 - src/gateway/sessions-patch.test.ts | 317 --- src/gateway/sessions-patch.ts | 366 --- src/gateway/sessions-resolve.ts | 152 -- src/gateway/startup-auth.test.ts | 269 -- src/gateway/startup-auth.ts | 176 -- src/gateway/test-helpers.agent-results.ts | 27 - src/gateway/test-helpers.e2e.ts | 188 -- src/gateway/test-helpers.mocks.ts | 614 ----- src/gateway/test-helpers.openai-mock.ts | 212 -- src/gateway/test-helpers.server.ts | 587 ----- src/gateway/test-helpers.ts | 2 - src/gateway/test-http-response.ts | 18 - src/gateway/test-openai-responses-model.ts | 21 - src/gateway/test-temp-config.ts | 35 - src/gateway/test-with-server.ts | 41 - src/gateway/tools-invoke-http.test.ts | 506 ---- src/gateway/tools-invoke-http.ts | 334 --- src/gateway/ws-log.test.ts | 58 - src/gateway/ws-log.ts | 438 ---- src/gateway/ws-logging.ts | 13 - src/globals.ts | 88 +- src/hooks/bundled-dir.ts | 48 - src/hooks/bundled/README.md | 223 -- src/hooks/bundled/boot-md/HOOK.md | 20 - ...andler.gateway-startup.integration.test.ts | 60 - src/hooks/bundled/boot-md/handler.test.ts | 129 - src/hooks/bundled/boot-md/handler.ts | 44 - .../bundled/bootstrap-extra-files/HOOK.md | 53 - .../bootstrap-extra-files/handler.test.ts | 98 - .../bundled/bootstrap-extra-files/handler.ts | 61 - src/hooks/bundled/command-logger/HOOK.md | 122 - src/hooks/bundled/command-logger/handler.ts | 68 - src/hooks/bundled/session-memory/HOOK.md | 109 - .../bundled/session-memory/handler.test.ts | 446 ---- src/hooks/bundled/session-memory/handler.ts | 328 --- src/hooks/config.ts | 78 - src/hooks/frontmatter.test.ts | 290 --- src/hooks/frontmatter.ts | 87 - src/hooks/gmail-ops.ts | 373 --- src/hooks/gmail-setup-utils.test.ts | 124 - src/hooks/gmail-setup-utils.ts | 383 --- src/hooks/gmail-watcher-lifecycle.test.ts | 94 - src/hooks/gmail-watcher-lifecycle.ts | 37 - src/hooks/gmail-watcher.ts | 246 -- src/hooks/gmail.test.ts | 127 - src/hooks/gmail.ts | 271 -- src/hooks/hooks-install.e2e.test.ts | 109 - src/hooks/hooks-status.ts | 148 -- src/hooks/hooks.ts | 14 - src/hooks/install.test.ts | 425 --- src/hooks/install.ts | 503 ---- src/hooks/installs.ts | 30 - src/hooks/internal-hooks.test.ts | 458 ---- src/hooks/internal-hooks.ts | 284 -- src/hooks/llm-slug-generator.ts | 100 - src/hooks/loader.test.ts | 334 --- src/hooks/loader.ts | 187 -- src/hooks/plugin-hooks.ts | 116 - src/hooks/types.ts | 67 - src/hooks/workspace.test.ts | 105 - src/hooks/workspace.ts | 318 --- src/imessage/accounts.ts | 73 - src/imessage/client.ts | 255 -- src/imessage/constants.ts | 2 - src/imessage/index.ts | 3 - src/imessage/monitor.gating.test.ts | 335 --- ...nitor.shutdown.unhandled-rejection.test.ts | 43 - src/imessage/monitor.ts | 2 - src/imessage/monitor/abort-handler.ts | 34 - src/imessage/monitor/deliver.test.ts | 126 - src/imessage/monitor/deliver.ts | 71 - src/imessage/monitor/inbound-processing.ts | 484 ---- src/imessage/monitor/monitor-provider.ts | 510 ---- src/imessage/monitor/parse-notification.ts | 83 - src/imessage/monitor/runtime.ts | 11 - src/imessage/monitor/types.ts | 40 - src/imessage/probe.test.ts | 40 - src/imessage/probe.ts | 105 - src/imessage/send.test.ts | 122 - src/imessage/send.ts | 190 -- src/imessage/target-parsing-helpers.ts | 132 - src/imessage/targets.test.ts | 101 - src/imessage/targets.ts | 168 -- src/index.ts | 93 - src/infra/abort-pattern.test.ts | 101 - src/infra/agent-events.test.ts | 64 - src/infra/agent-events.ts | 83 - src/infra/archive-path.test.ts | 46 - src/infra/archive-path.ts | 63 - src/infra/archive.test.ts | 222 -- src/infra/archive.ts | 581 ----- src/infra/backoff.ts | 28 - src/infra/binaries.ts | 14 - src/infra/bonjour-ciao.ts | 11 - src/infra/bonjour-discovery.test.ts | 311 --- src/infra/bonjour-discovery.ts | 590 ----- src/infra/bonjour-errors.ts | 7 - src/infra/bonjour.test.ts | 310 --- src/infra/bonjour.ts | 281 -- src/infra/brew.test.ts | 101 - src/infra/canvas-host-url.ts | 93 - src/infra/channel-activity.ts | 58 - src/infra/channel-summary.ts | 224 -- src/infra/channels-status-issues.ts | 20 - src/infra/clipboard.ts | 25 - src/infra/control-ui-assets.test.ts | 214 -- src/infra/control-ui-assets.ts | 284 -- src/infra/dedupe.ts | 59 - src/infra/detect-package-manager.ts | 29 - src/infra/device-auth-store.ts | 117 - src/infra/device-identity.state-dir.test.ts | 16 - src/infra/device-identity.ts | 182 -- src/infra/device-pairing.test.ts | 254 -- src/infra/device-pairing.ts | 644 ----- src/infra/diagnostic-events.ts | 242 -- src/infra/diagnostic-flags.ts | 92 - src/infra/dotenv.test.ts | 99 - src/infra/dotenv.ts | 20 - src/infra/env-file.ts | 54 - src/infra/env.test.ts | 49 - src/infra/exec-approval-forwarder.test.ts | 146 -- src/infra/exec-approval-forwarder.ts | 343 --- src/infra/exec-approvals-allowlist.ts | 448 ---- src/infra/exec-approvals-analysis.ts | 1001 ------- src/infra/exec-approvals.test.ts | 1336 ---------- src/infra/exec-approvals.ts | 527 ---- src/infra/exec-host.ts | 80 - src/infra/exec-safe-bin-policy.test.ts | 86 - src/infra/exec-safe-bin-policy.ts | 355 --- src/infra/exec-safe-bin-trust.test.ts | 69 - src/infra/exec-safe-bin-trust.ts | 102 - src/infra/exec-safety.ts | 44 - src/infra/fetch.test.ts | 196 -- src/infra/fetch.ts | 109 - src/infra/file-lock.ts | 2 - src/infra/fixed-window-rate-limit.test.ts | 31 - src/infra/fixed-window-rate-limit.ts | 48 - src/infra/format-time/format-datetime.ts | 94 - src/infra/format-time/format-relative.ts | 112 - src/infra/format-time/format-time.test.ts | 217 -- src/infra/fs-safe.test.ts | 99 - src/infra/fs-safe.ts | 147 -- src/infra/gateway-lock.test.ts | 275 -- src/infra/gateway-lock.ts | 258 -- src/infra/gemini-auth.ts | 40 - src/infra/git-root.test.ts | 59 - src/infra/heartbeat-active-hours.test.ts | 86 - src/infra/heartbeat-active-hours.ts | 99 - src/infra/heartbeat-events-filter.ts | 62 - src/infra/heartbeat-events.ts | 58 - src/infra/heartbeat-reason.test.ts | 52 - src/infra/heartbeat-reason.ts | 54 - .../heartbeat-runner.ghost-reminder.test.ts | 205 -- .../heartbeat-runner.model-override.test.ts | 210 -- ...espects-ackmaxchars-heartbeat-acks.test.ts | 458 ---- ...tbeat-runner.returns-default-unset.test.ts | 1161 --------- src/infra/heartbeat-runner.scheduler.test.ts | 205 -- ...ner.sender-prefers-delivery-target.test.ts | 71 - src/infra/heartbeat-runner.test-harness.ts | 40 - src/infra/heartbeat-runner.test-utils.ts | 69 - .../heartbeat-runner.transcript-prune.test.ts | 128 - src/infra/heartbeat-runner.ts | 1189 --------- src/infra/heartbeat-visibility.test.ts | 293 --- src/infra/heartbeat-visibility.ts | 73 - src/infra/heartbeat-wake.test.ts | 321 --- src/infra/heartbeat-wake.ts | 262 -- src/infra/home-dir.test.ts | 77 - src/infra/host-env-security-policy.json | 19 - .../host-env-security.policy-parity.test.ts | 38 - src/infra/host-env-security.test.ts | 82 - src/infra/host-env-security.ts | 92 - src/infra/http-body.test.ts | 137 - src/infra/http-body.ts | 351 --- src/infra/infra-parsing.test.ts | 131 - src/infra/infra-runtime.test.ts | 298 --- src/infra/infra-store.test.ts | 231 -- src/infra/install-package-dir.ts | 68 - src/infra/install-safe-path.test.ts | 22 - src/infra/install-safe-path.ts | 62 - src/infra/install-source-utils.test.ts | 244 -- src/infra/install-source-utils.ts | 195 -- src/infra/json-file.ts | 23 - src/infra/json-files.ts | 52 - src/infra/jsonl-socket.ts | 59 - src/infra/machine-name.ts | 52 - src/infra/map-size.ts | 15 - src/infra/net/fetch-guard.ssrf.test.ts | 151 -- src/infra/net/fetch-guard.ts | 197 -- src/infra/net/hostname.ts | 7 - src/infra/net/ssrf.pinning.test.ts | 154 -- src/infra/net/ssrf.test.ts | 133 - src/infra/net/ssrf.ts | 582 ----- src/infra/node-pairing.test.ts | 82 - src/infra/node-pairing.ts | 278 -- src/infra/node-shell.ts | 9 - src/infra/npm-integrity.test.ts | 103 - src/infra/npm-integrity.ts | 93 - src/infra/npm-pack-install.test.ts | 155 -- src/infra/npm-pack-install.ts | 73 - src/infra/npm-registry-spec.ts | 41 - src/infra/openclaw-root.test.ts | 171 -- src/infra/openclaw-root.ts | 129 - src/infra/os-summary.ts | 35 - src/infra/outbound/abort.ts | 15 - src/infra/outbound/agent-delivery.test.ts | 86 - src/infra/outbound/agent-delivery.ts | 144 -- .../outbound/bound-delivery-router.test.ts | 117 - src/infra/outbound/bound-delivery-router.ts | 131 - src/infra/outbound/channel-adapters.ts | 56 - src/infra/outbound/channel-selection.ts | 92 - src/infra/outbound/channel-target.ts | 39 - src/infra/outbound/deliver.test.ts | 693 ----- src/infra/outbound/deliver.ts | 602 ----- src/infra/outbound/delivery-queue.ts | 315 --- src/infra/outbound/directory-cache.ts | 98 - src/infra/outbound/envelope.ts | 44 - src/infra/outbound/format.ts | 121 - src/infra/outbound/identity.ts | 37 - src/infra/outbound/message-action-params.ts | 388 --- .../outbound/message-action-runner.test.ts | 928 ------- .../message-action-runner.threading.test.ts | 224 -- src/infra/outbound/message-action-runner.ts | 840 ------ src/infra/outbound/message-action-spec.ts | 101 - src/infra/outbound/message.e2e.test.ts | 299 --- src/infra/outbound/message.test.ts | 54 - src/infra/outbound/message.ts | 340 --- src/infra/outbound/outbound-policy.ts | 221 -- .../outbound/outbound-send-service.test.ts | 130 - src/infra/outbound/outbound-send-service.ts | 194 -- src/infra/outbound/outbound-session.ts | 985 ------- src/infra/outbound/outbound.test.ts | 1015 -------- src/infra/outbound/payloads.ts | 120 - src/infra/outbound/session-binding-service.ts | 192 -- src/infra/outbound/target-errors.ts | 30 - src/infra/outbound/target-normalization.ts | 33 - src/infra/outbound/target-resolver.test.ts | 78 - src/infra/outbound/target-resolver.ts | 491 ---- src/infra/outbound/targets.test.ts | 382 --- src/infra/outbound/targets.ts | 378 --- src/infra/outbound/tool-payload.ts | 25 - src/infra/package-json.ts | 23 - src/infra/pairing-files.ts | 50 - src/infra/pairing-token.ts | 12 - src/infra/path-env.test.ts | 215 -- src/infra/path-guards.ts | 35 - src/infra/path-prepend.ts | 58 - src/infra/path-safety.test.ts | 16 - src/infra/path-safety.ts | 20 - src/infra/plain-object.test.ts | 18 - src/infra/ports-format.test.ts | 26 - src/infra/ports-format.ts | 69 - src/infra/ports-inspect.ts | 293 --- src/infra/ports-types.ts | 20 - src/infra/ports.test.ts | 114 - src/infra/ports.ts | 98 - src/infra/process-respawn.test.ts | 77 - src/infra/process-respawn.ts | 61 - ...rovider-usage.auth.normalizes-keys.test.ts | 404 --- src/infra/provider-usage.auth.ts | 254 -- .../provider-usage.fetch.antigravity.test.ts | 469 ---- src/infra/provider-usage.fetch.antigravity.ts | 305 --- src/infra/provider-usage.fetch.claude.test.ts | 177 -- src/infra/provider-usage.fetch.claude.ts | 177 -- src/infra/provider-usage.fetch.codex.test.ts | 57 - src/infra/provider-usage.fetch.codex.ts | 91 - .../provider-usage.fetch.copilot.test.ts | 37 - src/infra/provider-usage.fetch.copilot.ts | 64 - src/infra/provider-usage.fetch.gemini.test.ts | 39 - src/infra/provider-usage.fetch.gemini.ts | 87 - .../provider-usage.fetch.minimax.test.ts | 151 -- src/infra/provider-usage.fetch.minimax.ts | 388 --- src/infra/provider-usage.fetch.shared.test.ts | 38 - src/infra/provider-usage.fetch.shared.ts | 60 - src/infra/provider-usage.fetch.ts | 7 - src/infra/provider-usage.fetch.zai.test.ts | 86 - src/infra/provider-usage.fetch.zai.ts | 94 - src/infra/provider-usage.format.test.ts | 110 - src/infra/provider-usage.format.ts | 114 - src/infra/provider-usage.load.ts | 108 - src/infra/provider-usage.shared.test.ts | 27 - src/infra/provider-usage.shared.ts | 63 - src/infra/provider-usage.test.ts | 467 ---- src/infra/provider-usage.ts | 13 - src/infra/provider-usage.types.ts | 28 - src/infra/push-apns.test.ts | 227 -- src/infra/push-apns.ts | 529 ---- src/infra/restart-sentinel.test.ts | 118 - src/infra/restart-sentinel.ts | 146 -- src/infra/restart.ts | 461 ---- src/infra/retry-policy.ts | 103 - src/infra/retry.test.ts | 93 - src/infra/retry.ts | 136 - src/infra/run-node.test.ts | 69 - src/infra/runtime-guard.test.ts | 87 - src/infra/runtime-guard.ts | 106 +- src/infra/runtime-status.ts | 28 - src/infra/scp-host.test.ts | 19 - src/infra/scp-host.ts | 62 - src/infra/scripts-modules.d.ts | 38 - src/infra/session-cost-usage.test.ts | 445 ---- src/infra/session-cost-usage.ts | 1016 -------- src/infra/session-cost-usage.types.ts | 167 -- src/infra/session-maintenance-warning.ts | 112 - src/infra/shell-env.test.ts | 169 -- src/infra/shell-env.ts | 238 -- src/infra/skills-remote.test.ts | 36 - src/infra/skills-remote.ts | 351 --- src/infra/ssh-config.test.ts | 85 - src/infra/ssh-config.ts | 105 - src/infra/ssh-tunnel.ts | 210 -- src/infra/state-migrations.fs.ts | 61 - src/infra/state-migrations.state-dir.test.ts | 52 - src/infra/state-migrations.ts | 1023 -------- src/infra/system-events.test.ts | 78 - src/infra/system-events.ts | 118 - src/infra/system-presence.test.ts | 84 - src/infra/system-presence.ts | 289 --- src/infra/system-presence.version.test.ts | 60 - src/infra/system-run-command.test.ts | 98 - src/infra/system-run-command.ts | 172 -- src/infra/tailnet.ts | 66 - src/infra/tailscale.test.ts | 194 -- src/infra/tailscale.ts | 500 ---- src/infra/tls/fingerprint.ts | 5 - src/infra/tls/gateway.ts | 150 -- src/infra/tmp-openclaw-dir.test.ts | 150 -- src/infra/transport-ready.test.ts | 84 - src/infra/transport-ready.ts | 67 - ...handled-rejections.fatal-detection.test.ts | 118 - src/infra/unhandled-rejections.test.ts | 117 - src/infra/unhandled-rejections.ts | 179 -- src/infra/update-channels.ts | 109 - src/infra/update-check.test.ts | 46 - src/infra/update-check.ts | 402 --- src/infra/update-global.test.ts | 81 - src/infra/update-global.ts | 174 -- src/infra/update-runner.test.ts | 538 ---- src/infra/update-runner.ts | 911 ------- src/infra/update-startup.test.ts | 241 -- src/infra/update-startup.ts | 214 -- src/infra/voicewake.ts | 59 - src/infra/warning-filter.test.ts | 97 - src/infra/watch-node.test.ts | 77 - src/infra/widearea-dns.test.ts | 44 - src/infra/widearea-dns.ts | 199 -- src/infra/ws.ts | 21 - src/infra/wsl.ts | 63 - src/line/accounts.test.ts | 125 - src/line/accounts.ts | 181 -- src/line/actions.ts | 61 - src/line/auto-reply-delivery.test.ts | 184 -- src/line/auto-reply-delivery.ts | 175 -- src/line/bot-access.ts | 44 - src/line/bot-handlers.test.ts | 216 -- src/line/bot-handlers.ts | 325 --- src/line/bot-message-context.test.ts | 113 - src/line/bot-message-context.ts | 468 ---- src/line/bot.ts | 83 - src/line/channel-access-token.ts | 14 - src/line/config-schema.ts | 41 - src/line/download.test.ts | 69 - src/line/download.ts | 117 - src/line/flex-templates.test.ts | 95 - src/line/flex-templates.ts | 33 - src/line/flex-templates/basic-cards.ts | 395 --- src/line/flex-templates/common.ts | 20 - .../flex-templates/media-control-cards.ts | 555 ---- src/line/flex-templates/message.ts | 13 - src/line/flex-templates/schedule-cards.ts | 467 ---- src/line/flex-templates/types.ts | 22 - src/line/http-registry.ts | 49 - src/line/index.ts | 155 -- src/line/markdown-to-line.test.ts | 322 --- src/line/markdown-to-line.ts | 451 ---- src/line/monitor.fail-closed.test.ts | 28 - src/line/monitor.read-body.test.ts | 16 - src/line/monitor.ts | 322 --- src/line/probe.test.ts | 51 - src/line/probe.ts | 33 - src/line/reply-chunks.test.ts | 166 -- src/line/reply-chunks.ts | 101 - src/line/rich-menu.test.ts | 207 -- src/line/rich-menu.ts | 393 --- src/line/send.test.ts | 11 - src/line/send.ts | 583 ----- src/line/signature.ts | 18 - src/line/template-messages.test.ts | 124 - src/line/template-messages.ts | 351 --- src/line/types.ts | 141 - src/line/webhook-node.test.ts | 131 - src/line/webhook-node.ts | 129 - src/line/webhook-utils.ts | 15 - src/line/webhook.test.ts | 114 - src/line/webhook.ts | 112 - src/link-understanding/apply.ts | 37 - src/link-understanding/defaults.ts | 2 - src/link-understanding/detect.test.ts | 68 - src/link-understanding/detect.ts | 64 - src/link-understanding/format.ts | 12 - src/link-understanding/index.ts | 4 - src/link-understanding/runner.ts | 150 -- src/logger.test.ts | 170 -- src/logger.ts | 61 - src/logging.ts | 69 - src/logging/config.ts | 6 +- src/logging/console-capture.test.ts | 156 -- src/logging/console-settings.test.ts | 96 - src/logging/console-timestamp.test.ts | 77 - src/logging/console.ts | 8 +- src/logging/diagnostic-session-state.ts | 112 - src/logging/diagnostic.test.ts | 67 - src/logging/diagnostic.ts | 399 --- src/logging/logger.ts | 6 +- src/logging/parse-log-line.test.ts | 45 - src/logging/parse-log-line.ts | 63 - src/logging/redact-identifier.ts | 14 - src/logging/redact.test.ts | 104 - src/logging/redact.ts | 6 +- src/logging/subsystem.test.ts | 56 - src/logging/subsystem.ts | 3 +- src/logging/timestamps.test.ts | 58 - src/macos/gateway-daemon.ts | 279 -- src/macos/relay-smoke.test.ts | 54 - src/macos/relay-smoke.ts | 37 - src/macos/relay.ts | 82 - src/markdown/code-spans.ts | 105 - src/markdown/fences.ts | 81 - src/markdown/frontmatter.test.ts | 75 - src/markdown/frontmatter.ts | 157 -- src/markdown/ir.blockquote-spacing.test.ts | 202 -- src/markdown/ir.hr-spacing.test.ts | 163 -- src/markdown/ir.nested-lists.test.ts | 332 --- src/markdown/ir.table-bullets.test.ts | 119 - src/markdown/ir.table-code.test.ts | 89 - src/markdown/ir.ts | 922 ------- src/markdown/render.ts | 196 -- src/markdown/tables.ts | 42 - src/markdown/whatsapp.test.ts | 39 - src/markdown/whatsapp.ts | 77 - src/media-understanding/apply.e2e.test.ts | 848 ------ src/media-understanding/apply.ts | 569 ---- src/media-understanding/attachments.ts | 485 ---- src/media-understanding/audio-preflight.ts | 100 - src/media-understanding/concurrency.ts | 18 - src/media-understanding/defaults.ts | 53 - src/media-understanding/errors.ts | 15 - src/media-understanding/format.test.ts | 91 - src/media-understanding/format.ts | 98 - src/media-understanding/fs.ts | 13 - src/media-understanding/index.ts | 9 - .../media-understanding-misc.test.ts | 120 - src/media-understanding/output-extract.ts | 26 - .../providers/anthropic/index.ts | 8 - .../providers/audio.test-helpers.ts | 76 - .../providers/deepgram/audio.live.test.ts | 47 - .../providers/deepgram/audio.test.ts | 83 - .../providers/deepgram/audio.ts | 77 - .../providers/deepgram/index.ts | 8 - .../providers/google/audio.ts | 21 - .../providers/google/index.ts | 12 - .../providers/google/inline-data.ts | 96 - .../providers/google/video.test.ts | 130 - .../providers/google/video.ts | 21 - .../providers/groq/index.ts | 14 - src/media-understanding/providers/image.ts | 66 - src/media-understanding/providers/index.ts | 58 - .../providers/minimax/index.ts | 8 - .../providers/openai/audio.test.ts | 84 - .../providers/openai/audio.ts | 66 - .../providers/openai/index.ts | 10 - src/media-understanding/providers/shared.ts | 58 - .../providers/zai/index.ts | 8 - src/media-understanding/resolve.test.ts | 144 -- src/media-understanding/resolve.ts | 187 -- .../runner.auto-audio.test.ts | 115 - .../runner.deepgram.test.ts | 93 - src/media-understanding/runner.entries.ts | 595 ----- src/media-understanding/runner.test-utils.ts | 34 - src/media-understanding/runner.ts | 810 ------ .../runner.vision-skip.test.ts | 60 - src/media-understanding/scope.ts | 64 - src/media-understanding/types.ts | 115 - src/media-understanding/video.ts | 10 - src/media/audio-tags.ts | 19 - src/media/audio.test.ts | 41 - src/media/audio.ts | 48 - src/media/base64.ts | 37 - src/media/constants.ts | 46 - src/media/fetch.test.ts | 68 - src/media/fetch.ts | 178 -- src/media/host.test.ts | 92 - src/media/host.ts | 68 - src/media/image-ops.helpers.test.ts | 18 - src/media/image-ops.ts | 482 ---- src/media/inbound-path-policy.test.ts | 78 - src/media/inbound-path-policy.ts | 150 -- src/media/input-files.fetch-guard.test.ts | 115 - src/media/input-files.ts | 415 --- src/media/local-roots.ts | 40 - src/media/mime.test.ts | 127 - src/media/mime.ts | 191 -- src/media/outbound-attachment.ts | 20 - src/media/parse.test.ts | 53 - src/media/parse.ts | 251 -- src/media/png-encode.ts | 90 - src/media/read-response-with-limit.ts | 52 - src/media/server.test.ts | 129 - src/media/server.ts | 112 - src/media/sniff-mime-from-base64.ts | 21 - src/media/store.redirect.test.ts | 111 - src/media/store.test.ts | 304 --- src/media/store.ts | 324 --- src/memory/backend-config.test.ts | 146 -- src/memory/backend-config.ts | 354 --- src/memory/batch-error-utils.ts | 23 - src/memory/batch-gemini.ts | 347 --- src/memory/batch-http.ts | 38 - src/memory/batch-openai.ts | 258 -- src/memory/batch-output.ts | 55 - src/memory/batch-runner.ts | 40 - src/memory/batch-upload.ts | 37 - src/memory/batch-utils.ts | 35 - src/memory/batch-voyage.test.ts | 176 -- src/memory/batch-voyage.ts | 269 -- src/memory/embedding-chunk-limits.test.ts | 52 - src/memory/embedding-chunk-limits.ts | 30 - src/memory/embedding-input-limits.ts | 67 - src/memory/embedding-manager.test-harness.ts | 127 - src/memory/embedding-model-limits.ts | 35 - src/memory/embedding.test-mocks.ts | 39 - src/memory/embeddings-debug.ts | 13 - src/memory/embeddings-gemini.ts | 180 -- src/memory/embeddings-openai.ts | 73 - src/memory/embeddings-remote-client.ts | 33 - src/memory/embeddings-remote-fetch.ts | 21 - src/memory/embeddings-voyage.test.ts | 138 - src/memory/embeddings-voyage.ts | 81 - src/memory/embeddings.test.ts | 467 ---- src/memory/embeddings.ts | 286 -- src/memory/fs-utils.ts | 31 - src/memory/headers-fingerprint.ts | 19 - src/memory/hybrid.test.ts | 87 - src/memory/hybrid.ts | 149 -- src/memory/index.test.ts | 332 --- src/memory/index.ts | 7 - src/memory/internal.test.ts | 232 -- src/memory/internal.ts | 331 --- src/memory/manager-cache-key.ts | 54 - src/memory/manager-embedding-ops.ts | 806 ------ src/memory/manager-search.ts | 191 -- src/memory/manager-sync-ops.ts | 1175 --------- src/memory/manager.async-search.test.ts | 114 - src/memory/manager.atomic-reindex.test.ts | 86 - src/memory/manager.batch.test.ts | 336 --- src/memory/manager.embedding-batches.test.ts | 121 - src/memory/manager.read-file.test.ts | 124 - .../manager.sync-errors-do-not-crash.test.ts | 75 - src/memory/manager.ts | 637 ----- src/memory/manager.vector-dedupe.test.ts | 101 - src/memory/manager.watcher-config.test.ts | 109 - src/memory/memory-schema.ts | 96 - src/memory/mmr.test.ts | 390 --- src/memory/mmr.ts | 214 -- src/memory/node-llama.ts | 3 - src/memory/openai-batch.ts | 2 - src/memory/provider-key.ts | 33 - src/memory/qmd-manager.test.ts | 1982 -------------- src/memory/qmd-manager.ts | 1748 ------------- src/memory/qmd-query-parser.test.ts | 48 - src/memory/qmd-query-parser.ts | 121 - src/memory/qmd-scope.test.ts | 54 - src/memory/qmd-scope.ts | 106 - src/memory/query-expansion.test.ts | 135 - src/memory/query-expansion.ts | 524 ---- src/memory/search-manager.test.ts | 225 -- src/memory/search-manager.ts | 238 -- src/memory/session-files.test.ts | 87 - src/memory/session-files.ts | 131 - src/memory/sqlite-vec.ts | 24 - src/memory/sqlite.ts | 19 - src/memory/status-format.ts | 45 - src/memory/sync-index.ts | 39 - src/memory/sync-memory-files.ts | 68 - src/memory/sync-progress.ts | 38 - src/memory/sync-session-files.ts | 81 - src/memory/sync-stale.ts | 42 - src/memory/temporal-decay.test.ts | 173 -- src/memory/temporal-decay.ts | 167 -- src/memory/test-embeddings-mock.ts | 19 - src/memory/test-manager-helpers.ts | 19 - src/memory/test-manager.ts | 13 - src/memory/test-runtime-mocks.ts | 13 - src/memory/types.ts | 80 - src/node-host/config.ts | 72 - src/node-host/invoke-browser.ts | 226 -- src/node-host/invoke-system-run.ts | 428 --- src/node-host/invoke.sanitize-env.test.ts | 67 - src/node-host/invoke.ts | 597 ----- src/node-host/runner.ts | 162 -- src/node-host/with-timeout.ts | 35 - src/pairing/pairing-labels.ts | 6 - src/pairing/pairing-messages.test.ts | 62 - src/pairing/pairing-messages.ts | 20 - src/pairing/pairing-store.test.ts | 295 --- src/pairing/pairing-store.ts | 617 ----- src/pairing/setup-code.test.ts | 149 -- src/pairing/setup-code.ts | 396 --- src/plugin-sdk/account-id.ts | 1 - src/plugin-sdk/agent-media-payload.ts | 24 - src/plugin-sdk/allow-from.test.ts | 73 - src/plugin-sdk/allow-from.ts | 64 - src/plugin-sdk/command-auth.ts | 52 - src/plugin-sdk/config-paths.ts | 15 - src/plugin-sdk/file-lock.ts | 161 -- src/plugin-sdk/index.test.ts | 49 - src/plugin-sdk/index.ts | 484 ---- src/plugin-sdk/json-store.ts | 35 - src/plugin-sdk/onboarding.ts | 45 - src/plugin-sdk/provider-auth-result.ts | 47 - src/plugin-sdk/slack-message-actions.ts | 180 -- src/plugin-sdk/status-helpers.test.ts | 84 - src/plugin-sdk/status-helpers.ts | 57 - src/plugin-sdk/temp-path.test.ts | 71 - src/plugin-sdk/temp-path.ts | 65 - src/plugin-sdk/text-chunking.test.ts | 16 - src/plugin-sdk/text-chunking.ts | 9 - src/plugin-sdk/tool-send.ts | 15 - src/plugin-sdk/webhook-path.ts | 31 - src/plugin-sdk/webhook-targets.test.ts | 111 - src/plugin-sdk/webhook-targets.ts | 94 - src/plugins/bundled-dir.ts | 41 - src/plugins/cli.test.ts | 46 - src/plugins/cli.ts | 59 - src/plugins/commands.ts | 317 --- src/plugins/config-schema.ts | 33 - src/plugins/config-state.test.ts | 50 - src/plugins/config-state.ts | 225 -- src/plugins/discovery.test.ts | 242 -- src/plugins/discovery.ts | 605 ----- src/plugins/enable.test.ts | 34 - src/plugins/enable.ts | 34 - src/plugins/hook-runner-global.ts | 88 - src/plugins/hooks.before-agent-start.test.ts | 188 -- .../hooks.model-override-wiring.test.ts | 218 -- src/plugins/hooks.phase-hooks.test.ts | 75 - src/plugins/hooks.test-helpers.ts | 25 - src/plugins/hooks.ts | 748 ------ src/plugins/http-path.ts | 14 - src/plugins/http-registry.ts | 52 - src/plugins/install.e2e.test.ts | 582 ----- src/plugins/install.ts | 526 ---- src/plugins/installs.ts | 30 - src/plugins/loader.test.ts | 600 ----- src/plugins/loader.ts | 672 ----- src/plugins/logger.test.ts | 22 - src/plugins/logger.ts | 17 - src/plugins/manifest-registry.test.ts | 170 -- src/plugins/manifest-registry.ts | 248 -- src/plugins/manifest.ts | 151 -- src/plugins/path-safety.ts | 36 - src/plugins/providers.ts | 19 - src/plugins/registry.ts | 519 ---- src/plugins/runtime.ts | 41 - src/plugins/runtime/index.test.ts | 42 - src/plugins/runtime/index.ts | 455 ---- src/plugins/runtime/native-deps.ts | 28 - src/plugins/runtime/types.ts | 364 --- src/plugins/schema-validator.ts | 44 - src/plugins/services.test.ts | 127 - src/plugins/services.ts | 75 - src/plugins/slots.test.ts | 93 - src/plugins/slots.ts | 108 - src/plugins/source-display.test.ts | 52 - src/plugins/source-display.ts | 66 - src/plugins/status.ts | 35 - src/plugins/tools.optional.test.ts | 157 -- src/plugins/tools.ts | 134 - src/plugins/types.ts | 762 ------ src/plugins/uninstall.test.ts | 540 ---- src/plugins/uninstall.ts | 237 -- src/plugins/update.ts | 505 ---- src/plugins/voice-call.plugin.test.ts | 225 -- .../wired-hooks-after-tool-call.e2e.test.ts | 186 -- src/plugins/wired-hooks-compaction.test.ts | 115 - src/plugins/wired-hooks-gateway.test.ts | 40 - src/plugins/wired-hooks-llm.test.ts | 72 - src/plugins/wired-hooks-message.test.ts | 74 - src/plugins/wired-hooks-session.test.ts | 50 - src/plugins/wired-hooks-subagent.test.ts | 221 -- src/polls.test.ts | 47 - src/polls.ts | 93 - src/process/child-process-bridge.test.ts | 108 - src/process/command-queue.test.ts | 288 --- src/process/command-queue.ts | 286 -- src/process/exec.test.ts | 81 - src/process/exec.ts | 239 -- src/process/kill-tree.test.ts | 131 - src/process/kill-tree.ts | 104 - src/process/lanes.ts | 6 - src/process/restart-recovery.ts | 16 - src/process/spawn-utils.test.ts | 80 - src/process/spawn-utils.ts | 141 - src/process/supervisor/adapters/child.test.ts | 117 - src/process/supervisor/adapters/child.ts | 169 -- src/process/supervisor/adapters/env.ts | 13 - src/process/supervisor/adapters/pty.test.ts | 214 -- src/process/supervisor/adapters/pty.ts | 208 -- src/process/supervisor/index.ts | 24 - src/process/supervisor/registry.test.ts | 83 - src/process/supervisor/registry.ts | 154 -- .../supervisor/supervisor.pty-command.test.ts | 80 - src/process/supervisor/supervisor.test.ts | 102 - src/process/supervisor/supervisor.ts | 282 -- src/process/supervisor/types.ts | 96 - src/providers/github-copilot-auth.ts | 184 -- src/providers/github-copilot-models.test.ts | 39 - src/providers/github-copilot-models.ts | 43 - src/providers/github-copilot-token.test.ts | 75 - src/providers/github-copilot-token.ts | 137 - ...unction-call-comes-after-user-turn.test.ts | 88 - ...eserves-parameters-type-is-missing.test.ts | 287 --- src/providers/google-shared.test-helpers.ts | 92 - src/providers/qwen-portal-oauth.test.ts | 119 - src/providers/qwen-portal-oauth.ts | 62 - src/routing/account-id.test.ts | 29 - src/routing/account-id.ts | 34 - src/routing/bindings.ts | 113 - src/routing/resolve-route.test.ts | 681 ----- src/routing/resolve-route.ts | 435 ---- src/routing/session-key.continuity.test.ts | 70 - src/routing/session-key.test.ts | 68 - src/routing/session-key.ts | 252 -- src/scripts/canvas-a2ui-copy.test.ts | 57 - src/security/audit-channel.ts | 598 ----- src/security/audit-extra.async.ts | 1136 -------- src/security/audit-extra.sync.test.ts | 55 - src/security/audit-extra.sync.ts | 1045 -------- src/security/audit-extra.ts | 37 - src/security/audit-fs.ts | 206 -- src/security/audit-tool-policy.ts | 1 - src/security/audit.test.ts | 2296 ----------------- src/security/audit.ts | 787 ------ src/security/channel-metadata.ts | 45 - src/security/dangerous-tools.ts | 37 - src/security/dm-policy-shared.test.ts | 147 -- src/security/dm-policy-shared.ts | 115 - src/security/external-content.test.ts | 327 --- src/security/external-content.ts | 323 --- src/security/fix.test.ts | 245 -- src/security/fix.ts | 473 ---- src/security/scan-paths.ts | 42 - src/security/secret-equal.ts | 12 - src/security/skill-scanner.test.ts | 345 --- src/security/skill-scanner.ts | 426 --- src/security/temp-path-guard.test.ts | 64 - src/security/windows-acl.test.ts | 344 --- src/security/windows-acl.ts | 228 -- src/sessions/input-provenance.ts | 79 - src/sessions/level-overrides.ts | 32 - src/sessions/model-overrides.ts | 76 - src/sessions/send-policy.test.ts | 71 - src/sessions/send-policy.ts | 131 - src/sessions/session-key-utils.test.ts | 51 - src/sessions/session-key-utils.ts | 111 - src/sessions/session-label.ts | 20 - src/sessions/transcript-events.ts | 25 - src/shared/chat-content.ts | 42 - src/shared/config-eval.ts | 149 -- src/shared/entry-metadata.ts | 18 - src/shared/entry-status.ts | 66 - src/shared/frontmatter.ts | 139 - src/shared/model-param-b.ts | 19 - src/shared/net/ipv4.ts | 24 - src/shared/node-list-parse.test.ts | 24 - src/shared/node-list-parse.ts | 17 - src/shared/node-list-types.ts | 51 - src/shared/node-match.ts | 79 - src/shared/operator-scope-compat.test.ts | 89 - src/shared/operator-scope-compat.ts | 49 - src/shared/pid-alive.ts | 11 - src/shared/process-scoped-map.ts | 12 - src/shared/requirements.test.ts | 82 - src/shared/requirements.ts | 221 -- src/shared/shared-misc.test.ts | 151 -- src/shared/string-normalization.test.ts | 33 - src/shared/string-normalization.ts | 28 - src/shared/subagents-format.ts | 96 - src/shared/text-chunking.ts | 34 - src/shared/text/reasoning-tags.test.ts | 198 -- src/signal/accounts.ts | 72 - src/signal/client.ts | 195 -- src/signal/daemon.ts | 101 - src/signal/format.chunking.test.ts | 390 --- src/signal/format.links.test.ts | 35 - src/signal/format.test.ts | 68 - src/signal/format.ts | 397 --- src/signal/format.visual.test.ts | 57 - src/signal/identity.ts | 135 - src/signal/index.ts | 5 - ...or.event-handler.sender-prefix.e2e.test.ts | 90 - ...t-handler.typing-read-receipts.e2e.test.ts | 72 - src/signal/monitor.test.ts | 67 - ...y-senders-uuid-allowlist-entry.e2e.test.ts | 113 - ...ends-tool-summaries-responseprefix.test.ts | 380 --- .../monitor.tool-result.test-harness.ts | 116 - src/signal/monitor.ts | 373 --- .../event-handler.inbound-contract.test.ts | 82 - .../event-handler.mention-gating.test.ts | 246 -- .../monitor/event-handler.test-harness.ts | 49 - src/signal/monitor/event-handler.ts | 681 ----- src/signal/monitor/event-handler.types.ts | 126 - src/signal/monitor/mentions.ts | 56 - src/signal/probe.test.ts | 69 - src/signal/probe.ts | 56 - src/signal/reaction-level.ts | 34 - src/signal/rpc-context.ts | 24 - src/signal/send-reactions.test.ts | 65 - src/signal/send-reactions.ts | 187 -- src/signal/send.ts | 248 -- src/signal/sse-reconnect.ts | 80 - src/slack/accounts.ts | 115 - src/slack/actions.blocks.test.ts | 125 - src/slack/actions.read.test.ts | 66 - src/slack/actions.ts | 273 -- src/slack/blocks-fallback.test.ts | 31 - src/slack/blocks-fallback.ts | 95 - src/slack/blocks-input.test.ts | 57 - src/slack/blocks-input.ts | 45 - src/slack/blocks.test-helpers.ts | 51 - src/slack/channel-migration.test.ts | 112 - src/slack/channel-migration.ts | 102 - src/slack/client.test.ts | 46 - src/slack/client.ts | 20 - src/slack/directory-live.ts | 184 -- src/slack/draft-stream.test.ts | 140 - src/slack/draft-stream.ts | 140 - src/slack/format.test.ts | 59 - src/slack/format.ts | 140 - src/slack/http/index.ts | 1 - src/slack/http/registry.test.ts | 88 - src/slack/http/registry.ts | 49 - src/slack/index.ts | 25 - src/slack/message-actions.ts | 61 - src/slack/modal-metadata.test.ts | 55 - src/slack/modal-metadata.ts | 42 - src/slack/monitor.test-helpers.ts | 233 -- src/slack/monitor.test.ts | 144 -- ...onitor.threading.missing-thread-ts.test.ts | 109 - src/slack/monitor.tool-result.test.ts | 687 ----- src/slack/monitor.ts | 5 - src/slack/monitor/allow-list.test.ts | 56 - src/slack/monitor/allow-list.ts | 80 - src/slack/monitor/auth.ts | 27 - src/slack/monitor/channel-config.ts | 140 - src/slack/monitor/commands.ts | 35 - src/slack/monitor/context.ts | 419 --- src/slack/monitor/events.ts | 25 - src/slack/monitor/events/channels.ts | 156 -- src/slack/monitor/events/interactions.test.ts | 1119 -------- src/slack/monitor/events/interactions.ts | 681 ----- src/slack/monitor/events/members.ts | 73 - src/slack/monitor/events/messages.ts | 115 - src/slack/monitor/events/pins.ts | 80 - src/slack/monitor/events/reactions.ts | 73 - src/slack/monitor/media.test.ts | 660 ----- src/slack/monitor/media.ts | 491 ---- src/slack/monitor/message-handler.ts | 119 - .../dispatch.streaming.test.ts | 47 - src/slack/monitor/message-handler/dispatch.ts | 483 ---- .../monitor/message-handler/prepare.test.ts | 516 ---- src/slack/monitor/message-handler/prepare.ts | 684 ----- src/slack/monitor/message-handler/types.ts | 23 - src/slack/monitor/monitor.test.ts | 291 --- src/slack/monitor/mrkdwn.test.ts | 12 - src/slack/monitor/mrkdwn.ts | 8 - src/slack/monitor/policy.ts | 17 - src/slack/monitor/provider.ts | 365 --- src/slack/monitor/replies.ts | 169 -- src/slack/monitor/room-context.ts | 31 - src/slack/monitor/slash.test-harness.ts | 76 - src/slack/monitor/slash.test.ts | 913 ------- src/slack/monitor/slash.ts | 876 ------- src/slack/monitor/thread-resolution.ts | 134 - src/slack/monitor/types.ts | 90 - src/slack/probe.ts | 45 - src/slack/resolve-channels.test.ts | 42 - src/slack/resolve-channels.ts | 132 - src/slack/resolve-users.ts | 188 -- src/slack/scopes.ts | 116 - src/slack/send.blocks.test.ts | 129 - src/slack/send.ts | 325 --- src/slack/stream-mode.test.ts | 121 - src/slack/stream-mode.ts | 75 - src/slack/streaming.ts | 153 -- src/slack/targets.test.ts | 63 - src/slack/targets.ts | 72 - src/slack/threading-tool-context.test.ts | 111 - src/slack/threading-tool-context.ts | 29 - src/slack/threading.test.ts | 78 - src/slack/threading.ts | 45 - src/slack/token.ts | 12 - src/slack/types.ts | 61 - src/telegram/accounts.test.ts | 101 - src/telegram/accounts.ts | 166 -- src/telegram/allowed-updates.ts | 14 - src/telegram/api-logging.ts | 45 - src/telegram/audit.test.ts | 70 - src/telegram/audit.ts | 149 -- src/telegram/bot-access.ts | 89 - src/telegram/bot-handlers.ts | 1219 --------- ...t-message-context.audio-transcript.test.ts | 61 - .../bot-message-context.dm-threads.test.ts | 106 - ...-message-context.dm-topic-threadid.test.ts | 82 - .../bot-message-context.sender-prefix.test.ts | 75 - .../bot-message-context.test-harness.ts | 55 - src/telegram/bot-message-context.ts | 828 ------ src/telegram/bot-message-dispatch.test.ts | 1415 ---------- src/telegram/bot-message-dispatch.ts | 844 ------ src/telegram/bot-message.test.ts | 79 - src/telegram/bot-message.ts | 89 - src/telegram/bot-native-command-menu.test.ts | 89 - src/telegram/bot-native-command-menu.ts | 106 - .../bot-native-commands.plugin-auth.test.ts | 160 -- .../bot-native-commands.session-meta.test.ts | 173 -- src/telegram/bot-native-commands.test.ts | 288 --- src/telegram/bot-native-commands.ts | 751 ------ src/telegram/bot-updates.ts | 67 - .../bot.create-telegram-bot.test-harness.ts | 318 --- src/telegram/bot.create-telegram-bot.test.ts | 1874 -------------- src/telegram/bot.helpers.test.ts | 24 - ...dia-file-path-no-file-download.e2e.test.ts | 576 ----- src/telegram/bot.media.e2e-harness.ts | 94 - ...-location-text-ctx-fields-pins.e2e.test.ts | 84 - src/telegram/bot.test.ts | 1348 ---------- src/telegram/bot.ts | 382 --- .../bot/delivery.resolve-media-retry.test.ts | 191 -- src/telegram/bot/delivery.test.ts | 342 --- src/telegram/bot/delivery.ts | 584 ----- src/telegram/bot/helpers.test.ts | 250 -- src/telegram/bot/helpers.ts | 539 ---- src/telegram/bot/types.ts | 29 - src/telegram/button-types.ts | 9 - src/telegram/caption.ts | 15 - src/telegram/draft-chunking.test.ts | 52 - src/telegram/draft-chunking.ts | 41 - src/telegram/draft-stream.test.ts | 376 --- src/telegram/draft-stream.ts | 203 -- src/telegram/fetch.test.ts | 108 - src/telegram/fetch.ts | 49 - src/telegram/format.test.ts | 97 - src/telegram/format.ts | 265 -- src/telegram/format.wrap-md.test.ts | 406 --- src/telegram/group-access.ts | 141 - src/telegram/group-migration.test.ts | 112 - src/telegram/group-migration.ts | 89 - src/telegram/inline-buttons.test.ts | 37 - src/telegram/inline-buttons.ts | 67 - src/telegram/model-buttons.test.ts | 318 --- src/telegram/model-buttons.ts | 217 -- src/telegram/monitor.test.ts | 246 -- src/telegram/monitor.ts | 217 -- src/telegram/network-config.test.ts | 131 - src/telegram/network-config.ts | 57 - src/telegram/network-errors.test.ts | 86 - src/telegram/network-errors.ts | 150 -- src/telegram/outbound-params.ts | 22 - src/telegram/probe.test.ts | 110 - src/telegram/probe.ts | 120 - src/telegram/proxy.test.ts | 45 - src/telegram/proxy.ts | 15 - src/telegram/reaction-level.test.ts | 116 - src/telegram/reaction-level.ts | 28 - .../reasoning-lane-coordinator.test.ts | 25 - src/telegram/reasoning-lane-coordinator.ts | 167 -- src/telegram/send.proxy.test.ts | 113 - src/telegram/send.test-harness.ts | 82 - src/telegram/send.test.ts | 1510 ----------- src/telegram/send.ts | 1181 --------- src/telegram/sent-message-cache.ts | 63 - src/telegram/status-reaction-variants.test.ts | 192 -- src/telegram/status-reaction-variants.ts | 245 -- src/telegram/sticker-cache.test.ts | 261 -- src/telegram/sticker-cache.ts | 264 -- src/telegram/targets.test.ts | 75 - src/telegram/targets.ts | 77 - src/telegram/token.test.ts | 106 - src/telegram/token.ts | 102 - src/telegram/update-offset-store.test.ts | 37 - src/telegram/update-offset-store.ts | 98 - src/telegram/voice.test.ts | 57 - src/telegram/voice.ts | 35 - src/telegram/webhook.test.ts | 116 - src/telegram/webhook.ts | 157 -- src/terminal/health-style.ts | 43 - src/terminal/note.ts | 134 - src/terminal/prompt-select-styled.test.ts | 50 - src/terminal/prompt-select-styled.ts | 12 - src/terminal/restore.test.ts | 103 - src/terminal/stream-writer.test.ts | 41 - src/terminal/stream-writer.ts | 68 - src/terminal/table.test.ts | 188 -- src/terminal/table.ts | 419 --- src/test-helpers/state-dir-env.test.ts | 80 - src/test-helpers/state-dir-env.ts | 34 - src/test-helpers/workspace.ts | 17 - src/test-utils/channel-plugins.test.ts | 50 - src/test-utils/channel-plugins.ts | 69 - src/test-utils/chunk-test-helpers.ts | 22 - src/test-utils/command-runner.ts | 10 - src/test-utils/env.test.ts | 112 - src/test-utils/env.ts | 74 - src/test-utils/exec-assertions.ts | 34 - src/test-utils/fetch-mock.ts | 22 - src/test-utils/imessage-test-plugin.ts | 59 - src/test-utils/internal-hook-event-payload.ts | 15 - src/test-utils/mock-http-response.ts | 25 - src/test-utils/model-auth-mock.ts | 18 - src/test-utils/ports.ts | 109 - src/test-utils/provider-usage-fetch.ts | 27 - src/test-utils/temp-home.test.ts | 27 - src/test-utils/temp-home.ts | 43 - src/test-utils/typed-cases.ts | 3 - src/test-utils/vitest-mock-fn.ts | 6 - src/tts/prepare-text.test.ts | 67 - src/tts/tts-core.ts | 673 ----- src/tts/tts.test.ts | 531 ---- src/tts/tts.ts | 947 ------- src/tui/commands.ts | 163 -- src/tui/components/assistant-message.ts | 21 - src/tui/components/chat-log.test.ts | 44 - src/tui/components/chat-log.ts | 150 -- src/tui/components/custom-editor.ts | 60 - src/tui/components/filterable-select-list.ts | 143 - src/tui/components/fuzzy-filter.ts | 138 - .../components/searchable-select-list.test.ts | 314 --- src/tui/components/searchable-select-list.ts | 393 --- src/tui/components/selectors.ts | 30 - src/tui/components/tool-execution.ts | 137 - src/tui/components/user-message.ts | 20 - src/tui/gateway-chat.test.ts | 136 - src/tui/gateway-chat.ts | 270 -- src/tui/theme/syntax-theme.ts | 52 - src/tui/theme/theme.test.ts | 82 - src/tui/theme/theme.ts | 136 - src/tui/tui-command-handlers.test.ts | 138 - src/tui/tui-command-handlers.ts | 504 ---- src/tui/tui-event-handlers.test.ts | 436 ---- src/tui/tui-event-handlers.ts | 300 --- src/tui/tui-formatters.test.ts | 254 -- src/tui/tui-formatters.ts | 338 --- src/tui/tui-input-history.test.ts | 74 - src/tui/tui-local-shell.test.ts | 54 - src/tui/tui-local-shell.ts | 152 -- src/tui/tui-overlays.test.ts | 62 - src/tui/tui-overlays.ts | 19 - src/tui/tui-session-actions.test.ts | 114 - src/tui/tui-session-actions.ts | 412 --- src/tui/tui-status-summary.ts | 88 - src/tui/tui-stream-assembler.test.ts | 228 -- src/tui/tui-stream-assembler.ts | 174 -- src/tui/tui-types.ts | 107 - src/tui/tui-waiting.test.ts | 41 - src/tui/tui-waiting.ts | 51 - src/tui/tui.submit-handler.test.ts | 165 -- src/tui/tui.test.ts | 122 - src/tui/tui.ts | 885 ------- src/types/cli-highlight.d.ts | 10 - src/types/lydell-node-pty.d.ts | 24 - src/types/napi-rs-canvas.d.ts | 7 - src/types/node-edge-tts.d.ts | 18 - src/types/node-llama-cpp.d.ts | 22 - src/types/osc-progress.d.ts | 16 - src/types/pdfjs-dist-legacy.d.ts | 33 - src/types/qrcode-terminal.d.ts | 9 - src/utils.test.ts | 243 -- src/utils/account-id.ts | 5 - src/utils/chunk-items.ts | 10 - src/utils/delivery-context.test.ts | 129 - src/utils/delivery-context.ts | 140 - src/utils/directive-tags.test.ts | 25 - src/utils/directive-tags.ts | 99 - src/utils/fetch-timeout.ts | 37 - src/utils/mask-api-key.test.ts | 18 - src/utils/mask-api-key.ts | 10 - src/utils/message-channel.test.ts | 64 - src/utils/message-channel.ts | 148 -- src/utils/normalize-secret-input.ts | 20 - src/utils/provider-utils.ts | 36 - src/utils/queue-helpers.test.ts | 169 -- src/utils/queue-helpers.ts | 227 -- src/utils/reaction-level.test.ts | 65 - src/utils/reaction-level.ts | 74 - src/utils/run-with-concurrency.test.ts | 104 - src/utils/run-with-concurrency.ts | 48 - src/utils/safe-json.ts | 21 - src/utils/shell-argv.ts | 74 - src/utils/transcript-tools.test.ts | 66 - src/utils/transcript-tools.ts | 73 - src/utils/usage-format.test.ts | 60 - src/utils/usage-format.ts | 86 - src/utils/utils-misc.test.ts | 105 - src/utils/with-timeout.ts | 14 - src/version.test.ts | 146 -- src/web/accounts.test.ts | 47 - src/web/accounts.ts | 158 -- src/web/accounts.whatsapp-auth.test.ts | 59 - src/web/active-listener.ts | 84 - src/web/auth-store.ts | 206 -- ...asts-sequentially-configured-order.test.ts | 174 -- ...wn-broadcast-agent-ids-agents-list.test.ts | 35 - ...uto-reply.broadcast-groups.test-harness.ts | 47 - src/web/auto-reply.impl.ts | 7 - src/web/auto-reply.test-harness.ts | 253 -- src/web/auto-reply.ts | 1 - .../auto-reply.typing-controller-idle.test.ts | 72 - ...resses-common-formats-jpeg-cap.e2e.test.ts | 365 --- ...to-reply.web-auto-reply.last-route.test.ts | 161 -- ...ply.web-auto-reply.monitor-logging.test.ts | 95 - ...onnects-after-connection-close.e2e.test.ts | 323 --- src/web/auto-reply/constants.ts | 1 - src/web/auto-reply/deliver-reply.test.ts | 270 -- src/web/auto-reply/deliver-reply.ts | 195 -- src/web/auto-reply/heartbeat-runner.test.ts | 213 -- src/web/auto-reply/heartbeat-runner.ts | 309 --- src/web/auto-reply/loggers.ts | 6 - src/web/auto-reply/mentions.ts | 117 - src/web/auto-reply/monitor.ts | 452 ---- src/web/auto-reply/monitor/ack-reaction.ts | 74 - src/web/auto-reply/monitor/broadcast.ts | 99 - src/web/auto-reply/monitor/commands.ts | 27 - src/web/auto-reply/monitor/echo.ts | 64 - .../auto-reply/monitor/group-activation.ts | 56 - src/web/auto-reply/monitor/group-gating.ts | 153 -- src/web/auto-reply/monitor/group-members.ts | 71 - src/web/auto-reply/monitor/last-route.ts | 60 - src/web/auto-reply/monitor/message-line.ts | 47 - src/web/auto-reply/monitor/on-message.ts | 170 -- src/web/auto-reply/monitor/peer.ts | 15 - .../process-message.inbound-contract.test.ts | 232 -- src/web/auto-reply/monitor/process-message.ts | 441 ---- src/web/auto-reply/session-snapshot.ts | 69 - src/web/auto-reply/types.ts | 35 - src/web/auto-reply/util.ts | 61 - .../auto-reply/web-auto-reply-monitor.test.ts | 380 --- .../auto-reply/web-auto-reply-utils.test.ts | 275 -- src/web/inbound.media.test.ts | 230 -- src/web/inbound.test.ts | 237 -- src/web/inbound.ts | 4 - .../inbound/access-control.test-harness.ts | 47 - src/web/inbound/access-control.test.ts | 133 - src/web/inbound/access-control.ts | 193 -- src/web/inbound/dedupe.ts | 17 - src/web/inbound/extract.ts | 331 --- src/web/inbound/media.node.test.ts | 101 - src/web/inbound/media.ts | 76 - src/web/inbound/monitor.ts | 407 --- src/web/inbound/send-api.test.ts | 158 -- src/web/inbound/send-api.ts | 113 - src/web/inbound/types.ts | 43 - src/web/login-qr.test.ts | 63 - src/web/login-qr.ts | 295 --- src/web/login.coverage.test.ts | 104 - src/web/login.test.ts | 71 - src/web/login.ts | 78 - src/web/logout.test.ts | 98 - src/web/media.test.ts | 444 ---- src/web/media.ts | 488 ---- ...ssages-from-senders-allowfrom-list.test.ts | 323 --- ...unauthorized-senders-not-allowfrom.test.ts | 363 --- ...captures-media-path-image-messages.test.ts | 306 --- ...tor-inbox.streams-inbound-messages.test.ts | 299 --- src/web/monitor-inbox.test-harness.ts | 141 - src/web/outbound.test.ts | 170 -- src/web/outbound.ts | 184 -- src/web/qr-image.ts | 54 - src/web/reconnect.test.ts | 51 - src/web/reconnect.ts | 52 - src/web/session.test.ts | 228 -- src/web/session.ts | 312 --- src/web/test-helpers.ts | 136 - src/web/vcard.ts | 82 - src/whatsapp/normalize.test.ts | 72 - src/whatsapp/normalize.ts | 80 - src/whatsapp/resolve-outbound-target.test.ts | 288 --- src/whatsapp/resolve-outbound-target.ts | 53 - src/wizard/clack-prompter.test.ts | 35 - src/wizard/clack-prompter.ts | 140 - src/wizard/onboarding.completion.test.ts | 51 - src/wizard/onboarding.completion.ts | 109 - src/wizard/onboarding.finalize.ts | 461 ---- src/wizard/onboarding.gateway-config.test.ts | 125 - src/wizard/onboarding.gateway-config.ts | 253 -- src/wizard/onboarding.test.ts | 371 --- src/wizard/onboarding.ts | 467 ---- src/wizard/onboarding.types.ts | 25 - src/wizard/prompts.ts | 53 - src/wizard/session.test.ts | 74 - src/wizard/session.ts | 264 -- test/helpers/inbound-contract-capture.ts | 21 +- test/setup.ts | 55 +- tsconfig.plugin-sdk.dts.json | 15 - tsdown.config.ts | 39 - ui/src/ui/app-chat.ts | 2 +- ui/src/ui/app-gateway.node.test.ts | 2 +- ui/src/ui/app-gateway.ts | 8 +- ui/src/ui/app-render.ts | 2 +- ui/src/ui/chat/message-extract.ts | 4 +- ui/src/ui/chat/message-normalizer.ts | 2 +- .../src/ui/contracts}/chat-envelope.ts | 1 + .../src/ui/contracts}/control-ui-contract.ts | 0 .../src/ui/contracts}/device-auth.ts | 0 .../src/ui/contracts}/format-duration.ts | 48 - ui/src/ui/contracts/format-relative.ts | 49 + .../src/ui/contracts/gateway-client-info.ts | 1 - .../src/ui/contracts/gateway-device-auth.ts | 0 .../src/ui/contracts/gateway-events.ts | 2 +- .../src/ui/contracts}/reasoning-tags.ts | 0 ui/src/ui/contracts/session-key.ts | 23 + .../src/ui/contracts}/strip-inbound-meta.ts | 36 - ui/src/ui/contracts/tool-display-common.ts | 324 +++ .../src/ui/contracts/tool-policy.ts | 9 - ui/src/ui/contracts/update.ts | 5 + .../src/ui/contracts}/usage-aggregates.ts | 0 .../controllers/control-ui-bootstrap.test.ts | 2 +- ui/src/ui/controllers/control-ui-bootstrap.ts | 4 +- ui/src/ui/device-auth.ts | 2 +- ui/src/ui/format.ts | 6 +- ui/src/ui/gateway.ts | 4 +- ui/src/ui/tool-display.ts | 2 +- ui/src/ui/types.ts | 2 +- ui/src/ui/views/agents-panels-tools-skills.ts | 2 +- ui/src/ui/views/agents-utils.ts | 2 +- ui/src/ui/views/usage-metrics.ts | 2 +- ui/src/ui/views/usage-render-details.ts | 2 +- ui/src/ui/views/usage-render-overview.ts | 2 +- 3498 files changed, 2551 insertions(+), 623864 deletions(-) create mode 100644 .cursor/plans/bootstrap_dev_testing_0b5817e5.plan.md create mode 100644 .cursor/plans/ironclaw_frontend_split_1c02d591.plan.md create mode 100644 .cursor/plans/strict-external-openclaw_7c0d1717.plan.md delete mode 100644 scripts/canvas-a2ui-copy.ts delete mode 100644 scripts/copy-export-html-templates.ts delete mode 100644 scripts/copy-hook-metadata.ts delete mode 100644 scripts/write-cli-compat.ts delete mode 100644 scripts/write-plugin-sdk-entry-dts.ts delete mode 100644 src/acp/client.test.ts delete mode 100644 src/acp/client.ts delete mode 100644 src/acp/commands.ts delete mode 100644 src/acp/event-mapper.ts delete mode 100644 src/acp/index.ts delete mode 100644 src/acp/meta.ts delete mode 100644 src/acp/secret-file.ts delete mode 100644 src/acp/server.ts delete mode 100644 src/acp/session-mapper.test.ts delete mode 100644 src/acp/session-mapper.ts delete mode 100644 src/acp/session.test.ts delete mode 100644 src/acp/session.ts delete mode 100644 src/acp/translator.prompt-prefix.test.ts delete mode 100644 src/acp/translator.session-rate-limit.test.ts delete mode 100644 src/acp/translator.ts delete mode 100644 src/acp/types.ts delete mode 100644 src/agents/agent-paths.e2e.test.ts delete mode 100644 src/agents/agent-paths.ts delete mode 100644 src/agents/agent-scope.e2e.test.ts delete mode 100644 src/agents/agent-scope.ts delete mode 100644 src/agents/aisdk/event-adapter.ts delete mode 100644 src/agents/aisdk/index.ts delete mode 100644 src/agents/aisdk/provider.test.ts delete mode 100644 src/agents/aisdk/provider.ts delete mode 100644 src/agents/aisdk/run.test.ts delete mode 100644 src/agents/aisdk/run.ts delete mode 100644 src/agents/aisdk/tools.ts delete mode 100644 src/agents/aisdk/types.ts delete mode 100644 src/agents/announce-idempotency.ts delete mode 100644 src/agents/anthropic-payload-log.ts delete mode 100644 src/agents/anthropic.setup-token.live.test.ts delete mode 100644 src/agents/api-key-rotation.ts delete mode 100644 src/agents/apply-patch-update.ts delete mode 100644 src/agents/apply-patch.e2e.test.ts delete mode 100644 src/agents/apply-patch.ts delete mode 100644 src/agents/auth-health.e2e.test.ts delete mode 100644 src/agents/auth-health.ts delete mode 100644 src/agents/auth-profiles.chutes.e2e.test.ts delete mode 100644 src/agents/auth-profiles.cooldown-auto-expiry.test.ts delete mode 100644 src/agents/auth-profiles.ensureauthprofilestore.e2e.test.ts delete mode 100644 src/agents/auth-profiles.getsoonestcooldownexpiry.test.ts delete mode 100644 src/agents/auth-profiles.markauthprofilefailure.e2e.test.ts delete mode 100644 src/agents/auth-profiles.resolve-auth-profile-order.does-not-prioritize-lastgood-round-robin-ordering.e2e.test.ts delete mode 100644 src/agents/auth-profiles.resolve-auth-profile-order.fixtures.ts delete mode 100644 src/agents/auth-profiles.resolve-auth-profile-order.normalizes-z-ai-aliases-auth-order.e2e.test.ts delete mode 100644 src/agents/auth-profiles.resolve-auth-profile-order.orders-by-lastused-no-explicit-order-exists.e2e.test.ts delete mode 100644 src/agents/auth-profiles.resolve-auth-profile-order.uses-stored-profiles-no-config-exists.e2e.test.ts delete mode 100644 src/agents/auth-profiles.ts delete mode 100644 src/agents/auth-profiles/constants.ts delete mode 100644 src/agents/auth-profiles/display.ts delete mode 100644 src/agents/auth-profiles/doctor.ts delete mode 100644 src/agents/auth-profiles/external-cli-sync.ts delete mode 100644 src/agents/auth-profiles/oauth.fallback-to-main-agent.e2e.test.ts delete mode 100644 src/agents/auth-profiles/oauth.test.ts delete mode 100644 src/agents/auth-profiles/oauth.ts delete mode 100644 src/agents/auth-profiles/order.ts delete mode 100644 src/agents/auth-profiles/paths.ts delete mode 100644 src/agents/auth-profiles/profiles.ts delete mode 100644 src/agents/auth-profiles/repair.ts delete mode 100644 src/agents/auth-profiles/session-override.e2e.test.ts delete mode 100644 src/agents/auth-profiles/session-override.ts delete mode 100644 src/agents/auth-profiles/store.ts delete mode 100644 src/agents/auth-profiles/types.ts delete mode 100644 src/agents/auth-profiles/usage.test.ts delete mode 100644 src/agents/auth-profiles/usage.ts delete mode 100644 src/agents/bash-process-registry.e2e.test.ts delete mode 100644 src/agents/bash-process-registry.test-helpers.ts delete mode 100644 src/agents/bash-process-registry.ts delete mode 100644 src/agents/bash-tools.e2e.test.ts delete mode 100644 src/agents/bash-tools.exec-approval-request.test.ts delete mode 100644 src/agents/bash-tools.exec-approval-request.ts delete mode 100644 src/agents/bash-tools.exec-host-gateway.ts delete mode 100644 src/agents/bash-tools.exec-host-node.ts delete mode 100644 src/agents/bash-tools.exec-runtime.ts delete mode 100644 src/agents/bash-tools.exec-types.ts delete mode 100644 src/agents/bash-tools.exec.approval-id.e2e.test.ts delete mode 100644 src/agents/bash-tools.exec.background-abort.e2e.test.ts delete mode 100644 src/agents/bash-tools.exec.path.e2e.test.ts delete mode 100644 src/agents/bash-tools.exec.pty-cleanup.test.ts delete mode 100644 src/agents/bash-tools.exec.pty-fallback-failure.test.ts delete mode 100644 src/agents/bash-tools.exec.pty-fallback.e2e.test.ts delete mode 100644 src/agents/bash-tools.exec.pty.e2e.test.ts delete mode 100644 src/agents/bash-tools.exec.script-preflight.test.ts delete mode 100644 src/agents/bash-tools.exec.ts delete mode 100644 src/agents/bash-tools.process.poll-timeout.test.ts delete mode 100644 src/agents/bash-tools.process.send-keys.e2e.test.ts delete mode 100644 src/agents/bash-tools.process.supervisor.test.ts delete mode 100644 src/agents/bash-tools.process.ts delete mode 100644 src/agents/bash-tools.shared.ts delete mode 100644 src/agents/bash-tools.ts delete mode 100644 src/agents/bedrock-discovery.e2e.test.ts delete mode 100644 src/agents/bedrock-discovery.ts delete mode 100644 src/agents/bootstrap-files.e2e.test.ts delete mode 100644 src/agents/bootstrap-files.ts delete mode 100644 src/agents/bootstrap-hooks.e2e.test.ts delete mode 100644 src/agents/bootstrap-hooks.ts delete mode 100644 src/agents/byteplus-models.ts delete mode 100644 src/agents/byteplus.live.test.ts delete mode 100644 src/agents/cache-trace.e2e.test.ts delete mode 100644 src/agents/cache-trace.ts delete mode 100644 src/agents/channel-tools.e2e.test.ts delete mode 100644 src/agents/channel-tools.ts delete mode 100644 src/agents/chutes-oauth.e2e.test.ts delete mode 100644 src/agents/chutes-oauth.test.ts delete mode 100644 src/agents/chutes-oauth.ts delete mode 100644 src/agents/claude-cli-runner.e2e.test.ts delete mode 100644 src/agents/claude-cli-runner.ts delete mode 100644 src/agents/cli-backends.test.ts delete mode 100644 src/agents/cli-backends.ts delete mode 100644 src/agents/cli-credentials.test.ts delete mode 100644 src/agents/cli-credentials.ts delete mode 100644 src/agents/cli-runner.e2e.test.ts delete mode 100644 src/agents/cli-runner.ts delete mode 100644 src/agents/cli-runner/helpers.ts delete mode 100644 src/agents/cli-runner/reliability.ts delete mode 100644 src/agents/cli-session.ts delete mode 100644 src/agents/cli-watchdog-defaults.ts delete mode 100644 src/agents/cloudflare-ai-gateway.ts delete mode 100644 src/agents/command-poll-backoff.test.ts delete mode 100644 src/agents/command-poll-backoff.ts delete mode 100644 src/agents/compaction.e2e.test.ts delete mode 100644 src/agents/compaction.retry.test.ts delete mode 100644 src/agents/compaction.tool-result-details.e2e.test.ts delete mode 100644 src/agents/compaction.ts delete mode 100644 src/agents/content-blocks.test.ts delete mode 100644 src/agents/content-blocks.ts delete mode 100644 src/agents/context-window-guard.e2e.test.ts delete mode 100644 src/agents/context-window-guard.ts delete mode 100644 src/agents/context.test.ts delete mode 100644 src/agents/context.ts delete mode 100644 src/agents/current-time.ts delete mode 100644 src/agents/date-time.ts delete mode 100644 src/agents/defaults.ts delete mode 100644 src/agents/docs-path.ts delete mode 100644 src/agents/doubao-models.ts delete mode 100644 src/agents/engine-router.test.ts delete mode 100644 src/agents/engine-router.ts delete mode 100644 src/agents/failover-error.e2e.test.ts delete mode 100644 src/agents/failover-error.ts delete mode 100644 src/agents/glob-pattern.ts delete mode 100644 src/agents/google-gemini-switch.live.test.ts delete mode 100644 src/agents/huggingface-models.test.ts delete mode 100644 src/agents/huggingface-models.ts delete mode 100644 src/agents/identity-avatar.e2e.test.ts delete mode 100644 src/agents/identity-avatar.ts delete mode 100644 src/agents/identity-file.e2e.test.ts delete mode 100644 src/agents/identity-file.ts delete mode 100644 src/agents/identity.e2e.test.ts delete mode 100644 src/agents/identity.per-channel-prefix.e2e.test.ts delete mode 100644 src/agents/identity.test.ts delete mode 100644 src/agents/identity.ts delete mode 100644 src/agents/image-sanitization.test.ts delete mode 100644 src/agents/image-sanitization.ts delete mode 100644 src/agents/lanes.ts delete mode 100644 src/agents/live-auth-keys.e2e.test.ts delete mode 100644 src/agents/live-auth-keys.ts delete mode 100644 src/agents/live-model-filter.test.ts delete mode 100644 src/agents/live-model-filter.ts delete mode 100644 src/agents/memory-search.e2e.test.ts delete mode 100644 src/agents/memory-search.ts delete mode 100644 src/agents/minimax-vlm.normalizes-api-key.e2e.test.ts delete mode 100644 src/agents/minimax-vlm.ts delete mode 100644 src/agents/minimax.live.test.ts delete mode 100644 src/agents/model-alias-lines.ts delete mode 100644 src/agents/model-auth-label.ts delete mode 100644 src/agents/model-auth.e2e.test.ts delete mode 100644 src/agents/model-auth.test.ts delete mode 100644 src/agents/model-auth.ts delete mode 100644 src/agents/model-catalog.e2e.test.ts delete mode 100644 src/agents/model-catalog.test-harness.ts delete mode 100644 src/agents/model-catalog.test.ts delete mode 100644 src/agents/model-catalog.ts delete mode 100644 src/agents/model-compat.e2e.test.ts delete mode 100644 src/agents/model-compat.ts delete mode 100644 src/agents/model-fallback.e2e.test.ts delete mode 100644 src/agents/model-fallback.probe.test.ts delete mode 100644 src/agents/model-fallback.ts delete mode 100644 src/agents/model-forward-compat.test.ts delete mode 100644 src/agents/model-forward-compat.ts delete mode 100644 src/agents/model-scan.e2e.test.ts delete mode 100644 src/agents/model-scan.ts delete mode 100644 src/agents/model-selection.e2e.test.ts delete mode 100644 src/agents/model-selection.ts delete mode 100644 src/agents/models-config.auto-injects-github-copilot-provider-token-is.e2e.test.ts delete mode 100644 src/agents/models-config.e2e-harness.ts delete mode 100644 src/agents/models-config.falls-back-default-baseurl-token-exchange-fails.e2e.test.ts delete mode 100644 src/agents/models-config.fills-missing-provider-apikey-from-env-var.e2e.test.ts delete mode 100644 src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.e2e.test.ts delete mode 100644 src/agents/models-config.providers.kimi-coding.test.ts delete mode 100644 src/agents/models-config.providers.nvidia.test.ts delete mode 100644 src/agents/models-config.providers.ollama.e2e.test.ts delete mode 100644 src/agents/models-config.providers.qianfan.e2e.test.ts delete mode 100644 src/agents/models-config.providers.ts delete mode 100644 src/agents/models-config.providers.volcengine-byteplus.e2e.test.ts delete mode 100644 src/agents/models-config.skips-writing-models-json-no-env-token.e2e.test.ts delete mode 100644 src/agents/models-config.ts delete mode 100644 src/agents/models-config.uses-first-github-copilot-profile-env-tokens.e2e.test.ts delete mode 100644 src/agents/models.profiles.live.test.ts delete mode 100644 src/agents/ollama-stream.test.ts delete mode 100644 src/agents/ollama-stream.ts delete mode 100644 src/agents/openai-responses.reasoning-replay.test.ts delete mode 100644 src/agents/openclaw-gateway-tool.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.agents.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.camera.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.session-status.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.sessions-visibility.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.sessions.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.subagents.sessions-spawn-applies-thinking-default.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.subagents.sessions-spawn-depth-limits.test.ts delete mode 100644 src/agents/openclaw-tools.subagents.sessions-spawn.allowlist.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.subagents.sessions-spawn.model.e2e.test.ts delete mode 100644 src/agents/openclaw-tools.subagents.sessions-spawn.test-harness.ts delete mode 100644 src/agents/openclaw-tools.subagents.steer-failure-clears-suppression.test.ts delete mode 100644 src/agents/openclaw-tools.subagents.test-harness.ts delete mode 100644 src/agents/openclaw-tools.ts delete mode 100644 src/agents/opencode-zen-models.e2e.test.ts delete mode 100644 src/agents/opencode-zen-models.ts delete mode 100644 src/agents/pi-auth-json.test.ts delete mode 100644 src/agents/pi-auth-json.ts delete mode 100644 src/agents/pi-embedded-block-chunker.e2e.test.ts delete mode 100644 src/agents/pi-embedded-block-chunker.ts delete mode 100644 src/agents/pi-embedded-helpers.buildbootstrapcontextfiles.e2e.test.ts delete mode 100644 src/agents/pi-embedded-helpers.formatassistanterrortext.e2e.test.ts delete mode 100644 src/agents/pi-embedded-helpers.isbillingerrormessage.e2e.test.ts delete mode 100644 src/agents/pi-embedded-helpers.sanitize-session-messages-images.removes-empty-assistant-text-blocks-but-preserves.e2e.test.ts delete mode 100644 src/agents/pi-embedded-helpers.sanitizeuserfacingtext.e2e.test.ts delete mode 100644 src/agents/pi-embedded-helpers.ts delete mode 100644 src/agents/pi-embedded-helpers.validate-turns.e2e.test.ts delete mode 100644 src/agents/pi-embedded-helpers/bootstrap.ts delete mode 100644 src/agents/pi-embedded-helpers/errors.ts delete mode 100644 src/agents/pi-embedded-helpers/google.ts delete mode 100644 src/agents/pi-embedded-helpers/images.ts delete mode 100644 src/agents/pi-embedded-helpers/messaging-dedupe.ts delete mode 100644 src/agents/pi-embedded-helpers/openai.ts delete mode 100644 src/agents/pi-embedded-helpers/thinking.ts delete mode 100644 src/agents/pi-embedded-helpers/turns.ts delete mode 100644 src/agents/pi-embedded-helpers/types.ts delete mode 100644 src/agents/pi-embedded-messaging.ts delete mode 100644 src/agents/pi-embedded-payloads.ts delete mode 100644 src/agents/pi-embedded-runner-extraparams.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner-extraparams.live.test.ts delete mode 100644 src/agents/pi-embedded-runner.applygoogleturnorderingfix.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.buildembeddedsandboxinfo.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.compaction-safety-timeout.test.ts delete mode 100644 src/agents/pi-embedded-runner.createsystempromptoverride.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.falls-back-provider-default-per-dm-not.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.returns-undefined-sessionkey-is-undefined.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.google-sanitize-thinking.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.guard.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.guard.waitforidle-before-flush.test.ts delete mode 100644 src/agents/pi-embedded-runner.history-limit-from-session-key.test.ts delete mode 100644 src/agents/pi-embedded-runner.limithistoryturns.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.openai-tool-id-preservation.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.resolvesessionagentids.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.sanitize-session-history.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.sanitize-session-history.test-harness.ts delete mode 100644 src/agents/pi-embedded-runner.sanitize-session-history.test.ts delete mode 100644 src/agents/pi-embedded-runner.splitsdktools.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner.ts delete mode 100644 src/agents/pi-embedded-runner/abort.ts delete mode 100644 src/agents/pi-embedded-runner/cache-ttl.ts delete mode 100644 src/agents/pi-embedded-runner/compact.ts delete mode 100644 src/agents/pi-embedded-runner/compaction-safety-timeout.ts delete mode 100644 src/agents/pi-embedded-runner/extensions.ts delete mode 100644 src/agents/pi-embedded-runner/extra-params.cache-retention-default.test.ts delete mode 100644 src/agents/pi-embedded-runner/extra-params.ts delete mode 100644 src/agents/pi-embedded-runner/extra-params.zai-tool-stream.test.ts delete mode 100644 src/agents/pi-embedded-runner/google.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/google.ts delete mode 100644 src/agents/pi-embedded-runner/history.ts delete mode 100644 src/agents/pi-embedded-runner/lanes.ts delete mode 100644 src/agents/pi-embedded-runner/logger.ts delete mode 100644 src/agents/pi-embedded-runner/model.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/model.test-harness.ts delete mode 100644 src/agents/pi-embedded-runner/model.test.ts delete mode 100644 src/agents/pi-embedded-runner/model.ts delete mode 100644 src/agents/pi-embedded-runner/run.overflow-compaction.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/run.overflow-compaction.fixture.ts delete mode 100644 src/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.ts delete mode 100644 src/agents/pi-embedded-runner/run.overflow-compaction.test.ts delete mode 100644 src/agents/pi-embedded-runner/run.ts delete mode 100644 src/agents/pi-embedded-runner/run/attempt.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/run/attempt.ts delete mode 100644 src/agents/pi-embedded-runner/run/compaction-timeout.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/run/compaction-timeout.ts delete mode 100644 src/agents/pi-embedded-runner/run/images.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/run/images.ts delete mode 100644 src/agents/pi-embedded-runner/run/params.ts delete mode 100644 src/agents/pi-embedded-runner/run/payloads.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/run/payloads.test.ts delete mode 100644 src/agents/pi-embedded-runner/run/payloads.ts delete mode 100644 src/agents/pi-embedded-runner/run/types.ts delete mode 100644 src/agents/pi-embedded-runner/runs.ts delete mode 100644 src/agents/pi-embedded-runner/sandbox-info.ts delete mode 100644 src/agents/pi-embedded-runner/sanitize-session-history.tool-result-details.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/session-manager-cache.ts delete mode 100644 src/agents/pi-embedded-runner/session-manager-init.ts delete mode 100644 src/agents/pi-embedded-runner/system-prompt.ts delete mode 100644 src/agents/pi-embedded-runner/thinking.ts delete mode 100644 src/agents/pi-embedded-runner/tool-result-context-guard.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/tool-result-context-guard.ts delete mode 100644 src/agents/pi-embedded-runner/tool-result-truncation.e2e.test.ts delete mode 100644 src/agents/pi-embedded-runner/tool-result-truncation.ts delete mode 100644 src/agents/pi-embedded-runner/tool-split.ts delete mode 100644 src/agents/pi-embedded-runner/types.ts delete mode 100644 src/agents/pi-embedded-runner/usage-reporting.test.ts delete mode 100644 src/agents/pi-embedded-runner/utils.ts delete mode 100644 src/agents/pi-embedded-runner/wait-for-idle-before-flush.ts delete mode 100644 src/agents/pi-embedded-subscribe.code-span-awareness.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.e2e-harness.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.compaction.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.lifecycle.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.lifecycle.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.messages.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.messages.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.tools.media.test-helpers.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.tools.media.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.tools.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.tools.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.ts delete mode 100644 src/agents/pi-embedded-subscribe.handlers.types.ts delete mode 100644 src/agents/pi-embedded-subscribe.lifecycle-billing-error.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.raw-stream.ts delete mode 100644 src/agents/pi-embedded-subscribe.reply-tags.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.calls-onblockreplyflush-before-tool-execution-start-preserve.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-append-text-end-content-is.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-call-onblockreplyflush-callback-is-not.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-duplicate-text-end-repeats-full.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-emit-duplicate-block-replies-text.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-block-replies-text-end-does-not.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-reasoning-as-separate-message-enabled.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.filters-final-suppresses-output-without-start-tag.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.includes-canvas-action-metadata-tool-summaries.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.keeps-assistanttexts-final-answer-block-replies-are.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.keeps-indented-fenced-blocks-intact.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.reopens-fenced-blocks-splitting-inside-them.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.splits-long-single-line-fenced-blocks-reopen.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.streams-soft-chunks-paragraph-preference.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.subscribeembeddedpisession.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.suppresses-message-end-block-replies-message-tool.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.waits-multiple-compaction-retries-before-resolving.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.tools.e2e.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.tools.media.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.tools.test.ts delete mode 100644 src/agents/pi-embedded-subscribe.tools.ts delete mode 100644 src/agents/pi-embedded-subscribe.ts delete mode 100644 src/agents/pi-embedded-subscribe.types.ts delete mode 100644 src/agents/pi-embedded-utils.e2e.test.ts delete mode 100644 src/agents/pi-embedded-utils.ts delete mode 100644 src/agents/pi-embedded.ts delete mode 100644 src/agents/pi-extensions/compaction-safeguard-runtime.ts delete mode 100644 src/agents/pi-extensions/compaction-safeguard.e2e.test.ts delete mode 100644 src/agents/pi-extensions/compaction-safeguard.ts delete mode 100644 src/agents/pi-extensions/context-pruning.e2e.test.ts delete mode 100644 src/agents/pi-extensions/context-pruning.ts delete mode 100644 src/agents/pi-extensions/context-pruning/extension.ts delete mode 100644 src/agents/pi-extensions/context-pruning/pruner.ts delete mode 100644 src/agents/pi-extensions/context-pruning/runtime.ts delete mode 100644 src/agents/pi-extensions/context-pruning/settings.ts delete mode 100644 src/agents/pi-extensions/context-pruning/tools.ts delete mode 100644 src/agents/pi-extensions/session-manager-runtime-registry.ts delete mode 100644 src/agents/pi-model-discovery.ts delete mode 100644 src/agents/pi-settings.e2e.test.ts delete mode 100644 src/agents/pi-settings.ts delete mode 100644 src/agents/pi-tool-definition-adapter.after-tool-call.e2e.test.ts delete mode 100644 src/agents/pi-tool-definition-adapter.e2e.test.ts delete mode 100644 src/agents/pi-tool-definition-adapter.ts delete mode 100644 src/agents/pi-tools-agent-config.e2e.test.ts delete mode 100644 src/agents/pi-tools.abort.ts delete mode 100644 src/agents/pi-tools.before-tool-call.e2e.test.ts delete mode 100644 src/agents/pi-tools.before-tool-call.test.ts delete mode 100644 src/agents/pi-tools.before-tool-call.ts delete mode 100644 src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-b.e2e.test.ts delete mode 100644 src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.e2e.test.ts delete mode 100644 src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-f.e2e.test.ts delete mode 100644 src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping.e2e.test.ts delete mode 100644 src/agents/pi-tools.policy.e2e.test.ts delete mode 100644 src/agents/pi-tools.policy.ts delete mode 100644 src/agents/pi-tools.read.ts delete mode 100644 src/agents/pi-tools.safe-bins.e2e.test.ts delete mode 100644 src/agents/pi-tools.sandbox-mounted-paths.workspace-only.test.ts delete mode 100644 src/agents/pi-tools.schema.ts delete mode 100644 src/agents/pi-tools.ts delete mode 100644 src/agents/pi-tools.types.ts delete mode 100644 src/agents/pi-tools.whatsapp-login-gating.e2e.test.ts delete mode 100644 src/agents/pi-tools.workspace-paths.e2e.test.ts delete mode 100644 src/agents/pty-dsr.ts delete mode 100644 src/agents/pty-keys.e2e.test.ts delete mode 100644 src/agents/pty-keys.ts delete mode 100644 src/agents/queued-file-writer.ts delete mode 100644 src/agents/sandbox-agent-config.agent-specific-sandbox-config.e2e.test.ts delete mode 100644 src/agents/sandbox-create-args.e2e.test.ts delete mode 100644 src/agents/sandbox-explain.e2e.test.ts delete mode 100644 src/agents/sandbox-merge.e2e.test.ts delete mode 100644 src/agents/sandbox-paths.test.ts delete mode 100644 src/agents/sandbox-paths.ts delete mode 100644 src/agents/sandbox-skills.e2e.test.ts delete mode 100644 src/agents/sandbox-tool-policy.ts delete mode 100644 src/agents/sandbox.resolveSandboxContext.e2e.test.ts delete mode 100644 src/agents/sandbox.ts delete mode 100644 src/agents/sandbox/browser-bridges.ts delete mode 100644 src/agents/sandbox/browser.create.test.ts delete mode 100644 src/agents/sandbox/browser.novnc-url.test.ts delete mode 100644 src/agents/sandbox/browser.ts delete mode 100644 src/agents/sandbox/config-hash.test.ts delete mode 100644 src/agents/sandbox/config-hash.ts delete mode 100644 src/agents/sandbox/config.ts delete mode 100644 src/agents/sandbox/constants.ts delete mode 100644 src/agents/sandbox/context.ts delete mode 100644 src/agents/sandbox/docker.config-hash-recreate.test.ts delete mode 100644 src/agents/sandbox/docker.ts delete mode 100644 src/agents/sandbox/fs-bridge.test.ts delete mode 100644 src/agents/sandbox/fs-bridge.ts delete mode 100644 src/agents/sandbox/fs-paths.test.ts delete mode 100644 src/agents/sandbox/fs-paths.ts delete mode 100644 src/agents/sandbox/hash.ts delete mode 100644 src/agents/sandbox/manage.ts delete mode 100644 src/agents/sandbox/novnc-auth.ts delete mode 100644 src/agents/sandbox/prune.ts delete mode 100644 src/agents/sandbox/registry.test.ts delete mode 100644 src/agents/sandbox/registry.ts delete mode 100644 src/agents/sandbox/runtime-status.ts delete mode 100644 src/agents/sandbox/sanitize-env-vars.test.ts delete mode 100644 src/agents/sandbox/sanitize-env-vars.ts delete mode 100644 src/agents/sandbox/shared.ts delete mode 100644 src/agents/sandbox/test-fixtures.ts delete mode 100644 src/agents/sandbox/tool-policy.ts delete mode 100644 src/agents/sandbox/types.docker.ts delete mode 100644 src/agents/sandbox/types.ts delete mode 100644 src/agents/sandbox/validate-sandbox-security.test.ts delete mode 100644 src/agents/sandbox/validate-sandbox-security.ts delete mode 100644 src/agents/sandbox/workspace.ts delete mode 100644 src/agents/sanitize-for-prompt.test.ts delete mode 100644 src/agents/sanitize-for-prompt.ts delete mode 100644 src/agents/schema/clean-for-gemini.ts delete mode 100644 src/agents/schema/typebox.ts delete mode 100644 src/agents/session-dirs.ts delete mode 100644 src/agents/session-file-repair.e2e.test.ts delete mode 100644 src/agents/session-file-repair.ts delete mode 100644 src/agents/session-slug.e2e.test.ts delete mode 100644 src/agents/session-slug.ts delete mode 100644 src/agents/session-tool-result-guard-wrapper.ts delete mode 100644 src/agents/session-tool-result-guard.e2e.test.ts delete mode 100644 src/agents/session-tool-result-guard.tool-result-persist-hook.e2e.test.ts delete mode 100644 src/agents/session-tool-result-guard.ts delete mode 100644 src/agents/session-transcript-repair.e2e.test.ts delete mode 100644 src/agents/session-transcript-repair.ts delete mode 100644 src/agents/session-write-lock.e2e.test.ts delete mode 100644 src/agents/session-write-lock.ts delete mode 100644 src/agents/sessions-spawn-hooks.test.ts delete mode 100644 src/agents/sessions-spawn-threadid.e2e.test.ts delete mode 100644 src/agents/shell-utils.e2e.test.ts delete mode 100644 src/agents/shell-utils.ts delete mode 100644 src/agents/skills-install-download.ts delete mode 100644 src/agents/skills-install-fallback.e2e.test.ts delete mode 100644 src/agents/skills-install-output.ts delete mode 100644 src/agents/skills-install.download-tarbz2.e2e.test.ts delete mode 100644 src/agents/skills-install.download-test-utils.ts delete mode 100644 src/agents/skills-install.download.e2e.test.ts delete mode 100644 src/agents/skills-install.e2e.test.ts delete mode 100644 src/agents/skills-install.ts delete mode 100644 src/agents/skills-status.e2e.test.ts delete mode 100644 src/agents/skills-status.ts delete mode 100644 src/agents/skills.agents-skills-directory.e2e.test.ts delete mode 100644 src/agents/skills.build-workspace-skills-prompt.applies-bundled-allowlist-without-affecting-workspace-skills.e2e.test.ts delete mode 100644 src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.e2e.test.ts delete mode 100644 src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.e2e.test.ts delete mode 100644 src/agents/skills.buildworkspaceskillsnapshot.e2e.test.ts delete mode 100644 src/agents/skills.buildworkspaceskillstatus.e2e.test.ts delete mode 100644 src/agents/skills.compact-skill-paths.test.ts delete mode 100644 src/agents/skills.e2e-test-helpers.test.ts delete mode 100644 src/agents/skills.e2e-test-helpers.ts delete mode 100644 src/agents/skills.e2e.test.ts delete mode 100644 src/agents/skills.loadworkspaceskillentries.e2e.test.ts delete mode 100644 src/agents/skills.resolveskillspromptforrun.e2e.test.ts delete mode 100644 src/agents/skills.summarize-skill-description.e2e.test.ts delete mode 100644 src/agents/skills.test-helpers.ts delete mode 100644 src/agents/skills.ts delete mode 100644 src/agents/skills/bundled-context.ts delete mode 100644 src/agents/skills/bundled-dir.e2e.test.ts delete mode 100644 src/agents/skills/bundled-dir.ts delete mode 100644 src/agents/skills/config.ts delete mode 100644 src/agents/skills/env-overrides.ts delete mode 100644 src/agents/skills/filter.test.ts delete mode 100644 src/agents/skills/filter.ts delete mode 100644 src/agents/skills/frontmatter.e2e.test.ts delete mode 100644 src/agents/skills/frontmatter.ts delete mode 100644 src/agents/skills/plugin-skills.ts delete mode 100644 src/agents/skills/refresh.test.ts delete mode 100644 src/agents/skills/refresh.ts delete mode 100644 src/agents/skills/serialize.ts delete mode 100644 src/agents/skills/tools-dir.ts delete mode 100644 src/agents/skills/types.ts delete mode 100644 src/agents/skills/workspace.ts delete mode 100644 src/agents/stable-stringify.ts delete mode 100644 src/agents/subagent-announce-queue.test.ts delete mode 100644 src/agents/subagent-announce-queue.ts delete mode 100644 src/agents/subagent-announce.format.e2e.test.ts delete mode 100644 src/agents/subagent-announce.ts delete mode 100644 src/agents/subagent-depth.test.ts delete mode 100644 src/agents/subagent-depth.ts delete mode 100644 src/agents/subagent-lifecycle-events.ts delete mode 100644 src/agents/subagent-registry-cleanup.ts delete mode 100644 src/agents/subagent-registry-completion.test.ts delete mode 100644 src/agents/subagent-registry-completion.ts delete mode 100644 src/agents/subagent-registry-queries.ts delete mode 100644 src/agents/subagent-registry-state.ts delete mode 100644 src/agents/subagent-registry.announce-loop-guard.test.ts delete mode 100644 src/agents/subagent-registry.archive.test.ts delete mode 100644 src/agents/subagent-registry.mocks.shared.ts delete mode 100644 src/agents/subagent-registry.nested.test.ts delete mode 100644 src/agents/subagent-registry.persistence.e2e.test.ts delete mode 100644 src/agents/subagent-registry.steer-restart.test.ts delete mode 100644 src/agents/subagent-registry.store.ts delete mode 100644 src/agents/subagent-registry.ts delete mode 100644 src/agents/subagent-registry.types.ts delete mode 100644 src/agents/subagent-spawn.ts delete mode 100644 src/agents/synthetic-models.ts delete mode 100644 src/agents/system-prompt-params.e2e.test.ts delete mode 100644 src/agents/system-prompt-params.ts delete mode 100644 src/agents/system-prompt-report.test.ts delete mode 100644 src/agents/system-prompt-report.ts delete mode 100644 src/agents/system-prompt-stability.test.ts delete mode 100644 src/agents/system-prompt.e2e.test.ts delete mode 100644 src/agents/system-prompt.ts delete mode 100644 src/agents/test-helpers/assistant-message-fixtures.ts delete mode 100644 src/agents/test-helpers/fast-coding-tools.ts delete mode 100644 src/agents/test-helpers/fast-core-tools.ts delete mode 100644 src/agents/test-helpers/fast-tool-stubs.ts delete mode 100644 src/agents/test-helpers/host-sandbox-fs-bridge.ts delete mode 100644 src/agents/test-helpers/pi-tools-sandbox-context.test.ts delete mode 100644 src/agents/test-helpers/pi-tools-sandbox-context.ts delete mode 100644 src/agents/timeout.ts delete mode 100644 src/agents/together-models.ts delete mode 100644 src/agents/tool-call-id.e2e.test.ts delete mode 100644 src/agents/tool-call-id.ts delete mode 100644 src/agents/tool-display-common.ts delete mode 100644 src/agents/tool-display.e2e.test.ts delete mode 100644 src/agents/tool-display.json delete mode 100644 src/agents/tool-display.ts delete mode 100644 src/agents/tool-images.e2e.test.ts delete mode 100644 src/agents/tool-images.log.test.ts delete mode 100644 src/agents/tool-images.ts delete mode 100644 src/agents/tool-loop-detection.test.ts delete mode 100644 src/agents/tool-loop-detection.ts delete mode 100644 src/agents/tool-mutation.test.ts delete mode 100644 src/agents/tool-mutation.ts delete mode 100644 src/agents/tool-policy-pipeline.test.ts delete mode 100644 src/agents/tool-policy-pipeline.ts delete mode 100644 src/agents/tool-policy.conformance.ts delete mode 100644 src/agents/tool-policy.e2e.test.ts delete mode 100644 src/agents/tool-policy.plugin-only-allowlist.e2e.test.ts delete mode 100644 src/agents/tool-policy.ts delete mode 100644 src/agents/tool-summaries.ts delete mode 100644 src/agents/tools/agent-step.test.ts delete mode 100644 src/agents/tools/agent-step.ts delete mode 100644 src/agents/tools/agents-list-tool.ts delete mode 100644 src/agents/tools/browser-tool.e2e.test.ts delete mode 100644 src/agents/tools/browser-tool.schema.ts delete mode 100644 src/agents/tools/browser-tool.ts delete mode 100644 src/agents/tools/canvas-tool.ts delete mode 100644 src/agents/tools/common.e2e.test.ts delete mode 100644 src/agents/tools/common.test.ts delete mode 100644 src/agents/tools/common.ts delete mode 100644 src/agents/tools/cron-tool.e2e.test.ts delete mode 100644 src/agents/tools/cron-tool.flat-params.test.ts delete mode 100644 src/agents/tools/cron-tool.ts delete mode 100644 src/agents/tools/discord-actions-guild.ts delete mode 100644 src/agents/tools/discord-actions-messaging.ts delete mode 100644 src/agents/tools/discord-actions-moderation-shared.ts delete mode 100644 src/agents/tools/discord-actions-moderation.authz.test.ts delete mode 100644 src/agents/tools/discord-actions-moderation.ts delete mode 100644 src/agents/tools/discord-actions-presence.e2e.test.ts delete mode 100644 src/agents/tools/discord-actions-presence.ts delete mode 100644 src/agents/tools/discord-actions.e2e.test.ts delete mode 100644 src/agents/tools/discord-actions.ts delete mode 100644 src/agents/tools/gateway-tool.ts delete mode 100644 src/agents/tools/gateway.e2e.test.ts delete mode 100644 src/agents/tools/gateway.ts delete mode 100644 src/agents/tools/image-tool.e2e.test.ts delete mode 100644 src/agents/tools/image-tool.helpers.ts delete mode 100644 src/agents/tools/image-tool.ts delete mode 100644 src/agents/tools/memory-tool.e2e.test.ts delete mode 100644 src/agents/tools/memory-tool.test.ts delete mode 100644 src/agents/tools/memory-tool.ts delete mode 100644 src/agents/tools/message-tool.e2e.test.ts delete mode 100644 src/agents/tools/message-tool.ts delete mode 100644 src/agents/tools/nodes-tool.ts delete mode 100644 src/agents/tools/nodes-utils.ts delete mode 100644 src/agents/tools/self-update-tool.ts delete mode 100644 src/agents/tools/session-status-tool.ts delete mode 100644 src/agents/tools/sessions-access.test.ts delete mode 100644 src/agents/tools/sessions-access.ts delete mode 100644 src/agents/tools/sessions-announce-target.ts delete mode 100644 src/agents/tools/sessions-helpers.ts delete mode 100644 src/agents/tools/sessions-history-tool.ts delete mode 100644 src/agents/tools/sessions-list-tool.ts delete mode 100644 src/agents/tools/sessions-resolution.test.ts delete mode 100644 src/agents/tools/sessions-resolution.ts delete mode 100644 src/agents/tools/sessions-send-helpers.ts delete mode 100644 src/agents/tools/sessions-send-tool.a2a.ts delete mode 100644 src/agents/tools/sessions-send-tool.ts delete mode 100644 src/agents/tools/sessions-spawn-tool.ts delete mode 100644 src/agents/tools/sessions.e2e.test.ts delete mode 100644 src/agents/tools/slack-actions.e2e.test.ts delete mode 100644 src/agents/tools/slack-actions.ts delete mode 100644 src/agents/tools/subagents-tool.ts delete mode 100644 src/agents/tools/telegram-actions.e2e.test.ts delete mode 100644 src/agents/tools/telegram-actions.ts delete mode 100644 src/agents/tools/tts-tool.test.ts delete mode 100644 src/agents/tools/tts-tool.ts delete mode 100644 src/agents/tools/web-fetch-utils.ts delete mode 100644 src/agents/tools/web-fetch.cf-markdown.test.ts delete mode 100644 src/agents/tools/web-fetch.firecrawl-api-key-normalization.e2e.test.ts delete mode 100644 src/agents/tools/web-fetch.response-limit.test.ts delete mode 100644 src/agents/tools/web-fetch.ssrf.e2e.test.ts delete mode 100644 src/agents/tools/web-fetch.test-harness.ts delete mode 100644 src/agents/tools/web-fetch.test-mocks.ts delete mode 100644 src/agents/tools/web-fetch.ts delete mode 100644 src/agents/tools/web-search.e2e.test.ts delete mode 100644 src/agents/tools/web-search.ts delete mode 100644 src/agents/tools/web-shared.ts delete mode 100644 src/agents/tools/web-tools.enabled-defaults.e2e.test.ts delete mode 100644 src/agents/tools/web-tools.fetch.e2e.test.ts delete mode 100644 src/agents/tools/web-tools.readability.e2e.test.ts delete mode 100644 src/agents/tools/web-tools.ts delete mode 100644 src/agents/tools/whatsapp-actions.e2e.test.ts delete mode 100644 src/agents/tools/whatsapp-actions.ts delete mode 100644 src/agents/tools/whatsapp-target-auth.ts delete mode 100644 src/agents/transcript-policy.e2e.test.ts delete mode 100644 src/agents/transcript-policy.test.ts delete mode 100644 src/agents/transcript-policy.ts delete mode 100644 src/agents/usage.e2e.test.ts delete mode 100644 src/agents/usage.test.ts delete mode 100644 src/agents/usage.ts delete mode 100644 src/agents/venice-models.ts delete mode 100644 src/agents/workspace-context-awareness.live.test.ts delete mode 100644 src/agents/workspace-context-awareness.test.ts delete mode 100644 src/agents/workspace-dir.ts delete mode 100644 src/agents/workspace-dirs.ts delete mode 100644 src/agents/workspace-run.e2e.test.ts delete mode 100644 src/agents/workspace-run.ts delete mode 100644 src/agents/workspace-seed.ts delete mode 100644 src/agents/workspace-templates.e2e.test.ts delete mode 100644 src/agents/workspace-templates.ts delete mode 100644 src/agents/workspace.bootstrap-cache.test.ts delete mode 100644 src/agents/workspace.defaults.e2e.test.ts delete mode 100644 src/agents/workspace.e2e.test.ts delete mode 100644 src/agents/workspace.load-extra-bootstrap-files.test.ts delete mode 100644 src/agents/workspace.ts delete mode 100644 src/agents/zai.live.test.ts delete mode 100644 src/auto-reply/chunk.test.ts delete mode 100644 src/auto-reply/chunk.ts delete mode 100644 src/auto-reply/command-auth.ts delete mode 100644 src/auto-reply/command-control.test.ts delete mode 100644 src/auto-reply/command-detection.ts delete mode 100644 src/auto-reply/commands-args.test.ts delete mode 100644 src/auto-reply/commands-args.ts delete mode 100644 src/auto-reply/commands-registry.data.ts delete mode 100644 src/auto-reply/commands-registry.test.ts delete mode 100644 src/auto-reply/commands-registry.ts delete mode 100644 src/auto-reply/commands-registry.types.ts delete mode 100644 src/auto-reply/dispatch.test.ts delete mode 100644 src/auto-reply/dispatch.ts delete mode 100644 src/auto-reply/envelope.test.ts delete mode 100644 src/auto-reply/envelope.ts delete mode 100644 src/auto-reply/fallback-state.test.ts delete mode 100644 src/auto-reply/fallback-state.ts delete mode 100644 src/auto-reply/group-activation.ts delete mode 100644 src/auto-reply/heartbeat-reply-payload.ts delete mode 100644 src/auto-reply/heartbeat.test.ts delete mode 100644 src/auto-reply/heartbeat.ts delete mode 100644 src/auto-reply/inbound-debounce.ts delete mode 100644 src/auto-reply/inbound.test.ts delete mode 100644 src/auto-reply/media-note.test.ts delete mode 100644 src/auto-reply/media-note.ts delete mode 100644 src/auto-reply/media-understanding.test-fixtures.ts delete mode 100644 src/auto-reply/model-runtime.ts delete mode 100644 src/auto-reply/model.test.ts delete mode 100644 src/auto-reply/model.ts delete mode 100644 src/auto-reply/reply.block-streaming.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.accepts-thinking-xhigh-codex-models.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.applies-inline-reasoning-mixed-messages-acks-immediately.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.defaults-think-low-reasoning-capable-models-no.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.e2e-harness.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.e2e-mocks.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.ignores-inline-model-uses-default-model.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.lists-allowlisted-models-model-list.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.prefers-alias-matches-fuzzy-selection-is-ambiguous.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.requires-per-agent-allowlist-addition-global.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.returns-status-alongside-directive-only-acks.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.shows-current-elevated-level-as-off-after.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.shows-current-verbose-level-verbose-has-no.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.supports-fuzzy-model-matches-model-directive.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.directive-behavior.updates-tool-verbose-during-flight-run-toggle.e2e.test.ts delete mode 100644 src/auto-reply/reply.directive.parse.test.ts delete mode 100644 src/auto-reply/reply.heartbeat-typing.test.ts delete mode 100644 src/auto-reply/reply.media-note.test.ts delete mode 100644 src/auto-reply/reply.raw-body.test.ts delete mode 100644 src/auto-reply/reply.test-harness.ts delete mode 100644 src/auto-reply/reply.triggers.group-intro-prompts.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.allows-activation-from-allowfrom-groups.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.allows-approved-sender-toggle-elevated-mode.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.allows-elevated-off-groups-without-mention.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.filters-usage-summary-current-model-provider.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.handles-inline-commands-strips-it-before-agent.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.ignores-inline-elevated-directive-unapproved-sender.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.includes-error-cause-embedded-agent-throws.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.keeps-inline-status-unauthorized-senders.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.reports-active-auth-profile-key-snippet-status.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.runs-compact-as-gated-command.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.runs-greeting-prompt-bare-reset.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.shows-endpoint-default-model-status-not-configured.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.shows-quick-model-picker-grouped-by-model.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.stages-inbound-media-into-sandbox-workspace.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.targets-active-session-native-stop.e2e.test.ts delete mode 100644 src/auto-reply/reply.triggers.trigger-handling.test-harness.ts delete mode 100644 src/auto-reply/reply.ts delete mode 100644 src/auto-reply/reply/abort.test.ts delete mode 100644 src/auto-reply/reply/abort.ts delete mode 100644 src/auto-reply/reply/agent-runner-execution.ts delete mode 100644 src/auto-reply/reply/agent-runner-helpers.test.ts delete mode 100644 src/auto-reply/reply/agent-runner-helpers.ts delete mode 100644 src/auto-reply/reply/agent-runner-memory.ts delete mode 100644 src/auto-reply/reply/agent-runner-payloads.test.ts delete mode 100644 src/auto-reply/reply/agent-runner-payloads.ts delete mode 100644 src/auto-reply/reply/agent-runner-utils.test.ts delete mode 100644 src/auto-reply/reply/agent-runner-utils.ts delete mode 100644 src/auto-reply/reply/agent-runner.misc.runreplyagent.test.ts delete mode 100644 src/auto-reply/reply/agent-runner.runreplyagent.test.ts delete mode 100644 src/auto-reply/reply/agent-runner.ts delete mode 100644 src/auto-reply/reply/audio-tags.ts delete mode 100644 src/auto-reply/reply/bash-command.ts delete mode 100644 src/auto-reply/reply/block-reply-coalescer.ts delete mode 100644 src/auto-reply/reply/block-reply-pipeline.ts delete mode 100644 src/auto-reply/reply/block-streaming.ts delete mode 100644 src/auto-reply/reply/body.ts delete mode 100644 src/auto-reply/reply/command-gates.ts delete mode 100644 src/auto-reply/reply/commands-allowlist.ts delete mode 100644 src/auto-reply/reply/commands-approve.ts delete mode 100644 src/auto-reply/reply/commands-bash.ts delete mode 100644 src/auto-reply/reply/commands-compact.ts delete mode 100644 src/auto-reply/reply/commands-config.ts delete mode 100644 src/auto-reply/reply/commands-context-report.test.ts delete mode 100644 src/auto-reply/reply/commands-context-report.ts delete mode 100644 src/auto-reply/reply/commands-context.ts delete mode 100644 src/auto-reply/reply/commands-core.ts delete mode 100644 src/auto-reply/reply/commands-export-session.ts delete mode 100644 src/auto-reply/reply/commands-info.ts delete mode 100644 src/auto-reply/reply/commands-models.ts delete mode 100644 src/auto-reply/reply/commands-plugin.ts delete mode 100644 src/auto-reply/reply/commands-ptt.ts delete mode 100644 src/auto-reply/reply/commands-session-ttl.test.ts delete mode 100644 src/auto-reply/reply/commands-session.ts delete mode 100644 src/auto-reply/reply/commands-setunset-standard.ts delete mode 100644 src/auto-reply/reply/commands-setunset.test.ts delete mode 100644 src/auto-reply/reply/commands-setunset.ts delete mode 100644 src/auto-reply/reply/commands-slash-parse.ts delete mode 100644 src/auto-reply/reply/commands-spawn.test-harness.ts delete mode 100644 src/auto-reply/reply/commands-status.ts delete mode 100644 src/auto-reply/reply/commands-subagents-focus.test.ts delete mode 100644 src/auto-reply/reply/commands-subagents-spawn.test.ts delete mode 100644 src/auto-reply/reply/commands-subagents.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-agents.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-focus.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-help.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-info.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-kill.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-list.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-log.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-send.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-spawn.ts delete mode 100644 src/auto-reply/reply/commands-subagents/action-unfocus.ts delete mode 100644 src/auto-reply/reply/commands-subagents/shared.ts delete mode 100644 src/auto-reply/reply/commands-system-prompt.ts delete mode 100644 src/auto-reply/reply/commands-tts.ts delete mode 100644 src/auto-reply/reply/commands-types.ts delete mode 100644 src/auto-reply/reply/commands.test-harness.ts delete mode 100644 src/auto-reply/reply/commands.test.ts delete mode 100644 src/auto-reply/reply/commands.ts delete mode 100644 src/auto-reply/reply/config-commands.ts delete mode 100644 src/auto-reply/reply/config-value.ts delete mode 100644 src/auto-reply/reply/debug-commands.ts delete mode 100644 src/auto-reply/reply/directive-handling.auth.ts delete mode 100644 src/auto-reply/reply/directive-handling.fast-lane.ts delete mode 100644 src/auto-reply/reply/directive-handling.impl.ts delete mode 100644 src/auto-reply/reply/directive-handling.levels.ts delete mode 100644 src/auto-reply/reply/directive-handling.model-picker.ts delete mode 100644 src/auto-reply/reply/directive-handling.model.test.ts delete mode 100644 src/auto-reply/reply/directive-handling.model.ts delete mode 100644 src/auto-reply/reply/directive-handling.params.ts delete mode 100644 src/auto-reply/reply/directive-handling.parse.ts delete mode 100644 src/auto-reply/reply/directive-handling.persist.ts delete mode 100644 src/auto-reply/reply/directive-handling.queue-validation.ts delete mode 100644 src/auto-reply/reply/directive-handling.shared.ts delete mode 100644 src/auto-reply/reply/directive-handling.ts delete mode 100644 src/auto-reply/reply/directive-parsing.ts delete mode 100644 src/auto-reply/reply/directives.ts delete mode 100644 src/auto-reply/reply/dispatch-from-config.test.ts delete mode 100644 src/auto-reply/reply/dispatch-from-config.ts delete mode 100644 src/auto-reply/reply/dispatcher-registry.ts delete mode 100644 src/auto-reply/reply/elevated-unavailable.ts delete mode 100644 src/auto-reply/reply/exec.ts delete mode 100644 src/auto-reply/reply/exec/directive.ts delete mode 100644 src/auto-reply/reply/export-html/template.css delete mode 100644 src/auto-reply/reply/export-html/template.html delete mode 100644 src/auto-reply/reply/export-html/template.js delete mode 100644 src/auto-reply/reply/export-html/vendor/highlight.min.js delete mode 100644 src/auto-reply/reply/export-html/vendor/marked.min.js delete mode 100644 src/auto-reply/reply/followup-runner.test.ts delete mode 100644 src/auto-reply/reply/followup-runner.ts delete mode 100644 src/auto-reply/reply/get-reply-directives-apply.ts delete mode 100644 src/auto-reply/reply/get-reply-directives-utils.ts delete mode 100644 src/auto-reply/reply/get-reply-directives.ts delete mode 100644 src/auto-reply/reply/get-reply-inline-actions.skip-when-config-empty.test.ts delete mode 100644 src/auto-reply/reply/get-reply-inline-actions.ts delete mode 100644 src/auto-reply/reply/get-reply-run.media-only.test.ts delete mode 100644 src/auto-reply/reply/get-reply-run.ts delete mode 100644 src/auto-reply/reply/get-reply.ts delete mode 100644 src/auto-reply/reply/groups.ts delete mode 100644 src/auto-reply/reply/history.ts delete mode 100644 src/auto-reply/reply/inbound-context.ts delete mode 100644 src/auto-reply/reply/inbound-dedupe.ts delete mode 100644 src/auto-reply/reply/inbound-meta.test.ts delete mode 100644 src/auto-reply/reply/inbound-meta.ts delete mode 100644 src/auto-reply/reply/inbound-text.ts delete mode 100644 src/auto-reply/reply/line-directives.ts delete mode 100644 src/auto-reply/reply/memory-flush.test.ts delete mode 100644 src/auto-reply/reply/memory-flush.ts delete mode 100644 src/auto-reply/reply/mentions.ts delete mode 100644 src/auto-reply/reply/model-selection.test.ts delete mode 100644 src/auto-reply/reply/model-selection.ts delete mode 100644 src/auto-reply/reply/normalize-reply.ts delete mode 100644 src/auto-reply/reply/post-compaction-audit.test.ts delete mode 100644 src/auto-reply/reply/post-compaction-audit.ts delete mode 100644 src/auto-reply/reply/post-compaction-context.test.ts delete mode 100644 src/auto-reply/reply/post-compaction-context.ts delete mode 100644 src/auto-reply/reply/provider-dispatcher.ts delete mode 100644 src/auto-reply/reply/queue.ts delete mode 100644 src/auto-reply/reply/queue/cleanup.ts delete mode 100644 src/auto-reply/reply/queue/directive.ts delete mode 100644 src/auto-reply/reply/queue/drain.ts delete mode 100644 src/auto-reply/reply/queue/enqueue.ts delete mode 100644 src/auto-reply/reply/queue/normalize.ts delete mode 100644 src/auto-reply/reply/queue/settings.ts delete mode 100644 src/auto-reply/reply/queue/state.ts delete mode 100644 src/auto-reply/reply/queue/types.ts delete mode 100644 src/auto-reply/reply/reply-delivery.ts delete mode 100644 src/auto-reply/reply/reply-directives.ts delete mode 100644 src/auto-reply/reply/reply-dispatcher.ts delete mode 100644 src/auto-reply/reply/reply-elevated.ts delete mode 100644 src/auto-reply/reply/reply-flow.test.ts delete mode 100644 src/auto-reply/reply/reply-inline.ts delete mode 100644 src/auto-reply/reply/reply-payloads.test.ts delete mode 100644 src/auto-reply/reply/reply-payloads.ts delete mode 100644 src/auto-reply/reply/reply-plumbing.test.ts delete mode 100644 src/auto-reply/reply/reply-reference.ts delete mode 100644 src/auto-reply/reply/reply-state.test.ts delete mode 100644 src/auto-reply/reply/reply-tags.ts delete mode 100644 src/auto-reply/reply/reply-threading.ts delete mode 100644 src/auto-reply/reply/reply-utils.test.ts delete mode 100644 src/auto-reply/reply/response-prefix-template.ts delete mode 100644 src/auto-reply/reply/route-reply.test.ts delete mode 100644 src/auto-reply/reply/route-reply.ts delete mode 100644 src/auto-reply/reply/session-reset-model.ts delete mode 100644 src/auto-reply/reply/session-reset-prompt.ts delete mode 100644 src/auto-reply/reply/session-run-accounting.ts delete mode 100644 src/auto-reply/reply/session-updates.ts delete mode 100644 src/auto-reply/reply/session-usage.ts delete mode 100644 src/auto-reply/reply/session.test.ts delete mode 100644 src/auto-reply/reply/session.ts delete mode 100644 src/auto-reply/reply/stage-sandbox-media.ts delete mode 100644 src/auto-reply/reply/streaming-directives.ts delete mode 100644 src/auto-reply/reply/strip-inbound-meta.test.ts delete mode 100644 src/auto-reply/reply/subagents-utils.test.ts delete mode 100644 src/auto-reply/reply/subagents-utils.ts delete mode 100644 src/auto-reply/reply/test-ctx.ts delete mode 100644 src/auto-reply/reply/test-helpers.ts delete mode 100644 src/auto-reply/reply/typing-mode.ts delete mode 100644 src/auto-reply/reply/typing.ts delete mode 100644 src/auto-reply/reply/untrusted-context.ts delete mode 100644 src/auto-reply/send-policy.ts delete mode 100644 src/auto-reply/skill-commands.test.ts delete mode 100644 src/auto-reply/skill-commands.ts delete mode 100644 src/auto-reply/stage-sandbox-media.test-harness.ts delete mode 100644 src/auto-reply/status.test.ts delete mode 100644 src/auto-reply/status.ts delete mode 100644 src/auto-reply/templating.ts delete mode 100644 src/auto-reply/thinking.test.ts delete mode 100644 src/auto-reply/thinking.ts delete mode 100644 src/auto-reply/tokens.ts delete mode 100644 src/auto-reply/tool-meta.test.ts delete mode 100644 src/auto-reply/tool-meta.ts delete mode 100644 src/auto-reply/types.ts delete mode 100644 src/browser/bridge-auth-registry.ts delete mode 100644 src/browser/bridge-server.auth.test.ts delete mode 100644 src/browser/bridge-server.ts delete mode 100644 src/browser/browser-utils.test.ts delete mode 100644 src/browser/cdp.helpers.ts delete mode 100644 src/browser/cdp.test.ts delete mode 100644 src/browser/cdp.ts delete mode 100644 src/browser/chrome.default-browser.test.ts delete mode 100644 src/browser/chrome.executables.ts delete mode 100644 src/browser/chrome.profile-decoration.ts delete mode 100644 src/browser/chrome.test.ts delete mode 100644 src/browser/chrome.ts delete mode 100644 src/browser/client-actions-core.ts delete mode 100644 src/browser/client-actions-observe.ts delete mode 100644 src/browser/client-actions-state.ts delete mode 100644 src/browser/client-actions-types.ts delete mode 100644 src/browser/client-actions-url.ts delete mode 100644 src/browser/client-actions.ts delete mode 100644 src/browser/client-fetch.loopback-auth.test.ts delete mode 100644 src/browser/client-fetch.ts delete mode 100644 src/browser/client.test.ts delete mode 100644 src/browser/client.ts delete mode 100644 src/browser/config.test.ts delete mode 100644 src/browser/config.ts delete mode 100644 src/browser/constants.ts delete mode 100644 src/browser/control-auth.auto-token.test.ts delete mode 100644 src/browser/control-auth.test.ts delete mode 100644 src/browser/control-auth.ts delete mode 100644 src/browser/control-service.ts delete mode 100644 src/browser/csrf.ts delete mode 100644 src/browser/extension-relay-auth.test.ts delete mode 100644 src/browser/extension-relay-auth.ts delete mode 100644 src/browser/extension-relay.test.ts delete mode 100644 src/browser/extension-relay.ts delete mode 100644 src/browser/http-auth.ts delete mode 100644 src/browser/navigation-guard.test.ts delete mode 100644 src/browser/navigation-guard.ts delete mode 100644 src/browser/paths.test.ts delete mode 100644 src/browser/paths.ts delete mode 100644 src/browser/profiles-service.test.ts delete mode 100644 src/browser/profiles-service.ts delete mode 100644 src/browser/profiles.test.ts delete mode 100644 src/browser/profiles.ts delete mode 100644 src/browser/proxy-files.ts delete mode 100644 src/browser/pw-ai-module.ts delete mode 100644 src/browser/pw-ai-state.ts delete mode 100644 src/browser/pw-ai.test.ts delete mode 100644 src/browser/pw-ai.ts delete mode 100644 src/browser/pw-role-snapshot.test.ts delete mode 100644 src/browser/pw-role-snapshot.ts delete mode 100644 src/browser/pw-session.browserless.live.test.ts delete mode 100644 src/browser/pw-session.create-page.navigation-guard.test.ts delete mode 100644 src/browser/pw-session.get-page-for-targetid.extension-fallback.test.ts delete mode 100644 src/browser/pw-session.test.ts delete mode 100644 src/browser/pw-session.ts delete mode 100644 src/browser/pw-tools-core.activity.ts delete mode 100644 src/browser/pw-tools-core.clamps-timeoutms-scrollintoview.test.ts delete mode 100644 src/browser/pw-tools-core.downloads.ts delete mode 100644 src/browser/pw-tools-core.interactions.evaluate.abort.test.ts delete mode 100644 src/browser/pw-tools-core.interactions.ts delete mode 100644 src/browser/pw-tools-core.last-file-chooser-arm-wins.test.ts delete mode 100644 src/browser/pw-tools-core.responses.ts delete mode 100644 src/browser/pw-tools-core.screenshots-element-selector.test.ts delete mode 100644 src/browser/pw-tools-core.shared.ts delete mode 100644 src/browser/pw-tools-core.snapshot.navigate-guard.test.ts delete mode 100644 src/browser/pw-tools-core.snapshot.ts delete mode 100644 src/browser/pw-tools-core.state.ts delete mode 100644 src/browser/pw-tools-core.storage.ts delete mode 100644 src/browser/pw-tools-core.test-harness.ts delete mode 100644 src/browser/pw-tools-core.trace.ts delete mode 100644 src/browser/pw-tools-core.ts delete mode 100644 src/browser/pw-tools-core.waits-next-download-saves-it.test.ts delete mode 100644 src/browser/resolved-config-refresh.ts delete mode 100644 src/browser/routes/agent.act.shared.ts delete mode 100644 src/browser/routes/agent.act.ts delete mode 100644 src/browser/routes/agent.debug.ts delete mode 100644 src/browser/routes/agent.shared.test.ts delete mode 100644 src/browser/routes/agent.shared.ts delete mode 100644 src/browser/routes/agent.snapshot.ts delete mode 100644 src/browser/routes/agent.storage.test.ts delete mode 100644 src/browser/routes/agent.storage.ts delete mode 100644 src/browser/routes/agent.ts delete mode 100644 src/browser/routes/basic.ts delete mode 100644 src/browser/routes/dispatcher.abort.test.ts delete mode 100644 src/browser/routes/dispatcher.ts delete mode 100644 src/browser/routes/index.ts delete mode 100644 src/browser/routes/path-output.ts delete mode 100644 src/browser/routes/tabs.ts delete mode 100644 src/browser/routes/types.ts delete mode 100644 src/browser/routes/utils.ts delete mode 100644 src/browser/screenshot.e2e.test.ts delete mode 100644 src/browser/screenshot.ts delete mode 100644 src/browser/server-context.chrome-test-harness.ts delete mode 100644 src/browser/server-context.ensure-tab-available.prefers-last-target.test.ts delete mode 100644 src/browser/server-context.hot-reload-profiles.test.ts delete mode 100644 src/browser/server-context.remote-tab-ops.test.ts delete mode 100644 src/browser/server-context.ts delete mode 100644 src/browser/server-context.types.ts delete mode 100644 src/browser/server-lifecycle.test.ts delete mode 100644 src/browser/server-lifecycle.ts delete mode 100644 src/browser/server-middleware.ts delete mode 100644 src/browser/server.agent-contract-form-layout-act-commands.test.ts delete mode 100644 src/browser/server.agent-contract-snapshot-endpoints.test.ts delete mode 100644 src/browser/server.agent-contract.test-harness.ts delete mode 100644 src/browser/server.auth-token-gates-http.test.ts delete mode 100644 src/browser/server.control-server.test-harness.ts delete mode 100644 src/browser/server.evaluate-disabled-does-not-block-storage.test.ts delete mode 100644 src/browser/server.post-tabs-open-profile-unknown-returns-404.test.ts delete mode 100644 src/browser/server.ts delete mode 100644 src/browser/target-id.ts delete mode 100644 src/browser/test-port.ts delete mode 100644 src/browser/trash.ts delete mode 100644 src/canvas-host/a2ui.ts delete mode 100644 src/canvas-host/a2ui/index.html delete mode 100644 src/canvas-host/file-resolver.ts delete mode 100644 src/canvas-host/server.state-dir.test.ts delete mode 100644 src/canvas-host/server.test.ts delete mode 100644 src/canvas-host/server.ts delete mode 100644 src/channel-web.ts delete mode 100644 src/channels/account-summary.ts delete mode 100644 src/channels/ack-reactions.test.ts delete mode 100644 src/channels/ack-reactions.ts delete mode 100644 src/channels/allow-from.test.ts delete mode 100644 src/channels/allow-from.ts delete mode 100644 src/channels/allowlist-match.ts delete mode 100644 src/channels/allowlists/resolve-utils.test.ts delete mode 100644 src/channels/allowlists/resolve-utils.ts delete mode 100644 src/channels/channel-config.test.ts delete mode 100644 src/channels/channel-config.ts delete mode 100644 src/channels/channel-helpers.test.ts delete mode 100644 src/channels/channels-misc.test.ts delete mode 100644 src/channels/command-gating.test.ts delete mode 100644 src/channels/command-gating.ts delete mode 100644 src/channels/conversation-label.ts delete mode 100644 src/channels/dock.ts delete mode 100644 src/channels/draft-stream-loop.ts delete mode 100644 src/channels/location.test.ts delete mode 100644 src/channels/location.ts delete mode 100644 src/channels/logging.ts delete mode 100644 src/channels/mention-gating.test.ts delete mode 100644 src/channels/mention-gating.ts delete mode 100644 src/channels/model-overrides.test.ts delete mode 100644 src/channels/model-overrides.ts delete mode 100644 src/channels/plugins/account-action-gate.test.ts delete mode 100644 src/channels/plugins/account-action-gate.ts delete mode 100644 src/channels/plugins/account-helpers.test.ts delete mode 100644 src/channels/plugins/account-helpers.ts delete mode 100644 src/channels/plugins/actions/actions.test.ts delete mode 100644 src/channels/plugins/actions/discord.ts delete mode 100644 src/channels/plugins/actions/discord/handle-action.guild-admin.ts delete mode 100644 src/channels/plugins/actions/discord/handle-action.ts delete mode 100644 src/channels/plugins/actions/signal.ts delete mode 100644 src/channels/plugins/actions/telegram.ts delete mode 100644 src/channels/plugins/agent-tools/whatsapp-login.ts delete mode 100644 src/channels/plugins/allowlist-match.ts delete mode 100644 src/channels/plugins/bluebubbles-actions.ts delete mode 100644 src/channels/plugins/catalog.ts delete mode 100644 src/channels/plugins/channel-config.ts delete mode 100644 src/channels/plugins/config-helpers.ts delete mode 100644 src/channels/plugins/config-schema.ts delete mode 100644 src/channels/plugins/config-writes.ts delete mode 100644 src/channels/plugins/directory-config.ts delete mode 100644 src/channels/plugins/group-mentions.test.ts delete mode 100644 src/channels/plugins/group-mentions.ts delete mode 100644 src/channels/plugins/helpers.ts delete mode 100644 src/channels/plugins/index.ts delete mode 100644 src/channels/plugins/load.ts delete mode 100644 src/channels/plugins/media-limits.ts delete mode 100644 src/channels/plugins/message-action-names.ts delete mode 100644 src/channels/plugins/message-actions.security.test.ts delete mode 100644 src/channels/plugins/message-actions.ts delete mode 100644 src/channels/plugins/normalize/discord.ts delete mode 100644 src/channels/plugins/normalize/imessage.ts delete mode 100644 src/channels/plugins/normalize/signal.ts delete mode 100644 src/channels/plugins/normalize/slack.ts delete mode 100644 src/channels/plugins/normalize/telegram.ts delete mode 100644 src/channels/plugins/normalize/whatsapp.ts delete mode 100644 src/channels/plugins/onboarding-types.ts delete mode 100644 src/channels/plugins/onboarding/channel-access.ts delete mode 100644 src/channels/plugins/onboarding/discord.ts delete mode 100644 src/channels/plugins/onboarding/helpers.test.ts delete mode 100644 src/channels/plugins/onboarding/helpers.ts delete mode 100644 src/channels/plugins/onboarding/imessage.ts delete mode 100644 src/channels/plugins/onboarding/signal.ts delete mode 100644 src/channels/plugins/onboarding/slack.ts delete mode 100644 src/channels/plugins/onboarding/telegram.ts delete mode 100644 src/channels/plugins/onboarding/whatsapp.ts delete mode 100644 src/channels/plugins/outbound/discord.test.ts delete mode 100644 src/channels/plugins/outbound/discord.ts delete mode 100644 src/channels/plugins/outbound/imessage.test.ts delete mode 100644 src/channels/plugins/outbound/imessage.ts delete mode 100644 src/channels/plugins/outbound/load.ts delete mode 100644 src/channels/plugins/outbound/signal.ts delete mode 100644 src/channels/plugins/outbound/slack.test.ts delete mode 100644 src/channels/plugins/outbound/slack.ts delete mode 100644 src/channels/plugins/outbound/telegram.ts delete mode 100644 src/channels/plugins/outbound/whatsapp.ts delete mode 100644 src/channels/plugins/pairing-message.ts delete mode 100644 src/channels/plugins/pairing.ts delete mode 100644 src/channels/plugins/plugins-channel.test.ts delete mode 100644 src/channels/plugins/plugins-core.test.ts delete mode 100644 src/channels/plugins/setup-helpers.ts delete mode 100644 src/channels/plugins/slack.actions.ts delete mode 100644 src/channels/plugins/status-issues/bluebubbles.ts delete mode 100644 src/channels/plugins/status-issues/discord.ts delete mode 100644 src/channels/plugins/status-issues/shared.ts delete mode 100644 src/channels/plugins/status-issues/telegram.ts delete mode 100644 src/channels/plugins/status-issues/whatsapp.ts delete mode 100644 src/channels/plugins/status.ts delete mode 100644 src/channels/plugins/types.adapters.ts delete mode 100644 src/channels/plugins/types.core.ts delete mode 100644 src/channels/plugins/types.plugin.ts delete mode 100644 src/channels/plugins/types.ts delete mode 100644 src/channels/plugins/whatsapp-heartbeat.test.ts delete mode 100644 src/channels/plugins/whatsapp-heartbeat.ts delete mode 100644 src/channels/registry.ts delete mode 100644 src/channels/reply-prefix.ts delete mode 100644 src/channels/sender-identity.ts delete mode 100644 src/channels/sender-label.ts delete mode 100644 src/channels/session.ts delete mode 100644 src/channels/status-reactions.test.ts delete mode 100644 src/channels/status-reactions.ts delete mode 100644 src/channels/targets.ts delete mode 100644 src/channels/telegram/allow-from.test.ts delete mode 100644 src/channels/telegram/allow-from.ts delete mode 100644 src/channels/telegram/api.test.ts delete mode 100644 src/channels/telegram/api.ts delete mode 100644 src/channels/typing.ts delete mode 100644 src/channels/web/index.ts delete mode 100644 src/cli/acp-cli.option-collisions.test.ts delete mode 100644 src/cli/acp-cli.ts delete mode 100644 src/cli/argv.test.ts create mode 100644 src/cli/bootstrap-external.ts create mode 100644 src/cli/bootstrap.ts delete mode 100644 src/cli/browser-cli-actions-input.ts delete mode 100644 src/cli/browser-cli-actions-input/register.element.ts delete mode 100644 src/cli/browser-cli-actions-input/register.files-downloads.ts delete mode 100644 src/cli/browser-cli-actions-input/register.form-wait-eval.ts delete mode 100644 src/cli/browser-cli-actions-input/register.navigation.ts delete mode 100644 src/cli/browser-cli-actions-input/register.ts delete mode 100644 src/cli/browser-cli-actions-input/shared.ts delete mode 100644 src/cli/browser-cli-actions-observe.ts delete mode 100644 src/cli/browser-cli-debug.ts delete mode 100644 src/cli/browser-cli-examples.ts delete mode 100644 src/cli/browser-cli-extension.test.ts delete mode 100644 src/cli/browser-cli-extension.ts delete mode 100644 src/cli/browser-cli-inspect.test.ts delete mode 100644 src/cli/browser-cli-inspect.ts delete mode 100644 src/cli/browser-cli-manage.ts delete mode 100644 src/cli/browser-cli-resize.ts delete mode 100644 src/cli/browser-cli-shared.ts delete mode 100644 src/cli/browser-cli-state.cookies-storage.ts delete mode 100644 src/cli/browser-cli-state.option-collisions.test.ts delete mode 100644 src/cli/browser-cli-state.ts delete mode 100644 src/cli/browser-cli.test.ts delete mode 100644 src/cli/browser-cli.ts delete mode 100644 src/cli/channel-auth.ts delete mode 100644 src/cli/channel-options.ts delete mode 100644 src/cli/channels-cli.ts delete mode 100644 src/cli/clawbot-cli.ts delete mode 100644 src/cli/cli-utils.test.ts delete mode 100644 src/cli/command-format.ts delete mode 100644 src/cli/command-options.test.ts delete mode 100644 src/cli/command-options.ts delete mode 100644 src/cli/completion-cli.ts delete mode 100644 src/cli/config-cli.test.ts delete mode 100644 src/cli/config-cli.ts delete mode 100644 src/cli/cron-cli.test.ts delete mode 100644 src/cli/cron-cli.ts delete mode 100644 src/cli/cron-cli/register.cron-add.ts delete mode 100644 src/cli/cron-cli/register.cron-edit.ts delete mode 100644 src/cli/cron-cli/register.cron-simple.ts delete mode 100644 src/cli/cron-cli/register.ts delete mode 100644 src/cli/cron-cli/shared.test.ts delete mode 100644 src/cli/cron-cli/shared.ts delete mode 100644 src/cli/daemon-cli-compat.test.ts delete mode 100644 src/cli/daemon-cli-compat.ts delete mode 100644 src/cli/daemon-cli.coverage.e2e.test.ts delete mode 100644 src/cli/daemon-cli.ts delete mode 100644 src/cli/daemon-cli/install.ts delete mode 100644 src/cli/daemon-cli/lifecycle-core.test.ts delete mode 100644 src/cli/daemon-cli/lifecycle-core.ts delete mode 100644 src/cli/daemon-cli/lifecycle.test.ts delete mode 100644 src/cli/daemon-cli/lifecycle.ts delete mode 100644 src/cli/daemon-cli/probe.ts delete mode 100644 src/cli/daemon-cli/register-service-commands.test.ts delete mode 100644 src/cli/daemon-cli/register-service-commands.ts delete mode 100644 src/cli/daemon-cli/register.ts delete mode 100644 src/cli/daemon-cli/response.ts delete mode 100644 src/cli/daemon-cli/restart-health.ts delete mode 100644 src/cli/daemon-cli/runners.ts delete mode 100644 src/cli/daemon-cli/shared.test.ts delete mode 100644 src/cli/daemon-cli/shared.ts delete mode 100644 src/cli/daemon-cli/status.gather.ts delete mode 100644 src/cli/daemon-cli/status.print.ts delete mode 100644 src/cli/daemon-cli/status.ts delete mode 100644 src/cli/daemon-cli/types.ts delete mode 100644 src/cli/deps.test.ts delete mode 100644 src/cli/deps.ts delete mode 100644 src/cli/devices-cli.test.ts delete mode 100644 src/cli/devices-cli.ts delete mode 100644 src/cli/directory-cli.ts delete mode 100644 src/cli/dns-cli.ts delete mode 100644 src/cli/docs-cli.ts delete mode 100644 src/cli/exec-approvals-cli.test.ts delete mode 100644 src/cli/exec-approvals-cli.ts delete mode 100644 src/cli/gateway-cli.coverage.e2e.test.ts delete mode 100644 src/cli/gateway-cli.ts delete mode 100644 src/cli/gateway-cli/call.ts delete mode 100644 src/cli/gateway-cli/dev.ts delete mode 100644 src/cli/gateway-cli/discover.ts delete mode 100644 src/cli/gateway-cli/register.option-collisions.test.ts delete mode 100644 src/cli/gateway-cli/register.ts delete mode 100644 src/cli/gateway-cli/run-loop.test.ts delete mode 100644 src/cli/gateway-cli/run-loop.ts delete mode 100644 src/cli/gateway-cli/run.option-collisions.test.ts delete mode 100644 src/cli/gateway-cli/run.ts delete mode 100644 src/cli/gateway-cli/shared.ts delete mode 100644 src/cli/gateway-rpc.ts delete mode 100644 src/cli/gateway.sigterm.e2e.test.ts delete mode 100644 src/cli/help-format.ts delete mode 100644 src/cli/hooks-cli.test.ts delete mode 100644 src/cli/hooks-cli.ts delete mode 100644 src/cli/logs-cli.test.ts delete mode 100644 src/cli/logs-cli.ts delete mode 100644 src/cli/memory-cli.test.ts delete mode 100644 src/cli/memory-cli.ts delete mode 100644 src/cli/models-cli.test.ts delete mode 100644 src/cli/models-cli.ts delete mode 100644 src/cli/node-cli.ts delete mode 100644 src/cli/node-cli/daemon.ts delete mode 100644 src/cli/node-cli/register.ts delete mode 100644 src/cli/nodes-camera.test.ts delete mode 100644 src/cli/nodes-camera.ts delete mode 100644 src/cli/nodes-canvas.ts delete mode 100644 src/cli/nodes-cli.coverage.test.ts delete mode 100644 src/cli/nodes-cli.ts delete mode 100644 src/cli/nodes-cli/a2ui-jsonl.ts delete mode 100644 src/cli/nodes-cli/cli-utils.ts delete mode 100644 src/cli/nodes-cli/format.ts delete mode 100644 src/cli/nodes-cli/pairing-render.ts delete mode 100644 src/cli/nodes-cli/register.camera.ts delete mode 100644 src/cli/nodes-cli/register.canvas.ts delete mode 100644 src/cli/nodes-cli/register.invoke.nodes-run-approval-timeout.test.ts delete mode 100644 src/cli/nodes-cli/register.invoke.ts delete mode 100644 src/cli/nodes-cli/register.location.ts delete mode 100644 src/cli/nodes-cli/register.notify.ts delete mode 100644 src/cli/nodes-cli/register.pairing.ts delete mode 100644 src/cli/nodes-cli/register.push.ts delete mode 100644 src/cli/nodes-cli/register.screen.ts delete mode 100644 src/cli/nodes-cli/register.status.ts delete mode 100644 src/cli/nodes-cli/register.ts delete mode 100644 src/cli/nodes-cli/rpc.ts delete mode 100644 src/cli/nodes-cli/types.ts delete mode 100644 src/cli/nodes-media-utils.test.ts delete mode 100644 src/cli/nodes-media-utils.ts delete mode 100644 src/cli/nodes-run.ts delete mode 100644 src/cli/nodes-screen.ts delete mode 100644 src/cli/outbound-send-deps.ts delete mode 100644 src/cli/outbound-send-mapping.test.ts delete mode 100644 src/cli/outbound-send-mapping.ts delete mode 100644 src/cli/pairing-cli.test.ts delete mode 100644 src/cli/pairing-cli.ts delete mode 100644 src/cli/parse-bytes.ts delete mode 100644 src/cli/parse-duration.ts delete mode 100644 src/cli/parse-timeout.ts delete mode 100644 src/cli/plugin-registry.ts delete mode 100644 src/cli/plugins-cli.ts delete mode 100644 src/cli/profile.test.ts delete mode 100644 src/cli/program.force.test.ts delete mode 100644 src/cli/program.nodes-basic.e2e.test.ts delete mode 100644 src/cli/program.nodes-media.e2e.test.ts delete mode 100644 src/cli/program.smoke.e2e.test.ts delete mode 100644 src/cli/program.test-mocks.ts delete mode 100644 src/cli/program/action-reparse.test.ts delete mode 100644 src/cli/program/build-program.test.ts delete mode 100644 src/cli/program/build-program.version-alias.test.ts delete mode 100644 src/cli/program/command-registry.test.ts delete mode 100644 src/cli/program/command-tree.test.ts delete mode 100644 src/cli/program/config-guard.test.ts delete mode 100644 src/cli/program/config-guard.ts delete mode 100644 src/cli/program/context.test.ts delete mode 100644 src/cli/program/help.test.ts delete mode 100644 src/cli/program/helpers.test.ts delete mode 100644 src/cli/program/message/helpers.test.ts delete mode 100644 src/cli/program/message/helpers.ts delete mode 100644 src/cli/program/message/register.broadcast.ts delete mode 100644 src/cli/program/message/register.discord-admin.ts delete mode 100644 src/cli/program/message/register.emoji-sticker.ts delete mode 100644 src/cli/program/message/register.permissions-search.ts delete mode 100644 src/cli/program/message/register.pins.ts delete mode 100644 src/cli/program/message/register.poll.ts delete mode 100644 src/cli/program/message/register.reactions.ts delete mode 100644 src/cli/program/message/register.read-edit-delete.ts delete mode 100644 src/cli/program/message/register.send.ts delete mode 100644 src/cli/program/message/register.thread.ts delete mode 100644 src/cli/program/preaction.test.ts delete mode 100644 src/cli/program/program-context.test.ts delete mode 100644 src/cli/program/register.agent.test.ts delete mode 100644 src/cli/program/register.agent.ts create mode 100644 src/cli/program/register.bootstrap.ts delete mode 100644 src/cli/program/register.configure.test.ts delete mode 100644 src/cli/program/register.configure.ts delete mode 100644 src/cli/program/register.maintenance.test.ts delete mode 100644 src/cli/program/register.maintenance.ts delete mode 100644 src/cli/program/register.message.test.ts delete mode 100644 src/cli/program/register.message.ts delete mode 100644 src/cli/program/register.onboard.test.ts delete mode 100644 src/cli/program/register.onboard.ts delete mode 100644 src/cli/program/register.setup.test.ts delete mode 100644 src/cli/program/register.setup.ts delete mode 100644 src/cli/program/register.status-health-sessions.test.ts delete mode 100644 src/cli/program/register.status-health-sessions.ts delete mode 100644 src/cli/program/register.subclis.e2e.test.ts delete mode 100644 src/cli/program/register.subclis.ts delete mode 100644 src/cli/program/routes.test.ts delete mode 100644 src/cli/program/routes.ts delete mode 100644 src/cli/progress.test.ts delete mode 100644 src/cli/progress.ts delete mode 100644 src/cli/prompt.test.ts delete mode 100644 src/cli/prompt.ts delete mode 100644 src/cli/qr-cli.test.ts delete mode 100644 src/cli/qr-cli.ts delete mode 100644 src/cli/requirements-test-fixtures.ts delete mode 100644 src/cli/route.ts delete mode 100644 src/cli/run-main.exit.test.ts delete mode 100644 src/cli/run-main.test.ts delete mode 100644 src/cli/sandbox-cli.ts delete mode 100644 src/cli/security-cli.ts delete mode 100644 src/cli/shared/parse-port.ts delete mode 100644 src/cli/skills-cli.e2e.test.ts delete mode 100644 src/cli/skills-cli.format.ts delete mode 100644 src/cli/skills-cli.test.ts delete mode 100644 src/cli/skills-cli.ts delete mode 100644 src/cli/system-cli.test.ts delete mode 100644 src/cli/system-cli.ts delete mode 100644 src/cli/test-runtime-capture.ts delete mode 100644 src/cli/tui-cli.ts delete mode 100644 src/cli/update-cli.option-collisions.test.ts delete mode 100644 src/cli/update-cli.test.ts delete mode 100644 src/cli/update-cli.ts delete mode 100644 src/cli/update-cli/progress.ts delete mode 100644 src/cli/update-cli/restart-helper.test.ts delete mode 100644 src/cli/update-cli/restart-helper.ts delete mode 100644 src/cli/update-cli/shared.command-runner.test.ts delete mode 100644 src/cli/update-cli/shared.ts delete mode 100644 src/cli/update-cli/status.ts delete mode 100644 src/cli/update-cli/suppress-deprecations.ts delete mode 100644 src/cli/update-cli/update-command.ts delete mode 100644 src/cli/update-cli/wizard.ts delete mode 100644 src/cli/wait.ts delete mode 100644 src/cli/webhooks-cli.ts delete mode 100644 src/commands/agent-via-gateway.e2e.test.ts delete mode 100644 src/commands/agent-via-gateway.ts delete mode 100644 src/commands/agent.delivery.e2e.test.ts delete mode 100644 src/commands/agent.e2e.test.ts delete mode 100644 src/commands/agent.ts delete mode 100644 src/commands/agent/delivery.ts delete mode 100644 src/commands/agent/run-context.ts delete mode 100644 src/commands/agent/session-store.ts delete mode 100644 src/commands/agent/session.test.ts delete mode 100644 src/commands/agent/session.ts delete mode 100644 src/commands/agent/types.ts delete mode 100644 src/commands/agents.add.e2e.test.ts delete mode 100644 src/commands/agents.bindings.ts delete mode 100644 src/commands/agents.command-shared.ts delete mode 100644 src/commands/agents.commands.add.ts delete mode 100644 src/commands/agents.commands.delete.ts delete mode 100644 src/commands/agents.commands.identity.ts delete mode 100644 src/commands/agents.commands.list.ts delete mode 100644 src/commands/agents.config.ts delete mode 100644 src/commands/agents.e2e.test.ts delete mode 100644 src/commands/agents.identity.e2e.test.ts delete mode 100644 src/commands/agents.providers.ts delete mode 100644 src/commands/agents.ts delete mode 100644 src/commands/auth-choice-legacy.ts delete mode 100644 src/commands/auth-choice-options.e2e.test.ts delete mode 100644 src/commands/auth-choice-options.ts delete mode 100644 src/commands/auth-choice-prompt.ts delete mode 100644 src/commands/auth-choice.api-key.ts delete mode 100644 src/commands/auth-choice.apply-helpers.ts delete mode 100644 src/commands/auth-choice.apply.anthropic.ts delete mode 100644 src/commands/auth-choice.apply.api-providers.ts delete mode 100644 src/commands/auth-choice.apply.byteplus.ts delete mode 100644 src/commands/auth-choice.apply.copilot-proxy.ts delete mode 100644 src/commands/auth-choice.apply.github-copilot.ts delete mode 100644 src/commands/auth-choice.apply.google-antigravity.ts delete mode 100644 src/commands/auth-choice.apply.google-gemini-cli.ts delete mode 100644 src/commands/auth-choice.apply.huggingface.test.ts delete mode 100644 src/commands/auth-choice.apply.huggingface.ts delete mode 100644 src/commands/auth-choice.apply.minimax.ts delete mode 100644 src/commands/auth-choice.apply.oauth.ts delete mode 100644 src/commands/auth-choice.apply.openai.ts delete mode 100644 src/commands/auth-choice.apply.openrouter.ts delete mode 100644 src/commands/auth-choice.apply.plugin-provider.ts delete mode 100644 src/commands/auth-choice.apply.qwen-portal.ts delete mode 100644 src/commands/auth-choice.apply.ts delete mode 100644 src/commands/auth-choice.apply.vllm.ts delete mode 100644 src/commands/auth-choice.apply.volcengine.ts delete mode 100644 src/commands/auth-choice.apply.xai.ts delete mode 100644 src/commands/auth-choice.default-model.ts delete mode 100644 src/commands/auth-choice.e2e.test.ts delete mode 100644 src/commands/auth-choice.model-check.ts delete mode 100644 src/commands/auth-choice.moonshot.e2e.test.ts delete mode 100644 src/commands/auth-choice.preferred-provider.ts delete mode 100644 src/commands/auth-choice.ts delete mode 100644 src/commands/auth-token.ts delete mode 100644 src/commands/channel-test-helpers.ts delete mode 100644 src/commands/channels.add.test.ts delete mode 100644 src/commands/channels.adds-non-default-telegram-account.e2e.test.ts delete mode 100644 src/commands/channels.mock-harness.ts delete mode 100644 src/commands/channels.surfaces-signal-runtime-errors-channels-status-output.e2e.test.ts delete mode 100644 src/commands/channels.ts delete mode 100644 src/commands/channels/add-mutators.ts delete mode 100644 src/commands/channels/add.ts delete mode 100644 src/commands/channels/capabilities.e2e.test.ts delete mode 100644 src/commands/channels/capabilities.ts delete mode 100644 src/commands/channels/list.ts delete mode 100644 src/commands/channels/logs.ts delete mode 100644 src/commands/channels/remove.ts delete mode 100644 src/commands/channels/resolve.ts delete mode 100644 src/commands/channels/shared.ts delete mode 100644 src/commands/channels/status.ts delete mode 100644 src/commands/chutes-oauth.e2e.test.ts delete mode 100644 src/commands/chutes-oauth.ts delete mode 100644 src/commands/cleanup-plan.ts delete mode 100644 src/commands/cleanup-utils.test.ts delete mode 100644 src/commands/cleanup-utils.ts delete mode 100644 src/commands/config-validation.ts delete mode 100644 src/commands/configure.channels.ts delete mode 100644 src/commands/configure.commands.ts delete mode 100644 src/commands/configure.daemon.ts delete mode 100644 src/commands/configure.gateway-auth.e2e.test.ts delete mode 100644 src/commands/configure.gateway-auth.ts delete mode 100644 src/commands/configure.gateway.e2e.test.ts delete mode 100644 src/commands/configure.gateway.ts delete mode 100644 src/commands/configure.shared.ts delete mode 100644 src/commands/configure.ts delete mode 100644 src/commands/configure.wizard.e2e.test.ts delete mode 100644 src/commands/configure.wizard.ts delete mode 100644 src/commands/daemon-install-helpers.e2e.test.ts delete mode 100644 src/commands/daemon-install-helpers.ts delete mode 100644 src/commands/daemon-install-runtime-warning.test.ts delete mode 100644 src/commands/daemon-install-runtime-warning.ts delete mode 100644 src/commands/daemon-runtime.ts delete mode 100644 src/commands/dashboard.e2e.test.ts delete mode 100644 src/commands/dashboard.test.ts delete mode 100644 src/commands/dashboard.ts delete mode 100644 src/commands/docs.ts delete mode 100644 src/commands/doctor-auth.deprecated-cli-profiles.e2e.test.ts delete mode 100644 src/commands/doctor-auth.ts delete mode 100644 src/commands/doctor-completion.ts delete mode 100644 src/commands/doctor-config-flow.e2e.test.ts delete mode 100644 src/commands/doctor-config-flow.include-warning.test.ts delete mode 100644 src/commands/doctor-config-flow.ts delete mode 100644 src/commands/doctor-format.ts delete mode 100644 src/commands/doctor-gateway-daemon-flow.ts delete mode 100644 src/commands/doctor-gateway-health.ts delete mode 100644 src/commands/doctor-gateway-services.test.ts delete mode 100644 src/commands/doctor-gateway-services.ts delete mode 100644 src/commands/doctor-install.ts delete mode 100644 src/commands/doctor-legacy-config.e2e.test.ts delete mode 100644 src/commands/doctor-legacy-config.ts delete mode 100644 src/commands/doctor-memory-search.test.ts delete mode 100644 src/commands/doctor-memory-search.ts delete mode 100644 src/commands/doctor-platform-notes.launchctl-env-overrides.e2e.test.ts delete mode 100644 src/commands/doctor-platform-notes.ts delete mode 100644 src/commands/doctor-prompter.ts delete mode 100644 src/commands/doctor-sandbox.ts delete mode 100644 src/commands/doctor-security.e2e.test.ts delete mode 100644 src/commands/doctor-security.ts delete mode 100644 src/commands/doctor-session-locks.test.ts delete mode 100644 src/commands/doctor-session-locks.ts delete mode 100644 src/commands/doctor-state-integrity.test.ts delete mode 100644 src/commands/doctor-state-integrity.ts delete mode 100644 src/commands/doctor-state-migrations.e2e.test.ts delete mode 100644 src/commands/doctor-state-migrations.ts delete mode 100644 src/commands/doctor-ui.ts delete mode 100644 src/commands/doctor-update.ts delete mode 100644 src/commands/doctor-workspace-status.ts delete mode 100644 src/commands/doctor-workspace.ts delete mode 100644 src/commands/doctor.e2e-harness.ts delete mode 100644 src/commands/doctor.migrates-routing-allowfrom-channels-whatsapp-allowfrom.e2e.test.ts delete mode 100644 src/commands/doctor.migrates-slack-discord-dm-policy-aliases.e2e.test.ts delete mode 100644 src/commands/doctor.runs-legacy-state-migrations-yes-mode-without.e2e.test.ts delete mode 100644 src/commands/doctor.ts delete mode 100644 src/commands/doctor.warns-per-agent-sandbox-docker-browser-prune.e2e.test.ts delete mode 100644 src/commands/doctor.warns-state-directory-is-missing.e2e.test.ts delete mode 100644 src/commands/gateway-presence.ts delete mode 100644 src/commands/gateway-status.e2e.test.ts delete mode 100644 src/commands/gateway-status.ts delete mode 100644 src/commands/gateway-status/helpers.ts delete mode 100644 src/commands/google-gemini-model-default.ts delete mode 100644 src/commands/health-format.ts delete mode 100644 src/commands/health.command.coverage.e2e.test.ts delete mode 100644 src/commands/health.e2e.test.ts delete mode 100644 src/commands/health.snapshot.e2e.test.ts delete mode 100644 src/commands/health.ts delete mode 100644 src/commands/message-format.ts delete mode 100644 src/commands/message.e2e.test.ts delete mode 100644 src/commands/message.ts delete mode 100644 src/commands/model-allowlist.ts delete mode 100644 src/commands/model-default.ts delete mode 100644 src/commands/model-picker.e2e.test.ts delete mode 100644 src/commands/model-picker.ts delete mode 100644 src/commands/models.auth.provider-resolution.test.ts delete mode 100644 src/commands/models.list.auth-sync.test.ts delete mode 100644 src/commands/models.list.test.ts delete mode 100644 src/commands/models.set.e2e.test.ts delete mode 100644 src/commands/models.ts delete mode 100644 src/commands/models/aliases.ts delete mode 100644 src/commands/models/auth-order.ts delete mode 100644 src/commands/models/auth.ts delete mode 100644 src/commands/models/fallbacks-shared.ts delete mode 100644 src/commands/models/fallbacks.ts delete mode 100644 src/commands/models/image-fallbacks.ts delete mode 100644 src/commands/models/list.auth-overview.ts delete mode 100644 src/commands/models/list.configured.ts delete mode 100644 src/commands/models/list.errors.ts delete mode 100644 src/commands/models/list.format.ts delete mode 100644 src/commands/models/list.list-command.forward-compat.test.ts delete mode 100644 src/commands/models/list.list-command.ts delete mode 100644 src/commands/models/list.probe.ts delete mode 100644 src/commands/models/list.registry.ts delete mode 100644 src/commands/models/list.status-command.ts delete mode 100644 src/commands/models/list.status.e2e.test.ts delete mode 100644 src/commands/models/list.table.ts delete mode 100644 src/commands/models/list.ts delete mode 100644 src/commands/models/list.types.ts delete mode 100644 src/commands/models/scan.ts delete mode 100644 src/commands/models/set-image.ts delete mode 100644 src/commands/models/set.ts delete mode 100644 src/commands/models/shared.test.ts delete mode 100644 src/commands/models/shared.ts delete mode 100644 src/commands/node-daemon-install-helpers.ts delete mode 100644 src/commands/node-daemon-runtime.ts delete mode 100644 src/commands/oauth-env.ts delete mode 100644 src/commands/oauth-flow.ts delete mode 100644 src/commands/onboard-auth.config-core.ts delete mode 100644 src/commands/onboard-auth.config-gateways.ts delete mode 100644 src/commands/onboard-auth.config-litellm.ts delete mode 100644 src/commands/onboard-auth.config-minimax.ts delete mode 100644 src/commands/onboard-auth.config-opencode.ts delete mode 100644 src/commands/onboard-auth.config-shared.ts delete mode 100644 src/commands/onboard-auth.credentials.ts delete mode 100644 src/commands/onboard-auth.e2e.test.ts delete mode 100644 src/commands/onboard-auth.models.ts delete mode 100644 src/commands/onboard-auth.ts delete mode 100644 src/commands/onboard-channels.e2e.test.ts delete mode 100644 src/commands/onboard-channels.ts delete mode 100644 src/commands/onboard-config.ts delete mode 100644 src/commands/onboard-custom.e2e.test.ts delete mode 100644 src/commands/onboard-custom.ts delete mode 100644 src/commands/onboard-helpers.e2e.test.ts delete mode 100644 src/commands/onboard-helpers.ts delete mode 100644 src/commands/onboard-hooks.e2e.test.ts delete mode 100644 src/commands/onboard-hooks.ts delete mode 100644 src/commands/onboard-interactive.test.ts delete mode 100644 src/commands/onboard-interactive.ts delete mode 100644 src/commands/onboard-non-interactive.gateway.e2e.test.ts delete mode 100644 src/commands/onboard-non-interactive.provider-auth.e2e.test.ts delete mode 100644 src/commands/onboard-non-interactive.test-helpers.ts delete mode 100644 src/commands/onboard-non-interactive.ts delete mode 100644 src/commands/onboard-non-interactive/api-keys.ts delete mode 100644 src/commands/onboard-non-interactive/local.ts delete mode 100644 src/commands/onboard-non-interactive/local/auth-choice-inference.ts delete mode 100644 src/commands/onboard-non-interactive/local/auth-choice.ts delete mode 100644 src/commands/onboard-non-interactive/local/daemon-install.ts delete mode 100644 src/commands/onboard-non-interactive/local/gateway-config.ts delete mode 100644 src/commands/onboard-non-interactive/local/output.ts delete mode 100644 src/commands/onboard-non-interactive/local/skills-config.ts delete mode 100644 src/commands/onboard-non-interactive/local/workspace.ts delete mode 100644 src/commands/onboard-non-interactive/remote.ts delete mode 100644 src/commands/onboard-provider-auth-flags.ts delete mode 100644 src/commands/onboard-remote.ts delete mode 100644 src/commands/onboard-skills.e2e.test.ts delete mode 100644 src/commands/onboard-skills.ts delete mode 100644 src/commands/onboard-types.ts delete mode 100644 src/commands/onboard.ts delete mode 100644 src/commands/onboarding/__tests__/test-utils.ts delete mode 100644 src/commands/onboarding/plugin-install.e2e.test.ts delete mode 100644 src/commands/onboarding/plugin-install.ts delete mode 100644 src/commands/onboarding/registry.ts delete mode 100644 src/commands/onboarding/types.ts delete mode 100644 src/commands/openai-codex-model-default.ts delete mode 100644 src/commands/openai-codex-oauth.test.ts delete mode 100644 src/commands/openai-codex-oauth.ts delete mode 100644 src/commands/openai-model-default.e2e.test.ts delete mode 100644 src/commands/openai-model-default.ts delete mode 100644 src/commands/opencode-zen-model-default.ts delete mode 100644 src/commands/provider-auth-helpers.ts delete mode 100644 src/commands/reset.ts delete mode 100644 src/commands/sandbox-display.ts delete mode 100644 src/commands/sandbox-explain.e2e.test.ts delete mode 100644 src/commands/sandbox-explain.ts delete mode 100644 src/commands/sandbox-formatters.e2e.test.ts delete mode 100644 src/commands/sandbox-formatters.ts delete mode 100644 src/commands/sandbox.e2e.test.ts delete mode 100644 src/commands/sandbox.ts delete mode 100644 src/commands/sessions.e2e.test.ts delete mode 100644 src/commands/sessions.model-resolution.test.ts delete mode 100644 src/commands/sessions.test-helpers.ts delete mode 100644 src/commands/sessions.ts delete mode 100644 src/commands/setup.ts delete mode 100644 src/commands/signal-install.test.ts delete mode 100644 src/commands/signal-install.ts delete mode 100644 src/commands/status-all.ts delete mode 100644 src/commands/status-all/agents.ts delete mode 100644 src/commands/status-all/channels.mattermost-token-summary.test.ts delete mode 100644 src/commands/status-all/channels.ts delete mode 100644 src/commands/status-all/diagnosis.ts delete mode 100644 src/commands/status-all/format.ts delete mode 100644 src/commands/status-all/gateway.ts delete mode 100644 src/commands/status-all/report-lines.ts delete mode 100644 src/commands/status.agent-local.ts delete mode 100644 src/commands/status.command.ts delete mode 100644 src/commands/status.daemon.ts delete mode 100644 src/commands/status.e2e.test.ts delete mode 100644 src/commands/status.format.ts delete mode 100644 src/commands/status.gateway-probe.ts delete mode 100644 src/commands/status.link-channel.ts delete mode 100644 src/commands/status.scan.ts delete mode 100644 src/commands/status.summary.redaction.test.ts delete mode 100644 src/commands/status.summary.ts delete mode 100644 src/commands/status.ts delete mode 100644 src/commands/status.types.ts delete mode 100644 src/commands/status.update.test.ts delete mode 100644 src/commands/status.update.ts delete mode 100644 src/commands/systemd-linger.ts delete mode 100644 src/commands/test-runtime-config-helpers.ts delete mode 100644 src/commands/test-wizard-helpers.ts delete mode 100644 src/commands/uninstall.ts delete mode 100644 src/commands/vllm-setup.ts delete mode 100644 src/commands/zai-endpoint-detect.e2e.test.ts delete mode 100644 src/commands/zai-endpoint-detect.ts delete mode 100644 src/compat/legacy-names.ts delete mode 100644 src/config/agent-dirs.test.ts delete mode 100644 src/config/agent-dirs.ts delete mode 100644 src/config/agent-limits.ts delete mode 100644 src/config/backup-rotation.ts delete mode 100644 src/config/cache-utils.ts delete mode 100644 src/config/channel-capabilities.test.ts delete mode 100644 src/config/channel-capabilities.ts delete mode 100644 src/config/commands.test.ts delete mode 100644 src/config/commands.ts delete mode 100644 src/config/config-misc.test.ts delete mode 100644 src/config/config-paths.ts delete mode 100644 src/config/config.agent-concurrency-defaults.test.ts delete mode 100644 src/config/config.backup-rotation.test.ts delete mode 100644 src/config/config.compaction-settings.test.ts delete mode 100644 src/config/config.discord-presence.test.ts delete mode 100644 src/config/config.discord.test.ts delete mode 100644 src/config/config.dm-policy-alias.test.ts delete mode 100644 src/config/config.env-vars.test.ts delete mode 100644 src/config/config.hooks-module-paths.test.ts delete mode 100644 src/config/config.identity-avatar.test.ts delete mode 100644 src/config/config.identity-defaults.test.ts delete mode 100644 src/config/config.irc.test.ts delete mode 100644 src/config/config.legacy-config-detection.accepts-imessage-dmpolicy.e2e.test.ts delete mode 100644 src/config/config.legacy-config-detection.rejects-routing-allowfrom.e2e.test.ts delete mode 100644 src/config/config.msteams.test.ts delete mode 100644 src/config/config.multi-agent-agentdir-validation.test.ts delete mode 100644 src/config/config.nix-integration-u3-u5-u9.e2e.test.ts delete mode 100644 src/config/config.plugin-validation.test.ts delete mode 100644 src/config/config.pruning-defaults.test.ts delete mode 100644 src/config/config.sandbox-docker.test.ts delete mode 100644 src/config/config.schema-regressions.test.ts delete mode 100644 src/config/config.skills-entries-config.test.ts delete mode 100644 src/config/config.talk-api-key-fallback.test.ts delete mode 100644 src/config/config.telegram-custom-commands.test.ts delete mode 100644 src/config/config.tools-alsoAllow.test.ts delete mode 100644 src/config/config.ts delete mode 100644 src/config/defaults.ts delete mode 100644 src/config/discord-preview-streaming.ts delete mode 100644 src/config/env-preserve-io.test.ts delete mode 100644 src/config/env-preserve.test.ts delete mode 100644 src/config/env-preserve.ts delete mode 100644 src/config/env-substitution.test.ts delete mode 100644 src/config/env-substitution.ts delete mode 100644 src/config/env-vars.ts delete mode 100644 src/config/group-policy.ts delete mode 100644 src/config/home-env.test-harness.ts delete mode 100644 src/config/includes-scan.ts delete mode 100644 src/config/includes.test.ts delete mode 100644 src/config/includes.ts delete mode 100644 src/config/io.compat.test.ts delete mode 100644 src/config/io.ts delete mode 100644 src/config/io.write-config.test.ts delete mode 100644 src/config/legacy-migrate.test.ts delete mode 100644 src/config/legacy-migrate.ts delete mode 100644 src/config/legacy.migrations.part-1.ts delete mode 100644 src/config/legacy.migrations.part-2.ts delete mode 100644 src/config/legacy.migrations.part-3.ts delete mode 100644 src/config/legacy.migrations.ts delete mode 100644 src/config/legacy.rules.ts delete mode 100644 src/config/legacy.shared.test.ts delete mode 100644 src/config/legacy.shared.ts delete mode 100644 src/config/legacy.ts delete mode 100644 src/config/logging.ts delete mode 100644 src/config/markdown-tables.ts delete mode 100644 src/config/merge-config.ts delete mode 100644 src/config/merge-patch.proto-pollution.test.ts delete mode 100644 src/config/merge-patch.test.ts delete mode 100644 src/config/merge-patch.ts delete mode 100644 src/config/model-alias-defaults.test.ts delete mode 100644 src/config/normalize-paths.test.ts delete mode 100644 src/config/normalize-paths.ts delete mode 100644 src/config/paths.test.ts delete mode 100644 src/config/plugin-auto-enable.test.ts delete mode 100644 src/config/plugin-auto-enable.ts delete mode 100644 src/config/plugins-allowlist.ts delete mode 100644 src/config/plugins-runtime-boundary.test.ts delete mode 100644 src/config/port-defaults.ts delete mode 100644 src/config/prototype-keys.ts delete mode 100644 src/config/redact-snapshot.test.ts delete mode 100644 src/config/redact-snapshot.ts delete mode 100644 src/config/runtime-overrides.test.ts delete mode 100644 src/config/runtime-overrides.ts delete mode 100644 src/config/schema.help.ts delete mode 100644 src/config/schema.hints.test.ts delete mode 100644 src/config/schema.hints.ts delete mode 100644 src/config/schema.irc.ts delete mode 100644 src/config/schema.labels.ts delete mode 100644 src/config/schema.test.ts delete mode 100644 src/config/schema.ts delete mode 100644 src/config/sessions.cache.test.ts delete mode 100644 src/config/sessions.test.ts delete mode 100644 src/config/sessions.ts delete mode 100644 src/config/sessions/cache-fields.test.ts delete mode 100644 src/config/sessions/delivery-info.test.ts delete mode 100644 src/config/sessions/delivery-info.ts delete mode 100644 src/config/sessions/group.ts delete mode 100644 src/config/sessions/main-session.ts delete mode 100644 src/config/sessions/metadata.ts delete mode 100644 src/config/sessions/paths.ts delete mode 100644 src/config/sessions/reset.ts delete mode 100644 src/config/sessions/session-file.ts delete mode 100644 src/config/sessions/session-key.ts delete mode 100644 src/config/sessions/sessions.test.ts delete mode 100644 src/config/sessions/store.pruning.e2e.test.ts delete mode 100644 src/config/sessions/store.pruning.test.ts delete mode 100644 src/config/sessions/store.ts delete mode 100644 src/config/sessions/transcript.ts delete mode 100644 src/config/sessions/types.ts delete mode 100644 src/config/slack-http-config.test.ts delete mode 100644 src/config/slack-token-validation.test.ts delete mode 100644 src/config/talk.ts delete mode 100644 src/config/telegram-custom-commands.ts delete mode 100644 src/config/telegram-webhook-secret.test.ts delete mode 100644 src/config/test-helpers.ts delete mode 100644 src/config/types.googlechat.ts delete mode 100644 src/config/types.ts delete mode 100644 src/config/validation.ts delete mode 100644 src/config/version.ts delete mode 100644 src/config/zod-schema.agent-defaults.ts delete mode 100644 src/config/zod-schema.agent-model.ts delete mode 100644 src/config/zod-schema.agent-runtime.ts delete mode 100644 src/config/zod-schema.agents.ts delete mode 100644 src/config/zod-schema.allowdeny.ts delete mode 100644 src/config/zod-schema.approvals.ts delete mode 100644 src/config/zod-schema.channels.ts delete mode 100644 src/config/zod-schema.core.ts delete mode 100644 src/config/zod-schema.hooks.ts delete mode 100644 src/config/zod-schema.installs.ts delete mode 100644 src/config/zod-schema.providers-core.ts delete mode 100644 src/config/zod-schema.providers-whatsapp.ts delete mode 100644 src/config/zod-schema.providers.ts delete mode 100644 src/config/zod-schema.sensitive.ts delete mode 100644 src/config/zod-schema.session.ts delete mode 100644 src/config/zod-schema.ts delete mode 100644 src/cron/cron-protocol-conformance.test.ts delete mode 100644 src/cron/delivery.test.ts delete mode 100644 src/cron/delivery.ts delete mode 100644 src/cron/isolated-agent.delivers-response-has-heartbeat-ok-but-includes.test.ts delete mode 100644 src/cron/isolated-agent.delivery-target-thread-session.test.ts delete mode 100644 src/cron/isolated-agent.mocks.ts delete mode 100644 src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.e2e.test.ts delete mode 100644 src/cron/isolated-agent.test-harness.ts delete mode 100644 src/cron/isolated-agent.test-setup.ts delete mode 100644 src/cron/isolated-agent.ts delete mode 100644 src/cron/isolated-agent.uses-last-non-empty-agent-text-as.e2e.test.ts delete mode 100644 src/cron/isolated-agent/delivery-target.test.ts delete mode 100644 src/cron/isolated-agent/delivery-target.ts delete mode 100644 src/cron/isolated-agent/helpers.ts delete mode 100644 src/cron/isolated-agent/run.skill-filter.test.ts delete mode 100644 src/cron/isolated-agent/run.ts delete mode 100644 src/cron/isolated-agent/session.test.ts delete mode 100644 src/cron/isolated-agent/session.ts delete mode 100644 src/cron/isolated-agent/skills-snapshot.ts delete mode 100644 src/cron/isolated-agent/subagent-followup.ts delete mode 100644 src/cron/legacy-delivery.ts delete mode 100644 src/cron/normalize.test.ts delete mode 100644 src/cron/normalize.ts delete mode 100644 src/cron/parse.ts delete mode 100644 src/cron/payload-migration.ts delete mode 100644 src/cron/run-log.test.ts delete mode 100644 src/cron/run-log.ts delete mode 100644 src/cron/schedule.test.ts delete mode 100644 src/cron/schedule.ts delete mode 100644 src/cron/service.delivery-plan.test.ts delete mode 100644 src/cron/service.every-jobs-fire.test.ts delete mode 100644 src/cron/service.get-job.test.ts delete mode 100644 src/cron/service.issue-13992-regression.test.ts delete mode 100644 src/cron/service.issue-16156-list-skips-cron.test.ts delete mode 100644 src/cron/service.issue-17852-daily-skip.test.ts delete mode 100644 src/cron/service.issue-regressions.test.ts delete mode 100644 src/cron/service.jobs.test.ts delete mode 100644 src/cron/service.jobs.top-of-hour-stagger.test.ts delete mode 100644 src/cron/service.persists-delivered-status.test.ts delete mode 100644 src/cron/service.prevents-duplicate-timers.test.ts delete mode 100644 src/cron/service.read-ops-nonblocking.test.ts delete mode 100644 src/cron/service.rearm-timer-when-running.test.ts delete mode 100644 src/cron/service.restart-catchup.test.ts delete mode 100644 src/cron/service.runs-one-shot-main-job-disables-it.test.ts delete mode 100644 src/cron/service.skips-main-jobs-empty-systemevent-text.test.ts delete mode 100644 src/cron/service.store-migration.test.ts delete mode 100644 src/cron/service.store.migration.test.ts delete mode 100644 src/cron/service.test-harness.ts delete mode 100644 src/cron/service.ts delete mode 100644 src/cron/service/jobs.schedule-error-isolation.test.ts delete mode 100644 src/cron/service/jobs.ts delete mode 100644 src/cron/service/locked.ts delete mode 100644 src/cron/service/normalize.ts delete mode 100644 src/cron/service/ops.ts delete mode 100644 src/cron/service/state.ts delete mode 100644 src/cron/service/store.ts delete mode 100644 src/cron/service/timer.ts delete mode 100644 src/cron/session-reaper.test.ts delete mode 100644 src/cron/session-reaper.ts delete mode 100644 src/cron/stagger.test.ts delete mode 100644 src/cron/stagger.ts delete mode 100644 src/cron/store.test.ts delete mode 100644 src/cron/store.ts delete mode 100644 src/cron/types.ts delete mode 100644 src/cron/validate-timestamp.ts delete mode 100644 src/cron/webhook-url.ts delete mode 100644 src/daemon/arg-split.ts delete mode 100644 src/daemon/cmd-argv.test.ts delete mode 100644 src/daemon/cmd-argv.ts delete mode 100644 src/daemon/cmd-set.ts delete mode 100644 src/daemon/constants.test.ts delete mode 100644 src/daemon/constants.ts delete mode 100644 src/daemon/diagnostics.ts delete mode 100644 src/daemon/exec-file.ts delete mode 100644 src/daemon/inspect.ts delete mode 100644 src/daemon/launchd-plist.ts delete mode 100644 src/daemon/launchd.test.ts delete mode 100644 src/daemon/launchd.ts delete mode 100644 src/daemon/node-service.ts delete mode 100644 src/daemon/output.ts delete mode 100644 src/daemon/paths.ts delete mode 100644 src/daemon/program-args.test.ts delete mode 100644 src/daemon/program-args.ts delete mode 100644 src/daemon/runtime-format.ts delete mode 100644 src/daemon/runtime-parse.ts delete mode 100644 src/daemon/runtime-paths.test.ts delete mode 100644 src/daemon/runtime-paths.ts delete mode 100644 src/daemon/schtasks-exec.ts delete mode 100644 src/daemon/schtasks.install.test.ts delete mode 100644 src/daemon/schtasks.test.ts delete mode 100644 src/daemon/schtasks.ts delete mode 100644 src/daemon/service-audit.test.ts delete mode 100644 src/daemon/service-audit.ts delete mode 100644 src/daemon/service-env.test.ts delete mode 100644 src/daemon/service-env.ts delete mode 100644 src/daemon/service-runtime.ts delete mode 100644 src/daemon/service-types.ts delete mode 100644 src/daemon/service.ts delete mode 100644 src/daemon/systemd-hints.ts delete mode 100644 src/daemon/systemd-linger.ts delete mode 100644 src/daemon/systemd-unit.test.ts delete mode 100644 src/daemon/systemd-unit.ts delete mode 100644 src/daemon/systemd.test.ts delete mode 100644 src/daemon/systemd.ts delete mode 100644 src/discord/accounts.ts delete mode 100644 src/discord/api.test.ts delete mode 100644 src/discord/api.ts delete mode 100644 src/discord/audit.test.ts delete mode 100644 src/discord/audit.ts delete mode 100644 src/discord/chunk.test.ts delete mode 100644 src/discord/chunk.ts delete mode 100644 src/discord/client.ts delete mode 100644 src/discord/components-registry.ts delete mode 100644 src/discord/components.test.ts delete mode 100644 src/discord/components.ts delete mode 100644 src/discord/directory-live.ts delete mode 100644 src/discord/draft-chunking.ts delete mode 100644 src/discord/draft-stream.ts delete mode 100644 src/discord/gateway-logging.test.ts delete mode 100644 src/discord/gateway-logging.ts delete mode 100644 src/discord/guilds.ts delete mode 100644 src/discord/index.ts delete mode 100644 src/discord/monitor.gateway.test.ts delete mode 100644 src/discord/monitor.gateway.ts delete mode 100644 src/discord/monitor.test.ts delete mode 100644 src/discord/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts delete mode 100644 src/discord/monitor.tool-result.sends-status-replies-responseprefix.test.ts delete mode 100644 src/discord/monitor.tool-result.test-harness.ts delete mode 100644 src/discord/monitor.ts delete mode 100644 src/discord/monitor/agent-components.ts delete mode 100644 src/discord/monitor/allow-list.ts delete mode 100644 src/discord/monitor/commands.test.ts delete mode 100644 src/discord/monitor/commands.ts delete mode 100644 src/discord/monitor/exec-approvals.test.ts delete mode 100644 src/discord/monitor/exec-approvals.ts delete mode 100644 src/discord/monitor/format.ts delete mode 100644 src/discord/monitor/gateway-plugin.ts delete mode 100644 src/discord/monitor/gateway-registry.ts delete mode 100644 src/discord/monitor/listeners.ts delete mode 100644 src/discord/monitor/message-handler.inbound-contract.test.ts delete mode 100644 src/discord/monitor/message-handler.preflight.test.ts delete mode 100644 src/discord/monitor/message-handler.preflight.ts delete mode 100644 src/discord/monitor/message-handler.preflight.types.ts delete mode 100644 src/discord/monitor/message-handler.process.test.ts delete mode 100644 src/discord/monitor/message-handler.process.ts delete mode 100644 src/discord/monitor/message-handler.test-harness.ts delete mode 100644 src/discord/monitor/message-handler.ts delete mode 100644 src/discord/monitor/message-utils.test.ts delete mode 100644 src/discord/monitor/message-utils.ts delete mode 100644 src/discord/monitor/model-picker-preferences.ts delete mode 100644 src/discord/monitor/model-picker.test.ts delete mode 100644 src/discord/monitor/model-picker.ts delete mode 100644 src/discord/monitor/monitor.test.ts delete mode 100644 src/discord/monitor/native-command.model-picker.test.ts delete mode 100644 src/discord/monitor/native-command.ts delete mode 100644 src/discord/monitor/presence-cache.ts delete mode 100644 src/discord/monitor/presence.ts delete mode 100644 src/discord/monitor/provider.allowlist.test.ts delete mode 100644 src/discord/monitor/provider.allowlist.ts delete mode 100644 src/discord/monitor/provider.lifecycle.test.ts delete mode 100644 src/discord/monitor/provider.lifecycle.ts delete mode 100644 src/discord/monitor/provider.proxy.test.ts delete mode 100644 src/discord/monitor/provider.rest-proxy.test.ts delete mode 100644 src/discord/monitor/provider.skill-dedupe.test.ts delete mode 100644 src/discord/monitor/provider.test.ts delete mode 100644 src/discord/monitor/provider.ts delete mode 100644 src/discord/monitor/reply-context.ts delete mode 100644 src/discord/monitor/reply-delivery.test.ts delete mode 100644 src/discord/monitor/reply-delivery.ts delete mode 100644 src/discord/monitor/rest-fetch.ts delete mode 100644 src/discord/monitor/sender-identity.ts delete mode 100644 src/discord/monitor/system-events.ts delete mode 100644 src/discord/monitor/thread-bindings.discord-api.test.ts delete mode 100644 src/discord/monitor/thread-bindings.discord-api.ts delete mode 100644 src/discord/monitor/thread-bindings.lifecycle.ts delete mode 100644 src/discord/monitor/thread-bindings.manager.ts delete mode 100644 src/discord/monitor/thread-bindings.messages.ts delete mode 100644 src/discord/monitor/thread-bindings.shared-state.test.ts delete mode 100644 src/discord/monitor/thread-bindings.state.ts delete mode 100644 src/discord/monitor/thread-bindings.ts delete mode 100644 src/discord/monitor/thread-bindings.ttl.test.ts delete mode 100644 src/discord/monitor/thread-bindings.types.ts delete mode 100644 src/discord/monitor/threading.auto-thread.test.ts delete mode 100644 src/discord/monitor/threading.ts delete mode 100644 src/discord/monitor/typing.ts delete mode 100644 src/discord/pluralkit.test.ts delete mode 100644 src/discord/pluralkit.ts delete mode 100644 src/discord/probe.intents.test.ts delete mode 100644 src/discord/probe.ts delete mode 100644 src/discord/resolve-channels.test.ts delete mode 100644 src/discord/resolve-channels.ts delete mode 100644 src/discord/resolve-users.test.ts delete mode 100644 src/discord/resolve-users.ts delete mode 100644 src/discord/send.channels.ts delete mode 100644 src/discord/send.components.test.ts delete mode 100644 src/discord/send.components.ts delete mode 100644 src/discord/send.creates-thread.test.ts delete mode 100644 src/discord/send.emojis-stickers.ts delete mode 100644 src/discord/send.guild.ts delete mode 100644 src/discord/send.messages.ts delete mode 100644 src/discord/send.outbound.ts delete mode 100644 src/discord/send.permissions.authz.test.ts delete mode 100644 src/discord/send.permissions.ts delete mode 100644 src/discord/send.reactions.ts delete mode 100644 src/discord/send.sends-basic-channel-messages.test.ts delete mode 100644 src/discord/send.shared.ts delete mode 100644 src/discord/send.test-harness.ts delete mode 100644 src/discord/send.ts delete mode 100644 src/discord/send.types.ts delete mode 100644 src/discord/send.webhook-activity.test.ts delete mode 100644 src/discord/targets.test.ts delete mode 100644 src/discord/targets.ts delete mode 100644 src/discord/token.test.ts delete mode 100644 src/discord/token.ts delete mode 100644 src/discord/ui.ts delete mode 100644 src/discord/voice-message.ts delete mode 100644 src/discord/voice/command.ts delete mode 100644 src/discord/voice/manager.ts delete mode 100644 src/docker-image-digests.test.ts delete mode 100644 src/docker-setup.test.ts delete mode 100644 src/dockerfile.test.ts delete mode 100644 src/docs/slash-commands-doc.test.ts delete mode 100644 src/extensionAPI.ts delete mode 100644 src/gateway/agent-event-assistant-text.ts delete mode 100644 src/gateway/agent-prompt.e2e.test.ts delete mode 100644 src/gateway/agent-prompt.ts delete mode 100644 src/gateway/assistant-identity.test.ts delete mode 100644 src/gateway/assistant-identity.ts delete mode 100644 src/gateway/auth-rate-limit.test.ts delete mode 100644 src/gateway/auth-rate-limit.ts delete mode 100644 src/gateway/auth.test.ts delete mode 100644 src/gateway/auth.ts delete mode 100644 src/gateway/boot.test.ts delete mode 100644 src/gateway/boot.ts delete mode 100644 src/gateway/call.test.ts delete mode 100644 src/gateway/call.ts delete mode 100644 src/gateway/canvas-capability.ts delete mode 100644 src/gateway/channel-health-monitor.test.ts delete mode 100644 src/gateway/channel-health-monitor.ts delete mode 100644 src/gateway/chat-abort.test.ts delete mode 100644 src/gateway/chat-abort.ts delete mode 100644 src/gateway/chat-attachments.test.ts delete mode 100644 src/gateway/chat-attachments.ts delete mode 100644 src/gateway/chat-sanitize.test.ts delete mode 100644 src/gateway/chat-sanitize.ts delete mode 100644 src/gateway/client.e2e.test.ts delete mode 100644 src/gateway/client.test.ts delete mode 100644 src/gateway/client.ts delete mode 100644 src/gateway/config-reload.test.ts delete mode 100644 src/gateway/config-reload.ts delete mode 100644 src/gateway/control-plane-audit.ts delete mode 100644 src/gateway/control-plane-rate-limit.ts delete mode 100644 src/gateway/control-ui-csp.test.ts delete mode 100644 src/gateway/control-ui-csp.ts delete mode 100644 src/gateway/control-ui-shared.ts delete mode 100644 src/gateway/control-ui.http.test.ts delete mode 100644 src/gateway/control-ui.ts delete mode 100644 src/gateway/exec-approval-manager.ts delete mode 100644 src/gateway/gateway-cli-backend.live.test.ts delete mode 100644 src/gateway/gateway-config-prompts.shared.ts delete mode 100644 src/gateway/gateway-misc.test.ts delete mode 100644 src/gateway/gateway-models.profiles.live.test.ts delete mode 100644 src/gateway/gateway.e2e.test.ts delete mode 100644 src/gateway/hooks-mapping.test.ts delete mode 100644 src/gateway/hooks-mapping.ts delete mode 100644 src/gateway/hooks.test.ts delete mode 100644 src/gateway/hooks.ts delete mode 100644 src/gateway/http-auth-helpers.test.ts delete mode 100644 src/gateway/http-auth-helpers.ts delete mode 100644 src/gateway/http-common.ts delete mode 100644 src/gateway/http-endpoint-helpers.test.ts delete mode 100644 src/gateway/http-endpoint-helpers.ts delete mode 100644 src/gateway/http-utils.ts delete mode 100644 src/gateway/live-image-probe.ts delete mode 100644 src/gateway/method-scopes.test.ts delete mode 100644 src/gateway/method-scopes.ts delete mode 100644 src/gateway/net.test.ts delete mode 100644 src/gateway/net.ts delete mode 100644 src/gateway/node-command-policy.ts delete mode 100644 src/gateway/node-invoke-sanitize.ts delete mode 100644 src/gateway/node-invoke-system-run-approval.test.ts delete mode 100644 src/gateway/node-invoke-system-run-approval.ts delete mode 100644 src/gateway/node-registry.ts delete mode 100644 src/gateway/open-responses.schema.ts delete mode 100644 src/gateway/openai-http.e2e.test.ts delete mode 100644 src/gateway/openai-http.ts delete mode 100644 src/gateway/openresponses-http.e2e.test.ts delete mode 100644 src/gateway/openresponses-http.ts delete mode 100644 src/gateway/openresponses-parity.e2e.test.ts delete mode 100644 src/gateway/origin-check.test.ts delete mode 100644 src/gateway/origin-check.ts delete mode 100644 src/gateway/probe-auth.ts delete mode 100644 src/gateway/probe.test.ts delete mode 100644 src/gateway/probe.ts delete mode 100644 src/gateway/protocol/cron-validators.test.ts delete mode 100644 src/gateway/protocol/index.test.ts delete mode 100644 src/gateway/protocol/index.ts delete mode 100644 src/gateway/protocol/schema.ts delete mode 100644 src/gateway/protocol/schema/agent.ts delete mode 100644 src/gateway/protocol/schema/agents-models-skills.ts delete mode 100644 src/gateway/protocol/schema/channels.ts delete mode 100644 src/gateway/protocol/schema/config.ts delete mode 100644 src/gateway/protocol/schema/cron.ts delete mode 100644 src/gateway/protocol/schema/devices.ts delete mode 100644 src/gateway/protocol/schema/error-codes.ts delete mode 100644 src/gateway/protocol/schema/exec-approvals.ts delete mode 100644 src/gateway/protocol/schema/frames.ts delete mode 100644 src/gateway/protocol/schema/logs-chat.ts delete mode 100644 src/gateway/protocol/schema/nodes.ts delete mode 100644 src/gateway/protocol/schema/primitives.ts delete mode 100644 src/gateway/protocol/schema/protocol-schemas.ts delete mode 100644 src/gateway/protocol/schema/push.ts delete mode 100644 src/gateway/protocol/schema/sessions.ts delete mode 100644 src/gateway/protocol/schema/snapshot.ts delete mode 100644 src/gateway/protocol/schema/types.ts delete mode 100644 src/gateway/protocol/schema/wizard.ts delete mode 100644 src/gateway/role-policy.test.ts delete mode 100644 src/gateway/role-policy.ts delete mode 100644 src/gateway/server-broadcast.ts delete mode 100644 src/gateway/server-browser.ts delete mode 100644 src/gateway/server-channels.test.ts delete mode 100644 src/gateway/server-channels.ts delete mode 100644 src/gateway/server-chat.agent-events.test.ts delete mode 100644 src/gateway/server-chat.ts delete mode 100644 src/gateway/server-close.ts delete mode 100644 src/gateway/server-constants.ts delete mode 100644 src/gateway/server-cron.test.ts delete mode 100644 src/gateway/server-cron.ts delete mode 100644 src/gateway/server-discovery-runtime.ts delete mode 100644 src/gateway/server-discovery.test.ts delete mode 100644 src/gateway/server-discovery.ts delete mode 100644 src/gateway/server-http.hooks-request-timeout.test.ts delete mode 100644 src/gateway/server-http.ts delete mode 100644 src/gateway/server-lanes.ts delete mode 100644 src/gateway/server-maintenance.ts delete mode 100644 src/gateway/server-methods-list.ts delete mode 100644 src/gateway/server-methods.control-plane-rate-limit.test.ts delete mode 100644 src/gateway/server-methods.ts delete mode 100644 src/gateway/server-methods/AGENTS.md delete mode 120000 src/gateway/server-methods/CLAUDE.md delete mode 100644 src/gateway/server-methods/agent-job.ts delete mode 100644 src/gateway/server-methods/agent-timestamp.ts delete mode 100644 src/gateway/server-methods/agent.test.ts delete mode 100644 src/gateway/server-methods/agent.ts delete mode 100644 src/gateway/server-methods/agents-mutate.test.ts delete mode 100644 src/gateway/server-methods/agents.ts delete mode 100644 src/gateway/server-methods/attachment-normalize.ts delete mode 100644 src/gateway/server-methods/base-hash.ts delete mode 100644 src/gateway/server-methods/browser.ts delete mode 100644 src/gateway/server-methods/channels.ts delete mode 100644 src/gateway/server-methods/chat.abort-persistence.test.ts delete mode 100644 src/gateway/server-methods/chat.inject.parentid.e2e.test.ts delete mode 100644 src/gateway/server-methods/chat.ts delete mode 100644 src/gateway/server-methods/config.ts delete mode 100644 src/gateway/server-methods/connect.ts delete mode 100644 src/gateway/server-methods/cron.ts delete mode 100644 src/gateway/server-methods/devices.ts delete mode 100644 src/gateway/server-methods/exec-approval.ts delete mode 100644 src/gateway/server-methods/exec-approvals.ts delete mode 100644 src/gateway/server-methods/health.ts delete mode 100644 src/gateway/server-methods/logs.ts delete mode 100644 src/gateway/server-methods/models.ts delete mode 100644 src/gateway/server-methods/nodes.handlers.invoke-result.ts delete mode 100644 src/gateway/server-methods/nodes.helpers.ts delete mode 100644 src/gateway/server-methods/nodes.invoke-wake.test.ts delete mode 100644 src/gateway/server-methods/nodes.ts delete mode 100644 src/gateway/server-methods/push.test.ts delete mode 100644 src/gateway/server-methods/push.ts delete mode 100644 src/gateway/server-methods/restart-request.ts delete mode 100644 src/gateway/server-methods/send.test.ts delete mode 100644 src/gateway/server-methods/send.ts delete mode 100644 src/gateway/server-methods/server-methods.test.ts delete mode 100644 src/gateway/server-methods/sessions.ts delete mode 100644 src/gateway/server-methods/skills.ts delete mode 100644 src/gateway/server-methods/skills.update.normalizes-api-key.test.ts delete mode 100644 src/gateway/server-methods/system.ts delete mode 100644 src/gateway/server-methods/talk.ts delete mode 100644 src/gateway/server-methods/tts.ts delete mode 100644 src/gateway/server-methods/types.ts delete mode 100644 src/gateway/server-methods/update.test.ts delete mode 100644 src/gateway/server-methods/update.ts delete mode 100644 src/gateway/server-methods/usage.sessions-usage.test.ts delete mode 100644 src/gateway/server-methods/usage.test.ts delete mode 100644 src/gateway/server-methods/usage.ts delete mode 100644 src/gateway/server-methods/validation.ts delete mode 100644 src/gateway/server-methods/voicewake.ts delete mode 100644 src/gateway/server-methods/web.ts delete mode 100644 src/gateway/server-methods/wizard.ts delete mode 100644 src/gateway/server-mobile-nodes.ts delete mode 100644 src/gateway/server-model-catalog.ts delete mode 100644 src/gateway/server-node-events-types.ts delete mode 100644 src/gateway/server-node-events.test.ts delete mode 100644 src/gateway/server-node-events.ts delete mode 100644 src/gateway/server-node-subscriptions.ts delete mode 100644 src/gateway/server-plugins.test.ts delete mode 100644 src/gateway/server-plugins.ts delete mode 100644 src/gateway/server-reload-handlers.ts delete mode 100644 src/gateway/server-restart-deferral.test.ts delete mode 100644 src/gateway/server-restart-sentinel.ts delete mode 100644 src/gateway/server-runtime-config.test.ts delete mode 100644 src/gateway/server-runtime-config.ts delete mode 100644 src/gateway/server-runtime-state.ts delete mode 100644 src/gateway/server-session-key.ts delete mode 100644 src/gateway/server-shared.ts delete mode 100644 src/gateway/server-startup-log.ts delete mode 100644 src/gateway/server-startup-memory.test.ts delete mode 100644 src/gateway/server-startup-memory.ts delete mode 100644 src/gateway/server-startup.ts delete mode 100644 src/gateway/server-tailscale.ts delete mode 100644 src/gateway/server-utils.ts delete mode 100644 src/gateway/server-web-app.test.ts delete mode 100644 src/gateway/server-web-app.ts delete mode 100644 src/gateway/server-wizard-sessions.ts delete mode 100644 src/gateway/server-ws-runtime.ts delete mode 100644 src/gateway/server.agent.gateway-server-agent-a.e2e.test.ts delete mode 100644 src/gateway/server.agent.gateway-server-agent-b.e2e.test.ts delete mode 100644 src/gateway/server.agent.gateway-server-agent.mocks.ts delete mode 100644 src/gateway/server.auth.e2e.test.ts delete mode 100644 src/gateway/server.canvas-auth.e2e.test.ts delete mode 100644 src/gateway/server.channels.e2e.test.ts delete mode 100644 src/gateway/server.chat.gateway-server-chat-b.e2e.test.ts delete mode 100644 src/gateway/server.chat.gateway-server-chat.e2e.test.ts delete mode 100644 src/gateway/server.config-apply.e2e.test.ts delete mode 100644 src/gateway/server.config-patch.e2e.test.ts delete mode 100644 src/gateway/server.cron.e2e.test.ts delete mode 100644 src/gateway/server.e2e-registry-helpers.ts delete mode 100644 src/gateway/server.e2e-ws-harness.ts delete mode 100644 src/gateway/server.health.e2e.test.ts delete mode 100644 src/gateway/server.hooks.e2e.test.ts delete mode 100644 src/gateway/server.impl.ts delete mode 100644 src/gateway/server.ios-client-id.e2e.test.ts delete mode 100644 src/gateway/server.models-voicewake-misc.e2e.test.ts delete mode 100644 src/gateway/server.node-invoke-approval-bypass.e2e.test.ts delete mode 100644 src/gateway/server.plugin-http-auth.test.ts delete mode 100644 src/gateway/server.reload.e2e.test.ts delete mode 100644 src/gateway/server.roles-allowlist-update.e2e.test.ts delete mode 100644 src/gateway/server.sessions-send.e2e.test.ts delete mode 100644 src/gateway/server.sessions.gateway-server-sessions-a.e2e.test.ts delete mode 100644 src/gateway/server.skills-status.e2e.test.ts delete mode 100644 src/gateway/server.talk-config.e2e.test.ts delete mode 100644 src/gateway/server.ts delete mode 100644 src/gateway/server/__tests__/test-utils.ts delete mode 100644 src/gateway/server/close-reason.ts delete mode 100644 src/gateway/server/health-state.ts delete mode 100644 src/gateway/server/hooks.ts delete mode 100644 src/gateway/server/http-listen.ts delete mode 100644 src/gateway/server/plugins-http.test.ts delete mode 100644 src/gateway/server/plugins-http.ts delete mode 100644 src/gateway/server/presence-events.test.ts delete mode 100644 src/gateway/server/presence-events.ts delete mode 100644 src/gateway/server/tls.ts delete mode 100644 src/gateway/server/ws-connection.ts delete mode 100644 src/gateway/server/ws-connection/auth-messages.ts delete mode 100644 src/gateway/server/ws-connection/connect-policy.test.ts delete mode 100644 src/gateway/server/ws-connection/connect-policy.ts delete mode 100644 src/gateway/server/ws-connection/message-handler.ts delete mode 100644 src/gateway/server/ws-types.ts delete mode 100644 src/gateway/session-preview.test-helpers.ts delete mode 100644 src/gateway/session-utils.fs.test.ts delete mode 100644 src/gateway/session-utils.fs.ts delete mode 100644 src/gateway/session-utils.test.ts delete mode 100644 src/gateway/session-utils.ts delete mode 100644 src/gateway/session-utils.types.ts delete mode 100644 src/gateway/sessions-patch.test.ts delete mode 100644 src/gateway/sessions-patch.ts delete mode 100644 src/gateway/sessions-resolve.ts delete mode 100644 src/gateway/startup-auth.test.ts delete mode 100644 src/gateway/startup-auth.ts delete mode 100644 src/gateway/test-helpers.agent-results.ts delete mode 100644 src/gateway/test-helpers.e2e.ts delete mode 100644 src/gateway/test-helpers.mocks.ts delete mode 100644 src/gateway/test-helpers.openai-mock.ts delete mode 100644 src/gateway/test-helpers.server.ts delete mode 100644 src/gateway/test-helpers.ts delete mode 100644 src/gateway/test-http-response.ts delete mode 100644 src/gateway/test-openai-responses-model.ts delete mode 100644 src/gateway/test-temp-config.ts delete mode 100644 src/gateway/test-with-server.ts delete mode 100644 src/gateway/tools-invoke-http.test.ts delete mode 100644 src/gateway/tools-invoke-http.ts delete mode 100644 src/gateway/ws-log.test.ts delete mode 100644 src/gateway/ws-log.ts delete mode 100644 src/gateway/ws-logging.ts delete mode 100644 src/hooks/bundled-dir.ts delete mode 100644 src/hooks/bundled/README.md delete mode 100644 src/hooks/bundled/boot-md/HOOK.md delete mode 100644 src/hooks/bundled/boot-md/handler.gateway-startup.integration.test.ts delete mode 100644 src/hooks/bundled/boot-md/handler.test.ts delete mode 100644 src/hooks/bundled/boot-md/handler.ts delete mode 100644 src/hooks/bundled/bootstrap-extra-files/HOOK.md delete mode 100644 src/hooks/bundled/bootstrap-extra-files/handler.test.ts delete mode 100644 src/hooks/bundled/bootstrap-extra-files/handler.ts delete mode 100644 src/hooks/bundled/command-logger/HOOK.md delete mode 100644 src/hooks/bundled/command-logger/handler.ts delete mode 100644 src/hooks/bundled/session-memory/HOOK.md delete mode 100644 src/hooks/bundled/session-memory/handler.test.ts delete mode 100644 src/hooks/bundled/session-memory/handler.ts delete mode 100644 src/hooks/config.ts delete mode 100644 src/hooks/frontmatter.test.ts delete mode 100644 src/hooks/frontmatter.ts delete mode 100644 src/hooks/gmail-ops.ts delete mode 100644 src/hooks/gmail-setup-utils.test.ts delete mode 100644 src/hooks/gmail-setup-utils.ts delete mode 100644 src/hooks/gmail-watcher-lifecycle.test.ts delete mode 100644 src/hooks/gmail-watcher-lifecycle.ts delete mode 100644 src/hooks/gmail-watcher.ts delete mode 100644 src/hooks/gmail.test.ts delete mode 100644 src/hooks/gmail.ts delete mode 100644 src/hooks/hooks-install.e2e.test.ts delete mode 100644 src/hooks/hooks-status.ts delete mode 100644 src/hooks/hooks.ts delete mode 100644 src/hooks/install.test.ts delete mode 100644 src/hooks/install.ts delete mode 100644 src/hooks/installs.ts delete mode 100644 src/hooks/internal-hooks.test.ts delete mode 100644 src/hooks/internal-hooks.ts delete mode 100644 src/hooks/llm-slug-generator.ts delete mode 100644 src/hooks/loader.test.ts delete mode 100644 src/hooks/loader.ts delete mode 100644 src/hooks/plugin-hooks.ts delete mode 100644 src/hooks/types.ts delete mode 100644 src/hooks/workspace.test.ts delete mode 100644 src/hooks/workspace.ts delete mode 100644 src/imessage/accounts.ts delete mode 100644 src/imessage/client.ts delete mode 100644 src/imessage/constants.ts delete mode 100644 src/imessage/index.ts delete mode 100644 src/imessage/monitor.gating.test.ts delete mode 100644 src/imessage/monitor.shutdown.unhandled-rejection.test.ts delete mode 100644 src/imessage/monitor.ts delete mode 100644 src/imessage/monitor/abort-handler.ts delete mode 100644 src/imessage/monitor/deliver.test.ts delete mode 100644 src/imessage/monitor/deliver.ts delete mode 100644 src/imessage/monitor/inbound-processing.ts delete mode 100644 src/imessage/monitor/monitor-provider.ts delete mode 100644 src/imessage/monitor/parse-notification.ts delete mode 100644 src/imessage/monitor/runtime.ts delete mode 100644 src/imessage/monitor/types.ts delete mode 100644 src/imessage/probe.test.ts delete mode 100644 src/imessage/probe.ts delete mode 100644 src/imessage/send.test.ts delete mode 100644 src/imessage/send.ts delete mode 100644 src/imessage/target-parsing-helpers.ts delete mode 100644 src/imessage/targets.test.ts delete mode 100644 src/imessage/targets.ts delete mode 100644 src/index.ts delete mode 100644 src/infra/abort-pattern.test.ts delete mode 100644 src/infra/agent-events.test.ts delete mode 100644 src/infra/agent-events.ts delete mode 100644 src/infra/archive-path.test.ts delete mode 100644 src/infra/archive-path.ts delete mode 100644 src/infra/archive.test.ts delete mode 100644 src/infra/archive.ts delete mode 100644 src/infra/backoff.ts delete mode 100644 src/infra/binaries.ts delete mode 100644 src/infra/bonjour-ciao.ts delete mode 100644 src/infra/bonjour-discovery.test.ts delete mode 100644 src/infra/bonjour-discovery.ts delete mode 100644 src/infra/bonjour-errors.ts delete mode 100644 src/infra/bonjour.test.ts delete mode 100644 src/infra/bonjour.ts delete mode 100644 src/infra/brew.test.ts delete mode 100644 src/infra/canvas-host-url.ts delete mode 100644 src/infra/channel-activity.ts delete mode 100644 src/infra/channel-summary.ts delete mode 100644 src/infra/channels-status-issues.ts delete mode 100644 src/infra/clipboard.ts delete mode 100644 src/infra/control-ui-assets.test.ts delete mode 100644 src/infra/control-ui-assets.ts delete mode 100644 src/infra/dedupe.ts delete mode 100644 src/infra/detect-package-manager.ts delete mode 100644 src/infra/device-auth-store.ts delete mode 100644 src/infra/device-identity.state-dir.test.ts delete mode 100644 src/infra/device-identity.ts delete mode 100644 src/infra/device-pairing.test.ts delete mode 100644 src/infra/device-pairing.ts delete mode 100644 src/infra/diagnostic-events.ts delete mode 100644 src/infra/diagnostic-flags.ts delete mode 100644 src/infra/dotenv.test.ts delete mode 100644 src/infra/dotenv.ts delete mode 100644 src/infra/env-file.ts delete mode 100644 src/infra/env.test.ts delete mode 100644 src/infra/exec-approval-forwarder.test.ts delete mode 100644 src/infra/exec-approval-forwarder.ts delete mode 100644 src/infra/exec-approvals-allowlist.ts delete mode 100644 src/infra/exec-approvals-analysis.ts delete mode 100644 src/infra/exec-approvals.test.ts delete mode 100644 src/infra/exec-approvals.ts delete mode 100644 src/infra/exec-host.ts delete mode 100644 src/infra/exec-safe-bin-policy.test.ts delete mode 100644 src/infra/exec-safe-bin-policy.ts delete mode 100644 src/infra/exec-safe-bin-trust.test.ts delete mode 100644 src/infra/exec-safe-bin-trust.ts delete mode 100644 src/infra/exec-safety.ts delete mode 100644 src/infra/fetch.test.ts delete mode 100644 src/infra/fetch.ts delete mode 100644 src/infra/file-lock.ts delete mode 100644 src/infra/fixed-window-rate-limit.test.ts delete mode 100644 src/infra/fixed-window-rate-limit.ts delete mode 100644 src/infra/format-time/format-datetime.ts delete mode 100644 src/infra/format-time/format-relative.ts delete mode 100644 src/infra/format-time/format-time.test.ts delete mode 100644 src/infra/fs-safe.test.ts delete mode 100644 src/infra/fs-safe.ts delete mode 100644 src/infra/gateway-lock.test.ts delete mode 100644 src/infra/gateway-lock.ts delete mode 100644 src/infra/gemini-auth.ts delete mode 100644 src/infra/git-root.test.ts delete mode 100644 src/infra/heartbeat-active-hours.test.ts delete mode 100644 src/infra/heartbeat-active-hours.ts delete mode 100644 src/infra/heartbeat-events-filter.ts delete mode 100644 src/infra/heartbeat-events.ts delete mode 100644 src/infra/heartbeat-reason.test.ts delete mode 100644 src/infra/heartbeat-reason.ts delete mode 100644 src/infra/heartbeat-runner.ghost-reminder.test.ts delete mode 100644 src/infra/heartbeat-runner.model-override.test.ts delete mode 100644 src/infra/heartbeat-runner.respects-ackmaxchars-heartbeat-acks.test.ts delete mode 100644 src/infra/heartbeat-runner.returns-default-unset.test.ts delete mode 100644 src/infra/heartbeat-runner.scheduler.test.ts delete mode 100644 src/infra/heartbeat-runner.sender-prefers-delivery-target.test.ts delete mode 100644 src/infra/heartbeat-runner.test-harness.ts delete mode 100644 src/infra/heartbeat-runner.test-utils.ts delete mode 100644 src/infra/heartbeat-runner.transcript-prune.test.ts delete mode 100644 src/infra/heartbeat-runner.ts delete mode 100644 src/infra/heartbeat-visibility.test.ts delete mode 100644 src/infra/heartbeat-visibility.ts delete mode 100644 src/infra/heartbeat-wake.test.ts delete mode 100644 src/infra/heartbeat-wake.ts delete mode 100644 src/infra/home-dir.test.ts delete mode 100644 src/infra/host-env-security-policy.json delete mode 100644 src/infra/host-env-security.policy-parity.test.ts delete mode 100644 src/infra/host-env-security.test.ts delete mode 100644 src/infra/host-env-security.ts delete mode 100644 src/infra/http-body.test.ts delete mode 100644 src/infra/http-body.ts delete mode 100644 src/infra/infra-parsing.test.ts delete mode 100644 src/infra/infra-runtime.test.ts delete mode 100644 src/infra/infra-store.test.ts delete mode 100644 src/infra/install-package-dir.ts delete mode 100644 src/infra/install-safe-path.test.ts delete mode 100644 src/infra/install-safe-path.ts delete mode 100644 src/infra/install-source-utils.test.ts delete mode 100644 src/infra/install-source-utils.ts delete mode 100644 src/infra/json-file.ts delete mode 100644 src/infra/json-files.ts delete mode 100644 src/infra/jsonl-socket.ts delete mode 100644 src/infra/machine-name.ts delete mode 100644 src/infra/map-size.ts delete mode 100644 src/infra/net/fetch-guard.ssrf.test.ts delete mode 100644 src/infra/net/fetch-guard.ts delete mode 100644 src/infra/net/hostname.ts delete mode 100644 src/infra/net/ssrf.pinning.test.ts delete mode 100644 src/infra/net/ssrf.test.ts delete mode 100644 src/infra/net/ssrf.ts delete mode 100644 src/infra/node-pairing.test.ts delete mode 100644 src/infra/node-pairing.ts delete mode 100644 src/infra/node-shell.ts delete mode 100644 src/infra/npm-integrity.test.ts delete mode 100644 src/infra/npm-integrity.ts delete mode 100644 src/infra/npm-pack-install.test.ts delete mode 100644 src/infra/npm-pack-install.ts delete mode 100644 src/infra/npm-registry-spec.ts delete mode 100644 src/infra/openclaw-root.test.ts delete mode 100644 src/infra/openclaw-root.ts delete mode 100644 src/infra/os-summary.ts delete mode 100644 src/infra/outbound/abort.ts delete mode 100644 src/infra/outbound/agent-delivery.test.ts delete mode 100644 src/infra/outbound/agent-delivery.ts delete mode 100644 src/infra/outbound/bound-delivery-router.test.ts delete mode 100644 src/infra/outbound/bound-delivery-router.ts delete mode 100644 src/infra/outbound/channel-adapters.ts delete mode 100644 src/infra/outbound/channel-selection.ts delete mode 100644 src/infra/outbound/channel-target.ts delete mode 100644 src/infra/outbound/deliver.test.ts delete mode 100644 src/infra/outbound/deliver.ts delete mode 100644 src/infra/outbound/delivery-queue.ts delete mode 100644 src/infra/outbound/directory-cache.ts delete mode 100644 src/infra/outbound/envelope.ts delete mode 100644 src/infra/outbound/format.ts delete mode 100644 src/infra/outbound/identity.ts delete mode 100644 src/infra/outbound/message-action-params.ts delete mode 100644 src/infra/outbound/message-action-runner.test.ts delete mode 100644 src/infra/outbound/message-action-runner.threading.test.ts delete mode 100644 src/infra/outbound/message-action-runner.ts delete mode 100644 src/infra/outbound/message-action-spec.ts delete mode 100644 src/infra/outbound/message.e2e.test.ts delete mode 100644 src/infra/outbound/message.test.ts delete mode 100644 src/infra/outbound/message.ts delete mode 100644 src/infra/outbound/outbound-policy.ts delete mode 100644 src/infra/outbound/outbound-send-service.test.ts delete mode 100644 src/infra/outbound/outbound-send-service.ts delete mode 100644 src/infra/outbound/outbound-session.ts delete mode 100644 src/infra/outbound/outbound.test.ts delete mode 100644 src/infra/outbound/payloads.ts delete mode 100644 src/infra/outbound/session-binding-service.ts delete mode 100644 src/infra/outbound/target-errors.ts delete mode 100644 src/infra/outbound/target-normalization.ts delete mode 100644 src/infra/outbound/target-resolver.test.ts delete mode 100644 src/infra/outbound/target-resolver.ts delete mode 100644 src/infra/outbound/targets.test.ts delete mode 100644 src/infra/outbound/targets.ts delete mode 100644 src/infra/outbound/tool-payload.ts delete mode 100644 src/infra/package-json.ts delete mode 100644 src/infra/pairing-files.ts delete mode 100644 src/infra/pairing-token.ts delete mode 100644 src/infra/path-env.test.ts delete mode 100644 src/infra/path-guards.ts delete mode 100644 src/infra/path-prepend.ts delete mode 100644 src/infra/path-safety.test.ts delete mode 100644 src/infra/path-safety.ts delete mode 100644 src/infra/plain-object.test.ts delete mode 100644 src/infra/ports-format.test.ts delete mode 100644 src/infra/ports-format.ts delete mode 100644 src/infra/ports-inspect.ts delete mode 100644 src/infra/ports-types.ts delete mode 100644 src/infra/ports.test.ts delete mode 100644 src/infra/ports.ts delete mode 100644 src/infra/process-respawn.test.ts delete mode 100644 src/infra/process-respawn.ts delete mode 100644 src/infra/provider-usage.auth.normalizes-keys.test.ts delete mode 100644 src/infra/provider-usage.auth.ts delete mode 100644 src/infra/provider-usage.fetch.antigravity.test.ts delete mode 100644 src/infra/provider-usage.fetch.antigravity.ts delete mode 100644 src/infra/provider-usage.fetch.claude.test.ts delete mode 100644 src/infra/provider-usage.fetch.claude.ts delete mode 100644 src/infra/provider-usage.fetch.codex.test.ts delete mode 100644 src/infra/provider-usage.fetch.codex.ts delete mode 100644 src/infra/provider-usage.fetch.copilot.test.ts delete mode 100644 src/infra/provider-usage.fetch.copilot.ts delete mode 100644 src/infra/provider-usage.fetch.gemini.test.ts delete mode 100644 src/infra/provider-usage.fetch.gemini.ts delete mode 100644 src/infra/provider-usage.fetch.minimax.test.ts delete mode 100644 src/infra/provider-usage.fetch.minimax.ts delete mode 100644 src/infra/provider-usage.fetch.shared.test.ts delete mode 100644 src/infra/provider-usage.fetch.shared.ts delete mode 100644 src/infra/provider-usage.fetch.ts delete mode 100644 src/infra/provider-usage.fetch.zai.test.ts delete mode 100644 src/infra/provider-usage.fetch.zai.ts delete mode 100644 src/infra/provider-usage.format.test.ts delete mode 100644 src/infra/provider-usage.format.ts delete mode 100644 src/infra/provider-usage.load.ts delete mode 100644 src/infra/provider-usage.shared.test.ts delete mode 100644 src/infra/provider-usage.shared.ts delete mode 100644 src/infra/provider-usage.test.ts delete mode 100644 src/infra/provider-usage.ts delete mode 100644 src/infra/provider-usage.types.ts delete mode 100644 src/infra/push-apns.test.ts delete mode 100644 src/infra/push-apns.ts delete mode 100644 src/infra/restart-sentinel.test.ts delete mode 100644 src/infra/restart-sentinel.ts delete mode 100644 src/infra/restart.ts delete mode 100644 src/infra/retry-policy.ts delete mode 100644 src/infra/retry.test.ts delete mode 100644 src/infra/retry.ts delete mode 100644 src/infra/run-node.test.ts delete mode 100644 src/infra/runtime-guard.test.ts delete mode 100644 src/infra/runtime-status.ts delete mode 100644 src/infra/scp-host.test.ts delete mode 100644 src/infra/scp-host.ts delete mode 100644 src/infra/scripts-modules.d.ts delete mode 100644 src/infra/session-cost-usage.test.ts delete mode 100644 src/infra/session-cost-usage.ts delete mode 100644 src/infra/session-cost-usage.types.ts delete mode 100644 src/infra/session-maintenance-warning.ts delete mode 100644 src/infra/shell-env.test.ts delete mode 100644 src/infra/shell-env.ts delete mode 100644 src/infra/skills-remote.test.ts delete mode 100644 src/infra/skills-remote.ts delete mode 100644 src/infra/ssh-config.test.ts delete mode 100644 src/infra/ssh-config.ts delete mode 100644 src/infra/ssh-tunnel.ts delete mode 100644 src/infra/state-migrations.fs.ts delete mode 100644 src/infra/state-migrations.state-dir.test.ts delete mode 100644 src/infra/state-migrations.ts delete mode 100644 src/infra/system-events.test.ts delete mode 100644 src/infra/system-events.ts delete mode 100644 src/infra/system-presence.test.ts delete mode 100644 src/infra/system-presence.ts delete mode 100644 src/infra/system-presence.version.test.ts delete mode 100644 src/infra/system-run-command.test.ts delete mode 100644 src/infra/system-run-command.ts delete mode 100644 src/infra/tailnet.ts delete mode 100644 src/infra/tailscale.test.ts delete mode 100644 src/infra/tailscale.ts delete mode 100644 src/infra/tls/fingerprint.ts delete mode 100644 src/infra/tls/gateway.ts delete mode 100644 src/infra/tmp-openclaw-dir.test.ts delete mode 100644 src/infra/transport-ready.test.ts delete mode 100644 src/infra/transport-ready.ts delete mode 100644 src/infra/unhandled-rejections.fatal-detection.test.ts delete mode 100644 src/infra/unhandled-rejections.test.ts delete mode 100644 src/infra/unhandled-rejections.ts delete mode 100644 src/infra/update-channels.ts delete mode 100644 src/infra/update-check.test.ts delete mode 100644 src/infra/update-check.ts delete mode 100644 src/infra/update-global.test.ts delete mode 100644 src/infra/update-global.ts delete mode 100644 src/infra/update-runner.test.ts delete mode 100644 src/infra/update-runner.ts delete mode 100644 src/infra/update-startup.test.ts delete mode 100644 src/infra/update-startup.ts delete mode 100644 src/infra/voicewake.ts delete mode 100644 src/infra/warning-filter.test.ts delete mode 100644 src/infra/watch-node.test.ts delete mode 100644 src/infra/widearea-dns.test.ts delete mode 100644 src/infra/widearea-dns.ts delete mode 100644 src/infra/ws.ts delete mode 100644 src/infra/wsl.ts delete mode 100644 src/line/accounts.test.ts delete mode 100644 src/line/accounts.ts delete mode 100644 src/line/actions.ts delete mode 100644 src/line/auto-reply-delivery.test.ts delete mode 100644 src/line/auto-reply-delivery.ts delete mode 100644 src/line/bot-access.ts delete mode 100644 src/line/bot-handlers.test.ts delete mode 100644 src/line/bot-handlers.ts delete mode 100644 src/line/bot-message-context.test.ts delete mode 100644 src/line/bot-message-context.ts delete mode 100644 src/line/bot.ts delete mode 100644 src/line/channel-access-token.ts delete mode 100644 src/line/config-schema.ts delete mode 100644 src/line/download.test.ts delete mode 100644 src/line/download.ts delete mode 100644 src/line/flex-templates.test.ts delete mode 100644 src/line/flex-templates.ts delete mode 100644 src/line/flex-templates/basic-cards.ts delete mode 100644 src/line/flex-templates/common.ts delete mode 100644 src/line/flex-templates/media-control-cards.ts delete mode 100644 src/line/flex-templates/message.ts delete mode 100644 src/line/flex-templates/schedule-cards.ts delete mode 100644 src/line/flex-templates/types.ts delete mode 100644 src/line/http-registry.ts delete mode 100644 src/line/index.ts delete mode 100644 src/line/markdown-to-line.test.ts delete mode 100644 src/line/markdown-to-line.ts delete mode 100644 src/line/monitor.fail-closed.test.ts delete mode 100644 src/line/monitor.read-body.test.ts delete mode 100644 src/line/monitor.ts delete mode 100644 src/line/probe.test.ts delete mode 100644 src/line/probe.ts delete mode 100644 src/line/reply-chunks.test.ts delete mode 100644 src/line/reply-chunks.ts delete mode 100644 src/line/rich-menu.test.ts delete mode 100644 src/line/rich-menu.ts delete mode 100644 src/line/send.test.ts delete mode 100644 src/line/send.ts delete mode 100644 src/line/signature.ts delete mode 100644 src/line/template-messages.test.ts delete mode 100644 src/line/template-messages.ts delete mode 100644 src/line/types.ts delete mode 100644 src/line/webhook-node.test.ts delete mode 100644 src/line/webhook-node.ts delete mode 100644 src/line/webhook-utils.ts delete mode 100644 src/line/webhook.test.ts delete mode 100644 src/line/webhook.ts delete mode 100644 src/link-understanding/apply.ts delete mode 100644 src/link-understanding/defaults.ts delete mode 100644 src/link-understanding/detect.test.ts delete mode 100644 src/link-understanding/detect.ts delete mode 100644 src/link-understanding/format.ts delete mode 100644 src/link-understanding/index.ts delete mode 100644 src/link-understanding/runner.ts delete mode 100644 src/logger.test.ts delete mode 100644 src/logger.ts delete mode 100644 src/logging.ts delete mode 100644 src/logging/console-capture.test.ts delete mode 100644 src/logging/console-settings.test.ts delete mode 100644 src/logging/console-timestamp.test.ts delete mode 100644 src/logging/diagnostic-session-state.ts delete mode 100644 src/logging/diagnostic.test.ts delete mode 100644 src/logging/diagnostic.ts delete mode 100644 src/logging/parse-log-line.test.ts delete mode 100644 src/logging/parse-log-line.ts delete mode 100644 src/logging/redact-identifier.ts delete mode 100644 src/logging/redact.test.ts delete mode 100644 src/logging/subsystem.test.ts delete mode 100644 src/logging/timestamps.test.ts delete mode 100644 src/macos/gateway-daemon.ts delete mode 100644 src/macos/relay-smoke.test.ts delete mode 100644 src/macos/relay-smoke.ts delete mode 100644 src/macos/relay.ts delete mode 100644 src/markdown/code-spans.ts delete mode 100644 src/markdown/fences.ts delete mode 100644 src/markdown/frontmatter.test.ts delete mode 100644 src/markdown/frontmatter.ts delete mode 100644 src/markdown/ir.blockquote-spacing.test.ts delete mode 100644 src/markdown/ir.hr-spacing.test.ts delete mode 100644 src/markdown/ir.nested-lists.test.ts delete mode 100644 src/markdown/ir.table-bullets.test.ts delete mode 100644 src/markdown/ir.table-code.test.ts delete mode 100644 src/markdown/ir.ts delete mode 100644 src/markdown/render.ts delete mode 100644 src/markdown/tables.ts delete mode 100644 src/markdown/whatsapp.test.ts delete mode 100644 src/markdown/whatsapp.ts delete mode 100644 src/media-understanding/apply.e2e.test.ts delete mode 100644 src/media-understanding/apply.ts delete mode 100644 src/media-understanding/attachments.ts delete mode 100644 src/media-understanding/audio-preflight.ts delete mode 100644 src/media-understanding/concurrency.ts delete mode 100644 src/media-understanding/defaults.ts delete mode 100644 src/media-understanding/errors.ts delete mode 100644 src/media-understanding/format.test.ts delete mode 100644 src/media-understanding/format.ts delete mode 100644 src/media-understanding/fs.ts delete mode 100644 src/media-understanding/index.ts delete mode 100644 src/media-understanding/media-understanding-misc.test.ts delete mode 100644 src/media-understanding/output-extract.ts delete mode 100644 src/media-understanding/providers/anthropic/index.ts delete mode 100644 src/media-understanding/providers/audio.test-helpers.ts delete mode 100644 src/media-understanding/providers/deepgram/audio.live.test.ts delete mode 100644 src/media-understanding/providers/deepgram/audio.test.ts delete mode 100644 src/media-understanding/providers/deepgram/audio.ts delete mode 100644 src/media-understanding/providers/deepgram/index.ts delete mode 100644 src/media-understanding/providers/google/audio.ts delete mode 100644 src/media-understanding/providers/google/index.ts delete mode 100644 src/media-understanding/providers/google/inline-data.ts delete mode 100644 src/media-understanding/providers/google/video.test.ts delete mode 100644 src/media-understanding/providers/google/video.ts delete mode 100644 src/media-understanding/providers/groq/index.ts delete mode 100644 src/media-understanding/providers/image.ts delete mode 100644 src/media-understanding/providers/index.ts delete mode 100644 src/media-understanding/providers/minimax/index.ts delete mode 100644 src/media-understanding/providers/openai/audio.test.ts delete mode 100644 src/media-understanding/providers/openai/audio.ts delete mode 100644 src/media-understanding/providers/openai/index.ts delete mode 100644 src/media-understanding/providers/shared.ts delete mode 100644 src/media-understanding/providers/zai/index.ts delete mode 100644 src/media-understanding/resolve.test.ts delete mode 100644 src/media-understanding/resolve.ts delete mode 100644 src/media-understanding/runner.auto-audio.test.ts delete mode 100644 src/media-understanding/runner.deepgram.test.ts delete mode 100644 src/media-understanding/runner.entries.ts delete mode 100644 src/media-understanding/runner.test-utils.ts delete mode 100644 src/media-understanding/runner.ts delete mode 100644 src/media-understanding/runner.vision-skip.test.ts delete mode 100644 src/media-understanding/scope.ts delete mode 100644 src/media-understanding/types.ts delete mode 100644 src/media-understanding/video.ts delete mode 100644 src/media/audio-tags.ts delete mode 100644 src/media/audio.test.ts delete mode 100644 src/media/audio.ts delete mode 100644 src/media/base64.ts delete mode 100644 src/media/constants.ts delete mode 100644 src/media/fetch.test.ts delete mode 100644 src/media/fetch.ts delete mode 100644 src/media/host.test.ts delete mode 100644 src/media/host.ts delete mode 100644 src/media/image-ops.helpers.test.ts delete mode 100644 src/media/image-ops.ts delete mode 100644 src/media/inbound-path-policy.test.ts delete mode 100644 src/media/inbound-path-policy.ts delete mode 100644 src/media/input-files.fetch-guard.test.ts delete mode 100644 src/media/input-files.ts delete mode 100644 src/media/local-roots.ts delete mode 100644 src/media/mime.test.ts delete mode 100644 src/media/mime.ts delete mode 100644 src/media/outbound-attachment.ts delete mode 100644 src/media/parse.test.ts delete mode 100644 src/media/parse.ts delete mode 100644 src/media/png-encode.ts delete mode 100644 src/media/read-response-with-limit.ts delete mode 100644 src/media/server.test.ts delete mode 100644 src/media/server.ts delete mode 100644 src/media/sniff-mime-from-base64.ts delete mode 100644 src/media/store.redirect.test.ts delete mode 100644 src/media/store.test.ts delete mode 100644 src/media/store.ts delete mode 100644 src/memory/backend-config.test.ts delete mode 100644 src/memory/backend-config.ts delete mode 100644 src/memory/batch-error-utils.ts delete mode 100644 src/memory/batch-gemini.ts delete mode 100644 src/memory/batch-http.ts delete mode 100644 src/memory/batch-openai.ts delete mode 100644 src/memory/batch-output.ts delete mode 100644 src/memory/batch-runner.ts delete mode 100644 src/memory/batch-upload.ts delete mode 100644 src/memory/batch-utils.ts delete mode 100644 src/memory/batch-voyage.test.ts delete mode 100644 src/memory/batch-voyage.ts delete mode 100644 src/memory/embedding-chunk-limits.test.ts delete mode 100644 src/memory/embedding-chunk-limits.ts delete mode 100644 src/memory/embedding-input-limits.ts delete mode 100644 src/memory/embedding-manager.test-harness.ts delete mode 100644 src/memory/embedding-model-limits.ts delete mode 100644 src/memory/embedding.test-mocks.ts delete mode 100644 src/memory/embeddings-debug.ts delete mode 100644 src/memory/embeddings-gemini.ts delete mode 100644 src/memory/embeddings-openai.ts delete mode 100644 src/memory/embeddings-remote-client.ts delete mode 100644 src/memory/embeddings-remote-fetch.ts delete mode 100644 src/memory/embeddings-voyage.test.ts delete mode 100644 src/memory/embeddings-voyage.ts delete mode 100644 src/memory/embeddings.test.ts delete mode 100644 src/memory/embeddings.ts delete mode 100644 src/memory/fs-utils.ts delete mode 100644 src/memory/headers-fingerprint.ts delete mode 100644 src/memory/hybrid.test.ts delete mode 100644 src/memory/hybrid.ts delete mode 100644 src/memory/index.test.ts delete mode 100644 src/memory/index.ts delete mode 100644 src/memory/internal.test.ts delete mode 100644 src/memory/internal.ts delete mode 100644 src/memory/manager-cache-key.ts delete mode 100644 src/memory/manager-embedding-ops.ts delete mode 100644 src/memory/manager-search.ts delete mode 100644 src/memory/manager-sync-ops.ts delete mode 100644 src/memory/manager.async-search.test.ts delete mode 100644 src/memory/manager.atomic-reindex.test.ts delete mode 100644 src/memory/manager.batch.test.ts delete mode 100644 src/memory/manager.embedding-batches.test.ts delete mode 100644 src/memory/manager.read-file.test.ts delete mode 100644 src/memory/manager.sync-errors-do-not-crash.test.ts delete mode 100644 src/memory/manager.ts delete mode 100644 src/memory/manager.vector-dedupe.test.ts delete mode 100644 src/memory/manager.watcher-config.test.ts delete mode 100644 src/memory/memory-schema.ts delete mode 100644 src/memory/mmr.test.ts delete mode 100644 src/memory/mmr.ts delete mode 100644 src/memory/node-llama.ts delete mode 100644 src/memory/openai-batch.ts delete mode 100644 src/memory/provider-key.ts delete mode 100644 src/memory/qmd-manager.test.ts delete mode 100644 src/memory/qmd-manager.ts delete mode 100644 src/memory/qmd-query-parser.test.ts delete mode 100644 src/memory/qmd-query-parser.ts delete mode 100644 src/memory/qmd-scope.test.ts delete mode 100644 src/memory/qmd-scope.ts delete mode 100644 src/memory/query-expansion.test.ts delete mode 100644 src/memory/query-expansion.ts delete mode 100644 src/memory/search-manager.test.ts delete mode 100644 src/memory/search-manager.ts delete mode 100644 src/memory/session-files.test.ts delete mode 100644 src/memory/session-files.ts delete mode 100644 src/memory/sqlite-vec.ts delete mode 100644 src/memory/sqlite.ts delete mode 100644 src/memory/status-format.ts delete mode 100644 src/memory/sync-index.ts delete mode 100644 src/memory/sync-memory-files.ts delete mode 100644 src/memory/sync-progress.ts delete mode 100644 src/memory/sync-session-files.ts delete mode 100644 src/memory/sync-stale.ts delete mode 100644 src/memory/temporal-decay.test.ts delete mode 100644 src/memory/temporal-decay.ts delete mode 100644 src/memory/test-embeddings-mock.ts delete mode 100644 src/memory/test-manager-helpers.ts delete mode 100644 src/memory/test-manager.ts delete mode 100644 src/memory/test-runtime-mocks.ts delete mode 100644 src/memory/types.ts delete mode 100644 src/node-host/config.ts delete mode 100644 src/node-host/invoke-browser.ts delete mode 100644 src/node-host/invoke-system-run.ts delete mode 100644 src/node-host/invoke.sanitize-env.test.ts delete mode 100644 src/node-host/invoke.ts delete mode 100644 src/node-host/runner.ts delete mode 100644 src/node-host/with-timeout.ts delete mode 100644 src/pairing/pairing-labels.ts delete mode 100644 src/pairing/pairing-messages.test.ts delete mode 100644 src/pairing/pairing-messages.ts delete mode 100644 src/pairing/pairing-store.test.ts delete mode 100644 src/pairing/pairing-store.ts delete mode 100644 src/pairing/setup-code.test.ts delete mode 100644 src/pairing/setup-code.ts delete mode 100644 src/plugin-sdk/account-id.ts delete mode 100644 src/plugin-sdk/agent-media-payload.ts delete mode 100644 src/plugin-sdk/allow-from.test.ts delete mode 100644 src/plugin-sdk/allow-from.ts delete mode 100644 src/plugin-sdk/command-auth.ts delete mode 100644 src/plugin-sdk/config-paths.ts delete mode 100644 src/plugin-sdk/file-lock.ts delete mode 100644 src/plugin-sdk/index.test.ts delete mode 100644 src/plugin-sdk/index.ts delete mode 100644 src/plugin-sdk/json-store.ts delete mode 100644 src/plugin-sdk/onboarding.ts delete mode 100644 src/plugin-sdk/provider-auth-result.ts delete mode 100644 src/plugin-sdk/slack-message-actions.ts delete mode 100644 src/plugin-sdk/status-helpers.test.ts delete mode 100644 src/plugin-sdk/status-helpers.ts delete mode 100644 src/plugin-sdk/temp-path.test.ts delete mode 100644 src/plugin-sdk/temp-path.ts delete mode 100644 src/plugin-sdk/text-chunking.test.ts delete mode 100644 src/plugin-sdk/text-chunking.ts delete mode 100644 src/plugin-sdk/tool-send.ts delete mode 100644 src/plugin-sdk/webhook-path.ts delete mode 100644 src/plugin-sdk/webhook-targets.test.ts delete mode 100644 src/plugin-sdk/webhook-targets.ts delete mode 100644 src/plugins/bundled-dir.ts delete mode 100644 src/plugins/cli.test.ts delete mode 100644 src/plugins/cli.ts delete mode 100644 src/plugins/commands.ts delete mode 100644 src/plugins/config-schema.ts delete mode 100644 src/plugins/config-state.test.ts delete mode 100644 src/plugins/config-state.ts delete mode 100644 src/plugins/discovery.test.ts delete mode 100644 src/plugins/discovery.ts delete mode 100644 src/plugins/enable.test.ts delete mode 100644 src/plugins/enable.ts delete mode 100644 src/plugins/hook-runner-global.ts delete mode 100644 src/plugins/hooks.before-agent-start.test.ts delete mode 100644 src/plugins/hooks.model-override-wiring.test.ts delete mode 100644 src/plugins/hooks.phase-hooks.test.ts delete mode 100644 src/plugins/hooks.test-helpers.ts delete mode 100644 src/plugins/hooks.ts delete mode 100644 src/plugins/http-path.ts delete mode 100644 src/plugins/http-registry.ts delete mode 100644 src/plugins/install.e2e.test.ts delete mode 100644 src/plugins/install.ts delete mode 100644 src/plugins/installs.ts delete mode 100644 src/plugins/loader.test.ts delete mode 100644 src/plugins/loader.ts delete mode 100644 src/plugins/logger.test.ts delete mode 100644 src/plugins/logger.ts delete mode 100644 src/plugins/manifest-registry.test.ts delete mode 100644 src/plugins/manifest-registry.ts delete mode 100644 src/plugins/manifest.ts delete mode 100644 src/plugins/path-safety.ts delete mode 100644 src/plugins/providers.ts delete mode 100644 src/plugins/registry.ts delete mode 100644 src/plugins/runtime.ts delete mode 100644 src/plugins/runtime/index.test.ts delete mode 100644 src/plugins/runtime/index.ts delete mode 100644 src/plugins/runtime/native-deps.ts delete mode 100644 src/plugins/runtime/types.ts delete mode 100644 src/plugins/schema-validator.ts delete mode 100644 src/plugins/services.test.ts delete mode 100644 src/plugins/services.ts delete mode 100644 src/plugins/slots.test.ts delete mode 100644 src/plugins/slots.ts delete mode 100644 src/plugins/source-display.test.ts delete mode 100644 src/plugins/source-display.ts delete mode 100644 src/plugins/status.ts delete mode 100644 src/plugins/tools.optional.test.ts delete mode 100644 src/plugins/tools.ts delete mode 100644 src/plugins/types.ts delete mode 100644 src/plugins/uninstall.test.ts delete mode 100644 src/plugins/uninstall.ts delete mode 100644 src/plugins/update.ts delete mode 100644 src/plugins/voice-call.plugin.test.ts delete mode 100644 src/plugins/wired-hooks-after-tool-call.e2e.test.ts delete mode 100644 src/plugins/wired-hooks-compaction.test.ts delete mode 100644 src/plugins/wired-hooks-gateway.test.ts delete mode 100644 src/plugins/wired-hooks-llm.test.ts delete mode 100644 src/plugins/wired-hooks-message.test.ts delete mode 100644 src/plugins/wired-hooks-session.test.ts delete mode 100644 src/plugins/wired-hooks-subagent.test.ts delete mode 100644 src/polls.test.ts delete mode 100644 src/polls.ts delete mode 100644 src/process/child-process-bridge.test.ts delete mode 100644 src/process/command-queue.test.ts delete mode 100644 src/process/command-queue.ts delete mode 100644 src/process/exec.test.ts delete mode 100644 src/process/exec.ts delete mode 100644 src/process/kill-tree.test.ts delete mode 100644 src/process/kill-tree.ts delete mode 100644 src/process/lanes.ts delete mode 100644 src/process/restart-recovery.ts delete mode 100644 src/process/spawn-utils.test.ts delete mode 100644 src/process/spawn-utils.ts delete mode 100644 src/process/supervisor/adapters/child.test.ts delete mode 100644 src/process/supervisor/adapters/child.ts delete mode 100644 src/process/supervisor/adapters/env.ts delete mode 100644 src/process/supervisor/adapters/pty.test.ts delete mode 100644 src/process/supervisor/adapters/pty.ts delete mode 100644 src/process/supervisor/index.ts delete mode 100644 src/process/supervisor/registry.test.ts delete mode 100644 src/process/supervisor/registry.ts delete mode 100644 src/process/supervisor/supervisor.pty-command.test.ts delete mode 100644 src/process/supervisor/supervisor.test.ts delete mode 100644 src/process/supervisor/supervisor.ts delete mode 100644 src/process/supervisor/types.ts delete mode 100644 src/providers/github-copilot-auth.ts delete mode 100644 src/providers/github-copilot-models.test.ts delete mode 100644 src/providers/github-copilot-models.ts delete mode 100644 src/providers/github-copilot-token.test.ts delete mode 100644 src/providers/github-copilot-token.ts delete mode 100644 src/providers/google-shared.ensures-function-call-comes-after-user-turn.test.ts delete mode 100644 src/providers/google-shared.preserves-parameters-type-is-missing.test.ts delete mode 100644 src/providers/google-shared.test-helpers.ts delete mode 100644 src/providers/qwen-portal-oauth.test.ts delete mode 100644 src/providers/qwen-portal-oauth.ts delete mode 100644 src/routing/account-id.test.ts delete mode 100644 src/routing/account-id.ts delete mode 100644 src/routing/bindings.ts delete mode 100644 src/routing/resolve-route.test.ts delete mode 100644 src/routing/resolve-route.ts delete mode 100644 src/routing/session-key.continuity.test.ts delete mode 100644 src/routing/session-key.test.ts delete mode 100644 src/routing/session-key.ts delete mode 100644 src/scripts/canvas-a2ui-copy.test.ts delete mode 100644 src/security/audit-channel.ts delete mode 100644 src/security/audit-extra.async.ts delete mode 100644 src/security/audit-extra.sync.test.ts delete mode 100644 src/security/audit-extra.sync.ts delete mode 100644 src/security/audit-extra.ts delete mode 100644 src/security/audit-fs.ts delete mode 100644 src/security/audit-tool-policy.ts delete mode 100644 src/security/audit.test.ts delete mode 100644 src/security/audit.ts delete mode 100644 src/security/channel-metadata.ts delete mode 100644 src/security/dangerous-tools.ts delete mode 100644 src/security/dm-policy-shared.test.ts delete mode 100644 src/security/dm-policy-shared.ts delete mode 100644 src/security/external-content.test.ts delete mode 100644 src/security/external-content.ts delete mode 100644 src/security/fix.test.ts delete mode 100644 src/security/fix.ts delete mode 100644 src/security/scan-paths.ts delete mode 100644 src/security/secret-equal.ts delete mode 100644 src/security/skill-scanner.test.ts delete mode 100644 src/security/skill-scanner.ts delete mode 100644 src/security/temp-path-guard.test.ts delete mode 100644 src/security/windows-acl.test.ts delete mode 100644 src/security/windows-acl.ts delete mode 100644 src/sessions/input-provenance.ts delete mode 100644 src/sessions/level-overrides.ts delete mode 100644 src/sessions/model-overrides.ts delete mode 100644 src/sessions/send-policy.test.ts delete mode 100644 src/sessions/send-policy.ts delete mode 100644 src/sessions/session-key-utils.test.ts delete mode 100644 src/sessions/session-key-utils.ts delete mode 100644 src/sessions/session-label.ts delete mode 100644 src/sessions/transcript-events.ts delete mode 100644 src/shared/chat-content.ts delete mode 100644 src/shared/config-eval.ts delete mode 100644 src/shared/entry-metadata.ts delete mode 100644 src/shared/entry-status.ts delete mode 100644 src/shared/frontmatter.ts delete mode 100644 src/shared/model-param-b.ts delete mode 100644 src/shared/net/ipv4.ts delete mode 100644 src/shared/node-list-parse.test.ts delete mode 100644 src/shared/node-list-parse.ts delete mode 100644 src/shared/node-list-types.ts delete mode 100644 src/shared/node-match.ts delete mode 100644 src/shared/operator-scope-compat.test.ts delete mode 100644 src/shared/operator-scope-compat.ts delete mode 100644 src/shared/pid-alive.ts delete mode 100644 src/shared/process-scoped-map.ts delete mode 100644 src/shared/requirements.test.ts delete mode 100644 src/shared/requirements.ts delete mode 100644 src/shared/shared-misc.test.ts delete mode 100644 src/shared/string-normalization.test.ts delete mode 100644 src/shared/string-normalization.ts delete mode 100644 src/shared/subagents-format.ts delete mode 100644 src/shared/text-chunking.ts delete mode 100644 src/shared/text/reasoning-tags.test.ts delete mode 100644 src/signal/accounts.ts delete mode 100644 src/signal/client.ts delete mode 100644 src/signal/daemon.ts delete mode 100644 src/signal/format.chunking.test.ts delete mode 100644 src/signal/format.links.test.ts delete mode 100644 src/signal/format.test.ts delete mode 100644 src/signal/format.ts delete mode 100644 src/signal/format.visual.test.ts delete mode 100644 src/signal/identity.ts delete mode 100644 src/signal/index.ts delete mode 100644 src/signal/monitor.event-handler.sender-prefix.e2e.test.ts delete mode 100644 src/signal/monitor.event-handler.typing-read-receipts.e2e.test.ts delete mode 100644 src/signal/monitor.test.ts delete mode 100644 src/signal/monitor.tool-result.pairs-uuid-only-senders-uuid-allowlist-entry.e2e.test.ts delete mode 100644 src/signal/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts delete mode 100644 src/signal/monitor.tool-result.test-harness.ts delete mode 100644 src/signal/monitor.ts delete mode 100644 src/signal/monitor/event-handler.inbound-contract.test.ts delete mode 100644 src/signal/monitor/event-handler.mention-gating.test.ts delete mode 100644 src/signal/monitor/event-handler.test-harness.ts delete mode 100644 src/signal/monitor/event-handler.ts delete mode 100644 src/signal/monitor/event-handler.types.ts delete mode 100644 src/signal/monitor/mentions.ts delete mode 100644 src/signal/probe.test.ts delete mode 100644 src/signal/probe.ts delete mode 100644 src/signal/reaction-level.ts delete mode 100644 src/signal/rpc-context.ts delete mode 100644 src/signal/send-reactions.test.ts delete mode 100644 src/signal/send-reactions.ts delete mode 100644 src/signal/send.ts delete mode 100644 src/signal/sse-reconnect.ts delete mode 100644 src/slack/accounts.ts delete mode 100644 src/slack/actions.blocks.test.ts delete mode 100644 src/slack/actions.read.test.ts delete mode 100644 src/slack/actions.ts delete mode 100644 src/slack/blocks-fallback.test.ts delete mode 100644 src/slack/blocks-fallback.ts delete mode 100644 src/slack/blocks-input.test.ts delete mode 100644 src/slack/blocks-input.ts delete mode 100644 src/slack/blocks.test-helpers.ts delete mode 100644 src/slack/channel-migration.test.ts delete mode 100644 src/slack/channel-migration.ts delete mode 100644 src/slack/client.test.ts delete mode 100644 src/slack/client.ts delete mode 100644 src/slack/directory-live.ts delete mode 100644 src/slack/draft-stream.test.ts delete mode 100644 src/slack/draft-stream.ts delete mode 100644 src/slack/format.test.ts delete mode 100644 src/slack/format.ts delete mode 100644 src/slack/http/index.ts delete mode 100644 src/slack/http/registry.test.ts delete mode 100644 src/slack/http/registry.ts delete mode 100644 src/slack/index.ts delete mode 100644 src/slack/message-actions.ts delete mode 100644 src/slack/modal-metadata.test.ts delete mode 100644 src/slack/modal-metadata.ts delete mode 100644 src/slack/monitor.test-helpers.ts delete mode 100644 src/slack/monitor.test.ts delete mode 100644 src/slack/monitor.threading.missing-thread-ts.test.ts delete mode 100644 src/slack/monitor.tool-result.test.ts delete mode 100644 src/slack/monitor.ts delete mode 100644 src/slack/monitor/allow-list.test.ts delete mode 100644 src/slack/monitor/allow-list.ts delete mode 100644 src/slack/monitor/auth.ts delete mode 100644 src/slack/monitor/channel-config.ts delete mode 100644 src/slack/monitor/commands.ts delete mode 100644 src/slack/monitor/context.ts delete mode 100644 src/slack/monitor/events.ts delete mode 100644 src/slack/monitor/events/channels.ts delete mode 100644 src/slack/monitor/events/interactions.test.ts delete mode 100644 src/slack/monitor/events/interactions.ts delete mode 100644 src/slack/monitor/events/members.ts delete mode 100644 src/slack/monitor/events/messages.ts delete mode 100644 src/slack/monitor/events/pins.ts delete mode 100644 src/slack/monitor/events/reactions.ts delete mode 100644 src/slack/monitor/media.test.ts delete mode 100644 src/slack/monitor/media.ts delete mode 100644 src/slack/monitor/message-handler.ts delete mode 100644 src/slack/monitor/message-handler/dispatch.streaming.test.ts delete mode 100644 src/slack/monitor/message-handler/dispatch.ts delete mode 100644 src/slack/monitor/message-handler/prepare.test.ts delete mode 100644 src/slack/monitor/message-handler/prepare.ts delete mode 100644 src/slack/monitor/message-handler/types.ts delete mode 100644 src/slack/monitor/monitor.test.ts delete mode 100644 src/slack/monitor/mrkdwn.test.ts delete mode 100644 src/slack/monitor/mrkdwn.ts delete mode 100644 src/slack/monitor/policy.ts delete mode 100644 src/slack/monitor/provider.ts delete mode 100644 src/slack/monitor/replies.ts delete mode 100644 src/slack/monitor/room-context.ts delete mode 100644 src/slack/monitor/slash.test-harness.ts delete mode 100644 src/slack/monitor/slash.test.ts delete mode 100644 src/slack/monitor/slash.ts delete mode 100644 src/slack/monitor/thread-resolution.ts delete mode 100644 src/slack/monitor/types.ts delete mode 100644 src/slack/probe.ts delete mode 100644 src/slack/resolve-channels.test.ts delete mode 100644 src/slack/resolve-channels.ts delete mode 100644 src/slack/resolve-users.ts delete mode 100644 src/slack/scopes.ts delete mode 100644 src/slack/send.blocks.test.ts delete mode 100644 src/slack/send.ts delete mode 100644 src/slack/stream-mode.test.ts delete mode 100644 src/slack/stream-mode.ts delete mode 100644 src/slack/streaming.ts delete mode 100644 src/slack/targets.test.ts delete mode 100644 src/slack/targets.ts delete mode 100644 src/slack/threading-tool-context.test.ts delete mode 100644 src/slack/threading-tool-context.ts delete mode 100644 src/slack/threading.test.ts delete mode 100644 src/slack/threading.ts delete mode 100644 src/slack/token.ts delete mode 100644 src/slack/types.ts delete mode 100644 src/telegram/accounts.test.ts delete mode 100644 src/telegram/accounts.ts delete mode 100644 src/telegram/allowed-updates.ts delete mode 100644 src/telegram/api-logging.ts delete mode 100644 src/telegram/audit.test.ts delete mode 100644 src/telegram/audit.ts delete mode 100644 src/telegram/bot-access.ts delete mode 100644 src/telegram/bot-handlers.ts delete mode 100644 src/telegram/bot-message-context.audio-transcript.test.ts delete mode 100644 src/telegram/bot-message-context.dm-threads.test.ts delete mode 100644 src/telegram/bot-message-context.dm-topic-threadid.test.ts delete mode 100644 src/telegram/bot-message-context.sender-prefix.test.ts delete mode 100644 src/telegram/bot-message-context.test-harness.ts delete mode 100644 src/telegram/bot-message-context.ts delete mode 100644 src/telegram/bot-message-dispatch.test.ts delete mode 100644 src/telegram/bot-message-dispatch.ts delete mode 100644 src/telegram/bot-message.test.ts delete mode 100644 src/telegram/bot-message.ts delete mode 100644 src/telegram/bot-native-command-menu.test.ts delete mode 100644 src/telegram/bot-native-command-menu.ts delete mode 100644 src/telegram/bot-native-commands.plugin-auth.test.ts delete mode 100644 src/telegram/bot-native-commands.session-meta.test.ts delete mode 100644 src/telegram/bot-native-commands.test.ts delete mode 100644 src/telegram/bot-native-commands.ts delete mode 100644 src/telegram/bot-updates.ts delete mode 100644 src/telegram/bot.create-telegram-bot.test-harness.ts delete mode 100644 src/telegram/bot.create-telegram-bot.test.ts delete mode 100644 src/telegram/bot.helpers.test.ts delete mode 100644 src/telegram/bot.media.downloads-media-file-path-no-file-download.e2e.test.ts delete mode 100644 src/telegram/bot.media.e2e-harness.ts delete mode 100644 src/telegram/bot.media.includes-location-text-ctx-fields-pins.e2e.test.ts delete mode 100644 src/telegram/bot.test.ts delete mode 100644 src/telegram/bot.ts delete mode 100644 src/telegram/bot/delivery.resolve-media-retry.test.ts delete mode 100644 src/telegram/bot/delivery.test.ts delete mode 100644 src/telegram/bot/delivery.ts delete mode 100644 src/telegram/bot/helpers.test.ts delete mode 100644 src/telegram/bot/helpers.ts delete mode 100644 src/telegram/bot/types.ts delete mode 100644 src/telegram/button-types.ts delete mode 100644 src/telegram/caption.ts delete mode 100644 src/telegram/draft-chunking.test.ts delete mode 100644 src/telegram/draft-chunking.ts delete mode 100644 src/telegram/draft-stream.test.ts delete mode 100644 src/telegram/draft-stream.ts delete mode 100644 src/telegram/fetch.test.ts delete mode 100644 src/telegram/fetch.ts delete mode 100644 src/telegram/format.test.ts delete mode 100644 src/telegram/format.ts delete mode 100644 src/telegram/format.wrap-md.test.ts delete mode 100644 src/telegram/group-access.ts delete mode 100644 src/telegram/group-migration.test.ts delete mode 100644 src/telegram/group-migration.ts delete mode 100644 src/telegram/inline-buttons.test.ts delete mode 100644 src/telegram/inline-buttons.ts delete mode 100644 src/telegram/model-buttons.test.ts delete mode 100644 src/telegram/model-buttons.ts delete mode 100644 src/telegram/monitor.test.ts delete mode 100644 src/telegram/monitor.ts delete mode 100644 src/telegram/network-config.test.ts delete mode 100644 src/telegram/network-config.ts delete mode 100644 src/telegram/network-errors.test.ts delete mode 100644 src/telegram/network-errors.ts delete mode 100644 src/telegram/outbound-params.ts delete mode 100644 src/telegram/probe.test.ts delete mode 100644 src/telegram/probe.ts delete mode 100644 src/telegram/proxy.test.ts delete mode 100644 src/telegram/proxy.ts delete mode 100644 src/telegram/reaction-level.test.ts delete mode 100644 src/telegram/reaction-level.ts delete mode 100644 src/telegram/reasoning-lane-coordinator.test.ts delete mode 100644 src/telegram/reasoning-lane-coordinator.ts delete mode 100644 src/telegram/send.proxy.test.ts delete mode 100644 src/telegram/send.test-harness.ts delete mode 100644 src/telegram/send.test.ts delete mode 100644 src/telegram/send.ts delete mode 100644 src/telegram/sent-message-cache.ts delete mode 100644 src/telegram/status-reaction-variants.test.ts delete mode 100644 src/telegram/status-reaction-variants.ts delete mode 100644 src/telegram/sticker-cache.test.ts delete mode 100644 src/telegram/sticker-cache.ts delete mode 100644 src/telegram/targets.test.ts delete mode 100644 src/telegram/targets.ts delete mode 100644 src/telegram/token.test.ts delete mode 100644 src/telegram/token.ts delete mode 100644 src/telegram/update-offset-store.test.ts delete mode 100644 src/telegram/update-offset-store.ts delete mode 100644 src/telegram/voice.test.ts delete mode 100644 src/telegram/voice.ts delete mode 100644 src/telegram/webhook.test.ts delete mode 100644 src/telegram/webhook.ts delete mode 100644 src/terminal/health-style.ts delete mode 100644 src/terminal/note.ts delete mode 100644 src/terminal/prompt-select-styled.test.ts delete mode 100644 src/terminal/prompt-select-styled.ts delete mode 100644 src/terminal/restore.test.ts delete mode 100644 src/terminal/stream-writer.test.ts delete mode 100644 src/terminal/stream-writer.ts delete mode 100644 src/terminal/table.test.ts delete mode 100644 src/terminal/table.ts delete mode 100644 src/test-helpers/state-dir-env.test.ts delete mode 100644 src/test-helpers/state-dir-env.ts delete mode 100644 src/test-helpers/workspace.ts delete mode 100644 src/test-utils/channel-plugins.test.ts delete mode 100644 src/test-utils/channel-plugins.ts delete mode 100644 src/test-utils/chunk-test-helpers.ts delete mode 100644 src/test-utils/command-runner.ts delete mode 100644 src/test-utils/env.test.ts delete mode 100644 src/test-utils/env.ts delete mode 100644 src/test-utils/exec-assertions.ts delete mode 100644 src/test-utils/fetch-mock.ts delete mode 100644 src/test-utils/imessage-test-plugin.ts delete mode 100644 src/test-utils/internal-hook-event-payload.ts delete mode 100644 src/test-utils/mock-http-response.ts delete mode 100644 src/test-utils/model-auth-mock.ts delete mode 100644 src/test-utils/ports.ts delete mode 100644 src/test-utils/provider-usage-fetch.ts delete mode 100644 src/test-utils/temp-home.test.ts delete mode 100644 src/test-utils/temp-home.ts delete mode 100644 src/test-utils/typed-cases.ts delete mode 100644 src/test-utils/vitest-mock-fn.ts delete mode 100644 src/tts/prepare-text.test.ts delete mode 100644 src/tts/tts-core.ts delete mode 100644 src/tts/tts.test.ts delete mode 100644 src/tts/tts.ts delete mode 100644 src/tui/commands.ts delete mode 100644 src/tui/components/assistant-message.ts delete mode 100644 src/tui/components/chat-log.test.ts delete mode 100644 src/tui/components/chat-log.ts delete mode 100644 src/tui/components/custom-editor.ts delete mode 100644 src/tui/components/filterable-select-list.ts delete mode 100644 src/tui/components/fuzzy-filter.ts delete mode 100644 src/tui/components/searchable-select-list.test.ts delete mode 100644 src/tui/components/searchable-select-list.ts delete mode 100644 src/tui/components/selectors.ts delete mode 100644 src/tui/components/tool-execution.ts delete mode 100644 src/tui/components/user-message.ts delete mode 100644 src/tui/gateway-chat.test.ts delete mode 100644 src/tui/gateway-chat.ts delete mode 100644 src/tui/theme/syntax-theme.ts delete mode 100644 src/tui/theme/theme.test.ts delete mode 100644 src/tui/theme/theme.ts delete mode 100644 src/tui/tui-command-handlers.test.ts delete mode 100644 src/tui/tui-command-handlers.ts delete mode 100644 src/tui/tui-event-handlers.test.ts delete mode 100644 src/tui/tui-event-handlers.ts delete mode 100644 src/tui/tui-formatters.test.ts delete mode 100644 src/tui/tui-formatters.ts delete mode 100644 src/tui/tui-input-history.test.ts delete mode 100644 src/tui/tui-local-shell.test.ts delete mode 100644 src/tui/tui-local-shell.ts delete mode 100644 src/tui/tui-overlays.test.ts delete mode 100644 src/tui/tui-overlays.ts delete mode 100644 src/tui/tui-session-actions.test.ts delete mode 100644 src/tui/tui-session-actions.ts delete mode 100644 src/tui/tui-status-summary.ts delete mode 100644 src/tui/tui-stream-assembler.test.ts delete mode 100644 src/tui/tui-stream-assembler.ts delete mode 100644 src/tui/tui-types.ts delete mode 100644 src/tui/tui-waiting.test.ts delete mode 100644 src/tui/tui-waiting.ts delete mode 100644 src/tui/tui.submit-handler.test.ts delete mode 100644 src/tui/tui.test.ts delete mode 100644 src/tui/tui.ts delete mode 100644 src/types/cli-highlight.d.ts delete mode 100644 src/types/lydell-node-pty.d.ts delete mode 100644 src/types/napi-rs-canvas.d.ts delete mode 100644 src/types/node-edge-tts.d.ts delete mode 100644 src/types/node-llama-cpp.d.ts delete mode 100644 src/types/osc-progress.d.ts delete mode 100644 src/types/pdfjs-dist-legacy.d.ts delete mode 100644 src/types/qrcode-terminal.d.ts delete mode 100644 src/utils.test.ts delete mode 100644 src/utils/account-id.ts delete mode 100644 src/utils/chunk-items.ts delete mode 100644 src/utils/delivery-context.test.ts delete mode 100644 src/utils/delivery-context.ts delete mode 100644 src/utils/directive-tags.test.ts delete mode 100644 src/utils/directive-tags.ts delete mode 100644 src/utils/fetch-timeout.ts delete mode 100644 src/utils/mask-api-key.test.ts delete mode 100644 src/utils/mask-api-key.ts delete mode 100644 src/utils/message-channel.test.ts delete mode 100644 src/utils/message-channel.ts delete mode 100644 src/utils/normalize-secret-input.ts delete mode 100644 src/utils/provider-utils.ts delete mode 100644 src/utils/queue-helpers.test.ts delete mode 100644 src/utils/queue-helpers.ts delete mode 100644 src/utils/reaction-level.test.ts delete mode 100644 src/utils/reaction-level.ts delete mode 100644 src/utils/run-with-concurrency.test.ts delete mode 100644 src/utils/run-with-concurrency.ts delete mode 100644 src/utils/safe-json.ts delete mode 100644 src/utils/shell-argv.ts delete mode 100644 src/utils/transcript-tools.test.ts delete mode 100644 src/utils/transcript-tools.ts delete mode 100644 src/utils/usage-format.test.ts delete mode 100644 src/utils/usage-format.ts delete mode 100644 src/utils/utils-misc.test.ts delete mode 100644 src/utils/with-timeout.ts delete mode 100644 src/version.test.ts delete mode 100644 src/web/accounts.test.ts delete mode 100644 src/web/accounts.ts delete mode 100644 src/web/accounts.whatsapp-auth.test.ts delete mode 100644 src/web/active-listener.ts delete mode 100644 src/web/auth-store.ts delete mode 100644 src/web/auto-reply.broadcast-groups.broadcasts-sequentially-configured-order.test.ts delete mode 100644 src/web/auto-reply.broadcast-groups.skips-unknown-broadcast-agent-ids-agents-list.test.ts delete mode 100644 src/web/auto-reply.broadcast-groups.test-harness.ts delete mode 100644 src/web/auto-reply.impl.ts delete mode 100644 src/web/auto-reply.test-harness.ts delete mode 100644 src/web/auto-reply.ts delete mode 100644 src/web/auto-reply.typing-controller-idle.test.ts delete mode 100644 src/web/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.e2e.test.ts delete mode 100644 src/web/auto-reply.web-auto-reply.last-route.test.ts delete mode 100644 src/web/auto-reply.web-auto-reply.monitor-logging.test.ts delete mode 100644 src/web/auto-reply.web-auto-reply.reconnects-after-connection-close.e2e.test.ts delete mode 100644 src/web/auto-reply/constants.ts delete mode 100644 src/web/auto-reply/deliver-reply.test.ts delete mode 100644 src/web/auto-reply/deliver-reply.ts delete mode 100644 src/web/auto-reply/heartbeat-runner.test.ts delete mode 100644 src/web/auto-reply/heartbeat-runner.ts delete mode 100644 src/web/auto-reply/loggers.ts delete mode 100644 src/web/auto-reply/mentions.ts delete mode 100644 src/web/auto-reply/monitor.ts delete mode 100644 src/web/auto-reply/monitor/ack-reaction.ts delete mode 100644 src/web/auto-reply/monitor/broadcast.ts delete mode 100644 src/web/auto-reply/monitor/commands.ts delete mode 100644 src/web/auto-reply/monitor/echo.ts delete mode 100644 src/web/auto-reply/monitor/group-activation.ts delete mode 100644 src/web/auto-reply/monitor/group-gating.ts delete mode 100644 src/web/auto-reply/monitor/group-members.ts delete mode 100644 src/web/auto-reply/monitor/last-route.ts delete mode 100644 src/web/auto-reply/monitor/message-line.ts delete mode 100644 src/web/auto-reply/monitor/on-message.ts delete mode 100644 src/web/auto-reply/monitor/peer.ts delete mode 100644 src/web/auto-reply/monitor/process-message.inbound-contract.test.ts delete mode 100644 src/web/auto-reply/monitor/process-message.ts delete mode 100644 src/web/auto-reply/session-snapshot.ts delete mode 100644 src/web/auto-reply/types.ts delete mode 100644 src/web/auto-reply/util.ts delete mode 100644 src/web/auto-reply/web-auto-reply-monitor.test.ts delete mode 100644 src/web/auto-reply/web-auto-reply-utils.test.ts delete mode 100644 src/web/inbound.media.test.ts delete mode 100644 src/web/inbound.test.ts delete mode 100644 src/web/inbound.ts delete mode 100644 src/web/inbound/access-control.test-harness.ts delete mode 100644 src/web/inbound/access-control.test.ts delete mode 100644 src/web/inbound/access-control.ts delete mode 100644 src/web/inbound/dedupe.ts delete mode 100644 src/web/inbound/extract.ts delete mode 100644 src/web/inbound/media.node.test.ts delete mode 100644 src/web/inbound/media.ts delete mode 100644 src/web/inbound/monitor.ts delete mode 100644 src/web/inbound/send-api.test.ts delete mode 100644 src/web/inbound/send-api.ts delete mode 100644 src/web/inbound/types.ts delete mode 100644 src/web/login-qr.test.ts delete mode 100644 src/web/login-qr.ts delete mode 100644 src/web/login.coverage.test.ts delete mode 100644 src/web/login.test.ts delete mode 100644 src/web/login.ts delete mode 100644 src/web/logout.test.ts delete mode 100644 src/web/media.test.ts delete mode 100644 src/web/media.ts delete mode 100644 src/web/monitor-inbox.allows-messages-from-senders-allowfrom-list.test.ts delete mode 100644 src/web/monitor-inbox.blocks-messages-from-unauthorized-senders-not-allowfrom.test.ts delete mode 100644 src/web/monitor-inbox.captures-media-path-image-messages.test.ts delete mode 100644 src/web/monitor-inbox.streams-inbound-messages.test.ts delete mode 100644 src/web/monitor-inbox.test-harness.ts delete mode 100644 src/web/outbound.test.ts delete mode 100644 src/web/outbound.ts delete mode 100644 src/web/qr-image.ts delete mode 100644 src/web/reconnect.test.ts delete mode 100644 src/web/reconnect.ts delete mode 100644 src/web/session.test.ts delete mode 100644 src/web/session.ts delete mode 100644 src/web/test-helpers.ts delete mode 100644 src/web/vcard.ts delete mode 100644 src/whatsapp/normalize.test.ts delete mode 100644 src/whatsapp/normalize.ts delete mode 100644 src/whatsapp/resolve-outbound-target.test.ts delete mode 100644 src/whatsapp/resolve-outbound-target.ts delete mode 100644 src/wizard/clack-prompter.test.ts delete mode 100644 src/wizard/clack-prompter.ts delete mode 100644 src/wizard/onboarding.completion.test.ts delete mode 100644 src/wizard/onboarding.completion.ts delete mode 100644 src/wizard/onboarding.finalize.ts delete mode 100644 src/wizard/onboarding.gateway-config.test.ts delete mode 100644 src/wizard/onboarding.gateway-config.ts delete mode 100644 src/wizard/onboarding.test.ts delete mode 100644 src/wizard/onboarding.ts delete mode 100644 src/wizard/onboarding.types.ts delete mode 100644 src/wizard/prompts.ts delete mode 100644 src/wizard/session.test.ts delete mode 100644 src/wizard/session.ts delete mode 100644 tsconfig.plugin-sdk.dts.json rename {src/shared => ui/src/ui/contracts}/chat-envelope.ts (99%) rename {src/gateway => ui/src/ui/contracts}/control-ui-contract.ts (100%) rename {src/shared => ui/src/ui/contracts}/device-auth.ts (100%) rename {src/infra/format-time => ui/src/ui/contracts}/format-duration.ts (50%) create mode 100644 ui/src/ui/contracts/format-relative.ts rename src/gateway/protocol/client-info.ts => ui/src/ui/contracts/gateway-client-info.ts (96%) rename src/gateway/device-auth.ts => ui/src/ui/contracts/gateway-device-auth.ts (100%) rename src/gateway/events.ts => ui/src/ui/contracts/gateway-events.ts (72%) rename {src/shared/text => ui/src/ui/contracts}/reasoning-tags.ts (100%) create mode 100644 ui/src/ui/contracts/session-key.ts rename {src/auto-reply/reply => ui/src/ui/contracts}/strip-inbound-meta.ts (71%) create mode 100644 ui/src/ui/contracts/tool-display-common.ts rename src/agents/tool-policy-shared.ts => ui/src/ui/contracts/tool-policy.ts (89%) create mode 100644 ui/src/ui/contracts/update.ts rename {src/shared => ui/src/ui/contracts}/usage-aggregates.ts (100%) diff --git a/.cursor/plans/bootstrap_dev_testing_0b5817e5.plan.md b/.cursor/plans/bootstrap_dev_testing_0b5817e5.plan.md new file mode 100644 index 00000000000..9db9264fac8 --- /dev/null +++ b/.cursor/plans/bootstrap_dev_testing_0b5817e5.plan.md @@ -0,0 +1,146 @@ +--- +name: Bootstrap dev testing +overview: Remove local OpenClaw paths from the web app, always use global `openclaw` binary, rename dev scripts to `ironclaw`, and verify bootstrap works standalone. +todos: + - id: remove-local-openclaw-agent-runner + content: Remove resolvePackageRoot, resolveOpenClawLaunch, IRONCLAW_USE_LOCAL_OPENCLAW from agent-runner.ts; spawn global `openclaw` directly + status: completed + - id: remove-local-openclaw-subagent-runs + content: Remove local script paths from subagent-runs.ts (sendGatewayAbortForSubagent, spawnSubagentMessage); use global `openclaw` instead + status: completed + - id: rename-pnpm-scripts + content: Rename `pnpm openclaw` to `pnpm ironclaw` and `openclaw:rpc` to `ironclaw:rpc` in package.json + status: completed + - id: update-agent-runner-tests + content: "Update agent-runner.test.ts: remove resolvePackageRoot tests, IRONCLAW_USE_LOCAL_OPENCLAW, update spawn assertions" + status: completed + - id: verify-builds-pass + content: Verify pnpm build, pnpm web:build, and workspace tests pass after changes + status: completed +isProject: false +--- + +# IronClaw Bootstrap: Clean Separation and Dev Testing + +## Architecture + +IronClaw is a frontend/UI/skills layer. OpenClaw is a separate, globally-installed runtime. IronClaw should NEVER bundle or run a local copy of OpenClaw. + +```mermaid +flowchart TD + npx["npx ironclaw (or ironclaw)"] --> entry["openclaw.mjs → dist/entry.js"] + entry --> runMain["run-main.ts: bare ironclaw → bootstrap"] + runMain --> delegate{"primary == bootstrap?"} + delegate -->|yes, keep local| bootstrap["bootstrapCommand()"] + delegate -->|no, delegate| globalOC["spawn openclaw ...args"] + bootstrap --> checkOC{"openclaw on PATH?"} + checkOC -->|yes| onboard + checkOC -->|no| prompt["Prompt: install openclaw globally?"] + prompt -->|yes| npmInstall["npm install -g openclaw"] + npmInstall --> onboard + onboard["openclaw onboard --install-daemon"] --> gatewayStart["Gateway starts + spawns web app"] + gatewayStart --> probe["waitForWebAppPort(3100)"] + probe --> openBrowser["Open http://localhost:3100"] +``` + +The bootstrap flow is correctly wired: + +- Bare `ironclaw` rewrites to `ironclaw bootstrap` +- `bootstrap` is never delegated to global `openclaw` +- `bootstrapCommand` calls `ensureOpenClawCliAvailable` which prompts to install +- Onboarding sets `gateway.webApp.enabled: true` +- Gateway starts the Next.js standalone server on port 3100 +- Bootstrap probes and opens the browser + +## Problem 1: Local OpenClaw paths in web app (must remove) + +`[apps/web/lib/agent-runner.ts](apps/web/lib/agent-runner.ts)` has `resolveOpenClawLaunch` which, when `IRONCLAW_USE_LOCAL_OPENCLAW=1`, resolves a local `scripts/run-node.mjs` or `openclaw.mjs` and spawns it with `node`. This contradicts the architecture: IronClaw should always spawn the global `openclaw` binary. + +The same pattern exists in `[apps/web/lib/subagent-runs.ts](apps/web/lib/subagent-runs.ts)` where `sendGatewayAbortForSubagent` and `spawnSubagentMessage` hardcode `node ` paths. + +**Fix:** + +- Remove `IRONCLAW_USE_LOCAL_OPENCLAW`, `resolveOpenClawLaunch`, `resolvePackageRoot`, and `OpenClawLaunch` type from `agent-runner.ts` +- All spawn calls become `spawn("openclaw", [...args], { env, stdio })` +- In `subagent-runs.ts`: replace `node gateway call ...` with `openclaw gateway call ...` +- Remove `resolvePackageRoot` import from `subagent-runs.ts` + +## Problem 2: `pnpm openclaw` script name is wrong + +`package.json` has `"openclaw": "node scripts/run-node.mjs"`. This repo IS IronClaw, not OpenClaw. + +**Fix:** Rename to `"ironclaw": "node scripts/run-node.mjs"`. Also `"openclaw:rpc"` to `"ironclaw:rpc"`. + +## Dev workflow (after fixes) + +```bash +# Prerequisite: install OpenClaw globally (one-time) +npm install -g openclaw + +# Run IronClaw bootstrap (installs/configures everything, opens UI) +pnpm ironclaw + +# Or for web UI dev only: +openclaw --profile ironclaw gateway --port 18789 # Terminal 1 +pnpm web:dev # Terminal 2 +``` + +## Implementation details + +### 1. Simplify agent-runner.ts spawning + +Remove ~40 lines (`resolvePackageRoot`, `OpenClawLaunch`, `resolveOpenClawLaunch`). Both `spawnLegacyAgentProcess` and `spawnLegacyAgentSubscribeProcess` become: + +```typescript +function spawnLegacyAgentProcess(message: string, agentSessionId?: string) { + const args = ["agent", "--agent", "main", "--message", message, "--stream-json"]; + if (agentSessionId) { + const sessionKey = `agent:main:web:${agentSessionId}`; + args.push("--session-key", sessionKey, "--lane", "web", "--channel", "webchat"); + } + const profile = getEffectiveProfile(); + const workspace = resolveWorkspaceRoot(); + return spawn("openclaw", args, { + env: { + ...process.env, + ...(profile ? { OPENCLAW_PROFILE: profile } : {}), + ...(workspace ? { OPENCLAW_WORKSPACE: workspace } : {}), + }, + stdio: ["ignore", "pipe", "pipe"], + }); +} +``` + +### 2. Simplify subagent-runs.ts spawning + +`sendGatewayAbortForSubagent` and `spawnSubagentMessage` both have this pattern: + +```typescript +const root = resolvePackageRoot(); +const devScript = join(root, "scripts", "run-node.mjs"); +const prodScript = join(root, "openclaw.mjs"); +const scriptPath = existsSync(devScript) ? devScript : prodScript; +spawn("node", [scriptPath, "gateway", "call", ...], { cwd: root, ... }); +``` + +Replace with: + +```typescript +spawn("openclaw", ["gateway", "call", ...], { env: process.env, ... }); +``` + +### 3. Update agent-runner.test.ts + +- Remove `process.env.IRONCLAW_USE_LOCAL_OPENCLAW = "1"` from `beforeEach` +- Remove entire `resolvePackageRoot` describe block (~5 tests) +- The "uses global openclaw by default" test becomes the only spawn behavior test +- Update mock assertions: command is always `"openclaw"`, no `prefixArgs` + +### 4. Rename package.json scripts + +```diff +- "openclaw": "node scripts/run-node.mjs", +- "openclaw:rpc": "node scripts/run-node.mjs agent --mode rpc --json", ++ "ironclaw": "node scripts/run-node.mjs", ++ "ironclaw:rpc": "node scripts/run-node.mjs agent --mode rpc --json", +``` diff --git a/.cursor/plans/ironclaw_frontend_split_1c02d591.plan.md b/.cursor/plans/ironclaw_frontend_split_1c02d591.plan.md new file mode 100644 index 00000000000..e921f9bfba9 --- /dev/null +++ b/.cursor/plans/ironclaw_frontend_split_1c02d591.plan.md @@ -0,0 +1,122 @@ +--- +name: ironclaw_frontend_split +overview: Re-architect IronClaw into a separate frontend/bootstrap CLI that runs on top of OpenClaw, while preserving current IronClaw UX/features through compatibility adapters and phased cutover. Keep OpenClaw Gateway on its standard port and expose IronClaw UI on localhost:3100 with user-approved OpenClaw updates. +todos: + - id: freeze-migration-contract-tests + content: Add migration contract tests covering stream-json, session subscribe, profile/workspace resolution, and Dench always-on skill behavior + status: completed + - id: build-ironclaw-bootstrap-layer + content: Implement IronClaw bootstrap path that verifies/installs OpenClaw, runs onboard --install-daemon for profile ironclaw, and launches UI on 3100 with explicit update approval + status: completed + - id: extract-gateway-stream-client + content: Extract reusable gateway streaming client from agent-via-gateway and wire web chat APIs to it instead of spawning CLI processes + status: completed + - id: unify-profile-storage-paths + content: Align apps/web workspace and web-chat storage resolution with src/config/paths + src/cli/profile semantics and add migration for existing UI state + status: completed + - id: externalize-ironclaw-product-layer + content: Move IronClaw prompt/skill packaging out of core defaults into a product adapter/skill pack while preserving inject behavior + status: completed + - id: harden-onboarding-and-rollout + content: Add first-run diagnostics, side-by-side safety checks, staged feature flags, and fallback path before full cutover + status: completed +isProject: false +--- + +# IronClaw Frontend-Only Rewrite (No-Break Migration) + +## Locked Decisions + +- Runtime topology: OpenClaw Gateway stays on its normal port (default `18789`), IronClaw UI runs on `3100`. +- Update policy: install OpenClaw once, then update only when user explicitly approves. + +## Target Architecture + +```mermaid +flowchart LR + ironclawCli[IronclawCLI] --> bootstrapManager[BootstrapManager] + bootstrapManager --> openclawCli[OpenClawCLI] + bootstrapManager --> ironclawProfile[IronclawProfileState] + ironclawUi[IronclawUI3100] --> gatewayWs[GatewayWS18789] + gatewayWs --> openclawCore[OpenClawCore] + openclawCore --> workspaceData[WorkspaceAndChatStorage] + ironclawSkills[IronclawSkillsPack] --> openclawCore +``` + +## Why This Rewrite Is Needed (from current code) + +- Web chat currently spawns the CLI directly in `[apps/web/lib/agent-runner.ts](apps/web/lib/agent-runner.ts)` (`openclaw.mjs` + `--stream-json`), which tightly couples UI and CLI process model. +- IronClaw product content is hardcoded in core prompt generation in `[src/agents/system-prompt.ts](src/agents/system-prompt.ts)` (`buildIronclawSection`). +- Web workspace/profile logic in `[apps/web/lib/workspace.ts](apps/web/lib/workspace.ts)` is not aligned with core state-dir resolution in `[src/config/paths.ts](src/config/paths.ts)` and profile env wiring in `[src/cli/profile.ts](src/cli/profile.ts)`. +- Bootstrapping and daemon install logic already exists and should be reused, not forked: `[src/commands/onboard.ts](src/commands/onboard.ts)`, `[src/wizard/onboarding.finalize.ts](src/wizard/onboarding.finalize.ts)`, `[src/commands/daemon-install-helpers.ts](src/commands/daemon-install-helpers.ts)`. + +## Implementation Plan (Phased, Strangler Pattern) + +## Phase 1: Freeze Behavior With Contract Tests + +- Add regression tests that codify current IronClaw-critical behavior before changing architecture: + - stream transport + session subscribe behavior (`--stream-json`, `--subscribe-session-key`) from `[src/cli/program/register.agent.ts](src/cli/program/register.agent.ts)` and `[src/commands/agent-via-gateway.ts](src/commands/agent-via-gateway.ts)`. + - workspace/profile + web-chat path behavior from `[apps/web/lib/workspace.ts](apps/web/lib/workspace.ts)` and `[apps/web/lib/workspace-profiles.test.ts](apps/web/lib/workspace-profiles.test.ts)`. + - always-on injected skill behavior for Dench skill loading. +- Produce a “must-pass” migration suite so we can safely refactor internals without user-visible regressions. + +## Phase 2: Create IronClaw Bootstrap Layer (Separate CLI Behavior) + +- Introduce a bootstrap command path for `ironclaw` that: + - verifies OpenClaw availability; + - installs OpenClaw if missing (first-run flow); + - runs onboarding (`openclaw --profile ironclaw onboard --install-daemon`); + - starts/opens UI at `http://localhost:3100`. +- Reuse existing onboarding/daemon machinery instead of duplicating logic in a second stack: + - `[src/commands/onboard.ts](src/commands/onboard.ts)` + - `[src/wizard/onboarding.finalize.ts](src/wizard/onboarding.finalize.ts)` + - `[src/daemon/constants.ts](src/daemon/constants.ts)` +- Add explicit update prompt UX (policy #2): no silent auto-upgrades. + +## Phase 3: Decouple UI Streaming From CLI Process Spawn + +- Extract gateway streaming client logic from `[src/commands/agent-via-gateway.ts](src/commands/agent-via-gateway.ts)` into a reusable library module. +- Migrate web chat runtime from “spawn CLI process” to “connect directly to gateway stream API” in: + - `[apps/web/lib/agent-runner.ts](apps/web/lib/agent-runner.ts)` + - `[apps/web/lib/active-runs.ts](apps/web/lib/active-runs.ts)` + - `[apps/web/app/api/chat/route.ts](apps/web/app/api/chat/route.ts)` + - `[apps/web/app/api/chat/stream/route.ts](apps/web/app/api/chat/stream/route.ts)` +- Keep a temporary compatibility flag for rollback during rollout. + +## Phase 4: Unify Profile + Storage Resolution + +- Replace web-only state resolution logic with shared core semantics from `[src/config/paths.ts](src/config/paths.ts)` and profile env behavior from `[src/cli/profile.ts](src/cli/profile.ts)`. +- Normalize chat/workspace storage to profile-scoped OpenClaw state consistently (no split-brain between `~/.openclaw-*` and `~/.openclaw/web-chat-*` behaviors). +- Add one-time migration for existing `.ironclaw-ui-state.json` / web-chat index data to the new canonical profile paths. + +## Phase 5: Move IronClaw Product Layer Outside Core + +- Externalize IronClaw-specific identity/prompt sections currently in `[src/agents/system-prompt.ts](src/agents/system-prompt.ts)` behind a product adapter/config hook. +- Move Dench/IronClaw always-on skill packaging out of core bundled defaults and load it as IronClaw-provided skill pack. +- Keep `inject` capability in core, but remove hardcoded IronClaw assumptions from default OpenClaw prompt path. + +## Phase 6: Onboarding UX Hardening (Zero-Conf Side-by-Side) + +- First-run checklist in IronClaw bootstrap: + - OpenClaw installed and version shown + - profile verified (`ironclaw`) + - gateway reachable + - UI reachable at `3100` + - clear remediation output for port/token/device mismatch +- Ensure side-by-side safety with OpenClaw main profile (no daemon overwrite, no shared session collisions). + +## Phase 7: Rollout and Safety Gates + +- Roll out behind feature gates with staged enablement: + 1. internal + 2. opt-in beta + 3. default +- Block full cutover until migration suite and onboarding E2E checks pass. +- Keep legacy path available for one release as emergency fallback. + +## Definition of Done + +- `npx ironclaw` bootstraps OpenClaw (if missing), runs guided onboarding, and reliably opens/serves UI on `localhost:3100`. +- IronClaw runs alongside default OpenClaw without daemon/profile/token collisions. +- Stream, workspaces, always-on skills, and storage features remain intact during and after migration. +- OpenClaw upgrades do not break IronClaw because integration is through stable gateway/CLI interfaces, not forked internals. diff --git a/.cursor/plans/strict-external-openclaw_7c0d1717.plan.md b/.cursor/plans/strict-external-openclaw_7c0d1717.plan.md new file mode 100644 index 00000000000..dc5a8a469c5 --- /dev/null +++ b/.cursor/plans/strict-external-openclaw_7c0d1717.plan.md @@ -0,0 +1,135 @@ +--- +name: strict-external-openclaw +overview: Convert this repo into an IronClaw-only package that uses globally installed `openclaw` as an external runtime, with strict removal of bundled OpenClaw core source and full cutover of CLI/web flows to external contracts (CLI + gateway protocol). +todos: + - id: ironclaw-boundary-definition + content: Lock IronClaw-only module boundary and mark all OpenClaw-owned code paths for removal + status: completed + - id: remove-cross-imports + content: Eliminate `apps/web` and `ui` internal imports of local OpenClaw source by replacing with IronClaw-local adapters over CLI/gateway contracts + status: completed + - id: cli-delegation-cutover + content: Implement IronClaw command delegation to global `openclaw` for non-bootstrap commands + status: completed + - id: peer-global-packaging + content: Update package metadata/docs to enforce peer + global OpenClaw installation model + status: completed + - id: delete-openclaw-core-source + content: Remove OpenClaw core runtime source and obsolete shims/scripts from this repository + status: completed + - id: release-pipeline-realignment + content: Rework build/release checks to publish IronClaw-only artifacts with strict external OpenClaw dependency + status: completed + - id: full-cutover-validation + content: Run full test/smoke matrix and keep one-release emergency fallback + status: completed +isProject: false +--- + +# Strict External OpenClaw Cutover + +## Goal + +- Make this repository IronClaw-only. +- Remove OpenClaw core runtime code from this repo. +- Depend on globally installed `openclaw` (peer/global model), not bundled source. +- Keep IronClaw UX: `npx ironclaw` bootstrap + UI on `3100` over gateway `18789`. + +Reference upstream runtime source of truth: [openclaw/openclaw](https://github.com/openclaw/openclaw). + +## Non-Negotiable Constraints + +- No vendored OpenClaw core runtime in this repo after cutover. +- `openclaw` consumed as global binary requirement (peer + global install), not shipped here. +- IronClaw must communicate with OpenClaw only via stable external contracts: + - `openclaw` CLI commands + - Gateway WebSocket protocol + +## Target Architecture + +```mermaid +flowchart LR + ironclawCli[ironclawCli] --> bootstrap[bootstrapFlow] + bootstrap --> openclawBin[globalOpenclawBin] + ironclawUi[ironclawUi3100] --> gatewayWs[gatewayWs18789] + gatewayWs --> openclawRuntime[openclawRuntimeExternal] +``` + +## Phase 1: Define IronClaw-Only Boundary + +- Keep only IronClaw-owned surfaces: + - product layer and branding + - bootstrap/orchestration CLI + - web UI and workspace UX +- Mark OpenClaw-owned modules for removal from this repo. +- Primary files to re-boundary: + - [package.json](package.json) + - [openclaw.mjs](openclaw.mjs) + - [src/cli/run-main.ts](src/cli/run-main.ts) + - [src/cli/bootstrap.ts](src/cli/bootstrap.ts) + - [src/product/adapter.ts](src/product/adapter.ts) + +## Phase 2: Replace Internal Core Imports With External Contracts + +- Remove all `apps/web` / `ui` imports that currently reach into local OpenClaw source internals. +- Re-implement required behavior in IronClaw-local adapters using gateway protocol + local helpers. +- First critical edge: + - [apps/web/lib/agent-runner.ts](apps/web/lib/agent-runner.ts) +- Also migrate `ui/src/ui/**` consumers that import `../../../../src/*` internals. + +## Phase 3: CLI Delegation Model + +- Make IronClaw CLI own only bootstrap/product UX. +- Delegate non-bootstrap command execution to global `openclaw` binary. +- Keep rollout/fallback env gates while switching default to external execution. +- Primary files: + - [src/cli/run-main.ts](src/cli/run-main.ts) + - [src/cli/run-main.test.ts](src/cli/run-main.test.ts) + - [src/cli/bootstrap.ts](src/cli/bootstrap.ts) + +## Phase 4: Package + Dependency Model (Peer + Global) + +- Update package metadata so IronClaw does not bundle OpenClaw runtime code. +- Add peer requirement/documentation for global `openclaw` presence. +- Ensure bootstrap validates and remediates missing global CLI (`npm i -g openclaw`). +- Primary files: + - [package.json](package.json) + - [docs/reference/RELEASING.md](docs/reference/RELEASING.md) + - install/update docs under `docs/` + +## Phase 5: Remove OpenClaw Core Source From Repo + +- Delete OpenClaw-owned runtime modules from this repository once delegation and adapters are complete. +- Retain only IronClaw package code and tests. +- Remove obsolete build/release scripts that assume monolithic runtime shipping. +- Primary files/areas: + - `src/` (OpenClaw runtime portions) + - scripts that package core runtime artifacts + - compatibility shims that re-export local OpenClaw code + +## Phase 6: Build/Release Pipeline Realignment + +- Adjust build outputs to ship IronClaw only. +- Remove checks that require bundled OpenClaw dist artifacts. +- Keep web standalone packaging + bootstrap checks. +- Primary files: + - [tsdown.config.ts](tsdown.config.ts) + - [scripts/release-check.ts](scripts/release-check.ts) + - [scripts/deploy.sh](scripts/deploy.sh) + +## Verification Gates + +- `pnpm tsgo`, lint, and formatting pass after source removals. +- Unit/e2e coverage for: + - bootstrap diagnostics and remediation + - command delegation to global `openclaw` + - gateway streaming from IronClaw UI +- End-to-end smoke: + - clean machine with only global `openclaw` + - `npx ironclaw` bootstrap succeeds + - UI works on `3100`, gateway on `18789`, no profile/daemon collisions. + +## Rollout Safety + +- Keep emergency fallback env switch for one release window. +- Remove fallback after successful release telemetry and smoke matrix pass. diff --git a/README.md b/README.md index c19cff4f396..6d951843a26 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ **Runtime: Node 22+** ```bash -npm i -g ironclaw -ironclaw onboard --install-daemon +npm i -g openclaw +npx ironclaw ``` Opens at `localhost:3100`. That's it. @@ -43,9 +43,9 @@ Opens at `localhost:3100`. That's it. Three steps total: ``` -1. npm i -g ironclaw -2. ironclaw onboard -3. ironclaw gateway start +1. npm i -g openclaw +2. npx ironclaw +3. bootstrap opens UI on localhost:3100 ``` --- diff --git a/apps/web/app/api/chat/chat.test.ts b/apps/web/app/api/chat/chat.test.ts index 22e5a51c918..f035fc7dcee 100644 --- a/apps/web/app/api/chat/chat.test.ts +++ b/apps/web/app/api/chat/chat.test.ts @@ -159,7 +159,8 @@ describe("Chat API routes", () => { }); it("aborts run and returns result", async () => { - const { abortRun } = await import("@/lib/active-runs"); + const { abortRun, getActiveRun } = await import("@/lib/active-runs"); + vi.mocked(getActiveRun).mockReturnValue({ status: "running" } as never); vi.mocked(abortRun).mockReturnValue(true); const { POST } = await import("./stop/route.js"); diff --git a/apps/web/app/api/profiles/route.test.ts b/apps/web/app/api/profiles/route.test.ts index c64108838d6..67e71de4ab5 100644 --- a/apps/web/app/api/profiles/route.test.ts +++ b/apps/web/app/api/profiles/route.test.ts @@ -115,15 +115,17 @@ describe("profiles API", () => { it("discovers workspace- directories", async () => { const { existsSync: es, readdirSync: rds } = await import("node:fs"); + const devStateDir = join("/home/testuser", ".openclaw-dev"); + const devWorkspaceDir = join(devStateDir, "workspace"); vi.mocked(es).mockImplementation((p) => { const s = String(p); return ( s === STATE_DIR || - s === join(STATE_DIR, "workspace-dev") + s === devWorkspaceDir ); }); vi.mocked(rds).mockReturnValue([ - makeDirent("workspace-dev", true), + makeDirent(".openclaw-dev", true), ] as unknown as Dirent[]); const response = await callGet(); @@ -206,7 +208,7 @@ describe("profiles API", () => { const response = await callSwitch({ profile: "test" }); const json = await response.json(); - expect(json.stateDir).toBe(STATE_DIR); + expect(json.stateDir).toBe(join("/home/testuser", ".openclaw-test")); }); }); }); diff --git a/apps/web/app/api/workspace/objects.test.ts b/apps/web/app/api/workspace/objects.test.ts index ce2da6a62cf..6b97b35a154 100644 --- a/apps/web/app/api/workspace/objects.test.ts +++ b/apps/web/app/api/workspace/objects.test.ts @@ -11,6 +11,7 @@ vi.mock("@/lib/workspace", () => ({ duckdbQueryOnFile: vi.fn(() => []), duckdbExecOnFile: vi.fn(() => true), findDuckDBForObject: vi.fn(() => null), + getObjectViews: vi.fn(() => ({ views: [], activeView: null })), parseRelationValue: vi.fn((v: string | null) => (v ? [v] : [])), resolveDuckdbBin: vi.fn(() => null), discoverDuckDBPaths: vi.fn(() => []), @@ -27,6 +28,7 @@ describe("Workspace Objects API", () => { duckdbQueryOnFile: vi.fn(() => []), duckdbExecOnFile: vi.fn(() => true), findDuckDBForObject: vi.fn(() => null), + getObjectViews: vi.fn(() => ({ views: [], activeView: null })), parseRelationValue: vi.fn((v: string | null) => (v ? [v] : [])), resolveDuckdbBin: vi.fn(() => null), discoverDuckDBPaths: vi.fn(() => []), diff --git a/apps/web/app/api/workspace/tree-browse.test.ts b/apps/web/app/api/workspace/tree-browse.test.ts index 3d908100e8e..0f59f1a4c12 100644 --- a/apps/web/app/api/workspace/tree-browse.test.ts +++ b/apps/web/app/api/workspace/tree-browse.test.ts @@ -17,6 +17,8 @@ vi.mock("node:os", () => ({ // Mock workspace vi.mock("@/lib/workspace", () => ({ resolveWorkspaceRoot: vi.fn(() => null), + resolveOpenClawStateDir: vi.fn(() => "/home/testuser/.openclaw"), + getEffectiveProfile: vi.fn(() => "default"), parseSimpleYaml: vi.fn(() => ({})), duckdbQueryAll: vi.fn(() => []), duckdbQueryAllAsync: vi.fn(async () => []), @@ -55,6 +57,8 @@ describe("Workspace Tree & Browse API", () => { })); vi.mock("@/lib/workspace", () => ({ resolveWorkspaceRoot: vi.fn(() => null), + resolveOpenClawStateDir: vi.fn(() => "/home/testuser/.openclaw"), + getEffectiveProfile: vi.fn(() => "default"), parseSimpleYaml: vi.fn(() => ({})), duckdbQueryAll: vi.fn(() => []), duckdbQueryAllAsync: vi.fn(async () => []), @@ -74,7 +78,8 @@ describe("Workspace Tree & Browse API", () => { describe("GET /api/workspace/tree", () => { it("returns tree with exists=false when no workspace root", async () => { const { GET } = await import("./tree/route.js"); - const res = await GET(); + const req = new Request("http://localhost/api/workspace/tree"); + const res = await GET(req); const json = await res.json(); expect(json.exists).toBe(false); expect(json.tree).toEqual([]); @@ -96,7 +101,8 @@ describe("Workspace Tree & Browse API", () => { }); const { GET } = await import("./tree/route.js"); - const res = await GET(); + const req = new Request("http://localhost/api/workspace/tree"); + const res = await GET(req); const json = await res.json(); expect(json.exists).toBe(true); expect(json.tree.length).toBeGreaterThan(0); @@ -109,7 +115,8 @@ describe("Workspace Tree & Browse API", () => { vi.mocked(mockExists).mockReturnValue(true); const { GET } = await import("./tree/route.js"); - const res = await GET(); + const req = new Request("http://localhost/api/workspace/tree"); + const res = await GET(req); const json = await res.json(); expect(json.workspaceRoot).toBe("/ws"); }); diff --git a/apps/web/lib/active-runs.ts b/apps/web/lib/active-runs.ts index 0bc2282b437..34a9f415491 100644 --- a/apps/web/lib/active-runs.ts +++ b/apps/web/lib/active-runs.ts @@ -8,7 +8,7 @@ * - Messages are written to persistent sessions as they arrive. * - New HTTP connections can re-attach to a running stream. */ -import { type ChildProcess, spawn } from "node:child_process"; +import { spawn } from "node:child_process"; import { createInterface } from "node:readline"; import { join } from "node:path"; import { @@ -19,10 +19,10 @@ import { } from "node:fs"; import { resolveWebChatDir, resolveOpenClawStateDir } from "./workspace"; import { + type AgentProcessHandle, type AgentEvent, spawnAgentProcess, spawnAgentSubscribeProcess, - resolvePackageRoot, extractToolResult, buildToolOutput, parseAgentErrorMessage, @@ -59,7 +59,7 @@ type AccumulatedMessage = { export type ActiveRun = { sessionId: string; - childProcess: ChildProcess; + childProcess: AgentProcessHandle; eventBuffer: SseEvent[]; subscribers: Set; accumulated: AccumulatedMessage; @@ -74,7 +74,7 @@ export type ActiveRun = { /** @internal last globalSeq seen from the gateway event stream */ lastGlobalSeq: number; /** @internal subscribe child process for waiting-for-subagents continuation */ - _subscribeProcess?: ChildProcess | null; + _subscribeProcess?: AgentProcessHandle | null; /** Full gateway session key (used for subagent subscribe-only runs) */ sessionKey?: string; /** Parent web session ID (for subagent runs) */ @@ -251,14 +251,10 @@ export function reactivateSubscribeRun(sessionKey: string): boolean { */ export function sendSubagentFollowUp(sessionKey: string, message: string): boolean { try { - const root = resolvePackageRoot(); - const devScript = join(root, "scripts", "run-node.mjs"); - const prodScript = join(root, "openclaw.mjs"); - const scriptPath = existsSync(devScript) ? devScript : prodScript; const child = spawn( - "node", + "openclaw", [ - scriptPath, "gateway", "call", "agent", + "gateway", "call", "agent", "--params", JSON.stringify({ message, sessionKey, idempotencyKey: `follow-${Date.now()}-${Math.random().toString(36).slice(2)}`, @@ -266,8 +262,9 @@ export function sendSubagentFollowUp(sessionKey: string, message: string): boole }), "--json", "--timeout", "10000", ], - { cwd: root, env: { ...process.env }, stdio: "ignore", detached: true }, + { env: { ...process.env }, stdio: "ignore", detached: true }, ); + child.on("error", () => {}); child.unref(); return true; } catch { @@ -359,16 +356,10 @@ export function abortRun(sessionId: string): boolean { */ function sendGatewayAbort(sessionId: string): void { try { - const root = resolvePackageRoot(); - const devScript = join(root, "scripts", "run-node.mjs"); - const prodScript = join(root, "openclaw.mjs"); - const scriptPath = existsSync(devScript) ? devScript : prodScript; - const sessionKey = `agent:main:web:${sessionId}`; const child = spawn( - "node", + "openclaw", [ - scriptPath, "gateway", "call", "chat.abort", @@ -379,12 +370,12 @@ function sendGatewayAbort(sessionId: string): void { "4000", ], { - cwd: root, env: { ...process.env }, stdio: "ignore", detached: true, }, ); + child.on("error", () => {}); // Let the abort process run independently — don't block on it. child.unref(); } catch { @@ -510,7 +501,7 @@ export function startSubscribeRun(params: { */ function wireSubscribeOnlyProcess( run: ActiveRun, - child: ChildProcess, + child: AgentProcessHandle, sessionKey: string, ): void { let idCounter = 0; @@ -1361,7 +1352,8 @@ function wireChildProcess(run: ActiveRun): void { if (run.status !== "running") {return;} console.error("[active-runs] Child process error:", err); - emitError(`Failed to start agent: ${err.message}`); + const message = err instanceof Error ? err.message : String(err); + emitError(`Failed to start agent: ${message}`); run.status = "error"; flushPersistence(run); for (const sub of run.subscribers) { diff --git a/apps/web/lib/agent-runner.test.ts b/apps/web/lib/agent-runner.test.ts index ed5c809388b..70ef4e1400e 100644 --- a/apps/web/lib/agent-runner.test.ts +++ b/apps/web/lib/agent-runner.test.ts @@ -1,10 +1,13 @@ import { spawn, type ChildProcess } from "node:child_process"; -import { join } from "node:path"; import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; -vi.mock("node:child_process", () => ({ spawn: vi.fn() })); -vi.mock("node:fs", () => ({ existsSync: vi.fn() })); - +vi.mock("node:child_process", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + spawn: vi.fn(), + }; +}); const spawnMock = vi.mocked(spawn); /** Minimal mock ChildProcess for testing. */ @@ -49,8 +52,13 @@ describe("agent-runner", () => { vi.restoreAllMocks(); process.env = { ...originalEnv }; // Re-wire mocks after resetModules - vi.mock("node:child_process", () => ({ spawn: vi.fn() })); - vi.mock("node:fs", () => ({ existsSync: vi.fn() })); + vi.mock("node:child_process", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + spawn: vi.fn(), + }; + }); }); afterEach(() => { @@ -58,177 +66,29 @@ describe("agent-runner", () => { vi.restoreAllMocks(); }); - // ── resolvePackageRoot ────────────────────────────────────────────── - - describe("resolvePackageRoot", () => { - it("uses OPENCLAW_ROOT env var when set and valid", async () => { - process.env.OPENCLAW_ROOT = "/opt/ironclaw"; - const { existsSync: mockExists } = await import("node:fs"); - vi.mocked(mockExists).mockImplementation( - (p) => String(p) === "/opt/ironclaw", - ); - - const { resolvePackageRoot } = await import("./agent-runner.js"); - expect(resolvePackageRoot()).toBe("/opt/ironclaw"); - }); - - it("ignores OPENCLAW_ROOT when the path does not exist", async () => { - process.env.OPENCLAW_ROOT = "/nonexistent/path"; - - const { existsSync: mockExists } = await import("node:fs"); - // OPENCLAW_ROOT doesn't exist, but we'll find openclaw.mjs by walking up - vi.mocked(mockExists).mockImplementation((p) => { - return String(p) === join("/pkg", "openclaw.mjs"); - }); - - vi.spyOn(process, "cwd").mockReturnValue("/pkg/apps/web"); - - const { resolvePackageRoot } = await import("./agent-runner.js"); - expect(resolvePackageRoot()).toBe("/pkg"); - }); - - it("finds package root via openclaw.mjs in production (standalone cwd)", async () => { - delete process.env.OPENCLAW_ROOT; - - const { existsSync: mockExists } = await import("node:fs"); - vi.mocked(mockExists).mockImplementation((p) => { - // Only openclaw.mjs exists at the real package root - return String(p) === join("/pkg", "openclaw.mjs"); - }); - - // Standalone mode: cwd is deep inside .next/standalone - vi.spyOn(process, "cwd").mockReturnValue( - "/pkg/apps/web/.next/standalone/apps/web", - ); - - const { resolvePackageRoot } = await import("./agent-runner.js"); - expect(resolvePackageRoot()).toBe("/pkg"); - }); - - it("finds package root via scripts/run-node.mjs in dev workspace", async () => { - delete process.env.OPENCLAW_ROOT; - - const { existsSync: mockExists } = await import("node:fs"); - vi.mocked(mockExists).mockImplementation((p) => { - return String(p) === join("/repo", "scripts", "run-node.mjs"); - }); - - vi.spyOn(process, "cwd").mockReturnValue("/repo/apps/web"); - - const { resolvePackageRoot } = await import("./agent-runner.js"); - expect(resolvePackageRoot()).toBe("/repo"); - }); - - it("falls back to legacy 2-levels-up heuristic", async () => { - delete process.env.OPENCLAW_ROOT; - - const { existsSync: mockExists } = await import("node:fs"); - vi.mocked(mockExists).mockReturnValue(false); // nothing found - - vi.spyOn(process, "cwd").mockReturnValue("/unknown/apps/web"); - - const { resolvePackageRoot } = await import("./agent-runner.js"); - expect(resolvePackageRoot()).toBe( - join("/unknown/apps/web", "..", ".."), - ); - }); - }); - // ── spawnAgentProcess ────────────────────────────────────────────── describe("spawnAgentProcess", () => { - it("uses scripts/run-node.mjs in dev when both scripts exist", async () => { - delete process.env.OPENCLAW_ROOT; - - const { existsSync: mockExists } = await import("node:fs"); + it("always uses global openclaw", async () => { const { spawn: mockSpawn } = await import("node:child_process"); - - vi.mocked(mockExists).mockImplementation((p) => { - const s = String(p); - // Package root found via scripts/run-node.mjs - if (s === join("/repo", "scripts", "run-node.mjs")) {return true;} - // openclaw.mjs also exists in dev - if (s === join("/repo", "openclaw.mjs")) {return true;} - return false; - }); - - vi.spyOn(process, "cwd").mockReturnValue("/repo/apps/web"); - const child = mockChildProcess(); - vi.mocked(mockSpawn).mockReturnValue( - child as unknown as ChildProcess, - ); + vi.mocked(mockSpawn).mockReturnValue(child as unknown as ChildProcess); const { spawnAgentProcess } = await import("./agent-runner.js"); spawnAgentProcess("hello"); expect(vi.mocked(mockSpawn)).toHaveBeenCalledWith( - "node", - expect.arrayContaining([ - join("/repo", "scripts", "run-node.mjs"), - "agent", - "--agent", - "main", - "--message", - "hello", - "--stream-json", - ]), + "openclaw", + expect.arrayContaining(["agent", "--agent", "main", "--message", "hello", "--stream-json"]), expect.objectContaining({ - cwd: "/repo", - }), - ); - }); - - it("falls back to openclaw.mjs in production (standalone)", async () => { - process.env.OPENCLAW_ROOT = "/pkg"; - - const { existsSync: mockExists } = await import("node:fs"); - const { spawn: mockSpawn } = await import("node:child_process"); - - vi.mocked(mockExists).mockImplementation((p) => { - const s = String(p); - if (s === "/pkg") {return true;} // OPENCLAW_ROOT valid - if (s === join("/pkg", "openclaw.mjs")) {return true;} // prod script - // scripts/run-node.mjs does NOT exist (production install) - return false; - }); - - const child = mockChildProcess(); - vi.mocked(mockSpawn).mockReturnValue( - child as unknown as ChildProcess, - ); - - const { spawnAgentProcess } = await import("./agent-runner.js"); - spawnAgentProcess("test message"); - - expect(vi.mocked(mockSpawn)).toHaveBeenCalledWith( - "node", - expect.arrayContaining([ - join("/pkg", "openclaw.mjs"), - "agent", - "--agent", - "main", - "--message", - "test message", - "--stream-json", - ]), - expect.objectContaining({ - cwd: "/pkg", + stdio: ["ignore", "pipe", "pipe"], }), ); }); it("includes session-key and lane args when agentSessionId is set", async () => { - process.env.OPENCLAW_ROOT = "/pkg"; - - const { existsSync: mockExists } = await import("node:fs"); const { spawn: mockSpawn } = await import("node:child_process"); - vi.mocked(mockExists).mockImplementation((p) => { - const s = String(p); - return s === "/pkg" || s === join("/pkg", "openclaw.mjs"); - }); - const child = mockChildProcess(); vi.mocked(mockSpawn).mockReturnValue( child as unknown as ChildProcess, @@ -238,7 +98,7 @@ describe("agent-runner", () => { spawnAgentProcess("msg", "session-123"); expect(vi.mocked(mockSpawn)).toHaveBeenCalledWith( - "node", + "openclaw", expect.arrayContaining([ "--session-key", "agent:main:web:session-123", @@ -358,31 +218,4 @@ describe("agent-runner", () => { }); }); - // ── spawnAgentProcess with file context ────────────────────────── - - describe("spawnAgentProcess (additional)", () => { - it("includes file context flags when filePath is set", async () => { - process.env.OPENCLAW_ROOT = "/pkg"; - - const { existsSync: mockExists } = await import("node:fs"); - const { spawn: mockSpawn } = await import("node:child_process"); - - vi.mocked(mockExists).mockImplementation((p) => { - const s = String(p); - return s === "/pkg" || s === join("/pkg", "openclaw.mjs"); - }); - - const child = mockChildProcess(); - vi.mocked(mockSpawn).mockReturnValue(child as unknown as ChildProcess); - - const { spawnAgentProcess } = await import("./agent-runner.js"); - spawnAgentProcess("analyze this file", "session-1", "knowledge/doc.md"); - - expect(vi.mocked(mockSpawn)).toHaveBeenCalledWith( - "node", - expect.arrayContaining(["--message"]), - expect.anything(), - ); - }); - }); }); diff --git a/apps/web/lib/agent-runner.ts b/apps/web/lib/agent-runner.ts index 005d0c7980d..5578552ff76 100644 --- a/apps/web/lib/agent-runner.ts +++ b/apps/web/lib/agent-runner.ts @@ -1,7 +1,5 @@ import { spawn } from "node:child_process"; import { createInterface } from "node:readline"; -import { existsSync } from "node:fs"; -import { dirname, join } from "node:path"; import { getEffectiveProfile, resolveWorkspaceRoot } from "./workspace"; export type AgentEvent = { @@ -111,68 +109,42 @@ export type RunAgentOptions = { sessionId?: string; }; -/** - * Resolve the ironclaw/openclaw package root directory. - * - * In a dev workspace the cwd is `/apps/web` and `scripts/run-node.mjs` - * exists two levels up. In a production standalone build the cwd is - * `/apps/web/.next/standalone/apps/web/` — walking two levels up lands - * inside the `.next` tree, not at the package root. - * - * Strategy: - * 1. Honour `OPENCLAW_ROOT` env var (set by the gateway when spawning the - * standalone server — guaranteed correct). - * 2. Walk upward from cwd looking for `openclaw.mjs` (production) or - * `scripts/run-node.mjs` (dev). - * 3. Fallback: original 2-levels-up heuristic. - */ -export function resolvePackageRoot(): string { - // 1. Env var (fastest, most reliable in standalone mode). - if (process.env.OPENCLAW_ROOT && existsSync(process.env.OPENCLAW_ROOT)) { - return process.env.OPENCLAW_ROOT; - } - - // 2. Walk up from cwd. - let dir = process.cwd(); - for (let i = 0; i < 20; i++) { - if ( - existsSync(join(dir, "openclaw.mjs")) || - existsSync(join(dir, "scripts", "run-node.mjs")) - ) { - return dir; - } - const parent = dirname(dir); - if (parent === dir) {break;} - dir = parent; - } - - // 3. Fallback: legacy heuristic. - const cwd = process.cwd(); - return cwd.endsWith(join("apps", "web")) - ? join(cwd, "..", "..") - : cwd; -} +export type AgentProcessHandle = { + stdout: NodeJS.ReadableStream | null; + stderr: NodeJS.ReadableStream | null; + kill: (signal?: NodeJS.Signals | number) => boolean; + on: { + ( + event: "close", + listener: (code: number | null, signal: NodeJS.Signals | null) => void, + ): AgentProcessHandle; + (event: string, listener: (...args: unknown[]) => void): AgentProcessHandle; + }; + once: { + ( + event: "close", + listener: (code: number | null, signal: NodeJS.Signals | null) => void, + ): AgentProcessHandle; + (event: string, listener: (...args: unknown[]) => void): AgentProcessHandle; + }; +}; /** * Spawn an agent child process and return the ChildProcess handle. * Shared between `runAgent` (legacy callback API) and the ActiveRunManager. - * - * In a dev workspace uses `scripts/run-node.mjs` (auto-rebuilds TypeScript). - * In production / global-install uses `openclaw.mjs` directly (pre-built). */ export function spawnAgentProcess( message: string, agentSessionId?: string, +): AgentProcessHandle { + return spawnLegacyAgentProcess(message, agentSessionId); +} + +function spawnLegacyAgentProcess( + message: string, + agentSessionId?: string, ): ReturnType { - const root = resolvePackageRoot(); - - // Dev: scripts/run-node.mjs (auto-rebuild). Prod: openclaw.mjs (pre-built). - const devScript = join(root, "scripts", "run-node.mjs"); - const prodScript = join(root, "openclaw.mjs"); - const scriptPath = existsSync(devScript) ? devScript : prodScript; - const args = [ - scriptPath, "agent", "--agent", "main", @@ -188,8 +160,7 @@ export function spawnAgentProcess( const profile = getEffectiveProfile(); const workspace = resolveWorkspaceRoot(); - return spawn("node", args, { - cwd: root, + return spawn("openclaw", args, { env: { ...process.env, ...(profile ? { OPENCLAW_PROFILE: profile } : {}), @@ -206,15 +177,15 @@ export function spawnAgentProcess( export function spawnAgentSubscribeProcess( sessionKey: string, afterSeq = 0, +): AgentProcessHandle { + return spawnLegacyAgentSubscribeProcess(sessionKey, afterSeq); +} + +function spawnLegacyAgentSubscribeProcess( + sessionKey: string, + afterSeq = 0, ): ReturnType { - const root = resolvePackageRoot(); - - const devScript = join(root, "scripts", "run-node.mjs"); - const prodScript = join(root, "openclaw.mjs"); - const scriptPath = existsSync(devScript) ? devScript : prodScript; - const args = [ - scriptPath, "agent", "--stream-json", "--subscribe-session-key", @@ -225,8 +196,7 @@ export function spawnAgentSubscribeProcess( const profile = getEffectiveProfile(); const workspace = resolveWorkspaceRoot(); - return spawn("node", args, { - cwd: root, + return spawn("openclaw", args, { env: { ...process.env, ...(profile ? { OPENCLAW_PROFILE: profile } : {}), @@ -472,7 +442,8 @@ export async function runAgent( }); child.on("error", (err) => { - callback.onError(err); + const error = err instanceof Error ? err : new Error(String(err)); + callback.onError(error); resolve(); }); diff --git a/apps/web/lib/subagent-runs.ts b/apps/web/lib/subagent-runs.ts index 46006adda25..98514206ec6 100644 --- a/apps/web/lib/subagent-runs.ts +++ b/apps/web/lib/subagent-runs.ts @@ -6,15 +6,15 @@ * * Events are fed from CLI NDJSON streams (parent run + subscribe continuations). */ -import { type ChildProcess, spawn } from "node:child_process"; +import { spawn } from "node:child_process"; import { randomUUID } from "node:crypto"; import { createInterface } from "node:readline"; import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from "node:fs"; import { join } from "node:path"; import { type AgentEvent, + type AgentProcessHandle, spawnAgentSubscribeProcess, - resolvePackageRoot, extractToolResult, buildToolOutput, parseAgentErrorMessage, @@ -43,7 +43,7 @@ type SubagentRun = SubagentInfo & { subscribers: Set; /** Internal state for event-to-SSE transformation */ _state: TransformState; - _subscribeProcess: ChildProcess | null; + _subscribeProcess: AgentProcessHandle | null; _cleanupTimer: ReturnType | null; /** Set when lifecycle/end is received; actual finalization deferred to subscribe close. */ _lifecycleEnded: boolean; @@ -462,14 +462,9 @@ export function reactivateSubagent(sessionKey: string): boolean { function sendGatewayAbortForSubagent(sessionKey: string): void { try { - const root = resolvePackageRoot(); - const devScript = join(root, "scripts", "run-node.mjs"); - const prodScript = join(root, "openclaw.mjs"); - const scriptPath = existsSync(devScript) ? devScript : prodScript; const child = spawn( - "node", + "openclaw", [ - scriptPath, "gateway", "call", "chat.abort", @@ -480,12 +475,12 @@ function sendGatewayAbortForSubagent(sessionKey: string): void { "4000", ], { - cwd: root, env: { ...process.env }, stdio: "ignore", detached: true, }, ); + child.on("error", () => {}); child.unref(); } catch { // best effort @@ -504,15 +499,10 @@ export function spawnSubagentMessage(sessionKey: string, message: string): boole try { const run = getRegistry().runs.get(sessionKey); if (!run) {return false;} - const root = resolvePackageRoot(); - const devScript = join(root, "scripts", "run-node.mjs"); - const prodScript = join(root, "openclaw.mjs"); - const scriptPath = existsSync(devScript) ? devScript : prodScript; const idempotencyKey = randomUUID(); const child = spawn( - "node", + "openclaw", [ - scriptPath, "gateway", "call", "agent", @@ -531,12 +521,12 @@ export function spawnSubagentMessage(sessionKey: string, message: string): boole "10000", ], { - cwd: root, env: { ...process.env }, stdio: "ignore", detached: true, }, ); + child.on("error", () => {}); child.unref(); return true; } catch { diff --git a/apps/web/lib/workspace-chat-isolation.test.ts b/apps/web/lib/workspace-chat-isolation.test.ts index 04a5a2ca10e..01cbd4c13aa 100644 --- a/apps/web/lib/workspace-chat-isolation.test.ts +++ b/apps/web/lib/workspace-chat-isolation.test.ts @@ -1,12 +1,32 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; -vi.mock("node:fs", () => ({ - existsSync: vi.fn(() => false), - readFileSync: vi.fn(() => ""), - readdirSync: vi.fn(() => []), - writeFileSync: vi.fn(), - mkdirSync: vi.fn(), -})); +vi.mock("node:fs", async (importOriginal) => { + const actual = await importOriginal(); + const existsSync = vi.fn(() => false); + const readFileSync = vi.fn(() => ""); + const readdirSync = vi.fn(() => []); + const writeFileSync = vi.fn(); + const mkdirSync = vi.fn(); + const renameSync = vi.fn(); + return { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + default: { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + }, + }; +}); vi.mock("node:child_process", () => ({ execSync: vi.fn(() => ""), @@ -29,7 +49,11 @@ import { join } from "node:path"; describe("profile-scoped chat session isolation", () => { const originalEnv = { ...process.env }; - const STATE_DIR = join("/home/testuser", ".openclaw"); + const DEFAULT_STATE_DIR = join("/home/testuser", ".openclaw"); + const stateDirForProfile = (profile: string | null) => + !profile || profile.toLowerCase() === "default" + ? DEFAULT_STATE_DIR + : join("/home/testuser", `.openclaw-${profile}`); beforeEach(() => { vi.resetModules(); @@ -40,13 +64,33 @@ describe("profile-scoped chat session isolation", () => { delete process.env.OPENCLAW_WORKSPACE; delete process.env.OPENCLAW_STATE_DIR; - vi.mock("node:fs", () => ({ - existsSync: vi.fn(() => false), - readFileSync: vi.fn(() => ""), - readdirSync: vi.fn(() => []), - writeFileSync: vi.fn(), - mkdirSync: vi.fn(), - })); + vi.mock("node:fs", async (importOriginal) => { + const actual = await importOriginal(); + const existsSync = vi.fn(() => false); + const readFileSync = vi.fn(() => ""); + const readdirSync = vi.fn(() => []); + const writeFileSync = vi.fn(); + const mkdirSync = vi.fn(); + const renameSync = vi.fn(); + return { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + default: { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + }, + }; + }); vi.mock("node:child_process", () => ({ execSync: vi.fn(() => ""), exec: vi.fn( @@ -85,15 +129,15 @@ describe("profile-scoped chat session isolation", () => { mockReadFile.mockImplementation(() => { throw new Error("ENOENT"); }); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat")); + expect(resolveWebChatDir()).toBe(join(DEFAULT_STATE_DIR, "web-chat")); }); - it("named profile uses web-chat- directory", async () => { + it("named profile uses profile-scoped web-chat directory", async () => { const { resolveWebChatDir, setUIActiveProfile, mockReadFile } = await importWorkspace(); mockReadFile.mockReturnValue(JSON.stringify({}) as never); setUIActiveProfile("work"); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat-work")); + expect(resolveWebChatDir()).toBe(join(stateDirForProfile("work"), "web-chat")); }); it("different profiles produce different chat directories", async () => { @@ -109,8 +153,8 @@ describe("profile-scoped chat session isolation", () => { const dirBeta = resolveWebChatDir(); expect(dirAlpha).not.toBe(dirBeta); - expect(dirAlpha).toBe(join(STATE_DIR, "web-chat-alpha")); - expect(dirBeta).toBe(join(STATE_DIR, "web-chat-beta")); + expect(dirAlpha).toBe(join(stateDirForProfile("alpha"), "web-chat")); + expect(dirBeta).toBe(join(stateDirForProfile("beta"), "web-chat")); }); it("switching to default after named profile reverts to base dir", async () => { @@ -119,10 +163,10 @@ describe("profile-scoped chat session isolation", () => { mockReadFile.mockReturnValue(JSON.stringify({}) as never); setUIActiveProfile("work"); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat-work")); + expect(resolveWebChatDir()).toBe(join(stateDirForProfile("work"), "web-chat")); setUIActiveProfile(null); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat")); + expect(resolveWebChatDir()).toBe(join(DEFAULT_STATE_DIR, "web-chat")); }); it("'default' profile name uses base web-chat dir (case-insensitive)", async () => { @@ -131,10 +175,10 @@ describe("profile-scoped chat session isolation", () => { mockReadFile.mockReturnValue(JSON.stringify({}) as never); setUIActiveProfile("Default"); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat")); + expect(resolveWebChatDir()).toBe(join(DEFAULT_STATE_DIR, "web-chat")); setUIActiveProfile("DEFAULT"); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat")); + expect(resolveWebChatDir()).toBe(join(DEFAULT_STATE_DIR, "web-chat")); }); it("OPENCLAW_STATE_DIR override changes base for chat dirs", async () => { @@ -147,7 +191,7 @@ describe("profile-scoped chat session isolation", () => { expect(resolveWebChatDir()).toBe(join("/custom/state", "web-chat")); setUIActiveProfile("test"); - expect(resolveWebChatDir()).toBe(join("/custom/state", "web-chat-test")); + expect(resolveWebChatDir()).toBe(join("/custom/state", "web-chat")); }); it("workspace roots are isolated per profile too", async () => { @@ -155,8 +199,8 @@ describe("profile-scoped chat session isolation", () => { await importWorkspace(); mockReadFile.mockReturnValue(JSON.stringify({}) as never); - const defaultWs = join(STATE_DIR, "workspace"); - const workWs = join(STATE_DIR, "workspace-work"); + const defaultWs = join(DEFAULT_STATE_DIR, "workspace"); + const workWs = join(stateDirForProfile("work"), "workspace"); mockExists.mockImplementation((p) => { const s = String(p); diff --git a/apps/web/lib/workspace-profiles.test.ts b/apps/web/lib/workspace-profiles.test.ts index e5eebf58af5..8205ba019ee 100644 --- a/apps/web/lib/workspace-profiles.test.ts +++ b/apps/web/lib/workspace-profiles.test.ts @@ -1,13 +1,33 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import type { Dirent } from "node:fs"; -vi.mock("node:fs", () => ({ - existsSync: vi.fn(() => false), - readFileSync: vi.fn(() => ""), - readdirSync: vi.fn(() => []), - writeFileSync: vi.fn(), - mkdirSync: vi.fn(), -})); +vi.mock("node:fs", async (importOriginal) => { + const actual = await importOriginal(); + const existsSync = vi.fn(() => false); + const readFileSync = vi.fn(() => ""); + const readdirSync = vi.fn(() => []); + const writeFileSync = vi.fn(); + const mkdirSync = vi.fn(); + const renameSync = vi.fn(); + return { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + default: { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + }, + }; +}); vi.mock("node:child_process", () => ({ execSync: vi.fn(() => ""), @@ -45,8 +65,12 @@ function makeDirent(name: string, isDir: boolean): Dirent { describe("workspace profiles", () => { const originalEnv = { ...process.env }; - const STATE_DIR = join("/home/testuser", ".openclaw"); - const UI_STATE_PATH = join(STATE_DIR, ".ironclaw-ui-state.json"); + const DEFAULT_STATE_DIR = join("/home/testuser", ".openclaw"); + const stateDirForProfile = (profile: string | null) => + !profile || profile.toLowerCase() === "default" + ? DEFAULT_STATE_DIR + : join("/home/testuser", `.openclaw-${profile}`); + const UI_STATE_PATH = join(DEFAULT_STATE_DIR, ".ironclaw-ui-state.json"); beforeEach(() => { vi.resetModules(); @@ -57,13 +81,33 @@ describe("workspace profiles", () => { delete process.env.OPENCLAW_WORKSPACE; delete process.env.OPENCLAW_STATE_DIR; - vi.mock("node:fs", () => ({ - existsSync: vi.fn(() => false), - readFileSync: vi.fn(() => ""), - readdirSync: vi.fn(() => []), - writeFileSync: vi.fn(), - mkdirSync: vi.fn(), - })); + vi.mock("node:fs", async (importOriginal) => { + const actual = await importOriginal(); + const existsSync = vi.fn(() => false); + const readFileSync = vi.fn(() => ""); + const readdirSync = vi.fn(() => []); + const writeFileSync = vi.fn(); + const mkdirSync = vi.fn(); + const renameSync = vi.fn(); + return { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + default: { + ...actual, + existsSync, + readFileSync, + readdirSync, + writeFileSync, + mkdirSync, + renameSync, + }, + }; + }); vi.mock("node:child_process", () => ({ execSync: vi.fn(() => ""), exec: vi.fn( @@ -91,6 +135,7 @@ describe("workspace profiles", () => { readFileSync: rfs, readdirSync: rds, writeFileSync: wfs, + renameSync: rs, } = await import("node:fs"); const mod = await import("./workspace.js"); return { @@ -99,6 +144,7 @@ describe("workspace profiles", () => { mockReadFile: vi.mocked(rfs), mockReaddir: vi.mocked(rds), mockWriteFile: vi.mocked(wfs), + mockRename: vi.mocked(rs), }; } @@ -261,20 +307,23 @@ describe("workspace profiles", () => { expect(profiles[0].isActive).toBe(true); }); - it("discovers workspace- directories", async () => { + it("discovers profile-scoped .openclaw- state directories", async () => { const { discoverProfiles, mockExists, mockReaddir } = await importWorkspace(); + const workStateDir = stateDirForProfile("work"); + const personalStateDir = stateDirForProfile("personal"); mockExists.mockImplementation((p) => { const s = String(p); return ( - s === STATE_DIR || - s === join(STATE_DIR, "workspace-work") || - s === join(STATE_DIR, "workspace-personal") + s === DEFAULT_STATE_DIR || + s === join(DEFAULT_STATE_DIR, "openclaw.json") || + s === join(workStateDir, "workspace") || + s === join(personalStateDir, "workspace") ); }); mockReaddir.mockReturnValue([ - makeDirent("workspace-work", true), - makeDirent("workspace-personal", true), + makeDirent(".openclaw-work", true), + makeDirent(".openclaw-personal", true), makeDirent("sessions", true), makeDirent("config.json", false), ] as unknown as Dirent[]); @@ -290,12 +339,17 @@ describe("workspace profiles", () => { it("marks active profile correctly", async () => { const { discoverProfiles, setUIActiveProfile, mockExists, mockReaddir } = await importWorkspace(); + const workStateDir = stateDirForProfile("work"); mockExists.mockImplementation((p) => { const s = String(p); - return s === STATE_DIR || s === join(STATE_DIR, "workspace-work"); + return ( + s === DEFAULT_STATE_DIR || + s === join(DEFAULT_STATE_DIR, "openclaw.json") || + s === join(workStateDir, "workspace") + ); }); mockReaddir.mockReturnValue([ - makeDirent("workspace-work", true), + makeDirent(".openclaw-work", true), ] as unknown as Dirent[]); setUIActiveProfile("work"); @@ -311,7 +365,7 @@ describe("workspace profiles", () => { await importWorkspace(); mockExists.mockImplementation((p) => { const s = String(p); - return s === "/custom/workspace" || s === STATE_DIR; + return s === "/custom/workspace" || s === DEFAULT_STATE_DIR; }); mockReadFile.mockReturnValue( JSON.stringify({ @@ -328,13 +382,14 @@ describe("workspace profiles", () => { it("does not duplicate profiles seen via directory and registry", async () => { const { discoverProfiles, mockExists, mockReaddir, mockReadFile } = await importWorkspace(); - const wsDir = join(STATE_DIR, "workspace-shared"); + const stateDir = stateDirForProfile("shared"); + const wsDir = join(stateDir, "workspace"); mockExists.mockImplementation((p) => { const s = String(p); - return s === STATE_DIR || s === wsDir; + return s === DEFAULT_STATE_DIR || s === wsDir; }); mockReaddir.mockReturnValue([ - makeDirent("workspace-shared", true), + makeDirent(".openclaw-shared", true), ] as unknown as Dirent[]); mockReadFile.mockReturnValue( JSON.stringify({ @@ -368,15 +423,39 @@ describe("workspace profiles", () => { mockReadFile.mockImplementation(() => { throw new Error("ENOENT"); }); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat")); + expect(resolveWebChatDir()).toBe(join(DEFAULT_STATE_DIR, "web-chat")); }); - it("returns web-chat- for named profile", async () => { + it("returns profile-scoped web-chat directory for named profile", async () => { const { resolveWebChatDir, setUIActiveProfile, mockReadFile } = await importWorkspace(); mockReadFile.mockReturnValue(JSON.stringify({}) as never); setUIActiveProfile("work"); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat-work")); + expect(resolveWebChatDir()).toBe(join(stateDirForProfile("work"), "web-chat")); + }); + + it("uses OPENCLAW_PROFILE when no UI override is set", async () => { + process.env.OPENCLAW_PROFILE = "ironclaw"; + const { resolveWebChatDir, mockReadFile } = await importWorkspace(); + mockReadFile.mockImplementation(() => { + throw new Error("ENOENT"); + }); + expect(resolveWebChatDir()).toBe(join(stateDirForProfile("ironclaw"), "web-chat")); + }); + + it("migrates legacy web-chat- into profile state dir", async () => { + const { resolveWebChatDir, setUIActiveProfile, mockExists, mockReadFile, mockRename } = + await importWorkspace(); + mockReadFile.mockReturnValue(JSON.stringify({}) as never); + setUIActiveProfile("work"); + + const legacyDir = join(DEFAULT_STATE_DIR, "web-chat-work"); + const targetDir = join(stateDirForProfile("work"), "web-chat"); + mockExists.mockImplementation((p) => String(p) === legacyDir); + + resolveWebChatDir(); + + expect(mockRename).toHaveBeenCalledWith(legacyDir, targetDir); }); it("returns web-chat when profile is 'default'", async () => { @@ -384,7 +463,7 @@ describe("workspace profiles", () => { await importWorkspace(); mockReadFile.mockReturnValue(JSON.stringify({}) as never); setUIActiveProfile("default"); - expect(resolveWebChatDir()).toBe(join(STATE_DIR, "web-chat")); + expect(resolveWebChatDir()).toBe(join(DEFAULT_STATE_DIR, "web-chat")); }); it("respects OPENCLAW_STATE_DIR override", async () => { @@ -400,16 +479,27 @@ describe("workspace profiles", () => { // ─── resolveWorkspaceRoot (profile-aware) ───────────────────────── describe("resolveWorkspaceRoot (profile-aware)", () => { - it("returns workspace- for named profile", async () => { + it("returns profile-scoped workspace for named profile", async () => { const { resolveWorkspaceRoot, setUIActiveProfile, mockExists, mockReadFile } = await importWorkspace(); mockReadFile.mockReturnValue(JSON.stringify({}) as never); setUIActiveProfile("work"); - const workDir = join(STATE_DIR, "workspace-work"); + const workDir = join(stateDirForProfile("work"), "workspace"); mockExists.mockImplementation((p) => String(p) === workDir); expect(resolveWorkspaceRoot()).toBe(workDir); }); + it("uses OPENCLAW_PROFILE to resolve profile-scoped workspace", async () => { + process.env.OPENCLAW_PROFILE = "ironclaw"; + const { resolveWorkspaceRoot, mockExists, mockReadFile } = await importWorkspace(); + mockReadFile.mockImplementation(() => { + throw new Error("ENOENT"); + }); + const profileWorkspaceDir = join(stateDirForProfile("ironclaw"), "workspace"); + mockExists.mockImplementation((p) => String(p) === profileWorkspaceDir); + expect(resolveWorkspaceRoot()).toBe(profileWorkspaceDir); + }); + it("prefers registry path over directory convention", async () => { const { resolveWorkspaceRoot, @@ -426,7 +516,7 @@ describe("workspace profiles", () => { mockExists.mockImplementation((p) => { const s = String(p); return ( - s === "/custom/work" || s === join(STATE_DIR, "workspace-work") + s === "/custom/work" || s === join(stateDirForProfile("work"), "workspace") ); }); expect(resolveWorkspaceRoot()).toBe("/custom/work"); @@ -442,14 +532,43 @@ describe("workspace profiles", () => { expect(resolveWorkspaceRoot()).toBe("/env/workspace"); }); - it("falls back to default workspace when named profile dir missing", async () => { + it("returns null when named profile workspace is missing", async () => { const { resolveWorkspaceRoot, setUIActiveProfile, mockExists, mockReadFile } = await importWorkspace(); mockReadFile.mockReturnValue(JSON.stringify({}) as never); setUIActiveProfile("missing"); - const defaultDir = join(STATE_DIR, "workspace"); - mockExists.mockImplementation((p) => String(p) === defaultDir); - expect(resolveWorkspaceRoot()).toBe(defaultDir); + mockExists.mockReturnValue(false); + expect(resolveWorkspaceRoot()).toBeNull(); + }); + + it("migrates legacy workspace- and updates resolution", async () => { + const { resolveWorkspaceRoot, setUIActiveProfile, mockExists, mockReadFile, mockRename } = + await importWorkspace(); + mockReadFile.mockReturnValue( + JSON.stringify({ + workspaceRegistry: { + work: join(DEFAULT_STATE_DIR, "workspace-work"), + }, + }) as never, + ); + setUIActiveProfile("work"); + + const legacyDir = join(DEFAULT_STATE_DIR, "workspace-work"); + const targetDir = join(stateDirForProfile("work"), "workspace"); + let moved = false; + mockExists.mockImplementation((p) => { + const s = String(p); + if (!moved) { + return s === legacyDir; + } + return s === targetDir; + }); + mockRename.mockImplementation(() => { + moved = true; + }); + + expect(resolveWorkspaceRoot()).toBe(targetDir); + expect(mockRename).toHaveBeenCalledWith(legacyDir, targetDir); }); }); diff --git a/apps/web/lib/workspace.ts b/apps/web/lib/workspace.ts index 2f1d19eca19..edcbe054872 100644 --- a/apps/web/lib/workspace.ts +++ b/apps/web/lib/workspace.ts @@ -1,4 +1,4 @@ -import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from "node:fs"; +import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync, renameSync } from "node:fs"; import { execSync, exec } from "node:child_process"; import { promisify } from "node:util"; import { join, resolve, normalize, relative } from "node:path"; @@ -15,6 +15,8 @@ const execAsync = promisify(exec); // --------------------------------------------------------------------------- const UI_STATE_FILENAME = ".ironclaw-ui-state.json"; +const LEGACY_STATE_DIRNAME = ".openclaw"; +const migratedProfiles = new Set(); /** In-memory override; takes precedence over the persisted file. */ let _uiActiveProfile: string | null | undefined; @@ -25,9 +27,107 @@ type UIState = { workspaceRegistry?: Record; }; +function resolveOpenClawHomeDir(): string { + return process.env.OPENCLAW_HOME?.trim() || homedir(); +} + +function expandUserPath(input: string): string { + const trimmed = input.trim(); + if (!trimmed) { + return trimmed; + } + if (trimmed.startsWith("~")) { + return join(homedir(), trimmed.slice(1)); + } + return trimmed; +} + +function normalizeProfileName(profile: string | null | undefined): string | null { + const normalized = profile?.trim() || null; + if (!normalized || normalized.toLowerCase() === "default") { + return null; + } + return normalized; +} + +function resolveLegacySharedStateDir(): string { + const override = process.env.OPENCLAW_STATE_DIR?.trim(); + if (override) { + return expandUserPath(override); + } + return join(resolveOpenClawHomeDir(), LEGACY_STATE_DIRNAME); +} + +function resolveProfileStateDir(profile: string | null | undefined): string { + const override = process.env.OPENCLAW_STATE_DIR?.trim(); + if (override) { + return expandUserPath(override); + } + const normalizedProfile = normalizeProfileName(profile); + if (!normalizedProfile) { + return join(resolveOpenClawHomeDir(), LEGACY_STATE_DIRNAME); + } + return join(resolveOpenClawHomeDir(), `.openclaw-${normalizedProfile}`); +} + +function moveDirIfMissingTarget(fromDir: string, toDir: string): boolean { + if (!existsSync(fromDir) || existsSync(toDir)) { + return false; + } + const parent = join(toDir, ".."); + if (!existsSync(parent)) { + mkdirSync(parent, { recursive: true }); + } + try { + renameSync(fromDir, toDir); + return true; + } catch { + return false; + } +} + +function migrateLegacyProfileStorage(profile: string | null): void { + const normalizedProfile = normalizeProfileName(profile); + if (!normalizedProfile || process.env.OPENCLAW_STATE_DIR?.trim()) { + return; + } + const key = normalizedProfile.toLowerCase(); + if (migratedProfiles.has(key)) { + return; + } + migratedProfiles.add(key); + + const legacyStateDir = resolveLegacySharedStateDir(); + const targetStateDir = resolveProfileStateDir(normalizedProfile); + const movedWorkspace = moveDirIfMissingTarget( + join(legacyStateDir, `workspace-${normalizedProfile}`), + join(targetStateDir, "workspace"), + ); + const movedWebChat = moveDirIfMissingTarget( + join(legacyStateDir, `web-chat-${normalizedProfile}`), + join(targetStateDir, "web-chat"), + ); + if (!movedWorkspace && !movedWebChat) { + return; + } + + const state = readUIState(); + const existing = state.workspaceRegistry?.[normalizedProfile]; + if ( + existing && + resolve(existing) === resolve(join(legacyStateDir, `workspace-${normalizedProfile}`)) + ) { + const nextRegistry = { ...state.workspaceRegistry }; + nextRegistry[normalizedProfile] = join(targetStateDir, "workspace"); + writeUIState({ + ...state, + workspaceRegistry: nextRegistry, + }); + } +} + function uiStatePath(): string { - const home = process.env.OPENCLAW_HOME?.trim() || homedir(); - return join(home, ".openclaw", UI_STATE_FILENAME); + return join(resolveOpenClawHomeDir(), LEGACY_STATE_DIRNAME, UI_STATE_FILENAME); } function readUIState(): UIState { @@ -104,56 +204,67 @@ export type DiscoveredProfile = { }; /** - * Discover all profiles by scanning ~/.openclaw for workspace-* directories - * and checking for profile-specific state dirs. + * Discover all profiles by scanning profile-scoped state directories + * (e.g. ~/.openclaw-ironclaw) and merging persisted registry entries. */ export function discoverProfiles(): DiscoveredProfile[] { - const home = process.env.OPENCLAW_HOME?.trim() || homedir(); - const baseStateDir = join(home, ".openclaw"); + const home = resolveOpenClawHomeDir(); + const defaultStateDir = resolveProfileStateDir(null); const activeProfile = getEffectiveProfile(); + const activeNormalized = normalizeProfileName(activeProfile); const profiles: DiscoveredProfile[] = []; const seen = new Set(); // Default profile - const defaultWs = join(baseStateDir, "workspace"); + const defaultWs = join(defaultStateDir, "workspace"); profiles.push({ name: "default", - stateDir: baseStateDir, + stateDir: defaultStateDir, workspaceDir: existsSync(defaultWs) ? defaultWs : null, - isActive: !activeProfile || activeProfile.toLowerCase() === "default", - hasConfig: existsSync(join(baseStateDir, "openclaw.json")), + isActive: !activeNormalized, + hasConfig: existsSync(join(defaultStateDir, "openclaw.json")), }); seen.add("default"); - // Scan for workspace- directories inside the state dir - if (existsSync(baseStateDir)) { - try { - const entries = readdirSync(baseStateDir, { withFileTypes: true }); - for (const entry of entries) { - if (!entry.isDirectory()) {continue;} - const match = entry.name.match(/^workspace-(.+)$/); - if (!match) {continue;} - const profileName = match[1]; - if (seen.has(profileName)) {continue;} - seen.add(profileName); - - const wsDir = join(baseStateDir, entry.name); - profiles.push({ - name: profileName, - stateDir: baseStateDir, - workspaceDir: existsSync(wsDir) ? wsDir : null, - isActive: activeProfile === profileName, - hasConfig: existsSync(join(baseStateDir, "openclaw.json")), - }); + // Scan for profile-scoped state dirs: ~/.openclaw- + try { + const entries = readdirSync(home, { withFileTypes: true }); + for (const entry of entries) { + if (!entry.isDirectory()) { + continue; } - } catch { - // dir unreadable + const match = entry.name.match(/^\.openclaw-(.+)$/); + if (!match || !match[1]) { + continue; + } + const profileName = match[1]; + if (seen.has(profileName)) { + continue; + } + migrateLegacyProfileStorage(profileName); + const stateDir = resolveProfileStateDir(profileName); + const wsDir = join(stateDir, "workspace"); + profiles.push({ + name: profileName, + stateDir, + workspaceDir: existsSync(wsDir) ? wsDir : null, + isActive: activeNormalized === profileName, + hasConfig: existsSync(join(stateDir, "openclaw.json")), + }); + seen.add(profileName); } + } catch { + // dir unreadable } - // Merge workspaces registered via custom paths (outside ~/.openclaw/) + // Merge workspaces registered via custom paths (outside profile state dirs). const registry = getWorkspaceRegistry(); - for (const [profileName, wsPath] of Object.entries(registry)) { + for (const [rawProfileName, wsPath] of Object.entries(registry)) { + const normalized = normalizeProfileName(rawProfileName); + const profileName = normalized ?? "default"; + if (normalized) { + migrateLegacyProfileStorage(normalized); + } if (seen.has(profileName)) { const existing = profiles.find((p) => p.name === profileName); if (existing && !existing.workspaceDir && existsSync(wsPath)) { @@ -162,12 +273,13 @@ export function discoverProfiles(): DiscoveredProfile[] { continue; } seen.add(profileName); + const stateDir = resolveProfileStateDir(normalized); profiles.push({ name: profileName, - stateDir: baseStateDir, + stateDir, workspaceDir: existsSync(wsPath) ? wsPath : null, - isActive: activeProfile === profileName, - hasConfig: existsSync(join(baseStateDir, "openclaw.json")), + isActive: normalized ? activeNormalized === normalized : !activeNormalized, + hasConfig: existsSync(join(stateDir, "openclaw.json")), }); } @@ -180,55 +292,44 @@ export function discoverProfiles(): DiscoveredProfile[] { /** * Resolve the OpenClaw state directory (base dir for config, sessions, agents, etc.). - * Mirrors src/config/paths.ts:resolveStateDir() logic for the web app. - * - * Precedence: - * 1. OPENCLAW_STATE_DIR env var - * 2. OPENCLAW_HOME env var → /.openclaw - * 3. ~/.openclaw (default) + * Mirrors CLI profile semantics: + * - default profile: ~/.openclaw + * - named profile: ~/.openclaw- + * - OPENCLAW_STATE_DIR override wins for all profiles */ export function resolveOpenClawStateDir(): string { - const stateOverride = process.env.OPENCLAW_STATE_DIR?.trim(); - if (stateOverride) { - return stateOverride.startsWith("~") - ? join(homedir(), stateOverride.slice(1)) - : stateOverride; - } - const home = process.env.OPENCLAW_HOME?.trim() || homedir(); - return join(home, ".openclaw"); + const profile = getEffectiveProfile(); + migrateLegacyProfileStorage(profile); + return resolveProfileStateDir(profile); } /** * Resolve the web-chat sessions directory, scoped to the active profile. - * Default profile: /web-chat - * Named profile: /web-chat- + * Always stores sessions at /web-chat. */ export function resolveWebChatDir(): string { const stateDir = resolveOpenClawStateDir(); - const profile = getEffectiveProfile(); - if (profile && profile.toLowerCase() !== "default") { - return join(stateDir, `web-chat-${profile}`); - } return join(stateDir, "web-chat"); } /** * Resolve the workspace directory, checking in order: * 1. OPENCLAW_WORKSPACE env var - * 2. Effective profile → /workspace- - * 3. /workspace + * 2. Registered profile-specific custom path + * 3. /workspace + * 4. Legacy fallback: ~/.openclaw/workspace- (non-default only) */ export function resolveWorkspaceRoot(): string | null { - const stateDir = resolveOpenClawStateDir(); const profile = getEffectiveProfile(); + migrateLegacyProfileStorage(profile); + const normalizedProfile = normalizeProfileName(profile); + const stateDir = resolveProfileStateDir(profile); const registryPath = getRegisteredWorkspacePath(profile); const candidates = [ process.env.OPENCLAW_WORKSPACE, registryPath, - profile && profile.toLowerCase() !== "default" - ? join(stateDir, `workspace-${profile}`) - : null, join(stateDir, "workspace"), + normalizedProfile ? join(resolveLegacySharedStateDir(), `workspace-${normalizedProfile}`) : null, ].filter(Boolean) as string[]; for (const dir of candidates) { diff --git a/docs/install/updating.md b/docs/install/updating.md index e463a5001fb..8a921ec09af 100644 --- a/docs/install/updating.md +++ b/docs/install/updating.md @@ -10,6 +10,8 @@ title: "Updating" OpenClaw is moving fast (pre “1.0”). Treat updates like shipping infra: update → run checks → restart (or use `openclaw update`, which restarts) → verify. +If you run **IronClaw** as a frontend package, keep OpenClaw installed globally (`npm i -g openclaw`) and update OpenClaw separately; IronClaw delegates runtime commands to that global OpenClaw install. + ## Recommended: re-run the website installer (upgrade in place) The **preferred** update path is to re-run the installer from the website. It diff --git a/docs/reference/RELEASING.md b/docs/reference/RELEASING.md index 0f9f37acb5b..4781f748b51 100644 --- a/docs/reference/RELEASING.md +++ b/docs/reference/RELEASING.md @@ -22,16 +22,16 @@ When the operator says “release”, immediately do this preflight (no extra qu 1. **Version & metadata** - [ ] Bump `package.json` version (e.g., `2026.1.29`). -- [ ] Run `pnpm plugins:sync` to align extension package versions + changelogs. - [ ] Update CLI/version strings: [`src/cli/program.ts`](https://github.com/openclaw/openclaw/blob/main/src/cli/program.ts) and the Baileys user agent in [`src/provider-web.ts`](https://github.com/openclaw/openclaw/blob/main/src/provider-web.ts). -- [ ] Confirm package metadata (name, description, repository, keywords, license) and `bin` map points to [`openclaw.mjs`](https://github.com/openclaw/openclaw/blob/main/openclaw.mjs) for `openclaw`. +- [ ] Confirm package metadata (name, description, repository, keywords, license) and `bin` map points to [`openclaw.mjs`](https://github.com/openclaw/openclaw/blob/main/openclaw.mjs) for `ironclaw`. +- [ ] Confirm release notes/documentation call out the global runtime prerequisite: `npm i -g openclaw`. - [ ] If dependencies changed, run `pnpm install` so `pnpm-lock.yaml` is current. 2. **Build & artifacts** - [ ] If A2UI inputs changed, run `pnpm canvas:a2ui:bundle` and commit any updated [`src/canvas-host/a2ui/a2ui.bundle.js`](https://github.com/openclaw/openclaw/blob/main/src/canvas-host/a2ui/a2ui.bundle.js). - [ ] `pnpm run build` (regenerates `dist/`). -- [ ] Verify npm package `files` includes all required `dist/*` folders (notably `dist/node-host/**` and `dist/acp/**` for headless node + ACP CLI). +- [ ] Verify npm package `files` includes only IronClaw artifacts (`dist/entry*`, web standalone, skills/assets) and does not rely on bundled OpenClaw core runtime code. - [ ] Confirm `dist/build-info.json` exists and includes the expected `commit` hash (CLI banner uses this for npm installs). - [ ] Optional: `npm pack --pack-destination /tmp` after the build; inspect the tarball contents and keep it handy for the GitHub release (do **not** commit it). diff --git a/package.json b/package.json index d1d13525140..19e75411756 100644 --- a/package.json +++ b/package.json @@ -31,22 +31,12 @@ "README.md", "assets/", "dist/", - "docs/", - "extensions/", "skills/" ], "type": "module", - "main": "dist/index.js", + "main": "dist/entry.js", "exports": { - ".": "./dist/index.js", - "./plugin-sdk": { - "types": "./dist/plugin-sdk/index.d.ts", - "default": "./dist/plugin-sdk/index.js" - }, - "./plugin-sdk/account-id": { - "types": "./dist/plugin-sdk/account-id.d.ts", - "default": "./dist/plugin-sdk/account-id.js" - }, + ".": "./dist/entry.js", "./cli-entry": "./openclaw.mjs" }, "scripts": { @@ -54,8 +44,7 @@ "android:install": "cd apps/android && ./gradlew :app:installDebug", "android:run": "cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.openclaw.android/.MainActivity", "android:test": "cd apps/android && ./gradlew :app:testDebugUnitTest", - "build": "pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts", - "build:plugin-sdk:dts": "tsc -p tsconfig.plugin-sdk.dts.json", + "build": "tsdown && node --import tsx scripts/write-build-info.ts", "canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh", "check": "pnpm format:check && pnpm tsgo && pnpm lint", "check:docs": "pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links", @@ -90,6 +79,8 @@ "ios:gen": "bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'", "ios:open": "bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open OpenClaw.xcodeproj'", "ios:run": "bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project OpenClaw.xcodeproj -scheme OpenClaw -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.openclaw.ios'", + "ironclaw": "node scripts/run-node.mjs", + "ironclaw:rpc": "node scripts/run-node.mjs agent --mode rpc --json", "lint": "oxlint --type-aware", "lint:all": "pnpm lint && pnpm lint:swift", "lint:docs": "pnpm dlx markdownlint-cli2", @@ -100,10 +91,8 @@ "mac:package": "bash scripts/package-mac-app.sh", "mac:restart": "bash scripts/restart-mac.sh", "moltbot:rpc": "node scripts/run-node.mjs agent --mode rpc --json", - "openclaw": "node scripts/run-node.mjs", - "openclaw:rpc": "node scripts/run-node.mjs agent --mode rpc --json", "plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts", - "prepack": "pnpm build && pnpm ui:build && pnpm web:build && pnpm web:prepack", + "prepack": "pnpm build && pnpm web:build && pnpm web:prepack", "prepare": "command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1 && git config core.hooksPath git-hooks || exit 0", "protocol:check": "pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/OpenClawProtocol/GatewayModels.swift", "protocol:gen": "node --import tsx scripts/protocol-gen.ts", @@ -135,7 +124,7 @@ "test:ui": "pnpm --dir ui test", "test:voicecall:closedloop": "vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1", "test:watch": "vitest", - "test:workspace": "vitest run --config vitest.unit.config.ts -- workspace-profiles workspace-chat-isolation workspace-context-awareness subagent-runs && pnpm --dir apps/web vitest run -- workspace-profiles workspace-chat-isolation subagent-runs route.test", + "test:workspace": "(cd apps/web && pnpm vitest run -- workspace-profiles workspace-chat-isolation subagent-runs route.test)", "test:workspace:live": "LIVE=1 vitest run --config vitest.live.config.ts -- workspace-context-awareness && LIVE=1 pnpm --dir apps/web vitest run -- subagent-streaming.live", "tsgo:test": "tsgo -p tsconfig.test.json", "tui": "node scripts/run-node.mjs tui", @@ -241,7 +230,8 @@ }, "peerDependencies": { "@napi-rs/canvas": "^0.1.89", - "node-llama-cpp": "3.15.1" + "node-llama-cpp": "3.15.1", + "openclaw": ">=2026.1.0" }, "engines": { "node": ">=22.12.0" diff --git a/scripts/canvas-a2ui-copy.ts b/scripts/canvas-a2ui-copy.ts deleted file mode 100644 index 238bc3b912d..00000000000 --- a/scripts/canvas-a2ui-copy.ts +++ /dev/null @@ -1,40 +0,0 @@ -import fs from "node:fs/promises"; -import path from "node:path"; -import { fileURLToPath, pathToFileURL } from "node:url"; - -const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); - -export function getA2uiPaths(env = process.env) { - const srcDir = env.OPENCLAW_A2UI_SRC_DIR ?? path.join(repoRoot, "src", "canvas-host", "a2ui"); - const outDir = env.OPENCLAW_A2UI_OUT_DIR ?? path.join(repoRoot, "dist", "canvas-host", "a2ui"); - return { srcDir, outDir }; -} - -export async function copyA2uiAssets({ srcDir, outDir }: { srcDir: string; outDir: string }) { - const skipMissing = process.env.OPENCLAW_A2UI_SKIP_MISSING === "1"; - try { - await fs.stat(path.join(srcDir, "index.html")); - await fs.stat(path.join(srcDir, "a2ui.bundle.js")); - } catch (err) { - const message = 'Missing A2UI bundle assets. Run "pnpm canvas:a2ui:bundle" and retry.'; - if (skipMissing) { - console.warn(`${message} Skipping copy (OPENCLAW_A2UI_SKIP_MISSING=1).`); - return; - } - throw new Error(message, { cause: err }); - } - await fs.mkdir(path.dirname(outDir), { recursive: true }); - await fs.cp(srcDir, outDir, { recursive: true }); -} - -async function main() { - const { srcDir, outDir } = getA2uiPaths(); - await copyA2uiAssets({ srcDir, outDir }); -} - -if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) { - main().catch((err) => { - console.error(String(err)); - process.exit(1); - }); -} diff --git a/scripts/copy-export-html-templates.ts b/scripts/copy-export-html-templates.ts deleted file mode 100644 index 8f9c494d213..00000000000 --- a/scripts/copy-export-html-templates.ts +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env tsx -/** - * Copy export-html templates from src to dist - */ - -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const projectRoot = path.resolve(__dirname, ".."); - -const srcDir = path.join(projectRoot, "src", "auto-reply", "reply", "export-html"); -const distDir = path.join(projectRoot, "dist", "export-html"); - -function copyExportHtmlTemplates() { - if (!fs.existsSync(srcDir)) { - console.warn("[copy-export-html-templates] Source directory not found:", srcDir); - return; - } - - // Create dist directory - if (!fs.existsSync(distDir)) { - fs.mkdirSync(distDir, { recursive: true }); - } - - // Copy main template files - const templateFiles = ["template.html", "template.css", "template.js"]; - for (const file of templateFiles) { - const srcFile = path.join(srcDir, file); - const distFile = path.join(distDir, file); - if (fs.existsSync(srcFile)) { - fs.copyFileSync(srcFile, distFile); - console.log(`[copy-export-html-templates] Copied ${file}`); - } - } - - // Copy vendor files - const srcVendor = path.join(srcDir, "vendor"); - const distVendor = path.join(distDir, "vendor"); - if (fs.existsSync(srcVendor)) { - if (!fs.existsSync(distVendor)) { - fs.mkdirSync(distVendor, { recursive: true }); - } - const vendorFiles = fs.readdirSync(srcVendor); - for (const file of vendorFiles) { - const srcFile = path.join(srcVendor, file); - const distFile = path.join(distVendor, file); - if (fs.statSync(srcFile).isFile()) { - fs.copyFileSync(srcFile, distFile); - console.log(`[copy-export-html-templates] Copied vendor/${file}`); - } - } - } - - console.log("[copy-export-html-templates] Done"); -} - -copyExportHtmlTemplates(); diff --git a/scripts/copy-hook-metadata.ts b/scripts/copy-hook-metadata.ts deleted file mode 100644 index 737ed4a9d70..00000000000 --- a/scripts/copy-hook-metadata.ts +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env tsx -/** - * Copy HOOK.md files from src/hooks/bundled to dist/bundled - */ - -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const projectRoot = path.resolve(__dirname, ".."); - -const srcBundled = path.join(projectRoot, "src", "hooks", "bundled"); -const distBundled = path.join(projectRoot, "dist", "bundled"); - -function copyHookMetadata() { - if (!fs.existsSync(srcBundled)) { - console.warn("[copy-hook-metadata] Source directory not found:", srcBundled); - return; - } - - if (!fs.existsSync(distBundled)) { - fs.mkdirSync(distBundled, { recursive: true }); - } - - const entries = fs.readdirSync(srcBundled, { withFileTypes: true }); - - for (const entry of entries) { - if (!entry.isDirectory()) { - continue; - } - - const hookName = entry.name; - const srcHookDir = path.join(srcBundled, hookName); - const distHookDir = path.join(distBundled, hookName); - const srcHookMd = path.join(srcHookDir, "HOOK.md"); - const distHookMd = path.join(distHookDir, "HOOK.md"); - - if (!fs.existsSync(srcHookMd)) { - console.warn(`[copy-hook-metadata] No HOOK.md found for ${hookName}`); - continue; - } - - if (!fs.existsSync(distHookDir)) { - fs.mkdirSync(distHookDir, { recursive: true }); - } - - fs.copyFileSync(srcHookMd, distHookMd); - console.log(`[copy-hook-metadata] Copied ${hookName}/HOOK.md`); - } - - console.log("[copy-hook-metadata] Done"); -} - -copyHookMetadata(); diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 24ba4719aa4..f7321a3c890 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -188,8 +188,8 @@ fi # ── build ──────────────────────────────────────────────────────────────────── -# The `prepack` script (triggered by `npm publish`) runs the full build chain: -# pnpm build && pnpm ui:build && pnpm web:build && pnpm web:prepack +# The `prepack` script (triggered by `npm publish`) runs the IronClaw build chain: +# pnpm build && pnpm web:build && pnpm web:prepack # Running `pnpm build` here is a redundant fail-fast: catch CLI build errors # before committing to a publish attempt. if [[ "$SKIP_BUILD" != true ]]; then diff --git a/scripts/e2e/Dockerfile b/scripts/e2e/Dockerfile index 488a5c029e2..af92e780964 100644 --- a/scripts/e2e/Dockerfile +++ b/scripts/e2e/Dockerfile @@ -6,7 +6,7 @@ WORKDIR /app ENV NODE_OPTIONS="--disable-warning=ExperimentalWarning" -COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.json tsconfig.plugin-sdk.dts.json tsdown.config.ts vitest.config.ts vitest.e2e.config.ts openclaw.mjs ./ +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.json tsdown.config.ts vitest.config.ts vitest.e2e.config.ts openclaw.mjs ./ COPY src ./src COPY test ./test COPY scripts ./scripts diff --git a/scripts/protocol-gen-swift.ts b/scripts/protocol-gen-swift.ts index 4f3033a05e9..8ba186e5f81 100644 --- a/scripts/protocol-gen-swift.ts +++ b/scripts/protocol-gen-swift.ts @@ -30,7 +30,7 @@ const outPaths = [ const header = `// Generated by scripts/protocol-gen-swift.ts — do not edit by hand\n// swiftlint:disable file_length\nimport Foundation\n\npublic let GATEWAY_PROTOCOL_VERSION = ${PROTOCOL_VERSION}\n\npublic enum ErrorCode: String, Codable, Sendable {\n${Object.values( ErrorCodes, ) - .map((c) => ` case ${camelCase(c)} = "${c}"`) + .map((c: string) => ` case ${camelCase(c)} = "${c}"`) .join("\n")}\n}\n`; const reserved = new Set([ @@ -211,7 +211,7 @@ function emitGatewayFrame(): string { } async function generate() { - const definitions = Object.entries(ProtocolSchemas) as Array<[string, JsonSchema]>; + const definitions: Array<[string, JsonSchema]> = Object.entries(ProtocolSchemas); for (const [name, schema] of definitions) { schemaNameByObject.set(schema as object, name); diff --git a/scripts/release-check.ts b/scripts/release-check.ts index 7e2bd449044..492501bf116 100755 --- a/scripts/release-check.ts +++ b/scripts/release-check.ts @@ -1,30 +1,13 @@ #!/usr/bin/env -S node --import tsx import { execSync } from "node:child_process"; -import { readdirSync, readFileSync } from "node:fs"; -import { join, resolve } from "node:path"; type PackFile = { path: string }; type PackResult = { files?: PackFile[] }; -const requiredPathGroups = [ - ["dist/index.js", "dist/index.mjs"], - ["dist/entry.js", "dist/entry.mjs"], - "dist/plugin-sdk/index.js", - "dist/plugin-sdk/index.d.ts", - "dist/build-info.json", -]; +const requiredPathGroups = [["dist/entry.js", "dist/entry.mjs"], "dist/build-info.json"]; const forbiddenPrefixes = ["dist/OpenClaw.app/"]; -type PackageJson = { - name?: string; - version?: string; -}; - -function normalizePluginSyncVersion(version: string): string { - return version.replace(/[-+].*$/, ""); -} - function runPackDry(): PackResult[] { const raw = execSync("npm pack --dry-run --json --ignore-scripts", { encoding: "utf8", @@ -34,57 +17,7 @@ function runPackDry(): PackResult[] { return JSON.parse(raw) as PackResult[]; } -function checkPluginVersions() { - const rootPackagePath = resolve("package.json"); - const rootPackage = JSON.parse(readFileSync(rootPackagePath, "utf8")) as PackageJson; - const targetVersion = rootPackage.version; - const targetBaseVersion = targetVersion ? normalizePluginSyncVersion(targetVersion) : null; - - if (!targetVersion || !targetBaseVersion) { - console.error("release-check: root package.json missing version."); - process.exit(1); - } - - const extensionsDir = resolve("extensions"); - const entries = readdirSync(extensionsDir, { withFileTypes: true }).filter((entry) => - entry.isDirectory(), - ); - - const mismatches: string[] = []; - - for (const entry of entries) { - const packagePath = join(extensionsDir, entry.name, "package.json"); - let pkg: PackageJson; - try { - pkg = JSON.parse(readFileSync(packagePath, "utf8")) as PackageJson; - } catch { - continue; - } - - if (!pkg.name || !pkg.version) { - continue; - } - - if (normalizePluginSyncVersion(pkg.version) !== targetBaseVersion) { - mismatches.push(`${pkg.name} (${pkg.version})`); - } - } - - if (mismatches.length > 0) { - console.error( - `release-check: plugin versions must match release base ${targetBaseVersion} (root ${targetVersion}):`, - ); - for (const item of mismatches) { - console.error(` - ${item}`); - } - console.error("release-check: run `pnpm plugins:sync` to align plugin versions."); - process.exit(1); - } -} - function main() { - checkPluginVersions(); - const results = runPackDry(); const files = results.flatMap((entry) => entry.files ?? []); const paths = new Set(files.map((file) => file.path)); diff --git a/scripts/write-cli-compat.ts b/scripts/write-cli-compat.ts deleted file mode 100644 index f818a56ea18..00000000000 --- a/scripts/write-cli-compat.ts +++ /dev/null @@ -1,74 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { - LEGACY_DAEMON_CLI_EXPORTS, - resolveLegacyDaemonCliAccessors, -} from "../src/cli/daemon-cli-compat.ts"; - -const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); -const distDir = path.join(rootDir, "dist"); -const cliDir = path.join(distDir, "cli"); - -const findCandidates = () => - fs.readdirSync(distDir).filter((entry) => { - const isDaemonCliBundle = - entry === "daemon-cli.js" || entry === "daemon-cli.mjs" || entry.startsWith("daemon-cli-"); - if (!isDaemonCliBundle) { - return false; - } - // tsdown can emit either .js or .mjs depending on bundler settings/runtime. - return entry.endsWith(".js") || entry.endsWith(".mjs"); - }); - -// In rare cases, build output can land slightly after this script starts (depending on FS timing). -// Retry briefly to avoid flaky builds. -let candidates = findCandidates(); -for (let i = 0; i < 10 && candidates.length === 0; i++) { - await new Promise((resolve) => setTimeout(resolve, 50)); - candidates = findCandidates(); -} - -if (candidates.length === 0) { - throw new Error("No daemon-cli bundle found in dist; cannot write legacy CLI shim."); -} - -const orderedCandidates = candidates.toSorted(); -const resolved = orderedCandidates - .map((entry) => { - const source = fs.readFileSync(path.join(distDir, entry), "utf8"); - const accessors = resolveLegacyDaemonCliAccessors(source); - return { entry, accessors }; - }) - .find((entry) => Boolean(entry.accessors)); - -if (!resolved?.accessors) { - throw new Error( - `Could not resolve daemon-cli export aliases from dist bundles: ${orderedCandidates.join(", ")}`, - ); -} - -const target = resolved.entry; -const relPath = `../${target}`; -const { accessors } = resolved; -const missingExportError = (name: string) => - `Legacy daemon CLI export "${name}" is unavailable in this build. Please upgrade OpenClaw.`; -const buildExportLine = (name: (typeof LEGACY_DAEMON_CLI_EXPORTS)[number]) => { - const accessor = accessors[name]; - if (accessor) { - return `export const ${name} = daemonCli.${accessor};`; - } - if (name === "registerDaemonCli") { - return `export const ${name} = () => { throw new Error(${JSON.stringify(missingExportError(name))}); };`; - } - return `export const ${name} = async () => { throw new Error(${JSON.stringify(missingExportError(name))}); };`; -}; - -const contents = - "// Legacy shim for pre-tsdown update-cli imports.\n" + - `import * as daemonCli from "${relPath}";\n` + - LEGACY_DAEMON_CLI_EXPORTS.map(buildExportLine).join("\n") + - "\n"; - -fs.mkdirSync(cliDir, { recursive: true }); -fs.writeFileSync(path.join(cliDir, "daemon-cli.js"), contents); diff --git a/scripts/write-plugin-sdk-entry-dts.ts b/scripts/write-plugin-sdk-entry-dts.ts deleted file mode 100644 index 674f89ed13a..00000000000 --- a/scripts/write-plugin-sdk-entry-dts.ts +++ /dev/null @@ -1,15 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; - -// `tsc` emits declarations under `dist/plugin-sdk/plugin-sdk/*` because the source lives -// at `src/plugin-sdk/*` and `rootDir` is `src/`. -// -// Our package export map points subpath `types` at `dist/plugin-sdk/.d.ts`, so we -// generate stable entry d.ts files that re-export the real declarations. -const entrypoints = ["index", "account-id"] as const; -for (const entry of entrypoints) { - const out = path.join(process.cwd(), `dist/plugin-sdk/${entry}.d.ts`); - fs.mkdirSync(path.dirname(out), { recursive: true }); - // NodeNext: reference the runtime specifier with `.js`, TS will map it to `.d.ts`. - fs.writeFileSync(out, `export * from "./plugin-sdk/${entry}.js";\n`, "utf8"); -} diff --git a/src/acp/client.test.ts b/src/acp/client.test.ts deleted file mode 100644 index 2ed1e38230a..00000000000 --- a/src/acp/client.test.ts +++ /dev/null @@ -1,217 +0,0 @@ -import type { RequestPermissionRequest } from "@agentclientprotocol/sdk"; -import { describe, expect, it, vi } from "vitest"; -import { resolvePermissionRequest } from "./client.js"; -import { extractAttachmentsFromPrompt, extractTextFromPrompt } from "./event-mapper.js"; - -function makePermissionRequest( - overrides: Partial = {}, -): RequestPermissionRequest { - const { toolCall: toolCallOverride, options: optionsOverride, ...restOverrides } = overrides; - const base: RequestPermissionRequest = { - sessionId: "session-1", - toolCall: { - toolCallId: "tool-1", - title: "read: src/index.ts", - status: "pending", - }, - options: [ - { kind: "allow_once", name: "Allow once", optionId: "allow" }, - { kind: "reject_once", name: "Reject once", optionId: "reject" }, - ], - }; - - return { - ...base, - ...restOverrides, - toolCall: toolCallOverride ? { ...base.toolCall, ...toolCallOverride } : base.toolCall, - options: optionsOverride ?? base.options, - }; -} - -describe("resolvePermissionRequest", () => { - it("auto-approves safe tools without prompting", async () => { - const prompt = vi.fn(async () => true); - const res = await resolvePermissionRequest(makePermissionRequest(), { prompt, log: () => {} }); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "allow" } }); - expect(prompt).not.toHaveBeenCalled(); - }); - - it("prompts for dangerous tool names inferred from title", async () => { - const prompt = vi.fn(async () => true); - const res = await resolvePermissionRequest( - makePermissionRequest({ - toolCall: { toolCallId: "tool-2", title: "exec: uname -a", status: "pending" }, - }), - { prompt, log: () => {} }, - ); - expect(prompt).toHaveBeenCalledTimes(1); - expect(prompt).toHaveBeenCalledWith("exec", "exec: uname -a"); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "allow" } }); - }); - - it("prompts for non-read/search tools (write)", async () => { - const prompt = vi.fn(async () => true); - const res = await resolvePermissionRequest( - makePermissionRequest({ - toolCall: { toolCallId: "tool-w", title: "write: /tmp/pwn", status: "pending" }, - }), - { prompt, log: () => {} }, - ); - expect(prompt).toHaveBeenCalledTimes(1); - expect(prompt).toHaveBeenCalledWith("write", "write: /tmp/pwn"); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "allow" } }); - }); - - it("auto-approves search without prompting", async () => { - const prompt = vi.fn(async () => true); - const res = await resolvePermissionRequest( - makePermissionRequest({ - toolCall: { toolCallId: "tool-s", title: "search: foo", status: "pending" }, - }), - { prompt, log: () => {} }, - ); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "allow" } }); - expect(prompt).not.toHaveBeenCalled(); - }); - - it("prompts for fetch even when tool name is known", async () => { - const prompt = vi.fn(async () => false); - const res = await resolvePermissionRequest( - makePermissionRequest({ - toolCall: { toolCallId: "tool-f", title: "fetch: https://example.com", status: "pending" }, - }), - { prompt, log: () => {} }, - ); - expect(prompt).toHaveBeenCalledTimes(1); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "reject" } }); - }); - - it("prompts when tool name contains read/search substrings but isn't a safe kind", async () => { - const prompt = vi.fn(async () => false); - const res = await resolvePermissionRequest( - makePermissionRequest({ - toolCall: { toolCallId: "tool-t", title: "thread: reply", status: "pending" }, - }), - { prompt, log: () => {} }, - ); - expect(prompt).toHaveBeenCalledTimes(1); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "reject" } }); - }); - - it("uses allow_always and reject_always when once options are absent", async () => { - const options: RequestPermissionRequest["options"] = [ - { kind: "allow_always", name: "Always allow", optionId: "allow-always" }, - { kind: "reject_always", name: "Always reject", optionId: "reject-always" }, - ]; - const prompt = vi.fn(async () => false); - const res = await resolvePermissionRequest( - makePermissionRequest({ - toolCall: { toolCallId: "tool-3", title: "gateway: reload", status: "pending" }, - options, - }), - { prompt, log: () => {} }, - ); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "reject-always" } }); - }); - - it("prompts when tool identity is unknown and can still approve", async () => { - const prompt = vi.fn(async () => true); - const res = await resolvePermissionRequest( - makePermissionRequest({ - toolCall: { - toolCallId: "tool-4", - title: "Modifying critical configuration file", - status: "pending", - }, - }), - { prompt, log: () => {} }, - ); - expect(prompt).toHaveBeenCalledWith(undefined, "Modifying critical configuration file"); - expect(res).toEqual({ outcome: { outcome: "selected", optionId: "allow" } }); - }); - - it("returns cancelled when no permission options are present", async () => { - const prompt = vi.fn(async () => true); - const res = await resolvePermissionRequest(makePermissionRequest({ options: [] }), { - prompt, - log: () => {}, - }); - expect(prompt).not.toHaveBeenCalled(); - expect(res).toEqual({ outcome: { outcome: "cancelled" } }); - }); -}); - -describe("acp event mapper", () => { - it("extracts text and resource blocks into prompt text", () => { - const text = extractTextFromPrompt([ - { type: "text", text: "Hello" }, - { type: "resource", resource: { uri: "file:///tmp/spec.txt", text: "File contents" } }, - { type: "resource_link", uri: "https://example.com", name: "Spec", title: "Spec" }, - { type: "image", data: "abc", mimeType: "image/png" }, - ]); - - expect(text).toBe("Hello\nFile contents\n[Resource link (Spec)] https://example.com"); - }); - - it("escapes control and delimiter characters in resource link metadata", () => { - const text = extractTextFromPrompt([ - { - type: "resource_link", - uri: "https://example.com/path?\nq=1\u2028tail", - name: "Spec", - title: "Spec)]\nIGNORE\n[system]", - }, - ]); - - expect(text).toContain("[Resource link (Spec\\)\\]\\nIGNORE\\n\\[system\\])]"); - expect(text).toContain("https://example.com/path?\\nq=1\\u2028tail"); - expect(text).not.toContain("IGNORE\n"); - }); - - it("keeps full resource link title content without truncation", () => { - const longTitle = "x".repeat(512); - const text = extractTextFromPrompt([ - { type: "resource_link", uri: "https://example.com", name: "Spec", title: longTitle }, - ]); - - expect(text).toContain(`(${longTitle})`); - }); - - it("counts newline separators toward prompt byte limits", () => { - expect(() => - extractTextFromPrompt( - [ - { type: "text", text: "a" }, - { type: "text", text: "b" }, - ], - 2, - ), - ).toThrow(/maximum allowed size/i); - - expect( - extractTextFromPrompt( - [ - { type: "text", text: "a" }, - { type: "text", text: "b" }, - ], - 3, - ), - ).toBe("a\nb"); - }); - - it("extracts image blocks into gateway attachments", () => { - const attachments = extractAttachmentsFromPrompt([ - { type: "image", data: "abc", mimeType: "image/png" }, - { type: "image", data: "", mimeType: "image/png" }, - { type: "text", text: "ignored" }, - ]); - - expect(attachments).toEqual([ - { - type: "image", - mimeType: "image/png", - content: "abc", - }, - ]); - }); -}); diff --git a/src/acp/client.ts b/src/acp/client.ts deleted file mode 100644 index 1eaf70c005f..00000000000 --- a/src/acp/client.ts +++ /dev/null @@ -1,428 +0,0 @@ -import { spawn, type ChildProcess } from "node:child_process"; -import fs from "node:fs"; -import path from "node:path"; -import * as readline from "node:readline"; -import { Readable, Writable } from "node:stream"; -import { fileURLToPath } from "node:url"; -import { - ClientSideConnection, - PROTOCOL_VERSION, - ndJsonStream, - type RequestPermissionRequest, - type RequestPermissionResponse, - type SessionNotification, -} from "@agentclientprotocol/sdk"; -import { ensureOpenClawCliOnPath } from "../infra/path-env.js"; -import { DANGEROUS_ACP_TOOLS } from "../security/dangerous-tools.js"; - -const SAFE_AUTO_APPROVE_KINDS = new Set(["read", "search"]); - -type PermissionOption = RequestPermissionRequest["options"][number]; - -type PermissionResolverDeps = { - prompt?: (toolName: string | undefined, toolTitle?: string) => Promise; - log?: (line: string) => void; -}; - -function asRecord(value: unknown): Record | undefined { - return value && typeof value === "object" && !Array.isArray(value) - ? (value as Record) - : undefined; -} - -function readFirstStringValue( - source: Record | undefined, - keys: string[], -): string | undefined { - if (!source) { - return undefined; - } - for (const key of keys) { - const value = source[key]; - if (typeof value === "string" && value.trim()) { - return value.trim(); - } - } - return undefined; -} - -function normalizeToolName(value: string): string | undefined { - const normalized = value.trim().toLowerCase(); - if (!normalized) { - return undefined; - } - return normalized; -} - -function parseToolNameFromTitle(title: string | undefined | null): string | undefined { - if (!title) { - return undefined; - } - const head = title.split(":", 1)[0]?.trim(); - if (!head || !/^[a-zA-Z0-9._-]+$/.test(head)) { - return undefined; - } - return normalizeToolName(head); -} - -function resolveToolKindForPermission( - params: RequestPermissionRequest, - toolName: string | undefined, -): string | undefined { - const toolCall = params.toolCall as unknown as { kind?: unknown; title?: unknown } | undefined; - const kindRaw = typeof toolCall?.kind === "string" ? toolCall.kind.trim().toLowerCase() : ""; - if (kindRaw) { - return kindRaw; - } - const name = - toolName ?? - parseToolNameFromTitle(typeof toolCall?.title === "string" ? toolCall.title : undefined); - if (!name) { - return undefined; - } - const normalized = name.toLowerCase(); - - const hasToken = (token: string) => { - // Tool names tend to be snake_case. Avoid substring heuristics (ex: "thread" contains "read"). - const re = new RegExp(`(?:^|[._-])${token}(?:$|[._-])`); - return re.test(normalized); - }; - - // Prefer a conservative classifier: only classify safe kinds when confident. - if (normalized === "read" || hasToken("read")) { - return "read"; - } - if (normalized === "search" || hasToken("search") || hasToken("find")) { - return "search"; - } - if (normalized.includes("fetch") || normalized.includes("http")) { - return "fetch"; - } - if (normalized.includes("write") || normalized.includes("edit") || normalized.includes("patch")) { - return "edit"; - } - if (normalized.includes("delete") || normalized.includes("remove")) { - return "delete"; - } - if (normalized.includes("move") || normalized.includes("rename")) { - return "move"; - } - if (normalized.includes("exec") || normalized.includes("run") || normalized.includes("bash")) { - return "execute"; - } - return "other"; -} - -function resolveToolNameForPermission(params: RequestPermissionRequest): string | undefined { - const toolCall = params.toolCall; - const toolMeta = asRecord(toolCall?._meta); - const rawInput = asRecord(toolCall?.rawInput); - - const fromMeta = readFirstStringValue(toolMeta, ["toolName", "tool_name", "name"]); - const fromRawInput = readFirstStringValue(rawInput, ["tool", "toolName", "tool_name", "name"]); - const fromTitle = parseToolNameFromTitle(toolCall?.title); - return normalizeToolName(fromMeta ?? fromRawInput ?? fromTitle ?? ""); -} - -function pickOption( - options: PermissionOption[], - kinds: PermissionOption["kind"][], -): PermissionOption | undefined { - for (const kind of kinds) { - const match = options.find((option) => option.kind === kind); - if (match) { - return match; - } - } - return undefined; -} - -function selectedPermission(optionId: string): RequestPermissionResponse { - return { outcome: { outcome: "selected", optionId } }; -} - -function cancelledPermission(): RequestPermissionResponse { - return { outcome: { outcome: "cancelled" } }; -} - -function promptUserPermission(toolName: string | undefined, toolTitle?: string): Promise { - if (!process.stdin.isTTY || !process.stderr.isTTY) { - console.error(`[permission denied] ${toolName ?? "unknown"}: non-interactive terminal`); - return Promise.resolve(false); - } - return new Promise((resolve) => { - let settled = false; - const rl = readline.createInterface({ - input: process.stdin, - output: process.stderr, - }); - - const finish = (approved: boolean) => { - if (settled) { - return; - } - settled = true; - clearTimeout(timeout); - rl.close(); - resolve(approved); - }; - - const timeout = setTimeout(() => { - console.error(`\n[permission timeout] denied: ${toolName ?? "unknown"}`); - finish(false); - }, 30_000); - - const label = toolTitle - ? toolName - ? `${toolTitle} (${toolName})` - : toolTitle - : (toolName ?? "unknown tool"); - rl.question(`\n[permission] Allow "${label}"? (y/N) `, (answer) => { - const approved = answer.trim().toLowerCase() === "y"; - console.error(`[permission ${approved ? "approved" : "denied"}] ${toolName ?? "unknown"}`); - finish(approved); - }); - }); -} - -export async function resolvePermissionRequest( - params: RequestPermissionRequest, - deps: PermissionResolverDeps = {}, -): Promise { - const log = deps.log ?? ((line: string) => console.error(line)); - const prompt = deps.prompt ?? promptUserPermission; - const options = params.options ?? []; - const toolTitle = params.toolCall?.title ?? "tool"; - const toolName = resolveToolNameForPermission(params); - const toolKind = resolveToolKindForPermission(params, toolName); - - if (options.length === 0) { - log(`[permission cancelled] ${toolName ?? "unknown"}: no options available`); - return cancelledPermission(); - } - - const allowOption = pickOption(options, ["allow_once", "allow_always"]); - const rejectOption = pickOption(options, ["reject_once", "reject_always"]); - const isSafeKind = Boolean(toolKind && SAFE_AUTO_APPROVE_KINDS.has(toolKind)); - const promptRequired = !toolName || !isSafeKind || DANGEROUS_ACP_TOOLS.has(toolName); - - if (!promptRequired) { - const option = allowOption ?? options[0]; - if (!option) { - log(`[permission cancelled] ${toolName}: no selectable options`); - return cancelledPermission(); - } - log(`[permission auto-approved] ${toolName} (${toolKind ?? "unknown"})`); - return selectedPermission(option.optionId); - } - - log( - `\n[permission requested] ${toolTitle}${toolName ? ` (${toolName})` : ""}${toolKind ? ` [${toolKind}]` : ""}`, - ); - const approved = await prompt(toolName, toolTitle); - - if (approved && allowOption) { - return selectedPermission(allowOption.optionId); - } - if (!approved && rejectOption) { - return selectedPermission(rejectOption.optionId); - } - - log( - `[permission cancelled] ${toolName ?? "unknown"}: missing ${approved ? "allow" : "reject"} option`, - ); - return cancelledPermission(); -} - -export type AcpClientOptions = { - cwd?: string; - serverCommand?: string; - serverArgs?: string[]; - serverVerbose?: boolean; - verbose?: boolean; -}; - -export type AcpClientHandle = { - client: ClientSideConnection; - agent: ChildProcess; - sessionId: string; -}; - -function toArgs(value: string[] | string | undefined): string[] { - if (!value) { - return []; - } - return Array.isArray(value) ? value : [value]; -} - -function buildServerArgs(opts: AcpClientOptions): string[] { - const args = ["acp", ...toArgs(opts.serverArgs)]; - if (opts.serverVerbose && !args.includes("--verbose") && !args.includes("-v")) { - args.push("--verbose"); - } - return args; -} - -function resolveSelfEntryPath(): string | null { - // Prefer a path relative to the built module location (dist/acp/client.js -> dist/entry.js). - try { - const here = fileURLToPath(import.meta.url); - const candidate = path.resolve(path.dirname(here), "..", "entry.js"); - if (fs.existsSync(candidate)) { - return candidate; - } - } catch { - // ignore - } - - const argv1 = process.argv[1]?.trim(); - if (argv1) { - return path.isAbsolute(argv1) ? argv1 : path.resolve(process.cwd(), argv1); - } - return null; -} - -function printSessionUpdate(notification: SessionNotification): void { - const update = notification.update; - if (!("sessionUpdate" in update)) { - return; - } - - switch (update.sessionUpdate) { - case "agent_message_chunk": { - if (update.content?.type === "text") { - process.stdout.write(update.content.text); - } - return; - } - case "tool_call": { - console.log(`\n[tool] ${update.title} (${update.status})`); - return; - } - case "tool_call_update": { - if (update.status) { - console.log(`[tool update] ${update.toolCallId}: ${update.status}`); - } - return; - } - case "available_commands_update": { - const names = update.availableCommands?.map((cmd) => `/${cmd.name}`).join(" "); - if (names) { - console.log(`\n[commands] ${names}`); - } - return; - } - default: - return; - } -} - -export async function createAcpClient(opts: AcpClientOptions = {}): Promise { - const cwd = opts.cwd ?? process.cwd(); - const verbose = Boolean(opts.verbose); - const log = verbose ? (msg: string) => console.error(`[acp-client] ${msg}`) : () => {}; - - ensureOpenClawCliOnPath(); - const serverArgs = buildServerArgs(opts); - - const entryPath = resolveSelfEntryPath(); - const serverCommand = opts.serverCommand ?? (entryPath ? process.execPath : "openclaw"); - const effectiveArgs = opts.serverCommand || !entryPath ? serverArgs : [entryPath, ...serverArgs]; - - log(`spawning: ${serverCommand} ${effectiveArgs.join(" ")}`); - - const agent = spawn(serverCommand, effectiveArgs, { - stdio: ["pipe", "pipe", "inherit"], - cwd, - }); - - if (!agent.stdin || !agent.stdout) { - throw new Error("Failed to create ACP stdio pipes"); - } - - const input = Writable.toWeb(agent.stdin); - const output = Readable.toWeb(agent.stdout) as unknown as ReadableStream; - const stream = ndJsonStream(input, output); - - const client = new ClientSideConnection( - () => ({ - sessionUpdate: async (params: SessionNotification) => { - printSessionUpdate(params); - }, - requestPermission: async (params: RequestPermissionRequest) => { - return resolvePermissionRequest(params); - }, - }), - stream, - ); - - log("initializing"); - await client.initialize({ - protocolVersion: PROTOCOL_VERSION, - clientCapabilities: { - fs: { readTextFile: true, writeTextFile: true }, - terminal: true, - }, - clientInfo: { name: "openclaw-acp-client", version: "1.0.0" }, - }); - - log("creating session"); - const session = await client.newSession({ - cwd, - mcpServers: [], - }); - - return { - client, - agent, - sessionId: session.sessionId, - }; -} - -export async function runAcpClientInteractive(opts: AcpClientOptions = {}): Promise { - const { client, agent, sessionId } = await createAcpClient(opts); - - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - console.log("OpenClaw ACP client"); - console.log(`Session: ${sessionId}`); - console.log('Type a prompt, or "exit" to quit.\n'); - - const prompt = () => { - rl.question("> ", async (input) => { - const text = input.trim(); - if (!text) { - prompt(); - return; - } - if (text === "exit" || text === "quit") { - agent.kill(); - rl.close(); - process.exit(0); - } - - try { - const response = await client.prompt({ - sessionId, - prompt: [{ type: "text", text }], - }); - console.log(`\n[${response.stopReason}]\n`); - } catch (err) { - console.error(`\n[error] ${String(err)}\n`); - } - - prompt(); - }); - }; - - prompt(); - - agent.on("exit", (code) => { - console.log(`\nAgent exited with code ${code ?? 0}`); - rl.close(); - process.exit(code ?? 0); - }); -} diff --git a/src/acp/commands.ts b/src/acp/commands.ts deleted file mode 100644 index 6bd8e85a819..00000000000 --- a/src/acp/commands.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { AvailableCommand } from "@agentclientprotocol/sdk"; - -export function getAvailableCommands(): AvailableCommand[] { - return [ - { name: "help", description: "Show help and common commands." }, - { name: "commands", description: "List available commands." }, - { name: "status", description: "Show current status." }, - { - name: "context", - description: "Explain context usage (list|detail|json).", - input: { hint: "list | detail | json" }, - }, - { name: "whoami", description: "Show sender id (alias: /id)." }, - { name: "id", description: "Alias for /whoami." }, - { name: "subagents", description: "List or manage sub-agents." }, - { name: "config", description: "Read or write config (owner-only)." }, - { name: "debug", description: "Set runtime-only overrides (owner-only)." }, - { name: "usage", description: "Toggle usage footer (off|tokens|full)." }, - { name: "stop", description: "Stop the current run." }, - { name: "restart", description: "Restart the gateway (if enabled)." }, - { name: "dock-telegram", description: "Route replies to Telegram." }, - { name: "dock-discord", description: "Route replies to Discord." }, - { name: "dock-slack", description: "Route replies to Slack." }, - { name: "activation", description: "Set group activation (mention|always)." }, - { name: "send", description: "Set send mode (on|off|inherit)." }, - { name: "reset", description: "Reset the session (/new)." }, - { name: "new", description: "Reset the session (/reset)." }, - { - name: "think", - description: "Set thinking level (off|minimal|low|medium|high|xhigh).", - }, - { name: "verbose", description: "Set verbose mode (on|full|off)." }, - { name: "reasoning", description: "Toggle reasoning output (on|off|stream)." }, - { name: "elevated", description: "Toggle elevated mode (on|off)." }, - { name: "model", description: "Select a model (list|status|)." }, - { name: "queue", description: "Adjust queue mode and options." }, - { name: "bash", description: "Run a host command (if enabled)." }, - { name: "compact", description: "Compact the session history." }, - ]; -} diff --git a/src/acp/event-mapper.ts b/src/acp/event-mapper.ts deleted file mode 100644 index bf31247d6cc..00000000000 --- a/src/acp/event-mapper.ts +++ /dev/null @@ -1,133 +0,0 @@ -import type { ContentBlock, ImageContent, ToolKind } from "@agentclientprotocol/sdk"; - -export type GatewayAttachment = { - type: string; - mimeType: string; - content: string; -}; - -function escapeInlineControlChars(value: string): string { - const withoutNull = value.replaceAll("\0", "\\0"); - return withoutNull.replace(/[\r\n\t\v\f\u2028\u2029]/g, (char) => { - switch (char) { - case "\r": - return "\\r"; - case "\n": - return "\\n"; - case "\t": - return "\\t"; - case "\v": - return "\\v"; - case "\f": - return "\\f"; - case "\u2028": - return "\\u2028"; - case "\u2029": - return "\\u2029"; - default: - return char; - } - }); -} - -function escapeResourceTitle(value: string): string { - // Keep title content, but escape characters that can break the resource-link annotation shape. - return escapeInlineControlChars(value).replace(/[()[\]]/g, (char) => `\\${char}`); -} - -export function extractTextFromPrompt(prompt: ContentBlock[], maxBytes?: number): string { - const parts: string[] = []; - // Track accumulated byte count per block to catch oversized prompts before full concatenation - let totalBytes = 0; - for (const block of prompt) { - let blockText: string | undefined; - if (block.type === "text") { - blockText = block.text; - } else if (block.type === "resource") { - const resource = block.resource as { text?: string } | undefined; - if (resource?.text) { - blockText = resource.text; - } - } else if (block.type === "resource_link") { - const title = block.title ? ` (${escapeResourceTitle(block.title)})` : ""; - const uri = block.uri ? escapeInlineControlChars(block.uri) : ""; - blockText = uri ? `[Resource link${title}] ${uri}` : `[Resource link${title}]`; - } - if (blockText !== undefined) { - // Guard: reject before allocating the full concatenated string - if (maxBytes !== undefined) { - const separatorBytes = parts.length > 0 ? 1 : 0; // "\n" added by join() between blocks - totalBytes += separatorBytes + Buffer.byteLength(blockText, "utf-8"); - if (totalBytes > maxBytes) { - throw new Error(`Prompt exceeds maximum allowed size of ${maxBytes} bytes`); - } - } - parts.push(blockText); - } - } - return parts.join("\n"); -} - -export function extractAttachmentsFromPrompt(prompt: ContentBlock[]): GatewayAttachment[] { - const attachments: GatewayAttachment[] = []; - for (const block of prompt) { - if (block.type !== "image") { - continue; - } - const image = block as ImageContent; - if (!image.data || !image.mimeType) { - continue; - } - attachments.push({ - type: "image", - mimeType: image.mimeType, - content: image.data, - }); - } - return attachments; -} - -export function formatToolTitle( - name: string | undefined, - args: Record | undefined, -): string { - const base = name ?? "tool"; - if (!args || Object.keys(args).length === 0) { - return base; - } - const parts = Object.entries(args).map(([key, value]) => { - const raw = typeof value === "string" ? value : JSON.stringify(value); - const safe = raw.length > 100 ? `${raw.slice(0, 100)}...` : raw; - return `${key}: ${safe}`; - }); - return `${base}: ${parts.join(", ")}`; -} - -export function inferToolKind(name?: string): ToolKind { - if (!name) { - return "other"; - } - const normalized = name.toLowerCase(); - if (normalized.includes("read")) { - return "read"; - } - if (normalized.includes("write") || normalized.includes("edit")) { - return "edit"; - } - if (normalized.includes("delete") || normalized.includes("remove")) { - return "delete"; - } - if (normalized.includes("move") || normalized.includes("rename")) { - return "move"; - } - if (normalized.includes("search") || normalized.includes("find")) { - return "search"; - } - if (normalized.includes("exec") || normalized.includes("run") || normalized.includes("bash")) { - return "execute"; - } - if (normalized.includes("fetch") || normalized.includes("http")) { - return "fetch"; - } - return "other"; -} diff --git a/src/acp/index.ts b/src/acp/index.ts deleted file mode 100644 index 6af9efffbe1..00000000000 --- a/src/acp/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { serveAcpGateway } from "./server.js"; -export { createInMemorySessionStore } from "./session.js"; -export type { AcpSessionStore } from "./session.js"; -export type { AcpServerOptions } from "./types.js"; diff --git a/src/acp/meta.ts b/src/acp/meta.ts deleted file mode 100644 index eccd865dbd5..00000000000 --- a/src/acp/meta.ts +++ /dev/null @@ -1,47 +0,0 @@ -export function readString( - meta: Record | null | undefined, - keys: string[], -): string | undefined { - if (!meta) { - return undefined; - } - for (const key of keys) { - const value = meta[key]; - if (typeof value === "string" && value.trim()) { - return value.trim(); - } - } - return undefined; -} - -export function readBool( - meta: Record | null | undefined, - keys: string[], -): boolean | undefined { - if (!meta) { - return undefined; - } - for (const key of keys) { - const value = meta[key]; - if (typeof value === "boolean") { - return value; - } - } - return undefined; -} - -export function readNumber( - meta: Record | null | undefined, - keys: string[], -): number | undefined { - if (!meta) { - return undefined; - } - for (const key of keys) { - const value = meta[key]; - if (typeof value === "number" && Number.isFinite(value)) { - return value; - } - } - return undefined; -} diff --git a/src/acp/secret-file.ts b/src/acp/secret-file.ts deleted file mode 100644 index 537c9206659..00000000000 --- a/src/acp/secret-file.ts +++ /dev/null @@ -1,22 +0,0 @@ -import fs from "node:fs"; -import { resolveUserPath } from "../utils.js"; - -export function readSecretFromFile(filePath: string, label: string): string { - const resolvedPath = resolveUserPath(filePath.trim()); - if (!resolvedPath) { - throw new Error(`${label} file path is empty.`); - } - let raw = ""; - try { - raw = fs.readFileSync(resolvedPath, "utf8"); - } catch (err) { - throw new Error(`Failed to read ${label} file at ${resolvedPath}: ${String(err)}`, { - cause: err, - }); - } - const secret = raw.trim(); - if (!secret) { - throw new Error(`${label} file at ${resolvedPath} is empty.`); - } - return secret; -} diff --git a/src/acp/server.ts b/src/acp/server.ts deleted file mode 100644 index e47c292df82..00000000000 --- a/src/acp/server.ts +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env node -import { Readable, Writable } from "node:stream"; -import { fileURLToPath } from "node:url"; -import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"; -import { loadConfig } from "../config/config.js"; -import { resolveGatewayAuth } from "../gateway/auth.js"; -import { buildGatewayConnectionDetails } from "../gateway/call.js"; -import { GatewayClient } from "../gateway/client.js"; -import { isMainModule } from "../infra/is-main.js"; -import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js"; -import { readSecretFromFile } from "./secret-file.js"; -import { AcpGatewayAgent } from "./translator.js"; -import type { AcpServerOptions } from "./types.js"; - -export function serveAcpGateway(opts: AcpServerOptions = {}): Promise { - const cfg = loadConfig(); - const connection = buildGatewayConnectionDetails({ - config: cfg, - url: opts.gatewayUrl, - }); - - const isRemoteMode = cfg.gateway?.mode === "remote"; - const remote = isRemoteMode ? cfg.gateway?.remote : undefined; - const auth = resolveGatewayAuth({ authConfig: cfg.gateway?.auth, env: process.env }); - - const token = - opts.gatewayToken ?? - (isRemoteMode ? remote?.token?.trim() : undefined) ?? - process.env.OPENCLAW_GATEWAY_TOKEN ?? - auth.token; - const password = - opts.gatewayPassword ?? - (isRemoteMode ? remote?.password?.trim() : undefined) ?? - process.env.OPENCLAW_GATEWAY_PASSWORD ?? - auth.password; - - let agent: AcpGatewayAgent | null = null; - let onClosed!: () => void; - const closed = new Promise((resolve) => { - onClosed = resolve; - }); - let stopped = false; - - const gateway = new GatewayClient({ - url: connection.url, - token: token || undefined, - password: password || undefined, - clientName: GATEWAY_CLIENT_NAMES.CLI, - clientDisplayName: "ACP", - clientVersion: "acp", - mode: GATEWAY_CLIENT_MODES.CLI, - onEvent: (evt) => { - void agent?.handleGatewayEvent(evt); - }, - onHelloOk: () => { - agent?.handleGatewayReconnect(); - }, - onClose: (code, reason) => { - agent?.handleGatewayDisconnect(`${code}: ${reason}`); - // Resolve only on intentional shutdown (gateway.stop() sets closed - // which skips scheduleReconnect, then fires onClose). Transient - // disconnects are followed by automatic reconnect attempts. - if (stopped) { - onClosed(); - } - }, - }); - - const shutdown = () => { - if (stopped) { - return; - } - stopped = true; - gateway.stop(); - // If no WebSocket is active (e.g. between reconnect attempts), - // gateway.stop() won't trigger onClose, so resolve directly. - onClosed(); - }; - - process.once("SIGINT", shutdown); - process.once("SIGTERM", shutdown); - - const input = Writable.toWeb(process.stdout); - const output = Readable.toWeb(process.stdin) as unknown as ReadableStream; - const stream = ndJsonStream(input, output); - - new AgentSideConnection((conn: AgentSideConnection) => { - agent = new AcpGatewayAgent(conn, gateway, opts); - agent.start(); - return agent; - }, stream); - - gateway.start(); - return closed; -} - -function parseArgs(args: string[]): AcpServerOptions { - const opts: AcpServerOptions = {}; - let tokenFile: string | undefined; - let passwordFile: string | undefined; - for (let i = 0; i < args.length; i += 1) { - const arg = args[i]; - if (arg === "--url" || arg === "--gateway-url") { - opts.gatewayUrl = args[i + 1]; - i += 1; - continue; - } - if (arg === "--token" || arg === "--gateway-token") { - opts.gatewayToken = args[i + 1]; - i += 1; - continue; - } - if (arg === "--token-file" || arg === "--gateway-token-file") { - tokenFile = args[i + 1]; - i += 1; - continue; - } - if (arg === "--password" || arg === "--gateway-password") { - opts.gatewayPassword = args[i + 1]; - i += 1; - continue; - } - if (arg === "--password-file" || arg === "--gateway-password-file") { - passwordFile = args[i + 1]; - i += 1; - continue; - } - if (arg === "--session") { - opts.defaultSessionKey = args[i + 1]; - i += 1; - continue; - } - if (arg === "--session-label") { - opts.defaultSessionLabel = args[i + 1]; - i += 1; - continue; - } - if (arg === "--require-existing") { - opts.requireExistingSession = true; - continue; - } - if (arg === "--reset-session") { - opts.resetSession = true; - continue; - } - if (arg === "--no-prefix-cwd") { - opts.prefixCwd = false; - continue; - } - if (arg === "--verbose" || arg === "-v") { - opts.verbose = true; - continue; - } - if (arg === "--help" || arg === "-h") { - printHelp(); - process.exit(0); - } - } - if (opts.gatewayToken?.trim() && tokenFile?.trim()) { - throw new Error("Use either --token or --token-file."); - } - if (opts.gatewayPassword?.trim() && passwordFile?.trim()) { - throw new Error("Use either --password or --password-file."); - } - if (tokenFile?.trim()) { - opts.gatewayToken = readSecretFromFile(tokenFile, "Gateway token"); - } - if (passwordFile?.trim()) { - opts.gatewayPassword = readSecretFromFile(passwordFile, "Gateway password"); - } - return opts; -} - -function printHelp(): void { - console.log(`Usage: openclaw acp [options] - -Gateway-backed ACP server for IDE integration. - -Options: - --url Gateway WebSocket URL - --token Gateway auth token - --token-file Read gateway auth token from file - --password Gateway auth password - --password-file Read gateway auth password from file - --session Default session key (e.g. "agent:main:main") - --session-label