@pikku/core 0.11.2 → 0.12.0
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 +33 -2
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- package/dist/errors/errors.d.ts +8 -0
- package/dist/errors/errors.js +16 -0
- package/dist/errors/index.d.ts +0 -1
- package/dist/errors/index.js +0 -1
- package/dist/function/function-runner.d.ts +7 -1
- package/dist/function/function-runner.js +82 -23
- package/dist/function/functions.types.d.ts +31 -87
- package/dist/function/functions.types.js +16 -46
- package/dist/function/index.d.ts +2 -2
- package/dist/function/index.js +1 -2
- package/dist/handle-error.js +1 -10
- package/dist/index.d.ts +28 -26
- package/dist/index.js +18 -29
- package/dist/middleware/auth-apikey.d.ts +2 -2
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +2 -2
- package/dist/middleware/auth-bearer.js +3 -6
- package/dist/middleware/auth-cookie.d.ts +2 -2
- package/dist/middleware/auth-cookie.js +6 -8
- package/dist/middleware/cors.d.ts +46 -0
- package/dist/middleware/cors.js +73 -0
- package/dist/middleware/index.d.ts +5 -3
- package/dist/middleware/index.js +5 -3
- package/dist/middleware/remote-auth.d.ts +5 -0
- package/dist/middleware/remote-auth.js +55 -0
- package/dist/middleware/timeout.d.ts +2 -2
- package/dist/middleware-runner.js +8 -10
- package/dist/permissions.js +11 -15
- package/dist/pikku-state.d.ts +1 -0
- package/dist/pikku-state.js +18 -8
- package/dist/schema.js +12 -11
- package/dist/services/ai-agent-runner-service.d.ts +24 -0
- package/dist/services/ai-agent-runner-service.js +1 -0
- package/dist/services/ai-run-state-service.d.ts +13 -0
- package/dist/services/ai-run-state-service.js +1 -0
- package/dist/services/ai-storage-service.d.ts +18 -0
- package/dist/services/ai-storage-service.js +1 -0
- package/dist/services/deployment-service.d.ts +19 -0
- package/dist/services/deployment-service.js +1 -0
- package/dist/services/gopass-secrets.d.ts +47 -0
- package/dist/services/gopass-secrets.js +94 -0
- package/dist/services/in-memory-trigger-service.d.ts +23 -0
- package/dist/services/in-memory-trigger-service.js +50 -0
- package/dist/services/in-memory-workflow-service.d.ts +59 -0
- package/dist/services/in-memory-workflow-service.js +287 -0
- package/dist/services/index.d.ts +25 -11
- package/dist/services/index.js +10 -13
- package/dist/services/local-secrets.d.ts +23 -0
- package/dist/services/local-secrets.js +45 -0
- package/dist/services/local-variables.d.ts +5 -0
- package/dist/services/local-variables.js +18 -0
- package/dist/services/scheduler-service.d.ts +21 -1
- package/dist/services/scheduler-service.js +14 -0
- package/dist/services/schema-service.d.ts +6 -0
- package/dist/services/scoped-secret-service.d.ts +16 -0
- package/dist/services/scoped-secret-service.js +35 -0
- package/dist/services/secret-service.d.ts +25 -4
- package/dist/services/trigger-service.d.ts +23 -0
- package/dist/services/trigger-service.js +1 -0
- package/dist/services/typed-secret-service.d.ts +30 -0
- package/dist/services/typed-secret-service.js +40 -0
- package/dist/services/typed-variables-service.d.ts +27 -0
- package/dist/services/typed-variables-service.js +46 -0
- package/dist/services/user-session-service.d.ts +13 -0
- package/dist/services/user-session-service.js +17 -0
- package/dist/services/variables-service.d.ts +5 -0
- package/dist/services/workflow-service.d.ts +9 -4
- package/dist/types/core.types.d.ts +48 -12
- package/dist/types/core.types.js +8 -1
- package/dist/types/state.types.d.ts +43 -51
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +15 -3
- package/dist/version.d.ts +6 -0
- package/dist/version.js +19 -0
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
- package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
- package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
- package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
- package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
- package/dist/wirings/ai-agent/index.d.ts +5 -0
- package/dist/wirings/ai-agent/index.js +4 -0
- package/dist/wirings/channel/channel-common.d.ts +7 -4
- package/dist/wirings/channel/channel-common.js +15 -8
- package/dist/wirings/channel/channel-handler.js +12 -3
- package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
- package/dist/wirings/channel/channel-middleware-runner.js +73 -0
- package/dist/wirings/channel/channel-runner.js +7 -7
- package/dist/wirings/channel/channel.types.d.ts +5 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
- package/dist/wirings/channel/define-channel-routes.js +23 -0
- package/dist/wirings/channel/index.d.ts +10 -8
- package/dist/wirings/channel/index.js +7 -8
- package/dist/wirings/channel/local/index.d.ts +3 -3
- package/dist/wirings/channel/local/index.js +3 -3
- package/dist/wirings/channel/local/local-channel-runner.js +18 -6
- package/dist/wirings/channel/serverless/index.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.js +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +15 -4
- package/dist/wirings/cli/channel/index.d.ts +1 -1
- package/dist/wirings/cli/channel/index.js +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +1 -1
- package/dist/wirings/cli/cli-runner.js +12 -8
- package/dist/wirings/cli/cli.types.d.ts +6 -6
- package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
- package/dist/wirings/cli/define-cli-commands.js +20 -0
- package/dist/wirings/cli/index.d.ts +2 -3
- package/dist/wirings/cli/index.js +1 -3
- package/dist/wirings/http/http-routes.d.ts +69 -0
- package/dist/wirings/http/http-routes.js +139 -0
- package/dist/wirings/http/http-runner.js +49 -23
- package/dist/wirings/http/http.types.d.ts +78 -38
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- package/dist/wirings/mcp/index.d.ts +4 -3
- package/dist/wirings/mcp/index.js +3 -3
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
- package/dist/wirings/mcp/mcp-runner.js +25 -39
- package/dist/wirings/mcp/mcp.types.d.ts +3 -3
- package/dist/wirings/node/index.d.ts +2 -0
- package/dist/wirings/node/index.js +1 -0
- package/dist/wirings/node/node.types.d.ts +20 -0
- package/dist/wirings/node/node.types.js +1 -0
- package/dist/wirings/oauth2/index.d.ts +3 -0
- package/dist/wirings/oauth2/index.js +2 -0
- package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
- package/dist/wirings/oauth2/oauth2-client.js +267 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
- package/dist/wirings/oauth2/oauth2.types.js +4 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
- package/dist/wirings/queue/index.d.ts +2 -2
- package/dist/wirings/queue/index.js +1 -1
- package/dist/wirings/queue/queue-runner.d.ts +7 -0
- package/dist/wirings/queue/queue-runner.js +17 -6
- package/dist/wirings/queue/queue.types.d.ts +8 -2
- package/dist/wirings/rpc/index.d.ts +1 -1
- package/dist/wirings/rpc/index.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +33 -5
- package/dist/wirings/rpc/rpc-runner.js +134 -16
- package/dist/wirings/rpc/rpc-types.d.ts +8 -4
- package/dist/wirings/scheduler/index.d.ts +3 -3
- package/dist/wirings/scheduler/index.js +2 -3
- package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
- package/dist/wirings/scheduler/scheduler-runner.js +23 -5
- package/dist/wirings/secret/index.d.ts +3 -0
- package/dist/wirings/secret/index.js +2 -0
- package/dist/wirings/secret/secret.types.d.ts +27 -0
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
- package/dist/wirings/secret/validate-secret-definitions.js +55 -0
- package/dist/wirings/trigger/index.d.ts +3 -2
- package/dist/wirings/trigger/index.js +2 -2
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
- package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +21 -8
- package/dist/wirings/trigger/trigger-runner.js +46 -18
- package/dist/wirings/trigger/trigger.types.d.ts +99 -11
- package/dist/wirings/trigger/trigger.types.js +40 -1
- package/dist/wirings/variable/index.d.ts +3 -0
- package/dist/wirings/variable/index.js +2 -0
- package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
- package/dist/wirings/variable/validate-variable-definitions.js +45 -0
- package/dist/wirings/variable/variable.types.d.ts +18 -0
- package/dist/wirings/variable/variable.types.js +1 -0
- package/dist/wirings/workflow/dsl/index.d.ts +1 -1
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
- package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
- package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
- package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
- package/dist/wirings/workflow/graph/graph-runner.js +384 -296
- package/dist/wirings/workflow/graph/index.d.ts +4 -3
- package/dist/wirings/workflow/graph/index.js +3 -3
- package/dist/wirings/workflow/graph/template.d.ts +15 -0
- package/dist/wirings/workflow/graph/template.js +27 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
- package/dist/wirings/workflow/index.d.ts +6 -6
- package/dist/wirings/workflow/index.js +6 -4
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +28 -14
- package/dist/wirings/workflow/pikku-workflow-service.js +200 -56
- package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
- package/dist/wirings/workflow/workflow-helpers.js +38 -0
- package/dist/wirings/workflow/workflow-utils.d.ts +1 -23
- package/dist/wirings/workflow/workflow-utils.js +1 -66
- package/dist/wirings/workflow/workflow.types.d.ts +40 -93
- package/package.json +13 -15
- package/run-tests.sh +4 -1
- package/src/crypto-utils.ts +99 -0
- package/src/errors/errors.ts +17 -0
- package/src/errors/index.ts +0 -1
- package/src/factory-functions.test.ts +42 -2
- package/src/function/function-runner.test.ts +4 -11
- package/src/function/function-runner.ts +114 -29
- package/src/function/functions.types.ts +62 -132
- package/src/function/index.ts +5 -2
- package/src/handle-error.ts +2 -10
- package/src/index.ts +99 -25
- package/src/middleware/auth-apikey.test.ts +15 -12
- package/src/middleware/auth-apikey.ts +3 -3
- package/src/middleware/auth-bearer.test.ts +17 -14
- package/src/middleware/auth-bearer.ts +25 -27
- package/src/middleware/auth-cookie.test.ts +16 -13
- package/src/middleware/auth-cookie.ts +6 -8
- package/src/middleware/cors.ts +96 -0
- package/src/middleware/index.ts +5 -3
- package/src/middleware/remote-auth.ts +68 -0
- package/src/middleware-runner.test.ts +122 -0
- package/src/middleware-runner.ts +12 -12
- package/src/permissions.test.ts +81 -7
- package/src/permissions.ts +15 -17
- package/src/pikku-state.ts +20 -8
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.ts +18 -15
- package/src/services/ai-agent-runner-service.ts +29 -0
- package/src/services/ai-run-state-service.ts +20 -0
- package/src/services/ai-storage-service.ts +39 -0
- package/src/services/deployment-service.ts +22 -0
- package/src/services/gopass-secrets.ts +95 -0
- package/src/services/in-memory-trigger-service.ts +68 -0
- package/src/services/in-memory-workflow-service.ts +395 -0
- package/src/services/index.ts +49 -14
- package/src/services/local-secrets.ts +51 -0
- package/src/services/local-variables.ts +22 -0
- package/src/services/scheduler-service.ts +29 -1
- package/src/services/schema-service.ts +7 -0
- package/src/services/scoped-secret-service.ts +41 -0
- package/src/services/secret-service.ts +25 -4
- package/src/services/trigger-service.ts +38 -0
- package/src/services/typed-secret-service.ts +70 -0
- package/src/services/typed-variables-service.ts +81 -0
- package/src/services/user-session-service.ts +23 -0
- package/src/services/variables-service.ts +5 -0
- package/src/services/workflow-service.ts +22 -2
- package/src/types/core.types.ts +76 -11
- package/src/types/state.types.ts +37 -63
- package/src/utils.ts +20 -6
- package/src/version.test.ts +80 -0
- package/src/version.ts +25 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
- package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
- package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
- package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
- package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
- package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
- package/src/wirings/ai-agent/index.ts +28 -0
- package/src/wirings/channel/channel-common.ts +32 -19
- package/src/wirings/channel/channel-handler.ts +17 -4
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +9 -10
- package/src/wirings/channel/channel.types.ts +17 -1
- package/src/wirings/channel/define-channel-routes.ts +25 -0
- package/src/wirings/channel/index.ts +23 -8
- package/src/wirings/channel/local/index.ts +3 -3
- package/src/wirings/channel/local/local-channel-runner.test.ts +44 -1
- package/src/wirings/channel/local/local-channel-runner.ts +22 -6
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +20 -4
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +9 -9
- package/src/wirings/cli/cli-runner.ts +17 -10
- package/src/wirings/cli/cli.types.ts +11 -11
- package/src/wirings/cli/command-parser.test.ts +8 -8
- package/src/wirings/cli/define-cli-commands.ts +24 -0
- package/src/wirings/cli/index.ts +10 -4
- package/src/wirings/http/http-routes.test.ts +322 -0
- package/src/wirings/http/http-routes.ts +198 -0
- package/src/wirings/http/http-runner.test.ts +3 -3
- package/src/wirings/http/http-runner.ts +63 -29
- package/src/wirings/http/http.types.ts +121 -37
- package/src/wirings/http/index.ts +16 -4
- package/src/wirings/mcp/index.ts +27 -3
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
- package/src/wirings/mcp/mcp-runner.ts +39 -50
- package/src/wirings/mcp/mcp.types.ts +3 -3
- package/src/wirings/node/index.ts +2 -0
- package/src/wirings/node/node.types.ts +23 -0
- package/src/wirings/oauth2/index.ts +3 -0
- package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
- package/src/wirings/oauth2/oauth2-client.ts +335 -0
- package/src/wirings/oauth2/oauth2.types.ts +69 -0
- package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
- package/src/wirings/queue/index.ts +14 -2
- package/src/wirings/queue/queue-runner.test.ts +97 -55
- package/src/wirings/queue/queue-runner.ts +33 -7
- package/src/wirings/queue/queue.types.ts +12 -2
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +187 -17
- package/src/wirings/rpc/rpc-types.ts +13 -4
- package/src/wirings/scheduler/index.ts +7 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +70 -26
- package/src/wirings/scheduler/scheduler-runner.ts +45 -5
- package/src/wirings/secret/index.ts +9 -0
- package/src/wirings/secret/secret.types.ts +32 -0
- package/src/wirings/secret/validate-secret-definitions.ts +82 -0
- package/src/wirings/trigger/index.ts +10 -2
- package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
- package/src/wirings/trigger/trigger-runner.ts +80 -38
- package/src/wirings/trigger/trigger.types.ts +144 -22
- package/src/wirings/variable/index.ts +8 -0
- package/src/wirings/variable/validate-variable-definitions.ts +69 -0
- package/src/wirings/variable/variable.types.ts +22 -0
- package/src/wirings/workflow/dsl/index.ts +1 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
- package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
- package/src/wirings/workflow/graph/graph-node.ts +1 -6
- package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
- package/src/wirings/workflow/graph/graph-runner.ts +496 -374
- package/src/wirings/workflow/graph/index.ts +14 -3
- package/src/wirings/workflow/graph/template.ts +42 -0
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
- package/src/wirings/workflow/index.ts +21 -10
- package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +285 -66
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow-utils.ts +0 -120
- package/src/wirings/workflow/workflow.types.ts +45 -90
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
- package/dist/wirings/forge-node/forge-node.types.js +0 -38
- package/dist/wirings/forge-node/index.d.ts +0 -1
- package/dist/wirings/forge-node/index.js +0 -1
- package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
- package/dist/wirings/workflow/wire-workflow.js +0 -53
- package/src/wirings/forge-node/forge-node.types.ts +0 -135
- package/src/wirings/forge-node/index.ts +0 -1
- package/src/wirings/workflow/wire-workflow.ts +0 -94
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { runPikkuFunc } from '../../function/function-runner.js';
|
|
2
2
|
import { pikkuState } from '../../pikku-state.js';
|
|
3
3
|
import { ForbiddenError } from '../../errors/errors.js';
|
|
4
|
+
import { PikkuError } from '../../errors/error-handler.js';
|
|
5
|
+
import { parseVersionedId } from '../../version.js';
|
|
6
|
+
import { encryptJSON } from '../../crypto-utils.js';
|
|
7
|
+
export class RPCNotFoundError extends PikkuError {
|
|
8
|
+
rpcName;
|
|
9
|
+
constructor(rpcName) {
|
|
10
|
+
super(`RPC function not found: ${rpcName}`);
|
|
11
|
+
this.rpcName = rpcName;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
import { runAIAgent } from '../ai-agent/ai-agent-runner.js';
|
|
4
15
|
/**
|
|
5
16
|
* Resolve a namespaced function reference to package and function names
|
|
6
17
|
* Uses pikkuState to look up the namespace -> package mapping
|
|
@@ -13,20 +24,26 @@ const resolveNamespace = (namespacedFunction) => {
|
|
|
13
24
|
const namespace = namespacedFunction.substring(0, colonIndex);
|
|
14
25
|
const functionName = namespacedFunction.substring(colonIndex + 1);
|
|
15
26
|
const externalPackages = pikkuState(null, 'rpc', 'externalPackages');
|
|
16
|
-
const
|
|
17
|
-
if (!
|
|
27
|
+
const pkgConfig = externalPackages.get(namespace);
|
|
28
|
+
if (!pkgConfig) {
|
|
18
29
|
return null;
|
|
19
30
|
}
|
|
20
31
|
return {
|
|
21
|
-
package:
|
|
32
|
+
package: pkgConfig.package,
|
|
22
33
|
function: functionName,
|
|
23
34
|
};
|
|
24
35
|
};
|
|
25
36
|
const getPikkuFunctionName = (rpcName) => {
|
|
26
37
|
const rpc = pikkuState(null, 'rpc', 'meta');
|
|
27
|
-
|
|
38
|
+
let rpcMeta = rpc[rpcName];
|
|
28
39
|
if (!rpcMeta) {
|
|
29
|
-
|
|
40
|
+
const { baseName, version } = parseVersionedId(rpcName);
|
|
41
|
+
if (version !== null) {
|
|
42
|
+
rpcMeta = rpc[baseName];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!rpcMeta) {
|
|
46
|
+
throw new RPCNotFoundError(rpcName);
|
|
30
47
|
}
|
|
31
48
|
return rpcMeta;
|
|
32
49
|
};
|
|
@@ -41,7 +58,16 @@ export class ContextAwareRPCService {
|
|
|
41
58
|
this.options = options;
|
|
42
59
|
}
|
|
43
60
|
async rpcExposed(funcName, data) {
|
|
44
|
-
|
|
61
|
+
let functionMeta;
|
|
62
|
+
if (funcName.includes(':')) {
|
|
63
|
+
const resolved = resolveNamespace(funcName);
|
|
64
|
+
if (resolved) {
|
|
65
|
+
functionMeta = pikkuState(resolved.package, 'function', 'meta')[resolved.function];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
functionMeta = pikkuState(null, 'function', 'meta')[funcName];
|
|
70
|
+
}
|
|
45
71
|
if (!functionMeta) {
|
|
46
72
|
throw new Error(`Function not found: ${funcName}`);
|
|
47
73
|
}
|
|
@@ -69,8 +95,6 @@ export class ContextAwareRPCService {
|
|
|
69
95
|
// Main package function
|
|
70
96
|
return runPikkuFunc('rpc', funcName, getPikkuFunctionName(funcName), {
|
|
71
97
|
auth: this.options.requiresAuth,
|
|
72
|
-
// TODO: this is a hack since services have already been created
|
|
73
|
-
// but is valid since we don't want to keep creating new wire services
|
|
74
98
|
singletonServices: this.services,
|
|
75
99
|
data: () => data,
|
|
76
100
|
wire: updatedWire,
|
|
@@ -97,7 +121,7 @@ export class ContextAwareRPCService {
|
|
|
97
121
|
throw new Error(`Function '${resolved.function}' not found in package '${resolved.package}'. ` +
|
|
98
122
|
`Available functions: ${Object.keys(externalFunctionMeta).join(', ') || '(none)'}`);
|
|
99
123
|
}
|
|
100
|
-
const funcName = funcMeta.
|
|
124
|
+
const funcName = funcMeta.pikkuFuncId || resolved.function;
|
|
101
125
|
// Execute the function using runPikkuFunc with the external package's state
|
|
102
126
|
// We use the parent services (this.services) since external packages share services
|
|
103
127
|
// Pass the function's tags so tag-based middleware/permissions are applied
|
|
@@ -130,26 +154,120 @@ export class ContextAwareRPCService {
|
|
|
130
154
|
wire: mergedWire,
|
|
131
155
|
});
|
|
132
156
|
}
|
|
133
|
-
async startWorkflow(workflowName, input) {
|
|
157
|
+
async startWorkflow(workflowName, input, options) {
|
|
134
158
|
if (!this.services.workflowService) {
|
|
135
159
|
throw new Error('WorkflowService service not available');
|
|
136
160
|
}
|
|
137
|
-
|
|
161
|
+
const parentRunId = this.wire.workflowStep?.runId ?? this.wire.graph?.runId;
|
|
162
|
+
const wire = options?.wire ?? {
|
|
163
|
+
type: this.wire.wireType ?? 'unknown',
|
|
164
|
+
id: this.wire.wireId,
|
|
165
|
+
...(parentRunId ? { parentRunId } : {}),
|
|
166
|
+
};
|
|
167
|
+
return this.services.workflowService.startWorkflow(workflowName, input, wire, this, options);
|
|
168
|
+
}
|
|
169
|
+
async agent(agentName, input) {
|
|
170
|
+
const result = await runAIAgent(agentName, input, {
|
|
171
|
+
singletonServices: this.services,
|
|
172
|
+
sessionService: this.options.sessionService,
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
runId: result.runId,
|
|
176
|
+
result: result.object ?? result.text,
|
|
177
|
+
usage: result.usage,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async remote(funcName, data) {
|
|
181
|
+
let endpoint;
|
|
182
|
+
const headers = {
|
|
183
|
+
'Content-Type': 'application/json',
|
|
184
|
+
};
|
|
185
|
+
const colonIndex = funcName.indexOf(':');
|
|
186
|
+
if (colonIndex !== -1) {
|
|
187
|
+
const namespace = funcName.substring(0, colonIndex);
|
|
188
|
+
const externalPackages = pikkuState(null, 'rpc', 'externalPackages');
|
|
189
|
+
const pkgConfig = externalPackages.get(namespace);
|
|
190
|
+
endpoint = pkgConfig?.rpcEndpoint;
|
|
191
|
+
}
|
|
192
|
+
if (!endpoint && this.services.deploymentService) {
|
|
193
|
+
const deployments = await this.services.deploymentService.findFunction(funcName);
|
|
194
|
+
if (deployments.length > 0) {
|
|
195
|
+
endpoint = deployments[0].endpoint;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (!endpoint) {
|
|
199
|
+
throw new Error(`No endpoint configured for remote RPC: ${funcName}. ` +
|
|
200
|
+
`Configure rpcEndpoint in externalPackages config or set up a DeploymentService.`);
|
|
201
|
+
}
|
|
202
|
+
let secret;
|
|
203
|
+
if (this.services.secrets) {
|
|
204
|
+
try {
|
|
205
|
+
secret = await this.services.secrets.getSecret('PIKKU_REMOTE_SECRET');
|
|
206
|
+
}
|
|
207
|
+
catch { }
|
|
208
|
+
}
|
|
209
|
+
if (secret) {
|
|
210
|
+
if (!this.services.jwt) {
|
|
211
|
+
throw new Error('PIKKU_REMOTE_SECRET is set but JWT service is not available');
|
|
212
|
+
}
|
|
213
|
+
const session = this.wire.getSession && typeof this.wire.getSession === 'function'
|
|
214
|
+
? await this.wire.getSession()
|
|
215
|
+
: this.wire.session;
|
|
216
|
+
const sessionEnc = session
|
|
217
|
+
? await encryptJSON(secret, { session })
|
|
218
|
+
: undefined;
|
|
219
|
+
const token = await this.services.jwt.encode({ value: 5, unit: 'minute' }, {
|
|
220
|
+
aud: 'pikku-remote',
|
|
221
|
+
fn: funcName,
|
|
222
|
+
iat: Date.now(),
|
|
223
|
+
session: sessionEnc,
|
|
224
|
+
});
|
|
225
|
+
headers.Authorization = `Bearer ${token}`;
|
|
226
|
+
}
|
|
227
|
+
const url = `${endpoint}/rpc/${encodeURIComponent(funcName)}`;
|
|
228
|
+
const timeoutMs = 30_000;
|
|
229
|
+
const response = await fetch(url, {
|
|
230
|
+
method: 'POST',
|
|
231
|
+
headers,
|
|
232
|
+
body: JSON.stringify({ data }),
|
|
233
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
234
|
+
});
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
let errorBody;
|
|
237
|
+
try {
|
|
238
|
+
errorBody = JSON.stringify(await response.json());
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
errorBody = await response.text();
|
|
242
|
+
}
|
|
243
|
+
throw new Error(`Remote RPC call failed: ${response.status} ${response.statusText}. ${errorBody}`);
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
return (await response.json());
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
const text = await response.text();
|
|
250
|
+
throw new Error(`Remote RPC call returned non-JSON response: ${response.status} ${response.statusText}. ${text}`);
|
|
251
|
+
}
|
|
138
252
|
}
|
|
139
253
|
}
|
|
140
254
|
// RPC Service class for the global interface
|
|
141
255
|
export class PikkuRPCService {
|
|
142
256
|
// Convenience function for initializing
|
|
143
|
-
getContextRPCService(services, wire,
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
257
|
+
getContextRPCService(services, wire, requiresAuthOrOptions, depth = 0) {
|
|
258
|
+
const options = typeof requiresAuthOrOptions === 'object' &&
|
|
259
|
+
requiresAuthOrOptions !== null
|
|
260
|
+
? requiresAuthOrOptions
|
|
261
|
+
: { requiresAuth: requiresAuthOrOptions };
|
|
262
|
+
const serviceRPC = new ContextAwareRPCService(services, wire, options);
|
|
147
263
|
return {
|
|
148
264
|
depth,
|
|
149
265
|
global: false,
|
|
150
266
|
invoke: serviceRPC.rpc.bind(serviceRPC),
|
|
151
|
-
|
|
267
|
+
remote: serviceRPC.remote.bind(serviceRPC),
|
|
268
|
+
exposed: serviceRPC.rpcExposed.bind(serviceRPC),
|
|
152
269
|
startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
|
|
270
|
+
agent: serviceRPC.agent.bind(serviceRPC),
|
|
153
271
|
rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
|
|
154
272
|
};
|
|
155
273
|
}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
export type PikkuRPC<
|
|
1
|
+
export type PikkuRPC<Invoke extends Function = any, Remote extends Function = any, startWorkflow extends Function = any, Agent extends Function = any> = {
|
|
2
2
|
depth: number;
|
|
3
3
|
global: boolean;
|
|
4
|
-
invoke:
|
|
4
|
+
invoke: Invoke;
|
|
5
|
+
remote: Remote;
|
|
6
|
+
exposed: (name: string, data: any) => Promise<any>;
|
|
7
|
+
startWorkflow: startWorkflow;
|
|
8
|
+
agent: Agent;
|
|
5
9
|
};
|
|
6
10
|
export type RPCMeta = {
|
|
7
|
-
|
|
11
|
+
pikkuFuncId: string;
|
|
8
12
|
expose: boolean;
|
|
9
|
-
|
|
13
|
+
remote?: boolean;
|
|
10
14
|
};
|
|
11
15
|
/**
|
|
12
16
|
* Type for RPC handlers
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export {
|
|
3
|
-
export
|
|
1
|
+
export { runScheduledTask, createSchedulerRuntimeHandlers, wireScheduler, getScheduledTasks, } from './scheduler-runner.js';
|
|
2
|
+
export { logSchedulers } from './log-schedulers.js';
|
|
3
|
+
export type { CoreScheduledTask, ScheduledTasksMeta, PikkuScheduledTask, } from './scheduler.types.js';
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
export {
|
|
3
|
-
export * from './log-schedulers.js';
|
|
1
|
+
export { runScheduledTask, createSchedulerRuntimeHandlers, wireScheduler, getScheduledTasks, } from './scheduler-runner.js';
|
|
2
|
+
export { logSchedulers } from './log-schedulers.js';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type CoreServices, type CoreSingletonServices, type CoreUserSession, type CreateWireServices } from '../../types/core.types.js';
|
|
2
2
|
import type { CoreScheduledTask } from './scheduler.types.js';
|
|
3
3
|
import { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
4
|
+
import { SchedulerRuntimeHandlers } from '../../services/scheduler-service.js';
|
|
4
5
|
export type RunScheduledTasksParams = {
|
|
5
6
|
name: string;
|
|
6
7
|
session?: CoreUserSession;
|
|
@@ -10,3 +11,7 @@ export type RunScheduledTasksParams = {
|
|
|
10
11
|
export declare const wireScheduler: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<void, void>>>(scheduledTask: CoreScheduledTask<PikkuFunctionConfig>) => void;
|
|
11
12
|
export declare function runScheduledTask({ name, session, singletonServices, createWireServices, }: RunScheduledTasksParams): Promise<void>;
|
|
12
13
|
export declare const getScheduledTasks: () => Map<string, CoreScheduledTask>;
|
|
14
|
+
export declare const createSchedulerRuntimeHandlers: ({ singletonServices, createWireServices, }: {
|
|
15
|
+
singletonServices: CoreSingletonServices;
|
|
16
|
+
createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
|
|
17
|
+
}) => SchedulerRuntimeHandlers;
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { getErrorResponse, PikkuError } from '../../errors/error-handler.js';
|
|
2
|
+
import { PikkuMissingMetaError } from '../../errors/errors.js';
|
|
2
3
|
import { closeWireServices } from '../../utils.js';
|
|
3
4
|
import { pikkuState } from '../../pikku-state.js';
|
|
4
5
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
5
|
-
import { PikkuSessionService } from '../../services/user-session-service.js';
|
|
6
|
+
import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../services/user-session-service.js';
|
|
7
|
+
import { rpcService } from '../rpc/rpc-runner.js';
|
|
6
8
|
export const wireScheduler = (scheduledTask) => {
|
|
7
9
|
const meta = pikkuState(null, 'scheduler', 'meta');
|
|
8
10
|
const taskMeta = meta[scheduledTask.name];
|
|
9
11
|
if (!taskMeta) {
|
|
10
|
-
throw new
|
|
12
|
+
throw new PikkuMissingMetaError(`Missing generated metadata for scheduled task '${scheduledTask.name}'`);
|
|
11
13
|
}
|
|
12
|
-
addFunction(taskMeta.
|
|
14
|
+
addFunction(taskMeta.pikkuFuncId, {
|
|
13
15
|
func: scheduledTask.func.func,
|
|
14
16
|
auth: scheduledTask.func.auth,
|
|
15
17
|
permissions: scheduledTask.func.permissions,
|
|
@@ -57,11 +59,11 @@ export async function runScheduledTask({ name, session, singletonServices, creat
|
|
|
57
59
|
throw new ScheduledTaskSkippedError(name, reason);
|
|
58
60
|
},
|
|
59
61
|
},
|
|
60
|
-
|
|
62
|
+
...createMiddlewareSessionWireProps(userSession),
|
|
61
63
|
};
|
|
62
64
|
try {
|
|
63
65
|
singletonServices.logger.info(`Running schedule task: ${name} | schedule: ${task.schedule}`);
|
|
64
|
-
await runPikkuFunc('scheduler', meta.name, meta.
|
|
66
|
+
await runPikkuFunc('scheduler', meta.name, meta.pikkuFuncId, {
|
|
65
67
|
singletonServices,
|
|
66
68
|
createWireServices,
|
|
67
69
|
auth: false,
|
|
@@ -70,6 +72,7 @@ export async function runScheduledTask({ name, session, singletonServices, creat
|
|
|
70
72
|
wireMiddleware: task.middleware,
|
|
71
73
|
tags: task.tags,
|
|
72
74
|
wire,
|
|
75
|
+
sessionService: userSession,
|
|
73
76
|
});
|
|
74
77
|
}
|
|
75
78
|
catch (e) {
|
|
@@ -88,3 +91,18 @@ export async function runScheduledTask({ name, session, singletonServices, creat
|
|
|
88
91
|
export const getScheduledTasks = () => {
|
|
89
92
|
return pikkuState(null, 'scheduler', 'tasks');
|
|
90
93
|
};
|
|
94
|
+
export const createSchedulerRuntimeHandlers = ({ singletonServices, createWireServices, }) => {
|
|
95
|
+
return {
|
|
96
|
+
logger: singletonServices.logger,
|
|
97
|
+
invokeRPC: async (rpcName, data, session) => {
|
|
98
|
+
const wire = session ? { session } : {};
|
|
99
|
+
const rpc = rpcService.getContextRPCService(singletonServices, wire);
|
|
100
|
+
await rpc.invoke(rpcName, data);
|
|
101
|
+
},
|
|
102
|
+
runScheduledTask: async (name) => runScheduledTask({
|
|
103
|
+
name,
|
|
104
|
+
singletonServices,
|
|
105
|
+
createWireServices,
|
|
106
|
+
}),
|
|
107
|
+
};
|
|
108
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { wireSecret } from './secret.types.js';
|
|
2
|
+
export type { CoreSecret, OAuth2CredentialConfig, SecretDefinitionMeta, SecretDefinitionsMeta, SecretDefinitions, } from './secret.types.js';
|
|
3
|
+
export { validateAndBuildSecretDefinitionsMeta } from './validate-secret-definitions.js';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type CoreSecret<T = unknown> = {
|
|
2
|
+
name: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
secretId: string;
|
|
6
|
+
schema: T;
|
|
7
|
+
};
|
|
8
|
+
export type OAuth2CredentialConfig = {
|
|
9
|
+
tokenSecretId: string;
|
|
10
|
+
authorizationUrl: string;
|
|
11
|
+
tokenUrl: string;
|
|
12
|
+
scopes: string[];
|
|
13
|
+
pkce?: boolean;
|
|
14
|
+
additionalParams?: Record<string, string>;
|
|
15
|
+
};
|
|
16
|
+
export type SecretDefinitionMeta = {
|
|
17
|
+
name: string;
|
|
18
|
+
displayName: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
secretId: string;
|
|
21
|
+
schema?: Record<string, unknown> | string;
|
|
22
|
+
oauth2?: OAuth2CredentialConfig;
|
|
23
|
+
sourceFile?: string;
|
|
24
|
+
};
|
|
25
|
+
export type SecretDefinitionsMeta = Record<string, SecretDefinitionMeta>;
|
|
26
|
+
export type SecretDefinitions = SecretDefinitionMeta[];
|
|
27
|
+
export declare const wireSecret: <T>(_config: CoreSecret<T>) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const wireSecret = (_config) => { };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SecretDefinitions, SecretDefinitionsMeta } from './secret.types.js';
|
|
2
|
+
export interface SchemaRefLike {
|
|
3
|
+
variableName: string;
|
|
4
|
+
sourceFile: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function validateAndBuildSecretDefinitionsMeta(definitions: SecretDefinitions, schemaLookup: Map<string, SchemaRefLike>): SecretDefinitionsMeta;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function validateAndBuildSecretDefinitionsMeta(definitions, schemaLookup) {
|
|
2
|
+
const meta = {};
|
|
3
|
+
const secretIdToDefinition = new Map();
|
|
4
|
+
for (const def of definitions) {
|
|
5
|
+
const existingDef = secretIdToDefinition.get(def.secretId);
|
|
6
|
+
if (existingDef) {
|
|
7
|
+
if (def.schema && existingDef.schema) {
|
|
8
|
+
const defSchemaRef = schemaLookup.get(def.schema);
|
|
9
|
+
const existingSchemaRef = schemaLookup.get(existingDef.schema);
|
|
10
|
+
if (defSchemaRef && existingSchemaRef) {
|
|
11
|
+
if (defSchemaRef.variableName !== existingSchemaRef.variableName ||
|
|
12
|
+
defSchemaRef.sourceFile !== existingSchemaRef.sourceFile) {
|
|
13
|
+
throw new Error(`Secret '${def.secretId}' is defined with different schemas.\n` +
|
|
14
|
+
` First definition: ${existingDef.sourceFile} (schema: ${existingSchemaRef.variableName})\n` +
|
|
15
|
+
` Second definition: ${def.sourceFile} (schema: ${defSchemaRef.variableName})\n` +
|
|
16
|
+
`Credentials sharing a secretId must use the same schema.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (def.oauth2 && existingDef.oauth2) {
|
|
21
|
+
if (JSON.stringify(def.oauth2) !== JSON.stringify(existingDef.oauth2)) {
|
|
22
|
+
throw new Error(`OAuth2 secret '${def.secretId}' is defined with different configurations.\n` +
|
|
23
|
+
` First definition: ${existingDef.sourceFile}\n` +
|
|
24
|
+
` Second definition: ${def.sourceFile}\n` +
|
|
25
|
+
`Credentials sharing a secretId must use the same configuration.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (!meta[def.name]) {
|
|
29
|
+
meta[def.name] = {
|
|
30
|
+
name: def.name,
|
|
31
|
+
displayName: def.displayName,
|
|
32
|
+
description: def.description,
|
|
33
|
+
secretId: def.secretId,
|
|
34
|
+
schema: def.schema,
|
|
35
|
+
oauth2: def.oauth2,
|
|
36
|
+
sourceFile: def.sourceFile,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
secretIdToDefinition.set(def.secretId, def);
|
|
42
|
+
if (!meta[def.name]) {
|
|
43
|
+
meta[def.name] = {
|
|
44
|
+
name: def.name,
|
|
45
|
+
displayName: def.displayName,
|
|
46
|
+
description: def.description,
|
|
47
|
+
secretId: def.secretId,
|
|
48
|
+
schema: def.schema,
|
|
49
|
+
oauth2: def.oauth2,
|
|
50
|
+
sourceFile: def.sourceFile,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return meta;
|
|
55
|
+
}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export { wireTrigger, wireTriggerSource } from './trigger-runner.js';
|
|
2
|
+
export { PikkuTriggerService } from './pikku-trigger-service.js';
|
|
3
|
+
export type { TriggerMeta, TriggerSourceMeta, CorePikkuTriggerFunction, CorePikkuTriggerFunctionConfig, CoreTrigger, PikkuTrigger, } from './trigger.types.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export { wireTrigger, wireTriggerSource } from './trigger-runner.js';
|
|
2
|
+
export { PikkuTriggerService } from './pikku-trigger-service.js';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CoreSingletonServices, CreateWireServices, CoreServices, CoreUserSession } from '../../types/core.types.js';
|
|
2
|
+
import { TriggerInstance } from './trigger.types.js';
|
|
3
|
+
import { TriggerService } from '../../services/trigger-service.js';
|
|
4
|
+
export type TriggerTarget = {
|
|
5
|
+
targetType: 'rpc' | 'workflow';
|
|
6
|
+
targetName: string;
|
|
7
|
+
startNode?: string;
|
|
8
|
+
};
|
|
9
|
+
export type TriggerSourceInfo = {
|
|
10
|
+
name: string;
|
|
11
|
+
input: unknown;
|
|
12
|
+
};
|
|
13
|
+
export declare abstract class PikkuTriggerService implements TriggerService {
|
|
14
|
+
protected activeTriggers: Map<string, TriggerInstance>;
|
|
15
|
+
protected singletonServices?: CoreSingletonServices;
|
|
16
|
+
protected createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices, CoreUserSession>;
|
|
17
|
+
setServices(singletonServices: CoreSingletonServices, createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices, CoreUserSession>): void;
|
|
18
|
+
abstract start(): Promise<void>;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
protected getTriggerTargets(): Map<string, TriggerTarget[]>;
|
|
21
|
+
protected getTriggerSources(): Map<string, {
|
|
22
|
+
input?: unknown;
|
|
23
|
+
}>;
|
|
24
|
+
protected setupTriggerInstance(name: string, input: unknown, onTrigger: (data: unknown) => Promise<void>): Promise<TriggerInstance>;
|
|
25
|
+
protected onTriggerFire(triggerName: string, targets: TriggerTarget[], data: unknown): Promise<void>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { rpcService } from '../rpc/rpc-runner.js';
|
|
2
|
+
import { setupTrigger } from './trigger-runner.js';
|
|
3
|
+
import { pikkuState } from '../../pikku-state.js';
|
|
4
|
+
export class PikkuTriggerService {
|
|
5
|
+
activeTriggers = new Map();
|
|
6
|
+
singletonServices;
|
|
7
|
+
createWireServices;
|
|
8
|
+
setServices(singletonServices, createWireServices) {
|
|
9
|
+
this.singletonServices = singletonServices;
|
|
10
|
+
this.createWireServices = createWireServices;
|
|
11
|
+
}
|
|
12
|
+
async stop() {
|
|
13
|
+
for (const [name, instance] of this.activeTriggers) {
|
|
14
|
+
try {
|
|
15
|
+
await instance.teardown();
|
|
16
|
+
this.singletonServices.logger.info(`Stopped trigger: ${name}`);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
this.singletonServices.logger.error(`Error stopping trigger ${name}: ${error}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
this.activeTriggers.clear();
|
|
23
|
+
}
|
|
24
|
+
getTriggerTargets() {
|
|
25
|
+
const triggers = pikkuState(null, 'trigger', 'triggers');
|
|
26
|
+
const triggerTargets = new Map();
|
|
27
|
+
for (const [name] of triggers) {
|
|
28
|
+
const meta = pikkuState(null, 'trigger', 'meta')[name];
|
|
29
|
+
if (meta) {
|
|
30
|
+
if (!triggerTargets.has(name)) {
|
|
31
|
+
triggerTargets.set(name, []);
|
|
32
|
+
}
|
|
33
|
+
triggerTargets.get(name).push({
|
|
34
|
+
targetType: 'rpc',
|
|
35
|
+
targetName: meta.pikkuFuncId,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return triggerTargets;
|
|
40
|
+
}
|
|
41
|
+
getTriggerSources() {
|
|
42
|
+
return pikkuState(null, 'trigger', 'triggerSources');
|
|
43
|
+
}
|
|
44
|
+
async setupTriggerInstance(name, input, onTrigger) {
|
|
45
|
+
return setupTrigger({
|
|
46
|
+
name,
|
|
47
|
+
singletonServices: this.singletonServices,
|
|
48
|
+
createWireServices: this.createWireServices,
|
|
49
|
+
input,
|
|
50
|
+
onTrigger,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async onTriggerFire(triggerName, targets, data) {
|
|
54
|
+
const wireServices = await this.createWireServices?.(this.singletonServices, {});
|
|
55
|
+
const services = { ...this.singletonServices, ...wireServices };
|
|
56
|
+
const rpc = rpcService.getContextRPCService(services, {}, false);
|
|
57
|
+
for (const target of targets) {
|
|
58
|
+
try {
|
|
59
|
+
if (target.targetType === 'workflow') {
|
|
60
|
+
await rpc.startWorkflow(target.targetName, data, {
|
|
61
|
+
startNode: target.startNode,
|
|
62
|
+
});
|
|
63
|
+
this.singletonServices.logger.info(`Trigger '${triggerName}' started workflow '${target.targetName}'`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await rpc.invoke(target.targetName, data);
|
|
67
|
+
this.singletonServices.logger.info(`Trigger '${triggerName}' invoked RPC '${target.targetName}'`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.singletonServices.logger.error(`Error invoking ${target.targetType} '${target.targetName}' from trigger '${triggerName}': ${error}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -1,28 +1,41 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import type { CoreTrigger, TriggerInstance } from './trigger.types.js';
|
|
3
|
-
import type { CorePikkuTriggerFunctionConfig } from '../../function/functions.types.js';
|
|
1
|
+
import { CreateWireServices, type CoreSingletonServices } from '../../types/core.types.js';
|
|
2
|
+
import type { CoreTrigger, CoreTriggerSource, TriggerInstance } from './trigger.types.js';
|
|
4
3
|
/**
|
|
5
4
|
* Registers a trigger with the Pikku framework.
|
|
6
|
-
*
|
|
5
|
+
* Declares a trigger name and its target pikku function.
|
|
6
|
+
* Runs everywhere. Inspector extracts at build time.
|
|
7
7
|
*/
|
|
8
|
-
export declare const wireTrigger:
|
|
8
|
+
export declare const wireTrigger: (trigger: CoreTrigger) => void;
|
|
9
|
+
/**
|
|
10
|
+
* Registers a trigger source with the Pikku framework.
|
|
11
|
+
* Provides the actual subscription function and input data.
|
|
12
|
+
* Only imported in the trigger worker process.
|
|
13
|
+
*/
|
|
14
|
+
export declare const wireTriggerSource: <TInput = unknown, TOutput = unknown>(source: CoreTriggerSource<TInput, TOutput>) => void;
|
|
9
15
|
/**
|
|
10
16
|
* Parameters for setting up a trigger
|
|
11
17
|
*/
|
|
12
|
-
export type SetupTriggerParams<TOutput = unknown> = {
|
|
18
|
+
export type SetupTriggerParams<TInput = unknown, TOutput = unknown> = {
|
|
13
19
|
name: string;
|
|
14
20
|
singletonServices: CoreSingletonServices;
|
|
21
|
+
createWireServices?: CreateWireServices;
|
|
22
|
+
input?: TInput;
|
|
15
23
|
onTrigger: (data: TOutput) => void | Promise<void>;
|
|
16
24
|
};
|
|
17
25
|
/**
|
|
18
26
|
* Sets up a registered trigger and starts listening for events.
|
|
19
27
|
* Returns a TriggerInstance with a teardown function.
|
|
28
|
+
*
|
|
29
|
+
* @param name - The trigger name (must be registered via wireTrigger)
|
|
30
|
+
* @param singletonServices - The singleton services
|
|
31
|
+
* @param input - The input to pass to the trigger function
|
|
32
|
+
* @param onTrigger - Callback invoked when the trigger fires
|
|
20
33
|
*/
|
|
21
|
-
export declare function setupTrigger<TOutput = unknown>({ name, singletonServices, onTrigger, }: SetupTriggerParams<TOutput>): Promise<TriggerInstance>;
|
|
34
|
+
export declare function setupTrigger<TInput = unknown, TOutput = unknown>({ name, singletonServices, createWireServices, input, onTrigger, }: SetupTriggerParams<TInput, TOutput>): Promise<TriggerInstance>;
|
|
22
35
|
/**
|
|
23
36
|
* Gets all registered triggers
|
|
24
37
|
*/
|
|
25
|
-
export declare const getRegisteredTriggers: () => Map<string, CoreTrigger<
|
|
38
|
+
export declare const getRegisteredTriggers: () => Map<string, CoreTrigger<any>>;
|
|
26
39
|
/**
|
|
27
40
|
* Gets trigger metadata
|
|
28
41
|
*/
|