@eclipse-lyra/extension-ai-system 0.0.0

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 (137) hide show
  1. package/dist/agents/agent-registry.d.ts +8 -0
  2. package/dist/agents/agent-registry.d.ts.map +1 -0
  3. package/dist/agents/index.d.ts +6 -0
  4. package/dist/agents/index.d.ts.map +1 -0
  5. package/dist/agents/message-processor.d.ts +9 -0
  6. package/dist/agents/message-processor.d.ts.map +1 -0
  7. package/dist/agents/orchestrator.d.ts +12 -0
  8. package/dist/agents/orchestrator.d.ts.map +1 -0
  9. package/dist/agents/prompt-builder.d.ts +21 -0
  10. package/dist/agents/prompt-builder.d.ts.map +1 -0
  11. package/dist/agents/reviewer.d.ts +15 -0
  12. package/dist/agents/reviewer.d.ts.map +1 -0
  13. package/dist/ai-service-CGdlV3FV.js +1731 -0
  14. package/dist/ai-service-CGdlV3FV.js.map +1 -0
  15. package/dist/ai-system-extension-CPLV13Lk.js +2394 -0
  16. package/dist/ai-system-extension-CPLV13Lk.js.map +1 -0
  17. package/dist/ai-system-extension.d.ts +1 -0
  18. package/dist/ai-system-extension.d.ts.map +1 -0
  19. package/dist/api.d.ts +8 -0
  20. package/dist/api.d.ts.map +1 -0
  21. package/dist/api.js +46 -0
  22. package/dist/api.js.map +1 -0
  23. package/dist/chat-provider-contributions.d.ts +2 -0
  24. package/dist/chat-provider-contributions.d.ts.map +1 -0
  25. package/dist/core/constants.d.ts +21 -0
  26. package/dist/core/constants.d.ts.map +1 -0
  27. package/dist/core/index.d.ts +4 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/interfaces.d.ts +138 -0
  30. package/dist/core/interfaces.d.ts.map +1 -0
  31. package/dist/core/message-utils.d.ts +4 -0
  32. package/dist/core/message-utils.d.ts.map +1 -0
  33. package/dist/core/types.d.ts +128 -0
  34. package/dist/core/types.d.ts.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +10 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/prompt-enhancer-contributions.d.ts +2 -0
  40. package/dist/prompt-enhancer-contributions.d.ts.map +1 -0
  41. package/dist/providers/base-provider.d.ts +15 -0
  42. package/dist/providers/base-provider.d.ts.map +1 -0
  43. package/dist/providers/index.d.ts +9 -0
  44. package/dist/providers/index.d.ts.map +1 -0
  45. package/dist/providers/ollama-provider.d.ts +7 -0
  46. package/dist/providers/ollama-provider.d.ts.map +1 -0
  47. package/dist/providers/openai-provider.d.ts +7 -0
  48. package/dist/providers/openai-provider.d.ts.map +1 -0
  49. package/dist/providers/provider-factory.d.ts +10 -0
  50. package/dist/providers/provider-factory.d.ts.map +1 -0
  51. package/dist/providers/provider-utils.d.ts +5 -0
  52. package/dist/providers/provider-utils.d.ts.map +1 -0
  53. package/dist/providers/streaming/ollama-parser.d.ts +9 -0
  54. package/dist/providers/streaming/ollama-parser.d.ts.map +1 -0
  55. package/dist/providers/streaming/sse-parser.d.ts +10 -0
  56. package/dist/providers/streaming/sse-parser.d.ts.map +1 -0
  57. package/dist/providers/streaming/stream-parser.d.ts +10 -0
  58. package/dist/providers/streaming/stream-parser.d.ts.map +1 -0
  59. package/dist/service/ai-service.d.ts +47 -0
  60. package/dist/service/ai-service.d.ts.map +1 -0
  61. package/dist/service/token-usage-tracker.d.ts +16 -0
  62. package/dist/service/token-usage-tracker.d.ts.map +1 -0
  63. package/dist/task/task-checkpoint.d.ts +12 -0
  64. package/dist/task/task-checkpoint.d.ts.map +1 -0
  65. package/dist/task/task-plan.d.ts +7 -0
  66. package/dist/task/task-plan.d.ts.map +1 -0
  67. package/dist/task/task-runner.d.ts +10 -0
  68. package/dist/task/task-runner.d.ts.map +1 -0
  69. package/dist/tools/index.d.ts +6 -0
  70. package/dist/tools/index.d.ts.map +1 -0
  71. package/dist/tools/token-estimator.d.ts +12 -0
  72. package/dist/tools/token-estimator.d.ts.map +1 -0
  73. package/dist/tools/tool-call-accumulator.d.ts +9 -0
  74. package/dist/tools/tool-call-accumulator.d.ts.map +1 -0
  75. package/dist/tools/tool-executor.d.ts +13 -0
  76. package/dist/tools/tool-executor.d.ts.map +1 -0
  77. package/dist/tools/tool-name-utils.d.ts +2 -0
  78. package/dist/tools/tool-name-utils.d.ts.map +1 -0
  79. package/dist/tools/tool-registry.d.ts +7 -0
  80. package/dist/tools/tool-registry.d.ts.map +1 -0
  81. package/dist/utils/token-estimator.d.ts +2 -0
  82. package/dist/utils/token-estimator.d.ts.map +1 -0
  83. package/dist/utils/tool-detector.d.ts +10 -0
  84. package/dist/utils/tool-detector.d.ts.map +1 -0
  85. package/dist/view/agent-group-manager.d.ts +37 -0
  86. package/dist/view/agent-group-manager.d.ts.map +1 -0
  87. package/dist/view/aiview.d.ts +42 -0
  88. package/dist/view/aiview.d.ts.map +1 -0
  89. package/dist/view/components/ai-agent-response-group.d.ts +18 -0
  90. package/dist/view/components/ai-agent-response-group.d.ts.map +1 -0
  91. package/dist/view/components/ai-chat-input.d.ts +20 -0
  92. package/dist/view/components/ai-chat-input.d.ts.map +1 -0
  93. package/dist/view/components/ai-chat-message.d.ts +22 -0
  94. package/dist/view/components/ai-chat-message.d.ts.map +1 -0
  95. package/dist/view/components/ai-config-editor.d.ts +33 -0
  96. package/dist/view/components/ai-config-editor.d.ts.map +1 -0
  97. package/dist/view/components/ai-empty-state.d.ts +13 -0
  98. package/dist/view/components/ai-empty-state.d.ts.map +1 -0
  99. package/dist/view/components/ai-tool-approval.d.ts +26 -0
  100. package/dist/view/components/ai-tool-approval.d.ts.map +1 -0
  101. package/dist/view/components/index.d.ts +7 -0
  102. package/dist/view/components/index.d.ts.map +1 -0
  103. package/dist/view/provider-manager.d.ts +30 -0
  104. package/dist/view/provider-manager.d.ts.map +1 -0
  105. package/dist/view/session-manager.d.ts +25 -0
  106. package/dist/view/session-manager.d.ts.map +1 -0
  107. package/dist/view/stream-manager.d.ts +23 -0
  108. package/dist/view/stream-manager.d.ts.map +1 -0
  109. package/dist/view/task-progress-panel.d.ts +14 -0
  110. package/dist/view/task-progress-panel.d.ts.map +1 -0
  111. package/dist/view/token-usage.d.ts +18 -0
  112. package/dist/view/token-usage.d.ts.map +1 -0
  113. package/dist/view/workspace-panel.d.ts +15 -0
  114. package/dist/view/workspace-panel.d.ts.map +1 -0
  115. package/dist/workflows/base-sequential-workflow.d.ts +13 -0
  116. package/dist/workflows/base-sequential-workflow.d.ts.map +1 -0
  117. package/dist/workflows/conditional-workflow.d.ts +7 -0
  118. package/dist/workflows/conditional-workflow.d.ts.map +1 -0
  119. package/dist/workflows/index.d.ts +10 -0
  120. package/dist/workflows/index.d.ts.map +1 -0
  121. package/dist/workflows/orchestrated-workflow.d.ts +10 -0
  122. package/dist/workflows/orchestrated-workflow.d.ts.map +1 -0
  123. package/dist/workflows/parallel-workflow.d.ts +6 -0
  124. package/dist/workflows/parallel-workflow.d.ts.map +1 -0
  125. package/dist/workflows/pipeline-workflow.d.ts +7 -0
  126. package/dist/workflows/pipeline-workflow.d.ts.map +1 -0
  127. package/dist/workflows/review-workflow.d.ts +10 -0
  128. package/dist/workflows/review-workflow.d.ts.map +1 -0
  129. package/dist/workflows/sequential-workflow.d.ts +7 -0
  130. package/dist/workflows/sequential-workflow.d.ts.map +1 -0
  131. package/dist/workflows/workflow-engine.d.ts +8 -0
  132. package/dist/workflows/workflow-engine.d.ts.map +1 -0
  133. package/dist/workflows/workflow-strategy.d.ts +8 -0
  134. package/dist/workflows/workflow-strategy.d.ts.map +1 -0
  135. package/dist/workspace/workspace.d.ts +20 -0
  136. package/dist/workspace/workspace.d.ts.map +1 -0
  137. package/package.json +34 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-service-CGdlV3FV.js","sources":["../src/core/constants.ts","../src/providers/streaming/stream-parser.ts","../src/providers/streaming/sse-parser.ts","../src/providers/streaming/ollama-parser.ts","../src/providers/provider-utils.ts","../src/providers/base-provider.ts","../src/providers/openai-provider.ts","../src/providers/ollama-provider.ts","../src/providers/provider-factory.ts","../src/agents/agent-registry.ts","../src/core/message-utils.ts","../src/utils/tool-detector.ts","../src/agents/prompt-builder.ts","../src/agents/message-processor.ts","../src/tools/tool-call-accumulator.ts","../src/tools/tool-name-utils.ts","../src/tools/tool-executor.ts","../src/tools/tool-registry.ts","../src/workflows/parallel-workflow.ts","../src/workflows/base-sequential-workflow.ts","../src/workflows/sequential-workflow.ts","../src/workflows/conditional-workflow.ts","../src/workflows/pipeline-workflow.ts","../src/task/task-plan.ts","../src/agents/orchestrator.ts","../src/workspace/workspace.ts","../src/task/task-checkpoint.ts","../src/task/task-runner.ts","../src/workflows/orchestrated-workflow.ts","../src/agents/reviewer.ts","../src/workflows/review-workflow.ts","../src/workflows/workflow-engine.ts","../src/tools/token-estimator.ts","../src/service/token-usage-tracker.ts","../src/service/ai-service.ts"],"sourcesContent":["export const TOPIC_AI_STREAM_STARTED = \"events/aiservice/streamStarted\";\nexport const TOPIC_AI_STREAM_CHUNK = \"events/aiservice/streamChunk\";\nexport const TOPIC_AI_STREAM_COMPLETE = \"events/aiservice/streamComplete\";\nexport const TOPIC_AI_STREAM_ERROR = \"events/aiservice/streamError\";\nexport const TOPIC_AICONFIG_CHANGED = \"events/aiservice/aiConfigChanged\";\nexport const TOPIC_AGENT_WORKFLOW_STARTED = \"events/aiservice/agentWorkflowStarted\";\nexport const TOPIC_AGENT_WORKFLOW_COMPLETE = \"events/aiservice/agentWorkflowComplete\";\nexport const TOPIC_AGENT_WORKFLOW_ERROR = \"events/aiservice/agentWorkflowError\";\n\nexport const CID_AGENTS = \"aiservice.agents\";\nexport const CID_CHAT_PROVIDERS = \"aiservice.chatProviders\";\nexport const CID_PROMPT_ENHANCERS = \"aiservice.promptEnhancers\";\n\nexport const KEY_AI_CONFIG = \"aiConfig\";\nexport const DEFAULT_AGENT_ROLE = \"appsupport\";\n\nexport const AI_CONFIG_TEMPLATE = {\n \"defaultProvider\": \"openai\",\n \"providers\": [],\n \"requireToolApproval\": true\n};\n\nexport const MAX_TOOL_ITERATIONS = 10;\nexport const MAX_RECENT_TOOL_CALLS = 5;\n","import type { StreamChunk, TokenUsage } from \"../../core/types\";\n\nexport abstract class StreamParser {\n protected decoder = new TextDecoder();\n protected usage: TokenUsage | null = null;\n\n abstract parse(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<StreamChunk>;\n\n protected abstract processLine(line: string): AsyncGenerator<StreamChunk>;\n\n protected async *readLines(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<StreamChunk> {\n let buffer = '';\n this.usage = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += this.decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) yield* this.processLine(line);\n }\n }\n\n if (buffer.trim()) yield* this.processLine(buffer);\n\n yield this.makeDoneChunk();\n } finally {\n reader.releaseLock();\n }\n }\n\n protected makeDoneChunk(): StreamChunk {\n const chunk: StreamChunk = { type: 'done', content: '' };\n if (this.usage) chunk.metadata = { usage: this.usage };\n return chunk;\n }\n}\n","import { StreamParser } from \"./stream-parser\";\nimport type { StreamChunk, ToolCall } from \"../../core/types\";\n\nexport class SSEParser extends StreamParser {\n async *parse(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<StreamChunk> {\n yield* this.readLines(reader);\n }\n\n protected async *processLine(line: string): AsyncGenerator<StreamChunk> {\n if (!line.startsWith('data: ')) return;\n\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n yield this.makeDoneChunk();\n return;\n }\n\n try {\n const json = JSON.parse(data);\n if (json.error) {\n yield { type: 'error', content: json.error.message || 'Unknown error', metadata: json.error };\n return;\n }\n this.extractUsage(json);\n const chunk = this.parseChunk(json);\n if (chunk) yield chunk;\n } catch {\n // ignore malformed lines\n }\n }\n\n private extractUsage(json: any): void {\n if (!json.usage) return;\n const u = json.usage;\n this.usage = {\n promptTokens: u.prompt_tokens || 0,\n completionTokens: u.completion_tokens || 0,\n totalTokens: u.total_tokens || 0,\n estimated: false\n };\n }\n\n private parseChunk(json: any): StreamChunk | null {\n const delta = json.choices?.[0]?.delta;\n const choice = json.choices?.[0];\n\n if (delta?.content) {\n return {\n type: 'token',\n content: delta.content,\n message: { role: delta.role || 'assistant', content: choice?.message?.content || delta.content }\n };\n }\n\n if (choice?.message?.tool_calls) {\n const toolCalls = this.parseToolCalls(choice.message.tool_calls, true);\n if (toolCalls.length > 0) return { type: 'token', content: '', toolCalls };\n } else if (delta?.tool_calls || choice?.delta?.tool_calls) {\n const toolCalls = this.parseToolCalls(delta?.tool_calls || choice?.delta?.tool_calls || [], false);\n if (toolCalls.length > 0) return { type: 'token', content: '', toolCalls };\n }\n\n return null;\n }\n\n private parseToolCalls(toolCalls: any[], isComplete: boolean): ToolCall[] {\n return toolCalls\n .filter(tc => tc.function !== undefined)\n .map((tc, idx) => ({\n id: tc.id || `call_${tc.index !== undefined ? tc.index : idx}_${Date.now()}`,\n type: \"function\" as const,\n function: {\n name: tc.function?.name || \"\",\n arguments: tc.function?.arguments || (isComplete ? \"{}\" : \"\")\n },\n _index: tc.index !== undefined ? tc.index : idx\n } as ToolCall & { _index?: number }));\n }\n}\n","import { StreamParser } from \"./stream-parser\";\nimport type { StreamChunk } from \"../../core/types\";\n\nexport class OllamaParser extends StreamParser {\n async *parse(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<StreamChunk> {\n yield* this.readLines(reader);\n }\n\n protected async *processLine(line: string): AsyncGenerator<StreamChunk> {\n try {\n const json = JSON.parse(line);\n if (json.error) {\n yield { type: 'error', content: json.error, metadata: json };\n return;\n }\n if (json.done) {\n this.extractUsage(json);\n yield this.makeDoneChunk();\n return;\n }\n const tokenChunk = this.parseToken(json);\n if (tokenChunk) yield tokenChunk;\n } catch {\n // ignore malformed lines\n }\n }\n\n private extractUsage(json: any): void {\n if (json.prompt_eval_count === undefined && json.eval_count === undefined) return;\n const promptTokens = json.prompt_eval_count || 0;\n const completionTokens = json.eval_count || 0;\n this.usage = { promptTokens, completionTokens, totalTokens: promptTokens + completionTokens, estimated: false };\n }\n\n private parseToken(json: any): StreamChunk | null {\n if (json.message?.content) {\n return { type: 'token', content: json.message.content, message: { role: json.message.role || 'assistant', content: json.message.content } };\n }\n if (json.response) {\n return { type: 'token', content: json.response, message: { role: 'assistant', content: json.response } };\n }\n return null;\n }\n}\n","import type { ChatProvider } from \"../core/types\";\nimport type { ProviderFactory } from \"./provider-factory\";\n\nexport async function streamToText(messages: any[], chatConfig: ChatProvider, providerFactory: ProviderFactory): Promise<string> {\n let content = '';\n const provider = providerFactory.getProvider(chatConfig);\n for await (const chunk of provider.stream({ model: chatConfig.model, messages, chatConfig })) {\n if (chunk.type === 'token') content += chunk.content;\n }\n return content;\n}\n\nexport function extractBaseUrl(endpoint: string): string | null {\n if (!endpoint) return null;\n\n if (endpoint.includes('/v1/chat/completions')) {\n return endpoint.replace('/v1/chat/completions', '');\n }\n if (endpoint.includes('/api/v1/chat/completions')) {\n return endpoint.replace('/api/v1/chat/completions', '');\n }\n if (endpoint.includes('/api/chat/completion')) {\n return endpoint.replace('/api/chat/completion', '');\n }\n\n try {\n const url = new URL(endpoint);\n return `${url.protocol}//${url.host}`;\n } catch {\n return null;\n }\n}\n","import type { IProvider, StreamingParams } from \"../core/interfaces\";\nimport type { StreamChunk, ChatProvider } from \"../core/types\";\nimport { SSEParser } from \"./streaming/sse-parser\";\nimport { OllamaParser } from \"./streaming/ollama-parser\";\nimport { extractBaseUrl } from \"./provider-utils\";\n\nexport abstract class BaseProvider implements IProvider {\n abstract name: string;\n abstract canHandle(chatProvider: ChatProvider): boolean;\n\n protected createParser(contentType: string, endpoint: string): SSEParser | OllamaParser {\n if (contentType.includes('text/event-stream') || endpoint.includes('openai')) {\n return new SSEParser();\n }\n return new OllamaParser();\n }\n\n async getAvailableModels(chatProvider: ChatProvider): Promise<Array<{ id: string; name: string }>> {\n if (!chatProvider.chatApiEndpoint) return [];\n\n const baseUrl = extractBaseUrl(chatProvider.chatApiEndpoint);\n if (!baseUrl) return [];\n\n try {\n const headers: HeadersInit = { 'Content-Type': 'application/json' };\n if (chatProvider.apiKey) {\n headers['Authorization'] = `Bearer ${chatProvider.apiKey}`;\n }\n\n const response = await fetch(`${baseUrl}/v1/models`, { method: 'GET', headers });\n if (!response.ok) return [];\n\n const data = await response.json();\n return (data.data || []).map((m: any) => ({ id: m.id, name: m.name || m.id }));\n } catch {\n return [];\n }\n }\n\n async *stream(params: StreamingParams): AsyncIterable<StreamChunk> {\n const requestBody: any = {\n model: params.model,\n stream: true,\n messages: params.messages,\n ...params.chatConfig.parameters\n };\n\n if (params.tools && params.tools.length > 0) {\n requestBody.tools = params.tools;\n requestBody.tool_choice = \"auto\";\n }\n\n const response = await fetch(params.chatConfig.chatApiEndpoint, {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${params.chatConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"Accept\": \"text/event-stream\"\n },\n body: JSON.stringify(requestBody),\n signal: params.signal\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n yield { type: 'error', content: `HTTP ${response.status}: ${errorText}`, metadata: { status: response.status } };\n return;\n }\n\n if (!response.body) {\n yield { type: 'error', content: 'Response body is null or empty', metadata: { status: response.status } };\n return;\n }\n\n const reader = response.body.getReader();\n if (!reader) {\n yield { type: 'error', content: 'Response body is not readable' };\n return;\n }\n\n const contentType = response.headers.get('content-type') || '';\n const parser = this.createParser(contentType, params.chatConfig.chatApiEndpoint);\n\n try {\n for await (const chunk of parser.parse(reader)) {\n yield chunk;\n }\n } catch (error) {\n yield {\n type: 'error',\n content: error instanceof Error ? error.message : 'Failed to parse response stream',\n metadata: { error, contentType }\n };\n }\n }\n}\n","import { BaseProvider } from \"./base-provider\";\nimport type { ChatProvider } from \"../core/types\";\n\nexport class OpenAIProvider extends BaseProvider {\n name = \"openai\";\n\n canHandle(chatProvider: ChatProvider): boolean {\n return chatProvider.chatApiEndpoint.includes('openai') ||\n chatProvider.chatApiEndpoint.includes('v1/chat/completions');\n }\n}\n","import { BaseProvider } from \"./base-provider\";\nimport type { ChatProvider } from \"../core/types\";\n\nexport class OllamaProvider extends BaseProvider {\n name = \"ollama\";\n\n canHandle(chatProvider: ChatProvider): boolean {\n return chatProvider.name.toLowerCase() === 'ollama' ||\n chatProvider.chatApiEndpoint.includes('ollama') ||\n chatProvider.chatApiEndpoint.includes('localhost:11434');\n }\n}\n","import type { IProvider } from \"../core/interfaces\";\nimport type { ChatProvider } from \"../core/types\";\nimport { OpenAIProvider } from \"./openai-provider\";\nimport { OllamaProvider } from \"./ollama-provider\";\n\nexport class ProviderFactory {\n private providers: IProvider[] = [];\n\n constructor() {\n this.providers.push(new OpenAIProvider());\n this.providers.push(new OllamaProvider());\n }\n\n registerProvider(provider: IProvider): void {\n this.providers.push(provider);\n }\n\n getProvider(chatProvider: ChatProvider): IProvider {\n return this.providers.find(p => p.canHandle(chatProvider)) ?? this.providers[0];\n }\n\n getAllProviders(): IProvider[] {\n return [...this.providers];\n }\n}\n","import { contributionRegistry } from \"@eclipse-lyra/core\";\nimport type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport type { AgentContribution } from \"../core/interfaces\";\nimport { CID_AGENTS } from \"../core/constants\";\n\nexport class AgentRegistry {\n getAgentContributions(): AgentContribution[] {\n return contributionRegistry.getContributions(CID_AGENTS) as AgentContribution[];\n }\n\n private filterAndSortAgents(contributions: AgentContribution[], context: ExecutionContext): AgentContribution[] {\n return contributions\n .filter(c => !c.canHandle || c.canHandle(context))\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\n }\n\n getMatchingAgents(context: ExecutionContext, roles?: string[]): AgentContribution[] {\n const contributions = this.getAgentContributions();\n\n if (contributions.length === 0) {\n throw new Error('No agents are registered. The App Support agent should be available from the AI system extension.');\n }\n\n const roleFiltered = roles?.length\n ? contributions.filter(c => roles.includes(c.role))\n : contributions;\n\n const active = this.filterAndSortAgents(roleFiltered, context);\n\n if (roles?.length && active.length === 0) {\n throw new Error(`No agents found for requested roles: ${roles.join(', ')}. Available: ${contributions.map(c => c.role).join(', ')}`);\n }\n\n if (!roles?.length && active.length === 0) {\n throw new Error(`No agents can handle the current context. Available: ${contributions.map(c => c.role).join(', ')}`);\n }\n\n return active;\n }\n}\n","import type { ChatMessage, ApiMessage } from \"./types\";\n\nexport function sanitizeMessageForAPI(message: ChatMessage | ApiMessage): ApiMessage {\n const apiMessage: ApiMessage = {\n role: message.role,\n content: message.content\n };\n\n if ('tool_call_id' in message && message.tool_call_id) {\n apiMessage.tool_call_id = message.tool_call_id;\n }\n\n if ('tool_calls' in message && (message as any).tool_calls) {\n apiMessage.tool_calls = (message as any).tool_calls;\n }\n\n return apiMessage;\n}\n\nexport function sanitizeMessagesForAPI(messages: (ChatMessage | ApiMessage)[]): ApiMessage[] {\n return messages.map(sanitizeMessageForAPI);\n}\n","import { createLogger } from '@eclipse-lyra/core';\n\nconst logger = createLogger('ToolDetector');\n\nconst GREETINGS = ['hello', 'hi', 'hey', 'thanks', 'thank you', 'bye', 'goodbye'];\nconst ACTION_KEYWORDS = [\n 'create', 'open', 'delete', 'read', 'write', 'edit', 'save', 'rename',\n 'move', 'copy', 'list', 'show', 'display', 'run', 'execute', 'build',\n 'add', 'remove', 'update', 'modify', 'change', 'set', 'get', 'find',\n 'search', 'filter', 'sort', 'install', 'uninstall', 'load', 'import',\n 'export', 'generate', 'make', 'do', 'perform', 'call', 'invoke'\n];\nconst CONTEXT_KEYWORDS = [\n 'file', 'folder', 'directory', 'workspace', 'editor', 'map', 'layer',\n 'command', 'tool', 'extension', 'script', 'code', 'project'\n];\n\n/**\n * Heuristic tool detection: decides whether to attach tools based on prompt content\n * only. Avoids a 60MB ML dependency; simple chat never triggers a large download.\n */\nexport class ToolDetector {\n needsTools(prompt: string): boolean {\n if (!prompt?.trim()) return false;\n\n const normalized = prompt.toLowerCase().trim();\n if (GREETINGS.some(g => normalized === g || normalized.startsWith(g + ' '))) return false;\n\n const hasAction = ACTION_KEYWORDS.some(k => prompt.includes(k));\n const hasContext = CONTEXT_KEYWORDS.some(k => prompt.includes(k));\n const needsTools = hasAction && (hasContext || prompt.length > 20);\n if (needsTools) logger.info(`Heuristic: needsTools=true (action+context or long prompt)`);\n return needsTools;\n }\n\n dispose(): void {}\n}\n\nexport const toolDetector = new ToolDetector();\n","import type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport { contributionRegistry } from \"@eclipse-lyra/core\";\nimport type { ChatMessage, ApiMessage, ToolDefinition } from \"../core/types\";\nimport type { PromptEnhancer, AgentContribution, PromptEnhancerContribution } from \"../core/interfaces\";\nimport { CID_PROMPT_ENHANCERS } from \"../core/constants\";\nimport { sanitizeMessagesForAPI } from \"../core/message-utils\";\nimport { ToolRegistry } from \"../tools/tool-registry\";\nimport { toolDetector } from \"../utils/tool-detector\";\n\nexport class PromptBuilder {\n private enhancers: PromptEnhancer[] = [];\n\n constructor(private toolRegistry: ToolRegistry) {}\n\n addEnhancer(enhancer: PromptEnhancer): void {\n this.enhancers.push(enhancer);\n }\n\n private async getSysPrompt(contribution: AgentContribution, context: ExecutionContext): Promise<string> {\n let sysPrompt = contribution.sysPrompt;\n if (typeof sysPrompt === 'function') sysPrompt = sysPrompt();\n\n if (!sysPrompt || typeof sysPrompt !== 'string') {\n throw new Error(`Agent \"${contribution.role}\" is missing a system prompt.`);\n }\n\n const allEnhancers = [\n ...(contribution.promptEnhancers || []),\n ...this.enhancers,\n ...this.getContributedEnhancers()\n ].sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n let enhanced = sysPrompt;\n for (const enhancer of allEnhancers) {\n try {\n const result = await enhancer.enhance(enhanced, context);\n if (result && typeof result === 'string') enhanced = result;\n } catch (err) {\n console.warn('[PromptBuilder] Enhancer failed:', err);\n }\n }\n return enhanced;\n }\n\n private rewriteChatHistoryForAgent(history: ApiMessage[], targetRole: string): ApiMessage[] {\n return history.map(m => {\n if (m.role === \"user\") return { role: m.role, content: m.content };\n if (m.role === targetRole) return { role: \"assistant\", content: m.content };\n return { role: \"user\", content: `***Agent '${m.role}' replied:***\\n${m.content}` };\n });\n }\n\n private getContributedEnhancers(): PromptEnhancer[] {\n const contributions = contributionRegistry.getContributions(CID_PROMPT_ENHANCERS) as PromptEnhancerContribution[];\n return contributions.map(c => ({ ...c.enhancer, priority: c.priority ?? c.enhancer.priority }));\n }\n\n async build(\n contribution: AgentContribution,\n messages: ChatMessage[],\n context: ExecutionContext,\n hooks?: { beforeSend?: (messages: ChatMessage[], context: ExecutionContext) => Promise<void> }\n ): Promise<{ messages: ApiMessage[]; userPromptIndex: number; tools?: ToolDefinition[] }> {\n if (hooks?.beforeSend) await hooks.beforeSend(messages, context);\n\n const sanitized = sanitizeMessagesForAPI(messages);\n const rewritten = this.rewriteChatHistoryForAgent(sanitized, contribution.role);\n\n let toolsConfig = contribution.tools;\n if (typeof toolsConfig === 'function') toolsConfig = await toolsConfig();\n\n let tools: ToolDefinition[] | undefined;\n if (toolsConfig?.enabled) {\n if (toolsConfig.smartToolDetection) {\n const lastUser = messages[messages.length - 1];\n if (toolDetector.needsTools(lastUser?.content || '')) {\n tools = this.toolRegistry.getAvailableTools(context, toolsConfig.commandFilter);\n }\n } else {\n tools = this.toolRegistry.getAvailableTools(context, toolsConfig.commandFilter);\n }\n }\n\n const sysPrompt = await this.getSysPrompt(contribution, context);\n rewritten.unshift({ role: \"system\", content: sysPrompt });\n\n return { messages: rewritten, userPromptIndex: rewritten.length - 1, tools };\n }\n}\n","import type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport type { ChatMessage } from \"../core/types\";\nimport type { MessageProcessor as IMessageProcessor, AgentContribution } from \"../core/interfaces\";\n\nexport class MessageProcessorService {\n private processors: IMessageProcessor[] = [];\n\n addProcessor(processor: IMessageProcessor): void {\n this.processors.push(processor);\n }\n\n async process(\n message: ChatMessage,\n contribution: AgentContribution,\n context: ExecutionContext\n ): Promise<ChatMessage> {\n const allProcessors = [\n ...(contribution.messageProcessors || []),\n ...this.processors\n ].sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n let processed = { ...message };\n for (const processor of allProcessors) {\n processed = await processor.process(processed, context);\n }\n return processed;\n }\n}\n","import type { ToolCall, StreamChunk } from \"../core/types\";\n\nexport class ToolCallAccumulator {\n private accumulatedToolCalls = new Map<string, ToolCall>();\n private toolCallIndexMap = new Map<number, string>();\n\n processChunk(chunk: StreamChunk): void {\n if (chunk.type !== 'token' || !chunk.toolCalls?.length) return;\n\n for (const toolCall of chunk.toolCalls) {\n const callIndex = (toolCall as any)._index;\n const callId = toolCall.id;\n\n let existing: ToolCall | undefined;\n let targetId: string;\n\n if (callIndex !== undefined && this.toolCallIndexMap.has(callIndex)) {\n targetId = this.toolCallIndexMap.get(callIndex)!;\n existing = this.accumulatedToolCalls.get(targetId);\n } else if (callId && this.accumulatedToolCalls.has(callId)) {\n targetId = callId;\n existing = this.accumulatedToolCalls.get(targetId);\n } else {\n targetId = callId || `call_${callIndex !== undefined ? callIndex : Date.now()}_${Math.random()}`;\n existing = undefined;\n }\n\n if (existing) {\n this.accumulatedToolCalls.set(targetId, {\n id: targetId,\n type: toolCall.type || existing.type,\n function: {\n name: toolCall.function.name || existing.function.name,\n arguments: (existing.function.arguments || \"\") + (toolCall.function.arguments || \"\")\n }\n });\n if (callIndex !== undefined && !this.toolCallIndexMap.has(callIndex)) {\n this.toolCallIndexMap.set(callIndex, targetId);\n }\n } else {\n this.accumulatedToolCalls.set(targetId, { ...toolCall, id: targetId });\n if (callIndex !== undefined) {\n this.toolCallIndexMap.set(callIndex, targetId);\n }\n }\n }\n }\n\n getFinalToolCalls(): ToolCall[] {\n return Array.from(this.accumulatedToolCalls.values())\n .filter(tc => tc.function.name?.trim().length > 0)\n .map(tc => ({\n ...tc,\n function: { ...tc.function, arguments: tc.function.arguments?.trim() || \"{}\" }\n }));\n }\n\n reset(): void {\n this.accumulatedToolCalls.clear();\n this.toolCallIndexMap.clear();\n }\n}\n","export function sanitizeFunctionName(name: string): string {\n return name\n .replace(/[^a-zA-Z0-9_-]/g, '_')\n .replace(/^[^a-zA-Z]/, 'cmd_$&')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '');\n}\n","import type { Command, ExecutionContext } from \"@eclipse-lyra/core\";\nimport { commandRegistry } from \"@eclipse-lyra/core\";\nimport type { ToolCall, ToolResult } from \"../core/types\";\nimport { ToolCallAccumulator } from \"./tool-call-accumulator\";\nimport { sanitizeFunctionName } from \"./tool-name-utils\";\n\nexport class ToolExecutor {\n findCommand(toolCall: ToolCall, context: ExecutionContext): Command | null {\n const sanitizedName = toolCall.function.name;\n const direct = commandRegistry.getCommand(sanitizedName);\n if (direct) return direct;\n\n const allCommands = commandRegistry.listCommands();\n for (const [commandId, command] of Object.entries(allCommands)) {\n if (sanitizeFunctionName(commandId) === sanitizedName) {\n return command;\n }\n }\n return null;\n }\n\n private parseArguments(argsStr: string): Record<string, any> {\n if (!argsStr?.trim() || argsStr === \"{}\") return {};\n try {\n const parsed = JSON.parse(argsStr);\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n }\n\n private sanitizeArguments(args: Record<string, any>, command: Command | null): Record<string, any> {\n if (!command?.parameters || !args || typeof args !== 'object') return args || {};\n\n const sanitizedArgs: Record<string, any> = {};\n command.parameters.forEach(param => {\n const sanitizedParamName = sanitizeFunctionName(param.name);\n if (sanitizedParamName in args) {\n sanitizedArgs[param.name] = args[sanitizedParamName];\n }\n });\n return sanitizedArgs;\n }\n\n async executeToolCall(toolCall: ToolCall, context: ExecutionContext): Promise<ToolResult> {\n try {\n const command = this.findCommand(toolCall, context);\n const commandId = command?.id || toolCall.function.name;\n const args = this.parseArguments(toolCall.function.arguments || \"{}\");\n const sanitizedArgs = this.sanitizeArguments(args, command);\n\n const freshContext = commandRegistry.createExecutionContext(sanitizedArgs);\n const execContext: ExecutionContext = { ...context, ...freshContext, params: sanitizedArgs };\n\n const commandResult = await commandRegistry.execute(commandId, execContext);\n const commandName = command?.name || commandId;\n\n const resultMessage: any = {\n success: true,\n message: `Command \"${commandName}\" executed successfully`,\n command: commandId\n };\n\n if (Object.keys(sanitizedArgs).length > 0) {\n resultMessage.parameters = sanitizedArgs;\n }\n\n if (commandResult != null) {\n let resolved = commandResult;\n if (resolved instanceof Promise) resolved = await resolved;\n resultMessage.result = resolved;\n\n if (command?.output?.length) {\n resultMessage.output = command.output.map(v => `${v.name}: ${v.description || v.type || 'value'}`).join(', ');\n }\n }\n\n return { id: toolCall.id, result: resultMessage };\n } catch (error) {\n let command: Command | null = null;\n try { command = this.findCommand(toolCall, context); } catch { /* noop */ }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const commandName = command?.name || toolCall.function.name;\n\n let detailedError = errorMessage;\n if (errorMessage.includes('No handler found') || errorMessage.includes('No handlers registered')) {\n detailedError = `Command \"${commandName}\" cannot be executed. ${errorMessage}.`;\n }\n\n return { id: toolCall.id, result: null, error: detailedError };\n }\n }\n\n async executeToolCalls(toolCalls: ToolCall[], context: ExecutionContext): Promise<ToolResult[]> {\n const results: ToolResult[] = [];\n for (const toolCall of toolCalls) {\n results.push(await this.executeToolCall(toolCall, context));\n }\n return results;\n }\n\n createToolCallAccumulator(): ToolCallAccumulator {\n return new ToolCallAccumulator();\n }\n\n createToolCallSignature(toolCall: ToolCall): string {\n let args: any = {};\n try {\n const parsed = JSON.parse(toolCall.function.arguments || \"{}\");\n args = parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n args = {};\n }\n const sortedArgs = Object.keys(args).sort().reduce((acc: any, key) => { acc[key] = args[key]; return acc; }, {});\n return `${toolCall.function.name}:${JSON.stringify(sortedArgs)}`;\n }\n}\n","import type { Command, ExecutionContext } from \"@eclipse-lyra/core\";\nimport { commandRegistry } from \"@eclipse-lyra/core\";\nimport type { ToolDefinition } from \"../core/types\";\nimport { sanitizeFunctionName } from \"./tool-name-utils\";\n\nexport class ToolRegistry {\n commandToTool(command: Command, context: ExecutionContext): ToolDefinition {\n const properties: Record<string, { type: string; description: string; enum?: string[] }> = {};\n const required: string[] = [];\n\n command.parameters?.forEach(param => {\n const sanitizedParamName = sanitizeFunctionName(param.name);\n properties[sanitizedParamName] = {\n type: param.type || \"string\",\n description: param.description,\n ...(param.allowedValues && { enum: param.allowedValues })\n };\n if (param.required === true) {\n required.push(sanitizedParamName);\n }\n });\n\n return {\n type: \"function\",\n function: {\n name: sanitizeFunctionName(command.id),\n description: command.description || command.name,\n parameters: { type: \"object\", properties, required }\n }\n };\n }\n\n getAvailableTools(\n context: ExecutionContext,\n commandFilter?: (command: Command, context: ExecutionContext) => boolean\n ): ToolDefinition[] {\n const availableCommands = commandRegistry.listCommands();\n let commandsArray = Object.values(availableCommands) as Command[];\n\n if (commandFilter) {\n commandsArray = commandsArray.filter(cmd => commandFilter(cmd, context));\n }\n\n return commandsArray.map(cmd => this.commandToTool(cmd, context));\n }\n}\n","import type { IWorkflowStrategy, AgentExecutor } from \"./workflow-strategy\";\nimport type { AgentContribution, AgentWorkflowOptions, AgentWorkflowResult } from \"../core/interfaces\";\n\nexport class ParallelWorkflowStrategy implements IWorkflowStrategy {\n async execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult,\n executeAgent: AgentExecutor\n ): Promise<void> {\n const chatConfig = options.chatConfig;\n if (!chatConfig) throw new Error(\"Chat config is required\");\n\n await Promise.all(contributions.map(async (contrib) => {\n try {\n await executeAgent(contrib, options.chatContext.history, results.sharedState, chatConfig, options, results);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n results.errors.set(contrib.role, err);\n options.onAgentError?.(contrib.role, err);\n }\n }));\n }\n}\n","import type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport type { AgentContribution, AgentWorkflowOptions, AgentWorkflowResult } from \"../core/interfaces\";\nimport type { ChatMessage } from \"../core/types\";\nimport type { IWorkflowStrategy, AgentExecutor } from \"./workflow-strategy\";\n\nexport abstract class BaseSequentialWorkflow implements IWorkflowStrategy {\n abstract execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult,\n executeAgent: AgentExecutor\n ): Promise<void>;\n\n protected createAgentContextWithPreviousAgents(\n accumulatedState: ExecutionContext,\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult\n ): ExecutionContext {\n return {\n ...accumulatedState,\n ...options.callContext.getProxy(),\n previousAgents: Array.from(results.messages.entries()).map(([role, msg]) => ({\n role,\n content: msg.content\n }))\n };\n }\n\n protected updateWorkflowState(\n finalMessage: ChatMessage,\n currentMessages: ChatMessage[],\n accumulatedState: ExecutionContext,\n agentContext: ExecutionContext,\n results: AgentWorkflowResult\n ): { currentMessages: ChatMessage[]; accumulatedState: ExecutionContext } {\n currentMessages.push(finalMessage);\n accumulatedState = { ...accumulatedState, ...agentContext, message: finalMessage };\n results.sharedState = accumulatedState;\n return { currentMessages, accumulatedState };\n }\n}\n","import type { AgentContribution, AgentWorkflowOptions, AgentWorkflowResult } from \"../core/interfaces\";\nimport { BaseSequentialWorkflow } from \"./base-sequential-workflow\";\nimport type { AgentExecutor } from \"./workflow-strategy\";\n\nexport class SequentialWorkflowStrategy extends BaseSequentialWorkflow {\n async execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult,\n executeAgent: AgentExecutor\n ): Promise<void> {\n const chatConfig = options.chatConfig;\n if (!chatConfig) throw new Error(\"Chat config is required\");\n\n let currentMessages = [...options.chatContext.history];\n let accumulatedState = { ...results.sharedState };\n\n for (const contrib of contributions) {\n try {\n const agentContext = this.createAgentContextWithPreviousAgents(accumulatedState, options, results);\n const finalMessage = await executeAgent(contrib, currentMessages, accumulatedState, chatConfig, options, results);\n if (!finalMessage) break;\n\n const updated = this.updateWorkflowState(finalMessage, currentMessages, accumulatedState, agentContext, results);\n currentMessages = updated.currentMessages;\n accumulatedState = updated.accumulatedState;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n results.errors.set(contrib.role, err);\n options.onAgentError?.(contrib.role, err);\n break;\n }\n }\n }\n}\n","import type { AgentContribution, AgentWorkflowOptions, AgentWorkflowResult } from \"../core/interfaces\";\nimport { BaseSequentialWorkflow } from \"./base-sequential-workflow\";\nimport type { AgentExecutor } from \"./workflow-strategy\";\n\nexport class ConditionalWorkflowStrategy extends BaseSequentialWorkflow {\n async execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult,\n executeAgent: AgentExecutor\n ): Promise<void> {\n const chatConfig = options.chatConfig;\n if (!chatConfig) throw new Error(\"Chat config is required\");\n\n let currentMessages = [...options.chatContext.history];\n let accumulatedState = { ...results.sharedState };\n\n for (const contrib of contributions) {\n try {\n const agentContext = this.createAgentContextWithPreviousAgents(accumulatedState, options, results);\n if (contrib.canHandle && !contrib.canHandle(agentContext)) continue;\n\n const finalMessage = await executeAgent(contrib, currentMessages, accumulatedState, chatConfig, options, results);\n if (!finalMessage) break;\n\n const updated = this.updateWorkflowState(finalMessage, currentMessages, accumulatedState, agentContext, results);\n currentMessages = updated.currentMessages;\n accumulatedState = updated.accumulatedState;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n results.errors.set(contrib.role, err);\n options.onAgentError?.(contrib.role, err);\n }\n }\n }\n}\n","import type { AgentContribution, AgentWorkflowOptions, AgentWorkflowResult } from \"../core/interfaces\";\nimport type { IWorkflowStrategy, AgentExecutor } from \"./workflow-strategy\";\nimport { topologicalSort } from \"../task/task-plan\";\n\nexport class PipelineWorkflowStrategy implements IWorkflowStrategy {\n async execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult,\n executeAgent: AgentExecutor\n ): Promise<void> {\n const chatConfig = options.chatConfig;\n if (!chatConfig) throw new Error(\"Chat config is required\");\n\n let currentMessages = [...options.chatContext.history];\n\n for (const wave of this.buildTopoOrder(contributions)) {\n await Promise.all(wave.map(async (contrib) => {\n try {\n await executeAgent(contrib, currentMessages, results.sharedState, chatConfig, options, results);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n results.errors.set(contrib.role, err);\n options.onAgentError?.(contrib.role, err);\n }\n }));\n\n for (const contrib of wave) {\n const msg = results.messages.get(contrib.role);\n if (msg) currentMessages.push(msg);\n }\n }\n }\n\n private buildTopoOrder(contributions: AgentContribution[]): AgentContribution[][] {\n const waves: AgentContribution[][] = [];\n const placed = new Set<string>();\n\n while (placed.size < contributions.length) {\n const wave = contributions.filter(c => {\n if (placed.has(c.role)) return false;\n if (!c.consumes?.length) return true;\n const allProduced = contributions\n .filter(other => placed.has(other.role))\n .flatMap(other => other.produces || []);\n return c.consumes.every(t => allProduced.includes(t));\n });\n\n if (wave.length === 0) {\n waves.push(contributions.filter(c => !placed.has(c.role)));\n break;\n }\n\n waves.push(wave);\n for (const c of wave) placed.add(c.role);\n }\n\n return waves;\n }\n}\n","import type { TaskPlan, TaskStep } from \"../core/types\";\n\nexport function createTaskPlan(originalPrompt: string, steps: Omit<TaskStep, 'status' | 'revisions'>[]): TaskPlan {\n const now = Date.now();\n return {\n id: `plan-${now}-${Math.random().toString(36).slice(2, 9)}`,\n originalPrompt,\n steps: steps.map(s => ({ ...s, status: 'pending', revisions: 0 })),\n status: 'planning',\n createdAt: now,\n updatedAt: now\n };\n}\n\nexport function topologicalSort(steps: TaskStep[]): TaskStep[] {\n const visited = new Set<string>();\n const sorted: TaskStep[] = [];\n const byId = new Map(steps.map(s => [s.id, s]));\n\n function visit(step: TaskStep): void {\n if (visited.has(step.id)) return;\n visited.add(step.id);\n for (const depId of step.dependsOn) {\n const dep = byId.get(depId);\n if (dep) visit(dep);\n }\n sorted.push(step);\n }\n\n for (const step of steps) {\n visit(step);\n }\n return sorted;\n}\n\nexport function getNextRunnableSteps(plan: TaskPlan): TaskStep[] {\n const completed = new Set(plan.steps.filter(s => s.status === 'completed').map(s => s.id));\n return plan.steps.filter(s => s.status === 'pending' && s.dependsOn.every(d => completed.has(d)));\n}\n\nexport function isPlanComplete(plan: TaskPlan): boolean {\n return plan.steps.every(s => s.status === 'completed' || s.status === 'skipped');\n}\n\nexport function isPlanFailed(plan: TaskPlan): boolean {\n return plan.steps.some(s => s.status === 'failed');\n}\n","import type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport type { TaskPlan, ChatProvider } from \"../core/types\";\nimport type { AgentContribution, CompletionExecutor } from \"../core/interfaces\";\nimport { createTaskPlan } from \"../task/task-plan\";\nimport { DEFAULT_AGENT_ROLE } from \"../core/constants\";\n\nconst ORCHESTRATOR_SYS_PROMPT = `You are a task orchestrator. Given a user's complex request, decompose it into a structured execution plan.\n\nRespond with ONLY a JSON object matching this schema (no markdown, no explanation):\n{\n \"steps\": [\n {\n \"id\": \"step-1\",\n \"role\": \"<agent role>\",\n \"subTask\": \"<specific instruction for this step>\",\n \"dependsOn\": [],\n \"consumes\": [],\n \"produces\": [\"<artifact-id>\"]\n }\n ]\n}\n\nRules:\n- Each step must have a unique id (step-1, step-2, ...)\n- \"role\" must match an available agent role\n- \"dependsOn\" lists step IDs that must complete before this step\n- \"consumes\" and \"produces\" are artifact IDs\n- Steps with no dependencies can run in parallel\n- Keep the plan minimal — only as many steps as needed`;\n\nexport interface OrchestratorOptions {\n prompt: string;\n availableAgents: AgentContribution[];\n chatConfig: ChatProvider;\n context: ExecutionContext;\n executeCompletion: CompletionExecutor;\n}\n\nexport async function orchestrateTask(options: OrchestratorOptions): Promise<TaskPlan> {\n const agentList = options.availableAgents\n .filter(a => !a.isOrchestrator)\n .map(a => `- ${a.role}: ${a.description}`)\n .join('\\n');\n\n const messages = [\n { role: 'system', content: `${ORCHESTRATOR_SYS_PROMPT}\\n\\nAvailable agents:\\n${agentList}` },\n { role: 'user', content: options.prompt }\n ];\n\n const responseText = await options.executeCompletion(messages, options.chatConfig);\n\n try {\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) throw new Error('No JSON found in orchestrator response');\n\n const parsed = JSON.parse(jsonMatch[0]);\n return createTaskPlan(options.prompt, parsed.steps || []);\n } catch (error) {\n // Fallback: single-step plan using the best matching agent\n const defaultAgent = options.availableAgents.find(a => !a.isOrchestrator);\n return createTaskPlan(options.prompt, [{\n id: 'step-1',\n role: defaultAgent?.role || DEFAULT_AGENT_ROLE,\n subTask: options.prompt,\n dependsOn: [],\n consumes: [],\n produces: ['step-1-result']\n }]);\n }\n}\n","import type { Artifact, ArtifactType, AgentMessage, TaskPlan, TaskStep, StepStatus } from \"../core/types\";\n\nexport class TaskWorkspace {\n private artifacts = new Map<string, Artifact>();\n private mailbox = new Map<string, AgentMessage[]>();\n\n readonly taskId: string;\n readonly plan: TaskPlan;\n\n constructor(taskId: string, plan: TaskPlan) {\n this.taskId = taskId;\n this.plan = plan;\n }\n\n putArtifact(artifact: Artifact): void {\n this.artifacts.set(artifact.id, artifact);\n }\n\n getArtifact(id: string): Artifact | undefined {\n return this.artifacts.get(id);\n }\n\n getArtifactsByType(type: ArtifactType): Artifact[] {\n return Array.from(this.artifacts.values()).filter(a => a.type === type);\n }\n\n getArtifactsProducedBy(role: string): Artifact[] {\n return Array.from(this.artifacts.values()).filter(a => a.producedBy === role);\n }\n\n postMessage(message: AgentMessage): void {\n const key = message.to === '*' ? '__broadcast__' : message.to;\n const messages = this.mailbox.get(key) || [];\n messages.push(message);\n this.mailbox.set(key, messages);\n }\n\n readMessages(recipientRole: string): AgentMessage[] {\n const direct = this.mailbox.get(recipientRole) || [];\n const broadcast = this.mailbox.get('__broadcast__') || [];\n return [...direct, ...broadcast];\n }\n\n clearMessages(recipientRole: string): void {\n this.mailbox.delete(recipientRole);\n }\n\n updateStepStatus(stepId: string, status: StepStatus, result?: Artifact): void {\n const step = this.plan.steps.find(s => s.id === stepId);\n if (!step) return;\n step.status = status;\n if (result) {\n step.result = result;\n this.putArtifact(result);\n }\n this.plan.updatedAt = Date.now();\n }\n\n getNextRunnableSteps(): TaskStep[] {\n const completed = new Set(\n this.plan.steps.filter(s => s.status === 'completed').map(s => s.id)\n );\n return this.plan.steps.filter(\n s => s.status === 'pending' && s.dependsOn.every(dep => completed.has(dep))\n );\n }\n\n toJSON(): object {\n return {\n taskId: this.taskId,\n plan: this.plan,\n artifacts: Array.from(this.artifacts.values()),\n mailbox: Object.fromEntries(this.mailbox.entries())\n };\n }\n\n static fromJSON(data: any): TaskWorkspace {\n const ws = new TaskWorkspace(data.taskId, data.plan);\n for (const artifact of data.artifacts || []) {\n ws.artifacts.set(artifact.id, artifact);\n }\n for (const [key, messages] of Object.entries(data.mailbox || {})) {\n ws.mailbox.set(key, messages as AgentMessage[]);\n }\n return ws;\n }\n}\n","import { appSettings } from \"@eclipse-lyra/core\";\nimport { TaskWorkspace } from \"../workspace/workspace\";\n\nconst CHECKPOINT_KEY_PREFIX = \"ai_task_checkpoint_\";\nconst REGISTRY_KEY = \"ai_task_checkpoint_registry\";\n\nexport class TaskCheckpointService {\n async save(workspace: TaskWorkspace): Promise<void> {\n const key = `${CHECKPOINT_KEY_PREFIX}${workspace.taskId}`;\n await appSettings.set(key, workspace.toJSON());\n }\n\n async restore(taskId: string): Promise<TaskWorkspace | null> {\n const key = `${CHECKPOINT_KEY_PREFIX}${taskId}`;\n const data = await appSettings.get(key);\n if (!data) return null;\n return TaskWorkspace.fromJSON(data);\n }\n\n async delete(taskId: string): Promise<void> {\n const key = `${CHECKPOINT_KEY_PREFIX}${taskId}`;\n await appSettings.set(key, undefined);\n }\n\n async listCheckpoints(): Promise<string[]> {\n return this.getRegistry();\n }\n\n async registerCheckpoint(taskId: string): Promise<void> {\n const registry = await this.getRegistry();\n if (!registry.includes(taskId)) {\n registry.push(taskId);\n await appSettings.set(REGISTRY_KEY, registry);\n }\n }\n\n async unregisterCheckpoint(taskId: string): Promise<void> {\n const registry = await this.getRegistry();\n await appSettings.set(REGISTRY_KEY, registry.filter(id => id !== taskId));\n }\n\n private async getRegistry(): Promise<string[]> {\n return (await appSettings.get(REGISTRY_KEY)) || [];\n }\n}\n\nexport const taskCheckpointService = new TaskCheckpointService();\n","import type { TaskStep, Artifact } from \"../core/types\";\nimport type { TaskOptions, TaskResult, AgentContribution } from \"../core/interfaces\";\nimport { TaskWorkspace } from \"../workspace/workspace\";\nimport { taskCheckpointService } from \"./task-checkpoint\";\nimport { getNextRunnableSteps, isPlanComplete, isPlanFailed } from \"./task-plan\";\n\nexport type StepExecutor = (\n step: TaskStep,\n workspace: TaskWorkspace,\n options: TaskOptions\n) => Promise<Artifact>;\n\nexport class TaskRunner {\n constructor(private executeStep: StepExecutor) {}\n\n async run(workspace: TaskWorkspace, options: TaskOptions): Promise<TaskResult> {\n const plan = workspace.plan;\n plan.status = 'running';\n await taskCheckpointService.save(workspace);\n\n const errors = new Map<string, Error>();\n\n while (true) {\n if (options.signal?.aborted) {\n plan.status = 'paused';\n break;\n }\n\n const runnableSteps = getNextRunnableSteps(plan);\n if (runnableSteps.length === 0) break;\n\n await Promise.all(runnableSteps.map(async (step) => {\n workspace.updateStepStatus(step.id, 'running');\n options.onStepStart?.(step);\n\n try {\n const artifact = await this.executeStep(step, workspace, options);\n workspace.updateStepStatus(step.id, 'completed', artifact);\n options.onStepComplete?.(step, artifact);\n await taskCheckpointService.save(workspace);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n workspace.updateStepStatus(step.id, 'failed');\n errors.set(step.id, err);\n options.onStepError?.(step, err);\n }\n }));\n\n if (isPlanFailed(plan)) {\n plan.status = 'failed';\n break;\n }\n\n if (isPlanComplete(plan)) {\n plan.status = 'completed';\n break;\n }\n }\n\n const artifacts = plan.steps\n .filter(s => s.result)\n .map(s => s.result!);\n\n return { plan, artifacts, errors };\n }\n}\n","import type { AgentContribution, AgentWorkflowOptions, AgentWorkflowResult } from \"../core/interfaces\";\nimport type { ChatMessage, Artifact } from \"../core/types\";\nimport type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport type { IWorkflowStrategy, AgentExecutor } from \"./workflow-strategy\";\nimport { orchestrateTask } from \"../agents/orchestrator\";\nimport { TaskWorkspace } from \"../workspace/workspace\";\nimport { TaskRunner } from \"../task/task-runner\";\nimport { streamToText } from \"../providers/provider-utils\";\nimport { ProviderFactory } from \"../providers/provider-factory\";\n\n/**\n * Orchestrated workflow: uses an orchestrator agent to decompose the prompt into\n * a TaskPlan and then executes it step by step via TaskRunner.\n */\nexport class OrchestratedWorkflowStrategy implements IWorkflowStrategy {\n async execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult,\n executeAgent: AgentExecutor\n ): Promise<void> {\n const chatConfig = options.chatConfig;\n if (!chatConfig) throw new Error(\"Chat config is required\");\n\n const prompt = options.chatContext.history[options.chatContext.history.length - 1]?.content || '';\n\n const providerFactory = new ProviderFactory();\n const plan = await orchestrateTask({\n prompt,\n availableAgents: contributions,\n chatConfig,\n context: options.callContext.getProxy() as ExecutionContext,\n executeCompletion: (messages, cfg) => streamToText(messages, cfg, providerFactory)\n });\n\n const workspace = new TaskWorkspace(`wf-${Date.now()}`, plan);\n const byRole = new Map(contributions.map(c => [c.role, c]));\n\n const runner = new TaskRunner(async (step, ws, _opts) => {\n const contrib = byRole.get(step.role) || contributions[0];\n const stepMessages: ChatMessage[] = [\n ...options.chatContext.history,\n { role: 'user', content: step.subTask }\n ];\n\n const finalMessage = await executeAgent(contrib, stepMessages, results.sharedState, chatConfig, options, results);\n const content = finalMessage?.content || '';\n\n const artifact: Artifact = {\n id: step.produces[0] || `${step.id}-result`,\n type: 'text',\n content,\n producedBy: step.role,\n createdAt: Date.now()\n };\n return artifact;\n });\n\n const taskResult = await runner.run(workspace, {\n prompt,\n chatConfig,\n callContext: options.callContext,\n signal: options.signal\n });\n\n const combined = taskResult.artifacts.map(a => a.content).filter(Boolean).join('\\n\\n');\n if (combined) {\n results.messages.set('orchestrator', { role: 'assistant', content: combined });\n }\n }\n}\n","import type { Artifact, ChatProvider } from \"../core/types\";\nimport type { CompletionExecutor } from \"../core/interfaces\";\n\nconst REVIEWER_SYS_PROMPT = `You are a quality reviewer. Evaluate the provided artifact against the original task.\n\nRespond with ONLY a JSON object:\n{\n \"verdict\": \"approved\" | \"needs-revision\",\n \"score\": 0-100,\n \"notes\": \"<feedback for revision, empty if approved>\"\n}`;\n\nexport interface ReviewResult {\n verdict: 'approved' | 'needs-revision';\n score: number;\n notes: string;\n}\n\nexport interface ReviewerOptions {\n artifact: Artifact;\n originalTask: string;\n chatConfig: ChatProvider;\n executeCompletion: CompletionExecutor;\n}\n\nexport async function reviewArtifact(options: ReviewerOptions): Promise<ReviewResult> {\n const messages = [\n { role: 'system', content: REVIEWER_SYS_PROMPT },\n { role: 'user', content: `Original task: ${options.originalTask}\\n\\nArtifact to review:\\n${options.artifact.content}` }\n ];\n\n try {\n const responseText = await options.executeCompletion(messages, options.chatConfig);\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) throw new Error('No JSON in reviewer response');\n\n const parsed = JSON.parse(jsonMatch[0]);\n return {\n verdict: parsed.verdict === 'approved' ? 'approved' : 'needs-revision',\n score: typeof parsed.score === 'number' ? parsed.score : 50,\n notes: parsed.notes || ''\n };\n } catch {\n return { verdict: 'approved', score: 70, notes: '' };\n }\n}\n","import type { AgentContribution, AgentWorkflowOptions, AgentWorkflowResult } from \"../core/interfaces\";\nimport type { Artifact } from \"../core/types\";\nimport type { IWorkflowStrategy, AgentExecutor } from \"./workflow-strategy\";\nimport { reviewArtifact } from \"../agents/reviewer\";\nimport { streamToText } from \"../providers/provider-utils\";\nimport { ProviderFactory } from \"../providers/provider-factory\";\n\n/**\n * Review workflow: a producer agent creates an artifact, a reviewer evaluates it,\n * and the producer can revise up to maxRevisions times.\n */\nexport class ReviewWorkflowStrategy implements IWorkflowStrategy {\n async execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult,\n executeAgent: AgentExecutor\n ): Promise<void> {\n const chatConfig = options.chatConfig;\n if (!chatConfig) throw new Error(\"Chat config is required\");\n\n const providerFactory = new ProviderFactory();\n const producer = contributions[0];\n const reviewer = contributions.find(c => c.reviewerFor?.includes(producer.role));\n const maxRevisions = producer.maxRevisions ?? 2;\n\n let currentMessages = [...options.chatContext.history];\n let revisions = 0;\n\n while (revisions <= maxRevisions) {\n const finalMessage = await executeAgent(producer, currentMessages, results.sharedState, chatConfig, options, results);\n if (!finalMessage) break;\n\n if (!reviewer) {\n results.messages.set(producer.role, finalMessage);\n break;\n }\n\n const artifact: Artifact = {\n id: `draft-${revisions}`,\n type: 'text',\n content: finalMessage.content,\n producedBy: producer.role,\n createdAt: Date.now()\n };\n\n const originalPrompt = options.chatContext.history[options.chatContext.history.length - 1]?.content || '';\n\n const review = await reviewArtifact({\n artifact,\n originalTask: originalPrompt,\n chatConfig,\n executeCompletion: (messages, cfg) => streamToText(messages, cfg, providerFactory)\n });\n\n if (review.verdict === 'approved' || revisions >= maxRevisions) {\n results.messages.set(producer.role, finalMessage);\n break;\n }\n\n // Ask producer to revise\n currentMessages = [\n ...options.chatContext.history,\n finalMessage,\n { role: 'user', content: `Please revise based on this feedback: ${review.notes}` }\n ];\n revisions++;\n }\n }\n}\n","import { publish } from \"@eclipse-lyra/core\";\nimport type { AgentWorkflowOptions, AgentWorkflowResult, AgentContribution } from \"../core/interfaces\";\nimport type { ChatMessage } from \"../core/types\";\nimport { TOPIC_AGENT_WORKFLOW_STARTED, TOPIC_AGENT_WORKFLOW_COMPLETE, TOPIC_AGENT_WORKFLOW_ERROR } from \"../core/constants\";\nimport { ParallelWorkflowStrategy } from \"./parallel-workflow\";\nimport { SequentialWorkflowStrategy } from \"./sequential-workflow\";\nimport { ConditionalWorkflowStrategy } from \"./conditional-workflow\";\nimport { PipelineWorkflowStrategy } from \"./pipeline-workflow\";\nimport { OrchestratedWorkflowStrategy } from \"./orchestrated-workflow\";\nimport { ReviewWorkflowStrategy } from \"./review-workflow\";\nimport type { IWorkflowStrategy, AgentExecutor } from \"./workflow-strategy\";\n\nexport class WorkflowEngine {\n private strategies = new Map<string, IWorkflowStrategy>([\n ['parallel', new ParallelWorkflowStrategy()],\n ['sequential', new SequentialWorkflowStrategy()],\n ['conditional', new ConditionalWorkflowStrategy()],\n ['pipeline', new PipelineWorkflowStrategy()],\n ['orchestrated', new OrchestratedWorkflowStrategy()],\n ['review', new ReviewWorkflowStrategy()]\n ]);\n\n registerStrategy(name: string, strategy: IWorkflowStrategy): void {\n this.strategies.set(name, strategy);\n }\n\n async execute(\n contributions: AgentContribution[],\n options: AgentWorkflowOptions,\n executeAgent: AgentExecutor\n ): Promise<AgentWorkflowResult> {\n const workflowId = `workflow-${Date.now()}-${Math.random()}`;\n const execution = options.execution || 'parallel';\n const results: AgentWorkflowResult = {\n messages: new Map<string, ChatMessage>(),\n sharedState: { ...(options.sharedState || {}) },\n errors: new Map<string, Error>()\n };\n\n publish(TOPIC_AGENT_WORKFLOW_STARTED, { workflowId, options });\n\n try {\n const strategy = this.strategies.get(execution);\n if (!strategy) throw new Error(`Unknown workflow execution strategy: ${execution}`);\n\n await strategy.execute(contributions, options, results, executeAgent);\n publish(TOPIC_AGENT_WORKFLOW_COMPLETE, { workflowId, results });\n return results;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n publish(TOPIC_AGENT_WORKFLOW_ERROR, { workflowId, error: err });\n throw err;\n }\n }\n}\n","import type { ApiMessage, ToolDefinition, ToolCall } from \"../core/types\";\n\nexport class TokenEstimator {\n private static readonly AVERAGE_CHARS_PER_TOKEN = 4;\n private static readonly TOOL_DEFINITION_OVERHEAD = 50;\n private static readonly TOOL_CALL_OVERHEAD = 10;\n private static readonly MESSAGE_OVERHEAD = 4;\n\n static estimateTokens(text: string): number {\n if (!text?.trim()) return 0;\n const trimmed = text.trim();\n return Math.max(1, Math.ceil(trimmed.length / this.AVERAGE_CHARS_PER_TOKEN + trimmed.split(/\\s+/).filter(w => w.length > 0).length * 0.3));\n }\n\n static estimateMessageTokens(message: ApiMessage): number {\n let tokens = this.MESSAGE_OVERHEAD;\n if (message.content) tokens += this.estimateTokens(message.content);\n if (message.role) tokens += this.estimateTokens(message.role);\n if (message.tool_calls) {\n for (const tc of message.tool_calls) {\n tokens += this.estimateTokens(tc.function.name || '') + this.estimateTokens(tc.function.arguments || '{}') + this.TOOL_CALL_OVERHEAD;\n }\n }\n if (message.tool_call_id) tokens += this.estimateTokens(message.tool_call_id);\n return tokens;\n }\n\n static estimatePromptTokens(messages: ApiMessage[], tools?: ToolDefinition[]): number {\n let total = messages.reduce((sum, m) => sum + this.estimateMessageTokens(m), 0);\n if (tools?.length) {\n for (const tool of tools) {\n total += this.TOOL_DEFINITION_OVERHEAD;\n total += this.estimateTokens(tool.function.name || '');\n total += this.estimateTokens(tool.function.description || '');\n if (tool.function.parameters) total += this.estimateTokens(JSON.stringify(tool.function.parameters));\n }\n }\n return total;\n }\n\n static estimateCompletionTokens(content: string, toolCalls?: ToolCall[]): number {\n let tokens = this.estimateTokens(content);\n if (toolCalls?.length) {\n for (const tc of toolCalls) {\n tokens += this.TOOL_CALL_OVERHEAD + this.estimateTokens(tc.function?.name || '') + this.estimateTokens(tc.function?.arguments || '{}');\n }\n }\n return tokens;\n }\n}\n","import { persistenceService } from \"@eclipse-lyra/core\";\nimport type { TokenUsage, ProviderTokenUsage } from \"../core/types\";\n\ninterface TokenUsageData {\n providers: Record<string, ProviderTokenUsage>;\n total: ProviderTokenUsage;\n lastUpdated: number;\n}\n\nconst TOKEN_USAGE_KEY = \"ai_token_usage\";\n\nexport const EMPTY_USAGE: ProviderTokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0, requestCount: 0 };\n\nexport class TokenUsageTracker {\n private data: TokenUsageData | null = null;\n private loadPromise: Promise<TokenUsageData> | null = null;\n\n private async loadData(): Promise<TokenUsageData> {\n if (this.data) return this.data;\n if (this.loadPromise) return this.loadPromise;\n\n this.loadPromise = (async () => {\n const stored = await persistenceService.getObject(TOKEN_USAGE_KEY);\n this.data = stored\n ? (stored as TokenUsageData)\n : { providers: {}, total: { ...EMPTY_USAGE }, lastUpdated: Date.now() };\n if (!this.data) {\n this.data = { providers: {}, total: { ...EMPTY_USAGE }, lastUpdated: Date.now() };\n await this.saveData();\n }\n this.loadPromise = null;\n return this.data;\n })();\n\n return this.loadPromise;\n }\n\n private async saveData(): Promise<void> {\n if (!this.data) return;\n this.data.lastUpdated = Date.now();\n await persistenceService.persistObject(TOKEN_USAGE_KEY, this.data);\n }\n\n async recordUsage(providerName: string, usage: TokenUsage): Promise<void> {\n await this.loadData();\n if (!this.data) return;\n\n this.data.providers[providerName] ??= { ...EMPTY_USAGE };\n const provider = this.data.providers[providerName];\n provider.promptTokens += usage.promptTokens;\n provider.completionTokens += usage.completionTokens;\n provider.totalTokens += usage.totalTokens;\n provider.requestCount += 1;\n\n this.data.total.promptTokens += usage.promptTokens;\n this.data.total.completionTokens += usage.completionTokens;\n this.data.total.totalTokens += usage.totalTokens;\n this.data.total.requestCount += 1;\n\n await this.saveData();\n }\n\n async getProviderUsage(providerName: string): Promise<ProviderTokenUsage | null> {\n await this.loadData();\n return this.data?.providers[providerName] || null;\n }\n\n async getAllProviderUsage(): Promise<Record<string, ProviderTokenUsage>> {\n await this.loadData();\n return this.data?.providers || {};\n }\n\n async getTotalUsage(): Promise<ProviderTokenUsage> {\n await this.loadData();\n return this.data?.total || { ...EMPTY_USAGE };\n }\n\n async reset(): Promise<void> {\n this.data = { providers: {}, total: { ...EMPTY_USAGE }, lastUpdated: Date.now() };\n await this.saveData();\n }\n\n async resetProvider(providerName: string): Promise<void> {\n await this.loadData();\n if (!this.data) return;\n\n const provider = this.data.providers[providerName];\n if (!provider) return;\n\n this.data.total.promptTokens -= provider.promptTokens;\n this.data.total.completionTokens -= provider.completionTokens;\n this.data.total.totalTokens -= provider.totalTokens;\n this.data.total.requestCount -= provider.requestCount;\n delete this.data.providers[providerName];\n await this.saveData();\n }\n}\n\nexport const tokenUsageTracker = new TokenUsageTracker();\n","import { DependencyContext, rootContext } from \"@eclipse-lyra/core\";\nimport { publish, subscribe } from \"@eclipse-lyra/core\";\nimport { appSettings, TOPIC_SETTINGS_CHANGED } from \"@eclipse-lyra/core\";\nimport { contributionRegistry } from \"@eclipse-lyra/core\";\nimport type { ExecutionContext } from \"@eclipse-lyra/core\";\nimport { logger } from \"@eclipse-lyra/core\";\n\nimport {\n TOPIC_AI_STREAM_STARTED,\n TOPIC_AI_STREAM_CHUNK,\n TOPIC_AI_STREAM_COMPLETE,\n TOPIC_AI_STREAM_ERROR,\n TOPIC_AICONFIG_CHANGED,\n KEY_AI_CONFIG,\n AI_CONFIG_TEMPLATE,\n MAX_TOOL_ITERATIONS,\n CID_CHAT_PROVIDERS\n} from \"../core/constants\";\n\nimport type {\n ChatMessage,\n ChatHistory,\n ChatProvider,\n AIConfig,\n StreamChunk,\n ToolResult,\n TokenUsage,\n TaskPlan,\n TaskStep,\n Artifact,\n ToolDefinition,\n ApiMessage\n} from \"../core/types\";\n\nimport type {\n AgentContribution,\n IProvider,\n ChatProviderContribution,\n AgentWorkflowOptions,\n AgentWorkflowResult,\n AIServiceOptions,\n AIServiceResult,\n TaskOptions,\n TaskResult\n} from \"../core/interfaces\";\n\nimport { ProviderFactory } from \"../providers/provider-factory\";\nimport { AgentRegistry } from \"../agents/agent-registry\";\nimport { PromptBuilder } from \"../agents/prompt-builder\";\nimport { MessageProcessorService } from \"../agents/message-processor\";\nimport { ToolExecutor } from \"../tools/tool-executor\";\nimport { ToolRegistry } from \"../tools/tool-registry\";\nimport { WorkflowEngine } from \"../workflows/workflow-engine\";\nimport { TokenEstimator } from \"../tools/token-estimator\";\nimport { tokenUsageTracker } from \"./token-usage-tracker\";\nimport { TaskWorkspace } from \"../workspace/workspace\";\nimport { TaskRunner } from \"../task/task-runner\";\nimport { taskCheckpointService } from \"../task/task-checkpoint\";\nimport { orchestrateTask } from \"../agents/orchestrator\";\nimport { sanitizeMessagesForAPI } from \"../core/message-utils\";\nimport { streamToText } from \"../providers/provider-utils\";\n\nexport class AIService {\n private aiConfig?: AIConfig;\n private configCheckPromise?: Promise<void>;\n private providerFactory: ProviderFactory;\n private agentRegistry: AgentRegistry;\n private _promptBuilder: PromptBuilder;\n private messageProcessor: MessageProcessorService;\n private toolExecutor: ToolExecutor;\n private workflowEngine: WorkflowEngine;\n private toolRegistry: ToolRegistry;\n private activeRequests: Map<string, AbortController> = new Map();\n private activeTasks: Map<string, AbortController> = new Map();\n\n constructor() {\n this.toolRegistry = new ToolRegistry();\n this.providerFactory = new ProviderFactory();\n this.agentRegistry = new AgentRegistry();\n this._promptBuilder = new PromptBuilder(this.toolRegistry);\n this.messageProcessor = new MessageProcessorService();\n this.toolExecutor = new ToolExecutor();\n this.workflowEngine = new WorkflowEngine();\n\n subscribe(TOPIC_SETTINGS_CHANGED, () => {\n this.aiConfig = undefined;\n this.configCheckPromise = undefined;\n this.checkAIConfig().then();\n });\n\n this.checkAIConfig().then();\n }\n\n get promptBuilder(): PromptBuilder {\n return this._promptBuilder;\n }\n\n getAgentContributions(): AgentContribution[] {\n return this.agentRegistry.getAgentContributions();\n }\n\n async getProviders(): Promise<ChatProvider[]> {\n await this.checkAIConfig();\n return this.aiConfig?.providers || [];\n }\n\n async getDefaultProvider(): Promise<ChatProvider> {\n await this.checkAIConfig();\n const providers = await this.getProviders();\n if (this.aiConfig?.defaultProvider) {\n const config = providers.find(p => p.name === this.aiConfig?.defaultProvider);\n if (config) return config;\n }\n return providers[0];\n }\n\n async setDefaultProvider(defaultProviderName: string): Promise<ChatProvider> {\n await this.checkAIConfig();\n if (this.aiConfig) {\n this.aiConfig.defaultProvider = defaultProviderName;\n await appSettings.set(KEY_AI_CONFIG, this.aiConfig);\n }\n return this.getDefaultProvider();\n }\n\n createMessage(prompt: string): ChatMessage {\n return { role: \"user\", content: prompt };\n }\n\n registerStreamingFetcher(provider: IProvider): void {\n this.providerFactory.registerProvider(provider);\n }\n\n private getContributedProviders(): ChatProvider[] {\n const contributions = contributionRegistry.getContributions(CID_CHAT_PROVIDERS) as ChatProviderContribution[];\n return contributions.map(c => c.provider);\n }\n\n private mergeProviders(existing: ChatProvider[], contributed: ChatProvider[]): ChatProvider[] {\n const existingNames = new Set(existing.map(p => p.name));\n const missing = contributed.filter(p => !existingNames.has(p.name));\n return missing.length > 0 ? [...existing, ...missing] : existing;\n }\n\n private async createInitialConfig(): Promise<AIConfig> {\n const initialConfig: AIConfig = { ...AI_CONFIG_TEMPLATE, providers: this.getContributedProviders() };\n await appSettings.set(KEY_AI_CONFIG, initialConfig);\n return appSettings.get(KEY_AI_CONFIG);\n }\n\n private async updateConfigWithMissingProviders(config: AIConfig): Promise<AIConfig> {\n const merged = this.mergeProviders(config.providers, this.getContributedProviders());\n if (merged.length === config.providers.length) return config;\n const updated = { ...config, providers: merged };\n await appSettings.set(KEY_AI_CONFIG, updated);\n return updated;\n }\n\n private async checkAIConfig(): Promise<void> {\n if (this.aiConfig) return;\n if (this.configCheckPromise) return this.configCheckPromise;\n this.configCheckPromise = this.performConfigCheck();\n return this.configCheckPromise;\n }\n\n private async performConfigCheck(): Promise<void> {\n try {\n this.aiConfig = await appSettings.get(KEY_AI_CONFIG);\n this.aiConfig = this.aiConfig\n ? await this.updateConfigWithMissingProviders(this.aiConfig)\n : await this.createInitialConfig();\n publish(TOPIC_AICONFIG_CHANGED, this.aiConfig);\n } finally {\n this.configCheckPromise = undefined;\n }\n }\n\n private createAgentContext(\n sharedState: ExecutionContext,\n callContext: DependencyContext,\n additional: Partial<ExecutionContext> = {}\n ): ExecutionContext {\n return { ...sharedState, ...callContext.getProxy(), ...additional };\n }\n\n async *streamCompletion(options: AIServiceOptions): AsyncGenerator<StreamChunk, AIServiceResult> {\n const requestId = `${Date.now()}-${Math.random()}`;\n const abortController = new AbortController();\n this.activeRequests.set(requestId, abortController);\n\n if (options.signal) {\n options.signal.addEventListener('abort', () => abortController.abort());\n }\n const effectiveSignal = options.signal || abortController.signal;\n\n try {\n options.onStatus?.('starting');\n publish(TOPIC_AI_STREAM_STARTED, { requestId, options });\n\n const chatConfig = options.chatConfig || await this.getDefaultProvider();\n const messages = sanitizeMessagesForAPI(options.chatContext.history);\n const provider = this.providerFactory.getProvider(chatConfig);\n const accumulator = this.toolExecutor.createToolCallAccumulator();\n\n let accumulatedContent = '';\n let accumulatedRole = 'assistant';\n let tokenUsage: TokenUsage | undefined;\n\n for await (const chunk of provider.stream({\n model: chatConfig.model, messages, chatConfig, tools: options.tools, signal: effectiveSignal\n })) {\n if (chunk.type === 'error') {\n options.onStatus?.('error');\n publish(TOPIC_AI_STREAM_ERROR, { requestId, chunk });\n yield chunk;\n break;\n }\n if (chunk.type === 'token') {\n accumulator.processChunk(chunk);\n if (!chunk.toolCalls?.length) accumulatedContent += chunk.content;\n if (chunk.message?.role) accumulatedRole = chunk.message.role;\n if (chunk.content) options.onToken?.(chunk.content);\n options.onStatus?.('streaming');\n options.onProgress?.({ received: accumulatedContent.length });\n publish(TOPIC_AI_STREAM_CHUNK, { requestId, chunk });\n yield chunk;\n } else if (chunk.type === 'done') {\n if (chunk.metadata?.usage) tokenUsage = chunk.metadata.usage as TokenUsage;\n options.onStatus?.('complete');\n publish(TOPIC_AI_STREAM_COMPLETE, { requestId });\n yield chunk;\n break;\n } else {\n yield chunk;\n }\n }\n\n const finalToolCalls = accumulator.getFinalToolCalls();\n const finalMessage: ChatMessage = {\n role: accumulatedRole,\n content: accumulatedContent,\n ...(finalToolCalls.length > 0 && { toolCalls: finalToolCalls })\n };\n\n if (!tokenUsage) {\n const promptTokens = TokenEstimator.estimatePromptTokens(messages, options.tools);\n const completionTokens = TokenEstimator.estimateCompletionTokens(accumulatedContent, finalToolCalls);\n tokenUsage = { promptTokens, completionTokens, totalTokens: promptTokens + completionTokens, estimated: true };\n }\n\n tokenUsageTracker.recordUsage(chatConfig.name, tokenUsage).catch(err => {\n logger.error(`Failed to record token usage: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n return { message: finalMessage, tokenUsage };\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n options.onStatus?.('error');\n publish(TOPIC_AI_STREAM_ERROR, { requestId, error: 'Request cancelled' });\n throw error;\n }\n options.onStatus?.('error');\n const errorMessage = error instanceof Error ? error.message : String(error);\n publish(TOPIC_AI_STREAM_ERROR, { requestId, error: errorMessage });\n yield { type: 'error', content: errorMessage, metadata: { error } };\n throw error;\n } finally {\n this.activeRequests.delete(requestId);\n }\n }\n\n async handleStreamingPromptDirect(\n options: AIServiceOptions & { tools?: ToolDefinition[] }\n ): Promise<ChatMessage> {\n const stream = this.streamCompletion(options);\n let lastValue: IteratorResult<StreamChunk, AIServiceResult>;\n\n while (true) {\n lastValue = await stream.next();\n if (lastValue.done) return lastValue.value.message;\n\n const chunk = lastValue.value;\n if (chunk.type === 'error') throw new Error(chunk.content);\n if (chunk.type === 'done') {\n const final = await stream.next();\n if (final.done && final.value) return final.value.message;\n if (!final.done) continue;\n throw new Error('Stream completed without return value');\n }\n }\n }\n\n async handleStreamingPrompt(options: AIServiceOptions): Promise<ChatMessage | ChatMessage[]> {\n const callContext = options.callContext || rootContext.createChild({});\n const agentContext = this.createAgentContext(\n {},\n callContext,\n { userPrompt: options.chatContext.history[options.chatContext.history.length - 1]?.content || \"\" }\n );\n\n const matchingAgents = this.agentRegistry.getMatchingAgents(agentContext);\n const roles = matchingAgents.length > 0 ? matchingAgents.map(a => a.role) : ['assistant'];\n\n const workflowResult = await this.executeAgentWorkflow({\n chatContext: options.chatContext,\n chatConfig: options.chatConfig,\n callContext,\n execution: 'parallel',\n stream: options.stream,\n signal: options.signal,\n onToken: (_role, token) => options.onToken?.(token),\n onStatus: (_role, status) => options.onStatus?.(status),\n roles\n });\n\n const messages = Array.from(workflowResult.messages.values());\n return messages.length === 1 ? messages[0] : messages;\n }\n\n cancelRequest(requestId: string): boolean {\n const controller = this.activeRequests.get(requestId);\n if (!controller) return false;\n controller.abort();\n this.activeRequests.delete(requestId);\n return true;\n }\n\n async executeAgentWorkflow(options: AgentWorkflowOptions): Promise<AgentWorkflowResult> {\n const agentContext = this.createAgentContext(options.sharedState || {}, options.callContext);\n const matchingAgents = this.agentRegistry.getMatchingAgents(agentContext, options.roles);\n\n return this.workflowEngine.execute(\n matchingAgents,\n options,\n (contrib, messages, sharedState, chatConfig, workflowOptions, results) =>\n this.executeAgent(contrib, messages, sharedState, chatConfig, workflowOptions, results)\n );\n }\n\n private async executeAgent(\n contrib: AgentContribution,\n messages: ChatMessage[],\n sharedState: ExecutionContext,\n chatConfig: ChatProvider,\n options: AgentWorkflowOptions,\n results: AgentWorkflowResult\n ): Promise<ChatMessage | null> {\n options.onAgentStart?.(contrib.role);\n\n const agentContext = this.createAgentContext(sharedState, options.callContext, {\n userPrompt: messages[messages.length - 1]?.content || \"\"\n });\n\n const { messages: preparedMessages, tools } = await this._promptBuilder.build(\n contrib, messages, agentContext, contrib.hooks\n );\n\n const chatMessages: ChatMessage[] = preparedMessages.map(msg => {\n const chatMsg: ChatMessage = { role: msg.role, content: msg.content };\n if (msg.tool_call_id) (chatMsg as any).tool_call_id = msg.tool_call_id;\n if (msg.tool_calls) (chatMsg as any).tool_calls = msg.tool_calls;\n return chatMsg;\n });\n\n let rawMessage = await this.handleStreamingPromptDirect({\n chatContext: { history: chatMessages },\n chatConfig,\n callContext: options.callContext,\n stream: options.stream ?? true,\n signal: options.signal,\n onToken: options.onToken ? (token: string) => options.onToken!(contrib.role, token) : undefined,\n tools\n });\n\n let toolCallIteration = 0;\n const conversationHistory: ApiMessage[] = [...preparedMessages];\n\n while (rawMessage.toolCalls && rawMessage.toolCalls.length > 0) {\n toolCallIteration++;\n if (toolCallIteration > MAX_TOOL_ITERATIONS) {\n console.warn(`[AIService] Max tool call iterations reached`);\n break;\n }\n\n let toolResults: ToolResult[];\n\n if (options.requireToolApproval && options.onToolApprovalRequest) {\n const toolCallDescriptions = rawMessage.toolCalls.map(tc => {\n let parsedArgs: any = {};\n try { parsedArgs = JSON.parse(tc.function.arguments || \"{}\"); } catch { /* noop */ }\n return `${tc.function.name}(${Object.entries(parsedArgs).map(([k, v]) => `${k}=${v}`).join(\", \")})`;\n }).join(\", \");\n\n const approvalRequest = {\n toolCalls: rawMessage.toolCalls,\n message: `The AI wants to execute: ${toolCallDescriptions}`\n };\n\n const approved = await options.onToolApprovalRequest(contrib.role, approvalRequest);\n if (!approved) {\n toolResults = rawMessage.toolCalls.map(tc => ({\n id: tc.id,\n result: { success: false, message: \"Tool execution cancelled by user\", cancelled: true }\n }));\n } else {\n toolResults = await this.toolExecutor.executeToolCalls(rawMessage.toolCalls, agentContext);\n }\n } else {\n toolResults = await this.toolExecutor.executeToolCalls(rawMessage.toolCalls, agentContext);\n }\n\n const toolMessages: ApiMessage[] = toolResults.map(tr => ({\n role: \"tool\",\n content: tr.error ? JSON.stringify({ error: tr.error }) : JSON.stringify(tr.result),\n tool_call_id: tr.id\n }));\n\n const assistantMessage: any = {\n role: \"assistant\",\n content: rawMessage.content || \"\"\n };\n if (rawMessage.toolCalls?.length) {\n assistantMessage.tool_calls = rawMessage.toolCalls\n .filter(tc => tc.function.name?.trim())\n .map(tc => ({ id: tc.id, type: tc.type, function: { name: tc.function.name, arguments: tc.function.arguments || \"{}\" } }));\n }\n\n conversationHistory.push(assistantMessage, ...toolMessages);\n\n rawMessage = await this.handleStreamingPromptDirect({\n chatContext: {\n history: conversationHistory.map(m => ({\n role: m.role,\n content: m.content,\n ...(m.tool_call_id && { tool_call_id: m.tool_call_id }),\n ...(m.tool_calls && { tool_calls: m.tool_calls })\n } as ChatMessage))\n },\n chatConfig,\n callContext: options.callContext,\n stream: options.stream ?? true,\n signal: options.signal,\n tools\n });\n\n if (rawMessage.content?.trim() && (!rawMessage.toolCalls?.length)) break;\n }\n\n const processedMessage = await this.messageProcessor.process(\n rawMessage, contrib,\n this.createAgentContext(sharedState, options.callContext, { message: rawMessage })\n );\n\n if (contrib.hooks?.afterReceive) {\n await contrib.hooks.afterReceive(processedMessage, this.createAgentContext(sharedState, options.callContext));\n }\n\n const finalMessage: ChatMessage = { role: contrib.role, content: processedMessage.content };\n results.messages.set(contrib.role, finalMessage);\n options.onAgentComplete?.(contrib.role, finalMessage);\n return finalMessage;\n }\n\n async planTask(prompt: string, context: ExecutionContext): Promise<TaskPlan> {\n const chatConfig = await this.getDefaultProvider();\n const contributions = this.agentRegistry.getAgentContributions();\n const callContext = rootContext.createChild({});\n\n return orchestrateTask({\n prompt,\n availableAgents: contributions,\n chatConfig,\n context,\n executeCompletion: (messages, cfg) => streamToText(messages, cfg, this.providerFactory)\n });\n }\n\n async executeTask(options: TaskOptions): Promise<TaskResult> {\n const chatConfig = options.chatConfig || await this.getDefaultProvider();\n const callContext = options.callContext || rootContext.createChild({});\n const contributions = this.agentRegistry.getAgentContributions();\n\n const plan = await this.planTask(options.prompt, callContext.getProxy() as ExecutionContext);\n options.onPlanReady?.(plan);\n\n const workspace = new TaskWorkspace(`task-${Date.now()}`, plan);\n await taskCheckpointService.registerCheckpoint(workspace.taskId);\n\n const abortController = new AbortController();\n this.activeTasks.set(workspace.taskId, abortController);\n const taskOptions = { ...options, signal: options.signal ?? abortController.signal };\n\n const byRole = new Map(contributions.map(c => [c.role, c]));\n\n const runner = new TaskRunner(this.createStepExecutor(byRole, contributions, chatConfig, callContext, taskOptions));\n try {\n const result = await runner.run(workspace, taskOptions);\n await taskCheckpointService.unregisterCheckpoint(workspace.taskId);\n return result;\n } finally {\n this.activeTasks.delete(workspace.taskId);\n }\n }\n\n async resumeTask(taskId: string, options: TaskOptions): Promise<TaskResult> {\n const workspace = await taskCheckpointService.restore(taskId);\n if (!workspace) throw new Error(`No checkpoint found for task ${taskId}`);\n\n const chatConfig = options.chatConfig || await this.getDefaultProvider();\n const callContext = options.callContext || rootContext.createChild({});\n const contributions = this.agentRegistry.getAgentContributions();\n const byRole = new Map(contributions.map(c => [c.role, c]));\n\n const runner = new TaskRunner(this.createStepExecutor(byRole, contributions, chatConfig, callContext, options));\n return runner.run(workspace, options);\n }\n\n private createStepExecutor(\n byRole: Map<string, AgentContribution>,\n contributions: AgentContribution[],\n chatConfig: ChatProvider,\n callContext: DependencyContext,\n options: TaskOptions\n ) {\n return async (step: TaskStep, _ws: TaskWorkspace, _opts: TaskOptions): Promise<Artifact> => {\n const contrib = byRole.get(step.role) || contributions[0];\n const stepMessages: ChatMessage[] = [\n ...(options.chatContext?.history || []),\n { role: 'user', content: step.subTask }\n ];\n const workflowResult = await this.workflowEngine.execute(\n [contrib],\n { chatContext: { history: stepMessages }, chatConfig, callContext, execution: 'parallel', stream: true, signal: options.signal, roles: [contrib.role] },\n (c, msgs, state, cfg, wopts, results) => this.executeAgent(c, msgs, state, cfg, wopts, results)\n );\n const msg = workflowResult.messages.get(contrib.role);\n return {\n id: step.produces[0] || `${step.id}-result`,\n type: 'text' as const,\n content: msg?.content || '',\n producedBy: step.role,\n createdAt: Date.now()\n };\n };\n }\n\n cancelTask(taskId: string): void {\n const controller = this.activeTasks.get(taskId);\n if (controller) {\n controller.abort();\n this.activeTasks.delete(taskId);\n }\n }\n}\n\nexport const aiService = new AIService();\n"],"names":["logger"],"mappings":"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"}