@pikku/cli 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/.pikku/channel/pikku-channel-types.gen.ts +11 -12
- package/.pikku/channel/pikku-channels-map.gen.d.ts +9 -9
- package/.pikku/channel/pikku-channels-meta.gen.ts +1 -1
- package/.pikku/channel/pikku-channels.gen.ts +1 -1
- package/.pikku/cli/pikku-cli-channel.ts +92 -0
- package/.pikku/cli/pikku-cli-client.gen.ts +54 -0
- package/.pikku/cli/pikku-cli-types.gen.ts +3 -3
- package/.pikku/cli/pikku-cli-wirings-meta.gen.json +146 -0
- package/.pikku/cli/pikku-cli-wirings-meta.gen.ts +4 -34
- package/.pikku/cli/pikku-cli-wirings.gen.ts +2 -1
- package/.pikku/cli/pikku-cli.gen.ts +41 -0
- package/.pikku/function/pikku-function-types.gen.ts +49 -63
- package/.pikku/function/pikku-functions-meta.gen.json +988 -0
- package/.pikku/function/pikku-functions-meta.gen.ts +4 -970
- package/.pikku/function/pikku-functions-meta.min.gen.json +212 -0
- package/.pikku/function/pikku-functions-meta.min.gen.ts +4 -209
- package/.pikku/http/pikku-http-types.gen.ts +2 -2
- package/.pikku/http/pikku-http-wirings-map.gen.d.ts +9 -9
- package/.pikku/http/pikku-http-wirings-meta.gen.ts +1 -1
- package/.pikku/http/pikku-http-wirings.gen.ts +1 -1
- package/.pikku/mcp/pikku-mcp-types.gen.ts +13 -13
- package/.pikku/mcp/pikku-mcp-wirings-meta.gen.json +5 -0
- package/.pikku/mcp/pikku-mcp-wirings-meta.gen.ts +6 -4
- package/.pikku/mcp/pikku-mcp-wirings.gen.ts +1 -1
- package/.pikku/pikku-bootstrap.gen.ts +1 -4
- package/.pikku/pikku-services.gen.ts +6 -8
- package/.pikku/pikku-types.gen.ts +1 -1
- package/.pikku/pikku-websocket.gen.ts +1 -1
- package/.pikku/queue/pikku-queue-types.gen.ts +2 -2
- package/.pikku/queue/pikku-queue-workers-wirings-map.gen.d.ts +9 -9
- package/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +1 -0
- package/.pikku/queue/pikku-queue-workers-wirings-meta.gen.ts +5 -7
- package/.pikku/queue/pikku-queue-workers-wirings.gen.ts +1 -1
- package/.pikku/rpc/pikku-remote-rpc-workers.gen.ts +2 -2
- package/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts +9 -9
- package/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts +41 -40
- package/.pikku/scheduler/pikku-scheduler-types.gen.ts +2 -2
- package/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.json +1 -0
- package/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.ts +5 -2
- package/.pikku/scheduler/pikku-schedulers-wirings.gen.ts +1 -1
- package/.pikku/schemas/register.gen.ts +27 -27
- package/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
- package/.pikku/schemas/schemas/PikkuChannelsOutput.schema.json +1 -1
- package/.pikku/schemas/schemas/PikkuSchemasOutput.schema.json +1 -1
- package/.pikku/services/config.gen.json +99 -0
- package/.pikku/services/getInspectorState.gen.json +10 -0
- package/.pikku/services/jwt.gen.json +13 -0
- package/.pikku/services/logger.gen.json +25 -0
- package/.pikku/services/queueService.gen.json +14 -0
- package/.pikku/services/schedulerService.gen.json +17 -0
- package/.pikku/services/schema.gen.json +14 -0
- package/.pikku/services/variables.gen.json +13 -0
- package/.pikku/services/workflowService.gen.json +31 -0
- package/.pikku/workflow/pikku-workflow-map.gen.d.ts +9 -9
- package/.pikku/workflow/pikku-workflow-types.gen.ts +36 -31
- package/.pikku/workflow/pikku-workflow-wirings-meta.gen.json +1 -0
- package/.pikku/workflow/pikku-workflow-wirings-meta.gen.ts +5 -2
- package/.pikku/workflow/pikku-workflow-wirings.gen.ts +6 -2
- package/CHANGELOG.md +27 -1
- package/bin/pikku.ts +6 -32
- package/build.sh +53 -31
- package/cli.schema.json +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +6 -7
- package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/channel/pikku-channels-meta.gen.js +1 -1
- package/dist/.pikku/channel/pikku-channels.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channels.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-channel.js +91 -0
- package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +10 -0
- package/dist/.pikku/cli/pikku-cli-client.gen.js +44 -0
- package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +3 -3
- package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +3 -34
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +146 -0
- package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +2 -1
- package/dist/.pikku/cli/pikku-cli-wirings.gen.js +2 -1
- package/dist/.pikku/cli/pikku-cli.gen.d.ts +10 -0
- package/dist/.pikku/cli/pikku-cli.gen.js +38 -0
- package/dist/.pikku/function/pikku-function-types.gen.d.ts +29 -79
- package/dist/.pikku/function/pikku-function-types.gen.js +19 -15
- package/dist/.pikku/function/pikku-functions-meta.gen.js +3 -969
- package/dist/.pikku/function/pikku-functions-meta.gen.json +988 -0
- package/dist/.pikku/function/pikku-functions-meta.min.gen.js +3 -208
- package/dist/.pikku/function/pikku-functions-meta.min.gen.json +212 -0
- package/dist/.pikku/http/pikku-http-types.gen.d.ts +2 -2
- package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +1 -1
- package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +1 -1
- package/dist/.pikku/http/pikku-http-wirings.gen.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +13 -13
- package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-wirings-meta.gen.js +5 -4
- package/dist/.pikku/mcp/pikku-mcp-wirings-meta.gen.json +5 -0
- package/dist/.pikku/mcp/pikku-mcp-wirings.gen.d.ts +1 -1
- package/dist/.pikku/mcp/pikku-mcp-wirings.gen.js +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -4
- package/dist/.pikku/pikku-bootstrap.gen.js +1 -4
- package/dist/.pikku/pikku-services.gen.d.ts +5 -8
- package/dist/.pikku/pikku-services.gen.js +3 -6
- package/dist/.pikku/pikku-types.gen.d.ts +1 -1
- package/dist/.pikku/pikku-types.gen.js +1 -1
- package/dist/.pikku/pikku-websocket.gen.d.ts +1 -1
- package/dist/.pikku/pikku-websocket.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +2 -2
- package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +3 -7
- package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +1 -0
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-remote-rpc-workers.gen.d.ts +6 -9
- package/dist/.pikku/rpc/pikku-remote-rpc-workers.gen.js +2 -2
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +2 -2
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
- package/dist/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.js +3 -2
- package/dist/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.json +1 -0
- package/dist/.pikku/scheduler/pikku-schedulers-wirings.gen.d.ts +1 -1
- package/dist/.pikku/scheduler/pikku-schedulers-wirings.gen.js +1 -1
- package/dist/.pikku/schemas/register.gen.js +17 -17
- package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/PikkuChannelsOutput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/PikkuSchemasOutput.schema.json +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +29 -25
- package/dist/.pikku/workflow/pikku-workflow-types.gen.js +22 -8
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +3 -2
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.json +1 -0
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.d.ts +6 -2
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +6 -3
- package/dist/bin/pikku.js +5 -28
- package/dist/src/cli.wiring.js +108 -106
- package/dist/src/functions/commands/all.js +82 -42
- package/dist/src/functions/commands/bootstrap.js +22 -10
- package/dist/src/functions/commands/watch.js +6 -3
- package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.js +12 -7
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.d.ts +1 -1
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.js +42 -4
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.d.ts +1 -1
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.js +40 -2
- package/dist/src/functions/wirings/channels/pikku-channels.js +9 -2
- package/dist/src/functions/wirings/channels/serialize-channel-types.js +10 -11
- package/dist/src/functions/wirings/cli/pikku-command-cli-entry.js +4 -4
- package/dist/src/functions/wirings/cli/pikku-command-cli-types.js +1 -1
- package/dist/src/functions/wirings/cli/pikku-command-cli.js +9 -3
- package/dist/src/functions/wirings/cli/serialize-channel-cli.js +1 -1
- package/dist/src/functions/wirings/cli/serialize-cli-types.js +2 -2
- package/dist/src/functions/wirings/cli/serialize-local-cli-bootstrap.d.ts +1 -1
- package/dist/src/functions/wirings/cli/serialize-local-cli-bootstrap.js +4 -4
- package/dist/src/functions/wirings/functions/pikku-command-function-types-split.js +4 -4
- package/dist/src/functions/wirings/functions/pikku-command-functions.js +15 -5
- package/dist/src/functions/wirings/functions/pikku-command-services.d.ts +1 -1
- package/dist/src/functions/wirings/functions/pikku-command-services.js +23 -23
- package/dist/src/functions/wirings/functions/schemas.js +1 -1
- package/dist/src/functions/wirings/functions/serialize-function-types.d.ts +1 -1
- package/dist/src/functions/wirings/functions/serialize-function-types.js +50 -64
- package/dist/src/functions/wirings/http/openapi-spec-generator.js +4 -4
- package/dist/src/functions/wirings/http/pikku-http-routes.js +9 -2
- package/dist/src/functions/wirings/http/serialize-http-types.js +1 -1
- package/dist/src/functions/wirings/mcp/pikku-command-mcp.js +18 -4
- package/dist/src/functions/wirings/mcp/serialize-mcp-types.js +12 -12
- package/dist/src/functions/wirings/middleware/pikku-command-middleware.js +26 -2
- package/dist/src/functions/wirings/middleware/serialize-middleware-groups-meta.d.ts +5 -2
- package/dist/src/functions/wirings/middleware/serialize-middleware-groups-meta.js +5 -13
- package/dist/src/functions/wirings/queue/pikku-command-queue.js +9 -3
- package/dist/src/functions/wirings/queue/pikku-queue.js +9 -3
- package/dist/src/functions/wirings/queue/serialize-queue-meta.d.ts +2 -1
- package/dist/src/functions/wirings/queue/serialize-queue-meta.js +10 -1
- package/dist/src/functions/wirings/queue/serialize-queue-types.js +1 -1
- package/dist/src/functions/wirings/rpc/pikku-command-rpc.js +9 -2
- package/dist/src/functions/wirings/rpc/serialize-public-rpc.js +11 -4
- package/dist/src/functions/wirings/rpc/serialize-remote-rpc.js +1 -1
- package/dist/src/functions/wirings/rpc/serialize-rpc-wrapper.js +3 -3
- package/dist/src/functions/wirings/scheduler/pikku-command-scheduler.js +6 -3
- package/dist/src/functions/wirings/scheduler/serialize-scheduler-meta.d.ts +2 -1
- package/dist/src/functions/wirings/scheduler/serialize-scheduler-meta.js +11 -1
- package/dist/src/functions/wirings/scheduler/serialize-scheduler-types.js +1 -1
- package/dist/src/functions/wirings/services/pikku-command-service-metadata.d.ts +1 -0
- package/dist/src/functions/wirings/services/pikku-command-service-metadata.js +22 -0
- package/dist/src/functions/wirings/workflow/pikku-command-workflow-types.js +3 -1
- package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +12 -8
- package/dist/src/functions/wirings/workflow/serialize-workflow-meta.d.ts +2 -1
- package/dist/src/functions/wirings/workflow/serialize-workflow-meta.js +11 -1
- package/dist/src/functions/wirings/workflow/serialize-workflow-types.d.ts +1 -1
- package/dist/src/functions/wirings/workflow/serialize-workflow-types.js +36 -31
- package/dist/src/functions/wirings/workflow/serialize-workflow-wirings.d.ts +8 -0
- package/dist/src/functions/wirings/workflow/serialize-workflow-wirings.js +30 -0
- package/dist/src/functions/wirings/workflow/serialize-workflow-workers.js +2 -2
- package/dist/src/middleware/log-command-info-and-time.d.ts +2 -2
- package/dist/src/middleware/log-command-info-and-time.js +1 -4
- package/dist/src/services/cli-logger-forwarder.service.d.ts +3 -0
- package/dist/src/services/cli-logger-forwarder.service.js +9 -2
- package/dist/src/services.d.ts +2 -7
- package/dist/src/services.js +14 -12
- package/dist/src/utils/check-required-types.d.ts +2 -2
- package/dist/src/utils/check-required-types.js +2 -3
- package/dist/src/utils/pikku-cli-config.js +35 -2
- package/dist/src/utils/pikku-files-and-methods.d.ts +2 -2
- package/dist/src/utils/pikku-files-and-methods.js +4 -4
- package/dist/src/utils/schema-generator.d.ts +1 -1
- package/dist/src/utils/schema-generator.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -8
- package/src/cli.wiring.ts +110 -105
- package/src/functions/commands/all.ts +94 -45
- package/src/functions/commands/bootstrap.ts +25 -10
- package/src/functions/commands/watch.ts +6 -3
- package/src/functions/runtimes/nextjs/pikku-command-nextjs.ts +26 -5
- package/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.ts +43 -4
- package/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.ts +40 -1
- package/src/functions/wirings/channels/pikku-channels.ts +27 -3
- package/src/functions/wirings/channels/serialize-channel-types.ts +10 -11
- package/src/functions/wirings/cli/pikku-command-cli-entry.ts +4 -4
- package/src/functions/wirings/cli/pikku-command-cli-types.ts +1 -1
- package/src/functions/wirings/cli/pikku-command-cli.ts +26 -3
- package/src/functions/wirings/cli/serialize-channel-cli.ts +1 -1
- package/src/functions/wirings/cli/serialize-cli-types.ts +2 -2
- package/src/functions/wirings/cli/serialize-local-cli-bootstrap.ts +5 -5
- package/src/functions/wirings/functions/pikku-command-function-types-split.ts +6 -6
- package/src/functions/wirings/functions/pikku-command-functions.ts +39 -4
- package/src/functions/wirings/functions/pikku-command-services.ts +25 -25
- package/src/functions/wirings/functions/schemas.ts +2 -2
- package/src/functions/wirings/functions/serialize-function-types.ts +51 -65
- package/src/functions/wirings/http/openapi-spec-generator.ts +14 -5
- package/src/functions/wirings/http/pikku-http-routes.ts +28 -2
- package/src/functions/wirings/http/serialize-http-types.ts +1 -1
- package/src/functions/wirings/mcp/pikku-command-mcp.ts +30 -4
- package/src/functions/wirings/mcp/serialize-mcp-types.ts +12 -12
- package/src/functions/wirings/middleware/pikku-command-middleware.ts +35 -2
- package/src/functions/wirings/middleware/serialize-middleware-groups-meta.ts +4 -19
- package/src/functions/wirings/permissions/pikku-command-permissions.ts +2 -2
- package/src/functions/wirings/queue/pikku-command-queue.ts +27 -2
- package/src/functions/wirings/queue/pikku-queue.ts +27 -2
- package/src/functions/wirings/queue/serialize-queue-meta.ts +15 -1
- package/src/functions/wirings/queue/serialize-queue-types.ts +1 -1
- package/src/functions/wirings/rpc/pikku-command-rpc.ts +25 -2
- package/src/functions/wirings/rpc/serialize-public-rpc.ts +11 -4
- package/src/functions/wirings/rpc/serialize-remote-rpc.ts +1 -1
- package/src/functions/wirings/rpc/serialize-rpc-wrapper.ts +3 -3
- package/src/functions/wirings/scheduler/pikku-command-scheduler.ts +30 -4
- package/src/functions/wirings/scheduler/serialize-scheduler-meta.ts +20 -1
- package/src/functions/wirings/scheduler/serialize-scheduler-types.ts +1 -1
- package/src/functions/wirings/services/pikku-command-service-metadata.ts +25 -0
- package/src/functions/wirings/workflow/pikku-command-workflow-types.ts +8 -1
- package/src/functions/wirings/workflow/pikku-command-workflow.ts +36 -8
- package/src/functions/wirings/workflow/serialize-workflow-meta.ts +18 -1
- package/src/functions/wirings/workflow/serialize-workflow-types.ts +39 -31
- package/src/functions/wirings/workflow/serialize-workflow-wirings.ts +47 -0
- package/src/functions/wirings/workflow/serialize-workflow-workers.ts +2 -2
- package/src/middleware/log-command-info-and-time.ts +3 -6
- package/src/services/cli-logger-forwarder.service.ts +11 -2
- package/src/services.ts +15 -15
- package/src/utils/check-required-types.ts +4 -7
- package/src/utils/pikku-cli-config.ts +69 -2
- package/src/utils/pikku-files-and-methods.ts +10 -13
- package/src/utils/schema-generator.ts +2 -2
- package/types/application-types.d.ts +1 -1
- package/types/config.d.ts +12 -1
- package/.pikku/function/pikku-functions.gen.ts +0 -84
- package/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.ts +0 -47
- package/dist/.pikku/function/pikku-functions.gen.js +0 -83
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.d.ts +0 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +0 -47
- package/dist/.pikku/schemas/schemas/PikkuRemoteInternalRPCInput.schema.json +0 -1
- /package/dist/.pikku/{function/pikku-functions.gen.d.ts → cli/pikku-cli-channel.d.ts} +0 -0
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generates core function, middleware, and permission type definitions
|
|
3
3
|
*/
|
|
4
|
-
export const serializeFunctionTypes = (userSessionTypeImport, userSessionTypeName, singletonServicesTypeImport, singletonServicesTypeName,
|
|
4
|
+
export const serializeFunctionTypes = (userSessionTypeImport, userSessionTypeName, singletonServicesTypeImport, singletonServicesTypeName, wireServicesTypeImport, wireServicesTypeName, rpcMapTypeImport, requiredServicesTypeImport, configTypeImport) => {
|
|
5
5
|
return `/**
|
|
6
6
|
* Core function, middleware, and permission types for all wirings
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuMiddleware, CorePermissionGroup, addMiddleware as addMiddlewareCore, addPermission as addPermissionCore } from '@pikku/core'
|
|
9
|
+
import { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuMiddleware, CorePermissionGroup, addMiddleware as addMiddlewareCore, addPermission as addPermissionCore, PikkuWire, PickRequired } from '@pikku/core'
|
|
10
10
|
import { CorePikkuFunction, CorePikkuFunctionSessionless } from '@pikku/core/function'
|
|
11
|
-
import { PikkuChannel } from '@pikku/core/channel'
|
|
12
|
-
import { PikkuMCP } from '@pikku/core/mcp'
|
|
13
11
|
|
|
14
12
|
${userSessionTypeImport}
|
|
15
13
|
${singletonServicesTypeImport}
|
|
16
|
-
${
|
|
14
|
+
${wireServicesTypeImport}
|
|
17
15
|
${configTypeImport}
|
|
18
16
|
${rpcMapTypeImport}
|
|
19
17
|
${requiredServicesTypeImport}
|
|
20
18
|
|
|
21
19
|
${singletonServicesTypeName !== 'SingletonServices' ? `type SingletonServices = ${singletonServicesTypeName}` : ''}
|
|
22
|
-
${
|
|
20
|
+
${wireServicesTypeName !== 'Services' ? `type Services = ${wireServicesTypeName}` : ''}
|
|
23
21
|
${userSessionTypeName !== 'Session' ? `type Session = ${userSessionTypeName}` : ''}
|
|
24
22
|
${configTypeImport.includes('Config type not found') ? 'type Config = any' : ''}
|
|
25
23
|
|
|
@@ -30,7 +28,7 @@ ${configTypeImport.includes('Config type not found') ? 'type Config = any' : ''}
|
|
|
30
28
|
* @template In - The input type that the permission check will receive
|
|
31
29
|
* @template RequiredServices - The services required for this permission check
|
|
32
30
|
*/
|
|
33
|
-
export type PikkuPermission<In = unknown, RequiredServices extends Services = Services> = CorePikkuPermission<In, RequiredServices, Session
|
|
31
|
+
export type PikkuPermission<In = unknown, RequiredServices extends Services = Services> = CorePikkuPermission<In, RequiredServices, PikkuWire<In, never, false, Session>>
|
|
34
32
|
|
|
35
33
|
/**
|
|
36
34
|
* Type-safe middleware definition that can access your application's services and session.
|
|
@@ -38,7 +36,7 @@ export type PikkuPermission<In = unknown, RequiredServices extends Services = Se
|
|
|
38
36
|
*
|
|
39
37
|
* @template RequiredServices - The services required for this middleware
|
|
40
38
|
*/
|
|
41
|
-
export type PikkuMiddleware<RequiredServices extends SingletonServices = SingletonServices> = CorePikkuMiddleware<RequiredServices
|
|
39
|
+
export type PikkuMiddleware<RequiredServices extends SingletonServices = SingletonServices> = CorePikkuMiddleware<RequiredServices>
|
|
42
40
|
|
|
43
41
|
/**
|
|
44
42
|
* Configuration object for creating a permission with metadata
|
|
@@ -59,7 +57,8 @@ export type PikkuPermissionConfig<In = unknown, RequiredServices extends Service
|
|
|
59
57
|
* @example
|
|
60
58
|
* \`\`\`typescript
|
|
61
59
|
* // Direct function syntax
|
|
62
|
-
* const permission = pikkuPermission(({ logger }, data, session) => {
|
|
60
|
+
* const permission = pikkuPermission(async ({ logger }, data, { session }) => {
|
|
61
|
+
* const session = await session?.get()
|
|
63
62
|
* return session?.role === 'admin'
|
|
64
63
|
* })
|
|
65
64
|
*
|
|
@@ -67,7 +66,8 @@ export type PikkuPermissionConfig<In = unknown, RequiredServices extends Service
|
|
|
67
66
|
* const adminPermission = pikkuPermission({
|
|
68
67
|
* name: 'Admin Permission',
|
|
69
68
|
* description: 'Checks if user has admin role',
|
|
70
|
-
* func: async ({ logger }, data, session) => {
|
|
69
|
+
* func: async ({ logger }, data, { session }) => {
|
|
70
|
+
* const session = await session?.get()
|
|
71
71
|
* return session?.role === 'admin'
|
|
72
72
|
* }
|
|
73
73
|
* })
|
|
@@ -98,7 +98,7 @@ export type PikkuMiddlewareConfig<RequiredServices extends SingletonServices = S
|
|
|
98
98
|
* @example
|
|
99
99
|
* \`\`\`typescript
|
|
100
100
|
* // Direct function syntax
|
|
101
|
-
* const middleware = pikkuMiddleware(({ logger },
|
|
101
|
+
* const middleware = pikkuMiddleware(({ logger }, wires, next) => {
|
|
102
102
|
* logger.info('Middleware executed')
|
|
103
103
|
* await next()
|
|
104
104
|
* })
|
|
@@ -107,7 +107,7 @@ export type PikkuMiddlewareConfig<RequiredServices extends SingletonServices = S
|
|
|
107
107
|
* const logMiddleware = pikkuMiddleware({
|
|
108
108
|
* name: 'Request Logger',
|
|
109
109
|
* description: 'Logs all incoming requests',
|
|
110
|
-
* func: async ({ logger },
|
|
110
|
+
* func: async ({ logger }, wires, next) => {
|
|
111
111
|
* logger.info('Request started')
|
|
112
112
|
* await next()
|
|
113
113
|
* }
|
|
@@ -130,7 +130,7 @@ export const pikkuMiddleware = <RequiredServices extends SingletonServices = Sin
|
|
|
130
130
|
* message,
|
|
131
131
|
* level = 'info'
|
|
132
132
|
* }) => {
|
|
133
|
-
* return pikkuMiddleware(async ({ logger },
|
|
133
|
+
* return pikkuMiddleware(async ({ logger }, next) => {
|
|
134
134
|
* logger[level](message)
|
|
135
135
|
* await next()
|
|
136
136
|
* })
|
|
@@ -152,8 +152,8 @@ export const pikkuMiddlewareFactory = <In = any>(
|
|
|
152
152
|
* export const requireRole = pikkuPermissionFactory<{ role: string }>(({
|
|
153
153
|
* role
|
|
154
154
|
* }) => {
|
|
155
|
-
* return pikkuPermission(async ({ logger }, data,
|
|
156
|
-
* if (!
|
|
155
|
+
* return pikkuPermission(async ({ logger }, data, { initialSession }) => {
|
|
156
|
+
* if (!initialSession || initialSession.role !== role) {
|
|
157
157
|
* logger.warn(\`Permission denied: required role '\${role}'\`)
|
|
158
158
|
* return false
|
|
159
159
|
* }
|
|
@@ -174,25 +174,19 @@ export const pikkuPermissionFactory = <In = any>(
|
|
|
174
174
|
*
|
|
175
175
|
* @template In - The input type
|
|
176
176
|
* @template Out - The output type that the function returns
|
|
177
|
-
* @template ChannelData - Channel data type (null = optional channel)
|
|
178
|
-
* @template MCPData - MCP data type (null = optional MCP)
|
|
179
177
|
* @template RequiredServices - Services required by this function
|
|
180
178
|
*/
|
|
181
179
|
export type PikkuFunctionSessionless<
|
|
182
180
|
In = unknown,
|
|
183
181
|
Out = never,
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
? { mcp?: PikkuMCP } // Optional MCP
|
|
193
|
-
: { mcp: PikkuMCP } // Required MCP
|
|
194
|
-
)
|
|
195
|
-
> = CorePikkuFunctionSessionless<In, Out, ChannelData, RequiredServices, Session>
|
|
182
|
+
RequiredWires extends keyof PikkuWire = never,
|
|
183
|
+
RequiredServices extends Services = Services
|
|
184
|
+
> = CorePikkuFunctionSessionless<
|
|
185
|
+
In,
|
|
186
|
+
Out,
|
|
187
|
+
RequiredServices,
|
|
188
|
+
PickRequired<PikkuWire<In, Out, false, Session, TypedPikkuRPC, null, any>, RequiredWires>
|
|
189
|
+
>
|
|
196
190
|
|
|
197
191
|
/**
|
|
198
192
|
* A session-aware API function that requires user authentication.
|
|
@@ -200,25 +194,19 @@ export type PikkuFunctionSessionless<
|
|
|
200
194
|
*
|
|
201
195
|
* @template In - The input type
|
|
202
196
|
* @template Out - The output type that the function returns
|
|
203
|
-
* @template ChannelData - Channel data type (null = optional channel)
|
|
204
|
-
* @template MCPData - MCP data type (null = optional MCP)
|
|
205
197
|
* @template RequiredServices - Services required by this function
|
|
206
198
|
*/
|
|
207
199
|
export type PikkuFunction<
|
|
208
200
|
In = unknown,
|
|
209
201
|
Out = never,
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
? { mcp?: PikkuMCP } // Optional MCP
|
|
219
|
-
: { mcp: PikkuMCP } // Required MCP
|
|
220
|
-
)
|
|
221
|
-
> = CorePikkuFunction<In, Out, ChannelData, RequiredServices, Session>
|
|
202
|
+
RequiredWires extends keyof PikkuWire = 'session',
|
|
203
|
+
RequiredServices extends Services = Services
|
|
204
|
+
> = CorePikkuFunction<
|
|
205
|
+
In,
|
|
206
|
+
Out,
|
|
207
|
+
RequiredServices,
|
|
208
|
+
PickRequired<PikkuWire<In, Out, true, Session, TypedPikkuRPC, null, any>, RequiredWires>
|
|
209
|
+
>
|
|
222
210
|
|
|
223
211
|
/**
|
|
224
212
|
* Configuration object for Pikku functions with optional middleware, permissions, tags, and documentation.
|
|
@@ -226,16 +214,13 @@ export type PikkuFunction<
|
|
|
226
214
|
*
|
|
227
215
|
* @template In - The input type
|
|
228
216
|
* @template Out - The output type
|
|
229
|
-
* @template ChannelData - Channel data type
|
|
230
|
-
* @template MCPData - MCP data type
|
|
231
217
|
* @template PikkuFunc - The function type (can be narrowed to PikkuFunction or PikkuFunctionSessionless)
|
|
232
218
|
*/
|
|
233
219
|
export type PikkuFunctionConfig<
|
|
234
220
|
In = unknown,
|
|
235
221
|
Out = unknown,
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
PikkuFunc extends PikkuFunction<In, Out, ChannelData, MCPData> | PikkuFunctionSessionless<In, Out, ChannelData, MCPData> = PikkuFunction<In, Out, ChannelData, MCPData> | PikkuFunctionSessionless<In, Out, ChannelData, MCPData>
|
|
222
|
+
RequiredWires extends keyof PikkuWire = never,
|
|
223
|
+
PikkuFunc extends PikkuFunction<In, Out, RequiredWires> | PikkuFunctionSessionless<In, Out, RequiredWires> = PikkuFunction<In, Out, RequiredWires> | PikkuFunctionSessionless<In, Out, RequiredWires>
|
|
239
224
|
> = CorePikkuFunctionConfig<PikkuFunc, PikkuPermission<In>, PikkuMiddleware>
|
|
240
225
|
|
|
241
226
|
/**
|
|
@@ -250,7 +235,8 @@ export type PikkuFunctionConfig<
|
|
|
250
235
|
* @example
|
|
251
236
|
* \\\`\\\`\\\`typescript
|
|
252
237
|
* const createUser = pikkuFunc<{name: string, email: string}, {id: number, message: string}>({
|
|
253
|
-
* func: async ({db, logger}, input) => {
|
|
238
|
+
* func: async ({db, logger}, input, wire) => {
|
|
239
|
+
* const session = await wire.session.get()
|
|
254
240
|
* logger.info('Creating user', input.name)
|
|
255
241
|
* const user = await db.users.create(input)
|
|
256
242
|
* return {id: user.id, message: \\\`User \\\${input.name} created successfully\\\`}
|
|
@@ -261,8 +247,8 @@ export type PikkuFunctionConfig<
|
|
|
261
247
|
*/
|
|
262
248
|
export const pikkuFunc = <In, Out = unknown>(
|
|
263
249
|
func:
|
|
264
|
-
| PikkuFunction<In, Out>
|
|
265
|
-
|
|
|
250
|
+
| PikkuFunction<In, Out, 'session' | 'rpc'>
|
|
251
|
+
| PikkuFunctionConfig<In, Out, 'session' | 'rpc'>
|
|
266
252
|
) => {
|
|
267
253
|
return typeof func === 'function' ? { func } : func
|
|
268
254
|
}
|
|
@@ -279,7 +265,7 @@ export const pikkuFunc = <In, Out = unknown>(
|
|
|
279
265
|
* @example
|
|
280
266
|
* \\\`\\\`\\\`typescript
|
|
281
267
|
* const healthCheck = pikkuSessionlessFunc<void, {status: string, timestamp: string}>({
|
|
282
|
-
* func: async ({logger}) => {
|
|
268
|
+
* func: async ({logger}, input) => {
|
|
283
269
|
* logger.info('Health check requested')
|
|
284
270
|
* return {status: 'healthy', timestamp: new Date().toISOString()}
|
|
285
271
|
* },
|
|
@@ -289,8 +275,8 @@ export const pikkuFunc = <In, Out = unknown>(
|
|
|
289
275
|
*/
|
|
290
276
|
export const pikkuSessionlessFunc = <In, Out = unknown>(
|
|
291
277
|
func:
|
|
292
|
-
| PikkuFunctionSessionless<In, Out>
|
|
293
|
-
|
|
|
278
|
+
| PikkuFunctionSessionless<In, Out, 'session' | 'rpc'>
|
|
279
|
+
| PikkuFunctionConfig<In, Out, 'session' | 'rpc'>
|
|
294
280
|
) => {
|
|
295
281
|
return typeof func === 'function' ? { func } : func
|
|
296
282
|
}
|
|
@@ -313,8 +299,8 @@ export const pikkuSessionlessFunc = <In, Out = unknown>(
|
|
|
313
299
|
*/
|
|
314
300
|
export const pikkuVoidFunc = (
|
|
315
301
|
func:
|
|
316
|
-
| PikkuFunctionSessionless<void, void>
|
|
317
|
-
|
|
|
302
|
+
| PikkuFunctionSessionless<void, void, 'session' | 'rpc'>
|
|
303
|
+
| PikkuFunctionConfig<void, void, 'session' | 'rpc'>
|
|
318
304
|
) => {
|
|
319
305
|
return typeof func === 'function' ? { func } : func
|
|
320
306
|
}
|
|
@@ -363,27 +349,27 @@ export const pikkuServices = (
|
|
|
363
349
|
) => func
|
|
364
350
|
|
|
365
351
|
/**
|
|
366
|
-
* Creates a Pikku
|
|
352
|
+
* Creates a Pikku wire services factory.
|
|
367
353
|
* Use this to define services that are created per-request/session.
|
|
368
354
|
*
|
|
369
|
-
* @param func -
|
|
370
|
-
* @returns The
|
|
355
|
+
* @param func - Wire services factory function
|
|
356
|
+
* @returns The wire services factory function
|
|
371
357
|
*
|
|
372
358
|
* @example
|
|
373
359
|
* \`\`\`typescript
|
|
374
|
-
* export const
|
|
360
|
+
* export const createWireServices = pikkuWireServices(async (services, wire) => {
|
|
361
|
+
* const session = await wire.session?.get()
|
|
375
362
|
* return {
|
|
376
363
|
* userCache: new UserCache(session?.userId)
|
|
377
364
|
* }
|
|
378
365
|
* })
|
|
379
366
|
* \`\`\`
|
|
380
367
|
*/
|
|
381
|
-
export const
|
|
368
|
+
export const pikkuWireServices = (
|
|
382
369
|
func: (
|
|
383
370
|
services: SingletonServices,
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
) => Promise<RequiredSessionServices>
|
|
371
|
+
wire: any
|
|
372
|
+
) => Promise<RequiredWireServices>
|
|
387
373
|
) => func
|
|
388
374
|
|
|
389
375
|
/**
|
|
@@ -38,7 +38,7 @@ export async function generateOpenAPISpec(logger, functionsMeta, httpMeta, schem
|
|
|
38
38
|
const paths = {};
|
|
39
39
|
for (const routeMeta of Object.values(httpMeta)) {
|
|
40
40
|
for (const meta of Object.values(routeMeta)) {
|
|
41
|
-
const { route, method, inputTypes, pikkuFuncName, params, query,
|
|
41
|
+
const { route, method, inputTypes, pikkuFuncName, params, query, errors, description, tags, } = meta;
|
|
42
42
|
const functionMeta = functionsMeta[pikkuFuncName];
|
|
43
43
|
if (!functionMeta) {
|
|
44
44
|
logger.error(`• No function metadata found for '${pikkuFuncName}' in route '${route}'.`);
|
|
@@ -50,7 +50,7 @@ export async function generateOpenAPISpec(logger, functionsMeta, httpMeta, schem
|
|
|
50
50
|
paths[path] = {};
|
|
51
51
|
}
|
|
52
52
|
const responses = {};
|
|
53
|
-
|
|
53
|
+
errors?.forEach((error) => {
|
|
54
54
|
const errorResponse = getErrorResponseForConstructorName(error);
|
|
55
55
|
if (errorResponse) {
|
|
56
56
|
responses[errorResponse.status] = {
|
|
@@ -59,9 +59,9 @@ export async function generateOpenAPISpec(logger, functionsMeta, httpMeta, schem
|
|
|
59
59
|
}
|
|
60
60
|
});
|
|
61
61
|
const operation = {
|
|
62
|
-
description:
|
|
62
|
+
description: description ||
|
|
63
63
|
`This endpoint handles the ${method.toUpperCase()} request for the route ${route}.`,
|
|
64
|
-
tags:
|
|
64
|
+
tags: tags || [route.split('/')[1] || 'default'],
|
|
65
65
|
parameters: [],
|
|
66
66
|
responses: {
|
|
67
67
|
...responses,
|
|
@@ -2,13 +2,20 @@ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
|
|
|
2
2
|
import { serializeFileImports } from '../../../utils/file-imports-serializer.js';
|
|
3
3
|
import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
4
4
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
5
|
+
import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
5
6
|
export const pikkuHTTP = pikkuSessionlessFunc({
|
|
6
7
|
func: async ({ logger, config, getInspectorState }) => {
|
|
7
8
|
const visitState = await getInspectorState();
|
|
8
|
-
const { httpWiringsFile, httpWiringMetaFile, packageMappings } = config;
|
|
9
|
+
const { httpWiringsFile, httpWiringMetaFile, httpWiringMetaJsonFile, packageMappings, schema, } = config;
|
|
9
10
|
const { http } = visitState;
|
|
10
11
|
await writeFileInDir(logger, httpWiringsFile, serializeFileImports('wireHTTP', httpWiringsFile, http.files, packageMappings));
|
|
11
|
-
await writeFileInDir(logger,
|
|
12
|
+
await writeFileInDir(logger, httpWiringMetaJsonFile, JSON.stringify(http.meta, null, 2));
|
|
13
|
+
const jsonImportPath = getFileImportRelativePath(httpWiringMetaFile, httpWiringMetaJsonFile, packageMappings);
|
|
14
|
+
const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
|
|
15
|
+
const importStatement = supportsImportAttributes
|
|
16
|
+
? `import metaData from '${jsonImportPath}' with { type: 'json' }`
|
|
17
|
+
: `import metaData from '${jsonImportPath}'`;
|
|
18
|
+
await writeFileInDir(logger, httpWiringMetaFile, `import { pikkuState, HTTPWiringsMeta } from '@pikku/core'\n${importStatement}\npikkuState('http', 'meta', metaData as HTTPWiringsMeta)`);
|
|
12
19
|
return true;
|
|
13
20
|
},
|
|
14
21
|
middleware: [
|
|
@@ -18,7 +18,7 @@ import type { CoreHTTPFunctionWiring } from '@pikku/core/http'
|
|
|
18
18
|
* @template Out - Output type for the HTTP wiring
|
|
19
19
|
* @template Route - String literal type for the HTTP path (e.g., "/users/:id")
|
|
20
20
|
*/
|
|
21
|
-
type HTTPWiring<In, Out, Route extends string> = CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction<In, Out>, PikkuFunctionSessionless<In, Out>, PikkuPermission<In>, PikkuMiddleware>
|
|
21
|
+
type HTTPWiring<In, Out, Route extends string> = CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction<In, Out, 'rpc' | 'session'>, PikkuFunctionSessionless<In, Out, 'rpc' | 'session'>, PikkuPermission<In>, PikkuMiddleware>
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Registers an HTTP wiring with the Pikku framework.
|
|
@@ -4,6 +4,7 @@ import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
|
4
4
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
5
5
|
import { readFile } from 'fs/promises';
|
|
6
6
|
import { join } from 'path';
|
|
7
|
+
import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
7
8
|
// Helper function to generate arguments from schema
|
|
8
9
|
const generateArgumentsFromSchema = async (inputSchema, schemaDirectory, typesMap, logger) => {
|
|
9
10
|
if (!inputSchema)
|
|
@@ -40,7 +41,7 @@ const generateArgumentsFromSchema = async (inputSchema, schemaDirectory, typesMa
|
|
|
40
41
|
export const pikkuMCP = pikkuSessionlessFunc({
|
|
41
42
|
func: async ({ logger, config, getInspectorState }) => {
|
|
42
43
|
const { mcpEndpoints, functions } = await getInspectorState();
|
|
43
|
-
const { mcpWiringsFile, mcpWiringsMetaFile, packageMappings, schemaDirectory, } = config;
|
|
44
|
+
const { mcpWiringsFile, mcpWiringsMetaFile, packageMappings, schemaDirectory, schema, } = config;
|
|
44
45
|
await writeFileInDir(logger, mcpWiringsFile, serializeFileImports('wireMCPResource or wireMCPTool', mcpWiringsFile, mcpEndpoints.files, packageMappings));
|
|
45
46
|
// Populate arguments for prompts meta before serializing
|
|
46
47
|
const promptsMetaWithArguments = { ...mcpEndpoints.promptsMeta };
|
|
@@ -51,10 +52,23 @@ export const pikkuMCP = pikkuSessionlessFunc({
|
|
|
51
52
|
promptMeta.arguments = await generateArgumentsFromSchema(inputType || null, schemaDirectory || '', functions.typesMap, logger);
|
|
52
53
|
}
|
|
53
54
|
}
|
|
55
|
+
const metaData = {
|
|
56
|
+
resourcesMeta: mcpEndpoints.resourcesMeta,
|
|
57
|
+
toolsMeta: mcpEndpoints.toolsMeta,
|
|
58
|
+
promptsMeta: promptsMetaWithArguments,
|
|
59
|
+
};
|
|
60
|
+
await writeFileInDir(logger, config.mcpWiringsMetaJsonFile, JSON.stringify(metaData, null, 2));
|
|
61
|
+
const jsonImportPath = getFileImportRelativePath(mcpWiringsMetaFile, config.mcpWiringsMetaJsonFile, packageMappings);
|
|
62
|
+
const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
|
|
63
|
+
const importStatement = supportsImportAttributes
|
|
64
|
+
? `import metaData from '${jsonImportPath}' with { type: 'json' }`
|
|
65
|
+
: `import metaData from '${jsonImportPath}'`;
|
|
54
66
|
await writeFileInDir(logger, mcpWiringsMetaFile, `import { pikkuState } from '@pikku/core'
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
pikkuState('mcp', '
|
|
67
|
+
import type { MCPResourceMeta, MCPToolMeta, MCPPromptMeta } from '@pikku/core/mcp'
|
|
68
|
+
${importStatement}
|
|
69
|
+
pikkuState('mcp', 'resourcesMeta', metaData.resourcesMeta as MCPResourceMeta)
|
|
70
|
+
pikkuState('mcp', 'toolsMeta', metaData.toolsMeta as MCPToolMeta)
|
|
71
|
+
pikkuState('mcp', 'promptsMeta', metaData.promptsMeta as MCPPromptMeta)`);
|
|
58
72
|
return true;
|
|
59
73
|
},
|
|
60
74
|
middleware: [
|
|
@@ -27,21 +27,21 @@ import type { PikkuFunctionConfig, PikkuFunctionSessionless } from '${functionTy
|
|
|
27
27
|
* @template In - Input type for the resource request
|
|
28
28
|
* @template URI - URI template string type for compile-time parameter validation
|
|
29
29
|
*/
|
|
30
|
-
type MCPResourceWiring<In, URI extends string> = CoreMCPResource<PikkuFunctionConfig<In, MCPResourceResponse>> & { uri: URI }
|
|
30
|
+
type MCPResourceWiring<In, URI extends string> = CoreMCPResource<PikkuFunctionConfig<In, MCPResourceResponse, 'rpc' | 'session' | 'mcp'>> & { uri: URI }
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
33
|
* Type definition for MCP tools that AI models can invoke.
|
|
34
34
|
*
|
|
35
35
|
* @template In - Input type for the tool invocation
|
|
36
36
|
*/
|
|
37
|
-
type MCPToolWiring<In> = CoreMCPTool<PikkuFunctionConfig<In, MCPToolResponse>>
|
|
37
|
+
type MCPToolWiring<In> = CoreMCPTool<PikkuFunctionConfig<In, MCPToolResponse, 'rpc' | 'session' | 'mcp'>>
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Type definition for MCP prompts that provide templates to AI models.
|
|
41
41
|
*
|
|
42
42
|
* @template In - Input type for the prompt parameters
|
|
43
43
|
*/
|
|
44
|
-
type MCPPromptWiring<In> = CoreMCPPrompt<PikkuFunctionConfig<In, MCPPromptResponse>>
|
|
44
|
+
type MCPPromptWiring<In> = CoreMCPPrompt<PikkuFunctionConfig<In, MCPPromptResponse, 'rpc' | 'session' | 'mcp'>>
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
47
|
* Registers an MCP resource with the Pikku framework.
|
|
@@ -93,12 +93,12 @@ export const wireMCPPrompt = <In>(
|
|
|
93
93
|
*/
|
|
94
94
|
export const pikkuMCPPromptFunc = <In>(
|
|
95
95
|
func:
|
|
96
|
-
| PikkuFunctionSessionless<In, MCPPromptResponse>
|
|
96
|
+
| PikkuFunctionSessionless<In, MCPPromptResponse, 'mcp'>
|
|
97
97
|
| {
|
|
98
|
-
func: PikkuFunctionSessionless<In, MCPPromptResponse>
|
|
98
|
+
func: PikkuFunctionSessionless<In, MCPPromptResponse, 'mcp'>
|
|
99
99
|
name?: string
|
|
100
100
|
}
|
|
101
|
-
): PikkuFunctionConfig<In, MCPPromptResponse> => {
|
|
101
|
+
): PikkuFunctionConfig<In, MCPPromptResponse, 'mcp'> => {
|
|
102
102
|
return typeof func === 'function' ? { func } : func
|
|
103
103
|
}
|
|
104
104
|
|
|
@@ -112,12 +112,12 @@ export const pikkuMCPPromptFunc = <In>(
|
|
|
112
112
|
*/
|
|
113
113
|
export const pikkuMCPToolFunc = <In>(
|
|
114
114
|
func:
|
|
115
|
-
| PikkuFunctionSessionless<In, MCPToolResponse,
|
|
115
|
+
| PikkuFunctionSessionless<In, MCPToolResponse, 'mcp'>
|
|
116
116
|
| {
|
|
117
|
-
func: PikkuFunctionSessionless<In, MCPToolResponse,
|
|
117
|
+
func: PikkuFunctionSessionless<In, MCPToolResponse, 'mcp'>
|
|
118
118
|
name?: string
|
|
119
119
|
}
|
|
120
|
-
): PikkuFunctionConfig<In, MCPToolResponse> => {
|
|
120
|
+
): PikkuFunctionConfig<In, MCPToolResponse, 'mcp'> => {
|
|
121
121
|
return typeof func === 'function' ? { func } : func
|
|
122
122
|
}
|
|
123
123
|
|
|
@@ -131,12 +131,12 @@ export const pikkuMCPToolFunc = <In>(
|
|
|
131
131
|
*/
|
|
132
132
|
export const pikkuMCPResourceFunc = <In>(
|
|
133
133
|
func:
|
|
134
|
-
| PikkuFunctionSessionless<In, MCPResourceResponse,
|
|
134
|
+
| PikkuFunctionSessionless<In, MCPResourceResponse, 'mcp'>
|
|
135
135
|
| {
|
|
136
|
-
func: PikkuFunctionSessionless<In, MCPResourceResponse,
|
|
136
|
+
func: PikkuFunctionSessionless<In, MCPResourceResponse, 'mcp'>
|
|
137
137
|
name?: string
|
|
138
138
|
}
|
|
139
|
-
): PikkuFunctionConfig<In, MCPResourceResponse> => {
|
|
139
|
+
): PikkuFunctionConfig<In, MCPResourceResponse, 'mcp'> => {
|
|
140
140
|
return typeof func === 'function' ? { func } : func
|
|
141
141
|
}
|
|
142
142
|
`;
|
|
@@ -3,17 +3,41 @@ import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
|
3
3
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
4
4
|
import { serializeMiddlewareImports } from './serialize-middleware-imports.js';
|
|
5
5
|
import { serializeMiddlewareGroupsMeta } from './serialize-middleware-groups-meta.js';
|
|
6
|
+
import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
6
7
|
export const pikkuMiddleware = pikkuSessionlessFunc({
|
|
7
8
|
func: async ({ logger, config, getInspectorState }) => {
|
|
8
9
|
const state = await getInspectorState();
|
|
9
10
|
const { middleware } = state;
|
|
10
|
-
const { middlewareFile, packageMappings } = config;
|
|
11
|
+
const { middlewareFile, packageMappings, schema } = config;
|
|
11
12
|
let filesGenerated = false;
|
|
12
13
|
// Check if there are any middleware groups
|
|
13
14
|
const hasHTTPGroups = state.http.routeMiddleware.size > 0;
|
|
14
15
|
const hasTagGroups = state.middleware.tagMiddleware.size > 0;
|
|
15
16
|
if (hasHTTPGroups || hasTagGroups) {
|
|
16
|
-
|
|
17
|
+
const metaData = serializeMiddlewareGroupsMeta(state);
|
|
18
|
+
// Write JSON file
|
|
19
|
+
await writeFileInDir(logger, config.middlewareGroupsMetaJsonFile, JSON.stringify(metaData, null, 2));
|
|
20
|
+
// Calculate relative path from TS file to JSON file
|
|
21
|
+
const jsonImportPath = getFileImportRelativePath(config.middlewareGroupsMetaFile, config.middlewareGroupsMetaJsonFile, packageMappings);
|
|
22
|
+
// Write TypeScript file that imports JSON
|
|
23
|
+
const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
|
|
24
|
+
const importStatement = supportsImportAttributes
|
|
25
|
+
? `import metaData from '${jsonImportPath}' with { type: 'json' }`
|
|
26
|
+
: `import metaData from '${jsonImportPath}'`;
|
|
27
|
+
const tsContent = `import { pikkuState } from '@pikku/core'
|
|
28
|
+
${importStatement}
|
|
29
|
+
|
|
30
|
+
// HTTP middleware groups metadata
|
|
31
|
+
if (metaData.httpGroups && Object.keys(metaData.httpGroups).length > 0) {
|
|
32
|
+
pikkuState('middleware', 'httpGroupMeta', metaData.httpGroups)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Tag middleware groups metadata
|
|
36
|
+
if (metaData.tagGroups && Object.keys(metaData.tagGroups).length > 0) {
|
|
37
|
+
pikkuState('middleware', 'tagGroupMeta', metaData.tagGroups)
|
|
38
|
+
}
|
|
39
|
+
`;
|
|
40
|
+
await writeFileInDir(logger, config.middlewareGroupsMetaFile, tsContent);
|
|
17
41
|
// Always generate middleware imports file when groups exist (even if empty)
|
|
18
42
|
await writeFileInDir(logger, middlewareFile, serializeMiddlewareImports(middlewareFile, middleware, state.http, packageMappings));
|
|
19
43
|
filesGenerated = true;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { InspectorState } from '@pikku/inspector';
|
|
2
2
|
/**
|
|
3
|
-
* Generates the middleware groups metadata
|
|
3
|
+
* Generates the middleware groups metadata that stores metadata about
|
|
4
4
|
* tag-based and HTTP middleware groups for visualization and inspection.
|
|
5
5
|
*
|
|
6
6
|
* This includes services, middleware count, factory status, etc.
|
|
7
7
|
*/
|
|
8
|
-
export declare const serializeMiddlewareGroupsMeta: (state: InspectorState) =>
|
|
8
|
+
export declare const serializeMiddlewareGroupsMeta: (state: InspectorState) => {
|
|
9
|
+
httpGroups: Record<string, any>;
|
|
10
|
+
tagGroups: Record<string, any>;
|
|
11
|
+
};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generates the middleware groups metadata
|
|
2
|
+
* Generates the middleware groups metadata that stores metadata about
|
|
3
3
|
* tag-based and HTTP middleware groups for visualization and inspection.
|
|
4
4
|
*
|
|
5
5
|
* This includes services, middleware count, factory status, etc.
|
|
6
6
|
*/
|
|
7
7
|
export const serializeMiddlewareGroupsMeta = (state) => {
|
|
8
|
-
const lines = [`import { pikkuState } from '@pikku/core'`, ``];
|
|
9
8
|
// Serialize HTTP middleware groups metadata
|
|
10
9
|
const httpGroups = {};
|
|
11
10
|
for (const [pattern, meta] of state.http.routeMiddleware.entries()) {
|
|
@@ -18,11 +17,6 @@ export const serializeMiddlewareGroupsMeta = (state) => {
|
|
|
18
17
|
isFactory: meta.isFactory,
|
|
19
18
|
};
|
|
20
19
|
}
|
|
21
|
-
if (Object.keys(httpGroups).length > 0) {
|
|
22
|
-
lines.push(`// HTTP middleware groups metadata`);
|
|
23
|
-
lines.push(`pikkuState('middleware', 'httpGroupMeta', ${JSON.stringify(httpGroups, null, 2)})`);
|
|
24
|
-
lines.push(``);
|
|
25
|
-
}
|
|
26
20
|
// Serialize tag middleware groups metadata
|
|
27
21
|
const tagGroups = {};
|
|
28
22
|
for (const [tag, meta] of state.middleware.tagMiddleware.entries()) {
|
|
@@ -35,10 +29,8 @@ export const serializeMiddlewareGroupsMeta = (state) => {
|
|
|
35
29
|
isFactory: meta.isFactory,
|
|
36
30
|
};
|
|
37
31
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
return lines.join('\n');
|
|
32
|
+
return {
|
|
33
|
+
httpGroups,
|
|
34
|
+
tagGroups,
|
|
35
|
+
};
|
|
44
36
|
};
|
|
@@ -2,13 +2,19 @@ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
|
|
|
2
2
|
import { serializeFileImports } from '../../../utils/file-imports-serializer.js';
|
|
3
3
|
import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
4
4
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
5
|
-
import { serializeQueueMeta } from './serialize-queue-meta.js';
|
|
5
|
+
import { serializeQueueMeta, serializeQueueMetaTS, } from './serialize-queue-meta.js';
|
|
6
|
+
import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
6
7
|
export const pikkuQueue = pikkuSessionlessFunc({
|
|
7
8
|
func: async ({ logger, config, getInspectorState }) => {
|
|
8
9
|
const visitState = await getInspectorState();
|
|
9
|
-
const { queueWorkersWiringFile, queueWorkersWiringMetaFile, packageMappings, } = config;
|
|
10
|
+
const { queueWorkersWiringFile, queueWorkersWiringMetaFile, queueWorkersWiringMetaJsonFile, packageMappings, schema, } = config;
|
|
10
11
|
const { queueWorkers } = visitState;
|
|
11
|
-
|
|
12
|
+
// Write JSON file
|
|
13
|
+
await writeFileInDir(logger, queueWorkersWiringMetaJsonFile, JSON.stringify(serializeQueueMeta(queueWorkers.meta), null, 2));
|
|
14
|
+
// Calculate relative path from TS file to JSON file
|
|
15
|
+
const jsonImportPath = getFileImportRelativePath(queueWorkersWiringMetaFile, queueWorkersWiringMetaJsonFile, packageMappings);
|
|
16
|
+
// Write TypeScript file that imports JSON
|
|
17
|
+
await writeFileInDir(logger, queueWorkersWiringMetaFile, serializeQueueMetaTS(jsonImportPath, schema?.supportsImportAttributes ?? false));
|
|
12
18
|
await writeFileInDir(logger, queueWorkersWiringFile, serializeFileImports('addQueueWorkers', queueWorkersWiringFile, queueWorkers.files, packageMappings));
|
|
13
19
|
return true;
|
|
14
20
|
},
|
|
@@ -2,11 +2,12 @@ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
|
|
|
2
2
|
import { serializeFileImports } from '../../../utils/file-imports-serializer.js';
|
|
3
3
|
import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
4
4
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
5
|
-
import { serializeQueueMeta } from './serialize-queue-meta.js';
|
|
5
|
+
import { serializeQueueMeta, serializeQueueMetaTS, } from './serialize-queue-meta.js';
|
|
6
|
+
import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
6
7
|
export const pikkuQueue = pikkuSessionlessFunc({
|
|
7
8
|
func: async ({ logger, config, getInspectorState }) => {
|
|
8
9
|
const visitState = await getInspectorState();
|
|
9
|
-
const { queueWorkersWiringFile, queueWorkersWiringMetaFile, packageMappings, } = config;
|
|
10
|
+
const { queueWorkersWiringFile, queueWorkersWiringMetaFile, queueWorkersWiringMetaJsonFile, packageMappings, schema, } = config;
|
|
10
11
|
const { queueWorkers } = visitState;
|
|
11
12
|
// Add remote RPC worker to queue metadata if it exists
|
|
12
13
|
const queueMeta = { ...queueWorkers.meta };
|
|
@@ -16,7 +17,12 @@ export const pikkuQueue = pikkuSessionlessFunc({
|
|
|
16
17
|
queueName: 'pikku-remote-internal-rpc',
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
+
// Write JSON file
|
|
21
|
+
await writeFileInDir(logger, queueWorkersWiringMetaJsonFile, JSON.stringify(serializeQueueMeta(queueMeta), null, 2));
|
|
22
|
+
// Calculate relative path from TS file to JSON file
|
|
23
|
+
const jsonImportPath = getFileImportRelativePath(queueWorkersWiringMetaFile, queueWorkersWiringMetaJsonFile, packageMappings);
|
|
24
|
+
// Write TypeScript file that imports JSON
|
|
25
|
+
await writeFileInDir(logger, queueWorkersWiringMetaFile, serializeQueueMetaTS(jsonImportPath, schema?.supportsImportAttributes ?? false));
|
|
20
26
|
await writeFileInDir(logger, queueWorkersWiringFile, serializeFileImports('addQueueWorkers', queueWorkersWiringFile, queueWorkers.files, packageMappings));
|
|
21
27
|
return true;
|
|
22
28
|
},
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { QueueWorkersMeta } from '@pikku/core/queue';
|
|
2
|
-
export declare const serializeQueueMeta: (queueWorkersMeta: QueueWorkersMeta) =>
|
|
2
|
+
export declare const serializeQueueMeta: (queueWorkersMeta: QueueWorkersMeta) => QueueWorkersMeta;
|
|
3
|
+
export declare const serializeQueueMetaTS: (jsonImportPath: string, supportsImportAttributes: boolean) => string;
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
export const serializeQueueMeta = (queueWorkersMeta) => {
|
|
2
|
+
return queueWorkersMeta;
|
|
3
|
+
};
|
|
4
|
+
export const serializeQueueMetaTS = (jsonImportPath, supportsImportAttributes) => {
|
|
5
|
+
const importStatement = supportsImportAttributes
|
|
6
|
+
? `import metaData from '${jsonImportPath}' with { type: 'json' }`
|
|
7
|
+
: `import metaData from '${jsonImportPath}'`;
|
|
2
8
|
const serializedOutput = [];
|
|
3
9
|
serializedOutput.push("import { pikkuState } from '@pikku/core'");
|
|
4
|
-
serializedOutput.push(
|
|
10
|
+
serializedOutput.push("import { QueueWorkersMeta } from '@pikku/core/queue'");
|
|
11
|
+
serializedOutput.push(importStatement);
|
|
12
|
+
serializedOutput.push('');
|
|
13
|
+
serializedOutput.push("pikkuState('queue', 'meta', metaData as QueueWorkersMeta)");
|
|
5
14
|
return serializedOutput.join('\n');
|
|
6
15
|
};
|