@eclipse-docks/extension-ai-system 0.7.139 → 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.
Files changed (211) hide show
  1. package/README.md +72 -0
  2. package/dist/api.d.ts +1 -7
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +2 -2
  5. package/dist/cognitive-extension-CG_d39K5.js +2129 -0
  6. package/dist/cognitive-extension-CG_d39K5.js.map +1 -0
  7. package/dist/cognitive-extension.d.ts +1 -0
  8. package/dist/cognitive-extension.d.ts.map +1 -0
  9. package/dist/i18n.de-BrLTiN56.js +11 -0
  10. package/dist/i18n.de-BrLTiN56.js.map +1 -0
  11. package/dist/i18n.en-MkwuLlOD.js +11 -0
  12. package/dist/i18n.en-MkwuLlOD.js.map +1 -0
  13. package/dist/index.js +8 -4
  14. package/dist/index.js.map +1 -1
  15. package/dist/runtime/attachments.d.ts +89 -0
  16. package/dist/runtime/attachments.d.ts.map +1 -0
  17. package/dist/runtime/cognitive-runtime.d.ts +83 -0
  18. package/dist/runtime/cognitive-runtime.d.ts.map +1 -0
  19. package/dist/runtime/compact/compaction.d.ts +29 -0
  20. package/dist/runtime/compact/compaction.d.ts.map +1 -0
  21. package/dist/runtime/constants.d.ts +9 -0
  22. package/dist/runtime/constants.d.ts.map +1 -0
  23. package/dist/runtime/context/usage.d.ts +35 -0
  24. package/dist/runtime/context/usage.d.ts.map +1 -0
  25. package/dist/runtime/core/index.d.ts +4 -0
  26. package/dist/runtime/core/index.d.ts.map +1 -0
  27. package/dist/runtime/core/needs.d.ts +5 -0
  28. package/dist/runtime/core/needs.d.ts.map +1 -0
  29. package/dist/runtime/core/plutchik.d.ts +8 -0
  30. package/dist/runtime/core/plutchik.d.ts.map +1 -0
  31. package/dist/runtime/core/tick.d.ts +23 -0
  32. package/dist/runtime/core/tick.d.ts.map +1 -0
  33. package/dist/runtime/events.d.ts +21 -0
  34. package/dist/runtime/events.d.ts.map +1 -0
  35. package/dist/runtime/index.d.ts +14 -0
  36. package/dist/runtime/index.d.ts.map +1 -0
  37. package/dist/runtime/memory/index.d.ts +2 -0
  38. package/dist/runtime/memory/index.d.ts.map +1 -0
  39. package/dist/runtime/memory/store.d.ts +27 -0
  40. package/dist/runtime/memory/store.d.ts.map +1 -0
  41. package/dist/runtime/models/effort-support.d.ts +31 -0
  42. package/dist/runtime/models/effort-support.d.ts.map +1 -0
  43. package/dist/runtime/models/index.d.ts +7 -0
  44. package/dist/runtime/models/index.d.ts.map +1 -0
  45. package/dist/runtime/models/openai-compatible.d.ts +39 -0
  46. package/dist/runtime/models/openai-compatible.d.ts.map +1 -0
  47. package/dist/runtime/models/provider-config.d.ts +23 -0
  48. package/dist/runtime/models/provider-config.d.ts.map +1 -0
  49. package/dist/runtime/models/provider-registry.d.ts +16 -0
  50. package/dist/runtime/models/provider-registry.d.ts.map +1 -0
  51. package/dist/runtime/models/router.d.ts +12 -0
  52. package/dist/runtime/models/router.d.ts.map +1 -0
  53. package/dist/runtime/models/types.d.ts +88 -0
  54. package/dist/runtime/models/types.d.ts.map +1 -0
  55. package/dist/runtime/session/index.d.ts +2 -0
  56. package/dist/runtime/session/index.d.ts.map +1 -0
  57. package/dist/runtime/session/session-runtime.d.ts +48 -0
  58. package/dist/runtime/session/session-runtime.d.ts.map +1 -0
  59. package/dist/runtime/specialists/classify-risk.d.ts +15 -0
  60. package/dist/runtime/specialists/classify-risk.d.ts.map +1 -0
  61. package/dist/runtime/specialists/index.d.ts +12 -0
  62. package/dist/runtime/specialists/index.d.ts.map +1 -0
  63. package/dist/runtime/specialists/loop.d.ts +25 -0
  64. package/dist/runtime/specialists/loop.d.ts.map +1 -0
  65. package/dist/runtime/tools/attachment-adapter.d.ts +6 -0
  66. package/dist/runtime/tools/attachment-adapter.d.ts.map +1 -0
  67. package/dist/runtime/tools/broker.d.ts +52 -0
  68. package/dist/runtime/tools/broker.d.ts.map +1 -0
  69. package/dist/runtime/tools/command-adapter.d.ts +5 -0
  70. package/dist/runtime/tools/command-adapter.d.ts.map +1 -0
  71. package/dist/runtime/tools/index.d.ts +5 -0
  72. package/dist/runtime/tools/index.d.ts.map +1 -0
  73. package/dist/runtime/tools/workspace-adapter.d.ts +4 -0
  74. package/dist/runtime/tools/workspace-adapter.d.ts.map +1 -0
  75. package/dist/runtime/types.d.ts +145 -0
  76. package/dist/runtime/types.d.ts.map +1 -0
  77. package/dist/runtime-DfNGzEjU.js +2952 -0
  78. package/dist/runtime-DfNGzEjU.js.map +1 -0
  79. package/dist/view/cognitive-settings-editor.d.ts +40 -0
  80. package/dist/view/cognitive-settings-editor.d.ts.map +1 -0
  81. package/dist/view/cognitive-view.d.ts +83 -0
  82. package/dist/view/cognitive-view.d.ts.map +1 -0
  83. package/package.json +15 -11
  84. package/dist/agents/agent-registry.d.ts +0 -8
  85. package/dist/agents/agent-registry.d.ts.map +0 -1
  86. package/dist/agents/index.d.ts +0 -6
  87. package/dist/agents/index.d.ts.map +0 -1
  88. package/dist/agents/message-processor.d.ts +0 -9
  89. package/dist/agents/message-processor.d.ts.map +0 -1
  90. package/dist/agents/orchestrator.d.ts +0 -12
  91. package/dist/agents/orchestrator.d.ts.map +0 -1
  92. package/dist/agents/prompt-builder.d.ts +0 -21
  93. package/dist/agents/prompt-builder.d.ts.map +0 -1
  94. package/dist/agents/reviewer.d.ts +0 -15
  95. package/dist/agents/reviewer.d.ts.map +0 -1
  96. package/dist/ai-service-Cmafte5S.js +0 -1866
  97. package/dist/ai-service-Cmafte5S.js.map +0 -1
  98. package/dist/ai-system-extension-CsfSiwNJ.js +0 -2324
  99. package/dist/ai-system-extension-CsfSiwNJ.js.map +0 -1
  100. package/dist/ai-system-extension.d.ts +0 -1
  101. package/dist/ai-system-extension.d.ts.map +0 -1
  102. package/dist/chat-provider-contributions.d.ts +0 -2
  103. package/dist/chat-provider-contributions.d.ts.map +0 -1
  104. package/dist/core/constants.d.ts +0 -21
  105. package/dist/core/constants.d.ts.map +0 -1
  106. package/dist/core/index.d.ts +0 -4
  107. package/dist/core/index.d.ts.map +0 -1
  108. package/dist/core/interfaces.d.ts +0 -138
  109. package/dist/core/interfaces.d.ts.map +0 -1
  110. package/dist/core/message-utils.d.ts +0 -4
  111. package/dist/core/message-utils.d.ts.map +0 -1
  112. package/dist/core/types.d.ts +0 -128
  113. package/dist/core/types.d.ts.map +0 -1
  114. package/dist/prompt-enhancer-contributions.d.ts +0 -2
  115. package/dist/prompt-enhancer-contributions.d.ts.map +0 -1
  116. package/dist/providers/base-provider.d.ts +0 -15
  117. package/dist/providers/base-provider.d.ts.map +0 -1
  118. package/dist/providers/index.d.ts +0 -9
  119. package/dist/providers/index.d.ts.map +0 -1
  120. package/dist/providers/ollama-provider.d.ts +0 -7
  121. package/dist/providers/ollama-provider.d.ts.map +0 -1
  122. package/dist/providers/openai-provider.d.ts +0 -7
  123. package/dist/providers/openai-provider.d.ts.map +0 -1
  124. package/dist/providers/provider-factory.d.ts +0 -10
  125. package/dist/providers/provider-factory.d.ts.map +0 -1
  126. package/dist/providers/provider-utils.d.ts +0 -5
  127. package/dist/providers/provider-utils.d.ts.map +0 -1
  128. package/dist/providers/streaming/ollama-parser.d.ts +0 -9
  129. package/dist/providers/streaming/ollama-parser.d.ts.map +0 -1
  130. package/dist/providers/streaming/sse-parser.d.ts +0 -10
  131. package/dist/providers/streaming/sse-parser.d.ts.map +0 -1
  132. package/dist/providers/streaming/stream-parser.d.ts +0 -10
  133. package/dist/providers/streaming/stream-parser.d.ts.map +0 -1
  134. package/dist/service/ai-service.d.ts +0 -47
  135. package/dist/service/ai-service.d.ts.map +0 -1
  136. package/dist/service/token-usage-tracker.d.ts +0 -16
  137. package/dist/service/token-usage-tracker.d.ts.map +0 -1
  138. package/dist/task/task-checkpoint.d.ts +0 -12
  139. package/dist/task/task-checkpoint.d.ts.map +0 -1
  140. package/dist/task/task-plan.d.ts +0 -7
  141. package/dist/task/task-plan.d.ts.map +0 -1
  142. package/dist/task/task-runner.d.ts +0 -10
  143. package/dist/task/task-runner.d.ts.map +0 -1
  144. package/dist/tools/index.d.ts +0 -6
  145. package/dist/tools/index.d.ts.map +0 -1
  146. package/dist/tools/token-estimator.d.ts +0 -12
  147. package/dist/tools/token-estimator.d.ts.map +0 -1
  148. package/dist/tools/tool-call-accumulator.d.ts +0 -9
  149. package/dist/tools/tool-call-accumulator.d.ts.map +0 -1
  150. package/dist/tools/tool-executor.d.ts +0 -13
  151. package/dist/tools/tool-executor.d.ts.map +0 -1
  152. package/dist/tools/tool-name-utils.d.ts +0 -2
  153. package/dist/tools/tool-name-utils.d.ts.map +0 -1
  154. package/dist/tools/tool-registry.d.ts +0 -7
  155. package/dist/tools/tool-registry.d.ts.map +0 -1
  156. package/dist/utils/token-estimator.d.ts +0 -2
  157. package/dist/utils/token-estimator.d.ts.map +0 -1
  158. package/dist/utils/tool-detector.d.ts +0 -10
  159. package/dist/utils/tool-detector.d.ts.map +0 -1
  160. package/dist/view/agent-group-manager.d.ts +0 -37
  161. package/dist/view/agent-group-manager.d.ts.map +0 -1
  162. package/dist/view/aiview.d.ts +0 -42
  163. package/dist/view/aiview.d.ts.map +0 -1
  164. package/dist/view/components/ai-agent-response-group.d.ts +0 -18
  165. package/dist/view/components/ai-agent-response-group.d.ts.map +0 -1
  166. package/dist/view/components/ai-chat-input.d.ts +0 -20
  167. package/dist/view/components/ai-chat-input.d.ts.map +0 -1
  168. package/dist/view/components/ai-chat-message.d.ts +0 -22
  169. package/dist/view/components/ai-chat-message.d.ts.map +0 -1
  170. package/dist/view/components/ai-config-editor.d.ts +0 -33
  171. package/dist/view/components/ai-config-editor.d.ts.map +0 -1
  172. package/dist/view/components/ai-empty-state.d.ts +0 -13
  173. package/dist/view/components/ai-empty-state.d.ts.map +0 -1
  174. package/dist/view/components/ai-tool-approval.d.ts +0 -26
  175. package/dist/view/components/ai-tool-approval.d.ts.map +0 -1
  176. package/dist/view/components/index.d.ts +0 -7
  177. package/dist/view/components/index.d.ts.map +0 -1
  178. package/dist/view/provider-manager.d.ts +0 -30
  179. package/dist/view/provider-manager.d.ts.map +0 -1
  180. package/dist/view/session-manager.d.ts +0 -25
  181. package/dist/view/session-manager.d.ts.map +0 -1
  182. package/dist/view/stream-manager.d.ts +0 -23
  183. package/dist/view/stream-manager.d.ts.map +0 -1
  184. package/dist/view/task-progress-panel.d.ts +0 -14
  185. package/dist/view/task-progress-panel.d.ts.map +0 -1
  186. package/dist/view/token-usage.d.ts +0 -18
  187. package/dist/view/token-usage.d.ts.map +0 -1
  188. package/dist/view/workspace-panel.d.ts +0 -15
  189. package/dist/view/workspace-panel.d.ts.map +0 -1
  190. package/dist/workflows/base-sequential-workflow.d.ts +0 -13
  191. package/dist/workflows/base-sequential-workflow.d.ts.map +0 -1
  192. package/dist/workflows/conditional-workflow.d.ts +0 -7
  193. package/dist/workflows/conditional-workflow.d.ts.map +0 -1
  194. package/dist/workflows/index.d.ts +0 -10
  195. package/dist/workflows/index.d.ts.map +0 -1
  196. package/dist/workflows/orchestrated-workflow.d.ts +0 -10
  197. package/dist/workflows/orchestrated-workflow.d.ts.map +0 -1
  198. package/dist/workflows/parallel-workflow.d.ts +0 -6
  199. package/dist/workflows/parallel-workflow.d.ts.map +0 -1
  200. package/dist/workflows/pipeline-workflow.d.ts +0 -7
  201. package/dist/workflows/pipeline-workflow.d.ts.map +0 -1
  202. package/dist/workflows/review-workflow.d.ts +0 -10
  203. package/dist/workflows/review-workflow.d.ts.map +0 -1
  204. package/dist/workflows/sequential-workflow.d.ts +0 -7
  205. package/dist/workflows/sequential-workflow.d.ts.map +0 -1
  206. package/dist/workflows/workflow-engine.d.ts +0 -8
  207. package/dist/workflows/workflow-engine.d.ts.map +0 -1
  208. package/dist/workflows/workflow-strategy.d.ts +0 -8
  209. package/dist/workflows/workflow-strategy.d.ts.map +0 -1
  210. package/dist/workspace/workspace.d.ts +0 -20
  211. package/dist/workspace/workspace.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-system-extension-CsfSiwNJ.js","names":["globalCommandRegistry","GENERAL_SYS_PROMPT"],"sources":["../src/chat-provider-contributions.ts","../src/prompt-enhancer-contributions.ts","../src/view/session-manager.ts","../src/view/stream-manager.ts","../src/view/provider-manager.ts","../src/view/agent-group-manager.ts","../src/view/components/ai-chat-message.ts","../src/view/components/ai-chat-input.ts","../src/view/components/ai-agent-response-group.ts","../src/view/components/ai-tool-approval.ts","../src/view/components/ai-empty-state.ts","../src/view/task-progress-panel.ts","../src/view/workspace-panel.ts","../src/view/aiview.ts","../src/view/token-usage.ts","../src/view/components/ai-config-editor.ts","../src/ai-system-extension.ts"],"sourcesContent":["import { contributionRegistry } from '@eclipse-docks/core';\nimport { CID_CHAT_PROVIDERS } from './core/constants';\nimport type { ChatProviderContribution } from './core/interfaces';\n\nconst providers: Array<{ label: string; name: string; model: string; chatApiEndpoint: string; apiKey: string; parameters?: Record<string, any> }> = [\n { label: 'Ollama (Local)', name: 'ollama', model: 'gemma3:12b', chatApiEndpoint: 'https://<your-server>/v1/chat/completions', apiKey: '' },\n { label: 'OpenWebUI (Self Hosted)', name: 'openwebui', model: 'gemma3:12b', chatApiEndpoint: 'https://<your-server>/api/v1/chat/completion', apiKey: '' },\n { label: 'OpenAI', name: 'openai', model: 'gpt-4.1', chatApiEndpoint: 'https://api.openai.com/v1/chat/completions', apiKey: '<your api key>' },\n { label: 'Groq', name: 'groq', model: 'llama-3.1-8b-instant', chatApiEndpoint: 'https://api.groq.com/openai/v1/chat/completions', apiKey: '<your api key>' },\n { label: 'Cerebras', name: 'cerebras', model: 'llama3.1-8b', chatApiEndpoint: 'https://api.cerebras.ai/v1/chat/completions', apiKey: '<your api key>' },\n { label: 'WebLLM', name: 'webllm', model: 'gemma-2-9b-it-q4f16_1-MLC', chatApiEndpoint: '', apiKey: '', parameters: { context_window_size: 4096 } },\n { label: 'Mistral', name: 'mistral', model: 'mistral-large-latest', chatApiEndpoint: 'https://api.mistral.ai/v1/chat/completions', apiKey: '<your api key>' },\n { label: 'LiteLLM', name: 'litellm', model: 'gpt-3.5-turbo', chatApiEndpoint: 'https://<your-server>/v1/chat/completions', apiKey: '<your api key>' },\n];\n\nfor (const { label, ...provider } of providers) {\n contributionRegistry.registerContribution<ChatProviderContribution>(CID_CHAT_PROVIDERS, {\n target: CID_CHAT_PROVIDERS,\n label,\n provider\n });\n}\n","import { contributionRegistry, workspaceService, editorRegistry } from '@eclipse-docks/core';\nimport type { ExecutionContext } from '@eclipse-docks/core';\nimport { CID_PROMPT_ENHANCERS } from './core/constants';\nimport type { PromptEnhancer, PromptEnhancerContribution } from './core/interfaces';\n\nconst appStateEnhancer: PromptEnhancer = {\n priority: 20,\n enhance: async (prompt: string, _context: ExecutionContext) => {\n try {\n const workspace = await workspaceService.getWorkspace();\n const activeEditor = editorRegistry.getEditorArea()?.getActiveEditor();\n const appState = {\n workspace: workspace?.getName() || null,\n activeEditor: activeEditor ? {\n title: (activeEditor as any).input?.title || null,\n editorId: (activeEditor as any).input?.editorId || null\n } : null\n };\n return `${prompt}\\n\\n***App's state:***\\n${JSON.stringify(appState, null, 2)}`;\n } catch {\n return prompt;\n }\n }\n};\n\ncontributionRegistry.registerContribution(CID_PROMPT_ENHANCERS, {\n label: 'App State Enhancer',\n enhancer: appStateEnhancer\n} as PromptEnhancerContribution);\n","import { appSettings } from \"@eclipse-docks/core\";\nimport type { ChatMessage } from \"../core/types\";\n\nexport interface Session {\n id: string;\n history: ChatMessage[];\n title: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport class SessionManager {\n private activeSession: Session | null = null;\n private pastSessions: Session[] = [];\n\n async load(): Promise<void> {\n const saved = await appSettings.get('aiChatSessions') as any;\n if (!saved) return;\n\n if (saved.active && Array.isArray(saved.history)) {\n this.activeSession = saved.active;\n } else if (saved.activeSessionId && Array.isArray(saved.sessions)) {\n this.activeSession = saved.sessions.find((s: Session) => s.id === saved.activeSessionId) || null;\n this.pastSessions = saved.sessions.filter((s: Session) => s.id !== saved.activeSessionId);\n } else if (Array.isArray(saved.all)) {\n const [first, ...rest] = (saved.all as Session[]).sort((a, b) => b.updatedAt - a.updatedAt);\n this.activeSession = first || null;\n this.pastSessions = rest;\n }\n }\n\n async persist(): Promise<void> {\n const all: Session[] = [];\n if (this.activeSession) all.push(this.activeSession);\n all.push(...this.pastSessions);\n\n await appSettings.set('aiChatSessions', {\n all,\n activeSessionId: this.activeSession?.id || null\n });\n }\n\n createSession(): Session {\n const session: Session = {\n id: `session-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n history: [],\n title: 'New Chat',\n createdAt: Date.now(),\n updatedAt: Date.now()\n };\n if (this.activeSession) {\n this.pastSessions.unshift(this.activeSession);\n }\n this.activeSession = session;\n this.persist();\n return session;\n }\n\n getActiveSession(): Session | null {\n return this.activeSession;\n }\n\n getActiveSessionId(): string {\n return this.activeSession?.id || '';\n }\n\n switchToSession(sessionId: string): boolean {\n if (this.activeSession?.id === sessionId) return true;\n\n const idx = this.pastSessions.findIndex(s => s.id === sessionId);\n if (idx === -1) return false;\n\n const [target] = this.pastSessions.splice(idx, 1);\n if (!target) return false;\n\n if (this.activeSession) this.pastSessions.unshift(this.activeSession);\n this.activeSession = target;\n\n this.persist();\n return true;\n }\n\n getPastSessions(): Session[] {\n return this.pastSessions;\n }\n\n deletePastSession(sessionId: string): boolean {\n const idx = this.pastSessions.findIndex(s => s.id === sessionId);\n if (idx === -1) return false;\n this.pastSessions.splice(idx, 1);\n this.persist();\n return true;\n }\n\n addMessage(message: ChatMessage): void {\n if (!this.activeSession) return;\n this.activeSession.history.push(message);\n this.activeSession.updatedAt = Date.now();\n this.persist();\n }\n\n setTitle(title: string): void {\n if (!this.activeSession) return;\n this.activeSession.title = title;\n this.persist();\n }\n\n generateTitle(prompt: string): string {\n const trimmed = prompt.trim();\n if (!trimmed) return 'New Chat';\n return trimmed.length <= 30 ? trimmed : trimmed.substring(0, 30).trim() + '...';\n }\n\n deleteActiveAndSwitchToFirst(): void {\n if (!this.activeSession) return;\n this.activeSession = this.pastSessions.shift() || null;\n if (!this.activeSession) {\n this.createSession();\n }\n this.persist();\n }\n}\n","import type { ChatMessage } from \"../core/types\";\n\nexport interface StreamingMessage {\n message: ChatMessage;\n isStreaming: boolean;\n}\n\nexport class StreamManager {\n private streamingMessages = new Map<number, StreamingMessage>();\n private currentIndex = -1;\n private rafHandle?: number;\n private pendingUpdate = false;\n private onUpdate?: () => void;\n\n constructor(onUpdate?: () => void) {\n this.onUpdate = onUpdate;\n }\n\n createStreamingMessage(role: string): number {\n const index = ++this.currentIndex;\n this.streamingMessages.set(index, { message: { role, content: '' }, isStreaming: true });\n return index;\n }\n\n updateStreamingMessage(index: number, token: string): void {\n const msg = this.streamingMessages.get(index);\n if (!msg) return;\n msg.message.content += token;\n this.scheduleUpdate();\n }\n\n completeStreamingMessage(index: number, message: ChatMessage): void {\n const msg = this.streamingMessages.get(index);\n if (!msg) return;\n msg.message = message;\n msg.isStreaming = false;\n }\n\n removeStreamingMessage(index: number): void {\n this.streamingMessages.delete(index);\n }\n\n findStreamingMessage(role: string): ChatMessage | undefined {\n return Array.from(this.streamingMessages.values()).find(m => m.message.role === role)?.message;\n }\n\n getAllStreamingMessages(): StreamingMessage[] {\n return Array.from(this.streamingMessages.values());\n }\n\n scheduleUpdate(): void {\n if (this.pendingUpdate) return;\n this.pendingUpdate = true;\n this.rafHandle = requestAnimationFrame(() => {\n this.pendingUpdate = false;\n this.onUpdate?.();\n });\n }\n\n cancelUpdates(): void {\n if (this.rafHandle !== undefined) {\n cancelAnimationFrame(this.rafHandle);\n this.rafHandle = undefined;\n this.pendingUpdate = false;\n }\n }\n\n reset(): void {\n this.streamingMessages.clear();\n this.cancelUpdates();\n this.currentIndex = -1;\n }\n}\n","import { appSettings } from \"@eclipse-docks/core\";\nimport type { ChatProvider } from \"../core/types\";\nimport type { AIService } from \"../service/ai-service\";\nimport { KEY_AI_CONFIG } from \"../core/constants\";\nimport { ProviderFactory } from \"../providers/provider-factory\";\n\nexport interface AIViewSettings {\n requireToolApproval?: boolean;\n toolApprovalAllowlist?: string[];\n}\n\nexport interface ModelInfo {\n id: string;\n name?: string;\n}\n\nconst VIEW_SETTINGS_KEY = 'aiViewChat';\n\nexport class ProviderManager {\n private providers: ChatProvider[] = [];\n private selectedProvider?: ChatProvider;\n private availableModels: ModelInfo[] = [];\n private loadingModels = false;\n\n private providerFactory = new ProviderFactory();\n\n constructor(private aiService: AIService) {}\n\n async initialize(): Promise<void> {\n this.providers = await this.aiService.getProviders() || [];\n const defaultProvider = await this.aiService.getDefaultProvider();\n if (defaultProvider) {\n this.selectedProvider = defaultProvider;\n }\n }\n\n getProviders(): ChatProvider[] { return this.providers; }\n getSelectedProvider(): ChatProvider | undefined { return this.selectedProvider; }\n setSelectedProvider(provider: ChatProvider): void { this.selectedProvider = provider; }\n getAvailableModels(): ModelInfo[] { return this.availableModels; }\n isLoadingModels(): boolean { return this.loadingModels; }\n\n async saveSettings(providerName: string, model: string, apiKey?: string, requireToolApproval?: boolean, toolApprovalAllowlist?: string[]): Promise<void> {\n const current: AIViewSettings = await appSettings.get(VIEW_SETTINGS_KEY) || {};\n const settings: AIViewSettings = { ...current };\n if (requireToolApproval !== undefined) settings.requireToolApproval = requireToolApproval;\n if (toolApprovalAllowlist !== undefined) settings.toolApprovalAllowlist = toolApprovalAllowlist;\n await appSettings.set(VIEW_SETTINGS_KEY, settings);\n\n const provider = this.providers.find(p => p.name === providerName);\n if (provider) {\n const updated = { ...provider, model, ...(apiKey !== undefined && { apiKey }) };\n this.selectedProvider = updated;\n await this.updateProviderInAIConfig(providerName, { model, ...(apiKey !== undefined && { apiKey }) });\n await this.aiService.setDefaultProvider(providerName);\n }\n }\n\n private async updateProviderInAIConfig(providerName: string, updates: { model?: string; apiKey?: string }): Promise<void> {\n const aiConfig = await appSettings.get(KEY_AI_CONFIG) || {};\n if (!aiConfig.providers || !Array.isArray(aiConfig.providers)) return;\n const idx = aiConfig.providers.findIndex((p: any) => p.name === providerName);\n if (idx >= 0) {\n aiConfig.providers[idx] = { ...aiConfig.providers[idx], ...updates };\n await appSettings.set(KEY_AI_CONFIG, aiConfig);\n }\n }\n\n async loadToolApprovalAllowlist(): Promise<string[]> {\n const settings: AIViewSettings = await appSettings.get(VIEW_SETTINGS_KEY) || {};\n return settings.toolApprovalAllowlist || [];\n }\n\n async fetchModels(providerName: string): Promise<void> {\n const provider = this.providers.find(p => p.name === providerName);\n if (!provider) return;\n\n this.loadingModels = true;\n this.availableModels = [];\n\n try {\n const baseProvider = this.providerFactory.getProvider(provider);\n this.availableModels = await baseProvider.getAvailableModels?.(provider) ?? [];\n } finally {\n this.loadingModels = false;\n }\n }\n}\n","import type { ChatMessage } from \"../core/types\";\n\nexport interface AgentResponseInfo {\n role: string;\n label: string;\n icon: string;\n status: 'streaming' | 'completed' | 'error';\n message?: ChatMessage;\n messageIndex?: number;\n}\n\nexport interface AgentResponseGroup {\n id: string;\n sessionId: string;\n userMessageIndex: number;\n userMessage: ChatMessage;\n timestamp: Date;\n agents: Map<string, AgentResponseInfo>;\n messageIndices: Map<string, number>;\n}\n\nexport class AgentGroupManager {\n private groups = new Map<string, AgentResponseGroup>();\n private currentGroupId?: string;\n\n createGroup(\n sessionId: string,\n userMessageIndex: number,\n userMessage: ChatMessage,\n roles: string[],\n getAgentMetadata: (role: string) => { label: string; icon: string }\n ): string {\n const groupId = `group-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n this.currentGroupId = groupId;\n\n const group: AgentResponseGroup = {\n id: groupId,\n sessionId,\n userMessageIndex,\n userMessage,\n timestamp: new Date(),\n agents: new Map(),\n messageIndices: new Map()\n };\n\n roles.forEach(role => {\n const { label, icon } = getAgentMetadata(role);\n group.agents.set(role, { role, label, icon, status: 'streaming' });\n });\n\n this.groups.set(groupId, group);\n return groupId;\n }\n\n getGroup(groupId: string): AgentResponseGroup | undefined {\n return this.groups.get(groupId);\n }\n\n updateAgentStatus(groupId: string, role: string, status: AgentResponseInfo['status'], message?: ChatMessage, messageIndex?: number): void {\n const group = this.groups.get(groupId);\n if (!group) return;\n const agentInfo = group.agents.get(role);\n if (!agentInfo) return;\n agentInfo.status = status;\n if (message) agentInfo.message = message;\n if (messageIndex !== undefined) {\n agentInfo.messageIndex = messageIndex;\n group.messageIndices.set(role, messageIndex);\n }\n }\n\n getGroupsForSession(sessionId: string): AgentResponseGroup[] {\n return Array.from(this.groups.values()).filter(g => g.sessionId === sessionId);\n }\n\n findGroupForUserMessage(sessionId: string, userMessageIndex: number, userMessage: ChatMessage): AgentResponseGroup | undefined {\n return Array.from(this.groups.values()).find(\n g => g.sessionId === sessionId && g.userMessageIndex === userMessageIndex && g.userMessage === userMessage\n );\n }\n\n findGroupForMessage(sessionId: string, messageRole: string, messageIndex: number): AgentResponseGroup | undefined {\n return Array.from(this.groups.values()).find(\n g => g.sessionId === sessionId && g.messageIndices.get(messageRole) === messageIndex\n );\n }\n\n getCurrentGroupId(): string | undefined { return this.currentGroupId; }\n setCurrentGroupId(groupId: string | undefined): void { this.currentGroupId = groupId; }\n clearCurrentGroup(): void { this.currentGroupId = undefined; }\n getAllGroups(): AgentResponseGroup[] { return Array.from(this.groups.values()); }\n\n clearAll(): void {\n this.groups.clear();\n this.currentGroupId = undefined;\n }\n}\n","import { css, customElement, html, LitElement, property, unsafeHTML, when } from '@eclipse-docks/core/externals/lit';\nimport { parseMarkdownHtml } from '@eclipse-docks/core';\nimport type { ChatMessage } from '../../core/types';\n\n@customElement('docks-ai-chat-message')\nexport class AIChatMessage extends LitElement {\n @property({ type: Object, attribute: false })\n public message?: ChatMessage;\n\n @property({ type: Boolean })\n public isStreaming = false;\n\n @property({ type: Boolean })\n public showHeader = true;\n\n @property({ type: Number, attribute: false })\n public messageIndex?: number;\n\n protected updated(_changedProperties: Map<PropertyKey, unknown>) {\n super.updated(_changedProperties);\n if (_changedProperties.has('message') || !this.hasAttribute('data-is-user')) {\n this.updateAlignment();\n }\n }\n\n private updateAlignment() {\n if (this.message) {\n this.setAttribute('data-is-user', String(this.message.role === 'user'));\n }\n }\n\n private copyToClipboard(text: string) {\n navigator.clipboard.writeText(text).catch(err => console.error('Failed to copy:', err));\n }\n\n private processMarkdownContent(markdownHtml: string): string {\n if (markdownHtml.includes('code-blocwrapper')) return markdownHtml;\n return markdownHtml.replace(/<pre><code([^>]*)>([\\s\\S]*?)<\\/code><\\/pre>/gi, (_, attrs, codeText) => `\n <div class=\"code-blocwrapper\">\n <div class=\"code-blocheader\">\n <wa-copy-button value=\"${this.escapeHtmlAttribute(codeText.trim())}\" size=\"s\" label=\"Copy code\"></wa-copy-button>\n </div>\n <div class=\"code-bloccontent\">\n <pre><code${attrs}>${codeText}</code></pre>\n </div>\n </div>`);\n }\n\n private escapeHtmlAttribute(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n }\n\n private handleResend(e?: Event) {\n e?.preventDefault();\n e?.stopPropagation();\n if (!this.message) return;\n this.dispatchEvent(new CustomEvent('resend', {\n detail: { message: this.message, messageIndex: this.messageIndex },\n bubbles: true, composed: true\n }));\n }\n\n render() {\n if (!this.message) return html``;\n\n const message = this.message;\n const isUser = message.role === 'user';\n\n return html`\n <div class=\"message-wrapper ${isUser ? 'user' : 'assistant'} ${this.isStreaming ? 'streaming' : ''}\">\n ${when(this.showHeader && !isUser, () => html`\n <div class=\"message-header\">\n <div class=\"message-meta\">\n <wa-icon name=\"robot\" label=\"${message.role}\"></wa-icon>\n <span class=\"role-name\">${message.role}</span>\n </div>\n <div class=\"message-actions\">\n <wa-button variant=\"neutral\" appearance=\"plain\" size=\"s\" title=\"Copy\"\n @click=\"${() => this.copyToClipboard(message.content)}\">\n <wa-icon slot=\"label\" name=\"copy\" label=\"Copy\"></wa-icon>\n </wa-button>\n </div>\n </div>\n `)}\n <div class=\"message-content-wrapper ${isUser ? 'user' : ''}\">\n <div class=\"message-content\">\n ${unsafeHTML(this.processMarkdownContent(parseMarkdownHtml(message.content || '')))}\n ${when(this.isStreaming, () => html`<span class=\"streaming-cursor\">▋</span>`)}\n </div>\n ${when(isUser, () => html`\n <wa-button variant=\"neutral\" appearance=\"plain\" size=\"s\" title=\"Copy\"\n @click=\"${() => this.copyToClipboard(message.content)}\">\n <wa-icon name=\"copy\" label=\"Copy\"></wa-icon>\n </wa-button>\n <wa-button variant=\"neutral\" appearance=\"plain\" size=\"s\" title=\"Resend\"\n @click=\"${(e: Event) => this.handleResend(e)}\">\n <wa-icon name=\"rotate-right\" label=\"Resend\"></wa-icon>\n </wa-button>\n `)}\n </div>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 85%;\n box-sizing: border-box;\n animation: slideIn 0.2s ease-out;\n }\n\n :host([data-is-user=\"true\"]) { align-self: flex-end; }\n :host([data-is-user=\"false\"]) { align-self: flex-start; }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .message-wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n box-sizing: border-box;\n }\n\n .message-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n padding: 0 0.5rem;\n }\n\n .message-meta {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n color: var(--wa-color-text-quiet);\n }\n\n .role-name { text-transform: capitalize; }\n\n .message-actions {\n display: flex;\n gap: 0.25rem;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .message-wrapper:hover .message-actions,\n :host:hover .message-actions { opacity: 1; }\n\n .message-content-wrapper {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n width: 100%;\n }\n\n .message-content-wrapper.user {\n flex-direction: row;\n align-items: center;\n }\n\n .message-content {\n padding: 0.5rem 0.75rem;\n border-radius: 0.25rem;\n background-color: var(--wa-color-surface-default);\n word-break: breaword;\n overflow-wrap: breaword;\n max-width: 100%;\n box-sizing: border-box;\n line-height: 1.3;\n font-size: 0.9rem;\n }\n\n .message-content-wrapper.user .message-content {\n padding: 0.0625rem 0.75rem;\n background-color: var(--wa-color-brand-fill-quiet);\n color: var(--wa-color-text-normal);\n line-height: 1.4;\n flex: 1;\n }\n\n .message-content p { margin: 0; padding: 0; }\n .message-content ul, .message-content ol { margin: 0.25rem 0; padding-left: 1.25rem; }\n .message-content li { margin: 0.125rem 0; padding: 0; line-height: 1.3; }\n .message-content :first-child { margin-top: 0; padding-top: 0; }\n .message-content :last-child { margin-bottom: 0; padding-bottom: 0; }\n\n .message-content pre {\n white-space: pre-wrap;\n word-break: breaall;\n max-width: 100%;\n box-sizing: border-box;\n overflow-x: auto;\n margin: 0;\n }\n\n .message-content code {\n font-family: 'Courier New', monospace;\n background-color: var(--wa-color-surface-lowered);\n padding: 0.125rem 0.25rem;\n border-radius: 0.125rem;\n }\n\n .message-content pre code { background-color: transparent; padding: 0; display: block; }\n\n .code-blocwrapper {\n margin: 0.75rem 0;\n border: solid var(--wa-border-width-s) var(--wa-color-neutral-border-loud);\n border-radius: var(--wa-border-radius-m);\n background-color: var(--wa-color-surface-lowered);\n overflow: hidden;\n }\n\n .code-blocheader {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n padding: 0.375rem 0.5rem;\n border-bottom: solid var(--wa-border-width-s) var(--wa-color-neutral-border-loud);\n background-color: var(--wa-color-surface-default);\n }\n\n .code-bloccontent { padding: 0.75rem; overflow-x: auto; }\n .code-bloccontent pre { margin: 0; background-color: transparent; }\n .code-bloccontent code { background-color: transparent; padding: 0; }\n\n .streaming-cursor {\n display: inline-block;\n animation: blink 1s infinite;\n color: var(--wa-color-brand-50);\n }\n\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-chat-message': AIChatMessage;\n }\n}\n","import { css, customElement, html, LitElement, property, query, when } from '@eclipse-docks/core/externals/lit';\n\n@customElement('docks-ai-chat-input')\nexport class AIChatInput extends LitElement {\n @property({ type: String }) public value = '';\n @property({ type: Boolean }) public disabled = false;\n @property({ type: Boolean }) public busy = false;\n @property({ type: Boolean }) public hasProvider = true;\n\n @query('wa-textarea') private textareaElement?: any;\n\n private onInput(event: Event) {\n this.value = (event.target as any).value;\n this.dispatchEvent(new CustomEvent('input-change', { detail: { value: this.value }, bubbles: true, composed: true }));\n }\n\n private onKeyDown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.send();\n }\n }\n\n private async send() {\n if (!this.value.trim() || this.disabled || !this.hasProvider) return;\n const messageValue = this.value;\n this.value = '';\n this.requestUpdate();\n await this.updateComplete;\n if (this.textareaElement) {\n this.textareaElement.value = '';\n this.textareaElement.focus();\n }\n this.dispatchEvent(new CustomEvent('send', { detail: { value: messageValue }, bubbles: true, composed: true }));\n }\n\n private cancel() {\n this.dispatchEvent(new CustomEvent('cancel', { bubbles: true, composed: true }));\n }\n\n render() {\n return html`\n <div class=\"input-container\">\n <div class=\"input-row\">\n <wa-textarea\n placeholder=\"Type a message... (Enter to send, Shift+Enter for new line)\"\n size=\"s\"\n resize=\"auto\"\n rows=\"1\"\n .value=\"${this.value}\"\n ?disabled=\"${this.disabled || !this.hasProvider}\"\n @input=\"${this.onInput}\"\n @keydown=\"${this.onKeyDown}\">\n </wa-textarea>\n ${when(this.busy, () => html`\n <wa-button appearance=\"plain\" size=\"s\" @click=\"${this.cancel}\">\n <wa-icon name=\"stop\" label=\"Stop\"></wa-icon>\n </wa-button>\n `)}\n </div>\n </div>\n `;\n }\n\n static styles = css`\n :host { display: block; width: 100%; }\n .input-container { margin-bottom: 0.25rem; margin-left: 0.25rem; }\n .input-row { display: flex; gap: 0.5rem; align-items: flex-end; }\n wa-textarea { flex: 1; min-width: 0; }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-chat-input': AIChatInput;\n }\n}\n","import { css, customElement, html, LitElement, property, repeat, when } from '@eclipse-docks/core/externals/lit';\nimport type { ChatMessage } from '../../core/types';\nimport type { AgentResponseGroup, AgentResponseInfo } from '../agent-group-manager';\nimport './ai-chat-message';\n\n@customElement('docks-ai-agent-response-group')\nexport class AIAgentResponseGroup extends LitElement {\n @property({ type: Object, attribute: false })\n public group?: AgentResponseGroup;\n\n @property({ type: Function, attribute: false })\n public findStreamingMessage?: (role: string) => ChatMessage | undefined;\n\n private copyToClipboard(text: string) {\n navigator.clipboard.writeText(text).catch(err => console.error('Failed to copy:', err));\n }\n\n private renderStatusIcon(status: AgentResponseInfo['status']) {\n switch (status) {\n case 'streaming': return html`<wa-icon name=\"spinner\" class=\"spinning\"></wa-icon>`;\n case 'completed': return html`<wa-icon name=\"check-circle\" class=\"status-success\"></wa-icon>`;\n case 'error': return html`<wa-icon name=\"exclamation-circle\" class=\"status-error\"></wa-icon>`;\n }\n }\n\n private renderCard(agentInfo: AgentResponseInfo, message: ChatMessage | undefined) {\n if (!message) {\n return html`\n <div class=\"agent-card status-${agentInfo.status}\">\n <div class=\"agent-card-header\">\n <wa-icon name=\"${agentInfo.icon}\" label=\"${agentInfo.label}\"></wa-icon>\n <span>${agentInfo.label}</span>\n ${this.renderStatusIcon(agentInfo.status)}\n </div>\n <div class=\"agent-card-content waiting\">Waiting for response...</div>\n </div>\n `;\n }\n\n return html`\n <div class=\"agent-card status-${agentInfo.status}\">\n <div class=\"agent-card-header\">\n <wa-icon name=\"${agentInfo.icon}\" label=\"${agentInfo.label}\"></wa-icon>\n <span>${agentInfo.label}</span>\n ${this.renderStatusIcon(agentInfo.status)}\n <div class=\"agent-card-actions\">\n <wa-button variant=\"neutral\" appearance=\"plain\" size=\"s\" title=\"Copy\"\n @click=\"${() => this.copyToClipboard(message.content || '')}\">\n <wa-icon name=\"copy\" label=\"Copy\"></wa-icon>\n </wa-button>\n </div>\n </div>\n <div class=\"agent-card-content\">\n <docks-ai-chat-message\n .message=\"${message}\"\n .isStreaming=\"${agentInfo.status === 'streaming'}\"\n .showHeader=\"${false}\"\n .messageIndex=\"${agentInfo.messageIndex}\">\n </docks-ai-chat-message>\n </div>\n </div>\n `;\n }\n\n render() {\n if (!this.group) return html``;\n\n const agents = Array.from(this.group.agents.values());\n const completedCount = agents.filter(a => a.status === 'completed').length;\n const streamingCount = agents.filter(a => a.status === 'streaming').length;\n const errorCount = agents.filter(a => a.status === 'error').length;\n const allDone = agents.length > 0 && completedCount + errorCount === agents.length;\n const isSingle = agents.length === 1;\n\n return html`\n <div class=\"agent-response-group\">\n ${when(!isSingle, () => html`\n <div class=\"group-header\">\n <wa-icon name=\"robot\" label=\"Multiple Agents\"></wa-icon>\n <span>Multiple Agents</span>\n <span class=\"status-badge\">\n ${when(streamingCount > 0, () => html`<span class=\"streaming\">${streamingCount} responding</span>`)}\n ${when(allDone, () => html`<span class=\"done\">All completed (${completedCount})</span>`)}\n </span>\n </div>\n `)}\n <div class=\"group-content\">\n ${repeat(agents, a => a.role, (agentInfo) => {\n const message = agentInfo.message ||\n (agentInfo.status === 'streaming' && this.findStreamingMessage\n ? this.findStreamingMessage(agentInfo.role)\n : undefined);\n return this.renderCard(agentInfo, message);\n })}\n </div>\n </div>\n `;\n }\n\n static styles = css`\n :host { display: block; width: 100%; box-sizing: border-box; }\n\n .agent-response-group {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n }\n\n .group-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background-color: var(--wa-color-surface-lowered);\n border: solid var(--wa-border-width-s) var(--wa-color-surface-border);\n font-weight: 500;\n }\n\n .status-badge {\n display: flex;\n gap: 0.5rem;\n margin-left: auto;\n font-size: 0.875rem;\n }\n\n .streaming { color: var(--wa-color-brand-50); }\n .done { color: var(--wa-color-success-70); font-weight: 600; }\n\n .group-content {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n }\n\n .agent-card {\n display: flex;\n flex-direction: column;\n border: solid var(--wa-border-width-s) var(--wa-color-surface-border);\n background-color: var(--wa-color-surface-default);\n }\n\n .agent-card.status-streaming { border-color: var(--wa-color-brand-border-quiet); }\n .agent-card.status-completed { border-color: var(--wa-color-success-border-quiet); }\n .agent-card.status-error { border-color: var(--wa-color-danger-border-quiet); }\n\n .agent-card-header {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.5rem;\n border-bottom: solid var(--wa-border-width-s) var(--wa-color-surface-border);\n background-color: var(--wa-color-surface-lowered);\n font-weight: 500;\n font-size: 0.875rem;\n }\n\n .agent-card-actions { margin-left: auto; display: flex; gap: 0.25rem; }\n .agent-card-content { padding: 0.375rem; }\n .waiting { padding: 1rem; text-align: center; color: var(--wa-color-text-quiet); }\n\n .spinning { animation: spin 1s linear infinite; }\n .status-success { color: var(--wa-color-success-60); }\n .status-error { color: var(--wa-color-danger-60); }\n\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-agent-response-group': AIAgentResponseGroup;\n }\n}\n","import { css, customElement, html, LitElement, property, repeat } from '@eclipse-docks/core/externals/lit';\nimport type { ToolCall } from '../../core/types';\n\nexport interface ToolApprovalRequest {\n toolCalls: ToolCall[];\n message: string;\n}\n\nexport interface PendingApproval {\n role: string;\n request: ToolApprovalRequest;\n resolve: (approved: boolean) => void;\n alwaysAllowSelections: Map<string, boolean>;\n}\n\n@customElement('docks-ai-tool-approval')\nexport class AIToolApproval extends LitElement {\n @property({ type: Map, attribute: false })\n public pendingApprovals = new Map<string, PendingApproval>();\n\n private approve(approvalId: string, approval: PendingApproval) {\n this.dispatchEvent(new CustomEvent('approve', {\n detail: { approvalId, approval },\n bubbles: true, composed: true\n }));\n approval.resolve(true);\n this.pendingApprovals.delete(approvalId);\n this.requestUpdate();\n }\n\n private deny(approvalId: string, approval: PendingApproval) {\n approval.resolve(false);\n this.pendingApprovals.delete(approvalId);\n this.requestUpdate();\n }\n\n private formatArgs(argsStr: string): string {\n let parsed: any = {};\n try { parsed = JSON.parse(argsStr); } catch { /* noop */ }\n return Object.entries(parsed).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(', ');\n }\n\n render() {\n if (this.pendingApprovals.size === 0) return html``;\n\n return html`\n <div class=\"approval-container\">\n ${Array.from(this.pendingApprovals.entries()).map(([id, approval]) => {\n const toolCalls = approval.request.toolCalls;\n const first = toolCalls[0];\n const summaryText = toolCalls.length === 1\n ? `AI wants to execute: ${first?.function.name}()`\n : `AI wants to execute ${toolCalls.length} tools`;\n\n return html`\n <wa-details class=\"approval-item\">\n <span slot=\"summary\" class=\"approval-summary\">\n <span>${summaryText}</span>\n <div class=\"approval-inline-actions\">\n <wa-button appearance=\"plain\" size=\"s\" variant=\"neutral\"\n @click=\"${(e: Event) => { e.stopPropagation(); this.deny(id, approval); }}\">\n <wa-icon name=\"xmark\" label=\"Deny\"></wa-icon>\n </wa-button>\n <wa-button appearance=\"plain\" size=\"s\" variant=\"success\"\n @click=\"${async (e: Event) => { e.stopPropagation(); this.approve(id, approval); }}\">\n <wa-icon name=\"check\" label=\"Approve\"></wa-icon>\n </wa-button>\n </div>\n </span>\n <div class=\"approval-detail\">\n <strong>${approval.role} wants to execute:</strong>\n <ul class=\"tool-list\">\n ${repeat(toolCalls, tc => tc.id, (tc) => {\n const argsStr = this.formatArgs(tc.function.arguments || '{}');\n const isSelected = approval.alwaysAllowSelections.get(tc.id) || false;\n return html`\n <li class=\"tool-item\">\n <label class=\"always-allow-label\">\n <wa-checkbox\n ?checked=\"${isSelected}\"\n @change=\"${(e: Event) => {\n approval.alwaysAllowSelections.set(tc.id, (e.target as any).checked);\n this.requestUpdate();\n }}\">\n </wa-checkbox>\n <span>Always allow</span>\n </label>\n <code>${tc.function.name}(${argsStr})</code>\n </li>\n `;\n })}\n </ul>\n </div>\n </wa-details>\n `;\n })}\n </div>\n `;\n }\n\n static styles = css`\n :host { display: block; }\n\n .approval-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n border-top: solid var(--wa-border-width-s) var(--wa-color-warning-border-normal);\n background-color: var(--wa-color-warning-fill-quiet);\n }\n\n .approval-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n width: 100%;\n }\n\n .approval-inline-actions { display: flex; gap: 0.5rem; flex-shrink: 0; }\n\n .approval-detail {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 0.75rem 0;\n font-size: 0.875rem;\n }\n\n .tool-list { margin: 0.5rem 0 0 1.5rem; padding: 0; list-style: disc; }\n\n .tool-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0.5rem 0;\n }\n\n .always-allow-label {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n cursor: pointer;\n }\n\n code {\n font-family: var(--wa-font-mono);\n font-size: 0.875rem;\n padding: 0.125rem 0.25rem;\n background-color: var(--wa-color-neutral-fill-subtle);\n border-radius: var(--wa-border-radius-s);\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-tool-approval': AIToolApproval;\n }\n}\n","import { css, customElement, html, LitElement, property } from '@eclipse-docks/core/externals/lit';\n\n@customElement('docks-ai-empty-state')\nexport class AIEmptyState extends LitElement {\n @property({ type: String }) public message = 'No AI provider configured';\n @property({ type: String }) public hint = 'Click the settings icon to configure an AI provider';\n\n render() {\n return html`\n <div class=\"empty-state\">\n <wa-icon name=\"robot\" style=\"font-size: 3rem; opacity: 0.3;\"></wa-icon>\n <p>${this.message}</p>\n <p class=\"hint\">${this.hint}</p>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n text-align: center;\n color: var(--wa-color-text-quiet);\n }\n\n .empty-state p { margin: 0.5rem 0; }\n .hint { font-size: 0.875rem; opacity: 0.7; }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-empty-state': AIEmptyState;\n }\n}\n","import { css, customElement, html, LitElement, property, repeat, state, when } from '@eclipse-docks/core/externals/lit';\nimport type { TaskPlan, TaskStep, StepStatus } from '../core/types';\n\nconst STATUS_ICON: Record<StepStatus, string> = {\n running: 'spinner',\n completed: 'check-circle',\n failed: 'exclamation-circle',\n skipped: 'forward',\n pending: 'circle'\n};\n\nconst STATUS_COLOR: Record<StepStatus, string> = {\n running: 'var(--wa-color-brand-50)',\n completed: 'var(--wa-color-success-60)',\n failed: 'var(--wa-color-danger-60)',\n skipped: 'var(--wa-color-neutral-40)',\n pending: 'var(--wa-color-neutral-40)'\n};\n\n@customElement('docks-ai-task-progress-panel')\nexport class AITaskProgressPanel extends LitElement {\n @property({ type: Object, attribute: false })\n public plan?: TaskPlan;\n\n @state()\n private expanded = true;\n\n render() {\n if (!this.plan) return html``;\n\n const completedCount = this.plan.steps.filter(s => s.status === 'completed').length;\n const totalCount = this.plan.steps.length;\n const progress = totalCount > 0 ? Math.round((completedCount / totalCount) * 100) : 0;\n\n return html`\n <div class=\"taspanel\">\n <div class=\"panel-header\" @click=\"${() => { this.expanded = !this.expanded; }}\">\n <wa-icon name=\"diagram-project\" label=\"Task Plan\"></wa-icon>\n <span class=\"panel-title\">Task Plan</span>\n <span class=\"progress-text\">${completedCount}/${totalCount}</span>\n <wa-progress-bar value=\"${progress}\" class=\"progress-bar\"></wa-progress-bar>\n <wa-icon name=\"${this.expanded ? 'chevron-up' : 'chevron-down'}\" label=\"toggle\"></wa-icon>\n </div>\n ${when(this.expanded, () => html`\n <div class=\"panel-body\">\n ${repeat(this.plan!.steps, s => s.id, (step) => html`\n <div class=\"step-row\">\n <wa-icon\n name=\"${STATUS_ICON[step.status] ?? 'circle'}\"\n style=\"color: ${STATUS_COLOR[step.status] ?? 'var(--wa-color-neutral-40)'}; ${step.status === 'running' ? 'animation: spin 1s linear infinite;' : ''}\">\n </wa-icon>\n <div class=\"step-info\">\n <span class=\"step-role\">${step.role}</span>\n <span class=\"step-task\">${step.subTask}</span>\n </div>\n ${when(step.revisions > 0, () => html`\n <span class=\"revisions-badge\">${step.revisions} rev</span>\n `)}\n </div>\n `)}\n </div>\n `)}\n </div>\n `;\n }\n\n static styles = css`\n :host { display: block; }\n\n .taspanel {\n border: solid var(--wa-border-width-s) var(--wa-color-brand-border-quiet);\n border-radius: var(--wa-border-radius-m);\n background: var(--wa-color-surface-default);\n margin: 0.5rem 0;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n user-select: none;\n }\n\n .panel-title {\n font-weight: 500;\n flex: 0 0 auto;\n }\n\n .progress-text {\n font-size: 0.8rem;\n color: var(--wa-color-text-quiet);\n }\n\n .progress-bar {\n flex: 1;\n min-width: 60px;\n }\n\n .panel-body {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n padding: 0.5rem 0.75rem;\n border-top: solid var(--wa-border-width-s) var(--wa-color-neutral-border-subtle);\n }\n\n .step-row {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.25rem 0;\n }\n\n .step-info {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n flex: 1;\n min-width: 0;\n }\n\n .step-role {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--wa-color-text-quiet);\n text-transform: uppercase;\n }\n\n .step-task {\n font-size: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .revisions-badge {\n font-size: 0.7rem;\n padding: 0.1rem 0.3rem;\n background: var(--wa-color-warning-fill-quiet);\n border-radius: var(--wa-border-radius-s);\n color: var(--wa-color-warning-70);\n flex-shrink: 0;\n }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-task-progress-panel': AITaskProgressPanel;\n }\n}\n","import { css, customElement, html, LitElement, property, repeat, state, when } from '@eclipse-docks/core/externals/lit';\nimport type { Artifact, ArtifactType } from '../core/types';\n\nconst ARTIFACT_TYPE_ICON: Record<ArtifactType, string> = {\n code: 'code',\n json: 'brackets-curly',\n 'file-list': 'list',\n plan: 'diagram-project',\n review: 'magnifying-glass',\n text: 'file-lines'\n};\n\n@customElement('docks-ai-workspace-panel')\nexport class AIWorkspacePanel extends LitElement {\n @property({ type: Array, attribute: false })\n public artifacts: Artifact[] = [];\n\n @state()\n private expanded = false;\n\n @state()\n private selectedArtifact?: Artifact;\n\n render() {\n if (this.artifacts.length === 0) return html``;\n\n return html`\n <div class=\"workspace-panel\">\n <div class=\"panel-header\" @click=\"${() => { this.expanded = !this.expanded; this.selectedArtifact = undefined; }}\">\n <wa-icon name=\"folder-open\" label=\"Workspace\"></wa-icon>\n <span class=\"panel-title\">Workspace</span>\n <span class=\"count-badge\">${this.artifacts.length} artifact${this.artifacts.length !== 1 ? 's' : ''}</span>\n <wa-icon name=\"${this.expanded ? 'chevron-up' : 'chevron-down'}\" label=\"toggle\"></wa-icon>\n </div>\n ${when(this.expanded, () => html`\n <div class=\"panel-body\">\n <div class=\"artifact-list\">\n ${repeat(this.artifacts, a => a.id, (artifact) => html`\n <div\n class=\"artifact-item ${this.selectedArtifact?.id === artifact.id ? 'selected' : ''}\"\n @click=\"${() => { this.selectedArtifact = this.selectedArtifact?.id === artifact.id ? undefined : artifact; }}\">\n <wa-icon name=\"${ARTIFACT_TYPE_ICON[artifact.type] ?? 'file-lines'}\" label=\"${artifact.type}\"></wa-icon>\n <div class=\"artifact-meta\">\n <span class=\"artifact-id\">${artifact.id}</span>\n <span class=\"artifact-producer\">by ${artifact.producedBy}</span>\n </div>\n <span class=\"artifact-type\">${artifact.type}</span>\n </div>\n ${when(this.selectedArtifact?.id === artifact.id, () => html`\n <div class=\"artifact-content\">\n <pre>${artifact.content}</pre>\n </div>\n `)}\n `)}\n </div>\n </div>\n `)}\n </div>\n `;\n }\n\n static styles = css`\n :host { display: block; }\n\n .workspace-panel {\n border: solid var(--wa-border-width-s) var(--wa-color-neutral-border-subtle);\n border-radius: var(--wa-border-radius-m);\n background: var(--wa-color-surface-default);\n margin: 0.5rem 0;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n user-select: none;\n }\n\n .panel-title { font-weight: 500; }\n\n .count-badge {\n font-size: 0.8rem;\n color: var(--wa-color-text-quiet);\n margin-left: auto;\n }\n\n .panel-body {\n border-top: solid var(--wa-border-width-s) var(--wa-color-neutral-border-subtle);\n }\n\n .artifact-list { display: flex; flex-direction: column; }\n\n .artifact-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.4rem 0.75rem;\n cursor: pointer;\n }\n\n .artifact-item:hover { background: var(--wa-color-surface-lowered); }\n .artifact-item.selected { background: var(--wa-color-brand-fill-quiet); }\n\n .artifact-meta {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n }\n\n .artifact-id {\n font-size: 0.85rem;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-producer {\n font-size: 0.75rem;\n color: var(--wa-color-text-quiet);\n }\n\n .artifact-type {\n font-size: 0.75rem;\n padding: 0.1rem 0.3rem;\n background: var(--wa-color-surface-lowered);\n border-radius: var(--wa-border-radius-s);\n }\n\n .artifact-content {\n padding: 0.5rem 0.75rem;\n border-top: solid var(--wa-border-width-s) var(--wa-color-neutral-border-subtle);\n background: var(--wa-color-surface-lowered);\n }\n\n .artifact-content pre {\n margin: 0;\n white-space: pre-wrap;\n word-break: breaword;\n font-size: 0.8rem;\n max-height: 200px;\n overflow-y: auto;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-workspace-panel': AIWorkspacePanel;\n }\n}\n","import { css, customElement, html, nothing, repeat, state, TemplateResult, when } from '@eclipse-docks/core/externals/lit';\nimport { DocksPart } from '@eclipse-docks/core';\nimport { commandRegistry as globalCommandRegistry } from '@eclipse-docks/core';\nimport { taskService, uiContext, appSettings } from '@eclipse-docks/core';\nimport { toastError } from '@eclipse-docks/core';\n\nimport type { ChatMessage, ChatHistory, ChatProvider, TaskPlan, Artifact } from '../core/types';\nimport { TOPIC_AICONFIG_CHANGED, KEY_AI_CONFIG } from '../core/constants';\nimport { aiService } from '../service/ai-service';\n\nimport { SessionManager } from './session-manager';\nimport { StreamManager } from './stream-manager';\nimport { ProviderManager } from './provider-manager';\nimport { AgentGroupManager } from './agent-group-manager';\n\nimport './components/ai-chat-message';\nimport './components/ai-chat-input';\nimport './components/ai-agent-response-group';\nimport './components/ai-tool-approval';\nimport './components/ai-empty-state';\nimport './task-progress-panel';\nimport './workspace-panel';\nimport type { PendingApproval } from './components/ai-tool-approval';\n\n@customElement('docks-aiview')\nexport class DocksAIView extends DocksPart {\n private sessionManager = new SessionManager();\n private scrollDebounceTimer?: ReturnType<typeof setTimeout>;\n\n private streamManager = new StreamManager(() => {\n this.requestUpdate();\n if (this.scrollDebounceTimer) clearTimeout(this.scrollDebounceTimer);\n this.scrollDebounceTimer = setTimeout(async () => {\n await this.updateComplete;\n this.scrollToBottom();\n this.scrollDebounceTimer = undefined;\n }, 100);\n });\n\n private providerManager = new ProviderManager(aiService);\n private agentGroupManager = new AgentGroupManager();\n\n @state() private busy = false;\n @state() private inputValue = '';\n @state() private requireToolApproval = true;\n @state() private showHistory = false;\n @state() private currentTaskPlan?: TaskPlan;\n @state() private currentArtifacts: Artifact[] = [];\n @state() private pendingToolApprovals = new Map<string, PendingApproval>();\n\n private toolApprovalAllowlist = new Set<string>();\n private abortController?: AbortController;\n\n protected async doBeforeUI() {\n this.subscribe(TOPIC_AICONFIG_CHANGED, () => this.onAIConfigChanged());\n await this.sessionManager.load();\n if (!this.sessionManager.getActiveSession()) {\n this.sessionManager.createSession();\n }\n await this.providerManager.initialize();\n await this.loadSettings();\n this.requestUpdate();\n }\n\n private async onAIConfigChanged() {\n await this.providerManager.initialize();\n await this.loadSettings();\n this.requestUpdate();\n }\n\n private async loadSettings() {\n const config = await appSettings.get(KEY_AI_CONFIG) as any || {};\n this.requireToolApproval = config.requireToolApproval !== false;\n const allowlist = await this.providerManager.loadToolApprovalAllowlist();\n this.toolApprovalAllowlist = new Set(allowlist);\n }\n\n private async scrollToBottom() {\n await this.updateComplete;\n const scroller = this.shadowRoot?.querySelector('wa-scroller.chat-messages') as any;\n if (!scroller) return;\n const container = scroller.shadowRoot?.querySelector('.scroll-container') as HTMLElement;\n if (container) {\n container.scrollTop = container.scrollHeight;\n } else if (scroller.scrollTo) {\n scroller.scrollTo({ top: scroller.scrollHeight, behavior: 'smooth' });\n }\n }\n\n private resetViewState() {\n this.inputValue = '';\n this.showHistory = false;\n this.currentTaskPlan = undefined;\n this.currentArtifacts = [];\n this.requestUpdate();\n }\n\n private createNewSession() {\n this.sessionManager.createSession();\n this.resetViewState();\n }\n\n private switchToSession(sessionId: string) {\n if (!this.sessionManager.switchToSession(sessionId)) return;\n this.resetViewState();\n }\n\n private deletePastSession(sessionId: string) {\n this.sessionManager.deletePastSession(sessionId);\n this.requestUpdate();\n }\n\n private async sendMessage() {\n const prompt = this.inputValue.trim();\n if (!prompt || this.busy) return;\n this.inputValue = '';\n await this.handlePrompt(prompt);\n }\n\n private async handleResend(message: ChatMessage) {\n if (!message || message.role !== 'user') return;\n await this.handlePrompt(message.content);\n }\n\n private cancelStream() {\n this.abortController?.abort();\n this.abortController = undefined;\n this.busy = false;\n this.streamManager.cancelUpdates();\n }\n\n public async handlePrompt(prompt: string): Promise<void> {\n if (prompt.startsWith('/')) {\n await this.runCommand(prompt.substring(1));\n return;\n }\n\n const selectedProvider = this.providerManager.getSelectedProvider();\n if (!selectedProvider) {\n toastError('Please configure an AI provider in settings');\n return;\n }\n\n const session = this.sessionManager.getActiveSession();\n if (!session) return;\n\n const message = aiService.createMessage(prompt);\n this.sessionManager.addMessage(message);\n\n if (session.history.length === 1) {\n this.sessionManager.setTitle(this.sessionManager.generateTitle(prompt));\n }\n\n this.requestUpdate();\n await this.updateComplete;\n this.scrollToBottom();\n this.busy = true;\n this.currentTaskPlan = undefined;\n this.currentArtifacts = [];\n\n this.abortController = new AbortController();\n const streamingAgents = new Map<string, number>();\n const chatContext: ChatHistory = { history: [...session.history] };\n const sessionId = session.id;\n\n const execContext = globalCommandRegistry.createExecutionContext();\n const callContext = uiContext.createChild({ ...execContext });\n const contributions = aiService.getAgentContributions();\n\n if (contributions.length === 0) {\n toastError('No agents are registered.');\n this.busy = false;\n return;\n }\n\n const matchingAgents = contributions.filter(c =>\n !c.canHandle || c.canHandle({ ...callContext.getProxy(), userPrompt: prompt })\n ).sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n if (matchingAgents.length === 0) {\n toastError(`No agents available. Available: ${contributions.map(c => c.role).join(', ')}`);\n this.busy = false;\n return;\n }\n\n const roles = matchingAgents.map(a => a.role);\n const currentSession = this.sessionManager.getActiveSession();\n if (!currentSession) return;\n\n const groupId = this.agentGroupManager.createGroup(\n sessionId,\n currentSession.history.length - 1,\n message,\n roles,\n (role: string) => {\n const contrib = contributions.find(c => c.role === role);\n return { label: (contrib as any)?.label || role, icon: (contrib as any)?.icon || 'robot' };\n }\n );\n\n taskService.runAsync('Calling AI assistant', async () => {\n return aiService.executeAgentWorkflow({\n chatContext,\n chatConfig: selectedProvider,\n callContext,\n execution: 'parallel',\n stream: true,\n signal: this.abortController!.signal,\n roles,\n requireToolApproval: this.requireToolApproval,\n onToolApprovalRequest: async (role: string, request: any): Promise<boolean> => {\n const allAllowed = request.toolCalls.every((tc: any) => this.toolApprovalAllowlist.has(tc.function.name));\n if (allAllowed) return true;\n\n return new Promise<boolean>((resolve) => {\n const approvalId = `approval-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const pending: PendingApproval = {\n role,\n request,\n resolve,\n alwaysAllowSelections: new Map()\n };\n this.pendingToolApprovals.set(approvalId, pending);\n this.requestUpdate();\n });\n },\n onAgentStart: async (role: string) => {\n const streamIndex = this.streamManager.createStreamingMessage(role);\n streamingAgents.set(role, streamIndex);\n this.agentGroupManager.updateAgentStatus(groupId, role, 'streaming');\n this.requestUpdate();\n await this.updateComplete;\n this.scrollToBottom();\n },\n onToken: (role: string, token: string) => {\n const streamIndex = streamingAgents.get(role);\n if (streamIndex !== undefined) this.streamManager.updateStreamingMessage(streamIndex, token);\n },\n onAgentComplete: async (role: string, completedMessage: ChatMessage) => {\n const targetSession = this.sessionManager.getActiveSession();\n if (!targetSession || targetSession.id !== sessionId) return;\n\n const streamIndex = streamingAgents.get(role);\n if (streamIndex !== undefined) {\n this.streamManager.completeStreamingMessage(streamIndex, completedMessage);\n const messageIndex = targetSession.history.length;\n this.sessionManager.addMessage(completedMessage);\n streamingAgents.delete(role);\n this.streamManager.removeStreamingMessage(streamIndex);\n this.agentGroupManager.updateAgentStatus(groupId, role, 'completed', completedMessage, messageIndex);\n this.requestUpdate();\n await this.updateComplete;\n this.scrollToBottom();\n }\n },\n onAgentError: (role: string, error: Error) => {\n const streamIndex = streamingAgents.get(role);\n if (streamIndex !== undefined) {\n this.streamManager.removeStreamingMessage(streamIndex);\n streamingAgents.delete(role);\n }\n this.agentGroupManager.updateAgentStatus(groupId, role, 'error', { role, content: `Error: ${error.message}` });\n this.requestUpdate();\n toastError(`Agent ${role} error: ${error.message}`);\n }\n }).then(() => { this.agentGroupManager.clearCurrentGroup(); });\n }).catch((error: any) => {\n if (error?.name !== 'AbortError') toastError(`${error}`);\n }).finally(async () => {\n this.busy = false;\n this.abortController = undefined;\n this.streamManager.reset();\n this.agentGroupManager.clearCurrentGroup();\n this.requestUpdate();\n });\n }\n\n private async runCommand(prompt: string) {\n const splits = prompt.trim().split(/\\s+/);\n if (splits.length === 0) return;\n const commandId = splits.shift()!;\n const command = globalCommandRegistry.getCommand(commandId);\n if (!command) { toastError(`Command not found: ${commandId}`); return; }\n const params: Record<string, string> = {};\n splits.forEach((c, i) => {\n if (command.parameters?.[i]) params[command.parameters[i].name] = c;\n });\n await globalCommandRegistry.execute(commandId, globalCommandRegistry.createExecutionContext(params));\n this.requestUpdate();\n }\n\n private handleToolApproval(e: CustomEvent) {\n const { approvalId, approval } = e.detail;\n const alwaysAllowed = Array.from((approval.alwaysAllowSelections as Map<string, boolean>).entries())\n .filter(([, v]) => v)\n .map(([k]) => k);\n alwaysAllowed.forEach(name => this.toolApprovalAllowlist.add(name));\n this.pendingToolApprovals.delete(approvalId);\n this.requestUpdate();\n }\n\n private renderMessage(message: ChatMessage, index: number, isStreaming = false): TemplateResult {\n return html`\n <docks-ai-chat-message\n .message=\"${message}\"\n .isStreaming=\"${isStreaming}\"\n .showHeader=\"${true}\"\n .messageIndex=\"${index}\"\n @resend=\"${(e: CustomEvent) => this.handleResend(e.detail.message)}\">\n </docks-ai-chat-message>\n `;\n }\n\n protected renderToolbar() {\n const past = this.sessionManager.getPastSessions();\n const session = this.sessionManager.getActiveSession();\n\n return html`\n <span style=\"flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:0.875rem;font-weight:500;padding:0 0.25rem;\">${session?.title || 'New Chat'}</span>\n <wa-button appearance=\"plain\" size=\"s\" title=\"New chat\"\n @click=\"${() => this.createNewSession()}\">\n <wa-icon name=\"plus\" label=\"New chat\"></wa-icon>\n </wa-button>\n ${past.length > 0 ? html`\n <wa-dropdown\n ?open=\"${this.showHistory}\"\n @wa-after-hide=\"${() => { this.showHistory = false; }}\"\n placement=\"bottom-start\">\n <wa-button slot=\"trigger\" appearance=\"plain\" size=\"s\" with-caret\n title=\"Chat history\"\n @click=\"${() => { this.showHistory = !this.showHistory; }}\">\n <wa-icon name=\"clock-rotate-left\" label=\"History\"></wa-icon>\n </wa-button>\n ${past.map(s => html`\n <wa-dropdown-item @click=\"${() => this.switchToSession(s.id)}\">\n <wa-icon name=\"message\" label=\"Session\" slot=\"icon\"></wa-icon>\n <span style=\"flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\">${s.title || 'Unnamed Chat'}</span>\n <wa-button slot=\"details\" appearance=\"plain\" size=\"s\" title=\"Delete\"\n @click=\"${(e: Event) => { e.stopPropagation(); this.deletePastSession(s.id); }}\">\n <wa-icon name=\"trash\" label=\"Delete\"></wa-icon>\n </wa-button>\n </wa-dropdown-item>\n `)}\n </wa-dropdown>\n ` : nothing}\n <docks-command cmd=\"open_ai_config\" icon=\"gear\" title=\"AI Settings\"></docks-command>\n `;\n }\n\n protected renderContent() {\n const session = this.sessionManager.getActiveSession();\n const selectedProvider = this.providerManager.getSelectedProvider();\n\n return html`\n <div class=\"chat-container\">\n <wa-scroller class=\"chat-messages\" orientation=\"vertical\">\n <div class=\"chat-content\">\n ${when(!selectedProvider, () => html`\n <docks-ai-empty-state\n message=\"No AI provider configured\"\n hint='Click the settings icon below to configure an AI provider'>\n </docks-ai-empty-state>\n `, () => when(!session || session.history.length === 0, () => html`\n <docks-ai-empty-state message=\"How can I help you?\" hint=\"\"></docks-ai-empty-state>\n `, () => html`\n ${session!.history.map((message: ChatMessage, idx: number) => {\n const group = this.agentGroupManager.findGroupForUserMessage(session!.id, idx, message);\n if (group && message.role === 'user') {\n return html`\n <docks-ai-chat-message\n .message=\"${message}\"\n .isStreaming=\"${false}\"\n .showHeader=\"${true}\"\n .messageIndex=\"${idx}\"\n @resend=\"${(e: CustomEvent) => this.handleResend(e.detail.message)}\">\n </docks-ai-chat-message>\n <docks-ai-agent-response-group\n .group=\"${group}\"\n .findStreamingMessage=\"${(role: string) => this.streamManager.findStreamingMessage(role)}\">\n </docks-ai-agent-response-group>\n `;\n }\n\n if (this.agentGroupManager.findGroupForMessage(session!.id, message.role, idx)) {\n return html``;\n }\n\n return this.renderMessage(message, idx);\n })}\n\n ${this.streamManager.getAllStreamingMessages()\n .filter(m => !this.agentGroupManager.getAllGroups()\n .some(g => g.sessionId === session!.id && g.agents.has(m.message.role)))\n .map(m => this.renderMessage(m.message, -1, m.isStreaming))}\n\n ${when(this.busy && this.streamManager.getAllStreamingMessages().length === 0, () => html`\n <div class=\"thinking-indicator\">\n <wa-progress-ring indeterminate size=\"s\"></wa-progress-ring>\n <span>Thinking…</span>\n </div>\n `)}\n `))}\n\n ${when(this.currentTaskPlan, () => html`\n <docks-ai-task-progress-panel .plan=\"${this.currentTaskPlan}\"></docks-ai-task-progress-panel>\n `)}\n\n ${when(this.currentArtifacts.length > 0, () => html`\n <docks-ai-workspace-panel .artifacts=\"${this.currentArtifacts}\"></docks-ai-workspace-panel>\n `)}\n </div>\n </wa-scroller>\n\n ${when(this.pendingToolApprovals.size > 0, () => html`\n <docks-ai-tool-approval\n .pendingApprovals=\"${this.pendingToolApprovals}\"\n @approve=\"${(e: CustomEvent) => this.handleToolApproval(e)}\">\n </docks-ai-tool-approval>\n `)}\n\n <div class=\"input-area\">\n <docks-ai-chat-input\n .value=\"${this.inputValue}\"\n .busy=\"${this.busy}\"\n .disabled=\"${!selectedProvider}\"\n .hasProvider=\"${!!selectedProvider}\"\n @input-change=\"${(e: CustomEvent) => { this.inputValue = e.detail.value; }}\"\n @send=\"${(e: CustomEvent) => { this.inputValue = e.detail.value; this.sendMessage(); }}\"\n @cancel=\"${() => this.cancelStream()}\">\n </docks-ai-chat-input>\n </div>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: var(--wa-color-surface-default);\n }\n\n .chat-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .chat-messages {\n flex: 1;\n overflow: hidden;\n }\n\n .chat-content {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n min-height: 100%;\n box-sizing: border-box;\n }\n\n .thinking-indicator {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n color: var(--wa-color-text-quiet);\n font-size: 0.875rem;\n }\n\n .input-area {\n padding: 0.5rem;\n border-top: solid var(--wa-border-width-s) var(--wa-color-neutral-border-subtle);\n flex-shrink: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-aiview': DocksAIView;\n }\n}\n","import { css, customElement, html } from '@eclipse-docks/core/externals/lit';\nimport { DocksElement } from '@eclipse-docks/core';\nimport { subscribe, confirmDialog } from '@eclipse-docks/core';\nimport { tokenUsageTracker, EMPTY_USAGE } from '../service/token-usage-tracker';\nimport { TOPIC_AI_STREAM_COMPLETE } from '../core/constants';\nimport type { ProviderTokenUsage } from '../core/types';\n\n@customElement('docks-token-usage')\nexport class DocksTokenUsage extends DocksElement {\n private totalUsage: ProviderTokenUsage = { ...EMPTY_USAGE };\n private providerUsage: Record<string, ProviderTokenUsage> = {};\n\n connectedCallback() {\n super.connectedCallback();\n this.loadUsage();\n subscribe(TOPIC_AI_STREAM_COMPLETE, () => { this.loadUsage(); });\n }\n\n private async loadUsage() {\n this.totalUsage = await tokenUsageTracker.getTotalUsage();\n this.providerUsage = await tokenUsageTracker.getAllProviderUsage();\n this.requestUpdate();\n }\n\n private formatNumber(num: number): string {\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(2) + 'M';\n if (num >= 1_000) return (num / 1_000).toFixed(1) + 'K';\n return num.toString();\n }\n\n private async handleReset() {\n if (await confirmDialog('Reset all token usage statistics?')) {\n await tokenUsageTracker.reset();\n await this.loadUsage();\n }\n }\n\n private renderStatItem(label: string, value: number) {\n return html`\n <div class=\"stat-item\">\n <span class=\"stat-label\">${label}</span>\n <span class=\"stat-value\">${this.formatNumber(value)}</span>\n </div>\n `;\n }\n\n protected render() {\n if (this.totalUsage.totalTokens === 0) return html``;\n\n return html`\n <wa-dropdown placement=\"top-end\" distance=\"8\">\n <wa-button slot=\"trigger\" appearance=\"plain\" size=\"s\" title=\"Token usage\">\n <wa-icon name=\"database\" label=\"Tokens\" slot=\"start\"></wa-icon>\n ${this.formatNumber(this.totalUsage.totalTokens)} tokens\n </wa-button>\n\n <h3>Token Usage</h3>\n\n <h6>Total</h6>\n <wa-dropdown-item>\n <span>All providers</span>\n <div class=\"stats-row\">\n ${this.renderStatItem('Prompt', this.totalUsage.promptTokens)}\n ${this.renderStatItem('Completion', this.totalUsage.completionTokens)}\n ${this.renderStatItem('Total', this.totalUsage.totalTokens)}\n ${this.renderStatItem('Requests', this.totalUsage.requestCount)}\n </div>\n </wa-dropdown-item>\n\n ${Object.keys(this.providerUsage).length > 0 ? html`\n <wa-divider></wa-divider>\n <h6>By Provider</h6>\n ${Object.entries(this.providerUsage).map(([name, usage]) => html`\n <wa-dropdown-item>\n <span class=\"provider-name\">${name}</span>\n <div class=\"stats-row\">\n ${this.renderStatItem('Prompt', usage.promptTokens)}\n ${this.renderStatItem('Completion', usage.completionTokens)}\n ${this.renderStatItem('Total', usage.totalTokens)}\n ${this.renderStatItem('Req', usage.requestCount)}\n </div>\n </wa-dropdown-item>\n `)}\n ` : ''}\n\n <wa-divider></wa-divider>\n <wa-dropdown-item variant=\"danger\" @click=\"${() => this.handleReset()}\">\n <wa-icon name=\"trash\" slot=\"icon\"></wa-icon>\n Reset statistics\n </wa-dropdown-item>\n </wa-dropdown>\n `;\n }\n\n static styles = css`\n :host { display: inline-block; }\n\n wa-dropdown::part(menu) { min-width: 320px; max-width: 420px; }\n\n h3 {\n padding: var(--wa-space-s) var(--wa-space-m);\n margin: 0;\n font-weight: 600;\n font-size: 0.95em;\n }\n\n h6 {\n padding: var(--wa-space-xs) var(--wa-space-m);\n margin: 0;\n font-weight: 600;\n font-size: 0.85em;\n color: var(--wa-color-neutral-text-subtle);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .provider-name { font-weight: 500; }\n\n .stats-row { display: flex; gap: var(--wa-space-m); font-size: 0.875rem; }\n\n .stat-item {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n .stat-label { font-size: 0.8em; color: var(--wa-color-neutral-text-subtle); }\n .stat-value { font-weight: 600; }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-token-usage': DocksTokenUsage;\n }\n}\n","import { css, customElement, html, property, repeat, state, when } from '@eclipse-docks/core/externals/lit';\nimport { DocksPart } from '@eclipse-docks/core';\nimport { EditorInput } from '@eclipse-docks/core';\nimport { appSettings, TOPIC_SETTINGS_CHANGED } from '@eclipse-docks/core';\nimport { KEY_AI_CONFIG, TOPIC_AICONFIG_CHANGED, CID_CHAT_PROVIDERS } from '../../core/constants';\nimport { subscribe } from '@eclipse-docks/core';\nimport { confirmDialog } from '@eclipse-docks/core';\nimport { contributionRegistry } from '@eclipse-docks/core';\nimport { ProviderFactory } from '../../providers/provider-factory';\nimport type { AIConfig, ChatProvider } from '../../core/types';\nimport type { ChatProviderContribution } from '../../core/interfaces';\n\n@customElement('docks-ai-config-editor')\nexport class DocksAIConfigEditor extends DocksPart {\n @property({ attribute: false }) public input?: EditorInput;\n\n @state() private providers: ChatProvider[] = [];\n @state() private defaultProvider = '';\n @state() private hasChanges = false;\n @state() private availableModels: Array<{ id: string; name?: string }> = [];\n @state() private loadingModels = false;\n @state() private requireToolApproval = true;\n @state() private smartToolDetection = false;\n\n // Editing state for each provider field\n @state() private editingState: Record<number, Partial<ChatProvider>> = {};\n\n private aiConfig?: AIConfig;\n private providerFactory = new ProviderFactory();\n\n protected async doInitUI() {\n await this.loadConfig();\n subscribe(TOPIC_AICONFIG_CHANGED, () => this.loadConfig());\n subscribe(TOPIC_SETTINGS_CHANGED, () => this.loadConfig());\n }\n\n private async loadConfig() {\n const config = await appSettings.get(KEY_AI_CONFIG) as AIConfig | undefined;\n this.aiConfig = config;\n\n const contributed = (contributionRegistry.getContributions(CID_CHAT_PROVIDERS) as ChatProviderContribution[]).map(c => c.provider);\n const configProviders = config?.providers || [];\n const existingNames = new Set(configProviders.map(p => p.name));\n this.providers = [...configProviders, ...contributed.filter(p => !existingNames.has(p.name))];\n\n this.defaultProvider = config?.defaultProvider || '';\n this.requireToolApproval = config?.requireToolApproval !== false;\n this.smartToolDetection = config?.smartToolDetection !== undefined ? config.smartToolDetection : false;\n this.editingState = {};\n this.hasChanges = false;\n this.markDirty(false);\n }\n\n private getEditValue(index: number, field: keyof ChatProvider): string {\n const editing = this.editingState[index];\n if (editing && field in editing) return (editing as any)[field] ?? '';\n const provider = this.providers[index];\n return provider ? ((provider as any)[field] ?? '') : '';\n }\n\n private setEditValue(index: number, field: keyof ChatProvider, value: string) {\n this.editingState = {\n ...this.editingState,\n [index]: { ...(this.editingState[index] || {}), [field]: value }\n };\n this.providers = this.providers.map((p, i) =>\n i === index ? { ...p, [field]: value } : p\n );\n this.markDirtyAndUpdate();\n }\n\n private markDirtyAndUpdate() {\n this.hasChanges = true;\n this.markDirty(true);\n }\n\n private async fetchModels(index: number): Promise<void> {\n const provider = this.providers[index];\n if (!provider) return;\n this.loadingModels = true;\n this.availableModels = [];\n try {\n const instance = this.providerFactory.getProvider(provider);\n if (instance.getAvailableModels) {\n const models = await instance.getAvailableModels(provider);\n this.availableModels = Array.isArray(models) ? models : [];\n }\n } finally {\n this.loadingModels = false;\n }\n }\n\n private async saveConfig() {\n const updatedConfig: AIConfig = {\n ...(this.aiConfig ?? {}),\n defaultProvider: this.defaultProvider,\n providers: this.providers,\n requireToolApproval: this.requireToolApproval,\n smartToolDetection: this.smartToolDetection\n };\n await appSettings.set(KEY_AI_CONFIG, updatedConfig);\n this.aiConfig = updatedConfig;\n this.hasChanges = false;\n this.markDirty(false);\n }\n\n async save() {\n if (!this.hasChanges) return;\n await this.saveConfig();\n }\n\n private addProvider() {\n this.providers = [...this.providers, { name: 'new-provider', model: '', apiKey: '', chatApiEndpoint: '' }];\n this.markDirtyAndUpdate();\n }\n\n private async deleteProvider(index: number) {\n const provider = this.providers[index];\n if (!await confirmDialog(`Delete provider \"${provider.name}\"?`)) return;\n if (this.defaultProvider === provider.name) this.defaultProvider = '';\n this.providers = this.providers.filter((_, i) => i !== index);\n this.markDirtyAndUpdate();\n }\n\n private renderProviderField(index: number, field: keyof ChatProvider, type: 'text' | 'password' = 'text') {\n const value = this.getEditValue(index, field);\n return html`\n <wa-input\n type=\"${type}\"\n ?password-toggle=\"${type === 'password'}\"\n .value=\"${value}\"\n @input=\"${(e: Event) => this.setEditValue(index, field, (e.target as any).value)}\">\n </wa-input>\n `;\n }\n\n protected renderContent() {\n return html`\n <div class=\"editor\">\n <div class=\"editor-header\">\n <h2>AI Providers</h2>\n <wa-button variant=\"brand\" appearance=\"filled\" @click=\"${this.addProvider}\">\n Add Provider\n </wa-button>\n </div>\n\n ${when(this.providers.length === 0, () => html`\n <div class=\"empty-state\"><p>No providers configured.</p></div>\n `, () => html`\n <div class=\"providers-list\">\n ${repeat(this.providers, (_, i) => i, (provider, index) => html`\n <div class=\"provider-card\">\n <div class=\"provider-card-header ${this.defaultProvider === provider.name ? 'is-default' : ''}\">\n <span class=\"provider-name\">${provider.name}</span>\n ${this.defaultProvider === provider.name\n ? html`<span class=\"default-badge\">Default</span>`\n : html`<wa-button appearance=\"plain\" size=\"s\" title=\"Set as default\"\n @click=\"${() => { this.defaultProvider = provider.name; this.markDirtyAndUpdate(); }}\">\n Set default\n </wa-button>`\n }\n <wa-button variant=\"danger\" appearance=\"plain\" size=\"s\"\n @click=\"${() => this.deleteProvider(index)}\">\n Delete\n </wa-button>\n </div>\n <div class=\"provider-fields\">\n <div class=\"field-row\">\n <label>Name</label>\n ${this.renderProviderField(index, 'name')}\n </div>\n <div class=\"field-row\">\n <label>Model</label>\n <div class=\"model-row\">\n ${this.renderProviderField(index, 'model')}\n <wa-button appearance=\"plain\" size=\"s\"\n @click=\"${async () => { await this.fetchModels(index); }}\"\n title=\"Fetch available models\">\n <wa-icon name=\"refresh\" label=\"Refresh\"></wa-icon>\n </wa-button>\n </div>\n ${when(this.loadingModels, () => html`\n <wa-progress-ring indeterminate size=\"s\"></wa-progress-ring>\n `)}\n ${when(this.availableModels.length > 0, () => html`\n <wa-dropdown\n @wa-select=\"${(e: CustomEvent) => {\n if (e.detail.item?.value) this.setEditValue(index, 'model', e.detail.item.value);\n }}\">\n <wa-button slot=\"trigger\" size=\"s\" appearance=\"plain\" with-caret>\n Select model\n </wa-button>\n ${this.availableModels.map(m => html`\n <wa-dropdown-item value=\"${m.id}\">${m.name || m.id}</wa-dropdown-item>\n `)}\n </wa-dropdown>\n `)}\n </div>\n <div class=\"field-row\">\n <label>API Endpoint</label>\n ${this.renderProviderField(index, 'chatApiEndpoint')}\n </div>\n <div class=\"field-row\">\n <label>API Key</label>\n ${this.renderProviderField(index, 'apiKey', 'password')}\n </div>\n </div>\n </div>\n `)}\n </div>\n `)}\n\n <div class=\"settings-section\">\n <h3>Tool Settings</h3>\n <wa-checkbox\n ?checked=\"${this.requireToolApproval}\"\n @change=\"${(e: Event) => { this.requireToolApproval = (e.target as any).checked; this.markDirtyAndUpdate(); }}\">\n Require approval before executing tools\n </wa-checkbox>\n <wa-checkbox\n ?checked=\"${this.smartToolDetection}\"\n @change=\"${(e: Event) => { this.smartToolDetection = (e.target as any).checked; this.markDirtyAndUpdate(); }}\">\n Smart tool detection (use ML to detect when tools are needed)\n </wa-checkbox>\n </div>\n </div>\n `;\n }\n\n static styles = css`\n :host { display: block; height: 100%; overflow: auto; }\n\n .editor {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1rem;\n }\n\n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .editor-header h2 { margin: 0; font-size: 1.25rem; }\n\n .providers-list { display: flex; flex-direction: column; gap: 1rem; }\n\n .provider-card {\n border: solid var(--wa-border-width-s) var(--wa-color-neutral-border-loud);\n border-radius: var(--wa-border-radius-m);\n overflow: hidden;\n }\n\n .provider-card-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 0.75rem;\n background: var(--wa-color-surface-lowered);\n border-bottom: solid var(--wa-border-width-s) var(--wa-color-neutral-border-subtle);\n }\n\n .provider-card-header.is-default {\n background: var(--wa-color-brand-fill-quiet);\n border-bottom-color: var(--wa-color-brand-border-quiet);\n }\n\n .default-badge {\n font-size: 0.75rem;\n font-weight: 600;\n padding: 0.1rem 0.4rem;\n background: var(--wa-color-brand-fill-loud);\n color: var(--wa-color-brand-on-loud);\n border-radius: var(--wa-border-radius-s);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n .provider-name {\n font-weight: 500;\n flex: 1;\n }\n\n .provider-fields {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 0.75rem;\n }\n\n .field-row {\n display: grid;\n grid-template-columns: 120px 1fr;\n align-items: start;\n gap: 0.5rem;\n }\n\n .field-row label {\n font-size: 0.875rem;\n color: var(--wa-color-text-quiet);\n padding-top: 0.4rem;\n }\n\n .model-row { display: flex; gap: 0.25rem; align-items: center; }\n .model-row wa-input { flex: 1; }\n\n .settings-section {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding-top: 1rem;\n border-top: solid var(--wa-border-width-s) var(--wa-color-neutral-border-subtle);\n }\n\n .settings-section h3 { margin: 0 0 0.5rem 0; font-size: 1rem; }\n\n .empty-state {\n display: flex;\n justify-content: center;\n padding: 3rem;\n color: var(--wa-color-text-subtle);\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-ai-config-editor': DocksAIConfigEditor;\n }\n}\n","import { html } from '@eclipse-docks/core/externals/lit';\nimport { rootContext } from '@eclipse-docks/core';\nimport { aiService } from './service/ai-service';\nimport { contributionRegistry } from '@eclipse-docks/core';\nimport type { HTMLContribution } from '@eclipse-docks/core';\nimport { editorRegistry } from '@eclipse-docks/core';\nimport type { EditorInput } from '@eclipse-docks/core';\nimport { registerAll, appSettings } from '@eclipse-docks/core';\nimport { TOOLBAR_BOTTOM, SIDEBAR_AUXILIARY } from '@eclipse-docks/core';\nimport { CID_AGENTS, KEY_AI_CONFIG } from './core/constants';\nimport type { AgentContribution, AgentToolsConfig } from './core/interfaces';\nimport type { AIConfig } from './core/types';\nimport GENERAL_SYS_PROMPT from './general-assistant-prompt.txt?raw';\n\nimport './chat-provider-contributions';\nimport './prompt-enhancer-contributions';\nimport './view/aiview';\nimport './view/token-usage';\nimport './view/components/ai-config-editor';\n\ncontributionRegistry.registerContribution(SIDEBAR_AUXILIARY, {\n name: 'aiview',\n label: 'AI Assistant',\n icon: 'robot',\n component: (id: string) => html`<docks-aiview id=\"${id}\"></docks-aiview>`\n});\n\ncontributionRegistry.registerContribution(CID_AGENTS, {\n label: 'App Support',\n description: 'General-purpose assistant that can answer questions and execute app commands',\n role: 'appsupport',\n priority: 100,\n icon: 'question-circle',\n sysPrompt: GENERAL_SYS_PROMPT,\n tools: async () => {\n const config = await appSettings.get(KEY_AI_CONFIG) as AIConfig | undefined;\n return {\n enabled: true,\n smartToolDetection: config?.smartToolDetection ?? false\n } as AgentToolsConfig;\n }\n} as AgentContribution);\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM, {\n target: TOOLBAR_BOTTOM,\n label: 'Token Usage',\n component: '<docks-token-usage></docks-token-usage>'\n} as HTMLContribution);\n\neditorRegistry.registerEditorInputHandler({\n editorId: 'system.ai-config-editor',\n label: 'AI Config',\n ranking: 1000,\n canHandle: (input: EditorInput) => input.key === '.system.ai-config',\n handle: async (input: EditorInput) => {\n input.component = (id: string) => html`<docks-ai-config-editor id=\"${id}\" .input=${input}></docks-ai-config-editor>`;\n return input;\n }\n});\n\nregisterAll({\n command: {\n id: 'open_ai_config',\n name: 'Open AI Configuration',\n description: 'Open the AI system configuration editor',\n parameters: []\n },\n handler: {\n execute: (_context: any) => {\n const editorInput: EditorInput = {\n title: 'AI Settings',\n data: {},\n key: '.system.ai-config',\n icon: 'robot',\n state: {}\n } as EditorInput;\n editorRegistry.loadEditor(editorInput).then();\n }\n },\n});\n\nrootContext.put('aiService', aiService);\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=ai-system-extension.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-system-extension.d.ts","sourceRoot":"","sources":["../src/ai-system-extension.ts"],"names":[],"mappings":"AAcA,OAAO,+BAA+B,CAAC;AACvC,OAAO,iCAAiC,CAAC;AACzC,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oCAAoC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=chat-provider-contributions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat-provider-contributions.d.ts","sourceRoot":"","sources":["../src/chat-provider-contributions.ts"],"names":[],"mappings":""}
@@ -1,21 +0,0 @@
1
- export declare const TOPIC_AI_STREAM_STARTED = "events/aiservice/streamStarted";
2
- export declare const TOPIC_AI_STREAM_CHUNK = "events/aiservice/streamChunk";
3
- export declare const TOPIC_AI_STREAM_COMPLETE = "events/aiservice/streamComplete";
4
- export declare const TOPIC_AI_STREAM_ERROR = "events/aiservice/streamError";
5
- export declare const TOPIC_AICONFIG_CHANGED = "events/aiservice/aiConfigChanged";
6
- export declare const TOPIC_AGENT_WORKFLOW_STARTED = "events/aiservice/agentWorkflowStarted";
7
- export declare const TOPIC_AGENT_WORKFLOW_COMPLETE = "events/aiservice/agentWorkflowComplete";
8
- export declare const TOPIC_AGENT_WORKFLOW_ERROR = "events/aiservice/agentWorkflowError";
9
- export declare const CID_AGENTS = "aiservice.agents";
10
- export declare const CID_CHAT_PROVIDERS = "aiservice.chatProviders";
11
- export declare const CID_PROMPT_ENHANCERS = "aiservice.promptEnhancers";
12
- export declare const KEY_AI_CONFIG = "aiConfig";
13
- export declare const DEFAULT_AGENT_ROLE = "appsupport";
14
- export declare const AI_CONFIG_TEMPLATE: {
15
- defaultProvider: string;
16
- providers: never[];
17
- requireToolApproval: boolean;
18
- };
19
- export declare const MAX_TOOL_ITERATIONS = 10;
20
- export declare const MAX_RECENT_TOOL_CALLS = 5;
21
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,mCAAmC,CAAC;AACxE,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AACpE,eAAO,MAAM,wBAAwB,oCAAoC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AACpE,eAAO,MAAM,sBAAsB,qCAAqC,CAAC;AACzE,eAAO,MAAM,4BAA4B,0CAA0C,CAAC;AACpF,eAAO,MAAM,6BAA6B,2CAA2C,CAAC;AACtF,eAAO,MAAM,0BAA0B,wCAAwC,CAAC;AAEhF,eAAO,MAAM,UAAU,qBAAqB,CAAC;AAC7C,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAC5D,eAAO,MAAM,oBAAoB,8BAA8B,CAAC;AAEhE,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAE/C,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,qBAAqB,IAAI,CAAC"}
@@ -1,4 +0,0 @@
1
- export * from './types';
2
- export * from './interfaces';
3
- export * from './constants';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
@@ -1,138 +0,0 @@
1
- import { ExecutionContext, Contribution, DependencyContext } from '@eclipse-docks/core';
2
- import { ChatMessage, ChatHistory, ChatProvider, ToolDefinition, StreamChunk, ToolCall, WorkflowExecution, ApiMessage, TokenUsage, ArtifactType, TaskPlan, TaskStep, Artifact } from './types';
3
- export type StreamStatus = 'starting' | 'streaming' | 'complete' | 'error';
4
- export type CompletionExecutor = (messages: any[], chatConfig: ChatProvider) => Promise<string>;
5
- export interface ChatProviderContribution extends Contribution {
6
- provider: ChatProvider;
7
- }
8
- export interface StreamingParams {
9
- model: string;
10
- messages: ApiMessage[];
11
- chatConfig: ChatProvider;
12
- tools?: ToolDefinition[];
13
- signal?: AbortSignal;
14
- }
15
- export interface CompletionParams {
16
- model: string;
17
- messages: ApiMessage[];
18
- chatConfig: ChatProvider;
19
- tools?: ToolDefinition[];
20
- }
21
- export interface IProvider {
22
- name: string;
23
- canHandle(chatProvider: ChatProvider): boolean;
24
- stream(params: StreamingParams): AsyncIterable<StreamChunk>;
25
- complete?(params: CompletionParams): Promise<ChatMessage>;
26
- getAvailableModels?(chatProvider: ChatProvider): Promise<Array<{
27
- id: string;
28
- name: string;
29
- }>> | Array<{
30
- id: string;
31
- name: string;
32
- }>;
33
- }
34
- export interface PromptEnhancer {
35
- enhance(prompt: string, context: ExecutionContext): Promise<string>;
36
- priority?: number;
37
- }
38
- export interface PromptEnhancerContribution extends Contribution {
39
- enhancer: PromptEnhancer;
40
- priority?: number;
41
- }
42
- export interface MessageProcessor {
43
- process(message: ChatMessage, context: ExecutionContext): Promise<ChatMessage>;
44
- priority?: number;
45
- }
46
- export interface AgentHooks {
47
- beforeSend?: (messages: ChatMessage[], context: ExecutionContext) => Promise<void>;
48
- afterReceive?: (message: ChatMessage, context: ExecutionContext) => Promise<void>;
49
- }
50
- export interface AgentToolsConfig {
51
- enabled: boolean;
52
- commandFilter?: (command: any, context: ExecutionContext) => boolean;
53
- smartToolDetection?: boolean;
54
- }
55
- export interface AgentContribution extends Contribution {
56
- role: string;
57
- description: string;
58
- sysPrompt: string | (() => string);
59
- canHandle?: (context: ExecutionContext) => boolean;
60
- priority?: number;
61
- promptEnhancers?: PromptEnhancer[];
62
- messageProcessors?: MessageProcessor[];
63
- hooks?: AgentHooks;
64
- tools?: AgentToolsConfig | (() => AgentToolsConfig | Promise<AgentToolsConfig>);
65
- produces?: ArtifactType[];
66
- consumes?: ArtifactType[];
67
- reviewerFor?: string[];
68
- maxRevisions?: number;
69
- isOrchestrator?: boolean;
70
- idempotent?: boolean;
71
- }
72
- export interface UserAttentionHandler {
73
- onConfirmation?: (message: string, context: ExecutionContext) => Promise<boolean>;
74
- onInput?: (prompt: string, defaultValue?: string, context?: ExecutionContext) => Promise<string | null>;
75
- }
76
- export interface ToolApprovalRequest {
77
- toolCalls: ToolCall[];
78
- message: string;
79
- }
80
- export interface AgentWorkflowOptions {
81
- chatContext: ChatHistory;
82
- chatConfig?: ChatProvider;
83
- callContext: DependencyContext;
84
- execution?: WorkflowExecution;
85
- roles?: string[];
86
- sharedState?: ExecutionContext;
87
- onAgentStart?: (role: string) => void;
88
- onAgentComplete?: (role: string, message: ChatMessage) => void;
89
- onAgentError?: (role: string, error: Error) => void;
90
- onToken?: (role: string, token: string) => void;
91
- onStatus?: (role: string, status: StreamStatus) => void;
92
- onToolApprovalRequest?: (role: string, request: ToolApprovalRequest) => Promise<boolean>;
93
- requireToolApproval?: boolean;
94
- signal?: AbortSignal;
95
- stream?: boolean;
96
- }
97
- export interface AgentWorkflowResult {
98
- messages: Map<string, ChatMessage>;
99
- sharedState: ExecutionContext;
100
- errors: Map<string, Error>;
101
- }
102
- export interface AIServiceOptions {
103
- chatContext: ChatHistory;
104
- chatConfig?: ChatProvider;
105
- callContext?: DependencyContext;
106
- stream?: boolean;
107
- onToken?: (token: string) => void;
108
- onStatus?: (status: StreamStatus) => void;
109
- onProgress?: (progress: {
110
- received: number;
111
- total?: number;
112
- }) => void;
113
- signal?: AbortSignal;
114
- tools?: ToolDefinition[];
115
- }
116
- export interface AIServiceResult {
117
- message: ChatMessage;
118
- streamController?: ReadableStreamDefaultController<StreamChunk>;
119
- tokenUsage?: TokenUsage;
120
- }
121
- export interface TaskOptions {
122
- prompt: string;
123
- chatContext?: ChatHistory;
124
- chatConfig?: ChatProvider;
125
- callContext?: DependencyContext;
126
- signal?: AbortSignal;
127
- onStepStart?: (step: TaskStep) => void;
128
- onStepComplete?: (step: TaskStep, artifact: Artifact) => void;
129
- onStepError?: (step: TaskStep, error: Error) => void;
130
- onPlanReady?: (plan: TaskPlan) => void;
131
- }
132
- export interface TaskResult {
133
- plan: TaskPlan;
134
- artifacts: Artifact[];
135
- errors: Map<string, Error>;
136
- }
137
- export type { ApiMessage } from './types';
138
- //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/core/interfaces.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { ChatMessage, ApiMessage } from './types';
2
- export declare function sanitizeMessageForAPI(message: ChatMessage | ApiMessage): ApiMessage;
3
- export declare function sanitizeMessagesForAPI(messages: (ChatMessage | ApiMessage)[]): ApiMessage[];
4
- //# sourceMappingURL=message-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-utils.d.ts","sourceRoot":"","sources":["../../src/core/message-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,UAAU,CAenF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,CAAC,WAAW,GAAG,UAAU,CAAC,EAAE,GAAG,UAAU,EAAE,CAE3F"}