@flink-app/flink 0.14.3 → 2.0.0-alpha.100

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 (280) hide show
  1. package/CHANGELOG.md +1051 -0
  2. package/SCHEMA_EXTRACTION_ANALYSIS.md +494 -0
  3. package/SIMPLE_AST_FEASIBILITY.md +570 -0
  4. package/bin/flink.ts +13 -2
  5. package/cli/build.ts +24 -44
  6. package/cli/clean.ts +13 -25
  7. package/cli/cli-utils.ts +190 -17
  8. package/cli/dev.ts +252 -0
  9. package/cli/loadEnvFiles.ts +116 -0
  10. package/cli/run.ts +45 -62
  11. package/dist/bin/flink.js +61 -2
  12. package/dist/cli/build.js +20 -25
  13. package/dist/cli/clean.js +12 -10
  14. package/dist/cli/cli-utils.d.ts +34 -3
  15. package/dist/cli/cli-utils.js +193 -12
  16. package/dist/cli/dev.d.ts +2 -0
  17. package/dist/cli/dev.js +279 -0
  18. package/dist/cli/loadEnvFiles.d.ts +30 -0
  19. package/dist/cli/loadEnvFiles.js +113 -0
  20. package/dist/cli/run.js +47 -46
  21. package/dist/src/DependencyTracker.d.ts +44 -0
  22. package/dist/src/DependencyTracker.js +239 -0
  23. package/dist/src/FlinkApp.d.ts +163 -10
  24. package/dist/src/FlinkApp.js +847 -184
  25. package/dist/src/FlinkContext.d.ts +41 -0
  26. package/dist/src/FlinkErrors.d.ts +19 -6
  27. package/dist/src/FlinkErrors.js +36 -42
  28. package/dist/src/FlinkHttpHandler.d.ts +219 -26
  29. package/dist/src/FlinkHttpHandler.js +37 -1
  30. package/dist/src/FlinkJob.d.ts +10 -0
  31. package/dist/src/FlinkLog.d.ts +82 -18
  32. package/dist/src/FlinkLog.js +165 -13
  33. package/dist/src/FlinkLogFactory.d.ts +288 -0
  34. package/dist/src/FlinkLogFactory.js +619 -0
  35. package/dist/src/FlinkRepo.d.ts +10 -2
  36. package/dist/src/FlinkRepo.js +11 -1
  37. package/dist/src/FlinkRequestContext.d.ts +63 -0
  38. package/dist/src/FlinkRequestContext.js +74 -0
  39. package/dist/src/FlinkResponse.d.ts +6 -0
  40. package/dist/src/FlinkService.d.ts +38 -0
  41. package/dist/src/FlinkService.js +46 -0
  42. package/dist/src/LeaderElection.d.ts +45 -0
  43. package/dist/src/LeaderElection.js +269 -0
  44. package/dist/src/SchemaCache.d.ts +84 -0
  45. package/dist/src/SchemaCache.js +289 -0
  46. package/dist/src/TypeScriptCompiler.d.ts +161 -51
  47. package/dist/src/TypeScriptCompiler.js +1253 -617
  48. package/dist/src/TypeScriptUtils.js +4 -0
  49. package/dist/src/ai/AgentRunner.d.ts +39 -0
  50. package/dist/src/ai/AgentRunner.js +760 -0
  51. package/dist/src/ai/ConversationAgent.d.ts +279 -0
  52. package/dist/src/ai/ConversationAgent.js +404 -0
  53. package/dist/src/ai/ConversationFlinkAgent.d.ts +278 -0
  54. package/dist/src/ai/ConversationFlinkAgent.js +404 -0
  55. package/dist/src/ai/FlinkAgent.d.ts +690 -0
  56. package/dist/src/ai/FlinkAgent.js +729 -0
  57. package/dist/src/ai/FlinkTool.d.ts +135 -0
  58. package/dist/src/ai/FlinkTool.js +2 -0
  59. package/dist/src/ai/InMemoryConversationAgent.d.ts +121 -0
  60. package/dist/src/ai/InMemoryConversationAgent.js +209 -0
  61. package/dist/src/ai/LLMAdapter.d.ts +148 -0
  62. package/dist/src/ai/LLMAdapter.js +2 -0
  63. package/dist/src/ai/PersistentFlinkAgent.d.ts +278 -0
  64. package/dist/src/ai/PersistentFlinkAgent.js +403 -0
  65. package/dist/src/ai/SubAgentExecutor.d.ts +38 -0
  66. package/dist/src/ai/SubAgentExecutor.js +223 -0
  67. package/dist/src/ai/ToolExecutor.d.ts +64 -0
  68. package/dist/src/ai/ToolExecutor.js +497 -0
  69. package/dist/src/ai/agentInstructions.d.ts +68 -0
  70. package/dist/src/ai/agentInstructions.js +286 -0
  71. package/dist/src/ai/index.d.ts +8 -0
  72. package/dist/src/ai/index.js +26 -0
  73. package/dist/src/ai/instructionFileLoader.d.ts +44 -0
  74. package/dist/src/ai/instructionFileLoader.js +179 -0
  75. package/dist/src/auth/FlinkAuthPlugin.d.ts +1 -1
  76. package/dist/src/handlers/StreamWriterFactory.d.ts +20 -0
  77. package/dist/src/handlers/StreamWriterFactory.js +83 -0
  78. package/dist/src/index.d.ts +14 -0
  79. package/dist/src/index.js +17 -0
  80. package/dist/src/loadPluginSchemas.d.ts +45 -0
  81. package/dist/src/loadPluginSchemas.js +143 -0
  82. package/dist/src/schema-extraction/ComplexTypeDetection.d.ts +40 -0
  83. package/dist/src/schema-extraction/ComplexTypeDetection.js +75 -0
  84. package/dist/src/schema-extraction/TypeScriptSourceParser.d.ts +321 -0
  85. package/dist/src/schema-extraction/TypeScriptSourceParser.js +925 -0
  86. package/dist/src/schema-extraction/TypeScriptSourceParser.spec.d.ts +1 -0
  87. package/dist/src/schema-extraction/TypeScriptSourceParser.spec.js +233 -0
  88. package/dist/src/schema-extraction/TypeScriptTokenizer.d.ts +57 -0
  89. package/dist/src/schema-extraction/TypeScriptTokenizer.js +177 -0
  90. package/dist/src/schema-extraction/index.d.ts +2 -0
  91. package/dist/src/schema-extraction/index.js +20 -0
  92. package/dist/src/schema-extraction/types.d.ts +31 -0
  93. package/dist/src/schema-extraction/types.js +2 -0
  94. package/dist/src/utils/loadFlinkConfig.d.ts +53 -0
  95. package/dist/src/utils/loadFlinkConfig.js +77 -0
  96. package/dist/src/utils.d.ts +30 -0
  97. package/dist/src/utils.js +52 -0
  98. package/dist/src/workers/SchemaGeneratorWorker.d.ts +1 -0
  99. package/dist/src/workers/SchemaGeneratorWorker.js +49 -0
  100. package/dist/src/workers/WorkerPool.d.ts +60 -0
  101. package/dist/src/workers/WorkerPool.js +306 -0
  102. package/examples/logging-hierarchical-example.ts +125 -0
  103. package/package.json +29 -4
  104. package/readme.md +499 -0
  105. package/spec/AgentDescendantDetection.spec.ts +335 -0
  106. package/spec/AgentDuplicateDetection.spec.ts +112 -0
  107. package/spec/AgentObserver.spec.ts +266 -0
  108. package/spec/AgentRunner.spec.ts +1062 -0
  109. package/spec/AsyncLocalStorageContext.spec.ts +223 -0
  110. package/spec/ConversationHooks.spec.ts +257 -0
  111. package/spec/FlinkAgent.spec.ts +681 -0
  112. package/spec/FlinkApp.htmlResponse.spec.ts +260 -0
  113. package/spec/FlinkApp.onError.invocation.spec.ts +151 -0
  114. package/spec/FlinkApp.onError.spec.ts +1 -2
  115. package/spec/FlinkApp.query.spec.ts +107 -0
  116. package/spec/FlinkApp.routeOrdering.spec.ts +61 -0
  117. package/spec/FlinkApp.undefinedResponse.spec.ts +123 -0
  118. package/spec/FlinkApp.validationMode.spec.ts +155 -0
  119. package/spec/FlinkJob.spec.ts +171 -0
  120. package/spec/FlinkLogFactory.spec.ts +337 -0
  121. package/spec/FlinkRepo.spec.ts +1 -1
  122. package/spec/LeaderElection.spec.ts +174 -0
  123. package/spec/StreamingIntegration.spec.ts +139 -0
  124. package/spec/ToolExecutor.spec.ts +465 -0
  125. package/spec/TypeScriptCompiler.spec.ts +1 -1
  126. package/spec/TypeScriptSourceParser.spec.ts +1215 -0
  127. package/spec/TypeScriptTokenizer.spec.ts +366 -0
  128. package/spec/ai/ContextCompaction.spec.ts +405 -0
  129. package/spec/ai/ConversationAgent.spec.ts +520 -0
  130. package/spec/ai/InMemoryConversationAgent.spec.ts +144 -0
  131. package/spec/ai/agentInstructions.spec.ts +358 -0
  132. package/spec/fixtures/agent-instructions/TestAgent.ts +24 -0
  133. package/spec/fixtures/agent-instructions/simple.md +3 -0
  134. package/spec/fixtures/agent-instructions/template.md +18 -0
  135. package/spec/fixtures/agent-instructions/yaml-format.yaml +9 -0
  136. package/spec/mock-project/dist/.tsbuildinfo +1 -0
  137. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCar.js +56 -0
  138. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCar2.js +58 -0
  139. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema.js +52 -0
  140. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema2.js +52 -0
  141. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema3.js +52 -0
  142. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithLiteralSchema.js +54 -0
  143. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithLiteralSchema2.js +54 -0
  144. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithSchemaInFile.js +57 -0
  145. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithSchemaInFile2.js +57 -0
  146. package/spec/mock-project/dist/spec/mock-project/src/handlers/ManuallyAddedHandler.js +53 -0
  147. package/spec/mock-project/dist/spec/mock-project/src/handlers/ManuallyAddedHandler2.js +55 -0
  148. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchCar.js +57 -0
  149. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchOnboardingSession.js +75 -0
  150. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchOrderWithComplexTypes.js +57 -0
  151. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchProductWithIntersection.js +58 -0
  152. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchUserWithUnion.js +58 -0
  153. package/spec/mock-project/dist/spec/mock-project/src/handlers/PostCar.js +54 -0
  154. package/spec/mock-project/dist/spec/mock-project/src/handlers/PostLogin.js +55 -0
  155. package/spec/mock-project/dist/spec/mock-project/src/handlers/PostLogout.js +54 -0
  156. package/spec/mock-project/dist/spec/mock-project/src/handlers/PutCar.js +54 -0
  157. package/spec/mock-project/dist/spec/mock-project/src/index.js +83 -0
  158. package/spec/mock-project/dist/spec/mock-project/src/repos/CarRepo.js +26 -0
  159. package/spec/mock-project/dist/spec/mock-project/src/schemas/Car.js +2 -0
  160. package/spec/mock-project/dist/spec/mock-project/src/schemas/DefaultExportSchema.js +2 -0
  161. package/spec/mock-project/dist/spec/mock-project/src/schemas/FileWithTwoSchemas.js +2 -0
  162. package/spec/mock-project/dist/src/FlinkApp.js +1000 -0
  163. package/spec/mock-project/dist/src/FlinkContext.js +2 -0
  164. package/spec/mock-project/dist/src/FlinkErrors.js +143 -0
  165. package/spec/mock-project/dist/src/FlinkHttpHandler.js +47 -0
  166. package/spec/mock-project/dist/src/FlinkJob.js +2 -0
  167. package/spec/mock-project/dist/src/FlinkLog.js +119 -0
  168. package/spec/mock-project/dist/src/FlinkLogFactory.js +617 -0
  169. package/spec/mock-project/dist/src/FlinkPlugin.js +2 -0
  170. package/spec/mock-project/dist/src/FlinkRepo.js +224 -0
  171. package/spec/mock-project/dist/src/FlinkRequestContext.js +74 -0
  172. package/spec/mock-project/dist/src/FlinkResponse.js +2 -0
  173. package/spec/mock-project/dist/src/ai/AgentExecutor.js +279 -0
  174. package/spec/mock-project/dist/src/ai/AgentRunner.js +632 -0
  175. package/spec/mock-project/dist/src/ai/ConversationAgent.js +402 -0
  176. package/spec/mock-project/dist/src/ai/ConversationFlinkAgent.js +422 -0
  177. package/spec/mock-project/dist/src/ai/FlinkAgent.js +699 -0
  178. package/spec/mock-project/dist/src/ai/FlinkTool.js +2 -0
  179. package/spec/mock-project/dist/src/ai/InMemoryConversationAgent.js +209 -0
  180. package/spec/mock-project/dist/src/ai/LLMAdapter.js +2 -0
  181. package/spec/mock-project/dist/src/ai/SubAgentExecutor.js +223 -0
  182. package/spec/mock-project/dist/src/ai/ToolExecutor.js +412 -0
  183. package/spec/mock-project/dist/src/ai/agentInstructions.js +246 -0
  184. package/spec/mock-project/dist/src/auth/FlinkAuthPlugin.js +2 -0
  185. package/spec/mock-project/dist/src/auth/FlinkAuthUser.js +2 -0
  186. package/spec/mock-project/dist/src/handlers/GetCar.js +26 -52
  187. package/spec/mock-project/dist/src/handlers/GetCar.js.map +1 -0
  188. package/spec/mock-project/dist/src/handlers/GetCar2.js +32 -54
  189. package/spec/mock-project/dist/src/handlers/GetCar2.js.map +1 -0
  190. package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema.js +26 -48
  191. package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema.js.map +1 -0
  192. package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema2.js +28 -48
  193. package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema2.js.map +1 -0
  194. package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema3.js +29 -48
  195. package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema3.js.map +1 -0
  196. package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema.js +26 -50
  197. package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema.js.map +1 -0
  198. package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema2.js +28 -50
  199. package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema2.js.map +1 -0
  200. package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile.js +27 -53
  201. package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile.js.map +1 -0
  202. package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile2.js +29 -53
  203. package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile2.js.map +1 -0
  204. package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler.js +16 -49
  205. package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler.js.map +1 -0
  206. package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler2.js +25 -50
  207. package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler2.js.map +1 -0
  208. package/spec/mock-project/dist/src/handlers/PatchCar.js +27 -53
  209. package/spec/mock-project/dist/src/handlers/PatchCar.js.map +1 -0
  210. package/spec/mock-project/dist/src/handlers/PatchOnboardingSession.js +44 -70
  211. package/spec/mock-project/dist/src/handlers/PatchOnboardingSession.js.map +1 -0
  212. package/spec/mock-project/dist/src/handlers/PatchOrderWithComplexTypes.js +27 -53
  213. package/spec/mock-project/dist/src/handlers/PatchOrderWithComplexTypes.js.map +1 -0
  214. package/spec/mock-project/dist/src/handlers/PatchProductWithIntersection.js +28 -54
  215. package/spec/mock-project/dist/src/handlers/PatchProductWithIntersection.js.map +1 -0
  216. package/spec/mock-project/dist/src/handlers/PatchUserWithUnion.js +28 -54
  217. package/spec/mock-project/dist/src/handlers/PatchUserWithUnion.js.map +1 -0
  218. package/spec/mock-project/dist/src/handlers/PostCar.js +24 -50
  219. package/spec/mock-project/dist/src/handlers/PostCar.js.map +1 -0
  220. package/spec/mock-project/dist/src/handlers/PostLogin.js +25 -51
  221. package/spec/mock-project/dist/src/handlers/PostLogin.js.map +1 -0
  222. package/spec/mock-project/dist/src/handlers/PostLogout.js +24 -50
  223. package/spec/mock-project/dist/src/handlers/PostLogout.js.map +1 -0
  224. package/spec/mock-project/dist/src/handlers/PutCar.js +24 -50
  225. package/spec/mock-project/dist/src/handlers/PutCar.js.map +1 -0
  226. package/spec/mock-project/dist/src/handlers/StreamWriterFactory.js +83 -0
  227. package/spec/mock-project/dist/src/index.js +52 -76
  228. package/spec/mock-project/dist/src/index.js.map +1 -0
  229. package/spec/mock-project/dist/src/mock-data-generator.js +9 -0
  230. package/spec/mock-project/dist/src/repos/CarRepo.js +12 -24
  231. package/spec/mock-project/dist/src/repos/CarRepo.js.map +1 -0
  232. package/spec/mock-project/dist/src/schemas/Car.js +3 -1
  233. package/spec/mock-project/dist/src/schemas/Car.js.map +1 -0
  234. package/spec/mock-project/dist/src/schemas/DefaultExportSchema.js +3 -1
  235. package/spec/mock-project/dist/src/schemas/DefaultExportSchema.js.map +1 -0
  236. package/spec/mock-project/dist/src/schemas/FileWithTwoSchemas.js +3 -1
  237. package/spec/mock-project/dist/src/schemas/FileWithTwoSchemas.js.map +1 -0
  238. package/spec/mock-project/dist/src/utils.js +290 -0
  239. package/spec/mock-project/tsconfig.json +6 -1
  240. package/spec/schema-generation-nested-objects.spec.ts +97 -0
  241. package/spec/testHelpers.ts +49 -0
  242. package/spec/utils.caseConversion.spec.ts +78 -0
  243. package/spec/utils.spec.ts +13 -13
  244. package/src/DependencyTracker.ts +166 -0
  245. package/src/FlinkApp.ts +919 -155
  246. package/src/FlinkContext.ts +43 -0
  247. package/src/FlinkErrors.ts +32 -12
  248. package/src/FlinkHttpHandler.ts +246 -28
  249. package/src/FlinkJob.ts +11 -0
  250. package/src/FlinkLog.ts +119 -12
  251. package/src/FlinkLogFactory.ts +699 -0
  252. package/src/FlinkRepo.ts +10 -3
  253. package/src/FlinkRequestContext.ts +95 -0
  254. package/src/FlinkResponse.ts +6 -0
  255. package/src/FlinkService.ts +49 -0
  256. package/src/LeaderElection.ts +203 -0
  257. package/src/SchemaCache.ts +232 -0
  258. package/src/TypeScriptCompiler.ts +1347 -610
  259. package/src/TypeScriptUtils.ts +5 -0
  260. package/src/ai/AgentRunner.ts +646 -0
  261. package/src/ai/ConversationAgent.ts +413 -0
  262. package/src/ai/FlinkAgent.ts +1069 -0
  263. package/src/ai/FlinkTool.ts +165 -0
  264. package/src/ai/InMemoryConversationAgent.ts +149 -0
  265. package/src/ai/LLMAdapter.ts +126 -0
  266. package/src/ai/ToolExecutor.ts +485 -0
  267. package/src/ai/agentInstructions.ts +245 -0
  268. package/src/ai/index.ts +8 -0
  269. package/src/ai/instructionFileLoader.ts +156 -0
  270. package/src/auth/FlinkAuthPlugin.ts +2 -1
  271. package/src/handlers/StreamWriterFactory.ts +84 -0
  272. package/src/index.ts +14 -0
  273. package/src/loadPluginSchemas.ts +141 -0
  274. package/src/schema-extraction/TypeScriptSourceParser.ts +1058 -0
  275. package/src/schema-extraction/TypeScriptTokenizer.ts +205 -0
  276. package/src/schema-extraction/index.ts +2 -0
  277. package/src/schema-extraction/types.ts +34 -0
  278. package/src/utils/loadFlinkConfig.ts +89 -0
  279. package/src/utils.ts +52 -0
  280. package/tsconfig.json +6 -1
@@ -0,0 +1,422 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
28
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.ConversationAgent = void 0;
55
+ var FlinkAgent_1 = require("./FlinkAgent");
56
+ var FlinkLog_1 = require("../FlinkLog");
57
+ /**
58
+ * Abstract base class for agents with automatic conversation persistence.
59
+ *
60
+ * ConversationAgent eliminates boilerplate by automatically:
61
+ * - Loading conversation history before agent execution
62
+ * - Saving messages and provider metadata after execution
63
+ * - Enabling LLM provider optimizations (e.g., OpenAI's previousResponseId for 40-80% cost savings)
64
+ *
65
+ * ## Benefits
66
+ *
67
+ * - **Cost Savings**: Automatic provider metadata persistence enables server-side optimizations
68
+ * - **Type Safety**: Abstract methods enforce consistent storage implementation
69
+ * - **Backend Flexibility**: Works with MongoDB, Redis, in-memory, or any storage backend
70
+ * - **Sub-Agent Aware**: Automatically skips persistence for sub-agent calls (parent handles it)
71
+ *
72
+ * ## Usage Examples
73
+ *
74
+ * ### MongoDB Storage
75
+ * ```typescript
76
+ * export default class CarAgent extends ConversationAgent<AppContext> {
77
+ * id = "car-agent";
78
+ * description = "Car assistant with persistent conversations";
79
+ * instructions = "You are a helpful car expert...";
80
+ * tools = ["search-cars"];
81
+ *
82
+ * protected async loadConversation(conversationId: string) {
83
+ * const conv = await this.ctx.repos.conversationRepo.getById(conversationId);
84
+ * return conv ? {
85
+ * messages: conv.messages,
86
+ * providerMetadata: conv.providerMetadata,
87
+ * } : null;
88
+ * }
89
+ *
90
+ * protected async saveConversation(
91
+ * conversationId: string,
92
+ * data: ConversationData,
93
+ * result: AgentExecuteResult,
94
+ * context: AgentFinishContext
95
+ * ) {
96
+ * await this.ctx.repos.conversationRepo.upsert({
97
+ * _id: conversationId,
98
+ * agentId: this.id,
99
+ * userId: context.user?.id,
100
+ * messages: data.messages,
101
+ * providerMetadata: data.providerMetadata,
102
+ * updatedAt: new Date(),
103
+ * });
104
+ * }
105
+ * }
106
+ * ```
107
+ *
108
+ * ### Redis Storage
109
+ * ```typescript
110
+ * export default class CarAgent extends ConversationAgent<AppContext> {
111
+ * id = "car-agent";
112
+ * description = "Car assistant with Redis-backed conversations";
113
+ * instructions = "You are a helpful car expert...";
114
+ * tools = ["search-cars"];
115
+ *
116
+ * protected async loadConversation(conversationId: string) {
117
+ * const key = `conversation:${conversationId}`;
118
+ * const data = await this.ctx.redis.get(key);
119
+ * return data ? JSON.parse(data) : null;
120
+ * }
121
+ *
122
+ * protected async saveConversation(
123
+ * conversationId: string,
124
+ * data: ConversationData
125
+ * ) {
126
+ * const key = `conversation:${conversationId}`;
127
+ * await this.ctx.redis.setex(
128
+ * key,
129
+ * 86400, // 24 hour TTL
130
+ * JSON.stringify(data)
131
+ * );
132
+ * }
133
+ * }
134
+ * ```
135
+ *
136
+ * ### In-Memory Storage (Development/Testing)
137
+ * ```typescript
138
+ * const conversationStore = new Map<string, ConversationData>();
139
+ *
140
+ * export default class CarAgent extends ConversationAgent<AppContext> {
141
+ * id = "car-agent";
142
+ * description = "Car assistant with in-memory conversations";
143
+ * instructions = "You are a helpful car expert...";
144
+ * tools = ["search-cars"];
145
+ *
146
+ * protected async loadConversation(conversationId: string) {
147
+ * return conversationStore.get(conversationId) || null;
148
+ * }
149
+ *
150
+ * protected async saveConversation(
151
+ * conversationId: string,
152
+ * data: ConversationData
153
+ * ) {
154
+ * conversationStore.set(conversationId, data);
155
+ * }
156
+ * }
157
+ * ```
158
+ *
159
+ * ## Handler Usage
160
+ *
161
+ * ```typescript
162
+ * const handler: PostHandler<AppContext, Input, Output> = async ({ ctx, body, req }) => {
163
+ * const conversationId = body.conversationId || generateId();
164
+ *
165
+ * const result = await ctx.agents.carAgent
166
+ * .withUser(req.user)
167
+ * .execute({ message: body.message, conversationId });
168
+ *
169
+ * return {
170
+ * conversationId,
171
+ * message: (await result.result).message,
172
+ * };
173
+ * };
174
+ * ```
175
+ *
176
+ * ## Provider Metadata Flow
177
+ *
178
+ * 1. First turn: Agent executes, LLM returns metadata (e.g., `{ openai: { responseId: "...", instructionsHash: "..." } }`)
179
+ * 2. saveConversation() stores messages + metadata
180
+ * 3. Second turn: loadConversation() returns messages + metadata
181
+ * 4. beforeRun() populates input.providerMetadata
182
+ * 5. LLM adapter uses metadata for server-side optimization (e.g., OpenAI's previousResponseId)
183
+ * 6. Result: 40-80% cost savings on subsequent turns
184
+ *
185
+ * @template Context - Application context type extending FlinkContext
186
+ *
187
+ * @see {@link https://flink.dev/docs/ai/agents/persistence | Persistence Guide}
188
+ * @see {@link https://platform.openai.com/docs/guides/conversation-history | OpenAI Conversation History}
189
+ */
190
+ var ConversationAgent = /** @class */ (function (_super) {
191
+ __extends(ConversationAgent, _super);
192
+ function ConversationAgent() {
193
+ var _this = _super !== null && _super.apply(this, arguments) || this;
194
+ /**
195
+ * Default persistence strategy for this agent.
196
+ * Can be overridden per-execution via execute() options.
197
+ *
198
+ * @default "auto"
199
+ */
200
+ _this.persistenceStrategy = "auto";
201
+ return _this;
202
+ }
203
+ /**
204
+ * Lifecycle hook: Load conversation history before agent execution.
205
+ *
206
+ * Automatically populates input.history and input.providerMetadata from storage.
207
+ *
208
+ * @internal
209
+ */
210
+ ConversationAgent.prototype.beforeRun = function (input, context) {
211
+ return __awaiter(this, void 0, void 0, function () {
212
+ var conversationId, conversationData, strategy, error_1;
213
+ var _a, _b;
214
+ return __generator(this, function (_c) {
215
+ switch (_c.label) {
216
+ case 0:
217
+ conversationId = input.conversationId;
218
+ if (!conversationId) {
219
+ FlinkLog_1.log.debug("[".concat(this.id, "] No conversationId provided, starting fresh conversation"));
220
+ return [2 /*return*/];
221
+ }
222
+ _c.label = 1;
223
+ case 1:
224
+ _c.trys.push([1, 3, , 4]);
225
+ return [4 /*yield*/, this.loadConversation(conversationId)];
226
+ case 2:
227
+ conversationData = _c.sent();
228
+ if (conversationData) {
229
+ input.history = this.convertToAgentMessages(conversationData.messages);
230
+ strategy = (_b = (_a = input.options) === null || _a === void 0 ? void 0 : _a.persistenceStrategy) !== null && _b !== void 0 ? _b : this.persistenceStrategy;
231
+ if (strategy === "full-history") {
232
+ // Clear provider metadata to force full history
233
+ input.providerMetadata = undefined;
234
+ FlinkLog_1.log.debug("[".concat(this.id, "] Strategy: full-history - clearing provider metadata"));
235
+ }
236
+ else {
237
+ // "auto" or "provider-optimized" - preserve metadata
238
+ input.providerMetadata = conversationData.providerMetadata;
239
+ FlinkLog_1.log.debug("[".concat(this.id, "] Strategy: ").concat(strategy, " - using provider metadata"), { metadata: conversationData.providerMetadata });
240
+ }
241
+ FlinkLog_1.log.debug("[".concat(this.id, "] Loaded conversation ").concat(conversationId, ": ").concat(conversationData.messages.length, " messages"));
242
+ }
243
+ else {
244
+ FlinkLog_1.log.debug("[".concat(this.id, "] No conversation found for ").concat(conversationId, ", starting fresh"));
245
+ }
246
+ return [3 /*break*/, 4];
247
+ case 3:
248
+ error_1 = _c.sent();
249
+ FlinkLog_1.log.error("[".concat(this.id, "] Failed to load conversation ").concat(conversationId, ":"), error_1);
250
+ throw error_1; // Propagate load errors
251
+ case 4: return [2 /*return*/];
252
+ }
253
+ });
254
+ });
255
+ };
256
+ /**
257
+ * Lifecycle hook: Save conversation history after agent execution.
258
+ *
259
+ * Automatically converts LLM messages to storage format and saves with provider metadata.
260
+ * Skips save for sub-agent calls (parent agent handles persistence).
261
+ *
262
+ * @internal
263
+ */
264
+ ConversationAgent.prototype.afterRun = function (result, context) {
265
+ return __awaiter(this, void 0, void 0, function () {
266
+ var conversationId, messages, providerMetadata, conversationData, error_2;
267
+ var _a;
268
+ return __generator(this, function (_b) {
269
+ switch (_b.label) {
270
+ case 0:
271
+ conversationId = (_a = context.input) === null || _a === void 0 ? void 0 : _a.conversationId;
272
+ if (!conversationId) {
273
+ FlinkLog_1.log.debug("[".concat(this.id, "] No conversationId provided, skipping save"));
274
+ return [2 /*return*/];
275
+ }
276
+ // Skip save for sub-agent calls - parent handles persistence
277
+ if (context.isSubAgent) {
278
+ FlinkLog_1.log.debug("[".concat(this.id, "] Sub-agent execution, skipping save (parent handles persistence)"));
279
+ return [2 /*return*/];
280
+ }
281
+ _b.label = 1;
282
+ case 1:
283
+ _b.trys.push([1, 3, , 4]);
284
+ messages = this.convertToMessages(context.messages);
285
+ providerMetadata = result.providerMetadata;
286
+ conversationData = {
287
+ messages: messages,
288
+ providerMetadata: providerMetadata,
289
+ };
290
+ return [4 /*yield*/, this.saveConversation(conversationId, conversationData, result, context)];
291
+ case 2:
292
+ _b.sent();
293
+ FlinkLog_1.log.debug("[".concat(this.id, "] Saved conversation ").concat(conversationId, ": ").concat(messages.length, " messages, metadata=").concat(JSON.stringify(providerMetadata)));
294
+ return [3 /*break*/, 4];
295
+ case 3:
296
+ error_2 = _b.sent();
297
+ // Log but don't throw - request already succeeded, don't fail it now
298
+ FlinkLog_1.log.error("[".concat(this.id, "] Failed to save conversation ").concat(conversationId, ":"), error_2);
299
+ return [3 /*break*/, 4];
300
+ case 4: return [2 /*return*/];
301
+ }
302
+ });
303
+ });
304
+ };
305
+ /**
306
+ * Convert storage messages back to agent Message format for input.history.
307
+ *
308
+ * @param storageMessages - Messages from storage in StorageMessage format
309
+ * @returns Message array compatible with AgentExecuteInput.history
310
+ *
311
+ * @internal
312
+ */
313
+ ConversationAgent.prototype.convertToAgentMessages = function (storageMessages) {
314
+ return storageMessages.map(function (msg) {
315
+ if (msg.role === "user") {
316
+ return { role: "user", content: msg.content || "" };
317
+ }
318
+ else if (msg.role === "assistant") {
319
+ return {
320
+ role: "assistant",
321
+ content: msg.content || "",
322
+ toolCalls: msg.toolCalls,
323
+ };
324
+ }
325
+ else if (msg.role === "tool" && msg.toolResults && msg.toolResults.length > 0) {
326
+ // Tool results stored in storage format, convert to agent format
327
+ var toolResult = msg.toolResults[0]; // Take first result
328
+ return {
329
+ role: "tool",
330
+ toolCallId: toolResult.id,
331
+ toolName: "", // Not stored, but required by type
332
+ result: JSON.stringify(toolResult.result),
333
+ };
334
+ }
335
+ else {
336
+ // Fallback for unexpected cases
337
+ return { role: "user", content: msg.content || "" };
338
+ }
339
+ });
340
+ };
341
+ /**
342
+ * Convert LLM adapter messages to storage format for persistence.
343
+ *
344
+ * @param llmMessages - Messages from LLM adapter in their native format
345
+ * @returns StorageMessage array
346
+ *
347
+ * @internal
348
+ */
349
+ ConversationAgent.prototype.convertToMessages = function (llmMessages) {
350
+ var _this = this;
351
+ return llmMessages.map(function (msg) {
352
+ var message = {
353
+ role: msg.role,
354
+ };
355
+ // Handle content blocks
356
+ if (Array.isArray(msg.content)) {
357
+ var text = _this.extractTextFromBlocks(msg.content);
358
+ if (text)
359
+ message.content = text;
360
+ var toolCalls = _this.extractToolCalls(msg.content);
361
+ if (toolCalls.length > 0)
362
+ message.toolCalls = toolCalls;
363
+ var toolResults = _this.extractToolResults(msg.content);
364
+ if (toolResults.length > 0)
365
+ message.toolResults = toolResults;
366
+ }
367
+ else if (typeof msg.content === "string") {
368
+ message.content = msg.content;
369
+ }
370
+ return message;
371
+ });
372
+ };
373
+ /**
374
+ * Extract text content from message content blocks.
375
+ *
376
+ * @param blocks - Content blocks from LLM message
377
+ * @returns Concatenated text content, or undefined if no text blocks
378
+ *
379
+ * @internal
380
+ */
381
+ ConversationAgent.prototype.extractTextFromBlocks = function (blocks) {
382
+ var textBlocks = blocks.filter(function (block) { return block.type === "text"; });
383
+ if (textBlocks.length === 0)
384
+ return undefined;
385
+ return textBlocks.map(function (block) { return block.text; }).join("");
386
+ };
387
+ /**
388
+ * Extract tool calls from message content blocks.
389
+ *
390
+ * @param blocks - Content blocks from LLM message
391
+ * @returns Array of tool call objects
392
+ *
393
+ * @internal
394
+ */
395
+ ConversationAgent.prototype.extractToolCalls = function (blocks) {
396
+ return blocks
397
+ .filter(function (block) { return block.type === "tool_use"; })
398
+ .map(function (block) { return ({
399
+ id: block.id,
400
+ name: block.name,
401
+ input: block.input,
402
+ }); });
403
+ };
404
+ /**
405
+ * Extract tool results from message content blocks.
406
+ *
407
+ * @param blocks - Content blocks from LLM message
408
+ * @returns Array of tool result objects
409
+ *
410
+ * @internal
411
+ */
412
+ ConversationAgent.prototype.extractToolResults = function (blocks) {
413
+ return blocks
414
+ .filter(function (block) { return block.type === "tool_result"; })
415
+ .map(function (block) { return ({
416
+ id: block.tool_use_id,
417
+ result: block.content,
418
+ }); });
419
+ };
420
+ return ConversationAgent;
421
+ }(FlinkAgent_1.FlinkAgent));
422
+ exports.ConversationAgent = ConversationAgent;