// 手动验证 ClaudeProvider:审批流、越权拦截、事件映射。 // 用法:pnpm tsx scripts/try-claude-adapter.ts import type { PermissionMode } from '@agent-server/shared' import { ClaudeProvider } from '../src/providers/claude/adapter' import { resolveAccess } from '../src/services/access-policy' import { defaultSettings } from '../src/services/settings' const [ws = process.cwd(), mode = 'ask', prompt = 'hi'] = process.argv.slice(2) const settings = defaultSettings() settings.providers.claude.defaultModel = 'haiku' const access = resolveAccess({ policy: { mode: 'restricted', read: [], write: [], deny: [] }, knowledgeRoots: [], selectedKnowledgeRootIds: [], workspaceDir: ws, settings, }) const ac = new AbortController() const res = await new ClaudeProvider().run({ sessionId: 'ses_test', runId: 'run_test', model: 'haiku', permissionMode: mode as PermissionMode, providerSessionId: null, workspaceDir: ws, systemPromptAppend: '', allowedTools: [], disallowedTools: [], skills: 'all', plugins: [], input: { text: prompt, images: [], attachments: [] }, access, settings, signal: ac.signal, emit: (type, payload) => { if (type === 'message.delta' || type === 'reasoning.delta') return console.log(`[event] ${type}`, JSON.stringify(payload).slice(0, Number(process.env.EVENT_MAX ?? 220))) }, interact: async req => { console.log('[interact]', JSON.stringify(req).slice(0, 300)) return req.kind === 'approval' ? { resolution: 'allowed', scope: 'once' } : { resolution: 'answered', answers: { '0': req.questions[0]!.options[0]!.label } } }, setProviderSessionId: id => console.log('[providerSessionId]', id), audit: (kind, summary) => console.log(`[audit] ${kind}: ${summary}`), log: { info: () => {}, warn: (o: object) => console.log('[warn]', JSON.stringify(o).slice(0, 200)), error: (o: object) => console.log('[error]', o) }, }) console.log('[result]', JSON.stringify(res))