@pikku/core 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- package/dist/errors/error-handler.js +3 -3
- package/dist/errors/errors.d.ts +8 -0
- package/dist/errors/errors.js +16 -0
- package/dist/errors/index.d.ts +0 -1
- package/dist/errors/index.js +0 -1
- package/dist/function/function-runner.d.ts +10 -3
- package/dist/function/function-runner.js +136 -31
- package/dist/function/functions.types.d.ts +35 -12
- package/dist/function/functions.types.js +16 -6
- package/dist/function/index.d.ts +2 -2
- package/dist/function/index.js +1 -2
- package/dist/handle-error.js +1 -10
- package/dist/index.d.ts +30 -24
- package/dist/index.js +19 -27
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-bearer.js +3 -6
- package/dist/middleware/auth-cookie.d.ts +1 -1
- package/dist/middleware/auth-cookie.js +6 -8
- package/dist/middleware/cors.d.ts +46 -0
- package/dist/middleware/cors.js +73 -0
- package/dist/middleware/index.d.ts +5 -3
- package/dist/middleware/index.js +5 -3
- package/dist/middleware/remote-auth.d.ts +5 -0
- package/dist/middleware/remote-auth.js +55 -0
- package/dist/middleware/timeout.d.ts +1 -1
- package/dist/middleware-runner.d.ts +3 -14
- package/dist/middleware-runner.js +14 -16
- package/dist/permissions.d.ts +3 -86
- package/dist/permissions.js +20 -80
- package/dist/pikku-state.d.ts +33 -104
- package/dist/pikku-state.js +150 -66
- package/dist/schema.d.ts +8 -6
- package/dist/schema.js +31 -18
- package/dist/services/ai-agent-runner-service.d.ts +24 -0
- package/dist/services/ai-agent-runner-service.js +1 -0
- package/dist/services/ai-run-state-service.d.ts +13 -0
- package/dist/services/ai-run-state-service.js +1 -0
- package/dist/services/ai-storage-service.d.ts +18 -0
- package/dist/services/ai-storage-service.js +1 -0
- package/dist/services/deployment-service.d.ts +19 -0
- package/dist/services/deployment-service.js +1 -0
- package/dist/services/gopass-secrets.d.ts +47 -0
- package/dist/services/gopass-secrets.js +94 -0
- package/dist/services/in-memory-trigger-service.d.ts +23 -0
- package/dist/services/in-memory-trigger-service.js +50 -0
- package/dist/services/in-memory-workflow-service.d.ts +59 -0
- package/dist/services/in-memory-workflow-service.js +287 -0
- package/dist/services/index.d.ts +25 -11
- package/dist/services/index.js +10 -13
- package/dist/services/local-secrets.d.ts +23 -0
- package/dist/services/local-secrets.js +45 -0
- package/dist/services/local-variables.d.ts +5 -0
- package/dist/services/local-variables.js +18 -0
- package/dist/services/scheduler-service.d.ts +21 -1
- package/dist/services/scheduler-service.js +14 -0
- package/dist/services/schema-service.d.ts +6 -0
- package/dist/services/scoped-secret-service.d.ts +16 -0
- package/dist/services/scoped-secret-service.js +35 -0
- package/dist/services/secret-service.d.ts +25 -4
- package/dist/services/trigger-service.d.ts +23 -0
- package/dist/services/trigger-service.js +1 -0
- package/dist/services/typed-secret-service.d.ts +30 -0
- package/dist/services/typed-secret-service.js +40 -0
- package/dist/services/typed-variables-service.d.ts +27 -0
- package/dist/services/typed-variables-service.js +46 -0
- package/dist/services/user-session-service.d.ts +13 -0
- package/dist/services/user-session-service.js +17 -0
- package/dist/services/variables-service.d.ts +5 -0
- package/dist/services/workflow-service.d.ts +43 -0
- package/dist/services/workflow-service.js +1 -0
- package/dist/types/core.types.d.ts +54 -10
- package/dist/types/core.types.js +7 -0
- package/dist/types/state.types.d.ts +127 -0
- package/dist/types/state.types.js +1 -0
- package/dist/utils.d.ts +10 -1
- package/dist/utils.js +60 -3
- package/dist/version.d.ts +6 -0
- package/dist/version.js +19 -0
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
- package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
- package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
- package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
- package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
- package/dist/wirings/ai-agent/index.d.ts +5 -0
- package/dist/wirings/ai-agent/index.js +4 -0
- package/dist/wirings/channel/channel-common.d.ts +7 -4
- package/dist/wirings/channel/channel-common.js +15 -8
- package/dist/wirings/channel/channel-handler.js +13 -4
- package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
- package/dist/wirings/channel/channel-middleware-runner.js +73 -0
- package/dist/wirings/channel/channel-runner.js +12 -12
- package/dist/wirings/channel/channel.types.d.ts +5 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
- package/dist/wirings/channel/define-channel-routes.js +23 -0
- package/dist/wirings/channel/index.d.ts +10 -8
- package/dist/wirings/channel/index.js +7 -8
- package/dist/wirings/channel/local/index.d.ts +3 -3
- package/dist/wirings/channel/local/index.js +3 -3
- package/dist/wirings/channel/local/local-channel-runner.js +18 -6
- package/dist/wirings/channel/log-channels.js +1 -1
- package/dist/wirings/channel/serverless/index.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.js +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +17 -6
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
- package/dist/wirings/cli/channel/index.d.ts +1 -1
- package/dist/wirings/cli/channel/index.js +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +1 -1
- package/dist/wirings/cli/cli-runner.js +22 -18
- package/dist/wirings/cli/cli.types.d.ts +7 -6
- package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
- package/dist/wirings/cli/define-cli-commands.js +20 -0
- package/dist/wirings/cli/index.d.ts +2 -3
- package/dist/wirings/cli/index.js +1 -3
- package/dist/wirings/http/http-routes.d.ts +69 -0
- package/dist/wirings/http/http-routes.js +139 -0
- package/dist/wirings/http/http-runner.d.ts +2 -2
- package/dist/wirings/http/http-runner.js +62 -27
- package/dist/wirings/http/http.types.d.ts +77 -24
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- package/dist/wirings/http/log-http-routes.js +1 -1
- package/dist/wirings/http/routers/path-to-regex.js +2 -2
- package/dist/wirings/mcp/index.d.ts +4 -3
- package/dist/wirings/mcp/index.js +3 -3
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
- package/dist/wirings/mcp/mcp-runner.js +42 -56
- package/dist/wirings/mcp/mcp.types.d.ts +3 -3
- package/dist/wirings/node/index.d.ts +2 -0
- package/dist/wirings/node/index.js +1 -0
- package/dist/wirings/node/node.types.d.ts +20 -0
- package/dist/wirings/node/node.types.js +1 -0
- package/dist/wirings/oauth2/index.d.ts +3 -0
- package/dist/wirings/oauth2/index.js +2 -0
- package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
- package/dist/wirings/oauth2/oauth2-client.js +267 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
- package/dist/wirings/oauth2/oauth2.types.js +4 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
- package/dist/wirings/queue/index.d.ts +2 -2
- package/dist/wirings/queue/index.js +1 -1
- package/dist/wirings/queue/queue-runner.d.ts +7 -0
- package/dist/wirings/queue/queue-runner.js +23 -12
- package/dist/wirings/queue/queue.types.d.ts +8 -2
- package/dist/wirings/rpc/index.d.ts +1 -1
- package/dist/wirings/rpc/index.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +40 -13
- package/dist/wirings/rpc/rpc-runner.js +191 -25
- package/dist/wirings/rpc/rpc-types.d.ts +15 -4
- package/dist/wirings/scheduler/index.d.ts +3 -3
- package/dist/wirings/scheduler/index.js +2 -3
- package/dist/wirings/scheduler/log-schedulers.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -10
- package/dist/wirings/secret/index.d.ts +3 -0
- package/dist/wirings/secret/index.js +2 -0
- package/dist/wirings/secret/secret.types.d.ts +27 -0
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
- package/dist/wirings/secret/validate-secret-definitions.js +55 -0
- package/dist/wirings/trigger/index.d.ts +3 -0
- package/dist/wirings/trigger/index.js +2 -0
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
- package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +42 -0
- package/dist/wirings/trigger/trigger-runner.js +85 -0
- package/dist/wirings/trigger/trigger.types.d.ts +130 -0
- package/dist/wirings/trigger/trigger.types.js +40 -0
- package/dist/wirings/variable/index.d.ts +3 -0
- package/dist/wirings/variable/index.js +2 -0
- package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
- package/dist/wirings/variable/validate-variable-definitions.js +45 -0
- package/dist/wirings/variable/variable.types.d.ts +18 -0
- package/dist/wirings/variable/variable.types.js +1 -0
- package/dist/wirings/workflow/dsl/index.d.ts +5 -0
- package/dist/wirings/workflow/dsl/index.js +4 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +292 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +23 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
- package/dist/wirings/workflow/graph/graph-node.js +58 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
- package/dist/wirings/workflow/graph/graph-runner.js +540 -0
- package/dist/wirings/workflow/graph/index.d.ts +4 -0
- package/dist/wirings/workflow/graph/index.js +3 -0
- package/dist/wirings/workflow/graph/template.d.ts +15 -0
- package/dist/wirings/workflow/graph/template.js +27 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +82 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
- package/dist/wirings/workflow/index.d.ts +7 -12
- package/dist/wirings/workflow/index.js +8 -11
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
- package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
- package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
- package/dist/wirings/workflow/workflow-helpers.js +38 -0
- package/dist/wirings/workflow/workflow-utils.d.ts +1 -0
- package/dist/wirings/workflow/workflow-utils.js +1 -0
- package/dist/wirings/workflow/workflow.types.d.ts +83 -214
- package/package.json +13 -6
- package/run-tests.sh +4 -1
- package/src/crypto-utils.ts +99 -0
- package/src/errors/error-handler.ts +3 -3
- package/src/errors/errors.ts +17 -0
- package/src/errors/index.ts +0 -1
- package/src/factory-functions.test.ts +42 -2
- package/src/function/function-runner.test.ts +5 -12
- package/src/function/function-runner.ts +195 -40
- package/src/function/functions.types.ts +66 -14
- package/src/function/index.ts +5 -2
- package/src/handle-error.ts +2 -10
- package/src/index.ts +106 -27
- package/src/middleware/auth-apikey.test.ts +15 -12
- package/src/middleware/auth-apikey.ts +3 -3
- package/src/middleware/auth-bearer.test.ts +17 -14
- package/src/middleware/auth-bearer.ts +25 -27
- package/src/middleware/auth-cookie.test.ts +16 -13
- package/src/middleware/auth-cookie.ts +6 -8
- package/src/middleware/cors.ts +96 -0
- package/src/middleware/index.ts +5 -3
- package/src/middleware/remote-auth.ts +68 -0
- package/src/middleware-runner.test.ts +122 -0
- package/src/middleware-runner.ts +24 -17
- package/src/permissions.test.ts +102 -86
- package/src/permissions.ts +32 -93
- package/src/pikku-state.ts +168 -201
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.ts +50 -18
- package/src/services/ai-agent-runner-service.ts +29 -0
- package/src/services/ai-run-state-service.ts +20 -0
- package/src/services/ai-storage-service.ts +39 -0
- package/src/services/deployment-service.ts +22 -0
- package/src/services/gopass-secrets.ts +95 -0
- package/src/services/in-memory-trigger-service.ts +68 -0
- package/src/services/in-memory-workflow-service.ts +395 -0
- package/src/services/index.ts +49 -14
- package/src/services/local-secrets.ts +51 -0
- package/src/services/local-variables.ts +22 -0
- package/src/services/scheduler-service.ts +29 -1
- package/src/services/schema-service.ts +7 -0
- package/src/services/scoped-secret-service.ts +41 -0
- package/src/services/secret-service.ts +25 -4
- package/src/services/trigger-service.ts +38 -0
- package/src/services/typed-secret-service.ts +70 -0
- package/src/services/typed-variables-service.ts +81 -0
- package/src/services/user-session-service.ts +23 -0
- package/src/services/variables-service.ts +5 -0
- package/src/services/workflow-service.ts +94 -0
- package/src/types/core.types.ts +82 -8
- package/src/types/state.types.ts +169 -0
- package/src/utils.ts +74 -5
- package/src/version.test.ts +80 -0
- package/src/version.ts +25 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
- package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
- package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
- package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
- package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
- package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
- package/src/wirings/ai-agent/index.ts +28 -0
- package/src/wirings/channel/channel-common.ts +32 -19
- package/src/wirings/channel/channel-handler.ts +18 -5
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +14 -15
- package/src/wirings/channel/channel.types.ts +17 -1
- package/src/wirings/channel/define-channel-routes.ts +25 -0
- package/src/wirings/channel/index.ts +23 -8
- package/src/wirings/channel/local/index.ts +3 -3
- package/src/wirings/channel/local/local-channel-runner.test.ts +47 -2
- package/src/wirings/channel/local/local-channel-runner.ts +22 -6
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +28 -28
- package/src/wirings/cli/cli-runner.ts +27 -19
- package/src/wirings/cli/cli.types.ts +12 -11
- package/src/wirings/cli/command-parser.test.ts +8 -8
- package/src/wirings/cli/define-cli-commands.ts +24 -0
- package/src/wirings/cli/index.ts +10 -4
- package/src/wirings/http/http-routes.test.ts +322 -0
- package/src/wirings/http/http-routes.ts +198 -0
- package/src/wirings/http/http-runner.test.ts +5 -5
- package/src/wirings/http/http-runner.ts +80 -29
- package/src/wirings/http/http.types.ts +121 -23
- package/src/wirings/http/index.ts +16 -4
- package/src/wirings/http/log-http-routes.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
- package/src/wirings/http/routers/path-to-regex.ts +2 -2
- package/src/wirings/mcp/index.ts +27 -3
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
- package/src/wirings/mcp/mcp-runner.ts +56 -67
- package/src/wirings/mcp/mcp.types.ts +3 -3
- package/src/wirings/node/index.ts +2 -0
- package/src/wirings/node/node.types.ts +23 -0
- package/src/wirings/oauth2/index.ts +3 -0
- package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
- package/src/wirings/oauth2/oauth2-client.ts +335 -0
- package/src/wirings/oauth2/oauth2.types.ts +69 -0
- package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
- package/src/wirings/queue/index.ts +14 -2
- package/src/wirings/queue/queue-runner.test.ts +115 -73
- package/src/wirings/queue/queue-runner.ts +39 -13
- package/src/wirings/queue/queue.types.ts +12 -2
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +270 -34
- package/src/wirings/rpc/rpc-types.ts +21 -4
- package/src/wirings/scheduler/index.ts +7 -4
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
- package/src/wirings/scheduler/scheduler-runner.ts +50 -10
- package/src/wirings/secret/index.ts +9 -0
- package/src/wirings/secret/secret.types.ts +32 -0
- package/src/wirings/secret/validate-secret-definitions.ts +82 -0
- package/src/wirings/trigger/index.ts +10 -0
- package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
- package/src/wirings/trigger/trigger-runner.ts +138 -0
- package/src/wirings/trigger/trigger.types.ts +178 -0
- package/src/wirings/variable/index.ts +8 -0
- package/src/wirings/variable/validate-variable-definitions.ts +69 -0
- package/src/wirings/variable/variable.types.ts +22 -0
- package/src/wirings/workflow/dsl/index.ts +31 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
- package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
- package/src/wirings/workflow/graph/graph-node.ts +222 -0
- package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
- package/src/wirings/workflow/graph/graph-runner.ts +816 -0
- package/src/wirings/workflow/graph/index.ts +14 -0
- package/src/wirings/workflow/graph/template.ts +42 -0
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
- package/src/wirings/workflow/graph/workflow-graph.types.ts +104 -0
- package/src/wirings/workflow/index.ts +64 -26
- package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow-utils.ts +0 -0
- package/src/wirings/workflow/workflow.types.ts +123 -279
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
- package/dist/wirings/workflow/workflow-runner.js +0 -65
- package/src/function/function-runner.ts.bak +0 -188
- package/src/wirings/workflow/workflow-runner.ts +0 -72
|
@@ -1,19 +1,66 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
CoreServices,
|
|
3
|
+
CoreSingletonServices,
|
|
4
|
+
PikkuWire,
|
|
5
|
+
} from '../../types/core.types.js'
|
|
6
|
+
import type { SessionService } from '../../services/user-session-service.js'
|
|
7
|
+
import type { CoreUserSession } from '../../types/core.types.js'
|
|
2
8
|
import { runPikkuFunc } from '../../function/function-runner.js'
|
|
3
9
|
import { pikkuState } from '../../pikku-state.js'
|
|
4
10
|
import { ForbiddenError } from '../../errors/errors.js'
|
|
5
|
-
import {
|
|
11
|
+
import { PikkuError } from '../../errors/error-handler.js'
|
|
12
|
+
import { PikkuRPC, ResolvedFunction } from './rpc-types.js'
|
|
13
|
+
import { parseVersionedId } from '../../version.js'
|
|
14
|
+
import { encryptJSON } from '../../crypto-utils.js'
|
|
6
15
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
export class RPCNotFoundError extends PikkuError {
|
|
17
|
+
public readonly rpcName: string
|
|
18
|
+
constructor(rpcName: string) {
|
|
19
|
+
super(`RPC function not found: ${rpcName}`)
|
|
20
|
+
this.rpcName = rpcName
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
import type { AIAgentInput } from '../ai-agent/ai-agent.types.js'
|
|
24
|
+
import { runAIAgent } from '../ai-agent/ai-agent-runner.js'
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a namespaced function reference to package and function names
|
|
28
|
+
* Uses pikkuState to look up the namespace -> package mapping
|
|
29
|
+
*/
|
|
30
|
+
const resolveNamespace = (
|
|
31
|
+
namespacedFunction: string
|
|
32
|
+
): ResolvedFunction | null => {
|
|
33
|
+
const colonIndex = namespacedFunction.indexOf(':')
|
|
34
|
+
if (colonIndex === -1) {
|
|
35
|
+
return null
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const namespace = namespacedFunction.substring(0, colonIndex)
|
|
39
|
+
const functionName = namespacedFunction.substring(colonIndex + 1)
|
|
40
|
+
|
|
41
|
+
const externalPackages = pikkuState(null, 'rpc', 'externalPackages')
|
|
42
|
+
const pkgConfig = externalPackages.get(namespace)
|
|
43
|
+
if (!pkgConfig) {
|
|
44
|
+
return null
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
package: pkgConfig.package,
|
|
49
|
+
function: functionName,
|
|
50
|
+
}
|
|
10
51
|
}
|
|
11
52
|
|
|
12
53
|
const getPikkuFunctionName = (rpcName: string): string => {
|
|
13
|
-
const rpc = pikkuState('rpc', 'meta')
|
|
14
|
-
|
|
54
|
+
const rpc = pikkuState(null, 'rpc', 'meta')
|
|
55
|
+
let rpcMeta = rpc[rpcName]
|
|
15
56
|
if (!rpcMeta) {
|
|
16
|
-
|
|
57
|
+
const { baseName, version } = parseVersionedId(rpcName)
|
|
58
|
+
if (version !== null) {
|
|
59
|
+
rpcMeta = rpc[baseName]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!rpcMeta) {
|
|
63
|
+
throw new RPCNotFoundError(rpcName)
|
|
17
64
|
}
|
|
18
65
|
return rpcMeta
|
|
19
66
|
}
|
|
@@ -24,13 +71,23 @@ export class ContextAwareRPCService {
|
|
|
24
71
|
private services: CoreServices,
|
|
25
72
|
private wire: PikkuWire,
|
|
26
73
|
private options: {
|
|
27
|
-
coerceDataFromSchema?: boolean
|
|
28
74
|
requiresAuth?: boolean
|
|
75
|
+
sessionService?: SessionService<CoreUserSession>
|
|
29
76
|
}
|
|
30
77
|
) {}
|
|
31
78
|
|
|
32
79
|
public async rpcExposed(funcName: string, data: any): Promise<any> {
|
|
33
|
-
|
|
80
|
+
let functionMeta: any
|
|
81
|
+
if (funcName.includes(':')) {
|
|
82
|
+
const resolved = resolveNamespace(funcName)
|
|
83
|
+
if (resolved) {
|
|
84
|
+
functionMeta = pikkuState(resolved.package, 'function', 'meta')[
|
|
85
|
+
resolved.function
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
functionMeta = pikkuState(null, 'function', 'meta')[funcName]
|
|
90
|
+
}
|
|
34
91
|
if (!functionMeta) {
|
|
35
92
|
throw new Error(`Function not found: ${funcName}`)
|
|
36
93
|
}
|
|
@@ -55,22 +112,79 @@ export class ContextAwareRPCService {
|
|
|
55
112
|
}
|
|
56
113
|
: undefined,
|
|
57
114
|
}
|
|
115
|
+
|
|
116
|
+
// Check if it's a namespaced function call (e.g., 'stripe:createCharge')
|
|
117
|
+
if (funcName.includes(':')) {
|
|
118
|
+
return this.invokeExternalPackageFunction<In, Out>(
|
|
119
|
+
funcName,
|
|
120
|
+
data,
|
|
121
|
+
updatedWire
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Main package function
|
|
58
126
|
return runPikkuFunc<In, Out>(
|
|
59
127
|
'rpc',
|
|
60
128
|
funcName,
|
|
61
129
|
getPikkuFunctionName(funcName),
|
|
62
130
|
{
|
|
63
131
|
auth: this.options.requiresAuth,
|
|
64
|
-
// TODO: this is a hack since services have already been created
|
|
65
|
-
// but is valid since we don't want to keep creating new wire services
|
|
66
132
|
singletonServices: this.services,
|
|
67
133
|
data: () => data,
|
|
68
|
-
coerceDataFromSchema: this.options.coerceDataFromSchema,
|
|
69
134
|
wire: updatedWire,
|
|
70
135
|
}
|
|
71
136
|
)
|
|
72
137
|
}
|
|
73
138
|
|
|
139
|
+
/**
|
|
140
|
+
* Invoke a function from an external package
|
|
141
|
+
* External packages register their functions in pikkuState under their package name.
|
|
142
|
+
* The function is executed using the parent services (shared singleton services).
|
|
143
|
+
* @private
|
|
144
|
+
*/
|
|
145
|
+
private async invokeExternalPackageFunction<In = any, Out = any>(
|
|
146
|
+
namespacedFunction: string,
|
|
147
|
+
data: In,
|
|
148
|
+
wire: PikkuWire
|
|
149
|
+
): Promise<Out> {
|
|
150
|
+
// Resolve namespace to package name
|
|
151
|
+
const resolved = resolveNamespace(namespacedFunction)
|
|
152
|
+
if (!resolved) {
|
|
153
|
+
throw new Error(
|
|
154
|
+
`Unknown namespace in function reference: ${namespacedFunction}. ` +
|
|
155
|
+
`Make sure the package is registered in externalPackages config.`
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Get the function meta from the external package
|
|
160
|
+
// External packages use function meta, not RPC meta
|
|
161
|
+
const externalFunctionMeta = pikkuState(
|
|
162
|
+
resolved.package,
|
|
163
|
+
'function',
|
|
164
|
+
'meta'
|
|
165
|
+
)
|
|
166
|
+
const funcMeta = externalFunctionMeta[resolved.function]
|
|
167
|
+
if (!funcMeta) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`Function '${resolved.function}' not found in package '${resolved.package}'. ` +
|
|
170
|
+
`Available functions: ${Object.keys(externalFunctionMeta).join(', ') || '(none)'}`
|
|
171
|
+
)
|
|
172
|
+
}
|
|
173
|
+
const funcName = funcMeta.pikkuFuncId || resolved.function
|
|
174
|
+
|
|
175
|
+
// Execute the function using runPikkuFunc with the external package's state
|
|
176
|
+
// We use the parent services (this.services) since external packages share services
|
|
177
|
+
// Pass the function's tags so tag-based middleware/permissions are applied
|
|
178
|
+
return runPikkuFunc<In, Out>('rpc', namespacedFunction, funcName, {
|
|
179
|
+
auth: this.options.requiresAuth,
|
|
180
|
+
singletonServices: this.services,
|
|
181
|
+
data: () => data,
|
|
182
|
+
wire,
|
|
183
|
+
packageName: resolved.package,
|
|
184
|
+
tags: funcMeta.tags,
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
|
|
74
188
|
public async rpcWithWire<In = any, Out = any>(
|
|
75
189
|
rpcName: string,
|
|
76
190
|
data: In,
|
|
@@ -96,7 +210,6 @@ export class ContextAwareRPCService {
|
|
|
96
210
|
auth: this.options.requiresAuth,
|
|
97
211
|
singletonServices: this.services,
|
|
98
212
|
data: () => data,
|
|
99
|
-
coerceDataFromSchema: this.options.coerceDataFromSchema,
|
|
100
213
|
wire: mergedWire,
|
|
101
214
|
}
|
|
102
215
|
)
|
|
@@ -104,17 +217,142 @@ export class ContextAwareRPCService {
|
|
|
104
217
|
|
|
105
218
|
public async startWorkflow<In = any>(
|
|
106
219
|
workflowName: string,
|
|
107
|
-
input: In
|
|
220
|
+
input: In,
|
|
221
|
+
options?: {
|
|
222
|
+
startNode?: string
|
|
223
|
+
wire?: { type: string; id?: string; parentRunId?: string }
|
|
224
|
+
}
|
|
108
225
|
): Promise<{ runId: string }> {
|
|
109
226
|
if (!this.services.workflowService) {
|
|
110
227
|
throw new Error('WorkflowService service not available')
|
|
111
228
|
}
|
|
229
|
+
const parentRunId = this.wire.workflowStep?.runId ?? this.wire.graph?.runId
|
|
230
|
+
const wire = options?.wire ?? {
|
|
231
|
+
type: this.wire.wireType ?? 'unknown',
|
|
232
|
+
id: this.wire.wireId,
|
|
233
|
+
...(parentRunId ? { parentRunId } : {}),
|
|
234
|
+
}
|
|
112
235
|
return this.services.workflowService.startWorkflow(
|
|
113
236
|
workflowName,
|
|
114
237
|
input,
|
|
115
|
-
|
|
238
|
+
wire,
|
|
239
|
+
this,
|
|
240
|
+
options
|
|
116
241
|
)
|
|
117
242
|
}
|
|
243
|
+
|
|
244
|
+
public async agent(
|
|
245
|
+
agentName: string,
|
|
246
|
+
input: AIAgentInput
|
|
247
|
+
): Promise<{
|
|
248
|
+
runId: string
|
|
249
|
+
result: unknown
|
|
250
|
+
usage: { inputTokens: number; outputTokens: number }
|
|
251
|
+
}> {
|
|
252
|
+
const result = await runAIAgent(agentName, input, {
|
|
253
|
+
singletonServices: this.services as CoreSingletonServices,
|
|
254
|
+
sessionService: this.options.sessionService,
|
|
255
|
+
})
|
|
256
|
+
return {
|
|
257
|
+
runId: result.runId,
|
|
258
|
+
result: result.object ?? result.text,
|
|
259
|
+
usage: result.usage,
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public async remote<In = any, Out = any>(
|
|
264
|
+
funcName: string,
|
|
265
|
+
data: In
|
|
266
|
+
): Promise<Out> {
|
|
267
|
+
let endpoint: string | undefined
|
|
268
|
+
const headers: Record<string, string> = {
|
|
269
|
+
'Content-Type': 'application/json',
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const colonIndex = funcName.indexOf(':')
|
|
273
|
+
if (colonIndex !== -1) {
|
|
274
|
+
const namespace = funcName.substring(0, colonIndex)
|
|
275
|
+
const externalPackages = pikkuState(null, 'rpc', 'externalPackages')
|
|
276
|
+
const pkgConfig = externalPackages.get(namespace)
|
|
277
|
+
endpoint = pkgConfig?.rpcEndpoint
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!endpoint && this.services.deploymentService) {
|
|
281
|
+
const deployments =
|
|
282
|
+
await this.services.deploymentService.findFunction(funcName)
|
|
283
|
+
if (deployments.length > 0) {
|
|
284
|
+
endpoint = deployments[0].endpoint
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (!endpoint) {
|
|
289
|
+
throw new Error(
|
|
290
|
+
`No endpoint configured for remote RPC: ${funcName}. ` +
|
|
291
|
+
`Configure rpcEndpoint in externalPackages config or set up a DeploymentService.`
|
|
292
|
+
)
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
let secret: string | undefined
|
|
296
|
+
if (this.services.secrets) {
|
|
297
|
+
try {
|
|
298
|
+
secret = await this.services.secrets.getSecret('PIKKU_REMOTE_SECRET')
|
|
299
|
+
} catch {}
|
|
300
|
+
}
|
|
301
|
+
if (secret) {
|
|
302
|
+
if (!this.services.jwt) {
|
|
303
|
+
throw new Error(
|
|
304
|
+
'PIKKU_REMOTE_SECRET is set but JWT service is not available'
|
|
305
|
+
)
|
|
306
|
+
}
|
|
307
|
+
const session =
|
|
308
|
+
this.wire.getSession && typeof this.wire.getSession === 'function'
|
|
309
|
+
? await this.wire.getSession()
|
|
310
|
+
: (this.wire as any).session
|
|
311
|
+
const sessionEnc = session
|
|
312
|
+
? await encryptJSON(secret, { session })
|
|
313
|
+
: undefined
|
|
314
|
+
const token = await this.services.jwt.encode(
|
|
315
|
+
{ value: 5, unit: 'minute' },
|
|
316
|
+
{
|
|
317
|
+
aud: 'pikku-remote',
|
|
318
|
+
fn: funcName,
|
|
319
|
+
iat: Date.now(),
|
|
320
|
+
session: sessionEnc,
|
|
321
|
+
}
|
|
322
|
+
)
|
|
323
|
+
headers.Authorization = `Bearer ${token}`
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const url = `${endpoint}/rpc/${encodeURIComponent(funcName)}`
|
|
327
|
+
const timeoutMs = 30_000
|
|
328
|
+
const response = await fetch(url, {
|
|
329
|
+
method: 'POST',
|
|
330
|
+
headers,
|
|
331
|
+
body: JSON.stringify({ data }),
|
|
332
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
if (!response.ok) {
|
|
336
|
+
let errorBody: string
|
|
337
|
+
try {
|
|
338
|
+
errorBody = JSON.stringify(await response.json())
|
|
339
|
+
} catch {
|
|
340
|
+
errorBody = await response.text()
|
|
341
|
+
}
|
|
342
|
+
throw new Error(
|
|
343
|
+
`Remote RPC call failed: ${response.status} ${response.statusText}. ${errorBody}`
|
|
344
|
+
)
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
try {
|
|
348
|
+
return (await response.json()) as Out
|
|
349
|
+
} catch {
|
|
350
|
+
const text = await response.text()
|
|
351
|
+
throw new Error(
|
|
352
|
+
`Remote RPC call returned non-JSON response: ${response.status} ${response.statusText}. ${text}`
|
|
353
|
+
)
|
|
354
|
+
}
|
|
355
|
+
}
|
|
118
356
|
}
|
|
119
357
|
|
|
120
358
|
// RPC Service class for the global interface
|
|
@@ -122,30 +360,33 @@ export class PikkuRPCService<
|
|
|
122
360
|
Services extends CoreServices,
|
|
123
361
|
TypedRPC = PikkuRPC,
|
|
124
362
|
> {
|
|
125
|
-
private config?: RPCServiceConfig
|
|
126
|
-
|
|
127
|
-
// Initialize the RPC service with configuration
|
|
128
|
-
initialize(config: RPCServiceConfig) {
|
|
129
|
-
this.config = config
|
|
130
|
-
}
|
|
131
|
-
|
|
132
363
|
// Convenience function for initializing
|
|
133
364
|
getContextRPCService(
|
|
134
365
|
services: Services,
|
|
135
366
|
wire: PikkuWire,
|
|
136
|
-
|
|
367
|
+
requiresAuthOrOptions?:
|
|
368
|
+
| boolean
|
|
369
|
+
| {
|
|
370
|
+
requiresAuth?: boolean
|
|
371
|
+
sessionService?: SessionService<CoreUserSession>
|
|
372
|
+
}
|
|
373
|
+
| undefined,
|
|
137
374
|
depth: number = 0
|
|
138
375
|
): TypedRPC {
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
376
|
+
const options =
|
|
377
|
+
typeof requiresAuthOrOptions === 'object' &&
|
|
378
|
+
requiresAuthOrOptions !== null
|
|
379
|
+
? requiresAuthOrOptions
|
|
380
|
+
: { requiresAuth: requiresAuthOrOptions }
|
|
381
|
+
const serviceRPC = new ContextAwareRPCService(services, wire, options)
|
|
143
382
|
return {
|
|
144
383
|
depth,
|
|
145
384
|
global: false,
|
|
146
385
|
invoke: serviceRPC.rpc.bind(serviceRPC),
|
|
147
|
-
|
|
386
|
+
remote: serviceRPC.remote.bind(serviceRPC),
|
|
387
|
+
exposed: serviceRPC.rpcExposed.bind(serviceRPC),
|
|
148
388
|
startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
|
|
389
|
+
agent: serviceRPC.agent.bind(serviceRPC),
|
|
149
390
|
rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
|
|
150
391
|
} as any
|
|
151
392
|
}
|
|
@@ -153,8 +394,3 @@ export class PikkuRPCService<
|
|
|
153
394
|
|
|
154
395
|
// Create a singleton instance
|
|
155
396
|
export const rpcService = new PikkuRPCService()
|
|
156
|
-
|
|
157
|
-
// Convenience function for initializing
|
|
158
|
-
export const initialize = (config: RPCServiceConfig) => {
|
|
159
|
-
rpcService.initialize(config)
|
|
160
|
-
}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
|
-
export type PikkuRPC<
|
|
1
|
+
export type PikkuRPC<
|
|
2
|
+
Invoke extends Function = any,
|
|
3
|
+
Remote extends Function = any,
|
|
4
|
+
startWorkflow extends Function = any,
|
|
5
|
+
Agent extends Function = any,
|
|
6
|
+
> = {
|
|
2
7
|
depth: number
|
|
3
8
|
global: boolean
|
|
4
|
-
invoke:
|
|
9
|
+
invoke: Invoke
|
|
10
|
+
remote: Remote
|
|
11
|
+
exposed: (name: string, data: any) => Promise<any>
|
|
12
|
+
startWorkflow: startWorkflow
|
|
13
|
+
agent: Agent
|
|
5
14
|
}
|
|
6
15
|
|
|
7
16
|
export type RPCMeta = {
|
|
8
|
-
|
|
17
|
+
pikkuFuncId: string
|
|
9
18
|
expose: boolean
|
|
10
|
-
|
|
19
|
+
remote?: boolean
|
|
11
20
|
}
|
|
12
21
|
|
|
13
22
|
/**
|
|
@@ -17,3 +26,11 @@ export interface RPCHandler<Input, Output> {
|
|
|
17
26
|
input: Input
|
|
18
27
|
output: Output
|
|
19
28
|
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Resolved function reference from namespace
|
|
32
|
+
*/
|
|
33
|
+
export interface ResolvedFunction {
|
|
34
|
+
package: string
|
|
35
|
+
function: string
|
|
36
|
+
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
export * from './scheduler.types.js'
|
|
2
|
-
|
|
3
1
|
export {
|
|
4
2
|
runScheduledTask,
|
|
3
|
+
createSchedulerRuntimeHandlers,
|
|
5
4
|
wireScheduler,
|
|
6
5
|
getScheduledTasks,
|
|
7
6
|
} from './scheduler-runner.js'
|
|
8
|
-
|
|
9
|
-
export
|
|
7
|
+
export { logSchedulers } from './log-schedulers.js'
|
|
8
|
+
export type {
|
|
9
|
+
CoreScheduledTask,
|
|
10
|
+
ScheduledTasksMeta,
|
|
11
|
+
PikkuScheduledTask,
|
|
12
|
+
} from './scheduler.types.js'
|
|
@@ -6,7 +6,7 @@ import { Logger } from '../../services/index.js'
|
|
|
6
6
|
* @param logger - A logger for logging information.
|
|
7
7
|
*/
|
|
8
8
|
export const logSchedulers = (logger: Logger) => {
|
|
9
|
-
const scheduledTasks = pikkuState('scheduler', 'tasks')
|
|
9
|
+
const scheduledTasks = pikkuState(null, 'scheduler', 'tasks')
|
|
10
10
|
if (scheduledTasks.size === 0) {
|
|
11
11
|
logger.info('No scheduled tasks added')
|
|
12
12
|
return
|