@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,10 +1,8 @@
|
|
|
1
1
|
import type { ConfigValidationResult, CoreQueueWorker } from './queue.types.js'
|
|
2
2
|
import { getQueueWorkers } from './queue-runner.js'
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from './validate-worker-config.js'
|
|
7
|
-
import { Logger } from '../../services/logger.js'
|
|
3
|
+
import type { QueueConfigMapping } from './validate-worker-config.js'
|
|
4
|
+
import { validateWorkerConfig } from './validate-worker-config.js'
|
|
5
|
+
import type { Logger } from '../../services/logger.js'
|
|
8
6
|
|
|
9
7
|
/**
|
|
10
8
|
* Queue processor registration callback
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert'
|
|
3
|
+
import { validateWorkerConfig } from './validate-worker-config.js'
|
|
4
|
+
import type { QueueConfigMapping } from './validate-worker-config.js'
|
|
5
|
+
|
|
6
|
+
const createTestMapping = (): QueueConfigMapping => ({
|
|
7
|
+
supported: {
|
|
8
|
+
concurrency: {
|
|
9
|
+
queueProperty: 'concurrency',
|
|
10
|
+
description: 'Number of concurrent workers',
|
|
11
|
+
},
|
|
12
|
+
maxRetries: {
|
|
13
|
+
queueProperty: 'maxRetries',
|
|
14
|
+
description: 'Maximum retry attempts',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
unsupported: {
|
|
18
|
+
rateLimitMax: {
|
|
19
|
+
reason: 'Not supported',
|
|
20
|
+
explanation: 'This queue does not support rate limiting',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
fallbacks: {
|
|
24
|
+
retryDelay: {
|
|
25
|
+
reason: 'Partial support',
|
|
26
|
+
explanation: 'Uses fixed delay instead of exponential',
|
|
27
|
+
fallbackValue: '1000ms fixed',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
describe('validateWorkerConfig', () => {
|
|
33
|
+
test('should return empty results for empty config', () => {
|
|
34
|
+
const mapping = createTestMapping()
|
|
35
|
+
const result = validateWorkerConfig(mapping, {})
|
|
36
|
+
assert.deepStrictEqual(result.applied, {})
|
|
37
|
+
assert.deepStrictEqual(result.ignored, {})
|
|
38
|
+
assert.deepStrictEqual(result.warnings, [])
|
|
39
|
+
assert.deepStrictEqual(result.fallbacks, {})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('should return empty results for undefined config', () => {
|
|
43
|
+
const mapping = createTestMapping()
|
|
44
|
+
const result = validateWorkerConfig(mapping)
|
|
45
|
+
assert.deepStrictEqual(result.applied, {})
|
|
46
|
+
assert.deepStrictEqual(result.ignored, {})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test('should apply supported configurations', () => {
|
|
50
|
+
const mapping = createTestMapping()
|
|
51
|
+
const result = validateWorkerConfig(mapping, { concurrency: 5 } as any)
|
|
52
|
+
assert.deepStrictEqual(result.applied, { concurrency: 5 })
|
|
53
|
+
assert.deepStrictEqual(result.ignored, {})
|
|
54
|
+
assert.strictEqual(result.warnings.length, 0)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('should ignore unsupported configurations with warning', () => {
|
|
58
|
+
const mapping = createTestMapping()
|
|
59
|
+
const result = validateWorkerConfig(mapping, { rateLimitMax: 100 } as any)
|
|
60
|
+
assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
|
|
61
|
+
assert.strictEqual(result.warnings.length, 1)
|
|
62
|
+
assert.ok(result.warnings[0].includes('Not supported'))
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test('should handle fallback configurations', () => {
|
|
66
|
+
const mapping = createTestMapping()
|
|
67
|
+
const result = validateWorkerConfig(mapping, { retryDelay: 2000 } as any)
|
|
68
|
+
assert.deepStrictEqual(result.applied, { retryDelay: 2000 })
|
|
69
|
+
assert.deepStrictEqual(result.fallbacks, { retryDelay: '1000ms fixed' })
|
|
70
|
+
assert.strictEqual(result.warnings.length, 1)
|
|
71
|
+
assert.ok(result.warnings[0].includes('Partial support'))
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test('should warn about unknown configurations', () => {
|
|
75
|
+
const mapping = createTestMapping()
|
|
76
|
+
const result = validateWorkerConfig(mapping, {
|
|
77
|
+
unknownOption: 'val',
|
|
78
|
+
} as any)
|
|
79
|
+
assert.deepStrictEqual(result.ignored, { unknownOption: 'val' })
|
|
80
|
+
assert.strictEqual(result.warnings.length, 1)
|
|
81
|
+
assert.ok(result.warnings[0].includes('Unknown configuration'))
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
test('should skip undefined values', () => {
|
|
85
|
+
const mapping = createTestMapping()
|
|
86
|
+
const result = validateWorkerConfig(mapping, {
|
|
87
|
+
concurrency: undefined,
|
|
88
|
+
} as any)
|
|
89
|
+
assert.deepStrictEqual(result.applied, {})
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test('should handle mixed supported and unsupported configs', () => {
|
|
93
|
+
const mapping = createTestMapping()
|
|
94
|
+
const result = validateWorkerConfig(mapping, {
|
|
95
|
+
concurrency: 3,
|
|
96
|
+
maxRetries: 5,
|
|
97
|
+
rateLimitMax: 100,
|
|
98
|
+
retryDelay: 1000,
|
|
99
|
+
} as any)
|
|
100
|
+
assert.deepStrictEqual(result.applied, {
|
|
101
|
+
concurrency: 3,
|
|
102
|
+
maxRetries: 5,
|
|
103
|
+
retryDelay: 1000,
|
|
104
|
+
})
|
|
105
|
+
assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
|
|
106
|
+
assert.strictEqual(result.warnings.length, 2)
|
|
107
|
+
})
|
|
108
|
+
})
|
package/src/wirings/rpc/index.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export { PikkuRPCService, rpcService } from './rpc-runner.js'
|
|
1
|
+
export { PikkuRPCService, rpcService, RPCNotFoundError } from './rpc-runner.js'
|
|
2
2
|
export type { PikkuRPC, RPCMeta } from './rpc-types.js'
|
|
3
|
+
export { wireAddon } from './wire-addon.js'
|
|
4
|
+
export type { WireAddonConfig } from './wire-addon.js'
|
|
@@ -1,8 +1,27 @@
|
|
|
1
|
-
import { CoreServices, PikkuWire } from '../../types/core.types.js'
|
|
1
|
+
import type { CoreServices, 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'
|
|
2
4
|
import { runPikkuFunc } from '../../function/function-runner.js'
|
|
3
5
|
import { pikkuState } from '../../pikku-state.js'
|
|
4
6
|
import { ForbiddenError } from '../../errors/errors.js'
|
|
5
|
-
import {
|
|
7
|
+
import { PikkuError } from '../../errors/error-handler.js'
|
|
8
|
+
import type { PikkuRPC, ResolvedFunction } from './rpc-types.js'
|
|
9
|
+
import { parseVersionedId } from '../../version.js'
|
|
10
|
+
import { encryptJSON } from '../../crypto-utils.js'
|
|
11
|
+
|
|
12
|
+
export class RPCNotFoundError extends PikkuError {
|
|
13
|
+
public readonly rpcName: string
|
|
14
|
+
constructor(rpcName: string) {
|
|
15
|
+
super(`RPC function not found: ${rpcName}`)
|
|
16
|
+
this.rpcName = rpcName
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
import type { AIAgentInput } from '../ai-agent/ai-agent.types.js'
|
|
20
|
+
import type { AIStreamChannel } from '../ai-agent/ai-agent.types.js'
|
|
21
|
+
import type { StreamAIAgentOptions } from '../ai-agent/ai-agent-prepare.js'
|
|
22
|
+
import { runAIAgent } from '../ai-agent/ai-agent-runner.js'
|
|
23
|
+
import { streamAIAgent, resumeAIAgent } from '../ai-agent/ai-agent-stream.js'
|
|
24
|
+
import { approveAIAgent } from '../ai-agent/ai-agent-registry.js'
|
|
6
25
|
|
|
7
26
|
/**
|
|
8
27
|
* Resolve a namespaced function reference to package and function names
|
|
@@ -19,23 +38,30 @@ const resolveNamespace = (
|
|
|
19
38
|
const namespace = namespacedFunction.substring(0, colonIndex)
|
|
20
39
|
const functionName = namespacedFunction.substring(colonIndex + 1)
|
|
21
40
|
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
if (!
|
|
41
|
+
const addons = pikkuState(null, 'rpc', 'addons')
|
|
42
|
+
const pkgConfig = addons.get(namespace)
|
|
43
|
+
if (!pkgConfig) {
|
|
25
44
|
return null
|
|
26
45
|
}
|
|
27
46
|
|
|
28
47
|
return {
|
|
29
|
-
|
|
48
|
+
namespace,
|
|
49
|
+
package: pkgConfig.package,
|
|
30
50
|
function: functionName,
|
|
31
51
|
}
|
|
32
52
|
}
|
|
33
53
|
|
|
34
54
|
const getPikkuFunctionName = (rpcName: string): string => {
|
|
35
55
|
const rpc = pikkuState(null, 'rpc', 'meta')
|
|
36
|
-
|
|
56
|
+
let rpcMeta = rpc[rpcName]
|
|
37
57
|
if (!rpcMeta) {
|
|
38
|
-
|
|
58
|
+
const { baseName, version } = parseVersionedId(rpcName)
|
|
59
|
+
if (version !== null) {
|
|
60
|
+
rpcMeta = rpc[baseName]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (!rpcMeta) {
|
|
64
|
+
throw new RPCNotFoundError(rpcName)
|
|
39
65
|
}
|
|
40
66
|
return rpcMeta
|
|
41
67
|
}
|
|
@@ -47,11 +73,22 @@ export class ContextAwareRPCService {
|
|
|
47
73
|
private wire: PikkuWire,
|
|
48
74
|
private options: {
|
|
49
75
|
requiresAuth?: boolean
|
|
76
|
+
sessionService?: SessionService<CoreUserSession>
|
|
50
77
|
}
|
|
51
78
|
) {}
|
|
52
79
|
|
|
53
80
|
public async rpcExposed(funcName: string, data: any): Promise<any> {
|
|
54
|
-
|
|
81
|
+
let functionMeta: any
|
|
82
|
+
if (funcName.includes(':')) {
|
|
83
|
+
const resolved = resolveNamespace(funcName)
|
|
84
|
+
if (resolved) {
|
|
85
|
+
functionMeta = pikkuState(resolved.package, 'function', 'meta')[
|
|
86
|
+
resolved.function
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
functionMeta = pikkuState(null, 'function', 'meta')[funcName]
|
|
91
|
+
}
|
|
55
92
|
if (!functionMeta) {
|
|
56
93
|
throw new Error(`Function not found: ${funcName}`)
|
|
57
94
|
}
|
|
@@ -79,11 +116,7 @@ export class ContextAwareRPCService {
|
|
|
79
116
|
|
|
80
117
|
// Check if it's a namespaced function call (e.g., 'stripe:createCharge')
|
|
81
118
|
if (funcName.includes(':')) {
|
|
82
|
-
return this.
|
|
83
|
-
funcName,
|
|
84
|
-
data,
|
|
85
|
-
updatedWire
|
|
86
|
-
)
|
|
119
|
+
return this.invokeAddonFunction<In, Out>(funcName, data, updatedWire)
|
|
87
120
|
}
|
|
88
121
|
|
|
89
122
|
// Main package function
|
|
@@ -93,8 +126,6 @@ export class ContextAwareRPCService {
|
|
|
93
126
|
getPikkuFunctionName(funcName),
|
|
94
127
|
{
|
|
95
128
|
auth: this.options.requiresAuth,
|
|
96
|
-
// TODO: this is a hack since services have already been created
|
|
97
|
-
// but is valid since we don't want to keep creating new wire services
|
|
98
129
|
singletonServices: this.services,
|
|
99
130
|
data: () => data,
|
|
100
131
|
wire: updatedWire,
|
|
@@ -103,12 +134,12 @@ export class ContextAwareRPCService {
|
|
|
103
134
|
}
|
|
104
135
|
|
|
105
136
|
/**
|
|
106
|
-
* Invoke a function from an
|
|
107
|
-
*
|
|
137
|
+
* Invoke a function from an addon package
|
|
138
|
+
* Addon packages register their functions in pikkuState under their package name.
|
|
108
139
|
* The function is executed using the parent services (shared singleton services).
|
|
109
140
|
* @private
|
|
110
141
|
*/
|
|
111
|
-
private async
|
|
142
|
+
private async invokeAddonFunction<In = any, Out = any>(
|
|
112
143
|
namespacedFunction: string,
|
|
113
144
|
data: In,
|
|
114
145
|
wire: PikkuWire
|
|
@@ -118,36 +149,38 @@ export class ContextAwareRPCService {
|
|
|
118
149
|
if (!resolved) {
|
|
119
150
|
throw new Error(
|
|
120
151
|
`Unknown namespace in function reference: ${namespacedFunction}. ` +
|
|
121
|
-
`Make sure the package is registered in
|
|
152
|
+
`Make sure the package is registered in addons config.`
|
|
122
153
|
)
|
|
123
154
|
}
|
|
124
155
|
|
|
125
|
-
// Get the function meta from the
|
|
126
|
-
//
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
'function',
|
|
130
|
-
'meta'
|
|
131
|
-
)
|
|
132
|
-
const funcMeta = externalFunctionMeta[resolved.function]
|
|
156
|
+
// Get the function meta from the addon package
|
|
157
|
+
// Addon packages use function meta, not RPC meta
|
|
158
|
+
const addonFunctionMeta = pikkuState(resolved.package, 'function', 'meta')
|
|
159
|
+
const funcMeta = addonFunctionMeta[resolved.function]
|
|
133
160
|
if (!funcMeta) {
|
|
134
161
|
throw new Error(
|
|
135
162
|
`Function '${resolved.function}' not found in package '${resolved.package}'. ` +
|
|
136
|
-
`Available functions: ${Object.keys(
|
|
163
|
+
`Available functions: ${Object.keys(addonFunctionMeta).join(', ') || '(none)'}`
|
|
137
164
|
)
|
|
138
165
|
}
|
|
139
|
-
const funcName = funcMeta.
|
|
166
|
+
const funcName = funcMeta.pikkuFuncId || resolved.function
|
|
167
|
+
|
|
168
|
+
const addonConfig = pikkuState(null, 'rpc', 'addons').get(
|
|
169
|
+
resolved.namespace
|
|
170
|
+
)
|
|
171
|
+
const auth = addonConfig?.auth ?? this.options.requiresAuth
|
|
172
|
+
const tags = [...(addonConfig?.tags ?? []), ...(funcMeta.tags ?? [])]
|
|
140
173
|
|
|
141
|
-
// Execute the function using runPikkuFunc with the
|
|
142
|
-
// We use the parent services (this.services) since
|
|
174
|
+
// Execute the function using runPikkuFunc with the addon package's state
|
|
175
|
+
// We use the parent services (this.services) since addon packages share services
|
|
143
176
|
// Pass the function's tags so tag-based middleware/permissions are applied
|
|
144
177
|
return runPikkuFunc<In, Out>('rpc', namespacedFunction, funcName, {
|
|
145
|
-
auth
|
|
178
|
+
auth,
|
|
146
179
|
singletonServices: this.services,
|
|
147
180
|
data: () => data,
|
|
148
181
|
wire,
|
|
149
182
|
packageName: resolved.package,
|
|
150
|
-
tags
|
|
183
|
+
tags,
|
|
151
184
|
})
|
|
152
185
|
}
|
|
153
186
|
|
|
@@ -183,17 +216,184 @@ export class ContextAwareRPCService {
|
|
|
183
216
|
|
|
184
217
|
public async startWorkflow<In = any>(
|
|
185
218
|
workflowName: string,
|
|
186
|
-
input: In
|
|
219
|
+
input: In,
|
|
220
|
+
options?: {
|
|
221
|
+
startNode?: string
|
|
222
|
+
wire?: { type: string; id?: string; parentRunId?: string }
|
|
223
|
+
}
|
|
187
224
|
): Promise<{ runId: string }> {
|
|
188
225
|
if (!this.services.workflowService) {
|
|
189
226
|
throw new Error('WorkflowService service not available')
|
|
190
227
|
}
|
|
228
|
+
const parentRunId = this.wire.workflowStep?.runId ?? this.wire.graph?.runId
|
|
229
|
+
const wire = options?.wire ?? {
|
|
230
|
+
type: this.wire.wireType ?? 'unknown',
|
|
231
|
+
id: this.wire.wireId,
|
|
232
|
+
...(parentRunId ? { parentRunId } : {}),
|
|
233
|
+
}
|
|
191
234
|
return this.services.workflowService.startWorkflow(
|
|
192
235
|
workflowName,
|
|
193
236
|
input,
|
|
194
|
-
|
|
237
|
+
wire,
|
|
238
|
+
this,
|
|
239
|
+
options
|
|
195
240
|
)
|
|
196
241
|
}
|
|
242
|
+
|
|
243
|
+
public get agent() {
|
|
244
|
+
return {
|
|
245
|
+
run: async (agentName: string, input: AIAgentInput) => {
|
|
246
|
+
const result = await runAIAgent(agentName, input, {
|
|
247
|
+
sessionService: this.options.sessionService,
|
|
248
|
+
})
|
|
249
|
+
return {
|
|
250
|
+
runId: result.runId,
|
|
251
|
+
result: result.object ?? result.text,
|
|
252
|
+
usage: result.usage,
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
stream: async (
|
|
256
|
+
agentName: string,
|
|
257
|
+
input:
|
|
258
|
+
| { message: string; threadId: string; resourceId: string }
|
|
259
|
+
| Record<string, unknown>,
|
|
260
|
+
options?: StreamAIAgentOptions
|
|
261
|
+
) => {
|
|
262
|
+
const channel = this.wire.channel as unknown as AIStreamChannel
|
|
263
|
+
if (!channel) throw new Error('No channel available for streaming')
|
|
264
|
+
await streamAIAgent(
|
|
265
|
+
agentName,
|
|
266
|
+
input,
|
|
267
|
+
channel,
|
|
268
|
+
{ sessionService: this.options.sessionService },
|
|
269
|
+
undefined,
|
|
270
|
+
options
|
|
271
|
+
)
|
|
272
|
+
},
|
|
273
|
+
resume: async (
|
|
274
|
+
runId: string,
|
|
275
|
+
input: { toolCallId: string; approved: boolean },
|
|
276
|
+
options?: StreamAIAgentOptions
|
|
277
|
+
) => {
|
|
278
|
+
const channel = this.wire.channel as unknown as AIStreamChannel
|
|
279
|
+
if (!channel) throw new Error('No channel available for streaming')
|
|
280
|
+
await resumeAIAgent(
|
|
281
|
+
{ runId, ...input },
|
|
282
|
+
channel,
|
|
283
|
+
{ sessionService: this.options.sessionService },
|
|
284
|
+
options
|
|
285
|
+
)
|
|
286
|
+
},
|
|
287
|
+
approve: async (
|
|
288
|
+
runId: string,
|
|
289
|
+
approvals: { toolCallId: string; approved: boolean }[],
|
|
290
|
+
expectedAgentName?: string
|
|
291
|
+
) => {
|
|
292
|
+
if (!this.services.aiRunState)
|
|
293
|
+
throw new Error('AIRunStateService not available')
|
|
294
|
+
return approveAIAgent(
|
|
295
|
+
this.services.aiRunState,
|
|
296
|
+
runId,
|
|
297
|
+
approvals,
|
|
298
|
+
expectedAgentName
|
|
299
|
+
)
|
|
300
|
+
},
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
public async remote<In = any, Out = any>(
|
|
305
|
+
funcName: string,
|
|
306
|
+
data: In
|
|
307
|
+
): Promise<Out> {
|
|
308
|
+
let endpoint: string | undefined
|
|
309
|
+
const headers: Record<string, string> = {
|
|
310
|
+
'Content-Type': 'application/json',
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const colonIndex = funcName.indexOf(':')
|
|
314
|
+
if (colonIndex !== -1) {
|
|
315
|
+
const namespace = funcName.substring(0, colonIndex)
|
|
316
|
+
const addons = pikkuState(null, 'rpc', 'addons')
|
|
317
|
+
const pkgConfig = addons.get(namespace)
|
|
318
|
+
endpoint = pkgConfig?.rpcEndpoint
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (!endpoint && this.services.deploymentService) {
|
|
322
|
+
const deployments =
|
|
323
|
+
await this.services.deploymentService.findFunction(funcName)
|
|
324
|
+
if (deployments.length > 0) {
|
|
325
|
+
endpoint = deployments[0].endpoint
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
if (!endpoint) {
|
|
330
|
+
throw new Error(
|
|
331
|
+
`No endpoint configured for remote RPC: ${funcName}. ` +
|
|
332
|
+
`Configure rpcEndpoint in addons config or set up a DeploymentService.`
|
|
333
|
+
)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
let secret: string | undefined
|
|
337
|
+
if (this.services.secrets) {
|
|
338
|
+
try {
|
|
339
|
+
secret = await this.services.secrets.getSecret('PIKKU_REMOTE_SECRET')
|
|
340
|
+
} catch {}
|
|
341
|
+
}
|
|
342
|
+
if (secret) {
|
|
343
|
+
if (!this.services.jwt) {
|
|
344
|
+
throw new Error(
|
|
345
|
+
'PIKKU_REMOTE_SECRET is set but JWT service is not available'
|
|
346
|
+
)
|
|
347
|
+
}
|
|
348
|
+
const session =
|
|
349
|
+
this.wire.getSession && typeof this.wire.getSession === 'function'
|
|
350
|
+
? await this.wire.getSession()
|
|
351
|
+
: (this.wire as any).session
|
|
352
|
+
const sessionEnc = session
|
|
353
|
+
? await encryptJSON(secret, { session })
|
|
354
|
+
: undefined
|
|
355
|
+
const token = await this.services.jwt.encode(
|
|
356
|
+
{ value: 5, unit: 'minute' },
|
|
357
|
+
{
|
|
358
|
+
aud: 'pikku-remote',
|
|
359
|
+
fn: funcName,
|
|
360
|
+
iat: Date.now(),
|
|
361
|
+
session: sessionEnc,
|
|
362
|
+
}
|
|
363
|
+
)
|
|
364
|
+
headers.Authorization = `Bearer ${token}`
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const url = `${endpoint}/rpc/${encodeURIComponent(funcName)}`
|
|
368
|
+
const timeoutMs = 30_000
|
|
369
|
+
const response = await fetch(url, {
|
|
370
|
+
method: 'POST',
|
|
371
|
+
headers,
|
|
372
|
+
body: JSON.stringify({ data }),
|
|
373
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
374
|
+
})
|
|
375
|
+
|
|
376
|
+
if (!response.ok) {
|
|
377
|
+
let errorBody: string
|
|
378
|
+
try {
|
|
379
|
+
errorBody = JSON.stringify(await response.json())
|
|
380
|
+
} catch {
|
|
381
|
+
errorBody = await response.text()
|
|
382
|
+
}
|
|
383
|
+
throw new Error(
|
|
384
|
+
`Remote RPC call failed: ${response.status} ${response.statusText}. ${errorBody}`
|
|
385
|
+
)
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
try {
|
|
389
|
+
return (await response.json()) as Out
|
|
390
|
+
} catch {
|
|
391
|
+
const text = await response.text()
|
|
392
|
+
throw new Error(
|
|
393
|
+
`Remote RPC call returned non-JSON response: ${response.status} ${response.statusText}. ${text}`
|
|
394
|
+
)
|
|
395
|
+
}
|
|
396
|
+
}
|
|
197
397
|
}
|
|
198
398
|
|
|
199
399
|
// RPC Service class for the global interface
|
|
@@ -205,18 +405,31 @@ export class PikkuRPCService<
|
|
|
205
405
|
getContextRPCService(
|
|
206
406
|
services: Services,
|
|
207
407
|
wire: PikkuWire,
|
|
208
|
-
|
|
408
|
+
requiresAuthOrOptions?:
|
|
409
|
+
| boolean
|
|
410
|
+
| {
|
|
411
|
+
requiresAuth?: boolean
|
|
412
|
+
sessionService?: SessionService<CoreUserSession>
|
|
413
|
+
}
|
|
414
|
+
| undefined,
|
|
209
415
|
depth: number = 0
|
|
210
416
|
): TypedRPC {
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
417
|
+
const options =
|
|
418
|
+
typeof requiresAuthOrOptions === 'object' &&
|
|
419
|
+
requiresAuthOrOptions !== null
|
|
420
|
+
? requiresAuthOrOptions
|
|
421
|
+
: { requiresAuth: requiresAuthOrOptions }
|
|
422
|
+
const serviceRPC = new ContextAwareRPCService(services, wire, options)
|
|
214
423
|
return {
|
|
215
424
|
depth,
|
|
216
425
|
global: false,
|
|
217
426
|
invoke: serviceRPC.rpc.bind(serviceRPC),
|
|
218
|
-
|
|
427
|
+
remote: serviceRPC.remote.bind(serviceRPC),
|
|
428
|
+
exposed: serviceRPC.rpcExposed.bind(serviceRPC),
|
|
219
429
|
startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
|
|
430
|
+
get agent() {
|
|
431
|
+
return serviceRPC.agent
|
|
432
|
+
},
|
|
220
433
|
rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
|
|
221
434
|
} as any
|
|
222
435
|
}
|
|
@@ -1,13 +1,36 @@
|
|
|
1
|
-
export type PikkuRPC<
|
|
1
|
+
export type PikkuRPC<
|
|
2
|
+
Invoke extends Function = any,
|
|
3
|
+
Remote extends Function = any,
|
|
4
|
+
startWorkflow extends Function = any,
|
|
5
|
+
AgentRun extends Function = any,
|
|
6
|
+
AgentStream extends Function = any,
|
|
7
|
+
> = {
|
|
2
8
|
depth: number
|
|
3
9
|
global: boolean
|
|
4
|
-
invoke:
|
|
10
|
+
invoke: Invoke
|
|
11
|
+
remote: Remote
|
|
12
|
+
exposed: (name: string, data: any) => Promise<any>
|
|
13
|
+
startWorkflow: startWorkflow
|
|
14
|
+
agent: {
|
|
15
|
+
run: AgentRun
|
|
16
|
+
stream: AgentStream
|
|
17
|
+
resume: (
|
|
18
|
+
runId: string,
|
|
19
|
+
input: { toolCallId: string; approved: boolean },
|
|
20
|
+
options?: any
|
|
21
|
+
) => Promise<void>
|
|
22
|
+
approve: (
|
|
23
|
+
runId: string,
|
|
24
|
+
approvals: { toolCallId: string; approved: boolean }[],
|
|
25
|
+
expectedAgentName?: string
|
|
26
|
+
) => Promise<any>
|
|
27
|
+
}
|
|
5
28
|
}
|
|
6
29
|
|
|
7
30
|
export type RPCMeta = {
|
|
8
|
-
|
|
31
|
+
pikkuFuncId: string
|
|
9
32
|
expose: boolean
|
|
10
|
-
|
|
33
|
+
remote?: boolean
|
|
11
34
|
}
|
|
12
35
|
|
|
13
36
|
/**
|
|
@@ -22,6 +45,7 @@ export interface RPCHandler<Input, Output> {
|
|
|
22
45
|
* Resolved function reference from namespace
|
|
23
46
|
*/
|
|
24
47
|
export interface ResolvedFunction {
|
|
48
|
+
namespace: string
|
|
25
49
|
package: string
|
|
26
50
|
function: string
|
|
27
51
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { pikkuState } from '../../pikku-state.js'
|
|
2
|
+
|
|
3
|
+
export type WireAddonConfig = {
|
|
4
|
+
name: string
|
|
5
|
+
package: string
|
|
6
|
+
rpcEndpoint?: string
|
|
7
|
+
auth?: boolean
|
|
8
|
+
tags?: string[]
|
|
9
|
+
secretOverrides?: Record<string, string>
|
|
10
|
+
variableOverrides?: Record<string, string>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const wireAddon = (config: WireAddonConfig): void => {
|
|
14
|
+
pikkuState(null, 'rpc', 'addons').set(config.name, {
|
|
15
|
+
package: config.package,
|
|
16
|
+
rpcEndpoint: config.rpcEndpoint,
|
|
17
|
+
auth: config.auth,
|
|
18
|
+
tags: config.tags,
|
|
19
|
+
})
|
|
20
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
export * from './scheduler.types.js'
|
|
2
|
-
|
|
3
1
|
export {
|
|
4
2
|
runScheduledTask,
|
|
5
3
|
wireScheduler,
|
|
6
4
|
getScheduledTasks,
|
|
7
5
|
} from './scheduler-runner.js'
|
|
8
|
-
|
|
9
|
-
export
|
|
6
|
+
export { logSchedulers } from './log-schedulers.js'
|
|
7
|
+
export type {
|
|
8
|
+
CoreScheduledTask,
|
|
9
|
+
ScheduledTasksMeta,
|
|
10
|
+
PikkuScheduledTask,
|
|
11
|
+
} from './scheduler.types.js'
|