claude-code as channel model, container trust/permissions fixes, terminal cwd fix

- add claude-code as virtual model in channel messaging (telegram/discord/whatsapp)
- new send-claude-code.ts: docker exec claude -p with session resumption
- route claude-code model in sendAndAwait before Pi pipeline
- append claude-code to listPiModels output
- fix container .claude mount (rw for sub-mounts), hooks format (matcher-based)
- pre-seed hasTrustDialogAccepted and bypassPermissions in container settings
- git init in entrypoint to skip workspace trust prompt
- fix ~/~ double-tilde in CommandTerminalWrapper cwd resolution
- remove --continue from claude-code panel command

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-02 20:00:45 +00:00
co-authored by Claude Opus 4.6
parent 192ae63c0e
commit 0068244356
20 changed files with 1168 additions and 73 deletions
+16
View File
@@ -7,6 +7,7 @@ import * as piBridge from '@@/api/pi/pi-bridge';
import { getHomeDir } from '@@/data-path';
import { getUserSettings } from 'officerdb';
import { logger } from '@@/api/pi/logger';
import { sendClaudeCode, clearClaudeCodeSession } from './send-claude-code';
const DEFAULT_MODEL = 'opencode/big-pickle';
const IDLE_TIMEOUT_MS = 60 * 60 * 1000;
@@ -63,6 +64,7 @@ export function setSessionModel(context: string, userId: number, contextId: stri
const sessionId = buildSessionId(context, userId, contextId);
// Store override independently of session — survives idle eviction
channelModelOverrides.set(sessionId, model);
clearClaudeCodeSession(sessionId);
const session = sessionManager.getSession(sessionId);
if (session) {
@@ -94,6 +96,20 @@ export async function sendAndAwait(params: SendAndAwaitParams): Promise<SendAndA
await existing;
try {
// Resolve model early to check for claude-code routing
const override = channelModelOverrides.get(sessionId);
const resolvedModel = params.model ?? override ?? (await getUserDefaultModel(params.userId)) ?? DEFAULT_MODEL;
if (resolvedModel === 'claude-code') {
return await sendClaudeCode({
userId: params.userId,
email: params.email,
username: params.username,
prompt: params.prompt,
sessionKey: sessionId,
});
}
return await doSend(sessionId, params);
} finally {
releaseLock!();