@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,13 @@
|
|
|
1
1
|
import { SerializedError, CommonWireMeta } from '../../types/core.types.js';
|
|
2
2
|
import { CorePikkuFunctionConfig } from '../../function/functions.types.js';
|
|
3
3
|
export type { WorkflowService } from '../../services/workflow-service.js';
|
|
4
|
-
export type { WorkflowStepOptions, WorkflowWireDoRPC, WorkflowWireDoInline, WorkflowWireSleep, InputSource, OutputBinding, RpcStepMeta, SimpleCondition, Condition, BranchCase, BranchStepMeta, ParallelGroupStepMeta, FanoutStepMeta, ReturnStepMeta, InlineStepMeta, SleepStepMeta, CancelStepMeta, SetStepMeta, SwitchCaseMeta, SwitchStepMeta, FilterStepMeta, ArrayPredicateStepMeta, WorkflowStepMeta, WorkflowStepWire, PikkuWorkflowWire, } from './dsl/workflow-dsl.types.js';
|
|
4
|
+
export type { WorkflowStepOptions, WorkflowWireDoRPC, WorkflowWireDoInline, WorkflowWireSleep, WorkflowWireSuspend, InputSource, OutputBinding, RpcStepMeta, SimpleCondition, Condition, BranchCase, BranchStepMeta, ParallelGroupStepMeta, FanoutStepMeta, ReturnStepMeta, InlineStepMeta, SleepStepMeta, CancelStepMeta, SetStepMeta, SwitchCaseMeta, SwitchStepMeta, FilterStepMeta, ArrayPredicateStepMeta, WorkflowStepMeta, WorkflowStepWire, PikkuWorkflowWire, } from './dsl/workflow-dsl.types.js';
|
|
5
5
|
import type { WorkflowStepMeta } from './dsl/workflow-dsl.types.js';
|
|
6
|
+
export interface WorkflowRunWire {
|
|
7
|
+
type: string;
|
|
8
|
+
id?: string;
|
|
9
|
+
parentRunId?: string;
|
|
10
|
+
}
|
|
6
11
|
export interface WorkflowServiceConfig {
|
|
7
12
|
retries: number;
|
|
8
13
|
retryDelay: number;
|
|
@@ -10,99 +15,14 @@ export interface WorkflowServiceConfig {
|
|
|
10
15
|
stepWorkerQueueName: string;
|
|
11
16
|
sleeperRPCName: string;
|
|
12
17
|
}
|
|
13
|
-
/**
|
|
14
|
-
* HTTP wire configuration for workflows
|
|
15
|
-
*/
|
|
16
|
-
export interface WorkflowHTTPWire {
|
|
17
|
-
route: string;
|
|
18
|
-
method: 'get' | 'post' | 'put' | 'patch' | 'delete';
|
|
19
|
-
startNode: string;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Channel wire configuration for workflows
|
|
23
|
-
*/
|
|
24
|
-
export interface WorkflowChannelWire {
|
|
25
|
-
name: string;
|
|
26
|
-
onConnect?: string;
|
|
27
|
-
onDisconnect?: string;
|
|
28
|
-
onMessage?: string;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Queue wire configuration for workflows
|
|
32
|
-
*/
|
|
33
|
-
export interface WorkflowQueueWire {
|
|
34
|
-
name: string;
|
|
35
|
-
startNode: string;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* CLI wire configuration for workflows
|
|
39
|
-
*/
|
|
40
|
-
export interface WorkflowCliWire {
|
|
41
|
-
command: string;
|
|
42
|
-
startNode: string;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* MCP wire configurations for workflows
|
|
46
|
-
*/
|
|
47
|
-
export interface WorkflowMcpWires {
|
|
48
|
-
tool?: Array<{
|
|
49
|
-
name: string;
|
|
50
|
-
startNode: string;
|
|
51
|
-
}>;
|
|
52
|
-
prompt?: Array<{
|
|
53
|
-
name: string;
|
|
54
|
-
startNode: string;
|
|
55
|
-
}>;
|
|
56
|
-
resource?: Array<{
|
|
57
|
-
uri: string;
|
|
58
|
-
startNode: string;
|
|
59
|
-
}>;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Schedule wire configuration for workflows
|
|
63
|
-
*/
|
|
64
|
-
export interface WorkflowScheduleWire {
|
|
65
|
-
cron?: string;
|
|
66
|
-
interval?: string;
|
|
67
|
-
startNode: string;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Trigger wire configuration for workflows
|
|
71
|
-
*/
|
|
72
|
-
export interface WorkflowTriggerWire {
|
|
73
|
-
name: string;
|
|
74
|
-
startNode: string;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Wire configuration for workflows
|
|
78
|
-
* Defines how a workflow can be triggered
|
|
79
|
-
*/
|
|
80
|
-
export interface WorkflowWires {
|
|
81
|
-
/** API entry point - node ID for startWorkflow() calls */
|
|
82
|
-
api?: string;
|
|
83
|
-
/** HTTP triggers */
|
|
84
|
-
http?: WorkflowHTTPWire[];
|
|
85
|
-
/** Channel triggers */
|
|
86
|
-
channel?: WorkflowChannelWire[];
|
|
87
|
-
/** Queue triggers */
|
|
88
|
-
queue?: WorkflowQueueWire[];
|
|
89
|
-
/** CLI triggers */
|
|
90
|
-
cli?: WorkflowCliWire[];
|
|
91
|
-
/** MCP triggers (tool, prompt, resource) */
|
|
92
|
-
mcp?: WorkflowMcpWires;
|
|
93
|
-
/** Schedule triggers */
|
|
94
|
-
schedule?: WorkflowScheduleWire[];
|
|
95
|
-
/** Named trigger wires */
|
|
96
|
-
trigger?: WorkflowTriggerWire[];
|
|
97
|
-
}
|
|
98
18
|
/**
|
|
99
19
|
* Workflow run status
|
|
100
20
|
*/
|
|
101
|
-
export type WorkflowStatus = 'running' | 'completed' | 'failed' | 'cancelled';
|
|
21
|
+
export type WorkflowStatus = 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled';
|
|
102
22
|
/**
|
|
103
23
|
* Workflow step status
|
|
104
24
|
*/
|
|
105
|
-
export type StepStatus = 'pending' | 'running' | 'scheduled' | 'succeeded' | 'failed';
|
|
25
|
+
export type StepStatus = 'pending' | 'running' | 'scheduled' | 'succeeded' | 'failed' | 'suspended';
|
|
106
26
|
/**
|
|
107
27
|
* Workflow run representation
|
|
108
28
|
*/
|
|
@@ -121,6 +41,10 @@ export interface WorkflowRun {
|
|
|
121
41
|
error?: SerializedError;
|
|
122
42
|
/** If true, workflow executes inline without queues */
|
|
123
43
|
inline?: boolean;
|
|
44
|
+
/** Graph hash of the workflow definition at run creation time */
|
|
45
|
+
graphHash?: string;
|
|
46
|
+
/** Wire origin info (how this run was started) */
|
|
47
|
+
wire: WorkflowRunWire;
|
|
124
48
|
/** Creation timestamp */
|
|
125
49
|
createdAt: Date;
|
|
126
50
|
/** Last update timestamp */
|
|
@@ -157,6 +81,29 @@ export interface StepState {
|
|
|
157
81
|
/** Timestamp when step failed */
|
|
158
82
|
failedAt?: Date;
|
|
159
83
|
}
|
|
84
|
+
export interface WorkflowRunService {
|
|
85
|
+
listRuns(options?: {
|
|
86
|
+
workflowName?: string;
|
|
87
|
+
status?: string;
|
|
88
|
+
limit?: number;
|
|
89
|
+
offset?: number;
|
|
90
|
+
}): Promise<WorkflowRun[]>;
|
|
91
|
+
getRun(id: string): Promise<WorkflowRun | null>;
|
|
92
|
+
getRunSteps(runId: string): Promise<Array<StepState & {
|
|
93
|
+
stepName: string;
|
|
94
|
+
rpcName?: string;
|
|
95
|
+
data?: any;
|
|
96
|
+
}>>;
|
|
97
|
+
getRunHistory(runId: string): Promise<Array<StepState & {
|
|
98
|
+
stepName: string;
|
|
99
|
+
}>>;
|
|
100
|
+
getDistinctWorkflowNames(): Promise<string[]>;
|
|
101
|
+
getWorkflowVersion(name: string, graphHash: string): Promise<{
|
|
102
|
+
graph: any;
|
|
103
|
+
source: string;
|
|
104
|
+
} | null>;
|
|
105
|
+
deleteRun(id: string): Promise<boolean>;
|
|
106
|
+
}
|
|
160
107
|
/**
|
|
161
108
|
* Core workflow definition
|
|
162
109
|
*/
|
|
@@ -204,7 +151,7 @@ export type WorkflowContext = Record<string, ContextVariable>;
|
|
|
204
151
|
* Workflows metadata for inspector/CLI (DSL step-based format)
|
|
205
152
|
*/
|
|
206
153
|
export type WorkflowsMeta = Record<string, CommonWireMeta & {
|
|
207
|
-
|
|
154
|
+
name: string;
|
|
208
155
|
steps: WorkflowStepMeta[];
|
|
209
156
|
context?: WorkflowContext;
|
|
210
157
|
dsl?: boolean;
|
|
@@ -218,19 +165,19 @@ export interface WorkflowRuntimeMeta {
|
|
|
218
165
|
/** Workflow name (used as key in registrations) */
|
|
219
166
|
name: string;
|
|
220
167
|
/** Pikku function name (for execution) */
|
|
221
|
-
|
|
168
|
+
pikkuFuncId: string;
|
|
222
169
|
/** Source type: 'dsl' (serializable), 'complex' (has inline steps), 'graph' */
|
|
223
|
-
source
|
|
170
|
+
source: 'dsl' | 'complex' | 'graph';
|
|
224
171
|
/** Optional description */
|
|
225
172
|
description?: string;
|
|
226
173
|
/** Tags for organization */
|
|
227
174
|
tags?: string[];
|
|
228
|
-
/** Wires - how the workflow is triggered */
|
|
229
|
-
wires?: WorkflowWires;
|
|
230
175
|
/** Serialized nodes */
|
|
231
176
|
nodes?: Record<string, any>;
|
|
232
177
|
/** Entry node IDs for graph workflows (computed at build time) */
|
|
233
178
|
entryNodeIds?: string[];
|
|
179
|
+
/** Hash of graph topology (nodes, edges, input mappings) */
|
|
180
|
+
graphHash?: string;
|
|
234
181
|
}
|
|
235
182
|
/**
|
|
236
183
|
* Unified workflow runtime metadata map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pikku/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"author": "yasser.fadl@gmail.com",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -26,35 +26,33 @@
|
|
|
26
26
|
"./http": "./dist/wirings/http/index.js",
|
|
27
27
|
"./queue": "./dist/wirings/queue/index.js",
|
|
28
28
|
"./scheduler": "./dist/wirings/scheduler/index.js",
|
|
29
|
+
"./trigger": "./dist/wirings/trigger/index.js",
|
|
29
30
|
"./rpc": "./dist/wirings/rpc/index.js",
|
|
30
31
|
"./mcp": "./dist/wirings/mcp/index.js",
|
|
32
|
+
"./ai-agent": "./dist/wirings/ai-agent/index.js",
|
|
31
33
|
"./cli": "./dist/wirings/cli/index.js",
|
|
32
34
|
"./cli/channel": "./dist/wirings/cli/channel/index.js",
|
|
33
|
-
"./
|
|
35
|
+
"./node": "./dist/wirings/node/index.js",
|
|
36
|
+
"./secret": "./dist/wirings/secret/index.js",
|
|
37
|
+
"./variable": "./dist/wirings/variable/index.js",
|
|
38
|
+
"./oauth2": "./dist/wirings/oauth2/index.js",
|
|
34
39
|
"./errors": "./dist/errors/index.js",
|
|
35
40
|
"./services": "./dist/services/index.js",
|
|
36
41
|
"./services/local-content": "./dist/services/local-content.js",
|
|
37
|
-
"./
|
|
38
|
-
"./
|
|
42
|
+
"./services/gopass-secrets": "./dist/services/gopass-secrets.js",
|
|
43
|
+
"./schema": "./dist/schema.js"
|
|
39
44
|
},
|
|
40
45
|
"dependencies": {
|
|
41
|
-
"
|
|
46
|
+
"@standard-schema/spec": "^1.1.0",
|
|
47
|
+
"cookie": "^1.1.1",
|
|
42
48
|
"path-to-regexp": "^8.3.0",
|
|
43
49
|
"picoquery": "^2.5.0"
|
|
44
50
|
},
|
|
45
51
|
"devDependencies": {
|
|
46
|
-
"@types/node": "^24.10.
|
|
47
|
-
"tsx": "^4.
|
|
52
|
+
"@types/node": "^24.10.12",
|
|
53
|
+
"tsx": "^4.21.0",
|
|
48
54
|
"typescript": "^5.9"
|
|
49
55
|
},
|
|
50
|
-
"peerDependencies": {
|
|
51
|
-
"zod": "^4.0.0"
|
|
52
|
-
},
|
|
53
|
-
"peerDependenciesMeta": {
|
|
54
|
-
"zod": {
|
|
55
|
-
"optional": true
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
56
|
"engines": {
|
|
59
57
|
"node": ">=18"
|
|
60
58
|
}
|
package/run-tests.sh
CHANGED
|
@@ -34,6 +34,9 @@ files=($(find src -type f -name "*.test.ts"))
|
|
|
34
34
|
# Check if any files matched the pattern
|
|
35
35
|
if [ ${#files[@]} -eq 0 ]; then
|
|
36
36
|
echo "No test files found matching pattern: $pattern"
|
|
37
|
+
if [ "${STRICT_TEST_DISCOVERY}" = "1" ] || [ "${CI}" = "true" ]; then
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
37
40
|
exit 0
|
|
38
41
|
fi
|
|
39
42
|
|
|
@@ -50,4 +53,4 @@ if [ "$coverage_mode" = true ]; then
|
|
|
50
53
|
fi
|
|
51
54
|
|
|
52
55
|
# Execute the node command with the expanded list of files
|
|
53
|
-
$node_cmd "${files[@]}"
|
|
56
|
+
$node_cmd "${files[@]}"
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
const encoder = new TextEncoder()
|
|
2
|
+
const decoder = new TextDecoder()
|
|
3
|
+
|
|
4
|
+
const getSubtle = () => {
|
|
5
|
+
const crypto = globalThis.crypto
|
|
6
|
+
if (!crypto?.subtle) {
|
|
7
|
+
throw new Error('WebCrypto not available')
|
|
8
|
+
}
|
|
9
|
+
return crypto.subtle
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const base64Encode = (bytes: Uint8Array): string => {
|
|
13
|
+
if (typeof Buffer !== 'undefined') {
|
|
14
|
+
return Buffer.from(bytes).toString('base64')
|
|
15
|
+
}
|
|
16
|
+
let binary = ''
|
|
17
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
18
|
+
binary += String.fromCharCode(bytes[i]!)
|
|
19
|
+
}
|
|
20
|
+
return btoa(binary)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const base64Decode = (input: string): Uint8Array => {
|
|
24
|
+
if (typeof Buffer !== 'undefined') {
|
|
25
|
+
return new Uint8Array(Buffer.from(input, 'base64'))
|
|
26
|
+
}
|
|
27
|
+
const binary = atob(input)
|
|
28
|
+
const bytes = new Uint8Array(binary.length)
|
|
29
|
+
for (let i = 0; i < binary.length; i++) {
|
|
30
|
+
bytes[i] = binary.charCodeAt(i)
|
|
31
|
+
}
|
|
32
|
+
return bytes
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const toBase64Url = (bytes: Uint8Array): string => {
|
|
36
|
+
return base64Encode(bytes)
|
|
37
|
+
.replace(/\+/g, '-')
|
|
38
|
+
.replace(/\//g, '_')
|
|
39
|
+
.replace(/=+$/g, '')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const fromBase64Url = (input: string): Uint8Array => {
|
|
43
|
+
let base64 = input.replace(/-/g, '+').replace(/_/g, '/')
|
|
44
|
+
while (base64.length % 4 !== 0) base64 += '='
|
|
45
|
+
return base64Decode(base64)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const deriveKey = async (secret: string): Promise<CryptoKey> => {
|
|
49
|
+
const subtle = getSubtle()
|
|
50
|
+
const hash = await subtle.digest('SHA-256', encoder.encode(secret))
|
|
51
|
+
return subtle.importKey('raw', hash, { name: 'AES-GCM' }, false, [
|
|
52
|
+
'encrypt',
|
|
53
|
+
'decrypt',
|
|
54
|
+
])
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const encryptJSON = async (
|
|
58
|
+
secret: string,
|
|
59
|
+
value: unknown
|
|
60
|
+
): Promise<string> => {
|
|
61
|
+
const crypto = globalThis.crypto
|
|
62
|
+
if (!crypto?.getRandomValues) {
|
|
63
|
+
throw new Error('WebCrypto not available')
|
|
64
|
+
}
|
|
65
|
+
const subtle = getSubtle()
|
|
66
|
+
const iv = crypto.getRandomValues(new Uint8Array(12))
|
|
67
|
+
const key = await deriveKey(secret)
|
|
68
|
+
const plaintext = encoder.encode(JSON.stringify(value))
|
|
69
|
+
const encrypted = await subtle.encrypt(
|
|
70
|
+
{ name: 'AES-GCM', iv },
|
|
71
|
+
key,
|
|
72
|
+
plaintext
|
|
73
|
+
)
|
|
74
|
+
const cipherBytes = new Uint8Array(encrypted)
|
|
75
|
+
const out = new Uint8Array(iv.length + cipherBytes.length)
|
|
76
|
+
out.set(iv, 0)
|
|
77
|
+
out.set(cipherBytes, iv.length)
|
|
78
|
+
return toBase64Url(out)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export const decryptJSON = async <T>(
|
|
82
|
+
secret: string,
|
|
83
|
+
token: string
|
|
84
|
+
): Promise<T> => {
|
|
85
|
+
const subtle = getSubtle()
|
|
86
|
+
const data = fromBase64Url(token)
|
|
87
|
+
if (data.length < 13) {
|
|
88
|
+
throw new Error('Invalid encrypted payload')
|
|
89
|
+
}
|
|
90
|
+
const iv = data.slice(0, 12)
|
|
91
|
+
const ciphertext = data.slice(12)
|
|
92
|
+
const key = await deriveKey(secret)
|
|
93
|
+
const decrypted = await subtle.decrypt(
|
|
94
|
+
{ name: 'AES-GCM', iv },
|
|
95
|
+
key,
|
|
96
|
+
ciphertext
|
|
97
|
+
)
|
|
98
|
+
return JSON.parse(decoder.decode(new Uint8Array(decrypted))) as T
|
|
99
|
+
}
|
package/src/errors/errors.ts
CHANGED
|
@@ -9,6 +9,12 @@ addError(InvalidMiddlewareWireError, {
|
|
|
9
9
|
message: 'The middleware wire is invalid for the current wiring type.',
|
|
10
10
|
})
|
|
11
11
|
|
|
12
|
+
export class PikkuMissingMetaError extends PikkuError {}
|
|
13
|
+
addError(PikkuMissingMetaError, {
|
|
14
|
+
status: 500,
|
|
15
|
+
message: 'Required metadata is missing',
|
|
16
|
+
})
|
|
17
|
+
|
|
12
18
|
/**
|
|
13
19
|
* The server cannot or will not process the request due to client error (e.g., malformed request syntax).
|
|
14
20
|
* @group Error
|
|
@@ -345,3 +351,14 @@ addError(MaxComputeTimeReachedError, {
|
|
|
345
351
|
message:
|
|
346
352
|
'The server took too long to complete the request, reaching the maximum compute time allowed.',
|
|
347
353
|
})
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* A required schema was not found during validation.
|
|
357
|
+
* @group Error
|
|
358
|
+
*/
|
|
359
|
+
export class MissingSchemaError extends PikkuError {}
|
|
360
|
+
addError(MissingSchemaError, {
|
|
361
|
+
status: 500,
|
|
362
|
+
message:
|
|
363
|
+
'A required schema was not found. Ensure schema generation has been run.',
|
|
364
|
+
})
|
package/src/errors/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { test } from 'node:test'
|
|
2
2
|
import assert from 'node:assert'
|
|
3
3
|
import {
|
|
4
|
+
pikkuAuth,
|
|
4
5
|
pikkuPermission,
|
|
5
6
|
pikkuMiddleware,
|
|
6
7
|
pikkuPermissionFactory,
|
|
@@ -21,8 +22,8 @@ test('pikkuMiddleware returns the same function', async () => {
|
|
|
21
22
|
|
|
22
23
|
test('pikkuPermissionFactory creates a factory function', async () => {
|
|
23
24
|
const factory = pikkuPermissionFactory<{ role: string }>(({ role }) => {
|
|
24
|
-
return pikkuPermission(async ({ logger }, data, {
|
|
25
|
-
return (
|
|
25
|
+
return pikkuPermission(async ({ logger }, data, { session }) => {
|
|
26
|
+
return (session as any)?.role === role
|
|
26
27
|
})
|
|
27
28
|
})
|
|
28
29
|
|
|
@@ -67,3 +68,42 @@ test('pikkuMiddlewareFactory returns the same factory', async () => {
|
|
|
67
68
|
const wrappedFactory = pikkuMiddlewareFactory(originalFactory)
|
|
68
69
|
assert.strictEqual(wrappedFactory, originalFactory)
|
|
69
70
|
})
|
|
71
|
+
|
|
72
|
+
test('pikkuAuth returns a 3-arg wrapper function', async () => {
|
|
73
|
+
const authFn = async (_services, session) => !!session
|
|
74
|
+
const wrapped = pikkuAuth(authFn)
|
|
75
|
+
assert.strictEqual(typeof wrapped, 'function')
|
|
76
|
+
assert.strictEqual(wrapped.length, 3)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
test('pikkuAuth wrapper extracts session from wire and calls auth function', async () => {
|
|
80
|
+
let receivedSession = null
|
|
81
|
+
const authFn = async (_services, session) => {
|
|
82
|
+
receivedSession = session
|
|
83
|
+
return session.role === 'admin'
|
|
84
|
+
}
|
|
85
|
+
const wrapped = pikkuAuth(authFn)
|
|
86
|
+
const result = await wrapped({}, null, { session: { role: 'admin' } })
|
|
87
|
+
assert.strictEqual(result, true)
|
|
88
|
+
assert.deepStrictEqual(receivedSession, { role: 'admin' })
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
test('pikkuAuth wrapper returns false when no session', async () => {
|
|
92
|
+
const authFn = async (_services, session) => !!session
|
|
93
|
+
const wrapped = pikkuAuth(authFn)
|
|
94
|
+
const result = await wrapped({}, null, { session: null })
|
|
95
|
+
assert.strictEqual(result, false)
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
test('pikkuAuth config object syntax works', async () => {
|
|
99
|
+
const authFn = async (_services, session) => !!session
|
|
100
|
+
const wrapped = pikkuAuth({
|
|
101
|
+
func: authFn,
|
|
102
|
+
name: 'Is Authenticated',
|
|
103
|
+
description: 'Checks if user has a session',
|
|
104
|
+
})
|
|
105
|
+
assert.strictEqual(typeof wrapped, 'function')
|
|
106
|
+
assert.strictEqual(wrapped.length, 3)
|
|
107
|
+
const result = await wrapped({}, null, { session: { id: '1' } })
|
|
108
|
+
assert.strictEqual(result, true)
|
|
109
|
+
})
|
|
@@ -22,7 +22,7 @@ const addTestFunction = (funcName: string, funcConfig: any) => {
|
|
|
22
22
|
? funcConfig.tags.map((tag: string) => ({ type: 'tag' as const, tag }))
|
|
23
23
|
: undefined
|
|
24
24
|
pikkuState(null, 'function', 'meta')[funcName] = {
|
|
25
|
-
|
|
25
|
+
pikkuFuncId: funcName,
|
|
26
26
|
inputSchemaName: null,
|
|
27
27
|
outputSchemaName: null,
|
|
28
28
|
middleware,
|
|
@@ -152,14 +152,8 @@ describe('runPikkuFunc - Integration Tests', () => {
|
|
|
152
152
|
)
|
|
153
153
|
|
|
154
154
|
assert.equal(result, 'success')
|
|
155
|
-
// Order: wiringTags →
|
|
156
|
-
assert.deepEqual(executionOrder, [
|
|
157
|
-
'wiringTag',
|
|
158
|
-
'wiringPermission',
|
|
159
|
-
'funcTag',
|
|
160
|
-
'funcPermission',
|
|
161
|
-
'main',
|
|
162
|
-
])
|
|
155
|
+
// Order: wiringTags → main (short-circuit on first passing group)
|
|
156
|
+
assert.deepEqual(executionOrder, ['wiringTag', 'main'])
|
|
163
157
|
})
|
|
164
158
|
|
|
165
159
|
test('should throw specific error for wiring tag permission failures', async () => {
|
|
@@ -340,11 +334,10 @@ describe('runPikkuFunc - Integration Tests', () => {
|
|
|
340
334
|
)
|
|
341
335
|
|
|
342
336
|
assert.equal(result, 'success')
|
|
343
|
-
// Should execute tag permissions
|
|
337
|
+
// Should execute tag permissions and short-circuit before function permissions
|
|
344
338
|
assert.deepEqual(executionOrder, [
|
|
345
339
|
'arrayPermission1',
|
|
346
340
|
'arrayPermission2',
|
|
347
|
-
'objectPermission',
|
|
348
341
|
'main',
|
|
349
342
|
])
|
|
350
343
|
})
|