@eclipse-docks/extension-ai-system 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/api.js +1 -1
- package/dist/{cognitive-extension-CG_d39K5.js → cognitive-extension-7_ZMUCGD.js} +358 -92
- package/dist/cognitive-extension-7_ZMUCGD.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.d.ts.map +1 -0
- package/dist/runtime/attachment-paths.d.ts +17 -0
- package/dist/runtime/attachment-paths.d.ts.map +1 -0
- package/dist/runtime/attachments.d.ts +5 -5
- package/dist/runtime/attachments.d.ts.map +1 -1
- package/dist/runtime/cognitive-runtime.d.ts +7 -3
- package/dist/runtime/cognitive-runtime.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/models/openai-compatible.d.ts.map +1 -1
- package/dist/runtime/session-workspace.d.ts +20 -0
- package/dist/runtime/session-workspace.d.ts.map +1 -0
- package/dist/runtime/specialists/index.d.ts.map +1 -1
- package/dist/runtime/specialists/loop.d.ts.map +1 -1
- package/dist/runtime/tools/command-adapter.d.ts.map +1 -1
- package/dist/runtime/tools/index.d.ts +0 -1
- package/dist/runtime/tools/index.d.ts.map +1 -1
- package/dist/runtime/tools/workspace-adapter.d.ts +1 -1
- package/dist/runtime/tools/workspace-adapter.d.ts.map +1 -1
- package/dist/runtime/tools/workspace-path-qualify.d.ts +22 -0
- package/dist/runtime/tools/workspace-path-qualify.d.ts.map +1 -0
- package/dist/runtime/tools/workspace-path.d.ts +17 -0
- package/dist/runtime/tools/workspace-path.d.ts.map +1 -0
- package/dist/{runtime-DfNGzEjU.js → runtime-By5PP2BC.js} +696 -384
- package/dist/runtime-By5PP2BC.js.map +1 -0
- package/dist/view/busy-status.d.ts +12 -0
- package/dist/view/busy-status.d.ts.map +1 -0
- package/dist/view/cognitive-settings-editor.d.ts +0 -1
- package/dist/view/cognitive-settings-editor.d.ts.map +1 -1
- package/dist/view/cognitive-view.d.ts +21 -0
- package/dist/view/cognitive-view.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cognitive-extension-CG_d39K5.js.map +0 -1
- package/dist/runtime/tools/attachment-adapter.d.ts +0 -6
- package/dist/runtime/tools/attachment-adapter.d.ts.map +0 -1
- package/dist/runtime-DfNGzEjU.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-By5PP2BC.js","names":["EFFORT_ORDER","IN_MEMORY_ROOT_NAME"],"sources":["../src/runtime/events.ts","../src/runtime/constants.ts","../src/runtime/core/plutchik.ts","../src/runtime/core/needs.ts","../src/runtime/core/tick.ts","../src/runtime/memory/store.ts","../src/runtime/models/provider-registry.ts","../src/runtime/models/effort-support.ts","../src/runtime/models/provider-config.ts","../src/runtime/abort.ts","../src/runtime/models/openai-compatible.ts","../src/runtime/models/router.ts","../src/runtime/tools/broker.ts","../src/runtime/attachment-paths.ts","../src/runtime/attachments.ts","../src/runtime/tools/workspace-path-qualify.ts","../src/runtime/tools/workspace-path.ts","../src/runtime/tools/workspace-adapter.ts","../src/runtime/tools/command-adapter.ts","../src/runtime/compact/compaction.ts","../src/runtime/session/session-runtime.ts","../src/runtime/specialists/classify-risk.ts","../src/runtime/specialists/loop.ts","../src/runtime/specialists/index.ts","../src/runtime/context/usage.ts","../src/runtime/session-workspace.ts","../src/runtime/cognitive-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from './types';\n\ntype Handler = (payload: unknown) => void;\n\n/** Tiny in-process bus so runtime stays UI-agnostic. */\nexport class RuntimeEvents {\n private handlers = new Map<string, Set<Handler>>();\n\n publish(topic: string, payload?: unknown): void {\n const set = this.handlers.get(topic);\n if (!set) return;\n for (const handler of set) handler(payload);\n }\n\n subscribe(topic: string, handler: Handler): Unsubscribe {\n let set = this.handlers.get(topic);\n if (!set) {\n set = new Set();\n this.handlers.set(topic, set);\n }\n set.add(handler);\n return () => set!.delete(handler);\n }\n}\n\nexport const TOPIC = {\n sessionChanged: 'cognitive/session/changed',\n messagePart: 'cognitive/message/part',\n messageDone: 'cognitive/message/done',\n permissionAsked: 'cognitive/permission/asked',\n modelRouted: 'cognitive/model/routed',\n coreTick: 'cognitive/core/tick',\n checkpoint: 'cognitive/checkpoint',\n providersChanged: 'cognitive/providers/changed',\n approvalModeChanged: 'cognitive/approval-mode/changed',\n} as const;\n","/** Sidebar contribution / tab panel name for the AI chat view. */\nexport const AI_VIEW_NAME = 'cognitiveview';\n\n/** EditorInput.key for the AI settings editor. */\nexport const AI_SETTINGS_KEY = '.system.cognitive-ai-settings';\n\n/** editorRegistry editorId for the AI settings editor. */\nexport const AI_SETTINGS_EDITOR_ID = 'system.cognitive-ai-settings-editor';\n\n/** Command that opens AI settings. */\nexport const OPEN_AI_SETTINGS_COMMAND = 'open_cognitive_ai_settings';\n","import type { EmotionalState, PlutchikEmotion } from '../types';\n\nexport const PLUTCHIK_EMOTIONS: PlutchikEmotion[] = [\n 'joy',\n 'trust',\n 'fear',\n 'surprise',\n 'sadness',\n 'disgust',\n 'anger',\n 'anticipation',\n];\n\nexport function createNeutralState(): EmotionalState {\n return Object.fromEntries(PLUTCHIK_EMOTIONS.map((e) => [e, 0])) as EmotionalState;\n}\n\nexport function clampEmotion(value: number): number {\n if (Number.isNaN(value)) return 0;\n return Math.max(-1, Math.min(1, value));\n}\n\nexport function blendStates(base: EmotionalState, delta: Partial<EmotionalState>, weight = 1): EmotionalState {\n const next = { ...base };\n for (const key of PLUTCHIK_EMOTIONS) {\n const d = delta[key];\n if (d === undefined) continue;\n next[key] = clampEmotion(base[key] + d * weight);\n }\n return next;\n}\n\nexport function valenceScore(state: EmotionalState): number {\n const positive = state.joy + state.trust + state.anticipation + state.surprise;\n const negative = state.fear + state.sadness + state.disgust + state.anger;\n return (positive - negative) / 4;\n}\n\nexport function diffStates(prev: EmotionalState, next: EmotionalState): EmotionalState {\n const out = createNeutralState();\n for (const key of PLUTCHIK_EMOTIONS) {\n out[key] = clampEmotion(next[key] - prev[key]);\n }\n return out;\n}\n","import type { Need } from '../types';\n\nexport function defaultNeeds(): Need[] {\n return [\n { id: 'progress', label: 'Make progress on goals', weight: 1, urgency: 0.4 },\n { id: 'clarity', label: 'Reduce uncertainty', weight: 0.8, urgency: 0.3 },\n { id: 'safety', label: 'Avoid harmful actions', weight: 1.2, urgency: 0.5 },\n { id: 'coherence', label: 'Keep context coherent', weight: 0.7, urgency: 0.2 },\n ];\n}\n\nexport function dominantNeed(needs: Need[]): Need {\n let best = needs[0];\n for (const need of needs) {\n const score = need.weight * need.urgency;\n if (!best || score > best.weight * best.urgency) best = need;\n }\n return best;\n}\n\nexport function bumpNeed(needs: Need[], id: string, delta: number): Need[] {\n return needs.map((n) =>\n n.id === id ? { ...n, urgency: Math.max(0, Math.min(1, n.urgency + delta)) } : n,\n );\n}\n","import type { BufferMap, Chunk, EmotionalState, Intent, Need } from '../types';\nimport { blendStates, createNeutralState, diffStates, valenceScore } from './plutchik';\nimport { dominantNeed } from './needs';\n\nexport interface CoreState {\n conscious: EmotionalState;\n subconscious: EmotionalState;\n needs: Need[];\n}\n\nexport interface CoreTickInput {\n state: CoreState;\n buffers: BufferMap;\n context?: Chunk | null;\n}\n\nexport interface CoreTickResult {\n state: CoreState;\n buffers: BufferMap;\n intent: Intent | null;\n valenceDelta: number;\n qualia: EmotionalState;\n}\n\nfunction contextDelta(context: Chunk | null | undefined): Partial<EmotionalState> {\n if (!context) return {};\n const kind = String(context.slots.kind ?? context.type);\n if (kind === 'error' || kind === 'failure') {\n return { fear: 0.15, sadness: 0.1, anticipation: -0.05 };\n }\n if (kind === 'success' || kind === 'progress') {\n return { joy: 0.2, anticipation: 0.1, trust: 0.05 };\n }\n if (kind === 'isolation' || kind === 'empty') {\n return { sadness: 0.2, fear: 0.05, surprise: 0.1 };\n }\n if (kind === 'user') {\n return { anticipation: 0.15, trust: 0.05 };\n }\n return { surprise: 0.05 };\n}\n\nexport function createCoreState(needs: Need[]): CoreState {\n return {\n conscious: createNeutralState(),\n subconscious: createNeutralState(),\n needs: [...needs],\n };\n}\n\nexport function emptyBuffers(): BufferMap {\n return {\n goal: null,\n retrieval: null,\n imaginal: null,\n emotion: null,\n motor: null,\n };\n}\n\n/** One ICOM-inspired Core tick: update valence from context + needs, emit intent when useful. */\nexport function coreTick(input: CoreTickInput): CoreTickResult {\n const prev = input.state.conscious;\n const need = dominantNeed(input.state.needs);\n const delta = contextDelta(input.context ?? input.buffers.retrieval);\n\n const needBias: Partial<EmotionalState> =\n need.id === 'safety'\n ? { fear: 0.05 * need.urgency, trust: 0.02 }\n : need.id === 'progress'\n ? { anticipation: 0.08 * need.urgency, joy: 0.03 * need.urgency }\n : need.id === 'clarity'\n ? { surprise: 0.05 * need.urgency, anticipation: 0.04 * need.urgency }\n : { trust: 0.03 * need.urgency };\n\n const conscious = blendStates(blendStates(prev, delta), needBias);\n const subconscious = blendStates(input.state.subconscious, delta, 0.5);\n const qualia = diffStates(prev, conscious);\n const valenceDelta = valenceScore(conscious) - valenceScore(prev);\n\n const summary =\n (input.context?.slots.summary as string | undefined) ??\n (input.buffers.goal?.slots.summary as string | undefined) ??\n need.label;\n\n const shouldAct = valenceDelta !== 0 || Boolean(input.context) || Boolean(input.buffers.goal);\n const intent: Intent | null = shouldAct\n ? {\n id: `intent-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n summary: String(summary),\n motivation: need.id,\n valenceDelta,\n createdAt: Date.now(),\n }\n : null;\n\n const goalChunk: Chunk | null = intent\n ? {\n id: `goal-${intent.id}`,\n type: 'goal',\n slots: { summary: intent.summary, motivation: intent.motivation, intentId: intent.id },\n activation: 1,\n createdAt: intent.createdAt,\n updatedAt: intent.createdAt,\n scope: 'session',\n }\n : input.buffers.goal;\n\n const emotionChunk: Chunk = {\n id: `emotion-${Date.now()}`,\n type: 'emotion',\n slots: { conscious, valence: valenceScore(conscious) },\n activation: 1,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n scope: 'run',\n };\n\n return {\n state: { conscious, subconscious, needs: input.state.needs },\n buffers: { ...input.buffers, goal: goalChunk, emotion: emotionChunk, motor: null },\n intent,\n valenceDelta,\n qualia,\n };\n}\n","import type { Chunk, MemoryScope } from '../types';\n\nexport interface MemoryQuery {\n type?: string;\n scope?: MemoryScope;\n sessionId?: string;\n limit?: number;\n minActivation?: number;\n}\n\nfunction now(): number {\n return Date.now();\n}\n\nfunction id(): string {\n return `chunk-${now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/** In-memory declarative/episodic store with ACT-R-like activation ranking. */\nexport class CognitiveMemory {\n private chunks = new Map<string, Chunk>();\n\n upsert(input: Omit<Chunk, 'id' | 'activation' | 'createdAt' | 'updatedAt'> & { id?: string; activation?: number }): Chunk {\n const existing = input.id ? this.chunks.get(input.id) : undefined;\n const chunk: Chunk = {\n id: input.id ?? existing?.id ?? id(),\n type: input.type,\n slots: { ...input.slots },\n activation: input.activation ?? existing?.activation ?? 0.5,\n createdAt: existing?.createdAt ?? now(),\n updatedAt: now(),\n scope: input.scope,\n sessionId: input.sessionId,\n pinned: input.pinned ?? existing?.pinned,\n };\n this.chunks.set(chunk.id, chunk);\n return chunk;\n }\n\n get(chunkId: string): Chunk | undefined {\n return this.chunks.get(chunkId);\n }\n\n touch(chunkId: string, boost = 0.15): Chunk | undefined {\n const chunk = this.chunks.get(chunkId);\n if (!chunk) return undefined;\n const next = {\n ...chunk,\n activation: Math.min(2, chunk.activation + boost),\n updatedAt: now(),\n };\n this.chunks.set(chunkId, next);\n return next;\n }\n\n decay(amount = 0.02): void {\n for (const [key, chunk] of this.chunks) {\n if (chunk.pinned) continue;\n const activation = Math.max(0, chunk.activation - amount);\n if (activation <= 0.01 && chunk.scope !== 'workspace') {\n this.chunks.delete(key);\n continue;\n }\n this.chunks.set(key, { ...chunk, activation });\n }\n }\n\n forget(chunkId: string): boolean {\n return this.chunks.delete(chunkId);\n }\n\n clear(scope?: MemoryScope): void {\n if (!scope) {\n this.chunks.clear();\n return;\n }\n for (const [key, chunk] of this.chunks) {\n if (chunk.scope === scope) this.chunks.delete(key);\n }\n }\n\n search(query: MemoryQuery = {}): Chunk[] {\n const min = query.minActivation ?? 0;\n const limit = query.limit ?? 8;\n return [...this.chunks.values()]\n .filter((c) => (query.type ? c.type === query.type : true))\n .filter((c) => (query.scope ? c.scope === query.scope : true))\n .filter((c) => (query.sessionId ? c.sessionId === query.sessionId : true))\n .filter((c) => c.activation >= min || c.pinned)\n .sort((a, b) => b.activation - a.activation || b.updatedAt - a.updatedAt)\n .slice(0, limit);\n }\n\n /** Spreading-style boost: chunks whose slots overlap context terms rise. */\n retrieveForContext(terms: string[], limit = 5): Chunk[] {\n const lower = terms.map((t) => t.toLowerCase()).filter(Boolean);\n if (lower.length === 0) return this.search({ limit });\n\n const scored = [...this.chunks.values()].map((chunk) => {\n const hay = `${chunk.type} ${JSON.stringify(chunk.slots)}`.toLowerCase();\n let hits = 0;\n for (const term of lower) {\n if (hay.includes(term)) hits += 1;\n }\n const score = chunk.activation + hits * 0.35 + (chunk.pinned ? 0.5 : 0);\n return { chunk, score };\n });\n\n return scored\n .filter((s) => s.score > 0.2)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((s) => {\n this.touch(s.chunk.id, 0.05);\n return this.chunks.get(s.chunk.id)!;\n });\n }\n\n snapshot(): Chunk[] {\n return [...this.chunks.values()].map((c) => ({ ...c, slots: { ...c.slots } }));\n }\n\n restore(chunks: Chunk[]): void {\n this.chunks.clear();\n for (const chunk of chunks) this.chunks.set(chunk.id, { ...chunk, slots: { ...chunk.slots } });\n }\n}\n","import type { ModelProvider } from './types';\n\nexport class ProviderRegistry {\n private settingsProviders = new Map<string, ModelProvider>();\n private externalProviders = new Map<string, ModelProvider>();\n\n /** Settings-backed providers — cleared on each settings rebuild. */\n register(provider: ModelProvider): void {\n this.settingsProviders.set(provider.id, provider);\n }\n\n /** Plugin providers (e.g. WebLLM) that survive settings rebuilds. */\n registerExternal(provider: ModelProvider): void {\n this.externalProviders.set(provider.id, provider);\n }\n\n unregisterExternal(id: string): void {\n this.externalProviders.delete(id);\n }\n\n clear(): void {\n this.settingsProviders.clear();\n }\n\n get(id: string): ModelProvider | undefined {\n return this.settingsProviders.get(id) ?? this.externalProviders.get(id);\n }\n\n list(): ModelProvider[] {\n const byId = new Map<string, ModelProvider>();\n for (const provider of this.externalProviders.values()) byId.set(provider.id, provider);\n for (const provider of this.settingsProviders.values()) byId.set(provider.id, provider);\n return [...byId.values()];\n }\n\n listExternal(): ModelProvider[] {\n return [...this.externalProviders.values()];\n }\n\n resolveProvider(modelId: string): ModelProvider | undefined {\n const slash = modelId.indexOf('/');\n if (slash === -1) return this.list()[0];\n return this.get(modelId.slice(0, slash));\n }\n}\n","import { Models } from '@opencode-ai/models';\nimport type { ProviderMap, ReasoningEffort, ReasoningOption } from '@opencode-ai/models';\nimport type { EffortLevel } from '../types';\n\nexport interface EffortCapability {\n /** Model accepts `reasoning_effort` (per Models.dev `reasoning`). */\n supported: boolean;\n /**\n * Whether effort can be combined with function tools on our current transport\n * (`/v1/chat/completions`). Models.dev may list both reasoning + tool_call, but\n * OpenAI chat/completions rejects that combo — keep false until Responses API.\n */\n withTools: boolean;\n levels: EffortLevel[];\n default: EffortLevel;\n}\n\nconst NO_EFFORT: EffortCapability = {\n supported: false,\n withTools: false,\n levels: ['none'],\n default: 'none',\n};\n\nconst EFFORT_ORDER: EffortLevel[] = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];\n\nconst KNOWN_EFFORTS = new Set<string>(EFFORT_ORDER);\n\nlet providersCache: ProviderMap | undefined;\nlet loadPromise: Promise<void> | undefined;\n\n/** Load Models.dev provider catalog (network, then offline snapshot fallback). */\nexport async function loadModelsCatalog(force = false): Promise<void> {\n if (providersCache && !force) return;\n if (!loadPromise || force) {\n loadPromise = (async () => {\n try {\n providersCache = await Models.make().providers({\n signal: AbortSignal.timeout(10_000),\n });\n } catch {\n const snap = await import('@opencode-ai/models/snapshot');\n providersCache = snap.providers;\n }\n })();\n }\n await loadPromise;\n}\n\nexport function isModelsCatalogReady(): boolean {\n return providersCache != null;\n}\n\n/** Strip `providerId/` prefix when present. */\nexport function bareModelId(modelId: string): string {\n const slash = modelId.indexOf('/');\n return (slash === -1 ? modelId : modelId.slice(slash + 1)).trim();\n}\n\nexport function splitModelRef(modelRef: string): { providerId?: string; modelId: string } {\n const trimmed = modelRef.trim();\n const slash = trimmed.indexOf('/');\n if (slash === -1) return { modelId: trimmed };\n return { providerId: trimmed.slice(0, slash), modelId: trimmed.slice(slash + 1) };\n}\n\nexport function findCatalogModel(modelRef: string) {\n if (!providersCache) return undefined;\n const { providerId, modelId } = splitModelRef(modelRef);\n if (!modelId) return undefined;\n\n if (providerId) {\n const exact = providersCache[providerId]?.models?.[modelId];\n if (exact) return exact;\n }\n\n const lower = modelId.toLowerCase();\n for (const provider of Object.values(providersCache)) {\n const models = provider?.models;\n if (!models) continue;\n if (models[modelId]) return models[modelId];\n for (const [id, meta] of Object.entries(models)) {\n if (id.toLowerCase() === lower) return meta;\n }\n }\n return undefined;\n}\n\nconst DEFAULT_CONTEXT_LIMIT = 128_000;\n\n/** Context window size from Models.dev (`limit.context`), with a safe default. */\nexport function getModelContextLimit(modelRef: string): number {\n const meta = findCatalogModel(modelRef) as { limit?: { context?: number } } | undefined;\n const limit = meta?.limit?.context;\n return typeof limit === 'number' && limit > 0 ? limit : DEFAULT_CONTEXT_LIMIT;\n}\n\nfunction mapEffortValue(value: ReasoningEffort): EffortLevel | undefined {\n if (value === null || value === 'none' || value === 'default') return 'none';\n if (typeof value === 'string' && KNOWN_EFFORTS.has(value)) return value as EffortLevel;\n return undefined;\n}\n\nfunction levelsFromOptions(options: ReasoningOption[] | undefined): EffortLevel[] {\n const found = new Set<EffortLevel>();\n for (const opt of options ?? []) {\n if (opt.type === 'toggle') {\n found.add('none');\n continue;\n }\n if (opt.type === 'effort') {\n for (const value of opt.values) {\n const mapped = mapEffortValue(value);\n if (mapped) found.add(mapped);\n }\n }\n // budget_tokens: expose a coarse ladder; actual budgets mapped later if needed\n if (opt.type === 'budget_tokens') {\n found.add('low');\n found.add('medium');\n found.add('high');\n }\n }\n if (!found.size) return ['none', 'low', 'medium', 'high'];\n if (![...found].some((l) => l !== 'none')) found.add('medium');\n return EFFORT_ORDER.filter((level) => found.has(level));\n}\n\nfunction pickDefault(levels: EffortLevel[]): EffortLevel {\n if (levels.includes('medium')) return 'medium';\n if (levels.includes('low')) return 'low';\n return levels.find((l) => l !== 'none') ?? 'none';\n}\n\n/**\n * Resolve effort capability from Models.dev catalog.\n * Unknown / unloaded models → no effort (safe for chat/completions).\n */\nexport function detectEffortCapability(modelRef: string): EffortCapability {\n const meta = findCatalogModel(modelRef);\n if (!meta?.reasoning) return NO_EFFORT;\n\n const levels = levelsFromOptions(meta.reasoning_options);\n return {\n supported: true,\n // Chat Completions rejects reasoning_effort + function tools together.\n withTools: false,\n levels,\n default: pickDefault(levels),\n };\n}\n","import { detectEffortCapability } from './effort-support';\nimport type { ModelCatalogEntry } from './types';\n\nexport interface ProviderConfig {\n id: string;\n baseUrl: string;\n apiKey: string;\n /** Comma-separated model ids (without provider prefix). */\n models: string;\n enabled: boolean;\n /** Optional free-form fields (e.g. OCR endpoint overrides). */\n extra?: Record<string, string>;\n}\n\nexport interface ProvidersSettings {\n defaultProviderId: string;\n providers: ProviderConfig[];\n}\n\nexport const PROVIDERS_PERSIST_KEY = 'cognitive/v1/providers';\n\nexport function defaultProvidersSettings(): ProvidersSettings {\n return {\n defaultProviderId: 'openai',\n providers: [\n {\n id: 'openai',\n baseUrl: 'https://api.openai.com/v1',\n apiKey: '',\n models: 'gpt-4o-mini,gpt-4o',\n enabled: true,\n },\n {\n id: 'ollama',\n baseUrl: 'http://127.0.0.1:11434/v1',\n apiKey: '',\n models: 'llama3.2',\n enabled: true,\n },\n ],\n };\n}\n\nexport function parseModelIds(models: string): string[] {\n return models\n .split(',')\n .map((m) => m.trim())\n .filter(Boolean);\n}\n\n/** Model refs (`providerId/modelId`) the user enabled in AI Settings. */\nexport function listConfiguredModelIds(settings: ProvidersSettings): string[] {\n const ids: string[] = [];\n for (const provider of settings.providers) {\n if (!provider.enabled || !provider.id.trim()) continue;\n for (const modelId of parseModelIds(provider.models)) {\n ids.push(`${provider.id}/${modelId}`);\n }\n }\n return ids;\n}\n\nexport function catalogFromSettings(settings: ProvidersSettings): ModelCatalogEntry[] {\n const entries: ModelCatalogEntry[] = [];\n for (const provider of settings.providers) {\n if (!provider.enabled || !provider.id.trim()) continue;\n const modelIds = parseModelIds(provider.models);\n modelIds.forEach((modelId, index) => {\n const tier =\n modelIds.length === 1\n ? 'standard'\n : index === 0\n ? 'economy'\n : index === modelIds.length - 1\n ? 'frontier'\n : 'standard';\n entries.push({\n id: `${provider.id}/${modelId}`,\n providerId: provider.id,\n tier,\n strengths: ['code', 'fast'],\n effort: detectEffortCapability(`${provider.id}/${modelId}`),\n });\n });\n }\n return entries;\n}\n\nexport function normalizeProvidersSettings(raw: ProvidersSettings): ProvidersSettings {\n const providers = raw.providers.map((p) => ({\n id: p.id.trim(),\n baseUrl: p.baseUrl.trim(),\n apiKey: p.apiKey ?? '',\n models: p.models ?? '',\n enabled: p.enabled !== false,\n ...(p.extra && Object.keys(p.extra).length ? { extra: { ...p.extra } } : {}),\n }));\n const defaultProviderId =\n providers.find((p) => p.id === raw.defaultProviderId)?.id ?? providers.find((p) => p.enabled)?.id ?? '';\n return { defaultProviderId, providers };\n}\n","/** True when an AbortSignal has already been aborted. */\nexport function isAborted(signal?: AbortSignal | null): boolean {\n return Boolean(signal?.aborted);\n}\n\n/** True for DOMException / Error abort failures from fetch and friends. */\nexport function isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const name = (err as { name?: string }).name;\n return name === 'AbortError';\n}\n","import { isAbortError } from '../abort';\nimport { detectEffortCapability } from './effort-support';\nimport type { ModelProvider, ProviderChatMessage, StreamChunk, StreamParams } from './types';\n\nfunction wireContent(content: ProviderChatMessage['content']): unknown {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) return content;\n return content ?? '';\n}\n\n/** Map internal messages to OpenAI chat/completions wire shape. */\nexport function toOpenAIMessages(messages: ProviderChatMessage[]): Record<string, unknown>[] {\n return messages.map((m) => {\n if (m.role === 'tool') {\n return {\n role: 'tool',\n tool_call_id: m.toolCallId,\n content: typeof m.content === 'string' ? m.content || '' : '',\n ...(m.name ? { name: m.name } : {}),\n };\n }\n if (m.role === 'assistant' && m.toolCalls?.length) {\n return {\n role: 'assistant',\n // Some providers reject null here — always send a string.\n content: typeof m.content === 'string' ? m.content : '',\n tool_calls: m.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: { name: tc.name, arguments: tc.arguments || '{}' },\n })),\n };\n }\n return { role: m.role, content: wireContent(m.content) };\n });\n}\n\nexport interface OpenAICompatibleConfig {\n id: string;\n baseUrl: string;\n apiKey?: string;\n defaultModels?: Array<{ id: string; name: string }>;\n}\n\nexport interface RemoteModelInfo {\n id: string;\n name: string;\n}\n\n/** GET `{baseUrl}/models` — baseUrl should already include `/v1` when required. */\nexport async function fetchOpenAICompatibleModels(\n baseUrl: string,\n apiKey?: string,\n signal?: AbortSignal,\n): Promise<RemoteModelInfo[]> {\n const root = baseUrl.trim().replace(/\\/$/, '');\n if (!root) return [];\n\n const headers: Record<string, string> = { Accept: 'application/json' };\n if (apiKey?.trim()) headers.Authorization = `Bearer ${apiKey.trim()}`;\n\n const response = await fetch(`${root}/models`, { method: 'GET', headers, signal });\n if (!response.ok) {\n throw new Error(`Failed to list models (HTTP ${response.status})`);\n }\n\n const data = (await response.json()) as { data?: Array<{ id?: string; name?: string }> };\n const rows = Array.isArray(data.data) ? data.data : [];\n return rows\n .map((m) => {\n const id = (m.id ?? '').trim();\n if (!id) return null;\n return { id, name: (m.name ?? id).trim() || id };\n })\n .filter((m): m is RemoteModelInfo => m != null)\n .sort((a, b) => a.id.localeCompare(b.id));\n}\n\n/**\n * Build a chat/completions request body.\n *\n * Reasoning models default to a non-none effort when the field is omitted.\n * With function tools, chat/completions requires an explicit\n * `reasoning_effort: \"none\"` — omitting still 400s.\n */\nexport function buildChatCompletionBody(params: StreamParams): Record<string, unknown> {\n const model = params.model.includes('/') ? params.model.split('/').slice(1).join('/') : params.model;\n const { reasoning_effort: _a, reasoningEffort: _b, reasoning: _c, ...safeOptions } =\n (params.providerOptions ?? {}) as Record<string, unknown>;\n\n const body: Record<string, unknown> = {\n model,\n messages: toOpenAIMessages(params.messages),\n stream: true,\n ...safeOptions,\n };\n\n const requestedEffort =\n params.providerOptions?.reasoning_effort ?? params.providerOptions?.reasoningEffort;\n const reasoningModel =\n detectEffortCapability(params.model).supported || requestedEffort != null;\n\n if (params.tools?.length) {\n body.tools = params.tools.map((t) => ({\n type: 'function',\n function: { name: t.name, description: t.description, parameters: t.parameters },\n }));\n if (reasoningModel) {\n body.reasoning_effort = 'none';\n }\n } else if (requestedEffort != null && requestedEffort !== 'none') {\n body.reasoning_effort = requestedEffort;\n }\n\n return body;\n}\n\n/** Minimal OpenAI-compatible streaming provider (chat/completions SSE). */\nexport class OpenAICompatibleProvider implements ModelProvider {\n constructor(private readonly config: OpenAICompatibleConfig) {}\n\n get id(): string {\n return this.config.id;\n }\n\n listModels(): Array<{ id: string; name: string }> {\n return this.config.defaultModels ?? [{ id: 'default', name: 'Default' }];\n }\n\n async fetchRemoteModels(signal?: AbortSignal): Promise<RemoteModelInfo[]> {\n return fetchOpenAICompatibleModels(this.config.baseUrl, this.config.apiKey, signal);\n }\n\n async *stream(params: StreamParams): AsyncIterable<StreamChunk> {\n const url = `${this.config.baseUrl.replace(/\\/$/, '')}/chat/completions`;\n const body = buildChatCompletionBody(params);\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.config.apiKey) headers.Authorization = `Bearer ${this.config.apiKey}`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: params.signal,\n });\n } catch (err) {\n if (params.signal?.aborted || isAbortError(err)) {\n yield { type: 'done' };\n return;\n }\n yield { type: 'error', error: err instanceof Error ? err.message : String(err) };\n return;\n }\n\n if (!response.ok || !response.body) {\n yield { type: 'error', error: `HTTP ${response.status}: ${await response.text()}` };\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const toolAcc = new Map<number, { id: string; name: string; arguments: string }>();\n\n while (true) {\n let done: boolean;\n let value: Uint8Array | undefined;\n try {\n ({ done, value } = await reader.read());\n } catch (err) {\n if (params.signal?.aborted || isAbortError(err)) {\n yield { type: 'done' };\n return;\n }\n yield { type: 'error', error: err instanceof Error ? err.message : String(err) };\n return;\n }\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data:')) continue;\n const data = trimmed.slice(5).trim();\n if (data === '[DONE]') {\n yield { type: 'done' };\n return;\n }\n try {\n const json = JSON.parse(data);\n const delta = json.choices?.[0]?.delta;\n if (!delta) continue;\n if (delta.content) yield { type: 'text', text: delta.content };\n if (delta.reasoning_content || delta.reasoning) {\n yield { type: 'reasoning', text: String(delta.reasoning_content ?? delta.reasoning) };\n }\n if (Array.isArray(delta.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n const cur = toolAcc.get(idx) ?? { id: tc.id ?? `call-${idx}`, name: '', arguments: '' };\n if (tc.id) cur.id = tc.id;\n if (tc.function?.name) cur.name += tc.function.name;\n if (tc.function?.arguments) cur.arguments += tc.function.arguments;\n toolAcc.set(idx, cur);\n yield { type: 'tool_call_delta', toolCall: { ...cur } };\n }\n }\n } catch {\n // ignore partial JSON\n }\n }\n }\n yield { type: 'done' };\n }\n}\n","import type { EffortLevel, ModelPolicy, OptimizeFor, SpecialistRole } from '../types';\nimport { detectEffortCapability } from './effort-support';\nimport type { ModelCatalogEntry, ResolvedModel, RouteRequest } from './types';\n\nconst EFFORT_ORDER: EffortLevel[] = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];\n\nconst ROLE_TIER: Record<SpecialistRole, ModelCatalogEntry['tier']> = {\n compact: 'economy',\n title: 'economy',\n summary: 'economy',\n explore: 'economy',\n plan: 'standard',\n build: 'standard',\n general: 'standard',\n};\n\nconst ROLE_EFFORT: Record<SpecialistRole, EffortLevel> = {\n compact: 'none',\n title: 'none',\n summary: 'low',\n explore: 'low',\n plan: 'medium',\n build: 'medium',\n general: 'medium',\n};\n\nfunction effortIndex(level: EffortLevel): number {\n return EFFORT_ORDER.indexOf(level);\n}\n\nfunction clampEffort(level: EffortLevel, max?: EffortLevel): EffortLevel {\n if (!max) return level;\n return effortIndex(level) > effortIndex(max) ? max : level;\n}\n\nfunction resolveEffort(\n entry: ModelCatalogEntry,\n desired: EffortLevel,\n requireTools?: boolean,\n): EffortLevel {\n if (!entry.effort.supported) return 'none';\n // chat/completions rejects reasoning_effort + function tools together.\n if (requireTools) return 'none';\n if (!entry.effort.levels.includes(desired)) return entry.effort.default;\n return desired;\n}\n\nfunction mapEffortOptions(\n entry: ModelCatalogEntry,\n effort: EffortLevel,\n requireTools?: boolean,\n): Record<string, unknown> {\n if (!entry.effort.supported) return {};\n // With tools on chat/completions, force explicit none (omitting uses model default).\n if (requireTools) return { reasoning_effort: 'none' };\n if (effort === 'none') return { reasoning_effort: 'none' };\n return { reasoning_effort: effort };\n}\n\nexport class ModelRouter {\n private catalog: ModelCatalogEntry[] = [];\n private utility = new Map<string, number>();\n\n setCatalog(entries: ModelCatalogEntry[]): void {\n this.catalog = [...entries];\n }\n\n recordOutcome(role: SpecialistRole, model: string, effort: EffortLevel, success: boolean, cost = 1): void {\n const key = `${role}|${model}|${effort}`;\n const prev = this.utility.get(key) ?? 0;\n this.utility.set(key, prev + (success ? 1 : -0.5) - cost * 0.05);\n }\n\n resolve(request: RouteRequest, policy: ModelPolicy): ResolvedModel {\n if (policy.mode === 'manual') {\n const model = policy.model;\n const entry = this.catalog.find((c) => c.id === model) ?? this.fallbackEntry(model);\n const desired =\n policy.effort && policy.effort !== 'auto'\n ? policy.effort\n : this.pickEffort(request, policy.maxEffort ?? entry.effort.default, 'balance');\n const effort = resolveEffort(entry, desired, request.requireTools);\n return {\n model: entry.id,\n providerId: entry.providerId,\n effort,\n providerOptions: mapEffortOptions(entry, effort, request.requireTools),\n reason: `manual:${entry.id}+effort:${effort}`,\n };\n }\n\n const optimizeFor = request.optimizeFor ?? policy.optimizeFor;\n const complexity = request.complexity ?? 0.3;\n let tier = ROLE_TIER[request.role];\n if (optimizeFor === 'intelligence' || complexity > 0.7) tier = 'frontier';\n if (optimizeFor === 'cost' && complexity < 0.5) tier = 'economy';\n\n const candidates = this.catalog.filter((c) => c.tier === tier);\n const pool = candidates.length ? candidates : this.catalog;\n const ranked = [...pool].sort((a, b) => {\n const ua = this.utility.get(`${request.role}|${a.id}|${ROLE_EFFORT[request.role]}`) ?? 0;\n const ub = this.utility.get(`${request.role}|${b.id}|${ROLE_EFFORT[request.role]}`) ?? 0;\n return ub - ua;\n });\n const entry = ranked[0] ?? this.fallbackEntry(`${this.catalog[0]?.providerId ?? 'openai'}/default`);\n const desired = this.pickEffort(request, policy.maxEffort, optimizeFor);\n const effort = resolveEffort(entry, desired, request.requireTools);\n\n return {\n model: entry.id,\n providerId: entry.providerId,\n effort,\n providerOptions: mapEffortOptions(entry, effort, request.requireTools),\n reason: `auto:${optimizeFor}+role:${request.role}+tier:${entry.tier}+effort:${effort}`,\n };\n }\n\n private pickEffort(request: RouteRequest, maxEffort: EffortLevel | undefined, optimizeFor: OptimizeFor): EffortLevel {\n if (request.manualEffort && request.manualEffort !== 'auto') {\n return clampEffort(request.manualEffort, maxEffort);\n }\n let effort = ROLE_EFFORT[request.role];\n const complexity = request.complexity ?? 0.3;\n if (optimizeFor === 'intelligence' || complexity > 0.6) {\n effort = EFFORT_ORDER[Math.min(EFFORT_ORDER.length - 1, effortIndex(effort) + 1)];\n }\n if (optimizeFor === 'cost') {\n effort = EFFORT_ORDER[Math.max(0, effortIndex(effort) - 1)];\n }\n return clampEffort(effort, maxEffort);\n }\n\n private fallbackEntry(model: string): ModelCatalogEntry {\n const slash = model.indexOf('/');\n const providerId = slash === -1 ? 'openai' : model.slice(0, slash);\n const id = slash === -1 ? `${providerId}/${model}` : model;\n return {\n id,\n providerId,\n tier: 'standard',\n strengths: ['code'],\n effort: detectEffortCapability(id),\n };\n }\n}\n","import type { PermissionAction, SpecialistRole, ToolApprovalMode } from '../types';\nimport type { ToolDefinition } from '../models/types';\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolResult {\n id: string;\n name: string;\n ok: boolean;\n output: unknown;\n error?: string;\n mutating?: boolean;\n}\n\nexport interface PermissionHandler {\n (request: { toolName: string; args: Record<string, unknown>; sessionId: string }): Promise<PermissionAction>;\n}\n\nexport type ToolExecutor = (call: ToolCall, sessionId: string) => Promise<ToolResult>;\n\nexport interface PermissionRule {\n pattern: string;\n action: PermissionAction;\n}\n\nfunction matchPattern(pattern: string, name: string): boolean {\n if (pattern === '*' || pattern === name) return true;\n if (pattern.endsWith('*')) return name.startsWith(pattern.slice(0, -1));\n return false;\n}\n\nexport interface ExecuteOptions {\n /** Agent-classified risk for auto_safe mode. Missing → treat as critical. */\n risk?: 'safe' | 'critical';\n}\n\n/** Evaluates allow/ask/deny and dispatches tool executors. */\nexport class ToolBroker {\n private approvalMode: ToolApprovalMode = 'auto_safe';\n private rules: PermissionRule[] = [];\n private executors = new Map<string, ToolExecutor>();\n private definitions: ToolDefinition[] = [];\n private permissionHandler: PermissionHandler | null = null;\n private effectLog: Array<{ sessionId: string; tool: string; at: number }> = [];\n\n setApprovalMode(mode: ToolApprovalMode): void {\n this.approvalMode = mode;\n }\n\n getApprovalMode(): ToolApprovalMode {\n return this.approvalMode;\n }\n\n setRules(rules: PermissionRule[]): void {\n this.rules = rules;\n }\n\n setPermissionHandler(handler: PermissionHandler | null): void {\n this.permissionHandler = handler;\n }\n\n register(definition: ToolDefinition, executor: ToolExecutor): void {\n this.definitions = this.definitions.filter((d) => d.name !== definition.name).concat(definition);\n this.executors.set(definition.name, executor);\n }\n\n unregister(name: string): void {\n this.definitions = this.definitions.filter((d) => d.name !== name);\n this.executors.delete(name);\n }\n\n clearDefinitions(): void {\n this.definitions = [];\n this.executors.clear();\n }\n\n listDefinitions(role: SpecialistRole): ToolDefinition[] {\n if (role === 'plan' || role === 'explore') {\n return this.definitions.filter((d) => !isMutatingName(d.name));\n }\n return [...this.definitions];\n }\n\n resolveAction(toolName: string, risk?: 'safe' | 'critical'): PermissionAction {\n for (const rule of this.rules) {\n if (matchPattern(rule.pattern, toolName) && rule.action === 'deny') return 'deny';\n }\n\n let action: PermissionAction;\n switch (this.approvalMode) {\n case 'auto_all':\n action = 'allow';\n break;\n case 'manual':\n action = 'ask';\n break;\n default:\n // auto_safe: trust agent classification; unknown/critical → ask\n action = risk === 'safe' ? 'allow' : 'ask';\n break;\n }\n\n for (const rule of this.rules) {\n if (matchPattern(rule.pattern, toolName) && rule.action === 'allow' && action === 'ask') {\n action = 'allow';\n }\n }\n return action;\n }\n\n async execute(\n call: ToolCall,\n sessionId: string,\n role: SpecialistRole,\n opts: ExecuteOptions = {},\n ): Promise<ToolResult> {\n if ((role === 'plan' || role === 'explore') && isMutatingName(call.name)) {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'Tool denied in plan/explore mode' };\n }\n\n let action = this.resolveAction(call.name, opts.risk);\n if (action === 'ask' && this.permissionHandler) {\n action = await this.permissionHandler({ toolName: call.name, args: call.arguments, sessionId });\n }\n if (action === 'deny') {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'Permission denied' };\n }\n if (action === 'ask') {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'Permission ask unresolved' };\n }\n\n const executor = this.executors.get(call.name);\n if (!executor) {\n return { id: call.id, name: call.name, ok: false, output: null, error: `Unknown tool: ${call.name}` };\n }\n\n const result = await executor(call, sessionId);\n if (result.mutating || isMutatingName(call.name)) {\n this.effectLog.push({ sessionId, tool: call.name, at: Date.now() });\n }\n return result;\n }\n\n effectCount(sessionId: string, since?: number): number {\n return this.effectLog.filter((e) => e.sessionId === sessionId && (!since || e.at >= since)).length;\n }\n}\n\nfunction isMutatingName(name: string): boolean {\n return /^(write|edit|delete|mkdir|rm|mv|save|apply)/i.test(name) || name.includes('write') || name.includes('delete');\n}\n","import type { SessionAttachment } from './types';\n\n/** Mirrors core `IN_MEMORY_ROOT_NAME` without importing the filesys graph. */\nexport const IN_MEMORY_ROOT_NAME = 'in-memory';\n\n/** URI scheme for UI references (`in-memory://<sessionId>/<file>`). */\nexport const IN_MEMORY_URI_SCHEME = 'in-memory://';\n\n/** Sanitize a single path segment (no slashes). Prefer id-prefixed names for uniqueness. */\nexport function safeAttachmentFileName(name: string, id: string): string {\n const base = (name || 'attachment').replace(/[/\\\\]/g, '_').trim() || 'attachment';\n return `${id}-${base}`;\n}\n\n/** Workspace path used by workspace_* tools (no protocol). */\nexport function attachmentWorkspacePath(\n sessionId: string,\n stored: Pick<SessionAttachment, 'id' | 'name'>,\n): string {\n return `${IN_MEMORY_ROOT_NAME}/${sessionId}/${safeAttachmentFileName(stored.name, stored.id)}`;\n}\n\n/** UI / catalog URI form (`in-memory://<sessionId>/<file>`). */\nexport function attachmentUri(\n sessionId: string,\n stored: Pick<SessionAttachment, 'id' | 'name'>,\n): string {\n return `${IN_MEMORY_URI_SCHEME}${sessionId}/${safeAttachmentFileName(stored.name, stored.id)}`;\n}\n\n/**\n * Map `in-memory://…` references to composite workspace paths.\n * Real workspace paths are returned unchanged.\n */\nexport function toWorkspaceToolPath(path: string): string {\n const trimmed = path.trim();\n const lower = trimmed.toLowerCase();\n if (lower === 'in-memory:' || lower === 'in-memory://' || lower === IN_MEMORY_ROOT_NAME) {\n return IN_MEMORY_ROOT_NAME;\n }\n if (lower.startsWith(IN_MEMORY_URI_SCHEME)) {\n const rest = trimmed.slice(IN_MEMORY_URI_SCHEME.length).replace(/^\\/+/, '');\n return rest ? `${IN_MEMORY_ROOT_NAME}/${rest}` : IN_MEMORY_ROOT_NAME;\n }\n return trimmed;\n}\n","import type { MessagePart, PromptAttachment, SessionAttachment } from './types';\nimport type { ProviderContent } from './models/types';\nimport { toWorkspaceToolPath } from './attachment-paths';\n\n/** Soft cap per attached text file when stored / returned via workspace_read. */\nexport const MAX_ATTACHMENT_CHARS = 100_000;\n\n/** Soft cap for visual media attachments (bytes). */\nexport const MAX_IMAGE_BYTES = 4_000_000;\n\n/** Max files accepted on a single user turn. */\nexport const MAX_ATTACHMENTS = 8;\n\n/** Default max characters returned when reading text attachments. */\nexport const DEFAULT_READ_CHARS = 40_000;\n\ntype MediaMode = 'raster' | 'svg';\n\ninterface MediaType {\n mime: string;\n mode: MediaMode;\n /** Prefer presenting bytes to vision models on workspace_read. */\n vision: boolean;\n}\n\n/** Well-known visual media types (raster icons/images + SVG). */\nconst MEDIA_BY_MIME = new Map<string, MediaType>([\n ['image/jpeg', { mime: 'image/jpeg', mode: 'raster', vision: true }],\n ['image/jpg', { mime: 'image/jpeg', mode: 'raster', vision: true }],\n ['image/pjpeg', { mime: 'image/jpeg', mode: 'raster', vision: true }],\n ['image/png', { mime: 'image/png', mode: 'raster', vision: true }],\n ['image/x-png', { mime: 'image/png', mode: 'raster', vision: true }],\n ['image/gif', { mime: 'image/gif', mode: 'raster', vision: true }],\n ['image/webp', { mime: 'image/webp', mode: 'raster', vision: true }],\n ['image/bmp', { mime: 'image/bmp', mode: 'raster', vision: true }],\n ['image/x-ms-bmp', { mime: 'image/bmp', mode: 'raster', vision: true }],\n ['image/avif', { mime: 'image/avif', mode: 'raster', vision: true }],\n ['image/tiff', { mime: 'image/tiff', mode: 'raster', vision: false }],\n ['image/tif', { mime: 'image/tiff', mode: 'raster', vision: false }],\n ['image/x-icon', { mime: 'image/x-icon', mode: 'raster', vision: true }],\n ['image/vnd.microsoft.icon', { mime: 'image/x-icon', mode: 'raster', vision: true }],\n ['image/ico', { mime: 'image/x-icon', mode: 'raster', vision: true }],\n ['image/svg+xml', { mime: 'image/svg+xml', mode: 'svg', vision: false }],\n ['image/svg', { mime: 'image/svg+xml', mode: 'svg', vision: false }],\n]);\n\nconst MEDIA_BY_EXT = new Map<string, MediaType>([\n ['jpg', MEDIA_BY_MIME.get('image/jpeg')!],\n ['jpeg', MEDIA_BY_MIME.get('image/jpeg')!],\n ['jpe', MEDIA_BY_MIME.get('image/jpeg')!],\n ['jfif', MEDIA_BY_MIME.get('image/jpeg')!],\n ['png', MEDIA_BY_MIME.get('image/png')!],\n ['gif', MEDIA_BY_MIME.get('image/gif')!],\n ['webp', MEDIA_BY_MIME.get('image/webp')!],\n ['bmp', MEDIA_BY_MIME.get('image/bmp')!],\n ['avif', MEDIA_BY_MIME.get('image/avif')!],\n ['tif', MEDIA_BY_MIME.get('image/tiff')!],\n ['tiff', MEDIA_BY_MIME.get('image/tiff')!],\n ['ico', MEDIA_BY_MIME.get('image/x-icon')!],\n ['cur', MEDIA_BY_MIME.get('image/x-icon')!],\n ['svg', MEDIA_BY_MIME.get('image/svg+xml')!],\n ['svgz', MEDIA_BY_MIME.get('image/svg+xml')!],\n]);\n\n/** File picker `accept` list for visual media + common text sources. */\nexport const ATTACHMENT_FILE_ACCEPT = [\n 'image/*',\n '.svg',\n '.svgz',\n '.ico',\n '.cur',\n '.bmp',\n '.tif',\n '.tiff',\n '.avif',\n 'text/*',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.json',\n '.md',\n '.css',\n '.html',\n '.py',\n '.rs',\n '.go',\n '.sql',\n '.yml',\n '.yaml',\n '.toml',\n '.txt',\n '.csv',\n].join(',');\n\nexport function fileExtension(name: string): string {\n const base = name.includes('/') ? name.slice(name.lastIndexOf('/') + 1) : name;\n const dot = base.lastIndexOf('.');\n return dot >= 0 ? base.slice(dot + 1).toLowerCase() : '';\n}\n\nexport function resolveMediaType(input: {\n name: string;\n mime?: string;\n}): MediaType | null {\n const mime = (input.mime || '').toLowerCase().trim();\n if (mime && MEDIA_BY_MIME.has(mime)) return MEDIA_BY_MIME.get(mime)!;\n const ext = fileExtension(input.name);\n return MEDIA_BY_EXT.get(ext) ?? null;\n}\n\nexport function isImageAttachment(\n part: Pick<PromptAttachment, 'kind' | 'mime' | 'dataUrl' | 'name'>,\n): boolean {\n if (part.kind === 'image') return true;\n if (part.dataUrl?.startsWith('data:image/')) return true;\n return resolveMediaType({ name: part.name, mime: part.mime }) != null;\n}\n\nexport function isSvgAttachment(\n part: Pick<PromptAttachment, 'mime' | 'name' | 'text'>,\n): boolean {\n const media = resolveMediaType({ name: part.name, mime: part.mime });\n return media?.mode === 'svg' || Boolean(part.text && part.mime?.includes('svg'));\n}\n\nexport function newAttachmentId(): string {\n return `att-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Persistable session entry holding the full payload (not sent in chat history). */\nexport function toSessionAttachment(\n attachment: PromptAttachment,\n opts: { id?: string; messageId?: string } = {},\n): SessionAttachment {\n const kind = isImageAttachment(attachment) ? 'image' : 'text';\n if (kind === 'image') {\n let text = attachment.text;\n let truncated = Boolean(attachment.truncated);\n if (text && text.length > MAX_ATTACHMENT_CHARS) {\n text = text.slice(0, MAX_ATTACHMENT_CHARS);\n truncated = true;\n }\n return {\n id: opts.id ?? newAttachmentId(),\n name: attachment.name,\n path: attachment.path,\n mime: attachment.mime,\n kind: 'image',\n text,\n dataUrl: attachment.dataUrl,\n byteLength: attachment.byteLength,\n truncated: text ? truncated : attachment.truncated,\n createdAt: Date.now(),\n messageId: opts.messageId,\n };\n }\n\n let text = attachment.text ?? '';\n let truncated = Boolean(attachment.truncated);\n if (text.length > MAX_ATTACHMENT_CHARS) {\n text = text.slice(0, MAX_ATTACHMENT_CHARS);\n truncated = true;\n }\n return {\n id: opts.id ?? newAttachmentId(),\n name: attachment.name,\n path: attachment.path,\n mime: attachment.mime,\n kind: 'text',\n text,\n byteLength: attachment.byteLength,\n truncated,\n createdAt: Date.now(),\n messageId: opts.messageId,\n };\n}\n\n/** Lightweight history/UI reference — no payload (path is an in-memory workspace path/URI). */\nexport function toFileRefPart(stored: SessionAttachment): Extract<MessagePart, { type: 'file' }> {\n return {\n type: 'file',\n id: stored.id,\n name: stored.name,\n path: stored.path,\n mime: stored.mime,\n kind: stored.kind,\n byteLength: stored.byteLength,\n };\n}\n\n/** One-line catalog entry published into the user turn for the model. */\nexport function formatAttachmentRefForModel(part: Extract<MessagePart, { type: 'file' }>): string {\n const display = part.path || part.name;\n const toolPath = toWorkspaceToolPath(display);\n const kind = part.kind ?? 'file';\n const bytes = part.byteLength != null ? ` bytes=${part.byteLength}` : '';\n return `[Attachment published: ${display} kind=${kind}${part.mime ? ` mime=${part.mime}` : ''}${bytes}] → workspace_read path=\"${toolPath}\"`;\n}\n\n/**\n * Build provider user content from history parts.\n * File parts are references only — payloads live under the in-memory workspace root.\n */\nexport function userContentFromParts(parts: MessagePart[]): ProviderContent {\n const texts: string[] = [];\n const refs: string[] = [];\n for (const part of parts) {\n if (part.type === 'text' && part.text.trim()) texts.push(part.text);\n if (part.type === 'file') refs.push(formatAttachmentRefForModel(part));\n }\n const body = [...texts, ...refs].join('\\n').trim();\n if (!refs.length) return body;\n const hint =\n 'Session attachments are files under the in-memory workspace root. List with workspace_list, read with workspace_read. Do not connect storage backends to find them.';\n return [body, hint].filter(Boolean).join('\\n');\n}\n\nexport function attachmentMeta(stored: SessionAttachment) {\n return {\n id: stored.id,\n name: stored.name,\n path: stored.path,\n mime: stored.mime,\n kind: stored.kind,\n byteLength: stored.byteLength,\n truncated: stored.truncated,\n };\n}\n\nexport function readTextAttachment(\n stored: SessionAttachment,\n opts: { offset?: number; limit?: number } = {},\n): { ok: true; output: Record<string, unknown> } | { ok: false; error: string } {\n if (stored.kind !== 'text' && !(stored.kind === 'image' && stored.text)) {\n return { ok: false, error: `${stored.name} is not a text attachment` };\n }\n const full = stored.text ?? '';\n const offset = Math.max(0, opts.offset ?? 0);\n const limit = Math.max(1, opts.limit ?? DEFAULT_READ_CHARS);\n const slice = full.slice(offset, offset + limit);\n return {\n ok: true,\n output: {\n ...attachmentMeta(stored),\n offset,\n length: slice.length,\n totalLength: full.length,\n truncated: offset + slice.length < full.length,\n content: slice,\n },\n };\n}\n\n/** Marker field: specialist loop presents image bytes in a follow-up multimodal message. */\nexport const IMAGE_PRESENT_KEY = '_presentImage' as const;\n\nexport function readImageAttachment(\n stored: SessionAttachment,\n opts: { offset?: number; limit?: number } = {},\n): { ok: true; output: Record<string, unknown> } | { ok: false; error: string } {\n if (stored.kind !== 'image') {\n return { ok: false, error: `${stored.name} is not an image attachment` };\n }\n\n // SVG and other source-backed visuals: return markup/text (vision APIs rarely accept SVG).\n if (stored.text != null && isSvgAttachment(stored)) {\n return readTextAttachment(stored, opts);\n }\n\n if (!stored.dataUrl) {\n return { ok: false, error: `${stored.name} has no image payload` };\n }\n\n const media = resolveMediaType({ name: stored.name, mime: stored.mime });\n const present = media?.vision !== false;\n\n return {\n ok: true,\n output: {\n ...attachmentMeta(stored),\n ...(present\n ? {\n [IMAGE_PRESENT_KEY]: true,\n dataUrl: stored.dataUrl,\n note: 'Image bytes will be provided to the model in the next message for vision inspection.',\n }\n : {\n dataUrlOmitted: true,\n note: 'This media type is stored for preview; vision presentation is skipped. Ask for a raster export if needed.',\n }),\n },\n };\n}\n\nexport function stripAttachmentToolOutput(output: unknown): unknown {\n if (!output || typeof output !== 'object') return output;\n const copy = { ...(output as Record<string, unknown>) };\n delete copy.dataUrl;\n delete copy[IMAGE_PRESENT_KEY];\n return copy;\n}\n\nexport function looksBinaryText(sample: string): boolean {\n return sample.includes('\\0');\n}\n\nexport type ReadAttachmentResult =\n | { ok: true; attachment: PromptAttachment }\n | { ok: false; error: string };\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n const chunk = 0x8000;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return btoa(binary);\n}\n\nfunction textToBase64(text: string): string {\n // UTF-8 safe base64 for SVG source.\n const bytes = new TextEncoder().encode(text);\n return bytesToBase64(bytes);\n}\n\nasync function readFileAsDataUrl(file: File, mime: string): Promise<string> {\n const buffer = await file.arrayBuffer();\n return `data:${mime};base64,${bytesToBase64(new Uint8Array(buffer))}`;\n}\n\nfunction svgDataUrl(text: string): string {\n return `data:image/svg+xml;base64,${textToBase64(text)}`;\n}\n\n/** Read a browser `File` into a prompt attachment (payload kept until publish). */\nexport async function readPromptAttachmentFromFile(file: File): Promise<ReadAttachmentResult> {\n const mime = file.type || 'application/octet-stream';\n const media = resolveMediaType({ name: file.name, mime });\n\n if (media) {\n if (file.size > MAX_IMAGE_BYTES) {\n return {\n ok: false,\n error: `${file.name}: media is larger than ${Math.round(MAX_IMAGE_BYTES / 1_000_000)}MB`,\n };\n }\n\n if (media.mode === 'svg') {\n try {\n const text = await file.text();\n if (!text.trim()) {\n return { ok: false, error: `${file.name}: empty SVG` };\n }\n let storedText = text;\n let truncated = false;\n if (storedText.length > MAX_ATTACHMENT_CHARS) {\n storedText = storedText.slice(0, MAX_ATTACHMENT_CHARS);\n truncated = true;\n }\n return {\n ok: true,\n attachment: {\n name: file.name,\n mime: media.mime,\n kind: 'image',\n text: storedText,\n dataUrl: svgDataUrl(storedText),\n byteLength: file.size,\n truncated,\n },\n };\n } catch (err) {\n return {\n ok: false,\n error: `${file.name}: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n try {\n const dataUrl = await readFileAsDataUrl(file, media.mime);\n return {\n ok: true,\n attachment: {\n name: file.name,\n mime: media.mime,\n kind: 'image',\n dataUrl,\n byteLength: file.size,\n },\n };\n } catch (err) {\n return {\n ok: false,\n error: `${file.name}: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n if (mime.startsWith('audio/') || mime.startsWith('video/')) {\n return { ok: false, error: `${file.name}: audio/video attachments are not supported` };\n }\n if (mime.startsWith('image/')) {\n return {\n ok: false,\n error: `${file.name}: unsupported image type (try jpeg, png, gif, webp, svg, ico, bmp, avif)`,\n };\n }\n if (file.size > 2_000_000) {\n return { ok: false, error: `${file.name}: file is larger than 2MB` };\n }\n\n let text: string;\n try {\n text = await file.text();\n } catch (err) {\n return {\n ok: false,\n error: `${file.name}: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n if (looksBinaryText(text.slice(0, 2048))) {\n return { ok: false, error: `${file.name}: binary files are not supported` };\n }\n\n let truncated = false;\n if (text.length > MAX_ATTACHMENT_CHARS) {\n text = text.slice(0, MAX_ATTACHMENT_CHARS);\n truncated = true;\n }\n\n return {\n ok: true,\n attachment: {\n name: file.name,\n mime,\n kind: 'text',\n text,\n byteLength: file.size,\n truncated,\n },\n };\n}\n","import { IN_MEMORY_ROOT_NAME } from '../attachment-paths';\n\nexport type RootQualificationDecision =\n | { action: 'keep' }\n | { action: 'prefix'; root: string }\n | { action: 'pick' }\n | { action: 'error'; error: string };\n\nexport function isInMemoryToolPath(path: string): boolean {\n return path === IN_MEMORY_ROOT_NAME || path.startsWith(`${IN_MEMORY_ROOT_NAME}/`);\n}\n\nexport function isWorkspaceRootPath(path: string): boolean {\n const trimmed = path.trim();\n return !trimmed || trimmed === '.' || trimmed === '/';\n}\n\n/** First path segment — composite roots are keyed by this name. */\nexport function firstPathSegment(path: string): string {\n return path.split('/').filter(Boolean)[0] ?? '';\n}\n\nexport function pathHasKnownRoot(path: string, rootNames: Iterable<string>): boolean {\n const first = firstPathSegment(path);\n if (!first) return false;\n const roots = rootNames instanceof Set ? rootNames : new Set(rootNames);\n return roots.has(first);\n}\n\nexport function joinUnderRoot(rootPath: string, relativePath: string): string {\n const root = rootPath.replace(/\\/+$/, '');\n const relative = relativePath.replace(/^\\/+/, '');\n if (!root) return relative;\n if (!relative) return root;\n return `${root}/${relative}`;\n}\n\n/**\n * Decide how to qualify a workspace tool path that is missing a connected-root prefix.\n */\nexport function decideRootQualification(\n path: string,\n durableRoots: string[],\n mode: 'write' | 'read',\n): RootQualificationDecision {\n if (isInMemoryToolPath(path) || isWorkspaceRootPath(path)) {\n return { action: 'keep' };\n }\n if (pathHasKnownRoot(path, durableRoots)) {\n return { action: 'keep' };\n }\n if (durableRoots.length === 1) {\n return { action: 'prefix', root: durableRoots[0]! };\n }\n if (durableRoots.length === 0) {\n return {\n action: 'error',\n error:\n mode === 'write'\n ? 'No durable workspace folder connected. Connect a folder before writing, or use an in-memory/… path.'\n : 'No workspace folder connected.',\n };\n }\n if (mode === 'write') {\n return { action: 'pick' };\n }\n return {\n action: 'error',\n error: `Path must start with a workspace root (${durableRoots.join(', ')}). Example: ${durableRoots[0]}/${path}`,\n };\n}\n","import { filebrowserDialog, workspaceService } from '@eclipse-docks/core';\nimport { toWorkspaceToolPath } from '../attachment-paths';\nimport {\n decideRootQualification,\n isInMemoryToolPath,\n isWorkspaceRootPath,\n joinUnderRoot,\n pathHasKnownRoot,\n} from './workspace-path-qualify';\n\nexport type QualifyPathResult =\n | { ok: true; path: string; resolvedFrom?: string }\n | { ok: false; error: string };\n\nexport {\n decideRootQualification,\n joinUnderRoot,\n pathHasKnownRoot,\n} from './workspace-path-qualify';\n\n/**\n * Ensure tool paths are under a composite workspace root.\n * - Already rooted / in-memory / empty → unchanged\n * - One durable root → auto-prefix\n * - Several durable roots (writes) → folder picker dialog\n */\nexport async function qualifyWorkspaceToolPath(\n rawPath: string,\n mode: 'write' | 'read' = 'write',\n): Promise<QualifyPathResult> {\n const path = toWorkspaceToolPath(String(rawPath ?? ''));\n if (isInMemoryToolPath(path) || isWorkspaceRootPath(path)) {\n return { ok: true, path };\n }\n\n const folders = await workspaceService.getFolders();\n const allNames = folders.map((f) => f.name);\n if (pathHasKnownRoot(path, allNames)) {\n return { ok: true, path };\n }\n\n const durableRoots = folders.filter((f) => f.type !== 'in-memory').map((f) => f.name);\n const rootsForDecision = mode === 'write' ? durableRoots : allNames.length ? allNames : durableRoots;\n const decision = decideRootQualification(path, rootsForDecision, mode);\n\n if (decision.action === 'keep') return { ok: true, path };\n if (decision.action === 'prefix') {\n return { ok: true, path: joinUnderRoot(decision.root, path), resolvedFrom: path };\n }\n if (decision.action === 'error') return { ok: false, error: decision.error };\n\n const chosen = await filebrowserDialog('directory');\n if (!chosen) {\n return { ok: false, error: 'Write cancelled: no workspace folder selected.' };\n }\n return { ok: true, path: joinUnderRoot(chosen, path), resolvedFrom: path };\n}\n","import {\n workspaceService,\n File,\n Directory,\n getInMemoryRoot,\n IN_MEMORY_ROOT_NAME,\n} from '@eclipse-docks/core';\nimport {\n IMAGE_PRESENT_KEY,\n isSvgAttachment,\n resolveMediaType,\n} from '../attachments';\nimport { toWorkspaceToolPath } from '../attachment-paths';\nimport { qualifyWorkspaceToolPath } from './workspace-path';\nimport { isInMemoryToolPath, isWorkspaceRootPath } from './workspace-path-qualify';\nimport type { ToolBroker } from './broker';\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n}\n\n/** Some File backends (e.g. in-memory) expose mime; the abstract File does not. */\nfunction optionalMimeType(resource: File): string | undefined {\n const getMimeType = (resource as unknown as { getMimeType?: () => string | undefined }).getMimeType;\n return typeof getMimeType === 'function' ? getMimeType.call(resource) : undefined;\n}\n\nfunction fileNameFromPath(path: string): string {\n const parts = path.split('/').filter(Boolean);\n return parts[parts.length - 1] || path;\n}\n\n/** Resolve a tool path against the shared in-memory root or the mounted workspace. */\nasync function resolveResource(\n path: string,\n options?: { create?: boolean; directory?: boolean },\n): Promise<{ resource: File | Directory | null; path: string }> {\n if (isInMemoryToolPath(path)) {\n const root = getInMemoryRoot();\n const relative =\n path === IN_MEMORY_ROOT_NAME ? '' : path.slice(`${IN_MEMORY_ROOT_NAME}/`.length);\n if (!relative) {\n return { resource: root, path: IN_MEMORY_ROOT_NAME };\n }\n const lookup = options?.directory && !relative.endsWith('/') ? `${relative}/` : relative;\n const resource = await root.getResource(lookup, options?.create ? { create: true } : undefined);\n return { resource: resource as File | Directory | null, path };\n }\n\n const workspace = await workspaceService.getWorkspace();\n if (!workspace) return { resource: null, path };\n\n if (isWorkspaceRootPath(path)) {\n return { resource: workspace, path: '' };\n }\n\n const lookup =\n options?.directory && !path.endsWith('/') ? `${path}/` : path;\n const resource = await workspace.getResource(\n lookup,\n options?.create ? { create: true } : undefined,\n );\n return { resource: resource as File | Directory | null, path };\n}\n\n/**\n * Present image-like workspace files for vision (data URLs or known image extensions).\n * Returns null when the file should be treated as ordinary text.\n */\nfunction visionToolOutput(\n path: string,\n contents: string,\n mimeHint?: string,\n): Record<string, unknown> | null {\n const name = fileNameFromPath(path);\n const dataUrl =\n typeof contents === 'string' && contents.startsWith('data:image/') ? contents : undefined;\n const mime =\n mimeHint ||\n (dataUrl ? dataUrl.slice(5, dataUrl.indexOf(';')) : undefined) ||\n resolveMediaType({ name, mime: mimeHint })?.mime;\n\n if (isSvgAttachment({ name, mime, text: dataUrl ? undefined : contents })) {\n return null;\n }\n\n const media = resolveMediaType({ name, mime });\n if (!dataUrl && media?.mode !== 'raster') return null;\n if (!dataUrl) return null;\n\n const present = media?.vision !== false;\n return {\n path,\n name,\n mime,\n kind: 'image',\n ...(present\n ? {\n [IMAGE_PRESENT_KEY]: true,\n dataUrl,\n note: 'Image bytes will be provided to the model in the next message for vision inspection.',\n }\n : {\n dataUrlOmitted: true,\n note: 'This media type is stored for preview; vision presentation is skipped.',\n }),\n };\n}\n\n/** Registers built-in workspace file tools (paths may use in-memory:// URI form). */\nexport function registerWorkspaceTools(broker: ToolBroker): void {\n broker.register(\n {\n name: 'workspace_list',\n description:\n 'List children of a workspace directory. Omit path (or use \"\" / \"/\") for connected roots (use those path prefixes for writes). in-memory/… works without mounting.',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description:\n 'Directory path under a connected root (empty = list roots). in-memory://… URIs are accepted.',\n },\n },\n required: [],\n },\n },\n async (call) => {\n try {\n const path = toWorkspaceToolPath(String(call.arguments.path ?? ''));\n const { resource } = await resolveResource(path, { directory: true });\n if (!(resource instanceof Directory)) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: isInMemoryToolPath(path) ? 'Not a directory' : 'No workspace / not a directory',\n };\n }\n const children = await resource.listChildren(true);\n return {\n id: call.id,\n name: call.name,\n ok: true,\n output: children.map((c) => ({\n name: c.getName(),\n path: c.getWorkspacePath(),\n kind: c instanceof Directory ? 'directory' : 'file',\n })),\n };\n } catch (err) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n },\n );\n\n broker.register(\n {\n name: 'workspace_read',\n description:\n 'Read a workspace file as text. Paths should be root/… from workspace_list; a bare name is auto-rooted when only one folder is connected. Image data-URL files are presented for vision.',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'File path under a connected root (e.g. tests/readme.md).',\n },\n offset: { type: 'number', description: 'Text start offset' },\n limit: { type: 'number', description: 'Max text characters to return' },\n },\n required: ['path'],\n },\n },\n async (call) => {\n try {\n const qualified = await qualifyWorkspaceToolPath(String(call.arguments.path ?? ''), 'read');\n if (!qualified.ok) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: qualified.error,\n };\n }\n const path = qualified.path;\n const { resource } = await resolveResource(path);\n if (!(resource instanceof File)) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: isInMemoryToolPath(path) ? 'Not a file' : 'No workspace / not a file',\n };\n }\n const contents = await resource.getContents();\n const text = typeof contents === 'string' ? contents : String(contents ?? '');\n const vision = visionToolOutput(path, text, optionalMimeType(resource));\n if (vision) {\n return { id: call.id, name: call.name, ok: true, output: vision };\n }\n\n const offset =\n typeof call.arguments.offset === 'number' ? Math.max(0, call.arguments.offset) : 0;\n const limit =\n typeof call.arguments.limit === 'number' ? Math.max(1, call.arguments.limit) : undefined;\n if (offset || limit != null) {\n const slice = text.slice(offset, limit != null ? offset + limit : undefined);\n return {\n id: call.id,\n name: call.name,\n ok: true,\n output: {\n path,\n offset,\n length: slice.length,\n totalLength: text.length,\n truncated: offset + slice.length < text.length,\n content: slice,\n },\n };\n }\n return { id: call.id, name: call.name, ok: true, output: text };\n } catch (err) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n },\n );\n\n broker.register(\n {\n name: 'workspace_write',\n description:\n 'Write text to a workspace file (creates parents as needed). Prefer root/… paths from workspace_list. A bare filename uses the only durable root, or opens a folder picker when several roots are connected.',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'File path under a connected root (e.g. tests/demo.canvas.js).',\n },\n contents: { type: 'string' },\n },\n required: ['path', 'contents'],\n },\n },\n async (call) => {\n try {\n const args = asRecord(call.arguments);\n const qualified = await qualifyWorkspaceToolPath(String(args.path ?? ''), 'write');\n if (!qualified.ok) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: qualified.error,\n mutating: true,\n };\n }\n const path = qualified.path;\n const contents = String(args.contents ?? '');\n const { resource } = await resolveResource(path, { create: true });\n if (!(resource instanceof File)) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: isInMemoryToolPath(path) ? 'Not a file' : 'No workspace / not a file',\n mutating: true,\n };\n }\n await resource.saveContents(contents);\n return {\n id: call.id,\n name: call.name,\n ok: true,\n output: {\n path,\n ...(qualified.resolvedFrom ? { resolvedFrom: qualified.resolvedFrom } : {}),\n },\n mutating: true,\n };\n } catch (err) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: err instanceof Error ? err.message : String(err),\n mutating: true,\n };\n }\n },\n );\n}\n","import { commandRegistry } from '@eclipse-docks/core';\nimport type { ToolBroker } from './broker';\nimport type { SpecialistRole } from '../types';\n\n/** Commands that must never be exposed as LLM tools (pickers, storage boots, settings). */\nconst SKIP = new Set([\n 'open_cognitive_ai_settings',\n 'open_ai_config',\n 'load_workspace',\n 'connect_opfs',\n 'connect_indexeddb',\n 'disconnect_workspace',\n 'disconnect_folder',\n 'open_editor',\n 'list_extensions',\n 'enable_extension',\n 'disable_extension',\n]);\n\nconst SKIP_PREFIXES = ['connect_', 'disconnect_', 'install_', 'uninstall_'];\n\n/** Built-in tools that must survive command refresh (not command-backed). */\nconst KEEP_TOOLS = new Set(['workspace_list', 'workspace_read', 'workspace_write']);\n\nfunction sanitizeName(id: string): string {\n return id.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 64);\n}\n\nfunction shouldSkipCommand(id: string): boolean {\n if (SKIP.has(id)) return true;\n return SKIP_PREFIXES.some((prefix) => id.startsWith(prefix));\n}\n\n/** Registers Docks commands as first-class LLM tools (tool name = command id). */\nexport function refreshCommandTools(broker: ToolBroker, role: SpecialistRole): void {\n for (const def of broker.listDefinitions('build')) {\n if (!KEEP_TOOLS.has(def.name)) broker.unregister(def.name);\n }\n\n const commands = commandRegistry.listCommands(commandRegistry.createExecutionContext());\n const entries = Object.values(commands) as Array<{\n id: string;\n name: string;\n description: string;\n parameters?: Array<{\n name: string;\n description: string;\n type?: string;\n required: boolean;\n allowedValues?: string[];\n }>;\n }>;\n\n for (const command of entries) {\n if (!command?.id || shouldSkipCommand(command.id)) continue;\n if (!command.description) continue;\n if ((role === 'plan' || role === 'explore') && /delete|write|save|rm|mv/i.test(command.id)) continue;\n\n const toolName = sanitizeName(command.id);\n if (KEEP_TOOLS.has(toolName)) continue;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const p of command.parameters ?? []) {\n properties[p.name] = {\n type: p.type ?? 'string',\n description: p.description,\n ...(p.allowedValues ? { enum: p.allowedValues } : {}),\n };\n if (p.required) required.push(p.name);\n }\n\n broker.register(\n {\n name: toolName,\n description: `${command.name}: ${command.description}`,\n parameters: { type: 'object', properties, required },\n },\n async (call, _sessionId) => {\n try {\n const result = await commandRegistry.execute(command.id, { params: call.arguments });\n return { id: call.id, name: call.name, ok: true, output: result };\n } catch (err) {\n return {\n id: call.id,\n name: call.name,\n ok: false,\n output: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n },\n );\n }\n}\n","import type { ChatMessage, MessagePart } from '../types';\nimport type { ModelProvider, ProviderChatMessage } from '../models/types';\n\nexport interface CompactionResult {\n /** Summary covering dropped turns (extractive or caller-replaced). */\n summary: string;\n kept: ChatMessage[];\n dropped: ChatMessage[];\n didCompact: boolean;\n}\n\nconst COMPACT_SYSTEM = `You compress older chat turns into a durable summary for future assistant turns.\nPreserve: user goals, decisions, constraints, important file/paths, tool outcomes that still matter, and open questions.\nOmit chit-chat, repeated content, and raw tool dumps.\nReply with concise markdown only (short sections or bullets). No preamble.`;\n\n/** Format one message for extractive / LLM compaction input. */\nexport function formatMessageForCompaction(msg: ChatMessage, maxChars = 280): string {\n const bits: string[] = [];\n for (const part of msg.parts) {\n const piece = formatPart(part);\n if (piece) bits.push(piece);\n }\n const body = bits.join(' · ').replace(/\\s+/g, ' ').trim();\n if (!body) return '';\n const clipped = body.length <= maxChars ? body : `${body.slice(0, maxChars)}…`;\n return `${msg.role}: ${clipped}`;\n}\n\nfunction formatPart(part: MessagePart): string {\n if (part.type === 'text') return part.text;\n if (part.type === 'file') {\n const label = part.path || part.name;\n const kind = part.kind === 'image' ? 'image' : 'file';\n return `${kind} ${label} (${part.id})`;\n }\n if (part.type === 'reasoning') return `(thinking) ${part.text}`;\n if (part.type === 'tool') {\n const status = part.status === 'error' ? 'error' : part.status === 'done' ? 'ok' : part.status;\n const result =\n part.result === undefined\n ? ''\n : ` → ${JSON.stringify(part.result).slice(0, 120)}`;\n return `tool ${part.name} [${status}]${result}`;\n }\n if (part.type === 'step') return `step ${part.title}`;\n return '';\n}\n\n/** Anchored summary compaction: keep recent messages, summarize the rest. */\nexport function compactHistory(\n history: ChatMessage[],\n options: { keepCount?: number; previousSummary?: string } = {},\n): CompactionResult {\n const keepCount = options.keepCount ?? 12;\n if (history.length <= keepCount) {\n return {\n summary: options.previousSummary ?? '',\n kept: [...history],\n dropped: [],\n didCompact: false,\n };\n }\n\n const kept = history.slice(-keepCount);\n const dropped = history.slice(0, -keepCount);\n return {\n summary: buildExtractiveSummary(dropped, options.previousSummary),\n kept,\n dropped,\n didCompact: true,\n };\n}\n\nexport function buildExtractiveSummary(\n dropped: ChatMessage[],\n previousSummary?: string,\n): string {\n const lines: string[] = [];\n if (previousSummary?.trim()) lines.push(`Prior: ${previousSummary.trim()}`);\n for (const msg of dropped) {\n const line = formatMessageForCompaction(msg);\n if (line) lines.push(line);\n }\n return [\n '## Objective',\n 'Continue prior work from compacted history.',\n '## Notes',\n ...lines.slice(-24),\n ].join('\\n');\n}\n\n/** Ask the model to summarize dropped turns; returns null on empty/failure. */\nexport async function summarizeDroppedHistory(input: {\n provider: ModelProvider;\n model: string;\n dropped: ChatMessage[];\n previousSummary?: string;\n providerOptions?: Record<string, unknown>;\n signal?: AbortSignal;\n}): Promise<string | null> {\n if (!input.dropped.length) return null;\n\n const transcript = input.dropped\n .map((msg) => formatMessageForCompaction(msg, 600))\n .filter(Boolean)\n .join('\\n');\n if (!transcript.trim()) return null;\n\n const userParts = [\n input.previousSummary?.trim() ? `## Existing summary\\n${input.previousSummary.trim()}` : '',\n `## Older turns to fold in\\n${transcript}`,\n ].filter(Boolean);\n\n const messages: ProviderChatMessage[] = [\n { role: 'system', content: COMPACT_SYSTEM },\n { role: 'user', content: userParts.join('\\n\\n') },\n ];\n\n let text = '';\n try {\n for await (const chunk of input.provider.stream({\n model: input.model,\n messages,\n providerOptions: input.providerOptions ?? { reasoning_effort: 'none' },\n signal: input.signal,\n })) {\n if (chunk.type === 'error') return null;\n if (chunk.type === 'text' && chunk.text) text += chunk.text;\n }\n } catch {\n return null;\n }\n\n const summary = text.trim();\n return summary || null;\n}\n\n/** System message body injected ahead of live history when a summary exists. */\nexport function compactionContextMessage(summary: string): string {\n return `## Compacted prior context\\nThe following summarizes earlier turns that were removed from the live transcript. Treat it as authoritative background.\\n\\n${summary.trim()}`;\n}\n","import type {\n BufferMap,\n Checkpoint,\n ChatMessage,\n CognitiveSession,\n ModelPolicy,\n SpecialistRole,\n} from '../types';\nimport { emptyBuffers } from '../core/tick';\nimport { compactHistory } from '../compact/compaction';\n\nfunction sid(): string {\n return `session-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction cloneBuffers(buffers: BufferMap): BufferMap {\n return {\n goal: buffers.goal ? { ...buffers.goal, slots: { ...buffers.goal.slots } } : null,\n retrieval: buffers.retrieval ? { ...buffers.retrieval, slots: { ...buffers.retrieval.slots } } : null,\n imaginal: buffers.imaginal ? { ...buffers.imaginal, slots: { ...buffers.imaginal.slots } } : null,\n emotion: buffers.emotion ? { ...buffers.emotion, slots: { ...buffers.emotion.slots } } : null,\n motor: buffers.motor ? { ...buffers.motor, slots: { ...buffers.motor.slots } } : null,\n };\n}\n\nexport class SessionRuntime {\n private sessions = new Map<string, CognitiveSession>();\n private checkpoints = new Map<string, Checkpoint[]>();\n private focusedId: string | null = null;\n\n createSession(input: { title?: string; parentSessionId?: string; specialistMode?: SpecialistRole } = {}): CognitiveSession {\n const session: CognitiveSession = {\n id: sid(),\n title: input.title ?? 'New session',\n status: 'idle',\n history: [],\n attachments: [],\n buffers: emptyBuffers(),\n specialistMode: input.specialistMode ?? 'build',\n parentSessionId: input.parentSessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this.sessions.set(session.id, session);\n this.checkpoints.set(session.id, []);\n this.focusedId = session.id;\n return session;\n }\n\n get(sessionId: string): CognitiveSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n list(): CognitiveSession[] {\n return [...this.sessions.values()].sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n focus(sessionId: string): boolean {\n if (!this.sessions.has(sessionId)) return false;\n this.focusedId = sessionId;\n return true;\n }\n\n focused(): CognitiveSession | undefined {\n return this.focusedId ? this.sessions.get(this.focusedId) : undefined;\n }\n\n remove(sessionId: string): boolean {\n if (!this.sessions.has(sessionId)) return false;\n this.sessions.delete(sessionId);\n this.checkpoints.delete(sessionId);\n if (this.focusedId === sessionId) {\n this.focusedId = this.list()[0]?.id ?? null;\n }\n return true;\n }\n\n update(sessionId: string, patch: Partial<CognitiveSession>): CognitiveSession | undefined {\n const session = this.sessions.get(sessionId);\n if (!session) return undefined;\n const next = { ...session, ...patch, updatedAt: Date.now() };\n this.sessions.set(sessionId, next);\n return next;\n }\n\n addMessage(sessionId: string, message: ChatMessage): void {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n session.history = [...session.history, message];\n session.updatedAt = Date.now();\n this.sessions.set(sessionId, session);\n }\n\n checkpoint(sessionId: string, label?: string, toolEffectCount = 0): Checkpoint | undefined {\n const session = this.sessions.get(sessionId);\n if (!session) return undefined;\n const cp: Checkpoint = {\n id: `cp-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n sessionId,\n label: label ?? `Checkpoint ${new Date().toLocaleString()}`,\n createdAt: Date.now(),\n messageSeq: session.history.length,\n buffers: cloneBuffers(session.buffers),\n compactionSummary: session.compactionSummary,\n specialistMode: session.specialistMode,\n toolEffectCount,\n };\n const list = this.checkpoints.get(sessionId) ?? [];\n list.push(cp);\n this.checkpoints.set(sessionId, list);\n return cp;\n }\n\n listCheckpoints(sessionId: string): Checkpoint[] {\n return [...(this.checkpoints.get(sessionId) ?? [])];\n }\n\n restore(input: {\n sessionId: string;\n checkpointId: string;\n mode?: 'in-place' | 'fork';\n }): { sessionId: string } | undefined {\n const session = this.sessions.get(input.sessionId);\n const list = this.checkpoints.get(input.sessionId) ?? [];\n const cp = list.find((c) => c.id === input.checkpointId);\n if (!session || !cp) return undefined;\n\n const history = session.history.slice(0, cp.messageSeq);\n const buffers = cloneBuffers(cp.buffers);\n\n if (input.mode === 'fork') {\n const forked = this.createSession({\n title: `${session.title} (restored)`,\n specialistMode: cp.specialistMode,\n });\n this.update(forked.id, {\n history,\n buffers,\n compactionSummary: cp.compactionSummary,\n status: 'idle',\n });\n return { sessionId: forked.id };\n }\n\n this.update(input.sessionId, {\n history,\n buffers,\n compactionSummary: cp.compactionSummary,\n specialistMode: cp.specialistMode,\n status: 'idle',\n });\n return { sessionId: input.sessionId };\n }\n\n /**\n * Truncate history and store a compaction summary.\n * Pass `summary` to override the extractive default (e.g. LLM summary).\n * Returns whether history was shortened.\n */\n compact(\n sessionId: string,\n keepCount = 12,\n summary?: string,\n ): { didCompact: boolean; summary: string } {\n const session = this.sessions.get(sessionId);\n if (!session) return { didCompact: false, summary: '' };\n const result = compactHistory(session.history, {\n keepCount,\n previousSummary: session.compactionSummary,\n });\n if (!result.didCompact) {\n return { didCompact: false, summary: session.compactionSummary ?? '' };\n }\n const nextSummary = (summary?.trim() || result.summary || session.compactionSummary || '').trim();\n this.update(sessionId, {\n history: result.kept,\n compactionSummary: nextSummary,\n });\n return { didCompact: true, summary: nextSummary };\n }\n\n /** Preview a compact without mutating (for LLM summarization of dropped turns). */\n prepareCompact(sessionId: string, keepCount = 12) {\n const session = this.sessions.get(sessionId);\n if (!session) return null;\n return compactHistory(session.history, {\n keepCount,\n previousSummary: session.compactionSummary,\n });\n }\n\n snapshot(): { sessions: CognitiveSession[]; checkpoints: Record<string, Checkpoint[]> } {\n const checkpoints: Record<string, Checkpoint[]> = {};\n for (const [id, list] of this.checkpoints) checkpoints[id] = list.map((c) => ({ ...c, buffers: cloneBuffers(c.buffers) }));\n return {\n sessions: this.list().map((s) => ({\n ...s,\n attachments: [...(s.attachments ?? [])],\n history: s.history.map((m) => ({ ...m, parts: [...m.parts] })),\n buffers: cloneBuffers(s.buffers),\n })),\n checkpoints,\n };\n }\n\n loadSnapshot(data: { sessions: CognitiveSession[]; checkpoints: Record<string, Checkpoint[]> }): void {\n this.sessions.clear();\n this.checkpoints.clear();\n for (const session of data.sessions) {\n this.sessions.set(session.id, {\n ...session,\n attachments: [...(session.attachments ?? [])],\n buffers: cloneBuffers(session.buffers),\n history: [...session.history],\n });\n }\n for (const [id, list] of Object.entries(data.checkpoints ?? {})) {\n this.checkpoints.set(\n id,\n list.map((c) => ({ ...c, buffers: cloneBuffers(c.buffers) })),\n );\n }\n this.focusedId = this.list()[0]?.id ?? null;\n }\n}\n\nexport type { ModelPolicy };\n","import type { ModelProvider, ProviderChatMessage } from '../models/types';\n\nexport type ToolRisk = 'safe' | 'critical';\n\nexport interface PendingToolRisk {\n id: string;\n name: string;\n arguments: string;\n}\n\nconst CLASSIFY_SYSTEM = `You classify tool calls for user approval.\nMark risk \"critical\" if the call can change state: write/edit/delete files, connect or load a workspace, run shell/commands with side effects, install, deploy, publish, push, or otherwise mutate the environment.\nMark risk \"safe\" only for read-only inspection (list, read, search, describe).\nWhen unsure, choose \"critical\".\nReply with ONLY a JSON array: [{\"id\":\"<tool call id>\",\"risk\":\"safe\"|\"critical\"}]`;\n\n/** Ask the model whether pending tool calls are safe or critical. Unknown → critical. */\nexport async function classifyToolRisks(input: {\n provider: ModelProvider;\n model: string;\n tools: PendingToolRisk[];\n signal?: AbortSignal;\n}): Promise<Map<string, ToolRisk>> {\n const risks = new Map<string, ToolRisk>();\n if (!input.tools.length) return risks;\n\n for (const tool of input.tools) risks.set(tool.id, 'critical');\n\n const catalog = input.tools.map((t) => ({\n id: t.id,\n name: t.name,\n arguments: truncate(t.arguments, 800),\n }));\n\n const messages: ProviderChatMessage[] = [\n { role: 'system', content: CLASSIFY_SYSTEM },\n { role: 'user', content: JSON.stringify(catalog) },\n ];\n\n let text = '';\n for await (const chunk of input.provider.stream({\n model: input.model,\n messages,\n providerOptions: { reasoning_effort: 'none' },\n signal: input.signal,\n })) {\n if (chunk.type === 'error') return risks;\n if (chunk.type === 'text' && chunk.text) text += chunk.text;\n }\n\n for (const row of parseRiskRows(text)) {\n if (!risks.has(row.id)) continue;\n risks.set(row.id, row.risk === 'safe' ? 'safe' : 'critical');\n }\n return risks;\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length <= max ? value : `${value.slice(0, max)}…`;\n}\n\nfunction parseRiskRows(text: string): Array<{ id: string; risk: string }> {\n const json = extractJsonArray(text);\n if (!json) return [];\n try {\n const parsed = JSON.parse(json) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed\n .map((row) => {\n if (!row || typeof row !== 'object') return null;\n const id = String((row as { id?: unknown }).id ?? '');\n const risk = String((row as { risk?: unknown }).risk ?? '');\n if (!id) return null;\n return { id, risk };\n })\n .filter((row): row is { id: string; risk: string } => row != null);\n } catch {\n return [];\n }\n}\n\nfunction extractJsonArray(text: string): string | null {\n const trimmed = text.trim();\n if (trimmed.startsWith('[')) {\n const end = trimmed.lastIndexOf(']');\n return end >= 0 ? trimmed.slice(0, end + 1) : null;\n }\n const start = trimmed.indexOf('[');\n const end = trimmed.lastIndexOf(']');\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n return null;\n}\n","import type { ChatMessage, MessagePart, SpecialistRole } from '../types';\nimport type { ModelProvider, ProviderChatMessage, ResolvedModel, ToolDefinition } from '../models/types';\nimport type { ToolBroker } from '../tools/broker';\nimport { isAborted } from '../abort';\nimport {\n IMAGE_PRESENT_KEY,\n stripAttachmentToolOutput,\n userContentFromParts,\n} from '../attachments';\nimport { compactionContextMessage } from '../compact/compaction';\nimport { classifyToolRisks } from './classify-risk';\n\nconst MAX_TOOL_ITERATIONS = 8;\n\nexport interface SpecialistLoopInput {\n role: SpecialistRole;\n systemPrompt: string;\n history: ChatMessage[];\n /** Prior turns folded out of history; injected as a system message. */\n compactionSummary?: string;\n resolved: ResolvedModel;\n provider: ModelProvider;\n broker: ToolBroker;\n sessionId: string;\n signal?: AbortSignal;\n /** Rebuild the broker's command tools before each model call. */\n refreshTools?: () => void;\n onPart?: (part: MessagePart) => void;\n}\n\nexport interface SpecialistLoopResult {\n message: ChatMessage;\n success: boolean;\n}\n\nfunction textFromParts(parts: MessagePart[]): string {\n return parts\n .filter((p): p is Extract<MessagePart, { type: 'text' }> => p.type === 'text')\n .map((p) => p.text)\n .join('\\n');\n}\n\nexport function historyToProviderMessages(\n systemPrompt: string,\n history: ChatMessage[],\n compactionSummary?: string,\n): ProviderChatMessage[] {\n const messages: ProviderChatMessage[] = [{ role: 'system', content: systemPrompt }];\n if (compactionSummary?.trim()) {\n messages.push({ role: 'system', content: compactionContextMessage(compactionSummary) });\n }\n for (const msg of history) {\n if (msg.role === 'user') {\n const content = userContentFromParts(msg.parts);\n const empty =\n typeof content === 'string' ? !content.trim() : !content.length;\n if (!empty) messages.push({ role: 'user', content });\n continue;\n }\n if (msg.role === 'system') {\n const text = textFromParts(msg.parts);\n if (text) messages.push({ role: 'system', content: text });\n continue;\n }\n\n const text = textFromParts(msg.parts);\n const tools = msg.parts.filter((p): p is Extract<MessagePart, { type: 'tool' }> => p.type === 'tool');\n if (tools.length) {\n messages.push({\n role: 'assistant',\n content: text,\n toolCalls: tools.map((t) => ({\n id: t.id,\n name: t.name,\n arguments: JSON.stringify(t.args ?? {}),\n })),\n });\n for (const tool of tools) {\n messages.push({\n role: 'tool',\n toolCallId: tool.id,\n name: tool.name,\n content: JSON.stringify(tool.result ?? {}),\n });\n }\n continue;\n }\n\n if (text) messages.push({ role: 'assistant', content: text });\n }\n return messages;\n}\n\nexport async function runSpecialistLoop(input: SpecialistLoopInput): Promise<SpecialistLoopResult> {\n const parts: MessagePart[] = [];\n const emit = (part: MessagePart) => {\n parts.push(part);\n input.onPart?.(part);\n };\n\n const messages = historyToProviderMessages(\n input.systemPrompt,\n input.history,\n input.compactionSummary,\n );\n let success = true;\n let cancelled = false;\n\n const markCancelled = () => {\n if (cancelled) return;\n cancelled = true;\n success = false;\n if (!parts.some((p) => p.type === 'text')) {\n emit({ type: 'text', text: 'Cancelled.' });\n }\n };\n\n for (let iter = 0; iter < MAX_TOOL_ITERATIONS; iter++) {\n if (isAborted(input.signal)) {\n markCancelled();\n break;\n }\n input.refreshTools?.();\n const tools: ToolDefinition[] = input.broker.listDefinitions(input.role);\n let pendingTools: Array<{ id: string; name: string; arguments: string }> = [];\n let assistantText = '';\n\n for await (const chunk of input.provider.stream({\n model: input.resolved.model,\n messages,\n tools: tools.length ? tools : undefined,\n providerOptions: input.resolved.providerOptions,\n signal: input.signal,\n })) {\n if (isAborted(input.signal)) break;\n if (chunk.type === 'error') {\n emit({ type: 'text', text: `Error: ${chunk.error}` });\n success = false;\n break;\n }\n if (chunk.type === 'reasoning' && chunk.text) {\n emit({ type: 'reasoning', text: chunk.text, status: 'streaming' });\n }\n if (chunk.type === 'text' && chunk.text) {\n assistantText += chunk.text;\n emit({ type: 'text', text: chunk.text });\n }\n if (chunk.type === 'tool_call_delta' && chunk.toolCall) {\n const existing = pendingTools.find((t) => t.id === chunk.toolCall!.id);\n if (existing) {\n existing.name = chunk.toolCall.name || existing.name;\n existing.arguments = chunk.toolCall.arguments;\n } else {\n pendingTools.push({ ...chunk.toolCall });\n }\n }\n }\n\n if (isAborted(input.signal)) {\n markCancelled();\n break;\n }\n\n if (!pendingTools.length) {\n if (assistantText && !parts.some((p) => p.type === 'text')) emit({ type: 'text', text: assistantText });\n break;\n }\n messages.push({\n role: 'assistant',\n content: assistantText,\n toolCalls: pendingTools.map((t) => ({\n id: t.id,\n name: t.name,\n arguments: t.arguments || '{}',\n })),\n });\n\n const risks =\n input.broker.getApprovalMode() === 'auto_safe'\n ? await classifyToolRisks({\n provider: input.provider,\n model: input.resolved.model,\n tools: pendingTools.map((t) => ({\n id: t.id,\n name: t.name,\n arguments: t.arguments || '{}',\n })),\n signal: input.signal,\n })\n : null;\n\n // Collect vision payloads and append AFTER every tool result, so we never\n // interrupt the required assistant(tool_calls) → tool → tool sequence.\n const pendingImages: Array<{ id: string; name: string; dataUrl: string }> = [];\n\n for (const tool of pendingTools) {\n if (isAborted(input.signal)) {\n markCancelled();\n break;\n }\n let args: Record<string, unknown> = {};\n try {\n args = tool.arguments ? JSON.parse(tool.arguments) : {};\n } catch {\n args = { raw: tool.arguments };\n }\n const toolPart: MessagePart = {\n type: 'tool',\n id: tool.id,\n name: tool.name,\n args,\n status: 'running',\n };\n emit(toolPart);\n const started = Date.now();\n const result = await input.broker.execute(\n { id: tool.id, name: tool.name, arguments: args },\n input.sessionId,\n input.role,\n { risk: risks?.get(tool.id) },\n );\n const rawOutput = result.ok ? result.output : { error: result.error };\n const presentImage =\n result.ok &&\n rawOutput &&\n typeof rawOutput === 'object' &&\n (rawOutput as Record<string, unknown>)[IMAGE_PRESENT_KEY] === true &&\n typeof (rawOutput as Record<string, unknown>).dataUrl === 'string';\n const safeOutput = result.ok ? stripAttachmentToolOutput(rawOutput) : rawOutput;\n emit({\n type: 'tool',\n id: tool.id,\n name: tool.name,\n args,\n result: safeOutput,\n status: result.ok ? 'done' : 'error',\n durationMs: Date.now() - started,\n });\n messages.push({\n role: 'tool',\n toolCallId: tool.id,\n name: tool.name,\n content: JSON.stringify(\n presentImage\n ? {\n ...((safeOutput as object) ?? {}),\n note: 'Image bytes follow after all tool results for vision inspection.',\n }\n : safeOutput,\n ),\n });\n if (presentImage) {\n pendingImages.push({\n id: String((rawOutput as Record<string, unknown>).id ?? ''),\n name: String((rawOutput as Record<string, unknown>).name ?? 'image'),\n dataUrl: String((rawOutput as Record<string, unknown>).dataUrl),\n });\n }\n if (!result.ok) success = false;\n }\n\n if (cancelled || isAborted(input.signal)) {\n markCancelled();\n break;\n }\n\n if (pendingImages.length) {\n messages.push({\n role: 'user',\n content: [\n {\n type: 'text',\n text:\n pendingImages.length === 1\n ? `Attachment image for inspection: id=${pendingImages[0]!.id} name=\"${pendingImages[0]!.name}\"`\n : `Attachment images for inspection:\\n${pendingImages\n .map((img) => `- id=${img.id} name=\"${img.name}\"`)\n .join('\\n')}`,\n },\n ...pendingImages.map((img) => ({\n type: 'image_url' as const,\n image_url: { url: img.dataUrl },\n })),\n ],\n });\n }\n }\n\n const message: ChatMessage = {\n id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n role: 'assistant',\n parts: coalesceParts(parts),\n createdAt: Date.now(),\n routedModel: input.resolved.model,\n effort: input.resolved.effort,\n };\n\n return { message, success };\n}\n\nfunction coalesceParts(parts: MessagePart[]): MessagePart[] {\n const out: MessagePart[] = [];\n for (const part of parts) {\n const last = out[out.length - 1];\n if (part.type === 'text' && last?.type === 'text') {\n last.text += part.text;\n continue;\n }\n if (part.type === 'reasoning' && last?.type === 'reasoning') {\n last.text += part.text;\n last.status = part.status;\n continue;\n }\n if (part.type === 'tool' && last?.type === 'tool' && last.id === part.id) {\n out[out.length - 1] = part;\n continue;\n }\n out.push(part);\n }\n for (const part of out) {\n if (part.type === 'reasoning') part.status = 'done';\n }\n return out;\n}\n","import type { SpecialistRole } from '../types';\n\nexport * from './loop';\nexport * from './classify-risk';\n\nexport type SystemPromptEnhancer = (\n prompt: string,\n ctx: { role: SpecialistRole; goal: string; sessionId: string },\n) => string | Promise<string>;\n\nexport function systemPromptFor(\n role: string,\n goal: string,\n opts: { hasAttachments?: boolean } = {},\n): string {\n const base =\n 'You are a specialist in the Eclipse Docks AI runtime. Prefer tools for file and command actions. Be concise.';\n const replyRule =\n 'After tools finish, write a short human-friendly final reply (what you did and the outcome). Do not paste tool arguments, stdout, JSON, or command logs — those already appear in the UI details panel.';\n const attachmentRule = opts.hasAttachments\n ? [\n 'This turn publishes session attachments under the shared in-memory root (in-memory/<sessionId>/… or in-memory://<sessionId>/…).',\n 'Read them with workspace_read / workspace_list — in-memory paths work without mounting that root into the workspace tree.',\n 'Do not call load_workspace / connect_opfs / connect_indexeddb to find attachments.',\n 'Canvas from a screenshot: workspace_read the attachment path → canvas.help → workspace_write a .canvas.js (into a durable workspace folder) → canvas.open / canvas.apply_source.',\n 'Qualify durable writes as <root>/<file> using a root from workspace_list (e.g. tests/demo.canvas.js); bare filenames are auto-rooted when a single durable folder is connected, otherwise a folder picker appears.',\n 'If no durable workspace folder is connected for writing canvases, say so and stop.',\n ].join(' ')\n : 'Session attachments live under the shared in-memory root and are readable via workspace_read / workspace_list.';\n const pathRule =\n 'Workspace paths use a connected root prefix from workspace_list (never write bare names at the composite root unless a single durable folder can auto-qualify them).';\n const preamble = `${base} ${replyRule} ${attachmentRule} ${pathRule}`;\n switch (role) {\n case 'plan':\n return `${preamble}\\nMode: PLAN (read-only). Analyze and propose a plan for: ${goal}`;\n case 'explore':\n return `${preamble}\\nMode: EXPLORE (read-only). Search and report findings for: ${goal}`;\n case 'build':\n return `${preamble}\\nMode: BUILD. Implement the goal using tools when needed: ${goal}`;\n default:\n return `${preamble}\\nGoal: ${goal}`;\n }\n}\n","import type { ChatMessage, CognitiveSession, MessagePart } from '../types';\nimport { getModelContextLimit } from '../models/effort-support';\n\nexport type ContextUsageLevel = 'ok' | 'warn' | 'critical';\n\nexport interface ContextUsageBucket {\n id: 'summary' | 'messages' | 'tools' | 'reasoning';\n label: string;\n tokens: number;\n /** Item count for this bucket (messages, tool parts, etc.). */\n count: number;\n}\n\nexport interface ContextUsage {\n used: number;\n limit: number;\n percent: number;\n remaining: number;\n level: ContextUsageLevel;\n buckets: ContextUsageBucket[];\n modelRef: string;\n}\n\n/** Rough token estimate (~4 chars / token) with a small structural overhead. */\nexport function estimateTokens(text: string): number {\n if (!text) return 0;\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nexport function estimatePartTokens(part: MessagePart): number {\n if (part.type === 'text' || part.type === 'reasoning') return estimateTokens(part.text);\n if (part.type === 'file') {\n // History only stores a reference; payloads live under in-memory/<sessionId>/.\n return estimateTokens(part.name) + estimateTokens(part.id) + 8;\n }\n if (part.type === 'tool') {\n return (\n estimateTokens(part.name) +\n estimateTokens(JSON.stringify(part.args ?? {})) +\n estimateTokens(JSON.stringify(part.result ?? {})) +\n 8\n );\n }\n if (part.type === 'step') return estimateTokens(part.title) + 4;\n return 0;\n}\n\nexport function estimateMessageTokens(message: ChatMessage): {\n messages: number;\n tools: number;\n reasoning: number;\n toolCount: number;\n reasoningCount: number;\n} {\n let messages = 4;\n let tools = 0;\n let reasoning = 0;\n let toolCount = 0;\n let reasoningCount = 0;\n for (const part of message.parts) {\n if (part.type === 'tool') {\n tools += estimatePartTokens(part);\n toolCount += 1;\n } else if (part.type === 'reasoning') {\n reasoning += estimatePartTokens(part);\n reasoningCount += 1;\n } else {\n messages += estimatePartTokens(part);\n }\n }\n return { messages, tools, reasoning, toolCount, reasoningCount };\n}\n\nexport function contextUsageLevel(percent: number): ContextUsageLevel {\n if (percent > 85) return 'critical';\n if (percent > 60) return 'warn';\n return 'ok';\n}\n\n/** Estimate how much of the model context window the session currently occupies. */\nexport function estimateSessionContextUsage(\n session: CognitiveSession | undefined,\n modelRef: string,\n): ContextUsage {\n const limit = getModelContextLimit(modelRef);\n const buckets: ContextUsageBucket[] = [\n { id: 'summary', label: 'Summary', tokens: 0, count: 0 },\n { id: 'messages', label: 'Chat text', tokens: 0, count: 0 },\n { id: 'tools', label: 'Tools', tokens: 0, count: 0 },\n { id: 'reasoning', label: 'Thinking', tokens: 0, count: 0 },\n ];\n\n if (session?.compactionSummary) {\n buckets[0]!.tokens = estimateTokens(session.compactionSummary);\n buckets[0]!.count = 1;\n }\n for (const message of session?.history ?? []) {\n const parts = estimateMessageTokens(message);\n buckets[1]!.tokens += parts.messages;\n buckets[1]!.count += 1;\n buckets[2]!.tokens += parts.tools;\n buckets[2]!.count += parts.toolCount;\n buckets[3]!.tokens += parts.reasoning;\n buckets[3]!.count += parts.reasoningCount;\n }\n\n const used = buckets.reduce((sum, b) => sum + b.tokens, 0);\n const percent = limit > 0 ? Math.min(100, (used / limit) * 100) : 0;\n return {\n used,\n limit,\n percent,\n remaining: Math.max(0, limit - used),\n level: contextUsageLevel(percent),\n buckets: buckets.filter((b) => b.tokens > 0),\n modelRef,\n };\n}\n\nexport function formatTokenCount(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 10_000) return `${Math.round(n / 1000)}k`;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(Math.round(n));\n}\n\nexport function formatContextPercent(percent: number): string {\n if (percent <= 0) return '0%';\n if (percent < 1) return '<1%';\n if (percent < 10) return `${percent.toFixed(1)}%`;\n return `${Math.round(percent)}%`;\n}\n\nexport function formatBucketDetail(bucket: ContextUsageBucket): string {\n const tokens = `${formatTokenCount(bucket.tokens)} tok`;\n if (bucket.id === 'summary') return tokens;\n if (bucket.id === 'messages') {\n const n = bucket.count;\n return `${n} msg${n === 1 ? '' : 's'} · ${tokens}`;\n }\n if (bucket.id === 'tools') {\n const n = bucket.count;\n return `${n} call${n === 1 ? '' : 's'} · ${tokens}`;\n }\n const n = bucket.count;\n return `${n} · ${tokens}`;\n}\n","import {\n Directory,\n getInMemoryRoot,\n IN_MEMORY_ROOT_NAME,\n setInMemoryMountProjection,\n type GetResourceOptions,\n type MemoryLiveContents,\n type MemoryRootDirectory,\n} from '@eclipse-docks/core';\nimport type { SessionAttachment } from './types';\nimport { attachmentWorkspacePath } from './attachment-paths';\n\nexport {\n IN_MEMORY_ROOT_NAME,\n IN_MEMORY_URI_SCHEME,\n attachmentUri,\n attachmentWorkspacePath,\n safeAttachmentFileName,\n toWorkspaceToolPath,\n} from './attachment-paths';\n\n/** Resolve the current attachment payload (session store remains source of truth). */\nexport type AttachmentPayloadResolver = () => SessionAttachment | undefined;\n\nfunction attachmentContents(stored: SessionAttachment): string {\n if (stored.kind === 'image') {\n if (stored.dataUrl) return stored.dataUrl;\n if (stored.text) return stored.text;\n }\n return stored.text ?? '';\n}\n\n/** Build live-file callbacks that always re-read via the caller-provided resolver. */\nexport function attachmentLiveContents(resolve: AttachmentPayloadResolver): MemoryLiveContents {\n return {\n get mimeType() {\n return resolve()?.mime;\n },\n getContents() {\n const stored = resolve();\n if (!stored) throw new Error('Attachment payload is no longer available');\n return attachmentContents(stored);\n },\n size() {\n const stored = resolve();\n if (!stored) return null;\n if (stored.byteLength != null) return stored.byteLength;\n return attachmentContents(stored).length;\n },\n };\n}\n\n/** Relative path under the shared in-memory root (`<sessionId>/<file>`). */\nfunction relativeAttachmentPath(\n sessionId: string,\n stored: Pick<SessionAttachment, 'id' | 'name'>,\n): string {\n return attachmentWorkspacePath(sessionId, stored).slice(`${IN_MEMORY_ROOT_NAME}/`.length);\n}\n\n/**\n * Publish a live file node. Payload is resolved only through `resolve` — nothing is copied.\n */\nexport async function syncAttachmentToWorkspace(\n sessionId: string,\n stored: SessionAttachment,\n resolve: AttachmentPayloadResolver,\n): Promise<string> {\n const root = getInMemoryRoot();\n const relative = relativeAttachmentPath(sessionId, stored);\n root.writeLiveFile(relative, attachmentLiveContents(resolve));\n return attachmentWorkspacePath(sessionId, stored);\n}\n\nexport async function syncAttachmentsToWorkspace(\n sessionId: string,\n attachments: SessionAttachment[],\n resolveById: (attachmentId: string) => SessionAttachment | undefined,\n): Promise<void> {\n for (const attachment of attachments) {\n await syncAttachmentToWorkspace(sessionId, attachment, () => resolveById(attachment.id));\n }\n}\n\nexport async function removeAttachmentFromWorkspace(\n sessionId: string,\n stored: Pick<SessionAttachment, 'id' | 'name'>,\n): Promise<void> {\n const root = getInMemoryRoot();\n const relative = relativeAttachmentPath(sessionId, stored);\n const resource = await root.getResource(relative);\n if (resource) {\n await resource.delete();\n }\n}\n\nexport async function removeSessionWorkspaceFolder(sessionId: string): Promise<void> {\n const root = getInMemoryRoot();\n const dir = await root.getResource(sessionId);\n if (dir instanceof Directory) {\n await dir.delete();\n }\n}\n\n/**\n * Restrict the workspace-mounted in-memory view to a single folder name (active session).\n * Pass `null` to show the full tree again.\n */\nexport function projectInMemoryMountToFolder(folderName: string | null): void {\n if (!folderName) {\n setInMemoryMountProjection(null);\n return;\n }\n const name = folderName;\n setInMemoryMountProjection({\n async listChildren(root: MemoryRootDirectory) {\n return [root.ensureDirectoryEntry(name)];\n },\n async getResource(root: MemoryRootDirectory, path: string, options?: GetResourceOptions) {\n const segments = path.split('/').filter((s) => s.trim());\n if (segments[0] !== name) return null;\n if (segments.length === 1 && (path.endsWith('/') || path === name)) {\n return root.ensureDirectoryEntry(name);\n }\n return root.getResource(path, options);\n },\n });\n}\n","import { persistenceService } from '@eclipse-docks/core';\nimport type {\n ChatMessage,\n EffortLevel,\n MessagePart,\n ModelPolicy,\n PermissionAction,\n PromptAttachment,\n SessionAttachment,\n SpecialistRole,\n ToolApprovalMode,\n} from './types';\nimport { MAX_ATTACHMENTS, toFileRefPart, toSessionAttachment } from './attachments';\nimport { createCoreState, coreTick, defaultNeeds } from './core';\nimport { CognitiveMemory } from './memory';\nimport {\n ModelRouter,\n OpenAICompatibleProvider,\n ProviderRegistry,\n PROVIDERS_PERSIST_KEY,\n catalogFromSettings,\n defaultProvidersSettings,\n listConfiguredModelIds,\n loadModelsCatalog,\n normalizeProvidersSettings,\n parseModelIds,\n} from './models';\nimport type { ModelCatalogEntry, ModelProvider, ProvidersSettings, RouteRequest } from './models';\nimport { ToolBroker, registerWorkspaceTools, refreshCommandTools } from './tools';\nimport type { PermissionHandler } from './tools';\nimport { SessionRuntime } from './session';\nimport {\n attachmentUri,\n projectInMemoryMountToFolder,\n removeAttachmentFromWorkspace,\n removeSessionWorkspaceFolder,\n syncAttachmentsToWorkspace,\n} from './session-workspace';\nimport { runSpecialistLoop, systemPromptFor } from './specialists';\nimport type { SystemPromptEnhancer } from './specialists';\nimport { summarizeDroppedHistory } from './compact/compaction';\nimport { RuntimeEvents, TOPIC } from './events';\nimport { detectEffortCapability } from './models/effort-support';\n\nconst PERSIST_KEY = 'cognitive/v1/state';\n/** Auto-compact after a turn when live history exceeds this many messages. */\nconst AUTO_COMPACT_AFTER = 40;\n/** Messages retained in the live transcript after compaction. */\nconst COMPACT_KEEP_COUNT = 12;\n\nexport class CognitiveRuntime {\n readonly events = new RuntimeEvents();\n readonly sessions = new SessionRuntime();\n readonly memory = new CognitiveMemory();\n readonly providers = new ProviderRegistry();\n readonly models = new ModelRouter();\n readonly tools = new ToolBroker();\n\n private core = createCoreState(defaultNeeds());\n private policy: ModelPolicy = { mode: 'auto', optimizeFor: 'balance' };\n private providersSettings: ProvidersSettings = defaultProvidersSettings();\n private approvalMode: ToolApprovalMode = 'auto_safe';\n private promptEnhancers: SystemPromptEnhancer[] = [];\n private permissionResolvers = new Map<string, (action: PermissionAction) => void>();\n private started = false;\n private ready: Promise<void> = Promise.resolve();\n\n start(): void {\n if (this.started) return;\n this.started = true;\n this.applyProvidersSettings(defaultProvidersSettings(), { persist: false, emit: false });\n registerWorkspaceTools(this.tools);\n this.tools.setApprovalMode(this.approvalMode);\n this.tools.setPermissionHandler(async (req) => this.requestPermission(req));\n this.ready = this.hydrateAll();\n }\n\n /** Resolves after initial provider/settings hydrate. */\n whenReady(): Promise<void> {\n this.start();\n return this.ready;\n }\n\n getProvidersSettings(): ProvidersSettings {\n return structuredClone(this.providersSettings);\n }\n\n /** Models available for routing (`providerId/modelId`), including external plugins. */\n listConfiguredModels(): string[] {\n const ids = listConfiguredModelIds(this.providersSettings);\n const seen = new Set(ids);\n for (const provider of this.providers.listExternal()) {\n const models = provider.listModels();\n if (!Array.isArray(models)) continue;\n for (const model of models) {\n const id = `${provider.id}/${model.id}`;\n if (seen.has(id)) continue;\n seen.add(id);\n ids.push(id);\n }\n }\n return ids;\n }\n\n async setProvidersSettings(settings: ProvidersSettings): Promise<void> {\n this.applyProvidersSettings(settings, { persist: true, emit: true });\n }\n\n /**\n * Register a plugin ModelProvider (e.g. WebLLM) that survives settings rebuilds.\n * Models from listModels() are merged into the router catalog as `providerId/modelId`.\n */\n registerExternalProvider(provider: ModelProvider): void {\n this.providers.registerExternal(provider);\n this.rebuildCatalog();\n this.events.publish(TOPIC.providersChanged, this.providersSettings);\n }\n\n unregisterExternalProvider(id: string): void {\n this.providers.unregisterExternal(id);\n this.rebuildCatalog();\n this.events.publish(TOPIC.providersChanged, this.providersSettings);\n }\n\n /** Append instructions to the specialist system prompt (e.g. RAG guidance). */\n addSystemPromptEnhancer(enhancer: SystemPromptEnhancer): () => void {\n this.promptEnhancers.push(enhancer);\n return () => {\n this.promptEnhancers = this.promptEnhancers.filter((e) => e !== enhancer);\n };\n }\n\n /** First catalog model for the default provider — used by Manual routing. */\n defaultModelId(): string {\n const catalog = catalogFromSettings(this.providersSettings);\n const preferred = catalog.find((e) => e.providerId === this.providersSettings.defaultProviderId);\n return preferred?.id ?? catalog[0]?.id ?? 'openai/gpt-4o-mini';\n }\n\n setModelPolicy(policy: ModelPolicy): void {\n const next = normalizeModelPolicy(policy) ?? this.policy;\n if (sameModelPolicy(this.policy, next)) return;\n this.policy = next;\n void this.persist();\n }\n\n getModelPolicy(): ModelPolicy {\n return this.policy;\n }\n\n getApprovalMode(): ToolApprovalMode {\n return this.approvalMode;\n }\n\n setApprovalMode(mode: ToolApprovalMode): void {\n const changed = this.approvalMode !== mode;\n this.approvalMode = mode;\n this.tools.setRules([]);\n this.tools.setApprovalMode(mode);\n this.tools.setPermissionHandler(async (req) => this.requestPermission(req));\n if (!changed) return;\n this.events.publish(TOPIC.approvalModeChanged, mode);\n void this.persist();\n }\n\n /** Low-level override; prefer {@link setApprovalMode} for the convenience modes. */\n setPermissionPolicy(policy: 'ask' | 'allow' | 'deny' | PermissionHandler): void {\n if (typeof policy === 'function') {\n this.tools.setPermissionHandler(policy);\n return;\n }\n if (policy === 'allow') this.setApprovalMode('auto_all');\n else if (policy === 'ask') this.setApprovalMode('manual');\n else {\n this.setApprovalMode('manual');\n this.tools.setRules([{ pattern: '*', action: 'deny' }]);\n }\n this.tools.setPermissionHandler(\n policy === 'allow' ? null : async (req) => this.requestPermission(req),\n );\n }\n\n resolvePermission(requestId: string, action: PermissionAction): void {\n const resolve = this.permissionResolvers.get(requestId);\n if (!resolve) return;\n this.permissionResolvers.delete(requestId);\n const focused = this.sessions.focused();\n if (focused?.status === 'waiting_approval') {\n this.sessions.update(focused.id, { status: 'running' });\n this.emitSessions();\n }\n resolve(action);\n }\n\n /** Emit session list changes and persist them. */\n commitSessions(): void {\n this.emitSessions();\n void this.persist();\n }\n\n /** Ensure a focused session exists and return its id. */\n ensureSessionId(sessionId?: string): string {\n this.start();\n if (sessionId && this.sessions.get(sessionId)) {\n this.sessions.focus(sessionId);\n return sessionId;\n }\n const focused = this.sessions.focused();\n if (focused) return focused.id;\n return this.sessions.createSession().id;\n }\n\n /** Store attachment payloads on the session and mirror them into in-memory/<sessionId>/. */\n async addAttachments(\n sessionId: string | undefined,\n attachments: PromptAttachment[],\n ): Promise<SessionAttachment[]> {\n const id = this.ensureSessionId(sessionId);\n const session = this.sessions.get(id);\n if (!session || !attachments.length) return [];\n\n const room = Math.max(0, MAX_ATTACHMENTS - (session.attachments?.length ?? 0));\n const accepted = attachments.slice(0, room).map((attachment) => {\n const stored = toSessionAttachment(attachment);\n return { ...stored, path: attachmentUri(id, stored) };\n });\n if (!accepted.length) return [];\n\n this.sessions.update(id, {\n attachments: [...(session.attachments ?? []), ...accepted],\n });\n this.commitSessions();\n await this.mirrorAttachments(id, accepted).catch(() => undefined);\n return accepted;\n }\n\n /** Remove an attachment payload from the session store and in-memory workspace. */\n removeAttachment(sessionId: string, attachmentId: string): boolean {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n const removed = (session.attachments ?? []).find((a) => a.id === attachmentId);\n const next = (session.attachments ?? []).filter((a) => a.id !== attachmentId);\n if (next.length === (session.attachments?.length ?? 0)) return false;\n this.sessions.update(sessionId, { attachments: next });\n this.commitSessions();\n if (removed) void removeAttachmentFromWorkspace(sessionId, removed);\n return true;\n }\n\n /** Drop a session and its in-memory attachment folder. */\n removeSession(sessionId: string): boolean {\n const ok = this.sessions.remove(sessionId);\n if (ok) {\n void removeSessionWorkspaceFolder(sessionId);\n this.commitSessions();\n }\n return ok;\n }\n\n /**\n * Compact a session: drop older turns, store a summary (LLM when possible),\n * and persist. The summary is injected into later model calls.\n */\n async compactSession(\n sessionId: string,\n keepCount = COMPACT_KEEP_COUNT,\n signal?: AbortSignal,\n ): Promise<{ didCompact: boolean }> {\n this.start();\n await this.ready;\n const prepared = this.sessions.prepareCompact(sessionId, keepCount);\n if (!prepared?.didCompact) return { didCompact: false };\n\n this.sessions.update(sessionId, { status: 'compact' });\n this.emitSessions();\n\n let summary = prepared.summary;\n const resolved = this.models.resolve(\n { role: 'compact', complexity: 0.2, requireTools: false },\n this.policy,\n );\n const provider = this.providers.resolveProvider(resolved.model) ?? this.providers.list()[0];\n if (provider) {\n const llmSummary = await summarizeDroppedHistory({\n provider,\n model: resolved.model,\n dropped: prepared.dropped,\n previousSummary: this.sessions.get(sessionId)?.compactionSummary,\n providerOptions: resolved.providerOptions,\n signal,\n });\n if (llmSummary) summary = llmSummary;\n }\n\n this.sessions.update(sessionId, {\n history: prepared.kept,\n compactionSummary: summary,\n status: 'idle',\n });\n this.commitSessions();\n return { didCompact: true };\n }\n\n async prompt(input: {\n sessionId?: string;\n text: string;\n /** New payloads to store on the session and publish as refs in this turn. */\n attachments?: PromptAttachment[];\n /** Already-stored session attachment ids to publish as refs in this turn. */\n attachmentIds?: string[];\n role?: SpecialistRole;\n signal?: AbortSignal;\n }): Promise<ChatMessage> {\n this.start();\n await loadModelsCatalog().catch(() => undefined);\n const session =\n (input.sessionId ? this.sessions.get(input.sessionId) : this.sessions.focused()) ??\n this.sessions.createSession();\n\n const text = input.text.trim();\n const messageId = `msg-${Date.now()}-u`;\n const fresh = (input.attachments ?? []).slice(0, MAX_ATTACHMENTS).map((attachment) => {\n const stored = toSessionAttachment(attachment, { messageId });\n return { ...stored, path: attachmentUri(session.id, stored) };\n });\n if (fresh.length) {\n this.sessions.update(session.id, {\n attachments: [...(this.sessions.get(session.id)?.attachments ?? []), ...fresh],\n });\n await this.mirrorAttachments(session.id, fresh);\n }\n\n const existingIds = (input.attachmentIds ?? []).filter(Boolean);\n const stored = this.sessions.get(session.id)?.attachments ?? [];\n const byId = new Map(stored.map((a) => [a.id, a]));\n const published: SessionAttachment[] = [];\n for (const item of fresh) published.push(item);\n for (const id of existingIds) {\n const found = byId.get(id);\n if (found && !published.some((p) => p.id === found.id)) published.push(found);\n }\n\n if (!text && !published.length) {\n throw new Error('Prompt requires text or at least one attachment');\n }\n\n // Ensure already-stored attachments are present in the in-memory workspace.\n if (published.length) {\n await this.mirrorAttachments(session.id, published).catch(() => undefined);\n }\n\n const parts: MessagePart[] = [];\n if (text) parts.push({ type: 'text', text });\n for (const item of published) {\n parts.push(toFileRefPart({ ...item, path: item.path || attachmentUri(session.id, item) }));\n }\n\n const promptSummary = summarizePrompt(\n text,\n published.map((a) => ({ name: a.name, kind: a.kind })),\n );\n\n const userMessage: ChatMessage = {\n id: messageId,\n role: 'user',\n parts,\n createdAt: Date.now(),\n };\n this.sessions.addMessage(session.id, userMessage);\n if (isDefaultChatTitle(session.title)) {\n this.sessions.update(session.id, { title: titleFromPrompt(promptSummary) });\n }\n\n const contextChunk = this.memory.upsert({\n type: 'context',\n slots: { kind: 'user', summary: promptSummary },\n scope: 'session',\n sessionId: session.id,\n activation: 0.8,\n });\n const retrieved = this.memory.retrieveForContext(promptSummary.split(/\\s+/).slice(0, 12));\n const buffers = {\n ...session.buffers,\n retrieval: retrieved[0] ?? contextChunk,\n };\n\n const tick = coreTick({ state: this.core, buffers, context: contextChunk });\n this.core = tick.state;\n this.sessions.update(session.id, { buffers: tick.buffers, status: 'running' });\n this.events.publish(TOPIC.coreTick, {\n valenceDelta: tick.valenceDelta,\n intent: tick.intent,\n conscious: tick.state.conscious,\n });\n\n const role = input.role ?? session.specialistMode ?? 'build';\n refreshCommandTools(this.tools, role);\n\n const routeReq: RouteRequest = {\n role,\n complexity: Math.min(1, text.length / 800),\n requireTools: true,\n };\n const resolved = this.models.resolve(routeReq, this.policy);\n this.events.publish(TOPIC.modelRouted, resolved);\n\n const provider = this.providers.resolveProvider(resolved.model) ?? this.providers.list()[0];\n if (!provider) {\n const err: ChatMessage = {\n id: `msg-${Date.now()}-e`,\n role: 'assistant',\n parts: [{ type: 'text', text: 'No model provider configured. Open AI Settings to add one.' }],\n createdAt: Date.now(),\n };\n this.sessions.addMessage(session.id, err);\n this.sessions.update(session.id, { status: 'idle' });\n this.emitSessions();\n return err;\n }\n\n const goal = tick.intent?.summary ?? promptSummary;\n const hasAttachments =\n published.length > 0 || (this.sessions.get(session.id)?.attachments?.length ?? 0) > 0;\n let systemPrompt = systemPromptFor(role, goal, { hasAttachments });\n for (const enhance of this.promptEnhancers) {\n systemPrompt = await enhance(systemPrompt, { role, goal, sessionId: session.id });\n }\n const liveSession = this.sessions.get(session.id)!;\n const result = await runSpecialistLoop({\n role,\n systemPrompt,\n history: liveSession.history,\n compactionSummary: liveSession.compactionSummary,\n resolved,\n provider,\n broker: this.tools,\n refreshTools: () => refreshCommandTools(this.tools, role),\n sessionId: session.id,\n signal: input.signal,\n onPart: (part) => this.events.publish(TOPIC.messagePart, { sessionId: session.id, part }),\n });\n\n this.models.recordOutcome(role, resolved.model, resolved.effort, result.success);\n this.sessions.addMessage(session.id, result.message);\n this.memory.upsert({\n type: 'episodic',\n slots: { kind: result.success ? 'progress' : 'error', summary: goal },\n scope: 'workspace',\n sessionId: session.id,\n activation: 0.7,\n });\n\n const aborted = Boolean(input.signal?.aborted);\n if (!aborted && (this.sessions.get(session.id)?.history.length ?? 0) > AUTO_COMPACT_AFTER) {\n await this.compactSession(session.id, COMPACT_KEEP_COUNT, input.signal);\n }\n\n this.sessions.update(session.id, { status: 'idle' });\n this.events.publish(TOPIC.messageDone, { sessionId: session.id, message: result.message });\n this.emitSessions();\n void this.persist();\n return result.message;\n }\n\n private applyProvidersSettings(\n settings: ProvidersSettings,\n opts: { persist: boolean; emit: boolean },\n ): void {\n const normalized = normalizeProvidersSettings(settings);\n this.providersSettings = normalized;\n this.providers.clear();\n const externalIds = new Set(this.providers.listExternal().map((p) => p.id));\n for (const entry of normalized.providers) {\n if (!entry.enabled || !entry.id) continue;\n // External plugins own this id (e.g. webllm) — skip OpenAI-compatible wrapper.\n if (externalIds.has(entry.id)) continue;\n const modelIds = parseModelIds(entry.models);\n this.providers.register(\n new OpenAICompatibleProvider({\n id: entry.id,\n baseUrl: entry.baseUrl || 'http://127.0.0.1',\n apiKey: entry.apiKey || undefined,\n defaultModels: modelIds.map((id) => ({ id, name: id })),\n }),\n );\n }\n this.rebuildCatalog();\n if (opts.emit) this.events.publish(TOPIC.providersChanged, normalized);\n if (opts.persist) void this.persistProviders();\n }\n\n private rebuildCatalog(): void {\n const catalog = catalogFromSettings(this.providersSettings);\n const seen = new Set(catalog.map((e) => e.id));\n for (const provider of this.providers.listExternal()) {\n const models = provider.listModels();\n const list = Array.isArray(models) ? models : [];\n for (const model of list) {\n const id = `${provider.id}/${model.id}`;\n if (seen.has(id)) continue;\n seen.add(id);\n catalog.push(externalCatalogEntry(id, provider.id));\n }\n }\n this.models.setCatalog(catalog);\n }\n\n private async requestPermission(req: {\n toolName: string;\n args: Record<string, unknown>;\n sessionId: string;\n }): Promise<PermissionAction> {\n const requestId = `perm-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n this.sessions.update(req.sessionId, { status: 'waiting_approval' });\n this.emitSessions();\n return new Promise((resolve) => {\n this.permissionResolvers.set(requestId, resolve);\n this.events.publish(TOPIC.permissionAsked, { requestId, ...req });\n });\n }\n\n private emitSessions(): void {\n const focusedId = this.sessions.focused()?.id ?? null;\n projectInMemoryMountToFolder(focusedId);\n this.events.publish(TOPIC.sessionChanged, {\n sessions: this.sessions.list(),\n focusedId,\n });\n }\n\n /** Live in-memory file refs that resolve payloads from the session store. */\n private mirrorAttachments(sessionId: string, attachments: SessionAttachment[]): Promise<void> {\n return syncAttachmentsToWorkspace(sessionId, attachments, (attachmentId) =>\n this.sessions.get(sessionId)?.attachments?.find((a) => a.id === attachmentId),\n );\n }\n\n private async hydrateAll(): Promise<void> {\n await loadModelsCatalog().catch(() => undefined);\n await this.hydrateProviders();\n // Re-apply so catalog effort flags use Models.dev metadata.\n this.applyProvidersSettings(this.providersSettings, { persist: false, emit: true });\n await this.hydrate();\n if (!this.sessions.list().length) this.sessions.createSession({ title: 'Chat' });\n const mostRecent = this.sessions.list()[0];\n if (mostRecent) this.sessions.focus(mostRecent.id);\n for (const session of this.sessions.list()) {\n const list = session.attachments ?? [];\n if (!list.length) continue;\n const stamped = list.map((a) =>\n a.path ? a : { ...a, path: attachmentUri(session.id, a) },\n );\n if (stamped.some((a, i) => a.path !== list[i]?.path)) {\n this.sessions.update(session.id, { attachments: stamped });\n }\n await this.mirrorAttachments(session.id, stamped).catch(() => undefined);\n }\n this.emitSessions();\n }\n\n private async hydrateProviders(): Promise<void> {\n try {\n const saved = (await persistenceService.getObject(PROVIDERS_PERSIST_KEY)) as ProvidersSettings | null;\n if (!saved?.providers?.length) return;\n this.applyProvidersSettings(saved, { persist: false, emit: true });\n } catch {\n // first run / unavailable persistence\n }\n }\n\n private async persistProviders(): Promise<void> {\n try {\n await persistenceService.persistObject(PROVIDERS_PERSIST_KEY, this.providersSettings);\n } catch {\n // ignore\n }\n }\n\n private async hydrate(): Promise<void> {\n try {\n const saved = (await persistenceService.getObject(PERSIST_KEY)) as\n | {\n sessions?: ReturnType<SessionRuntime['snapshot']>;\n memory?: ReturnType<CognitiveMemory['snapshot']>;\n approvalMode?: ToolApprovalMode;\n modelPolicy?: ModelPolicy;\n }\n | null;\n if (!saved) return;\n if (saved.sessions) this.sessions.loadSnapshot(saved.sessions);\n if (saved.memory) this.memory.restore(saved.memory);\n if (saved.approvalMode && isToolApprovalMode(saved.approvalMode)) {\n this.approvalMode = saved.approvalMode;\n this.tools.setApprovalMode(saved.approvalMode);\n }\n const policy = normalizeModelPolicy(saved.modelPolicy);\n if (policy) this.policy = policy;\n } catch {\n // first run / unavailable persistence\n }\n }\n\n private async persist(): Promise<void> {\n try {\n await persistenceService.persistObject(PERSIST_KEY, {\n sessions: this.sessions.snapshot(),\n memory: this.memory.snapshot(),\n approvalMode: this.approvalMode,\n modelPolicy: this.policy,\n });\n } catch {\n // ignore persistence failures in constrained environments\n }\n }\n}\n\nfunction isToolApprovalMode(value: unknown): value is ToolApprovalMode {\n return value === 'manual' || value === 'auto_safe' || value === 'auto_all';\n}\n\nfunction isOptimizeFor(value: unknown): value is 'cost' | 'balance' | 'intelligence' {\n return value === 'cost' || value === 'balance' || value === 'intelligence';\n}\n\nfunction isEffortOrAuto(value: unknown): value is EffortLevel | 'auto' {\n return (\n value === 'auto' ||\n value === 'none' ||\n value === 'minimal' ||\n value === 'low' ||\n value === 'medium' ||\n value === 'high' ||\n value === 'xhigh' ||\n value === 'max'\n );\n}\n\nfunction normalizeModelPolicy(value: unknown): ModelPolicy | null {\n if (!value || typeof value !== 'object') return null;\n const raw = value as Record<string, unknown>;\n if (raw.mode === 'auto' && isOptimizeFor(raw.optimizeFor)) {\n return { mode: 'auto', optimizeFor: raw.optimizeFor };\n }\n if (raw.mode === 'manual' && typeof raw.model === 'string' && raw.model.trim()) {\n return {\n mode: 'manual',\n model: raw.model.trim(),\n ...(isEffortOrAuto(raw.effort) ? { effort: raw.effort } : {}),\n };\n }\n return null;\n}\n\nfunction sameModelPolicy(a: ModelPolicy, b: ModelPolicy): boolean {\n if (a.mode !== b.mode) return false;\n if (a.mode === 'auto' && b.mode === 'auto') return a.optimizeFor === b.optimizeFor;\n if (a.mode === 'manual' && b.mode === 'manual') {\n return a.model === b.model && (a.effort ?? 'auto') === (b.effort ?? 'auto');\n }\n return false;\n}\n\nfunction externalCatalogEntry(id: string, providerId: string): ModelCatalogEntry {\n return {\n id,\n providerId,\n tier: 'standard',\n strengths: ['fast'],\n effort: detectEffortCapability(id),\n };\n}\n\nexport const cognitiveRuntime = new CognitiveRuntime();\n\nfunction isDefaultChatTitle(title: string): boolean {\n const t = title.trim().toLowerCase();\n return !t || t === 'chat' || t === 'new chat' || t === 'new session';\n}\n\nfunction titleFromPrompt(text: string): string {\n const trimmed = text.trim().replace(/\\s+/g, ' ');\n if (!trimmed) return 'Chat';\n return trimmed.length <= 42 ? trimmed : `${trimmed.slice(0, 42).trimEnd()}…`;\n}\n\nfunction summarizePrompt(text: string, attachments: PromptAttachment[]): string {\n if (text) return text;\n if (!attachments.length) return '';\n if (attachments.length === 1) return `Attached ${attachments[0]!.name}`;\n return `Attached ${attachments.map((a) => a.name).join(', ')}`;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Shown immediately when waiting on a model turn. */
|
|
2
|
+
export declare const INITIAL_BUSY_STATUS = "Thinking\u2026";
|
|
3
|
+
/**
|
|
4
|
+
* Rotating wait copy (Cursor / Copilot style). Picked at random after the initial message.
|
|
5
|
+
* Keep these light and short — they appear in the composer while busy.
|
|
6
|
+
*/
|
|
7
|
+
export declare const BUSY_STATUS_MESSAGES: readonly string[];
|
|
8
|
+
/** Random delay until the next busy-status line (3–12s). */
|
|
9
|
+
export declare function busyStatusRotateMs(): number;
|
|
10
|
+
/** Next status, avoiding an immediate repeat of `current`. */
|
|
11
|
+
export declare function nextBusyStatus(current: string): string;
|
|
12
|
+
//# sourceMappingURL=busy-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"busy-status.d.ts","sourceRoot":"","sources":["../../src/view/busy-status.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,mBAAc,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EA0BjD,CAAC;AAKF,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD"}
|
|
@@ -26,7 +26,6 @@ export declare class DocksCognitiveSettingsEditor extends DocksPart {
|
|
|
26
26
|
private reindexModelState;
|
|
27
27
|
private setDefault;
|
|
28
28
|
save(): Promise<void>;
|
|
29
|
-
protected renderToolbar(): import('lit-html').TemplateResult<1>;
|
|
30
29
|
protected renderContent(): import('lit-html').TemplateResult<1>;
|
|
31
30
|
private renderRow;
|
|
32
31
|
private renderModelsCell;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cognitive-settings-editor.d.ts","sourceRoot":"","sources":["../../src/view/cognitive-settings-editor.ts"],"names":[],"mappings":"AAAA,OAAO,0CAA0C,CAAC;AAClD,OAAO,EACL,SAAS,EACT,WAAW,EAIZ,MAAM,qBAAqB,CAAC;AAqB7B,qBACa,4BAA6B,SAAQ,SAAS;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IAElD,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,WAAW,CAA8B;IAE1D,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,eAAe,CAAqB;IAE5C,SAAS,CAAC,QAAQ,IAAI,IAAI;IAa1B,oBAAoB,IAAI,IAAI;IAU5B,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,mBAAmB;YAYb,WAAW;IA2CzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;YAYL,cAAc;IAc5B,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,UAAU;IAIH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,SAAS,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"cognitive-settings-editor.d.ts","sourceRoot":"","sources":["../../src/view/cognitive-settings-editor.ts"],"names":[],"mappings":"AAAA,OAAO,0CAA0C,CAAC;AAClD,OAAO,EACL,SAAS,EACT,WAAW,EAIZ,MAAM,qBAAqB,CAAC;AAqB7B,qBACa,4BAA6B,SAAQ,SAAS;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IAElD,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,WAAW,CAA8B;IAE1D,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,eAAe,CAAqB;IAE5C,SAAS,CAAC,QAAQ,IAAI,IAAI;IAa1B,oBAAoB,IAAI,IAAI;IAU5B,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,mBAAmB;YAYb,WAAW;IA2CzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;YAYL,cAAc;IAc5B,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,UAAU;IAIH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,SAAS,CAAC,aAAa;IAiFvB,OAAO,CAAC,SAAS;IAqEjB,OAAO,CAAC,gBAAgB;IAiExB,MAAM,CAAC,MAAM,0BAqJX;CACH;AAUD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iCAAiC,EAAE,4BAA4B,CAAC;KACjE;CACF"}
|
|
@@ -5,6 +5,7 @@ export declare class DocksCognitiveView extends DocksPart {
|
|
|
5
5
|
static styles: import('lit').CSSResult;
|
|
6
6
|
private textarea?;
|
|
7
7
|
private fileInput?;
|
|
8
|
+
private composerPasteBound;
|
|
8
9
|
private sessions;
|
|
9
10
|
private focusedId;
|
|
10
11
|
private draft;
|
|
@@ -12,7 +13,9 @@ export declare class DocksCognitiveView extends DocksPart {
|
|
|
12
13
|
private pendingAttachmentIds;
|
|
13
14
|
private dragOver;
|
|
14
15
|
private previewAttachmentId;
|
|
16
|
+
private toolDetail;
|
|
15
17
|
private busy;
|
|
18
|
+
private busyStatus;
|
|
16
19
|
private pendingPermission;
|
|
17
20
|
private policyMode;
|
|
18
21
|
private optimizeFor;
|
|
@@ -25,8 +28,16 @@ export declare class DocksCognitiveView extends DocksPart {
|
|
|
25
28
|
private historyQuery;
|
|
26
29
|
private unsubs;
|
|
27
30
|
private scrollDebounceTimer?;
|
|
31
|
+
private busyStatusTimer?;
|
|
32
|
+
private promptController;
|
|
33
|
+
private nativePasteHandler;
|
|
34
|
+
private cancelKeyHandler;
|
|
35
|
+
protected updated(): void;
|
|
36
|
+
private bindComposerPaste;
|
|
28
37
|
protected doBeforeUI(): void;
|
|
29
38
|
protected doClose(): void;
|
|
39
|
+
private startBusyStatus;
|
|
40
|
+
private stopBusyStatus;
|
|
30
41
|
private syncSessions;
|
|
31
42
|
private scheduleScrollToBottom;
|
|
32
43
|
private scrollToBottom;
|
|
@@ -36,6 +47,9 @@ export declare class DocksCognitiveView extends DocksPart {
|
|
|
36
47
|
private newSession;
|
|
37
48
|
private historySessions;
|
|
38
49
|
private syncModels;
|
|
50
|
+
/** Mirror persisted runtime policy into the gear menu after hydrate. */
|
|
51
|
+
private restoreRoutingFromRuntime;
|
|
52
|
+
private onProvidersChanged;
|
|
39
53
|
private effortChoices;
|
|
40
54
|
private routerValue;
|
|
41
55
|
private routerLabel;
|
|
@@ -44,6 +58,7 @@ export declare class DocksCognitiveView extends DocksPart {
|
|
|
44
58
|
private compactFocused;
|
|
45
59
|
private onRouterSelect;
|
|
46
60
|
private applyPolicy;
|
|
61
|
+
private setComposerText;
|
|
47
62
|
private clearComposer;
|
|
48
63
|
private sessionAttachments;
|
|
49
64
|
private previewAttachment;
|
|
@@ -56,9 +71,15 @@ export declare class DocksCognitiveView extends DocksPart {
|
|
|
56
71
|
private onComposerDragOver;
|
|
57
72
|
private onComposerDragLeave;
|
|
58
73
|
private onComposerDrop;
|
|
74
|
+
/** Attach clipboard files/images (e.g. Ctrl+V screenshot) when focused in the prompt. */
|
|
75
|
+
private onComposerPaste;
|
|
76
|
+
private cancelTurn;
|
|
59
77
|
private send;
|
|
60
78
|
private renderAttachmentDropdown;
|
|
61
79
|
private renderAttachmentDialog;
|
|
80
|
+
private openToolDetail;
|
|
81
|
+
private closeToolDetail;
|
|
82
|
+
private renderToolDetailDialog;
|
|
62
83
|
private resolvePermission;
|
|
63
84
|
protected renderToolbar(): TemplateResult;
|
|
64
85
|
private contextRingStyle;
|