@pikku/core 0.12.2 → 0.12.4
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 +24 -0
- package/dist/crypto-utils.d.ts +10 -0
- package/dist/crypto-utils.js +62 -0
- package/dist/function/function-runner.js +4 -4
- package/dist/function/functions.types.d.ts +26 -1
- package/dist/function/functions.types.js +16 -0
- package/dist/handle-error.d.ts +1 -1
- package/dist/handle-error.js +7 -3
- package/dist/index.d.ts +14 -2
- package/dist/index.js +1 -1
- package/dist/pikku-state.js +3 -1
- package/dist/schema.js +1 -1
- package/dist/services/in-memory-workflow-service.d.ts +22 -3
- package/dist/services/in-memory-workflow-service.js +77 -1
- package/dist/services/workflow-service.d.ts +8 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +1 -0
- package/dist/testing/service-tests.d.ts +31 -0
- package/dist/testing/service-tests.js +598 -0
- package/dist/types/core.types.d.ts +9 -1
- package/dist/types/state.types.d.ts +4 -2
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.js +23 -0
- package/dist/wirings/ai-agent/agent-dynamic-workflow.d.ts +6 -0
- package/dist/wirings/ai-agent/agent-dynamic-workflow.js +348 -0
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +1 -1
- package/dist/wirings/ai-agent/ai-agent-memory.js +6 -5
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -7
- package/dist/wirings/ai-agent/ai-agent-prepare.js +127 -47
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +4 -0
- package/dist/wirings/ai-agent/ai-agent-runner.js +381 -27
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +7 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +109 -46
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +22 -1
- package/dist/wirings/ai-agent/index.d.ts +1 -2
- package/dist/wirings/ai-agent/index.js +1 -2
- package/dist/wirings/channel/channel-handler.js +5 -1
- package/dist/wirings/channel/channel.types.d.ts +1 -7
- package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-handler.js +5 -3
- package/dist/wirings/channel/local/local-channel-runner.js +14 -4
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +4 -1
- package/dist/wirings/cli/cli-runner.js +10 -2
- package/dist/wirings/cli/cli.types.d.ts +1 -0
- package/dist/wirings/http/http-routes.js +0 -1
- package/dist/wirings/http/http-runner.d.ts +1 -1
- package/dist/wirings/http/http-runner.js +25 -3
- package/dist/wirings/http/http.types.d.ts +3 -11
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +3 -0
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +4 -4
- package/dist/wirings/http/web-request.d.ts +12 -0
- package/dist/wirings/http/web-request.js +85 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.js +1 -1
- package/dist/wirings/mcp/mcp-runner.js +13 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +30 -6
- package/dist/wirings/rpc/rpc-runner.js +36 -14
- package/dist/wirings/rpc/rpc-types.d.ts +6 -1
- package/dist/wirings/rpc/wire-addon.d.ts +1 -0
- package/dist/wirings/rpc/wire-addon.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.js +1 -0
- package/dist/wirings/workflow/graph/graph-validation.d.ts +3 -0
- package/dist/wirings/workflow/graph/graph-validation.js +175 -0
- package/dist/wirings/workflow/graph/index.d.ts +1 -0
- package/dist/wirings/workflow/graph/index.js +1 -0
- package/dist/wirings/workflow/index.d.ts +1 -1
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +8 -2
- package/dist/wirings/workflow/pikku-workflow-service.js +1 -2
- package/dist/wirings/workflow/workflow.types.d.ts +10 -1
- package/lcov.info +18891 -0
- package/package.json +4 -2
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +0 -168
- package/src/crypto-utils.test.ts +0 -116
- package/src/crypto-utils.ts +0 -99
- package/src/errors/error-handler.ts +0 -62
- package/src/errors/error.test.ts +0 -195
- package/src/errors/errors.ts +0 -374
- package/src/errors/index.ts +0 -2
- package/src/factory-functions.test.ts +0 -109
- package/src/function/function-runner.test.ts +0 -536
- package/src/function/function-runner.ts +0 -365
- package/src/function/functions.types.ts +0 -267
- package/src/function/index.ts +0 -5
- package/src/handle-error.test.ts +0 -361
- package/src/handle-error.ts +0 -65
- package/src/index.ts +0 -104
- package/src/internal.ts +0 -6
- package/src/middleware/auth-apikey.test.ts +0 -363
- package/src/middleware/auth-apikey.ts +0 -47
- package/src/middleware/auth-bearer.test.ts +0 -450
- package/src/middleware/auth-bearer.ts +0 -72
- package/src/middleware/auth-cookie.test.ts +0 -528
- package/src/middleware/auth-cookie.ts +0 -80
- package/src/middleware/cors.test.ts +0 -424
- package/src/middleware/cors.ts +0 -104
- package/src/middleware/index.ts +0 -5
- package/src/middleware/remote-auth.test.ts +0 -488
- package/src/middleware/remote-auth.ts +0 -68
- package/src/middleware/timeout.ts +0 -15
- package/src/middleware-runner.test.ts +0 -418
- package/src/middleware-runner.ts +0 -234
- package/src/permissions.test.ts +0 -434
- package/src/permissions.ts +0 -319
- package/src/pikku-request.ts +0 -23
- package/src/pikku-response.ts +0 -5
- package/src/pikku-state.test.ts +0 -224
- package/src/pikku-state.ts +0 -214
- package/src/run-tests-script.test.ts +0 -49
- package/src/schema.test.ts +0 -249
- package/src/schema.ts +0 -151
- package/src/services/ai-agent-runner-service.ts +0 -41
- package/src/services/ai-run-state-service.ts +0 -20
- package/src/services/ai-storage-service.ts +0 -39
- package/src/services/content-service.ts +0 -76
- package/src/services/deployment-service.ts +0 -22
- package/src/services/gateway-service.ts +0 -20
- package/src/services/gopass-secrets.ts +0 -98
- package/src/services/in-memory-ai-run-state-service.ts +0 -73
- package/src/services/in-memory-trigger-service.ts +0 -64
- package/src/services/in-memory-workflow-service.test.ts +0 -351
- package/src/services/in-memory-workflow-service.ts +0 -395
- package/src/services/index.ts +0 -56
- package/src/services/jwt-service.ts +0 -30
- package/src/services/local-content.ts +0 -120
- package/src/services/local-gateway-service.ts +0 -62
- package/src/services/local-secrets.test.ts +0 -80
- package/src/services/local-secrets.ts +0 -94
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -39
- package/src/services/logger-console.test.ts +0 -118
- package/src/services/logger-console.ts +0 -98
- package/src/services/logger.ts +0 -57
- package/src/services/scheduler-service.ts +0 -86
- package/src/services/schema-service.ts +0 -33
- package/src/services/scoped-secret-service.test.ts +0 -74
- package/src/services/scoped-secret-service.ts +0 -41
- package/src/services/secret-service.ts +0 -38
- package/src/services/trigger-service.ts +0 -17
- package/src/services/typed-secret-service.test.ts +0 -93
- package/src/services/typed-secret-service.ts +0 -70
- package/src/services/typed-variables-service.test.ts +0 -73
- package/src/services/typed-variables-service.ts +0 -81
- package/src/services/user-session-service.test.ts +0 -113
- package/src/services/user-session-service.ts +0 -86
- package/src/services/variables-service.ts +0 -11
- package/src/services/workflow-service.ts +0 -84
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -107
- package/src/types/core.types.ts +0 -470
- package/src/types/state.types.ts +0 -186
- package/src/utils.test.ts +0 -350
- package/src/utils.ts +0 -129
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +0 -363
- package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +0 -238
- package/src/wirings/ai-agent/ai-agent-helpers.test.ts +0 -152
- package/src/wirings/ai-agent/ai-agent-helpers.ts +0 -76
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -309
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +0 -115
- package/src/wirings/ai-agent/ai-agent-model-config.ts +0 -43
- package/src/wirings/ai-agent/ai-agent-prepare.ts +0 -522
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +0 -37
- package/src/wirings/ai-agent/ai-agent-registry.ts +0 -82
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +0 -317
- package/src/wirings/ai-agent/ai-agent-runner.ts +0 -251
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +0 -652
- package/src/wirings/ai-agent/ai-agent-stream.ts +0 -1060
- package/src/wirings/ai-agent/ai-agent.types.ts +0 -360
- package/src/wirings/ai-agent/index.ts +0 -41
- package/src/wirings/channel/channel-common.ts +0 -90
- package/src/wirings/channel/channel-handler.ts +0 -241
- package/src/wirings/channel/channel-middleware-runner.ts +0 -120
- package/src/wirings/channel/channel-runner.ts +0 -166
- package/src/wirings/channel/channel-store.ts +0 -29
- package/src/wirings/channel/channel.types.ts +0 -178
- package/src/wirings/channel/define-channel-routes.ts +0 -25
- package/src/wirings/channel/eventhub-service.ts +0 -34
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -24
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -79
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -215
- package/src/wirings/channel/local/local-channel-runner.ts +0 -200
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -95
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -101
- package/src/wirings/channel/log-channels.ts +0 -20
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -54
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -45
- package/src/wirings/channel/serverless/index.ts +0 -5
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -286
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -136
- package/src/wirings/cli/channel/index.ts +0 -1
- package/src/wirings/cli/cli-runner.test.ts +0 -403
- package/src/wirings/cli/cli-runner.ts +0 -519
- package/src/wirings/cli/cli.types.ts +0 -357
- package/src/wirings/cli/command-parser.test.ts +0 -445
- package/src/wirings/cli/command-parser.ts +0 -504
- package/src/wirings/cli/define-cli-commands.ts +0 -24
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/gateway/gateway-runner.test.ts +0 -474
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -149
- package/src/wirings/gateway/index.ts +0 -13
- package/src/wirings/http/http-routes.test.ts +0 -322
- package/src/wirings/http/http-routes.ts +0 -198
- package/src/wirings/http/http-runner.test.ts +0 -144
- package/src/wirings/http/http-runner.ts +0 -563
- package/src/wirings/http/http.types.ts +0 -378
- package/src/wirings/http/index.ts +0 -25
- package/src/wirings/http/log-http-routes.ts +0 -22
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -237
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -166
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -82
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -147
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -319
- package/src/wirings/http/routers/path-to-regex.ts +0 -126
- package/src/wirings/mcp/index.ts +0 -27
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -389
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.ts +0 -305
- package/src/wirings/mcp/mcp.types.ts +0 -216
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -3
- package/src/wirings/oauth2/oauth2-client.test.ts +0 -929
- package/src/wirings/oauth2/oauth2-client.ts +0 -335
- package/src/wirings/oauth2/oauth2.types.ts +0 -69
- package/src/wirings/oauth2/wire-oauth2-credential.ts +0 -23
- package/src/wirings/queue/index.ts +0 -31
- package/src/wirings/queue/queue-runner.test.ts +0 -710
- package/src/wirings/queue/queue-runner.ts +0 -192
- package/src/wirings/queue/queue.types.ts +0 -189
- package/src/wirings/queue/register-queue-helper.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -116
- package/src/wirings/rpc/index.ts +0 -4
- package/src/wirings/rpc/rpc-runner.ts +0 -439
- package/src/wirings/rpc/rpc-types.ts +0 -51
- package/src/wirings/rpc/wire-addon.ts +0 -20
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -20
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -660
- package/src/wirings/scheduler/scheduler-runner.ts +0 -132
- package/src/wirings/scheduler/scheduler.types.ts +0 -53
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -32
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -140
- package/src/wirings/secret/validate-secret-definitions.ts +0 -82
- package/src/wirings/trigger/index.ts +0 -10
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -112
- package/src/wirings/trigger/trigger-runner.test.ts +0 -79
- package/src/wirings/trigger/trigger-runner.ts +0 -135
- package/src/wirings/trigger/trigger.types.ts +0 -178
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -91
- package/src/wirings/variable/validate-variable-definitions.ts +0 -69
- package/src/wirings/variable/variable.types.ts +0 -22
- package/src/wirings/workflow/dsl/index.ts +0 -31
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -320
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -28
- package/src/wirings/workflow/graph/graph-node.ts +0 -222
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -487
- package/src/wirings/workflow/graph/graph-runner.ts +0 -816
- package/src/wirings/workflow/graph/index.ts +0 -14
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -29
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -104
- package/src/wirings/workflow/index.ts +0 -81
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -200
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1165
- package/src/wirings/workflow/workflow-helpers.test.ts +0 -129
- package/src/wirings/workflow/workflow-helpers.ts +0 -79
- package/src/wirings/workflow/workflow.types.ts +0 -266
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
continueGraph,
|
|
3
|
-
executeGraphStep,
|
|
4
|
-
onGraphNodeComplete,
|
|
5
|
-
runFromMeta,
|
|
6
|
-
runWorkflowGraph,
|
|
7
|
-
} from './graph-runner.js'
|
|
8
|
-
export { template } from './template.js'
|
|
9
|
-
export type { TemplateString } from './template.js'
|
|
10
|
-
export {
|
|
11
|
-
pikkuWorkflowGraph,
|
|
12
|
-
type PikkuWorkflowGraphConfig,
|
|
13
|
-
type PikkuWorkflowGraphResult,
|
|
14
|
-
} from './wire-workflow-graph.js'
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert'
|
|
3
|
-
import { template } from './template.js'
|
|
4
|
-
|
|
5
|
-
describe('template', () => {
|
|
6
|
-
test('should parse a simple template with one placeholder', () => {
|
|
7
|
-
const result = template('Hello $0!', [{ $ref: 'greeting' }])
|
|
8
|
-
assert.deepStrictEqual(result.$template.parts, ['Hello ', '!'])
|
|
9
|
-
assert.deepStrictEqual(result.$template.expressions, [{ $ref: 'greeting' }])
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
test('should parse template with multiple placeholders', () => {
|
|
13
|
-
const result = template('$0 and $1', [{ $ref: 'a' }, { $ref: 'b' }])
|
|
14
|
-
assert.deepStrictEqual(result.$template.parts, ['', ' and ', ''])
|
|
15
|
-
assert.strictEqual(result.$template.expressions.length, 2)
|
|
16
|
-
assert.strictEqual(result.$template.expressions[0].$ref, 'a')
|
|
17
|
-
assert.strictEqual(result.$template.expressions[1].$ref, 'b')
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
test('should preserve path in references', () => {
|
|
21
|
-
const result = template('Value: $0', [{ $ref: 'node1', path: 'data.name' }])
|
|
22
|
-
assert.deepStrictEqual(result.$template.expressions[0], {
|
|
23
|
-
$ref: 'node1',
|
|
24
|
-
path: 'data.name',
|
|
25
|
-
})
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
test('should handle template with no placeholders', () => {
|
|
29
|
-
const result = template('No placeholders here', [])
|
|
30
|
-
assert.deepStrictEqual(result.$template.parts, ['No placeholders here'])
|
|
31
|
-
assert.deepStrictEqual(result.$template.expressions, [])
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
test('should handle out-of-range ref index as unknown', () => {
|
|
35
|
-
const result = template('$5', [{ $ref: 'a' }])
|
|
36
|
-
assert.deepStrictEqual(result.$template.expressions[0], { $ref: 'unknown' })
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
test('should handle adjacent placeholders', () => {
|
|
40
|
-
const result = template('$0$1', [{ $ref: 'a' }, { $ref: 'b' }])
|
|
41
|
-
assert.deepStrictEqual(result.$template.parts, ['', '', ''])
|
|
42
|
-
assert.strictEqual(result.$template.expressions.length, 2)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
test('should omit path when not provided', () => {
|
|
46
|
-
const result = template('$0', [{ $ref: 'node' }])
|
|
47
|
-
assert.strictEqual(result.$template.expressions[0].path, undefined)
|
|
48
|
-
})
|
|
49
|
-
})
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export type TemplateString = {
|
|
2
|
-
$template: {
|
|
3
|
-
parts: string[]
|
|
4
|
-
expressions: Array<{ $ref: string; path?: string }>
|
|
5
|
-
}
|
|
6
|
-
} & { __brand: 'TemplateString' }
|
|
7
|
-
|
|
8
|
-
export function template(
|
|
9
|
-
templateStr: string,
|
|
10
|
-
refs: Array<{ $ref: string; path?: string }>
|
|
11
|
-
): TemplateString {
|
|
12
|
-
const parts: string[] = []
|
|
13
|
-
const expressions: Array<{ $ref: string; path?: string }> = []
|
|
14
|
-
|
|
15
|
-
const regex = /\$(\d+)/g
|
|
16
|
-
let lastIndex = 0
|
|
17
|
-
let match
|
|
18
|
-
|
|
19
|
-
while ((match = regex.exec(templateStr)) !== null) {
|
|
20
|
-
parts.push(templateStr.slice(lastIndex, match.index))
|
|
21
|
-
|
|
22
|
-
const refIndex = parseInt(match[1]!, 10)
|
|
23
|
-
const refValue = refs[refIndex]
|
|
24
|
-
if (refValue) {
|
|
25
|
-
const expr: { $ref: string; path?: string } = { $ref: refValue.$ref }
|
|
26
|
-
if (refValue.path) {
|
|
27
|
-
expr.path = refValue.path
|
|
28
|
-
}
|
|
29
|
-
expressions.push(expr)
|
|
30
|
-
} else {
|
|
31
|
-
expressions.push({ $ref: 'unknown' })
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
lastIndex = regex.lastIndex
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
parts.push(templateStr.slice(lastIndex))
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
$template: { parts, expressions },
|
|
41
|
-
} as TemplateString
|
|
42
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export interface PikkuWorkflowGraphConfig<
|
|
2
|
-
FuncMap extends Record<string, string>,
|
|
3
|
-
T,
|
|
4
|
-
> {
|
|
5
|
-
disabled?: true
|
|
6
|
-
name?: string
|
|
7
|
-
description?: string
|
|
8
|
-
tags?: string[]
|
|
9
|
-
nodes: FuncMap
|
|
10
|
-
config?: T
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface PikkuWorkflowGraphResult {
|
|
14
|
-
__type: 'pikkuWorkflowGraph'
|
|
15
|
-
name?: string
|
|
16
|
-
description?: string
|
|
17
|
-
tags?: string[]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function pikkuWorkflowGraph<
|
|
21
|
-
const FuncMap extends Record<string, string>,
|
|
22
|
-
>(config: PikkuWorkflowGraphConfig<FuncMap, any>): PikkuWorkflowGraphResult {
|
|
23
|
-
return {
|
|
24
|
-
__type: 'pikkuWorkflowGraph',
|
|
25
|
-
name: config.name,
|
|
26
|
-
description: config.description,
|
|
27
|
-
tags: config.tags,
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ref value - internal representation after input callback is evaluated
|
|
3
|
-
*/
|
|
4
|
-
export interface RefValue {
|
|
5
|
-
__isRef: true
|
|
6
|
-
nodeId: string
|
|
7
|
-
path?: string
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Helper to create a ref value
|
|
12
|
-
*/
|
|
13
|
-
export const createRef = (nodeId: string, path?: string): RefValue => ({
|
|
14
|
-
__isRef: true,
|
|
15
|
-
nodeId,
|
|
16
|
-
path,
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Check if a value is a ref
|
|
21
|
-
*/
|
|
22
|
-
export const isRef = (value: unknown): value is RefValue =>
|
|
23
|
-
typeof value === 'object' &&
|
|
24
|
-
value !== null &&
|
|
25
|
-
'__isRef' in value &&
|
|
26
|
-
(value as RefValue).__isRef === true
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Input reference for fetching step results
|
|
30
|
-
*/
|
|
31
|
-
export interface InputRef {
|
|
32
|
-
nodeId: string
|
|
33
|
-
path?: string
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Ref function type - provides type-safe references to other nodes' outputs
|
|
38
|
-
* The actual typing is done at the pikkuWorkflowGraph level
|
|
39
|
-
*/
|
|
40
|
-
export type RefFn<NodeIds extends string = string> = (
|
|
41
|
-
nodeId: NodeIds,
|
|
42
|
-
path?: string
|
|
43
|
-
) => RefValue
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Next node configuration - fully serializable
|
|
47
|
-
* - string: single next node
|
|
48
|
-
* - string[]: parallel execution (all run concurrently)
|
|
49
|
-
* - Record<string, string | string[]>: branching (function calls graph.branch('key'))
|
|
50
|
-
*/
|
|
51
|
-
export type NextConfig<NodeIds extends string = string> =
|
|
52
|
-
| NodeIds
|
|
53
|
-
| NodeIds[]
|
|
54
|
-
| Record<string, NodeIds | NodeIds[]>
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Graph node configuration - references functions by RPC name
|
|
58
|
-
*/
|
|
59
|
-
export interface GraphNodeConfig<NodeIds extends string = string> {
|
|
60
|
-
/** RPC function name */
|
|
61
|
-
func: string
|
|
62
|
-
/** Input mapping callback - receives ref function, returns input object */
|
|
63
|
-
input?: (ref: RefFn<NodeIds>) => Record<string, unknown>
|
|
64
|
-
/** Next nodes - string, array, or record for branching */
|
|
65
|
-
next?: NextConfig<NodeIds>
|
|
66
|
-
/** Error routing - node(s) to execute on error */
|
|
67
|
-
onError?: NodeIds | NodeIds[]
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Graph wire context - available to functions running in a workflow graph
|
|
72
|
-
*/
|
|
73
|
-
export interface PikkuGraphWire {
|
|
74
|
-
/** Workflow run ID */
|
|
75
|
-
runId: string
|
|
76
|
-
/** Graph name */
|
|
77
|
-
graphName: string
|
|
78
|
-
/** Current node ID */
|
|
79
|
-
nodeId: string
|
|
80
|
-
/**
|
|
81
|
-
* Select which branch to take for Record-based next config.
|
|
82
|
-
* Must be called if the node has a Record `next` configuration.
|
|
83
|
-
* @param key - The branch key to take (must match a key in the next Record)
|
|
84
|
-
*/
|
|
85
|
-
branch: (key: string) => void
|
|
86
|
-
/**
|
|
87
|
-
* Set a state variable value.
|
|
88
|
-
* @param name - Variable name
|
|
89
|
-
* @param value - Value to store
|
|
90
|
-
*/
|
|
91
|
-
setState: (name: string, value: unknown) => Promise<void>
|
|
92
|
-
/**
|
|
93
|
-
* Get the entire state object.
|
|
94
|
-
* @returns The state object with all variables
|
|
95
|
-
*/
|
|
96
|
-
getState: () => Promise<Record<string, unknown>>
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Internal mutable state for graph wire (used by runner to capture branch)
|
|
101
|
-
*/
|
|
102
|
-
export interface GraphWireState {
|
|
103
|
-
branchKey?: string
|
|
104
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workflow module exports
|
|
3
|
-
*/
|
|
4
|
-
export {
|
|
5
|
-
PikkuWorkflowService,
|
|
6
|
-
WorkflowCancelledException,
|
|
7
|
-
WorkflowSuspendedException,
|
|
8
|
-
WorkflowNotFoundError,
|
|
9
|
-
WorkflowRunNotFoundError,
|
|
10
|
-
} from './pikku-workflow-service.js'
|
|
11
|
-
|
|
12
|
-
// Internal registration functions (used by generated code)
|
|
13
|
-
export { addWorkflow } from './dsl/workflow-runner.js'
|
|
14
|
-
|
|
15
|
-
// Graph helpers (template, pikkuWorkflowGraph)
|
|
16
|
-
export { template, type TemplateString } from './graph/template.js'
|
|
17
|
-
export {
|
|
18
|
-
pikkuWorkflowGraph,
|
|
19
|
-
type PikkuWorkflowGraphConfig,
|
|
20
|
-
type PikkuWorkflowGraphResult,
|
|
21
|
-
} from './graph/wire-workflow-graph.js'
|
|
22
|
-
|
|
23
|
-
// Workflow helpers (runtime factories for HTTP handlers)
|
|
24
|
-
export {
|
|
25
|
-
workflow,
|
|
26
|
-
workflowStart,
|
|
27
|
-
workflowStatus,
|
|
28
|
-
graphStart,
|
|
29
|
-
} from './workflow-helpers.js'
|
|
30
|
-
|
|
31
|
-
// Re-export all types from workflow.types
|
|
32
|
-
export type {
|
|
33
|
-
WorkflowService,
|
|
34
|
-
WorkflowServiceConfig,
|
|
35
|
-
WorkflowRunWire,
|
|
36
|
-
WorkflowStatus,
|
|
37
|
-
StepStatus,
|
|
38
|
-
WorkflowRun,
|
|
39
|
-
StepState,
|
|
40
|
-
WorkflowRunService,
|
|
41
|
-
CoreWorkflow,
|
|
42
|
-
PikkuWorkflow,
|
|
43
|
-
ContextVariable,
|
|
44
|
-
WorkflowContext,
|
|
45
|
-
WorkflowsMeta,
|
|
46
|
-
WorkflowRuntimeMeta,
|
|
47
|
-
WorkflowsRuntimeMeta,
|
|
48
|
-
WorkflowStepInput,
|
|
49
|
-
WorkflowOrchestratorInput,
|
|
50
|
-
WorkflowSleeperInput,
|
|
51
|
-
} from './workflow.types.js'
|
|
52
|
-
|
|
53
|
-
// Re-export DSL types
|
|
54
|
-
export type {
|
|
55
|
-
WorkflowStepOptions,
|
|
56
|
-
WorkflowWireDoRPC,
|
|
57
|
-
WorkflowWireDoInline,
|
|
58
|
-
WorkflowWireSleep,
|
|
59
|
-
WorkflowWireSuspend,
|
|
60
|
-
InputSource,
|
|
61
|
-
OutputBinding,
|
|
62
|
-
RpcStepMeta,
|
|
63
|
-
SimpleCondition,
|
|
64
|
-
Condition,
|
|
65
|
-
BranchCase,
|
|
66
|
-
BranchStepMeta,
|
|
67
|
-
ParallelGroupStepMeta,
|
|
68
|
-
FanoutStepMeta,
|
|
69
|
-
ReturnStepMeta,
|
|
70
|
-
InlineStepMeta,
|
|
71
|
-
SleepStepMeta,
|
|
72
|
-
CancelStepMeta,
|
|
73
|
-
SetStepMeta,
|
|
74
|
-
SwitchCaseMeta,
|
|
75
|
-
SwitchStepMeta,
|
|
76
|
-
FilterStepMeta,
|
|
77
|
-
ArrayPredicateStepMeta,
|
|
78
|
-
WorkflowStepMeta,
|
|
79
|
-
WorkflowStepWire,
|
|
80
|
-
PikkuWorkflowWire,
|
|
81
|
-
} from './workflow.types.js'
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
|
|
5
|
-
import { pikkuState } from '../../pikku-state.js'
|
|
6
|
-
import { addWorkflow } from './dsl/workflow-runner.js'
|
|
7
|
-
import {
|
|
8
|
-
WorkflowSuspendedException,
|
|
9
|
-
type PikkuWorkflowWire,
|
|
10
|
-
} from './pikku-workflow-service.js'
|
|
11
|
-
|
|
12
|
-
describe('pikku-workflow-service version mismatch fallback', () => {
|
|
13
|
-
test('should fall back to stored graph for dsl workflow version mismatch', async () => {
|
|
14
|
-
const ws = new InMemoryWorkflowService()
|
|
15
|
-
const workflowName = 'testDslVersionMismatch'
|
|
16
|
-
const oldHash = 'old-hash'
|
|
17
|
-
const newHash = 'new-hash'
|
|
18
|
-
|
|
19
|
-
pikkuState(null, 'package', 'singletonServices', {
|
|
20
|
-
queueService: {
|
|
21
|
-
add: async () => {},
|
|
22
|
-
},
|
|
23
|
-
} as any)
|
|
24
|
-
|
|
25
|
-
const metaState = pikkuState(null, 'workflows', 'meta')
|
|
26
|
-
metaState[workflowName] = {
|
|
27
|
-
name: workflowName,
|
|
28
|
-
pikkuFuncId: workflowName,
|
|
29
|
-
source: 'dsl',
|
|
30
|
-
graphHash: newHash,
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
await ws.upsertWorkflowVersion(
|
|
34
|
-
workflowName,
|
|
35
|
-
oldHash,
|
|
36
|
-
{
|
|
37
|
-
name: workflowName,
|
|
38
|
-
pikkuFuncId: workflowName,
|
|
39
|
-
source: 'dsl',
|
|
40
|
-
graphHash: oldHash,
|
|
41
|
-
nodes: {
|
|
42
|
-
nodeA: { nodeId: 'nodeA', rpcName: 'doA' },
|
|
43
|
-
},
|
|
44
|
-
entryNodeIds: ['nodeA'],
|
|
45
|
-
},
|
|
46
|
-
'dsl'
|
|
47
|
-
)
|
|
48
|
-
const runId = await ws.createRun(workflowName, {}, false, oldHash, {
|
|
49
|
-
type: 'test',
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
await ws.runWorkflowJob(runId, {})
|
|
53
|
-
|
|
54
|
-
const step = await ws.getStepState(runId, 'nodeA')
|
|
55
|
-
const run = await ws.getRun(runId)
|
|
56
|
-
assert.notEqual(step.stepId, '')
|
|
57
|
-
assert.equal(step.status, 'pending')
|
|
58
|
-
assert.equal(run?.status, 'running')
|
|
59
|
-
|
|
60
|
-
delete metaState[workflowName]
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
test('should continue from stored graph version when hashes mismatch', async () => {
|
|
64
|
-
const ws = new InMemoryWorkflowService()
|
|
65
|
-
const workflowName = 'testGraphVersionMismatch'
|
|
66
|
-
const oldHash = 'old-graph-hash'
|
|
67
|
-
const newHash = 'new-graph-hash'
|
|
68
|
-
|
|
69
|
-
const metaState = pikkuState(null, 'workflows', 'meta')
|
|
70
|
-
metaState[workflowName] = {
|
|
71
|
-
name: workflowName,
|
|
72
|
-
pikkuFuncId: workflowName,
|
|
73
|
-
source: 'graph',
|
|
74
|
-
graphHash: newHash,
|
|
75
|
-
nodes: {
|
|
76
|
-
changedNode: { nodeId: 'changedNode', rpcName: 'changedRpc' },
|
|
77
|
-
},
|
|
78
|
-
entryNodeIds: ['changedNode'],
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
await ws.upsertWorkflowVersion(
|
|
82
|
-
workflowName,
|
|
83
|
-
oldHash,
|
|
84
|
-
{
|
|
85
|
-
name: workflowName,
|
|
86
|
-
pikkuFuncId: workflowName,
|
|
87
|
-
source: 'graph',
|
|
88
|
-
graphHash: oldHash,
|
|
89
|
-
nodes: {},
|
|
90
|
-
entryNodeIds: [],
|
|
91
|
-
},
|
|
92
|
-
'graph'
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
const runId = await ws.createRun(workflowName, {}, false, oldHash, {
|
|
96
|
-
type: 'test',
|
|
97
|
-
})
|
|
98
|
-
await ws.runWorkflowJob(runId, {})
|
|
99
|
-
|
|
100
|
-
const run = await ws.getRun(runId)
|
|
101
|
-
assert.equal(run?.status, 'completed')
|
|
102
|
-
|
|
103
|
-
delete metaState[workflowName]
|
|
104
|
-
})
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
describe('pikku-workflow-service executeWorkflowStep', () => {
|
|
108
|
-
test('should set pending step to running before succeeding', async () => {
|
|
109
|
-
const ws = new InMemoryWorkflowService()
|
|
110
|
-
pikkuState(null, 'package', 'singletonServices', {
|
|
111
|
-
queueService: {
|
|
112
|
-
add: async () => {},
|
|
113
|
-
},
|
|
114
|
-
} as any)
|
|
115
|
-
|
|
116
|
-
const runId = await ws.createRun(
|
|
117
|
-
'pending-step-running',
|
|
118
|
-
{},
|
|
119
|
-
false,
|
|
120
|
-
'hash',
|
|
121
|
-
{ type: 'test' }
|
|
122
|
-
)
|
|
123
|
-
await ws.insertStepState(runId, 'stepA', 'doStepA', { a: 1 })
|
|
124
|
-
|
|
125
|
-
await ws.executeWorkflowStep(
|
|
126
|
-
runId,
|
|
127
|
-
'stepA',
|
|
128
|
-
'doStepA',
|
|
129
|
-
{ a: 1 },
|
|
130
|
-
{
|
|
131
|
-
rpcWithWire: async () => ({ ok: true }),
|
|
132
|
-
}
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
const step = await ws.getStepState(runId, 'stepA')
|
|
136
|
-
assert.equal(step.status, 'succeeded')
|
|
137
|
-
assert.ok(step.runningAt instanceof Date)
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
describe('pikku-workflow-service suspend', () => {
|
|
142
|
-
test('should set run status to suspended when workflow.suspend is called', async () => {
|
|
143
|
-
const ws = new InMemoryWorkflowService()
|
|
144
|
-
pikkuState(null, 'package', 'singletonServices', {
|
|
145
|
-
queueService: {
|
|
146
|
-
add: async () => {},
|
|
147
|
-
},
|
|
148
|
-
} as any)
|
|
149
|
-
|
|
150
|
-
const workflowName = 'testSuspendWorkflow'
|
|
151
|
-
const graphHash = 'suspend-hash'
|
|
152
|
-
const metaState = pikkuState(null, 'workflows', 'meta')
|
|
153
|
-
metaState[workflowName] = {
|
|
154
|
-
name: workflowName,
|
|
155
|
-
pikkuFuncId: workflowName,
|
|
156
|
-
source: 'dsl',
|
|
157
|
-
graphHash,
|
|
158
|
-
}
|
|
159
|
-
const functionMetaState = pikkuState(null, 'function', 'meta')
|
|
160
|
-
functionMetaState[workflowName] = {
|
|
161
|
-
name: workflowName,
|
|
162
|
-
sessionless: true,
|
|
163
|
-
permissions: [],
|
|
164
|
-
} as any
|
|
165
|
-
|
|
166
|
-
addWorkflow(workflowName, {
|
|
167
|
-
func: async (
|
|
168
|
-
_services: any,
|
|
169
|
-
_data: any,
|
|
170
|
-
{ workflow }: { workflow: PikkuWorkflowWire }
|
|
171
|
-
) => {
|
|
172
|
-
await workflow.suspend('Needs approval')
|
|
173
|
-
return { ok: true }
|
|
174
|
-
},
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
const runId = await ws.createRun(workflowName, {}, false, graphHash, {
|
|
178
|
-
type: 'test',
|
|
179
|
-
})
|
|
180
|
-
await assert.rejects(
|
|
181
|
-
ws.runWorkflowJob(runId, {}),
|
|
182
|
-
(error: unknown) => error instanceof WorkflowSuspendedException
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
const run = await ws.getRun(runId)
|
|
186
|
-
assert.equal(run?.status, 'suspended')
|
|
187
|
-
assert.equal(run?.error?.code, 'WORKFLOW_SUSPENDED')
|
|
188
|
-
assert.equal(run?.error?.message, 'Needs approval')
|
|
189
|
-
|
|
190
|
-
await ws.resumeWorkflow(runId)
|
|
191
|
-
await ws.runWorkflowJob(runId, {})
|
|
192
|
-
const resumedRun = await ws.getRun(runId)
|
|
193
|
-
assert.equal(resumedRun?.status, 'completed')
|
|
194
|
-
assert.deepEqual(resumedRun?.output, { ok: true })
|
|
195
|
-
|
|
196
|
-
delete metaState[workflowName]
|
|
197
|
-
delete functionMetaState[workflowName]
|
|
198
|
-
pikkuState(null, 'workflows', 'registrations').delete(workflowName)
|
|
199
|
-
})
|
|
200
|
-
})
|