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
+14 -4
View File
@@ -1,6 +1,16 @@
import type { ModelInfo } from './types';
import { PI_CONFIG_DIR } from '../../data-path';
import { logger } from './logger';
import type { ModelInfo } from './types';
const CLAUDE_CODE_MODEL: ModelInfo = {
id: 'claude-code',
name: 'claude-code',
provider: 'claude-code',
contextWindow: 200000,
maxTokens: 16000,
reasoning: true,
images: true,
};
const CACHE_TTL_MS = 60_000;
@@ -26,7 +36,7 @@ const parseSize = (s?: string): number => {
export async function listPiModels(): Promise<ModelInfo[]> {
if (cachedModels && Date.now() - cacheTimestamp < CACHE_TTL_MS) {
return cachedModels;
return [...cachedModels, CLAUDE_CODE_MODEL];
}
try {
@@ -99,9 +109,9 @@ export async function listPiModels(): Promise<ModelInfo[]> {
logger.info('pi --list-models returned', { count: models.length });
cachedModels = models;
cacheTimestamp = Date.now();
return models;
return [...models, CLAUDE_CODE_MODEL];
} catch (err) {
logger.error('Failed to run pi --list-models', { error: String(err) });
return [];
return [CLAUDE_CODE_MODEL];
}
}
+1 -1
View File
@@ -271,7 +271,7 @@ export async function spawnPi(
'-e', `PI_TOOLS_DIRS=/officer/tools:/officer/user/tools`,
'-e', `PI_SEARXNG_URL=${searxng.url}`,
'-e', `OFFICER_RESOURCES=${resourcesEnv}`,
'-e', `OFFICER_EMAIL_DB=/officer/emails.db`,
'-e', `OFFICER_EMAIL_DB=/officer/data/emails.db`,
...(apifyToken ? ['-e', `OFFICER_APIFY_TOKEN=${apifyToken}`] : []),
...Object.entries(browserRelayEnv).flatMap(([k, v]) => ['-e', `${k}=${v}`]),
];