@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,365 +0,0 @@
1
- import { runMiddleware, combineMiddleware } from '../middleware-runner.js'
2
- import {
3
- combineChannelMiddleware,
4
- wrapChannelWithMiddleware,
5
- } from '../wirings/channel/channel-middleware-runner.js'
6
- import { runPermissions } from '../permissions.js'
7
- import { pikkuState } from '../pikku-state.js'
8
- import { coerceTopLevelDataFromSchema, validateSchema } from '../schema.js'
9
- import type {
10
- CoreServices,
11
- CoreUserSession,
12
- CorePikkuMiddleware,
13
- PikkuWiringTypes,
14
- PikkuWire,
15
- MiddlewareMetadata,
16
- PermissionMetadata,
17
- CoreSingletonServices,
18
- CreateWireServices,
19
- CoreConfig,
20
- } from '../types/core.types.js'
21
- import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js'
22
- import type {
23
- CorePermissionGroup,
24
- CorePikkuFunctionConfig,
25
- CorePikkuPermission,
26
- } from './functions.types.js'
27
- import { parseVersionedId } from '../version.js'
28
- import type { SessionService } from '../services/user-session-service.js'
29
- import { createFunctionSessionWireProps } from '../services/user-session-service.js'
30
- import { ForbiddenError, ReadonlySessionError } from '../errors/errors.js'
31
- import { rpcService } from '../wirings/rpc/rpc-runner.js'
32
- import { closeWireServices } from '../utils.js'
33
-
34
- /**
35
- * Get or create singleton services for an addon package.
36
- * Services are cached in pikkuState to avoid recreation on each call.
37
- *
38
- * @param packageName - The addon package name
39
- * @param parentServices - The parent/caller's singleton services (used as base)
40
- * @returns The package's singleton services
41
- */
42
- const getOrCreatePackageSingletonServices = async (
43
- packageName: string,
44
- parentServices: CoreSingletonServices
45
- ): Promise<CoreSingletonServices> => {
46
- // Check if we already have cached singleton services for this package
47
- const cachedServices = pikkuState(packageName, 'package', 'singletonServices')
48
- if (cachedServices) {
49
- return cachedServices
50
- }
51
-
52
- // Get the package's service factories
53
- const factories = pikkuState(packageName, 'package', 'factories')
54
- if (!factories || !factories.createSingletonServices) {
55
- // No factories registered, use parent services
56
- return parentServices
57
- }
58
-
59
- // Create config for the package (use parent config if no factory)
60
- let config: CoreConfig = parentServices.config
61
- if (factories.createConfig) {
62
- config = await factories.createConfig(parentServices.variables)
63
- }
64
-
65
- // Create singleton services for the package, passing parent services as existing
66
- const packageServices = await factories.createSingletonServices(
67
- config,
68
- parentServices
69
- )
70
-
71
- // Cache the services
72
- pikkuState(packageName, 'package', 'singletonServices', packageServices)
73
-
74
- return packageServices
75
- }
76
-
77
- export const addFunction = (
78
- funcName: string,
79
- funcConfig: CorePikkuFunctionConfig<any, any>,
80
- packageName: string | null = null
81
- ) => {
82
- pikkuState(packageName, 'function', 'functions').set(funcName, funcConfig)
83
- }
84
-
85
- export const getFunctionNames = (
86
- packageName: string | null = null
87
- ): string[] => {
88
- const functionsMeta = pikkuState(packageName, 'function', 'meta')
89
- return Object.keys(functionsMeta)
90
- }
91
-
92
- export const getAllFunctionNames = (): string[] => {
93
- const functions: string[] = []
94
-
95
- const mainFunctionsMeta = pikkuState(null, 'function', 'meta')
96
- functions.push(...Object.keys(mainFunctionsMeta))
97
-
98
- const addons = pikkuState(null, 'rpc', 'addons')
99
- for (const [namespace, config] of addons) {
100
- const packageFunctionsMeta = pikkuState(config.package, 'function', 'meta')
101
- for (const funcName of Object.keys(packageFunctionsMeta)) {
102
- functions.push(`${namespace}:${funcName}`)
103
- }
104
- }
105
-
106
- return functions
107
- }
108
-
109
- export const runPikkuFuncDirectly = async <In, Out>(
110
- funcName: string,
111
- allServices: CoreServices,
112
- wire: PikkuWire,
113
- data: In,
114
- userSession?: SessionService<CoreUserSession>,
115
- packageName: string | null = null
116
- ) => {
117
- const funcConfig = pikkuState(packageName, 'function', 'functions').get(
118
- funcName
119
- )
120
- if (!funcConfig) {
121
- throw new Error(`Function not found: ${funcName}`)
122
- }
123
- const wireWithSession = {
124
- ...wire,
125
- ...(userSession && createFunctionSessionWireProps(userSession)),
126
- }
127
- return (await funcConfig.func(allServices, data, wireWithSession)) as Out
128
- }
129
-
130
- export const runPikkuFunc = async <In = any, Out = any>(
131
- wireType: PikkuWiringTypes,
132
- wireId: string,
133
- funcName: string,
134
- {
135
- singletonServices,
136
- createWireServices,
137
- data,
138
- auth: wiringAuth,
139
- inheritedMiddleware,
140
- wireMiddleware,
141
- inheritedChannelMiddleware,
142
- wireChannelMiddleware,
143
- inheritedPermissions,
144
- wirePermissions,
145
- coerceDataFromSchema,
146
- tags = [],
147
- wire,
148
- sessionService,
149
- packageName = null,
150
- }: {
151
- singletonServices: CoreSingletonServices
152
- createWireServices?: CreateWireServices
153
- data: () => Promise<In> | In
154
- auth?: boolean
155
- inheritedMiddleware?: MiddlewareMetadata[]
156
- wireMiddleware?: CorePikkuMiddleware[]
157
- inheritedChannelMiddleware?: MiddlewareMetadata[]
158
- wireChannelMiddleware?: CorePikkuChannelMiddleware[]
159
- inheritedPermissions?: PermissionMetadata[]
160
- wirePermissions?: CorePermissionGroup | CorePikkuPermission[]
161
- coerceDataFromSchema?: boolean
162
- tags?: string[]
163
- wire: PikkuWire
164
- sessionService?: SessionService<CoreUserSession>
165
- packageName?: string | null
166
- }
167
- ): Promise<Out> => {
168
- wire.wireType ??= wireType
169
- wire.wireId ??= wireId
170
-
171
- const funcMap = pikkuState(packageName, 'function', 'functions')
172
- let funcConfig = funcMap.get(funcName)
173
- const allMeta = pikkuState(packageName, 'function', 'meta')
174
- let funcMeta = allMeta[funcName]
175
-
176
- if (!funcConfig || !funcMeta) {
177
- const { baseName, version } = parseVersionedId(funcName)
178
- if (version !== null) {
179
- funcConfig = funcConfig || funcMap.get(baseName)
180
- funcMeta = funcMeta || allMeta[baseName]
181
- if (funcConfig && funcMeta) {
182
- singletonServices.logger.warn(
183
- `Version '${funcName}' not registered, resolved to '${baseName}'`
184
- )
185
- }
186
- }
187
- }
188
-
189
- if (!funcConfig) {
190
- throw new Error(`Function not found: ${funcName}`)
191
- }
192
- if (!funcMeta) {
193
- throw new Error(`Function meta not found: ${funcName}`)
194
- }
195
-
196
- // For addon packages, get or create their singleton services
197
- const resolvedSingletonServices = packageName
198
- ? await getOrCreatePackageSingletonServices(packageName, singletonServices)
199
- : singletonServices
200
-
201
- // Get the package's createWireServices if available
202
- let resolvedCreateWireServices = createWireServices
203
- if (packageName) {
204
- const factories = pikkuState(packageName, 'package', 'factories')
205
- if (factories?.createWireServices) {
206
- resolvedCreateWireServices = factories.createWireServices
207
- }
208
- }
209
-
210
- const allChannelMiddleware = combineChannelMiddleware(wireType, wireId, {
211
- wireInheritedChannelMiddleware: inheritedChannelMiddleware,
212
- wireChannelMiddleware,
213
- packageName,
214
- })
215
-
216
- const resolvedWire =
217
- allChannelMiddleware.length > 0 && wire.channel
218
- ? wrapChannelWithMiddleware(
219
- wire,
220
- resolvedSingletonServices,
221
- allChannelMiddleware
222
- )
223
- : wire
224
-
225
- // Convert tags to PermissionMetadata and merge with inheritedPermissions
226
- let mergedInheritedPermissions: PermissionMetadata[]
227
- if (tags && tags.length > 0) {
228
- mergedInheritedPermissions = [
229
- ...(inheritedPermissions || []),
230
- ...tags.map((tag) => ({ type: 'tag' as const, tag })),
231
- ]
232
- } else {
233
- mergedInheritedPermissions = inheritedPermissions || []
234
- }
235
-
236
- // Helper function to run permissions and execute the function
237
- const executeFunction = async () => {
238
- if (sessionService) {
239
- resolvedWire.session = sessionService.freezeInitial()
240
- resolvedWire.setSession = (s: any) => sessionService.set(s)
241
- resolvedWire.clearSession = () => sessionService.clear()
242
- resolvedWire.getSession = () => sessionService.get()
243
- resolvedWire.hasSessionChanged = () => sessionService.sessionChanged
244
- }
245
-
246
- const session = resolvedWire.session
247
-
248
- if (funcMeta.sessionless) {
249
- if (wiringAuth === true || funcConfig.auth === true) {
250
- if (!session) {
251
- throw new ForbiddenError('Authentication required')
252
- }
253
- }
254
- } else if (funcMeta.sessionless === false) {
255
- if (wiringAuth === false || funcConfig.auth === false) {
256
- resolvedSingletonServices.logger.warn(
257
- `Function '${funcName}' requires a session but auth was explicitly disabled — use pikkuSessionlessFunc instead.`
258
- )
259
- }
260
- if (!session) {
261
- throw new ForbiddenError('Authentication required')
262
- }
263
- } else {
264
- // TODO: Remove after a couple of releases — backward compat for
265
- // generated metadata that doesn't include the `sessionless` field yet.
266
- if (wiringAuth === true || funcConfig.auth === true) {
267
- if (!session) {
268
- throw new ForbiddenError('Authentication required')
269
- }
270
- }
271
- }
272
-
273
- if ((session as any)?.readonly && !funcMeta.readonly) {
274
- throw new ReadonlySessionError()
275
- }
276
-
277
- // Evaluate the data from the lazy function
278
- const actualData = await data()
279
-
280
- // Validate and coerce data if schema is defined
281
- const inputSchemaName = funcMeta.inputSchemaName
282
- if (inputSchemaName) {
283
- // Validate request data against the defined schema, if any
284
- await validateSchema(
285
- resolvedSingletonServices.logger,
286
- resolvedSingletonServices.schema,
287
- inputSchemaName,
288
- actualData,
289
- packageName
290
- )
291
- // Coerce (top level) query string parameters or date objects if specified by the schema
292
- if (coerceDataFromSchema) {
293
- coerceTopLevelDataFromSchema(inputSchemaName, actualData, packageName)
294
- }
295
- }
296
-
297
- if (
298
- mergedInheritedPermissions.length > 0 ||
299
- wirePermissions ||
300
- funcMeta.permissions ||
301
- funcConfig.permissions
302
- ) {
303
- await runPermissions(wireType, wireId, {
304
- wireInheritedPermissions: mergedInheritedPermissions,
305
- wirePermissions: wirePermissions,
306
- funcInheritedPermissions: funcMeta.permissions,
307
- funcPermissions: funcConfig.permissions,
308
- services: resolvedSingletonServices,
309
- wire: resolvedWire as any,
310
- data: actualData,
311
- packageName,
312
- })
313
- }
314
-
315
- const wireServices = await resolvedCreateWireServices?.(
316
- resolvedSingletonServices,
317
- resolvedWire
318
- )
319
- try {
320
- const services =
321
- wireServices && Object.keys(wireServices).length > 0
322
- ? { ...resolvedSingletonServices, ...wireServices }
323
- : resolvedSingletonServices
324
- Object.defineProperty(resolvedWire, 'rpc', {
325
- get() {
326
- const rpc = rpcService.getContextRPCService(services, resolvedWire, {
327
- sessionService,
328
- })
329
- Object.defineProperty(resolvedWire, 'rpc', {
330
- value: rpc,
331
- writable: true,
332
- configurable: true,
333
- })
334
- return rpc
335
- },
336
- configurable: true,
337
- enumerable: true,
338
- })
339
- return await funcConfig.func(services, actualData, resolvedWire)
340
- } finally {
341
- if (wireServices && Object.keys(wireServices).length > 0) {
342
- await closeWireServices(resolvedSingletonServices.logger, wireServices)
343
- }
344
- }
345
- }
346
-
347
- const allMiddleware = combineMiddleware(wireType, wireId, {
348
- wireInheritedMiddleware: inheritedMiddleware,
349
- wireMiddleware,
350
- funcInheritedMiddleware: funcMeta.middleware,
351
- funcMiddleware: funcConfig.middleware,
352
- packageName,
353
- })
354
-
355
- if (allMiddleware.length > 0) {
356
- return (await runMiddleware<CorePikkuMiddleware>(
357
- resolvedSingletonServices,
358
- resolvedWire,
359
- allMiddleware,
360
- executeFunction
361
- )) as Out
362
- }
363
-
364
- return (await executeFunction()) as Out
365
- }
@@ -1,267 +0,0 @@
1
- import type {
2
- CoreServices,
3
- CoreSingletonServices,
4
- CoreUserSession,
5
- CorePikkuMiddleware,
6
- PikkuWire,
7
- PickRequired,
8
- } from '../types/core.types.js'
9
- import type { StandardSchemaV1 } from '@standard-schema/spec'
10
- import type { CoreNodeConfig } from '../wirings/node/node.types.js'
11
-
12
- /**
13
- * @deprecated Use StandardSchemaV1 from @standard-schema/spec instead.
14
- * This alias exists only for backward compatibility with generated code.
15
- */
16
- export type ZodLike<T = any> = StandardSchemaV1<T, T>
17
-
18
- /**
19
- * Represents a core API function that performs an operation using core services and a user session.
20
- *
21
- * @template In - The input type.
22
- * @template Out - The output type.
23
- * @template Services - The services type, defaults to `CoreServices`.
24
- * @template Wire - The wire type, defaults to `PikkuWire<In, Out>`.
25
- */
26
- export type CorePikkuFunction<
27
- In,
28
- Out,
29
- Services extends CoreSingletonServices = CoreServices,
30
- Session extends CoreUserSession = CoreUserSession,
31
- Wire extends PikkuWire<In, Out> = PikkuWire<In, Out, true, Session>,
32
- > = (
33
- services: Services,
34
- data: In,
35
- wire: Wire
36
- ) => Wire['channel'] extends null ? Promise<Out> : Promise<Out> | Promise<void>
37
-
38
- /**
39
- * Represents a core API function that can be used without a session.
40
- *
41
- * @template In - The input type.
42
- * @template Out - The output type.
43
- * @template Services - The services type, defaults to `CoreServices`.
44
- * @template Wire - The wire type, defaults to `PikkuWire<In, Out>`.
45
- */
46
- export type CorePikkuFunctionSessionless<
47
- In,
48
- Out,
49
- Services extends CoreSingletonServices = CoreServices,
50
- Session extends CoreUserSession = CoreUserSession,
51
- Wire extends PikkuWire<In, Out, false, Session, any, any, any> = PikkuWire<
52
- In,
53
- Out,
54
- false,
55
- Session,
56
- any,
57
- any,
58
- any
59
- >,
60
- > = (
61
- services: Services,
62
- data: In,
63
- wire: Wire
64
- ) => Wire['channel'] extends null ? Promise<Out> : Promise<Out> | Promise<void>
65
-
66
- /**
67
- * Represents a function that checks permissions for a given operation.
68
- *
69
- * @template In - The input type.
70
- * @template Services - The services type, defaults to `CoreServices`.
71
- * @template Session - The session type, defaults to `CoreUserSession`.
72
- */
73
- export type CorePikkuPermission<
74
- In = any,
75
- Services extends CoreSingletonServices = CoreServices,
76
- Wire extends PikkuWire<
77
- In,
78
- never,
79
- false,
80
- CoreUserSession,
81
- any,
82
- never,
83
- never
84
- > = PikkuWire<In, never, false, CoreUserSession, never, never, never>,
85
- > = (services: Services, data: In, wire: Wire) => Promise<boolean>
86
-
87
- /**
88
- * Configuration object for creating a permission with metadata
89
- *
90
- * @template In - The input type.
91
- * @template Services - The services type, defaults to `CoreServices`.
92
- * @template Session - The session type, defaults to `CoreUserSession`.
93
- */
94
- export type CorePikkuPermissionConfig<
95
- In = any,
96
- Services extends CoreSingletonServices = CoreServices,
97
- Wire extends PikkuWire<In, never, false, CoreUserSession> = PikkuWire<
98
- In,
99
- never,
100
- false,
101
- CoreUserSession
102
- >,
103
- > = {
104
- /** The permission function */
105
- func: CorePikkuPermission<In, Services, Wire>
106
- /** Optional human-readable name for the permission */
107
- name?: string
108
- /** Optional description of what the permission checks */
109
- description?: string
110
- }
111
-
112
- /**
113
- * Factory function for creating permissions with tree-shaking support
114
- * Supports both direct function and configuration object syntax
115
- *
116
- * @example
117
- * ```typescript
118
- * // Direct function syntax
119
- * export const adminPermission = pikkuPermission(
120
- * async ({ logger }, _data, { getSession }) => {
121
- * const currentSession = await getSession()
122
- * return currentSession?.role === 'admin'
123
- * }
124
- * )
125
- *
126
- * // Configuration object syntax with metadata
127
- * export const adminPermission = pikkuPermission({
128
- * name: 'Admin Permission',
129
- * description: 'Checks if user has admin role',
130
- * func: async ({ logger }, _data, { getSession }) => {
131
- * const currentSession = await getSession()
132
- * return currentSession?.role === 'admin'
133
- * }
134
- * })
135
- * ```
136
- */
137
- export const pikkuPermission = <
138
- In = any,
139
- Services extends CoreSingletonServices = CoreServices,
140
- Wire extends PickRequired<
141
- PikkuWire<In, never, false, CoreUserSession>,
142
- 'session'
143
- > = PickRequired<PikkuWire<In, never, false, CoreUserSession>, 'session'>,
144
- >(
145
- permission:
146
- | CorePikkuPermission<In, Services, Wire>
147
- | CorePikkuPermissionConfig<In, Services, Wire>
148
- ): CorePikkuPermission<In, Services, Wire> => {
149
- return typeof permission === 'function' ? permission : permission.func
150
- }
151
-
152
- /**
153
- * A factory function that takes input and returns a permission
154
- * Used when permissions need configuration/input parameters
155
- *
156
- * @template In - The input type for the factory.
157
- * @template Services - The services type, defaults to `CoreServices`.
158
- * @template Session - The session type, defaults to `CoreUserSession`.
159
- */
160
- export type CorePikkuPermissionFactory<
161
- In = any,
162
- Services extends CoreSingletonServices = CoreServices,
163
- Wire extends PikkuWire<In, never, false, CoreUserSession> = PikkuWire<
164
- In,
165
- never,
166
- false,
167
- CoreUserSession
168
- >,
169
- > = (input: In) => CorePikkuPermission<any, Services, Wire>
170
-
171
- /**
172
- * Factory function for creating permission factories
173
- * Use this when your permission needs configuration/input parameters
174
- *
175
- * @example
176
- * ```typescript
177
- * export const requireRole = pikkuPermissionFactory<{ role: string }>(({
178
- * role
179
- * }) => {
180
- * return pikkuPermission(async ({ logger }, data, { getSession }) => {
181
- * const currentSession = await getSession()
182
- * if (!currentSession || currentSession.role !== role) {
183
- * logger.warn(`Permission denied: required role '${role}'`)
184
- * return false
185
- * }
186
- * return true
187
- * })
188
- * })
189
- * ```
190
- */
191
- export const pikkuPermissionFactory = <In = any>(
192
- factory: CorePikkuPermissionFactory<In>
193
- ): CorePikkuPermissionFactory<In> => {
194
- return factory
195
- }
196
-
197
- export type CorePikkuAuth<
198
- Services extends CoreSingletonServices = CoreServices,
199
- Session extends CoreUserSession = CoreUserSession,
200
- > = (services: Services, session: Session) => Promise<boolean> | boolean
201
-
202
- export type CorePikkuAuthConfig<
203
- Services extends CoreSingletonServices = CoreServices,
204
- Session extends CoreUserSession = CoreUserSession,
205
- > = {
206
- func: CorePikkuAuth<Services, Session>
207
- name?: string
208
- description?: string
209
- }
210
-
211
- export const pikkuAuth = <
212
- Services extends CoreSingletonServices = CoreServices,
213
- Session extends CoreUserSession = CoreUserSession,
214
- >(
215
- auth:
216
- | CorePikkuAuth<Services, Session>
217
- | CorePikkuAuthConfig<Services, Session>
218
- ): CorePikkuPermission<any, Services, any> => {
219
- const fn = typeof auth === 'function' ? auth : auth.func
220
- const wrapper = async (services: Services, _data: any, wire: any) => {
221
- const session = wire.session
222
- if (!session) return false
223
- return fn(services, session as Session)
224
- }
225
- return wrapper as any
226
- }
227
-
228
- export type CorePermissionGroup<PikkuPermission = CorePikkuPermission<any>> =
229
- | Record<string, PikkuPermission | PikkuPermission[]>
230
- | undefined
231
-
232
- export type CorePikkuFunctionConfig<
233
- PikkuFunction extends
234
- | CorePikkuFunction<any, any, any, any, any>
235
- | CorePikkuFunctionSessionless<any, any, any, any, any>,
236
- PikkuPermission extends CorePikkuPermission<
237
- any,
238
- any,
239
- any
240
- > = CorePikkuPermission<any>,
241
- PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<
242
- any,
243
- any
244
- >,
245
- InputSchema extends StandardSchemaV1 | undefined = undefined,
246
- OutputSchema extends StandardSchemaV1 | undefined = undefined,
247
- > = {
248
- /** Optional human-readable title for the function */
249
- title?: string
250
- /** Optional description of what the function does */
251
- description?: string
252
- override?: string
253
- version?: number
254
- tags?: string[]
255
- expose?: boolean
256
- remote?: boolean
257
- mcp?: boolean
258
- readonly?: boolean
259
- requiresApproval?: boolean
260
- func: PikkuFunction
261
- auth?: boolean
262
- permissions?: CorePermissionGroup<PikkuPermission>
263
- middleware?: PikkuMiddleware[]
264
- input?: InputSchema
265
- output?: OutputSchema
266
- node?: CoreNodeConfig
267
- }
@@ -1,5 +0,0 @@
1
- export { addFunction, getAllFunctionNames } from './function-runner.js'
2
- export type {
3
- CorePikkuFunction,
4
- CorePikkuFunctionSessionless,
5
- } from './functions.types.js'