You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A targeted source audit on 2026-04-13 (fork HEAD 44b4f92b12) found ~19 provider/model files that had been gutted previously but were re-introduced by the sync: upstream to v2026.3.7 merge (#2298). Several restored stubs carry silent runtime regressions through dead call sites. This issue re-applies the cascade.
Context: Sync Regression Pattern
RemoteClaw replaced OpenClaw's embedded "Pi" agent engine with a subprocess-based CLI runtime architecture (Claude/Gemini/Codex/OpenCode via src/middleware/runtimes/). Multiple prior gut waves removed Pi-era model catalogs, provider helpers, and embedded-runner plumbing. The v2026.3.7 upstream sync re-introduced many of those files.
9ef18943dc sync: upstream to v2026.3.7 (893 commits) (#2298) ← REGRESSION
caca5bb6d8 gut(models): remove vestigial model catalog... (#2151) ← ORIGINAL GUT
0241706c9d sync: upstream to v2026.3.2 (862 commits) (#2172)
4608a6a6cf feat: remove in-process LLM packages... (#102)
Same pattern for src/gateway/server-methods/{models,skills}.ts, auto-reply stubs, and the src/agents/ provider catalog files. Each survives as a stub with the header comment // Gutted in RemoteClaw fork (Middleware Boundary Principle).
Hidden Runtime Regressions (Broken-But-Wired)
Three of the restored stubs have live consumers whose results are silently neutered, causing user-visible feature regressions:
src/telegram/bot-message-dispatch.ts — same pattern
src/telegram/sticker-cache.ts — same pattern
Decision needed in PR: does Telegram vision stay in v0.1.0?
If yes → replace capability check with runtime-reported capabilities from middleware/runtimes/*.ts::mediaCapabilities
If no → delete vision-related paths entirely
Recommended: remove the capability check; let CLI runtime's own mediaCapabilities field gate attachments (it already does this in the media pipeline — see middleware/media-capability.ts).
Node-host skills cascade (skills.ts deletion)
src/node-host/runner.ts — delete SkillBinsCache class + its instantiation at line 225 + remove skillBins param from handleInvoke()
After Models/Skills exports are deleted by the cascades above, the remaining agents-models-skills.ts is mostly LIVE Agents* and Tools* schemas. Rename/split it:
Upstream sync filter hardening (root cause) — the fork sync pipeline needs harder EXCLUDE enforcement to prevent future regressions. Separate concern, not blocking this issue.
onboard-auth.* cluster gut (13 files in src/commands/) — tracked as a separate issue; huggingface-models/synthetic-models/together-models/venice-models/models-config.providers in this cascade are dead because the onboard-auth cluster is dead, but their deletion is independent and belongs in this issue.
Disposition map corrections for false EXCLUDE markers on live files — tracked separately.
Implementation Notes
Order of operations: Delete stubs first, then fix compilation errors by removing consumer call sites. The TypeScript error cascade surfaces the full removal scope automatically.
Split into sub-PRs if the change set is too large to review in one pass. Suggested split boundaries: (1) Telegram vision cascade, (2) Gateway models/skills + schema split, (3) Auto-reply cascade (commands-models + session-reset-model + model-directive-test-utils), (4) Agents directory stub sweep (remaining model-*, synthetic-models, etc.), (5) Secrets + commands remnants.
Summary
A targeted source audit on 2026-04-13 (fork HEAD
44b4f92b12) found ~19 provider/model files that had been gutted previously but were re-introduced by thesync: upstream to v2026.3.7merge (#2298). Several restored stubs carry silent runtime regressions through dead call sites. This issue re-applies the cascade.Context: Sync Regression Pattern
RemoteClaw replaced OpenClaw's embedded "Pi" agent engine with a subprocess-based CLI runtime architecture (Claude/Gemini/Codex/OpenCode via
src/middleware/runtimes/). Multiple prior gut waves removed Pi-era model catalogs, provider helpers, and embedded-runner plumbing. The v2026.3.7 upstream sync re-introduced many of those files.Git evidence (example:
src/agents/model-catalog.ts):Same pattern for
src/gateway/server-methods/{models,skills}.ts, auto-reply stubs, and thesrc/agents/provider catalog files. Each survives as a stub with the header comment// Gutted in RemoteClaw fork (Middleware Boundary Principle).Hidden Runtime Regressions (Broken-But-Wired)
Three of the restored stubs have live consumers whose results are silently neutered, causing user-visible feature regressions:
src/agents/model-catalog.ts::modelSupportsVisionfalsetelegram/bot-message-dispatch.ts,bot-message-context.body.ts,sticker-cache.tssrc/gateway/server-methods/skills.ts::skillsHandlersnode-host/runner.ts:225SkillBinsCachecallsskills.binsRPC, falls back to[]src/gateway/server-methods/models.ts::modelsHandlerstui/gateway-chat.ts:263callsclient.request("models.list")fromtui-command-handlers.ts:103listModels()fails with "method not found"Files to Re-Gut
src/agents/Delete the file + remove all imports:
custom-api-registry.ts— no-op stub; only live caller istts/tts-core.ts::ensureCustomApiRegistered(dead scaffolding, safe to remove call site)huggingface-models.ts— empty catalog stub; only consumed by deadonboard-auth.*chain (tracked separately)model-catalog.ts— stub withloadModelCatalog,findModelInCatalog,modelSupportsVision; see Telegram vision cascade belowmodel-compat.ts— real code but zero callers (was pi-ai compat layer; pi-ai removed in Remove pi-embedded.ts stub barrel and clean up no-op call sites #76)models-config.providers.ts— empty stub; only consumed by deadonboard-auth.*chainpi-embedded-messaging.ts— dead duplicate; canonical exports live inagents/agent-messaging.tspi-model-discovery.ts— emptyModelRegistrystub; onlygateway/test-helpers.mocks.tsvi.mocks itpi-tools.before-tool-call.ts— substantial real impl, zero importers (replaced bymiddleware/mcp-tools.ts+plugins/hooks.ts)pi-tools.before-tool-call.runtime.ts— no-op stubs; only consumer is deadpi-tools.before-tool-call.tssynthetic-models.ts,together-models.ts,venice-models.ts— empty provider catalog stubs (dead via onboard-auth.* chain)test-helpers/pi-tool-stubs.ts— zero importerssrc/gateway/server-methods/models.ts— delete file; remove import + spread fromserver-methods.ts:20,78; dropmodels.listfromserver-methods-list.ts:36,method-scopes.ts:57, protocol validatorsserver-methods/skills.ts— delete file; remove import + spread fromserver-methods.ts:25,84; dropskills.status,skills.bins,skills.install,skills.updatefromserver-methods-list.ts:45-48,method-scopes.ts:26,61,104-105src/auto-reply/reply/commands-models.ts— stub (handleModelsCommandreturnsundefined,buildModelsProviderDatareturns{}); triggers Discord/Mattermost model-picker cascade belowreply/session-reset-model.ts— stub (applyResetModelOverridereturnsundefined); 1 live call site inget-reply.ts:180passing 11 params to discardreply.directive.directive-behavior.model-directive-test-utils.ts— zero importers (was test util for per-message model directives — obsolete)src/commands/openai-codex-model-default.ts— 58 LoC real code, zero importers; Codex runtime handles its own default model internallysrc/secrets/provider-env-vars.ts— emptyPROVIDER_ENV_VARS = {}stub; only consumed by deadcommands/onboard-auth.credentials.ts(tracked separately)Cascade Call Sites (fix alongside file deletion)
Telegram vision cascade (
model-catalog.tsdeletion)src/telegram/bot-message-context.body.ts— removeloadModelCatalog→findModelInCatalog→modelSupportsVisioncall chainsrc/telegram/bot-message-dispatch.ts— same patternsrc/telegram/sticker-cache.ts— same patternDecision needed in PR: does Telegram vision stay in v0.1.0?
middleware/runtimes/*.ts::mediaCapabilitiesRecommended: remove the capability check; let CLI runtime's own
mediaCapabilitiesfield gate attachments (it already does this in the media pipeline — seemiddleware/media-capability.ts).Node-host skills cascade (
skills.tsdeletion)src/node-host/runner.ts— deleteSkillBinsCacheclass + its instantiation at line 225 + removeskillBinsparam fromhandleInvoke()src/gateway/protocol/schema/agents-models-skills.ts— delete 8Skill*Schemaexports (SkillsStatusParamsSchema,SkillsBinsParamsSchema/ResultSchema,SkillsInstallParamsSchema,SkillsUpdateParamsSchema,SkillsSearchParamsSchema/ResultSchema,SkillsDetailParamsSchema/ResultSchema)src/gateway/protocol/index.ts— delete 4 skills validatorssrc/gateway/protocol/schema/protocol-schemas.ts— delete registry entriesTUI
listModelscascade (models.tsdeletion)src/tui/gateway-chat.ts— deletelistModels()method +GatewayModelChoicetypesrc/tui/tui-command-handlers.ts:103— deleteclient.listModels()call sitesrc/gateway/protocol/schema/agents-models-skills.ts— delete 3 model exports (ModelChoiceSchema,ModelsListParamsSchema,ModelsListResultSchema)src/gateway/protocol/schema/types.ts:84— deleteModelChoicere-exportsrc/gateway/protocol/index.ts— deletevalidateModelsListParams+ type importssrc/gateway/protocol/schema/protocol-schemas.ts— delete registry entriesDiscord/Mattermost model-picker UI cascade (
commands-models.tsdeletion)src/auto-reply/reply/commands-core.ts:24,194— removehandleModelsCommandimport + handler array entry (drops dead/modelsslash command)src/discord/monitor/model-picker.ts,model-picker.test.ts,model-picker.test-utils.ts— delete Discord model-picker UI (only source ofbuildModelsProviderDatain Discord)src/plugin-sdk/mattermost.ts:20-22— drop re-exportsextensions/mattermost/src/mattermost/model-picker.ts,monitor.ts:1089,slash-http.ts:390— delete Mattermost model-picker +buildModelsProviderDatacall sitesSession reset model cascade (
session-reset-model.tsdeletion)src/auto-reply/reply/get-reply.ts:27,180-193— removeapplyResetModelOverrideimport + call blocksrc/auto-reply/reply/session.test.ts:15,1264-1339— delete 3 test casessrc/auto-reply/reply/get-reply.test-mocks.ts:45-46— remove mock entrySchema file split (
agents-models-skills.ts)After Models/Skills exports are deleted by the cascades above, the remaining
agents-models-skills.tsis mostly LIVEAgents*andTools*schemas. Rename/split it:src/gateway/protocol/schema/agents-models-skills.ts→agents-tools.ts(LIVE content only:AgentSummarySchema,AgentsList*,AgentsCreate*,AgentsUpdate*,AgentsDelete*,AgentsFiles*,ToolCatalog*,ToolsCatalog*,ToolsEffective*)protocol-schemas.ts,protocol/index.ts,schema/types.tsAcceptance Criteria
pnpm checkpasses (0 errors, 0 warnings)pnpm testpasses (update mocks where deletions require)listModels: product decisions documented in PR bodygit grep -rn "model-catalog\|modelSupportsVision\|loadModelCatalog" src/returns zero hitsgit grep -rn "models\.list\|skills\.bins\|skillsHandlers\|modelsHandlers" src/returns zero hitsgit grep -rn "pi-model-discovery\|synthetic-models\|venice-models\|together-models\|huggingface-models\|model-compat" src/returns zero hitsgit grep -rn "commands-models\|handleModelsCommand\|buildModelsProviderData" src/ extensions/returns zero hitsgit grep -rn "session-reset-model\|applyResetModelOverride" src/returns zero hitsOut of Scope
src/agents/pi-embedded.ts+pi-embedded-runner/*cascade — tracked under audit: review all Pi engine stub replacements for ChannelBridge compatibility #2089 (audit: review all Pi engine stub replacements for ChannelBridge compatibility). Coordinate re-gut timing via a comment on audit: review all Pi engine stub replacements for ChannelBridge compatibility #2089.onboard-auth.*cluster gut (13 files insrc/commands/) — tracked as a separate issue;huggingface-models/synthetic-models/together-models/venice-models/models-config.providersin this cascade are dead because the onboard-auth cluster is dead, but their deletion is independent and belongs in this issue.Implementation Notes
model-*,synthetic-models, etc.), (5) Secrets + commands remnants.vi.mock(...)these stubs. Sweep test-helpers and*.test-mocks.tsfiles together with the deletes.References
44b4f92b12, 2026-04-13