@eclipse-docks/extension-ai-system 0.7.140 → 0.7.141
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 +72 -0
- package/dist/api.d.ts +1 -7
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +2 -2
- package/dist/cognitive-extension-CG_d39K5.js +2129 -0
- package/dist/cognitive-extension-CG_d39K5.js.map +1 -0
- package/dist/cognitive-extension.d.ts +1 -0
- package/dist/cognitive-extension.d.ts.map +1 -0
- package/dist/i18n.de-BrLTiN56.js +11 -0
- package/dist/i18n.de-BrLTiN56.js.map +1 -0
- package/dist/i18n.en-MkwuLlOD.js +11 -0
- package/dist/i18n.en-MkwuLlOD.js.map +1 -0
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/runtime/attachments.d.ts +89 -0
- package/dist/runtime/attachments.d.ts.map +1 -0
- package/dist/runtime/cognitive-runtime.d.ts +83 -0
- package/dist/runtime/cognitive-runtime.d.ts.map +1 -0
- package/dist/runtime/compact/compaction.d.ts +29 -0
- package/dist/runtime/compact/compaction.d.ts.map +1 -0
- package/dist/runtime/constants.d.ts +9 -0
- package/dist/runtime/constants.d.ts.map +1 -0
- package/dist/runtime/context/usage.d.ts +35 -0
- package/dist/runtime/context/usage.d.ts.map +1 -0
- package/dist/runtime/core/index.d.ts +4 -0
- package/dist/runtime/core/index.d.ts.map +1 -0
- package/dist/runtime/core/needs.d.ts +5 -0
- package/dist/runtime/core/needs.d.ts.map +1 -0
- package/dist/runtime/core/plutchik.d.ts +8 -0
- package/dist/runtime/core/plutchik.d.ts.map +1 -0
- package/dist/runtime/core/tick.d.ts +23 -0
- package/dist/runtime/core/tick.d.ts.map +1 -0
- package/dist/runtime/events.d.ts +21 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/memory/index.d.ts +2 -0
- package/dist/runtime/memory/index.d.ts.map +1 -0
- package/dist/runtime/memory/store.d.ts +27 -0
- package/dist/runtime/memory/store.d.ts.map +1 -0
- package/dist/runtime/models/effort-support.d.ts +31 -0
- package/dist/runtime/models/effort-support.d.ts.map +1 -0
- package/dist/runtime/models/index.d.ts +7 -0
- package/dist/runtime/models/index.d.ts.map +1 -0
- package/dist/runtime/models/openai-compatible.d.ts +39 -0
- package/dist/runtime/models/openai-compatible.d.ts.map +1 -0
- package/dist/runtime/models/provider-config.d.ts +23 -0
- package/dist/runtime/models/provider-config.d.ts.map +1 -0
- package/dist/runtime/models/provider-registry.d.ts +16 -0
- package/dist/runtime/models/provider-registry.d.ts.map +1 -0
- package/dist/runtime/models/router.d.ts +12 -0
- package/dist/runtime/models/router.d.ts.map +1 -0
- package/dist/runtime/models/types.d.ts +88 -0
- package/dist/runtime/models/types.d.ts.map +1 -0
- package/dist/runtime/session/index.d.ts +2 -0
- package/dist/runtime/session/index.d.ts.map +1 -0
- package/dist/runtime/session/session-runtime.d.ts +48 -0
- package/dist/runtime/session/session-runtime.d.ts.map +1 -0
- package/dist/runtime/specialists/classify-risk.d.ts +15 -0
- package/dist/runtime/specialists/classify-risk.d.ts.map +1 -0
- package/dist/runtime/specialists/index.d.ts +12 -0
- package/dist/runtime/specialists/index.d.ts.map +1 -0
- package/dist/runtime/specialists/loop.d.ts +25 -0
- package/dist/runtime/specialists/loop.d.ts.map +1 -0
- package/dist/runtime/tools/attachment-adapter.d.ts +6 -0
- package/dist/runtime/tools/attachment-adapter.d.ts.map +1 -0
- package/dist/runtime/tools/broker.d.ts +52 -0
- package/dist/runtime/tools/broker.d.ts.map +1 -0
- package/dist/runtime/tools/command-adapter.d.ts +5 -0
- package/dist/runtime/tools/command-adapter.d.ts.map +1 -0
- package/dist/runtime/tools/index.d.ts +5 -0
- package/dist/runtime/tools/index.d.ts.map +1 -0
- package/dist/runtime/tools/workspace-adapter.d.ts +4 -0
- package/dist/runtime/tools/workspace-adapter.d.ts.map +1 -0
- package/dist/runtime/types.d.ts +145 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime-DfNGzEjU.js +2952 -0
- package/dist/runtime-DfNGzEjU.js.map +1 -0
- package/dist/view/cognitive-settings-editor.d.ts +40 -0
- package/dist/view/cognitive-settings-editor.d.ts.map +1 -0
- package/dist/view/cognitive-view.d.ts +83 -0
- package/dist/view/cognitive-view.d.ts.map +1 -0
- package/package.json +15 -11
- package/dist/agents/agent-registry.d.ts +0 -8
- package/dist/agents/agent-registry.d.ts.map +0 -1
- package/dist/agents/index.d.ts +0 -6
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/message-processor.d.ts +0 -9
- package/dist/agents/message-processor.d.ts.map +0 -1
- package/dist/agents/orchestrator.d.ts +0 -12
- package/dist/agents/orchestrator.d.ts.map +0 -1
- package/dist/agents/prompt-builder.d.ts +0 -21
- package/dist/agents/prompt-builder.d.ts.map +0 -1
- package/dist/agents/reviewer.d.ts +0 -15
- package/dist/agents/reviewer.d.ts.map +0 -1
- package/dist/ai-service-Cmafte5S.js +0 -1866
- package/dist/ai-service-Cmafte5S.js.map +0 -1
- package/dist/ai-system-extension-CsfSiwNJ.js +0 -2324
- package/dist/ai-system-extension-CsfSiwNJ.js.map +0 -1
- package/dist/ai-system-extension.d.ts +0 -1
- package/dist/ai-system-extension.d.ts.map +0 -1
- package/dist/chat-provider-contributions.d.ts +0 -2
- package/dist/chat-provider-contributions.d.ts.map +0 -1
- package/dist/core/constants.d.ts +0 -21
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/index.d.ts +0 -4
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/interfaces.d.ts +0 -138
- package/dist/core/interfaces.d.ts.map +0 -1
- package/dist/core/message-utils.d.ts +0 -4
- package/dist/core/message-utils.d.ts.map +0 -1
- package/dist/core/types.d.ts +0 -128
- package/dist/core/types.d.ts.map +0 -1
- package/dist/prompt-enhancer-contributions.d.ts +0 -2
- package/dist/prompt-enhancer-contributions.d.ts.map +0 -1
- package/dist/providers/base-provider.d.ts +0 -15
- package/dist/providers/base-provider.d.ts.map +0 -1
- package/dist/providers/index.d.ts +0 -9
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/ollama-provider.d.ts +0 -7
- package/dist/providers/ollama-provider.d.ts.map +0 -1
- package/dist/providers/openai-provider.d.ts +0 -7
- package/dist/providers/openai-provider.d.ts.map +0 -1
- package/dist/providers/provider-factory.d.ts +0 -10
- package/dist/providers/provider-factory.d.ts.map +0 -1
- package/dist/providers/provider-utils.d.ts +0 -5
- package/dist/providers/provider-utils.d.ts.map +0 -1
- package/dist/providers/streaming/ollama-parser.d.ts +0 -9
- package/dist/providers/streaming/ollama-parser.d.ts.map +0 -1
- package/dist/providers/streaming/sse-parser.d.ts +0 -10
- package/dist/providers/streaming/sse-parser.d.ts.map +0 -1
- package/dist/providers/streaming/stream-parser.d.ts +0 -10
- package/dist/providers/streaming/stream-parser.d.ts.map +0 -1
- package/dist/service/ai-service.d.ts +0 -47
- package/dist/service/ai-service.d.ts.map +0 -1
- package/dist/service/token-usage-tracker.d.ts +0 -16
- package/dist/service/token-usage-tracker.d.ts.map +0 -1
- package/dist/task/task-checkpoint.d.ts +0 -12
- package/dist/task/task-checkpoint.d.ts.map +0 -1
- package/dist/task/task-plan.d.ts +0 -7
- package/dist/task/task-plan.d.ts.map +0 -1
- package/dist/task/task-runner.d.ts +0 -10
- package/dist/task/task-runner.d.ts.map +0 -1
- package/dist/tools/index.d.ts +0 -6
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/token-estimator.d.ts +0 -12
- package/dist/tools/token-estimator.d.ts.map +0 -1
- package/dist/tools/tool-call-accumulator.d.ts +0 -9
- package/dist/tools/tool-call-accumulator.d.ts.map +0 -1
- package/dist/tools/tool-executor.d.ts +0 -13
- package/dist/tools/tool-executor.d.ts.map +0 -1
- package/dist/tools/tool-name-utils.d.ts +0 -2
- package/dist/tools/tool-name-utils.d.ts.map +0 -1
- package/dist/tools/tool-registry.d.ts +0 -7
- package/dist/tools/tool-registry.d.ts.map +0 -1
- package/dist/utils/token-estimator.d.ts +0 -2
- package/dist/utils/token-estimator.d.ts.map +0 -1
- package/dist/utils/tool-detector.d.ts +0 -10
- package/dist/utils/tool-detector.d.ts.map +0 -1
- package/dist/view/agent-group-manager.d.ts +0 -37
- package/dist/view/agent-group-manager.d.ts.map +0 -1
- package/dist/view/aiview.d.ts +0 -42
- package/dist/view/aiview.d.ts.map +0 -1
- package/dist/view/components/ai-agent-response-group.d.ts +0 -18
- package/dist/view/components/ai-agent-response-group.d.ts.map +0 -1
- package/dist/view/components/ai-chat-input.d.ts +0 -20
- package/dist/view/components/ai-chat-input.d.ts.map +0 -1
- package/dist/view/components/ai-chat-message.d.ts +0 -22
- package/dist/view/components/ai-chat-message.d.ts.map +0 -1
- package/dist/view/components/ai-config-editor.d.ts +0 -33
- package/dist/view/components/ai-config-editor.d.ts.map +0 -1
- package/dist/view/components/ai-empty-state.d.ts +0 -13
- package/dist/view/components/ai-empty-state.d.ts.map +0 -1
- package/dist/view/components/ai-tool-approval.d.ts +0 -26
- package/dist/view/components/ai-tool-approval.d.ts.map +0 -1
- package/dist/view/components/index.d.ts +0 -7
- package/dist/view/components/index.d.ts.map +0 -1
- package/dist/view/provider-manager.d.ts +0 -30
- package/dist/view/provider-manager.d.ts.map +0 -1
- package/dist/view/session-manager.d.ts +0 -25
- package/dist/view/session-manager.d.ts.map +0 -1
- package/dist/view/stream-manager.d.ts +0 -23
- package/dist/view/stream-manager.d.ts.map +0 -1
- package/dist/view/task-progress-panel.d.ts +0 -14
- package/dist/view/task-progress-panel.d.ts.map +0 -1
- package/dist/view/token-usage.d.ts +0 -18
- package/dist/view/token-usage.d.ts.map +0 -1
- package/dist/view/workspace-panel.d.ts +0 -15
- package/dist/view/workspace-panel.d.ts.map +0 -1
- package/dist/workflows/base-sequential-workflow.d.ts +0 -13
- package/dist/workflows/base-sequential-workflow.d.ts.map +0 -1
- package/dist/workflows/conditional-workflow.d.ts +0 -7
- package/dist/workflows/conditional-workflow.d.ts.map +0 -1
- package/dist/workflows/index.d.ts +0 -10
- package/dist/workflows/index.d.ts.map +0 -1
- package/dist/workflows/orchestrated-workflow.d.ts +0 -10
- package/dist/workflows/orchestrated-workflow.d.ts.map +0 -1
- package/dist/workflows/parallel-workflow.d.ts +0 -6
- package/dist/workflows/parallel-workflow.d.ts.map +0 -1
- package/dist/workflows/pipeline-workflow.d.ts +0 -7
- package/dist/workflows/pipeline-workflow.d.ts.map +0 -1
- package/dist/workflows/review-workflow.d.ts +0 -10
- package/dist/workflows/review-workflow.d.ts.map +0 -1
- package/dist/workflows/sequential-workflow.d.ts +0 -7
- package/dist/workflows/sequential-workflow.d.ts.map +0 -1
- package/dist/workflows/workflow-engine.d.ts +0 -8
- package/dist/workflows/workflow-engine.d.ts.map +0 -1
- package/dist/workflows/workflow-strategy.d.ts +0 -8
- package/dist/workflows/workflow-strategy.d.ts.map +0 -1
- package/dist/workspace/workspace.d.ts +0 -20
- package/dist/workspace/workspace.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-DfNGzEjU.js","names":["EFFORT_ORDER"],"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/models/openai-compatible.ts","../src/runtime/models/router.ts","../src/runtime/tools/broker.ts","../src/runtime/tools/workspace-adapter.ts","../src/runtime/tools/command-adapter.ts","../src/runtime/attachments.ts","../src/runtime/tools/attachment-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/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","import { 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 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 const { done, value } = await reader.read();\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 { workspaceService, File, Directory } from '@eclipse-docks/core';\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/** Registers built-in workspace file tools on the broker. */\nexport function registerWorkspaceTools(broker: ToolBroker): void {\n broker.register(\n {\n name: 'workspace_list',\n description: 'List children of a workspace directory path',\n parameters: {\n type: 'object',\n properties: { path: { type: 'string', description: 'Directory path relative to workspace' } },\n required: ['path'],\n },\n },\n async (call) => {\n try {\n const path = String(call.arguments.path ?? '');\n const root = await workspaceService.getWorkspace();\n if (!root) return { id: call.id, name: call.name, ok: false, output: null, error: 'No workspace' };\n const resource = await root.getResource(path.endsWith('/') ? path : `${path}/`);\n if (!(resource instanceof Directory)) {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'Not a directory' };\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) => ({ name: c.getName(), path: c.getWorkspacePath() })),\n };\n } catch (err) {\n return { id: call.id, name: call.name, ok: false, output: null, error: err instanceof Error ? err.message : String(err) };\n }\n },\n );\n\n broker.register(\n {\n name: 'workspace_read',\n description: 'Read a workspace file as text',\n parameters: {\n type: 'object',\n properties: { path: { type: 'string' } },\n required: ['path'],\n },\n },\n async (call) => {\n try {\n const path = String(call.arguments.path ?? '');\n const root = await workspaceService.getWorkspace();\n if (!root) return { id: call.id, name: call.name, ok: false, output: null, error: 'No workspace' };\n const resource = await root.getResource(path);\n if (!(resource instanceof File)) {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'Not a file' };\n }\n const contents = await resource.getContents();\n return { id: call.id, name: call.name, ok: true, output: contents };\n } catch (err) {\n return { id: call.id, name: call.name, ok: false, output: null, error: err instanceof Error ? err.message : String(err) };\n }\n },\n );\n\n broker.register(\n {\n name: 'workspace_write',\n description: 'Write text contents to a workspace file (creates parents as needed)',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n contents: { type: 'string' },\n },\n required: ['path', 'contents'],\n },\n },\n async (call) => {\n try {\n const args = asRecord(call.arguments);\n const path = String(args.path ?? '');\n const contents = String(args.contents ?? '');\n const root = await workspaceService.getWorkspace();\n if (!root) {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'No workspace', mutating: true };\n }\n const resource = await root.getResource(path, { create: true });\n if (!(resource instanceof File)) {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'Not a file', mutating: true };\n }\n await resource.saveContents(contents);\n return { id: call.id, name: call.name, ok: true, output: { path }, mutating: true };\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\nconst SKIP = new Set(['open_cognitive_ai_settings', 'open_ai_config']);\n/** Built-in tools that must survive command refresh (not command-backed). */\nconst KEEP_TOOLS = new Set([\n 'workspace_list',\n 'workspace_read',\n 'workspace_write',\n 'attachment_list',\n 'attachment_read',\n]);\n\nfunction sanitizeName(id: string): string {\n return id.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 64);\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<{ name: string; description: string; type?: string; required: boolean; allowedValues?: string[] }>;\n }>;\n\n for (const command of entries) {\n if (!command?.id || SKIP.has(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 { MessagePart, PromptAttachment, SessionAttachment } from './types';\nimport type { ProviderContent } from './models/types';\n\n/** Soft cap per attached text file when stored / returned by attachment_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 by attachment_read for text. */\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 attachment_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. */\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 label = part.path?.trim() || part.name;\n const kind = part.kind ?? 'file';\n const bytes = part.byteLength != null ? ` bytes=${part.byteLength}` : '';\n return `[Attachment published: id=${part.id} name=\"${label}\" kind=${kind}${part.mime ? ` mime=${part.mime}` : ''}${bytes}] → use attachment_read with id=\"${part.id}\"`;\n}\n\n/**\n * Build provider user content from history parts.\n * File parts are references only — payloads stay in the session store.\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 'Attachments live in this session store only. Call attachment_read (or attachment_list) before answering about them. Do not use canvas/workspace/editor commands to locate attachments.';\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 type { SessionAttachment } from '../types';\nimport {\n attachmentMeta,\n readImageAttachment,\n readTextAttachment,\n} from '../attachments';\nimport type { ToolBroker } from './broker';\n\nexport type AttachmentLookup = (sessionId: string, attachmentId?: string) => SessionAttachment[];\n\n/** Registers read-only session attachment tools. */\nexport function registerAttachmentTools(broker: ToolBroker, lookup: AttachmentLookup): void {\n broker.register(\n {\n name: 'attachment_list',\n description:\n 'List chat-session attachments (id, name, kind, mime, size). Use this for files the user attached in chat — not workspace/canvas files. Payloads are omitted; call attachment_read to inspect one.',\n parameters: {\n type: 'object',\n properties: {},\n },\n },\n async (call, sessionId) => {\n const items = lookup(sessionId).map(attachmentMeta);\n return { id: call.id, name: call.name, ok: true, output: { count: items.length, attachments: items } };\n },\n );\n\n broker.register(\n {\n name: 'attachment_read',\n description:\n 'Inspect a chat-session attachment by id from the user message or attachment_list. Prefer this whenever the user asks about an attached screenshot/file. Text returns content (optional offset/limit). Images are presented for vision inspection.',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Attachment id from attachment_list or the user message' },\n offset: { type: 'number', description: 'Text start offset (characters)' },\n limit: { type: 'number', description: 'Max text characters to return' },\n },\n required: ['id'],\n },\n },\n async (call, sessionId) => {\n const id = String(call.arguments.id ?? '').trim();\n if (!id) {\n return { id: call.id, name: call.name, ok: false, output: null, error: 'id is required' };\n }\n const stored = lookup(sessionId, id)[0];\n if (!stored) {\n return { id: call.id, name: call.name, ok: false, output: null, error: `Unknown attachment: ${id}` };\n }\n if (stored.kind === 'image') {\n const result = readImageAttachment(stored, {\n offset: typeof call.arguments.offset === 'number' ? call.arguments.offset : undefined,\n limit: typeof call.arguments.limit === 'number' ? call.arguments.limit : undefined,\n });\n if (!result.ok) {\n return { id: call.id, name: call.name, ok: false, output: null, error: result.error };\n }\n return { id: call.id, name: call.name, ok: true, output: result.output };\n }\n const result = readTextAttachment(stored, {\n offset: typeof call.arguments.offset === 'number' ? call.arguments.offset : undefined,\n limit: typeof call.arguments.limit === 'number' ? call.arguments.limit : undefined,\n });\n if (!result.ok) {\n return { id: call.id, name: call.name, ok: false, output: null, error: result.error };\n }\n return { id: call.id, name: call.name, ok: true, output: result.output };\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 {\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\n for (let iter = 0; iter < MAX_TOOL_ITERATIONS; iter++) {\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 (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 (!pendingTools.length) {\n if (assistantText && !parts.some((p) => p.type === 'text')) emit({ type: 'text', text: assistantText });\n break;\n }\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 for (const tool of pendingTools) {\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 in the next user message for vision inspection.',\n }\n : safeOutput,\n ),\n });\n if (presentImage) {\n const dataUrl = String((rawOutput as Record<string, unknown>).dataUrl);\n const name = String((rawOutput as Record<string, unknown>).name ?? 'image');\n const id = String((rawOutput as Record<string, unknown>).id ?? '');\n messages.push({\n role: 'user',\n content: [\n {\n type: 'text',\n text: `Attachment image for inspection: id=${id} name=\"${name}\"`,\n },\n { type: 'image_url', image_url: { url: dataUrl } },\n ],\n });\n }\n if (!result.ok) success = false;\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 attachmentRule = opts.hasAttachments\n ? 'This turn publishes session attachments. To inspect them, call attachment_read with the attachment id from the user message (attachment_list if you need ids). Do not open canvases, editors, workspaces, or unrelated commands to find attachment contents — they are not workspace files.'\n : 'When the user publishes attachments, use attachment_list / attachment_read to inspect them — do not assume their contents are already in the transcript.';\n const preamble = `${base} ${attachmentRule}`;\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 stay in the session until attachment_read.\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 { persistenceService } from '@eclipse-docks/core';\nimport type {\n ChatMessage,\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 {\n ToolBroker,\n registerAttachmentTools,\n registerWorkspaceTools,\n refreshCommandTools,\n} from './tools';\nimport type { PermissionHandler } from './tools';\nimport { SessionRuntime } from './session';\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 registerAttachmentTools(this.tools, (sessionId, attachmentId) => {\n const list = this.sessions.get(sessionId)?.attachments ?? [];\n if (!attachmentId) return list;\n const found = list.find((a) => a.id === attachmentId);\n return found ? [found] : [];\n });\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 this.policy = policy;\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 (not inlined into history until prompt). */\n addAttachments(\n sessionId: string | undefined,\n attachments: PromptAttachment[],\n ): 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) => toSessionAttachment(attachment));\n if (!accepted.length) return [];\n\n this.sessions.update(id, {\n attachments: [...(session.attachments ?? []), ...accepted],\n });\n this.commitSessions();\n return accepted;\n }\n\n /** Remove an attachment payload from the session store. */\n removeAttachment(sessionId: string, attachmentId: string): boolean {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\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 return true;\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 toSessionAttachment(attachment, { messageId }),\n );\n if (fresh.length) {\n this.sessions.update(session.id, {\n attachments: [...(this.sessions.get(session.id)?.attachments ?? []), ...fresh],\n });\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 const parts: MessagePart[] = [];\n if (text) parts.push({ type: 'text', text });\n for (const item of published) parts.push(toFileRefPart(item));\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 if ((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 this.events.publish(TOPIC.sessionChanged, {\n sessions: this.sessions.list(),\n focusedId: this.sessions.focused()?.id ?? null,\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 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 }\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 } 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 });\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 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,40 @@
|
|
|
1
|
+
import { DocksPart, EditorInput } from '@eclipse-docks/core';
|
|
2
|
+
export declare class DocksCognitiveSettingsEditor extends DocksPart {
|
|
3
|
+
input?: EditorInput;
|
|
4
|
+
private settings;
|
|
5
|
+
private approvalMode;
|
|
6
|
+
private availableModels;
|
|
7
|
+
private loadingModels;
|
|
8
|
+
private modelErrors;
|
|
9
|
+
private unsubs;
|
|
10
|
+
private fetchControllers;
|
|
11
|
+
private fetchTimers;
|
|
12
|
+
private autoFetchedKeys;
|
|
13
|
+
protected doInitUI(): void;
|
|
14
|
+
disconnectedCallback(): void;
|
|
15
|
+
private loadFromRuntime;
|
|
16
|
+
private setApprovalMode;
|
|
17
|
+
private touch;
|
|
18
|
+
private updateProvider;
|
|
19
|
+
private clearModels;
|
|
20
|
+
private scheduleFetchModels;
|
|
21
|
+
private fetchModels;
|
|
22
|
+
private onModelsSelect;
|
|
23
|
+
private addProvider;
|
|
24
|
+
private deleteProvider;
|
|
25
|
+
/** Shift per-row model fetch state after a row is removed. */
|
|
26
|
+
private reindexModelState;
|
|
27
|
+
private setDefault;
|
|
28
|
+
save(): Promise<void>;
|
|
29
|
+
protected renderToolbar(): import('lit-html').TemplateResult<1>;
|
|
30
|
+
protected renderContent(): import('lit-html').TemplateResult<1>;
|
|
31
|
+
private renderRow;
|
|
32
|
+
private renderModelsCell;
|
|
33
|
+
static styles: import('lit').CSSResult;
|
|
34
|
+
}
|
|
35
|
+
declare global {
|
|
36
|
+
interface HTMLElementTagNameMap {
|
|
37
|
+
'docks-cognitive-settings-editor': DocksCognitiveSettingsEditor;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=cognitive-settings-editor.d.ts.map
|
|
@@ -0,0 +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;IAiBvB,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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { TemplateResult } from '@eclipse-docks/core/externals/lit';
|
|
2
|
+
import { DocksPart } from '@eclipse-docks/core';
|
|
3
|
+
export declare class DocksCognitiveView extends DocksPart {
|
|
4
|
+
protected scrollMode: 'scroller' | 'native' | 'none';
|
|
5
|
+
static styles: import('lit').CSSResult;
|
|
6
|
+
private textarea?;
|
|
7
|
+
private fileInput?;
|
|
8
|
+
private sessions;
|
|
9
|
+
private focusedId;
|
|
10
|
+
private draft;
|
|
11
|
+
/** Session attachment ids to publish with the next user turn. */
|
|
12
|
+
private pendingAttachmentIds;
|
|
13
|
+
private dragOver;
|
|
14
|
+
private previewAttachmentId;
|
|
15
|
+
private busy;
|
|
16
|
+
private pendingPermission;
|
|
17
|
+
private policyMode;
|
|
18
|
+
private optimizeFor;
|
|
19
|
+
private manualModel;
|
|
20
|
+
private manualEffort;
|
|
21
|
+
private approvalMode;
|
|
22
|
+
private modelIds;
|
|
23
|
+
private streamingParts;
|
|
24
|
+
private historyOpen;
|
|
25
|
+
private historyQuery;
|
|
26
|
+
private unsubs;
|
|
27
|
+
private scrollDebounceTimer?;
|
|
28
|
+
protected doBeforeUI(): void;
|
|
29
|
+
protected doClose(): void;
|
|
30
|
+
private syncSessions;
|
|
31
|
+
private scheduleScrollToBottom;
|
|
32
|
+
private scrollToBottom;
|
|
33
|
+
private focusedSession;
|
|
34
|
+
private deleteSession;
|
|
35
|
+
private openSession;
|
|
36
|
+
private newSession;
|
|
37
|
+
private historySessions;
|
|
38
|
+
private syncModels;
|
|
39
|
+
private effortChoices;
|
|
40
|
+
private routerValue;
|
|
41
|
+
private routerLabel;
|
|
42
|
+
private activeModelRef;
|
|
43
|
+
private contextUsage;
|
|
44
|
+
private compactFocused;
|
|
45
|
+
private onRouterSelect;
|
|
46
|
+
private applyPolicy;
|
|
47
|
+
private clearComposer;
|
|
48
|
+
private sessionAttachments;
|
|
49
|
+
private previewAttachment;
|
|
50
|
+
private openAttachmentPreview;
|
|
51
|
+
private closeAttachmentPreview;
|
|
52
|
+
private removeSessionAttachment;
|
|
53
|
+
private addFiles;
|
|
54
|
+
private openFilePicker;
|
|
55
|
+
private onFileInputChange;
|
|
56
|
+
private onComposerDragOver;
|
|
57
|
+
private onComposerDragLeave;
|
|
58
|
+
private onComposerDrop;
|
|
59
|
+
private send;
|
|
60
|
+
private renderAttachmentDropdown;
|
|
61
|
+
private renderAttachmentDialog;
|
|
62
|
+
private resolvePermission;
|
|
63
|
+
protected renderToolbar(): TemplateResult;
|
|
64
|
+
private contextRingStyle;
|
|
65
|
+
private renderContextDropdown;
|
|
66
|
+
protected renderContent(): TemplateResult<1>;
|
|
67
|
+
private renderTranscript;
|
|
68
|
+
private renderHistoryDropdown;
|
|
69
|
+
private onSettingsSelect;
|
|
70
|
+
private renderSettingsDropdown;
|
|
71
|
+
private resolveAttachmentDataUrl;
|
|
72
|
+
private renderMessage;
|
|
73
|
+
private renderAssistantMessage;
|
|
74
|
+
private renderMessageMeta;
|
|
75
|
+
private renderTextPart;
|
|
76
|
+
private renderTechnicalPart;
|
|
77
|
+
}
|
|
78
|
+
declare global {
|
|
79
|
+
interface HTMLElementTagNameMap {
|
|
80
|
+
'docks-cognitive-view': DocksCognitiveView;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=cognitive-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognitive-view.d.ts","sourceRoot":"","sources":["../../src/view/cognitive-view.ts"],"names":[],"mappings":"AAAA,OAAO,0CAA0C,CAAC;AAClD,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAc,MAAM,qBAAqB,CAAC;AAkC5D,qBACa,kBAAmB,SAAQ,SAAS;IAC/C,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAU;IAE9D,MAAM,CAAC,MAAM,0BA8cX;IAEoB,OAAO,CAAC,QAAQ,CAAC,CAA0C;IACpD,OAAO,CAAC,SAAS,CAAC,CAAmB;IAEzD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAM;IAC5B,iEAAiE;IACxD,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,WAAW,CAAkD;IACrE,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAM;IACnC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,mBAAmB,CAAC,CAAgC;IAE5D,SAAS,CAAC,UAAU,IAAI,IAAI;IAsC5B,SAAS,CAAC,OAAO,IAAI,IAAI;IAOzB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,sBAAsB;YAQhB,cAAc;IAW5B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;YAIN,cAAc;IAM5B,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,WAAW;YAYL,aAAa;IAQ3B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,uBAAuB;YAQjB,QAAQ;IAsCtB,OAAO,CAAC,cAAc;YAIR,iBAAiB;IAM/B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,mBAAmB;YAIb,cAAc;YAMd,IAAI;IAsBlB,OAAO,CAAC,wBAAwB;IA0EhC,OAAO,CAAC,sBAAsB;IAoC9B,OAAO,CAAC,iBAAiB;IAMzB,SAAS,CAAC,aAAa,IAAI,cAAc;IA0BzC,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,qBAAqB;IA2E7B,SAAS,CAAC,aAAa;IAwDvB,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,qBAAqB;IAuF7B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,sBAAsB;IAoG9B,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,sBAAsB;IAmD9B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,mBAAmB;CAuB5B;AAkHD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,kBAAkB,CAAC;KAC5C;CACF"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eclipse-docks/extension-ai-system",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.141",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
|
-
"module": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
6
|
"exports": {
|
|
9
7
|
".": {
|
|
10
8
|
"types": "./dist/index.d.ts",
|
|
@@ -15,19 +13,25 @@
|
|
|
15
13
|
"import": "./dist/api.js"
|
|
16
14
|
}
|
|
17
15
|
},
|
|
18
|
-
"files": [
|
|
19
|
-
"dist"
|
|
20
|
-
],
|
|
21
|
-
"scripts": {
|
|
22
|
-
"build": "vite build"
|
|
23
|
-
},
|
|
24
16
|
"dependencies": {
|
|
25
|
-
"@eclipse-docks/core": "*"
|
|
17
|
+
"@eclipse-docks/core": "*",
|
|
18
|
+
"@opencode-ai/models": "^0.0.122"
|
|
26
19
|
},
|
|
27
20
|
"devDependencies": {
|
|
28
21
|
"typescript": "^6.0.0",
|
|
29
22
|
"vite": "^8.0.0",
|
|
30
|
-
"vite-plugin-dts": "^4.5.4"
|
|
23
|
+
"vite-plugin-dts": "^4.5.4",
|
|
24
|
+
"vitest": "^4.1.4"
|
|
25
|
+
},
|
|
26
|
+
"module": "./dist/index.js",
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "vite build",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest"
|
|
31
35
|
},
|
|
32
36
|
"repository": {
|
|
33
37
|
"type": "git",
|