@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
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
|
|
3
|
+
/**
|
|
4
|
+
* In-memory implementation of WorkflowService for inline-only execution
|
|
5
|
+
*
|
|
6
|
+
* This is a lightweight workflow service that stores all state in memory.
|
|
7
|
+
* It only supports inline execution (no queue workers) and is ideal for:
|
|
8
|
+
* - CLI tools that need workflow-like step orchestration
|
|
9
|
+
* - Testing and development
|
|
10
|
+
* - Single-process applications without persistence requirements
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const workflowService = new InMemoryWorkflowService()
|
|
15
|
+
* await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
19
|
+
runs = new Map();
|
|
20
|
+
steps = new Map(); // keyed by `${runId}:${stepName}`
|
|
21
|
+
stepData = new Map(); // keyed by stepId
|
|
22
|
+
stepHistory = new Map(); // keyed by runId
|
|
23
|
+
runState = new Map(); // keyed by runId
|
|
24
|
+
branchKeys = new Map(); // keyed by stepId
|
|
25
|
+
workflowVersions = new Map(); // keyed by `${name}:${graphHash}`
|
|
26
|
+
async createRun(workflowName, input, inline, graphHash, wire) {
|
|
27
|
+
const runId = randomUUID();
|
|
28
|
+
const now = new Date();
|
|
29
|
+
const run = {
|
|
30
|
+
id: runId,
|
|
31
|
+
workflow: workflowName,
|
|
32
|
+
status: 'running',
|
|
33
|
+
input,
|
|
34
|
+
inline,
|
|
35
|
+
graphHash,
|
|
36
|
+
wire,
|
|
37
|
+
createdAt: now,
|
|
38
|
+
updatedAt: now,
|
|
39
|
+
};
|
|
40
|
+
this.runs.set(runId, run);
|
|
41
|
+
this.stepHistory.set(runId, []);
|
|
42
|
+
this.runState.set(runId, {});
|
|
43
|
+
if (inline) {
|
|
44
|
+
this.registerInlineRun(runId);
|
|
45
|
+
}
|
|
46
|
+
return runId;
|
|
47
|
+
}
|
|
48
|
+
async getRun(id) {
|
|
49
|
+
return this.runs.get(id) || null;
|
|
50
|
+
}
|
|
51
|
+
async getRunHistory(runId) {
|
|
52
|
+
return this.stepHistory.get(runId) || [];
|
|
53
|
+
}
|
|
54
|
+
async updateRunStatus(id, status, output, error) {
|
|
55
|
+
const run = this.runs.get(id);
|
|
56
|
+
if (run) {
|
|
57
|
+
run.status = status;
|
|
58
|
+
run.updatedAt = new Date();
|
|
59
|
+
if (output !== undefined)
|
|
60
|
+
run.output = output;
|
|
61
|
+
if (error !== undefined)
|
|
62
|
+
run.error = error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async insertStepState(runId, stepName, rpcName, data, stepOptions) {
|
|
66
|
+
const stepId = randomUUID();
|
|
67
|
+
const now = new Date();
|
|
68
|
+
const step = {
|
|
69
|
+
stepId,
|
|
70
|
+
status: 'pending',
|
|
71
|
+
attemptCount: 1,
|
|
72
|
+
retries: stepOptions?.retries,
|
|
73
|
+
retryDelay: stepOptions?.retryDelay,
|
|
74
|
+
createdAt: now,
|
|
75
|
+
updatedAt: now,
|
|
76
|
+
};
|
|
77
|
+
const key = `${runId}:${stepName}`;
|
|
78
|
+
this.steps.set(key, step);
|
|
79
|
+
this.stepData.set(stepId, { rpcName, data, stepName });
|
|
80
|
+
// Add to history
|
|
81
|
+
const history = this.stepHistory.get(runId) || [];
|
|
82
|
+
history.push({ ...step, stepName });
|
|
83
|
+
this.stepHistory.set(runId, history);
|
|
84
|
+
return step;
|
|
85
|
+
}
|
|
86
|
+
async getStepState(runId, stepName) {
|
|
87
|
+
const key = `${runId}:${stepName}`;
|
|
88
|
+
const step = this.steps.get(key);
|
|
89
|
+
if (!step) {
|
|
90
|
+
return {
|
|
91
|
+
stepId: '',
|
|
92
|
+
status: 'pending',
|
|
93
|
+
attemptCount: 0,
|
|
94
|
+
createdAt: new Date(),
|
|
95
|
+
updatedAt: new Date(),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return step;
|
|
99
|
+
}
|
|
100
|
+
async setStepRunning(stepId) {
|
|
101
|
+
for (const step of this.steps.values()) {
|
|
102
|
+
if (step.stepId === stepId) {
|
|
103
|
+
step.status = 'running';
|
|
104
|
+
step.runningAt = new Date();
|
|
105
|
+
step.updatedAt = new Date();
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async setStepScheduled(stepId) {
|
|
111
|
+
for (const step of this.steps.values()) {
|
|
112
|
+
if (step.stepId === stepId) {
|
|
113
|
+
step.status = 'scheduled';
|
|
114
|
+
step.scheduledAt = new Date();
|
|
115
|
+
step.updatedAt = new Date();
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async setStepResult(stepId, result) {
|
|
121
|
+
for (const step of this.steps.values()) {
|
|
122
|
+
if (step.stepId === stepId) {
|
|
123
|
+
step.status = 'succeeded';
|
|
124
|
+
step.result = result;
|
|
125
|
+
step.succeededAt = new Date();
|
|
126
|
+
step.updatedAt = new Date();
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async setStepError(stepId, error) {
|
|
132
|
+
for (const step of this.steps.values()) {
|
|
133
|
+
if (step.stepId === stepId) {
|
|
134
|
+
step.status = 'failed';
|
|
135
|
+
step.error = {
|
|
136
|
+
name: error.name,
|
|
137
|
+
message: error.message,
|
|
138
|
+
stack: error.stack,
|
|
139
|
+
};
|
|
140
|
+
step.failedAt = new Date();
|
|
141
|
+
step.updatedAt = new Date();
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async createRetryAttempt(failedStepId, status) {
|
|
147
|
+
// Find the failed step
|
|
148
|
+
let failedStep;
|
|
149
|
+
let runId;
|
|
150
|
+
let stepName;
|
|
151
|
+
for (const [key, step] of this.steps.entries()) {
|
|
152
|
+
if (step.stepId === failedStepId) {
|
|
153
|
+
failedStep = step;
|
|
154
|
+
const parts = key.split(':');
|
|
155
|
+
runId = parts[0];
|
|
156
|
+
stepName = parts.slice(1).join(':');
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!failedStep || !runId || !stepName) {
|
|
161
|
+
throw new Error(`Step not found: ${failedStepId}`);
|
|
162
|
+
}
|
|
163
|
+
const failedStepData = this.stepData.get(failedStepId);
|
|
164
|
+
const newStepId = randomUUID();
|
|
165
|
+
const now = new Date();
|
|
166
|
+
const newStep = {
|
|
167
|
+
stepId: newStepId,
|
|
168
|
+
status,
|
|
169
|
+
attemptCount: failedStep.attemptCount + 1,
|
|
170
|
+
retries: failedStep.retries,
|
|
171
|
+
retryDelay: failedStep.retryDelay,
|
|
172
|
+
createdAt: now,
|
|
173
|
+
updatedAt: now,
|
|
174
|
+
};
|
|
175
|
+
if (status === 'running') {
|
|
176
|
+
newStep.runningAt = now;
|
|
177
|
+
}
|
|
178
|
+
const key = `${runId}:${stepName}`;
|
|
179
|
+
this.steps.set(key, newStep);
|
|
180
|
+
// Copy step data to new step
|
|
181
|
+
if (failedStepData) {
|
|
182
|
+
this.stepData.set(newStepId, { ...failedStepData });
|
|
183
|
+
}
|
|
184
|
+
// Add to history
|
|
185
|
+
const history = this.stepHistory.get(runId) || [];
|
|
186
|
+
history.push({ ...newStep, stepName });
|
|
187
|
+
this.stepHistory.set(runId, history);
|
|
188
|
+
return newStep;
|
|
189
|
+
}
|
|
190
|
+
async withRunLock(_id, fn) {
|
|
191
|
+
// In-memory service doesn't need locking for inline execution
|
|
192
|
+
return fn();
|
|
193
|
+
}
|
|
194
|
+
async withStepLock(_runId, _stepName, fn) {
|
|
195
|
+
// In-memory service doesn't need locking for inline execution
|
|
196
|
+
return fn();
|
|
197
|
+
}
|
|
198
|
+
async close() {
|
|
199
|
+
// Clear all in-memory state
|
|
200
|
+
this.runs.clear();
|
|
201
|
+
this.steps.clear();
|
|
202
|
+
this.stepData.clear();
|
|
203
|
+
this.stepHistory.clear();
|
|
204
|
+
this.runState.clear();
|
|
205
|
+
this.branchKeys.clear();
|
|
206
|
+
this.workflowVersions.clear();
|
|
207
|
+
}
|
|
208
|
+
// Graph workflow methods
|
|
209
|
+
async getCompletedGraphState(runId) {
|
|
210
|
+
const completedNodeIds = [];
|
|
211
|
+
const failedNodeIds = [];
|
|
212
|
+
const prefix = `${runId}:`;
|
|
213
|
+
for (const [key, step] of this.steps.entries()) {
|
|
214
|
+
if (!key.startsWith(prefix))
|
|
215
|
+
continue;
|
|
216
|
+
const nodeId = key.substring(prefix.length);
|
|
217
|
+
if (step.status === 'succeeded') {
|
|
218
|
+
completedNodeIds.push(nodeId);
|
|
219
|
+
}
|
|
220
|
+
else if (step.status === 'failed') {
|
|
221
|
+
const maxAttempts = (step.retries ?? 0) + 1;
|
|
222
|
+
if (step.attemptCount >= maxAttempts) {
|
|
223
|
+
failedNodeIds.push(nodeId);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const branchKeys = {};
|
|
228
|
+
for (const [stepId, branchKey] of this.branchKeys.entries()) {
|
|
229
|
+
const stepData = this.stepData.get(stepId);
|
|
230
|
+
if (stepData) {
|
|
231
|
+
branchKeys[stepData.stepName] = branchKey;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { completedNodeIds, failedNodeIds, branchKeys };
|
|
235
|
+
}
|
|
236
|
+
async getNodesWithoutSteps(runId, nodeIds) {
|
|
237
|
+
const existingSteps = new Set();
|
|
238
|
+
const prefix = `${runId}:`;
|
|
239
|
+
for (const [key] of this.steps.entries()) {
|
|
240
|
+
if (key.startsWith(prefix)) {
|
|
241
|
+
existingSteps.add(key.substring(prefix.length));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return nodeIds.filter((id) => !existingSteps.has(id));
|
|
245
|
+
}
|
|
246
|
+
async getNodeResults(runId, nodeIds) {
|
|
247
|
+
const results = {};
|
|
248
|
+
for (const nodeId of nodeIds) {
|
|
249
|
+
const key = `${runId}:${nodeId}`;
|
|
250
|
+
const step = this.steps.get(key);
|
|
251
|
+
if (step?.result !== undefined) {
|
|
252
|
+
results[nodeId] = step.result;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return results;
|
|
256
|
+
}
|
|
257
|
+
async setBranchKey(runId, nodeId, branchKey) {
|
|
258
|
+
const key = `${runId}:${nodeId}`;
|
|
259
|
+
const step = this.steps.get(key);
|
|
260
|
+
if (step) {
|
|
261
|
+
this.branchKeys.set(step.stepId, branchKey);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async setBranchTaken(stepId, branchKey) {
|
|
265
|
+
this.branchKeys.set(stepId, branchKey);
|
|
266
|
+
}
|
|
267
|
+
async updateRunState(runId, name, value) {
|
|
268
|
+
const state = this.runState.get(runId) || {};
|
|
269
|
+
state[name] = value;
|
|
270
|
+
this.runState.set(runId, state);
|
|
271
|
+
}
|
|
272
|
+
async getRunState(runId) {
|
|
273
|
+
return this.runState.get(runId) || {};
|
|
274
|
+
}
|
|
275
|
+
async upsertWorkflowVersion(name, graphHash, graph, source) {
|
|
276
|
+
this.workflowVersions.set(`${name}:${graphHash}`, {
|
|
277
|
+
graph,
|
|
278
|
+
source,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
async getWorkflowVersion(name, graphHash) {
|
|
282
|
+
const version = this.workflowVersions.get(`${name}:${graphHash}`);
|
|
283
|
+
if (!version)
|
|
284
|
+
return null;
|
|
285
|
+
return { graph: version.graph, source: version.source };
|
|
286
|
+
}
|
|
287
|
+
}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module @pikku/core
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
4
|
+
export { LogLevel } from './logger.js';
|
|
5
|
+
export { ScopedSecretService } from './scoped-secret-service.js';
|
|
6
|
+
export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
|
|
7
|
+
export { TypedSecretService } from './typed-secret-service.js';
|
|
8
|
+
export { TypedVariablesService } from './typed-variables-service.js';
|
|
9
|
+
export { LocalSecretService } from './local-secrets.js';
|
|
10
|
+
export { LocalVariablesService } from './local-variables.js';
|
|
11
|
+
export { ConsoleLogger } from './logger-console.js';
|
|
12
|
+
export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
|
|
13
|
+
export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
14
|
+
export type { ContentService } from './content-service.js';
|
|
15
|
+
export type { JWTService } from './jwt-service.js';
|
|
16
|
+
export type { Logger } from './logger.js';
|
|
17
|
+
export type { SecretService } from './secret-service.js';
|
|
18
|
+
export type { VariablesService } from './variables-service.js';
|
|
19
|
+
export type { SchemaService } from './schema-service.js';
|
|
20
|
+
export type { SessionService } from './user-session-service.js';
|
|
21
|
+
export type { ScheduledTaskSummary, ScheduledTaskInfo, SchedulerRuntimeHandlers, SchedulerService, } from './scheduler-service.js';
|
|
22
|
+
export type { TriggerService } from './trigger-service.js';
|
|
23
|
+
export type { DeploymentService, DeploymentConfig, DeploymentInfo, DeploymentServiceConfig, } from './deployment-service.js';
|
|
24
|
+
export type { AIStorageService } from './ai-storage-service.js';
|
|
25
|
+
export type { AIAgentRunnerParams, AIAgentRunnerResult, AIAgentRunnerService, } from './ai-agent-runner-service.js';
|
|
26
|
+
export type { CreateRunInput, AIRunStateService, } from './ai-run-state-service.js';
|
|
27
|
+
export type { CredentialStatus, CredentialMeta, } from './typed-secret-service.js';
|
|
28
|
+
export type { VariableStatus, VariableMeta } from './typed-variables-service.js';
|
package/dist/services/index.js
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module @pikku/core
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
export * from './local-secrets.js';
|
|
15
|
-
export * from './local-variables.js';
|
|
16
|
-
export * from './logger-console.js';
|
|
4
|
+
export { LogLevel } from './logger.js';
|
|
5
|
+
export { ScopedSecretService } from './scoped-secret-service.js';
|
|
6
|
+
export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
|
|
7
|
+
export { TypedSecretService } from './typed-secret-service.js';
|
|
8
|
+
export { TypedVariablesService } from './typed-variables-service.js';
|
|
9
|
+
export { LocalSecretService } from './local-secrets.js';
|
|
10
|
+
export { LocalVariablesService } from './local-variables.js';
|
|
11
|
+
export { ConsoleLogger } from './logger-console.js';
|
|
12
|
+
export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
|
|
13
|
+
export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
@@ -2,15 +2,18 @@ import { SecretService } from './secret-service.js';
|
|
|
2
2
|
import { VariablesService } from './variables-service.js';
|
|
3
3
|
/**
|
|
4
4
|
* Service for retrieving secrets from environment variables.
|
|
5
|
+
* Supports storing secrets locally in memory for CLI operations.
|
|
5
6
|
*/
|
|
6
7
|
export declare class LocalSecretService implements SecretService {
|
|
7
8
|
private variables;
|
|
9
|
+
private localSecrets;
|
|
8
10
|
/**
|
|
9
11
|
* Creates an instance of LocalSecretService.
|
|
10
12
|
*/
|
|
11
13
|
constructor(variables?: VariablesService);
|
|
12
14
|
/**
|
|
13
15
|
* Retrieves a secret by key.
|
|
16
|
+
* Checks local storage first, then falls back to environment variables.
|
|
14
17
|
* @param key - The key of the secret to retrieve.
|
|
15
18
|
* @returns A promise that resolves to the secret value.
|
|
16
19
|
* @throws {Error} If the secret is not found.
|
|
@@ -18,9 +21,29 @@ export declare class LocalSecretService implements SecretService {
|
|
|
18
21
|
getSecretJSON<R>(key: string): Promise<R>;
|
|
19
22
|
/**
|
|
20
23
|
* Retrieves a secret by key.
|
|
24
|
+
* Checks local storage first, then falls back to environment variables.
|
|
21
25
|
* @param key - The key of the secret to retrieve.
|
|
22
26
|
* @returns A promise that resolves to the secret value.
|
|
23
27
|
* @throws {Error} If the secret is not found.
|
|
24
28
|
*/
|
|
25
29
|
getSecret(key: string): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Stores a JSON value as a secret in local storage.
|
|
32
|
+
* @param key - The key to store the secret under.
|
|
33
|
+
* @param value - The JSON value to store.
|
|
34
|
+
* @returns A promise that resolves when the secret is stored.
|
|
35
|
+
*/
|
|
36
|
+
setSecretJSON(key: string, value: unknown): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Checks if a secret exists without throwing.
|
|
39
|
+
* @param key - The key of the secret to check.
|
|
40
|
+
* @returns A promise that resolves to true if the secret exists.
|
|
41
|
+
*/
|
|
42
|
+
hasSecret(key: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Deletes a secret from local storage.
|
|
45
|
+
* @param key - The key of the secret to delete.
|
|
46
|
+
* @returns A promise that resolves when the secret is deleted.
|
|
47
|
+
*/
|
|
48
|
+
deleteSecret(key: string): Promise<void>;
|
|
26
49
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { LocalVariablesService } from './local-variables.js';
|
|
2
2
|
/**
|
|
3
3
|
* Service for retrieving secrets from environment variables.
|
|
4
|
+
* Supports storing secrets locally in memory for CLI operations.
|
|
4
5
|
*/
|
|
5
6
|
export class LocalSecretService {
|
|
6
7
|
variables;
|
|
8
|
+
localSecrets = new Map();
|
|
7
9
|
/**
|
|
8
10
|
* Creates an instance of LocalSecretService.
|
|
9
11
|
*/
|
|
@@ -12,11 +14,18 @@ export class LocalSecretService {
|
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
14
16
|
* Retrieves a secret by key.
|
|
17
|
+
* Checks local storage first, then falls back to environment variables.
|
|
15
18
|
* @param key - The key of the secret to retrieve.
|
|
16
19
|
* @returns A promise that resolves to the secret value.
|
|
17
20
|
* @throws {Error} If the secret is not found.
|
|
18
21
|
*/
|
|
19
22
|
async getSecretJSON(key) {
|
|
23
|
+
// Check local storage first
|
|
24
|
+
const localValue = this.localSecrets.get(key);
|
|
25
|
+
if (localValue) {
|
|
26
|
+
return JSON.parse(localValue);
|
|
27
|
+
}
|
|
28
|
+
// Fall back to environment variables
|
|
20
29
|
const value = await this.variables.get(key);
|
|
21
30
|
if (value) {
|
|
22
31
|
return JSON.parse(value);
|
|
@@ -25,15 +34,51 @@ export class LocalSecretService {
|
|
|
25
34
|
}
|
|
26
35
|
/**
|
|
27
36
|
* Retrieves a secret by key.
|
|
37
|
+
* Checks local storage first, then falls back to environment variables.
|
|
28
38
|
* @param key - The key of the secret to retrieve.
|
|
29
39
|
* @returns A promise that resolves to the secret value.
|
|
30
40
|
* @throws {Error} If the secret is not found.
|
|
31
41
|
*/
|
|
32
42
|
async getSecret(key) {
|
|
43
|
+
// Check local storage first
|
|
44
|
+
const localValue = this.localSecrets.get(key);
|
|
45
|
+
if (localValue) {
|
|
46
|
+
return localValue;
|
|
47
|
+
}
|
|
48
|
+
// Fall back to environment variables
|
|
33
49
|
const value = await this.variables.get(key);
|
|
34
50
|
if (value) {
|
|
35
51
|
return value;
|
|
36
52
|
}
|
|
37
53
|
throw new Error(`Secret Not Found: ${key}`);
|
|
38
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Stores a JSON value as a secret in local storage.
|
|
57
|
+
* @param key - The key to store the secret under.
|
|
58
|
+
* @param value - The JSON value to store.
|
|
59
|
+
* @returns A promise that resolves when the secret is stored.
|
|
60
|
+
*/
|
|
61
|
+
async setSecretJSON(key, value) {
|
|
62
|
+
this.localSecrets.set(key, JSON.stringify(value));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Checks if a secret exists without throwing.
|
|
66
|
+
* @param key - The key of the secret to check.
|
|
67
|
+
* @returns A promise that resolves to true if the secret exists.
|
|
68
|
+
*/
|
|
69
|
+
async hasSecret(key) {
|
|
70
|
+
if (this.localSecrets.has(key)) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
const value = await this.variables.get(key);
|
|
74
|
+
return value !== undefined && value !== null && value !== '';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Deletes a secret from local storage.
|
|
78
|
+
* @param key - The key of the secret to delete.
|
|
79
|
+
* @returns A promise that resolves when the secret is deleted.
|
|
80
|
+
*/
|
|
81
|
+
async deleteSecret(key) {
|
|
82
|
+
this.localSecrets.delete(key);
|
|
83
|
+
}
|
|
39
84
|
}
|
|
@@ -4,4 +4,9 @@ export declare class LocalVariablesService implements VariablesService {
|
|
|
4
4
|
constructor(variables?: Record<string, string | undefined>);
|
|
5
5
|
getAll(): Promise<Record<string, string | undefined>> | Record<string, string | undefined>;
|
|
6
6
|
get(name: string): Promise<string | undefined> | string | undefined;
|
|
7
|
+
getJSON<T = unknown>(name: string): T | undefined;
|
|
8
|
+
set(name: string, value: string): void;
|
|
9
|
+
setJSON(name: string, value: unknown): void;
|
|
10
|
+
has(name: string): boolean;
|
|
11
|
+
delete(name: string): void;
|
|
7
12
|
}
|
|
@@ -9,4 +9,22 @@ export class LocalVariablesService {
|
|
|
9
9
|
get(name) {
|
|
10
10
|
return this.variables[name];
|
|
11
11
|
}
|
|
12
|
+
getJSON(name) {
|
|
13
|
+
const value = this.variables[name];
|
|
14
|
+
if (value === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
return JSON.parse(value);
|
|
17
|
+
}
|
|
18
|
+
set(name, value) {
|
|
19
|
+
this.variables[name] = value;
|
|
20
|
+
}
|
|
21
|
+
setJSON(name, value) {
|
|
22
|
+
this.variables[name] = JSON.stringify(value);
|
|
23
|
+
}
|
|
24
|
+
has(name) {
|
|
25
|
+
return name in this.variables && this.variables[name] !== undefined;
|
|
26
|
+
}
|
|
27
|
+
delete(name) {
|
|
28
|
+
delete this.variables[name];
|
|
29
|
+
}
|
|
12
30
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { CoreUserSession } from '../types/core.types.js';
|
|
1
|
+
import type { CoreUserSession } from '../types/core.types.js';
|
|
2
|
+
import type { Logger } from './logger.js';
|
|
2
3
|
/**
|
|
3
4
|
* Minimal metadata for listing scheduled tasks
|
|
4
5
|
*/
|
|
@@ -21,6 +22,11 @@ export interface ScheduledTaskInfo extends ScheduledTaskSummary {
|
|
|
21
22
|
/** Task status */
|
|
22
23
|
status?: 'scheduled' | 'active' | 'completed' | 'failed';
|
|
23
24
|
}
|
|
25
|
+
export interface SchedulerRuntimeHandlers {
|
|
26
|
+
logger: Logger;
|
|
27
|
+
invokeRPC: (rpcName: string, data?: any, session?: CoreUserSession) => Promise<void>;
|
|
28
|
+
runScheduledTask: (name: string) => Promise<void>;
|
|
29
|
+
}
|
|
24
30
|
/**
|
|
25
31
|
* Abstract scheduler service for persistent scheduled task management
|
|
26
32
|
* Implementations use queue backends (pg-boss, BullMQ) for distributed scheduling
|
|
@@ -60,4 +66,18 @@ export declare abstract class SchedulerService {
|
|
|
60
66
|
* Close any open connections
|
|
61
67
|
*/
|
|
62
68
|
abstract close(): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Set services needed for processing recurring tasks.
|
|
71
|
+
* Called after construction since the scheduler is created before
|
|
72
|
+
* singletonServices are fully assembled.
|
|
73
|
+
*/
|
|
74
|
+
setServices(_handlers: SchedulerRuntimeHandlers): void;
|
|
75
|
+
/**
|
|
76
|
+
* Start recurring scheduled tasks
|
|
77
|
+
*/
|
|
78
|
+
start(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Stop recurring scheduled tasks
|
|
81
|
+
*/
|
|
82
|
+
stop(): Promise<void>;
|
|
63
83
|
}
|
|
@@ -3,4 +3,18 @@
|
|
|
3
3
|
* Implementations use queue backends (pg-boss, BullMQ) for distributed scheduling
|
|
4
4
|
*/
|
|
5
5
|
export class SchedulerService {
|
|
6
|
+
/**
|
|
7
|
+
* Set services needed for processing recurring tasks.
|
|
8
|
+
* Called after construction since the scheduler is created before
|
|
9
|
+
* singletonServices are fully assembled.
|
|
10
|
+
*/
|
|
11
|
+
setServices(_handlers) { }
|
|
12
|
+
/**
|
|
13
|
+
* Start recurring scheduled tasks
|
|
14
|
+
*/
|
|
15
|
+
async start() { }
|
|
16
|
+
/**
|
|
17
|
+
* Stop recurring scheduled tasks
|
|
18
|
+
*/
|
|
19
|
+
async stop() { }
|
|
6
20
|
}
|
|
@@ -21,4 +21,10 @@ export interface SchemaService {
|
|
|
21
21
|
* @returns {Set<string>} A set containing the names of all available schemas.
|
|
22
22
|
*/
|
|
23
23
|
getSchemaNames: () => Set<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Retrieves the property keys from a compiled JSON schema.
|
|
26
|
+
* @param {string} schemaName - The name of the schema.
|
|
27
|
+
* @returns {string[]} An array of property keys, or empty array if schema not found.
|
|
28
|
+
*/
|
|
29
|
+
getSchemaKeys: (schemaName: string) => string[];
|
|
24
30
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SecretService } from './secret-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* A read-only wrapper around SecretService that restricts access
|
|
4
|
+
* to only a defined set of allowed secret keys.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ScopedSecretService implements SecretService {
|
|
7
|
+
private secrets;
|
|
8
|
+
private allowedKeys;
|
|
9
|
+
constructor(secrets: SecretService, allowedKeys: Set<string>);
|
|
10
|
+
private assertAllowed;
|
|
11
|
+
getSecret(key: string): Promise<string>;
|
|
12
|
+
getSecretJSON<T = {}>(key: string): Promise<T>;
|
|
13
|
+
hasSecret(key: string): Promise<boolean>;
|
|
14
|
+
setSecretJSON(_key: string, _value: unknown): Promise<void>;
|
|
15
|
+
deleteSecret(_key: string): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A read-only wrapper around SecretService that restricts access
|
|
3
|
+
* to only a defined set of allowed secret keys.
|
|
4
|
+
*/
|
|
5
|
+
export class ScopedSecretService {
|
|
6
|
+
secrets;
|
|
7
|
+
allowedKeys;
|
|
8
|
+
constructor(secrets, allowedKeys) {
|
|
9
|
+
this.secrets = secrets;
|
|
10
|
+
this.allowedKeys = allowedKeys;
|
|
11
|
+
}
|
|
12
|
+
assertAllowed(key) {
|
|
13
|
+
if (!this.allowedKeys.has(key)) {
|
|
14
|
+
throw new Error(`Access denied to secret key: ${key}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async getSecret(key) {
|
|
18
|
+
this.assertAllowed(key);
|
|
19
|
+
return this.secrets.getSecret(key);
|
|
20
|
+
}
|
|
21
|
+
async getSecretJSON(key) {
|
|
22
|
+
this.assertAllowed(key);
|
|
23
|
+
return this.secrets.getSecretJSON(key);
|
|
24
|
+
}
|
|
25
|
+
async hasSecret(key) {
|
|
26
|
+
this.assertAllowed(key);
|
|
27
|
+
return this.secrets.hasSecret(key);
|
|
28
|
+
}
|
|
29
|
+
async setSecretJSON(_key, _value) {
|
|
30
|
+
throw new Error('setSecretJSON is not allowed in scoped secret service');
|
|
31
|
+
}
|
|
32
|
+
async deleteSecret(_key) {
|
|
33
|
+
throw new Error('deleteSecret is not allowed in scoped secret service');
|
|
34
|
+
}
|
|
35
|
+
}
|