@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,395 +0,0 @@
1
- import { randomUUID } from 'crypto'
2
- import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js'
3
- import type { SerializedError } from '../types/core.types.js'
4
- import type {
5
- WorkflowRun,
6
- WorkflowRunWire,
7
- StepState,
8
- WorkflowStatus,
9
- WorkflowStepOptions,
10
- } from '../wirings/workflow/workflow.types.js'
11
-
12
- interface InternalStepData {
13
- rpcName: string | null
14
- data: any
15
- stepName: string
16
- }
17
-
18
- /**
19
- * In-memory implementation of WorkflowService for inline-only execution
20
- *
21
- * This is a lightweight workflow service that stores all state in memory.
22
- * It only supports inline execution (no queue workers) and is ideal for:
23
- * - CLI tools that need workflow-like step orchestration
24
- * - Testing and development
25
- * - Single-process applications without persistence requirements
26
- *
27
- * @example
28
- * ```typescript
29
- * const workflowService = new InMemoryWorkflowService()
30
- * await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
31
- * ```
32
- */
33
- export class InMemoryWorkflowService extends PikkuWorkflowService {
34
- private runs = new Map<string, WorkflowRun>()
35
- private steps = new Map<string, StepState>() // keyed by `${runId}:${stepName}`
36
- private stepData = new Map<string, InternalStepData>() // keyed by stepId
37
- private stepHistory = new Map<
38
- string,
39
- Array<StepState & { stepName: string }>
40
- >() // keyed by runId
41
- private runState = new Map<string, Record<string, unknown>>() // keyed by runId
42
- private branchKeys = new Map<string, string>() // keyed by stepId
43
- private workflowVersions = new Map<string, { graph: any; source: string }>() // keyed by `${name}:${graphHash}`
44
-
45
- async createRun(
46
- workflowName: string,
47
- input: any,
48
- inline: boolean,
49
- graphHash: string,
50
- wire: WorkflowRunWire
51
- ): Promise<string> {
52
- const runId = randomUUID()
53
- const now = new Date()
54
-
55
- const run: WorkflowRun = {
56
- id: runId,
57
- workflow: workflowName,
58
- status: 'running',
59
- input,
60
- inline,
61
- graphHash,
62
- wire,
63
- createdAt: now,
64
- updatedAt: now,
65
- }
66
-
67
- this.runs.set(runId, run)
68
- this.stepHistory.set(runId, [])
69
- this.runState.set(runId, {})
70
-
71
- if (inline) {
72
- this.registerInlineRun(runId)
73
- }
74
-
75
- return runId
76
- }
77
-
78
- async getRun(id: string): Promise<WorkflowRun | null> {
79
- return this.runs.get(id) || null
80
- }
81
-
82
- async getRunHistory(
83
- runId: string
84
- ): Promise<Array<StepState & { stepName: string }>> {
85
- return this.stepHistory.get(runId) || []
86
- }
87
-
88
- async updateRunStatus(
89
- id: string,
90
- status: WorkflowStatus,
91
- output?: any,
92
- error?: SerializedError
93
- ): Promise<void> {
94
- const run = this.runs.get(id)
95
- if (run) {
96
- run.status = status
97
- run.updatedAt = new Date()
98
- if (output !== undefined) run.output = output
99
- if (error !== undefined) run.error = error
100
- }
101
- }
102
-
103
- async insertStepState(
104
- runId: string,
105
- stepName: string,
106
- rpcName: string | null,
107
- data: any,
108
- stepOptions?: WorkflowStepOptions
109
- ): Promise<StepState> {
110
- const stepId = randomUUID()
111
- const now = new Date()
112
-
113
- const step: StepState = {
114
- stepId,
115
- status: 'pending',
116
- attemptCount: 1,
117
- retries: stepOptions?.retries,
118
- retryDelay: stepOptions?.retryDelay,
119
- createdAt: now,
120
- updatedAt: now,
121
- }
122
-
123
- const key = `${runId}:${stepName}`
124
- this.steps.set(key, step)
125
- this.stepData.set(stepId, { rpcName, data, stepName })
126
-
127
- // Add to history
128
- const history = this.stepHistory.get(runId) || []
129
- history.push({ ...step, stepName })
130
- this.stepHistory.set(runId, history)
131
-
132
- return step
133
- }
134
-
135
- async getStepState(runId: string, stepName: string): Promise<StepState> {
136
- const key = `${runId}:${stepName}`
137
- const step = this.steps.get(key)
138
- if (!step) {
139
- return {
140
- stepId: '',
141
- status: 'pending',
142
- attemptCount: 0,
143
- createdAt: new Date(),
144
- updatedAt: new Date(),
145
- }
146
- }
147
- return step
148
- }
149
-
150
- async setStepRunning(stepId: string): Promise<void> {
151
- for (const step of this.steps.values()) {
152
- if (step.stepId === stepId) {
153
- step.status = 'running'
154
- step.runningAt = new Date()
155
- step.updatedAt = new Date()
156
- break
157
- }
158
- }
159
- }
160
-
161
- async setStepScheduled(stepId: string): Promise<void> {
162
- for (const step of this.steps.values()) {
163
- if (step.stepId === stepId) {
164
- step.status = 'scheduled'
165
- step.scheduledAt = new Date()
166
- step.updatedAt = new Date()
167
- break
168
- }
169
- }
170
- }
171
-
172
- async setStepResult(stepId: string, result: any): Promise<void> {
173
- for (const step of this.steps.values()) {
174
- if (step.stepId === stepId) {
175
- step.status = 'succeeded'
176
- step.result = result
177
- step.succeededAt = new Date()
178
- step.updatedAt = new Date()
179
- break
180
- }
181
- }
182
- }
183
-
184
- async setStepError(stepId: string, error: Error): Promise<void> {
185
- for (const step of this.steps.values()) {
186
- if (step.stepId === stepId) {
187
- step.status = 'failed'
188
- step.error = {
189
- name: error.name,
190
- message: error.message,
191
- stack: error.stack,
192
- }
193
- step.failedAt = new Date()
194
- step.updatedAt = new Date()
195
- break
196
- }
197
- }
198
- }
199
-
200
- async createRetryAttempt(
201
- failedStepId: string,
202
- status: 'pending' | 'running'
203
- ): Promise<StepState> {
204
- // Find the failed step
205
- let failedStep: StepState | undefined
206
- let runId: string | undefined
207
- let stepName: string | undefined
208
-
209
- for (const [key, step] of this.steps.entries()) {
210
- if (step.stepId === failedStepId) {
211
- failedStep = step
212
- const parts = key.split(':')
213
- runId = parts[0]
214
- stepName = parts.slice(1).join(':')
215
- break
216
- }
217
- }
218
-
219
- if (!failedStep || !runId || !stepName) {
220
- throw new Error(`Step not found: ${failedStepId}`)
221
- }
222
-
223
- const failedStepData = this.stepData.get(failedStepId)
224
- const newStepId = randomUUID()
225
- const now = new Date()
226
-
227
- const newStep: StepState = {
228
- stepId: newStepId,
229
- status,
230
- attemptCount: failedStep.attemptCount + 1,
231
- retries: failedStep.retries,
232
- retryDelay: failedStep.retryDelay,
233
- createdAt: now,
234
- updatedAt: now,
235
- }
236
-
237
- if (status === 'running') {
238
- newStep.runningAt = now
239
- }
240
-
241
- const key = `${runId}:${stepName}`
242
- this.steps.set(key, newStep)
243
-
244
- // Copy step data to new step
245
- if (failedStepData) {
246
- this.stepData.set(newStepId, { ...failedStepData })
247
- }
248
-
249
- // Add to history
250
- const history = this.stepHistory.get(runId) || []
251
- history.push({ ...newStep, stepName })
252
- this.stepHistory.set(runId, history)
253
-
254
- return newStep
255
- }
256
-
257
- async withRunLock<T>(_id: string, fn: () => Promise<T>): Promise<T> {
258
- // In-memory service doesn't need locking for inline execution
259
- return fn()
260
- }
261
-
262
- async withStepLock<T>(
263
- _runId: string,
264
- _stepName: string,
265
- fn: () => Promise<T>
266
- ): Promise<T> {
267
- // In-memory service doesn't need locking for inline execution
268
- return fn()
269
- }
270
-
271
- async close(): Promise<void> {
272
- // Clear all in-memory state
273
- this.runs.clear()
274
- this.steps.clear()
275
- this.stepData.clear()
276
- this.stepHistory.clear()
277
- this.runState.clear()
278
- this.branchKeys.clear()
279
- this.workflowVersions.clear()
280
- }
281
-
282
- // Graph workflow methods
283
-
284
- async getCompletedGraphState(runId: string): Promise<{
285
- completedNodeIds: string[]
286
- failedNodeIds: string[]
287
- branchKeys: Record<string, string>
288
- }> {
289
- const completedNodeIds: string[] = []
290
- const failedNodeIds: string[] = []
291
- const prefix = `${runId}:`
292
- for (const [key, step] of this.steps.entries()) {
293
- if (!key.startsWith(prefix)) continue
294
- const nodeId = key.substring(prefix.length)
295
- if (step.status === 'succeeded') {
296
- completedNodeIds.push(nodeId)
297
- } else if (step.status === 'failed') {
298
- const maxAttempts = (step.retries ?? 0) + 1
299
- if (step.attemptCount >= maxAttempts) {
300
- failedNodeIds.push(nodeId)
301
- }
302
- }
303
- }
304
-
305
- const branchKeys: Record<string, string> = {}
306
- for (const [stepId, branchKey] of this.branchKeys.entries()) {
307
- const stepData = this.stepData.get(stepId)
308
- if (stepData) {
309
- branchKeys[stepData.stepName] = branchKey
310
- }
311
- }
312
-
313
- return { completedNodeIds, failedNodeIds, branchKeys }
314
- }
315
-
316
- async getNodesWithoutSteps(
317
- runId: string,
318
- nodeIds: string[]
319
- ): Promise<string[]> {
320
- const existingSteps = new Set<string>()
321
- const prefix = `${runId}:`
322
- for (const [key] of this.steps.entries()) {
323
- if (key.startsWith(prefix)) {
324
- existingSteps.add(key.substring(prefix.length))
325
- }
326
- }
327
- return nodeIds.filter((id) => !existingSteps.has(id))
328
- }
329
-
330
- async getNodeResults(
331
- runId: string,
332
- nodeIds: string[]
333
- ): Promise<Record<string, any>> {
334
- const results: Record<string, any> = {}
335
- for (const nodeId of nodeIds) {
336
- const key = `${runId}:${nodeId}`
337
- const step = this.steps.get(key)
338
- if (step?.result !== undefined) {
339
- results[nodeId] = step.result
340
- }
341
- }
342
- return results
343
- }
344
-
345
- async setBranchKey(
346
- runId: string,
347
- nodeId: string,
348
- branchKey: string
349
- ): Promise<void> {
350
- const key = `${runId}:${nodeId}`
351
- const step = this.steps.get(key)
352
- if (step) {
353
- this.branchKeys.set(step.stepId, branchKey)
354
- }
355
- }
356
-
357
- async setBranchTaken(stepId: string, branchKey: string): Promise<void> {
358
- this.branchKeys.set(stepId, branchKey)
359
- }
360
-
361
- async updateRunState(
362
- runId: string,
363
- name: string,
364
- value: unknown
365
- ): Promise<void> {
366
- const state = this.runState.get(runId) || {}
367
- state[name] = value
368
- this.runState.set(runId, state)
369
- }
370
-
371
- async getRunState(runId: string): Promise<Record<string, unknown>> {
372
- return this.runState.get(runId) || {}
373
- }
374
-
375
- async upsertWorkflowVersion(
376
- name: string,
377
- graphHash: string,
378
- graph: any,
379
- source: string
380
- ): Promise<void> {
381
- this.workflowVersions.set(`${name}:${graphHash}`, {
382
- graph,
383
- source,
384
- })
385
- }
386
-
387
- async getWorkflowVersion(
388
- name: string,
389
- graphHash: string
390
- ): Promise<{ graph: any; source: string } | null> {
391
- const version = this.workflowVersions.get(`${name}:${graphHash}`)
392
- if (!version) return null
393
- return { graph: version.graph, source: version.source }
394
- }
395
- }
@@ -1,56 +0,0 @@
1
- /**
2
- * @module @pikku/core
3
- */
4
-
5
- export { LogLevel } from './logger.js'
6
- export { ScopedSecretService } from './scoped-secret-service.js'
7
- export {
8
- PikkuSessionService,
9
- createMiddlewareSessionWireProps,
10
- createFunctionSessionWireProps,
11
- } from './user-session-service.js'
12
- export { TypedSecretService } from './typed-secret-service.js'
13
- export { TypedVariablesService } from './typed-variables-service.js'
14
- export { LocalSecretService } from './local-secrets.js'
15
- export { LocalVariablesService } from './local-variables.js'
16
- export { ConsoleLogger } from './logger-console.js'
17
- export { InMemoryWorkflowService } from './in-memory-workflow-service.js'
18
- export { InMemoryTriggerService } from './in-memory-trigger-service.js'
19
- export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js'
20
- export { LocalGatewayService } from './local-gateway-service.js'
21
- export type { ContentService } from './content-service.js'
22
- export type { JWTService } from './jwt-service.js'
23
- export type { Logger } from './logger.js'
24
- export type { SecretService } from './secret-service.js'
25
- export type { VariablesService } from './variables-service.js'
26
- export type { SchemaService } from './schema-service.js'
27
- export type { SessionService } from './user-session-service.js'
28
- export type {
29
- ScheduledTaskSummary,
30
- ScheduledTaskInfo,
31
- SchedulerService,
32
- } from './scheduler-service.js'
33
- export type { TriggerService } from './trigger-service.js'
34
- export type { GatewayService } from './gateway-service.js'
35
- export type {
36
- DeploymentService,
37
- DeploymentConfig,
38
- DeploymentInfo,
39
- DeploymentServiceConfig,
40
- } from './deployment-service.js'
41
- export type { AIStorageService } from './ai-storage-service.js'
42
- export type {
43
- AIAgentRunnerParams,
44
- AIAgentRunnerResult,
45
- AIAgentStepResult,
46
- AIAgentRunnerService,
47
- } from './ai-agent-runner-service.js'
48
- export type {
49
- CreateRunInput,
50
- AIRunStateService,
51
- } from './ai-run-state-service.js'
52
- export type {
53
- CredentialStatus,
54
- CredentialMeta,
55
- } from './typed-secret-service.js'
56
- export type { VariableStatus, VariableMeta } from './typed-variables-service.js'
@@ -1,30 +0,0 @@
1
- import type { RelativeTimeInput } from '../time-utils.js'
2
-
3
- /**
4
- * Interface for handling JSON Web Tokens (JWT).
5
- */
6
- export interface JWTService {
7
- /**
8
- * Encodes a payload into a JWT.
9
- * @param expiresIn - The expiration time of the token.
10
- * @param payload - The payload to encode.
11
- * @returns A promise that resolves to the encoded JWT.
12
- */
13
- encode: <T extends any>(
14
- expiresIn: RelativeTimeInput,
15
- payload: T
16
- ) => Promise<string>
17
-
18
- /**
19
- * Decodes a JWT into its payload.
20
- * @param hash - The JWT to decode.
21
- * @param invalidHashError - An optional error to throw if the hash is invalid.
22
- * @param debug - An optional flag for debugging.
23
- * @returns A promise that resolves to the decoded payload.
24
- */
25
- decode: <T>(
26
- hash: string,
27
- invalidHashError?: Error,
28
- debug?: boolean
29
- ) => Promise<T>
30
- }
@@ -1,120 +0,0 @@
1
- import { createReadStream, createWriteStream, promises } from 'fs'
2
- import { mkdir, readFile } from 'fs/promises'
3
- import type { ContentService, Logger } from '@pikku/core/services'
4
- import { pipeline } from 'stream/promises'
5
- import type { Readable } from 'stream'
6
-
7
- export interface LocalContentConfig {
8
- localFileUploadPath: string
9
- uploadUrlPrefix: string
10
- assetUrlPrefix: string
11
- server?: string
12
- sizeLimit?: string
13
- }
14
-
15
- export class LocalContent implements ContentService {
16
- constructor(
17
- private config: LocalContentConfig,
18
- private logger: Logger
19
- ) {}
20
-
21
- public async init() {}
22
-
23
- public async signURL(url: string): Promise<string> {
24
- return `${url}?signed=true`
25
- }
26
-
27
- public async signContentKey(assetKey: string): Promise<string> {
28
- return this.config.server
29
- ? `${this.config.server}${this.config.assetUrlPrefix}/${assetKey}?signed=true`
30
- : `${this.config.assetUrlPrefix}/${assetKey}?signed=true`
31
- }
32
-
33
- public async getUploadURL(assetKey: string) {
34
- this.logger.debug(`Going to upload with key: ${assetKey}`)
35
- return {
36
- uploadUrl: `${this.config.uploadUrlPrefix}/${assetKey}`,
37
- assetKey,
38
- }
39
- }
40
-
41
- public async writeFile(
42
- assetKey: string,
43
- stream: ReadableStream | NodeJS.ReadableStream
44
- ): Promise<boolean> {
45
- this.logger.debug(`Writing file: ${assetKey}`)
46
-
47
- const path = `${this.config.localFileUploadPath}/${assetKey}`
48
-
49
- try {
50
- await this.createDirectoryForFile(path)
51
- const fileStream = createWriteStream(path)
52
- // Use pipeline to properly manage stream piping and errors
53
- await pipeline(stream as Readable, fileStream)
54
- return true
55
- } catch (e) {
56
- console.error(e)
57
- this.logger.error(`Error writing content ${assetKey}`, e)
58
- return false
59
- }
60
- }
61
-
62
- public async copyFile(
63
- assetKey: string,
64
- fromAbsolutePath: string
65
- ): Promise<boolean> {
66
- this.logger.debug(`Writing file: ${assetKey}`)
67
- try {
68
- const path = `${this.config.localFileUploadPath}/${assetKey}`
69
- await this.createDirectoryForFile(path)
70
- await promises.copyFile(fromAbsolutePath, path)
71
- } catch (e) {
72
- console.error(e)
73
- this.logger.error(`Error inserting content ${assetKey}`, e)
74
- }
75
- return false
76
- }
77
-
78
- public async readFile(
79
- assetKey: string
80
- ): Promise<ReadableStream | NodeJS.ReadableStream> {
81
- this.logger.debug(`Getting key: ${assetKey}`)
82
-
83
- const filePath = `${this.config.localFileUploadPath}/${assetKey}`
84
-
85
- try {
86
- const stream = createReadStream(filePath)
87
- // Handle early stream errors (like file not found, permission denied, etc.)
88
- stream.on('error', (err) => {
89
- this.logger.error(`Error getting content ${assetKey}`, err)
90
- })
91
-
92
- return stream
93
- } catch (e) {
94
- this.logger.error(`Error setting up stream for ${assetKey}`, e)
95
- throw e
96
- }
97
- }
98
-
99
- public async readFileAsBuffer(assetKey: string): Promise<Buffer> {
100
- const filePath = `${this.config.localFileUploadPath}/${assetKey}`
101
- this.logger.debug(`Reading file as buffer: ${assetKey}`)
102
- return readFile(filePath)
103
- }
104
-
105
- public async deleteFile(assetKey: string): Promise<boolean> {
106
- this.logger.debug(`deleting key: ${assetKey}`)
107
- try {
108
- await promises.unlink(`${this.config.localFileUploadPath}/${assetKey}`)
109
- return true
110
- } catch (e: any) {
111
- this.logger.error(`Error deleting content ${assetKey}`, e)
112
- }
113
- return false
114
- }
115
-
116
- private async createDirectoryForFile(path: string): Promise<void> {
117
- const dir = path.split('/').slice(0, -1).join('/')
118
- await mkdir(dir, { recursive: true })
119
- }
120
- }
@@ -1,62 +0,0 @@
1
- import type { GatewayService } from './gateway-service.js'
2
- import type { GatewayAdapter } from '../wirings/gateway/gateway.types.js'
3
- import { pikkuState, getSingletonServices } from '../pikku-state.js'
4
- import { createListenerMessageHandler } from '../wirings/gateway/gateway-runner.js'
5
-
6
- /**
7
- * Local GatewayService implementation.
8
- *
9
- * Starts all registered listener gateways unconditionally (single-process).
10
- * For distributed deployments, implement `GatewayService` with leader
11
- * election or similar coordination.
12
- *
13
- * @example
14
- * ```typescript
15
- * const gatewayService = new LocalGatewayService()
16
- * await gatewayService.start()
17
- *
18
- * // On shutdown
19
- * await gatewayService.stop()
20
- * ```
21
- */
22
- export class LocalGatewayService implements GatewayService {
23
- private activeAdapters = new Map<string, GatewayAdapter>()
24
-
25
- async start(): Promise<void> {
26
- const singletonServices = getSingletonServices()
27
- const gateways = pikkuState(null, 'gateway', 'gateways')
28
-
29
- for (const [name, config] of gateways) {
30
- if (config.type !== 'listener') continue
31
- if (this.activeAdapters.has(name)) continue
32
-
33
- const handleMessage = createListenerMessageHandler(
34
- name,
35
- config,
36
- singletonServices
37
- )
38
-
39
- await config.adapter.init(handleMessage)
40
- this.activeAdapters.set(name, config.adapter)
41
- singletonServices.logger.info(`Started listener gateway: ${name}`)
42
- }
43
- }
44
-
45
- async stop(): Promise<void> {
46
- for (const [name, adapter] of this.activeAdapters) {
47
- try {
48
- await adapter.close()
49
- } catch (e: any) {
50
- try {
51
- getSingletonServices().logger.error(
52
- `Error closing listener gateway '${name}':`,
53
- e
54
- )
55
- } catch {
56
- // logger may not be available during shutdown
57
- }
58
- }
59
- }
60
- this.activeAdapters.clear()
61
- }
62
- }