@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.
Files changed (282) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/crypto-utils.d.ts +10 -0
  3. package/dist/crypto-utils.js +62 -0
  4. package/dist/function/function-runner.js +4 -4
  5. package/dist/function/functions.types.d.ts +26 -1
  6. package/dist/function/functions.types.js +16 -0
  7. package/dist/handle-error.d.ts +1 -1
  8. package/dist/handle-error.js +7 -3
  9. package/dist/index.d.ts +14 -2
  10. package/dist/index.js +1 -1
  11. package/dist/pikku-state.js +3 -1
  12. package/dist/schema.js +1 -1
  13. package/dist/services/in-memory-workflow-service.d.ts +22 -3
  14. package/dist/services/in-memory-workflow-service.js +77 -1
  15. package/dist/services/workflow-service.d.ts +8 -2
  16. package/dist/testing/index.d.ts +2 -0
  17. package/dist/testing/index.js +1 -0
  18. package/dist/testing/service-tests.d.ts +31 -0
  19. package/dist/testing/service-tests.js +598 -0
  20. package/dist/types/core.types.d.ts +9 -1
  21. package/dist/types/state.types.d.ts +4 -2
  22. package/dist/utils/hash.d.ts +2 -0
  23. package/dist/utils/hash.js +23 -0
  24. package/dist/wirings/ai-agent/agent-dynamic-workflow.d.ts +6 -0
  25. package/dist/wirings/ai-agent/agent-dynamic-workflow.js +348 -0
  26. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +1 -1
  27. package/dist/wirings/ai-agent/ai-agent-memory.js +6 -5
  28. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -7
  29. package/dist/wirings/ai-agent/ai-agent-prepare.js +127 -47
  30. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +4 -0
  31. package/dist/wirings/ai-agent/ai-agent-runner.js +381 -27
  32. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +7 -2
  33. package/dist/wirings/ai-agent/ai-agent-stream.js +109 -46
  34. package/dist/wirings/ai-agent/ai-agent.types.d.ts +22 -1
  35. package/dist/wirings/ai-agent/index.d.ts +1 -2
  36. package/dist/wirings/ai-agent/index.js +1 -2
  37. package/dist/wirings/channel/channel-handler.js +5 -1
  38. package/dist/wirings/channel/channel.types.d.ts +1 -7
  39. package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -1
  40. package/dist/wirings/channel/local/local-channel-handler.js +5 -3
  41. package/dist/wirings/channel/local/local-channel-runner.js +14 -4
  42. package/dist/wirings/channel/serverless/serverless-channel-runner.js +4 -1
  43. package/dist/wirings/cli/cli-runner.js +10 -2
  44. package/dist/wirings/cli/cli.types.d.ts +1 -0
  45. package/dist/wirings/http/http-routes.js +0 -1
  46. package/dist/wirings/http/http-runner.d.ts +1 -1
  47. package/dist/wirings/http/http-runner.js +25 -3
  48. package/dist/wirings/http/http.types.d.ts +3 -11
  49. package/dist/wirings/http/index.d.ts +2 -1
  50. package/dist/wirings/http/index.js +1 -0
  51. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
  52. package/dist/wirings/http/pikku-fetch-http-request.js +3 -0
  53. package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
  54. package/dist/wirings/http/pikku-fetch-http-response.js +4 -4
  55. package/dist/wirings/http/web-request.d.ts +12 -0
  56. package/dist/wirings/http/web-request.js +85 -0
  57. package/dist/wirings/mcp/mcp-endpoint-registry.js +1 -1
  58. package/dist/wirings/mcp/mcp-runner.js +13 -1
  59. package/dist/wirings/rpc/rpc-runner.d.ts +30 -6
  60. package/dist/wirings/rpc/rpc-runner.js +36 -14
  61. package/dist/wirings/rpc/rpc-types.d.ts +6 -1
  62. package/dist/wirings/rpc/wire-addon.d.ts +1 -0
  63. package/dist/wirings/rpc/wire-addon.js +1 -1
  64. package/dist/wirings/scheduler/scheduler-runner.js +1 -0
  65. package/dist/wirings/workflow/graph/graph-validation.d.ts +3 -0
  66. package/dist/wirings/workflow/graph/graph-validation.js +175 -0
  67. package/dist/wirings/workflow/graph/index.d.ts +1 -0
  68. package/dist/wirings/workflow/graph/index.js +1 -0
  69. package/dist/wirings/workflow/index.d.ts +1 -1
  70. package/dist/wirings/workflow/pikku-workflow-service.d.ts +8 -2
  71. package/dist/wirings/workflow/pikku-workflow-service.js +1 -2
  72. package/dist/wirings/workflow/workflow.types.d.ts +10 -1
  73. package/lcov.info +18891 -0
  74. package/package.json +4 -2
  75. package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +0 -5
  76. package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +0 -168
  77. package/src/crypto-utils.test.ts +0 -116
  78. package/src/crypto-utils.ts +0 -99
  79. package/src/errors/error-handler.ts +0 -62
  80. package/src/errors/error.test.ts +0 -195
  81. package/src/errors/errors.ts +0 -374
  82. package/src/errors/index.ts +0 -2
  83. package/src/factory-functions.test.ts +0 -109
  84. package/src/function/function-runner.test.ts +0 -536
  85. package/src/function/function-runner.ts +0 -365
  86. package/src/function/functions.types.ts +0 -267
  87. package/src/function/index.ts +0 -5
  88. package/src/handle-error.test.ts +0 -361
  89. package/src/handle-error.ts +0 -65
  90. package/src/index.ts +0 -104
  91. package/src/internal.ts +0 -6
  92. package/src/middleware/auth-apikey.test.ts +0 -363
  93. package/src/middleware/auth-apikey.ts +0 -47
  94. package/src/middleware/auth-bearer.test.ts +0 -450
  95. package/src/middleware/auth-bearer.ts +0 -72
  96. package/src/middleware/auth-cookie.test.ts +0 -528
  97. package/src/middleware/auth-cookie.ts +0 -80
  98. package/src/middleware/cors.test.ts +0 -424
  99. package/src/middleware/cors.ts +0 -104
  100. package/src/middleware/index.ts +0 -5
  101. package/src/middleware/remote-auth.test.ts +0 -488
  102. package/src/middleware/remote-auth.ts +0 -68
  103. package/src/middleware/timeout.ts +0 -15
  104. package/src/middleware-runner.test.ts +0 -418
  105. package/src/middleware-runner.ts +0 -234
  106. package/src/permissions.test.ts +0 -434
  107. package/src/permissions.ts +0 -319
  108. package/src/pikku-request.ts +0 -23
  109. package/src/pikku-response.ts +0 -5
  110. package/src/pikku-state.test.ts +0 -224
  111. package/src/pikku-state.ts +0 -214
  112. package/src/run-tests-script.test.ts +0 -49
  113. package/src/schema.test.ts +0 -249
  114. package/src/schema.ts +0 -151
  115. package/src/services/ai-agent-runner-service.ts +0 -41
  116. package/src/services/ai-run-state-service.ts +0 -20
  117. package/src/services/ai-storage-service.ts +0 -39
  118. package/src/services/content-service.ts +0 -76
  119. package/src/services/deployment-service.ts +0 -22
  120. package/src/services/gateway-service.ts +0 -20
  121. package/src/services/gopass-secrets.ts +0 -98
  122. package/src/services/in-memory-ai-run-state-service.ts +0 -73
  123. package/src/services/in-memory-trigger-service.ts +0 -64
  124. package/src/services/in-memory-workflow-service.test.ts +0 -351
  125. package/src/services/in-memory-workflow-service.ts +0 -395
  126. package/src/services/index.ts +0 -56
  127. package/src/services/jwt-service.ts +0 -30
  128. package/src/services/local-content.ts +0 -120
  129. package/src/services/local-gateway-service.ts +0 -62
  130. package/src/services/local-secrets.test.ts +0 -80
  131. package/src/services/local-secrets.ts +0 -94
  132. package/src/services/local-variables.test.ts +0 -61
  133. package/src/services/local-variables.ts +0 -39
  134. package/src/services/logger-console.test.ts +0 -118
  135. package/src/services/logger-console.ts +0 -98
  136. package/src/services/logger.ts +0 -57
  137. package/src/services/scheduler-service.ts +0 -86
  138. package/src/services/schema-service.ts +0 -33
  139. package/src/services/scoped-secret-service.test.ts +0 -74
  140. package/src/services/scoped-secret-service.ts +0 -41
  141. package/src/services/secret-service.ts +0 -38
  142. package/src/services/trigger-service.ts +0 -17
  143. package/src/services/typed-secret-service.test.ts +0 -93
  144. package/src/services/typed-secret-service.ts +0 -70
  145. package/src/services/typed-variables-service.test.ts +0 -73
  146. package/src/services/typed-variables-service.ts +0 -81
  147. package/src/services/user-session-service.test.ts +0 -113
  148. package/src/services/user-session-service.ts +0 -86
  149. package/src/services/variables-service.ts +0 -11
  150. package/src/services/workflow-service.ts +0 -84
  151. package/src/time-utils.test.ts +0 -56
  152. package/src/time-utils.ts +0 -107
  153. package/src/types/core.types.ts +0 -470
  154. package/src/types/state.types.ts +0 -186
  155. package/src/utils.test.ts +0 -350
  156. package/src/utils.ts +0 -129
  157. package/src/version.test.ts +0 -80
  158. package/src/version.ts +0 -25
  159. package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +0 -363
  160. package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +0 -238
  161. package/src/wirings/ai-agent/ai-agent-helpers.test.ts +0 -152
  162. package/src/wirings/ai-agent/ai-agent-helpers.ts +0 -76
  163. package/src/wirings/ai-agent/ai-agent-memory.ts +0 -309
  164. package/src/wirings/ai-agent/ai-agent-model-config.test.ts +0 -115
  165. package/src/wirings/ai-agent/ai-agent-model-config.ts +0 -43
  166. package/src/wirings/ai-agent/ai-agent-prepare.ts +0 -522
  167. package/src/wirings/ai-agent/ai-agent-registry.test.ts +0 -37
  168. package/src/wirings/ai-agent/ai-agent-registry.ts +0 -82
  169. package/src/wirings/ai-agent/ai-agent-runner.test.ts +0 -317
  170. package/src/wirings/ai-agent/ai-agent-runner.ts +0 -251
  171. package/src/wirings/ai-agent/ai-agent-stream.test.ts +0 -652
  172. package/src/wirings/ai-agent/ai-agent-stream.ts +0 -1060
  173. package/src/wirings/ai-agent/ai-agent.types.ts +0 -360
  174. package/src/wirings/ai-agent/index.ts +0 -41
  175. package/src/wirings/channel/channel-common.ts +0 -90
  176. package/src/wirings/channel/channel-handler.ts +0 -241
  177. package/src/wirings/channel/channel-middleware-runner.ts +0 -120
  178. package/src/wirings/channel/channel-runner.ts +0 -166
  179. package/src/wirings/channel/channel-store.ts +0 -29
  180. package/src/wirings/channel/channel.types.ts +0 -178
  181. package/src/wirings/channel/define-channel-routes.ts +0 -25
  182. package/src/wirings/channel/eventhub-service.ts +0 -34
  183. package/src/wirings/channel/eventhub-store.ts +0 -13
  184. package/src/wirings/channel/index.ts +0 -24
  185. package/src/wirings/channel/local/index.ts +0 -3
  186. package/src/wirings/channel/local/local-channel-handler.ts +0 -79
  187. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -215
  188. package/src/wirings/channel/local/local-channel-runner.ts +0 -200
  189. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -95
  190. package/src/wirings/channel/local/local-eventhub-service.ts +0 -101
  191. package/src/wirings/channel/log-channels.ts +0 -20
  192. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -54
  193. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -45
  194. package/src/wirings/channel/serverless/index.ts +0 -5
  195. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -286
  196. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -136
  197. package/src/wirings/cli/channel/index.ts +0 -1
  198. package/src/wirings/cli/cli-runner.test.ts +0 -403
  199. package/src/wirings/cli/cli-runner.ts +0 -519
  200. package/src/wirings/cli/cli.types.ts +0 -357
  201. package/src/wirings/cli/command-parser.test.ts +0 -445
  202. package/src/wirings/cli/command-parser.ts +0 -504
  203. package/src/wirings/cli/define-cli-commands.ts +0 -24
  204. package/src/wirings/cli/index.ts +0 -19
  205. package/src/wirings/gateway/gateway-runner.test.ts +0 -474
  206. package/src/wirings/gateway/gateway-runner.ts +0 -411
  207. package/src/wirings/gateway/gateway.types.ts +0 -149
  208. package/src/wirings/gateway/index.ts +0 -13
  209. package/src/wirings/http/http-routes.test.ts +0 -322
  210. package/src/wirings/http/http-routes.ts +0 -198
  211. package/src/wirings/http/http-runner.test.ts +0 -144
  212. package/src/wirings/http/http-runner.ts +0 -563
  213. package/src/wirings/http/http.types.ts +0 -378
  214. package/src/wirings/http/index.ts +0 -25
  215. package/src/wirings/http/log-http-routes.ts +0 -22
  216. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -237
  217. package/src/wirings/http/pikku-fetch-http-request.ts +0 -166
  218. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -82
  219. package/src/wirings/http/pikku-fetch-http-response.ts +0 -147
  220. package/src/wirings/http/routers/http-router.ts +0 -13
  221. package/src/wirings/http/routers/path-to-regex.test.ts +0 -319
  222. package/src/wirings/http/routers/path-to-regex.ts +0 -126
  223. package/src/wirings/mcp/index.ts +0 -27
  224. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -389
  225. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  226. package/src/wirings/mcp/mcp-runner.ts +0 -305
  227. package/src/wirings/mcp/mcp.types.ts +0 -216
  228. package/src/wirings/node/index.ts +0 -2
  229. package/src/wirings/node/node.types.ts +0 -23
  230. package/src/wirings/oauth2/index.ts +0 -3
  231. package/src/wirings/oauth2/oauth2-client.test.ts +0 -929
  232. package/src/wirings/oauth2/oauth2-client.ts +0 -335
  233. package/src/wirings/oauth2/oauth2.types.ts +0 -69
  234. package/src/wirings/oauth2/wire-oauth2-credential.ts +0 -23
  235. package/src/wirings/queue/index.ts +0 -31
  236. package/src/wirings/queue/queue-runner.test.ts +0 -710
  237. package/src/wirings/queue/queue-runner.ts +0 -192
  238. package/src/wirings/queue/queue.types.ts +0 -189
  239. package/src/wirings/queue/register-queue-helper.ts +0 -60
  240. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  241. package/src/wirings/queue/validate-worker-config.ts +0 -116
  242. package/src/wirings/rpc/index.ts +0 -4
  243. package/src/wirings/rpc/rpc-runner.ts +0 -439
  244. package/src/wirings/rpc/rpc-types.ts +0 -51
  245. package/src/wirings/rpc/wire-addon.ts +0 -20
  246. package/src/wirings/scheduler/index.ts +0 -11
  247. package/src/wirings/scheduler/log-schedulers.ts +0 -20
  248. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -660
  249. package/src/wirings/scheduler/scheduler-runner.ts +0 -132
  250. package/src/wirings/scheduler/scheduler.types.ts +0 -53
  251. package/src/wirings/secret/index.ts +0 -9
  252. package/src/wirings/secret/secret.types.ts +0 -32
  253. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -140
  254. package/src/wirings/secret/validate-secret-definitions.ts +0 -82
  255. package/src/wirings/trigger/index.ts +0 -10
  256. package/src/wirings/trigger/pikku-trigger-service.ts +0 -112
  257. package/src/wirings/trigger/trigger-runner.test.ts +0 -79
  258. package/src/wirings/trigger/trigger-runner.ts +0 -135
  259. package/src/wirings/trigger/trigger.types.ts +0 -178
  260. package/src/wirings/variable/index.ts +0 -8
  261. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -91
  262. package/src/wirings/variable/validate-variable-definitions.ts +0 -69
  263. package/src/wirings/variable/variable.types.ts +0 -22
  264. package/src/wirings/workflow/dsl/index.ts +0 -31
  265. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -320
  266. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -28
  267. package/src/wirings/workflow/graph/graph-node.ts +0 -222
  268. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -487
  269. package/src/wirings/workflow/graph/graph-runner.ts +0 -816
  270. package/src/wirings/workflow/graph/index.ts +0 -14
  271. package/src/wirings/workflow/graph/template.test.ts +0 -49
  272. package/src/wirings/workflow/graph/template.ts +0 -42
  273. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -29
  274. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -104
  275. package/src/wirings/workflow/index.ts +0 -81
  276. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -200
  277. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1165
  278. package/src/wirings/workflow/workflow-helpers.test.ts +0 -129
  279. package/src/wirings/workflow/workflow-helpers.ts +0 -79
  280. package/src/wirings/workflow/workflow.types.ts +0 -266
  281. package/tsconfig.json +0 -14
  282. 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
- })