@pikku/core 0.11.2 → 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 +33 -2
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- 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 +7 -1
- package/dist/function/function-runner.js +82 -23
- package/dist/function/functions.types.d.ts +31 -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.js +1 -10
- package/dist/index.d.ts +28 -26
- package/dist/index.js +18 -29
- package/dist/middleware/auth-apikey.d.ts +2 -2
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +2 -2
- package/dist/middleware/auth-bearer.js +3 -6
- package/dist/middleware/auth-cookie.d.ts +2 -2
- 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 +2 -2
- package/dist/middleware-runner.js +8 -10
- package/dist/permissions.js +11 -15
- package/dist/pikku-state.d.ts +1 -0
- package/dist/pikku-state.js +18 -8
- package/dist/schema.js +12 -11
- 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 +9 -4
- package/dist/types/core.types.d.ts +48 -12
- package/dist/types/core.types.js +8 -1
- package/dist/types/state.types.d.ts +43 -51
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +15 -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 +12 -3
- 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 +7 -7
- 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/serverless/index.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.js +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +15 -4
- 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 +12 -8
- package/dist/wirings/cli/cli.types.d.ts +6 -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.js +49 -23
- package/dist/wirings/http/http.types.d.ts +78 -38
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- 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 +25 -39
- 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 +17 -6
- 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 +33 -5
- package/dist/wirings/rpc/rpc-runner.js +134 -16
- package/dist/wirings/rpc/rpc-types.d.ts +8 -4
- package/dist/wirings/scheduler/index.d.ts +3 -3
- package/dist/wirings/scheduler/index.js +2 -3
- package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
- package/dist/wirings/scheduler/scheduler-runner.js +23 -5
- 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 +26 -0
- package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +21 -8
- package/dist/wirings/trigger/trigger-runner.js +46 -18
- 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 +28 -14
- package/dist/wirings/workflow/pikku-workflow-service.js +200 -56
- 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 -23
- package/dist/wirings/workflow/workflow-utils.js +1 -66
- package/dist/wirings/workflow/workflow.types.d.ts +40 -93
- package/package.json +13 -15
- package/run-tests.sh +4 -1
- package/src/crypto-utils.ts +99 -0
- 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 +4 -11
- package/src/function/function-runner.ts +114 -29
- package/src/function/functions.types.ts +62 -132
- package/src/function/index.ts +5 -2
- package/src/handle-error.ts +2 -10
- package/src/index.ts +99 -25
- 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 +12 -12
- package/src/permissions.test.ts +81 -7
- package/src/permissions.ts +15 -17
- package/src/pikku-state.ts +20 -8
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.ts +18 -15
- 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 +22 -2
- package/src/types/core.types.ts +76 -11
- package/src/types/state.types.ts +37 -63
- package/src/utils.ts +20 -6
- 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 +17 -4
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +9 -10
- 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 +44 -1
- package/src/wirings/channel/local/local-channel-runner.ts +22 -6
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +20 -4
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +9 -9
- package/src/wirings/cli/cli-runner.ts +17 -10
- package/src/wirings/cli/cli.types.ts +11 -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 +3 -3
- package/src/wirings/http/http-runner.ts +63 -29
- package/src/wirings/http/http.types.ts +121 -37
- package/src/wirings/http/index.ts +16 -4
- 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 +39 -50
- 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 +97 -55
- package/src/wirings/queue/queue-runner.ts +33 -7
- package/src/wirings/queue/queue.types.ts +12 -2
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +187 -17
- package/src/wirings/rpc/rpc-types.ts +13 -4
- package/src/wirings/scheduler/index.ts +7 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +70 -26
- package/src/wirings/scheduler/scheduler-runner.ts +45 -5
- 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 -2
- package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
- package/src/wirings/trigger/trigger-runner.ts +80 -38
- package/src/wirings/trigger/trigger.types.ts +144 -22
- 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 +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 +495 -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.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 +212 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +285 -66
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow-utils.ts +0 -120
- package/src/wirings/workflow/workflow.types.ts +45 -90
- 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/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
|
@@ -1,8 +1,27 @@
|
|
|
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'
|
|
11
|
+
import { PikkuError } from '../../errors/error-handler.js'
|
|
5
12
|
import { PikkuRPC, ResolvedFunction } from './rpc-types.js'
|
|
13
|
+
import { parseVersionedId } from '../../version.js'
|
|
14
|
+
import { encryptJSON } from '../../crypto-utils.js'
|
|
15
|
+
|
|
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'
|
|
6
25
|
|
|
7
26
|
/**
|
|
8
27
|
* Resolve a namespaced function reference to package and function names
|
|
@@ -20,22 +39,28 @@ const resolveNamespace = (
|
|
|
20
39
|
const functionName = namespacedFunction.substring(colonIndex + 1)
|
|
21
40
|
|
|
22
41
|
const externalPackages = pikkuState(null, 'rpc', 'externalPackages')
|
|
23
|
-
const
|
|
24
|
-
if (!
|
|
42
|
+
const pkgConfig = externalPackages.get(namespace)
|
|
43
|
+
if (!pkgConfig) {
|
|
25
44
|
return null
|
|
26
45
|
}
|
|
27
46
|
|
|
28
47
|
return {
|
|
29
|
-
package:
|
|
48
|
+
package: pkgConfig.package,
|
|
30
49
|
function: functionName,
|
|
31
50
|
}
|
|
32
51
|
}
|
|
33
52
|
|
|
34
53
|
const getPikkuFunctionName = (rpcName: string): string => {
|
|
35
54
|
const rpc = pikkuState(null, 'rpc', 'meta')
|
|
36
|
-
|
|
55
|
+
let rpcMeta = rpc[rpcName]
|
|
37
56
|
if (!rpcMeta) {
|
|
38
|
-
|
|
57
|
+
const { baseName, version } = parseVersionedId(rpcName)
|
|
58
|
+
if (version !== null) {
|
|
59
|
+
rpcMeta = rpc[baseName]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!rpcMeta) {
|
|
63
|
+
throw new RPCNotFoundError(rpcName)
|
|
39
64
|
}
|
|
40
65
|
return rpcMeta
|
|
41
66
|
}
|
|
@@ -47,11 +72,22 @@ export class ContextAwareRPCService {
|
|
|
47
72
|
private wire: PikkuWire,
|
|
48
73
|
private options: {
|
|
49
74
|
requiresAuth?: boolean
|
|
75
|
+
sessionService?: SessionService<CoreUserSession>
|
|
50
76
|
}
|
|
51
77
|
) {}
|
|
52
78
|
|
|
53
79
|
public async rpcExposed(funcName: string, data: any): Promise<any> {
|
|
54
|
-
|
|
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
|
+
}
|
|
55
91
|
if (!functionMeta) {
|
|
56
92
|
throw new Error(`Function not found: ${funcName}`)
|
|
57
93
|
}
|
|
@@ -93,8 +129,6 @@ export class ContextAwareRPCService {
|
|
|
93
129
|
getPikkuFunctionName(funcName),
|
|
94
130
|
{
|
|
95
131
|
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
132
|
singletonServices: this.services,
|
|
99
133
|
data: () => data,
|
|
100
134
|
wire: updatedWire,
|
|
@@ -136,7 +170,7 @@ export class ContextAwareRPCService {
|
|
|
136
170
|
`Available functions: ${Object.keys(externalFunctionMeta).join(', ') || '(none)'}`
|
|
137
171
|
)
|
|
138
172
|
}
|
|
139
|
-
const funcName = funcMeta.
|
|
173
|
+
const funcName = funcMeta.pikkuFuncId || resolved.function
|
|
140
174
|
|
|
141
175
|
// Execute the function using runPikkuFunc with the external package's state
|
|
142
176
|
// We use the parent services (this.services) since external packages share services
|
|
@@ -183,17 +217,142 @@ export class ContextAwareRPCService {
|
|
|
183
217
|
|
|
184
218
|
public async startWorkflow<In = any>(
|
|
185
219
|
workflowName: string,
|
|
186
|
-
input: In
|
|
220
|
+
input: In,
|
|
221
|
+
options?: {
|
|
222
|
+
startNode?: string
|
|
223
|
+
wire?: { type: string; id?: string; parentRunId?: string }
|
|
224
|
+
}
|
|
187
225
|
): Promise<{ runId: string }> {
|
|
188
226
|
if (!this.services.workflowService) {
|
|
189
227
|
throw new Error('WorkflowService service not available')
|
|
190
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
|
+
}
|
|
191
235
|
return this.services.workflowService.startWorkflow(
|
|
192
236
|
workflowName,
|
|
193
237
|
input,
|
|
194
|
-
|
|
238
|
+
wire,
|
|
239
|
+
this,
|
|
240
|
+
options
|
|
195
241
|
)
|
|
196
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
|
+
}
|
|
197
356
|
}
|
|
198
357
|
|
|
199
358
|
// RPC Service class for the global interface
|
|
@@ -205,18 +364,29 @@ export class PikkuRPCService<
|
|
|
205
364
|
getContextRPCService(
|
|
206
365
|
services: Services,
|
|
207
366
|
wire: PikkuWire,
|
|
208
|
-
|
|
367
|
+
requiresAuthOrOptions?:
|
|
368
|
+
| boolean
|
|
369
|
+
| {
|
|
370
|
+
requiresAuth?: boolean
|
|
371
|
+
sessionService?: SessionService<CoreUserSession>
|
|
372
|
+
}
|
|
373
|
+
| undefined,
|
|
209
374
|
depth: number = 0
|
|
210
375
|
): TypedRPC {
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
376
|
+
const options =
|
|
377
|
+
typeof requiresAuthOrOptions === 'object' &&
|
|
378
|
+
requiresAuthOrOptions !== null
|
|
379
|
+
? requiresAuthOrOptions
|
|
380
|
+
: { requiresAuth: requiresAuthOrOptions }
|
|
381
|
+
const serviceRPC = new ContextAwareRPCService(services, wire, options)
|
|
214
382
|
return {
|
|
215
383
|
depth,
|
|
216
384
|
global: false,
|
|
217
385
|
invoke: serviceRPC.rpc.bind(serviceRPC),
|
|
218
|
-
|
|
386
|
+
remote: serviceRPC.remote.bind(serviceRPC),
|
|
387
|
+
exposed: serviceRPC.rpcExposed.bind(serviceRPC),
|
|
219
388
|
startWorkflow: serviceRPC.startWorkflow.bind(serviceRPC),
|
|
389
|
+
agent: serviceRPC.agent.bind(serviceRPC),
|
|
220
390
|
rpcWithWire: serviceRPC.rpcWithWire.bind(serviceRPC),
|
|
221
391
|
} as any
|
|
222
392
|
}
|
|
@@ -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
|
/**
|
|
@@ -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'
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
wireScheduler,
|
|
5
5
|
runScheduledTask,
|
|
6
6
|
getScheduledTasks,
|
|
7
|
+
createSchedulerRuntimeHandlers,
|
|
7
8
|
} from './scheduler-runner.js'
|
|
8
9
|
import { resetPikkuState, pikkuState } from '../../pikku-state.js'
|
|
9
10
|
import { CoreScheduledTask } from './scheduler.types.js'
|
|
@@ -38,7 +39,7 @@ describe('wireScheduler', () => {
|
|
|
38
39
|
|
|
39
40
|
// Set up metadata first
|
|
40
41
|
pikkuState(null, 'scheduler', 'meta')['test-task'] = {
|
|
41
|
-
|
|
42
|
+
pikkuFuncId: 'scheduler_test-task',
|
|
42
43
|
name: 'test-task',
|
|
43
44
|
schedule: '0 0 * * *',
|
|
44
45
|
}
|
|
@@ -63,7 +64,10 @@ describe('wireScheduler', () => {
|
|
|
63
64
|
assert.throws(
|
|
64
65
|
() => wireScheduler(mockTask),
|
|
65
66
|
(error: any) => {
|
|
66
|
-
assert.equal(
|
|
67
|
+
assert.equal(
|
|
68
|
+
error.message,
|
|
69
|
+
"Missing generated metadata for scheduled task 'missing-meta-task'"
|
|
70
|
+
)
|
|
67
71
|
return true
|
|
68
72
|
}
|
|
69
73
|
)
|
|
@@ -81,7 +85,7 @@ describe('wireScheduler', () => {
|
|
|
81
85
|
|
|
82
86
|
// Set up metadata
|
|
83
87
|
pikkuState(null, 'scheduler', 'meta')['duplicate-task'] = {
|
|
84
|
-
|
|
88
|
+
pikkuFuncId: 'scheduler_duplicate-task',
|
|
85
89
|
name: 'duplicate-task',
|
|
86
90
|
schedule: '0 0 * * *',
|
|
87
91
|
}
|
|
@@ -121,7 +125,7 @@ describe('wireScheduler', () => {
|
|
|
121
125
|
}
|
|
122
126
|
|
|
123
127
|
pikkuState(null, 'scheduler', 'meta')['task-with-middleware'] = {
|
|
124
|
-
|
|
128
|
+
pikkuFuncId: 'scheduler_task-with-middleware',
|
|
125
129
|
name: 'task-with-middleware',
|
|
126
130
|
schedule: '0 0 * * *',
|
|
127
131
|
}
|
|
@@ -152,12 +156,12 @@ describe('runScheduledTask', () => {
|
|
|
152
156
|
|
|
153
157
|
// Set up metadata and task
|
|
154
158
|
pikkuState(null, 'scheduler', 'meta')['simple-task'] = {
|
|
155
|
-
|
|
159
|
+
pikkuFuncId: 'scheduler_simple-task',
|
|
156
160
|
name: 'simple-task',
|
|
157
161
|
schedule: '0 0 * * *',
|
|
158
162
|
}
|
|
159
163
|
pikkuState(null, 'function', 'meta')['scheduler_simple-task'] = {
|
|
160
|
-
|
|
164
|
+
pikkuFuncId: 'scheduler_simple-task',
|
|
161
165
|
inputSchemaName: null,
|
|
162
166
|
outputSchemaName: null,
|
|
163
167
|
}
|
|
@@ -185,19 +189,19 @@ describe('runScheduledTask', () => {
|
|
|
185
189
|
schedule: '0 0 * * *',
|
|
186
190
|
func: {
|
|
187
191
|
func: async (services: any, data: any, wire: any) => {
|
|
188
|
-
receivedSession = await wire.
|
|
192
|
+
receivedSession = await wire.getSession()
|
|
189
193
|
},
|
|
190
194
|
auth: false,
|
|
191
195
|
},
|
|
192
196
|
}
|
|
193
197
|
|
|
194
198
|
pikkuState(null, 'scheduler', 'meta')['task-with-session'] = {
|
|
195
|
-
|
|
199
|
+
pikkuFuncId: 'scheduler_task-with-session',
|
|
196
200
|
name: 'task-with-session',
|
|
197
201
|
schedule: '0 0 * * *',
|
|
198
202
|
}
|
|
199
203
|
pikkuState(null, 'function', 'meta')['scheduler_task-with-session'] = {
|
|
200
|
-
|
|
204
|
+
pikkuFuncId: 'scheduler_task-with-session',
|
|
201
205
|
inputSchemaName: null,
|
|
202
206
|
outputSchemaName: null,
|
|
203
207
|
}
|
|
@@ -274,12 +278,12 @@ describe('runScheduledTask', () => {
|
|
|
274
278
|
}
|
|
275
279
|
|
|
276
280
|
pikkuState(null, 'scheduler', 'meta')['skipped-task'] = {
|
|
277
|
-
|
|
281
|
+
pikkuFuncId: 'scheduler_skipped-task',
|
|
278
282
|
name: 'skipped-task',
|
|
279
283
|
schedule: '0 0 * * *',
|
|
280
284
|
}
|
|
281
285
|
pikkuState(null, 'function', 'meta')['scheduler_skipped-task'] = {
|
|
282
|
-
|
|
286
|
+
pikkuFuncId: 'scheduler_skipped-task',
|
|
283
287
|
inputSchemaName: null,
|
|
284
288
|
outputSchemaName: null,
|
|
285
289
|
}
|
|
@@ -317,12 +321,12 @@ describe('runScheduledTask', () => {
|
|
|
317
321
|
}
|
|
318
322
|
|
|
319
323
|
pikkuState(null, 'scheduler', 'meta')['skipped-task-no-reason'] = {
|
|
320
|
-
|
|
324
|
+
pikkuFuncId: 'scheduler_skipped-task-no-reason',
|
|
321
325
|
name: 'skipped-task-no-reason',
|
|
322
326
|
schedule: '0 0 * * *',
|
|
323
327
|
}
|
|
324
328
|
pikkuState(null, 'function', 'meta')['scheduler_skipped-task-no-reason'] = {
|
|
325
|
-
|
|
329
|
+
pikkuFuncId: 'scheduler_skipped-task-no-reason',
|
|
326
330
|
inputSchemaName: null,
|
|
327
331
|
outputSchemaName: null,
|
|
328
332
|
}
|
|
@@ -363,12 +367,12 @@ describe('runScheduledTask', () => {
|
|
|
363
367
|
}
|
|
364
368
|
|
|
365
369
|
pikkuState(null, 'scheduler', 'meta')['wire-task'] = {
|
|
366
|
-
|
|
370
|
+
pikkuFuncId: 'scheduler_wire-task',
|
|
367
371
|
name: 'wire-task',
|
|
368
372
|
schedule: '*/5 * * * *',
|
|
369
373
|
}
|
|
370
374
|
pikkuState(null, 'function', 'meta')['scheduler_wire-task'] = {
|
|
371
|
-
|
|
375
|
+
pikkuFuncId: 'scheduler_wire-task',
|
|
372
376
|
inputSchemaName: null,
|
|
373
377
|
outputSchemaName: null,
|
|
374
378
|
}
|
|
@@ -401,12 +405,12 @@ describe('runScheduledTask', () => {
|
|
|
401
405
|
}
|
|
402
406
|
|
|
403
407
|
pikkuState(null, 'scheduler', 'meta')['session-services-task'] = {
|
|
404
|
-
|
|
408
|
+
pikkuFuncId: 'scheduler_session-services-task',
|
|
405
409
|
name: 'session-services-task',
|
|
406
410
|
schedule: '0 0 * * *',
|
|
407
411
|
}
|
|
408
412
|
pikkuState(null, 'function', 'meta')['scheduler_session-services-task'] = {
|
|
409
|
-
|
|
413
|
+
pikkuFuncId: 'scheduler_session-services-task',
|
|
410
414
|
inputSchemaName: null,
|
|
411
415
|
outputSchemaName: null,
|
|
412
416
|
}
|
|
@@ -446,12 +450,12 @@ describe('runScheduledTask', () => {
|
|
|
446
450
|
}
|
|
447
451
|
|
|
448
452
|
pikkuState(null, 'scheduler', 'meta')['cleanup-task'] = {
|
|
449
|
-
|
|
453
|
+
pikkuFuncId: 'scheduler_cleanup-task',
|
|
450
454
|
name: 'cleanup-task',
|
|
451
455
|
schedule: '0 0 * * *',
|
|
452
456
|
}
|
|
453
457
|
pikkuState(null, 'function', 'meta')['scheduler_cleanup-task'] = {
|
|
454
|
-
|
|
458
|
+
pikkuFuncId: 'scheduler_cleanup-task',
|
|
455
459
|
inputSchemaName: null,
|
|
456
460
|
outputSchemaName: null,
|
|
457
461
|
}
|
|
@@ -490,12 +494,12 @@ describe('runScheduledTask', () => {
|
|
|
490
494
|
}
|
|
491
495
|
|
|
492
496
|
pikkuState(null, 'scheduler', 'meta')['error-cleanup-task'] = {
|
|
493
|
-
|
|
497
|
+
pikkuFuncId: 'scheduler_error-cleanup-task',
|
|
494
498
|
name: 'error-cleanup-task',
|
|
495
499
|
schedule: '0 0 * * *',
|
|
496
500
|
}
|
|
497
501
|
pikkuState(null, 'function', 'meta')['scheduler_error-cleanup-task'] = {
|
|
498
|
-
|
|
502
|
+
pikkuFuncId: 'scheduler_error-cleanup-task',
|
|
499
503
|
inputSchemaName: null,
|
|
500
504
|
outputSchemaName: null,
|
|
501
505
|
}
|
|
@@ -527,12 +531,12 @@ describe('runScheduledTask', () => {
|
|
|
527
531
|
}
|
|
528
532
|
|
|
529
533
|
pikkuState(null, 'scheduler', 'meta')['error-task'] = {
|
|
530
|
-
|
|
534
|
+
pikkuFuncId: 'scheduler_error-task',
|
|
531
535
|
name: 'error-task',
|
|
532
536
|
schedule: '0 0 * * *',
|
|
533
537
|
}
|
|
534
538
|
pikkuState(null, 'function', 'meta')['scheduler_error-task'] = {
|
|
535
|
-
|
|
539
|
+
pikkuFuncId: 'scheduler_error-task',
|
|
536
540
|
inputSchemaName: null,
|
|
537
541
|
outputSchemaName: null,
|
|
538
542
|
}
|
|
@@ -574,12 +578,12 @@ describe('runScheduledTask', () => {
|
|
|
574
578
|
}
|
|
575
579
|
|
|
576
580
|
pikkuState(null, 'scheduler', 'meta')['middleware-task'] = {
|
|
577
|
-
|
|
581
|
+
pikkuFuncId: 'scheduler_middleware-task',
|
|
578
582
|
name: 'middleware-task',
|
|
579
583
|
schedule: '0 0 * * *',
|
|
580
584
|
}
|
|
581
585
|
pikkuState(null, 'function', 'meta')['scheduler_middleware-task'] = {
|
|
582
|
-
|
|
586
|
+
pikkuFuncId: 'scheduler_middleware-task',
|
|
583
587
|
inputSchemaName: null,
|
|
584
588
|
outputSchemaName: null,
|
|
585
589
|
}
|
|
@@ -608,7 +612,7 @@ describe('getScheduledTasks', () => {
|
|
|
608
612
|
}
|
|
609
613
|
|
|
610
614
|
pikkuState(null, 'scheduler', 'meta')['test-task'] = {
|
|
611
|
-
|
|
615
|
+
pikkuFuncId: 'scheduler_test-task',
|
|
612
616
|
name: 'test-task',
|
|
613
617
|
schedule: '0 0 * * *',
|
|
614
618
|
}
|
|
@@ -625,3 +629,43 @@ describe('getScheduledTasks', () => {
|
|
|
625
629
|
assert.equal(tasks.size, 0)
|
|
626
630
|
})
|
|
627
631
|
})
|
|
632
|
+
|
|
633
|
+
describe('createSchedulerRuntimeHandlers', () => {
|
|
634
|
+
test('invokes RPC with optional session and runs scheduled task callback', async () => {
|
|
635
|
+
const calls: Array<{ type: string; value: any }> = []
|
|
636
|
+
const logger = createMockLogger()
|
|
637
|
+
const singletonServices = { logger } as any
|
|
638
|
+
|
|
639
|
+
const handlers = createSchedulerRuntimeHandlers({
|
|
640
|
+
singletonServices,
|
|
641
|
+
})
|
|
642
|
+
|
|
643
|
+
const originalGetContextRPCService = (await import('../rpc/rpc-runner.js'))
|
|
644
|
+
.rpcService.getContextRPCService
|
|
645
|
+
;(await import('../rpc/rpc-runner.js')).rpcService.getContextRPCService = ((
|
|
646
|
+
_services: any,
|
|
647
|
+
wire: any
|
|
648
|
+
) => {
|
|
649
|
+
calls.push({ type: 'wire', value: wire })
|
|
650
|
+
return {
|
|
651
|
+
invoke: async (rpcName: string, data: any) => {
|
|
652
|
+
calls.push({ type: 'invoke', value: { rpcName, data } })
|
|
653
|
+
},
|
|
654
|
+
} as any
|
|
655
|
+
}) as any
|
|
656
|
+
|
|
657
|
+
try {
|
|
658
|
+
await handlers.invokeRPC('testRpc', { value: 1 }, { userId: 'u1' } as any)
|
|
659
|
+
} finally {
|
|
660
|
+
;(await import('../rpc/rpc-runner.js')).rpcService.getContextRPCService =
|
|
661
|
+
originalGetContextRPCService
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
assert.equal(calls[0]?.type, 'wire')
|
|
665
|
+
assert.deepEqual(calls[0]?.value, { session: { userId: 'u1' } })
|
|
666
|
+
assert.deepEqual(calls[1]?.value, {
|
|
667
|
+
rpcName: 'testRpc',
|
|
668
|
+
data: { value: 1 },
|
|
669
|
+
})
|
|
670
|
+
})
|
|
671
|
+
})
|
|
@@ -7,14 +7,20 @@ import {
|
|
|
7
7
|
} from '../../types/core.types.js'
|
|
8
8
|
import type { CoreScheduledTask } from './scheduler.types.js'
|
|
9
9
|
import { getErrorResponse, PikkuError } from '../../errors/error-handler.js'
|
|
10
|
+
import { PikkuMissingMetaError } from '../../errors/errors.js'
|
|
10
11
|
import { closeWireServices } from '../../utils.js'
|
|
11
12
|
import { pikkuState } from '../../pikku-state.js'
|
|
12
13
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
|
|
13
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
PikkuSessionService,
|
|
16
|
+
createMiddlewareSessionWireProps,
|
|
17
|
+
} from '../../services/user-session-service.js'
|
|
14
18
|
import {
|
|
15
19
|
CorePikkuFunctionConfig,
|
|
16
20
|
CorePikkuFunctionSessionless,
|
|
17
21
|
} from '../../function/functions.types.js'
|
|
22
|
+
import { rpcService } from '../rpc/rpc-runner.js'
|
|
23
|
+
import { SchedulerRuntimeHandlers } from '../../services/scheduler-service.js'
|
|
18
24
|
|
|
19
25
|
export type RunScheduledTasksParams = {
|
|
20
26
|
name: string
|
|
@@ -37,9 +43,11 @@ export const wireScheduler = <
|
|
|
37
43
|
const meta = pikkuState(null, 'scheduler', 'meta')
|
|
38
44
|
const taskMeta = meta[scheduledTask.name]
|
|
39
45
|
if (!taskMeta) {
|
|
40
|
-
throw new
|
|
46
|
+
throw new PikkuMissingMetaError(
|
|
47
|
+
`Missing generated metadata for scheduled task '${scheduledTask.name}'`
|
|
48
|
+
)
|
|
41
49
|
}
|
|
42
|
-
addFunction(taskMeta.
|
|
50
|
+
addFunction(taskMeta.pikkuFuncId, {
|
|
43
51
|
func: scheduledTask.func.func,
|
|
44
52
|
auth: scheduledTask.func.auth,
|
|
45
53
|
permissions: scheduledTask.func.permissions,
|
|
@@ -103,7 +111,7 @@ export async function runScheduledTask({
|
|
|
103
111
|
throw new ScheduledTaskSkippedError(name, reason)
|
|
104
112
|
},
|
|
105
113
|
},
|
|
106
|
-
|
|
114
|
+
...createMiddlewareSessionWireProps(userSession),
|
|
107
115
|
}
|
|
108
116
|
|
|
109
117
|
try {
|
|
@@ -111,7 +119,7 @@ export async function runScheduledTask({
|
|
|
111
119
|
`Running schedule task: ${name} | schedule: ${task.schedule}`
|
|
112
120
|
)
|
|
113
121
|
|
|
114
|
-
await runPikkuFunc('scheduler', meta.name, meta.
|
|
122
|
+
await runPikkuFunc('scheduler', meta.name, meta.pikkuFuncId, {
|
|
115
123
|
singletonServices,
|
|
116
124
|
createWireServices,
|
|
117
125
|
auth: false,
|
|
@@ -120,6 +128,7 @@ export async function runScheduledTask({
|
|
|
120
128
|
wireMiddleware: task.middleware,
|
|
121
129
|
tags: task.tags,
|
|
122
130
|
wire,
|
|
131
|
+
sessionService: userSession,
|
|
123
132
|
})
|
|
124
133
|
} catch (e: any) {
|
|
125
134
|
const errorResponse = getErrorResponse(e)
|
|
@@ -137,3 +146,34 @@ export async function runScheduledTask({
|
|
|
137
146
|
export const getScheduledTasks = () => {
|
|
138
147
|
return pikkuState(null, 'scheduler', 'tasks')
|
|
139
148
|
}
|
|
149
|
+
|
|
150
|
+
export const createSchedulerRuntimeHandlers = ({
|
|
151
|
+
singletonServices,
|
|
152
|
+
createWireServices,
|
|
153
|
+
}: {
|
|
154
|
+
singletonServices: CoreSingletonServices
|
|
155
|
+
createWireServices?: CreateWireServices<
|
|
156
|
+
CoreSingletonServices,
|
|
157
|
+
CoreServices<CoreSingletonServices>,
|
|
158
|
+
CoreUserSession
|
|
159
|
+
>
|
|
160
|
+
}): SchedulerRuntimeHandlers => {
|
|
161
|
+
return {
|
|
162
|
+
logger: singletonServices.logger,
|
|
163
|
+
invokeRPC: async (
|
|
164
|
+
rpcName: string,
|
|
165
|
+
data?: any,
|
|
166
|
+
session?: CoreUserSession
|
|
167
|
+
) => {
|
|
168
|
+
const wire = session ? ({ session } as PikkuWire) : ({} as PikkuWire)
|
|
169
|
+
const rpc = rpcService.getContextRPCService(singletonServices, wire)
|
|
170
|
+
await rpc.invoke(rpcName, data)
|
|
171
|
+
},
|
|
172
|
+
runScheduledTask: async (name: string) =>
|
|
173
|
+
runScheduledTask({
|
|
174
|
+
name,
|
|
175
|
+
singletonServices,
|
|
176
|
+
createWireServices,
|
|
177
|
+
}),
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { wireSecret } from './secret.types.js'
|
|
2
|
+
export type {
|
|
3
|
+
CoreSecret,
|
|
4
|
+
OAuth2CredentialConfig,
|
|
5
|
+
SecretDefinitionMeta,
|
|
6
|
+
SecretDefinitionsMeta,
|
|
7
|
+
SecretDefinitions,
|
|
8
|
+
} from './secret.types.js'
|
|
9
|
+
export { validateAndBuildSecretDefinitionsMeta } from './validate-secret-definitions.js'
|