@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.
- package/CHANGELOG.md +35 -1
- package/dist/errors/error-handler.js +3 -3
- package/dist/errors/errors.d.ts +1 -1
- package/dist/errors/errors.js +3 -3
- package/dist/function/function-runner.d.ts +8 -8
- package/dist/function/function-runner.js +88 -23
- package/dist/function/functions.types.d.ts +104 -33
- package/dist/function/functions.types.js +50 -7
- package/dist/handle-error.d.ts +1 -1
- package/dist/handle-error.js +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-bearer.js +3 -3
- package/dist/middleware/auth-cookie.d.ts +1 -1
- package/dist/middleware/auth-cookie.js +5 -5
- package/dist/middleware/timeout.d.ts +1 -1
- package/dist/middleware/timeout.js +3 -2
- package/dist/middleware-runner.d.ts +6 -20
- package/dist/middleware-runner.js +19 -20
- package/dist/permissions.d.ts +6 -89
- package/dist/permissions.js +24 -81
- package/dist/pikku-state.d.ts +32 -104
- package/dist/pikku-state.js +140 -66
- package/dist/schema.d.ts +8 -6
- package/dist/schema.js +25 -13
- package/dist/services/user-session-service.d.ts +7 -3
- package/dist/services/user-session-service.js +8 -1
- package/dist/services/workflow-service.d.ts +38 -0
- package/dist/services/workflow-service.js +1 -0
- package/dist/types/core.types.d.ts +40 -41
- package/dist/types/core.types.js +4 -15
- package/dist/types/state.types.d.ts +135 -0
- package/dist/types/state.types.js +1 -0
- package/dist/utils.d.ts +9 -1
- package/dist/utils.js +48 -3
- package/dist/wirings/channel/channel-common.js +2 -3
- package/dist/wirings/channel/channel-handler.d.ts +3 -2
- package/dist/wirings/channel/channel-handler.js +7 -10
- package/dist/wirings/channel/channel-runner.d.ts +2 -2
- package/dist/wirings/channel/channel-runner.js +5 -5
- package/dist/wirings/channel/channel.types.d.ts +10 -5
- package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-runner.js +19 -26
- package/dist/wirings/channel/log-channels.js +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +43 -48
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
- package/dist/wirings/cli/cli-runner.d.ts +5 -5
- package/dist/wirings/cli/cli-runner.js +20 -38
- package/dist/wirings/cli/cli.types.d.ts +16 -11
- package/dist/wirings/forge-node/forge-node.types.d.ts +120 -0
- package/dist/wirings/forge-node/forge-node.types.js +38 -0
- package/dist/wirings/forge-node/index.d.ts +1 -0
- package/dist/wirings/forge-node/index.js +1 -0
- package/dist/wirings/http/http-runner.d.ts +8 -8
- package/dist/wirings/http/http-runner.js +46 -51
- package/dist/wirings/http/http.types.d.ts +19 -11
- package/dist/wirings/http/log-http-routes.js +1 -1
- package/dist/wirings/http/routers/path-to-regex.js +2 -2
- package/dist/wirings/mcp/mcp-runner.d.ts +2 -2
- package/dist/wirings/mcp/mcp-runner.js +33 -40
- package/dist/wirings/mcp/mcp.types.d.ts +6 -0
- package/dist/wirings/queue/queue-runner.d.ts +3 -3
- package/dist/wirings/queue/queue-runner.js +13 -23
- package/dist/wirings/queue/queue.types.d.ts +4 -11
- package/dist/wirings/rpc/index.d.ts +1 -1
- package/dist/wirings/rpc/index.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +17 -16
- package/dist/wirings/rpc/rpc-runner.js +98 -61
- package/dist/wirings/rpc/rpc-types.d.ts +7 -0
- package/dist/wirings/scheduler/log-schedulers.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -3
- package/dist/wirings/scheduler/scheduler-runner.js +18 -29
- package/dist/wirings/scheduler/scheduler.types.d.ts +3 -8
- package/dist/wirings/trigger/index.d.ts +2 -0
- package/dist/wirings/trigger/index.js +2 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +29 -0
- package/dist/wirings/trigger/trigger-runner.js +57 -0
- package/dist/wirings/trigger/trigger.types.d.ts +42 -0
- package/dist/wirings/trigger/trigger.types.js +1 -0
- package/dist/wirings/workflow/dsl/index.d.ts +5 -0
- package/dist/wirings/workflow/dsl/index.js +4 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +286 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +22 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +122 -0
- package/dist/wirings/workflow/graph/graph-node.js +58 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +35 -0
- package/dist/wirings/workflow/graph/graph-runner.js +452 -0
- package/dist/wirings/workflow/graph/index.d.ts +3 -0
- package/dist/wirings/workflow/graph/index.js +3 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +95 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
- package/dist/wirings/workflow/index.d.ts +7 -3
- package/dist/wirings/workflow/index.js +6 -3
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +108 -10
- package/dist/wirings/workflow/pikku-workflow-service.js +274 -165
- package/dist/wirings/workflow/wire-workflow.d.ts +42 -0
- package/dist/wirings/workflow/wire-workflow.js +53 -0
- package/dist/wirings/workflow/workflow-utils.d.ts +23 -0
- package/dist/wirings/workflow/workflow-utils.js +66 -0
- package/dist/wirings/workflow/workflow.types.d.ts +135 -128
- package/package.json +11 -2
- package/src/errors/error-handler.ts +3 -3
- package/src/errors/errors.ts +3 -3
- package/src/factory-functions.test.ts +9 -36
- package/src/function/function-runner.test.ts +58 -69
- package/src/function/function-runner.ts +130 -37
- package/src/function/functions.types.ts +193 -54
- package/src/handle-error.ts +1 -1
- package/src/index.ts +10 -5
- package/src/middleware/auth-apikey.test.ts +360 -0
- package/src/middleware/auth-apikey.ts +3 -7
- package/src/middleware/auth-bearer.test.ts +447 -0
- package/src/middleware/auth-bearer.ts +27 -33
- package/src/middleware/auth-cookie.test.ts +525 -0
- package/src/middleware/auth-cookie.ts +6 -6
- package/src/middleware/timeout.ts +4 -2
- package/src/middleware-runner.test.ts +58 -127
- package/src/middleware-runner.ts +29 -25
- package/src/permissions.test.ts +68 -130
- package/src/permissions.ts +41 -100
- package/src/pikku-state.ts +156 -201
- package/src/schema.ts +42 -13
- package/src/services/user-session-service.ts +14 -4
- package/src/services/workflow-service.ts +74 -0
- package/src/types/core.types.ts +79 -58
- package/src/types/state.types.ts +195 -0
- package/src/utils.ts +59 -4
- package/src/wirings/channel/channel-common.ts +4 -7
- package/src/wirings/channel/channel-handler.ts +17 -23
- package/src/wirings/channel/channel-runner.ts +7 -7
- package/src/wirings/channel/channel.types.ts +14 -11
- package/src/wirings/channel/local/local-channel-runner.test.ts +8 -4
- package/src/wirings/channel/local/local-channel-runner.ts +23 -38
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +53 -79
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
- package/src/wirings/cli/cli-runner.test.ts +26 -26
- package/src/wirings/cli/cli-runner.ts +34 -71
- package/src/wirings/cli/cli.types.ts +23 -16
- package/src/wirings/forge-node/forge-node.types.ts +135 -0
- package/src/wirings/forge-node/index.ts +1 -0
- package/src/wirings/http/http-runner.test.ts +10 -10
- package/src/wirings/http/http-runner.ts +56 -66
- package/src/wirings/http/http.types.ts +19 -14
- package/src/wirings/http/log-http-routes.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
- package/src/wirings/http/routers/path-to-regex.ts +2 -2
- package/src/wirings/mcp/mcp-runner.ts +44 -69
- package/src/wirings/mcp/mcp.types.ts +6 -0
- package/src/wirings/queue/queue-runner.test.ts +641 -0
- package/src/wirings/queue/queue-runner.ts +16 -38
- package/src/wirings/queue/queue.types.ts +4 -11
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +129 -77
- package/src/wirings/rpc/rpc-types.ts +8 -0
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +627 -0
- package/src/wirings/scheduler/scheduler-runner.ts +29 -55
- package/src/wirings/scheduler/scheduler.types.ts +3 -9
- package/src/wirings/trigger/index.ts +2 -0
- package/src/wirings/trigger/trigger-runner.ts +96 -0
- package/src/wirings/trigger/trigger.types.ts +56 -0
- package/src/wirings/workflow/dsl/index.ts +30 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +312 -0
- package/src/wirings/workflow/dsl/workflow-runner.ts +27 -0
- package/src/wirings/workflow/graph/graph-node.ts +227 -0
- package/src/wirings/workflow/graph/graph-runner.ts +694 -0
- package/src/wirings/workflow/graph/index.ts +3 -0
- package/src/wirings/workflow/graph/workflow-graph.types.ts +126 -0
- package/src/wirings/workflow/index.ts +60 -12
- package/src/wirings/workflow/pikku-workflow-service.ts +401 -195
- package/src/wirings/workflow/wire-workflow.ts +94 -0
- package/src/wirings/workflow/workflow-utils.ts +120 -0
- package/src/wirings/workflow/workflow.types.ts +167 -188
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/workflow/workflow-runner.d.ts +0 -35
- package/dist/wirings/workflow/workflow-runner.js +0 -68
- 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
|
-
|
|
3
|
-
PikkuWiringTypes,
|
|
2
|
+
PikkuWire,
|
|
4
3
|
type CoreServices,
|
|
5
4
|
type CoreSingletonServices,
|
|
6
5
|
type CoreUserSession,
|
|
7
|
-
type
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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 (
|
|
320
|
-
await
|
|
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[]
|