@undefineds.co/xpod 0.2.6 → 0.2.7

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 (53) hide show
  1. package/config/cloud.json +1 -1
  2. package/dist/api/chatkit/ai-provider.js +4 -3
  3. package/dist/api/chatkit/ai-provider.js.map +1 -1
  4. package/dist/api/chatkit/default-agent.js +8 -7
  5. package/dist/api/chatkit/default-agent.js.map +1 -1
  6. package/dist/api/chatkit/runtime/PtyThreadRuntime.js +2 -1
  7. package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +1 -1
  8. package/dist/api/handlers/AdminHandler.js +1 -1
  9. package/dist/api/handlers/AdminHandler.js.map +1 -1
  10. package/dist/api/service/VercelChatService.js +23 -23
  11. package/dist/api/service/VercelChatService.js.map +1 -1
  12. package/dist/api/service/platform-ai-config.d.ts +8 -0
  13. package/dist/api/service/platform-ai-config.js +64 -0
  14. package/dist/api/service/platform-ai-config.js.map +1 -0
  15. package/dist/cli/commands/start.js +1 -2
  16. package/dist/cli/commands/start.js.map +1 -1
  17. package/dist/components/context.jsonld +3 -0
  18. package/dist/http/TracingHandler.js +2 -0
  19. package/dist/http/TracingHandler.js.map +1 -1
  20. package/dist/identity/drizzle/DrizzleIndexedStorage.d.ts +10 -1
  21. package/dist/identity/drizzle/DrizzleIndexedStorage.js +99 -6
  22. package/dist/identity/drizzle/DrizzleIndexedStorage.js.map +1 -1
  23. package/dist/identity/drizzle/DrizzleIndexedStorage.jsonld +36 -0
  24. package/dist/main.js +1 -2
  25. package/dist/main.js.map +1 -1
  26. package/dist/provision/ProvisionPodCreator.d.ts +1 -0
  27. package/dist/provision/ProvisionPodCreator.js +25 -2
  28. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  29. package/dist/provision/ProvisionPodCreator.jsonld +4 -0
  30. package/dist/runtime/bootstrap.js +4 -4
  31. package/dist/runtime/bootstrap.js.map +1 -1
  32. package/dist/storage/MetadataRequestContext.d.ts +13 -0
  33. package/dist/storage/MetadataRequestContext.js +6 -0
  34. package/dist/storage/MetadataRequestContext.js.map +1 -0
  35. package/dist/storage/NodeSqliteDrizzle.js +19 -5
  36. package/dist/storage/NodeSqliteDrizzle.js.map +1 -1
  37. package/dist/storage/accessors/MinioDataAccessor.d.ts +1 -0
  38. package/dist/storage/accessors/MinioDataAccessor.js +25 -2
  39. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  40. package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
  41. package/dist/storage/accessors/MixDataAccessor.d.ts +3 -1
  42. package/dist/storage/accessors/MixDataAccessor.js +61 -23
  43. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  44. package/dist/storage/accessors/MixDataAccessor.jsonld +23 -0
  45. package/dist/supervisor/Supervisor.js +1 -1
  46. package/dist/supervisor/Supervisor.js.map +1 -1
  47. package/package.json +1 -1
  48. package/static/app/assets/index.css +1 -1
  49. package/static/app/assets/main.js +50 -10
  50. package/static/dashboard/assets/{dashboard-BfmT5Vc8.js → dashboard-CTk9cn1-.js} +8 -8
  51. package/static/dashboard/assets/dashboard-VQRsvXx9.css +1 -0
  52. package/static/dashboard/dashboard.html +2 -2
  53. package/static/dashboard/assets/dashboard-DkZOr7bV.css +0 -1
package/config/cloud.json CHANGED
@@ -25,7 +25,7 @@
25
25
  },
26
26
  "attemptSettings_retryCount": 10
27
27
  },
28
- "expiration": 6000
28
+ "expiration": 30000
29
29
  }
30
30
  },
31
31
  {
@@ -14,6 +14,7 @@ const undici_1 = require("undici");
14
14
  const AuthContext_1 = require("../auth/AuthContext");
15
15
  const types_1 = require("../../credential/schema/types");
16
16
  const provider_registry_1 = require("../service/provider-registry");
17
+ const platform_ai_config_1 = require("../service/platform-ai-config");
17
18
  // Create a proxy-aware fetch function
18
19
  function createProxyFetch(proxyUrl) {
19
20
  const agent = new undici_1.ProxyAgent(proxyUrl);
@@ -43,7 +44,7 @@ class VercelAiProvider {
43
44
  if (!config) {
44
45
  throw new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');
45
46
  }
46
- const model = options?.model ?? config.defaultModel ?? process.env.DEFAULT_MODEL ?? 'stepfun/step-3.5-flash:free';
47
+ const model = options?.model ?? config.defaultModel ?? (0, platform_ai_config_1.getPlatformDefaultModel)();
47
48
  this.logger.debug(`Streaming response for ${userId}, model: ${model}`);
48
49
  const provider = this.createProvider(config);
49
50
  try {
@@ -149,11 +150,11 @@ Model: ${model}
149
150
  };
150
151
  }
151
152
  // 2. 平台 Provider
152
- const platformBase = process.env.DEFAULT_API_BASE;
153
+ const platformBase = (0, platform_ai_config_1.getPlatformApiBaseUrl)();
153
154
  if (platformBase) {
154
155
  return {
155
156
  baseURL: platformBase,
156
- apiKey: process.env.DEFAULT_API_KEY || '',
157
+ apiKey: (0, platform_ai_config_1.getPlatformApiKey)(),
157
158
  };
158
159
  }
159
160
  // 3. 无配置
@@ -1 +1 @@
1
- {"version":3,"file":"ai-provider.js","sourceRoot":"","sources":["../../../src/api/chatkit/ai-provider.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AI Provider Adapter\n *\n * Adapts existing AI services to the ChatKit AiProvider interface.\n * Includes 429 rate limit handling with credential status backfill.\n */\n\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { streamText, APICallError } from 'ai';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { ProxyAgent } from 'undici';\nimport type { AiProvider } from './service';\nimport type { StoreContext } from './store';\nimport type { PodChatKitStore } from './pod-store';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { getWebId, getAccountId } from '../auth/AuthContext';\nimport { CredentialStatus } from '../../credential/schema/types';\nimport { getDefaultBaseUrl } from '../service/provider-registry';\n\n// Create a proxy-aware fetch function\nfunction createProxyFetch(proxyUrl: string): typeof fetch {\n const agent = new ProxyAgent(proxyUrl);\n return (url, init) => fetch(url, { ...init, dispatcher: agent } as any);\n}\n\nexport interface VercelAiProviderOptions {\n store: PodChatKitStore;\n}\n\n/**\n * Vercel AI SDK based provider\n *\n * Uses PodChatKitStore to get AI provider settings from Pod.\n * Reuses the same Session cached in StoreContext.\n */\nexport class VercelAiProvider implements AiProvider {\n private readonly logger = getLoggerFor(this);\n private readonly store: PodChatKitStore;\n\n public constructor(options: VercelAiProviderOptions) {\n this.store = options.store;\n }\n\n /**\n * Stream a response for the given messages\n */\n public async *streamResponse(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n options?: {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n context?: unknown;\n },\n ): AsyncIterable<string> {\n // Get context (contains auth and cached session)\n const context = options?.context as StoreContext | undefined;\n const auth = context?.auth as AuthContext | undefined;\n const userId = auth ? (getWebId(auth) ?? getAccountId(auth) ?? 'anonymous') : 'anonymous';\n\n // 从 Pod 获取配置\n const config = await this.getProviderConfig(context);\n\n if (!config) {\n throw new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n }\n\n const model = options?.model ?? config.defaultModel ?? process.env.DEFAULT_MODEL ?? 'stepfun/step-3.5-flash:free';\n\n this.logger.debug(`Streaming response for ${userId}, model: ${model}`);\n\n const provider = this.createProvider(config);\n\n try {\n const result = streamText({\n model: provider.chat(model),\n messages: messages as any,\n temperature: options?.temperature,\n maxTokens: options?.maxTokens,\n system: `You are a helpful AI assistant running on Xpod (a Solid Pod-based platform).\n\nYour capabilities:\n1. Help users with various tasks\n2. Use user's configured provider/model to respond consistently\n\nCurrent AI Provider: ${config.baseURL.includes('openrouter') ? 'OpenRouter (Free)' : 'Custom'}\nModel: ${model}\n`,\n } as any);\n\n // Stream text chunks\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n // Handle 429 rate limit errors\n if (this.isRateLimitError(error)) {\n await this.handleRateLimitError(error, context, config.credentialId);\n }\n throw error;\n }\n }\n\n /**\n * Check if error is a 429 rate limit error\n */\n private isRateLimitError(error: unknown): boolean {\n if (error instanceof APICallError) {\n return error.statusCode === 429;\n }\n if (error && typeof error === 'object') {\n const err = error as any;\n return err.status === 429 || err.statusCode === 429 || err.code === 'rate_limit_exceeded';\n }\n return false;\n }\n\n /**\n * Handle 429 rate limit error by updating credential status\n */\n private async handleRateLimitError(\n error: unknown,\n context: StoreContext | undefined,\n credentialId: string | undefined,\n ): Promise<void> {\n if (!context || !credentialId) {\n this.logger.debug('Cannot update credential status: missing context or credentialId');\n return;\n }\n\n let rateLimitResetAt: Date | undefined;\n if (error instanceof APICallError && error.responseHeaders) {\n const retryAfter = error.responseHeaders['retry-after'];\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n rateLimitResetAt = new Date(Date.now() + seconds * 1000);\n } else {\n const date = new Date(retryAfter);\n if (!isNaN(date.getTime())) {\n rateLimitResetAt = date;\n }\n }\n }\n }\n\n if (!rateLimitResetAt) {\n rateLimitResetAt = new Date(Date.now() + 60 * 1000);\n }\n\n this.logger.warn(`Rate limited for credential ${credentialId}, reset at ${rateLimitResetAt.toISOString()}`);\n\n try {\n await this.store.updateCredentialStatus(context, credentialId, CredentialStatus.RATE_LIMITED, {\n rateLimitResetAt,\n incrementFailCount: true,\n });\n } catch (updateError) {\n this.logger.error(`Failed to update credential status: ${updateError}`);\n }\n }\n\n private async getProviderConfig(\n context: StoreContext | undefined,\n ): Promise<{\n baseURL: string;\n apiKey: string;\n proxy?: string;\n defaultModel?: string;\n credentialId?: string;\n } | null> {\n let config: Awaited<ReturnType<PodChatKitStore['getAiConfig']>> | undefined;\n\n if (context) {\n try {\n config = await this.store.getAiConfig(context);\n this.logger.debug(`Pod config: ${JSON.stringify(config)}`);\n } catch (error) {\n this.logger.debug(`Failed to get Pod config: ${error}`);\n config = undefined;\n }\n }\n\n // 1. 用户 Pod 有配置,优先使用\n if (config?.apiKey) {\n return {\n baseURL: config.baseUrl || getDefaultBaseUrl(),\n apiKey: config.apiKey,\n proxy: config.proxyUrl,\n defaultModel: config.defaultModel,\n credentialId: config.credentialId,\n };\n }\n\n // 2. 平台 Provider\n const platformBase = process.env.DEFAULT_API_BASE;\n if (platformBase) {\n return {\n baseURL: platformBase,\n apiKey: process.env.DEFAULT_API_KEY || '',\n };\n }\n\n // 3. 无配置\n this.logger.debug('No valid AI config found');\n return null;\n }\n\n private createProvider(config: { baseURL: string; apiKey: string; proxy?: string }) {\n const { baseURL, apiKey, proxy } = config;\n\n this.logger.debug(`Using AI Provider: ${baseURL} (proxy: ${proxy || 'none'})`);\n\n const options: any = { baseURL, apiKey };\n if (proxy) {\n options.fetch = createProxyFetch(proxy);\n }\n\n return createOpenAI(options);\n }\n\n}\n"]}
1
+ {"version":3,"file":"ai-provider.js","sourceRoot":"","sources":["../../../src/api/chatkit/ai-provider.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AI Provider Adapter\n *\n * Adapts existing AI services to the ChatKit AiProvider interface.\n * Includes 429 rate limit handling with credential status backfill.\n */\n\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { streamText, APICallError } from 'ai';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { ProxyAgent } from 'undici';\nimport type { AiProvider } from './service';\nimport type { StoreContext } from './store';\nimport type { PodChatKitStore } from './pod-store';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { getWebId, getAccountId } from '../auth/AuthContext';\nimport { CredentialStatus } from '../../credential/schema/types';\nimport { getDefaultBaseUrl } from '../service/provider-registry';\nimport { getPlatformApiBaseUrl, getPlatformApiKey, getPlatformDefaultModel } from '../service/platform-ai-config';\n\n// Create a proxy-aware fetch function\nfunction createProxyFetch(proxyUrl: string): typeof fetch {\n const agent = new ProxyAgent(proxyUrl);\n return (url, init) => fetch(url, { ...init, dispatcher: agent } as any);\n}\n\nexport interface VercelAiProviderOptions {\n store: PodChatKitStore;\n}\n\n/**\n * Vercel AI SDK based provider\n *\n * Uses PodChatKitStore to get AI provider settings from Pod.\n * Reuses the same Session cached in StoreContext.\n */\nexport class VercelAiProvider implements AiProvider {\n private readonly logger = getLoggerFor(this);\n private readonly store: PodChatKitStore;\n\n public constructor(options: VercelAiProviderOptions) {\n this.store = options.store;\n }\n\n /**\n * Stream a response for the given messages\n */\n public async *streamResponse(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n options?: {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n context?: unknown;\n },\n ): AsyncIterable<string> {\n // Get context (contains auth and cached session)\n const context = options?.context as StoreContext | undefined;\n const auth = context?.auth as AuthContext | undefined;\n const userId = auth ? (getWebId(auth) ?? getAccountId(auth) ?? 'anonymous') : 'anonymous';\n\n // 从 Pod 获取配置\n const config = await this.getProviderConfig(context);\n\n if (!config) {\n throw new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n }\n\n const model = options?.model ?? config.defaultModel ?? getPlatformDefaultModel();\n\n this.logger.debug(`Streaming response for ${userId}, model: ${model}`);\n\n const provider = this.createProvider(config);\n\n try {\n const result = streamText({\n model: provider.chat(model),\n messages: messages as any,\n temperature: options?.temperature,\n maxTokens: options?.maxTokens,\n system: `You are a helpful AI assistant running on Xpod (a Solid Pod-based platform).\n\nYour capabilities:\n1. Help users with various tasks\n2. Use user's configured provider/model to respond consistently\n\nCurrent AI Provider: ${config.baseURL.includes('openrouter') ? 'OpenRouter (Free)' : 'Custom'}\nModel: ${model}\n`,\n } as any);\n\n // Stream text chunks\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n // Handle 429 rate limit errors\n if (this.isRateLimitError(error)) {\n await this.handleRateLimitError(error, context, config.credentialId);\n }\n throw error;\n }\n }\n\n /**\n * Check if error is a 429 rate limit error\n */\n private isRateLimitError(error: unknown): boolean {\n if (error instanceof APICallError) {\n return error.statusCode === 429;\n }\n if (error && typeof error === 'object') {\n const err = error as any;\n return err.status === 429 || err.statusCode === 429 || err.code === 'rate_limit_exceeded';\n }\n return false;\n }\n\n /**\n * Handle 429 rate limit error by updating credential status\n */\n private async handleRateLimitError(\n error: unknown,\n context: StoreContext | undefined,\n credentialId: string | undefined,\n ): Promise<void> {\n if (!context || !credentialId) {\n this.logger.debug('Cannot update credential status: missing context or credentialId');\n return;\n }\n\n let rateLimitResetAt: Date | undefined;\n if (error instanceof APICallError && error.responseHeaders) {\n const retryAfter = error.responseHeaders['retry-after'];\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n rateLimitResetAt = new Date(Date.now() + seconds * 1000);\n } else {\n const date = new Date(retryAfter);\n if (!isNaN(date.getTime())) {\n rateLimitResetAt = date;\n }\n }\n }\n }\n\n if (!rateLimitResetAt) {\n rateLimitResetAt = new Date(Date.now() + 60 * 1000);\n }\n\n this.logger.warn(`Rate limited for credential ${credentialId}, reset at ${rateLimitResetAt.toISOString()}`);\n\n try {\n await this.store.updateCredentialStatus(context, credentialId, CredentialStatus.RATE_LIMITED, {\n rateLimitResetAt,\n incrementFailCount: true,\n });\n } catch (updateError) {\n this.logger.error(`Failed to update credential status: ${updateError}`);\n }\n }\n\n private async getProviderConfig(\n context: StoreContext | undefined,\n ): Promise<{\n baseURL: string;\n apiKey: string;\n proxy?: string;\n defaultModel?: string;\n credentialId?: string;\n } | null> {\n let config: Awaited<ReturnType<PodChatKitStore['getAiConfig']>> | undefined;\n\n if (context) {\n try {\n config = await this.store.getAiConfig(context);\n this.logger.debug(`Pod config: ${JSON.stringify(config)}`);\n } catch (error) {\n this.logger.debug(`Failed to get Pod config: ${error}`);\n config = undefined;\n }\n }\n\n // 1. 用户 Pod 有配置,优先使用\n if (config?.apiKey) {\n return {\n baseURL: config.baseUrl || getDefaultBaseUrl(),\n apiKey: config.apiKey,\n proxy: config.proxyUrl,\n defaultModel: config.defaultModel,\n credentialId: config.credentialId,\n };\n }\n\n // 2. 平台 Provider\n const platformBase = getPlatformApiBaseUrl();\n if (platformBase) {\n return {\n baseURL: platformBase,\n apiKey: getPlatformApiKey(),\n };\n }\n\n // 3. 无配置\n this.logger.debug('No valid AI config found');\n return null;\n }\n\n private createProvider(config: { baseURL: string; apiKey: string; proxy?: string }) {\n const { baseURL, apiKey, proxy } = config;\n\n this.logger.debug(`Using AI Provider: ${baseURL} (proxy: ${proxy || 'none'})`);\n\n const options: any = { baseURL, apiKey };\n if (proxy) {\n options.fetch = createProxyFetch(proxy);\n }\n\n return createOpenAI(options);\n }\n\n}\n"]}
@@ -36,6 +36,7 @@ exports.isDefaultAgentAvailable = isDefaultAgentAvailable;
36
36
  exports.runDefaultAgent = runDefaultAgent;
37
37
  exports.streamDefaultAgent = streamDefaultAgent;
38
38
  const global_logger_factory_1 = require("global-logger-factory");
39
+ const platform_ai_config_1 = require("../service/platform-ai-config");
39
40
  let cachedClaudeQuery;
40
41
  async function loadClaudeQuery() {
41
42
  if (cachedClaudeQuery) {
@@ -82,16 +83,16 @@ function getAssistantText(value) {
82
83
  function getDefaultAgentConfig() {
83
84
  return {
84
85
  claudeCodePath: process.env.CLAUDE_CODE_PATH || undefined,
85
- provider: process.env.DEFAULT_PROVIDER || 'openrouter',
86
- model: process.env.DEFAULT_MODEL || 'stepfun/step-3.5-flash:free',
87
- apiKey: process.env.DEFAULT_API_KEY || '',
86
+ provider: (0, platform_ai_config_1.getPlatformProviderId)(),
87
+ model: (0, platform_ai_config_1.getPlatformDefaultModel)(),
88
+ apiKey: (0, platform_ai_config_1.getPlatformApiKey)(),
88
89
  };
89
90
  }
90
91
  /**
91
92
  * 检查 Default Agent 是否可用
92
93
  */
93
94
  function isDefaultAgentAvailable() {
94
- return !!(process.env.DEFAULT_API_KEY || process.env.DEFAULT_API_BASE);
95
+ return (0, platform_ai_config_1.hasPlatformApiConfig)();
95
96
  }
96
97
  /**
97
98
  * Default Agent System Prompt
@@ -213,7 +214,7 @@ function normalizeClaudeBaseUrl(baseUrl) {
213
214
  function buildClaudeEnv(config, context) {
214
215
  const provider = (config.provider || '').toLowerCase();
215
216
  const model = (config.model || '').trim();
216
- const baseUrl = process.env.DEFAULT_API_BASE || getDefaultBaseUrl(config.provider);
217
+ const baseUrl = (0, platform_ai_config_1.getPlatformApiBaseUrl)() || getDefaultBaseUrl(config.provider);
217
218
  const isOpenRouterLike = provider === 'openrouter' || baseUrl.includes('openrouter.ai');
218
219
  const env = {
219
220
  ...process.env,
@@ -258,7 +259,7 @@ function resolveClaudeModel(config) {
258
259
  */
259
260
  async function runDefaultAgent(message, context, options) {
260
261
  const config = getDefaultAgentConfig();
261
- if (!config.apiKey && !process.env.DEFAULT_API_BASE) {
262
+ if (!(0, platform_ai_config_1.hasPlatformApiConfig)()) {
262
263
  return {
263
264
  content: '',
264
265
  success: false,
@@ -327,7 +328,7 @@ async function runDefaultAgent(message, context, options) {
327
328
  */
328
329
  async function* streamDefaultAgent(message, context, options) {
329
330
  const config = getDefaultAgentConfig();
330
- if (!config.apiKey && !process.env.DEFAULT_API_BASE) {
331
+ if (!(0, platform_ai_config_1.hasPlatformApiConfig)()) {
331
332
  throw new Error('Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required');
332
333
  }
333
334
  const abortController = new AbortController();
@@ -1 +1 @@
1
- {"version":3,"file":"default-agent.js","sourceRoot":"","sources":["../../../src/api/chatkit/default-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Default Agent\n *\n * 基于 Claude Code SDK 的默认 AI Agent,用于:\n * 1. 用户未配置 AI 时的降级方案\n * 2. 帮助用户完成初始化配置\n * 3. 识别并收纳结构化数据到 Pod\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\n\n/**\n * CC SDK 运行时消息结构(避免直接静态导入 ESM 包导致 CJS 启动崩溃)\n */\ntype ClaudeAssistantBlock = { type: 'text'; text: string } | { type: string; [key: string]: unknown };\ntype ClaudeAssistantMessage = { type: 'assistant'; message: { content: ClaudeAssistantBlock[] | unknown } };\ntype ClaudeResultMessage = { type: 'result'; subtype?: string; result?: string; total_cost_usd?: number };\ntype ClaudeQueryMessage = ClaudeAssistantMessage | ClaudeResultMessage | { type: string; [key: string]: unknown };\ntype ClaudeQuery = (args: unknown) => AsyncIterable<ClaudeQueryMessage>;\n\nlet cachedClaudeQuery: ClaudeQuery | undefined;\n\nasync function loadClaudeQuery(): Promise<ClaudeQuery> {\n if (cachedClaudeQuery) {\n return cachedClaudeQuery;\n }\n\n // Keep native dynamic import so CJS build can load ESM-only SDK lazily.\n const mod = await import('@anthropic-ai/claude-agent-sdk') as Record<string, unknown>;\n const maybeQuery = (mod as { query?: unknown }).query;\n\n if (typeof maybeQuery !== 'function') {\n throw new Error('Invalid Claude Agent SDK: query() not found');\n }\n\n cachedClaudeQuery = maybeQuery as ClaudeQuery;\n return cachedClaudeQuery;\n}\n\nconst logger = getLoggerFor('DefaultAgent');\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isAssistantMessage(value: ClaudeQueryMessage): value is ClaudeAssistantMessage {\n return value.type === 'assistant' && isObject((value as { message?: unknown }).message);\n}\n\nfunction isResultMessage(value: ClaudeQueryMessage): value is ClaudeResultMessage {\n return value.type === 'result';\n}\n\nfunction getAssistantText(value: ClaudeQueryMessage): string {\n if (!isAssistantMessage(value)) {\n return '';\n }\n\n const content = value.message.content;\n if (!Array.isArray(content)) {\n return '';\n }\n\n let text = '';\n for (const block of content) {\n if (isObject(block) && block.type === 'text' && typeof block.text === 'string') {\n text += block.text;\n }\n }\n\n return text;\n}\n\n/**\n * Default Agent 配置\n */\nexport interface DefaultAgentConfig {\n /** Claude Code 可执行文件路径 */\n claudeCodePath?: string;\n /** 默认 AI 提供商 */\n provider?: string;\n /** 默认模型 */\n model?: string;\n /** API Key */\n apiKey?: string;\n}\n\n/**\n * Default Agent 会话上下文\n */\nexport interface DefaultAgentContext {\n /** 用户的访问令牌 */\n solidToken: string;\n /** 用户的 Pod 基础 URL */\n podBaseUrl: string;\n /** 用户 WebID */\n webId?: string;\n}\n\n/**\n * Default Agent 响应\n */\nexport interface DefaultAgentResponse {\n /** 响应内容 */\n content: string;\n /** 是否成功 */\n success: boolean;\n /** 错误信息 */\n error?: string;\n /** 使用的模型 */\n model?: string;\n /** 花费(USD) */\n costUsd?: number;\n}\n\n/**\n * 获取 Default Agent 配置\n */\nexport function getDefaultAgentConfig(): DefaultAgentConfig {\n return {\n claudeCodePath: process.env.CLAUDE_CODE_PATH || undefined,\n provider: process.env.DEFAULT_PROVIDER || 'openrouter',\n model: process.env.DEFAULT_MODEL || 'stepfun/step-3.5-flash:free',\n apiKey: process.env.DEFAULT_API_KEY || '',\n };\n}\n\n/**\n * 检查 Default Agent 是否可用\n */\nexport function isDefaultAgentAvailable(): boolean {\n return !!(process.env.DEFAULT_API_KEY || process.env.DEFAULT_API_BASE);\n}\n\n/**\n * Default Agent System Prompt\n */\nconst DEFAULT_AGENT_SYSTEM_PROMPT = `你是 Xpod Default Agent,运行在用户的 Solid Pod 上。\n\n## 你的职责\n1. 帮助用户完成初始化配置(特别是 AI 配置)\n2. 识别用户消息中的结构化数据并存储到 Pod\n3. 按语义网规范组织数据\n\n## 数据收纳能力\n当用户的消息中包含以下类型的信息时,识别并保存:\n\n### AI 配置(最重要)\n- API Key、Provider、Model、Base URL\n- 存储位置:/settings/ai/credentials.ttl\n- 识别模式:\n - \"我的 OpenAI key 是 sk-xxx\"\n - \"用这个 API key: xxx\"\n - \"anthropic 密钥 xxx\"\n\n### 联系人\n- 姓名、邮箱、电话、WebID\n- 存储位置:/contacts/<name>.ttl\n- 词汇表:vCard (http://www.w3.org/2006/vcard/ns#)\n\n### 日程/事件\n- 时间、地点、标题\n- 存储位置:/calendar/events.ttl\n- 词汇表:schema:Event\n\n### 笔记\n- 标题、内容\n- 存储位置:/notes/<title>.ttl\n- 词汇表:schema:Note\n\n## Pod 访问方式\n使用 curl 访问用户 Pod,鉴权信息已在环境变量中:\n\n### 读取资源\n\\`\\`\\`bash\ncurl -s -H \"Authorization: Bearer $SOLID_TOKEN\" \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 写入 Turtle 数据\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -d '<turtle-content>' \\\\\n \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 创建容器(目录)\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -H \"Link: <http://www.w3.org/ns/ldp#BasicContainer>; rel=\\\\\"type\\\\\"\" \\\\\n \"$POD_BASE_URL<path>/\"\n\\`\\`\\`\n\n## 语义网规范\n使用 Turtle 格式,优先使用标准词汇表。\n\n### AI 配置示例\n\\`\\`\\`turtle\n@prefix xpod: <http://xpod.dev/ns#> .\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n\n<#openai-credential> a xpod:AiCredential ;\n rdfs:label \"OpenAI\" ;\n xpod:provider \"openai\" ;\n xpod:apiKey \"sk-xxx\" ;\n xpod:baseUrl \"https://api.openai.com/v1\" .\n\\`\\`\\`\n\n### 联系人示例\n\\`\\`\\`turtle\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#> .\n\n<#person> a vcard:Individual ;\n vcard:fn \"张三\" ;\n vcard:hasEmail <mailto:zhangsan@example.com> ;\n vcard:hasTelephone <tel:+8613800138000> .\n\\`\\`\\`\n\n## 交互原则\n1. 识别到结构化数据时,直接保存(不需要确认)\n2. 保存成功后简短告知用户\n3. 如果是 AI 配置,提示用户\"已保存,后续对话将使用你的 AI 配置\"\n4. 其他情况正常对话即可\n5. 回复使用中文`;\n\n\nfunction getDefaultBaseUrl(provider?: string): string {\n const normalized = (provider || 'openrouter').toLowerCase();\n const urls: Record<string, string> = {\n openai: 'https://api.openai.com/v1',\n google: 'https://generativelanguage.googleapis.com/v1beta/openai',\n anthropic: 'https://api.anthropic.com/v1',\n deepseek: 'https://api.deepseek.com/v1',\n openrouter: 'https://openrouter.ai/api/v1',\n ollama: 'http://localhost:11434/v1',\n mistral: 'https://api.mistral.ai/v1',\n cohere: 'https://api.cohere.ai/v1',\n zhipu: 'https://open.bigmodel.cn/api/paas/v4',\n };\n return urls[normalized] || urls.openrouter;\n}\n\nfunction normalizeClaudeBaseUrl(baseUrl: string): string {\n if (baseUrl.endsWith('/v1')) {\n return baseUrl.slice(0, -3);\n }\n if (baseUrl.endsWith('/v1/')) {\n return baseUrl.slice(0, -4);\n }\n return baseUrl;\n}\n\nfunction buildClaudeEnv(config: DefaultAgentConfig, context: DefaultAgentContext): NodeJS.ProcessEnv {\n const provider = (config.provider || '').toLowerCase();\n const model = (config.model || '').trim();\n const baseUrl = process.env.DEFAULT_API_BASE || getDefaultBaseUrl(config.provider);\n const isOpenRouterLike = provider === 'openrouter' || baseUrl.includes('openrouter.ai');\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n SOLID_TOKEN: context.solidToken,\n POD_BASE_URL: context.podBaseUrl,\n };\n\n if (isOpenRouterLike) {\n // Claude Code expects Anthropic-shaped settings; OpenRouter is compatible after base path normalization.\n env.ANTHROPIC_BASE_URL = normalizeClaudeBaseUrl(baseUrl);\n if (config.apiKey) {\n env.ANTHROPIC_AUTH_TOKEN = config.apiKey;\n }\n if (model) {\n env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;\n env.ANTHROPIC_DEFAULT_HAIKU_MODEL = model;\n env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;\n }\n delete env.ANTHROPIC_API_KEY;\n } else {\n env.ANTHROPIC_BASE_URL = baseUrl;\n if (config.apiKey) {\n env.ANTHROPIC_API_KEY = config.apiKey;\n }\n delete env.ANTHROPIC_AUTH_TOKEN;\n }\n\n return env;\n}\n\nfunction resolveClaudeModel(config: DefaultAgentConfig): string {\n const model = (config.model || '').trim();\n if (!model) {\n return 'sonnet';\n }\n\n if (model.startsWith('claude') || model.includes('anthropic/')) {\n return model;\n }\n\n // Non-Anthropic models (OpenRouter route) are mapped via ANTHROPIC_DEFAULT_SONNET_MODEL.\n return 'sonnet';\n}\n\n/**\n * 运行 Default Agent\n */\nexport async function runDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): Promise<DefaultAgentResponse> {\n const config = getDefaultAgentConfig();\n\n if (!config.apiKey && !process.env.DEFAULT_API_BASE) {\n return {\n content: '',\n success: false,\n error: 'Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required',\n };\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Running Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n },\n });\n\n let content = '';\n let costUsd: number | undefined;\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n content += assistantText;\n }\n\n if (isResultMessage(msg)) {\n if (msg.subtype === 'success' && typeof msg.result === 'string' && msg.result.trim()) {\n content = msg.result;\n }\n if (typeof msg.total_cost_usd === 'number') {\n costUsd = msg.total_cost_usd;\n }\n }\n }\n\n clearTimeout(timeoutId);\n\n return {\n content,\n success: true,\n model: config.model || resolveClaudeModel(config),\n costUsd,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Default Agent error: ${errorMessage}`);\n\n return {\n content: '',\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * 流式运行 Default Agent\n */\nexport async function* streamDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): AsyncGenerator<string, void, unknown> {\n const config = getDefaultAgentConfig();\n\n if (!config.apiKey && !process.env.DEFAULT_API_BASE) {\n throw new Error('Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required');\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Streaming Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n includePartialMessages: true,\n },\n });\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n yield assistantText;\n }\n }\n\n clearTimeout(timeoutId);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"default-agent.js","sourceRoot":"","sources":["../../../src/api/chatkit/default-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Default Agent\n *\n * 基于 Claude Code SDK 的默认 AI Agent,用于:\n * 1. 用户未配置 AI 时的降级方案\n * 2. 帮助用户完成初始化配置\n * 3. 识别并收纳结构化数据到 Pod\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n getPlatformApiBaseUrl,\n getPlatformApiKey,\n getPlatformDefaultModel,\n getPlatformProviderId,\n hasPlatformApiConfig,\n} from '../service/platform-ai-config';\n\n/**\n * CC SDK 运行时消息结构(避免直接静态导入 ESM 包导致 CJS 启动崩溃)\n */\ntype ClaudeAssistantBlock = { type: 'text'; text: string } | { type: string; [key: string]: unknown };\ntype ClaudeAssistantMessage = { type: 'assistant'; message: { content: ClaudeAssistantBlock[] | unknown } };\ntype ClaudeResultMessage = { type: 'result'; subtype?: string; result?: string; total_cost_usd?: number };\ntype ClaudeQueryMessage = ClaudeAssistantMessage | ClaudeResultMessage | { type: string; [key: string]: unknown };\ntype ClaudeQuery = (args: unknown) => AsyncIterable<ClaudeQueryMessage>;\n\nlet cachedClaudeQuery: ClaudeQuery | undefined;\n\nasync function loadClaudeQuery(): Promise<ClaudeQuery> {\n if (cachedClaudeQuery) {\n return cachedClaudeQuery;\n }\n\n // Keep native dynamic import so CJS build can load ESM-only SDK lazily.\n const mod = await import('@anthropic-ai/claude-agent-sdk') as Record<string, unknown>;\n const maybeQuery = (mod as { query?: unknown }).query;\n\n if (typeof maybeQuery !== 'function') {\n throw new Error('Invalid Claude Agent SDK: query() not found');\n }\n\n cachedClaudeQuery = maybeQuery as ClaudeQuery;\n return cachedClaudeQuery;\n}\n\nconst logger = getLoggerFor('DefaultAgent');\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isAssistantMessage(value: ClaudeQueryMessage): value is ClaudeAssistantMessage {\n return value.type === 'assistant' && isObject((value as { message?: unknown }).message);\n}\n\nfunction isResultMessage(value: ClaudeQueryMessage): value is ClaudeResultMessage {\n return value.type === 'result';\n}\n\nfunction getAssistantText(value: ClaudeQueryMessage): string {\n if (!isAssistantMessage(value)) {\n return '';\n }\n\n const content = value.message.content;\n if (!Array.isArray(content)) {\n return '';\n }\n\n let text = '';\n for (const block of content) {\n if (isObject(block) && block.type === 'text' && typeof block.text === 'string') {\n text += block.text;\n }\n }\n\n return text;\n}\n\n/**\n * Default Agent 配置\n */\nexport interface DefaultAgentConfig {\n /** Claude Code 可执行文件路径 */\n claudeCodePath?: string;\n /** 默认 AI 提供商 */\n provider?: string;\n /** 默认模型 */\n model?: string;\n /** API Key */\n apiKey?: string;\n}\n\n/**\n * Default Agent 会话上下文\n */\nexport interface DefaultAgentContext {\n /** 用户的访问令牌 */\n solidToken: string;\n /** 用户的 Pod 基础 URL */\n podBaseUrl: string;\n /** 用户 WebID */\n webId?: string;\n}\n\n/**\n * Default Agent 响应\n */\nexport interface DefaultAgentResponse {\n /** 响应内容 */\n content: string;\n /** 是否成功 */\n success: boolean;\n /** 错误信息 */\n error?: string;\n /** 使用的模型 */\n model?: string;\n /** 花费(USD) */\n costUsd?: number;\n}\n\n/**\n * 获取 Default Agent 配置\n */\nexport function getDefaultAgentConfig(): DefaultAgentConfig {\n return {\n claudeCodePath: process.env.CLAUDE_CODE_PATH || undefined,\n provider: getPlatformProviderId(),\n model: getPlatformDefaultModel(),\n apiKey: getPlatformApiKey(),\n };\n}\n\n/**\n * 检查 Default Agent 是否可用\n */\nexport function isDefaultAgentAvailable(): boolean {\n return hasPlatformApiConfig();\n}\n\n/**\n * Default Agent System Prompt\n */\nconst DEFAULT_AGENT_SYSTEM_PROMPT = `你是 Xpod Default Agent,运行在用户的 Solid Pod 上。\n\n## 你的职责\n1. 帮助用户完成初始化配置(特别是 AI 配置)\n2. 识别用户消息中的结构化数据并存储到 Pod\n3. 按语义网规范组织数据\n\n## 数据收纳能力\n当用户的消息中包含以下类型的信息时,识别并保存:\n\n### AI 配置(最重要)\n- API Key、Provider、Model、Base URL\n- 存储位置:/settings/ai/credentials.ttl\n- 识别模式:\n - \"我的 OpenAI key 是 sk-xxx\"\n - \"用这个 API key: xxx\"\n - \"anthropic 密钥 xxx\"\n\n### 联系人\n- 姓名、邮箱、电话、WebID\n- 存储位置:/contacts/<name>.ttl\n- 词汇表:vCard (http://www.w3.org/2006/vcard/ns#)\n\n### 日程/事件\n- 时间、地点、标题\n- 存储位置:/calendar/events.ttl\n- 词汇表:schema:Event\n\n### 笔记\n- 标题、内容\n- 存储位置:/notes/<title>.ttl\n- 词汇表:schema:Note\n\n## Pod 访问方式\n使用 curl 访问用户 Pod,鉴权信息已在环境变量中:\n\n### 读取资源\n\\`\\`\\`bash\ncurl -s -H \"Authorization: Bearer $SOLID_TOKEN\" \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 写入 Turtle 数据\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -d '<turtle-content>' \\\\\n \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 创建容器(目录)\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -H \"Link: <http://www.w3.org/ns/ldp#BasicContainer>; rel=\\\\\"type\\\\\"\" \\\\\n \"$POD_BASE_URL<path>/\"\n\\`\\`\\`\n\n## 语义网规范\n使用 Turtle 格式,优先使用标准词汇表。\n\n### AI 配置示例\n\\`\\`\\`turtle\n@prefix xpod: <http://xpod.dev/ns#> .\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n\n<#openai-credential> a xpod:AiCredential ;\n rdfs:label \"OpenAI\" ;\n xpod:provider \"openai\" ;\n xpod:apiKey \"sk-xxx\" ;\n xpod:baseUrl \"https://api.openai.com/v1\" .\n\\`\\`\\`\n\n### 联系人示例\n\\`\\`\\`turtle\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#> .\n\n<#person> a vcard:Individual ;\n vcard:fn \"张三\" ;\n vcard:hasEmail <mailto:zhangsan@example.com> ;\n vcard:hasTelephone <tel:+8613800138000> .\n\\`\\`\\`\n\n## 交互原则\n1. 识别到结构化数据时,直接保存(不需要确认)\n2. 保存成功后简短告知用户\n3. 如果是 AI 配置,提示用户\"已保存,后续对话将使用你的 AI 配置\"\n4. 其他情况正常对话即可\n5. 回复使用中文`;\n\n\nfunction getDefaultBaseUrl(provider?: string): string {\n const normalized = (provider || 'openrouter').toLowerCase();\n const urls: Record<string, string> = {\n openai: 'https://api.openai.com/v1',\n google: 'https://generativelanguage.googleapis.com/v1beta/openai',\n anthropic: 'https://api.anthropic.com/v1',\n deepseek: 'https://api.deepseek.com/v1',\n openrouter: 'https://openrouter.ai/api/v1',\n ollama: 'http://localhost:11434/v1',\n mistral: 'https://api.mistral.ai/v1',\n cohere: 'https://api.cohere.ai/v1',\n zhipu: 'https://open.bigmodel.cn/api/paas/v4',\n };\n return urls[normalized] || urls.openrouter;\n}\n\nfunction normalizeClaudeBaseUrl(baseUrl: string): string {\n if (baseUrl.endsWith('/v1')) {\n return baseUrl.slice(0, -3);\n }\n if (baseUrl.endsWith('/v1/')) {\n return baseUrl.slice(0, -4);\n }\n return baseUrl;\n}\n\nfunction buildClaudeEnv(config: DefaultAgentConfig, context: DefaultAgentContext): NodeJS.ProcessEnv {\n const provider = (config.provider || '').toLowerCase();\n const model = (config.model || '').trim();\n const baseUrl = getPlatformApiBaseUrl() || getDefaultBaseUrl(config.provider);\n const isOpenRouterLike = provider === 'openrouter' || baseUrl.includes('openrouter.ai');\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n SOLID_TOKEN: context.solidToken,\n POD_BASE_URL: context.podBaseUrl,\n };\n\n if (isOpenRouterLike) {\n // Claude Code expects Anthropic-shaped settings; OpenRouter is compatible after base path normalization.\n env.ANTHROPIC_BASE_URL = normalizeClaudeBaseUrl(baseUrl);\n if (config.apiKey) {\n env.ANTHROPIC_AUTH_TOKEN = config.apiKey;\n }\n if (model) {\n env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;\n env.ANTHROPIC_DEFAULT_HAIKU_MODEL = model;\n env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;\n }\n delete env.ANTHROPIC_API_KEY;\n } else {\n env.ANTHROPIC_BASE_URL = baseUrl;\n if (config.apiKey) {\n env.ANTHROPIC_API_KEY = config.apiKey;\n }\n delete env.ANTHROPIC_AUTH_TOKEN;\n }\n\n return env;\n}\n\nfunction resolveClaudeModel(config: DefaultAgentConfig): string {\n const model = (config.model || '').trim();\n if (!model) {\n return 'sonnet';\n }\n\n if (model.startsWith('claude') || model.includes('anthropic/')) {\n return model;\n }\n\n // Non-Anthropic models (OpenRouter route) are mapped via ANTHROPIC_DEFAULT_SONNET_MODEL.\n return 'sonnet';\n}\n\n/**\n * 运行 Default Agent\n */\nexport async function runDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): Promise<DefaultAgentResponse> {\n const config = getDefaultAgentConfig();\n\n if (!hasPlatformApiConfig()) {\n return {\n content: '',\n success: false,\n error: 'Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required',\n };\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Running Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n },\n });\n\n let content = '';\n let costUsd: number | undefined;\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n content += assistantText;\n }\n\n if (isResultMessage(msg)) {\n if (msg.subtype === 'success' && typeof msg.result === 'string' && msg.result.trim()) {\n content = msg.result;\n }\n if (typeof msg.total_cost_usd === 'number') {\n costUsd = msg.total_cost_usd;\n }\n }\n }\n\n clearTimeout(timeoutId);\n\n return {\n content,\n success: true,\n model: config.model || resolveClaudeModel(config),\n costUsd,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Default Agent error: ${errorMessage}`);\n\n return {\n content: '',\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * 流式运行 Default Agent\n */\nexport async function* streamDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): AsyncGenerator<string, void, unknown> {\n const config = getDefaultAgentConfig();\n\n if (!hasPlatformApiConfig()) {\n throw new Error('Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required');\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Streaming Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n includePartialMessages: true,\n },\n });\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n yield assistantText;\n }\n }\n\n clearTimeout(timeoutId);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n"]}
@@ -29,6 +29,7 @@ const crypto = __importStar(require("node:crypto"));
29
29
  const fs = __importStar(require("node:fs"));
30
30
  const os = __importStar(require("node:os"));
31
31
  const global_logger_factory_1 = require("global-logger-factory");
32
+ const platform_ai_config_1 = require("../../service/platform-ai-config");
32
33
  const runtime_1 = require("../../../runtime");
33
34
  const GitWorktreeService_1 = require("./GitWorktreeService");
34
35
  const AcpRunner_1 = require("./AcpRunner");
@@ -452,7 +453,7 @@ class PtyThreadRuntime {
452
453
  buildRunnerEnv(type, threadId, workdir, agentConfig) {
453
454
  // When agentConfig is provided, use its credentials; otherwise fall back to DEFAULT_* env vars.
454
455
  const defaultApiKey = agentConfig?.apiKey || process.env.DEFAULT_API_KEY?.trim();
455
- const rawApiBase = agentConfig?.baseUrl || process.env.DEFAULT_API_BASE?.trim();
456
+ const rawApiBase = agentConfig?.baseUrl || (0, platform_ai_config_1.getPlatformApiBaseUrl)();
456
457
  const defaultModel = agentConfig?.model || process.env.DEFAULT_MODEL?.trim();
457
458
  // CodeBuddy ACP relies on its own local auth state, not OpenAI/Anthropic keys.
458
459
  if (type === 'codebuddy') {
@@ -1 +1 @@
1
- {"version":3,"file":"PtyThreadRuntime.js","sourceRoot":"","sources":["../../../../src/api/chatkit/runtime/PtyThreadRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { PACKAGE_ROOT } from '../../../runtime';\nimport { GitWorktreeService } from './GitWorktreeService';\nimport { AcpRunner } from './AcpRunner';\nimport type { ResolvedAgentConfig } from '../../../agents/config/types';\nimport type { McpServerConfig } from '../../../agents/types';\nimport { codexWireApi, getDefaultBaseUrl } from '../../service/provider-registry';\n\nexport type RunnerType = 'codebuddy' | 'claude' | 'codex';\nexport type RunnerProtocol = 'acp';\n\nexport type WorktreeSpec =\n | { mode: 'existing'; path: string }\n | { mode: 'create'; baseRef?: string; branch?: string };\n\nexport type WorkspaceSpec =\n | { type: 'path'; rootPath: string }\n | { type: 'git'; rootPath: string; worktree: WorktreeSpec };\n\nexport interface PtyRuntimeConfig {\n workspace: WorkspaceSpec;\n /**\n * Stream idle cutoff for agent output. If no output arrives within this window,\n * the current streaming response ends.\n *\n * Defaults to 500ms (fast tests) but real agents may need a larger value.\n */\n idleMs?: number;\n /**\n * How long to keep the stream open after an auth_required event.\n * Defaults to 5 minutes.\n */\n authWaitMs?: number;\n runner: {\n type: RunnerType;\n /**\n * acp: JSON-RPC (Agent Client Protocol) over stdio (recommended)\n */\n protocol?: RunnerProtocol;\n argv?: string[];\n };\n /**\n * Resolved agent configuration from /agents/{agentId}/AGENT.md + .meta.\n * When provided, credentials/model/MCP servers/system prompt come from here\n * instead of DEFAULT_* environment variables.\n */\n agentConfig?: ResolvedAgentConfig;\n}\n\nexport interface PtyThreadRuntimeState {\n workdir: string;\n runnerType: RunnerType;\n protocol: RunnerProtocol;\n argv: string[];\n}\n\nexport type PtyRuntimeOutputEvent =\n | { type: 'text'; text: string }\n | { type: 'error'; message: string }\n | {\n type: 'auth_required';\n method: string;\n url?: string;\n message?: string;\n options?: Array<{ label?: string; url?: string; method?: string }>;\n }\n | {\n type: 'tool_call';\n requestId: string;\n name: string;\n arguments: string;\n };\n\ninterface PendingAcpRequest {\n method: string;\n params?: unknown;\n respond: (result: unknown) => void;\n fail: (code: number, message: string, data?: unknown) => void;\n}\n\ninterface RuntimeEntry {\n runner: AcpRunner;\n state: PtyThreadRuntimeState;\n acp?: {\n sessionId: string;\n pendingRequests: Map<string, PendingAcpRequest>;\n };\n jobs: Array<PtyJob>;\n processing: boolean;\n}\n\n/**\n * In-memory PTY runtime manager keyed by threadId.\n *\n * Notes:\n * - Runtime state is not persisted; thread metadata can store repo/worktree hints,\n * but PTY processes are always runtime-local.\n */\nexport class PtyThreadRuntime {\n private readonly logger = getLoggerFor(this);\n private readonly git = new GitWorktreeService();\n private readonly runtimes = new Map<string, RuntimeEntry>();\n\n constructor(\n private readonly options: {\n worktreeRootDirName?: string;\n } = {},\n ) {}\n\n isRunning(threadId: string): boolean {\n return Boolean(this.runtimes.get(threadId)?.runner.isRunning());\n }\n\n async ensureStarted(threadId: string, cfg: PtyRuntimeConfig): Promise<PtyThreadRuntimeState> {\n const existing = this.runtimes.get(threadId);\n if (existing?.runner.isRunning()) {\n return existing.state;\n }\n\n const workdir = await this.resolveWorkdir(threadId, cfg.workspace);\n if (cfg.workspace.type === 'git') {\n this.git.ensurePathInsideRepo(cfg.workspace.rootPath, workdir);\n }\n\n const protocol: RunnerProtocol = 'acp';\n if (cfg.runner.protocol && cfg.runner.protocol !== 'acp') {\n throw new Error(`Unsupported runner protocol: ${cfg.runner.protocol}. Only 'acp' is supported.`);\n }\n const argv = this.resolveRunnerArgv(cfg.runner.type, cfg.runner.argv);\n const command = argv[0];\n const args = argv.slice(1);\n const env = this.buildRunnerEnv(cfg.runner.type, threadId, workdir, cfg.agentConfig);\n\n const runner = new AcpRunner();\n runner.start({ command, args, cwd: workdir, env });\n\n // ACP handshake + session creation (one session per thread).\n // We intentionally keep capabilities minimal to avoid the agent calling back into the server.\n await runner.request('initialize', {\n protocolVersion: 1,\n clientCapabilities: {},\n clientInfo: { name: 'xpod', version: 'dev' },\n });\n // Build session/new params — inject MCP servers + system prompt from agent config when available.\n const sessionParams: Record<string, unknown> = { cwd: workdir };\n const ac = cfg.agentConfig;\n if (ac) {\n sessionParams.mcpServers = Object.keys(ac.mcpServers).length > 0\n ? this.convertMcpServersForAcp(ac.mcpServers)\n : [];\n if (ac.systemPrompt) sessionParams.systemPrompt = ac.systemPrompt;\n if (ac.skillsContent) sessionParams.appendSystemPrompt = ac.skillsContent;\n if (ac.maxTurns) sessionParams.maxTurns = ac.maxTurns;\n if (ac.allowedTools) sessionParams.allowedTools = ac.allowedTools;\n if (ac.disallowedTools) sessionParams.disallowedTools = ac.disallowedTools;\n if (ac.permissionMode) sessionParams.permissionMode = ac.permissionMode;\n } else {\n sessionParams.mcpServers = [];\n }\n const newSession = await runner.request<{ sessionId: string }>('session/new', sessionParams);\n if (!newSession?.sessionId) {\n throw new Error('ACP session/new did not return sessionId');\n }\n\n const state: PtyThreadRuntimeState = { workdir, runnerType: cfg.runner.type, protocol, argv };\n this.runtimes.set(threadId, {\n runner,\n state,\n acp: { sessionId: newSession.sessionId, pendingRequests: new Map() },\n jobs: [],\n processing: false,\n });\n return state;\n }\n\n stop(threadId: string): void {\n const rt = this.runtimes.get(threadId);\n if (!rt) {\n return;\n }\n rt.runner.stop('SIGINT');\n }\n\n /**\n * Write a message to stdin and stream back output deltas.\n * We serialize jobs per thread to reduce interleaving outputs.\n */\n sendMessage(\n threadId: string,\n text: string,\n options?: { idleMs?: number; authWaitMs?: number },\n ): AsyncIterable<PtyRuntimeOutputEvent> {\n const rt = this.runtimes.get(threadId);\n if (!rt) {\n throw new Error('PTY runtime is not started');\n }\n const idleMs = options?.idleMs ?? 500;\n const authWaitMs = Math.max(options?.authWaitMs ?? 300_000, idleMs);\n const q = new AsyncPushQueue<PtyRuntimeOutputEvent>();\n rt.jobs.push({ input: text, idleMs, authWaitMs, queue: q });\n void this.processJobs(threadId);\n return q.iterate();\n }\n\n respondToRequest(\n threadId: string,\n requestId: string,\n output: string,\n options?: { idleMs?: number; authWaitMs?: number },\n ): AsyncIterable<PtyRuntimeOutputEvent> {\n const rt = this.runtimes.get(threadId);\n if (!rt || rt.state.protocol !== 'acp' || !rt.acp) {\n throw new Error('ACP runtime is not started');\n }\n\n const pending = rt.acp.pendingRequests.get(requestId);\n if (!pending) {\n throw new Error(`ACP request not found: ${requestId}`);\n }\n\n const idleMs = options?.idleMs ?? 500;\n const authWaitMs = Math.max(options?.authWaitMs ?? 300_000, idleMs);\n const q = new AsyncPushQueue<PtyRuntimeOutputEvent>();\n void this.continueAfterRequestResponse(rt, pending, requestId, output, idleMs, authWaitMs, q);\n return q.iterate();\n }\n\n private async processJobs(threadId: string): Promise<void> {\n const rt = this.runtimes.get(threadId);\n if (!rt || rt.processing) {\n return;\n }\n rt.processing = true;\n\n try {\n while (rt.jobs.length > 0) {\n const job = rt.jobs.shift()!;\n await this.runJobAcp(rt, job);\n }\n } finally {\n rt.processing = false;\n }\n }\n\n private async runJobAcp(rt: RuntimeEntry, job: PtyJob): Promise<void> {\n const runner = rt.runner;\n const sessionId = rt.acp?.sessionId;\n if (!sessionId) {\n throw new Error('ACP runtime missing sessionId');\n }\n\n let idleTimer: NodeJS.Timeout | undefined;\n let done = false;\n\n const finish = (): void => {\n if (done) return;\n done = true;\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n runner.off('notification', onNotification);\n runner.off('request', onRequest);\n job.queue.close();\n };\n\n const bumpIdle = (ms: number = job.idleMs): void => {\n if (done) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => finish(), ms);\n };\n\n // For MVP:\n // - auto-ack common \"permission\"/\"auth\" style requests, so agents don't deadlock\n // - surface auth-required as a structured event (so clients can click URL)\n // - surface text chunks from session/update notifications\n const onRequest = (req: any): void => {\n if (!req || typeof req.method !== 'string') return;\n if (req.method === 'session/request_permission' || req.method === 'auth/request' || req.method === 'auth/authorize') {\n const hint = req.params?.message || req.params?.reason || req.method;\n const url = this.extractAuthUrl(req.params);\n const options =\n this.extractAuthOptions(req.params) ??\n (url ? [{ label: 'Continue in browser', url, method: req.method }] : undefined);\n job.queue.push({\n type: 'auth_required',\n method: req.method,\n url,\n message: typeof hint === 'string' ? hint : undefined,\n options,\n });\n // Keep stream open longer so users can complete browser-based auth.\n bumpIdle(job.authWaitMs);\n // Ack so the runner doesn't deadlock.\n // For \"permission\" style requests we grant by default; for auth requests we just acknowledge handling.\n if (req.method === 'session/request_permission') {\n req.respond({ granted: true });\n } else {\n req.respond({ handled: true });\n }\n return;\n }\n // Map unknown requests to a \"tool call\" (client must respond via threads.add_client_tool_output).\n // We end the current stream so the client can send the follow-up request.\n const pendingId = `acp:${String(req.id)}`;\n rt.acp!.pendingRequests.set(pendingId, {\n method: req.method,\n params: req.params,\n respond: req.respond,\n fail: req.fail,\n });\n job.queue.push({\n type: 'tool_call',\n requestId: pendingId,\n name: req.method,\n arguments: JSON.stringify(req.params ?? {}),\n });\n finish();\n };\n\n const onNotification = (method: string, params: any): void => {\n if (method !== 'session/update') return;\n if (!params || params.sessionId !== sessionId) return;\n\n const update = params.update;\n if (!update || typeof update !== 'object') return;\n\n const text = this.extractTextDeltaFromSessionUpdate(update);\n if (typeof text === 'string' && text.length > 0) {\n job.queue.push({ type: 'text', text });\n bumpIdle();\n }\n };\n\n runner.on('request', onRequest);\n runner.on('notification', onNotification);\n try {\n // Don't await: some agents will block the response until tool-call requests are satisfied.\n // However, some agents (notably codex-acp) may return the final text in the response,\n // not via session/update streaming notifications. We therefore attach a best-effort\n // handler to capture text from the response when available.\n void runner.request('session/prompt', {\n sessionId,\n prompt: [ { type: 'text', text: job.input } ],\n }).then((result) => {\n const text = this.extractTextFromPromptResult(result);\n if (typeof text === 'string' && text.length > 0) {\n job.queue.push({ type: 'text', text });\n bumpIdle();\n }\n }).catch((error) => {\n if (!done) {\n this.logger.warn(`ACP session/prompt failed: ${error}`);\n const anyErr = error as any;\n const dataMsg =\n anyErr?.data && typeof anyErr.data === 'object' && typeof anyErr.data.message === 'string'\n ? anyErr.data.message\n : undefined;\n const msg = dataMsg\n ? `${String(anyErr?.message ?? error)} | data.message=${dataMsg.slice(0, 800)}`\n : String(anyErr?.message ?? error);\n job.queue.push({ type: 'error', message: msg });\n finish();\n }\n });\n // Some agents return the session/prompt response before streaming the final updates.\n // We therefore keep listening until the stream goes idle.\n bumpIdle();\n await job.queue.waitClosed();\n } finally {\n finish();\n }\n }\n\n private async continueAfterRequestResponse(\n rt: RuntimeEntry,\n pending: PendingAcpRequest,\n requestId: string,\n output: string,\n idleMs: number,\n authWaitMs: number,\n queue: AsyncPushQueue<PtyRuntimeOutputEvent>,\n ): Promise<void> {\n const runner = rt.runner;\n const sessionId = rt.acp?.sessionId;\n if (!sessionId || !rt.acp) {\n throw new Error('ACP runtime missing session');\n }\n\n let idleTimer: NodeJS.Timeout | undefined;\n let done = false;\n\n const finish = (): void => {\n if (done) return;\n done = true;\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n runner.off('notification', onNotification);\n runner.off('request', onRequest);\n queue.close();\n };\n\n const bumpIdle = (ms: number = idleMs): void => {\n if (done) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => finish(), ms);\n };\n\n const onRequest = (req: any): void => {\n if (!req || typeof req.method !== 'string') return;\n if (req.method === 'session/request_permission' || req.method === 'auth/request' || req.method === 'auth/authorize') {\n const hint = req.params?.message || req.params?.reason || req.method;\n const url = this.extractAuthUrl(req.params);\n const options =\n this.extractAuthOptions(req.params) ??\n (url ? [{ label: 'Continue in browser', url, method: req.method }] : undefined);\n queue.push({\n type: 'auth_required',\n method: req.method,\n url,\n message: typeof hint === 'string' ? hint : undefined,\n options,\n });\n // Keep stream open longer so users can complete browser-based auth.\n bumpIdle(authWaitMs);\n if (req.method === 'session/request_permission') {\n req.respond({ granted: true });\n } else {\n req.respond({ handled: true });\n }\n return;\n }\n\n const nestedId = `acp:${String(req.id)}`;\n rt.acp!.pendingRequests.set(nestedId, {\n method: req.method,\n params: req.params,\n respond: req.respond,\n fail: req.fail,\n });\n queue.push({\n type: 'tool_call',\n requestId: nestedId,\n name: req.method,\n arguments: JSON.stringify(req.params ?? {}),\n });\n finish();\n };\n\n const onNotification = (method: string, params: any): void => {\n if (method !== 'session/update') return;\n if (!params || params.sessionId !== sessionId) return;\n const update = params.update;\n if (!update || typeof update !== 'object') return;\n const text = this.extractTextDeltaFromSessionUpdate(update);\n if (typeof text === 'string' && text.length > 0) {\n queue.push({ type: 'text', text });\n bumpIdle();\n }\n };\n\n runner.on('request', onRequest);\n runner.on('notification', onNotification);\n try {\n rt.acp.pendingRequests.delete(requestId);\n let result: unknown = output;\n try {\n result = JSON.parse(output);\n } catch {\n // keep raw string\n }\n pending.respond(result);\n bumpIdle();\n await queue.waitClosed();\n } finally {\n finish();\n }\n }\n\n private async resolveWorkdir(threadId: string, workspace: WorkspaceSpec): Promise<string> {\n if (workspace.type === 'path') {\n if (!fs.existsSync(workspace.rootPath)) {\n throw new Error(`workspace.rootPath not found: ${workspace.rootPath}`);\n }\n return workspace.rootPath;\n }\n\n // workspace.type === 'git'\n const repoRoot = workspace.rootPath;\n const worktree = workspace.worktree;\n\n if (worktree.mode === 'existing') {\n if (!fs.existsSync(worktree.path)) {\n throw new Error(`worktree.path not found: ${worktree.path}`);\n }\n return worktree.path;\n }\n\n await this.git.assertGitRepo(repoRoot);\n\n const rootDirName = this.options.worktreeRootDirName ?? '.xpod-worktrees';\n const root = path.join(repoRoot, rootDirName);\n const worktreePath = path.join(root, threadId);\n\n if (fs.existsSync(worktreePath)) {\n return worktreePath;\n }\n\n const baseRef = worktree.baseRef ?? 'main';\n await this.git.createWorktree({\n repoPath: repoRoot,\n worktreePath,\n baseRef,\n branch: worktree.branch,\n });\n\n return worktreePath;\n }\n\n private resolveRunnerArgv(type: RunnerType, argv?: string[]): string[] {\n if (argv && argv.length > 0) {\n return argv;\n }\n switch (type) {\n case 'codebuddy':\n return [ this.resolveLocalBin('codebuddy'), '--acp' ];\n case 'claude':\n return [ this.resolveLocalBin('claude-code-acp') ]; // from @zed-industries/claude-code-acp\n case 'codex':\n return [ this.resolveLocalBin('codex-acp') ]; // from @zed-industries/codex-acp\n default:\n return [ type ];\n }\n }\n\n private resolveLocalBin(binName: string): string {\n const localBin = path.join(PACKAGE_ROOT, 'node_modules', '.bin', binName);\n if (fs.existsSync(localBin)) {\n return localBin;\n }\n return binName;\n }\n\n private buildRunnerEnv(\n type: RunnerType,\n threadId: string,\n workdir: string,\n agentConfig?: ResolvedAgentConfig,\n ): Record<string, string | undefined> | undefined {\n // When agentConfig is provided, use its credentials; otherwise fall back to DEFAULT_* env vars.\n const defaultApiKey = agentConfig?.apiKey || process.env.DEFAULT_API_KEY?.trim();\n const rawApiBase = agentConfig?.baseUrl || process.env.DEFAULT_API_BASE?.trim();\n const defaultModel = agentConfig?.model || process.env.DEFAULT_MODEL?.trim();\n\n // CodeBuddy ACP relies on its own local auth state, not OpenAI/Anthropic keys.\n if (type === 'codebuddy') {\n return undefined;\n }\n\n // Run external agents with an isolated HOME to avoid:\n // - polluting the user's real ~/.codex / ~/.claude state\n // - sandbox permission errors when tools try to write outside workspace roots\n const home = this.getIsolatedHomeDir(type, threadId, workdir);\n\n if (type === 'codex') {\n // codex-acp speaks OpenAI Responses API by default. Only api.openai.com natively supports it.\n // For all other providers, configure codex to use wire_api=\"chat\" so it sends\n // Chat Completions requests directly to the provider instead.\n const defaultApiBase = rawApiBase || getDefaultBaseUrl();\n const codexHome = path.join(home, '.codex');\n this.ensureDir(codexHome);\n this.ensureDir(path.join(codexHome, 'skills'));\n this.ensureCodexConfigAndAuth(codexHome, {\n baseUrl: defaultApiBase,\n apiKey: defaultApiKey,\n wireApi: codexWireApi(defaultApiBase),\n });\n const env: Record<string, string | undefined> = {\n HOME: home,\n XDG_CONFIG_HOME: path.join(home, '.config'),\n XDG_STATE_HOME: path.join(home, '.local', 'state'),\n XDG_DATA_HOME: path.join(home, '.local', 'share'),\n XDG_CACHE_HOME: path.join(home, '.cache'),\n CODEX_HOME: codexHome,\n };\n if (defaultApiKey) {\n // codex-acp advertises CODEX_API_KEY / OPENAI_API_KEY.\n env.CODEX_API_KEY = defaultApiKey;\n env.OPENAI_API_KEY = defaultApiKey;\n }\n env.OPENAI_BASE_URL = defaultApiBase;\n env.OPENAI_API_BASE = defaultApiBase;\n if (defaultModel) {\n // Best-effort: may be ignored by codex-acp depending on its config.\n env.OPENAI_MODEL = defaultModel;\n env.CODEX_MODEL = defaultModel;\n }\n return env;\n }\n\n // type === 'claude'\n const defaultApiBase = rawApiBase || getDefaultBaseUrl();\n const env: Record<string, string | undefined> = {\n HOME: home,\n XDG_CONFIG_HOME: path.join(home, '.config'),\n XDG_STATE_HOME: path.join(home, '.local', 'state'),\n XDG_DATA_HOME: path.join(home, '.local', 'share'),\n XDG_CACHE_HOME: path.join(home, '.cache'),\n };\n const normalizedBase = defaultApiBase ? this.normalizeClaudeBaseUrl(defaultApiBase) : undefined;\n const isOpenRouterLike =\n (typeof normalizedBase === 'string' && normalizedBase.includes('openrouter.ai'));\n\n if (defaultApiKey) {\n // claude-code-acp is built on the Claude Agent SDK.\n // For OpenRouter, the Anthropic-compatible path is typically via AUTH_TOKEN.\n if (isOpenRouterLike) {\n env.ANTHROPIC_AUTH_TOKEN = defaultApiKey;\n delete env.ANTHROPIC_API_KEY;\n } else {\n env.ANTHROPIC_API_KEY = defaultApiKey;\n delete env.ANTHROPIC_AUTH_TOKEN;\n }\n }\n if (normalizedBase) {\n env.ANTHROPIC_BASE_URL = normalizedBase;\n }\n if (defaultModel) {\n // Use the same model for all families to keep behavior predictable.\n env.ANTHROPIC_DEFAULT_SONNET_MODEL = defaultModel;\n env.ANTHROPIC_DEFAULT_HAIKU_MODEL = defaultModel;\n env.ANTHROPIC_DEFAULT_OPUS_MODEL = defaultModel;\n }\n return env;\n }\n\n private getIsolatedHomeDir(type: Exclude<RunnerType, 'codebuddy'>, threadId: string, workdir: string): string {\n // Keep it stable per thread/workdir so session state can be reused across requests,\n // but still isolated from the user's actual home.\n const hash = crypto.createHash('sha256').update(`${type}:${threadId}:${workdir}`).digest('hex').slice(0, 16);\n const root = path.join(os.tmpdir(), 'xpod-acp-home', type, hash);\n fs.mkdirSync(root, { recursive: true });\n return root;\n }\n\n private ensureDir(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // best-effort: agent binaries may create it themselves\n }\n }\n\n private normalizeClaudeBaseUrl(baseUrl: string): string {\n if (baseUrl.endsWith('/v1')) {\n return baseUrl.slice(0, -3);\n }\n if (baseUrl.endsWith('/v1/')) {\n return baseUrl.slice(0, -4);\n }\n return baseUrl;\n }\n\n private ensureCodexConfigAndAuth(\n codexHome: string,\n options: { baseUrl?: string; apiKey?: string; wireApi?: 'responses' | 'chat' },\n ): void {\n // codex-acp wraps Codex CLI, which primarily reads config/auth from CODEX_HOME.\n // We generate a minimal config + auth file for isolated runs so that:\n // - it doesn't depend on the developer's ~/.codex\n // - it can authenticate without interactive login\n const configPath = path.join(codexHome, 'config.toml');\n const authPath = path.join(codexHome, 'auth.json');\n\n try {\n const baseUrl = options.baseUrl?.trim();\n if (baseUrl) {\n const wireApi = options.wireApi ?? 'responses';\n const contents = [\n 'model_provider = \"codex\"',\n '',\n '[model_providers.codex]',\n 'name = \"codex\"',\n `base_url = ${JSON.stringify(baseUrl)}`,\n `wire_api = ${JSON.stringify(wireApi)}`,\n 'requires_openai_auth = true',\n '',\n ].join('\\n');\n fs.writeFileSync(configPath, contents, { encoding: 'utf8' });\n }\n } catch (e) {\n this.logger.debug(`Failed to write Codex config.toml: ${String(e)}`);\n }\n\n try {\n const apiKey = options.apiKey?.trim();\n if (apiKey) {\n // Match Codex's expected schema.\n fs.writeFileSync(authPath, JSON.stringify({ OPENAI_API_KEY: apiKey }), { encoding: 'utf8' });\n }\n } catch (e) {\n this.logger.debug(`Failed to write Codex auth.json: ${String(e)}`);\n }\n }\n\n /**\n * Convert McpServerConfig map to ACP session/new format.\n * ACP expects an array of { name, ...config } objects.\n */\n private convertMcpServersForAcp(\n servers: Record<string, McpServerConfig>,\n ): Array<Record<string, unknown>> {\n return Object.entries(servers).map(([name, config]) => ({\n name,\n ...config,\n }));\n }\n\n private extractTextDeltaFromSessionUpdate(update: any): string | undefined {\n if (!update) return undefined;\n\n // Common shapes:\n // - { sessionUpdate/type: 'agent_message_chunk', content: { type:'text', text:'...' } }\n // - { ... , delta/text/content: '...' }\n // - { ... , message: { content: [{ type:'text', text:'...' }, ...] } }\n if (typeof update === 'string') return update;\n if (typeof update.delta === 'string') return update.delta;\n if (typeof update.text === 'string') return update.text;\n\n const content = update.content?.content ?? update.content;\n if (typeof content === 'string') return content;\n if (content && typeof content === 'object') {\n if (typeof content.text === 'string') return content.text;\n if (Array.isArray(content)) {\n const parts = content\n .map((p: any) => (p && typeof p === 'object' ? p.text : undefined))\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n }\n\n const message = update.message ?? update.item ?? update.assistant_message;\n if (message && typeof message === 'object') {\n const msgContent = message.content?.content ?? message.content;\n if (typeof msgContent === 'string') return msgContent;\n if (Array.isArray(msgContent)) {\n const parts = msgContent\n .map((p: any) => {\n if (!p || typeof p !== 'object') return undefined;\n if (typeof p.text === 'string') return p.text;\n if (typeof p.delta === 'string') return p.delta;\n return undefined;\n })\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n }\n\n return undefined;\n }\n\n private extractTextFromPromptResult(result: any): string | undefined {\n if (!result) return undefined;\n if (typeof result === 'string') return result;\n\n // Common shapes observed in ACP implementations:\n // - { message: { content: [{ type:'text', text:'...' }, ...] } }\n // - { output_text: '...' } / { text: '...' }\n // - { content: [{...}] }\n if (typeof result.text === 'string') return result.text;\n if (typeof result.output_text === 'string') return result.output_text;\n\n const message = result.message ?? result.item ?? result.assistant_message;\n if (message && typeof message === 'object') {\n const msgContent = message.content?.content ?? message.content;\n if (typeof msgContent === 'string') return msgContent;\n if (Array.isArray(msgContent)) {\n const parts = msgContent\n .map((p: any) => (p && typeof p === 'object' ? (typeof p.text === 'string' ? p.text : undefined) : undefined))\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n }\n\n const content = result.content?.content ?? result.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p: any) => (p && typeof p === 'object' ? (typeof p.text === 'string' ? p.text : undefined) : undefined))\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n\n return undefined;\n }\n\n private extractAuthUrl(params: any): string | undefined {\n if (!params || typeof params !== 'object') return undefined;\n const candidates = [\n params.url,\n params.authorizationUrl,\n params.authorization_url,\n params.authUrl,\n params.auth_url,\n params.browserUrl,\n params.browser_url,\n params.verification_uri,\n params.verificationUri,\n params.verificationUrl,\n ];\n const found = candidates.find((v) => typeof v === 'string' && v.startsWith('http'));\n return found;\n }\n\n private extractAuthOptions(params: any): Array<{ label?: string; url?: string; method?: string }> | undefined {\n if (!params || typeof params !== 'object') return undefined;\n\n const raw =\n Array.isArray((params as any).methods) ? (params as any).methods\n : Array.isArray((params as any).options) ? (params as any).options\n : Array.isArray((params as any).authMethods) ? (params as any).authMethods\n : Array.isArray((params as any).auth_methods) ? (params as any).auth_methods\n : undefined;\n\n if (!raw) return undefined;\n\n const opts = raw\n .map((m: any) => {\n if (!m || typeof m !== 'object') return undefined;\n const url = this.extractAuthUrl(m);\n const label =\n typeof m.label === 'string' ? m.label :\n typeof m.name === 'string' ? m.name :\n typeof m.type === 'string' ? m.type :\n undefined;\n const method =\n typeof m.method === 'string' ? m.method :\n typeof m.type === 'string' ? m.type :\n undefined;\n return { label, url, method };\n })\n .filter(Boolean) as Array<{ label?: string; url?: string; method?: string }>;\n\n return opts.length > 0 ? opts : undefined;\n }\n}\n\ninterface PtyJob {\n input: string;\n idleMs: number;\n authWaitMs: number;\n queue: AsyncPushQueue<PtyRuntimeOutputEvent>;\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private _closed = false;\n private closeResolvers: Array<() => void> = [];\n\n push(item: T): void {\n if (this._closed) {\n return;\n }\n this.items.push(item);\n const r = this.resolvers.shift();\n r?.();\n }\n\n close(): void {\n if (this._closed) {\n return;\n }\n this._closed = true;\n for (const r of this.resolvers) {\n r();\n }\n this.resolvers = [];\n for (const r of this.closeResolvers) {\n r();\n }\n this.closeResolvers = [];\n }\n\n async waitClosed(): Promise<void> {\n if (this._closed) {\n return;\n }\n await new Promise<void>((resolve) => this.closeResolvers.push(resolve));\n }\n\n async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this._closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
1
+ {"version":3,"file":"PtyThreadRuntime.js","sourceRoot":"","sources":["../../../../src/api/chatkit/runtime/PtyThreadRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { getPlatformApiBaseUrl } from '../../service/platform-ai-config';\nimport { PACKAGE_ROOT } from '../../../runtime';\nimport { GitWorktreeService } from './GitWorktreeService';\nimport { AcpRunner } from './AcpRunner';\nimport type { ResolvedAgentConfig } from '../../../agents/config/types';\nimport type { McpServerConfig } from '../../../agents/types';\nimport { codexWireApi, getDefaultBaseUrl } from '../../service/provider-registry';\n\nexport type RunnerType = 'codebuddy' | 'claude' | 'codex';\nexport type RunnerProtocol = 'acp';\n\nexport type WorktreeSpec =\n | { mode: 'existing'; path: string }\n | { mode: 'create'; baseRef?: string; branch?: string };\n\nexport type WorkspaceSpec =\n | { type: 'path'; rootPath: string }\n | { type: 'git'; rootPath: string; worktree: WorktreeSpec };\n\nexport interface PtyRuntimeConfig {\n workspace: WorkspaceSpec;\n /**\n * Stream idle cutoff for agent output. If no output arrives within this window,\n * the current streaming response ends.\n *\n * Defaults to 500ms (fast tests) but real agents may need a larger value.\n */\n idleMs?: number;\n /**\n * How long to keep the stream open after an auth_required event.\n * Defaults to 5 minutes.\n */\n authWaitMs?: number;\n runner: {\n type: RunnerType;\n /**\n * acp: JSON-RPC (Agent Client Protocol) over stdio (recommended)\n */\n protocol?: RunnerProtocol;\n argv?: string[];\n };\n /**\n * Resolved agent configuration from /agents/{agentId}/AGENT.md + .meta.\n * When provided, credentials/model/MCP servers/system prompt come from here\n * instead of DEFAULT_* environment variables.\n */\n agentConfig?: ResolvedAgentConfig;\n}\n\nexport interface PtyThreadRuntimeState {\n workdir: string;\n runnerType: RunnerType;\n protocol: RunnerProtocol;\n argv: string[];\n}\n\nexport type PtyRuntimeOutputEvent =\n | { type: 'text'; text: string }\n | { type: 'error'; message: string }\n | {\n type: 'auth_required';\n method: string;\n url?: string;\n message?: string;\n options?: Array<{ label?: string; url?: string; method?: string }>;\n }\n | {\n type: 'tool_call';\n requestId: string;\n name: string;\n arguments: string;\n };\n\ninterface PendingAcpRequest {\n method: string;\n params?: unknown;\n respond: (result: unknown) => void;\n fail: (code: number, message: string, data?: unknown) => void;\n}\n\ninterface RuntimeEntry {\n runner: AcpRunner;\n state: PtyThreadRuntimeState;\n acp?: {\n sessionId: string;\n pendingRequests: Map<string, PendingAcpRequest>;\n };\n jobs: Array<PtyJob>;\n processing: boolean;\n}\n\n/**\n * In-memory PTY runtime manager keyed by threadId.\n *\n * Notes:\n * - Runtime state is not persisted; thread metadata can store repo/worktree hints,\n * but PTY processes are always runtime-local.\n */\nexport class PtyThreadRuntime {\n private readonly logger = getLoggerFor(this);\n private readonly git = new GitWorktreeService();\n private readonly runtimes = new Map<string, RuntimeEntry>();\n\n constructor(\n private readonly options: {\n worktreeRootDirName?: string;\n } = {},\n ) {}\n\n isRunning(threadId: string): boolean {\n return Boolean(this.runtimes.get(threadId)?.runner.isRunning());\n }\n\n async ensureStarted(threadId: string, cfg: PtyRuntimeConfig): Promise<PtyThreadRuntimeState> {\n const existing = this.runtimes.get(threadId);\n if (existing?.runner.isRunning()) {\n return existing.state;\n }\n\n const workdir = await this.resolveWorkdir(threadId, cfg.workspace);\n if (cfg.workspace.type === 'git') {\n this.git.ensurePathInsideRepo(cfg.workspace.rootPath, workdir);\n }\n\n const protocol: RunnerProtocol = 'acp';\n if (cfg.runner.protocol && cfg.runner.protocol !== 'acp') {\n throw new Error(`Unsupported runner protocol: ${cfg.runner.protocol}. Only 'acp' is supported.`);\n }\n const argv = this.resolveRunnerArgv(cfg.runner.type, cfg.runner.argv);\n const command = argv[0];\n const args = argv.slice(1);\n const env = this.buildRunnerEnv(cfg.runner.type, threadId, workdir, cfg.agentConfig);\n\n const runner = new AcpRunner();\n runner.start({ command, args, cwd: workdir, env });\n\n // ACP handshake + session creation (one session per thread).\n // We intentionally keep capabilities minimal to avoid the agent calling back into the server.\n await runner.request('initialize', {\n protocolVersion: 1,\n clientCapabilities: {},\n clientInfo: { name: 'xpod', version: 'dev' },\n });\n // Build session/new params — inject MCP servers + system prompt from agent config when available.\n const sessionParams: Record<string, unknown> = { cwd: workdir };\n const ac = cfg.agentConfig;\n if (ac) {\n sessionParams.mcpServers = Object.keys(ac.mcpServers).length > 0\n ? this.convertMcpServersForAcp(ac.mcpServers)\n : [];\n if (ac.systemPrompt) sessionParams.systemPrompt = ac.systemPrompt;\n if (ac.skillsContent) sessionParams.appendSystemPrompt = ac.skillsContent;\n if (ac.maxTurns) sessionParams.maxTurns = ac.maxTurns;\n if (ac.allowedTools) sessionParams.allowedTools = ac.allowedTools;\n if (ac.disallowedTools) sessionParams.disallowedTools = ac.disallowedTools;\n if (ac.permissionMode) sessionParams.permissionMode = ac.permissionMode;\n } else {\n sessionParams.mcpServers = [];\n }\n const newSession = await runner.request<{ sessionId: string }>('session/new', sessionParams);\n if (!newSession?.sessionId) {\n throw new Error('ACP session/new did not return sessionId');\n }\n\n const state: PtyThreadRuntimeState = { workdir, runnerType: cfg.runner.type, protocol, argv };\n this.runtimes.set(threadId, {\n runner,\n state,\n acp: { sessionId: newSession.sessionId, pendingRequests: new Map() },\n jobs: [],\n processing: false,\n });\n return state;\n }\n\n stop(threadId: string): void {\n const rt = this.runtimes.get(threadId);\n if (!rt) {\n return;\n }\n rt.runner.stop('SIGINT');\n }\n\n /**\n * Write a message to stdin and stream back output deltas.\n * We serialize jobs per thread to reduce interleaving outputs.\n */\n sendMessage(\n threadId: string,\n text: string,\n options?: { idleMs?: number; authWaitMs?: number },\n ): AsyncIterable<PtyRuntimeOutputEvent> {\n const rt = this.runtimes.get(threadId);\n if (!rt) {\n throw new Error('PTY runtime is not started');\n }\n const idleMs = options?.idleMs ?? 500;\n const authWaitMs = Math.max(options?.authWaitMs ?? 300_000, idleMs);\n const q = new AsyncPushQueue<PtyRuntimeOutputEvent>();\n rt.jobs.push({ input: text, idleMs, authWaitMs, queue: q });\n void this.processJobs(threadId);\n return q.iterate();\n }\n\n respondToRequest(\n threadId: string,\n requestId: string,\n output: string,\n options?: { idleMs?: number; authWaitMs?: number },\n ): AsyncIterable<PtyRuntimeOutputEvent> {\n const rt = this.runtimes.get(threadId);\n if (!rt || rt.state.protocol !== 'acp' || !rt.acp) {\n throw new Error('ACP runtime is not started');\n }\n\n const pending = rt.acp.pendingRequests.get(requestId);\n if (!pending) {\n throw new Error(`ACP request not found: ${requestId}`);\n }\n\n const idleMs = options?.idleMs ?? 500;\n const authWaitMs = Math.max(options?.authWaitMs ?? 300_000, idleMs);\n const q = new AsyncPushQueue<PtyRuntimeOutputEvent>();\n void this.continueAfterRequestResponse(rt, pending, requestId, output, idleMs, authWaitMs, q);\n return q.iterate();\n }\n\n private async processJobs(threadId: string): Promise<void> {\n const rt = this.runtimes.get(threadId);\n if (!rt || rt.processing) {\n return;\n }\n rt.processing = true;\n\n try {\n while (rt.jobs.length > 0) {\n const job = rt.jobs.shift()!;\n await this.runJobAcp(rt, job);\n }\n } finally {\n rt.processing = false;\n }\n }\n\n private async runJobAcp(rt: RuntimeEntry, job: PtyJob): Promise<void> {\n const runner = rt.runner;\n const sessionId = rt.acp?.sessionId;\n if (!sessionId) {\n throw new Error('ACP runtime missing sessionId');\n }\n\n let idleTimer: NodeJS.Timeout | undefined;\n let done = false;\n\n const finish = (): void => {\n if (done) return;\n done = true;\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n runner.off('notification', onNotification);\n runner.off('request', onRequest);\n job.queue.close();\n };\n\n const bumpIdle = (ms: number = job.idleMs): void => {\n if (done) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => finish(), ms);\n };\n\n // For MVP:\n // - auto-ack common \"permission\"/\"auth\" style requests, so agents don't deadlock\n // - surface auth-required as a structured event (so clients can click URL)\n // - surface text chunks from session/update notifications\n const onRequest = (req: any): void => {\n if (!req || typeof req.method !== 'string') return;\n if (req.method === 'session/request_permission' || req.method === 'auth/request' || req.method === 'auth/authorize') {\n const hint = req.params?.message || req.params?.reason || req.method;\n const url = this.extractAuthUrl(req.params);\n const options =\n this.extractAuthOptions(req.params) ??\n (url ? [{ label: 'Continue in browser', url, method: req.method }] : undefined);\n job.queue.push({\n type: 'auth_required',\n method: req.method,\n url,\n message: typeof hint === 'string' ? hint : undefined,\n options,\n });\n // Keep stream open longer so users can complete browser-based auth.\n bumpIdle(job.authWaitMs);\n // Ack so the runner doesn't deadlock.\n // For \"permission\" style requests we grant by default; for auth requests we just acknowledge handling.\n if (req.method === 'session/request_permission') {\n req.respond({ granted: true });\n } else {\n req.respond({ handled: true });\n }\n return;\n }\n // Map unknown requests to a \"tool call\" (client must respond via threads.add_client_tool_output).\n // We end the current stream so the client can send the follow-up request.\n const pendingId = `acp:${String(req.id)}`;\n rt.acp!.pendingRequests.set(pendingId, {\n method: req.method,\n params: req.params,\n respond: req.respond,\n fail: req.fail,\n });\n job.queue.push({\n type: 'tool_call',\n requestId: pendingId,\n name: req.method,\n arguments: JSON.stringify(req.params ?? {}),\n });\n finish();\n };\n\n const onNotification = (method: string, params: any): void => {\n if (method !== 'session/update') return;\n if (!params || params.sessionId !== sessionId) return;\n\n const update = params.update;\n if (!update || typeof update !== 'object') return;\n\n const text = this.extractTextDeltaFromSessionUpdate(update);\n if (typeof text === 'string' && text.length > 0) {\n job.queue.push({ type: 'text', text });\n bumpIdle();\n }\n };\n\n runner.on('request', onRequest);\n runner.on('notification', onNotification);\n try {\n // Don't await: some agents will block the response until tool-call requests are satisfied.\n // However, some agents (notably codex-acp) may return the final text in the response,\n // not via session/update streaming notifications. We therefore attach a best-effort\n // handler to capture text from the response when available.\n void runner.request('session/prompt', {\n sessionId,\n prompt: [ { type: 'text', text: job.input } ],\n }).then((result) => {\n const text = this.extractTextFromPromptResult(result);\n if (typeof text === 'string' && text.length > 0) {\n job.queue.push({ type: 'text', text });\n bumpIdle();\n }\n }).catch((error) => {\n if (!done) {\n this.logger.warn(`ACP session/prompt failed: ${error}`);\n const anyErr = error as any;\n const dataMsg =\n anyErr?.data && typeof anyErr.data === 'object' && typeof anyErr.data.message === 'string'\n ? anyErr.data.message\n : undefined;\n const msg = dataMsg\n ? `${String(anyErr?.message ?? error)} | data.message=${dataMsg.slice(0, 800)}`\n : String(anyErr?.message ?? error);\n job.queue.push({ type: 'error', message: msg });\n finish();\n }\n });\n // Some agents return the session/prompt response before streaming the final updates.\n // We therefore keep listening until the stream goes idle.\n bumpIdle();\n await job.queue.waitClosed();\n } finally {\n finish();\n }\n }\n\n private async continueAfterRequestResponse(\n rt: RuntimeEntry,\n pending: PendingAcpRequest,\n requestId: string,\n output: string,\n idleMs: number,\n authWaitMs: number,\n queue: AsyncPushQueue<PtyRuntimeOutputEvent>,\n ): Promise<void> {\n const runner = rt.runner;\n const sessionId = rt.acp?.sessionId;\n if (!sessionId || !rt.acp) {\n throw new Error('ACP runtime missing session');\n }\n\n let idleTimer: NodeJS.Timeout | undefined;\n let done = false;\n\n const finish = (): void => {\n if (done) return;\n done = true;\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n runner.off('notification', onNotification);\n runner.off('request', onRequest);\n queue.close();\n };\n\n const bumpIdle = (ms: number = idleMs): void => {\n if (done) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => finish(), ms);\n };\n\n const onRequest = (req: any): void => {\n if (!req || typeof req.method !== 'string') return;\n if (req.method === 'session/request_permission' || req.method === 'auth/request' || req.method === 'auth/authorize') {\n const hint = req.params?.message || req.params?.reason || req.method;\n const url = this.extractAuthUrl(req.params);\n const options =\n this.extractAuthOptions(req.params) ??\n (url ? [{ label: 'Continue in browser', url, method: req.method }] : undefined);\n queue.push({\n type: 'auth_required',\n method: req.method,\n url,\n message: typeof hint === 'string' ? hint : undefined,\n options,\n });\n // Keep stream open longer so users can complete browser-based auth.\n bumpIdle(authWaitMs);\n if (req.method === 'session/request_permission') {\n req.respond({ granted: true });\n } else {\n req.respond({ handled: true });\n }\n return;\n }\n\n const nestedId = `acp:${String(req.id)}`;\n rt.acp!.pendingRequests.set(nestedId, {\n method: req.method,\n params: req.params,\n respond: req.respond,\n fail: req.fail,\n });\n queue.push({\n type: 'tool_call',\n requestId: nestedId,\n name: req.method,\n arguments: JSON.stringify(req.params ?? {}),\n });\n finish();\n };\n\n const onNotification = (method: string, params: any): void => {\n if (method !== 'session/update') return;\n if (!params || params.sessionId !== sessionId) return;\n const update = params.update;\n if (!update || typeof update !== 'object') return;\n const text = this.extractTextDeltaFromSessionUpdate(update);\n if (typeof text === 'string' && text.length > 0) {\n queue.push({ type: 'text', text });\n bumpIdle();\n }\n };\n\n runner.on('request', onRequest);\n runner.on('notification', onNotification);\n try {\n rt.acp.pendingRequests.delete(requestId);\n let result: unknown = output;\n try {\n result = JSON.parse(output);\n } catch {\n // keep raw string\n }\n pending.respond(result);\n bumpIdle();\n await queue.waitClosed();\n } finally {\n finish();\n }\n }\n\n private async resolveWorkdir(threadId: string, workspace: WorkspaceSpec): Promise<string> {\n if (workspace.type === 'path') {\n if (!fs.existsSync(workspace.rootPath)) {\n throw new Error(`workspace.rootPath not found: ${workspace.rootPath}`);\n }\n return workspace.rootPath;\n }\n\n // workspace.type === 'git'\n const repoRoot = workspace.rootPath;\n const worktree = workspace.worktree;\n\n if (worktree.mode === 'existing') {\n if (!fs.existsSync(worktree.path)) {\n throw new Error(`worktree.path not found: ${worktree.path}`);\n }\n return worktree.path;\n }\n\n await this.git.assertGitRepo(repoRoot);\n\n const rootDirName = this.options.worktreeRootDirName ?? '.xpod-worktrees';\n const root = path.join(repoRoot, rootDirName);\n const worktreePath = path.join(root, threadId);\n\n if (fs.existsSync(worktreePath)) {\n return worktreePath;\n }\n\n const baseRef = worktree.baseRef ?? 'main';\n await this.git.createWorktree({\n repoPath: repoRoot,\n worktreePath,\n baseRef,\n branch: worktree.branch,\n });\n\n return worktreePath;\n }\n\n private resolveRunnerArgv(type: RunnerType, argv?: string[]): string[] {\n if (argv && argv.length > 0) {\n return argv;\n }\n switch (type) {\n case 'codebuddy':\n return [ this.resolveLocalBin('codebuddy'), '--acp' ];\n case 'claude':\n return [ this.resolveLocalBin('claude-code-acp') ]; // from @zed-industries/claude-code-acp\n case 'codex':\n return [ this.resolveLocalBin('codex-acp') ]; // from @zed-industries/codex-acp\n default:\n return [ type ];\n }\n }\n\n private resolveLocalBin(binName: string): string {\n const localBin = path.join(PACKAGE_ROOT, 'node_modules', '.bin', binName);\n if (fs.existsSync(localBin)) {\n return localBin;\n }\n return binName;\n }\n\n private buildRunnerEnv(\n type: RunnerType,\n threadId: string,\n workdir: string,\n agentConfig?: ResolvedAgentConfig,\n ): Record<string, string | undefined> | undefined {\n // When agentConfig is provided, use its credentials; otherwise fall back to DEFAULT_* env vars.\n const defaultApiKey = agentConfig?.apiKey || process.env.DEFAULT_API_KEY?.trim();\n const rawApiBase = agentConfig?.baseUrl || getPlatformApiBaseUrl();\n const defaultModel = agentConfig?.model || process.env.DEFAULT_MODEL?.trim();\n\n // CodeBuddy ACP relies on its own local auth state, not OpenAI/Anthropic keys.\n if (type === 'codebuddy') {\n return undefined;\n }\n\n // Run external agents with an isolated HOME to avoid:\n // - polluting the user's real ~/.codex / ~/.claude state\n // - sandbox permission errors when tools try to write outside workspace roots\n const home = this.getIsolatedHomeDir(type, threadId, workdir);\n\n if (type === 'codex') {\n // codex-acp speaks OpenAI Responses API by default. Only api.openai.com natively supports it.\n // For all other providers, configure codex to use wire_api=\"chat\" so it sends\n // Chat Completions requests directly to the provider instead.\n const defaultApiBase = rawApiBase || getDefaultBaseUrl();\n const codexHome = path.join(home, '.codex');\n this.ensureDir(codexHome);\n this.ensureDir(path.join(codexHome, 'skills'));\n this.ensureCodexConfigAndAuth(codexHome, {\n baseUrl: defaultApiBase,\n apiKey: defaultApiKey,\n wireApi: codexWireApi(defaultApiBase),\n });\n const env: Record<string, string | undefined> = {\n HOME: home,\n XDG_CONFIG_HOME: path.join(home, '.config'),\n XDG_STATE_HOME: path.join(home, '.local', 'state'),\n XDG_DATA_HOME: path.join(home, '.local', 'share'),\n XDG_CACHE_HOME: path.join(home, '.cache'),\n CODEX_HOME: codexHome,\n };\n if (defaultApiKey) {\n // codex-acp advertises CODEX_API_KEY / OPENAI_API_KEY.\n env.CODEX_API_KEY = defaultApiKey;\n env.OPENAI_API_KEY = defaultApiKey;\n }\n env.OPENAI_BASE_URL = defaultApiBase;\n env.OPENAI_API_BASE = defaultApiBase;\n if (defaultModel) {\n // Best-effort: may be ignored by codex-acp depending on its config.\n env.OPENAI_MODEL = defaultModel;\n env.CODEX_MODEL = defaultModel;\n }\n return env;\n }\n\n // type === 'claude'\n const defaultApiBase = rawApiBase || getDefaultBaseUrl();\n const env: Record<string, string | undefined> = {\n HOME: home,\n XDG_CONFIG_HOME: path.join(home, '.config'),\n XDG_STATE_HOME: path.join(home, '.local', 'state'),\n XDG_DATA_HOME: path.join(home, '.local', 'share'),\n XDG_CACHE_HOME: path.join(home, '.cache'),\n };\n const normalizedBase = defaultApiBase ? this.normalizeClaudeBaseUrl(defaultApiBase) : undefined;\n const isOpenRouterLike =\n (typeof normalizedBase === 'string' && normalizedBase.includes('openrouter.ai'));\n\n if (defaultApiKey) {\n // claude-code-acp is built on the Claude Agent SDK.\n // For OpenRouter, the Anthropic-compatible path is typically via AUTH_TOKEN.\n if (isOpenRouterLike) {\n env.ANTHROPIC_AUTH_TOKEN = defaultApiKey;\n delete env.ANTHROPIC_API_KEY;\n } else {\n env.ANTHROPIC_API_KEY = defaultApiKey;\n delete env.ANTHROPIC_AUTH_TOKEN;\n }\n }\n if (normalizedBase) {\n env.ANTHROPIC_BASE_URL = normalizedBase;\n }\n if (defaultModel) {\n // Use the same model for all families to keep behavior predictable.\n env.ANTHROPIC_DEFAULT_SONNET_MODEL = defaultModel;\n env.ANTHROPIC_DEFAULT_HAIKU_MODEL = defaultModel;\n env.ANTHROPIC_DEFAULT_OPUS_MODEL = defaultModel;\n }\n return env;\n }\n\n private getIsolatedHomeDir(type: Exclude<RunnerType, 'codebuddy'>, threadId: string, workdir: string): string {\n // Keep it stable per thread/workdir so session state can be reused across requests,\n // but still isolated from the user's actual home.\n const hash = crypto.createHash('sha256').update(`${type}:${threadId}:${workdir}`).digest('hex').slice(0, 16);\n const root = path.join(os.tmpdir(), 'xpod-acp-home', type, hash);\n fs.mkdirSync(root, { recursive: true });\n return root;\n }\n\n private ensureDir(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // best-effort: agent binaries may create it themselves\n }\n }\n\n private normalizeClaudeBaseUrl(baseUrl: string): string {\n if (baseUrl.endsWith('/v1')) {\n return baseUrl.slice(0, -3);\n }\n if (baseUrl.endsWith('/v1/')) {\n return baseUrl.slice(0, -4);\n }\n return baseUrl;\n }\n\n private ensureCodexConfigAndAuth(\n codexHome: string,\n options: { baseUrl?: string; apiKey?: string; wireApi?: 'responses' | 'chat' },\n ): void {\n // codex-acp wraps Codex CLI, which primarily reads config/auth from CODEX_HOME.\n // We generate a minimal config + auth file for isolated runs so that:\n // - it doesn't depend on the developer's ~/.codex\n // - it can authenticate without interactive login\n const configPath = path.join(codexHome, 'config.toml');\n const authPath = path.join(codexHome, 'auth.json');\n\n try {\n const baseUrl = options.baseUrl?.trim();\n if (baseUrl) {\n const wireApi = options.wireApi ?? 'responses';\n const contents = [\n 'model_provider = \"codex\"',\n '',\n '[model_providers.codex]',\n 'name = \"codex\"',\n `base_url = ${JSON.stringify(baseUrl)}`,\n `wire_api = ${JSON.stringify(wireApi)}`,\n 'requires_openai_auth = true',\n '',\n ].join('\\n');\n fs.writeFileSync(configPath, contents, { encoding: 'utf8' });\n }\n } catch (e) {\n this.logger.debug(`Failed to write Codex config.toml: ${String(e)}`);\n }\n\n try {\n const apiKey = options.apiKey?.trim();\n if (apiKey) {\n // Match Codex's expected schema.\n fs.writeFileSync(authPath, JSON.stringify({ OPENAI_API_KEY: apiKey }), { encoding: 'utf8' });\n }\n } catch (e) {\n this.logger.debug(`Failed to write Codex auth.json: ${String(e)}`);\n }\n }\n\n /**\n * Convert McpServerConfig map to ACP session/new format.\n * ACP expects an array of { name, ...config } objects.\n */\n private convertMcpServersForAcp(\n servers: Record<string, McpServerConfig>,\n ): Array<Record<string, unknown>> {\n return Object.entries(servers).map(([name, config]) => ({\n name,\n ...config,\n }));\n }\n\n private extractTextDeltaFromSessionUpdate(update: any): string | undefined {\n if (!update) return undefined;\n\n // Common shapes:\n // - { sessionUpdate/type: 'agent_message_chunk', content: { type:'text', text:'...' } }\n // - { ... , delta/text/content: '...' }\n // - { ... , message: { content: [{ type:'text', text:'...' }, ...] } }\n if (typeof update === 'string') return update;\n if (typeof update.delta === 'string') return update.delta;\n if (typeof update.text === 'string') return update.text;\n\n const content = update.content?.content ?? update.content;\n if (typeof content === 'string') return content;\n if (content && typeof content === 'object') {\n if (typeof content.text === 'string') return content.text;\n if (Array.isArray(content)) {\n const parts = content\n .map((p: any) => (p && typeof p === 'object' ? p.text : undefined))\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n }\n\n const message = update.message ?? update.item ?? update.assistant_message;\n if (message && typeof message === 'object') {\n const msgContent = message.content?.content ?? message.content;\n if (typeof msgContent === 'string') return msgContent;\n if (Array.isArray(msgContent)) {\n const parts = msgContent\n .map((p: any) => {\n if (!p || typeof p !== 'object') return undefined;\n if (typeof p.text === 'string') return p.text;\n if (typeof p.delta === 'string') return p.delta;\n return undefined;\n })\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n }\n\n return undefined;\n }\n\n private extractTextFromPromptResult(result: any): string | undefined {\n if (!result) return undefined;\n if (typeof result === 'string') return result;\n\n // Common shapes observed in ACP implementations:\n // - { message: { content: [{ type:'text', text:'...' }, ...] } }\n // - { output_text: '...' } / { text: '...' }\n // - { content: [{...}] }\n if (typeof result.text === 'string') return result.text;\n if (typeof result.output_text === 'string') return result.output_text;\n\n const message = result.message ?? result.item ?? result.assistant_message;\n if (message && typeof message === 'object') {\n const msgContent = message.content?.content ?? message.content;\n if (typeof msgContent === 'string') return msgContent;\n if (Array.isArray(msgContent)) {\n const parts = msgContent\n .map((p: any) => (p && typeof p === 'object' ? (typeof p.text === 'string' ? p.text : undefined) : undefined))\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n }\n\n const content = result.content?.content ?? result.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p: any) => (p && typeof p === 'object' ? (typeof p.text === 'string' ? p.text : undefined) : undefined))\n .filter((t: any) => typeof t === 'string');\n if (parts.length) return parts.join('');\n }\n\n return undefined;\n }\n\n private extractAuthUrl(params: any): string | undefined {\n if (!params || typeof params !== 'object') return undefined;\n const candidates = [\n params.url,\n params.authorizationUrl,\n params.authorization_url,\n params.authUrl,\n params.auth_url,\n params.browserUrl,\n params.browser_url,\n params.verification_uri,\n params.verificationUri,\n params.verificationUrl,\n ];\n const found = candidates.find((v) => typeof v === 'string' && v.startsWith('http'));\n return found;\n }\n\n private extractAuthOptions(params: any): Array<{ label?: string; url?: string; method?: string }> | undefined {\n if (!params || typeof params !== 'object') return undefined;\n\n const raw =\n Array.isArray((params as any).methods) ? (params as any).methods\n : Array.isArray((params as any).options) ? (params as any).options\n : Array.isArray((params as any).authMethods) ? (params as any).authMethods\n : Array.isArray((params as any).auth_methods) ? (params as any).auth_methods\n : undefined;\n\n if (!raw) return undefined;\n\n const opts = raw\n .map((m: any) => {\n if (!m || typeof m !== 'object') return undefined;\n const url = this.extractAuthUrl(m);\n const label =\n typeof m.label === 'string' ? m.label :\n typeof m.name === 'string' ? m.name :\n typeof m.type === 'string' ? m.type :\n undefined;\n const method =\n typeof m.method === 'string' ? m.method :\n typeof m.type === 'string' ? m.type :\n undefined;\n return { label, url, method };\n })\n .filter(Boolean) as Array<{ label?: string; url?: string; method?: string }>;\n\n return opts.length > 0 ? opts : undefined;\n }\n}\n\ninterface PtyJob {\n input: string;\n idleMs: number;\n authWaitMs: number;\n queue: AsyncPushQueue<PtyRuntimeOutputEvent>;\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private _closed = false;\n private closeResolvers: Array<() => void> = [];\n\n push(item: T): void {\n if (this._closed) {\n return;\n }\n this.items.push(item);\n const r = this.resolvers.shift();\n r?.();\n }\n\n close(): void {\n if (this._closed) {\n return;\n }\n this._closed = true;\n for (const r of this.resolvers) {\n r();\n }\n this.resolvers = [];\n for (const r of this.closeResolvers) {\n r();\n }\n this.closeResolvers = [];\n }\n\n async waitClosed(): Promise<void> {\n if (this._closed) {\n return;\n }\n await new Promise<void>((resolve) => this.closeResolvers.push(resolve));\n }\n\n async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this._closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
@@ -169,7 +169,7 @@ function registerAdminRoutes(server) {
169
169
  uptime: process.uptime(),
170
170
  env: {
171
171
  CSS_BASE_URL: env.CSS_BASE_URL || process.env.CSS_BASE_URL,
172
- CSS_EDITION: env.CSS_EDITION || process.env.CSS_EDITION,
172
+ XPOD_EDITION: env.XPOD_EDITION || process.env.XPOD_EDITION,
173
173
  CSS_PORT: env.CSS_PORT || process.env.CSS_PORT,
174
174
  },
175
175
  configs,