@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
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import type { CorePermissionGroup, CorePikkuPermission } from '../../function/functions.types.js';
|
|
2
|
+
import type { CorePikkuMiddleware, MiddlewareMetadata, PermissionMetadata } from '../../types/core.types.js';
|
|
3
|
+
import type { PikkuChannel } from '../channel/channel.types.js';
|
|
4
|
+
import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js';
|
|
5
|
+
export interface AIThread {
|
|
6
|
+
id: string;
|
|
7
|
+
resourceId: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
createdAt: Date;
|
|
11
|
+
updatedAt: Date;
|
|
12
|
+
}
|
|
13
|
+
export interface AIToolCall {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
args: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface AIToolResult {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
result: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AIMessage {
|
|
24
|
+
id: string;
|
|
25
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
26
|
+
content?: string;
|
|
27
|
+
toolCalls?: AIToolCall[];
|
|
28
|
+
toolResults?: AIToolResult[];
|
|
29
|
+
createdAt: Date;
|
|
30
|
+
}
|
|
31
|
+
export interface AIAgentStep {
|
|
32
|
+
usage: {
|
|
33
|
+
inputTokens: number;
|
|
34
|
+
outputTokens: number;
|
|
35
|
+
};
|
|
36
|
+
toolCalls?: {
|
|
37
|
+
name: string;
|
|
38
|
+
args: Record<string, unknown>;
|
|
39
|
+
result: string;
|
|
40
|
+
}[];
|
|
41
|
+
}
|
|
42
|
+
export interface AIAgentInput {
|
|
43
|
+
message: string;
|
|
44
|
+
threadId: string;
|
|
45
|
+
resourceId: string;
|
|
46
|
+
}
|
|
47
|
+
export interface AIAgentOutput {
|
|
48
|
+
runId: string;
|
|
49
|
+
text: string;
|
|
50
|
+
object?: unknown;
|
|
51
|
+
threadId: string;
|
|
52
|
+
steps: AIAgentStep[];
|
|
53
|
+
usage: {
|
|
54
|
+
inputTokens: number;
|
|
55
|
+
outputTokens: number;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export interface AIAgentToolDef {
|
|
59
|
+
name: string;
|
|
60
|
+
description: string;
|
|
61
|
+
inputSchema: Record<string, unknown>;
|
|
62
|
+
execute: (input: unknown) => Promise<unknown>;
|
|
63
|
+
needsApproval?: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface PikkuAIMiddlewareHooks<State extends Record<string, unknown> = Record<string, unknown>, Services = any> {
|
|
66
|
+
modifyInput?: (services: Services, ctx: {
|
|
67
|
+
messages: AIMessage[];
|
|
68
|
+
instructions: string;
|
|
69
|
+
}) => Promise<{
|
|
70
|
+
messages: AIMessage[];
|
|
71
|
+
instructions: string;
|
|
72
|
+
}> | {
|
|
73
|
+
messages: AIMessage[];
|
|
74
|
+
instructions: string;
|
|
75
|
+
};
|
|
76
|
+
modifyOutputStream?: (services: Services, ctx: {
|
|
77
|
+
event: AIStreamEvent;
|
|
78
|
+
allEvents: readonly AIStreamEvent[];
|
|
79
|
+
state: State;
|
|
80
|
+
}) => Promise<AIStreamEvent | null> | AIStreamEvent | null;
|
|
81
|
+
modifyOutput?: (services: Services, ctx: {
|
|
82
|
+
text: string;
|
|
83
|
+
messages: AIMessage[];
|
|
84
|
+
usage: {
|
|
85
|
+
inputTokens: number;
|
|
86
|
+
outputTokens: number;
|
|
87
|
+
};
|
|
88
|
+
}) => Promise<{
|
|
89
|
+
text: string;
|
|
90
|
+
messages: AIMessage[];
|
|
91
|
+
}> | {
|
|
92
|
+
text: string;
|
|
93
|
+
messages: AIMessage[];
|
|
94
|
+
};
|
|
95
|
+
beforeToolCall?: (services: Services, ctx: {
|
|
96
|
+
toolName: string;
|
|
97
|
+
toolCallId: string;
|
|
98
|
+
args: Record<string, unknown>;
|
|
99
|
+
}) => Promise<{
|
|
100
|
+
args: Record<string, unknown>;
|
|
101
|
+
} | void> | {
|
|
102
|
+
args: Record<string, unknown>;
|
|
103
|
+
} | void;
|
|
104
|
+
afterToolCall?: (services: Services, ctx: {
|
|
105
|
+
toolName: string;
|
|
106
|
+
toolCallId: string;
|
|
107
|
+
args: Record<string, unknown>;
|
|
108
|
+
result: unknown;
|
|
109
|
+
durationMs: number;
|
|
110
|
+
}) => Promise<{
|
|
111
|
+
result: unknown;
|
|
112
|
+
} | void> | {
|
|
113
|
+
result: unknown;
|
|
114
|
+
} | void;
|
|
115
|
+
afterStep?: (services: Services, ctx: {
|
|
116
|
+
stepNumber: number;
|
|
117
|
+
text: string;
|
|
118
|
+
toolCalls: {
|
|
119
|
+
toolCallId: string;
|
|
120
|
+
toolName: string;
|
|
121
|
+
args: unknown;
|
|
122
|
+
}[];
|
|
123
|
+
toolResults: {
|
|
124
|
+
toolCallId: string;
|
|
125
|
+
toolName: string;
|
|
126
|
+
result: unknown;
|
|
127
|
+
}[];
|
|
128
|
+
usage: {
|
|
129
|
+
inputTokens: number;
|
|
130
|
+
outputTokens: number;
|
|
131
|
+
};
|
|
132
|
+
finishReason: string;
|
|
133
|
+
}) => Promise<void> | void;
|
|
134
|
+
onError?: (services: Services, ctx: {
|
|
135
|
+
error: Error;
|
|
136
|
+
stepNumber: number;
|
|
137
|
+
messages: AIMessage[];
|
|
138
|
+
}) => Promise<void> | void;
|
|
139
|
+
}
|
|
140
|
+
export type AIAgentMemoryConfig = {
|
|
141
|
+
storage?: string;
|
|
142
|
+
vector?: string;
|
|
143
|
+
embedder?: string;
|
|
144
|
+
lastMessages?: number;
|
|
145
|
+
workingMemory?: unknown;
|
|
146
|
+
};
|
|
147
|
+
export type CoreAIAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
|
|
148
|
+
name: string;
|
|
149
|
+
description: string;
|
|
150
|
+
summary?: string;
|
|
151
|
+
errors?: string[];
|
|
152
|
+
instructions: string | string[];
|
|
153
|
+
model: string;
|
|
154
|
+
temperature?: number;
|
|
155
|
+
tools?: unknown[];
|
|
156
|
+
agents?: unknown[];
|
|
157
|
+
memory?: AIAgentMemoryConfig;
|
|
158
|
+
maxSteps?: number;
|
|
159
|
+
toolChoice?: 'auto' | 'required' | 'none';
|
|
160
|
+
input?: unknown;
|
|
161
|
+
output?: unknown;
|
|
162
|
+
tags?: string[];
|
|
163
|
+
protocol?: 'ui-message-stream';
|
|
164
|
+
prepareStep?: (ctx: {
|
|
165
|
+
stepNumber: number;
|
|
166
|
+
messages: AIMessage[];
|
|
167
|
+
tools: AIAgentToolDef[];
|
|
168
|
+
toolChoice: 'auto' | 'required' | 'none';
|
|
169
|
+
model: string;
|
|
170
|
+
stop: () => void;
|
|
171
|
+
}) => void | Promise<void>;
|
|
172
|
+
middleware?: PikkuMiddleware[];
|
|
173
|
+
channelMiddleware?: CorePikkuChannelMiddleware<any, any>[];
|
|
174
|
+
aiMiddleware?: PikkuAIMiddlewareHooks<any, any>[];
|
|
175
|
+
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
176
|
+
};
|
|
177
|
+
export type AIStreamEvent = {
|
|
178
|
+
type: 'step-start';
|
|
179
|
+
stepNumber: number;
|
|
180
|
+
agent?: string;
|
|
181
|
+
session?: string;
|
|
182
|
+
} | {
|
|
183
|
+
type: 'text-delta';
|
|
184
|
+
text: string;
|
|
185
|
+
agent?: string;
|
|
186
|
+
session?: string;
|
|
187
|
+
} | {
|
|
188
|
+
type: 'reasoning-delta';
|
|
189
|
+
text: string;
|
|
190
|
+
agent?: string;
|
|
191
|
+
session?: string;
|
|
192
|
+
} | {
|
|
193
|
+
type: 'tool-call';
|
|
194
|
+
toolCallId: string;
|
|
195
|
+
toolName: string;
|
|
196
|
+
args: unknown;
|
|
197
|
+
agent?: string;
|
|
198
|
+
session?: string;
|
|
199
|
+
} | {
|
|
200
|
+
type: 'tool-result';
|
|
201
|
+
toolCallId: string;
|
|
202
|
+
toolName: string;
|
|
203
|
+
result: unknown;
|
|
204
|
+
agent?: string;
|
|
205
|
+
session?: string;
|
|
206
|
+
} | {
|
|
207
|
+
type: 'agent-call';
|
|
208
|
+
agentName: string;
|
|
209
|
+
session: string;
|
|
210
|
+
input: unknown;
|
|
211
|
+
} | {
|
|
212
|
+
type: 'agent-result';
|
|
213
|
+
agentName: string;
|
|
214
|
+
session: string;
|
|
215
|
+
result: unknown;
|
|
216
|
+
} | {
|
|
217
|
+
type: 'approval-request';
|
|
218
|
+
toolCallId: string;
|
|
219
|
+
toolName: string;
|
|
220
|
+
args: unknown;
|
|
221
|
+
reason?: string;
|
|
222
|
+
agent?: string;
|
|
223
|
+
session?: string;
|
|
224
|
+
} | {
|
|
225
|
+
type: 'usage';
|
|
226
|
+
tokens: {
|
|
227
|
+
input: number;
|
|
228
|
+
output: number;
|
|
229
|
+
};
|
|
230
|
+
model: string;
|
|
231
|
+
agent?: string;
|
|
232
|
+
session?: string;
|
|
233
|
+
} | {
|
|
234
|
+
type: 'error';
|
|
235
|
+
message: string;
|
|
236
|
+
agent?: string;
|
|
237
|
+
session?: string;
|
|
238
|
+
} | {
|
|
239
|
+
type: 'suspended';
|
|
240
|
+
reason: 'rpc-missing';
|
|
241
|
+
missingRpcs: string[];
|
|
242
|
+
} | {
|
|
243
|
+
type: 'done';
|
|
244
|
+
};
|
|
245
|
+
export interface AIStreamChannel extends PikkuChannel<unknown, AIStreamEvent> {
|
|
246
|
+
}
|
|
247
|
+
export type PendingApproval = {
|
|
248
|
+
type: 'tool-call';
|
|
249
|
+
toolCallId: string;
|
|
250
|
+
toolName: string;
|
|
251
|
+
args: unknown;
|
|
252
|
+
} | {
|
|
253
|
+
type: 'agent-call';
|
|
254
|
+
toolCallId: string;
|
|
255
|
+
agentName: string;
|
|
256
|
+
agentRunId: string;
|
|
257
|
+
displayToolName: string;
|
|
258
|
+
displayArgs: unknown;
|
|
259
|
+
};
|
|
260
|
+
export interface AgentRunState {
|
|
261
|
+
runId: string;
|
|
262
|
+
agentName: string;
|
|
263
|
+
threadId: string;
|
|
264
|
+
resourceId: string;
|
|
265
|
+
status: 'running' | 'suspended' | 'completed' | 'failed';
|
|
266
|
+
suspendReason?: 'approval' | 'rpc-missing';
|
|
267
|
+
missingRpcs?: string[];
|
|
268
|
+
pendingApprovals?: PendingApproval[];
|
|
269
|
+
usage: {
|
|
270
|
+
inputTokens: number;
|
|
271
|
+
outputTokens: number;
|
|
272
|
+
model: string;
|
|
273
|
+
};
|
|
274
|
+
createdAt: Date;
|
|
275
|
+
updatedAt: Date;
|
|
276
|
+
}
|
|
277
|
+
export interface AgentRunRow {
|
|
278
|
+
runId: string;
|
|
279
|
+
agentName: string;
|
|
280
|
+
threadId: string;
|
|
281
|
+
resourceId: string;
|
|
282
|
+
status: string;
|
|
283
|
+
suspendReason?: string;
|
|
284
|
+
missingRpcs?: string[];
|
|
285
|
+
usageInputTokens: number;
|
|
286
|
+
usageOutputTokens: number;
|
|
287
|
+
usageModel: string;
|
|
288
|
+
createdAt: Date;
|
|
289
|
+
updatedAt: Date;
|
|
290
|
+
}
|
|
291
|
+
export interface AgentRunService {
|
|
292
|
+
listThreads(options?: {
|
|
293
|
+
agentName?: string;
|
|
294
|
+
limit?: number;
|
|
295
|
+
offset?: number;
|
|
296
|
+
}): Promise<AIThread[]>;
|
|
297
|
+
getThread(threadId: string): Promise<AIThread | null>;
|
|
298
|
+
getThreadMessages(threadId: string): Promise<AIMessage[]>;
|
|
299
|
+
getThreadRuns(threadId: string): Promise<AgentRunRow[]>;
|
|
300
|
+
deleteThread(threadId: string): Promise<boolean>;
|
|
301
|
+
getDistinctAgentNames(): Promise<string[]>;
|
|
302
|
+
}
|
|
303
|
+
export type AIAgentMeta = Record<string, Omit<CoreAIAgent, 'input' | 'output' | 'tools' | 'agents' | 'middleware' | 'channelMiddleware' | 'aiMiddleware' | 'permissions'> & {
|
|
304
|
+
tools?: string[];
|
|
305
|
+
agents?: string[];
|
|
306
|
+
inputSchema: string | null;
|
|
307
|
+
outputSchema: string | null;
|
|
308
|
+
workingMemorySchema: string | null;
|
|
309
|
+
middleware?: MiddlewareMetadata[];
|
|
310
|
+
channelMiddleware?: MiddlewareMetadata[];
|
|
311
|
+
aiMiddleware?: MiddlewareMetadata[];
|
|
312
|
+
permissions?: PermissionMetadata[];
|
|
313
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { agent, agentStream, agentResume, agentApprove, } from './ai-agent-helpers.js';
|
|
2
|
+
export { runAIAgent } from './ai-agent-runner.js';
|
|
3
|
+
export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js';
|
|
4
|
+
export { createAssistantUIChannel, parseAssistantUIInput, } from './ai-agent-assistant-ui.js';
|
|
5
|
+
export { type RunAIAgentParams, type StreamAIAgentOptions, ToolApprovalRequired, } from './ai-agent-prepare.js';
|
|
6
|
+
export { addAIAgent, approveAIAgent, getAIAgents, getAIAgentsMeta, } from './ai-agent-registry.js';
|
|
7
|
+
export type { AIAgentInput, AIAgentMeta, AIAgentMemoryConfig, AIAgentStep, AgentRunRow, AgentRunService, AgentRunState, AIMessage, AIStreamChannel, AIStreamEvent, AIThread, CoreAIAgent, PendingApproval, PikkuAIMiddlewareHooks, } from './ai-agent.types.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { agent, agentStream, agentResume, agentApprove, } from './ai-agent-helpers.js';
|
|
2
|
+
export { runAIAgent } from './ai-agent-runner.js';
|
|
3
|
+
export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js';
|
|
4
|
+
export { createAssistantUIChannel, parseAssistantUIInput, } from './ai-agent-assistant-ui.js';
|
|
5
|
+
export { ToolApprovalRequired, } from './ai-agent-prepare.js';
|
|
6
|
+
export { addAIAgent, approveAIAgent, getAIAgents, getAIAgentsMeta, } from './ai-agent-registry.js';
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CoreChannel, ChannelMessageMeta } from './channel.types.js';
|
|
1
|
+
import type { CoreSingletonServices, MiddlewareMetadata } from '../../types/core.types.js';
|
|
2
|
+
import type { CoreChannel, ChannelMessageMeta } from './channel.types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Runs a channel lifecycle function (onConnect or onDisconnect) with proper middleware handling.
|
|
5
5
|
*
|
|
6
6
|
* This function:
|
|
7
7
|
* 1. Extracts inline middleware from the lifecycle config if present
|
|
8
8
|
* 2. Combines metadata middleware with inline middleware using combineMiddleware()
|
|
9
|
-
* 3.
|
|
9
|
+
* 3. Wraps the channel with channel middleware if present
|
|
10
|
+
* 4. Runs the lifecycle function with middleware support
|
|
10
11
|
*
|
|
11
12
|
* @param channelConfig - The channel configuration
|
|
12
13
|
* @param meta - Metadata for the lifecycle function (connect or disconnect)
|
|
@@ -15,14 +16,16 @@ import { CoreChannel, ChannelMessageMeta } from './channel.types.js';
|
|
|
15
16
|
* @param services - All services (singleton + session)
|
|
16
17
|
* @param channel - The channel instance
|
|
17
18
|
* @param data - Optional data to pass to the lifecycle function (for onConnect)
|
|
19
|
+
* @param channelMiddlewareMeta - Optional channel middleware metadata for wrapping channel.send()
|
|
18
20
|
* @returns Promise<unknown> - Result from the lifecycle function (if any)
|
|
19
21
|
*/
|
|
20
|
-
export declare const runChannelLifecycleWithMiddleware: ({ channelConfig, meta, lifecycleConfig, lifecycleType, services, channel, data, }: {
|
|
22
|
+
export declare const runChannelLifecycleWithMiddleware: ({ channelConfig, meta, lifecycleConfig, lifecycleType, services, channel, data, channelMiddlewareMeta, }: {
|
|
21
23
|
channelConfig: CoreChannel<unknown, any>;
|
|
22
24
|
meta: ChannelMessageMeta;
|
|
23
25
|
lifecycleConfig: any;
|
|
24
26
|
lifecycleType: "connect" | "disconnect";
|
|
25
|
-
services:
|
|
27
|
+
services: CoreSingletonServices;
|
|
26
28
|
channel: any;
|
|
27
29
|
data?: unknown;
|
|
30
|
+
channelMiddlewareMeta?: MiddlewareMetadata[];
|
|
28
31
|
}) => Promise<unknown>;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { combineMiddleware, runMiddleware } from '../../middleware-runner.js';
|
|
2
2
|
import { runPikkuFuncDirectly } from '../../function/function-runner.js';
|
|
3
|
+
import { combineChannelMiddleware, wrapChannelWithMiddleware, } from './channel-middleware-runner.js';
|
|
3
4
|
/**
|
|
4
5
|
* Runs a channel lifecycle function (onConnect or onDisconnect) with proper middleware handling.
|
|
5
6
|
*
|
|
6
7
|
* This function:
|
|
7
8
|
* 1. Extracts inline middleware from the lifecycle config if present
|
|
8
9
|
* 2. Combines metadata middleware with inline middleware using combineMiddleware()
|
|
9
|
-
* 3.
|
|
10
|
+
* 3. Wraps the channel with channel middleware if present
|
|
11
|
+
* 4. Runs the lifecycle function with middleware support
|
|
10
12
|
*
|
|
11
13
|
* @param channelConfig - The channel configuration
|
|
12
14
|
* @param meta - Metadata for the lifecycle function (connect or disconnect)
|
|
@@ -15,25 +17,30 @@ import { runPikkuFuncDirectly } from '../../function/function-runner.js';
|
|
|
15
17
|
* @param services - All services (singleton + session)
|
|
16
18
|
* @param channel - The channel instance
|
|
17
19
|
* @param data - Optional data to pass to the lifecycle function (for onConnect)
|
|
20
|
+
* @param channelMiddlewareMeta - Optional channel middleware metadata for wrapping channel.send()
|
|
18
21
|
* @returns Promise<unknown> - Result from the lifecycle function (if any)
|
|
19
22
|
*/
|
|
20
|
-
export const runChannelLifecycleWithMiddleware = async ({ channelConfig, meta, lifecycleConfig, lifecycleType, services, channel, data, }) => {
|
|
21
|
-
// Extract middleware if lifecycle config is an object
|
|
23
|
+
export const runChannelLifecycleWithMiddleware = async ({ channelConfig, meta, lifecycleConfig, lifecycleType, services, channel, data, channelMiddlewareMeta, }) => {
|
|
22
24
|
const lifecycleMiddleware = typeof lifecycleConfig === 'object' && 'middleware' in lifecycleConfig
|
|
23
25
|
? lifecycleConfig.middleware || []
|
|
24
26
|
: [];
|
|
25
|
-
// Use combineMiddleware to properly resolve metadata + inline middleware
|
|
26
27
|
const allMiddleware = combineMiddleware('channel', `${channelConfig.name}:${lifecycleType}`, {
|
|
27
28
|
wireInheritedMiddleware: meta.middleware,
|
|
28
29
|
wireMiddleware: lifecycleMiddleware,
|
|
29
30
|
});
|
|
30
|
-
|
|
31
|
+
const allChannelMiddleware = combineChannelMiddleware('channel', `${channelConfig.name}:${lifecycleType}:cm`, {
|
|
32
|
+
wireInheritedChannelMiddleware: channelMiddlewareMeta,
|
|
33
|
+
wireChannelMiddleware: channelConfig.channelMiddleware,
|
|
34
|
+
});
|
|
35
|
+
let wire = { channel };
|
|
36
|
+
if (allChannelMiddleware.length > 0) {
|
|
37
|
+
wire = wrapChannelWithMiddleware(wire, services, allChannelMiddleware);
|
|
38
|
+
}
|
|
31
39
|
const runLifecycle = async () => {
|
|
32
|
-
return await runPikkuFuncDirectly(meta.
|
|
40
|
+
return await runPikkuFuncDirectly(meta.pikkuFuncId, services, wire, data);
|
|
33
41
|
};
|
|
34
|
-
// Run with middleware if any
|
|
35
42
|
if (allMiddleware.length > 0) {
|
|
36
|
-
return await runMiddleware(services,
|
|
43
|
+
return await runMiddleware(services, wire, allMiddleware, runLifecycle);
|
|
37
44
|
}
|
|
38
45
|
else {
|
|
39
46
|
return await runLifecycle();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CoreServices, CoreUserSession } from '../../types/core.types.js';
|
|
2
|
-
import { CoreChannel, PikkuChannelHandler } from './channel.types.js';
|
|
3
|
-
import { SessionService } from '../../services/user-session-service.js';
|
|
1
|
+
import type { CoreServices, CoreUserSession } from '../../types/core.types.js';
|
|
2
|
+
import type { CoreChannel, PikkuChannelHandler } from './channel.types.js';
|
|
3
|
+
import type { SessionService } from '../../services/user-session-service.js';
|
|
4
4
|
export declare const processMessageHandlers: (services: CoreServices, channelConfig: CoreChannel<any, any>, channelHandler: PikkuChannelHandler, userSession?: SessionService<CoreUserSession>) => (rawData: any) => Promise<unknown>;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { pikkuState } from '../../pikku-state.js';
|
|
2
2
|
import { runPikkuFunc } from '../../function/function-runner.js';
|
|
3
|
+
import { createMiddlewareSessionWireProps } from '../../services/user-session-service.js';
|
|
4
|
+
const getChannelMeta = (channelName) => {
|
|
5
|
+
return pikkuState(null, 'channel', 'meta')[channelName];
|
|
6
|
+
};
|
|
3
7
|
const getRouteMeta = (channelName, routingProperty, routerValue) => {
|
|
4
8
|
const channelMeta = pikkuState(null, 'channel', 'meta')[channelName];
|
|
5
9
|
if (!channelMeta) {
|
|
@@ -35,7 +39,7 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
|
|
|
35
39
|
const logger = services.logger;
|
|
36
40
|
const requiresSession = channelConfig.auth !== false;
|
|
37
41
|
const processMessage = async (data, onMessage, routingProperty, routerValue) => {
|
|
38
|
-
if (!validateAuth(requiresSession,
|
|
42
|
+
if (!validateAuth(requiresSession, userSession?.get(), onMessage)) {
|
|
39
43
|
const routeMessage = routingProperty
|
|
40
44
|
? `route '${routingProperty}:${routerValue}'`
|
|
41
45
|
: 'the default message route';
|
|
@@ -44,7 +48,7 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
|
|
|
44
48
|
channelHandler.getChannel().send(`Unauthorized for ${routeMessage}`);
|
|
45
49
|
return;
|
|
46
50
|
}
|
|
47
|
-
const {
|
|
51
|
+
const { pikkuFuncId, middleware: routeInheritedMiddleware, permissions: inheritedPermissions, } = getRouteMeta(channelConfig.name, routingProperty, routerValue);
|
|
48
52
|
// Get wire middleware: channel-level middleware + message-specific middleware
|
|
49
53
|
const channelWireMiddleware = channelConfig.middleware || [];
|
|
50
54
|
// Check if onMessage is a wrapper object vs direct function config:
|
|
@@ -68,17 +72,22 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
|
|
|
68
72
|
const cacheKey = routingProperty
|
|
69
73
|
? `${channelConfig.name}:${routingProperty}:${routerValue}`
|
|
70
74
|
: `${channelConfig.name}:default`;
|
|
71
|
-
|
|
75
|
+
const channelMeta = getChannelMeta(channelConfig.name);
|
|
76
|
+
const wireChannelMiddleware = channelConfig.channelMiddleware || [];
|
|
77
|
+
return await runPikkuFunc('channel', cacheKey, pikkuFuncId, {
|
|
72
78
|
singletonServices: services,
|
|
73
79
|
data: () => data,
|
|
74
80
|
inheritedMiddleware,
|
|
75
81
|
wireMiddleware,
|
|
82
|
+
inheritedChannelMiddleware: channelMeta?.channelMiddleware,
|
|
83
|
+
wireChannelMiddleware: wireChannelMiddleware,
|
|
76
84
|
inheritedPermissions,
|
|
77
85
|
wirePermissions,
|
|
78
86
|
tags: channelConfig.tags,
|
|
87
|
+
sessionService: userSession,
|
|
79
88
|
wire: {
|
|
80
89
|
channel: channelHandler.getChannel(),
|
|
81
|
-
|
|
90
|
+
...(userSession && createMiddlewareSessionWireProps(userSession)),
|
|
82
91
|
},
|
|
83
92
|
});
|
|
84
93
|
};
|
|
@@ -91,7 +100,7 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
|
|
|
91
100
|
try {
|
|
92
101
|
messageData = JSON.parse(rawData);
|
|
93
102
|
}
|
|
94
|
-
catch
|
|
103
|
+
catch {
|
|
95
104
|
// Most likely a json error.. ignore
|
|
96
105
|
}
|
|
97
106
|
if (messageData) {
|
|
@@ -121,7 +130,7 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
|
|
|
121
130
|
}
|
|
122
131
|
if (!processed) {
|
|
123
132
|
logger.error(`No handler found for message in channel ${channelConfig.name} for ${JSON.stringify(rawData)}`);
|
|
124
|
-
logger.error(`Channel ${
|
|
133
|
+
logger.error(`Channel config name: ${channelConfig.name}`);
|
|
125
134
|
}
|
|
126
135
|
return result;
|
|
127
136
|
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CoreSingletonServices, MiddlewareMetadata, PikkuWire } from '../../types/core.types.js';
|
|
2
|
+
import type { CorePikkuChannelMiddleware } from './channel.types.js';
|
|
3
|
+
export declare const addChannelMiddleware: (tag: string, middleware: CorePikkuChannelMiddleware[], packageName?: string | null) => CorePikkuChannelMiddleware[];
|
|
4
|
+
export declare const combineChannelMiddleware: (wireType: string, uid: string, { wireInheritedChannelMiddleware, wireChannelMiddleware, packageName, }?: {
|
|
5
|
+
wireInheritedChannelMiddleware?: MiddlewareMetadata[];
|
|
6
|
+
wireChannelMiddleware?: CorePikkuChannelMiddleware[];
|
|
7
|
+
packageName?: string | null;
|
|
8
|
+
}) => readonly CorePikkuChannelMiddleware[];
|
|
9
|
+
export declare function wrapChannelWithMiddleware<Out>(wire: PikkuWire, services: CoreSingletonServices, middlewares: readonly CorePikkuChannelMiddleware[]): PikkuWire;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
+
import { freezeDedupe, getTagGroups } from '../../utils.js';
|
|
3
|
+
export const addChannelMiddleware = (tag, middleware, packageName = null) => {
|
|
4
|
+
const tagGroups = pikkuState(packageName, 'channelMiddleware', 'tagGroup');
|
|
5
|
+
tagGroups[tag] = middleware;
|
|
6
|
+
return middleware;
|
|
7
|
+
};
|
|
8
|
+
const getChannelMiddlewareByName = (name) => {
|
|
9
|
+
const store = pikkuState(null, 'misc', 'channelMiddleware');
|
|
10
|
+
const middleware = store[name];
|
|
11
|
+
return middleware?.[0];
|
|
12
|
+
};
|
|
13
|
+
const channelMiddlewareCache = {};
|
|
14
|
+
export const combineChannelMiddleware = (wireType, uid, { wireInheritedChannelMiddleware, wireChannelMiddleware, packageName = null, } = {}) => {
|
|
15
|
+
const cacheKey = `${wireType}:${uid}`;
|
|
16
|
+
if (channelMiddlewareCache[cacheKey]) {
|
|
17
|
+
return channelMiddlewareCache[cacheKey];
|
|
18
|
+
}
|
|
19
|
+
const resolved = [];
|
|
20
|
+
if (wireInheritedChannelMiddleware) {
|
|
21
|
+
for (const meta of wireInheritedChannelMiddleware) {
|
|
22
|
+
if (meta.type === 'tag') {
|
|
23
|
+
const groups = getTagGroups(pikkuState(packageName, 'channelMiddleware', 'tagGroup'), meta.tag);
|
|
24
|
+
for (const group of groups) {
|
|
25
|
+
resolved.push(...group);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else if (meta.type === 'wire') {
|
|
29
|
+
const middleware = getChannelMiddlewareByName(meta.name);
|
|
30
|
+
if (middleware) {
|
|
31
|
+
resolved.push(middleware);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (wireChannelMiddleware) {
|
|
37
|
+
resolved.push(...wireChannelMiddleware);
|
|
38
|
+
}
|
|
39
|
+
channelMiddlewareCache[cacheKey] = freezeDedupe(resolved);
|
|
40
|
+
return channelMiddlewareCache[cacheKey];
|
|
41
|
+
};
|
|
42
|
+
export function wrapChannelWithMiddleware(wire, services, middlewares) {
|
|
43
|
+
if (middlewares.length === 0 || !wire.channel)
|
|
44
|
+
return wire;
|
|
45
|
+
const channel = wire.channel;
|
|
46
|
+
const originalSend = channel.send.bind(channel);
|
|
47
|
+
const dispatch = async (index, event) => {
|
|
48
|
+
if (index >= middlewares.length) {
|
|
49
|
+
await originalSend(event);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const middleware = middlewares[index];
|
|
53
|
+
await middleware(services, event, async (result) => {
|
|
54
|
+
if (result === null || result === undefined)
|
|
55
|
+
return;
|
|
56
|
+
if (Array.isArray(result)) {
|
|
57
|
+
for (const item of result) {
|
|
58
|
+
await dispatch(index + 1, item);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
await dispatch(index + 1, result);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
...wire,
|
|
68
|
+
channel: {
|
|
69
|
+
...channel,
|
|
70
|
+
send: ((data) => dispatch(0, data)),
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { CorePikkuPermission } from '../../function/functions.types.js';
|
|
2
|
-
import { SessionService } from '../../services/user-session-service.js';
|
|
3
|
-
import { CorePikkuMiddleware } from '../../types/core.types.js';
|
|
4
|
-
import { ChannelMeta, CoreChannel, RunChannelOptions, RunChannelParams } from './channel.types.js';
|
|
1
|
+
import type { CorePikkuPermission } from '../../function/functions.types.js';
|
|
2
|
+
import type { SessionService } from '../../services/user-session-service.js';
|
|
3
|
+
import type { CorePikkuMiddleware } from '../../types/core.types.js';
|
|
4
|
+
import type { ChannelMeta, CoreChannel, RunChannelOptions, RunChannelParams } from './channel.types.js';
|
|
5
5
|
/**
|
|
6
6
|
* Adds a channel and registers all functions referenced in it using the
|
|
7
7
|
* function names already stored in the channel metadata
|
|
8
8
|
*/
|
|
9
9
|
export declare const wireChannel: <In, Channel extends string, PikkuPermission extends CorePikkuPermission<In>, PikkuMiddleware extends CorePikkuMiddleware, ChannelFunction>(channel: CoreChannel<In, Channel, PikkuPermission, PikkuMiddleware, ChannelFunction>) => void;
|
|
10
|
-
export declare const openChannel: ({ route,
|
|
10
|
+
export declare const openChannel: ({ route, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, "route"> & RunChannelParams<unknown> & {
|
|
11
11
|
userSession: SessionService<any>;
|
|
12
12
|
} & RunChannelOptions) => Promise<{
|
|
13
13
|
openingData: unknown;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { NotFoundError } from '../../errors/errors.js';
|
|
1
|
+
import { NotFoundError, PikkuMissingMetaError } from '../../errors/errors.js';
|
|
2
2
|
import { addFunction } from '../../function/function-runner.js';
|
|
3
|
-
import { pikkuState } from '../../pikku-state.js';
|
|
3
|
+
import { pikkuState, getSingletonServices } from '../../pikku-state.js';
|
|
4
4
|
import { coerceTopLevelDataFromSchema, validateSchema } from '../../schema.js';
|
|
5
5
|
import { httpRouter } from '../http/routers/http-router.js';
|
|
6
6
|
/**
|
|
@@ -12,20 +12,20 @@ export const wireChannel = (channel) => {
|
|
|
12
12
|
const channelsMeta = pikkuState(null, 'channel', 'meta');
|
|
13
13
|
const channelMeta = channelsMeta[channel.name];
|
|
14
14
|
if (!channelMeta) {
|
|
15
|
-
throw new
|
|
15
|
+
throw new PikkuMissingMetaError(`Missing generated metadata for channel '${channel.name}'`);
|
|
16
16
|
}
|
|
17
17
|
pikkuState(null, 'channel', 'channels').set(channel.name, channel);
|
|
18
18
|
// Register onConnect function if provided
|
|
19
19
|
if (channel.onConnect && channelMeta.connect) {
|
|
20
|
-
addFunction(channelMeta.connect.
|
|
20
|
+
addFunction(channelMeta.connect.pikkuFuncId, channel.onConnect);
|
|
21
21
|
}
|
|
22
22
|
// Register onDisconnect function if provided
|
|
23
23
|
if (channel.onDisconnect && channelMeta.disconnect) {
|
|
24
|
-
addFunction(channelMeta.disconnect.
|
|
24
|
+
addFunction(channelMeta.disconnect.pikkuFuncId, channel.onDisconnect);
|
|
25
25
|
}
|
|
26
26
|
// Register onMessage function if provided
|
|
27
|
-
if (channel.onMessage && channelMeta.message?.
|
|
28
|
-
addFunction(channelMeta.message.
|
|
27
|
+
if (channel.onMessage && channelMeta.message?.pikkuFuncId) {
|
|
28
|
+
addFunction(channelMeta.message.pikkuFuncId, channel.onMessage.func instanceof Function
|
|
29
29
|
? channel.onMessage
|
|
30
30
|
: channel.onMessage.func);
|
|
31
31
|
}
|
|
@@ -43,7 +43,7 @@ export const wireChannel = (channel) => {
|
|
|
43
43
|
return;
|
|
44
44
|
// Register the function using the pikku name from metadata
|
|
45
45
|
// It could be a FuncConfig or a wiring override with a funcConfig
|
|
46
|
-
addFunction(wiringMeta.
|
|
46
|
+
addFunction(wiringMeta.pikkuFuncId, handler.func instanceof Function
|
|
47
47
|
? handler
|
|
48
48
|
: handler.func);
|
|
49
49
|
});
|
|
@@ -75,7 +75,8 @@ const getMatchingChannelConfig = (path) => {
|
|
|
75
75
|
meta: channelMeta,
|
|
76
76
|
};
|
|
77
77
|
};
|
|
78
|
-
export const openChannel = async ({ route,
|
|
78
|
+
export const openChannel = async ({ route, coerceDataFromSchema = true, request, }) => {
|
|
79
|
+
const singletonServices = getSingletonServices();
|
|
79
80
|
const matchingChannel = getMatchingChannelConfig(route);
|
|
80
81
|
if (!matchingChannel) {
|
|
81
82
|
singletonServices.logger.info(`Channel not found: ${route}`);
|