@flink-app/flink 1.0.0 → 2.0.0-alpha.48

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 (109) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/cli/build.ts +8 -1
  3. package/cli/run.ts +8 -1
  4. package/dist/cli/build.js +8 -1
  5. package/dist/cli/run.js +8 -1
  6. package/dist/src/FlinkApp.d.ts +33 -0
  7. package/dist/src/FlinkApp.js +247 -27
  8. package/dist/src/FlinkContext.d.ts +21 -0
  9. package/dist/src/FlinkHttpHandler.d.ts +90 -1
  10. package/dist/src/TypeScriptCompiler.d.ts +42 -0
  11. package/dist/src/TypeScriptCompiler.js +346 -4
  12. package/dist/src/TypeScriptUtils.js +4 -0
  13. package/dist/src/ai/AgentRunner.d.ts +39 -0
  14. package/dist/src/ai/AgentRunner.js +625 -0
  15. package/dist/src/ai/FlinkAgent.d.ts +446 -0
  16. package/dist/src/ai/FlinkAgent.js +633 -0
  17. package/dist/src/ai/FlinkTool.d.ts +37 -0
  18. package/dist/src/ai/FlinkTool.js +2 -0
  19. package/dist/src/ai/LLMAdapter.d.ts +119 -0
  20. package/dist/src/ai/LLMAdapter.js +2 -0
  21. package/dist/src/ai/SubAgentExecutor.d.ts +36 -0
  22. package/dist/src/ai/SubAgentExecutor.js +220 -0
  23. package/dist/src/ai/ToolExecutor.d.ts +35 -0
  24. package/dist/src/ai/ToolExecutor.js +237 -0
  25. package/dist/src/ai/index.d.ts +5 -0
  26. package/dist/src/ai/index.js +21 -0
  27. package/dist/src/handlers/StreamWriterFactory.d.ts +20 -0
  28. package/dist/src/handlers/StreamWriterFactory.js +83 -0
  29. package/dist/src/index.d.ts +4 -0
  30. package/dist/src/index.js +4 -0
  31. package/dist/src/utils.d.ts +30 -0
  32. package/dist/src/utils.js +52 -0
  33. package/package.json +14 -2
  34. package/readme.md +425 -0
  35. package/spec/AgentDuplicateDetection.spec.ts +112 -0
  36. package/spec/AgentRunner.spec.ts +527 -0
  37. package/spec/ConversationHooks.spec.ts +290 -0
  38. package/spec/FlinkAgent.spec.ts +310 -0
  39. package/spec/FlinkApp.onError.spec.ts +1 -2
  40. package/spec/StreamingIntegration.spec.ts +138 -0
  41. package/spec/SubAgentSupport.spec.ts +941 -0
  42. package/spec/ToolExecutor.spec.ts +360 -0
  43. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCar.js +57 -0
  44. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCar2.js +59 -0
  45. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema.js +53 -0
  46. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema2.js +53 -0
  47. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema3.js +53 -0
  48. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithLiteralSchema.js +55 -0
  49. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithLiteralSchema2.js +55 -0
  50. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithSchemaInFile.js +58 -0
  51. package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithSchemaInFile2.js +58 -0
  52. package/spec/mock-project/dist/spec/mock-project/src/handlers/ManuallyAddedHandler.js +53 -0
  53. package/spec/mock-project/dist/spec/mock-project/src/handlers/ManuallyAddedHandler2.js +55 -0
  54. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchCar.js +58 -0
  55. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchOnboardingSession.js +76 -0
  56. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchOrderWithComplexTypes.js +58 -0
  57. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchProductWithIntersection.js +59 -0
  58. package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchUserWithUnion.js +59 -0
  59. package/spec/mock-project/dist/spec/mock-project/src/handlers/PostCar.js +55 -0
  60. package/spec/mock-project/dist/spec/mock-project/src/handlers/PostLogin.js +56 -0
  61. package/spec/mock-project/dist/spec/mock-project/src/handlers/PostLogout.js +55 -0
  62. package/spec/mock-project/dist/spec/mock-project/src/handlers/PutCar.js +55 -0
  63. package/spec/mock-project/dist/spec/mock-project/src/index.js +83 -0
  64. package/spec/mock-project/dist/spec/mock-project/src/repos/CarRepo.js +26 -0
  65. package/spec/mock-project/dist/spec/mock-project/src/schemas/Car.js +2 -0
  66. package/spec/mock-project/dist/spec/mock-project/src/schemas/DefaultExportSchema.js +2 -0
  67. package/spec/mock-project/dist/spec/mock-project/src/schemas/FileWithTwoSchemas.js +2 -0
  68. package/spec/mock-project/dist/src/FlinkApp.js +1012 -0
  69. package/spec/mock-project/dist/src/FlinkContext.js +2 -0
  70. package/spec/mock-project/dist/src/FlinkErrors.js +143 -0
  71. package/spec/mock-project/dist/src/FlinkHttpHandler.js +47 -0
  72. package/spec/mock-project/dist/src/FlinkJob.js +2 -0
  73. package/spec/mock-project/dist/src/FlinkLog.js +26 -0
  74. package/spec/mock-project/dist/src/FlinkPlugin.js +2 -0
  75. package/spec/mock-project/dist/src/FlinkRepo.js +224 -0
  76. package/spec/mock-project/dist/src/FlinkResponse.js +2 -0
  77. package/spec/mock-project/dist/src/ai/AgentExecutor.js +279 -0
  78. package/spec/mock-project/dist/src/ai/AgentRunner.js +625 -0
  79. package/spec/mock-project/dist/src/ai/FlinkAgent.js +633 -0
  80. package/spec/mock-project/dist/src/ai/FlinkTool.js +2 -0
  81. package/spec/mock-project/dist/src/ai/LLMAdapter.js +2 -0
  82. package/spec/mock-project/dist/src/ai/SubAgentExecutor.js +220 -0
  83. package/spec/mock-project/dist/src/ai/ToolExecutor.js +237 -0
  84. package/spec/mock-project/dist/src/auth/FlinkAuthPlugin.js +2 -0
  85. package/spec/mock-project/dist/src/auth/FlinkAuthUser.js +2 -0
  86. package/spec/mock-project/dist/src/handlers/StreamWriterFactory.js +83 -0
  87. package/spec/mock-project/dist/src/index.js +17 -69
  88. package/spec/mock-project/dist/src/mock-data-generator.js +9 -0
  89. package/spec/mock-project/dist/src/utils.js +290 -0
  90. package/spec/mock-project/tsconfig.json +6 -1
  91. package/spec/testHelpers.ts +49 -0
  92. package/spec/utils.caseConversion.spec.ts +80 -0
  93. package/spec/utils.spec.ts +13 -13
  94. package/src/FlinkApp.ts +251 -7
  95. package/src/FlinkContext.ts +22 -0
  96. package/src/FlinkHttpHandler.ts +100 -2
  97. package/src/TypeScriptCompiler.ts +398 -7
  98. package/src/TypeScriptUtils.ts +5 -0
  99. package/src/ai/AgentRunner.ts +549 -0
  100. package/src/ai/FlinkAgent.ts +770 -0
  101. package/src/ai/FlinkTool.ts +40 -0
  102. package/src/ai/LLMAdapter.ts +96 -0
  103. package/src/ai/SubAgentExecutor.ts +199 -0
  104. package/src/ai/ToolExecutor.ts +193 -0
  105. package/src/ai/index.ts +5 -0
  106. package/src/handlers/StreamWriterFactory.ts +84 -0
  107. package/src/index.ts +4 -0
  108. package/src/utils.ts +52 -0
  109. package/tsconfig.json +6 -1
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ 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);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
39
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
40
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
41
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
42
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
43
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
44
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
45
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
46
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
47
+ function fulfill(value) { resume("next", value); }
48
+ function reject(value) { resume("throw", value); }
49
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
50
+ };
51
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
52
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
53
+ var m = o[Symbol.asyncIterator], i;
54
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
55
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
56
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
57
+ };
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.AgentExecutor = void 0;
60
+ var AgentRunner_1 = require("./AgentRunner");
61
+ var FlinkLog_1 = require("../FlinkLog");
62
+ var AgentExecutor = /** @class */ (function () {
63
+ function AgentExecutor(agentProps, tools, ctx, llmAdapters, agentName) {
64
+ this.agentProps = agentProps;
65
+ this.tools = tools;
66
+ this.ctx = ctx;
67
+ this.llmAdapters = llmAdapters;
68
+ this.agentName = agentName;
69
+ }
70
+ /**
71
+ * Unified execution method - supports both awaiting and streaming
72
+ *
73
+ * Uses lazy generator pattern (similar to Vercel AI SDK) to allow
74
+ * multiple consumption without re-execution.
75
+ *
76
+ * Examples:
77
+ * const response = agent.run({ message: "Hello" });
78
+ * const result = await response.result; // Await final result
79
+ * for await (const text of response.textStream) { ... } // Stream text
80
+ * for await (const chunk of response.fullStream) { ... } // Stream all events
81
+ */
82
+ AgentExecutor.prototype.run = function (input) {
83
+ // Permission check
84
+ if (this.agentProps.permissions) {
85
+ this.checkPermissionsSync(input.user);
86
+ }
87
+ var runner = this.getRunner();
88
+ FlinkLog_1.log.debug("Running agent ".concat(this.agentName || "unknown"));
89
+ // Lazy evaluation - generator only starts when first consumed
90
+ var baseGenerator = null;
91
+ var buffer = [];
92
+ var done = false;
93
+ var getBaseGenerator = function () {
94
+ if (!baseGenerator) {
95
+ baseGenerator = runner.streamGenerator(input);
96
+ }
97
+ return baseGenerator;
98
+ };
99
+ // Create independent iterators that share buffered chunks
100
+ var createIterator = function () {
101
+ var index = 0;
102
+ return (function () {
103
+ return __asyncGenerator(this, arguments, function () {
104
+ var gen, _a, value, isDone;
105
+ return __generator(this, function (_b) {
106
+ switch (_b.label) {
107
+ case 0:
108
+ if (!true) return [3 /*break*/, 7];
109
+ if (!(index < buffer.length)) return [3 /*break*/, 3];
110
+ return [4 /*yield*/, __await(buffer[index++])];
111
+ case 1: return [4 /*yield*/, _b.sent()];
112
+ case 2:
113
+ _b.sent();
114
+ return [3 /*break*/, 0];
115
+ case 3:
116
+ // If already done, exit
117
+ if (done) {
118
+ return [3 /*break*/, 7];
119
+ }
120
+ gen = getBaseGenerator();
121
+ return [4 /*yield*/, __await(gen.next())];
122
+ case 4:
123
+ _a = _b.sent(), value = _a.value, isDone = _a.done;
124
+ if (isDone) {
125
+ done = true;
126
+ return [3 /*break*/, 7];
127
+ }
128
+ // Buffer and yield
129
+ buffer.push(value);
130
+ return [4 /*yield*/, __await(value)];
131
+ case 5: return [4 /*yield*/, _b.sent()];
132
+ case 6:
133
+ _b.sent();
134
+ index++;
135
+ return [3 /*break*/, 0];
136
+ case 7: return [2 /*return*/];
137
+ }
138
+ });
139
+ });
140
+ })();
141
+ };
142
+ return {
143
+ result: this.consumeAsResult(createIterator()),
144
+ textStream: this.consumeAsTextStream(createIterator()),
145
+ fullStream: createIterator(),
146
+ };
147
+ };
148
+ /**
149
+ * Consume stream as final result (for await pattern)
150
+ */
151
+ AgentExecutor.prototype.consumeAsResult = function (stream) {
152
+ return __awaiter(this, void 0, void 0, function () {
153
+ var result, chunk, e_1_1;
154
+ var _a, stream_1, stream_1_1;
155
+ var _b, e_1, _c, _d;
156
+ return __generator(this, function (_e) {
157
+ switch (_e.label) {
158
+ case 0:
159
+ _e.trys.push([0, 5, 6, 11]);
160
+ _a = true, stream_1 = __asyncValues(stream);
161
+ _e.label = 1;
162
+ case 1: return [4 /*yield*/, stream_1.next()];
163
+ case 2:
164
+ if (!(stream_1_1 = _e.sent(), _b = stream_1_1.done, !_b)) return [3 /*break*/, 4];
165
+ _d = stream_1_1.value;
166
+ _a = false;
167
+ chunk = _d;
168
+ if (chunk.type === "complete") {
169
+ result = chunk.result;
170
+ }
171
+ _e.label = 3;
172
+ case 3:
173
+ _a = true;
174
+ return [3 /*break*/, 1];
175
+ case 4: return [3 /*break*/, 11];
176
+ case 5:
177
+ e_1_1 = _e.sent();
178
+ e_1 = { error: e_1_1 };
179
+ return [3 /*break*/, 11];
180
+ case 6:
181
+ _e.trys.push([6, , 9, 10]);
182
+ if (!(!_a && !_b && (_c = stream_1.return))) return [3 /*break*/, 8];
183
+ return [4 /*yield*/, _c.call(stream_1)];
184
+ case 7:
185
+ _e.sent();
186
+ _e.label = 8;
187
+ case 8: return [3 /*break*/, 10];
188
+ case 9:
189
+ if (e_1) throw e_1.error;
190
+ return [7 /*endfinally*/];
191
+ case 10: return [7 /*endfinally*/];
192
+ case 11:
193
+ if (!result) {
194
+ throw new Error("Agent execution did not complete");
195
+ }
196
+ return [2 /*return*/, result];
197
+ }
198
+ });
199
+ });
200
+ };
201
+ /**
202
+ * Consume stream as text-only stream (for simple streaming UX)
203
+ */
204
+ AgentExecutor.prototype.consumeAsTextStream = function (stream) {
205
+ return __asyncGenerator(this, arguments, function consumeAsTextStream_1() {
206
+ var _a, stream_2, stream_2_1, chunk, e_2_1;
207
+ var _b, e_2, _c, _d;
208
+ return __generator(this, function (_e) {
209
+ switch (_e.label) {
210
+ case 0:
211
+ _e.trys.push([0, 7, 8, 13]);
212
+ _a = true, stream_2 = __asyncValues(stream);
213
+ _e.label = 1;
214
+ case 1: return [4 /*yield*/, __await(stream_2.next())];
215
+ case 2:
216
+ if (!(stream_2_1 = _e.sent(), _b = stream_2_1.done, !_b)) return [3 /*break*/, 6];
217
+ _d = stream_2_1.value;
218
+ _a = false;
219
+ chunk = _d;
220
+ if (!(chunk.type === "text_delta")) return [3 /*break*/, 5];
221
+ return [4 /*yield*/, __await(chunk.delta)];
222
+ case 3: return [4 /*yield*/, _e.sent()];
223
+ case 4:
224
+ _e.sent();
225
+ _e.label = 5;
226
+ case 5:
227
+ _a = true;
228
+ return [3 /*break*/, 1];
229
+ case 6: return [3 /*break*/, 13];
230
+ case 7:
231
+ e_2_1 = _e.sent();
232
+ e_2 = { error: e_2_1 };
233
+ return [3 /*break*/, 13];
234
+ case 8:
235
+ _e.trys.push([8, , 11, 12]);
236
+ if (!(!_a && !_b && (_c = stream_2.return))) return [3 /*break*/, 10];
237
+ return [4 /*yield*/, __await(_c.call(stream_2))];
238
+ case 9:
239
+ _e.sent();
240
+ _e.label = 10;
241
+ case 10: return [3 /*break*/, 12];
242
+ case 11:
243
+ if (e_2) throw e_2.error;
244
+ return [7 /*endfinally*/];
245
+ case 12: return [7 /*endfinally*/];
246
+ case 13: return [2 /*return*/];
247
+ }
248
+ });
249
+ });
250
+ };
251
+ AgentExecutor.prototype.getRunner = function () {
252
+ if (!this.runner) {
253
+ this.runner = new AgentRunner_1.AgentRunner(this.agentProps, this.tools, this.llmAdapters, this.agentName);
254
+ }
255
+ return this.runner;
256
+ };
257
+ AgentExecutor.prototype.checkPermissionsSync = function (user) {
258
+ var perms = this.agentProps.permissions;
259
+ if (!perms)
260
+ return;
261
+ if (typeof perms === "function") {
262
+ var hasPermission = perms(user);
263
+ if (!hasPermission) {
264
+ throw new Error("Permission denied for agent ".concat(this.agentName || "unknown"));
265
+ }
266
+ return;
267
+ }
268
+ if (!user) {
269
+ throw new Error("Permission denied for agent ".concat(this.agentName || "unknown"));
270
+ }
271
+ var requiredPerms = Array.isArray(perms) ? perms : [perms];
272
+ var userPerms = user.permissions || [];
273
+ if (!requiredPerms.every(function (p) { return userPerms.includes(p); })) {
274
+ throw new Error("Permission denied for agent ".concat(this.agentName || "unknown"));
275
+ }
276
+ };
277
+ return AgentExecutor;
278
+ }());
279
+ exports.AgentExecutor = AgentExecutor;