@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.
- package/CHANGELOG.md +1051 -0
- package/SCHEMA_EXTRACTION_ANALYSIS.md +494 -0
- package/SIMPLE_AST_FEASIBILITY.md +570 -0
- package/bin/flink.ts +13 -2
- package/cli/build.ts +24 -44
- package/cli/clean.ts +13 -25
- package/cli/cli-utils.ts +190 -17
- package/cli/dev.ts +252 -0
- package/cli/loadEnvFiles.ts +116 -0
- package/cli/run.ts +45 -62
- package/dist/bin/flink.js +61 -2
- package/dist/cli/build.js +20 -25
- package/dist/cli/clean.js +12 -10
- package/dist/cli/cli-utils.d.ts +34 -3
- package/dist/cli/cli-utils.js +193 -12
- package/dist/cli/dev.d.ts +2 -0
- package/dist/cli/dev.js +279 -0
- package/dist/cli/loadEnvFiles.d.ts +30 -0
- package/dist/cli/loadEnvFiles.js +113 -0
- package/dist/cli/run.js +47 -46
- package/dist/src/DependencyTracker.d.ts +44 -0
- package/dist/src/DependencyTracker.js +239 -0
- package/dist/src/FlinkApp.d.ts +163 -10
- package/dist/src/FlinkApp.js +847 -184
- package/dist/src/FlinkContext.d.ts +41 -0
- package/dist/src/FlinkErrors.d.ts +19 -6
- package/dist/src/FlinkErrors.js +36 -42
- package/dist/src/FlinkHttpHandler.d.ts +219 -26
- package/dist/src/FlinkHttpHandler.js +37 -1
- package/dist/src/FlinkJob.d.ts +10 -0
- package/dist/src/FlinkLog.d.ts +82 -18
- package/dist/src/FlinkLog.js +165 -13
- package/dist/src/FlinkLogFactory.d.ts +288 -0
- package/dist/src/FlinkLogFactory.js +619 -0
- package/dist/src/FlinkRepo.d.ts +10 -2
- package/dist/src/FlinkRepo.js +11 -1
- package/dist/src/FlinkRequestContext.d.ts +63 -0
- package/dist/src/FlinkRequestContext.js +74 -0
- package/dist/src/FlinkResponse.d.ts +6 -0
- package/dist/src/FlinkService.d.ts +38 -0
- package/dist/src/FlinkService.js +46 -0
- package/dist/src/LeaderElection.d.ts +45 -0
- package/dist/src/LeaderElection.js +269 -0
- package/dist/src/SchemaCache.d.ts +84 -0
- package/dist/src/SchemaCache.js +289 -0
- package/dist/src/TypeScriptCompiler.d.ts +161 -51
- package/dist/src/TypeScriptCompiler.js +1253 -617
- package/dist/src/TypeScriptUtils.js +4 -0
- package/dist/src/ai/AgentRunner.d.ts +39 -0
- package/dist/src/ai/AgentRunner.js +760 -0
- package/dist/src/ai/ConversationAgent.d.ts +279 -0
- package/dist/src/ai/ConversationAgent.js +404 -0
- package/dist/src/ai/ConversationFlinkAgent.d.ts +278 -0
- package/dist/src/ai/ConversationFlinkAgent.js +404 -0
- package/dist/src/ai/FlinkAgent.d.ts +690 -0
- package/dist/src/ai/FlinkAgent.js +729 -0
- package/dist/src/ai/FlinkTool.d.ts +135 -0
- package/dist/src/ai/FlinkTool.js +2 -0
- package/dist/src/ai/InMemoryConversationAgent.d.ts +121 -0
- package/dist/src/ai/InMemoryConversationAgent.js +209 -0
- package/dist/src/ai/LLMAdapter.d.ts +148 -0
- package/dist/src/ai/LLMAdapter.js +2 -0
- package/dist/src/ai/PersistentFlinkAgent.d.ts +278 -0
- package/dist/src/ai/PersistentFlinkAgent.js +403 -0
- package/dist/src/ai/SubAgentExecutor.d.ts +38 -0
- package/dist/src/ai/SubAgentExecutor.js +223 -0
- package/dist/src/ai/ToolExecutor.d.ts +64 -0
- package/dist/src/ai/ToolExecutor.js +497 -0
- package/dist/src/ai/agentInstructions.d.ts +68 -0
- package/dist/src/ai/agentInstructions.js +286 -0
- package/dist/src/ai/index.d.ts +8 -0
- package/dist/src/ai/index.js +26 -0
- package/dist/src/ai/instructionFileLoader.d.ts +44 -0
- package/dist/src/ai/instructionFileLoader.js +179 -0
- package/dist/src/auth/FlinkAuthPlugin.d.ts +1 -1
- package/dist/src/handlers/StreamWriterFactory.d.ts +20 -0
- package/dist/src/handlers/StreamWriterFactory.js +83 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.js +17 -0
- package/dist/src/loadPluginSchemas.d.ts +45 -0
- package/dist/src/loadPluginSchemas.js +143 -0
- package/dist/src/schema-extraction/ComplexTypeDetection.d.ts +40 -0
- package/dist/src/schema-extraction/ComplexTypeDetection.js +75 -0
- package/dist/src/schema-extraction/TypeScriptSourceParser.d.ts +321 -0
- package/dist/src/schema-extraction/TypeScriptSourceParser.js +925 -0
- package/dist/src/schema-extraction/TypeScriptSourceParser.spec.d.ts +1 -0
- package/dist/src/schema-extraction/TypeScriptSourceParser.spec.js +233 -0
- package/dist/src/schema-extraction/TypeScriptTokenizer.d.ts +57 -0
- package/dist/src/schema-extraction/TypeScriptTokenizer.js +177 -0
- package/dist/src/schema-extraction/index.d.ts +2 -0
- package/dist/src/schema-extraction/index.js +20 -0
- package/dist/src/schema-extraction/types.d.ts +31 -0
- package/dist/src/schema-extraction/types.js +2 -0
- package/dist/src/utils/loadFlinkConfig.d.ts +53 -0
- package/dist/src/utils/loadFlinkConfig.js +77 -0
- package/dist/src/utils.d.ts +30 -0
- package/dist/src/utils.js +52 -0
- package/dist/src/workers/SchemaGeneratorWorker.d.ts +1 -0
- package/dist/src/workers/SchemaGeneratorWorker.js +49 -0
- package/dist/src/workers/WorkerPool.d.ts +60 -0
- package/dist/src/workers/WorkerPool.js +306 -0
- package/examples/logging-hierarchical-example.ts +125 -0
- package/package.json +29 -4
- package/readme.md +499 -0
- package/spec/AgentDescendantDetection.spec.ts +335 -0
- package/spec/AgentDuplicateDetection.spec.ts +112 -0
- package/spec/AgentObserver.spec.ts +266 -0
- package/spec/AgentRunner.spec.ts +1062 -0
- package/spec/AsyncLocalStorageContext.spec.ts +223 -0
- package/spec/ConversationHooks.spec.ts +257 -0
- package/spec/FlinkAgent.spec.ts +681 -0
- package/spec/FlinkApp.htmlResponse.spec.ts +260 -0
- package/spec/FlinkApp.onError.invocation.spec.ts +151 -0
- package/spec/FlinkApp.onError.spec.ts +1 -2
- package/spec/FlinkApp.query.spec.ts +107 -0
- package/spec/FlinkApp.routeOrdering.spec.ts +61 -0
- package/spec/FlinkApp.undefinedResponse.spec.ts +123 -0
- package/spec/FlinkApp.validationMode.spec.ts +155 -0
- package/spec/FlinkJob.spec.ts +171 -0
- package/spec/FlinkLogFactory.spec.ts +337 -0
- package/spec/FlinkRepo.spec.ts +1 -1
- package/spec/LeaderElection.spec.ts +174 -0
- package/spec/StreamingIntegration.spec.ts +139 -0
- package/spec/ToolExecutor.spec.ts +465 -0
- package/spec/TypeScriptCompiler.spec.ts +1 -1
- package/spec/TypeScriptSourceParser.spec.ts +1215 -0
- package/spec/TypeScriptTokenizer.spec.ts +366 -0
- package/spec/ai/ContextCompaction.spec.ts +405 -0
- package/spec/ai/ConversationAgent.spec.ts +520 -0
- package/spec/ai/InMemoryConversationAgent.spec.ts +144 -0
- package/spec/ai/agentInstructions.spec.ts +358 -0
- package/spec/fixtures/agent-instructions/TestAgent.ts +24 -0
- package/spec/fixtures/agent-instructions/simple.md +3 -0
- package/spec/fixtures/agent-instructions/template.md +18 -0
- package/spec/fixtures/agent-instructions/yaml-format.yaml +9 -0
- package/spec/mock-project/dist/.tsbuildinfo +1 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCar.js +56 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCar2.js +58 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema.js +52 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema2.js +52 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithArraySchema3.js +52 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithLiteralSchema.js +54 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithLiteralSchema2.js +54 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithSchemaInFile.js +57 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/GetCarWithSchemaInFile2.js +57 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/ManuallyAddedHandler.js +53 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/ManuallyAddedHandler2.js +55 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchCar.js +57 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchOnboardingSession.js +75 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchOrderWithComplexTypes.js +57 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchProductWithIntersection.js +58 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PatchUserWithUnion.js +58 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PostCar.js +54 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PostLogin.js +55 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PostLogout.js +54 -0
- package/spec/mock-project/dist/spec/mock-project/src/handlers/PutCar.js +54 -0
- package/spec/mock-project/dist/spec/mock-project/src/index.js +83 -0
- package/spec/mock-project/dist/spec/mock-project/src/repos/CarRepo.js +26 -0
- package/spec/mock-project/dist/spec/mock-project/src/schemas/Car.js +2 -0
- package/spec/mock-project/dist/spec/mock-project/src/schemas/DefaultExportSchema.js +2 -0
- package/spec/mock-project/dist/spec/mock-project/src/schemas/FileWithTwoSchemas.js +2 -0
- package/spec/mock-project/dist/src/FlinkApp.js +1000 -0
- package/spec/mock-project/dist/src/FlinkContext.js +2 -0
- package/spec/mock-project/dist/src/FlinkErrors.js +143 -0
- package/spec/mock-project/dist/src/FlinkHttpHandler.js +47 -0
- package/spec/mock-project/dist/src/FlinkJob.js +2 -0
- package/spec/mock-project/dist/src/FlinkLog.js +119 -0
- package/spec/mock-project/dist/src/FlinkLogFactory.js +617 -0
- package/spec/mock-project/dist/src/FlinkPlugin.js +2 -0
- package/spec/mock-project/dist/src/FlinkRepo.js +224 -0
- package/spec/mock-project/dist/src/FlinkRequestContext.js +74 -0
- package/spec/mock-project/dist/src/FlinkResponse.js +2 -0
- package/spec/mock-project/dist/src/ai/AgentExecutor.js +279 -0
- package/spec/mock-project/dist/src/ai/AgentRunner.js +632 -0
- package/spec/mock-project/dist/src/ai/ConversationAgent.js +402 -0
- package/spec/mock-project/dist/src/ai/ConversationFlinkAgent.js +422 -0
- package/spec/mock-project/dist/src/ai/FlinkAgent.js +699 -0
- package/spec/mock-project/dist/src/ai/FlinkTool.js +2 -0
- package/spec/mock-project/dist/src/ai/InMemoryConversationAgent.js +209 -0
- package/spec/mock-project/dist/src/ai/LLMAdapter.js +2 -0
- package/spec/mock-project/dist/src/ai/SubAgentExecutor.js +223 -0
- package/spec/mock-project/dist/src/ai/ToolExecutor.js +412 -0
- package/spec/mock-project/dist/src/ai/agentInstructions.js +246 -0
- package/spec/mock-project/dist/src/auth/FlinkAuthPlugin.js +2 -0
- package/spec/mock-project/dist/src/auth/FlinkAuthUser.js +2 -0
- package/spec/mock-project/dist/src/handlers/GetCar.js +26 -52
- package/spec/mock-project/dist/src/handlers/GetCar.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCar2.js +32 -54
- package/spec/mock-project/dist/src/handlers/GetCar2.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema.js +26 -48
- package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema2.js +28 -48
- package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema2.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema3.js +29 -48
- package/spec/mock-project/dist/src/handlers/GetCarWithArraySchema3.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema.js +26 -50
- package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema2.js +28 -50
- package/spec/mock-project/dist/src/handlers/GetCarWithLiteralSchema2.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile.js +27 -53
- package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile2.js +29 -53
- package/spec/mock-project/dist/src/handlers/GetCarWithSchemaInFile2.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler.js +16 -49
- package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler2.js +25 -50
- package/spec/mock-project/dist/src/handlers/ManuallyAddedHandler2.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PatchCar.js +27 -53
- package/spec/mock-project/dist/src/handlers/PatchCar.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PatchOnboardingSession.js +44 -70
- package/spec/mock-project/dist/src/handlers/PatchOnboardingSession.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PatchOrderWithComplexTypes.js +27 -53
- package/spec/mock-project/dist/src/handlers/PatchOrderWithComplexTypes.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PatchProductWithIntersection.js +28 -54
- package/spec/mock-project/dist/src/handlers/PatchProductWithIntersection.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PatchUserWithUnion.js +28 -54
- package/spec/mock-project/dist/src/handlers/PatchUserWithUnion.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PostCar.js +24 -50
- package/spec/mock-project/dist/src/handlers/PostCar.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PostLogin.js +25 -51
- package/spec/mock-project/dist/src/handlers/PostLogin.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PostLogout.js +24 -50
- package/spec/mock-project/dist/src/handlers/PostLogout.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/PutCar.js +24 -50
- package/spec/mock-project/dist/src/handlers/PutCar.js.map +1 -0
- package/spec/mock-project/dist/src/handlers/StreamWriterFactory.js +83 -0
- package/spec/mock-project/dist/src/index.js +52 -76
- package/spec/mock-project/dist/src/index.js.map +1 -0
- package/spec/mock-project/dist/src/mock-data-generator.js +9 -0
- package/spec/mock-project/dist/src/repos/CarRepo.js +12 -24
- package/spec/mock-project/dist/src/repos/CarRepo.js.map +1 -0
- package/spec/mock-project/dist/src/schemas/Car.js +3 -1
- package/spec/mock-project/dist/src/schemas/Car.js.map +1 -0
- package/spec/mock-project/dist/src/schemas/DefaultExportSchema.js +3 -1
- package/spec/mock-project/dist/src/schemas/DefaultExportSchema.js.map +1 -0
- package/spec/mock-project/dist/src/schemas/FileWithTwoSchemas.js +3 -1
- package/spec/mock-project/dist/src/schemas/FileWithTwoSchemas.js.map +1 -0
- package/spec/mock-project/dist/src/utils.js +290 -0
- package/spec/mock-project/tsconfig.json +6 -1
- package/spec/schema-generation-nested-objects.spec.ts +97 -0
- package/spec/testHelpers.ts +49 -0
- package/spec/utils.caseConversion.spec.ts +78 -0
- package/spec/utils.spec.ts +13 -13
- package/src/DependencyTracker.ts +166 -0
- package/src/FlinkApp.ts +919 -155
- package/src/FlinkContext.ts +43 -0
- package/src/FlinkErrors.ts +32 -12
- package/src/FlinkHttpHandler.ts +246 -28
- package/src/FlinkJob.ts +11 -0
- package/src/FlinkLog.ts +119 -12
- package/src/FlinkLogFactory.ts +699 -0
- package/src/FlinkRepo.ts +10 -3
- package/src/FlinkRequestContext.ts +95 -0
- package/src/FlinkResponse.ts +6 -0
- package/src/FlinkService.ts +49 -0
- package/src/LeaderElection.ts +203 -0
- package/src/SchemaCache.ts +232 -0
- package/src/TypeScriptCompiler.ts +1347 -610
- package/src/TypeScriptUtils.ts +5 -0
- package/src/ai/AgentRunner.ts +646 -0
- package/src/ai/ConversationAgent.ts +413 -0
- package/src/ai/FlinkAgent.ts +1069 -0
- package/src/ai/FlinkTool.ts +165 -0
- package/src/ai/InMemoryConversationAgent.ts +149 -0
- package/src/ai/LLMAdapter.ts +126 -0
- package/src/ai/ToolExecutor.ts +485 -0
- package/src/ai/agentInstructions.ts +245 -0
- package/src/ai/index.ts +8 -0
- package/src/ai/instructionFileLoader.ts +156 -0
- package/src/auth/FlinkAuthPlugin.ts +2 -1
- package/src/handlers/StreamWriterFactory.ts +84 -0
- package/src/index.ts +14 -0
- package/src/loadPluginSchemas.ts +141 -0
- package/src/schema-extraction/TypeScriptSourceParser.ts +1058 -0
- package/src/schema-extraction/TypeScriptTokenizer.ts +205 -0
- package/src/schema-extraction/index.ts +2 -0
- package/src/schema-extraction/types.ts +34 -0
- package/src/utils/loadFlinkConfig.ts +89 -0
- package/src/utils.ts +52 -0
- package/tsconfig.json +6 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
+
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);
|
|
47
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
+
function step(op) {
|
|
50
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
52
|
+
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;
|
|
53
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
+
switch (op[0]) {
|
|
55
|
+
case 0: case 1: t = op; break;
|
|
56
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
+
default:
|
|
60
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
+
if (t[2]) _.ops.pop();
|
|
65
|
+
_.trys.pop(); continue;
|
|
66
|
+
}
|
|
67
|
+
op = body.call(thisArg, _);
|
|
68
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
73
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
74
|
+
};
|
|
75
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
76
|
+
exports.agentInstructions = agentInstructions;
|
|
77
|
+
var fs = __importStar(require("fs"));
|
|
78
|
+
var path = __importStar(require("path"));
|
|
79
|
+
var handlebars_1 = __importDefault(require("handlebars"));
|
|
80
|
+
/**
|
|
81
|
+
* In-memory file cache (per-process, not persistent)
|
|
82
|
+
*/
|
|
83
|
+
var fileCache = new Map();
|
|
84
|
+
/**
|
|
85
|
+
* Get caller's file location using stack trace API
|
|
86
|
+
* This enables agent-relative path resolution for ./ and ../ prefixes
|
|
87
|
+
*
|
|
88
|
+
* Walks the stack to find the first frame outside this file,
|
|
89
|
+
* which is the agent class that called agentInstructions().
|
|
90
|
+
*/
|
|
91
|
+
function getCallerFilePath() {
|
|
92
|
+
var _a, _b;
|
|
93
|
+
var originalPrepareStackTrace = Error.prepareStackTrace;
|
|
94
|
+
Error.prepareStackTrace = function (_, stack) { return stack; };
|
|
95
|
+
var stack = new Error().stack;
|
|
96
|
+
Error.prepareStackTrace = originalPrepareStackTrace;
|
|
97
|
+
// Find first frame outside this file (skips getCallerFilePath, resolveFilePath, agentInstructions)
|
|
98
|
+
var thisFile = (_a = stack[0]) === null || _a === void 0 ? void 0 : _a.getFileName();
|
|
99
|
+
for (var i = 1; i < stack.length; i++) {
|
|
100
|
+
var fileName = (_b = stack[i]) === null || _b === void 0 ? void 0 : _b.getFileName();
|
|
101
|
+
if (fileName && fileName !== thisFile) {
|
|
102
|
+
return fileName;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
throw new Error("Could not determine caller file location for agent-relative path");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve file path based on prefix:
|
|
109
|
+
* - ./ or ../ = agent-relative (using caller's location)
|
|
110
|
+
* - otherwise = project root-relative
|
|
111
|
+
*/
|
|
112
|
+
function resolveFilePath(filePath) {
|
|
113
|
+
// Always try project root-relative first (most intuitive for users)
|
|
114
|
+
var cwdResolved = path.join(process.cwd(), filePath);
|
|
115
|
+
if (fs.existsSync(cwdResolved)) {
|
|
116
|
+
return cwdResolved;
|
|
117
|
+
}
|
|
118
|
+
if (filePath.startsWith("./") || filePath.startsWith("../")) {
|
|
119
|
+
// Agent-relative: get caller's file location via stack trace
|
|
120
|
+
var callerFile = getCallerFilePath();
|
|
121
|
+
var resolved = path.resolve(path.dirname(callerFile), filePath);
|
|
122
|
+
if (fs.existsSync(resolved)) {
|
|
123
|
+
return resolved;
|
|
124
|
+
}
|
|
125
|
+
// At runtime, callerFile points to compiled JS in dist/.
|
|
126
|
+
// Non-JS assets (e.g. .md instruction files) live in the source tree,
|
|
127
|
+
// so try the equivalent source path with dist/ removed.
|
|
128
|
+
var distIndex = resolved.lastIndexOf(path.sep + "dist" + path.sep);
|
|
129
|
+
if (distIndex !== -1) {
|
|
130
|
+
var sourcePath = resolved.substring(0, distIndex) + resolved.substring(distIndex + 5); // remove "/dist"
|
|
131
|
+
if (fs.existsSync(sourcePath)) {
|
|
132
|
+
return sourcePath;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return resolved;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Project root-relative
|
|
139
|
+
return cwdResolved;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Load file contents with smart caching
|
|
144
|
+
* Cache is invalidated when file modification time changes
|
|
145
|
+
*/
|
|
146
|
+
function loadFile(resolvedPath, originalPath) {
|
|
147
|
+
try {
|
|
148
|
+
var stats = fs.statSync(resolvedPath);
|
|
149
|
+
var mtime = stats.mtimeMs;
|
|
150
|
+
// Check cache
|
|
151
|
+
var cached = fileCache.get(resolvedPath);
|
|
152
|
+
if (cached && cached.mtime === mtime) {
|
|
153
|
+
return cached;
|
|
154
|
+
}
|
|
155
|
+
// Read file and update cache (clear compiled template on file change)
|
|
156
|
+
var content = fs.readFileSync(resolvedPath, "utf-8");
|
|
157
|
+
var entry = { content: content, mtime: mtime };
|
|
158
|
+
fileCache.set(resolvedPath, entry);
|
|
159
|
+
return entry;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
if (err.code === "ENOENT") {
|
|
163
|
+
throw new Error("Agent instructions file not found: ".concat(resolvedPath, " (from: ").concat(originalPath, ")"));
|
|
164
|
+
}
|
|
165
|
+
throw new Error("Failed to load agent instructions file: ".concat(resolvedPath, " - ").concat(err.message));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Render template using Handlebars with compiled template caching.
|
|
170
|
+
* Skips Handlebars entirely when content has no template expressions.
|
|
171
|
+
*/
|
|
172
|
+
function renderTemplate(cached, data, filePath) {
|
|
173
|
+
if (cached.hasTemplateExpressions === false) {
|
|
174
|
+
return cached.content;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
if (!cached.compiledTemplate) {
|
|
178
|
+
cached.hasTemplateExpressions = /\{\{/.test(cached.content);
|
|
179
|
+
if (!cached.hasTemplateExpressions) {
|
|
180
|
+
return cached.content;
|
|
181
|
+
}
|
|
182
|
+
cached.compiledTemplate = handlebars_1.default.compile(cached.content);
|
|
183
|
+
}
|
|
184
|
+
return cached.compiledTemplate(data);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
throw new Error("Failed to render template in ".concat(filePath, ": ").concat(err.message));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Load agent instructions from external files with template variable support
|
|
192
|
+
*
|
|
193
|
+
* Supports multiple file types: .md, .yaml, .txt, etc. (loaded as plain text)
|
|
194
|
+
*
|
|
195
|
+
* ## Path Resolution
|
|
196
|
+
*
|
|
197
|
+
* - `./` or `../` prefix: Agent-relative path (based on caller's file location)
|
|
198
|
+
* - Otherwise: Project root-relative path
|
|
199
|
+
*
|
|
200
|
+
* ## Template Variables
|
|
201
|
+
*
|
|
202
|
+
* Uses Handlebars templating with automatic context helpers:
|
|
203
|
+
* - `ctx`: Full FlinkContext
|
|
204
|
+
* - `agentContext`: AgentExecuteContext
|
|
205
|
+
* - `user`: Shortcut to agentContext.user
|
|
206
|
+
* - Custom variables from static object or callback
|
|
207
|
+
*
|
|
208
|
+
* ## Caching
|
|
209
|
+
*
|
|
210
|
+
* Files are cached in-memory and reloaded only when modification time changes
|
|
211
|
+
*
|
|
212
|
+
* @example Agent-relative path with static variables
|
|
213
|
+
* ```typescript
|
|
214
|
+
* export default class CarAgent extends FlinkAgent<AppCtx> {
|
|
215
|
+
* id = "car-agent";
|
|
216
|
+
* instructions = agentInstructions("./instructions/car-agent.md");
|
|
217
|
+
* tools = [SearchCarsTool];
|
|
218
|
+
* }
|
|
219
|
+
* ```
|
|
220
|
+
*
|
|
221
|
+
* @example Dynamic variables with callback
|
|
222
|
+
* ```typescript
|
|
223
|
+
* export default class SupportAgent extends FlinkAgent<AppCtx> {
|
|
224
|
+
* id = "support-agent";
|
|
225
|
+
* instructions = agentInstructions(
|
|
226
|
+
* "./instructions/support-agent.md",
|
|
227
|
+
* (ctx, agentContext) => ({
|
|
228
|
+
* isBusinessHours: new Date().getHours() >= 9 && new Date().getHours() < 17,
|
|
229
|
+
* customerTier: agentContext.user?.tier || "standard",
|
|
230
|
+
* })
|
|
231
|
+
* );
|
|
232
|
+
* tools = [CreateTicketTool];
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
*
|
|
236
|
+
* @example Template file (instructions/support-agent.md)
|
|
237
|
+
* ```markdown
|
|
238
|
+
* You are a customer support agent.
|
|
239
|
+
*
|
|
240
|
+
* Customer: {{user.name}} ({{customerTier}})
|
|
241
|
+
* {{#if user.isPremium}}
|
|
242
|
+
* ⭐ VIP CUSTOMER - Provide white-glove service!
|
|
243
|
+
* {{/if}}
|
|
244
|
+
*
|
|
245
|
+
* {{#unless isBusinessHours}}
|
|
246
|
+
* NOTE: Outside business hours. Suggest emergency contact.
|
|
247
|
+
* {{/unless}}
|
|
248
|
+
* ```
|
|
249
|
+
*
|
|
250
|
+
* @param filePath - Path to instructions file (./ for agent-relative, otherwise project root)
|
|
251
|
+
* @param variables - Static object or callback returning template variables
|
|
252
|
+
* @returns InstructionsCallback compatible with FlinkAgent.instructions property
|
|
253
|
+
*/
|
|
254
|
+
function agentInstructions(filePath, variables) {
|
|
255
|
+
var _this = this;
|
|
256
|
+
// Resolve path once at definition time for early validation
|
|
257
|
+
var resolvedPath = resolveFilePath(filePath);
|
|
258
|
+
// Return callback that will be invoked by FlinkAgent
|
|
259
|
+
return function (ctx, agentContext) { return __awaiter(_this, void 0, void 0, function () {
|
|
260
|
+
var cached, vars, templateData;
|
|
261
|
+
return __generator(this, function (_a) {
|
|
262
|
+
switch (_a.label) {
|
|
263
|
+
case 0:
|
|
264
|
+
cached = loadFile(resolvedPath, filePath);
|
|
265
|
+
// Skip template processing entirely when no expressions exist
|
|
266
|
+
if (cached.hasTemplateExpressions === false) {
|
|
267
|
+
return [2 /*return*/, cached.content];
|
|
268
|
+
}
|
|
269
|
+
vars = {};
|
|
270
|
+
if (!variables) return [3 /*break*/, 3];
|
|
271
|
+
if (!(typeof variables === "function")) return [3 /*break*/, 2];
|
|
272
|
+
return [4 /*yield*/, Promise.resolve(variables(ctx, agentContext))];
|
|
273
|
+
case 1:
|
|
274
|
+
vars = _a.sent();
|
|
275
|
+
return [3 /*break*/, 3];
|
|
276
|
+
case 2:
|
|
277
|
+
vars = variables;
|
|
278
|
+
_a.label = 3;
|
|
279
|
+
case 3:
|
|
280
|
+
templateData = __assign(__assign({}, vars), { ctx: ctx, agentContext: agentContext, user: agentContext.user });
|
|
281
|
+
// Render template (compiles and caches Handlebars template on first call)
|
|
282
|
+
return [2 /*return*/, renderTemplate(cached, templateData, resolvedPath)];
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}); };
|
|
286
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./FlinkTool";
|
|
2
|
+
export * from "./FlinkAgent";
|
|
3
|
+
export * from "./ConversationAgent";
|
|
4
|
+
export * from "./InMemoryConversationAgent";
|
|
5
|
+
export * from "./ToolExecutor";
|
|
6
|
+
export * from "./AgentRunner";
|
|
7
|
+
export * from "./LLMAdapter";
|
|
8
|
+
export { agentInstructions } from "./agentInstructions";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.agentInstructions = void 0;
|
|
18
|
+
__exportStar(require("./FlinkTool"), exports);
|
|
19
|
+
__exportStar(require("./FlinkAgent"), exports);
|
|
20
|
+
__exportStar(require("./ConversationAgent"), exports);
|
|
21
|
+
__exportStar(require("./InMemoryConversationAgent"), exports);
|
|
22
|
+
__exportStar(require("./ToolExecutor"), exports);
|
|
23
|
+
__exportStar(require("./AgentRunner"), exports);
|
|
24
|
+
__exportStar(require("./LLMAdapter"), exports);
|
|
25
|
+
var agentInstructions_1 = require("./agentInstructions");
|
|
26
|
+
Object.defineProperty(exports, "agentInstructions", { enumerable: true, get: function () { return agentInstructions_1.agentInstructions; } });
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return type for the FlinkAgent.instructions() method.
|
|
3
|
+
*
|
|
4
|
+
* Supported forms:
|
|
5
|
+
* - `string` — Plain text used as-is, OR a file path (see below) which is auto-loaded.
|
|
6
|
+
* - `{ file, params? }` — Explicitly load a file with optional Handlebars template params.
|
|
7
|
+
*
|
|
8
|
+
* **Path resolution** — all paths resolve relative to the **project root** (`process.cwd()`):
|
|
9
|
+
* - `"instructions/foo.md"` → `<project-root>/instructions/foo.md`
|
|
10
|
+
* - `"./instructions/foo.md"` → `<project-root>/instructions/foo.md`
|
|
11
|
+
* - `"/instructions/foo.md"` → `<project-root>/instructions/foo.md` (leading slash stripped)
|
|
12
|
+
*
|
|
13
|
+
* Auto-loaded string extensions: `.md`, `.txt`, `.yaml`, `.yml`, `.xml`, `.toml`, `.ini`, `.json`, `.html`
|
|
14
|
+
*
|
|
15
|
+
* @example Plain text
|
|
16
|
+
* instructions() {
|
|
17
|
+
* return "You are a helpful car assistant.";
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* @example Auto-load file (project-root-relative)
|
|
21
|
+
* instructions() {
|
|
22
|
+
* return "instructions/car-agent.md";
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* @example File with template params
|
|
26
|
+
* async instructions(_ctx, agentCtx) {
|
|
27
|
+
* return {
|
|
28
|
+
* file: "instructions/support.md",
|
|
29
|
+
* params: {
|
|
30
|
+
* customerTier: agentCtx.user?.tier || "standard",
|
|
31
|
+
* isBusinessHours: new Date().getHours() >= 9,
|
|
32
|
+
* },
|
|
33
|
+
* };
|
|
34
|
+
* }
|
|
35
|
+
*/
|
|
36
|
+
export type InstructionsReturn = string | {
|
|
37
|
+
file: string;
|
|
38
|
+
params?: Record<string, any>;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Resolve an InstructionsReturn value to a plain string.
|
|
42
|
+
* @internal Used by FlinkAgent.toAgentProps()
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveInstructionsReturn(result: InstructionsReturn, ctx: any, agentContext: any): Promise<string>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
+
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);
|
|
47
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
+
function step(op) {
|
|
50
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
52
|
+
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;
|
|
53
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
+
switch (op[0]) {
|
|
55
|
+
case 0: case 1: t = op; break;
|
|
56
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
+
default:
|
|
60
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
+
if (t[2]) _.ops.pop();
|
|
65
|
+
_.trys.pop(); continue;
|
|
66
|
+
}
|
|
67
|
+
op = body.call(thisArg, _);
|
|
68
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
73
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
74
|
+
};
|
|
75
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
76
|
+
exports.resolveInstructionsReturn = resolveInstructionsReturn;
|
|
77
|
+
var fs = __importStar(require("fs"));
|
|
78
|
+
var path = __importStar(require("path"));
|
|
79
|
+
var handlebars_1 = __importDefault(require("handlebars"));
|
|
80
|
+
// Enable {{{{raw}}}}...{{{{/raw}}}} blocks to pass content through unprocessed.
|
|
81
|
+
// Without this, content inside raw blocks is silently dropped.
|
|
82
|
+
handlebars_1.default.registerHelper("raw", function (options) {
|
|
83
|
+
return options.fn(this);
|
|
84
|
+
});
|
|
85
|
+
var fileCache = new Map();
|
|
86
|
+
var IMPORT_REGEX = /\{\{\s*import\s+["']([^"']+)['"]\s*\}\}/g;
|
|
87
|
+
function resolveImports(content, currentDir, visited) {
|
|
88
|
+
if (visited === void 0) { visited = new Set(); }
|
|
89
|
+
return content.replace(IMPORT_REGEX, function (match, importPath) {
|
|
90
|
+
var resolved = path.resolve(currentDir, importPath);
|
|
91
|
+
if (visited.has(resolved)) {
|
|
92
|
+
throw new Error("Circular import detected: ".concat(resolved));
|
|
93
|
+
}
|
|
94
|
+
var nextVisited = new Set(visited);
|
|
95
|
+
nextVisited.add(resolved);
|
|
96
|
+
try {
|
|
97
|
+
var importedContent = fs.readFileSync(resolved, "utf-8");
|
|
98
|
+
return resolveImports(importedContent, path.dirname(resolved), nextVisited);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err.code === "ENOENT") {
|
|
102
|
+
throw new Error("Imported markdown file not found: ".concat(resolved, " (imported from: ").concat(currentDir, ")"));
|
|
103
|
+
}
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve a file path relative to project root (process.cwd()).
|
|
110
|
+
* Leading `./` and `/` are normalised away — all paths are treated as project-root-relative.
|
|
111
|
+
*/
|
|
112
|
+
function resolveFilePath(filePath) {
|
|
113
|
+
// Strip leading slash so "/foo.md" behaves the same as "foo.md"
|
|
114
|
+
var normalised = filePath.replace(/^\/+/, "");
|
|
115
|
+
return path.resolve(process.cwd(), normalised);
|
|
116
|
+
}
|
|
117
|
+
function loadFile(filePath) {
|
|
118
|
+
var resolvedPath = resolveFilePath(filePath);
|
|
119
|
+
try {
|
|
120
|
+
var stats = fs.statSync(resolvedPath);
|
|
121
|
+
var mtime = stats.mtimeMs;
|
|
122
|
+
var cached = fileCache.get(resolvedPath);
|
|
123
|
+
if (cached && cached.mtime === mtime) {
|
|
124
|
+
return cached;
|
|
125
|
+
}
|
|
126
|
+
var content = fs.readFileSync(resolvedPath, "utf-8");
|
|
127
|
+
var resolvedContent = resolveImports(content, path.dirname(resolvedPath));
|
|
128
|
+
var entry = { content: content, resolvedContent: resolvedContent, mtime: mtime };
|
|
129
|
+
fileCache.set(resolvedPath, entry);
|
|
130
|
+
return entry;
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (err.code === "ENOENT") {
|
|
134
|
+
throw new Error("Agent instructions file not found: ".concat(resolvedPath, " (from: ").concat(filePath, ")"));
|
|
135
|
+
}
|
|
136
|
+
throw new Error("Failed to load agent instructions file: ".concat(resolvedPath, " - ").concat(err.message));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function renderTemplate(entry, data) {
|
|
140
|
+
if (entry.hasTemplateExpressions === false) {
|
|
141
|
+
return entry.resolvedContent;
|
|
142
|
+
}
|
|
143
|
+
if (!entry.compiledTemplate) {
|
|
144
|
+
entry.hasTemplateExpressions = /\{\{/.test(entry.resolvedContent);
|
|
145
|
+
if (!entry.hasTemplateExpressions) {
|
|
146
|
+
return entry.resolvedContent;
|
|
147
|
+
}
|
|
148
|
+
entry.compiledTemplate = handlebars_1.default.compile(entry.resolvedContent);
|
|
149
|
+
}
|
|
150
|
+
return entry.compiledTemplate(data);
|
|
151
|
+
}
|
|
152
|
+
var TEXT_FILE_EXTENSIONS = [".md", ".txt", ".yaml", ".yml", ".xml", ".toml", ".ini", ".json", ".html", ".htm"];
|
|
153
|
+
function isTextFilePath(value) {
|
|
154
|
+
var trimmed = value.trimEnd().toLowerCase();
|
|
155
|
+
return TEXT_FILE_EXTENSIONS.some(function (ext) { return trimmed.endsWith(ext); });
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Resolve an InstructionsReturn value to a plain string.
|
|
159
|
+
* @internal Used by FlinkAgent.toAgentProps()
|
|
160
|
+
*/
|
|
161
|
+
function resolveInstructionsReturn(result, ctx, agentContext) {
|
|
162
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
163
|
+
var entry_1, templateData_1, file, params, entry, templateData;
|
|
164
|
+
return __generator(this, function (_a) {
|
|
165
|
+
if (typeof result === "string") {
|
|
166
|
+
if (isTextFilePath(result)) {
|
|
167
|
+
entry_1 = loadFile(result.trimEnd());
|
|
168
|
+
templateData_1 = { ctx: ctx, agentContext: agentContext, user: agentContext === null || agentContext === void 0 ? void 0 : agentContext.user };
|
|
169
|
+
return [2 /*return*/, renderTemplate(entry_1, templateData_1)];
|
|
170
|
+
}
|
|
171
|
+
return [2 /*return*/, result];
|
|
172
|
+
}
|
|
173
|
+
file = result.file, params = result.params;
|
|
174
|
+
entry = loadFile(file);
|
|
175
|
+
templateData = __assign(__assign({}, params), { ctx: ctx, agentContext: agentContext, user: agentContext === null || agentContext === void 0 ? void 0 : agentContext.user });
|
|
176
|
+
return [2 /*return*/, renderTemplate(entry, templateData)];
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FlinkRequest } from "../FlinkHttpHandler";
|
|
2
2
|
export interface FlinkAuthPlugin {
|
|
3
|
-
authenticateRequest: (req: FlinkRequest, permissions: string | string[]) => Promise<boolean>;
|
|
3
|
+
authenticateRequest: (req: FlinkRequest, permissions: string | string[], ctx?: any) => Promise<boolean>;
|
|
4
4
|
createToken: (payload: any, roles: string[]) => Promise<string>;
|
|
5
5
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Response } from "express";
|
|
2
|
+
import { StreamWriter, StreamFormat } from "../FlinkHttpHandler";
|
|
3
|
+
/**
|
|
4
|
+
* Factory for creating StreamWriter instances for SSE and NDJSON streaming.
|
|
5
|
+
*
|
|
6
|
+
* Handles HTTP headers, connection lifecycle, and format-specific serialization.
|
|
7
|
+
*/
|
|
8
|
+
export declare class StreamWriterFactory {
|
|
9
|
+
/**
|
|
10
|
+
* Create a StreamWriter for the given format.
|
|
11
|
+
*
|
|
12
|
+
* Sets appropriate HTTP headers and manages the stream lifecycle including
|
|
13
|
+
* client disconnect detection.
|
|
14
|
+
*
|
|
15
|
+
* @param res - Express response object
|
|
16
|
+
* @param format - Stream format (sse or ndjson)
|
|
17
|
+
* @returns StreamWriter instance for writing data to the stream
|
|
18
|
+
*/
|
|
19
|
+
static create<T = any>(res: Response, format: StreamFormat): StreamWriter<T>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StreamWriterFactory = void 0;
|
|
4
|
+
var FlinkLog_1 = require("../FlinkLog");
|
|
5
|
+
/**
|
|
6
|
+
* Factory for creating StreamWriter instances for SSE and NDJSON streaming.
|
|
7
|
+
*
|
|
8
|
+
* Handles HTTP headers, connection lifecycle, and format-specific serialization.
|
|
9
|
+
*/
|
|
10
|
+
var StreamWriterFactory = /** @class */ (function () {
|
|
11
|
+
function StreamWriterFactory() {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create a StreamWriter for the given format.
|
|
15
|
+
*
|
|
16
|
+
* Sets appropriate HTTP headers and manages the stream lifecycle including
|
|
17
|
+
* client disconnect detection.
|
|
18
|
+
*
|
|
19
|
+
* @param res - Express response object
|
|
20
|
+
* @param format - Stream format (sse or ndjson)
|
|
21
|
+
* @returns StreamWriter instance for writing data to the stream
|
|
22
|
+
*/
|
|
23
|
+
StreamWriterFactory.create = function (res, format) {
|
|
24
|
+
// Set appropriate headers based on format
|
|
25
|
+
if (format === "sse") {
|
|
26
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
27
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
28
|
+
res.setHeader("Connection", "keep-alive");
|
|
29
|
+
res.flushHeaders();
|
|
30
|
+
}
|
|
31
|
+
else if (format === "ndjson") {
|
|
32
|
+
res.setHeader("Content-Type", "application/x-ndjson");
|
|
33
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
34
|
+
res.flushHeaders();
|
|
35
|
+
}
|
|
36
|
+
var isOpen = true;
|
|
37
|
+
// Detect client disconnect
|
|
38
|
+
res.on("close", function () {
|
|
39
|
+
isOpen = false;
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
write: function (data) {
|
|
43
|
+
if (!isOpen)
|
|
44
|
+
return;
|
|
45
|
+
try {
|
|
46
|
+
var json = JSON.stringify(data);
|
|
47
|
+
if (format === "sse") {
|
|
48
|
+
res.write("data: ".concat(json, "\n\n"));
|
|
49
|
+
}
|
|
50
|
+
else if (format === "ndjson") {
|
|
51
|
+
res.write("".concat(json, "\n"));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
FlinkLog_1.log.error("StreamWriter serialization error:", { error: err });
|
|
56
|
+
isOpen = false;
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
error: function (error) {
|
|
60
|
+
if (!isOpen)
|
|
61
|
+
return;
|
|
62
|
+
var errorMessage = typeof error === "string" ? error : error.message;
|
|
63
|
+
if (format === "sse") {
|
|
64
|
+
res.write("event: error\ndata: ".concat(JSON.stringify({ error: errorMessage }), "\n\n"));
|
|
65
|
+
}
|
|
66
|
+
else if (format === "ndjson") {
|
|
67
|
+
res.write("".concat(JSON.stringify({ error: errorMessage }), "\n"));
|
|
68
|
+
}
|
|
69
|
+
res.end();
|
|
70
|
+
isOpen = false;
|
|
71
|
+
},
|
|
72
|
+
end: function () {
|
|
73
|
+
if (isOpen) {
|
|
74
|
+
res.end();
|
|
75
|
+
isOpen = false;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
isOpen: function () { return isOpen; },
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
return StreamWriterFactory;
|
|
82
|
+
}());
|
|
83
|
+
exports.StreamWriterFactory = StreamWriterFactory;
|