@pikku/core 0.11.0 → 0.11.2

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 (184) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/dist/errors/error-handler.js +3 -3
  3. package/dist/errors/errors.d.ts +1 -1
  4. package/dist/errors/errors.js +3 -3
  5. package/dist/function/function-runner.d.ts +8 -8
  6. package/dist/function/function-runner.js +88 -23
  7. package/dist/function/functions.types.d.ts +104 -33
  8. package/dist/function/functions.types.js +50 -7
  9. package/dist/handle-error.d.ts +1 -1
  10. package/dist/handle-error.js +1 -1
  11. package/dist/index.d.ts +6 -2
  12. package/dist/index.js +5 -2
  13. package/dist/middleware/auth-apikey.d.ts +1 -1
  14. package/dist/middleware/auth-apikey.js +3 -3
  15. package/dist/middleware/auth-bearer.d.ts +1 -1
  16. package/dist/middleware/auth-bearer.js +3 -3
  17. package/dist/middleware/auth-cookie.d.ts +1 -1
  18. package/dist/middleware/auth-cookie.js +5 -5
  19. package/dist/middleware/timeout.d.ts +1 -1
  20. package/dist/middleware/timeout.js +3 -2
  21. package/dist/middleware-runner.d.ts +6 -20
  22. package/dist/middleware-runner.js +19 -20
  23. package/dist/permissions.d.ts +6 -89
  24. package/dist/permissions.js +24 -81
  25. package/dist/pikku-state.d.ts +32 -104
  26. package/dist/pikku-state.js +140 -66
  27. package/dist/schema.d.ts +8 -6
  28. package/dist/schema.js +25 -13
  29. package/dist/services/user-session-service.d.ts +7 -3
  30. package/dist/services/user-session-service.js +8 -1
  31. package/dist/services/workflow-service.d.ts +38 -0
  32. package/dist/services/workflow-service.js +1 -0
  33. package/dist/types/core.types.d.ts +40 -41
  34. package/dist/types/core.types.js +4 -15
  35. package/dist/types/state.types.d.ts +135 -0
  36. package/dist/types/state.types.js +1 -0
  37. package/dist/utils.d.ts +9 -1
  38. package/dist/utils.js +48 -3
  39. package/dist/wirings/channel/channel-common.js +2 -3
  40. package/dist/wirings/channel/channel-handler.d.ts +3 -2
  41. package/dist/wirings/channel/channel-handler.js +7 -10
  42. package/dist/wirings/channel/channel-runner.d.ts +2 -2
  43. package/dist/wirings/channel/channel-runner.js +5 -5
  44. package/dist/wirings/channel/channel.types.d.ts +10 -5
  45. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  46. package/dist/wirings/channel/local/local-channel-runner.js +19 -26
  47. package/dist/wirings/channel/log-channels.js +1 -1
  48. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  49. package/dist/wirings/channel/serverless/serverless-channel-runner.js +43 -48
  50. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
  51. package/dist/wirings/cli/cli-runner.d.ts +5 -5
  52. package/dist/wirings/cli/cli-runner.js +20 -38
  53. package/dist/wirings/cli/cli.types.d.ts +16 -11
  54. package/dist/wirings/forge-node/forge-node.types.d.ts +120 -0
  55. package/dist/wirings/forge-node/forge-node.types.js +38 -0
  56. package/dist/wirings/forge-node/index.d.ts +1 -0
  57. package/dist/wirings/forge-node/index.js +1 -0
  58. package/dist/wirings/http/http-runner.d.ts +8 -8
  59. package/dist/wirings/http/http-runner.js +46 -51
  60. package/dist/wirings/http/http.types.d.ts +19 -11
  61. package/dist/wirings/http/log-http-routes.js +1 -1
  62. package/dist/wirings/http/routers/path-to-regex.js +2 -2
  63. package/dist/wirings/mcp/mcp-runner.d.ts +2 -2
  64. package/dist/wirings/mcp/mcp-runner.js +33 -40
  65. package/dist/wirings/mcp/mcp.types.d.ts +6 -0
  66. package/dist/wirings/queue/queue-runner.d.ts +3 -3
  67. package/dist/wirings/queue/queue-runner.js +13 -23
  68. package/dist/wirings/queue/queue.types.d.ts +4 -11
  69. package/dist/wirings/rpc/index.d.ts +1 -1
  70. package/dist/wirings/rpc/index.js +1 -1
  71. package/dist/wirings/rpc/rpc-runner.d.ts +17 -16
  72. package/dist/wirings/rpc/rpc-runner.js +98 -61
  73. package/dist/wirings/rpc/rpc-types.d.ts +7 -0
  74. package/dist/wirings/scheduler/log-schedulers.js +1 -1
  75. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -3
  76. package/dist/wirings/scheduler/scheduler-runner.js +18 -29
  77. package/dist/wirings/scheduler/scheduler.types.d.ts +3 -8
  78. package/dist/wirings/trigger/index.d.ts +2 -0
  79. package/dist/wirings/trigger/index.js +2 -0
  80. package/dist/wirings/trigger/trigger-runner.d.ts +29 -0
  81. package/dist/wirings/trigger/trigger-runner.js +57 -0
  82. package/dist/wirings/trigger/trigger.types.d.ts +42 -0
  83. package/dist/wirings/trigger/trigger.types.js +1 -0
  84. package/dist/wirings/workflow/dsl/index.d.ts +5 -0
  85. package/dist/wirings/workflow/dsl/index.js +4 -0
  86. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +286 -0
  87. package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
  88. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
  89. package/dist/wirings/workflow/dsl/workflow-runner.js +22 -0
  90. package/dist/wirings/workflow/graph/graph-node.d.ts +122 -0
  91. package/dist/wirings/workflow/graph/graph-node.js +58 -0
  92. package/dist/wirings/workflow/graph/graph-runner.d.ts +35 -0
  93. package/dist/wirings/workflow/graph/graph-runner.js +452 -0
  94. package/dist/wirings/workflow/graph/index.d.ts +3 -0
  95. package/dist/wirings/workflow/graph/index.js +3 -0
  96. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +95 -0
  97. package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
  98. package/dist/wirings/workflow/index.d.ts +7 -3
  99. package/dist/wirings/workflow/index.js +6 -3
  100. package/dist/wirings/workflow/pikku-workflow-service.d.ts +108 -10
  101. package/dist/wirings/workflow/pikku-workflow-service.js +274 -165
  102. package/dist/wirings/workflow/wire-workflow.d.ts +42 -0
  103. package/dist/wirings/workflow/wire-workflow.js +53 -0
  104. package/dist/wirings/workflow/workflow-utils.d.ts +23 -0
  105. package/dist/wirings/workflow/workflow-utils.js +66 -0
  106. package/dist/wirings/workflow/workflow.types.d.ts +135 -128
  107. package/package.json +11 -2
  108. package/src/errors/error-handler.ts +3 -3
  109. package/src/errors/errors.ts +3 -3
  110. package/src/factory-functions.test.ts +9 -36
  111. package/src/function/function-runner.test.ts +58 -69
  112. package/src/function/function-runner.ts +130 -37
  113. package/src/function/functions.types.ts +193 -54
  114. package/src/handle-error.ts +1 -1
  115. package/src/index.ts +10 -5
  116. package/src/middleware/auth-apikey.test.ts +360 -0
  117. package/src/middleware/auth-apikey.ts +3 -7
  118. package/src/middleware/auth-bearer.test.ts +447 -0
  119. package/src/middleware/auth-bearer.ts +27 -33
  120. package/src/middleware/auth-cookie.test.ts +525 -0
  121. package/src/middleware/auth-cookie.ts +6 -6
  122. package/src/middleware/timeout.ts +4 -2
  123. package/src/middleware-runner.test.ts +58 -127
  124. package/src/middleware-runner.ts +29 -25
  125. package/src/permissions.test.ts +68 -130
  126. package/src/permissions.ts +41 -100
  127. package/src/pikku-state.ts +156 -201
  128. package/src/schema.ts +42 -13
  129. package/src/services/user-session-service.ts +14 -4
  130. package/src/services/workflow-service.ts +74 -0
  131. package/src/types/core.types.ts +79 -58
  132. package/src/types/state.types.ts +195 -0
  133. package/src/utils.ts +59 -4
  134. package/src/wirings/channel/channel-common.ts +4 -7
  135. package/src/wirings/channel/channel-handler.ts +17 -23
  136. package/src/wirings/channel/channel-runner.ts +7 -7
  137. package/src/wirings/channel/channel.types.ts +14 -11
  138. package/src/wirings/channel/local/local-channel-runner.test.ts +8 -4
  139. package/src/wirings/channel/local/local-channel-runner.ts +23 -38
  140. package/src/wirings/channel/log-channels.ts +1 -1
  141. package/src/wirings/channel/serverless/serverless-channel-runner.ts +53 -79
  142. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
  143. package/src/wirings/cli/cli-runner.test.ts +26 -26
  144. package/src/wirings/cli/cli-runner.ts +34 -71
  145. package/src/wirings/cli/cli.types.ts +23 -16
  146. package/src/wirings/forge-node/forge-node.types.ts +135 -0
  147. package/src/wirings/forge-node/index.ts +1 -0
  148. package/src/wirings/http/http-runner.test.ts +10 -10
  149. package/src/wirings/http/http-runner.ts +56 -66
  150. package/src/wirings/http/http.types.ts +19 -14
  151. package/src/wirings/http/log-http-routes.ts +1 -1
  152. package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
  153. package/src/wirings/http/routers/path-to-regex.ts +2 -2
  154. package/src/wirings/mcp/mcp-runner.ts +44 -69
  155. package/src/wirings/mcp/mcp.types.ts +6 -0
  156. package/src/wirings/queue/queue-runner.test.ts +641 -0
  157. package/src/wirings/queue/queue-runner.ts +16 -38
  158. package/src/wirings/queue/queue.types.ts +4 -11
  159. package/src/wirings/rpc/index.ts +1 -1
  160. package/src/wirings/rpc/rpc-runner.ts +129 -77
  161. package/src/wirings/rpc/rpc-types.ts +8 -0
  162. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  163. package/src/wirings/scheduler/scheduler-runner.test.ts +627 -0
  164. package/src/wirings/scheduler/scheduler-runner.ts +29 -55
  165. package/src/wirings/scheduler/scheduler.types.ts +3 -9
  166. package/src/wirings/trigger/index.ts +2 -0
  167. package/src/wirings/trigger/trigger-runner.ts +96 -0
  168. package/src/wirings/trigger/trigger.types.ts +56 -0
  169. package/src/wirings/workflow/dsl/index.ts +30 -0
  170. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +312 -0
  171. package/src/wirings/workflow/dsl/workflow-runner.ts +27 -0
  172. package/src/wirings/workflow/graph/graph-node.ts +227 -0
  173. package/src/wirings/workflow/graph/graph-runner.ts +694 -0
  174. package/src/wirings/workflow/graph/index.ts +3 -0
  175. package/src/wirings/workflow/graph/workflow-graph.types.ts +126 -0
  176. package/src/wirings/workflow/index.ts +60 -12
  177. package/src/wirings/workflow/pikku-workflow-service.ts +401 -195
  178. package/src/wirings/workflow/wire-workflow.ts +94 -0
  179. package/src/wirings/workflow/workflow-utils.ts +120 -0
  180. package/src/wirings/workflow/workflow.types.ts +167 -188
  181. package/tsconfig.tsbuildinfo +1 -1
  182. package/dist/wirings/workflow/workflow-runner.d.ts +0 -35
  183. package/dist/wirings/workflow/workflow-runner.js +0 -68
  184. package/src/wirings/workflow/workflow-runner.ts +0 -85
@@ -23,6 +23,7 @@ describe('PathToRegexRouter', () => {
23
23
  test('should correctly identify static routes', () => {
24
24
  // Setup test routes
25
25
  pikkuState(
26
+ null,
26
27
  'http',
27
28
  'routes',
28
29
  new Map([
@@ -36,8 +37,8 @@ describe('PathToRegexRouter', () => {
36
37
  ],
37
38
  ])
38
39
  )
39
- pikkuState('http', 'middleware', new Map())
40
- pikkuState('channel', 'channels', new Map())
40
+ pikkuState(null, 'http', 'middleware', new Map())
41
+ pikkuState(null, 'channel', 'channels', new Map())
41
42
 
42
43
  router.initialize()
43
44
 
@@ -56,6 +57,7 @@ describe('PathToRegexRouter', () => {
56
57
  test('should handle dynamic routes with parameters', () => {
57
58
  // Setup test routes with parameters
58
59
  pikkuState(
60
+ null,
59
61
  'http',
60
62
  'routes',
61
63
  new Map([
@@ -71,8 +73,8 @@ describe('PathToRegexRouter', () => {
71
73
  ],
72
74
  ])
73
75
  )
74
- pikkuState('http', 'middleware', new Map())
75
- pikkuState('channel', 'channels', new Map())
76
+ pikkuState(null, 'http', 'middleware', new Map())
77
+ pikkuState(null, 'channel', 'channels', new Map())
76
78
 
77
79
  router.initialize()
78
80
 
@@ -98,6 +100,7 @@ describe('PathToRegexRouter', () => {
98
100
  test('should handle multi-parameter routes', () => {
99
101
  // Setup routes with multiple parameters
100
102
  pikkuState(
103
+ null,
101
104
  'http',
102
105
  'routes',
103
106
  new Map([
@@ -116,8 +119,8 @@ describe('PathToRegexRouter', () => {
116
119
  ],
117
120
  ])
118
121
  )
119
- pikkuState('http', 'middleware', new Map())
120
- pikkuState('channel', 'channels', new Map())
122
+ pikkuState(null, 'http', 'middleware', new Map())
123
+ pikkuState(null, 'channel', 'channels', new Map())
121
124
 
122
125
  router.initialize()
123
126
 
@@ -139,6 +142,7 @@ describe('PathToRegexRouter', () => {
139
142
  test('should prioritize static routes over dynamic routes for performance', () => {
140
143
  // Setup mixed routes where static could conflict with dynamic
141
144
  pikkuState(
145
+ null,
142
146
  'http',
143
147
  'routes',
144
148
  new Map([
@@ -151,8 +155,8 @@ describe('PathToRegexRouter', () => {
151
155
  ],
152
156
  ])
153
157
  )
154
- pikkuState('http', 'middleware', new Map())
155
- pikkuState('channel', 'channels', new Map())
158
+ pikkuState(null, 'http', 'middleware', new Map())
159
+ pikkuState(null, 'channel', 'channels', new Map())
156
160
 
157
161
  router.initialize()
158
162
 
@@ -167,6 +171,7 @@ describe('PathToRegexRouter', () => {
167
171
  describe('Path Normalization', () => {
168
172
  test('should normalize paths without leading slash', () => {
169
173
  pikkuState(
174
+ null,
170
175
  'http',
171
176
  'routes',
172
177
  new Map([
@@ -179,8 +184,8 @@ describe('PathToRegexRouter', () => {
179
184
  ],
180
185
  ])
181
186
  )
182
- pikkuState('http', 'middleware', new Map())
183
- pikkuState('channel', 'channels', new Map())
187
+ pikkuState(null, 'http', 'middleware', new Map())
188
+ pikkuState(null, 'channel', 'channels', new Map())
184
189
 
185
190
  router.initialize()
186
191
 
@@ -201,9 +206,10 @@ describe('PathToRegexRouter', () => {
201
206
 
202
207
  describe('Channel Routes Integration', () => {
203
208
  test('should handle channel routes as GET routes', () => {
204
- pikkuState('http', 'routes', new Map())
205
- pikkuState('http', 'middleware', new Map())
209
+ pikkuState(null, 'http', 'routes', new Map())
210
+ pikkuState(null, 'http', 'middleware', new Map())
206
211
  pikkuState(
212
+ null,
207
213
  'channel',
208
214
  'channels',
209
215
  new Map([
@@ -233,11 +239,13 @@ describe('PathToRegexRouter', () => {
233
239
  const routeMiddleware = [async () => {}]
234
240
 
235
241
  pikkuState(
242
+ null,
236
243
  'http',
237
244
  'routes',
238
245
  new Map([['get', new Map([['/api/test', mockRoute('/api/test')]])]])
239
246
  )
240
247
  pikkuState(
248
+ null,
241
249
  'http',
242
250
  'middleware',
243
251
  new Map([
@@ -245,7 +253,7 @@ describe('PathToRegexRouter', () => {
245
253
  ['/api/test', routeMiddleware],
246
254
  ])
247
255
  )
248
- pikkuState('channel', 'channels', new Map())
256
+ pikkuState(null, 'channel', 'channels', new Map())
249
257
 
250
258
  router.initialize()
251
259
 
@@ -260,12 +268,13 @@ describe('PathToRegexRouter', () => {
260
268
  describe('No Match Scenarios', () => {
261
269
  test('should return null for non-existent routes', () => {
262
270
  pikkuState(
271
+ null,
263
272
  'http',
264
273
  'routes',
265
274
  new Map([['get', new Map([['/existing', mockRoute('/existing')]])]])
266
275
  )
267
- pikkuState('http', 'middleware', new Map())
268
- pikkuState('channel', 'channels', new Map())
276
+ pikkuState(null, 'http', 'middleware', new Map())
277
+ pikkuState(null, 'channel', 'channels', new Map())
269
278
 
270
279
  router.initialize()
271
280
 
@@ -275,12 +284,13 @@ describe('PathToRegexRouter', () => {
275
284
 
276
285
  test('should return null for unsupported HTTP methods', () => {
277
286
  pikkuState(
287
+ null,
278
288
  'http',
279
289
  'routes',
280
290
  new Map([['get', new Map([['/test', mockRoute('/test')]])]])
281
291
  )
282
- pikkuState('http', 'middleware', new Map())
283
- pikkuState('channel', 'channels', new Map())
292
+ pikkuState(null, 'http', 'middleware', new Map())
293
+ pikkuState(null, 'channel', 'channels', new Map())
284
294
 
285
295
  router.initialize()
286
296
 
@@ -292,12 +302,13 @@ describe('PathToRegexRouter', () => {
292
302
  describe('Lazy Initialization', () => {
293
303
  test('should initialize automatically on first match call', () => {
294
304
  pikkuState(
305
+ null,
295
306
  'http',
296
307
  'routes',
297
308
  new Map([['get', new Map([['/test', mockRoute('/test')]])]])
298
309
  )
299
- pikkuState('http', 'middleware', new Map())
300
- pikkuState('channel', 'channels', new Map())
310
+ pikkuState(null, 'http', 'middleware', new Map())
311
+ pikkuState(null, 'channel', 'channels', new Map())
301
312
 
302
313
  // Don't call initialize manually
303
314
  const result = router.match('get', '/test')
@@ -25,8 +25,8 @@ export class PathToRegexRouter implements Router {
25
25
  }
26
26
 
27
27
  public initialize() {
28
- const routes = pikkuState('http', 'routes')
29
- const channelRoutes = pikkuState('channel', 'channels')
28
+ const routes = pikkuState(null, 'http', 'routes')
29
+ const channelRoutes = pikkuState(null, 'channel', 'channels')
30
30
 
31
31
  // Helper function to compile routes for a given method
32
32
  const compileRoutesForMethod = (
@@ -1,10 +1,9 @@
1
1
  import {
2
- PikkuInteraction,
3
- PikkuWiringTypes,
2
+ PikkuWire,
4
3
  type CoreServices,
5
4
  type CoreSingletonServices,
6
5
  type CoreUserSession,
7
- type CreateSessionServices,
6
+ type CreateWireServices,
8
7
  } from '../../types/core.types.js'
9
8
  import type {
10
9
  CoreMCPResource,
@@ -20,11 +19,11 @@ import type {
20
19
  CorePikkuFunctionSessionless,
21
20
  } from '../../function/functions.types.js'
22
21
  import { getErrorResponse } from '../../errors/error-handler.js'
23
- import { closeSessionServices } from '../../utils.js'
22
+ import { closeWireServices } from '../../utils.js'
24
23
  import { pikkuState } from '../../pikku-state.js'
25
24
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
26
- import { rpcService } from '../rpc/rpc-runner.js'
27
25
  import { BadRequestError, NotFoundError } from '../../errors/errors.js'
26
+ import { PikkuSessionService } from '../../services/user-session-service.js'
28
27
 
29
28
  export class MCPError extends Error {
30
29
  constructor(public readonly error: JsonRpcErrorResponse) {
@@ -37,7 +36,7 @@ export class MCPError extends Error {
37
36
  export type RunMCPEndpointParams<Tools extends string = any> = {
38
37
  singletonServices: CoreSingletonServices
39
38
  mcp?: PikkuMCP<Tools>
40
- createSessionServices?: CreateSessionServices<
39
+ createWireServices?: CreateWireServices<
41
40
  CoreSingletonServices,
42
41
  CoreServices<CoreSingletonServices>,
43
42
  CoreUserSession
@@ -57,13 +56,13 @@ export const wireMCPResource = <
57
56
  >(
58
57
  mcpResource: CoreMCPResource<PikkuFunctionConfig>
59
58
  ) => {
60
- const resourcesMeta = pikkuState('mcp', 'resourcesMeta')
59
+ const resourcesMeta = pikkuState(null, 'mcp', 'resourcesMeta')
61
60
  const mcpResourceMeta = resourcesMeta[mcpResource.uri]
62
61
  if (!mcpResourceMeta) {
63
62
  throw new Error(`MCP resource metadata not found for '${mcpResource.uri}'`)
64
63
  }
65
64
  addFunction(mcpResourceMeta.pikkuFuncName, mcpResource.func as any)
66
- const resources = pikkuState('mcp', 'resources')
65
+ const resources = pikkuState(null, 'mcp', 'resources')
67
66
  if (resources.has(mcpResource.uri)) {
68
67
  throw new Error(`MCP resource already exists: ${mcpResource.uri}`)
69
68
  }
@@ -77,13 +76,13 @@ export const wireMCPTool = <
77
76
  >(
78
77
  mcpTool: CoreMCPTool<PikkuFunctionConfig>
79
78
  ) => {
80
- const toolsMeta = pikkuState('mcp', 'toolsMeta')
79
+ const toolsMeta = pikkuState(null, 'mcp', 'toolsMeta')
81
80
  const mcpToolMeta = toolsMeta[mcpTool.name]
82
81
  if (!mcpToolMeta) {
83
82
  throw new Error(`MCP tool metadata not found for '${mcpTool.name}'`)
84
83
  }
85
84
  addFunction(mcpToolMeta.pikkuFuncName, mcpTool.func as any)
86
- const tools = pikkuState('mcp', 'tools')
85
+ const tools = pikkuState(null, 'mcp', 'tools')
87
86
  if (tools.has(mcpTool.name)) {
88
87
  throw new Error(`MCP tool already exists: ${mcpTool.name}`)
89
88
  }
@@ -97,13 +96,13 @@ export const wireMCPPrompt = <
97
96
  >(
98
97
  mcpPrompt: CoreMCPPrompt<PikkuFunctionConfig>
99
98
  ) => {
100
- const promptsMeta = pikkuState('mcp', 'promptsMeta')
99
+ const promptsMeta = pikkuState(null, 'mcp', 'promptsMeta')
101
100
  const mcpPromptMeta = promptsMeta[mcpPrompt.name]
102
101
  if (!mcpPromptMeta) {
103
102
  throw new Error(`MCP prompt metadata not found for '${mcpPrompt.name}'`)
104
103
  }
105
104
  addFunction(mcpPromptMeta.pikkuFuncName, mcpPrompt.func as any)
106
- const prompts = pikkuState('mcp', 'prompts')
105
+ const prompts = pikkuState(null, 'mcp', 'prompts')
107
106
  if (prompts.has(mcpPrompt.name)) {
108
107
  throw new Error(`MCP prompt already exists: ${mcpPrompt.name}`)
109
108
  }
@@ -119,8 +118,8 @@ export async function runMCPResource(
119
118
  let pikkuFuncName: string | undefined
120
119
  let extractedParams: Record<string, string> = {}
121
120
 
122
- const metas = pikkuState('mcp', 'resourcesMeta')
123
- const endpoints = pikkuState('mcp', 'resources')
121
+ const metas = pikkuState(null, 'mcp', 'resourcesMeta')
122
+ const endpoints = pikkuState(null, 'mcp', 'resources')
124
123
 
125
124
  if (endpoints.has(uri)) {
126
125
  endpoint = endpoints.get(uri)
@@ -171,8 +170,8 @@ export async function runMCPTool(
171
170
  params: RunMCPEndpointParams,
172
171
  name: string
173
172
  ) {
174
- const endpoint = pikkuState('mcp', 'tools').get(name)
175
- const meta = pikkuState('mcp', 'toolsMeta')[name]
173
+ const endpoint = pikkuState(null, 'mcp', 'tools').get(name)
174
+ const meta = pikkuState(null, 'mcp', 'toolsMeta')[name]
176
175
  return await runMCPPikkuFunc(
177
176
  request,
178
177
  'tool',
@@ -188,8 +187,8 @@ export async function runMCPPrompt(
188
187
  params: RunMCPEndpointParams,
189
188
  name: string
190
189
  ) {
191
- const endpoint = pikkuState('mcp', 'prompts').get(name)
192
- const meta = pikkuState('mcp', 'promptsMeta')[name]
190
+ const endpoint = pikkuState(null, 'mcp', 'prompts').get(name)
191
+ const meta = pikkuState(null, 'mcp', 'promptsMeta')[name]
193
192
  return await runMCPPikkuFunc(
194
193
  request,
195
194
  'prompt',
@@ -209,13 +208,9 @@ async function runMCPPikkuFunc(
209
208
  name: string,
210
209
  mcp: CoreMCPResource | CoreMCPTool | CoreMCPPrompt | undefined,
211
210
  pikkuFuncName: string | undefined,
212
- {
213
- singletonServices,
214
- createSessionServices,
215
- mcp: mcpInteraction,
216
- }: RunMCPEndpointParams
211
+ { singletonServices, createWireServices, mcp: mcpWire }: RunMCPEndpointParams
217
212
  ): Promise<JsonRpcResponse> {
218
- let sessionServices: any
213
+ let wireServices: any
219
214
 
220
215
  try {
221
216
  // Validate JSON-RPC request structure
@@ -239,52 +234,32 @@ async function runMCPPikkuFunc(
239
234
 
240
235
  singletonServices.logger.debug(`Running MCP ${type}: ${name}`)
241
236
 
242
- const interaction: PikkuInteraction = { mcp: mcpInteraction }
243
-
244
- const getAllServices = async () => {
245
- sessionServices = await createSessionServices?.(
246
- singletonServices,
247
- interaction,
248
- undefined
249
- )
250
-
251
- return rpcService.injectRPCService(
252
- {
253
- ...singletonServices,
254
- ...sessionServices,
255
- mcp: mcpInteraction,
256
- },
257
- interaction
258
- )
237
+ const wire: PikkuWire = {
238
+ mcp: mcpWire,
239
+ session: new PikkuSessionService(),
259
240
  }
260
241
 
261
242
  // Get metadata for the MCP endpoint to access pre-resolved middleware
262
243
  let meta: any
263
244
  if (type === 'resource') {
264
- meta = pikkuState('mcp', 'resourcesMeta')[name]
245
+ meta = pikkuState(null, 'mcp', 'resourcesMeta')[name]
265
246
  } else if (type === 'tool') {
266
- meta = pikkuState('mcp', 'toolsMeta')[name]
247
+ meta = pikkuState(null, 'mcp', 'toolsMeta')[name]
267
248
  } else if (type === 'prompt') {
268
- meta = pikkuState('mcp', 'promptsMeta')[name]
249
+ meta = pikkuState(null, 'mcp', 'promptsMeta')[name]
269
250
  }
270
251
 
271
- const result = await runPikkuFunc(
272
- PikkuWiringTypes.mcp,
273
- `${type}:${name}`,
274
- pikkuFuncName,
275
- {
276
- singletonServices,
277
- getAllServices,
278
- userSession: undefined, // TODO
279
- data: () => request.params,
280
- inheritedMiddleware: meta?.middleware,
281
- wireMiddleware: mcp.middleware,
282
- inheritedPermissions: meta?.permissions,
283
- wirePermissions: mcp.permissions,
284
- tags: mcp.tags,
285
- interaction,
286
- }
287
- )
252
+ const result = await runPikkuFunc('mcp', `${type}:${name}`, pikkuFuncName, {
253
+ singletonServices,
254
+ createWireServices,
255
+ data: () => request.params,
256
+ inheritedMiddleware: meta?.middleware,
257
+ wireMiddleware: mcp.middleware,
258
+ inheritedPermissions: meta?.permissions,
259
+ wirePermissions: mcp.permissions,
260
+ tags: mcp.tags,
261
+ wire,
262
+ })
288
263
 
289
264
  return {
290
265
  id: request.id,
@@ -316,32 +291,32 @@ async function runMCPPikkuFunc(
316
291
  })
317
292
  }
318
293
  } finally {
319
- if (sessionServices) {
320
- await closeSessionServices(singletonServices.logger, sessionServices)
294
+ if (wireServices) {
295
+ await closeWireServices(singletonServices.logger, wireServices)
321
296
  }
322
297
  }
323
298
  }
324
299
 
325
300
  export const getMCPTools = () => {
326
- return pikkuState('mcp', 'tools')
301
+ return pikkuState(null, 'mcp', 'tools')
327
302
  }
328
303
 
329
304
  export const getMCPResources = () => {
330
- return pikkuState('mcp', 'resources')
305
+ return pikkuState(null, 'mcp', 'resources')
331
306
  }
332
307
 
333
308
  export const getMCPResourcesMeta = () => {
334
- return pikkuState('mcp', 'resourcesMeta')
309
+ return pikkuState(null, 'mcp', 'resourcesMeta')
335
310
  }
336
311
 
337
312
  export const getMCPToolsMeta = () => {
338
- return pikkuState('mcp', 'toolsMeta')
313
+ return pikkuState(null, 'mcp', 'toolsMeta')
339
314
  }
340
315
 
341
316
  export const getMCPPrompts = () => {
342
- return pikkuState('mcp', 'prompts')
317
+ return pikkuState(null, 'mcp', 'prompts')
343
318
  }
344
319
 
345
320
  export const getMCPPromptsMeta = () => {
346
- return pikkuState('mcp', 'promptsMeta')
321
+ return pikkuState(null, 'mcp', 'promptsMeta')
347
322
  }
@@ -104,6 +104,8 @@ export type CoreMCPResource<
104
104
  uri: string
105
105
  title: string
106
106
  description: string
107
+ summary?: string
108
+ errors?: string[]
107
109
  mimeType?: string
108
110
  size?: number
109
111
  streaming?: boolean
@@ -126,6 +128,8 @@ export type CoreMCPTool<
126
128
  name: string
127
129
  title?: string
128
130
  description: string
131
+ summary?: string
132
+ errors?: string[]
129
133
  func: PikkuFunctionConfig
130
134
  tags?: string[]
131
135
  streaming?: boolean
@@ -145,6 +149,8 @@ export type CoreMCPPrompt<
145
149
  > = {
146
150
  name: string
147
151
  description: string
152
+ summary?: string
153
+ errors?: string[]
148
154
  func: PikkuFunctionConfig
149
155
  tags?: string[]
150
156
  middleware?: PikkuMiddleware[]