@pikku/core 0.11.1 → 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 +55 -0
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- package/dist/errors/error-handler.js +3 -3
- 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 +10 -3
- package/dist/function/function-runner.js +136 -31
- package/dist/function/functions.types.d.ts +35 -12
- package/dist/function/functions.types.js +16 -6
- 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 +30 -24
- package/dist/index.js +19 -27
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-bearer.js +3 -6
- package/dist/middleware/auth-cookie.d.ts +1 -1
- 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 +1 -1
- package/dist/middleware-runner.d.ts +3 -14
- package/dist/middleware-runner.js +14 -16
- package/dist/permissions.d.ts +3 -86
- package/dist/permissions.js +20 -80
- package/dist/pikku-state.d.ts +33 -104
- package/dist/pikku-state.js +150 -66
- package/dist/schema.d.ts +8 -6
- package/dist/schema.js +31 -18
- 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 +43 -0
- package/dist/services/workflow-service.js +1 -0
- package/dist/types/core.types.d.ts +54 -10
- package/dist/types/core.types.js +7 -0
- package/dist/types/state.types.d.ts +127 -0
- package/dist/types/state.types.js +1 -0
- package/dist/utils.d.ts +10 -1
- package/dist/utils.js +60 -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 +13 -4
- 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 +12 -12
- 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/log-channels.js +1 -1
- 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 +17 -6
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
- 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 +22 -18
- package/dist/wirings/cli/cli.types.d.ts +7 -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.d.ts +2 -2
- package/dist/wirings/http/http-runner.js +62 -27
- package/dist/wirings/http/http.types.d.ts +77 -24
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- package/dist/wirings/http/log-http-routes.js +1 -1
- package/dist/wirings/http/routers/path-to-regex.js +2 -2
- 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 +42 -56
- 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 +23 -12
- 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 +40 -13
- package/dist/wirings/rpc/rpc-runner.js +191 -25
- package/dist/wirings/rpc/rpc-types.d.ts +15 -4
- package/dist/wirings/scheduler/index.d.ts +3 -3
- package/dist/wirings/scheduler/index.js +2 -3
- package/dist/wirings/scheduler/log-schedulers.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -10
- 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 -0
- package/dist/wirings/trigger/index.js +2 -0
- 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 +42 -0
- package/dist/wirings/trigger/trigger-runner.js +85 -0
- package/dist/wirings/trigger/trigger.types.d.ts +130 -0
- package/dist/wirings/trigger/trigger.types.js +40 -0
- 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 +5 -0
- package/dist/wirings/workflow/dsl/index.js +4 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +292 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +23 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
- package/dist/wirings/workflow/graph/graph-node.js +58 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
- package/dist/wirings/workflow/graph/graph-runner.js +540 -0
- package/dist/wirings/workflow/graph/index.d.ts +4 -0
- package/dist/wirings/workflow/graph/index.js +3 -0
- 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 +82 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
- package/dist/wirings/workflow/index.d.ts +7 -12
- package/dist/wirings/workflow/index.js +8 -11
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
- package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
- 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 -0
- package/dist/wirings/workflow/workflow-utils.js +1 -0
- package/dist/wirings/workflow/workflow.types.d.ts +83 -214
- package/package.json +13 -6
- package/run-tests.sh +4 -1
- package/src/crypto-utils.ts +99 -0
- package/src/errors/error-handler.ts +3 -3
- 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 +5 -12
- package/src/function/function-runner.ts +195 -40
- package/src/function/functions.types.ts +66 -14
- package/src/function/index.ts +5 -2
- package/src/handle-error.ts +2 -10
- package/src/index.ts +106 -27
- 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 +24 -17
- package/src/permissions.test.ts +102 -86
- package/src/permissions.ts +32 -93
- package/src/pikku-state.ts +168 -201
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.ts +50 -18
- 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 +94 -0
- package/src/types/core.types.ts +82 -8
- package/src/types/state.types.ts +169 -0
- package/src/utils.ts +74 -5
- 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 +18 -5
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +14 -15
- 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 +47 -2
- package/src/wirings/channel/local/local-channel-runner.ts +22 -6
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +28 -28
- package/src/wirings/cli/cli-runner.ts +27 -19
- package/src/wirings/cli/cli.types.ts +12 -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 +5 -5
- package/src/wirings/http/http-runner.ts +80 -29
- package/src/wirings/http/http.types.ts +121 -23
- package/src/wirings/http/index.ts +16 -4
- package/src/wirings/http/log-http-routes.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
- package/src/wirings/http/routers/path-to-regex.ts +2 -2
- 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 +56 -67
- 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 +115 -73
- package/src/wirings/queue/queue-runner.ts +39 -13
- package/src/wirings/queue/queue.types.ts +12 -2
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +270 -34
- package/src/wirings/rpc/rpc-types.ts +21 -4
- package/src/wirings/scheduler/index.ts +7 -4
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
- package/src/wirings/scheduler/scheduler-runner.ts +50 -10
- 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 -0
- package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
- package/src/wirings/trigger/trigger-runner.ts +138 -0
- package/src/wirings/trigger/trigger.types.ts +178 -0
- 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 +31 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
- package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
- package/src/wirings/workflow/graph/graph-node.ts +222 -0
- package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
- package/src/wirings/workflow/graph/graph-runner.ts +816 -0
- package/src/wirings/workflow/graph/index.ts +14 -0
- 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 +104 -0
- package/src/wirings/workflow/index.ts +64 -26
- package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow-utils.ts +0 -0
- package/src/wirings/workflow/workflow.types.ts +123 -279
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
- package/dist/wirings/workflow/workflow-runner.js +0 -65
- package/src/function/function-runner.ts.bak +0 -188
- package/src/wirings/workflow/workflow-runner.ts +0 -72
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-op function for declaring OAuth2 credentials.
|
|
3
|
+
* This exists purely for TypeScript type checking and will be tree-shaken.
|
|
4
|
+
* The CLI extracts metadata via AST parsing.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* wireOAuth2Credential({
|
|
9
|
+
* name: 'slackOAuth',
|
|
10
|
+
* displayName: 'Slack OAuth',
|
|
11
|
+
* secretId: 'SLACK_OAUTH_APP',
|
|
12
|
+
* tokenSecretId: 'SLACK_OAUTH_TOKENS',
|
|
13
|
+
* authorizationUrl: 'https://slack.com/oauth/v2/authorize',
|
|
14
|
+
* tokenUrl: 'https://slack.com/api/oauth.v2.access',
|
|
15
|
+
* scopes: ['chat:write', 'channels:read'],
|
|
16
|
+
* })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const wireOAuth2Credential = (_config) => {
|
|
20
|
+
// No-op - metadata only, extracted by CLI via AST
|
|
21
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type
|
|
2
|
-
export { wireQueueWorker, runQueueJob, getQueueWorkers, removeQueueWorker, QueueJobDiscardedError, QueueJobFailedError, } from './queue-runner.js';
|
|
1
|
+
export type { ConfigValidationResult, CoreQueueWorker, JobOptions, PikkuJobConfig, PikkuWorkerConfig, PikkuQueue, QueueJob, QueueJobStatus, QueueService, QueueWorkers, QueueWorkersMeta, } from './queue.types.js';
|
|
2
|
+
export { wireQueueWorker, runQueueJob, createQueueJobRunner, getQueueWorkers, removeQueueWorker, QueueJobDiscardedError, QueueJobFailedError, } from './queue-runner.js';
|
|
3
3
|
export { validateWorkerConfig } from './validate-worker-config.js';
|
|
4
4
|
export type { QueueConfigMapping } from './validate-worker-config.js';
|
|
5
5
|
export { registerQueueWorkers } from './register-queue-helper.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Queue processor management
|
|
2
|
-
export { wireQueueWorker, runQueueJob, getQueueWorkers, removeQueueWorker, QueueJobDiscardedError, QueueJobFailedError, } from './queue-runner.js';
|
|
2
|
+
export { wireQueueWorker, runQueueJob, createQueueJobRunner, getQueueWorkers, removeQueueWorker, QueueJobDiscardedError, QueueJobFailedError, } from './queue-runner.js';
|
|
3
3
|
// Configuration validation
|
|
4
4
|
export { validateWorkerConfig } from './validate-worker-config.js';
|
|
5
5
|
// Queue registration helper
|
|
@@ -36,3 +36,10 @@ export declare function runQueueJob({ singletonServices, createWireServices, job
|
|
|
36
36
|
job: QueueJob;
|
|
37
37
|
updateProgress?: (progress: number | string | object) => Promise<void>;
|
|
38
38
|
}): Promise<void>;
|
|
39
|
+
export declare const createQueueJobRunner: ({ singletonServices, createWireServices, }: {
|
|
40
|
+
singletonServices: CoreServices;
|
|
41
|
+
createWireServices?: CreateWireServices;
|
|
42
|
+
}) => ({ job, updateProgress, }: {
|
|
43
|
+
job: QueueJob;
|
|
44
|
+
updateProgress?: (progress: number | string | object) => Promise<void>;
|
|
45
|
+
}) => Promise<void>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getErrorResponse, PikkuError } from '../../errors/error-handler.js';
|
|
2
|
+
import { PikkuMissingMetaError } from '../../errors/errors.js';
|
|
2
3
|
import { pikkuState } from '../../pikku-state.js';
|
|
3
4
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
4
5
|
/**
|
|
@@ -32,13 +33,13 @@ export class QueueJobDiscardedError extends PikkuError {
|
|
|
32
33
|
*/
|
|
33
34
|
export const wireQueueWorker = (queueWorker) => {
|
|
34
35
|
// Get processor metadata
|
|
35
|
-
const meta = pikkuState('queue', 'meta');
|
|
36
|
-
const processorMeta = meta[queueWorker.
|
|
36
|
+
const meta = pikkuState(null, 'queue', 'meta');
|
|
37
|
+
const processorMeta = meta[queueWorker.name];
|
|
37
38
|
if (!processorMeta) {
|
|
38
|
-
throw new
|
|
39
|
+
throw new PikkuMissingMetaError(`Missing generated metadata for queue worker '${queueWorker.name}'`);
|
|
39
40
|
}
|
|
40
41
|
// Register the function with pikku
|
|
41
|
-
addFunction(processorMeta.
|
|
42
|
+
addFunction(processorMeta.pikkuFuncId, {
|
|
42
43
|
func: queueWorker.func.func,
|
|
43
44
|
auth: queueWorker.func.auth,
|
|
44
45
|
permissions: queueWorker.func.permissions,
|
|
@@ -46,20 +47,20 @@ export const wireQueueWorker = (queueWorker) => {
|
|
|
46
47
|
tags: queueWorker.func.tags,
|
|
47
48
|
});
|
|
48
49
|
// Store processor definition in state - runtime adapters will pick this up
|
|
49
|
-
const registrations = pikkuState('queue', 'registrations');
|
|
50
|
-
registrations.set(queueWorker.
|
|
50
|
+
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
51
|
+
registrations.set(queueWorker.name, queueWorker);
|
|
51
52
|
};
|
|
52
53
|
/**
|
|
53
54
|
* Get all registered queue processors
|
|
54
55
|
*/
|
|
55
56
|
export function getQueueWorkers() {
|
|
56
|
-
return pikkuState('queue', 'registrations');
|
|
57
|
+
return pikkuState(null, 'queue', 'registrations');
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
59
60
|
* Stop and remove a queue processor
|
|
60
61
|
*/
|
|
61
62
|
export async function removeQueueWorker(name) {
|
|
62
|
-
const registrations = pikkuState('queue', 'registrations');
|
|
63
|
+
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
63
64
|
const registration = registrations.get(name);
|
|
64
65
|
if (!registration) {
|
|
65
66
|
throw new QueueWorkerNotFoundError(name);
|
|
@@ -71,13 +72,13 @@ export async function removeQueueWorker(name) {
|
|
|
71
72
|
*/
|
|
72
73
|
export async function runQueueJob({ singletonServices, createWireServices, job, updateProgress, }) {
|
|
73
74
|
const logger = singletonServices.logger;
|
|
74
|
-
const meta = pikkuState('queue', 'meta');
|
|
75
|
+
const meta = pikkuState(null, 'queue', 'meta');
|
|
75
76
|
const processorMeta = meta[job.queueName];
|
|
76
77
|
if (!processorMeta) {
|
|
77
|
-
throw new
|
|
78
|
+
throw new PikkuMissingMetaError(`Missing generated metadata for queue worker '${job.queueName}'`);
|
|
78
79
|
}
|
|
79
80
|
// Get the queue worker registration to access middleware
|
|
80
|
-
const registrations = pikkuState('queue', 'registrations');
|
|
81
|
+
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
81
82
|
const queueWorker = registrations.get(job.queueName);
|
|
82
83
|
if (!queueWorker) {
|
|
83
84
|
throw new Error(`Queue worker registration not found for: ${job.queueName}`);
|
|
@@ -104,7 +105,7 @@ export async function runQueueJob({ singletonServices, createWireServices, job,
|
|
|
104
105
|
queue,
|
|
105
106
|
};
|
|
106
107
|
// Execute the pikku function with the job data
|
|
107
|
-
const result = await runPikkuFunc('queue', job.queueName, processorMeta.
|
|
108
|
+
const result = await runPikkuFunc('queue', job.queueName, processorMeta.pikkuFuncId, {
|
|
108
109
|
singletonServices,
|
|
109
110
|
createWireServices,
|
|
110
111
|
auth: false,
|
|
@@ -127,3 +128,13 @@ export async function runQueueJob({ singletonServices, createWireServices, job,
|
|
|
127
128
|
throw error;
|
|
128
129
|
}
|
|
129
130
|
}
|
|
131
|
+
export const createQueueJobRunner = ({ singletonServices, createWireServices, }) => {
|
|
132
|
+
return async ({ job, updateProgress, }) => {
|
|
133
|
+
await runQueueJob({
|
|
134
|
+
singletonServices,
|
|
135
|
+
createWireServices,
|
|
136
|
+
job,
|
|
137
|
+
updateProgress,
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CommonWireMeta } from '../../types/core.types.js';
|
|
2
2
|
import { CorePikkuFunctionConfig } from '../../function/functions.types.js';
|
|
3
3
|
import { QueueConfigMapping } from './validate-worker-config.js';
|
|
4
|
+
import { Logger } from '../../services/logger.js';
|
|
4
5
|
/**
|
|
5
6
|
* Configuration for queue workers - how jobs are processed
|
|
6
7
|
*/
|
|
@@ -124,6 +125,11 @@ export interface QueueWorkers {
|
|
|
124
125
|
supportsResults: boolean;
|
|
125
126
|
/** Configuration mapping for validation */
|
|
126
127
|
configMappings: QueueConfigMapping;
|
|
128
|
+
/** Set runtime queue job runner callback and logger */
|
|
129
|
+
setJobRunner(runJob: (params: {
|
|
130
|
+
job: QueueJob;
|
|
131
|
+
updateProgress?: (progress: number | string | object) => Promise<void>;
|
|
132
|
+
}) => Promise<void>, logger: Logger): void;
|
|
127
133
|
/** Scan state and register all compatible processors */
|
|
128
134
|
registerQueues(): Promise<Record<string, ConfigValidationResult[]>>;
|
|
129
135
|
}
|
|
@@ -131,14 +137,14 @@ export interface QueueWorkers {
|
|
|
131
137
|
* Queue processor metadata
|
|
132
138
|
*/
|
|
133
139
|
export type QueueWorkersMeta = Record<string, CommonWireMeta & {
|
|
134
|
-
|
|
140
|
+
name: string;
|
|
135
141
|
config?: PikkuWorkerConfig;
|
|
136
142
|
}>;
|
|
137
143
|
/**
|
|
138
144
|
* Core queue processor definition
|
|
139
145
|
*/
|
|
140
146
|
export type CoreQueueWorker<PikkuFunctionConfig extends CorePikkuFunctionConfig<any, any, any> = CorePikkuFunctionConfig<any, any, any>> = {
|
|
141
|
-
|
|
147
|
+
name: string;
|
|
142
148
|
func: PikkuFunctionConfig;
|
|
143
149
|
config?: PikkuWorkerConfig;
|
|
144
150
|
errors?: string[];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { PikkuRPCService, rpcService, RPCNotFoundError } from './rpc-runner.js';
|
|
2
2
|
export type { PikkuRPC, RPCMeta } from './rpc-types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { PikkuRPCService, rpcService, RPCNotFoundError } from './rpc-runner.js';
|
|
@@ -1,32 +1,59 @@
|
|
|
1
|
-
import { CoreServices, PikkuWire } from '../../types/core.types.js';
|
|
1
|
+
import { CoreServices, CoreSingletonServices, PikkuWire } from '../../types/core.types.js';
|
|
2
|
+
import type { SessionService } from '../../services/user-session-service.js';
|
|
3
|
+
import type { CoreUserSession } from '../../types/core.types.js';
|
|
4
|
+
import { PikkuError } from '../../errors/error-handler.js';
|
|
2
5
|
import { PikkuRPC } from './rpc-types.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
export declare class RPCNotFoundError extends PikkuError {
|
|
7
|
+
readonly rpcName: string;
|
|
8
|
+
constructor(rpcName: string);
|
|
9
|
+
}
|
|
10
|
+
import type { AIAgentInput } from '../ai-agent/ai-agent.types.js';
|
|
6
11
|
export declare class ContextAwareRPCService {
|
|
7
12
|
private services;
|
|
8
13
|
private wire;
|
|
9
14
|
private options;
|
|
10
15
|
constructor(services: CoreServices, wire: PikkuWire, options: {
|
|
11
|
-
coerceDataFromSchema?: boolean;
|
|
12
16
|
requiresAuth?: boolean;
|
|
17
|
+
sessionService?: SessionService<CoreUserSession>;
|
|
13
18
|
});
|
|
14
19
|
rpcExposed(funcName: string, data: any): Promise<any>;
|
|
15
20
|
rpc<In = any, Out = any>(funcName: string, data: In): Promise<Out>;
|
|
21
|
+
/**
|
|
22
|
+
* Invoke a function from an external package
|
|
23
|
+
* External packages register their functions in pikkuState under their package name.
|
|
24
|
+
* The function is executed using the parent services (shared singleton services).
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
27
|
+
private invokeExternalPackageFunction;
|
|
16
28
|
rpcWithWire<In = any, Out = any>(rpcName: string, data: In, wire: PikkuWire): Promise<Out>;
|
|
17
|
-
startWorkflow<In = any>(workflowName: string, input: In
|
|
29
|
+
startWorkflow<In = any>(workflowName: string, input: In, options?: {
|
|
30
|
+
startNode?: string;
|
|
31
|
+
wire?: {
|
|
32
|
+
type: string;
|
|
33
|
+
id?: string;
|
|
34
|
+
parentRunId?: string;
|
|
35
|
+
};
|
|
36
|
+
}): Promise<{
|
|
37
|
+
runId: string;
|
|
38
|
+
}>;
|
|
39
|
+
agent(agentName: string, input: AIAgentInput): Promise<{
|
|
18
40
|
runId: string;
|
|
41
|
+
result: unknown;
|
|
42
|
+
usage: {
|
|
43
|
+
inputTokens: number;
|
|
44
|
+
outputTokens: number;
|
|
45
|
+
};
|
|
19
46
|
}>;
|
|
47
|
+
remote<In = any, Out = any>(funcName: string, data: In): Promise<Out>;
|
|
20
48
|
}
|
|
21
49
|
export declare class PikkuRPCService<Services extends CoreServices, TypedRPC = PikkuRPC> {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
50
|
+
getContextRPCService(services: Services, wire: PikkuWire, requiresAuthOrOptions?: boolean | {
|
|
51
|
+
requiresAuth?: boolean;
|
|
52
|
+
sessionService?: SessionService<CoreUserSession>;
|
|
53
|
+
} | undefined, depth?: number): TypedRPC;
|
|
25
54
|
}
|
|
26
|
-
export declare const rpcService: PikkuRPCService<
|
|
27
|
-
logLevel?: import("../../
|
|
55
|
+
export declare const rpcService: PikkuRPCService<CoreSingletonServices<{
|
|
56
|
+
logLevel?: import("../../services/logger.js").LogLevel;
|
|
28
57
|
secrets?: {};
|
|
29
58
|
workflow?: import("../workflow/workflow.types.js").WorkflowServiceConfig;
|
|
30
59
|
}>, PikkuRPC>;
|
|
31
|
-
export declare const initialize: (config: RPCServiceConfig) => void;
|
|
32
|
-
export {};
|
|
@@ -1,11 +1,49 @@
|
|
|
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';
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a namespaced function reference to package and function names
|
|
17
|
+
* Uses pikkuState to look up the namespace -> package mapping
|
|
18
|
+
*/
|
|
19
|
+
const resolveNamespace = (namespacedFunction) => {
|
|
20
|
+
const colonIndex = namespacedFunction.indexOf(':');
|
|
21
|
+
if (colonIndex === -1) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const namespace = namespacedFunction.substring(0, colonIndex);
|
|
25
|
+
const functionName = namespacedFunction.substring(colonIndex + 1);
|
|
26
|
+
const externalPackages = pikkuState(null, 'rpc', 'externalPackages');
|
|
27
|
+
const pkgConfig = externalPackages.get(namespace);
|
|
28
|
+
if (!pkgConfig) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
package: pkgConfig.package,
|
|
33
|
+
function: functionName,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
4
36
|
const getPikkuFunctionName = (rpcName) => {
|
|
5
|
-
const rpc = pikkuState('rpc', 'meta');
|
|
6
|
-
|
|
37
|
+
const rpc = pikkuState(null, 'rpc', 'meta');
|
|
38
|
+
let rpcMeta = rpc[rpcName];
|
|
7
39
|
if (!rpcMeta) {
|
|
8
|
-
|
|
40
|
+
const { baseName, version } = parseVersionedId(rpcName);
|
|
41
|
+
if (version !== null) {
|
|
42
|
+
rpcMeta = rpc[baseName];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!rpcMeta) {
|
|
46
|
+
throw new RPCNotFoundError(rpcName);
|
|
9
47
|
}
|
|
10
48
|
return rpcMeta;
|
|
11
49
|
};
|
|
@@ -20,7 +58,16 @@ export class ContextAwareRPCService {
|
|
|
20
58
|
this.options = options;
|
|
21
59
|
}
|
|
22
60
|
async rpcExposed(funcName, data) {
|
|
23
|
-
|
|
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
|
+
}
|
|
24
71
|
if (!functionMeta) {
|
|
25
72
|
throw new Error(`Function not found: ${funcName}`);
|
|
26
73
|
}
|
|
@@ -41,16 +88,52 @@ export class ContextAwareRPCService {
|
|
|
41
88
|
}
|
|
42
89
|
: undefined,
|
|
43
90
|
};
|
|
91
|
+
// Check if it's a namespaced function call (e.g., 'stripe:createCharge')
|
|
92
|
+
if (funcName.includes(':')) {
|
|
93
|
+
return this.invokeExternalPackageFunction(funcName, data, updatedWire);
|
|
94
|
+
}
|
|
95
|
+
// Main package function
|
|
44
96
|
return runPikkuFunc('rpc', funcName, getPikkuFunctionName(funcName), {
|
|
45
97
|
auth: this.options.requiresAuth,
|
|
46
|
-
// TODO: this is a hack since services have already been created
|
|
47
|
-
// but is valid since we don't want to keep creating new wire services
|
|
48
98
|
singletonServices: this.services,
|
|
49
99
|
data: () => data,
|
|
50
|
-
coerceDataFromSchema: this.options.coerceDataFromSchema,
|
|
51
100
|
wire: updatedWire,
|
|
52
101
|
});
|
|
53
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Invoke a function from an external package
|
|
105
|
+
* External packages register their functions in pikkuState under their package name.
|
|
106
|
+
* The function is executed using the parent services (shared singleton services).
|
|
107
|
+
* @private
|
|
108
|
+
*/
|
|
109
|
+
async invokeExternalPackageFunction(namespacedFunction, data, wire) {
|
|
110
|
+
// Resolve namespace to package name
|
|
111
|
+
const resolved = resolveNamespace(namespacedFunction);
|
|
112
|
+
if (!resolved) {
|
|
113
|
+
throw new Error(`Unknown namespace in function reference: ${namespacedFunction}. ` +
|
|
114
|
+
`Make sure the package is registered in externalPackages config.`);
|
|
115
|
+
}
|
|
116
|
+
// Get the function meta from the external package
|
|
117
|
+
// External packages use function meta, not RPC meta
|
|
118
|
+
const externalFunctionMeta = pikkuState(resolved.package, 'function', 'meta');
|
|
119
|
+
const funcMeta = externalFunctionMeta[resolved.function];
|
|
120
|
+
if (!funcMeta) {
|
|
121
|
+
throw new Error(`Function '${resolved.function}' not found in package '${resolved.package}'. ` +
|
|
122
|
+
`Available functions: ${Object.keys(externalFunctionMeta).join(', ') || '(none)'}`);
|
|
123
|
+
}
|
|
124
|
+
const funcName = funcMeta.pikkuFuncId || resolved.function;
|
|
125
|
+
// Execute the function using runPikkuFunc with the external package's state
|
|
126
|
+
// We use the parent services (this.services) since external packages share services
|
|
127
|
+
// Pass the function's tags so tag-based middleware/permissions are applied
|
|
128
|
+
return runPikkuFunc('rpc', namespacedFunction, funcName, {
|
|
129
|
+
auth: this.options.requiresAuth,
|
|
130
|
+
singletonServices: this.services,
|
|
131
|
+
data: () => data,
|
|
132
|
+
wire,
|
|
133
|
+
packageName: resolved.package,
|
|
134
|
+
tags: funcMeta.tags,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
54
137
|
async rpcWithWire(rpcName, data, wire) {
|
|
55
138
|
const rpcDepth = this.wire.rpc?.depth || 0;
|
|
56
139
|
const mergedWire = {
|
|
@@ -68,43 +151,126 @@ export class ContextAwareRPCService {
|
|
|
68
151
|
auth: this.options.requiresAuth,
|
|
69
152
|
singletonServices: this.services,
|
|
70
153
|
data: () => data,
|
|
71
|
-
coerceDataFromSchema: this.options.coerceDataFromSchema,
|
|
72
154
|
wire: mergedWire,
|
|
73
155
|
});
|
|
74
156
|
}
|
|
75
|
-
async startWorkflow(workflowName, input) {
|
|
157
|
+
async startWorkflow(workflowName, input, options) {
|
|
76
158
|
if (!this.services.workflowService) {
|
|
77
159
|
throw new Error('WorkflowService service not available');
|
|
78
160
|
}
|
|
79
|
-
|
|
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
|
+
}
|
|
80
252
|
}
|
|
81
253
|
}
|
|
82
254
|
// RPC Service class for the global interface
|
|
83
255
|
export class PikkuRPCService {
|
|
84
|
-
config;
|
|
85
|
-
// Initialize the RPC service with configuration
|
|
86
|
-
initialize(config) {
|
|
87
|
-
this.config = config;
|
|
88
|
-
}
|
|
89
256
|
// Convenience function for initializing
|
|
90
|
-
getContextRPCService(services, wire,
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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);
|
|
95
263
|
return {
|
|
96
264
|
depth,
|
|
97
265
|
global: false,
|
|
98
266
|
invoke: serviceRPC.rpc.bind(serviceRPC),
|
|
99
|
-
|
|
267
|
+
remote: serviceRPC.remote.bind(serviceRPC),
|
|
268
|
+
exposed: serviceRPC.rpcExposed.bind(serviceRPC),
|
|
100
269
|
startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
|
|
270
|
+
agent: serviceRPC.agent.bind(serviceRPC),
|
|
101
271
|
rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
|
|
102
272
|
};
|
|
103
273
|
}
|
|
104
274
|
}
|
|
105
275
|
// Create a singleton instance
|
|
106
276
|
export const rpcService = new PikkuRPCService();
|
|
107
|
-
// Convenience function for initializing
|
|
108
|
-
export const initialize = (config) => {
|
|
109
|
-
rpcService.initialize(config);
|
|
110
|
-
};
|
|
@@ -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
|
|
@@ -15,3 +19,10 @@ export interface RPCHandler<Input, Output> {
|
|
|
15
19
|
input: Input;
|
|
16
20
|
output: Output;
|
|
17
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolved function reference from namespace
|
|
24
|
+
*/
|
|
25
|
+
export interface ResolvedFunction {
|
|
26
|
+
package: string;
|
|
27
|
+
function: string;
|
|
28
|
+
}
|
|
@@ -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';
|
|
@@ -4,7 +4,7 @@ import { pikkuState } from '../../pikku-state.js';
|
|
|
4
4
|
* @param logger - A logger for logging information.
|
|
5
5
|
*/
|
|
6
6
|
export const logSchedulers = (logger) => {
|
|
7
|
-
const scheduledTasks = pikkuState('scheduler', 'tasks');
|
|
7
|
+
const scheduledTasks = pikkuState(null, 'scheduler', 'tasks');
|
|
8
8
|
if (scheduledTasks.size === 0) {
|
|
9
9
|
logger.info('No scheduled tasks added');
|
|
10
10
|
return;
|
|
@@ -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;
|