@pikku/core 0.11.2 → 0.12.1
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 +57 -2
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- package/dist/errors/errors.d.ts +14 -0
- package/dist/errors/errors.js +26 -0
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/function/function-runner.d.ts +10 -4
- package/dist/function/function-runner.js +126 -45
- package/dist/function/functions.types.d.ts +32 -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.d.ts +2 -2
- package/dist/handle-error.js +3 -12
- package/dist/index.d.ts +30 -26
- package/dist/index.js +19 -29
- package/dist/internal.d.ts +3 -0
- package/dist/internal.js +2 -0
- package/dist/middleware/auth-apikey.d.ts +2 -2
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +3 -3
- package/dist/middleware/auth-bearer.js +4 -7
- package/dist/middleware/auth-cookie.d.ts +4 -4
- package/dist/middleware/auth-cookie.js +7 -9
- package/dist/middleware/cors.d.ts +46 -0
- package/dist/middleware/cors.js +81 -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.d.ts +1 -1
- package/dist/middleware-runner.js +8 -10
- package/dist/permissions.d.ts +2 -2
- package/dist/permissions.js +11 -15
- package/dist/pikku-state.d.ts +10 -8
- package/dist/pikku-state.js +48 -25
- package/dist/schema.d.ts +4 -4
- package/dist/schema.js +20 -15
- package/dist/services/ai-agent-runner-service.d.ts +43 -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/content-service.d.ts +6 -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 +97 -0
- package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
- package/dist/services/in-memory-ai-run-state-service.js +44 -0
- package/dist/services/in-memory-trigger-service.d.ts +22 -0
- package/dist/services/in-memory-trigger-service.js +48 -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 +26 -11
- package/dist/services/index.js +11 -13
- package/dist/services/local-content.d.ts +2 -1
- package/dist/services/local-content.js +6 -1
- package/dist/services/local-secrets.d.ts +25 -2
- package/dist/services/local-secrets.js +45 -0
- package/dist/services/local-variables.d.ts +6 -1
- package/dist/services/local-variables.js +18 -0
- package/dist/services/logger-console.d.ts +2 -1
- package/dist/services/scheduler-service.d.ts +9 -1
- package/dist/services/scheduler-service.js +8 -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 +16 -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 +15 -2
- 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 -5
- package/dist/types/core.types.d.ts +67 -25
- package/dist/types/core.types.js +8 -1
- package/dist/types/state.types.d.ts +53 -59
- package/dist/utils.d.ts +7 -6
- package/dist/utils.js +27 -12
- package/dist/version.d.ts +6 -0
- package/dist/version.js +19 -0
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +146 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -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 +59 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.js +348 -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 +195 -0
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +12 -0
- package/dist/wirings/ai-agent/ai-agent-stream.js +662 -0
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +313 -0
- package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
- package/dist/wirings/ai-agent/index.d.ts +7 -0
- package/dist/wirings/ai-agent/index.js +6 -0
- package/dist/wirings/channel/channel-common.d.ts +8 -5
- package/dist/wirings/channel/channel-common.js +15 -8
- package/dist/wirings/channel/channel-handler.d.ts +3 -3
- package/dist/wirings/channel/channel-handler.js +15 -6
- 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.d.ts +5 -5
- package/dist/wirings/channel/channel-runner.js +10 -9
- package/dist/wirings/channel/channel-store.d.ts +1 -1
- package/dist/wirings/channel/channel.types.d.ts +9 -7
- 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.d.ts +7 -2
- package/dist/wirings/channel/local/local-channel-runner.js +22 -9
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
- package/dist/wirings/channel/log-channels.d.ts +1 -1
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +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.d.ts +4 -4
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +40 -23
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
- 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 +3 -3
- package/dist/wirings/cli/cli-runner.js +12 -8
- package/dist/wirings/cli/cli.types.d.ts +9 -9
- package/dist/wirings/cli/command-parser.d.ts +1 -1
- 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 +9 -9
- package/dist/wirings/http/http-runner.js +79 -34
- package/dist/wirings/http/http.types.d.ts +77 -41
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- package/dist/wirings/http/log-http-routes.d.ts +1 -1
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
- package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
- package/dist/wirings/http/routers/http-router.d.ts +1 -1
- package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
- package/dist/wirings/mcp/index.d.ts +4 -3
- package/dist/wirings/mcp/index.js +3 -3
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -6
- package/dist/wirings/mcp/mcp-runner.js +28 -40
- package/dist/wirings/mcp/mcp.types.d.ts +5 -5
- 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 +1 -1
- package/dist/wirings/queue/queue-runner.d.ts +1 -5
- package/dist/wirings/queue/queue-runner.js +11 -8
- package/dist/wirings/queue/queue.types.d.ts +5 -5
- package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
- package/dist/wirings/queue/register-queue-helper.js +1 -1
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
- package/dist/wirings/rpc/index.d.ts +3 -1
- package/dist/wirings/rpc/index.js +2 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +58 -8
- package/dist/wirings/rpc/rpc-runner.js +177 -31
- package/dist/wirings/rpc/rpc-types.d.ts +20 -4
- package/dist/wirings/rpc/wire-addon.d.ts +10 -0
- package/dist/wirings/rpc/wire-addon.js +9 -0
- package/dist/wirings/scheduler/index.d.ts +2 -2
- package/dist/wirings/scheduler/index.js +1 -2
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -5
- package/dist/wirings/scheduler/scheduler-runner.js +11 -14
- package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
- 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 +22 -0
- package/dist/wirings/trigger/pikku-trigger-service.js +70 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +18 -9
- package/dist/wirings/trigger/trigger-runner.js +48 -19
- 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 +29 -19
- package/dist/wirings/workflow/pikku-workflow-service.js +217 -82
- package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
- package/dist/wirings/workflow/workflow-helpers.js +38 -0
- package/dist/wirings/workflow/workflow.types.d.ts +42 -95
- package/package.json +14 -15
- package/run-tests.sh +4 -1
- package/src/crypto-utils.test.ts +116 -0
- package/src/crypto-utils.ts +99 -0
- package/src/errors/error.test.ts +143 -2
- package/src/errors/errors.ts +27 -0
- package/src/errors/index.ts +1 -1
- package/src/factory-functions.test.ts +42 -2
- package/src/function/function-runner.test.ts +6 -13
- package/src/function/function-runner.ts +161 -53
- package/src/function/functions.types.ts +63 -132
- package/src/function/index.ts +5 -2
- package/src/handle-error.test.ts +361 -0
- package/src/handle-error.ts +6 -14
- package/src/index.ts +97 -30
- package/src/internal.ts +6 -0
- package/src/middleware/auth-apikey.test.ts +16 -13
- package/src/middleware/auth-apikey.ts +3 -3
- package/src/middleware/auth-bearer.test.ts +18 -15
- package/src/middleware/auth-bearer.ts +27 -32
- package/src/middleware/auth-cookie.test.ts +17 -14
- package/src/middleware/auth-cookie.ts +9 -13
- package/src/middleware/cors.test.ts +424 -0
- package/src/middleware/cors.ts +104 -0
- package/src/middleware/index.ts +5 -3
- package/src/middleware/remote-auth.test.ts +488 -0
- package/src/middleware/remote-auth.ts +68 -0
- package/src/middleware-runner.test.ts +123 -1
- package/src/middleware-runner.ts +13 -13
- package/src/permissions.test.ts +83 -9
- package/src/permissions.ts +17 -19
- package/src/pikku-state.test.ts +224 -0
- package/src/pikku-state.ts +59 -35
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.test.ts +198 -6
- package/src/schema.ts +28 -21
- package/src/services/ai-agent-runner-service.ts +41 -0
- package/src/services/ai-run-state-service.ts +20 -0
- package/src/services/ai-storage-service.ts +39 -0
- package/src/services/content-service.ts +7 -0
- package/src/services/deployment-service.ts +22 -0
- package/src/services/gopass-secrets.ts +98 -0
- package/src/services/in-memory-ai-run-state-service.ts +73 -0
- package/src/services/in-memory-trigger-service.ts +64 -0
- package/src/services/in-memory-workflow-service.test.ts +351 -0
- package/src/services/in-memory-workflow-service.ts +395 -0
- package/src/services/index.ts +50 -14
- package/src/services/local-content.ts +9 -3
- package/src/services/local-secrets.test.ts +80 -0
- package/src/services/local-secrets.ts +53 -2
- package/src/services/local-variables.test.ts +61 -0
- package/src/services/local-variables.ts +23 -1
- package/src/services/logger-console.test.ts +118 -0
- package/src/services/logger-console.ts +2 -1
- package/src/services/scheduler-service.ts +11 -1
- package/src/services/schema-service.ts +7 -0
- package/src/services/scoped-secret-service.test.ts +74 -0
- package/src/services/scoped-secret-service.ts +41 -0
- package/src/services/secret-service.ts +25 -4
- package/src/services/trigger-service.ts +17 -0
- package/src/services/typed-secret-service.test.ts +93 -0
- package/src/services/typed-secret-service.ts +70 -0
- package/src/services/typed-variables-service.test.ts +73 -0
- package/src/services/typed-variables-service.ts +81 -0
- package/src/services/user-session-service.test.ts +113 -0
- package/src/services/user-session-service.ts +25 -2
- package/src/services/variables-service.ts +5 -0
- package/src/services/workflow-service.ts +23 -13
- package/src/time-utils.test.ts +1 -1
- package/src/types/core.types.ts +95 -24
- package/src/types/state.types.ts +56 -73
- package/src/utils.test.ts +350 -0
- package/src/utils.ts +33 -18
- package/src/version.test.ts +80 -0
- package/src/version.ts +25 -0
- package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
- package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +214 -0
- package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
- package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
- package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
- package/src/wirings/ai-agent/ai-agent-prepare.ts +504 -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 +317 -0
- package/src/wirings/ai-agent/ai-agent-runner.ts +251 -0
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +652 -0
- package/src/wirings/ai-agent/ai-agent-stream.ts +1049 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +328 -0
- package/src/wirings/ai-agent/index.ts +39 -0
- package/src/wirings/channel/channel-common.ts +33 -20
- package/src/wirings/channel/channel-handler.ts +26 -9
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +15 -16
- package/src/wirings/channel/channel-store.ts +1 -1
- package/src/wirings/channel/channel.types.ts +21 -9
- 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 +57 -7
- package/src/wirings/channel/local/local-channel-runner.ts +40 -19
- package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +1 -1
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +57 -36
- package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +10 -10
- package/src/wirings/cli/cli-runner.ts +28 -14
- package/src/wirings/cli/cli.types.ts +14 -14
- package/src/wirings/cli/command-parser.test.ts +9 -9
- package/src/wirings/cli/command-parser.ts +1 -1
- 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 +12 -20
- package/src/wirings/http/http-runner.ts +101 -51
- package/src/wirings/http/http.types.ts +119 -48
- package/src/wirings/http/index.ts +16 -4
- package/src/wirings/http/log-http-routes.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
- package/src/wirings/http/routers/http-router.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.ts +4 -3
- package/src/wirings/mcp/index.ts +27 -3
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
- package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
- package/src/wirings/mcp/mcp-runner.ts +48 -65
- package/src/wirings/mcp/mcp.types.ts +5 -5
- 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 +13 -2
- package/src/wirings/queue/queue-runner.test.ts +142 -73
- package/src/wirings/queue/queue-runner.ts +18 -14
- package/src/wirings/queue/queue.types.ts +5 -5
- package/src/wirings/queue/register-queue-helper.ts +3 -5
- package/src/wirings/queue/validate-worker-config.test.ts +108 -0
- package/src/wirings/queue/validate-worker-config.ts +4 -1
- package/src/wirings/rpc/index.ts +3 -1
- package/src/wirings/rpc/rpc-runner.ts +254 -41
- package/src/wirings/rpc/rpc-types.ts +28 -4
- package/src/wirings/rpc/wire-addon.ts +20 -0
- package/src/wirings/scheduler/index.ts +6 -4
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +78 -45
- package/src/wirings/scheduler/scheduler-runner.ts +20 -27
- package/src/wirings/scheduler/scheduler.types.ts +2 -2
- package/src/wirings/secret/index.ts +9 -0
- package/src/wirings/secret/secret.types.ts +32 -0
- package/src/wirings/secret/validate-secret-definitions.test.ts +140 -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 +112 -0
- package/src/wirings/trigger/trigger-runner.test.ts +79 -0
- package/src/wirings/trigger/trigger-runner.ts +80 -41
- package/src/wirings/trigger/trigger.types.ts +144 -22
- package/src/wirings/variable/index.ts +8 -0
- package/src/wirings/variable/validate-variable-definitions.test.ts +91 -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 +487 -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.test.ts +49 -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 +0 -22
- package/src/wirings/workflow/index.ts +21 -10
- package/src/wirings/workflow/pikku-workflow-service.test.ts +200 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +308 -105
- package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow.types.ts +47 -92
- 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/dist/wirings/workflow/workflow-utils.d.ts +0 -23
- package/dist/wirings/workflow/workflow-utils.js +0 -66
- 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
- package/src/wirings/workflow/workflow-utils.ts +0 -120
|
@@ -1,6 +1,19 @@
|
|
|
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
|
+
import { streamAIAgent, resumeAIAgent } from '../ai-agent/ai-agent-stream.js';
|
|
16
|
+
import { approveAIAgent } from '../ai-agent/ai-agent-registry.js';
|
|
4
17
|
/**
|
|
5
18
|
* Resolve a namespaced function reference to package and function names
|
|
6
19
|
* Uses pikkuState to look up the namespace -> package mapping
|
|
@@ -12,21 +25,28 @@ const resolveNamespace = (namespacedFunction) => {
|
|
|
12
25
|
}
|
|
13
26
|
const namespace = namespacedFunction.substring(0, colonIndex);
|
|
14
27
|
const functionName = namespacedFunction.substring(colonIndex + 1);
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
if (!
|
|
28
|
+
const addons = pikkuState(null, 'rpc', 'addons');
|
|
29
|
+
const pkgConfig = addons.get(namespace);
|
|
30
|
+
if (!pkgConfig) {
|
|
18
31
|
return null;
|
|
19
32
|
}
|
|
20
33
|
return {
|
|
21
|
-
|
|
34
|
+
namespace,
|
|
35
|
+
package: pkgConfig.package,
|
|
22
36
|
function: functionName,
|
|
23
37
|
};
|
|
24
38
|
};
|
|
25
39
|
const getPikkuFunctionName = (rpcName) => {
|
|
26
40
|
const rpc = pikkuState(null, 'rpc', 'meta');
|
|
27
|
-
|
|
41
|
+
let rpcMeta = rpc[rpcName];
|
|
28
42
|
if (!rpcMeta) {
|
|
29
|
-
|
|
43
|
+
const { baseName, version } = parseVersionedId(rpcName);
|
|
44
|
+
if (version !== null) {
|
|
45
|
+
rpcMeta = rpc[baseName];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!rpcMeta) {
|
|
49
|
+
throw new RPCNotFoundError(rpcName);
|
|
30
50
|
}
|
|
31
51
|
return rpcMeta;
|
|
32
52
|
};
|
|
@@ -41,7 +61,16 @@ export class ContextAwareRPCService {
|
|
|
41
61
|
this.options = options;
|
|
42
62
|
}
|
|
43
63
|
async rpcExposed(funcName, data) {
|
|
44
|
-
|
|
64
|
+
let functionMeta;
|
|
65
|
+
if (funcName.includes(':')) {
|
|
66
|
+
const resolved = resolveNamespace(funcName);
|
|
67
|
+
if (resolved) {
|
|
68
|
+
functionMeta = pikkuState(resolved.package, 'function', 'meta')[resolved.function];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
functionMeta = pikkuState(null, 'function', 'meta')[funcName];
|
|
73
|
+
}
|
|
45
74
|
if (!functionMeta) {
|
|
46
75
|
throw new Error(`Function not found: ${funcName}`);
|
|
47
76
|
}
|
|
@@ -64,50 +93,51 @@ export class ContextAwareRPCService {
|
|
|
64
93
|
};
|
|
65
94
|
// Check if it's a namespaced function call (e.g., 'stripe:createCharge')
|
|
66
95
|
if (funcName.includes(':')) {
|
|
67
|
-
return this.
|
|
96
|
+
return this.invokeAddonFunction(funcName, data, updatedWire);
|
|
68
97
|
}
|
|
69
98
|
// Main package function
|
|
70
99
|
return runPikkuFunc('rpc', funcName, getPikkuFunctionName(funcName), {
|
|
71
100
|
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
101
|
singletonServices: this.services,
|
|
75
102
|
data: () => data,
|
|
76
103
|
wire: updatedWire,
|
|
77
104
|
});
|
|
78
105
|
}
|
|
79
106
|
/**
|
|
80
|
-
* Invoke a function from an
|
|
81
|
-
*
|
|
107
|
+
* Invoke a function from an addon package
|
|
108
|
+
* Addon packages register their functions in pikkuState under their package name.
|
|
82
109
|
* The function is executed using the parent services (shared singleton services).
|
|
83
110
|
* @private
|
|
84
111
|
*/
|
|
85
|
-
async
|
|
112
|
+
async invokeAddonFunction(namespacedFunction, data, wire) {
|
|
86
113
|
// Resolve namespace to package name
|
|
87
114
|
const resolved = resolveNamespace(namespacedFunction);
|
|
88
115
|
if (!resolved) {
|
|
89
116
|
throw new Error(`Unknown namespace in function reference: ${namespacedFunction}. ` +
|
|
90
|
-
`Make sure the package is registered in
|
|
117
|
+
`Make sure the package is registered in addons config.`);
|
|
91
118
|
}
|
|
92
|
-
// Get the function meta from the
|
|
93
|
-
//
|
|
94
|
-
const
|
|
95
|
-
const funcMeta =
|
|
119
|
+
// Get the function meta from the addon package
|
|
120
|
+
// Addon packages use function meta, not RPC meta
|
|
121
|
+
const addonFunctionMeta = pikkuState(resolved.package, 'function', 'meta');
|
|
122
|
+
const funcMeta = addonFunctionMeta[resolved.function];
|
|
96
123
|
if (!funcMeta) {
|
|
97
124
|
throw new Error(`Function '${resolved.function}' not found in package '${resolved.package}'. ` +
|
|
98
|
-
`Available functions: ${Object.keys(
|
|
125
|
+
`Available functions: ${Object.keys(addonFunctionMeta).join(', ') || '(none)'}`);
|
|
99
126
|
}
|
|
100
|
-
const funcName = funcMeta.
|
|
101
|
-
|
|
102
|
-
|
|
127
|
+
const funcName = funcMeta.pikkuFuncId || resolved.function;
|
|
128
|
+
const addonConfig = pikkuState(null, 'rpc', 'addons').get(resolved.namespace);
|
|
129
|
+
const auth = addonConfig?.auth ?? this.options.requiresAuth;
|
|
130
|
+
const tags = [...(addonConfig?.tags ?? []), ...(funcMeta.tags ?? [])];
|
|
131
|
+
// Execute the function using runPikkuFunc with the addon package's state
|
|
132
|
+
// We use the parent services (this.services) since addon packages share services
|
|
103
133
|
// Pass the function's tags so tag-based middleware/permissions are applied
|
|
104
134
|
return runPikkuFunc('rpc', namespacedFunction, funcName, {
|
|
105
|
-
auth
|
|
135
|
+
auth,
|
|
106
136
|
singletonServices: this.services,
|
|
107
137
|
data: () => data,
|
|
108
138
|
wire,
|
|
109
139
|
packageName: resolved.package,
|
|
110
|
-
tags
|
|
140
|
+
tags,
|
|
111
141
|
});
|
|
112
142
|
}
|
|
113
143
|
async rpcWithWire(rpcName, data, wire) {
|
|
@@ -130,26 +160,142 @@ export class ContextAwareRPCService {
|
|
|
130
160
|
wire: mergedWire,
|
|
131
161
|
});
|
|
132
162
|
}
|
|
133
|
-
async startWorkflow(workflowName, input) {
|
|
163
|
+
async startWorkflow(workflowName, input, options) {
|
|
134
164
|
if (!this.services.workflowService) {
|
|
135
165
|
throw new Error('WorkflowService service not available');
|
|
136
166
|
}
|
|
137
|
-
|
|
167
|
+
const parentRunId = this.wire.workflowStep?.runId ?? this.wire.graph?.runId;
|
|
168
|
+
const wire = options?.wire ?? {
|
|
169
|
+
type: this.wire.wireType ?? 'unknown',
|
|
170
|
+
id: this.wire.wireId,
|
|
171
|
+
...(parentRunId ? { parentRunId } : {}),
|
|
172
|
+
};
|
|
173
|
+
return this.services.workflowService.startWorkflow(workflowName, input, wire, this, options);
|
|
174
|
+
}
|
|
175
|
+
get agent() {
|
|
176
|
+
return {
|
|
177
|
+
run: async (agentName, input) => {
|
|
178
|
+
const result = await runAIAgent(agentName, input, {
|
|
179
|
+
sessionService: this.options.sessionService,
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
runId: result.runId,
|
|
183
|
+
result: result.object ?? result.text,
|
|
184
|
+
usage: result.usage,
|
|
185
|
+
};
|
|
186
|
+
},
|
|
187
|
+
stream: async (agentName, input, options) => {
|
|
188
|
+
const channel = this.wire.channel;
|
|
189
|
+
if (!channel)
|
|
190
|
+
throw new Error('No channel available for streaming');
|
|
191
|
+
await streamAIAgent(agentName, input, channel, { sessionService: this.options.sessionService }, undefined, options);
|
|
192
|
+
},
|
|
193
|
+
resume: async (runId, input, options) => {
|
|
194
|
+
const channel = this.wire.channel;
|
|
195
|
+
if (!channel)
|
|
196
|
+
throw new Error('No channel available for streaming');
|
|
197
|
+
await resumeAIAgent({ runId, ...input }, channel, { sessionService: this.options.sessionService }, options);
|
|
198
|
+
},
|
|
199
|
+
approve: async (runId, approvals, expectedAgentName) => {
|
|
200
|
+
if (!this.services.aiRunState)
|
|
201
|
+
throw new Error('AIRunStateService not available');
|
|
202
|
+
return approveAIAgent(this.services.aiRunState, runId, approvals, expectedAgentName);
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
async remote(funcName, data) {
|
|
207
|
+
let endpoint;
|
|
208
|
+
const headers = {
|
|
209
|
+
'Content-Type': 'application/json',
|
|
210
|
+
};
|
|
211
|
+
const colonIndex = funcName.indexOf(':');
|
|
212
|
+
if (colonIndex !== -1) {
|
|
213
|
+
const namespace = funcName.substring(0, colonIndex);
|
|
214
|
+
const addons = pikkuState(null, 'rpc', 'addons');
|
|
215
|
+
const pkgConfig = addons.get(namespace);
|
|
216
|
+
endpoint = pkgConfig?.rpcEndpoint;
|
|
217
|
+
}
|
|
218
|
+
if (!endpoint && this.services.deploymentService) {
|
|
219
|
+
const deployments = await this.services.deploymentService.findFunction(funcName);
|
|
220
|
+
if (deployments.length > 0) {
|
|
221
|
+
endpoint = deployments[0].endpoint;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (!endpoint) {
|
|
225
|
+
throw new Error(`No endpoint configured for remote RPC: ${funcName}. ` +
|
|
226
|
+
`Configure rpcEndpoint in addons config or set up a DeploymentService.`);
|
|
227
|
+
}
|
|
228
|
+
let secret;
|
|
229
|
+
if (this.services.secrets) {
|
|
230
|
+
try {
|
|
231
|
+
secret = await this.services.secrets.getSecret('PIKKU_REMOTE_SECRET');
|
|
232
|
+
}
|
|
233
|
+
catch { }
|
|
234
|
+
}
|
|
235
|
+
if (secret) {
|
|
236
|
+
if (!this.services.jwt) {
|
|
237
|
+
throw new Error('PIKKU_REMOTE_SECRET is set but JWT service is not available');
|
|
238
|
+
}
|
|
239
|
+
const session = this.wire.getSession && typeof this.wire.getSession === 'function'
|
|
240
|
+
? await this.wire.getSession()
|
|
241
|
+
: this.wire.session;
|
|
242
|
+
const sessionEnc = session
|
|
243
|
+
? await encryptJSON(secret, { session })
|
|
244
|
+
: undefined;
|
|
245
|
+
const token = await this.services.jwt.encode({ value: 5, unit: 'minute' }, {
|
|
246
|
+
aud: 'pikku-remote',
|
|
247
|
+
fn: funcName,
|
|
248
|
+
iat: Date.now(),
|
|
249
|
+
session: sessionEnc,
|
|
250
|
+
});
|
|
251
|
+
headers.Authorization = `Bearer ${token}`;
|
|
252
|
+
}
|
|
253
|
+
const url = `${endpoint}/rpc/${encodeURIComponent(funcName)}`;
|
|
254
|
+
const timeoutMs = 30_000;
|
|
255
|
+
const response = await fetch(url, {
|
|
256
|
+
method: 'POST',
|
|
257
|
+
headers,
|
|
258
|
+
body: JSON.stringify({ data }),
|
|
259
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
260
|
+
});
|
|
261
|
+
if (!response.ok) {
|
|
262
|
+
let errorBody;
|
|
263
|
+
try {
|
|
264
|
+
errorBody = JSON.stringify(await response.json());
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
errorBody = await response.text();
|
|
268
|
+
}
|
|
269
|
+
throw new Error(`Remote RPC call failed: ${response.status} ${response.statusText}. ${errorBody}`);
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
return (await response.json());
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
const text = await response.text();
|
|
276
|
+
throw new Error(`Remote RPC call returned non-JSON response: ${response.status} ${response.statusText}. ${text}`);
|
|
277
|
+
}
|
|
138
278
|
}
|
|
139
279
|
}
|
|
140
280
|
// RPC Service class for the global interface
|
|
141
281
|
export class PikkuRPCService {
|
|
142
282
|
// Convenience function for initializing
|
|
143
|
-
getContextRPCService(services, wire,
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
283
|
+
getContextRPCService(services, wire, requiresAuthOrOptions, depth = 0) {
|
|
284
|
+
const options = typeof requiresAuthOrOptions === 'object' &&
|
|
285
|
+
requiresAuthOrOptions !== null
|
|
286
|
+
? requiresAuthOrOptions
|
|
287
|
+
: { requiresAuth: requiresAuthOrOptions };
|
|
288
|
+
const serviceRPC = new ContextAwareRPCService(services, wire, options);
|
|
147
289
|
return {
|
|
148
290
|
depth,
|
|
149
291
|
global: false,
|
|
150
292
|
invoke: serviceRPC.rpc.bind(serviceRPC),
|
|
151
|
-
|
|
293
|
+
remote: serviceRPC.remote.bind(serviceRPC),
|
|
294
|
+
exposed: serviceRPC.rpcExposed.bind(serviceRPC),
|
|
152
295
|
startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
|
|
296
|
+
get agent() {
|
|
297
|
+
return serviceRPC.agent;
|
|
298
|
+
},
|
|
153
299
|
rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
|
|
154
300
|
};
|
|
155
301
|
}
|
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
export type PikkuRPC<
|
|
1
|
+
export type PikkuRPC<Invoke extends Function = any, Remote extends Function = any, startWorkflow extends Function = any, AgentRun extends Function = any, AgentStream 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: {
|
|
9
|
+
run: AgentRun;
|
|
10
|
+
stream: AgentStream;
|
|
11
|
+
resume: (runId: string, input: {
|
|
12
|
+
toolCallId: string;
|
|
13
|
+
approved: boolean;
|
|
14
|
+
}, options?: any) => Promise<void>;
|
|
15
|
+
approve: (runId: string, approvals: {
|
|
16
|
+
toolCallId: string;
|
|
17
|
+
approved: boolean;
|
|
18
|
+
}[], expectedAgentName?: string) => Promise<any>;
|
|
19
|
+
};
|
|
5
20
|
};
|
|
6
21
|
export type RPCMeta = {
|
|
7
|
-
|
|
22
|
+
pikkuFuncId: string;
|
|
8
23
|
expose: boolean;
|
|
9
|
-
|
|
24
|
+
remote?: boolean;
|
|
10
25
|
};
|
|
11
26
|
/**
|
|
12
27
|
* Type for RPC handlers
|
|
@@ -19,6 +34,7 @@ export interface RPCHandler<Input, Output> {
|
|
|
19
34
|
* Resolved function reference from namespace
|
|
20
35
|
*/
|
|
21
36
|
export interface ResolvedFunction {
|
|
37
|
+
namespace: string;
|
|
22
38
|
package: string;
|
|
23
39
|
function: string;
|
|
24
40
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type WireAddonConfig = {
|
|
2
|
+
name: string;
|
|
3
|
+
package: string;
|
|
4
|
+
rpcEndpoint?: string;
|
|
5
|
+
auth?: boolean;
|
|
6
|
+
tags?: string[];
|
|
7
|
+
secretOverrides?: Record<string, string>;
|
|
8
|
+
variableOverrides?: Record<string, string>;
|
|
9
|
+
};
|
|
10
|
+
export declare const wireAddon: (config: WireAddonConfig) => void;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './scheduler.types.js';
|
|
2
1
|
export { runScheduledTask, wireScheduler, getScheduledTasks, } from './scheduler-runner.js';
|
|
3
|
-
export
|
|
2
|
+
export { logSchedulers } from './log-schedulers.js';
|
|
3
|
+
export type { CoreScheduledTask, ScheduledTasksMeta, PikkuScheduledTask, } from './scheduler.types.js';
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { CoreUserSession } from '../../types/core.types.js';
|
|
2
2
|
import type { CoreScheduledTask } from './scheduler.types.js';
|
|
3
|
-
import { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
3
|
+
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
4
4
|
export type RunScheduledTasksParams = {
|
|
5
5
|
name: string;
|
|
6
6
|
session?: CoreUserSession;
|
|
7
|
-
singletonServices: CoreSingletonServices;
|
|
8
|
-
createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
|
|
9
7
|
};
|
|
10
8
|
export declare const wireScheduler: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<void, void>>>(scheduledTask: CoreScheduledTask<PikkuFunctionConfig>) => void;
|
|
11
|
-
export declare function runScheduledTask({ name, session,
|
|
9
|
+
export declare function runScheduledTask({ name, session, }: RunScheduledTasksParams): Promise<void>;
|
|
12
10
|
export declare const getScheduledTasks: () => Map<string, CoreScheduledTask>;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { getErrorResponse, PikkuError } from '../../errors/error-handler.js';
|
|
2
|
-
import {
|
|
3
|
-
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
+
import { PikkuMissingMetaError } from '../../errors/errors.js';
|
|
3
|
+
import { getSingletonServices, getCreateWireServices, pikkuState, } from '../../pikku-state.js';
|
|
4
4
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
5
|
-
import { PikkuSessionService } from '../../services/user-session-service.js';
|
|
5
|
+
import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../services/user-session-service.js';
|
|
6
6
|
export const wireScheduler = (scheduledTask) => {
|
|
7
7
|
const meta = pikkuState(null, 'scheduler', 'meta');
|
|
8
8
|
const taskMeta = meta[scheduledTask.name];
|
|
9
9
|
if (!taskMeta) {
|
|
10
|
-
throw new
|
|
10
|
+
throw new PikkuMissingMetaError(`Missing generated metadata for scheduled task '${scheduledTask.name}'`);
|
|
11
11
|
}
|
|
12
|
-
addFunction(taskMeta.
|
|
12
|
+
addFunction(taskMeta.pikkuFuncId, {
|
|
13
13
|
func: scheduledTask.func.func,
|
|
14
14
|
auth: scheduledTask.func.auth,
|
|
15
15
|
permissions: scheduledTask.func.permissions,
|
|
@@ -33,8 +33,9 @@ class ScheduledTaskSkippedError extends PikkuError {
|
|
|
33
33
|
this.name = 'ScheduledTaskSkippedError';
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
export async function runScheduledTask({ name, session,
|
|
37
|
-
|
|
36
|
+
export async function runScheduledTask({ name, session, }) {
|
|
37
|
+
const singletonServices = getSingletonServices();
|
|
38
|
+
const createWireServices = getCreateWireServices();
|
|
38
39
|
const task = pikkuState(null, 'scheduler', 'tasks').get(name);
|
|
39
40
|
const meta = pikkuState(null, 'scheduler', 'meta')[name];
|
|
40
41
|
const userSession = new PikkuSessionService();
|
|
@@ -57,11 +58,11 @@ export async function runScheduledTask({ name, session, singletonServices, creat
|
|
|
57
58
|
throw new ScheduledTaskSkippedError(name, reason);
|
|
58
59
|
},
|
|
59
60
|
},
|
|
60
|
-
|
|
61
|
+
...createMiddlewareSessionWireProps(userSession),
|
|
61
62
|
};
|
|
62
63
|
try {
|
|
63
64
|
singletonServices.logger.info(`Running schedule task: ${name} | schedule: ${task.schedule}`);
|
|
64
|
-
await runPikkuFunc('scheduler', meta.name, meta.
|
|
65
|
+
await runPikkuFunc('scheduler', meta.name, meta.pikkuFuncId, {
|
|
65
66
|
singletonServices,
|
|
66
67
|
createWireServices,
|
|
67
68
|
auth: false,
|
|
@@ -70,6 +71,7 @@ export async function runScheduledTask({ name, session, singletonServices, creat
|
|
|
70
71
|
wireMiddleware: task.middleware,
|
|
71
72
|
tags: task.tags,
|
|
72
73
|
wire,
|
|
74
|
+
sessionService: userSession,
|
|
73
75
|
});
|
|
74
76
|
}
|
|
75
77
|
catch (e) {
|
|
@@ -79,11 +81,6 @@ export async function runScheduledTask({ name, session, singletonServices, creat
|
|
|
79
81
|
}
|
|
80
82
|
throw e;
|
|
81
83
|
}
|
|
82
|
-
finally {
|
|
83
|
-
if (wireServices) {
|
|
84
|
-
await closeWireServices(singletonServices.logger, wireServices);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
84
|
}
|
|
88
85
|
export const getScheduledTasks = () => {
|
|
89
86
|
return pikkuState(null, 'scheduler', 'tasks');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CoreUserSession, CorePikkuMiddleware, CommonWireMeta } from '../../types/core.types.js';
|
|
2
|
-
import { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
1
|
+
import type { CoreUserSession, CorePikkuMiddleware, CommonWireMeta } from '../../types/core.types.js';
|
|
2
|
+
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Represents metadata for scheduled tasks, including title, schedule, and documentation.
|
|
5
5
|
*/
|
|
@@ -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,22 @@
|
|
|
1
|
+
import type { TriggerInstance } from './trigger.types.js';
|
|
2
|
+
import type { TriggerService } from '../../services/trigger-service.js';
|
|
3
|
+
export type TriggerTarget = {
|
|
4
|
+
targetType: 'rpc' | 'workflow';
|
|
5
|
+
targetName: string;
|
|
6
|
+
startNode?: string;
|
|
7
|
+
};
|
|
8
|
+
export type TriggerSourceInfo = {
|
|
9
|
+
name: string;
|
|
10
|
+
input: unknown;
|
|
11
|
+
};
|
|
12
|
+
export declare abstract class PikkuTriggerService implements TriggerService {
|
|
13
|
+
protected activeTriggers: Map<string, TriggerInstance>;
|
|
14
|
+
abstract start(): Promise<void>;
|
|
15
|
+
stop(): Promise<void>;
|
|
16
|
+
protected getTriggerTargets(): Map<string, TriggerTarget[]>;
|
|
17
|
+
protected getTriggerSources(): Map<string, {
|
|
18
|
+
input?: unknown;
|
|
19
|
+
}>;
|
|
20
|
+
protected setupTriggerInstance(name: string, input: unknown, onTrigger: (data: unknown) => Promise<void>): Promise<TriggerInstance>;
|
|
21
|
+
protected onTriggerFire(triggerName: string, targets: TriggerTarget[], data: unknown): Promise<void>;
|
|
22
|
+
}
|