flowquery 1.0.6 → 1.0.8
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/README.md +30 -138
- package/dist/compute/runner.d.ts +1 -22
- package/dist/compute/runner.d.ts.map +1 -1
- package/dist/compute/runner.js.map +1 -1
- package/dist/extensibility.d.ts +28 -2
- package/dist/extensibility.d.ts.map +1 -1
- package/dist/extensibility.js +39 -15
- package/dist/extensibility.js.map +1 -1
- package/dist/flowquery.min.js +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +0 -80
- package/dist/index.browser.js.map +1 -1
- package/dist/index.node.d.ts +3 -3
- package/dist/index.node.d.ts.map +1 -1
- package/dist/index.node.js +0 -80
- package/dist/index.node.js.map +1 -1
- package/dist/parsing/functions/function_factory.d.ts +3 -80
- package/dist/parsing/functions/function_factory.d.ts.map +1 -1
- package/dist/parsing/functions/function_factory.js +8 -127
- package/dist/parsing/functions/function_factory.js.map +1 -1
- package/dist/parsing/functions/function_metadata.d.ts +28 -35
- package/dist/parsing/functions/function_metadata.d.ts.map +1 -1
- package/dist/parsing/functions/function_metadata.js +88 -61
- package/dist/parsing/functions/function_metadata.js.map +1 -1
- package/docs/flowquery.min.js +1 -1
- package/flowquery-vscode/flowQueryEngine/flowquery.min.js +1 -1
- package/misc/apps/RAG/package.json +1 -1
- package/misc/apps/RAG/src/plugins/index.ts +29 -33
- package/misc/apps/RAG/src/plugins/loaders/CatFacts.ts +28 -32
- package/misc/apps/RAG/src/plugins/loaders/FetchJson.ts +29 -33
- package/misc/apps/RAG/src/plugins/loaders/Llm.ts +55 -59
- package/misc/apps/RAG/src/plugins/loaders/MockData.ts +61 -71
- package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +8 -8
- package/package.json +1 -1
- package/src/compute/runner.ts +1 -26
- package/src/extensibility.ts +38 -2
- package/src/index.browser.ts +2 -88
- package/src/index.node.ts +3 -92
- package/src/parsing/functions/function_factory.ts +13 -154
- package/src/parsing/functions/function_metadata.ts +96 -94
- package/tests/extensibility.test.ts +601 -0
- package/dist/parsing/functions/extensibility/index.d.ts +0 -37
- package/dist/parsing/functions/extensibility/index.d.ts.map +0 -1
- package/dist/parsing/functions/extensibility/index.js +0 -50
- package/dist/parsing/functions/extensibility/index.js.map +0 -1
- package/misc/apps/RAG/src/plugins/PluginRegistry.ts +0 -136
- package/misc/apps/RAG/src/plugins/types.ts +0 -52
- package/src/parsing/functions/extensibility/index.ts +0 -54
- package/tests/parsing/function_plugins.test.ts +0 -369
package/dist/index.node.js
CHANGED
|
@@ -17,86 +17,6 @@ const function_factory_1 = __importDefault(require("./parsing/functions/function
|
|
|
17
17
|
exports.FunctionFactory = function_factory_1.default;
|
|
18
18
|
const function_1 = __importDefault(require("./parsing/functions/function"));
|
|
19
19
|
exports.Function = function_1.default;
|
|
20
|
-
/**
|
|
21
|
-
* Register a synchronous plugin function.
|
|
22
|
-
*
|
|
23
|
-
* @param name - The function name
|
|
24
|
-
* @param factoryOrOptions - Factory function or options object with metadata
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```javascript
|
|
28
|
-
* // Simple registration
|
|
29
|
-
* FlowQuery.registerFunction("uppercase", () => new MyUpperCaseFunction());
|
|
30
|
-
*
|
|
31
|
-
* // Registration with metadata for LLM consumption
|
|
32
|
-
* FlowQuery.registerFunction("uppercase", {
|
|
33
|
-
* factory: () => new MyUpperCaseFunction(),
|
|
34
|
-
* metadata: {
|
|
35
|
-
* name: "uppercase",
|
|
36
|
-
* description: "Converts a string to uppercase",
|
|
37
|
-
* category: "string",
|
|
38
|
-
* parameters: [{ name: "text", description: "String to convert", type: "string" }],
|
|
39
|
-
* output: { description: "Uppercase string", type: "string" },
|
|
40
|
-
* examples: ["WITH 'hello' AS s RETURN uppercase(s)"]
|
|
41
|
-
* }
|
|
42
|
-
* });
|
|
43
|
-
* ```
|
|
44
|
-
*/
|
|
45
|
-
runner_1.default.registerFunction = function (name, factoryOrOptions) {
|
|
46
|
-
function_factory_1.default.register(name, factoryOrOptions);
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* Unregister a synchronous plugin function.
|
|
50
|
-
*
|
|
51
|
-
* @param name - The function name
|
|
52
|
-
*/
|
|
53
|
-
runner_1.default.unregisterFunction = function (name) {
|
|
54
|
-
function_factory_1.default.unregister(name);
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* Register an async data provider function for use in LOAD operations.
|
|
58
|
-
*
|
|
59
|
-
* @param name - The function name
|
|
60
|
-
* @param providerOrOptions - Async provider or options object with metadata
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```javascript
|
|
64
|
-
* // Registration with metadata for LLM consumption
|
|
65
|
-
* FlowQuery.registerAsyncProvider("fetchUsers", {
|
|
66
|
-
* provider: async function* (endpoint) {
|
|
67
|
-
* const response = await fetch(endpoint);
|
|
68
|
-
* const data = await response.json();
|
|
69
|
-
* for (const item of data) yield item;
|
|
70
|
-
* },
|
|
71
|
-
* metadata: {
|
|
72
|
-
* name: "fetchUsers",
|
|
73
|
-
* description: "Fetches user data from an API",
|
|
74
|
-
* category: "data",
|
|
75
|
-
* parameters: [{ name: "endpoint", description: "API URL", type: "string" }],
|
|
76
|
-
* output: {
|
|
77
|
-
* description: "User object",
|
|
78
|
-
* type: "object",
|
|
79
|
-
* properties: {
|
|
80
|
-
* id: { description: "User ID", type: "number" },
|
|
81
|
-
* name: { description: "User name", type: "string" }
|
|
82
|
-
* }
|
|
83
|
-
* },
|
|
84
|
-
* examples: ["LOAD JSON FROM fetchUsers('https://api.example.com/users') AS user"]
|
|
85
|
-
* }
|
|
86
|
-
* });
|
|
87
|
-
* ```
|
|
88
|
-
*/
|
|
89
|
-
runner_1.default.registerAsyncProvider = function (name, providerOrOptions) {
|
|
90
|
-
function_factory_1.default.registerAsyncProvider(name, providerOrOptions);
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Unregister an async data provider function.
|
|
94
|
-
*
|
|
95
|
-
* @param name - The function name
|
|
96
|
-
*/
|
|
97
|
-
runner_1.default.unregisterAsyncProvider = function (name) {
|
|
98
|
-
function_factory_1.default.unregisterAsyncProvider(name);
|
|
99
|
-
};
|
|
100
20
|
/**
|
|
101
21
|
* List all registered functions with their metadata.
|
|
102
22
|
*
|
package/dist/index.node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.node.js","sourceRoot":"","sources":["../src/index.node.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;AAEH,8DAAsD;
|
|
1
|
+
{"version":3,"file":"index.node.js","sourceRoot":"","sources":["../src/index.node.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;AAEH,8DAAsD;AAoClD,0FApCe,gBAAS,OAoCf;AAnCb,4FAA0F;AAqCtF,0BArCG,0BAAe,CAqCH;AA/BnB,4EAAoD;AA8BhD,mBA9BG,kBAAQ,CA8BH;AA5BZ;;;;;GAKG;AACH,gBAAS,CAAC,aAAa,GAAG,UAAS,OAAwE;IACvG,OAAO,0BAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,gBAAS,CAAC,mBAAmB,GAAG,UAAS,IAAY;IACjD,OAAO,0BAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF;;GAEG;AACH,gBAAS,CAAC,QAAQ,GAAG,kBAAQ,CAAC;AAE9B,kBAAe,gBAAS,CAAC"}
|
|
@@ -14,19 +14,12 @@ import "./stringify";
|
|
|
14
14
|
import "./size";
|
|
15
15
|
import "./functions";
|
|
16
16
|
import "./predicate_sum";
|
|
17
|
-
import { FunctionMetadata,
|
|
18
|
-
|
|
19
|
-
* Type for synchronous function factories.
|
|
20
|
-
*/
|
|
21
|
-
export type FunctionCreator = () => Function;
|
|
22
|
-
/**
|
|
23
|
-
* Type for async data provider functions used in LOAD operations.
|
|
24
|
-
* These functions can yield data asynchronously.
|
|
25
|
-
*/
|
|
26
|
-
export type AsyncDataProvider = (...args: any[]) => AsyncGenerator<any, void, unknown> | Promise<any>;
|
|
17
|
+
import { FunctionMetadata, AsyncDataProvider } from "./function_metadata";
|
|
18
|
+
export { AsyncDataProvider };
|
|
27
19
|
/**
|
|
28
20
|
* Factory for creating function instances by name.
|
|
29
21
|
*
|
|
22
|
+
* All functions are registered via the @FunctionDef decorator.
|
|
30
23
|
* Maps function names (case-insensitive) to their corresponding implementation classes.
|
|
31
24
|
* Supports built-in functions like sum, avg, collect, range, split, join, etc.
|
|
32
25
|
*
|
|
@@ -37,74 +30,6 @@ export type AsyncDataProvider = (...args: any[]) => AsyncGenerator<any, void, un
|
|
|
37
30
|
* ```
|
|
38
31
|
*/
|
|
39
32
|
declare class FunctionFactory {
|
|
40
|
-
/**
|
|
41
|
-
* Registry for plugin functions (synchronous).
|
|
42
|
-
*/
|
|
43
|
-
private static plugins;
|
|
44
|
-
/**
|
|
45
|
-
* Registry for async data provider functions used in LOAD operations.
|
|
46
|
-
*/
|
|
47
|
-
private static asyncProviders;
|
|
48
|
-
/**
|
|
49
|
-
* Registry for function metadata (both sync and async).
|
|
50
|
-
*/
|
|
51
|
-
private static metadata;
|
|
52
|
-
/**
|
|
53
|
-
* Registers a synchronous plugin function.
|
|
54
|
-
*
|
|
55
|
-
* @param name - The function name (will be lowercased)
|
|
56
|
-
* @param factoryOrOptions - Factory function or options object with metadata
|
|
57
|
-
*/
|
|
58
|
-
static register(name: string, factoryOrOptions: FunctionCreator | RegisterFunctionOptions): void;
|
|
59
|
-
/**
|
|
60
|
-
* Unregisters a synchronous plugin function.
|
|
61
|
-
*
|
|
62
|
-
* @param name - The function name to unregister
|
|
63
|
-
*/
|
|
64
|
-
static unregister(name: string): void;
|
|
65
|
-
/**
|
|
66
|
-
* Registers an async data provider function for use in LOAD operations.
|
|
67
|
-
*
|
|
68
|
-
* @param name - The function name (will be lowercased)
|
|
69
|
-
* @param providerOrOptions - Async provider or options object with metadata
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* ```typescript
|
|
73
|
-
* // Register with metadata for LLM consumption
|
|
74
|
-
* FunctionFactory.registerAsyncProvider("fetchUsers", {
|
|
75
|
-
* provider: async function* (endpoint: string) {
|
|
76
|
-
* const response = await fetch(endpoint);
|
|
77
|
-
* const data = await response.json();
|
|
78
|
-
* for (const item of data) {
|
|
79
|
-
* yield item;
|
|
80
|
-
* }
|
|
81
|
-
* },
|
|
82
|
-
* metadata: {
|
|
83
|
-
* name: "fetchUsers",
|
|
84
|
-
* description: "Fetches user data from an API endpoint",
|
|
85
|
-
* parameters: [
|
|
86
|
-
* { name: "endpoint", description: "API endpoint URL", type: "string" }
|
|
87
|
-
* ],
|
|
88
|
-
* output: {
|
|
89
|
-
* description: "User objects",
|
|
90
|
-
* type: "object",
|
|
91
|
-
* properties: {
|
|
92
|
-
* id: { description: "User ID", type: "number" },
|
|
93
|
-
* name: { description: "User name", type: "string" }
|
|
94
|
-
* }
|
|
95
|
-
* },
|
|
96
|
-
* examples: ["LOAD JSON FROM fetchUsers('https://api.example.com/users') AS user"]
|
|
97
|
-
* }
|
|
98
|
-
* });
|
|
99
|
-
* ```
|
|
100
|
-
*/
|
|
101
|
-
static registerAsyncProvider(name: string, providerOrOptions: AsyncDataProvider | RegisterAsyncProviderOptions): void;
|
|
102
|
-
/**
|
|
103
|
-
* Unregisters an async data provider function.
|
|
104
|
-
*
|
|
105
|
-
* @param name - The function name to unregister
|
|
106
|
-
*/
|
|
107
|
-
static unregisterAsyncProvider(name: string): void;
|
|
108
33
|
/**
|
|
109
34
|
* Gets an async data provider by name.
|
|
110
35
|
*
|
|
@@ -128,14 +53,12 @@ declare class FunctionFactory {
|
|
|
128
53
|
static getMetadata(name: string): FunctionMetadata | undefined;
|
|
129
54
|
/**
|
|
130
55
|
* Lists all registered functions with their metadata.
|
|
131
|
-
* Includes both built-in and plugin functions.
|
|
132
56
|
*
|
|
133
57
|
* @param options - Optional filter options
|
|
134
58
|
* @returns Array of function metadata
|
|
135
59
|
*/
|
|
136
60
|
static listFunctions(options?: {
|
|
137
61
|
category?: string;
|
|
138
|
-
includeBuiltins?: boolean;
|
|
139
62
|
asyncOnly?: boolean;
|
|
140
63
|
syncOnly?: boolean;
|
|
141
64
|
}): FunctionMetadata[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function_factory.d.ts","sourceRoot":"","sources":["../../../src/parsing/functions/function_factory.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AAErD,OAAO,OAAO,CAAC;AACf,OAAO,WAAW,CAAC;AACnB,OAAO,OAAO,CAAC;AACf,OAAO,SAAS,CAAC;AACjB,OAAO,QAAQ,CAAC;AAChB,OAAO,SAAS,CAAC;AACjB,OAAO,SAAS,CAAC;AACjB,OAAO,QAAQ,CAAC;AAChB,OAAO,WAAW,CAAC;AACnB,OAAO,WAAW,CAAC;AACnB,OAAO,aAAa,CAAC;AACrB,OAAO,QAAQ,CAAC;AAChB,OAAO,aAAa,CAAC;AACrB,OAAO,iBAAiB,CAAC;AACzB,OAAO,EACH,gBAAgB,
|
|
1
|
+
{"version":3,"file":"function_factory.d.ts","sourceRoot":"","sources":["../../../src/parsing/functions/function_factory.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AAErD,OAAO,OAAO,CAAC;AACf,OAAO,WAAW,CAAC;AACnB,OAAO,OAAO,CAAC;AACf,OAAO,SAAS,CAAC;AACjB,OAAO,QAAQ,CAAC;AAChB,OAAO,SAAS,CAAC;AACjB,OAAO,SAAS,CAAC;AACjB,OAAO,QAAQ,CAAC;AAChB,OAAO,WAAW,CAAC;AACnB,OAAO,WAAW,CAAC;AACnB,OAAO,aAAa,CAAC;AACrB,OAAO,QAAQ,CAAC;AAChB,OAAO,aAAa,CAAC;AACrB,OAAO,iBAAiB,CAAC;AACzB,OAAO,EACH,gBAAgB,EAKhB,iBAAiB,EACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;;;;;;;;;;GAYG;AACH,cAAM,eAAe;IACjB;;;;;OAKG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI3E;;;;;OAKG;WACW,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpD;;;;;OAKG;WACW,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIrE;;;;;OAKG;WACW,aAAa,CAAC,OAAO,CAAC,EAAE;QAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,gBAAgB,EAAE;IAatB;;;;OAIG;WACW,iBAAiB,IAAI,MAAM,EAAE;IAI3C;;;;OAIG;WACW,MAAM,IAAI;QAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAM/E;;;;;OAKG;WACW,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAa5C;;;;;;OAMG;WACW,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB;CAYjE;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -24,6 +24,7 @@ const function_metadata_1 = require("./function_metadata");
|
|
|
24
24
|
/**
|
|
25
25
|
* Factory for creating function instances by name.
|
|
26
26
|
*
|
|
27
|
+
* All functions are registered via the @FunctionDef decorator.
|
|
27
28
|
* Maps function names (case-insensitive) to their corresponding implementation classes.
|
|
28
29
|
* Supports built-in functions like sum, avg, collect, range, split, join, etc.
|
|
29
30
|
*
|
|
@@ -34,88 +35,6 @@ const function_metadata_1 = require("./function_metadata");
|
|
|
34
35
|
* ```
|
|
35
36
|
*/
|
|
36
37
|
class FunctionFactory {
|
|
37
|
-
/**
|
|
38
|
-
* Registers a synchronous plugin function.
|
|
39
|
-
*
|
|
40
|
-
* @param name - The function name (will be lowercased)
|
|
41
|
-
* @param factoryOrOptions - Factory function or options object with metadata
|
|
42
|
-
*/
|
|
43
|
-
static register(name, factoryOrOptions) {
|
|
44
|
-
const lowerName = name.toLowerCase();
|
|
45
|
-
if (typeof factoryOrOptions === 'function') {
|
|
46
|
-
FunctionFactory.plugins.set(lowerName, factoryOrOptions);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
FunctionFactory.plugins.set(lowerName, factoryOrOptions.factory);
|
|
50
|
-
FunctionFactory.metadata.set(lowerName, Object.assign(Object.assign({}, factoryOrOptions.metadata), { name: lowerName, isAsyncProvider: false }));
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Unregisters a synchronous plugin function.
|
|
55
|
-
*
|
|
56
|
-
* @param name - The function name to unregister
|
|
57
|
-
*/
|
|
58
|
-
static unregister(name) {
|
|
59
|
-
const lowerName = name.toLowerCase();
|
|
60
|
-
FunctionFactory.plugins.delete(lowerName);
|
|
61
|
-
FunctionFactory.metadata.delete(lowerName);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Registers an async data provider function for use in LOAD operations.
|
|
65
|
-
*
|
|
66
|
-
* @param name - The function name (will be lowercased)
|
|
67
|
-
* @param providerOrOptions - Async provider or options object with metadata
|
|
68
|
-
*
|
|
69
|
-
* @example
|
|
70
|
-
* ```typescript
|
|
71
|
-
* // Register with metadata for LLM consumption
|
|
72
|
-
* FunctionFactory.registerAsyncProvider("fetchUsers", {
|
|
73
|
-
* provider: async function* (endpoint: string) {
|
|
74
|
-
* const response = await fetch(endpoint);
|
|
75
|
-
* const data = await response.json();
|
|
76
|
-
* for (const item of data) {
|
|
77
|
-
* yield item;
|
|
78
|
-
* }
|
|
79
|
-
* },
|
|
80
|
-
* metadata: {
|
|
81
|
-
* name: "fetchUsers",
|
|
82
|
-
* description: "Fetches user data from an API endpoint",
|
|
83
|
-
* parameters: [
|
|
84
|
-
* { name: "endpoint", description: "API endpoint URL", type: "string" }
|
|
85
|
-
* ],
|
|
86
|
-
* output: {
|
|
87
|
-
* description: "User objects",
|
|
88
|
-
* type: "object",
|
|
89
|
-
* properties: {
|
|
90
|
-
* id: { description: "User ID", type: "number" },
|
|
91
|
-
* name: { description: "User name", type: "string" }
|
|
92
|
-
* }
|
|
93
|
-
* },
|
|
94
|
-
* examples: ["LOAD JSON FROM fetchUsers('https://api.example.com/users') AS user"]
|
|
95
|
-
* }
|
|
96
|
-
* });
|
|
97
|
-
* ```
|
|
98
|
-
*/
|
|
99
|
-
static registerAsyncProvider(name, providerOrOptions) {
|
|
100
|
-
const lowerName = name.toLowerCase();
|
|
101
|
-
if (typeof providerOrOptions === 'function') {
|
|
102
|
-
FunctionFactory.asyncProviders.set(lowerName, providerOrOptions);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
FunctionFactory.asyncProviders.set(lowerName, providerOrOptions.provider);
|
|
106
|
-
FunctionFactory.metadata.set(lowerName, Object.assign(Object.assign({}, providerOrOptions.metadata), { name: lowerName, isAsyncProvider: true }));
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Unregisters an async data provider function.
|
|
111
|
-
*
|
|
112
|
-
* @param name - The function name to unregister
|
|
113
|
-
*/
|
|
114
|
-
static unregisterAsyncProvider(name) {
|
|
115
|
-
const lowerName = name.toLowerCase();
|
|
116
|
-
FunctionFactory.asyncProviders.delete(lowerName);
|
|
117
|
-
FunctionFactory.metadata.delete(lowerName);
|
|
118
|
-
}
|
|
119
38
|
/**
|
|
120
39
|
* Gets an async data provider by name.
|
|
121
40
|
*
|
|
@@ -123,7 +42,7 @@ class FunctionFactory {
|
|
|
123
42
|
* @returns The async data provider, or undefined if not found
|
|
124
43
|
*/
|
|
125
44
|
static getAsyncProvider(name) {
|
|
126
|
-
return
|
|
45
|
+
return (0, function_metadata_1.getRegisteredAsyncProvider)(name.toLowerCase());
|
|
127
46
|
}
|
|
128
47
|
/**
|
|
129
48
|
* Checks if a function name is registered as an async data provider.
|
|
@@ -132,7 +51,7 @@ class FunctionFactory {
|
|
|
132
51
|
* @returns True if the function is an async data provider
|
|
133
52
|
*/
|
|
134
53
|
static isAsyncProvider(name) {
|
|
135
|
-
return
|
|
54
|
+
return (0, function_metadata_1.getRegisteredAsyncProvider)(name.toLowerCase()) !== undefined;
|
|
136
55
|
}
|
|
137
56
|
/**
|
|
138
57
|
* Gets metadata for a specific function.
|
|
@@ -141,41 +60,22 @@ class FunctionFactory {
|
|
|
141
60
|
* @returns The function metadata, or undefined if not found
|
|
142
61
|
*/
|
|
143
62
|
static getMetadata(name) {
|
|
144
|
-
|
|
145
|
-
// Check plugin metadata first
|
|
146
|
-
if (FunctionFactory.metadata.has(lowerName)) {
|
|
147
|
-
return FunctionFactory.metadata.get(lowerName);
|
|
148
|
-
}
|
|
149
|
-
// Fall back to decorator-registered metadata
|
|
150
|
-
return (0, function_metadata_1.getFunctionMetadata)(lowerName);
|
|
63
|
+
return (0, function_metadata_1.getFunctionMetadata)(name.toLowerCase());
|
|
151
64
|
}
|
|
152
65
|
/**
|
|
153
66
|
* Lists all registered functions with their metadata.
|
|
154
|
-
* Includes both built-in and plugin functions.
|
|
155
67
|
*
|
|
156
68
|
* @param options - Optional filter options
|
|
157
69
|
* @returns Array of function metadata
|
|
158
70
|
*/
|
|
159
71
|
static listFunctions(options) {
|
|
160
72
|
const result = [];
|
|
161
|
-
const
|
|
162
|
-
// Add decorator-registered functions (built-ins)
|
|
163
|
-
if (includeBuiltins) {
|
|
164
|
-
for (const meta of (0, function_metadata_1.getRegisteredFunctionMetadata)()) {
|
|
165
|
-
if ((options === null || options === void 0 ? void 0 : options.category) && meta.category !== options.category)
|
|
166
|
-
continue;
|
|
167
|
-
if (options === null || options === void 0 ? void 0 : options.asyncOnly)
|
|
168
|
-
continue; // Built-ins are sync
|
|
169
|
-
result.push(meta);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// Add plugin functions
|
|
173
|
-
for (const [name, meta] of FunctionFactory.metadata) {
|
|
73
|
+
for (const meta of (0, function_metadata_1.getRegisteredFunctionMetadata)()) {
|
|
174
74
|
if ((options === null || options === void 0 ? void 0 : options.category) && meta.category !== options.category)
|
|
175
75
|
continue;
|
|
176
|
-
if ((options === null || options === void 0 ? void 0 : options.asyncOnly) &&
|
|
76
|
+
if ((options === null || options === void 0 ? void 0 : options.asyncOnly) && meta.category !== 'async')
|
|
177
77
|
continue;
|
|
178
|
-
if ((options === null || options === void 0 ? void 0 : options.syncOnly) && meta.
|
|
78
|
+
if ((options === null || options === void 0 ? void 0 : options.syncOnly) && meta.category === 'async')
|
|
179
79
|
continue;
|
|
180
80
|
result.push(meta);
|
|
181
81
|
}
|
|
@@ -187,10 +87,7 @@ class FunctionFactory {
|
|
|
187
87
|
* @returns Array of function names
|
|
188
88
|
*/
|
|
189
89
|
static listFunctionNames() {
|
|
190
|
-
|
|
191
|
-
const pluginNames = Array.from(FunctionFactory.plugins.keys());
|
|
192
|
-
const asyncNames = Array.from(FunctionFactory.asyncProviders.keys());
|
|
193
|
-
return [...new Set([...builtinNames, ...pluginNames, ...asyncNames])];
|
|
90
|
+
return (0, function_metadata_1.getRegisteredFunctionMetadata)().map(m => m.name);
|
|
194
91
|
}
|
|
195
92
|
/**
|
|
196
93
|
* Gets all function metadata as a JSON-serializable object for LLM consumption.
|
|
@@ -210,10 +107,6 @@ class FunctionFactory {
|
|
|
210
107
|
*/
|
|
211
108
|
static create(name) {
|
|
212
109
|
const lowerName = name.toLowerCase();
|
|
213
|
-
// Check plugin registry first (allows overriding built-ins)
|
|
214
|
-
if (FunctionFactory.plugins.has(lowerName)) {
|
|
215
|
-
return FunctionFactory.plugins.get(lowerName)();
|
|
216
|
-
}
|
|
217
110
|
// Check decorator-registered functions (built-ins use @FunctionDef)
|
|
218
111
|
const decoratorFactory = (0, function_metadata_1.getRegisteredFunctionFactory)(lowerName);
|
|
219
112
|
if (decoratorFactory) {
|
|
@@ -240,17 +133,5 @@ class FunctionFactory {
|
|
|
240
133
|
return new predicate_function_1.default(name);
|
|
241
134
|
}
|
|
242
135
|
}
|
|
243
|
-
/**
|
|
244
|
-
* Registry for plugin functions (synchronous).
|
|
245
|
-
*/
|
|
246
|
-
FunctionFactory.plugins = new Map();
|
|
247
|
-
/**
|
|
248
|
-
* Registry for async data provider functions used in LOAD operations.
|
|
249
|
-
*/
|
|
250
|
-
FunctionFactory.asyncProviders = new Map();
|
|
251
|
-
/**
|
|
252
|
-
* Registry for function metadata (both sync and async).
|
|
253
|
-
*/
|
|
254
|
-
FunctionFactory.metadata = new Map();
|
|
255
136
|
exports.default = FunctionFactory;
|
|
256
137
|
//# sourceMappingURL=function_factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function_factory.js","sourceRoot":"","sources":["../../../src/parsing/functions/function_factory.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAClC,8EAAqD;AACrD,wEAAwE;AACxE,iBAAe;AACf,qBAAmB;AACnB,iBAAe;AACf,mBAAiB;AACjB,kBAAgB;AAChB,mBAAiB;AACjB,mBAAiB;AACjB,kBAAgB;AAChB,qBAAmB;AACnB,qBAAmB;AACnB,uBAAqB;AACrB,kBAAgB;AAChB,uBAAqB;AACrB,2BAAyB;AACzB,2DAO6B;
|
|
1
|
+
{"version":3,"file":"function_factory.js","sourceRoot":"","sources":["../../../src/parsing/functions/function_factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Core categories: scalar, aggregate, predicate, async
|
|
4
4
|
* Additional categories for organization: string, math, data, etc.
|
|
5
5
|
*/
|
|
6
|
-
export type FunctionCategory = "scalar" | "aggregate" | "predicate" | "async" |
|
|
6
|
+
export type FunctionCategory = "scalar" | "aggregate" | "predicate" | "async" | string;
|
|
7
7
|
/**
|
|
8
8
|
* Schema definition for function arguments and outputs.
|
|
9
9
|
* Compatible with JSON Schema for LLM consumption.
|
|
@@ -51,8 +51,8 @@ export interface FunctionMetadata {
|
|
|
51
51
|
name: string;
|
|
52
52
|
/** Human-readable description of what the function does */
|
|
53
53
|
description: string;
|
|
54
|
-
/** Category
|
|
55
|
-
category
|
|
54
|
+
/** Category that determines function type and behavior */
|
|
55
|
+
category: FunctionCategory;
|
|
56
56
|
/** Array of parameter schemas */
|
|
57
57
|
parameters: ParameterSchema[];
|
|
58
58
|
/** Output schema */
|
|
@@ -61,40 +61,30 @@ export interface FunctionMetadata {
|
|
|
61
61
|
examples?: string[];
|
|
62
62
|
/** Additional notes or caveats */
|
|
63
63
|
notes?: string;
|
|
64
|
-
/** Whether this is an async data provider (for LOAD operations) */
|
|
65
|
-
isAsyncProvider?: boolean;
|
|
66
64
|
}
|
|
67
65
|
/**
|
|
68
|
-
*
|
|
66
|
+
* Type for async data provider functions used in LOAD operations.
|
|
69
67
|
*/
|
|
70
|
-
export
|
|
71
|
-
/** Factory function that creates the Function instance */
|
|
72
|
-
factory: () => any;
|
|
73
|
-
/** Function metadata for documentation */
|
|
74
|
-
metadata: FunctionMetadata;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Options for registering an async data provider with metadata.
|
|
78
|
-
*/
|
|
79
|
-
export interface RegisterAsyncProviderOptions {
|
|
80
|
-
/** Async generator or function that returns data */
|
|
81
|
-
provider: (...args: any[]) => AsyncGenerator<any, void, unknown> | Promise<any>;
|
|
82
|
-
/** Function metadata for documentation */
|
|
83
|
-
metadata: FunctionMetadata;
|
|
84
|
-
}
|
|
68
|
+
export type AsyncDataProvider = (...args: any[]) => AsyncGenerator<any, void, unknown> | Promise<any>;
|
|
85
69
|
/**
|
|
86
70
|
* Decorator options - metadata without the name (derived from class).
|
|
87
71
|
*/
|
|
88
72
|
export type FunctionDefOptions = Omit<FunctionMetadata, 'name'>;
|
|
89
73
|
/**
|
|
90
74
|
* Class decorator that registers function metadata.
|
|
91
|
-
* The function name is derived from the class's constructor call to super()
|
|
75
|
+
* The function name is derived from the class's constructor call to super() for regular functions,
|
|
76
|
+
* or from the class name for async providers.
|
|
77
|
+
*
|
|
78
|
+
* For async providers (category: "async"), the class must have a `fetch` method that returns
|
|
79
|
+
* an AsyncGenerator. The function name is derived from the class name (removing 'Loader' suffix
|
|
80
|
+
* if present) and converted to camelCase.
|
|
92
81
|
*
|
|
93
82
|
* @param options - Function metadata (excluding name)
|
|
94
83
|
* @returns Class decorator
|
|
95
84
|
*
|
|
96
85
|
* @example
|
|
97
86
|
* ```typescript
|
|
87
|
+
* // Regular function
|
|
98
88
|
* @FunctionDef({
|
|
99
89
|
* description: "Calculates the sum of numeric values",
|
|
100
90
|
* category: "aggregate",
|
|
@@ -103,32 +93,35 @@ export type FunctionDefOptions = Omit<FunctionMetadata, 'name'>;
|
|
|
103
93
|
* examples: ["WITH [1, 2, 3] AS nums UNWIND nums AS n RETURN sum(n)"]
|
|
104
94
|
* })
|
|
105
95
|
* class Sum extends AggregateFunction { ... }
|
|
96
|
+
*
|
|
97
|
+
* // Async data provider
|
|
98
|
+
* @FunctionDef({
|
|
99
|
+
* description: "Fetches random cat facts from the Cat Facts API",
|
|
100
|
+
* category: "async",
|
|
101
|
+
* parameters: [{ name: "count", description: "Number of facts", type: "number", required: false, default: 1 }],
|
|
102
|
+
* output: { description: "Cat fact object", type: "object" },
|
|
103
|
+
* examples: ["LOAD JSON FROM catFacts(5) AS fact RETURN fact.text"]
|
|
104
|
+
* })
|
|
105
|
+
* class CatFactsLoader {
|
|
106
|
+
* async *fetch(count: number = 1): AsyncGenerator<any> { ... }
|
|
107
|
+
* }
|
|
106
108
|
* ```
|
|
107
109
|
*/
|
|
108
110
|
export declare function FunctionDef(options: FunctionDefOptions): <T extends new (...args: any[]) => any>(constructor: T) => T;
|
|
109
111
|
/**
|
|
110
112
|
* Gets all registered function metadata from decorators.
|
|
111
|
-
*
|
|
112
|
-
* @returns Array of function metadata
|
|
113
113
|
*/
|
|
114
114
|
export declare function getRegisteredFunctionMetadata(): FunctionMetadata[];
|
|
115
115
|
/**
|
|
116
116
|
* Gets a registered function factory by name.
|
|
117
|
-
* Used by FunctionFactory to instantiate decorator-registered functions.
|
|
118
|
-
*
|
|
119
|
-
* @param name - Function name (case-insensitive)
|
|
120
|
-
* @param category - Optional category to disambiguate (e.g., 'predicate')
|
|
121
|
-
* @returns Factory function or undefined
|
|
122
117
|
*/
|
|
123
118
|
export declare function getRegisteredFunctionFactory(name: string, category?: string): (() => any) | undefined;
|
|
124
119
|
/**
|
|
125
120
|
* Gets metadata for a specific function by name.
|
|
126
|
-
* If multiple functions share the same name (e.g., aggregate vs predicate),
|
|
127
|
-
* optionally specify the category to get the specific one.
|
|
128
|
-
*
|
|
129
|
-
* @param name - Function name (case-insensitive)
|
|
130
|
-
* @param category - Optional category to disambiguate
|
|
131
|
-
* @returns Function metadata or undefined
|
|
132
121
|
*/
|
|
133
122
|
export declare function getFunctionMetadata(name: string, category?: string): FunctionMetadata | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* Gets a registered async data provider by name.
|
|
125
|
+
*/
|
|
126
|
+
export declare function getRegisteredAsyncProvider(name: string): AsyncDataProvider | undefined;
|
|
134
127
|
//# sourceMappingURL=function_metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function_metadata.d.ts","sourceRoot":"","sources":["../../../src/parsing/functions/function_metadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"function_metadata.d.ts","sourceRoot":"","sources":["../../../src/parsing/functions/function_metadata.ts"],"names":[],"mappings":"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"}
|