@undefineds.co/xpod 0.3.69 → 0.3.71-rc.12

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 (178) hide show
  1. package/config/cloud.json +3 -28
  2. package/config/local.json +3 -0
  3. package/config/resolver.json +7 -0
  4. package/config/xpod.base.json +20 -0
  5. package/dist/agents/ClaudeExecutor.js +1 -1
  6. package/dist/agents/ClaudeExecutor.js.map +1 -1
  7. package/dist/agents/types.d.ts +5 -5
  8. package/dist/agents/types.js.map +1 -1
  9. package/dist/api/ai-gateway/AiGatewayService.d.ts +5 -16
  10. package/dist/api/ai-gateway/AiGatewayService.js +13 -35
  11. package/dist/api/ai-gateway/AiGatewayService.js.map +1 -1
  12. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.d.ts +3 -2
  13. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js +37 -12
  14. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js.map +1 -1
  15. package/dist/api/ai-gateway/auth/GatewayPrincipal.d.ts +2 -16
  16. package/dist/api/ai-gateway/auth/GatewayPrincipal.js +3 -33
  17. package/dist/api/ai-gateway/auth/GatewayPrincipal.js.map +1 -1
  18. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.d.ts +23 -0
  19. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js +81 -0
  20. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js.map +1 -0
  21. package/dist/api/ai-gateway/auth/InvocationTokenCodec.d.ts +7 -4
  22. package/dist/api/ai-gateway/auth/InvocationTokenCodec.js.map +1 -1
  23. package/dist/api/ai-gateway/connect/index.d.ts +7 -26
  24. package/dist/api/ai-gateway/connect/index.js +40 -67
  25. package/dist/api/ai-gateway/connect/index.js.map +1 -1
  26. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.d.ts +17 -0
  27. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js +65 -0
  28. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js.map +1 -0
  29. package/dist/api/ai-gateway/pod/HostedPodDataAccess.d.ts +24 -0
  30. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +149 -0
  31. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js.map +1 -0
  32. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +13 -5
  33. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +16 -19
  34. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js.map +1 -1
  35. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.d.ts +1 -1
  36. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js +0 -2
  37. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js.map +1 -1
  38. package/dist/api/auth/AuthContext.d.ts +1 -12
  39. package/dist/api/auth/AuthContext.js +0 -11
  40. package/dist/api/auth/AuthContext.js.map +1 -1
  41. package/dist/api/auth/ClientCredentialsAuthenticator.js +4 -11
  42. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  43. package/dist/api/chatkit/default-agent.d.ts +2 -2
  44. package/dist/api/chatkit/default-agent.js +4 -4
  45. package/dist/api/chatkit/default-agent.js.map +1 -1
  46. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  47. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  48. package/dist/api/container/common.js +28 -69
  49. package/dist/api/container/common.js.map +1 -1
  50. package/dist/api/container/index.js +5 -6
  51. package/dist/api/container/index.js.map +1 -1
  52. package/dist/api/container/routes.js +2 -5
  53. package/dist/api/container/routes.js.map +1 -1
  54. package/dist/api/container/types.d.ts +8 -10
  55. package/dist/api/container/types.js.map +1 -1
  56. package/dist/api/handlers/AiClientConfigurationHandler.js +3 -3
  57. package/dist/api/handlers/AiClientConfigurationHandler.js.map +1 -1
  58. package/dist/api/handlers/AiGatewayHandler.js +2 -2
  59. package/dist/api/handlers/AiGatewayHandler.js.map +1 -1
  60. package/dist/api/handlers/AiGatewayManagementHandler.d.ts +2 -10
  61. package/dist/api/handlers/AiGatewayManagementHandler.js +4 -154
  62. package/dist/api/handlers/AiGatewayManagementHandler.js.map +1 -1
  63. package/dist/api/handlers/NetworkSettingsHandler.js +0 -3
  64. package/dist/api/handlers/NetworkSettingsHandler.js.map +1 -1
  65. package/dist/api/handlers/PodSettingsHandler.d.ts +5 -2
  66. package/dist/api/handlers/PodSettingsHandler.js +3 -3
  67. package/dist/api/handlers/PodSettingsHandler.js.map +1 -1
  68. package/dist/api/runs/AgentRuntimeTypes.d.ts +3 -3
  69. package/dist/api/runs/AgentRuntimeTypes.js +10 -10
  70. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  71. package/dist/api/runs/InngestRunExecutionBackend.d.ts +15 -9
  72. package/dist/api/runs/InngestRunExecutionBackend.js +25 -10
  73. package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -1
  74. package/dist/api/runs/PiAgentRuntimeDriver.js +2 -2
  75. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  76. package/dist/api/runs/RunStateCenter.js +1 -1
  77. package/dist/api/runs/RunStateCenter.js.map +1 -1
  78. package/dist/api/service/AiClientConfigurationService.d.ts +2 -2
  79. package/dist/api/service/AiClientConfigurationService.js +11 -11
  80. package/dist/api/service/AiClientConfigurationService.js.map +1 -1
  81. package/dist/api/tasks/InngestTaskScheduler.d.ts +16 -10
  82. package/dist/api/tasks/InngestTaskScheduler.js +24 -12
  83. package/dist/api/tasks/InngestTaskScheduler.js.map +1 -1
  84. package/dist/cli/commands/start.js +7 -7
  85. package/dist/cli/commands/start.js.map +1 -1
  86. package/dist/components/components.jsonld +1 -0
  87. package/dist/components/context.jsonld +42 -0
  88. package/dist/http/InternalPodDataHttpHandler.d.ts +32 -0
  89. package/dist/http/InternalPodDataHttpHandler.js +258 -0
  90. package/dist/http/InternalPodDataHttpHandler.js.map +1 -0
  91. package/dist/http/InternalPodDataHttpHandler.jsonld +201 -0
  92. package/dist/index.d.ts +2 -1
  93. package/dist/index.js +4 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/main.js +13 -13
  96. package/dist/main.js.map +1 -1
  97. package/dist/runtime/GatewayAdminProxyAuth.d.ts +15 -1
  98. package/dist/runtime/GatewayAdminProxyAuth.js +57 -2
  99. package/dist/runtime/GatewayAdminProxyAuth.js.map +1 -1
  100. package/dist/runtime/bootstrap.js +3 -0
  101. package/dist/runtime/bootstrap.js.map +1 -1
  102. package/dist/runtime/css-process.d.ts +1 -1
  103. package/dist/runtime/css-process.js +4 -1
  104. package/dist/runtime/css-process.js.map +1 -1
  105. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.d.ts +2 -0
  106. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js +50 -0
  107. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js.map +1 -1
  108. package/dist/storage/rdf/PostgresRdfEngine.js +2 -0
  109. package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -1
  110. package/dist/storage/rdf/PostgresRdfVectorIndex.d.ts +1 -0
  111. package/dist/storage/rdf/PostgresRdfVectorIndex.js +1 -1
  112. package/dist/storage/rdf/PostgresRdfVectorIndex.js.map +1 -1
  113. package/dist/storage/rdf/PostgresRdfVectorIndex.jsonld +29 -0
  114. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.d.ts +5 -5
  115. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.js +7 -7
  116. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMain.js +1 -1
  117. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.d.ts +3 -1
  118. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.js +74 -60
  119. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.d.ts +0 -21
  120. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.js +0 -41
  121. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.d.ts +1 -0
  122. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.js +7 -2
  123. package/node_modules/@undefineds.co/ai-connection/dist/client-config/codex.js +3 -3
  124. package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.cjs +15 -9
  125. package/node_modules/@undefineds.co/ai-connection/dist/client-config/json-env-adapter.js +4 -4
  126. package/node_modules/@undefineds.co/ai-connection/dist/client-config/pi.js +3 -3
  127. package/node_modules/@undefineds.co/ai-connection/dist/client-config/types.d.ts +1 -1
  128. package/node_modules/@undefineds.co/ai-connection/dist/controller.d.ts +2 -1
  129. package/node_modules/@undefineds.co/ai-connection/dist/controller.js +1 -0
  130. package/node_modules/@undefineds.co/ai-connection/dist/service-access.js +0 -1
  131. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +22 -1
  132. package/package.json +3 -3
  133. package/static/app/assets/main.js +7 -7
  134. package/static/dashboard/assets/NetworkPage-CXjiUMR1.js +2 -0
  135. package/static/dashboard/assets/{PaneListHeader-57nvMwH6.js → PaneListHeader-BSipfl0W.js} +1 -1
  136. package/static/dashboard/assets/PodPage-Bd3Xhmp-.js +2 -0
  137. package/static/dashboard/assets/ServicesPage-CI3jWZGe.js +1 -0
  138. package/static/dashboard/assets/{card-B9Zjf_2p.js → card-z5BV5hTo.js} +1 -1
  139. package/static/dashboard/assets/{dashboard-8C6o666W.js → dashboard-CSrqAv2L.js} +2 -2
  140. package/static/dashboard/assets/{database-DPh9wDY9.js → database-Ct5ZPe6L.js} +1 -1
  141. package/static/dashboard/assets/{external-link-VbMQvVMz.js → external-link-B7wD1hkm.js} +1 -1
  142. package/static/dashboard/assets/index-tOBaUnM1.js +44 -0
  143. package/static/dashboard/assets/{refresh-cw-BxVxNxNr.js → refresh-cw-CFDZPaE8.js} +1 -1
  144. package/static/dashboard/assets/{services-status-context-DKmJ7ISr.js → services-status-context-DN1Icg4A.js} +1 -1
  145. package/static/dashboard/dashboard.html +1 -1
  146. package/static/settings/assets/ModelsPage-03NPWzoX.js +1 -0
  147. package/static/settings/assets/{PaneListHeader-Bgaze006.js → PaneListHeader-DMD8OJef.js} +1 -1
  148. package/static/settings/assets/PodPage-DT4EMYhL.js +2 -0
  149. package/static/settings/assets/ServicesPage-CJ0ub6IH.js +1 -0
  150. package/static/settings/assets/SettingsPage-BkR7ZK18.js +41 -0
  151. package/static/settings/assets/{card-B_bXSIn-.js → card-Cjsia0_V.js} +1 -1
  152. package/static/settings/assets/{services-status-context-DiX-AbrP.js → services-status-context-CkuKmH5h.js} +1 -1
  153. package/static/settings/assets/{settings-B30oMfZq.js → settings-Cyyv6-SD.js} +2 -2
  154. package/static/settings/assets/{workspace-layout-Dv1Yn9Ci.js → workspace-layout-B47luv6r.js} +1 -1
  155. package/static/settings/settings.html +1 -1
  156. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.d.ts +0 -25
  157. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js +0 -91
  158. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js.map +0 -1
  159. package/dist/api/ai-gateway/auth/GatewayApiKey.d.ts +0 -28
  160. package/dist/api/ai-gateway/auth/GatewayApiKey.js +0 -162
  161. package/dist/api/ai-gateway/auth/GatewayApiKey.js.map +0 -1
  162. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +0 -56
  163. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +0 -143
  164. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js.map +0 -1
  165. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.d.ts +0 -26
  166. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js +0 -97
  167. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js.map +0 -1
  168. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +0 -54
  169. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +0 -152
  170. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js.map +0 -1
  171. package/static/dashboard/assets/NetworkPage-Brt79fuQ.js +0 -2
  172. package/static/dashboard/assets/PodPage-CM6do1vB.js +0 -2
  173. package/static/dashboard/assets/ServicesPage-BUNxGJRz.js +0 -1
  174. package/static/dashboard/assets/index-RfiFckzb.js +0 -51
  175. package/static/settings/assets/ModelsPage-D_IH7AH3.js +0 -1
  176. package/static/settings/assets/PodPage-Cy1VNObw.js +0 -2
  177. package/static/settings/assets/ServicesPage-BsFaxVWC.js +0 -1
  178. package/static/settings/assets/SettingsPage-UafNWE_p.js +0 -48
package/config/cloud.json CHANGED
@@ -184,6 +184,7 @@
184
184
  "@id": "urn:undefineds:xpod:PostgresRdfVectorIndex",
185
185
  "@type": "PostgresRdfVectorIndex",
186
186
  "options_driver": "pg",
187
+ "options_backend": "component",
187
188
  "options_connectionString": {
188
189
  "@id": "urn:solid-server:default:variable:sparqlEndpoint",
189
190
  "@type": "Variable"
@@ -227,32 +228,6 @@
227
228
  },
228
229
  "enablePrimary": true
229
230
  },
230
- {
231
- "comment": "VectorStore using PostgreSQL",
232
- "@id": "urn:undefineds:xpod:VectorStore",
233
- "@type": "PostgresVectorStore",
234
- "options_connectionString": {
235
- "@id": "urn:solid-server:default:variable:sparqlEndpoint",
236
- "@type": "Variable"
237
- }
238
- },
239
- {
240
- "comment": "Vector HTTP Handler",
241
- "@id": "urn:undefineds:xpod:VectorHttpHandler",
242
- "@type": "VectorHttpHandler",
243
- "vectorStore": {
244
- "@id": "urn:undefineds:xpod:VectorStore"
245
- },
246
- "credentialsExtractor": {
247
- "@id": "urn:solid-server:default:CredentialsExtractor"
248
- },
249
- "permissionReader": {
250
- "@id": "urn:solid-server:default:PermissionReader"
251
- },
252
- "authorizer": {
253
- "@id": "urn:solid-server:default:Authorizer"
254
- }
255
- },
256
231
  {
257
232
  "comment": "Terminal Sidecar HTTP Handler - manages PTY sessions for trusted AI agents",
258
233
  "@id": "urn:undefineds:xpod:TerminalHttpHandler",
@@ -558,10 +533,10 @@
558
533
  "@type": "StatusWaterfallHandler",
559
534
  "handlers": [
560
535
  {
561
- "@id": "urn:undefineds:xpod:SubgraphSparqlHttpHandler"
536
+ "@id": "urn:undefineds:xpod:InternalPodDataHttpHandler"
562
537
  },
563
538
  {
564
- "@id": "urn:undefineds:xpod:VectorHttpHandler"
539
+ "@id": "urn:undefineds:xpod:SubgraphSparqlHttpHandler"
565
540
  },
566
541
  {
567
542
  "@id": "urn:undefineds:xpod:TerminalHttpHandler"
package/config/local.json CHANGED
@@ -299,6 +299,9 @@
299
299
  "overrideParameters": {
300
300
  "@type": "StatusWaterfallHandler",
301
301
  "handlers": [
302
+ {
303
+ "@id": "urn:undefineds:xpod:InternalPodDataHttpHandler"
304
+ },
302
305
  {
303
306
  "@id": "urn:undefineds:xpod:SubgraphSparqlHttpHandler"
304
307
  },
@@ -34,6 +34,13 @@
34
34
  "defaultValue": "false"
35
35
  }
36
36
  },
37
+ {
38
+ "CombinedShorthandResolver:_resolvers_key": "urn:solid-server:default:variable:gatewayAdminProxyAuthSecret",
39
+ "CombinedShorthandResolver:_resolvers_value": {
40
+ "@type": "KeyExtractor",
41
+ "key": "gatewayAdminProxyAuthSecret"
42
+ }
43
+ },
37
44
  {
38
45
  "CombinedShorthandResolver:_resolvers_key": "urn:solid-server:default:variable:centerRegistrationEnabled",
39
46
  "CombinedShorthandResolver:_resolvers_value": {
@@ -223,6 +223,26 @@
223
223
  "value": 0
224
224
  }
225
225
  },
226
+ {
227
+ "comment": "Loopback-only runtime-signed hosted Pod data channel for AI Connection resources.",
228
+ "@type": "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler",
229
+ "@id": "urn:undefineds:xpod:InternalPodDataHttpHandler",
230
+ "@context": {
231
+ "resourceStore": "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_resourceStore",
232
+ "patchBodyParser": "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_patchBodyParser",
233
+ "baseUrl": "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_baseUrl"
234
+ },
235
+ "resourceStore": {
236
+ "@id": "urn:solid-server:default:ResourceStore"
237
+ },
238
+ "patchBodyParser": {
239
+ "@id": "urn:solid-server:default:PatchBodyParser"
240
+ },
241
+ "baseUrl": {
242
+ "@id": "urn:solid-server:default:variable:baseUrl",
243
+ "@type": "Variable"
244
+ }
245
+ },
226
246
  {
227
247
  "comment": "Tracing handler for request ID and logging. Added to CSS Middleware.",
228
248
  "@id": "urn:undefineds:xpod:TracingHandler",
@@ -90,7 +90,7 @@ class ClaudeExecutor extends BaseAgentExecutor_1.BaseAgentExecutor {
90
90
  requireAiConnection() {
91
91
  return (0, safe_env_1.requireAiConnectionRuntimeConfig)({
92
92
  baseUrl: this.aiConnection?.baseUrl,
93
- apiKey: this.aiConnection?.gatewayKey,
93
+ apiKey: this.aiConnection?.apiKey,
94
94
  model: this.aiConnection?.model,
95
95
  }, 'Claude executor');
96
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeExecutor.js","sourceRoot":"","sources":["../../src/agents/ClaudeExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Claude Executor\n *\n * 使用 Claude Agent SDK 执行任务。\n *\n * 支持功能:\n * - 完整的 Agent 能力(代码理解、文件编辑、命令执行等)\n * - 工具调用(MCP)\n * - 权限管理\n * - 流式输出\n *\n * 注意:\n * - Claude Agent SDK 需要 Anthropic-compatible env,但值必须来自\n * invocation-scoped Xpod AI Connection,不允许直接投递 Pod provider secret。\n * - SDK 会自动处理复杂的交互逻辑\n */\n\ntype Options = any;\ntype SDKResultMessage = any;\nimport { BaseAgentExecutor } from './BaseAgentExecutor';\nimport type {\n ExecutorType,\n AuthType,\n AuthInfo,\n ExecutorConfig,\n ExecuteMessage,\n ChatMessage,\n ExecuteResult,\n BaseExecutorOptions,\n} from './types';\nimport {\n projectAnthropicCompatibleEnv,\n requireAiConnectionRuntimeConfig,\n sanitizeRuntimeEnv,\n} from '../runtime/safe-env';\n\n/**\n * Claude 鉴权错误\n */\nexport class ClaudeAuthenticationError extends Error {\n public constructor(message: string = 'Claude 未配置 AI Connection 认证') {\n super(message);\n this.name = 'ClaudeAuthenticationError';\n }\n}\n\n/**\n * Claude Executor\n *\n * 封装 Claude Agent SDK 调用。\n */\nasync function loadClaudeQuery(): Promise<(args: { prompt: string; options: Options }) => AsyncIterable<any>> {\n const mod = await import('@anthropic-ai/claude-agent-sdk');\n const q = (mod as any)?.query;\n if (typeof q !== 'function') {\n throw new Error('Claude SDK is installed but query API is unavailable');\n }\n return q;\n}\n\nexport class ClaudeExecutor extends BaseAgentExecutor {\n public readonly executorType: ExecutorType = 'claude';\n\n /**\n * 获取认证类型\n */\n public getAuthType(): AuthType {\n return 'api-key';\n }\n\n /**\n * 获取环境变量配置\n */\n private getEnvConfig(): Record<string, string | undefined> {\n const connection = this.requireAiConnection();\n return {\n ...sanitizeRuntimeEnv(process.env),\n ...projectAnthropicCompatibleEnv(connection),\n };\n }\n\n private requireAiConnection() {\n return requireAiConnectionRuntimeConfig({\n baseUrl: this.aiConnection?.baseUrl,\n apiKey: this.aiConnection?.gatewayKey,\n model: this.aiConnection?.model,\n }, 'Claude executor');\n }\n\n /**\n * 检查认证状态\n */\n public async checkAuthentication(): Promise<AuthInfo> {\n try {\n const env = this.getEnvConfig();\n\n // 发送一个简单查询来验证认证\n const claudeQuery = await loadClaudeQuery();\n const q = claudeQuery({\n prompt: 'hi',\n options: {\n env,\n maxTurns: 1,\n permissionMode: 'dontAsk',\n tools: [], // 禁用所有工具\n persistSession: false,\n },\n });\n\n // 收集消息检查是否有认证错误\n for await (const message of q) {\n if (message.type === 'result') {\n const result = message as SDKResultMessage;\n if (result.subtype !== 'success') {\n // 检查是否是认证错误\n if (result.errors?.some((e: string) => e.includes('authentication') || e.includes('api_key') || e.includes('401'))) {\n throw new ClaudeAuthenticationError(`Claude API Key 无效: ${result.errors.join(', ')}`);\n }\n }\n }\n }\n\n return {\n authenticated: true,\n authType: 'api-key',\n providerId: this.providerId,\n executorType: this.executorType,\n };\n } catch (error) {\n if (error instanceof ClaudeAuthenticationError) {\n throw error;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n if (\n errorMsg.includes('authentication') ||\n errorMsg.includes('api_key') ||\n errorMsg.includes('AI Connection') ||\n errorMsg.includes('invalid') ||\n errorMsg.includes('401') ||\n errorMsg.includes('unauthorized')\n ) {\n throw new ClaudeAuthenticationError(`Claude AI Connection 无效: ${errorMsg}`);\n }\n\n throw error;\n }\n }\n\n /**\n * 构建 SDK Options\n */\n private buildOptions(config: ExecutorConfig, additionalOptions?: Partial<Options>): Options {\n const options: Options = {\n env: this.getEnvConfig(),\n model: config.model ?? 'claude-sonnet-4-20250514',\n cwd: config.workingDirectory ?? process.cwd(),\n includePartialMessages: true, // 启用流式输出\n persistSession: false, // 不持久化 session\n ...additionalOptions,\n };\n\n // 设置 system prompt\n if (config.systemPrompt) {\n options.systemPrompt = config.systemPrompt;\n }\n\n // 设置工具\n if (config.tools && config.tools.length > 0) {\n options.tools = config.tools;\n }\n\n // 设置允许的工具\n if (config.allowedTools && config.allowedTools.length > 0) {\n options.allowedTools = config.allowedTools;\n }\n\n // 设置权限模式\n if (config.permissionMode) {\n options.permissionMode = config.permissionMode as Options['permissionMode'];\n }\n\n // 设置 MCP 服务器\n if (config.mcpServers) {\n options.mcpServers = config.mcpServers as Options['mcpServers'];\n }\n\n // 设置 max tokens (通过 maxThinkingTokens)\n if (config.maxTokens) {\n options.maxThinkingTokens = config.maxTokens;\n }\n\n return options;\n }\n\n /**\n * 执行任务(流式)\n */\n public async *execute(config: ExecutorConfig, message: string): AsyncGenerator<ExecuteMessage> {\n this.logger.info(`[${config.name}] Executing with Claude Agent SDK: ${message.slice(0, 100)}...`);\n\n const startTime = Date.now();\n const modelName = config.model ?? 'claude-sonnet-4-20250514';\n\n try {\n yield { type: 'system', executorType: this.executorType, model: modelName };\n\n const options = this.buildOptions(config);\n const claudeQuery = await loadClaudeQuery();\n const q = claudeQuery({ prompt: message, options });\n\n let fullText = '';\n let promptTokens = 0;\n let completionTokens = 0;\n\n for await (const sdkMessage of q) {\n // 处理不同类型的消息\n switch (sdkMessage.type) {\n case 'assistant':\n // 完整的 assistant 消息\n for (const block of sdkMessage.message.content) {\n if (block.type === 'text') {\n fullText = block.text;\n }\n }\n // 更新 usage\n if (sdkMessage.message.usage) {\n promptTokens = sdkMessage.message.usage.input_tokens ?? 0;\n completionTokens = sdkMessage.message.usage.output_tokens ?? 0;\n }\n break;\n\n case 'stream_event':\n // 流式事件\n if (sdkMessage.event.type === 'content_block_delta') {\n const delta = sdkMessage.event.delta;\n if (delta.type === 'text_delta') {\n yield { type: 'text', content: delta.text };\n fullText += delta.text;\n }\n } else if (sdkMessage.event.type === 'message_delta') {\n // 更新 usage\n if (sdkMessage.event.usage) {\n completionTokens = sdkMessage.event.usage.output_tokens ?? 0;\n }\n } else if (sdkMessage.event.type === 'message_start') {\n // 初始 usage\n if (sdkMessage.event.message?.usage) {\n promptTokens = sdkMessage.event.message.usage.input_tokens ?? 0;\n }\n }\n break;\n\n case 'system':\n // 系统消息\n if ('subtype' in sdkMessage) {\n this.logger.debug(`[${config.name}] System message: ${sdkMessage.subtype}`);\n }\n break;\n\n case 'result':\n // 最终结果\n const result = sdkMessage as SDKResultMessage;\n if (result.subtype === 'success') {\n // 使用 result 中的信息更新\n if (result.usage) {\n promptTokens = result.usage.input_tokens ?? promptTokens;\n completionTokens = result.usage.output_tokens ?? completionTokens;\n }\n if (result.result && !fullText) {\n fullText = result.result;\n }\n } else {\n // 错误\n throw new Error(result.errors?.join(', ') ?? `执行失败: ${result.subtype}`);\n }\n break;\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n yield {\n type: 'done',\n result: {\n success: true,\n result: fullText,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n durationMs,\n },\n },\n };\n } catch (error) {\n yield* this.yieldError(error, startTime);\n }\n }\n\n /**\n * 多轮对话\n *\n * 注意:Claude Agent SDK 主要设计用于单次查询模式,\n * 多轮对话需要通过 session API(V2,目前不稳定)或\n * 在 prompt 中包含历史消息。\n */\n public async chat(config: ExecutorConfig, messages: ChatMessage[]): Promise<ExecuteResult> {\n const startTime = Date.now();\n\n try {\n // 分离 system 消息和对话消息\n const systemMessages = messages.filter((m) => m.role === 'system');\n const chatMessages = messages.filter((m) => m.role !== 'system');\n\n // 构建完整的 prompt,包含历史消息\n const formattedMessages = chatMessages\n .map((m) => {\n const role = m.role === 'user' ? 'Human' : 'Assistant';\n return `${role}: ${m.content}`;\n })\n .join('\\n\\n');\n\n // 构建 options\n const options = this.buildOptions(config, {\n // 如果有 system 消息,使用第一个作为 system prompt\n systemPrompt:\n systemMessages.length > 0\n ? systemMessages.map((m) => m.content).join('\\n\\n')\n : config.systemPrompt,\n });\n\n // 使用最后一条用户消息作为 prompt(如果有历史则在 system prompt 中添加上下文)\n const lastUserMessage = chatMessages.filter((m) => m.role === 'user').pop();\n const prompt = lastUserMessage?.content ?? formattedMessages;\n\n // 如果有多条消息,在 system prompt 中添加对话历史\n if (chatMessages.length > 1 && options.systemPrompt) {\n options.systemPrompt = `${options.systemPrompt}\\n\\n## Conversation History\\n${formattedMessages}`;\n }\n\n const claudeQuery = await loadClaudeQuery();\n const q = claudeQuery({ prompt, options });\n\n let fullText = '';\n let promptTokens = 0;\n let completionTokens = 0;\n\n for await (const sdkMessage of q) {\n if (sdkMessage.type === 'assistant') {\n for (const block of sdkMessage.message.content) {\n if (block.type === 'text') {\n fullText = block.text;\n }\n }\n if (sdkMessage.message.usage) {\n promptTokens = sdkMessage.message.usage.input_tokens ?? 0;\n completionTokens = sdkMessage.message.usage.output_tokens ?? 0;\n }\n } else if (sdkMessage.type === 'result') {\n const result = sdkMessage as SDKResultMessage;\n if (result.subtype !== 'success') {\n throw new Error(result.errors?.join(', ') ?? `执行失败: ${result.subtype}`);\n }\n if (result.usage) {\n promptTokens = result.usage.input_tokens ?? promptTokens;\n completionTokens = result.usage.output_tokens ?? completionTokens;\n }\n if (result.result && !fullText) {\n fullText = result.result;\n }\n }\n }\n\n return {\n success: true,\n result: fullText,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n durationMs: Date.now() - startTime,\n },\n };\n } catch (error) {\n return this.wrapError(error, startTime);\n }\n }\n}\n\n/**\n * 创建 Claude executor 实例\n */\nexport function createClaudeExecutor(options?: BaseExecutorOptions): ClaudeExecutor {\n return new ClaudeExecutor(options);\n}\n"]}
1
+ {"version":3,"file":"ClaudeExecutor.js","sourceRoot":"","sources":["../../src/agents/ClaudeExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Claude Executor\n *\n * 使用 Claude Agent SDK 执行任务。\n *\n * 支持功能:\n * - 完整的 Agent 能力(代码理解、文件编辑、命令执行等)\n * - 工具调用(MCP)\n * - 权限管理\n * - 流式输出\n *\n * 注意:\n * - Claude Agent SDK 需要 Anthropic-compatible env,但值必须来自\n * invocation-scoped Xpod AI Connection,不允许直接投递 Pod provider secret。\n * - SDK 会自动处理复杂的交互逻辑\n */\n\ntype Options = any;\ntype SDKResultMessage = any;\nimport { BaseAgentExecutor } from './BaseAgentExecutor';\nimport type {\n ExecutorType,\n AuthType,\n AuthInfo,\n ExecutorConfig,\n ExecuteMessage,\n ChatMessage,\n ExecuteResult,\n BaseExecutorOptions,\n} from './types';\nimport {\n projectAnthropicCompatibleEnv,\n requireAiConnectionRuntimeConfig,\n sanitizeRuntimeEnv,\n} from '../runtime/safe-env';\n\n/**\n * Claude 鉴权错误\n */\nexport class ClaudeAuthenticationError extends Error {\n public constructor(message: string = 'Claude 未配置 AI Connection 认证') {\n super(message);\n this.name = 'ClaudeAuthenticationError';\n }\n}\n\n/**\n * Claude Executor\n *\n * 封装 Claude Agent SDK 调用。\n */\nasync function loadClaudeQuery(): Promise<(args: { prompt: string; options: Options }) => AsyncIterable<any>> {\n const mod = await import('@anthropic-ai/claude-agent-sdk');\n const q = (mod as any)?.query;\n if (typeof q !== 'function') {\n throw new Error('Claude SDK is installed but query API is unavailable');\n }\n return q;\n}\n\nexport class ClaudeExecutor extends BaseAgentExecutor {\n public readonly executorType: ExecutorType = 'claude';\n\n /**\n * 获取认证类型\n */\n public getAuthType(): AuthType {\n return 'api-key';\n }\n\n /**\n * 获取环境变量配置\n */\n private getEnvConfig(): Record<string, string | undefined> {\n const connection = this.requireAiConnection();\n return {\n ...sanitizeRuntimeEnv(process.env),\n ...projectAnthropicCompatibleEnv(connection),\n };\n }\n\n private requireAiConnection() {\n return requireAiConnectionRuntimeConfig({\n baseUrl: this.aiConnection?.baseUrl,\n apiKey: this.aiConnection?.apiKey,\n model: this.aiConnection?.model,\n }, 'Claude executor');\n }\n\n /**\n * 检查认证状态\n */\n public async checkAuthentication(): Promise<AuthInfo> {\n try {\n const env = this.getEnvConfig();\n\n // 发送一个简单查询来验证认证\n const claudeQuery = await loadClaudeQuery();\n const q = claudeQuery({\n prompt: 'hi',\n options: {\n env,\n maxTurns: 1,\n permissionMode: 'dontAsk',\n tools: [], // 禁用所有工具\n persistSession: false,\n },\n });\n\n // 收集消息检查是否有认证错误\n for await (const message of q) {\n if (message.type === 'result') {\n const result = message as SDKResultMessage;\n if (result.subtype !== 'success') {\n // 检查是否是认证错误\n if (result.errors?.some((e: string) => e.includes('authentication') || e.includes('api_key') || e.includes('401'))) {\n throw new ClaudeAuthenticationError(`Claude API Key 无效: ${result.errors.join(', ')}`);\n }\n }\n }\n }\n\n return {\n authenticated: true,\n authType: 'api-key',\n providerId: this.providerId,\n executorType: this.executorType,\n };\n } catch (error) {\n if (error instanceof ClaudeAuthenticationError) {\n throw error;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n\n if (\n errorMsg.includes('authentication') ||\n errorMsg.includes('api_key') ||\n errorMsg.includes('AI Connection') ||\n errorMsg.includes('invalid') ||\n errorMsg.includes('401') ||\n errorMsg.includes('unauthorized')\n ) {\n throw new ClaudeAuthenticationError(`Claude AI Connection 无效: ${errorMsg}`);\n }\n\n throw error;\n }\n }\n\n /**\n * 构建 SDK Options\n */\n private buildOptions(config: ExecutorConfig, additionalOptions?: Partial<Options>): Options {\n const options: Options = {\n env: this.getEnvConfig(),\n model: config.model ?? 'claude-sonnet-4-20250514',\n cwd: config.workingDirectory ?? process.cwd(),\n includePartialMessages: true, // 启用流式输出\n persistSession: false, // 不持久化 session\n ...additionalOptions,\n };\n\n // 设置 system prompt\n if (config.systemPrompt) {\n options.systemPrompt = config.systemPrompt;\n }\n\n // 设置工具\n if (config.tools && config.tools.length > 0) {\n options.tools = config.tools;\n }\n\n // 设置允许的工具\n if (config.allowedTools && config.allowedTools.length > 0) {\n options.allowedTools = config.allowedTools;\n }\n\n // 设置权限模式\n if (config.permissionMode) {\n options.permissionMode = config.permissionMode as Options['permissionMode'];\n }\n\n // 设置 MCP 服务器\n if (config.mcpServers) {\n options.mcpServers = config.mcpServers as Options['mcpServers'];\n }\n\n // 设置 max tokens (通过 maxThinkingTokens)\n if (config.maxTokens) {\n options.maxThinkingTokens = config.maxTokens;\n }\n\n return options;\n }\n\n /**\n * 执行任务(流式)\n */\n public async *execute(config: ExecutorConfig, message: string): AsyncGenerator<ExecuteMessage> {\n this.logger.info(`[${config.name}] Executing with Claude Agent SDK: ${message.slice(0, 100)}...`);\n\n const startTime = Date.now();\n const modelName = config.model ?? 'claude-sonnet-4-20250514';\n\n try {\n yield { type: 'system', executorType: this.executorType, model: modelName };\n\n const options = this.buildOptions(config);\n const claudeQuery = await loadClaudeQuery();\n const q = claudeQuery({ prompt: message, options });\n\n let fullText = '';\n let promptTokens = 0;\n let completionTokens = 0;\n\n for await (const sdkMessage of q) {\n // 处理不同类型的消息\n switch (sdkMessage.type) {\n case 'assistant':\n // 完整的 assistant 消息\n for (const block of sdkMessage.message.content) {\n if (block.type === 'text') {\n fullText = block.text;\n }\n }\n // 更新 usage\n if (sdkMessage.message.usage) {\n promptTokens = sdkMessage.message.usage.input_tokens ?? 0;\n completionTokens = sdkMessage.message.usage.output_tokens ?? 0;\n }\n break;\n\n case 'stream_event':\n // 流式事件\n if (sdkMessage.event.type === 'content_block_delta') {\n const delta = sdkMessage.event.delta;\n if (delta.type === 'text_delta') {\n yield { type: 'text', content: delta.text };\n fullText += delta.text;\n }\n } else if (sdkMessage.event.type === 'message_delta') {\n // 更新 usage\n if (sdkMessage.event.usage) {\n completionTokens = sdkMessage.event.usage.output_tokens ?? 0;\n }\n } else if (sdkMessage.event.type === 'message_start') {\n // 初始 usage\n if (sdkMessage.event.message?.usage) {\n promptTokens = sdkMessage.event.message.usage.input_tokens ?? 0;\n }\n }\n break;\n\n case 'system':\n // 系统消息\n if ('subtype' in sdkMessage) {\n this.logger.debug(`[${config.name}] System message: ${sdkMessage.subtype}`);\n }\n break;\n\n case 'result':\n // 最终结果\n const result = sdkMessage as SDKResultMessage;\n if (result.subtype === 'success') {\n // 使用 result 中的信息更新\n if (result.usage) {\n promptTokens = result.usage.input_tokens ?? promptTokens;\n completionTokens = result.usage.output_tokens ?? completionTokens;\n }\n if (result.result && !fullText) {\n fullText = result.result;\n }\n } else {\n // 错误\n throw new Error(result.errors?.join(', ') ?? `执行失败: ${result.subtype}`);\n }\n break;\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n yield {\n type: 'done',\n result: {\n success: true,\n result: fullText,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n durationMs,\n },\n },\n };\n } catch (error) {\n yield* this.yieldError(error, startTime);\n }\n }\n\n /**\n * 多轮对话\n *\n * 注意:Claude Agent SDK 主要设计用于单次查询模式,\n * 多轮对话需要通过 session API(V2,目前不稳定)或\n * 在 prompt 中包含历史消息。\n */\n public async chat(config: ExecutorConfig, messages: ChatMessage[]): Promise<ExecuteResult> {\n const startTime = Date.now();\n\n try {\n // 分离 system 消息和对话消息\n const systemMessages = messages.filter((m) => m.role === 'system');\n const chatMessages = messages.filter((m) => m.role !== 'system');\n\n // 构建完整的 prompt,包含历史消息\n const formattedMessages = chatMessages\n .map((m) => {\n const role = m.role === 'user' ? 'Human' : 'Assistant';\n return `${role}: ${m.content}`;\n })\n .join('\\n\\n');\n\n // 构建 options\n const options = this.buildOptions(config, {\n // 如果有 system 消息,使用第一个作为 system prompt\n systemPrompt:\n systemMessages.length > 0\n ? systemMessages.map((m) => m.content).join('\\n\\n')\n : config.systemPrompt,\n });\n\n // 使用最后一条用户消息作为 prompt(如果有历史则在 system prompt 中添加上下文)\n const lastUserMessage = chatMessages.filter((m) => m.role === 'user').pop();\n const prompt = lastUserMessage?.content ?? formattedMessages;\n\n // 如果有多条消息,在 system prompt 中添加对话历史\n if (chatMessages.length > 1 && options.systemPrompt) {\n options.systemPrompt = `${options.systemPrompt}\\n\\n## Conversation History\\n${formattedMessages}`;\n }\n\n const claudeQuery = await loadClaudeQuery();\n const q = claudeQuery({ prompt, options });\n\n let fullText = '';\n let promptTokens = 0;\n let completionTokens = 0;\n\n for await (const sdkMessage of q) {\n if (sdkMessage.type === 'assistant') {\n for (const block of sdkMessage.message.content) {\n if (block.type === 'text') {\n fullText = block.text;\n }\n }\n if (sdkMessage.message.usage) {\n promptTokens = sdkMessage.message.usage.input_tokens ?? 0;\n completionTokens = sdkMessage.message.usage.output_tokens ?? 0;\n }\n } else if (sdkMessage.type === 'result') {\n const result = sdkMessage as SDKResultMessage;\n if (result.subtype !== 'success') {\n throw new Error(result.errors?.join(', ') ?? `执行失败: ${result.subtype}`);\n }\n if (result.usage) {\n promptTokens = result.usage.input_tokens ?? promptTokens;\n completionTokens = result.usage.output_tokens ?? completionTokens;\n }\n if (result.result && !fullText) {\n fullText = result.result;\n }\n }\n }\n\n return {\n success: true,\n result: fullText,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n durationMs: Date.now() - startTime,\n },\n };\n } catch (error) {\n return this.wrapError(error, startTime);\n }\n }\n}\n\n/**\n * 创建 Claude executor 实例\n */\nexport function createClaudeExecutor(options?: BaseExecutorOptions): ClaudeExecutor {\n return new ClaudeExecutor(options);\n}\n"]}
@@ -60,15 +60,15 @@ export interface AiCredential {
60
60
  /**
61
61
  * Invocation-scoped AI Connection configuration.
62
62
  *
63
- * Gateway key is an Xpod-issued runtime key for the current invocation. It is
64
- * not the user's raw Pod provider secret.
63
+ * API key is the Solid client-credentials wrapper (`sk-*`) projected into the
64
+ * current invocation. It is not the user's raw Pod provider secret.
65
65
  */
66
66
  export interface AIConnectionInvocationConfig {
67
67
  /** Xpod AI Connection endpoint, usually the local /v1 gateway URL */
68
68
  baseUrl: string;
69
- /** Xpod-issued gateway key for this invocation */
70
- gatewayKey: string;
71
- /** ISO timestamp after which the invocation token must be refreshed */
69
+ /** OpenAI-compatible API key for this invocation */
70
+ apiKey: string;
71
+ /** ISO timestamp after which the delegated credential must be refreshed */
72
72
  expiresAt?: string;
73
73
  /** Optional model routed through the gateway */
74
74
  model?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Agent Executor 类型定义\n *\n * 统一的 AI Agent 执行框架接口。\n * 供应商配置从 Pod 读取,不在代码中硬编码。\n */\n\n/**\n * 通用 MCP Server 配置类型\n *\n * 这是一个宽松的类型定义,各个 Executor 会在内部转换为对应 SDK 的具体类型。\n * 支持的配置类型:\n * - stdio: { command: string, args?: string[], env?: Record<string, string> }\n * - sse: { type: 'sse', url: string, headers?: Record<string, string> }\n * - http: { type: 'http', url: string, headers?: Record<string, string> }\n * - sdk: { type: 'sdk', name: string, instance?: McpServer }\n */\nexport type McpServerConfig = {\n type?: 'stdio' | 'sse' | 'http' | 'sdk';\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n name?: string;\n [key: string]: unknown;\n};\n\n/**\n * 执行器类型(SDK 类型)\n *\n * 只支持有完整 Agent SDK 的供应商:\n * - codebuddy: @tencent-ai/agent-sdk\n * - claude: @anthropic-ai/claude-agent-sdk\n *\n * 不支持的原因:\n * - OpenAI: 没有完整的 Agent SDK,Codex CLI 通过 ACP runner 接入,不走这里\n * - Gemini: 没有完整的 Agent SDK,CLI core 使用 MCP 不使用 ACP\n */\nexport type ExecutorType = 'codebuddy' | 'claude';\n\n/**\n * 认证类型\n */\nexport type AuthType = 'api-key' | 'oidc';\n\n/**\n * AI 凭证(从 Pod 读取)\n */\nexport interface AiCredential {\n /** 提供商 ID(对应 Pod 中的 provider URI fragment) */\n providerId: string;\n /** API Key */\n apiKey: string;\n /** 自定义 API 端点 */\n baseUrl?: string;\n /** 代理 URL */\n proxyUrl?: string;\n /** 项目 ID (Gemini Vertex AI) */\n projectId?: string;\n /** 组织 ID (OpenAI) */\n organizationId?: string;\n}\n\n/**\n * Invocation-scoped AI Connection configuration.\n *\n * Gateway key is an Xpod-issued runtime key for the current invocation. It is\n * not the user's raw Pod provider secret.\n */\nexport interface AIConnectionInvocationConfig {\n /** Xpod AI Connection endpoint, usually the local /v1 gateway URL */\n baseUrl: string;\n /** Xpod-issued gateway key for this invocation */\n gatewayKey: string;\n /** ISO timestamp after which the invocation token must be refreshed */\n expiresAt?: string;\n /** Optional model routed through the gateway */\n model?: string;\n}\n\n/**\n * 供应商配置(Pod Provider + Agent runtime 的组合视图)\n */\nexport interface ProviderConfig {\n /** 供应商 ID */\n id: string;\n /** 显示名称 */\n displayName: string;\n /** 运行时类型(来自 Agent .meta runtimeKind,不存储在 Provider 实体) */\n executorType: ExecutorType;\n /** API 端点 */\n baseUrl?: string;\n /** 默认模型 ID */\n defaultModel?: string;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/**\n * 认证信息\n */\nexport interface AuthInfo {\n /** 是否已认证 */\n authenticated: boolean;\n /** 认证类型 */\n authType: AuthType;\n /** 供应商 ID */\n providerId: string;\n /** 执行器类型 */\n executorType: ExecutorType;\n /** 过期时间 */\n expiresAt?: Date;\n /** 账户信息 */\n account?: {\n email?: string;\n name?: string;\n };\n}\n\n/**\n * 执行器配置(基础)\n */\nexport interface ExecutorConfig {\n /** Agent 名称 */\n name: string;\n /** Agent 描述 */\n description?: string;\n /** System prompt */\n systemPrompt: string;\n /** 模型名称 */\n model?: string;\n /** 最大输出 tokens */\n maxTokens?: number;\n /** 温度参数 (0-2) */\n temperature?: number;\n /** Top-P 参数 */\n topP?: number;\n /** 工作目录 */\n workingDirectory?: string;\n /** 可用工具列表 */\n tools?: string[];\n /** 允许的工具列表(自动允许,不需要权限确认) */\n allowedTools?: string[];\n /** 禁用的工具列表 */\n disallowedTools?: string[];\n /** MCP 服务器配置 */\n mcpServers?: Record<string, McpServerConfig>;\n /** 最大轮数 */\n maxTurns?: number;\n /** 权限模式 */\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'dontAsk';\n}\n\n/**\n * CodeBuddy 扩展配置\n */\nexport interface CodeBuddyConfig extends ExecutorConfig {\n /** 工作目录(限制文件操作范围) */\n cwd?: string;\n /** 允许的工具列表 */\n allowedTools?: string[];\n /** 禁用的工具列表 */\n disallowedTools?: string[];\n /** MCP 服务器配置 */\n mcpServers?: Record<string, McpServerConfig>;\n /** 最大轮数 */\n maxTurns?: number;\n /** 权限模式 */\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions';\n}\n\n/**\n * CodeBuddy 执行选项\n */\nexport interface CodeBuddyOptions {\n /** Pod base URL */\n podBaseUrl?: string;\n /** OAuth access token(用于 MCP 访问 Pod) */\n accessToken?: string;\n /** 超时时间(毫秒) */\n timeout?: number;\n /** 额外上下文 */\n context?: Record<string, unknown>;\n}\n\n/**\n * 执行结果(基础)\n */\nexport interface ExecuteResult {\n /** 是否成功 */\n success: boolean;\n /** 结果文本 */\n result?: string;\n /** 错误信息 */\n error?: string;\n /** 结构化输出(CodeBuddy 专用) */\n structuredOutput?: unknown;\n /** 使用统计 */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n durationMs: number;\n };\n}\n\n/**\n * 执行消息类型\n */\nexport type ExecuteMessage =\n | { type: 'system'; executorType: ExecutorType; model: string; tools?: string[] }\n | { type: 'text'; content: string }\n | { type: 'tool_call'; toolName: string; toolInput: unknown }\n | { type: 'tool_result'; toolName: string; result: string }\n | { type: 'error'; error: string }\n | { type: 'done'; result: ExecuteResult };\n\n/**\n * 聊天消息\n */\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\n/**\n * Agent 执行器接口\n *\n * 所有 AI 执行器都必须实现此接口。\n */\nexport interface IAgentExecutor {\n /** 执行器类型 */\n readonly executorType: ExecutorType;\n\n /** 供应商 ID */\n readonly providerId: string;\n\n /**\n * 获取认证类型\n */\n getAuthType(): AuthType;\n\n /**\n * 检查认证状态\n */\n checkAuthentication(): Promise<AuthInfo>;\n\n /**\n * 执行任务(流式)\n *\n * @param config 执行器配置\n * @param message 用户消息\n * @returns 异步迭代器,yield 执行过程中的消息\n */\n execute(config: ExecutorConfig, message: string): AsyncGenerator<ExecuteMessage>;\n\n /**\n * 执行任务并等待完成\n *\n * @param config 执行器配置\n * @param message 用户消息\n * @returns 执行结果\n */\n executeAndWait(config: ExecutorConfig, message: string): Promise<ExecuteResult>;\n\n /**\n * 多轮对话\n *\n * @param config 执行器配置\n * @param messages 对话历史\n * @returns 执行结果\n */\n chat(config: ExecutorConfig, messages: ChatMessage[]): Promise<ExecuteResult>;\n}\n\n/**\n * 执行器基类选项\n */\nexport interface BaseExecutorOptions {\n /** 供应商 ID */\n providerId: string;\n /** 凭证 */\n credential: AiCredential;\n /** Invocation-scoped AI Connection runtime config */\n aiConnection?: AIConnectionInvocationConfig;\n /** 供应商配置(可选,用于覆盖默认值) */\n providerConfig?: Partial<ProviderConfig>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Agent Executor 类型定义\n *\n * 统一的 AI Agent 执行框架接口。\n * 供应商配置从 Pod 读取,不在代码中硬编码。\n */\n\n/**\n * 通用 MCP Server 配置类型\n *\n * 这是一个宽松的类型定义,各个 Executor 会在内部转换为对应 SDK 的具体类型。\n * 支持的配置类型:\n * - stdio: { command: string, args?: string[], env?: Record<string, string> }\n * - sse: { type: 'sse', url: string, headers?: Record<string, string> }\n * - http: { type: 'http', url: string, headers?: Record<string, string> }\n * - sdk: { type: 'sdk', name: string, instance?: McpServer }\n */\nexport type McpServerConfig = {\n type?: 'stdio' | 'sse' | 'http' | 'sdk';\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n name?: string;\n [key: string]: unknown;\n};\n\n/**\n * 执行器类型(SDK 类型)\n *\n * 只支持有完整 Agent SDK 的供应商:\n * - codebuddy: @tencent-ai/agent-sdk\n * - claude: @anthropic-ai/claude-agent-sdk\n *\n * 不支持的原因:\n * - OpenAI: 没有完整的 Agent SDK,Codex CLI 通过 ACP runner 接入,不走这里\n * - Gemini: 没有完整的 Agent SDK,CLI core 使用 MCP 不使用 ACP\n */\nexport type ExecutorType = 'codebuddy' | 'claude';\n\n/**\n * 认证类型\n */\nexport type AuthType = 'api-key' | 'oidc';\n\n/**\n * AI 凭证(从 Pod 读取)\n */\nexport interface AiCredential {\n /** 提供商 ID(对应 Pod 中的 provider URI fragment) */\n providerId: string;\n /** API Key */\n apiKey: string;\n /** 自定义 API 端点 */\n baseUrl?: string;\n /** 代理 URL */\n proxyUrl?: string;\n /** 项目 ID (Gemini Vertex AI) */\n projectId?: string;\n /** 组织 ID (OpenAI) */\n organizationId?: string;\n}\n\n/**\n * Invocation-scoped AI Connection configuration.\n *\n * API key is the Solid client-credentials wrapper (`sk-*`) projected into the\n * current invocation. It is not the user's raw Pod provider secret.\n */\nexport interface AIConnectionInvocationConfig {\n /** Xpod AI Connection endpoint, usually the local /v1 gateway URL */\n baseUrl: string;\n /** OpenAI-compatible API key for this invocation */\n apiKey: string;\n /** ISO timestamp after which the delegated credential must be refreshed */\n expiresAt?: string;\n /** Optional model routed through the gateway */\n model?: string;\n}\n\n/**\n * 供应商配置(Pod Provider + Agent runtime 的组合视图)\n */\nexport interface ProviderConfig {\n /** 供应商 ID */\n id: string;\n /** 显示名称 */\n displayName: string;\n /** 运行时类型(来自 Agent .meta runtimeKind,不存储在 Provider 实体) */\n executorType: ExecutorType;\n /** API 端点 */\n baseUrl?: string;\n /** 默认模型 ID */\n defaultModel?: string;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/**\n * 认证信息\n */\nexport interface AuthInfo {\n /** 是否已认证 */\n authenticated: boolean;\n /** 认证类型 */\n authType: AuthType;\n /** 供应商 ID */\n providerId: string;\n /** 执行器类型 */\n executorType: ExecutorType;\n /** 过期时间 */\n expiresAt?: Date;\n /** 账户信息 */\n account?: {\n email?: string;\n name?: string;\n };\n}\n\n/**\n * 执行器配置(基础)\n */\nexport interface ExecutorConfig {\n /** Agent 名称 */\n name: string;\n /** Agent 描述 */\n description?: string;\n /** System prompt */\n systemPrompt: string;\n /** 模型名称 */\n model?: string;\n /** 最大输出 tokens */\n maxTokens?: number;\n /** 温度参数 (0-2) */\n temperature?: number;\n /** Top-P 参数 */\n topP?: number;\n /** 工作目录 */\n workingDirectory?: string;\n /** 可用工具列表 */\n tools?: string[];\n /** 允许的工具列表(自动允许,不需要权限确认) */\n allowedTools?: string[];\n /** 禁用的工具列表 */\n disallowedTools?: string[];\n /** MCP 服务器配置 */\n mcpServers?: Record<string, McpServerConfig>;\n /** 最大轮数 */\n maxTurns?: number;\n /** 权限模式 */\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'dontAsk';\n}\n\n/**\n * CodeBuddy 扩展配置\n */\nexport interface CodeBuddyConfig extends ExecutorConfig {\n /** 工作目录(限制文件操作范围) */\n cwd?: string;\n /** 允许的工具列表 */\n allowedTools?: string[];\n /** 禁用的工具列表 */\n disallowedTools?: string[];\n /** MCP 服务器配置 */\n mcpServers?: Record<string, McpServerConfig>;\n /** 最大轮数 */\n maxTurns?: number;\n /** 权限模式 */\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions';\n}\n\n/**\n * CodeBuddy 执行选项\n */\nexport interface CodeBuddyOptions {\n /** Pod base URL */\n podBaseUrl?: string;\n /** OAuth access token(用于 MCP 访问 Pod) */\n accessToken?: string;\n /** 超时时间(毫秒) */\n timeout?: number;\n /** 额外上下文 */\n context?: Record<string, unknown>;\n}\n\n/**\n * 执行结果(基础)\n */\nexport interface ExecuteResult {\n /** 是否成功 */\n success: boolean;\n /** 结果文本 */\n result?: string;\n /** 错误信息 */\n error?: string;\n /** 结构化输出(CodeBuddy 专用) */\n structuredOutput?: unknown;\n /** 使用统计 */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n durationMs: number;\n };\n}\n\n/**\n * 执行消息类型\n */\nexport type ExecuteMessage =\n | { type: 'system'; executorType: ExecutorType; model: string; tools?: string[] }\n | { type: 'text'; content: string }\n | { type: 'tool_call'; toolName: string; toolInput: unknown }\n | { type: 'tool_result'; toolName: string; result: string }\n | { type: 'error'; error: string }\n | { type: 'done'; result: ExecuteResult };\n\n/**\n * 聊天消息\n */\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\n/**\n * Agent 执行器接口\n *\n * 所有 AI 执行器都必须实现此接口。\n */\nexport interface IAgentExecutor {\n /** 执行器类型 */\n readonly executorType: ExecutorType;\n\n /** 供应商 ID */\n readonly providerId: string;\n\n /**\n * 获取认证类型\n */\n getAuthType(): AuthType;\n\n /**\n * 检查认证状态\n */\n checkAuthentication(): Promise<AuthInfo>;\n\n /**\n * 执行任务(流式)\n *\n * @param config 执行器配置\n * @param message 用户消息\n * @returns 异步迭代器,yield 执行过程中的消息\n */\n execute(config: ExecutorConfig, message: string): AsyncGenerator<ExecuteMessage>;\n\n /**\n * 执行任务并等待完成\n *\n * @param config 执行器配置\n * @param message 用户消息\n * @returns 执行结果\n */\n executeAndWait(config: ExecutorConfig, message: string): Promise<ExecuteResult>;\n\n /**\n * 多轮对话\n *\n * @param config 执行器配置\n * @param messages 对话历史\n * @returns 执行结果\n */\n chat(config: ExecutorConfig, messages: ChatMessage[]): Promise<ExecuteResult>;\n}\n\n/**\n * 执行器基类选项\n */\nexport interface BaseExecutorOptions {\n /** 供应商 ID */\n providerId: string;\n /** 凭证 */\n credential: AiCredential;\n /** Invocation-scoped AI Connection runtime config */\n aiConnection?: AIConnectionInvocationConfig;\n /** 供应商配置(可选,用于覆盖默认值) */\n providerConfig?: Partial<ProviderConfig>;\n}\n"]}
@@ -1,13 +1,12 @@
1
1
  import type { AuthContext } from '../auth/AuthContext';
2
- import type { CredentialVault } from './credentials/CredentialVault';
3
- import type { EncryptedCredentialSecret } from './credentials/KeyWrapper';
4
2
  import type { ProviderRuntimeCredential } from './providers/ProviderRuntimeAdapter';
5
3
  import type { ProviderCapabilities, ProviderRegistry } from './providers/ProviderRegistry';
6
4
  import type { ProviderRuntimeRegistry } from './providers/ProviderRuntimeRegistry';
7
5
  import type { GatewayCredentialCandidate, ModelRouter, ModelRouteResult } from './routing/ModelRouter';
8
6
  import type { GatewayEvent, GatewayProtocol, GatewayProtocolFrontend, GatewayRequest } from './types';
9
7
  export interface StoredGatewayCredential extends GatewayCredentialCandidate {
10
- encryptedSecret: EncryptedCredentialSecret;
8
+ storageMode: 'plaintext-v1';
9
+ secretPayload: string;
11
10
  version?: number;
12
11
  runtimeCredential?: ProviderRuntimeCredential;
13
12
  }
@@ -19,13 +18,6 @@ export interface GatewayCredentialStore {
19
18
  }): Promise<StoredGatewayCredential[]>;
20
19
  recordSuccess?(input: GatewayCredentialHealthRecord): Promise<void>;
21
20
  recordFailure?(input: GatewayCredentialHealthRecord): Promise<void>;
22
- rewrapCredential?(input: {
23
- webId: string;
24
- deployment: string;
25
- credentialId: string;
26
- expectedVersion?: number;
27
- encryptedSecret: EncryptedCredentialSecret;
28
- }): Promise<boolean>;
29
21
  }
30
22
  export interface GatewayCredentialHealthRecord {
31
23
  webId: string;
@@ -41,7 +33,6 @@ export interface AiGatewayServiceOptions {
41
33
  registry: ProviderRegistry;
42
34
  router: ModelRouter;
43
35
  credentials: GatewayCredentialStore;
44
- vault: CredentialVault;
45
36
  runtimes: ProviderRuntimeRegistry;
46
37
  frontends?: GatewayProtocolFrontend[];
47
38
  now?: () => Date;
@@ -69,10 +60,10 @@ export interface GatewayModelListItem {
69
60
  }
70
61
  export interface GatewayAcceptanceProvenance {
71
62
  webId: string;
72
- gatewayKeyId: string;
73
- gatewayKeyFingerprint: string;
63
+ authType: 'solid-oidc' | 'client-credentials';
64
+ clientIdHash?: string;
74
65
  credentialIriHash: string;
75
- secretCellRefHash: string;
66
+ credentialPayloadRefHash: string;
76
67
  providerId: string;
77
68
  providerRouteSource: 'pod-credential';
78
69
  xpodBaseUrl: string;
@@ -83,7 +74,6 @@ export declare class AiGatewayService {
83
74
  private readonly registry;
84
75
  private readonly router;
85
76
  private readonly credentials;
86
- private readonly vault;
87
77
  private readonly runtimes;
88
78
  private readonly frontends;
89
79
  private readonly now;
@@ -102,5 +92,4 @@ export declare class AiGatewayService {
102
92
  private openApiKey;
103
93
  private recordRouteFailure;
104
94
  private requirePrincipal;
105
- private requireScope;
106
95
  }
@@ -4,6 +4,7 @@ exports.AiGatewayService = void 0;
4
4
  const node_crypto_1 = require("node:crypto");
5
5
  const errors_1 = require("./errors");
6
6
  const AuthContext_1 = require("../auth/AuthContext");
7
+ const PlaintextCredentialPayload_1 = require("./credentials/PlaintextCredentialPayload");
7
8
  const protocol_1 = require("./protocol");
8
9
  const ProviderRegistry_1 = require("./providers/ProviderRegistry");
9
10
  class AiGatewayService {
@@ -13,7 +14,6 @@ class AiGatewayService {
13
14
  this.registry = options.registry;
14
15
  this.router = options.router;
15
16
  this.credentials = options.credentials;
16
- this.vault = options.vault;
17
17
  this.runtimes = options.runtimes;
18
18
  this.now = options.now ?? (() => new Date());
19
19
  for (const frontend of options.frontends ?? [
@@ -36,7 +36,6 @@ class AiGatewayService {
36
36
  return frontend;
37
37
  }
38
38
  async execute(input) {
39
- this.requireScope(input.auth, 'inference:write');
40
39
  const principal = this.requirePrincipal(input.auth);
41
40
  const frontend = this.frontend(input.protocol);
42
41
  const request = frontend.parseRequest(input.body);
@@ -51,6 +50,7 @@ class AiGatewayService {
51
50
  });
52
51
  request.model = route.model;
53
52
  const events = this.executeWithCredentialFailover({
53
+ auth: input.auth,
54
54
  principal,
55
55
  request,
56
56
  route,
@@ -73,7 +73,6 @@ class AiGatewayService {
73
73
  return aggregateEvents(execution.protocol, execution.request.model, events, this.now());
74
74
  }
75
75
  async listModels(auth) {
76
- this.requireScope(auth, 'models:read');
77
76
  const principal = this.requirePrincipal(auth);
78
77
  const credentials = await this.credentials.listCredentials({
79
78
  webId: principal.webId,
@@ -140,14 +139,7 @@ class AiGatewayService {
140
139
  return models;
141
140
  }
142
141
  async acceptanceProvenance(input) {
143
- this.requireScope(input.auth, 'acceptance:read');
144
142
  const principal = this.requirePrincipal(input.auth);
145
- if (input.auth.type !== 'solid' || input.auth.viaGatewayApiKey !== true || !input.auth.gatewayKeyFingerprint) {
146
- throw new errors_1.GatewayProtocolError('Acceptance provenance requires a Gateway API key principal', {
147
- code: 'invalid_request',
148
- status: 403,
149
- });
150
- }
151
143
  let route;
152
144
  try {
153
145
  route = await this.router.route({
@@ -177,10 +169,14 @@ class AiGatewayService {
177
169
  const credential = route.credential;
178
170
  return {
179
171
  webId: principal.webId,
180
- gatewayKeyId: input.auth.type === 'solid' ? input.auth.gatewayKeyId ?? 'unknown' : 'unknown',
181
- gatewayKeyFingerprint: input.auth.gatewayKeyFingerprint,
172
+ authType: input.auth.type === 'solid' && input.auth.viaApiKey === true
173
+ ? 'client-credentials'
174
+ : 'solid-oidc',
175
+ ...(input.auth.type === 'solid' && input.auth.clientId
176
+ ? { clientIdHash: hashProvenanceValue(input.auth.clientId) }
177
+ : {}),
182
178
  credentialIriHash: hashProvenanceValue(credential.credentialIri),
183
- secretCellRefHash: hashProvenanceValue(credential.encryptedSecret.credentialIri),
179
+ credentialPayloadRefHash: hashProvenanceValue(credential.credentialIri),
184
180
  providerId: route.provider.id,
185
181
  providerRouteSource: 'pod-credential',
186
182
  xpodBaseUrl: input.xpodBaseUrl,
@@ -216,7 +212,7 @@ class AiGatewayService {
216
212
  catch (error) {
217
213
  await this.recordRouteFailure(input.principal.webId, route, error);
218
214
  if (!firstClientEventEmitted && this.router.canFailOver(route)) {
219
- const nextRoute = await this.findFailoverRoute(input.principal.webId, input.request, route, attempted);
215
+ const nextRoute = await this.findFailoverRoute(input.auth, input.principal.webId, input.request, route, attempted);
220
216
  if (nextRoute) {
221
217
  route = nextRoute;
222
218
  continue;
@@ -226,11 +222,12 @@ class AiGatewayService {
226
222
  }
227
223
  }
228
224
  }
229
- async findFailoverRoute(webId, request, failedRoute, attempted) {
225
+ async findFailoverRoute(auth, webId, request, failedRoute, attempted) {
230
226
  try {
231
227
  return await this.router.route({
232
228
  webId,
233
229
  deployment: this.deployment,
230
+ auth,
234
231
  model: `${failedRoute.provider.id}/${failedRoute.model}`,
235
232
  conversationId: conversationIdFor(request),
236
233
  }, attempted);
@@ -243,17 +240,7 @@ class AiGatewayService {
243
240
  }
244
241
  }
245
242
  async openApiKey(principal, route, credential) {
246
- const secret = await this.vault.open(principal, credential.credentialIri, route.provider.id, credential.encryptedSecret);
247
- if (this.vault.needsRewrap?.(credential.encryptedSecret) && this.credentials.rewrapCredential) {
248
- const rewrapped = await this.vault.rewrap(principal, credential.encryptedSecret);
249
- await this.credentials.rewrapCredential({
250
- webId: principal.webId,
251
- deployment: this.deployment,
252
- credentialId: credential.id,
253
- expectedVersion: credential.version,
254
- encryptedSecret: rewrapped,
255
- });
256
- }
243
+ const secret = (0, PlaintextCredentialPayload_1.decodePlaintextCredential)(credential);
257
244
  const apiKey = secret.apiKey ?? secret.accessToken ?? secret.token;
258
245
  if (typeof apiKey !== 'string' || !apiKey) {
259
246
  throw new errors_1.GatewayProtocolError('Credential secret does not contain a usable provider token', {
@@ -295,15 +282,6 @@ class AiGatewayService {
295
282
  }
296
283
  return { webId };
297
284
  }
298
- requireScope(auth, scope) {
299
- if (!(0, AuthContext_1.hasGatewayScope)(auth, scope)) {
300
- throw new errors_1.GatewayProtocolError(`Missing required scope: ${scope}`, {
301
- code: 'invalid_request',
302
- status: 403,
303
- details: { scope },
304
- });
305
- }
306
- }
307
285
  }
308
286
  exports.AiGatewayService = AiGatewayService;
309
287
  function hashProvenanceValue(value) {