@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
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// TODO: WireServices probably needs it's own type
|
|
2
|
-
// but is an issue for the future and will be tackled
|
|
3
|
-
// with dependency injection
|
|
4
1
|
export const closeWireServices = async (logger, wireServices) => {
|
|
5
2
|
await Promise.all(Object.values(wireServices).map(async (service) => {
|
|
6
3
|
if (service?.close) {
|
|
@@ -28,6 +25,21 @@ export const isSerializable = (data) => {
|
|
|
28
25
|
data instanceof Float32Array ||
|
|
29
26
|
data instanceof Float64Array);
|
|
30
27
|
};
|
|
28
|
+
export const getTagGroups = (tagGroups, tag) => {
|
|
29
|
+
const results = [];
|
|
30
|
+
const exact = tagGroups[tag];
|
|
31
|
+
if (exact)
|
|
32
|
+
results.push(exact);
|
|
33
|
+
let colonIdx = tag.lastIndexOf(':');
|
|
34
|
+
while (colonIdx !== -1) {
|
|
35
|
+
const parent = tag.slice(0, colonIdx);
|
|
36
|
+
const group = tagGroups[parent];
|
|
37
|
+
if (group)
|
|
38
|
+
results.push(group);
|
|
39
|
+
colonIdx = parent.lastIndexOf(':');
|
|
40
|
+
}
|
|
41
|
+
return results;
|
|
42
|
+
};
|
|
31
43
|
const EMPTY_ARRAY = Object.freeze([]);
|
|
32
44
|
export const freezeDedupe = (arr) => {
|
|
33
45
|
if (!arr || arr.length === 0)
|
|
@@ -45,3 +57,48 @@ export const freezeDedupe = (arr) => {
|
|
|
45
57
|
}
|
|
46
58
|
return Object.freeze(out);
|
|
47
59
|
};
|
|
60
|
+
/**
|
|
61
|
+
* Stop a single service by calling its stop method if it exists
|
|
62
|
+
*/
|
|
63
|
+
const stopService = async (logger, name, service) => {
|
|
64
|
+
const stop = service?.stop;
|
|
65
|
+
if (stop) {
|
|
66
|
+
logger.info(`Stopping singleton service: ${name}`);
|
|
67
|
+
try {
|
|
68
|
+
await stop.call(service);
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
logger.error(`Error stopping service ${name}:`, e);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Stop all singleton services, including external package services.
|
|
77
|
+
* External package services are stopped first, then the parent services.
|
|
78
|
+
*
|
|
79
|
+
* @param singletonServices - The parent singleton services to stop
|
|
80
|
+
*/
|
|
81
|
+
export const stopSingletonServices = async (singletonServices) => {
|
|
82
|
+
const logger = singletonServices.logger;
|
|
83
|
+
// First, stop all external package singleton services
|
|
84
|
+
if (globalThis.pikkuState) {
|
|
85
|
+
for (const [packageName, packageState] of globalThis.pikkuState) {
|
|
86
|
+
// Skip main package - we handle it separately
|
|
87
|
+
if (packageName === '__main__')
|
|
88
|
+
continue;
|
|
89
|
+
const packageServices = packageState.package?.singletonServices;
|
|
90
|
+
if (packageServices) {
|
|
91
|
+
logger.info(`Stopping singleton services for package: ${packageName}`);
|
|
92
|
+
for (const [name, service] of Object.entries(packageServices)) {
|
|
93
|
+
await stopService(logger, `${packageName}/${name}`, service);
|
|
94
|
+
}
|
|
95
|
+
// Clear the cached services
|
|
96
|
+
packageState.package.singletonServices = null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Then stop the parent singleton services
|
|
101
|
+
for (const [name, service] of Object.entries(singletonServices)) {
|
|
102
|
+
await stopService(logger, name, service);
|
|
103
|
+
}
|
|
104
|
+
};
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const VERSION_SEPARATOR = '@v';
|
|
2
|
+
export function formatVersionedId(baseName, version) {
|
|
3
|
+
return `${baseName}${VERSION_SEPARATOR}${version}`;
|
|
4
|
+
}
|
|
5
|
+
export function parseVersionedId(id) {
|
|
6
|
+
const idx = id.lastIndexOf(VERSION_SEPARATOR);
|
|
7
|
+
if (idx === -1) {
|
|
8
|
+
return { baseName: id, version: null };
|
|
9
|
+
}
|
|
10
|
+
const versionStr = id.slice(idx + VERSION_SEPARATOR.length);
|
|
11
|
+
const version = Number(versionStr);
|
|
12
|
+
if (!Number.isInteger(version) || version < 1) {
|
|
13
|
+
return { baseName: id, version: null };
|
|
14
|
+
}
|
|
15
|
+
return { baseName: id.slice(0, idx), version };
|
|
16
|
+
}
|
|
17
|
+
export function isVersionedId(id) {
|
|
18
|
+
return parseVersionedId(id).version !== null;
|
|
19
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CoreSingletonServices } from '../../types/core.types.js';
|
|
2
|
+
import type { CoreAIAgent, AIAgentMemoryConfig, AIAgentInput, AIMessage } from './ai-agent.types.js';
|
|
3
|
+
import type { AIStorageService } from '../../services/ai-storage-service.js';
|
|
4
|
+
import type { Logger } from '../../services/logger.js';
|
|
5
|
+
import type { SchemaService } from '../../services/schema-service.js';
|
|
6
|
+
export declare function resolveMemoryServices(agent: CoreAIAgent, singletonServices: CoreSingletonServices): {
|
|
7
|
+
storage: AIStorageService | undefined;
|
|
8
|
+
};
|
|
9
|
+
export declare function deepMergeWorkingMemory(existing: Record<string, unknown>, updates: Record<string, unknown>): Record<string, unknown>;
|
|
10
|
+
export declare function buildWorkingMemoryPrompt(currentState: Record<string, unknown> | null, jsonSchema?: Record<string, unknown>): string;
|
|
11
|
+
export declare function loadContextMessages(memoryConfig: AIAgentMemoryConfig | undefined, storage: AIStorageService | undefined, input: AIAgentInput, workingMemoryJsonSchema?: Record<string, unknown>): Promise<AIMessage[]>;
|
|
12
|
+
export declare function saveMessages(storage: AIStorageService | undefined, threadId: string, resourceId: string, memoryConfig: AIAgentMemoryConfig | undefined, userMessage: AIMessage, result: {
|
|
13
|
+
text: string;
|
|
14
|
+
steps: {
|
|
15
|
+
toolCalls?: {
|
|
16
|
+
name: string;
|
|
17
|
+
args: Record<string, unknown>;
|
|
18
|
+
result: string;
|
|
19
|
+
}[];
|
|
20
|
+
}[];
|
|
21
|
+
}, options?: {
|
|
22
|
+
workingMemoryJsonSchema?: Record<string, unknown>;
|
|
23
|
+
workingMemorySchemaName?: string | null;
|
|
24
|
+
logger?: Logger;
|
|
25
|
+
schemaService?: SchemaService;
|
|
26
|
+
}): Promise<string>;
|
|
27
|
+
export declare function trimMessages(messages: AIMessage[], maxTokenBudget?: number): AIMessage[];
|
|
28
|
+
export declare function parseWorkingMemory(text: string): Record<string, unknown> | null;
|
|
29
|
+
export declare function stripWorkingMemoryTags(text: string): string;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
export function resolveMemoryServices(agent, singletonServices) {
|
|
3
|
+
const memoryConfig = agent.memory;
|
|
4
|
+
const storage = memoryConfig?.storage
|
|
5
|
+
? singletonServices[memoryConfig.storage]
|
|
6
|
+
: singletonServices.aiStorage;
|
|
7
|
+
return { storage };
|
|
8
|
+
}
|
|
9
|
+
export function deepMergeWorkingMemory(existing, updates) {
|
|
10
|
+
const result = { ...existing };
|
|
11
|
+
for (const key of Object.keys(updates)) {
|
|
12
|
+
const value = updates[key];
|
|
13
|
+
if (value === null) {
|
|
14
|
+
delete result[key];
|
|
15
|
+
}
|
|
16
|
+
else if (typeof value === 'object' &&
|
|
17
|
+
!Array.isArray(value) &&
|
|
18
|
+
typeof result[key] === 'object' &&
|
|
19
|
+
result[key] !== null &&
|
|
20
|
+
!Array.isArray(result[key])) {
|
|
21
|
+
result[key] = deepMergeWorkingMemory(result[key], value);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
result[key] = value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
export function buildWorkingMemoryPrompt(currentState, jsonSchema) {
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (jsonSchema?.properties) {
|
|
32
|
+
const props = jsonSchema.properties;
|
|
33
|
+
const fieldLines = Object.entries(props).map(([name, def]) => {
|
|
34
|
+
const type = def.type ?? 'unknown';
|
|
35
|
+
const desc = def.description ? ` - ${def.description}` : '';
|
|
36
|
+
return ` - ${name} (${type})${desc}`;
|
|
37
|
+
});
|
|
38
|
+
if (fieldLines.length > 0) {
|
|
39
|
+
parts.push(`Working memory fields:\n${fieldLines.join('\n')}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (currentState && Object.keys(currentState).length > 0) {
|
|
43
|
+
parts.push(`Current working memory:\n${JSON.stringify(currentState)}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
parts.push('Current working memory: (empty)');
|
|
47
|
+
}
|
|
48
|
+
parts.push('When you learn new information, output a partial JSON update in <working_memory> tags. ' +
|
|
49
|
+
'Only include changed fields. Set a field to null to delete it.');
|
|
50
|
+
return parts.join('\n\n');
|
|
51
|
+
}
|
|
52
|
+
export async function loadContextMessages(memoryConfig, storage, input, workingMemoryJsonSchema) {
|
|
53
|
+
const contextMessages = [];
|
|
54
|
+
if (memoryConfig?.workingMemory && storage) {
|
|
55
|
+
const workingMem = await storage.getWorkingMemory(input.threadId, 'thread');
|
|
56
|
+
const prompt = buildWorkingMemoryPrompt(workingMem, workingMemoryJsonSchema);
|
|
57
|
+
contextMessages.push({
|
|
58
|
+
id: `wm-${randomUUID()}`,
|
|
59
|
+
role: 'system',
|
|
60
|
+
content: prompt,
|
|
61
|
+
createdAt: new Date(),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return contextMessages;
|
|
65
|
+
}
|
|
66
|
+
export async function saveMessages(storage, threadId, resourceId, memoryConfig, userMessage, result, options) {
|
|
67
|
+
let responseText = result.text;
|
|
68
|
+
if (storage) {
|
|
69
|
+
const newMessages = [userMessage];
|
|
70
|
+
for (const step of result.steps) {
|
|
71
|
+
if (step.toolCalls?.length) {
|
|
72
|
+
newMessages.push({
|
|
73
|
+
id: randomUUID(),
|
|
74
|
+
role: 'assistant',
|
|
75
|
+
toolCalls: step.toolCalls.map((tc) => ({
|
|
76
|
+
id: randomUUID(),
|
|
77
|
+
name: tc.name,
|
|
78
|
+
args: tc.args,
|
|
79
|
+
})),
|
|
80
|
+
createdAt: new Date(),
|
|
81
|
+
});
|
|
82
|
+
newMessages.push({
|
|
83
|
+
id: randomUUID(),
|
|
84
|
+
role: 'tool',
|
|
85
|
+
toolResults: step.toolCalls.map((tc) => ({
|
|
86
|
+
id: randomUUID(),
|
|
87
|
+
name: tc.name,
|
|
88
|
+
result: tc.result,
|
|
89
|
+
})),
|
|
90
|
+
createdAt: new Date(),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
newMessages.push({
|
|
95
|
+
id: randomUUID(),
|
|
96
|
+
role: 'assistant',
|
|
97
|
+
content: responseText,
|
|
98
|
+
createdAt: new Date(),
|
|
99
|
+
});
|
|
100
|
+
await storage.saveMessages(threadId, newMessages);
|
|
101
|
+
if (memoryConfig?.workingMemory) {
|
|
102
|
+
const parsed = parseWorkingMemory(responseText);
|
|
103
|
+
if (parsed) {
|
|
104
|
+
const existing = (await storage.getWorkingMemory(threadId, 'thread')) ?? {};
|
|
105
|
+
const merged = deepMergeWorkingMemory(existing, parsed);
|
|
106
|
+
if (options?.schemaService && options?.workingMemorySchemaName) {
|
|
107
|
+
try {
|
|
108
|
+
await options.schemaService.validateSchema(options.workingMemorySchemaName, merged);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
options.logger?.warn(`Working memory validation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
await storage.saveWorkingMemory(threadId, 'thread', merged);
|
|
115
|
+
responseText = stripWorkingMemoryTags(responseText);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return responseText;
|
|
120
|
+
}
|
|
121
|
+
export function trimMessages(messages, maxTokenBudget = 100000) {
|
|
122
|
+
const sanitized = sanitizeToolMessages(messages);
|
|
123
|
+
let estimatedTokens = 0;
|
|
124
|
+
const result = [];
|
|
125
|
+
for (let i = sanitized.length - 1; i >= 0; i--) {
|
|
126
|
+
const msg = sanitized[i];
|
|
127
|
+
const msgTokens = estimateTokens(msg);
|
|
128
|
+
if (estimatedTokens + msgTokens > maxTokenBudget && result.length > 0) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
estimatedTokens += msgTokens;
|
|
132
|
+
result.unshift(msg);
|
|
133
|
+
}
|
|
134
|
+
if (result.length > 0 &&
|
|
135
|
+
result[0].role !== 'user' &&
|
|
136
|
+
result[0].role !== 'system') {
|
|
137
|
+
const firstUserIdx = result.findIndex((m) => m.role === 'user' || m.role === 'system');
|
|
138
|
+
if (firstUserIdx > 0) {
|
|
139
|
+
return result.slice(firstUserIdx);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
function sanitizeToolMessages(messages) {
|
|
145
|
+
const result = [];
|
|
146
|
+
for (let i = 0; i < messages.length; i++) {
|
|
147
|
+
const msg = messages[i];
|
|
148
|
+
if (msg.role === 'assistant' && msg.toolCalls?.length) {
|
|
149
|
+
const next = messages[i + 1];
|
|
150
|
+
if (!next || next.role !== 'tool' || !next.toolResults?.length) {
|
|
151
|
+
if (msg.content) {
|
|
152
|
+
result.push({ ...msg, toolCalls: undefined });
|
|
153
|
+
}
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const toolCallIds = new Set(msg.toolCalls.map((tc) => tc.id));
|
|
157
|
+
const resultIds = new Set(next.toolResults.map((tr) => tr.id));
|
|
158
|
+
const allMatched = [...toolCallIds].every((id) => resultIds.has(id));
|
|
159
|
+
if (!allMatched) {
|
|
160
|
+
if (msg.content) {
|
|
161
|
+
result.push({ ...msg, toolCalls: undefined });
|
|
162
|
+
}
|
|
163
|
+
result.push({
|
|
164
|
+
...next,
|
|
165
|
+
toolResults: next.toolResults.filter((tr) => !toolCallIds.has(tr.id)) ||
|
|
166
|
+
undefined,
|
|
167
|
+
});
|
|
168
|
+
i++;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
result.push(msg);
|
|
173
|
+
}
|
|
174
|
+
return result.filter((m) => m.role !== 'tool' || (m.toolResults && m.toolResults.length > 0));
|
|
175
|
+
}
|
|
176
|
+
function estimateTokens(msg) {
|
|
177
|
+
let chars = 0;
|
|
178
|
+
if (msg.content)
|
|
179
|
+
chars += msg.content.length;
|
|
180
|
+
if (msg.toolCalls)
|
|
181
|
+
chars += JSON.stringify(msg.toolCalls).length;
|
|
182
|
+
if (msg.toolResults)
|
|
183
|
+
chars += JSON.stringify(msg.toolResults).length;
|
|
184
|
+
return Math.ceil(chars / 4);
|
|
185
|
+
}
|
|
186
|
+
export function parseWorkingMemory(text) {
|
|
187
|
+
const match = text.match(/<working_memory>([\s\S]*?)<\/working_memory>/);
|
|
188
|
+
if (!match)
|
|
189
|
+
return null;
|
|
190
|
+
try {
|
|
191
|
+
return JSON.parse(match[1].trim());
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
export function stripWorkingMemoryTags(text) {
|
|
198
|
+
return text.replace(/<working_memory>[\s\S]*?<\/working_memory>/g, '').trim();
|
|
199
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
+
export function resolveModelConfig(agentName, agent) {
|
|
3
|
+
let config = {};
|
|
4
|
+
try {
|
|
5
|
+
config = pikkuState(null, 'models', 'config') ?? {};
|
|
6
|
+
}
|
|
7
|
+
catch { }
|
|
8
|
+
const models = config.models ?? {};
|
|
9
|
+
const defaults = config.agentDefaults;
|
|
10
|
+
const agentOverride = config.agentOverrides?.[agentName];
|
|
11
|
+
let rawModel = agentOverride?.model ?? agent.model;
|
|
12
|
+
let aliasTemperature;
|
|
13
|
+
let aliasMaxSteps;
|
|
14
|
+
if (!rawModel.includes('/')) {
|
|
15
|
+
const entry = models[rawModel];
|
|
16
|
+
if (!entry)
|
|
17
|
+
throw new Error(`Unknown model alias '${rawModel}'.`);
|
|
18
|
+
if (typeof entry === 'string') {
|
|
19
|
+
rawModel = entry;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
rawModel = entry.model;
|
|
23
|
+
aliasTemperature = entry.temperature;
|
|
24
|
+
aliasMaxSteps = entry.maxSteps;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const temperature = agentOverride?.temperature ??
|
|
28
|
+
aliasTemperature ??
|
|
29
|
+
defaults?.temperature ??
|
|
30
|
+
agent.temperature;
|
|
31
|
+
const maxSteps = agentOverride?.maxSteps ??
|
|
32
|
+
aliasMaxSteps ??
|
|
33
|
+
defaults?.maxSteps ??
|
|
34
|
+
agent.maxSteps;
|
|
35
|
+
return { model: rawModel, temperature, maxSteps };
|
|
36
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type CoreSingletonServices, type CoreServices, type CoreUserSession, type CreateWireServices } from '../../types/core.types.js';
|
|
2
|
+
import type { CoreAIAgent, AIAgentInput, AIAgentToolDef, AIMessage, AIStreamChannel } from './ai-agent.types.js';
|
|
3
|
+
import type { AIAgentRunnerParams } from '../../services/ai-agent-runner-service.js';
|
|
4
|
+
import { PikkuError } from '../../errors/error-handler.js';
|
|
5
|
+
import type { SessionService } from '../../services/user-session-service.js';
|
|
6
|
+
export type RunAIAgentParams = {
|
|
7
|
+
singletonServices: CoreSingletonServices;
|
|
8
|
+
sessionService?: SessionService<CoreUserSession>;
|
|
9
|
+
createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
|
|
10
|
+
};
|
|
11
|
+
export type StreamAIAgentOptions = {
|
|
12
|
+
requiresToolApproval?: 'all' | 'explicit' | false;
|
|
13
|
+
};
|
|
14
|
+
export declare class ToolApprovalRequired extends PikkuError {
|
|
15
|
+
readonly toolCallId: string;
|
|
16
|
+
readonly toolName: string;
|
|
17
|
+
readonly args: unknown;
|
|
18
|
+
readonly reason?: string;
|
|
19
|
+
readonly displayToolName?: string;
|
|
20
|
+
readonly displayArgs?: unknown;
|
|
21
|
+
readonly agentRunId?: string;
|
|
22
|
+
constructor(toolCallId: string, toolName: string, args: unknown, reason?: string, displayToolName?: string, displayArgs?: unknown, agentRunId?: string);
|
|
23
|
+
}
|
|
24
|
+
export type StreamContext = {
|
|
25
|
+
channel: AIStreamChannel;
|
|
26
|
+
options?: StreamAIAgentOptions;
|
|
27
|
+
};
|
|
28
|
+
export declare const resolveAgent: (agentName: string) => {
|
|
29
|
+
agent: CoreAIAgent;
|
|
30
|
+
packageName: string | null;
|
|
31
|
+
resolvedName: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function buildInstructions(agentName: string, packageName: string | null): string;
|
|
34
|
+
export type ScopedChannel = AIStreamChannel & {
|
|
35
|
+
approval: {
|
|
36
|
+
toolCallId: string;
|
|
37
|
+
toolName: string;
|
|
38
|
+
args: unknown;
|
|
39
|
+
runId: string;
|
|
40
|
+
} | null;
|
|
41
|
+
};
|
|
42
|
+
export declare function createScopedChannel(parent: AIStreamChannel, agentName: string, session: string): ScopedChannel;
|
|
43
|
+
export declare function buildToolDefs(singletonServices: CoreSingletonServices, params: RunAIAgentParams, agentSessionMap: Map<string, string>, resourceId: string, agentName: string, packageName: string | null, streamContext?: StreamContext): {
|
|
44
|
+
tools: AIAgentToolDef[];
|
|
45
|
+
missingRpcs: string[];
|
|
46
|
+
};
|
|
47
|
+
export declare function prepareAgentRun(agentName: string, input: AIAgentInput, params: RunAIAgentParams, agentSessionMap: Map<string, string>, streamContext?: StreamContext): Promise<{
|
|
48
|
+
agent: CoreAIAgent;
|
|
49
|
+
packageName: string | null;
|
|
50
|
+
resolvedName: string;
|
|
51
|
+
agentRunner: import("../../services/ai-agent-runner-service.js").AIAgentRunnerService;
|
|
52
|
+
storage: import("../../services/ai-storage-service.js").AIStorageService | undefined;
|
|
53
|
+
memoryConfig: import("./ai-agent.types.js").AIAgentMemoryConfig | undefined;
|
|
54
|
+
threadId: string;
|
|
55
|
+
userMessage: AIMessage;
|
|
56
|
+
runnerParams: AIAgentRunnerParams;
|
|
57
|
+
missingRpcs: string[];
|
|
58
|
+
workingMemoryJsonSchema: any;
|
|
59
|
+
workingMemorySchemaName: string | null;
|
|
60
|
+
}>;
|