@pikku/core 0.11.1 → 0.12.0
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 +55 -0
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- package/dist/errors/error-handler.js +3 -3
- package/dist/errors/errors.d.ts +8 -0
- package/dist/errors/errors.js +16 -0
- package/dist/errors/index.d.ts +0 -1
- package/dist/errors/index.js +0 -1
- package/dist/function/function-runner.d.ts +10 -3
- package/dist/function/function-runner.js +136 -31
- package/dist/function/functions.types.d.ts +35 -12
- package/dist/function/functions.types.js +16 -6
- package/dist/function/index.d.ts +2 -2
- package/dist/function/index.js +1 -2
- package/dist/handle-error.js +1 -10
- package/dist/index.d.ts +30 -24
- package/dist/index.js +19 -27
- 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 -6
- package/dist/middleware/auth-cookie.d.ts +1 -1
- package/dist/middleware/auth-cookie.js +6 -8
- package/dist/middleware/cors.d.ts +46 -0
- package/dist/middleware/cors.js +73 -0
- package/dist/middleware/index.d.ts +5 -3
- package/dist/middleware/index.js +5 -3
- package/dist/middleware/remote-auth.d.ts +5 -0
- package/dist/middleware/remote-auth.js +55 -0
- package/dist/middleware/timeout.d.ts +1 -1
- package/dist/middleware-runner.d.ts +3 -14
- package/dist/middleware-runner.js +14 -16
- package/dist/permissions.d.ts +3 -86
- package/dist/permissions.js +20 -80
- package/dist/pikku-state.d.ts +33 -104
- package/dist/pikku-state.js +150 -66
- package/dist/schema.d.ts +8 -6
- package/dist/schema.js +31 -18
- package/dist/services/ai-agent-runner-service.d.ts +24 -0
- package/dist/services/ai-agent-runner-service.js +1 -0
- package/dist/services/ai-run-state-service.d.ts +13 -0
- package/dist/services/ai-run-state-service.js +1 -0
- package/dist/services/ai-storage-service.d.ts +18 -0
- package/dist/services/ai-storage-service.js +1 -0
- package/dist/services/deployment-service.d.ts +19 -0
- package/dist/services/deployment-service.js +1 -0
- package/dist/services/gopass-secrets.d.ts +47 -0
- package/dist/services/gopass-secrets.js +94 -0
- package/dist/services/in-memory-trigger-service.d.ts +23 -0
- package/dist/services/in-memory-trigger-service.js +50 -0
- package/dist/services/in-memory-workflow-service.d.ts +59 -0
- package/dist/services/in-memory-workflow-service.js +287 -0
- package/dist/services/index.d.ts +25 -11
- package/dist/services/index.js +10 -13
- package/dist/services/local-secrets.d.ts +23 -0
- package/dist/services/local-secrets.js +45 -0
- package/dist/services/local-variables.d.ts +5 -0
- package/dist/services/local-variables.js +18 -0
- package/dist/services/scheduler-service.d.ts +21 -1
- package/dist/services/scheduler-service.js +14 -0
- package/dist/services/schema-service.d.ts +6 -0
- package/dist/services/scoped-secret-service.d.ts +16 -0
- package/dist/services/scoped-secret-service.js +35 -0
- package/dist/services/secret-service.d.ts +25 -4
- package/dist/services/trigger-service.d.ts +23 -0
- package/dist/services/trigger-service.js +1 -0
- package/dist/services/typed-secret-service.d.ts +30 -0
- package/dist/services/typed-secret-service.js +40 -0
- package/dist/services/typed-variables-service.d.ts +27 -0
- package/dist/services/typed-variables-service.js +46 -0
- package/dist/services/user-session-service.d.ts +13 -0
- package/dist/services/user-session-service.js +17 -0
- package/dist/services/variables-service.d.ts +5 -0
- package/dist/services/workflow-service.d.ts +43 -0
- package/dist/services/workflow-service.js +1 -0
- package/dist/types/core.types.d.ts +54 -10
- package/dist/types/core.types.js +7 -0
- package/dist/types/state.types.d.ts +127 -0
- package/dist/types/state.types.js +1 -0
- package/dist/utils.d.ts +10 -1
- package/dist/utils.js +60 -3
- package/dist/version.d.ts +6 -0
- package/dist/version.js +19 -0
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
- package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
- package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
- package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
- package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
- package/dist/wirings/ai-agent/index.d.ts +5 -0
- package/dist/wirings/ai-agent/index.js +4 -0
- package/dist/wirings/channel/channel-common.d.ts +7 -4
- package/dist/wirings/channel/channel-common.js +15 -8
- package/dist/wirings/channel/channel-handler.js +13 -4
- package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
- package/dist/wirings/channel/channel-middleware-runner.js +73 -0
- package/dist/wirings/channel/channel-runner.js +12 -12
- package/dist/wirings/channel/channel.types.d.ts +5 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
- package/dist/wirings/channel/define-channel-routes.js +23 -0
- package/dist/wirings/channel/index.d.ts +10 -8
- package/dist/wirings/channel/index.js +7 -8
- package/dist/wirings/channel/local/index.d.ts +3 -3
- package/dist/wirings/channel/local/index.js +3 -3
- package/dist/wirings/channel/local/local-channel-runner.js +18 -6
- package/dist/wirings/channel/log-channels.js +1 -1
- package/dist/wirings/channel/serverless/index.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.js +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +17 -6
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
- package/dist/wirings/cli/channel/index.d.ts +1 -1
- package/dist/wirings/cli/channel/index.js +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +1 -1
- package/dist/wirings/cli/cli-runner.js +22 -18
- package/dist/wirings/cli/cli.types.d.ts +7 -6
- package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
- package/dist/wirings/cli/define-cli-commands.js +20 -0
- package/dist/wirings/cli/index.d.ts +2 -3
- package/dist/wirings/cli/index.js +1 -3
- package/dist/wirings/http/http-routes.d.ts +69 -0
- package/dist/wirings/http/http-routes.js +139 -0
- package/dist/wirings/http/http-runner.d.ts +2 -2
- package/dist/wirings/http/http-runner.js +62 -27
- package/dist/wirings/http/http.types.d.ts +77 -24
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- 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/index.d.ts +4 -3
- package/dist/wirings/mcp/index.js +3 -3
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
- package/dist/wirings/mcp/mcp-runner.js +42 -56
- package/dist/wirings/mcp/mcp.types.d.ts +3 -3
- package/dist/wirings/node/index.d.ts +2 -0
- package/dist/wirings/node/index.js +1 -0
- package/dist/wirings/node/node.types.d.ts +20 -0
- package/dist/wirings/node/node.types.js +1 -0
- package/dist/wirings/oauth2/index.d.ts +3 -0
- package/dist/wirings/oauth2/index.js +2 -0
- package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
- package/dist/wirings/oauth2/oauth2-client.js +267 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
- package/dist/wirings/oauth2/oauth2.types.js +4 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
- package/dist/wirings/queue/index.d.ts +2 -2
- package/dist/wirings/queue/index.js +1 -1
- package/dist/wirings/queue/queue-runner.d.ts +7 -0
- package/dist/wirings/queue/queue-runner.js +23 -12
- package/dist/wirings/queue/queue.types.d.ts +8 -2
- 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 +40 -13
- package/dist/wirings/rpc/rpc-runner.js +191 -25
- package/dist/wirings/rpc/rpc-types.d.ts +15 -4
- package/dist/wirings/scheduler/index.d.ts +3 -3
- package/dist/wirings/scheduler/index.js +2 -3
- package/dist/wirings/scheduler/log-schedulers.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -10
- package/dist/wirings/secret/index.d.ts +3 -0
- package/dist/wirings/secret/index.js +2 -0
- package/dist/wirings/secret/secret.types.d.ts +27 -0
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
- package/dist/wirings/secret/validate-secret-definitions.js +55 -0
- package/dist/wirings/trigger/index.d.ts +3 -0
- package/dist/wirings/trigger/index.js +2 -0
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
- package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +42 -0
- package/dist/wirings/trigger/trigger-runner.js +85 -0
- package/dist/wirings/trigger/trigger.types.d.ts +130 -0
- package/dist/wirings/trigger/trigger.types.js +40 -0
- package/dist/wirings/variable/index.d.ts +3 -0
- package/dist/wirings/variable/index.js +2 -0
- package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
- package/dist/wirings/variable/validate-variable-definitions.js +45 -0
- package/dist/wirings/variable/variable.types.d.ts +18 -0
- package/dist/wirings/variable/variable.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 +292 -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 +23 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
- package/dist/wirings/workflow/graph/graph-node.js +58 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
- package/dist/wirings/workflow/graph/graph-runner.js +540 -0
- package/dist/wirings/workflow/graph/index.d.ts +4 -0
- package/dist/wirings/workflow/graph/index.js +3 -0
- package/dist/wirings/workflow/graph/template.d.ts +15 -0
- package/dist/wirings/workflow/graph/template.js +27 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +82 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
- package/dist/wirings/workflow/index.d.ts +7 -12
- package/dist/wirings/workflow/index.js +8 -11
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
- package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
- package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
- package/dist/wirings/workflow/workflow-helpers.js +38 -0
- package/dist/wirings/workflow/workflow-utils.d.ts +1 -0
- package/dist/wirings/workflow/workflow-utils.js +1 -0
- package/dist/wirings/workflow/workflow.types.d.ts +83 -214
- package/package.json +13 -6
- package/run-tests.sh +4 -1
- package/src/crypto-utils.ts +99 -0
- package/src/errors/error-handler.ts +3 -3
- package/src/errors/errors.ts +17 -0
- package/src/errors/index.ts +0 -1
- package/src/factory-functions.test.ts +42 -2
- package/src/function/function-runner.test.ts +5 -12
- package/src/function/function-runner.ts +195 -40
- package/src/function/functions.types.ts +66 -14
- package/src/function/index.ts +5 -2
- package/src/handle-error.ts +2 -10
- package/src/index.ts +106 -27
- package/src/middleware/auth-apikey.test.ts +15 -12
- package/src/middleware/auth-apikey.ts +3 -3
- package/src/middleware/auth-bearer.test.ts +17 -14
- package/src/middleware/auth-bearer.ts +25 -27
- package/src/middleware/auth-cookie.test.ts +16 -13
- package/src/middleware/auth-cookie.ts +6 -8
- package/src/middleware/cors.ts +96 -0
- package/src/middleware/index.ts +5 -3
- package/src/middleware/remote-auth.ts +68 -0
- package/src/middleware-runner.test.ts +122 -0
- package/src/middleware-runner.ts +24 -17
- package/src/permissions.test.ts +102 -86
- package/src/permissions.ts +32 -93
- package/src/pikku-state.ts +168 -201
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.ts +50 -18
- package/src/services/ai-agent-runner-service.ts +29 -0
- package/src/services/ai-run-state-service.ts +20 -0
- package/src/services/ai-storage-service.ts +39 -0
- package/src/services/deployment-service.ts +22 -0
- package/src/services/gopass-secrets.ts +95 -0
- package/src/services/in-memory-trigger-service.ts +68 -0
- package/src/services/in-memory-workflow-service.ts +395 -0
- package/src/services/index.ts +49 -14
- package/src/services/local-secrets.ts +51 -0
- package/src/services/local-variables.ts +22 -0
- package/src/services/scheduler-service.ts +29 -1
- package/src/services/schema-service.ts +7 -0
- package/src/services/scoped-secret-service.ts +41 -0
- package/src/services/secret-service.ts +25 -4
- package/src/services/trigger-service.ts +38 -0
- package/src/services/typed-secret-service.ts +70 -0
- package/src/services/typed-variables-service.ts +81 -0
- package/src/services/user-session-service.ts +23 -0
- package/src/services/variables-service.ts +5 -0
- package/src/services/workflow-service.ts +94 -0
- package/src/types/core.types.ts +82 -8
- package/src/types/state.types.ts +169 -0
- package/src/utils.ts +74 -5
- package/src/version.test.ts +80 -0
- package/src/version.ts +25 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
- package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
- package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
- package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
- package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
- package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
- package/src/wirings/ai-agent/index.ts +28 -0
- package/src/wirings/channel/channel-common.ts +32 -19
- package/src/wirings/channel/channel-handler.ts +18 -5
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +14 -15
- package/src/wirings/channel/channel.types.ts +17 -1
- package/src/wirings/channel/define-channel-routes.ts +25 -0
- package/src/wirings/channel/index.ts +23 -8
- package/src/wirings/channel/local/index.ts +3 -3
- package/src/wirings/channel/local/local-channel-runner.test.ts +47 -2
- package/src/wirings/channel/local/local-channel-runner.ts +22 -6
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +28 -28
- package/src/wirings/cli/cli-runner.ts +27 -19
- package/src/wirings/cli/cli.types.ts +12 -11
- package/src/wirings/cli/command-parser.test.ts +8 -8
- package/src/wirings/cli/define-cli-commands.ts +24 -0
- package/src/wirings/cli/index.ts +10 -4
- package/src/wirings/http/http-routes.test.ts +322 -0
- package/src/wirings/http/http-routes.ts +198 -0
- package/src/wirings/http/http-runner.test.ts +5 -5
- package/src/wirings/http/http-runner.ts +80 -29
- package/src/wirings/http/http.types.ts +121 -23
- package/src/wirings/http/index.ts +16 -4
- 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/index.ts +27 -3
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
- package/src/wirings/mcp/mcp-runner.ts +56 -67
- package/src/wirings/mcp/mcp.types.ts +3 -3
- package/src/wirings/node/index.ts +2 -0
- package/src/wirings/node/node.types.ts +23 -0
- package/src/wirings/oauth2/index.ts +3 -0
- package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
- package/src/wirings/oauth2/oauth2-client.ts +335 -0
- package/src/wirings/oauth2/oauth2.types.ts +69 -0
- package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
- package/src/wirings/queue/index.ts +14 -2
- package/src/wirings/queue/queue-runner.test.ts +115 -73
- package/src/wirings/queue/queue-runner.ts +39 -13
- package/src/wirings/queue/queue.types.ts +12 -2
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +270 -34
- package/src/wirings/rpc/rpc-types.ts +21 -4
- package/src/wirings/scheduler/index.ts +7 -4
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
- package/src/wirings/scheduler/scheduler-runner.ts +50 -10
- package/src/wirings/secret/index.ts +9 -0
- package/src/wirings/secret/secret.types.ts +32 -0
- package/src/wirings/secret/validate-secret-definitions.ts +82 -0
- package/src/wirings/trigger/index.ts +10 -0
- package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
- package/src/wirings/trigger/trigger-runner.ts +138 -0
- package/src/wirings/trigger/trigger.types.ts +178 -0
- package/src/wirings/variable/index.ts +8 -0
- package/src/wirings/variable/validate-variable-definitions.ts +69 -0
- package/src/wirings/variable/variable.types.ts +22 -0
- package/src/wirings/workflow/dsl/index.ts +31 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
- package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
- package/src/wirings/workflow/graph/graph-node.ts +222 -0
- package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
- package/src/wirings/workflow/graph/graph-runner.ts +816 -0
- package/src/wirings/workflow/graph/index.ts +14 -0
- package/src/wirings/workflow/graph/template.ts +42 -0
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
- package/src/wirings/workflow/graph/workflow-graph.types.ts +104 -0
- package/src/wirings/workflow/index.ts +64 -26
- package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow-utils.ts +0 -0
- package/src/wirings/workflow/workflow.types.ts +123 -279
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
- package/dist/wirings/workflow/workflow-runner.js +0 -65
- package/src/function/function-runner.ts.bak +0 -188
- package/src/wirings/workflow/workflow-runner.ts +0 -72
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CorePermissionGroup,
|
|
3
|
+
CorePikkuPermission,
|
|
4
|
+
} from '../../function/functions.types.js'
|
|
5
|
+
import {
|
|
6
|
+
CorePikkuMiddleware,
|
|
7
|
+
MiddlewareMetadata,
|
|
8
|
+
PermissionMetadata,
|
|
9
|
+
} from '../../types/core.types.js'
|
|
10
|
+
import type { PikkuChannel } from '../channel/channel.types.js'
|
|
11
|
+
import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js'
|
|
12
|
+
|
|
13
|
+
export interface AIThread {
|
|
14
|
+
id: string
|
|
15
|
+
resourceId: string
|
|
16
|
+
title?: string
|
|
17
|
+
metadata?: Record<string, unknown>
|
|
18
|
+
createdAt: Date
|
|
19
|
+
updatedAt: Date
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface AIToolCall {
|
|
23
|
+
id: string
|
|
24
|
+
name: string
|
|
25
|
+
args: Record<string, unknown>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface AIToolResult {
|
|
29
|
+
id: string
|
|
30
|
+
name: string
|
|
31
|
+
result: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface AIMessage {
|
|
35
|
+
id: string
|
|
36
|
+
role: 'system' | 'user' | 'assistant' | 'tool'
|
|
37
|
+
content?: string
|
|
38
|
+
toolCalls?: AIToolCall[]
|
|
39
|
+
toolResults?: AIToolResult[]
|
|
40
|
+
createdAt: Date
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface AIAgentStep {
|
|
44
|
+
usage: { inputTokens: number; outputTokens: number }
|
|
45
|
+
toolCalls?: { name: string; args: Record<string, unknown>; result: string }[]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface AIAgentInput {
|
|
49
|
+
message: string
|
|
50
|
+
threadId: string
|
|
51
|
+
resourceId: string
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface AIAgentOutput {
|
|
55
|
+
runId: string
|
|
56
|
+
text: string
|
|
57
|
+
object?: unknown
|
|
58
|
+
threadId: string
|
|
59
|
+
steps: AIAgentStep[]
|
|
60
|
+
usage: { inputTokens: number; outputTokens: number }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface AIAgentToolDef {
|
|
64
|
+
name: string
|
|
65
|
+
description: string
|
|
66
|
+
inputSchema: Record<string, unknown>
|
|
67
|
+
execute: (input: unknown) => Promise<unknown>
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface PikkuAIMiddlewareHooks<
|
|
71
|
+
State extends Record<string, unknown> = Record<string, unknown>,
|
|
72
|
+
Services = any,
|
|
73
|
+
> {
|
|
74
|
+
modifyInput?: (
|
|
75
|
+
services: Services,
|
|
76
|
+
ctx: { messages: AIMessage[]; instructions: string }
|
|
77
|
+
) =>
|
|
78
|
+
| Promise<{ messages: AIMessage[]; instructions: string }>
|
|
79
|
+
| { messages: AIMessage[]; instructions: string }
|
|
80
|
+
|
|
81
|
+
modifyOutputStream?: (
|
|
82
|
+
services: Services,
|
|
83
|
+
ctx: {
|
|
84
|
+
event: AIStreamEvent
|
|
85
|
+
allEvents: readonly AIStreamEvent[]
|
|
86
|
+
state: State
|
|
87
|
+
}
|
|
88
|
+
) => Promise<AIStreamEvent | null> | AIStreamEvent | null
|
|
89
|
+
|
|
90
|
+
modifyOutput?: (
|
|
91
|
+
services: Services,
|
|
92
|
+
ctx: {
|
|
93
|
+
text: string
|
|
94
|
+
messages: AIMessage[]
|
|
95
|
+
usage: { inputTokens: number; outputTokens: number }
|
|
96
|
+
}
|
|
97
|
+
) =>
|
|
98
|
+
| Promise<{ text: string; messages: AIMessage[] }>
|
|
99
|
+
| { text: string; messages: AIMessage[] }
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export type AIAgentMemoryConfig = {
|
|
103
|
+
storage?: string
|
|
104
|
+
vector?: string
|
|
105
|
+
embedder?: string
|
|
106
|
+
lastMessages?: number
|
|
107
|
+
workingMemory?: unknown
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type CoreAIAgent<
|
|
111
|
+
PikkuPermission = CorePikkuPermission<any, any>,
|
|
112
|
+
PikkuMiddleware = CorePikkuMiddleware<any>,
|
|
113
|
+
> = {
|
|
114
|
+
name: string
|
|
115
|
+
description: string
|
|
116
|
+
summary?: string
|
|
117
|
+
errors?: string[]
|
|
118
|
+
instructions: string | string[]
|
|
119
|
+
model: string
|
|
120
|
+
temperature?: number
|
|
121
|
+
tools?: unknown[]
|
|
122
|
+
agents?: unknown[]
|
|
123
|
+
memory?: AIAgentMemoryConfig
|
|
124
|
+
maxSteps?: number
|
|
125
|
+
toolChoice?: 'auto' | 'required' | 'none'
|
|
126
|
+
input?: unknown
|
|
127
|
+
output?: unknown
|
|
128
|
+
tags?: string[]
|
|
129
|
+
middleware?: PikkuMiddleware[]
|
|
130
|
+
channelMiddleware?: CorePikkuChannelMiddleware<any, any>[]
|
|
131
|
+
aiMiddleware?: PikkuAIMiddlewareHooks<any, any>[]
|
|
132
|
+
permissions?: CorePermissionGroup<PikkuPermission>
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export type AIStreamEvent =
|
|
136
|
+
| { type: 'text-delta'; text: string; agent?: string; session?: string }
|
|
137
|
+
| { type: 'reasoning-delta'; text: string; agent?: string; session?: string }
|
|
138
|
+
| {
|
|
139
|
+
type: 'tool-call'
|
|
140
|
+
toolCallId: string
|
|
141
|
+
toolName: string
|
|
142
|
+
args: unknown
|
|
143
|
+
agent?: string
|
|
144
|
+
session?: string
|
|
145
|
+
}
|
|
146
|
+
| {
|
|
147
|
+
type: 'tool-result'
|
|
148
|
+
toolCallId: string
|
|
149
|
+
toolName: string
|
|
150
|
+
result: unknown
|
|
151
|
+
agent?: string
|
|
152
|
+
session?: string
|
|
153
|
+
}
|
|
154
|
+
| {
|
|
155
|
+
type: 'agent-call'
|
|
156
|
+
agentName: string
|
|
157
|
+
session: string
|
|
158
|
+
input: unknown
|
|
159
|
+
}
|
|
160
|
+
| {
|
|
161
|
+
type: 'agent-result'
|
|
162
|
+
agentName: string
|
|
163
|
+
session: string
|
|
164
|
+
result: unknown
|
|
165
|
+
}
|
|
166
|
+
| {
|
|
167
|
+
type: 'approval-request'
|
|
168
|
+
toolCallId: string
|
|
169
|
+
toolName: string
|
|
170
|
+
args: unknown
|
|
171
|
+
reason?: string
|
|
172
|
+
agent?: string
|
|
173
|
+
session?: string
|
|
174
|
+
}
|
|
175
|
+
| {
|
|
176
|
+
type: 'usage'
|
|
177
|
+
tokens: { input: number; output: number }
|
|
178
|
+
model: string
|
|
179
|
+
agent?: string
|
|
180
|
+
session?: string
|
|
181
|
+
}
|
|
182
|
+
| { type: 'error'; message: string; agent?: string; session?: string }
|
|
183
|
+
| {
|
|
184
|
+
type: 'suspended'
|
|
185
|
+
reason: 'rpc-missing'
|
|
186
|
+
missingRpcs: string[]
|
|
187
|
+
}
|
|
188
|
+
| { type: 'done' }
|
|
189
|
+
|
|
190
|
+
export interface AIStreamChannel extends PikkuChannel<unknown, AIStreamEvent> {}
|
|
191
|
+
|
|
192
|
+
export type PendingApproval =
|
|
193
|
+
| {
|
|
194
|
+
type: 'tool-call'
|
|
195
|
+
toolCallId: string
|
|
196
|
+
toolName: string
|
|
197
|
+
args: unknown
|
|
198
|
+
}
|
|
199
|
+
| {
|
|
200
|
+
type: 'agent-call'
|
|
201
|
+
toolCallId: string
|
|
202
|
+
agentName: string
|
|
203
|
+
agentRunId: string
|
|
204
|
+
displayToolName: string
|
|
205
|
+
displayArgs: unknown
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export interface AgentRunState {
|
|
209
|
+
runId: string
|
|
210
|
+
agentName: string
|
|
211
|
+
threadId: string
|
|
212
|
+
resourceId: string
|
|
213
|
+
status: 'running' | 'suspended' | 'completed' | 'failed'
|
|
214
|
+
suspendReason?: 'approval' | 'rpc-missing'
|
|
215
|
+
missingRpcs?: string[]
|
|
216
|
+
pendingApprovals?: PendingApproval[]
|
|
217
|
+
usage: { inputTokens: number; outputTokens: number; model: string }
|
|
218
|
+
createdAt: Date
|
|
219
|
+
updatedAt: Date
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export interface AgentRunRow {
|
|
223
|
+
runId: string
|
|
224
|
+
agentName: string
|
|
225
|
+
threadId: string
|
|
226
|
+
resourceId: string
|
|
227
|
+
status: string
|
|
228
|
+
suspendReason?: string
|
|
229
|
+
missingRpcs?: string[]
|
|
230
|
+
usageInputTokens: number
|
|
231
|
+
usageOutputTokens: number
|
|
232
|
+
usageModel: string
|
|
233
|
+
createdAt: Date
|
|
234
|
+
updatedAt: Date
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export interface AgentRunService {
|
|
238
|
+
listThreads(options?: {
|
|
239
|
+
agentName?: string
|
|
240
|
+
limit?: number
|
|
241
|
+
offset?: number
|
|
242
|
+
}): Promise<AIThread[]>
|
|
243
|
+
getThread(threadId: string): Promise<AIThread | null>
|
|
244
|
+
getThreadMessages(threadId: string): Promise<AIMessage[]>
|
|
245
|
+
getThreadRuns(threadId: string): Promise<AgentRunRow[]>
|
|
246
|
+
deleteThread(threadId: string): Promise<boolean>
|
|
247
|
+
getDistinctAgentNames(): Promise<string[]>
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export type AIAgentMeta = Record<
|
|
251
|
+
string,
|
|
252
|
+
Omit<
|
|
253
|
+
CoreAIAgent,
|
|
254
|
+
| 'input'
|
|
255
|
+
| 'output'
|
|
256
|
+
| 'tools'
|
|
257
|
+
| 'agents'
|
|
258
|
+
| 'middleware'
|
|
259
|
+
| 'channelMiddleware'
|
|
260
|
+
| 'aiMiddleware'
|
|
261
|
+
| 'permissions'
|
|
262
|
+
> & {
|
|
263
|
+
tools?: string[]
|
|
264
|
+
agents?: string[]
|
|
265
|
+
inputSchema: string | null
|
|
266
|
+
outputSchema: string | null
|
|
267
|
+
workingMemorySchema: string | null
|
|
268
|
+
middleware?: MiddlewareMetadata[]
|
|
269
|
+
channelMiddleware?: MiddlewareMetadata[]
|
|
270
|
+
aiMiddleware?: MiddlewareMetadata[]
|
|
271
|
+
permissions?: PermissionMetadata[]
|
|
272
|
+
}
|
|
273
|
+
>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export { runAIAgent } from './ai-agent-runner.js'
|
|
2
|
+
export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js'
|
|
3
|
+
export {
|
|
4
|
+
type RunAIAgentParams,
|
|
5
|
+
type StreamAIAgentOptions,
|
|
6
|
+
ToolApprovalRequired,
|
|
7
|
+
} from './ai-agent-prepare.js'
|
|
8
|
+
export {
|
|
9
|
+
addAIAgent,
|
|
10
|
+
approveAIAgent,
|
|
11
|
+
getAIAgents,
|
|
12
|
+
getAIAgentsMeta,
|
|
13
|
+
} from './ai-agent-registry.js'
|
|
14
|
+
export type {
|
|
15
|
+
AIAgentMeta,
|
|
16
|
+
AIAgentMemoryConfig,
|
|
17
|
+
AIAgentStep,
|
|
18
|
+
AgentRunRow,
|
|
19
|
+
AgentRunService,
|
|
20
|
+
AgentRunState,
|
|
21
|
+
AIMessage,
|
|
22
|
+
AIStreamChannel,
|
|
23
|
+
AIStreamEvent,
|
|
24
|
+
AIThread,
|
|
25
|
+
CoreAIAgent,
|
|
26
|
+
PendingApproval,
|
|
27
|
+
PikkuAIMiddlewareHooks,
|
|
28
|
+
} from './ai-agent.types.js'
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
CoreSingletonServices,
|
|
3
|
+
CorePikkuMiddleware,
|
|
4
|
+
PikkuWire,
|
|
5
|
+
MiddlewareMetadata,
|
|
6
|
+
} from '../../types/core.types.js'
|
|
2
7
|
import { CoreChannel, ChannelMessageMeta } from './channel.types.js'
|
|
3
8
|
import { combineMiddleware, runMiddleware } from '../../middleware-runner.js'
|
|
4
9
|
import { runPikkuFuncDirectly } from '../../function/function-runner.js'
|
|
10
|
+
import {
|
|
11
|
+
combineChannelMiddleware,
|
|
12
|
+
wrapChannelWithMiddleware,
|
|
13
|
+
} from './channel-middleware-runner.js'
|
|
5
14
|
|
|
6
15
|
/**
|
|
7
16
|
* Runs a channel lifecycle function (onConnect or onDisconnect) with proper middleware handling.
|
|
@@ -9,7 +18,8 @@ import { runPikkuFuncDirectly } from '../../function/function-runner.js'
|
|
|
9
18
|
* This function:
|
|
10
19
|
* 1. Extracts inline middleware from the lifecycle config if present
|
|
11
20
|
* 2. Combines metadata middleware with inline middleware using combineMiddleware()
|
|
12
|
-
* 3.
|
|
21
|
+
* 3. Wraps the channel with channel middleware if present
|
|
22
|
+
* 4. Runs the lifecycle function with middleware support
|
|
13
23
|
*
|
|
14
24
|
* @param channelConfig - The channel configuration
|
|
15
25
|
* @param meta - Metadata for the lifecycle function (connect or disconnect)
|
|
@@ -18,6 +28,7 @@ import { runPikkuFuncDirectly } from '../../function/function-runner.js'
|
|
|
18
28
|
* @param services - All services (singleton + session)
|
|
19
29
|
* @param channel - The channel instance
|
|
20
30
|
* @param data - Optional data to pass to the lifecycle function (for onConnect)
|
|
31
|
+
* @param channelMiddlewareMeta - Optional channel middleware metadata for wrapping channel.send()
|
|
21
32
|
* @returns Promise<unknown> - Result from the lifecycle function (if any)
|
|
22
33
|
*/
|
|
23
34
|
export const runChannelLifecycleWithMiddleware = async ({
|
|
@@ -28,22 +39,22 @@ export const runChannelLifecycleWithMiddleware = async ({
|
|
|
28
39
|
services,
|
|
29
40
|
channel,
|
|
30
41
|
data,
|
|
42
|
+
channelMiddlewareMeta,
|
|
31
43
|
}: {
|
|
32
44
|
channelConfig: CoreChannel<unknown, any>
|
|
33
45
|
meta: ChannelMessageMeta
|
|
34
46
|
lifecycleConfig: any
|
|
35
47
|
lifecycleType: 'connect' | 'disconnect'
|
|
36
|
-
services:
|
|
48
|
+
services: CoreSingletonServices
|
|
37
49
|
channel: any
|
|
38
50
|
data?: unknown
|
|
51
|
+
channelMiddlewareMeta?: MiddlewareMetadata[]
|
|
39
52
|
}): Promise<unknown> => {
|
|
40
|
-
// Extract middleware if lifecycle config is an object
|
|
41
53
|
const lifecycleMiddleware =
|
|
42
54
|
typeof lifecycleConfig === 'object' && 'middleware' in lifecycleConfig
|
|
43
55
|
? (lifecycleConfig.middleware as CorePikkuMiddleware[]) || []
|
|
44
56
|
: []
|
|
45
57
|
|
|
46
|
-
// Use combineMiddleware to properly resolve metadata + inline middleware
|
|
47
58
|
const allMiddleware = combineMiddleware(
|
|
48
59
|
'channel',
|
|
49
60
|
`${channelConfig.name}:${lifecycleType}`,
|
|
@@ -53,24 +64,26 @@ export const runChannelLifecycleWithMiddleware = async ({
|
|
|
53
64
|
}
|
|
54
65
|
)
|
|
55
66
|
|
|
56
|
-
|
|
67
|
+
const allChannelMiddleware = combineChannelMiddleware(
|
|
68
|
+
'channel',
|
|
69
|
+
`${channelConfig.name}:${lifecycleType}:cm`,
|
|
70
|
+
{
|
|
71
|
+
wireInheritedChannelMiddleware: channelMiddlewareMeta,
|
|
72
|
+
wireChannelMiddleware: channelConfig.channelMiddleware as any,
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
let wire: PikkuWire = { channel }
|
|
77
|
+
if (allChannelMiddleware.length > 0) {
|
|
78
|
+
wire = wrapChannelWithMiddleware(wire, services, allChannelMiddleware)
|
|
79
|
+
}
|
|
80
|
+
|
|
57
81
|
const runLifecycle = async () => {
|
|
58
|
-
return await runPikkuFuncDirectly(
|
|
59
|
-
meta.pikkuFuncName,
|
|
60
|
-
services,
|
|
61
|
-
{ channel },
|
|
62
|
-
data
|
|
63
|
-
)
|
|
82
|
+
return await runPikkuFuncDirectly(meta.pikkuFuncId, services, wire, data)
|
|
64
83
|
}
|
|
65
84
|
|
|
66
|
-
// Run with middleware if any
|
|
67
85
|
if (allMiddleware.length > 0) {
|
|
68
|
-
return await runMiddleware(
|
|
69
|
-
services,
|
|
70
|
-
{ channel },
|
|
71
|
-
allMiddleware,
|
|
72
|
-
runLifecycle
|
|
73
|
-
)
|
|
86
|
+
return await runMiddleware(services, wire, allMiddleware, runLifecycle)
|
|
74
87
|
} else {
|
|
75
88
|
return await runLifecycle()
|
|
76
89
|
}
|
|
@@ -10,14 +10,21 @@ import {
|
|
|
10
10
|
} from './channel.types.js'
|
|
11
11
|
import { pikkuState } from '../../pikku-state.js'
|
|
12
12
|
import { runPikkuFunc } from '../../function/function-runner.js'
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
SessionService,
|
|
15
|
+
createMiddlewareSessionWireProps,
|
|
16
|
+
} from '../../services/user-session-service.js'
|
|
17
|
+
|
|
18
|
+
const getChannelMeta = (channelName: string) => {
|
|
19
|
+
return pikkuState(null, 'channel', 'meta')[channelName]
|
|
20
|
+
}
|
|
14
21
|
|
|
15
22
|
const getRouteMeta = (
|
|
16
23
|
channelName: string,
|
|
17
24
|
routingProperty?: string,
|
|
18
25
|
routerValue?: string
|
|
19
26
|
): ChannelMessageMeta => {
|
|
20
|
-
const channelMeta = pikkuState('channel', 'meta')[channelName]
|
|
27
|
+
const channelMeta = pikkuState(null, 'channel', 'meta')[channelName]
|
|
21
28
|
if (!channelMeta) {
|
|
22
29
|
throw new Error(`Channel ${channelName} not found`)
|
|
23
30
|
}
|
|
@@ -87,7 +94,7 @@ export const processMessageHandlers = (
|
|
|
87
94
|
}
|
|
88
95
|
|
|
89
96
|
const {
|
|
90
|
-
|
|
97
|
+
pikkuFuncId,
|
|
91
98
|
middleware: routeInheritedMiddleware,
|
|
92
99
|
permissions: inheritedPermissions,
|
|
93
100
|
} = getRouteMeta(channelConfig.name, routingProperty, routerValue)
|
|
@@ -122,17 +129,23 @@ export const processMessageHandlers = (
|
|
|
122
129
|
? `${channelConfig.name}:${routingProperty}:${routerValue}`
|
|
123
130
|
: `${channelConfig.name}:default`
|
|
124
131
|
|
|
125
|
-
|
|
132
|
+
const channelMeta = getChannelMeta(channelConfig.name)
|
|
133
|
+
const wireChannelMiddleware = channelConfig.channelMiddleware || []
|
|
134
|
+
|
|
135
|
+
return await runPikkuFunc('channel', cacheKey, pikkuFuncId, {
|
|
126
136
|
singletonServices: services,
|
|
127
137
|
data: () => data,
|
|
128
138
|
inheritedMiddleware,
|
|
129
139
|
wireMiddleware,
|
|
140
|
+
inheritedChannelMiddleware: channelMeta?.channelMiddleware,
|
|
141
|
+
wireChannelMiddleware: wireChannelMiddleware as any,
|
|
130
142
|
inheritedPermissions,
|
|
131
143
|
wirePermissions,
|
|
132
144
|
tags: channelConfig.tags,
|
|
145
|
+
sessionService: userSession,
|
|
133
146
|
wire: {
|
|
134
147
|
channel: channelHandler.getChannel(),
|
|
135
|
-
|
|
148
|
+
...(userSession && createMiddlewareSessionWireProps(userSession)),
|
|
136
149
|
},
|
|
137
150
|
})
|
|
138
151
|
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CoreSingletonServices,
|
|
3
|
+
MiddlewareMetadata,
|
|
4
|
+
PikkuWire,
|
|
5
|
+
} from '../../types/core.types.js'
|
|
6
|
+
import type { CorePikkuChannelMiddleware } from './channel.types.js'
|
|
7
|
+
import { pikkuState } from '../../pikku-state.js'
|
|
8
|
+
import { freezeDedupe, getTagGroups } from '../../utils.js'
|
|
9
|
+
|
|
10
|
+
export const addChannelMiddleware = (
|
|
11
|
+
tag: string,
|
|
12
|
+
middleware: CorePikkuChannelMiddleware[],
|
|
13
|
+
packageName: string | null = null
|
|
14
|
+
): CorePikkuChannelMiddleware[] => {
|
|
15
|
+
const tagGroups = pikkuState(packageName, 'channelMiddleware', 'tagGroup')
|
|
16
|
+
tagGroups[tag] = middleware
|
|
17
|
+
return middleware
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const getChannelMiddlewareByName = (
|
|
21
|
+
name: string
|
|
22
|
+
): CorePikkuChannelMiddleware | undefined => {
|
|
23
|
+
const store = pikkuState(null, 'misc', 'channelMiddleware')
|
|
24
|
+
const middleware = store[name]
|
|
25
|
+
return middleware?.[0]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const channelMiddlewareCache: Record<
|
|
29
|
+
string,
|
|
30
|
+
readonly CorePikkuChannelMiddleware[]
|
|
31
|
+
> = {}
|
|
32
|
+
|
|
33
|
+
export const combineChannelMiddleware = (
|
|
34
|
+
wireType: string,
|
|
35
|
+
uid: string,
|
|
36
|
+
{
|
|
37
|
+
wireInheritedChannelMiddleware,
|
|
38
|
+
wireChannelMiddleware,
|
|
39
|
+
packageName = null,
|
|
40
|
+
}: {
|
|
41
|
+
wireInheritedChannelMiddleware?: MiddlewareMetadata[]
|
|
42
|
+
wireChannelMiddleware?: CorePikkuChannelMiddleware[]
|
|
43
|
+
packageName?: string | null
|
|
44
|
+
} = {}
|
|
45
|
+
): readonly CorePikkuChannelMiddleware[] => {
|
|
46
|
+
const cacheKey = `${wireType}:${uid}`
|
|
47
|
+
if (channelMiddlewareCache[cacheKey]) {
|
|
48
|
+
return channelMiddlewareCache[cacheKey]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const resolved: CorePikkuChannelMiddleware[] = []
|
|
52
|
+
|
|
53
|
+
if (wireInheritedChannelMiddleware) {
|
|
54
|
+
for (const meta of wireInheritedChannelMiddleware) {
|
|
55
|
+
if (meta.type === 'tag') {
|
|
56
|
+
const groups = getTagGroups(
|
|
57
|
+
pikkuState(packageName, 'channelMiddleware', 'tagGroup'),
|
|
58
|
+
meta.tag
|
|
59
|
+
)
|
|
60
|
+
for (const group of groups) {
|
|
61
|
+
resolved.push(...group)
|
|
62
|
+
}
|
|
63
|
+
} else if (meta.type === 'wire') {
|
|
64
|
+
const middleware = getChannelMiddlewareByName(meta.name)
|
|
65
|
+
if (middleware) {
|
|
66
|
+
resolved.push(middleware)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (wireChannelMiddleware) {
|
|
73
|
+
resolved.push(...wireChannelMiddleware)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
channelMiddlewareCache[cacheKey] = freezeDedupe(
|
|
77
|
+
resolved
|
|
78
|
+
) as readonly CorePikkuChannelMiddleware[]
|
|
79
|
+
|
|
80
|
+
return channelMiddlewareCache[cacheKey]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function wrapChannelWithMiddleware<Out>(
|
|
84
|
+
wire: PikkuWire,
|
|
85
|
+
services: CoreSingletonServices,
|
|
86
|
+
middlewares: readonly CorePikkuChannelMiddleware[]
|
|
87
|
+
): PikkuWire {
|
|
88
|
+
if (middlewares.length === 0 || !wire.channel) return wire
|
|
89
|
+
|
|
90
|
+
const channel = wire.channel
|
|
91
|
+
const originalSend = channel.send.bind(channel)
|
|
92
|
+
|
|
93
|
+
const dispatch = async (index: number, event: Out): Promise<void> => {
|
|
94
|
+
if (index >= middlewares.length) {
|
|
95
|
+
await originalSend(event)
|
|
96
|
+
return
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const middleware = middlewares[index]!
|
|
100
|
+
await middleware(services, event, async (result: any) => {
|
|
101
|
+
if (result === null || result === undefined) return
|
|
102
|
+
if (Array.isArray(result)) {
|
|
103
|
+
for (const item of result) {
|
|
104
|
+
await dispatch(index + 1, item)
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
await dispatch(index + 1, result)
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
...wire,
|
|
114
|
+
channel: {
|
|
115
|
+
...channel,
|
|
116
|
+
send: ((data: Out) => dispatch(0, data)) as typeof channel.send,
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NotFoundError } from '../../errors/errors.js'
|
|
1
|
+
import { NotFoundError, PikkuMissingMetaError } from '../../errors/errors.js'
|
|
2
2
|
import { addFunction } from '../../function/function-runner.js'
|
|
3
3
|
import { CorePikkuPermission } from '../../function/functions.types.js'
|
|
4
4
|
import { pikkuState } from '../../pikku-state.js'
|
|
@@ -33,31 +33,30 @@ export const wireChannel = <
|
|
|
33
33
|
>
|
|
34
34
|
) => {
|
|
35
35
|
// Get the channel metadata
|
|
36
|
-
const channelsMeta = pikkuState('channel', 'meta')
|
|
36
|
+
const channelsMeta = pikkuState(null, 'channel', 'meta')
|
|
37
37
|
const channelMeta = channelsMeta[channel.name]
|
|
38
38
|
if (!channelMeta) {
|
|
39
|
-
throw new
|
|
39
|
+
throw new PikkuMissingMetaError(
|
|
40
|
+
`Missing generated metadata for channel '${channel.name}'`
|
|
41
|
+
)
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
pikkuState('channel', 'channels').set(channel.name, channel as any)
|
|
44
|
+
pikkuState(null, 'channel', 'channels').set(channel.name, channel as any)
|
|
43
45
|
|
|
44
46
|
// Register onConnect function if provided
|
|
45
47
|
if (channel.onConnect && channelMeta.connect) {
|
|
46
|
-
addFunction(channelMeta.connect.
|
|
48
|
+
addFunction(channelMeta.connect.pikkuFuncId, channel.onConnect as any)
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
// Register onDisconnect function if provided
|
|
50
52
|
if (channel.onDisconnect && channelMeta.disconnect) {
|
|
51
|
-
addFunction(
|
|
52
|
-
channelMeta.disconnect.pikkuFuncName,
|
|
53
|
-
channel.onDisconnect as any
|
|
54
|
-
)
|
|
53
|
+
addFunction(channelMeta.disconnect.pikkuFuncId, channel.onDisconnect as any)
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
// Register onMessage function if provided
|
|
58
|
-
if (channel.onMessage && channelMeta.message?.
|
|
57
|
+
if (channel.onMessage && channelMeta.message?.pikkuFuncId) {
|
|
59
58
|
addFunction(
|
|
60
|
-
channelMeta.message.
|
|
59
|
+
channelMeta.message.pikkuFuncId,
|
|
61
60
|
(channel.onMessage as any).func instanceof Function
|
|
62
61
|
? channel.onMessage
|
|
63
62
|
: (channel.onMessage as any).func
|
|
@@ -79,7 +78,7 @@ export const wireChannel = <
|
|
|
79
78
|
// Register the function using the pikku name from metadata
|
|
80
79
|
// It could be a FuncConfig or a wiring override with a funcConfig
|
|
81
80
|
addFunction(
|
|
82
|
-
wiringMeta.
|
|
81
|
+
wiringMeta.pikkuFuncId,
|
|
83
82
|
(handler as any).func instanceof Function
|
|
84
83
|
? handler
|
|
85
84
|
: (handler as any).func
|
|
@@ -89,7 +88,7 @@ export const wireChannel = <
|
|
|
89
88
|
}
|
|
90
89
|
|
|
91
90
|
// Store the channel configuration
|
|
92
|
-
pikkuState('channel', 'channels').set(channel.name, channel as any)
|
|
91
|
+
pikkuState(null, 'channel', 'channels').set(channel.name, channel as any)
|
|
93
92
|
}
|
|
94
93
|
|
|
95
94
|
const getMatchingChannelConfig = (path: string) => {
|
|
@@ -98,7 +97,7 @@ const getMatchingChannelConfig = (path: string) => {
|
|
|
98
97
|
return null
|
|
99
98
|
}
|
|
100
99
|
|
|
101
|
-
const meta = pikkuState('channel', 'meta')
|
|
100
|
+
const meta = pikkuState(null, 'channel', 'meta')
|
|
102
101
|
const channelMeta = Object.values(meta).find(
|
|
103
102
|
(channelConfig) => channelConfig.route === matchedPath.route
|
|
104
103
|
)
|
|
@@ -106,7 +105,7 @@ const getMatchingChannelConfig = (path: string) => {
|
|
|
106
105
|
return null
|
|
107
106
|
}
|
|
108
107
|
|
|
109
|
-
const channels = pikkuState('channel', 'channels')
|
|
108
|
+
const channels = pikkuState(null, 'channel', 'channels')
|
|
110
109
|
const channelConfig = channels.get(channelMeta.name)
|
|
111
110
|
if (!channelConfig) {
|
|
112
111
|
return null
|
|
@@ -11,6 +11,18 @@ import {
|
|
|
11
11
|
MiddlewareMetadata,
|
|
12
12
|
PermissionMetadata,
|
|
13
13
|
} from '../../types/core.types.js'
|
|
14
|
+
|
|
15
|
+
export type CorePikkuChannelMiddleware<Services = any, Event = unknown> = (
|
|
16
|
+
services: Services,
|
|
17
|
+
event: Event,
|
|
18
|
+
next: (event: Event | Event[] | null) => Promise<void> | void
|
|
19
|
+
) => Promise<void> | void
|
|
20
|
+
|
|
21
|
+
export type CorePikkuChannelMiddlewareFactory<
|
|
22
|
+
In = any,
|
|
23
|
+
Services = any,
|
|
24
|
+
Event = unknown,
|
|
25
|
+
> = (input: In) => CorePikkuChannelMiddleware<Services, Event>
|
|
14
26
|
import {
|
|
15
27
|
CorePermissionGroup,
|
|
16
28
|
CorePikkuFunction,
|
|
@@ -36,7 +48,7 @@ export type RunChannelParams<ChannelData> = {
|
|
|
36
48
|
}
|
|
37
49
|
|
|
38
50
|
export interface ChannelMessageMeta {
|
|
39
|
-
|
|
51
|
+
pikkuFuncId: string
|
|
40
52
|
summary?: string
|
|
41
53
|
description?: string
|
|
42
54
|
errors?: string[]
|
|
@@ -62,6 +74,7 @@ export interface ChannelMeta {
|
|
|
62
74
|
tags?: string[]
|
|
63
75
|
middleware?: MiddlewareMetadata[] // Pre-resolved middleware chain (tag + explicit)
|
|
64
76
|
permissions?: PermissionMetadata[] // Pre-resolved permission chain (tag + explicit)
|
|
77
|
+
channelMiddleware?: MiddlewareMetadata[]
|
|
65
78
|
}
|
|
66
79
|
|
|
67
80
|
export type ChannelsMeta = Record<string, ChannelMeta>
|
|
@@ -118,6 +131,9 @@ export type CoreChannel<
|
|
|
118
131
|
>
|
|
119
132
|
>
|
|
120
133
|
middleware?: PikkuMiddleware[]
|
|
134
|
+
channelMiddleware?: Array<
|
|
135
|
+
CorePikkuChannelMiddleware | CorePikkuChannelMiddlewareFactory
|
|
136
|
+
>
|
|
121
137
|
permissions?: CorePermissionGroup<PikkuPermission>
|
|
122
138
|
auth?: boolean
|
|
123
139
|
docs?: Partial<{
|