@inkeep/agents-api 0.0.0-dev-20260121145510

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 (352) hide show
  1. package/LICENSE.md +56 -0
  2. package/SUPPLEMENTAL_TERMS.md +40 -0
  3. package/dist/.well-known/workflow/v1/flow.cjs +46383 -0
  4. package/dist/.well-known/workflow/v1/flow.cjs.debug.json +6 -0
  5. package/dist/.well-known/workflow/v1/manifest.debug.json +55 -0
  6. package/dist/.well-known/workflow/v1/step.cjs +218683 -0
  7. package/dist/.well-known/workflow/v1/step.cjs.debug.json +6 -0
  8. package/dist/.well-known/workflow/v1/webhook.mjs +29 -0
  9. package/dist/createApp.d.ts +10 -0
  10. package/dist/createApp.js +170 -0
  11. package/dist/data/db/index.d.ts +4 -0
  12. package/dist/data/db/index.js +5 -0
  13. package/dist/data/db/manageDbClient.d.ts +6 -0
  14. package/dist/data/db/manageDbClient.js +9 -0
  15. package/dist/data/db/manageDbPool.d.ts +6 -0
  16. package/dist/data/db/manageDbPool.js +9 -0
  17. package/dist/data/db/runDbClient.d.ts +6 -0
  18. package/dist/data/db/runDbClient.js +9 -0
  19. package/dist/domains/evals/index.d.ts +13 -0
  20. package/dist/domains/evals/index.js +13 -0
  21. package/dist/domains/evals/routes/datasetTriggers.d.ts +7 -0
  22. package/dist/domains/evals/routes/datasetTriggers.js +65 -0
  23. package/dist/domains/evals/routes/evaluationTriggers.d.ts +11 -0
  24. package/dist/domains/evals/routes/evaluationTriggers.js +311 -0
  25. package/dist/domains/evals/routes/index.d.ts +7 -0
  26. package/dist/domains/evals/routes/index.js +12 -0
  27. package/dist/domains/evals/scripts/build-workflow.d.ts +1 -0
  28. package/dist/domains/evals/scripts/build-workflow.js +31 -0
  29. package/dist/domains/evals/services/EvaluationService.d.ts +96 -0
  30. package/dist/domains/evals/services/EvaluationService.js +863 -0
  31. package/dist/domains/evals/services/conversationEvaluation.d.ts +15 -0
  32. package/dist/domains/evals/services/conversationEvaluation.js +102 -0
  33. package/dist/domains/evals/services/datasetRun.d.ts +16 -0
  34. package/dist/domains/evals/services/datasetRun.js +43 -0
  35. package/dist/domains/evals/services/evaluationJob.d.ts +17 -0
  36. package/dist/domains/evals/services/evaluationJob.js +65 -0
  37. package/dist/domains/evals/services/startEvaluation.d.ts +19 -0
  38. package/dist/domains/evals/services/startEvaluation.js +18 -0
  39. package/dist/domains/evals/workflow/functions/evaluateConversation.d.ts +31 -0
  40. package/dist/domains/evals/workflow/functions/evaluateConversation.js +135 -0
  41. package/dist/domains/evals/workflow/functions/runDatasetItem.d.ts +39 -0
  42. package/dist/domains/evals/workflow/functions/runDatasetItem.js +205 -0
  43. package/dist/domains/evals/workflow/index.d.ts +4 -0
  44. package/dist/domains/evals/workflow/index.js +5 -0
  45. package/dist/domains/evals/workflow/routes.d.ts +7 -0
  46. package/dist/domains/evals/workflow/routes.js +106 -0
  47. package/dist/domains/evals/workflow/world.d.ts +4 -0
  48. package/dist/domains/evals/workflow/world.js +36 -0
  49. package/dist/domains/index.d.ts +4 -0
  50. package/dist/domains/index.js +5 -0
  51. package/dist/domains/manage/index.d.ts +12 -0
  52. package/dist/domains/manage/index.js +31 -0
  53. package/dist/domains/manage/routes/agent.d.ts +9 -0
  54. package/dist/domains/manage/routes/agent.js +266 -0
  55. package/dist/domains/manage/routes/agentFull.d.ts +9 -0
  56. package/dist/domains/manage/routes/agentFull.js +207 -0
  57. package/dist/domains/manage/routes/agentToolRelations.d.ts +9 -0
  58. package/dist/domains/manage/routes/agentToolRelations.js +289 -0
  59. package/dist/domains/manage/routes/apiKeys.d.ts +9 -0
  60. package/dist/domains/manage/routes/apiKeys.js +217 -0
  61. package/dist/domains/manage/routes/artifactComponents.d.ts +9 -0
  62. package/dist/domains/manage/routes/artifactComponents.js +210 -0
  63. package/dist/domains/manage/routes/branches.d.ts +9 -0
  64. package/dist/domains/manage/routes/branches.js +182 -0
  65. package/dist/domains/manage/routes/cliAuth.d.ts +9 -0
  66. package/dist/domains/manage/routes/cliAuth.js +60 -0
  67. package/dist/domains/manage/routes/contextConfigs.d.ts +9 -0
  68. package/dist/domains/manage/routes/contextConfigs.js +189 -0
  69. package/dist/domains/manage/routes/conversations.d.ts +7 -0
  70. package/dist/domains/manage/routes/conversations.js +59 -0
  71. package/dist/domains/manage/routes/credentialStores.d.ts +9 -0
  72. package/dist/domains/manage/routes/credentialStores.js +86 -0
  73. package/dist/domains/manage/routes/credentials.d.ts +9 -0
  74. package/dist/domains/manage/routes/credentials.js +207 -0
  75. package/dist/domains/manage/routes/dataComponents.d.ts +9 -0
  76. package/dist/domains/manage/routes/dataComponents.js +192 -0
  77. package/dist/domains/manage/routes/evals/datasetItems.d.ts +9 -0
  78. package/dist/domains/manage/routes/evals/datasetItems.js +310 -0
  79. package/dist/domains/manage/routes/evals/datasetRunConfigs.d.ts +9 -0
  80. package/dist/domains/manage/routes/evals/datasetRunConfigs.js +402 -0
  81. package/dist/domains/manage/routes/evals/datasetRuns.d.ts +9 -0
  82. package/dist/domains/manage/routes/evals/datasetRuns.js +256 -0
  83. package/dist/domains/manage/routes/evals/datasets.d.ts +9 -0
  84. package/dist/domains/manage/routes/evals/datasets.js +238 -0
  85. package/dist/domains/manage/routes/evals/evaluationJobConfigEvaluatorRelations.d.ts +9 -0
  86. package/dist/domains/manage/routes/evals/evaluationJobConfigEvaluatorRelations.js +146 -0
  87. package/dist/domains/manage/routes/evals/evaluationJobConfigs.d.ts +9 -0
  88. package/dist/domains/manage/routes/evals/evaluationJobConfigs.js +364 -0
  89. package/dist/domains/manage/routes/evals/evaluationResults.d.ts +7 -0
  90. package/dist/domains/manage/routes/evals/evaluationResults.js +192 -0
  91. package/dist/domains/manage/routes/evals/evaluationRunConfigs.d.ts +9 -0
  92. package/dist/domains/manage/routes/evals/evaluationRunConfigs.js +403 -0
  93. package/dist/domains/manage/routes/evals/evaluationSuiteConfigEvaluatorRelations.d.ts +9 -0
  94. package/dist/domains/manage/routes/evals/evaluationSuiteConfigEvaluatorRelations.js +146 -0
  95. package/dist/domains/manage/routes/evals/evaluationSuiteConfigs.d.ts +9 -0
  96. package/dist/domains/manage/routes/evals/evaluationSuiteConfigs.js +246 -0
  97. package/dist/domains/manage/routes/evals/evaluators.d.ts +9 -0
  98. package/dist/domains/manage/routes/evals/evaluators.js +281 -0
  99. package/dist/domains/manage/routes/evals/index.d.ts +9 -0
  100. package/dist/domains/manage/routes/evals/index.js +26 -0
  101. package/dist/domains/manage/routes/externalAgents.d.ts +9 -0
  102. package/dist/domains/manage/routes/externalAgents.js +199 -0
  103. package/dist/domains/manage/routes/functionTools.d.ts +9 -0
  104. package/dist/domains/manage/routes/functionTools.js +256 -0
  105. package/dist/domains/manage/routes/functions.d.ts +9 -0
  106. package/dist/domains/manage/routes/functions.js +285 -0
  107. package/dist/domains/manage/routes/index.d.ts +7 -0
  108. package/dist/domains/manage/routes/index.js +68 -0
  109. package/dist/domains/manage/routes/invitations.d.ts +9 -0
  110. package/dist/domains/manage/routes/invitations.js +41 -0
  111. package/dist/domains/manage/routes/mcp.d.ts +7 -0
  112. package/dist/domains/manage/routes/mcp.js +45 -0
  113. package/dist/domains/manage/routes/mcpCatalog.d.ts +9 -0
  114. package/dist/domains/manage/routes/mcpCatalog.js +454 -0
  115. package/dist/domains/manage/routes/oauth.d.ts +10 -0
  116. package/dist/domains/manage/routes/oauth.js +327 -0
  117. package/dist/domains/manage/routes/playgroundToken.d.ts +9 -0
  118. package/dist/domains/manage/routes/playgroundToken.js +127 -0
  119. package/dist/domains/manage/routes/projectFull.d.ts +9 -0
  120. package/dist/domains/manage/routes/projectFull.js +304 -0
  121. package/dist/domains/manage/routes/projectMembers.d.ts +9 -0
  122. package/dist/domains/manage/routes/projectMembers.js +201 -0
  123. package/dist/domains/manage/routes/projectPermissions.d.ts +9 -0
  124. package/dist/domains/manage/routes/projectPermissions.js +68 -0
  125. package/dist/domains/manage/routes/projects.d.ts +9 -0
  126. package/dist/domains/manage/routes/projects.js +279 -0
  127. package/dist/domains/manage/routes/ref.d.ts +9 -0
  128. package/dist/domains/manage/routes/ref.js +33 -0
  129. package/dist/domains/manage/routes/signoz.d.ts +10 -0
  130. package/dist/domains/manage/routes/signoz.js +159 -0
  131. package/dist/domains/manage/routes/subAgentArtifactComponents.d.ts +9 -0
  132. package/dist/domains/manage/routes/subAgentArtifactComponents.js +202 -0
  133. package/dist/domains/manage/routes/subAgentDataComponents.d.ts +9 -0
  134. package/dist/domains/manage/routes/subAgentDataComponents.js +201 -0
  135. package/dist/domains/manage/routes/subAgentExternalAgentRelations.d.ts +9 -0
  136. package/dist/domains/manage/routes/subAgentExternalAgentRelations.js +216 -0
  137. package/dist/domains/manage/routes/subAgentFunctionTools.d.ts +9 -0
  138. package/dist/domains/manage/routes/subAgentFunctionTools.js +205 -0
  139. package/dist/domains/manage/routes/subAgentRelations.d.ts +9 -0
  140. package/dist/domains/manage/routes/subAgentRelations.js +263 -0
  141. package/dist/domains/manage/routes/subAgentTeamAgentRelations.d.ts +9 -0
  142. package/dist/domains/manage/routes/subAgentTeamAgentRelations.js +216 -0
  143. package/dist/domains/manage/routes/subAgentToolRelations.d.ts +9 -0
  144. package/dist/domains/manage/routes/subAgentToolRelations.js +289 -0
  145. package/dist/domains/manage/routes/subAgents.d.ts +9 -0
  146. package/dist/domains/manage/routes/subAgents.js +220 -0
  147. package/dist/domains/manage/routes/thirdPartyMCPServers.d.ts +9 -0
  148. package/dist/domains/manage/routes/thirdPartyMCPServers.js +72 -0
  149. package/dist/domains/manage/routes/tools.d.ts +9 -0
  150. package/dist/domains/manage/routes/tools.js +261 -0
  151. package/dist/domains/manage/routes/triggers.d.ts +9 -0
  152. package/dist/domains/manage/routes/triggers.js +455 -0
  153. package/dist/domains/manage/routes/userOrganizations.d.ts +9 -0
  154. package/dist/domains/manage/routes/userOrganizations.js +58 -0
  155. package/dist/domains/run/a2a/client.d.ts +186 -0
  156. package/dist/domains/run/a2a/client.js +524 -0
  157. package/dist/domains/run/a2a/handlers.d.ts +7 -0
  158. package/dist/domains/run/a2a/handlers.js +574 -0
  159. package/dist/domains/run/a2a/transfer.d.ts +27 -0
  160. package/dist/domains/run/a2a/transfer.js +50 -0
  161. package/dist/domains/run/a2a/types.d.ts +75 -0
  162. package/dist/domains/run/a2a/types.js +22 -0
  163. package/dist/domains/run/agents/Agent.d.ts +273 -0
  164. package/dist/domains/run/agents/Agent.js +2104 -0
  165. package/dist/domains/run/agents/ModelFactory.d.ts +63 -0
  166. package/dist/domains/run/agents/ModelFactory.js +194 -0
  167. package/dist/domains/run/agents/SystemPromptBuilder.d.ts +21 -0
  168. package/dist/domains/run/agents/SystemPromptBuilder.js +48 -0
  169. package/dist/domains/run/agents/ToolSessionManager.d.ts +63 -0
  170. package/dist/domains/run/agents/ToolSessionManager.js +146 -0
  171. package/dist/domains/run/agents/generateTaskHandler.d.ts +44 -0
  172. package/dist/domains/run/agents/generateTaskHandler.js +396 -0
  173. package/dist/domains/run/agents/relationTools.d.ts +64 -0
  174. package/dist/domains/run/agents/relationTools.js +365 -0
  175. package/dist/domains/run/agents/types.d.ts +31 -0
  176. package/dist/domains/run/agents/types.js +1 -0
  177. package/dist/domains/run/agents/versions/v1/Phase1Config.d.ts +29 -0
  178. package/dist/domains/run/agents/versions/v1/Phase1Config.js +458 -0
  179. package/dist/domains/run/agents/versions/v1/Phase2Config.d.ts +33 -0
  180. package/dist/domains/run/agents/versions/v1/Phase2Config.js +341 -0
  181. package/dist/domains/run/constants/execution-limits/defaults.d.ts +51 -0
  182. package/dist/domains/run/constants/execution-limits/defaults.js +52 -0
  183. package/dist/domains/run/constants/execution-limits/index.d.ts +6 -0
  184. package/dist/domains/run/constants/execution-limits/index.js +21 -0
  185. package/dist/domains/run/context/ContextFetcher.d.ts +68 -0
  186. package/dist/domains/run/context/ContextFetcher.js +276 -0
  187. package/dist/domains/run/context/ContextResolver.d.ts +56 -0
  188. package/dist/domains/run/context/ContextResolver.js +273 -0
  189. package/dist/domains/run/context/context.d.ts +19 -0
  190. package/dist/domains/run/context/context.js +108 -0
  191. package/dist/domains/run/context/contextCache.d.ts +56 -0
  192. package/dist/domains/run/context/contextCache.js +174 -0
  193. package/dist/domains/run/context/index.d.ts +6 -0
  194. package/dist/domains/run/context/index.js +7 -0
  195. package/dist/domains/run/context/validation.d.ts +39 -0
  196. package/dist/domains/run/context/validation.js +255 -0
  197. package/dist/domains/run/data/agent.d.ts +7 -0
  198. package/dist/domains/run/data/agent.js +67 -0
  199. package/dist/domains/run/data/agents.d.ts +34 -0
  200. package/dist/domains/run/data/agents.js +131 -0
  201. package/dist/domains/run/data/conversations.d.ts +129 -0
  202. package/dist/domains/run/data/conversations.js +517 -0
  203. package/dist/domains/run/handlers/executionHandler.d.ts +44 -0
  204. package/dist/domains/run/handlers/executionHandler.js +485 -0
  205. package/dist/domains/run/index.d.ts +13 -0
  206. package/dist/domains/run/index.js +21 -0
  207. package/dist/domains/run/routes/agents.d.ts +13 -0
  208. package/dist/domains/run/routes/agents.js +141 -0
  209. package/dist/domains/run/routes/chat.d.ts +14 -0
  210. package/dist/domains/run/routes/chat.js +300 -0
  211. package/dist/domains/run/routes/chatDataStream.d.ts +14 -0
  212. package/dist/domains/run/routes/chatDataStream.js +381 -0
  213. package/dist/domains/run/routes/mcp.d.ts +14 -0
  214. package/dist/domains/run/routes/mcp.js +483 -0
  215. package/dist/domains/run/routes/webhooks.d.ts +15 -0
  216. package/dist/domains/run/routes/webhooks.js +416 -0
  217. package/dist/domains/run/services/AgentSession.d.ts +354 -0
  218. package/dist/domains/run/services/AgentSession.js +1203 -0
  219. package/dist/domains/run/services/ArtifactParser.d.ts +105 -0
  220. package/dist/domains/run/services/ArtifactParser.js +338 -0
  221. package/dist/domains/run/services/ArtifactService.d.ts +122 -0
  222. package/dist/domains/run/services/ArtifactService.js +629 -0
  223. package/dist/domains/run/services/BaseCompressor.d.ts +183 -0
  224. package/dist/domains/run/services/BaseCompressor.js +500 -0
  225. package/dist/domains/run/services/ConversationCompressor.d.ts +32 -0
  226. package/dist/domains/run/services/ConversationCompressor.js +91 -0
  227. package/dist/domains/run/services/IncrementalStreamParser.d.ts +98 -0
  228. package/dist/domains/run/services/IncrementalStreamParser.js +327 -0
  229. package/dist/domains/run/services/MidGenerationCompressor.d.ts +63 -0
  230. package/dist/domains/run/services/MidGenerationCompressor.js +104 -0
  231. package/dist/domains/run/services/PendingToolApprovalManager.d.ts +62 -0
  232. package/dist/domains/run/services/PendingToolApprovalManager.js +133 -0
  233. package/dist/domains/run/services/ResponseFormatter.d.ts +39 -0
  234. package/dist/domains/run/services/ResponseFormatter.js +152 -0
  235. package/dist/domains/run/services/evaluationRunConfigMatcher.d.ts +4 -0
  236. package/dist/domains/run/services/evaluationRunConfigMatcher.js +7 -0
  237. package/dist/domains/run/tools/NativeSandboxExecutor.d.ts +38 -0
  238. package/dist/domains/run/tools/NativeSandboxExecutor.js +432 -0
  239. package/dist/domains/run/tools/SandboxExecutorFactory.d.ts +36 -0
  240. package/dist/domains/run/tools/SandboxExecutorFactory.js +80 -0
  241. package/dist/domains/run/tools/VercelSandboxExecutor.d.ts +71 -0
  242. package/dist/domains/run/tools/VercelSandboxExecutor.js +340 -0
  243. package/dist/domains/run/tools/distill-conversation-history-tool.d.ts +62 -0
  244. package/dist/domains/run/tools/distill-conversation-history-tool.js +206 -0
  245. package/dist/domains/run/tools/distill-conversation-tool.d.ts +41 -0
  246. package/dist/domains/run/tools/distill-conversation-tool.js +141 -0
  247. package/dist/domains/run/tools/sandbox-utils.d.ts +18 -0
  248. package/dist/domains/run/tools/sandbox-utils.js +53 -0
  249. package/dist/domains/run/types/chat.d.ts +27 -0
  250. package/dist/domains/run/types/chat.js +1 -0
  251. package/dist/domains/run/types/executionContext.d.ts +40 -0
  252. package/dist/domains/run/types/executionContext.js +28 -0
  253. package/dist/domains/run/types/xml.d.ts +5 -0
  254. package/dist/domains/run/utils/SchemaProcessor.d.ts +52 -0
  255. package/dist/domains/run/utils/SchemaProcessor.js +182 -0
  256. package/dist/domains/run/utils/agent-operations.d.ts +62 -0
  257. package/dist/domains/run/utils/agent-operations.js +53 -0
  258. package/dist/domains/run/utils/artifact-component-schema.d.ts +42 -0
  259. package/dist/domains/run/utils/artifact-component-schema.js +186 -0
  260. package/dist/domains/run/utils/cleanup.d.ts +21 -0
  261. package/dist/domains/run/utils/cleanup.js +59 -0
  262. package/dist/domains/run/utils/data-component-schema.d.ts +2 -0
  263. package/dist/domains/run/utils/data-component-schema.js +3 -0
  264. package/dist/domains/run/utils/default-status-schemas.d.ts +20 -0
  265. package/dist/domains/run/utils/default-status-schemas.js +24 -0
  266. package/dist/domains/run/utils/json-postprocessor.d.ts +13 -0
  267. package/dist/domains/run/utils/json-postprocessor.js +19 -0
  268. package/dist/domains/run/utils/model-context-utils.d.ts +39 -0
  269. package/dist/domains/run/utils/model-context-utils.js +181 -0
  270. package/dist/domains/run/utils/model-resolver.d.ts +6 -0
  271. package/dist/domains/run/utils/model-resolver.js +24 -0
  272. package/dist/domains/run/utils/project.d.ts +207 -0
  273. package/dist/domains/run/utils/project.js +315 -0
  274. package/dist/domains/run/utils/schema-validation.d.ts +44 -0
  275. package/dist/domains/run/utils/schema-validation.js +97 -0
  276. package/dist/domains/run/utils/stream-helpers.d.ts +193 -0
  277. package/dist/domains/run/utils/stream-helpers.js +510 -0
  278. package/dist/domains/run/utils/stream-registry.d.ts +22 -0
  279. package/dist/domains/run/utils/stream-registry.js +33 -0
  280. package/dist/domains/run/utils/token-estimator.d.ts +23 -0
  281. package/dist/domains/run/utils/token-estimator.js +17 -0
  282. package/dist/domains/run/utils/tracer.d.ts +7 -0
  283. package/dist/domains/run/utils/tracer.js +7 -0
  284. package/dist/env.d.ts +89 -0
  285. package/dist/env.js +69 -0
  286. package/dist/factory.d.ts +1535 -0
  287. package/dist/factory.js +42 -0
  288. package/dist/index.d.ts +1530 -0
  289. package/dist/index.js +59 -0
  290. package/dist/initialization.d.ts +6 -0
  291. package/dist/initialization.js +65 -0
  292. package/dist/instrumentation.d.ts +17 -0
  293. package/dist/instrumentation.js +68 -0
  294. package/dist/logger.d.ts +2 -0
  295. package/dist/logger.js +3 -0
  296. package/dist/middleware/branchScopedDb.d.ts +31 -0
  297. package/dist/middleware/branchScopedDb.js +137 -0
  298. package/dist/middleware/cors.d.ts +36 -0
  299. package/dist/middleware/cors.js +131 -0
  300. package/dist/middleware/errorHandler.d.ts +12 -0
  301. package/dist/middleware/errorHandler.js +88 -0
  302. package/dist/middleware/evalsAuth.d.ts +16 -0
  303. package/dist/middleware/evalsAuth.js +52 -0
  304. package/dist/middleware/index.d.ts +8 -0
  305. package/dist/middleware/index.js +9 -0
  306. package/dist/middleware/manageAuth.d.ts +25 -0
  307. package/dist/middleware/manageAuth.js +80 -0
  308. package/dist/middleware/projectAccess.d.ts +31 -0
  309. package/dist/middleware/projectAccess.js +118 -0
  310. package/dist/middleware/projectConfig.d.ts +25 -0
  311. package/dist/middleware/projectConfig.js +89 -0
  312. package/dist/middleware/ref.d.ts +61 -0
  313. package/dist/middleware/ref.js +239 -0
  314. package/dist/middleware/requirePermission.d.ts +14 -0
  315. package/dist/middleware/requirePermission.js +80 -0
  316. package/dist/middleware/runAuth.d.ts +29 -0
  317. package/dist/middleware/runAuth.js +253 -0
  318. package/dist/middleware/sessionAuth.d.ts +17 -0
  319. package/dist/middleware/sessionAuth.js +58 -0
  320. package/dist/middleware/tenantAccess.d.ts +22 -0
  321. package/dist/middleware/tenantAccess.js +63 -0
  322. package/dist/middleware/tracing.d.ts +7 -0
  323. package/dist/middleware/tracing.js +50 -0
  324. package/dist/openapi.d.ts +7 -0
  325. package/dist/openapi.js +156 -0
  326. package/dist/ssoHelpers.d.ts +20 -0
  327. package/dist/ssoHelpers.js +51 -0
  328. package/dist/templates/v1/phase1/system-prompt.js +5 -0
  329. package/dist/templates/v1/phase1/thinking-preparation.js +5 -0
  330. package/dist/templates/v1/phase1/tool.js +5 -0
  331. package/dist/templates/v1/phase2/data-component.js +5 -0
  332. package/dist/templates/v1/phase2/data-components.js +5 -0
  333. package/dist/templates/v1/phase2/system-prompt.js +5 -0
  334. package/dist/templates/v1/shared/artifact-retrieval-guidance.js +5 -0
  335. package/dist/templates/v1/shared/artifact.js +5 -0
  336. package/dist/types/app.d.ts +64 -0
  337. package/dist/types/app.js +1 -0
  338. package/dist/types/index.d.ts +2 -0
  339. package/dist/types/index.js +1 -0
  340. package/dist/types/runExecutionContext.d.ts +25 -0
  341. package/dist/types/runExecutionContext.js +28 -0
  342. package/dist/utils/oauthService.d.ts +71 -0
  343. package/dist/utils/oauthService.js +106 -0
  344. package/dist/utils/signozHelpers.d.ts +9 -0
  345. package/dist/utils/signozHelpers.js +33 -0
  346. package/dist/utils/speakeasy.d.ts +93 -0
  347. package/dist/utils/speakeasy.js +44 -0
  348. package/dist/utils/tempApiKeys.d.ts +17 -0
  349. package/dist/utils/tempApiKeys.js +26 -0
  350. package/dist/utils/workflowApiHelpers.d.ts +1 -0
  351. package/dist/utils/workflowApiHelpers.js +1 -0
  352. package/package.json +125 -0
@@ -0,0 +1,1203 @@
1
+ import { getLogger as getLogger$1 } from "../../../logger.js";
2
+ import runDbClient_default from "../../../data/db/runDbClient.js";
3
+ import { ARTIFACT_GENERATION_BACKOFF_INITIAL_MS, ARTIFACT_GENERATION_BACKOFF_MAX_MS, ARTIFACT_GENERATION_MAX_RETRIES, ARTIFACT_SESSION_MAX_PENDING, ARTIFACT_SESSION_MAX_PREVIOUS_SUMMARIES, STATUS_UPDATE_DEFAULT_INTERVAL_SECONDS, STATUS_UPDATE_DEFAULT_NUM_EVENTS } from "../constants/execution-limits/index.js";
4
+ import { toolSessionManager } from "../agents/ToolSessionManager.js";
5
+ import { setSpanWithError as setSpanWithError$1, tracer } from "../utils/tracer.js";
6
+ import { getFormattedConversationHistory } from "../data/conversations.js";
7
+ import { defaultStatusSchemas } from "../utils/default-status-schemas.js";
8
+ import { getStreamHelper } from "../utils/stream-registry.js";
9
+ import { ArtifactService } from "./ArtifactService.js";
10
+ import { ArtifactParser } from "./ArtifactParser.js";
11
+ import { z } from "@hono/zod-openapi";
12
+ import { CONVERSATION_HISTORY_DEFAULT_LIMIT, CONVERSATION_HISTORY_MAX_OUTPUT_TOKENS_DEFAULT, ModelFactory, getLedgerArtifacts } from "@inkeep/agents-core";
13
+ import { Output, generateText } from "ai";
14
+ import { SpanStatusCode } from "@opentelemetry/api";
15
+
16
+ //#region src/domains/run/services/AgentSession.ts
17
+ const logger = getLogger$1("AgentSession");
18
+ /**
19
+ * Tracks all agent operations and interactions for a single message
20
+ * Now includes intelligent status update functionality
21
+ */
22
+ var AgentSession = class {
23
+ events = [];
24
+ statusUpdateState;
25
+ statusUpdateTimer;
26
+ previousSummaries = [];
27
+ isEnded = false;
28
+ isTextStreaming = false;
29
+ isGeneratingUpdate = false;
30
+ pendingArtifacts = /* @__PURE__ */ new Set();
31
+ artifactProcessingErrors = /* @__PURE__ */ new Map();
32
+ MAX_ARTIFACT_RETRIES = ARTIFACT_GENERATION_MAX_RETRIES;
33
+ MAX_PENDING_ARTIFACTS = ARTIFACT_SESSION_MAX_PENDING;
34
+ scheduledTimeouts;
35
+ artifactCache = /* @__PURE__ */ new Map();
36
+ artifactService;
37
+ artifactParser;
38
+ isEmitOperations = false;
39
+ constructor(sessionId, messageId, executionContext, contextId) {
40
+ this.sessionId = sessionId;
41
+ this.messageId = messageId;
42
+ this.executionContext = executionContext;
43
+ this.contextId = contextId;
44
+ logger.debug({
45
+ sessionId,
46
+ messageId,
47
+ agentId: executionContext.agentId
48
+ }, "AgentSession created");
49
+ if (executionContext.tenantId && executionContext.projectId) {
50
+ toolSessionManager.createSessionWithId(sessionId, executionContext.tenantId, executionContext.projectId, contextId || "default", `task_${contextId}-${messageId}`);
51
+ this.artifactService = new ArtifactService({
52
+ executionContext,
53
+ sessionId,
54
+ contextId,
55
+ taskId: `task_${contextId}-${messageId}`,
56
+ streamRequestId: sessionId
57
+ });
58
+ this.artifactParser = new ArtifactParser(executionContext, {
59
+ sessionId,
60
+ contextId,
61
+ taskId: `task_${contextId}-${messageId}`,
62
+ streamRequestId: sessionId,
63
+ artifactService: this.artifactService
64
+ });
65
+ }
66
+ this.executionContext = executionContext;
67
+ }
68
+ /**
69
+ * Enable emit operations to send data operations
70
+ */
71
+ enableEmitOperations() {
72
+ this.isEmitOperations = true;
73
+ logger.info({ sessionId: this.sessionId }, "🔍 DEBUG: Emit operations enabled for AgentSession");
74
+ }
75
+ /**
76
+ * Send data operation to stream when emit operations is enabled
77
+ */
78
+ async sendDataOperation(event) {
79
+ try {
80
+ const streamHelper = getStreamHelper(this.sessionId);
81
+ if (streamHelper) {
82
+ const formattedOperation = {
83
+ type: event.eventType,
84
+ label: this.generateEventLabel(event),
85
+ details: {
86
+ timestamp: event.timestamp,
87
+ subAgentId: event.subAgentId,
88
+ data: event.data
89
+ }
90
+ };
91
+ await streamHelper.writeOperation(formattedOperation);
92
+ }
93
+ } catch (error) {
94
+ logger.error({
95
+ sessionId: this.sessionId,
96
+ eventType: event.eventType,
97
+ error: error instanceof Error ? error.message : error
98
+ }, "❌ DEBUG: Failed to send data operation");
99
+ }
100
+ }
101
+ /**
102
+ * Generate human-readable labels for events
103
+ */
104
+ generateEventLabel(event) {
105
+ switch (event.eventType) {
106
+ case "agent_generate": return `Agent ${event.subAgentId} generating response`;
107
+ case "agent_reasoning": return `Agent ${event.subAgentId} reasoning through request`;
108
+ case "tool_call": return `Tool call: ${event.data.toolName || "unknown"}`;
109
+ case "tool_result": {
110
+ const status = event.data.error ? "failed" : "completed";
111
+ return `Tool result: ${event.data.toolName || "unknown"} (${status})`;
112
+ }
113
+ case "error": return `Error: ${event.data.message}`;
114
+ case "transfer": return `Agent transfer: ${event.data.fromSubAgent} → ${event.data.targetSubAgent}`;
115
+ case "delegation_sent": return `Task delegated: ${event.data.fromSubAgent} → ${event.data.targetSubAgent}`;
116
+ case "delegation_returned": return `Task completed: ${event.data.targetSubAgent} → ${event.data.fromSubAgent}`;
117
+ case "artifact_saved": return `Artifact saved: ${event.data.artifactType || "unknown type"}`;
118
+ case "compression": return `Compressed ${event.data.messageCount} messages and ${event.data.artifactCount} artifacts (${event.data.reason})`;
119
+ default: return `${event.eventType} event`;
120
+ }
121
+ }
122
+ /**
123
+ * Initialize status updates for this session
124
+ */
125
+ initializeStatusUpdates(config, summarizerModel, baseModel) {
126
+ const now = Date.now();
127
+ this.statusUpdateState = {
128
+ lastUpdateTime: now,
129
+ lastEventCount: 0,
130
+ startTime: now,
131
+ summarizerModel,
132
+ baseModel,
133
+ config: {
134
+ numEvents: config.numEvents || STATUS_UPDATE_DEFAULT_NUM_EVENTS,
135
+ timeInSeconds: config.timeInSeconds || STATUS_UPDATE_DEFAULT_INTERVAL_SECONDS,
136
+ ...config
137
+ }
138
+ };
139
+ if (this.statusUpdateState.config.timeInSeconds) {
140
+ this.statusUpdateTimer = setInterval(async () => {
141
+ if (!this.statusUpdateState || this.isEnded) {
142
+ logger.debug({ sessionId: this.sessionId }, "Timer triggered but session already cleaned up or ended");
143
+ if (this.statusUpdateTimer) {
144
+ clearInterval(this.statusUpdateTimer);
145
+ this.statusUpdateTimer = void 0;
146
+ }
147
+ return;
148
+ }
149
+ await this.checkAndSendTimeBasedUpdate();
150
+ }, this.statusUpdateState.config.timeInSeconds * 1e3);
151
+ logger.info({
152
+ sessionId: this.sessionId,
153
+ intervalMs: this.statusUpdateState.config.timeInSeconds * 1e3
154
+ }, "Time-based status update timer started");
155
+ }
156
+ }
157
+ /**
158
+ * Record an event in the session and trigger status updates if configured
159
+ * Generic type parameter T ensures eventType and data are correctly paired
160
+ */
161
+ recordEvent(eventType, subAgentId, data) {
162
+ if (this.isEmitOperations) {
163
+ const dataOpEvent = {
164
+ timestamp: Date.now(),
165
+ eventType,
166
+ subAgentId,
167
+ data
168
+ };
169
+ this.sendDataOperation(dataOpEvent);
170
+ }
171
+ if (this.isEnded) {
172
+ logger.debug({
173
+ sessionId: this.sessionId,
174
+ eventType,
175
+ subAgentId
176
+ }, "Event received after session ended - ignoring");
177
+ return;
178
+ }
179
+ const event = {
180
+ timestamp: Date.now(),
181
+ eventType,
182
+ subAgentId,
183
+ data
184
+ };
185
+ this.events.push(event);
186
+ if (eventType === "artifact_saved") {
187
+ const artifactData = data;
188
+ if (artifactData.pendingGeneration) {
189
+ const artifactId = artifactData.artifactId;
190
+ if (this.pendingArtifacts.size >= this.MAX_PENDING_ARTIFACTS) {
191
+ logger.warn({
192
+ sessionId: this.sessionId,
193
+ artifactId,
194
+ pendingCount: this.pendingArtifacts.size,
195
+ maxAllowed: this.MAX_PENDING_ARTIFACTS
196
+ }, "Too many pending artifacts, skipping processing");
197
+ return;
198
+ }
199
+ this.pendingArtifacts.add(artifactId);
200
+ setImmediate(() => {
201
+ const artifactDataWithAgent = {
202
+ ...artifactData,
203
+ subAgentId
204
+ };
205
+ this.processArtifact(artifactDataWithAgent).then(() => {
206
+ this.pendingArtifacts.delete(artifactId);
207
+ this.artifactProcessingErrors.delete(artifactId);
208
+ }).catch((error) => {
209
+ const errorCount = (this.artifactProcessingErrors.get(artifactId) || 0) + 1;
210
+ this.artifactProcessingErrors.set(artifactId, errorCount);
211
+ if (errorCount >= this.MAX_ARTIFACT_RETRIES) {
212
+ this.pendingArtifacts.delete(artifactId);
213
+ logger.error({
214
+ sessionId: this.sessionId,
215
+ artifactId,
216
+ errorCount,
217
+ maxRetries: this.MAX_ARTIFACT_RETRIES,
218
+ error: error instanceof Error ? error.message : "Unknown error",
219
+ stack: error instanceof Error ? error.stack : void 0
220
+ }, "Artifact processing failed after max retries, giving up");
221
+ } else logger.warn({
222
+ sessionId: this.sessionId,
223
+ artifactId,
224
+ errorCount,
225
+ error: error instanceof Error ? error.message : "Unknown error"
226
+ }, "Artifact processing failed, may retry");
227
+ });
228
+ });
229
+ }
230
+ }
231
+ if (!this.isEnded) this.checkStatusUpdates();
232
+ }
233
+ /**
234
+ * Check and send status updates if configured (async, non-blocking)
235
+ */
236
+ checkStatusUpdates() {
237
+ if (this.isEnded) {
238
+ logger.debug({ sessionId: this.sessionId }, "Session has ended - skipping status update check");
239
+ return;
240
+ }
241
+ if (!this.statusUpdateState) {
242
+ logger.debug({ sessionId: this.sessionId }, "No status update state - skipping check");
243
+ return;
244
+ }
245
+ const statusUpdateState = this.statusUpdateState;
246
+ this.scheduleStatusUpdateCheck(statusUpdateState);
247
+ }
248
+ /**
249
+ * Check and send time-based status updates
250
+ */
251
+ async checkAndSendTimeBasedUpdate() {
252
+ if (this.isEnded) {
253
+ logger.debug({ sessionId: this.sessionId }, "Session has ended - skipping time-based update");
254
+ return;
255
+ }
256
+ if (!this.statusUpdateState) {
257
+ logger.debug({ sessionId: this.sessionId }, "No status updates configured for time-based check");
258
+ return;
259
+ }
260
+ if (this.events.length - this.statusUpdateState.lastEventCount === 0) return;
261
+ try {
262
+ await this.generateAndSendUpdate();
263
+ } catch (error) {
264
+ logger.error({
265
+ sessionId: this.sessionId,
266
+ error: error instanceof Error ? error.message : "Unknown error"
267
+ }, "Failed to send time-based status update");
268
+ }
269
+ }
270
+ /**
271
+ * Get all events in chronological order
272
+ */
273
+ getEvents() {
274
+ return [...this.events];
275
+ }
276
+ /**
277
+ * Get events filtered by type
278
+ */
279
+ getEventsByType(eventType) {
280
+ return this.events.filter((event) => event.eventType === eventType);
281
+ }
282
+ /**
283
+ * Get events filtered by agent
284
+ */
285
+ getEventsByAgent(subAgentId) {
286
+ return this.events.filter((event) => event.subAgentId === subAgentId);
287
+ }
288
+ /**
289
+ * Get summary of session activity
290
+ */
291
+ getSummary() {
292
+ const eventCounts = this.events.reduce((counts, event) => {
293
+ counts[event.eventType] = (counts[event.eventType] || 0) + 1;
294
+ return counts;
295
+ }, {});
296
+ const agentCounts = this.events.reduce((counts, event) => {
297
+ counts[event.subAgentId] = (counts[event.subAgentId] || 0) + 1;
298
+ return counts;
299
+ }, {});
300
+ return {
301
+ sessionId: this.sessionId,
302
+ messageId: this.messageId,
303
+ agentId: this.executionContext.agentId,
304
+ totalEvents: this.events.length,
305
+ eventCounts,
306
+ agentCounts,
307
+ startTime: this.events[0]?.timestamp,
308
+ endTime: this.events[this.events.length - 1]?.timestamp,
309
+ duration: this.events.length > 0 ? this.events[this.events.length - 1].timestamp - this.events[0].timestamp : 0
310
+ };
311
+ }
312
+ /**
313
+ * Mark that text streaming has started (to suppress status updates)
314
+ */
315
+ setTextStreaming(isStreaming) {
316
+ this.isTextStreaming = isStreaming;
317
+ }
318
+ /**
319
+ * Check if text is currently being streamed
320
+ */
321
+ isCurrentlyStreaming() {
322
+ return this.isTextStreaming;
323
+ }
324
+ /**
325
+ * Clean up status update resources when session ends
326
+ */
327
+ async cleanup() {
328
+ this.isEnded = true;
329
+ if (this.statusUpdateTimer) {
330
+ clearInterval(this.statusUpdateTimer);
331
+ this.statusUpdateTimer = void 0;
332
+ }
333
+ this.statusUpdateState = void 0;
334
+ if (this.pendingArtifacts.size > 0) {
335
+ const maxWaitTime = 1e4;
336
+ const startTime = Date.now();
337
+ while (this.pendingArtifacts.size > 0 && Date.now() - startTime < maxWaitTime) await new Promise((resolve) => setTimeout(resolve, 100));
338
+ if (this.pendingArtifacts.size > 0) logger.warn({
339
+ sessionId: this.sessionId,
340
+ pendingCount: this.pendingArtifacts.size,
341
+ pendingIds: Array.from(this.pendingArtifacts)
342
+ }, "Cleanup proceeding with pending artifacts still processing");
343
+ }
344
+ this.pendingArtifacts.clear();
345
+ this.artifactProcessingErrors.clear();
346
+ this.artifactCache.clear();
347
+ if (this.sessionId) toolSessionManager.endSession(this.sessionId);
348
+ if (this.scheduledTimeouts) {
349
+ for (const timeoutId of this.scheduledTimeouts) clearTimeout(timeoutId);
350
+ this.scheduledTimeouts.clear();
351
+ }
352
+ if (this.artifactService) {
353
+ this.artifactService.constructor.clearCaches();
354
+ this.artifactService = void 0;
355
+ } else ArtifactService.clearCaches();
356
+ }
357
+ /**
358
+ * Generate and send a status update using agent-level summarizer
359
+ */
360
+ async generateAndSendUpdate() {
361
+ if (this.isEnded) {
362
+ logger.debug({ sessionId: this.sessionId }, "Session has ended - not generating update");
363
+ return;
364
+ }
365
+ if (this.isTextStreaming) {
366
+ logger.debug({ sessionId: this.sessionId }, "Text is currently streaming - skipping status update");
367
+ return;
368
+ }
369
+ if (this.isGeneratingUpdate) {
370
+ logger.debug({ sessionId: this.sessionId }, "Update already in progress - skipping duplicate generation");
371
+ return;
372
+ }
373
+ if (!this.statusUpdateState) {
374
+ logger.warn({ sessionId: this.sessionId }, "No status update state - cannot generate update");
375
+ return;
376
+ }
377
+ if (!this.executionContext.agentId) {
378
+ logger.warn({ sessionId: this.sessionId }, "No agent ID - cannot generate update");
379
+ return;
380
+ }
381
+ if (this.events.length - this.statusUpdateState.lastEventCount === 0) return;
382
+ this.isGeneratingUpdate = true;
383
+ const statusUpdateState = this.statusUpdateState;
384
+ try {
385
+ const streamHelper = getStreamHelper(this.sessionId);
386
+ if (!streamHelper) {
387
+ logger.warn({ sessionId: this.sessionId }, "No stream helper found - cannot send status update");
388
+ this.isGeneratingUpdate = false;
389
+ return;
390
+ }
391
+ const now = Date.now();
392
+ const elapsedTime = now - statusUpdateState.startTime;
393
+ const statusComponents = statusUpdateState.config.statusComponents && statusUpdateState.config.statusComponents.length > 0 ? statusUpdateState.config.statusComponents : defaultStatusSchemas;
394
+ const result = await this.generateStructuredStatusUpdate(this.events.slice(statusUpdateState.lastEventCount), elapsedTime, statusComponents, statusUpdateState.summarizerModel, this.previousSummaries);
395
+ if (result.summaries && result.summaries.length > 0) {
396
+ for (const summary of result.summaries) {
397
+ if (!summary || !summary.type || !summary.data || !summary.data.label || Object.keys(summary.data).length === 0) {
398
+ logger.warn({
399
+ sessionId: this.sessionId,
400
+ summary
401
+ }, "Skipping empty or invalid structured operation");
402
+ continue;
403
+ }
404
+ const summaryToSend = {
405
+ type: summary.data.type || summary.type,
406
+ label: summary.data.label,
407
+ details: Object.fromEntries(Object.entries(summary.data).filter(([key]) => !["label", "type"].includes(key)))
408
+ };
409
+ await streamHelper.writeSummary(summaryToSend);
410
+ }
411
+ const summaryTexts = result.summaries.map((summary) => JSON.stringify({
412
+ type: summary.type,
413
+ data: summary.data
414
+ }));
415
+ this.previousSummaries.push(...summaryTexts);
416
+ if (this.statusUpdateState) {
417
+ this.statusUpdateState.lastUpdateTime = now;
418
+ this.statusUpdateState.lastEventCount = this.events.length;
419
+ }
420
+ return;
421
+ }
422
+ if (this.previousSummaries.length > ARTIFACT_SESSION_MAX_PREVIOUS_SUMMARIES) this.previousSummaries.shift();
423
+ if (this.statusUpdateState) {
424
+ this.statusUpdateState.lastUpdateTime = now;
425
+ this.statusUpdateState.lastEventCount = this.events.length;
426
+ }
427
+ } catch (error) {
428
+ logger.error({
429
+ sessionId: this.sessionId,
430
+ error: error instanceof Error ? error.message : "Unknown error",
431
+ stack: error instanceof Error ? error.stack : void 0
432
+ }, "❌ Failed to generate status update");
433
+ } finally {
434
+ this.isGeneratingUpdate = false;
435
+ }
436
+ }
437
+ /**
438
+ * Schedule status update check without setImmediate race conditions
439
+ */
440
+ scheduleStatusUpdateCheck(statusUpdateState) {
441
+ const timeoutId = setTimeout(async () => {
442
+ try {
443
+ if (this.isEnded || !this.statusUpdateState) return;
444
+ if (!this.acquireUpdateLock()) return;
445
+ try {
446
+ if (this.isEnded || !statusUpdateState || this.isTextStreaming) return;
447
+ const currentEventCount = this.events.length;
448
+ const numEventsThreshold = statusUpdateState.config.numEvents;
449
+ if (numEventsThreshold && currentEventCount >= statusUpdateState.lastEventCount + numEventsThreshold) await this.generateAndSendUpdate();
450
+ } finally {
451
+ this.releaseUpdateLock();
452
+ }
453
+ } catch (error) {
454
+ logger.error({
455
+ sessionId: this.sessionId,
456
+ error: error instanceof Error ? error.message : "Unknown error"
457
+ }, "Failed to check status updates during event recording");
458
+ this.releaseUpdateLock();
459
+ }
460
+ }, 0);
461
+ if (!this.scheduledTimeouts) this.scheduledTimeouts = /* @__PURE__ */ new Set();
462
+ this.scheduledTimeouts.add(timeoutId);
463
+ setTimeout(() => {
464
+ if (this.scheduledTimeouts) this.scheduledTimeouts.delete(timeoutId);
465
+ }, 1e3);
466
+ }
467
+ /**
468
+ * Acquire update lock with atomic check
469
+ */
470
+ acquireUpdateLock() {
471
+ if (this.statusUpdateState?.updateLock) return false;
472
+ if (this.statusUpdateState) this.statusUpdateState.updateLock = true;
473
+ return true;
474
+ }
475
+ /**
476
+ * Release update lock
477
+ */
478
+ releaseUpdateLock() {
479
+ if (this.statusUpdateState) this.statusUpdateState.updateLock = false;
480
+ }
481
+ /**
482
+ * Generate structured status update using configured data components
483
+ */
484
+ async generateStructuredStatusUpdate(newEvents, elapsedTime, statusComponents, summarizerModel, previousSummaries = []) {
485
+ const { tenantId, projectId } = this.executionContext;
486
+ return tracer.startActiveSpan("agent_session.generate_structured_update", { attributes: {
487
+ "agent_session.id": this.sessionId,
488
+ "events.count": newEvents.length,
489
+ "elapsed_time.seconds": Math.round(elapsedTime / 1e3),
490
+ "llm.model": summarizerModel?.model,
491
+ "status_components.count": statusComponents.length,
492
+ "previous_summaries.count": previousSummaries.length
493
+ } }, async (span) => {
494
+ try {
495
+ const userVisibleActivities = this.extractUserVisibleActivities(newEvents);
496
+ let conversationContext = "";
497
+ if (tenantId && projectId) try {
498
+ const conversationHistory = await getFormattedConversationHistory({
499
+ tenantId,
500
+ projectId,
501
+ conversationId: this.contextId || "default",
502
+ options: {
503
+ limit: CONVERSATION_HISTORY_DEFAULT_LIMIT,
504
+ maxOutputTokens: CONVERSATION_HISTORY_MAX_OUTPUT_TOKENS_DEFAULT,
505
+ includeInternal: true,
506
+ messageTypes: ["chat", "tool-result"]
507
+ },
508
+ filters: {}
509
+ });
510
+ conversationContext = conversationHistory.trim() ? `\nUser's Question/Context:\n${conversationHistory}\n` : "";
511
+ } catch (error) {
512
+ logger.warn({
513
+ sessionId: this.sessionId,
514
+ error
515
+ }, "Failed to fetch conversation history for structured status update");
516
+ }
517
+ const previousSummaryContext = previousSummaries.length > 0 ? `\nPrevious updates sent to user:\n${previousSummaries.map((s, i) => `${i + 1}. ${s}`).join("\n")}\n` : "";
518
+ const selectionSchema = z.object({ updates: z.array(z.union([z.object({
519
+ type: z.literal("no_relevant_updates"),
520
+ data: z.object({ no_updates: z.boolean().default(true) }).describe("Use when nothing substantially new to report. Should only use on its own.")
521
+ }), ...statusComponents.map((component) => z.object({
522
+ type: z.literal(component.type),
523
+ data: this.getComponentSchema(component).describe(component.description || component.type)
524
+ }))])) });
525
+ const prompt = `Generate status updates for relevant components based on what the user has asked for.${conversationContext}${previousSummaries.length > 0 ? `\n${previousSummaryContext}` : ""}
526
+
527
+ Activities:\n${userVisibleActivities.join("\n") || "No New Activities"}
528
+
529
+ Available component types: no_relevant_updates, ${statusComponents.map((c) => c.type).join(", ")}
530
+
531
+ Rules:
532
+ - Return an array of updates for relevant components
533
+ - Use 'no_relevant_updates' type if nothing substantially new to report. DO NOT INCLUDE OTHER COMPONENT TYPES IF YOU USE THIS ONE.
534
+ - Never repeat previous values, make every update EXTREMELY unique. If you cannot do that the update is not worth mentioning.
535
+ - Labels MUST be short 3-7 word phrases with ACTUAL information discovered. NEVER MAKE UP SOMETHING WITHOUT BACKING IT UP WITH ACTUAL INFORMATION.
536
+ - Use sentence case: only capitalize the first word and proper nouns (e.g., "Admin permissions required", not "Admin Permissions Required"). ALWAYS capitalize the first word of the label.
537
+ - DO NOT use action words like "Searching", "Processing", "Analyzing" - state what was FOUND
538
+ - Include specific details, numbers, requirements, or insights discovered
539
+ - Examples: "Admin permissions required", "Three OAuth steps found", "Token expires daily"
540
+
541
+ CRITICAL - HIDE ALL INTERNAL SYSTEM OPERATIONS:
542
+ - You are ONE unified AI system presenting results to the user
543
+ - ABSOLUTELY FORBIDDEN WORDS/PHRASES: "transfer", "transferring", "delegation", "delegating", "delegate", "agent", "routing", "route", "artifact", "saving artifact", "stored artifact", "artifact saved", "continuing", "passing to", "handing off", "switching to"
544
+ - NEVER reveal internal architecture: No mentions of different agents, components, systems, or modules working together
545
+ - NEVER mention artifact operations: Users don't need to know about data being saved, stored, or organized internally
546
+ - NEVER describe transfers or transitions: Present everything as one seamless operation
547
+ - If you see "transfer", "delegation_sent", "delegation_returned", or "artifact_saved" events - IGNORE THEM or translate to user-facing information only
548
+ - Focus ONLY on actual discoveries, findings, and results that matter to the user
549
+
550
+ - Bad examples:
551
+ * "Transferring to search agent"
552
+ * "Delegating research task"
553
+ * "Routing to QA specialist"
554
+ * "Artifact saved successfully"
555
+ * "Storing results for later"
556
+ * "Passing request to tool handler"
557
+ * "Continuing with analysis"
558
+ * "Handing off to processor"
559
+ - Good examples:
560
+ * "Slack bot needs admin privileges"
561
+ * "Found 3-step OAuth flow required"
562
+ * "Channel limit is 500 per workspace"
563
+ * Use no_relevant_updates if nothing new to report
564
+
565
+ CRITICAL ANTI-HALLUCINATION RULES:
566
+ - NEVER MAKE UP SOMETHING WITHOUT BACKING IT UP WITH ACTUAL INFORMATION. EVERY SINGLE UPDATE MUST BE BACKED UP WITH ACTUAL INFORMATION.
567
+ - DO NOT MAKE UP PEOPLE, NAMES, PLACES, THINGS, ORGANIZATIONS, OR INFORMATION. IT IS OBVIOUS WHEN A PERSON/ENTITY DOES NOT EXIST.
568
+ - Only report facts that are EXPLICITLY mentioned in the activities or tool results
569
+ - If you don't have concrete information about something, DO NOT mention it
570
+ - Never invent names like "John Doe", "Alice", "Bob", or any other placeholder names
571
+ - Never create fictional companies, products, or services
572
+ - If a tool returned no results or an error, DO NOT pretend it found something
573
+ - Every detail in your status update must be traceable back to the actual activities provided
574
+
575
+ REMEMBER YOU CAN ONLY USE 'no_relevant_updates' ALONE! IT CANNOT BE CONCATENATED WITH OTHER STATUS UPDATES!
576
+
577
+ ${this.statusUpdateState?.config.prompt?.trim() || ""}`;
578
+ let modelToUse = summarizerModel;
579
+ if (!summarizerModel?.model?.trim()) {
580
+ if (!this.statusUpdateState?.baseModel?.model?.trim()) throw new Error("Either summarizer or base model is required for status update generation. Please configure models at the project level.");
581
+ modelToUse = this.statusUpdateState.baseModel;
582
+ }
583
+ if (!modelToUse) throw new Error("No model configuration available");
584
+ const { output: object } = await generateText({
585
+ model: ModelFactory.createModel(modelToUse),
586
+ prompt,
587
+ output: Output.object({ schema: selectionSchema }),
588
+ experimental_telemetry: {
589
+ isEnabled: true,
590
+ functionId: `structured_update_${this.sessionId}`,
591
+ recordInputs: true,
592
+ recordOutputs: true,
593
+ metadata: {
594
+ operation: "structured_status_update_generation",
595
+ sessionId: this.sessionId
596
+ }
597
+ }
598
+ });
599
+ const result = object;
600
+ logger.info({ result: JSON.stringify(result) }, "DEBUG: Result");
601
+ const summaries = [];
602
+ const updates = result.updates || [];
603
+ for (const update of updates) {
604
+ logger.info({ update: JSON.stringify(update) }, "DEBUG: Update data");
605
+ if (update.type === "no_relevant_updates") continue;
606
+ if (update.data && typeof update.data === "object" && Object.keys(update.data).length > 0) summaries.push({
607
+ type: update.type,
608
+ data: update.data
609
+ });
610
+ }
611
+ span.setAttributes({
612
+ "summaries.count": summaries.length,
613
+ "user_activities.count": userVisibleActivities.length,
614
+ "updates.count": updates.length
615
+ });
616
+ span.setStatus({ code: SpanStatusCode.OK });
617
+ return { summaries };
618
+ } catch (error) {
619
+ setSpanWithError$1(span, error instanceof Error ? error : new Error(String(error)));
620
+ logger.error({ error }, "Failed to generate structured update, using fallback");
621
+ return { summaries: [] };
622
+ } finally {
623
+ span.end();
624
+ }
625
+ });
626
+ }
627
+ /**
628
+ * Build Zod schema from JSON schema configuration or use pre-defined schemas
629
+ */
630
+ getComponentSchema(component) {
631
+ if (component.detailsSchema && "properties" in component.detailsSchema) return this.buildZodSchemaFromJson(component.detailsSchema);
632
+ return z.object({ label: z.string().describe("A short 3-5 word phrase, that is a descriptive label for the update component. This Label must be EXTREMELY unique to represent the UNIQUE update we are providing. The ACTUAL finding or result, not the action. What specific information was discovered? (e.g., \"Slack requires OAuth 2.0 setup\", \"Found 5 integration methods\", \"API rate limit is 100/minute\"). Include the actual detail or insight, not just that you searched or processed. CRITICAL: Only use facts explicitly found in the activities - NEVER invent names, people, organizations, or details that are not present in the actual tool results.") });
633
+ }
634
+ /**
635
+ * Build Zod schema from JSON schema with improved type handling
636
+ */
637
+ buildZodSchemaFromJson(jsonSchema) {
638
+ const properties = {};
639
+ properties.label = z.string().describe("A short 3-5 word phrase, that is a descriptive label for the update component. This Label must be EXTREMELY unique to represent the UNIQUE update we are providing. The SPECIFIC finding, result, or insight discovered (e.g., \"Slack bot needs workspace admin role\", \"Found ingestion requires 3 steps\", \"Channel history limited to 10k messages\"). State the ACTUAL information found, not that you searched. What did you LEARN or DISCOVER? What specific detail is now known? CRITICAL: Only use facts explicitly found in the activities - NEVER invent names, people, organizations, or details that are not present in the actual tool results.");
640
+ for (const [key, value] of Object.entries(jsonSchema.properties)) {
641
+ let zodType;
642
+ if (value.enum && Array.isArray(value.enum)) if (value.enum.length === 1) zodType = z.literal(value.enum[0]);
643
+ else {
644
+ const [first, ...rest] = value.enum;
645
+ zodType = z.enum([first, ...rest]);
646
+ }
647
+ else if (value.type === "string") {
648
+ zodType = z.string();
649
+ if (value.minLength) zodType = zodType.min(value.minLength);
650
+ if (value.maxLength) zodType = zodType.max(value.maxLength);
651
+ if (value.format === "email") zodType = zodType.email();
652
+ if (value.format === "url" || value.format === "uri") zodType = zodType.url();
653
+ } else if (value.type === "number" || value.type === "integer") {
654
+ zodType = value.type === "integer" ? z.number().int() : z.number();
655
+ if (value.minimum !== void 0) zodType = zodType.min(value.minimum);
656
+ if (value.maximum !== void 0) zodType = zodType.max(value.maximum);
657
+ } else if (value.type === "boolean") zodType = z.boolean();
658
+ else if (value.type === "array") {
659
+ if (value.items) if (value.items.enum && Array.isArray(value.items.enum)) {
660
+ const [first, ...rest] = value.items.enum;
661
+ zodType = z.array(z.enum([first, ...rest]));
662
+ } else if (value.items.type === "string") zodType = z.array(z.string());
663
+ else if (value.items.type === "number") zodType = z.array(z.number());
664
+ else if (value.items.type === "boolean") zodType = z.array(z.boolean());
665
+ else if (value.items.type === "object") zodType = z.array(z.record(z.string(), z.any()));
666
+ else zodType = z.array(z.any());
667
+ else zodType = z.array(z.any());
668
+ if (value.minItems) zodType = zodType.min(value.minItems);
669
+ if (value.maxItems) zodType = zodType.max(value.maxItems);
670
+ } else if (value.type === "object") zodType = z.record(z.string(), z.any());
671
+ else zodType = z.any();
672
+ if (value.description) zodType = zodType.describe(value.description);
673
+ if (!jsonSchema.required?.includes(key) || value.optional === true) zodType = zodType.optional();
674
+ properties[key] = zodType;
675
+ }
676
+ return z.object(properties);
677
+ }
678
+ /**
679
+ * Extract user-visible activities with rich formatting and complete information
680
+ */
681
+ extractUserVisibleActivities(events) {
682
+ const activities = [];
683
+ for (const event of events) switch (event.eventType) {
684
+ case "tool_call":
685
+ activities.push(`🔧 **${event.data.toolName}** (called)\n 📥 Input: ${JSON.stringify(event.data.input)}`);
686
+ break;
687
+ case "tool_result": {
688
+ const resultStr = event.data.error ? `❌ Error: ${event.data.error}` : JSON.stringify(event.data.output);
689
+ activities.push(`🔧 **${event.data.toolName}** ${event.data.duration ? `(${event.data.duration}ms)` : ""}\n 📤 Output: ${resultStr}`);
690
+ break;
691
+ }
692
+ case "error":
693
+ activities.push(`❌ **Error**: ${event.data.message}\n 🔍 Code: ${event.data.code || "unknown"}\n 📊 Severity: ${event.data.severity || "error"}`);
694
+ break;
695
+ case "transfer":
696
+ case "delegation_sent":
697
+ case "delegation_returned":
698
+ case "artifact_saved": break;
699
+ case "agent_reasoning":
700
+ activities.push(`⚙️ **Analyzing request**\n Details: ${JSON.stringify(event.data.parts, null, 2)}`);
701
+ break;
702
+ case "agent_generate":
703
+ activities.push(`⚙️ **Preparing response**\n Details: ${JSON.stringify(event.data.parts, null, 2)}`);
704
+ break;
705
+ default: {
706
+ const safeEvent = event;
707
+ activities.push(`📋 **${safeEvent.eventType}**: ${JSON.stringify(safeEvent.data, null, 2)}`);
708
+ break;
709
+ }
710
+ }
711
+ return activities;
712
+ }
713
+ /**
714
+ * Process a single artifact to generate name and description using conversation context
715
+ */
716
+ async processArtifact(artifactData) {
717
+ return tracer.startActiveSpan("agent_session.process_artifact", { attributes: {
718
+ "agent_session.id": this.sessionId,
719
+ "artifact.id": artifactData.artifactId,
720
+ "artifact.type": artifactData.artifactType || "unknown",
721
+ "subAgent.id": artifactData.subAgentId || "unknown",
722
+ "subAgent.name": artifactData.subAgentName || "unknown",
723
+ "artifact.tool_call_id": artifactData.metadata?.toolCallId || "unknown",
724
+ "artifact.data": JSON.stringify(artifactData.data, null, 2),
725
+ "tenant.id": artifactData.tenantId || "unknown",
726
+ "project.id": artifactData.projectId || "unknown",
727
+ "context.id": artifactData.contextId || "unknown",
728
+ has_tenant_id: !!artifactData.tenantId,
729
+ has_project_id: !!artifactData.projectId,
730
+ has_context_id: !!artifactData.contextId,
731
+ has_metadata: !!artifactData.metadata,
732
+ tool_call_id: artifactData.metadata?.toolCallId || "missing",
733
+ pending_generation: !!artifactData.pendingGeneration,
734
+ "schema_validation.schema_found": artifactData.schemaValidation?.schemaFound || false,
735
+ "schema_validation.summary.has_expected_fields": artifactData.schemaValidation?.summary?.hasExpectedFields || true,
736
+ "schema_validation.summary.missing_fields_count": artifactData.schemaValidation?.summary?.missingFields?.length || 0,
737
+ "schema_validation.summary.extra_fields_count": artifactData.schemaValidation?.summary?.extraFields?.length || 0,
738
+ "schema_validation.summary.expected_fields": JSON.stringify(artifactData.schemaValidation?.summary?.expectedFields || []),
739
+ "schema_validation.summary.actual_fields": JSON.stringify(artifactData.schemaValidation?.summary?.actualFields || []),
740
+ "schema_validation.summary.missing_fields": JSON.stringify(artifactData.schemaValidation?.summary?.missingFields || []),
741
+ "schema_validation.summary.extra_fields": JSON.stringify(artifactData.schemaValidation?.summary?.extraFields || []),
742
+ "schema_validation.summary.has_required_fields": artifactData.schemaValidation?.summary?.hasRequiredFields || true,
743
+ "schema_validation.summary.missing_required_count": artifactData.schemaValidation?.summary?.missingRequired?.length || 0,
744
+ "schema_validation.summary.missing_required": JSON.stringify(artifactData.schemaValidation?.summary?.missingRequired || []),
745
+ "schema_validation.full.has_expected_fields": artifactData.schemaValidation?.full?.hasExpectedFields || true,
746
+ "schema_validation.full.missing_fields_count": artifactData.schemaValidation?.full?.missingFields?.length || 0,
747
+ "schema_validation.full.extra_fields_count": artifactData.schemaValidation?.full?.extraFields?.length || 0,
748
+ "schema_validation.full.expected_fields": JSON.stringify(artifactData.schemaValidation?.full?.expectedFields || []),
749
+ "schema_validation.full.actual_fields": JSON.stringify(artifactData.schemaValidation?.full?.actualFields || []),
750
+ "schema_validation.full.missing_fields": JSON.stringify(artifactData.schemaValidation?.full?.missingFields || []),
751
+ "schema_validation.full.extra_fields": JSON.stringify(artifactData.schemaValidation?.full?.extraFields || []),
752
+ "schema_validation.full.has_required_fields": artifactData.schemaValidation?.full?.hasRequiredFields || true,
753
+ "schema_validation.full.missing_required_count": artifactData.schemaValidation?.full?.missingRequired?.length || 0,
754
+ "schema_validation.full.missing_required": JSON.stringify(artifactData.schemaValidation?.full?.missingRequired || [])
755
+ } }, async (span) => {
756
+ try {
757
+ if (!artifactData.tenantId || !artifactData.projectId || !artifactData.contextId) {
758
+ span.setAttributes({
759
+ "validation.failed": true,
760
+ missing_tenant_id: !artifactData.tenantId,
761
+ missing_project_id: !artifactData.projectId,
762
+ missing_context_id: !artifactData.contextId
763
+ });
764
+ throw new Error("Missing required session info (tenantId, projectId, or contextId) for artifact processing");
765
+ }
766
+ span.setAttributes({ "validation.passed": true });
767
+ let mainSaveSucceeded = false;
768
+ const conversationHistory = await getFormattedConversationHistory({
769
+ tenantId: artifactData.tenantId,
770
+ projectId: artifactData.projectId,
771
+ conversationId: artifactData.contextId,
772
+ options: {
773
+ limit: 10,
774
+ includeInternal: false,
775
+ messageTypes: ["chat"]
776
+ }
777
+ });
778
+ const toolCallEvent = this.events.find((event) => event.eventType === "tool_result" && event.data && "toolCallId" in event.data && event.data.toolCallId === artifactData.metadata?.toolCallId);
779
+ const toolContext = toolCallEvent ? {
780
+ toolName: toolCallEvent.data.toolName,
781
+ args: toolCallEvent.data.args
782
+ } : null;
783
+ let existingNames = [];
784
+ try {
785
+ if (artifactData.tenantId && artifactData.projectId && artifactData.taskId) existingNames = (await getLedgerArtifacts(runDbClient_default)({
786
+ scopes: {
787
+ tenantId: artifactData.tenantId,
788
+ projectId: artifactData.projectId
789
+ },
790
+ taskId: artifactData.taskId
791
+ })).map((a) => a.name).filter(Boolean);
792
+ } catch (error) {
793
+ logger.warn({
794
+ sessionId: this.sessionId,
795
+ artifactId: artifactData.artifactId,
796
+ error: error instanceof Error ? error.message : "Unknown error"
797
+ }, "Failed to fetch existing artifact names for context");
798
+ }
799
+ const toolName = artifactData.metadata?.toolName || "unknown";
800
+ const toolCallId = artifactData.metadata?.toolCallId || "unknown";
801
+ const prompt = `Create a unique name and description for this tool result artifact.
802
+
803
+ CRITICAL: Your name must be different from these existing artifacts: ${existingNames.length > 0 ? existingNames.join(", ") : "None yet"}
804
+
805
+ Tool Context: ${toolContext ? JSON.stringify(toolContext.args, null, 2) : "No args"}
806
+ Context: ${conversationHistory?.slice(-200) || "No context"}
807
+ Type: ${artifactData.artifactType || "data"}
808
+ Data: ${JSON.stringify(artifactData.data || artifactData.summaryData || {}, null, 2)}
809
+
810
+ Requirements:
811
+ - Name: Max 50 chars, be extremely specific to THIS EXACT tool execution
812
+ - Description: Max 150 chars, describe what THIS SPECIFIC tool call returned
813
+ - Focus on the unique aspects of this particular tool execution result
814
+ - Be descriptive about the actual content returned, not just the tool type
815
+
816
+ BAD Examples (too generic):
817
+ - "Search Results"
818
+ - "Tool Results"
819
+ - "${toolName} Results"
820
+ - "Data from ${toolName}"
821
+ - "Tool Output"
822
+ - "Search Data"
823
+
824
+ GOOD Examples:
825
+ - "GitHub API Rate Limits & Auth Methods"
826
+ - "React Component Props Documentation"
827
+ - "Database Schema for User Tables"
828
+ - "Pricing Tiers with Enterprise Features"
829
+
830
+ Make the name extremely specific to what this tool call actually returned, not generic.`;
831
+ let modelToUse = this.statusUpdateState?.summarizerModel;
832
+ if (!modelToUse?.model?.trim()) if (!this.statusUpdateState?.baseModel?.model?.trim()) {
833
+ if (artifactData.subAgentId && artifactData.tenantId && artifactData.projectId) try {
834
+ const subAgentId = artifactData.subAgentId;
835
+ const agentData = this.executionContext.project.agents[this.executionContext.agentId].subAgents?.[subAgentId];
836
+ if (agentData && "models" in agentData && agentData.models?.base?.model) {
837
+ modelToUse = agentData.models.base;
838
+ logger.info({
839
+ sessionId: this.sessionId,
840
+ artifactId: artifactData.artifactId,
841
+ subAgentId: artifactData.subAgentId,
842
+ model: modelToUse.model
843
+ }, "Using agent model configuration for artifact name generation");
844
+ }
845
+ } catch (error) {
846
+ logger.warn({
847
+ sessionId: this.sessionId,
848
+ artifactId: artifactData.artifactId,
849
+ subAgentId: artifactData.subAgentId,
850
+ error: error instanceof Error ? error.message : "Unknown error"
851
+ }, "Failed to get agent model configuration");
852
+ }
853
+ if (!modelToUse?.model?.trim()) {
854
+ logger.warn({
855
+ sessionId: this.sessionId,
856
+ artifactId: artifactData.artifactId
857
+ }, "No model configuration available for artifact name generation, will use fallback names");
858
+ modelToUse = void 0;
859
+ }
860
+ } else modelToUse = this.statusUpdateState.baseModel;
861
+ let result;
862
+ if (!modelToUse) {
863
+ const toolCallSuffix = artifactData.metadata?.toolCallId?.slice(-8) || Date.now().toString().slice(-8);
864
+ result = {
865
+ name: `${artifactData.artifactType || "Artifact"} ${toolCallSuffix}`,
866
+ description: `${artifactData.artifactType || "Data"} from ${artifactData.metadata?.toolName || "tool"} (${artifactData.metadata?.toolCallId || "tool results"})`
867
+ };
868
+ } else {
869
+ const model = ModelFactory.createModel(modelToUse);
870
+ const schema = z.object({
871
+ name: z.string().describe("Concise, descriptive name for the artifact"),
872
+ description: z.string().describe("Brief description of the artifact's relevance to the user's question")
873
+ });
874
+ const { output: object } = await tracer.startActiveSpan("agent_session.generate_artifact_metadata", { attributes: {
875
+ "llm.model": this.statusUpdateState?.summarizerModel?.model,
876
+ "llm.operation": "generate_object",
877
+ "artifact.id": artifactData.artifactId,
878
+ "artifact.type": artifactData.artifactType,
879
+ "artifact.summary": JSON.stringify(artifactData.summaryData, null, 2),
880
+ "artifact.full": JSON.stringify(artifactData.data || artifactData.summaryData, null, 2),
881
+ "prompt.length": prompt.length
882
+ } }, async (generationSpan) => {
883
+ const maxRetries = 3;
884
+ let lastError = null;
885
+ for (let attempt = 1; attempt <= maxRetries; attempt++) try {
886
+ const result$1 = await generateText({
887
+ model,
888
+ prompt,
889
+ output: Output.object({ schema }),
890
+ experimental_telemetry: {
891
+ isEnabled: true,
892
+ functionId: `artifact_processing_${artifactData.artifactId}`,
893
+ recordInputs: true,
894
+ recordOutputs: true,
895
+ metadata: {
896
+ operation: "artifact_name_description_generation",
897
+ sessionId: this.sessionId,
898
+ attempt
899
+ }
900
+ }
901
+ });
902
+ generationSpan.setAttributes({
903
+ "artifact.id": artifactData.artifactId,
904
+ "artifact.type": artifactData.artifactType,
905
+ "artifact.name": result$1.output.name,
906
+ "artifact.description": result$1.output.description,
907
+ "artifact.summary": JSON.stringify(artifactData.summaryData, null, 2),
908
+ "artifact.full": JSON.stringify(artifactData.data || artifactData.summaryData, null, 2),
909
+ "generation.name_length": result$1.output.name.length,
910
+ "generation.description_length": result$1.output.description.length,
911
+ "generation.attempts": attempt
912
+ });
913
+ generationSpan.setStatus({ code: SpanStatusCode.OK });
914
+ return result$1;
915
+ } catch (error) {
916
+ lastError = error instanceof Error ? error : new Error(String(error));
917
+ logger.warn({
918
+ sessionId: this.sessionId,
919
+ artifactId: artifactData.artifactId,
920
+ attempt,
921
+ maxRetries,
922
+ error: lastError.message
923
+ }, `Artifact name/description generation failed, attempt ${attempt}/${maxRetries}`);
924
+ if (attempt < maxRetries) {
925
+ const backoffMs = Math.min(ARTIFACT_GENERATION_BACKOFF_INITIAL_MS * 2 ** (attempt - 1), ARTIFACT_GENERATION_BACKOFF_MAX_MS);
926
+ await new Promise((resolve) => setTimeout(resolve, backoffMs));
927
+ }
928
+ }
929
+ setSpanWithError$1(generationSpan, lastError instanceof Error ? lastError : new Error(String(lastError)));
930
+ throw new Error(`Artifact name/description generation failed after ${maxRetries} attempts: ${lastError?.message}`);
931
+ });
932
+ result = object;
933
+ }
934
+ if (existingNames.includes(result.name)) {
935
+ const toolCallSuffix = toolCallId.slice(-8);
936
+ const originalName = result.name;
937
+ result.name = result.name.length + toolCallSuffix.length + 1 <= 50 ? `${result.name} ${toolCallSuffix}` : `${result.name.substring(0, 50 - toolCallSuffix.length - 1)} ${toolCallSuffix}`;
938
+ logger.info({
939
+ sessionId: this.sessionId,
940
+ artifactId: artifactData.artifactId,
941
+ originalName,
942
+ uniqueName: result.name,
943
+ reason: "Name conflict resolved with toolCallId suffix"
944
+ }, "Updated artifact name for uniqueness");
945
+ }
946
+ try {
947
+ if (!this.artifactService) throw new Error("ArtifactService is not initialized");
948
+ await this.artifactService.saveArtifact({
949
+ artifactId: artifactData.artifactId,
950
+ name: result.name,
951
+ description: result.description,
952
+ type: artifactData.artifactType || "source",
953
+ data: artifactData.data || {},
954
+ summaryData: artifactData.summaryData,
955
+ metadata: artifactData.metadata || {},
956
+ toolCallId: artifactData.toolCallId
957
+ });
958
+ mainSaveSucceeded = true;
959
+ span.setAttributes({
960
+ "artifact.name": result.name,
961
+ "artifact.description": result.description,
962
+ "processing.success": true
963
+ });
964
+ span.setStatus({ code: SpanStatusCode.OK });
965
+ } catch (saveError) {
966
+ logger.error({
967
+ sessionId: this.sessionId,
968
+ artifactId: artifactData.artifactId,
969
+ error: saveError instanceof Error ? saveError.message : "Unknown error",
970
+ errorName: saveError instanceof Error ? saveError.name : void 0,
971
+ errorCause: saveError instanceof Error ? saveError.cause : void 0,
972
+ errorCode: saveError?.code || saveError?.errno || void 0,
973
+ artifactType: artifactData.artifactType,
974
+ dataKeys: artifactData.data ? Object.keys(artifactData.data) : [],
975
+ metadataKeys: artifactData.metadata ? Object.keys(artifactData.metadata) : []
976
+ }, "Main artifact save failed, will attempt fallback");
977
+ }
978
+ if (!mainSaveSucceeded) try {
979
+ if (artifactData.tenantId && artifactData.projectId) {
980
+ await new ArtifactService({
981
+ executionContext: this.executionContext,
982
+ contextId: artifactData.contextId || "unknown",
983
+ taskId: artifactData.taskId,
984
+ sessionId: this.sessionId
985
+ }).saveArtifact({
986
+ artifactId: artifactData.artifactId,
987
+ name: `Artifact ${artifactData.artifactId.substring(0, 8)}`,
988
+ description: `${artifactData.artifactType || "Data"} from ${artifactData.metadata?.toolName || "tool results"}`,
989
+ type: artifactData.artifactType || "source",
990
+ data: artifactData.data || {},
991
+ summaryData: artifactData.summaryData,
992
+ metadata: artifactData.metadata || {},
993
+ toolCallId: artifactData.toolCallId
994
+ });
995
+ logger.info({
996
+ sessionId: this.sessionId,
997
+ artifactId: artifactData.artifactId
998
+ }, "Saved artifact with fallback name/description after main save failed");
999
+ }
1000
+ } catch (fallbackError) {
1001
+ if (fallbackError instanceof Error && (fallbackError.message?.includes("UNIQUE") || fallbackError.message?.includes("duplicate"))) {} else logger.error({
1002
+ sessionId: this.sessionId,
1003
+ artifactId: artifactData.artifactId,
1004
+ error: fallbackError instanceof Error ? fallbackError.message : "Unknown error",
1005
+ errorName: fallbackError instanceof Error ? fallbackError.name : void 0,
1006
+ errorCause: fallbackError instanceof Error ? fallbackError.cause : void 0,
1007
+ errorCode: fallbackError?.code || fallbackError?.errno || void 0,
1008
+ artifactType: artifactData.artifactType,
1009
+ dataKeys: artifactData.data ? Object.keys(artifactData.data) : [],
1010
+ metadataKeys: artifactData.metadata ? Object.keys(artifactData.metadata) : []
1011
+ }, "Failed to save artifact even with fallback");
1012
+ }
1013
+ } catch (error) {
1014
+ setSpanWithError$1(span, error instanceof Error ? error : new Error(String(error)));
1015
+ logger.error({
1016
+ sessionId: this.sessionId,
1017
+ artifactId: artifactData.artifactId,
1018
+ error: error instanceof Error ? error.message : "Unknown error"
1019
+ }, "Failed to process artifact (name/description generation failed)");
1020
+ } finally {
1021
+ span.end();
1022
+ }
1023
+ });
1024
+ }
1025
+ /**
1026
+ * Cache an artifact in this session for immediate access
1027
+ */
1028
+ setArtifactCache(key, artifact) {
1029
+ this.artifactCache.set(key, artifact);
1030
+ logger.debug({
1031
+ sessionId: this.sessionId,
1032
+ key
1033
+ }, "Artifact cached in session");
1034
+ }
1035
+ /**
1036
+ * Get session-scoped ArtifactService instance
1037
+ */
1038
+ getArtifactService() {
1039
+ return this.artifactService || null;
1040
+ }
1041
+ /**
1042
+ * Get session-scoped ArtifactParser instance
1043
+ */
1044
+ getArtifactParser() {
1045
+ return this.artifactParser || null;
1046
+ }
1047
+ /**
1048
+ * Get an artifact from this session cache
1049
+ */
1050
+ getArtifactCache(key) {
1051
+ const artifact = this.artifactCache.get(key);
1052
+ logger.debug({
1053
+ sessionId: this.sessionId,
1054
+ key,
1055
+ found: !!artifact
1056
+ }, "Artifact cache lookup");
1057
+ return artifact || null;
1058
+ }
1059
+ /**
1060
+ * Update artifact components in the shared ArtifactService
1061
+ */
1062
+ updateArtifactComponents(artifactComponents) {
1063
+ if (this.artifactService) this.artifactService.updateArtifactComponents(artifactComponents);
1064
+ }
1065
+ };
1066
+ /**
1067
+ * Manages AgentSession instances for message-level tracking
1068
+ */
1069
+ var AgentSessionManager = class {
1070
+ sessions = /* @__PURE__ */ new Map();
1071
+ /**
1072
+ * Create a new session for a message
1073
+ */
1074
+ createSession(messageId, executionContext, contextId) {
1075
+ const sessionId = messageId;
1076
+ const session = new AgentSession(sessionId, messageId, executionContext, contextId);
1077
+ this.sessions.set(sessionId, session);
1078
+ logger.info({
1079
+ sessionId,
1080
+ messageId,
1081
+ agentId: executionContext.agentId,
1082
+ tenantId: executionContext.tenantId,
1083
+ projectId: executionContext.projectId,
1084
+ contextId
1085
+ }, "AgentSession created");
1086
+ return sessionId;
1087
+ }
1088
+ /**
1089
+ * Initialize status updates for a session
1090
+ */
1091
+ initializeStatusUpdates(sessionId, config, summarizerModel, baseModel) {
1092
+ const session = this.sessions.get(sessionId);
1093
+ if (session) session.initializeStatusUpdates(config, summarizerModel, baseModel);
1094
+ else logger.error({
1095
+ sessionId,
1096
+ availableSessions: Array.from(this.sessions.keys())
1097
+ }, "Session not found for status updates initialization");
1098
+ }
1099
+ /**
1100
+ * Enable emit operations for a session to send data operations
1101
+ */
1102
+ enableEmitOperations(sessionId) {
1103
+ const session = this.sessions.get(sessionId);
1104
+ if (session) session.enableEmitOperations();
1105
+ else logger.error({
1106
+ sessionId,
1107
+ availableSessions: Array.from(this.sessions.keys())
1108
+ }, "Session not found for emit operations enablement");
1109
+ }
1110
+ /**
1111
+ * Get an existing session
1112
+ */
1113
+ getSession(sessionId) {
1114
+ return this.sessions.get(sessionId) || null;
1115
+ }
1116
+ /**
1117
+ * Record an event in a session
1118
+ * Generic type parameter T ensures eventType and data are correctly paired
1119
+ */
1120
+ recordEvent(sessionId, eventType, subAgentId, data) {
1121
+ const session = this.sessions.get(sessionId);
1122
+ if (!session) {
1123
+ logger.warn({ sessionId }, "Attempted to record event in non-existent session");
1124
+ return;
1125
+ }
1126
+ session.recordEvent(eventType, subAgentId, data);
1127
+ }
1128
+ /**
1129
+ * End a session and return the final event data
1130
+ */
1131
+ async endSession(sessionId) {
1132
+ const session = this.sessions.get(sessionId);
1133
+ if (!session) {
1134
+ logger.warn({ sessionId }, "Attempted to end non-existent session");
1135
+ return [];
1136
+ }
1137
+ const events = session.getEvents();
1138
+ const summary = session.getSummary();
1139
+ logger.info({
1140
+ sessionId,
1141
+ summary
1142
+ }, "AgentSession ended");
1143
+ await session.cleanup();
1144
+ this.sessions.delete(sessionId);
1145
+ return events;
1146
+ }
1147
+ /**
1148
+ * Set text streaming state for a session
1149
+ */
1150
+ setTextStreaming(sessionId, isStreaming) {
1151
+ const session = this.sessions.get(sessionId);
1152
+ if (session) session.setTextStreaming(isStreaming);
1153
+ }
1154
+ /**
1155
+ * Get summary of all active sessions
1156
+ */
1157
+ getActiveSessions() {
1158
+ return Array.from(this.sessions.values()).map((session) => ({
1159
+ sessionId: session.sessionId,
1160
+ messageId: session.messageId,
1161
+ eventCount: session.getEvents().length
1162
+ }));
1163
+ }
1164
+ /**
1165
+ * Cache an artifact in the specified session
1166
+ */
1167
+ async setArtifactCache(sessionId, key, artifact) {
1168
+ const session = this.sessions.get(sessionId);
1169
+ if (session) session.setArtifactCache(key, artifact);
1170
+ }
1171
+ /**
1172
+ * Get an artifact from the specified session cache
1173
+ */
1174
+ async getArtifactCache(sessionId, key) {
1175
+ const session = this.sessions.get(sessionId);
1176
+ return session ? session.getArtifactCache(key) : null;
1177
+ }
1178
+ /**
1179
+ * Get session-scoped ArtifactService instance
1180
+ */
1181
+ getArtifactService(sessionId) {
1182
+ const session = this.sessions.get(sessionId);
1183
+ return session ? session.getArtifactService() : null;
1184
+ }
1185
+ /**
1186
+ * Get session-scoped ArtifactParser instance
1187
+ */
1188
+ getArtifactParser(sessionId) {
1189
+ const session = this.sessions.get(sessionId);
1190
+ return session ? session.getArtifactParser() : null;
1191
+ }
1192
+ /**
1193
+ * Update artifact components for a session
1194
+ */
1195
+ updateArtifactComponents(sessionId, artifactComponents) {
1196
+ const session = this.sessions.get(sessionId);
1197
+ if (session) session.updateArtifactComponents(artifactComponents);
1198
+ }
1199
+ };
1200
+ const agentSessionManager = new AgentSessionManager();
1201
+
1202
+ //#endregion
1203
+ export { AgentSession, AgentSessionManager, agentSessionManager };