@pikku/core 0.12.83 → 0.12.86
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 +492 -0
- package/README.md +1 -1
- package/dist/bootstrap-compat/root.d.ts +20 -0
- package/dist/classification/column-form.d.ts +32 -0
- package/dist/classification/column-form.js +42 -0
- package/dist/classification/data-classification.d.ts +64 -0
- package/dist/classification/index.d.ts +13 -0
- package/dist/classification/index.js +2 -0
- package/dist/classification/secret-value.d.ts +56 -0
- package/dist/classification/secret-value.js +46 -0
- package/dist/crypto-utils.d.ts +1 -1
- package/dist/ecosystem/agent-scorer.d.ts +12 -0
- package/dist/ecosystem/agent-scorer.js +5 -0
- package/dist/ecosystem/agent.d.ts +21 -0
- package/dist/ecosystem/agent.js +6 -0
- package/dist/ecosystem/channel/local.d.ts +3 -0
- package/dist/ecosystem/channel/local.js +3 -0
- package/dist/ecosystem/channel/serverless.d.ts +9 -0
- package/dist/ecosystem/channel/serverless.js +1 -0
- package/dist/ecosystem/channel.d.ts +15 -0
- package/dist/ecosystem/channel.js +5 -0
- package/dist/ecosystem/cli/channel.d.ts +16 -0
- package/dist/ecosystem/cli/channel.js +2 -0
- package/dist/ecosystem/cli.d.ts +9 -0
- package/dist/ecosystem/cli.js +2 -0
- package/dist/ecosystem/credential.d.ts +10 -0
- package/dist/ecosystem/credential.js +1 -0
- package/dist/ecosystem/crypto-utils.d.ts +8 -0
- package/dist/ecosystem/crypto-utils.js +1 -0
- package/dist/ecosystem/dev.d.ts +9 -0
- package/dist/ecosystem/dev.js +2 -0
- package/dist/ecosystem/errors.d.ts +8 -0
- package/dist/ecosystem/errors.js +2 -0
- package/dist/ecosystem/function.d.ts +13 -0
- package/dist/ecosystem/function.js +2 -0
- package/dist/ecosystem/gateway.d.ts +1 -0
- package/dist/ecosystem/hmac.d.ts +1 -0
- package/dist/ecosystem/hmac.js +1 -0
- package/dist/ecosystem/http.d.ts +13 -0
- package/dist/ecosystem/http.js +5 -0
- package/dist/ecosystem/mcp.d.ts +3 -0
- package/dist/ecosystem/mcp.js +2 -0
- package/dist/ecosystem/middleware.d.ts +18 -0
- package/dist/ecosystem/middleware.js +7 -0
- package/dist/ecosystem/node-host-resolver.d.ts +1 -0
- package/dist/ecosystem/node-host-resolver.js +1 -0
- package/dist/ecosystem/node.d.ts +1 -0
- package/dist/ecosystem/oauth2.d.ts +1 -0
- package/dist/ecosystem/oauth2.js +1 -0
- package/dist/ecosystem/persona.d.ts +17 -0
- package/dist/ecosystem/persona.js +5 -0
- package/dist/ecosystem/queue.d.ts +13 -0
- package/dist/ecosystem/queue.js +4 -0
- package/dist/ecosystem/remote.d.ts +8 -0
- package/dist/ecosystem/remote.js +1 -0
- package/dist/ecosystem/role.d.ts +4 -0
- package/dist/ecosystem/role.js +2 -0
- package/dist/ecosystem/rpc.d.ts +6 -0
- package/dist/ecosystem/rpc.js +3 -0
- package/dist/ecosystem/safe-fetch.d.ts +7 -0
- package/dist/ecosystem/safe-fetch.js +1 -0
- package/dist/ecosystem/scenario.d.ts +21 -0
- package/dist/ecosystem/scenario.js +8 -0
- package/dist/ecosystem/scheduler.d.ts +3 -0
- package/dist/ecosystem/scheduler.js +2 -0
- package/dist/ecosystem/schema.d.ts +2 -0
- package/dist/ecosystem/schema.js +1 -0
- package/dist/ecosystem/scope.d.ts +5 -0
- package/dist/ecosystem/scope.js +3 -0
- package/dist/ecosystem/secret.d.ts +11 -0
- package/dist/ecosystem/secret.js +2 -0
- package/dist/ecosystem/services/istanbul-coverage.d.ts +1 -0
- package/dist/ecosystem/services/istanbul-coverage.js +1 -0
- package/dist/ecosystem/services/local-content-request-handler.d.ts +9 -0
- package/dist/ecosystem/services/local-content-request-handler.js +1 -0
- package/dist/ecosystem/services/local-content.d.ts +2 -0
- package/dist/ecosystem/services/local-content.js +1 -0
- package/dist/ecosystem/services/local-meta.d.ts +1 -0
- package/dist/ecosystem/services/local-meta.js +1 -0
- package/dist/ecosystem/services/v8-coverage.d.ts +1 -0
- package/dist/ecosystem/services/v8-coverage.js +1 -0
- package/dist/ecosystem/services.d.ts +36 -0
- package/dist/ecosystem/services.js +12 -0
- package/dist/ecosystem/testing.d.ts +7 -0
- package/dist/ecosystem/testing.js +1 -0
- package/dist/ecosystem/trigger.d.ts +2 -0
- package/dist/ecosystem/trigger.js +1 -0
- package/dist/ecosystem/types.d.ts +12 -0
- package/dist/ecosystem/types.js +6 -0
- package/dist/ecosystem/variable.d.ts +9 -0
- package/dist/ecosystem/variable.js +1 -0
- package/dist/ecosystem/virtual-user.d.ts +24 -0
- package/dist/ecosystem/virtual-user.js +8 -0
- package/dist/ecosystem/workflow.d.ts +20 -0
- package/dist/ecosystem/workflow.js +6 -0
- package/dist/errors/index.d.ts +8 -0
- package/dist/errors/index.js +1 -0
- package/dist/errors/serialized-error.d.ts +7 -0
- package/dist/errors/serialized-error.js +1 -0
- package/dist/function/function-meta.types.d.ts +139 -0
- package/dist/function/function-meta.types.js +1 -0
- package/dist/function/function-runner.d.ts +3 -2
- package/dist/function/function-runner.js +31 -11
- package/dist/function/functions.types.d.ts +10 -2
- package/dist/function/index.d.ts +8 -2
- package/dist/function/index.js +4 -1
- package/dist/function/pikku-request.d.ts +8 -0
- package/dist/function/pikku-request.js +15 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.js +3 -3
- package/dist/middleware/auth-apikey.d.ts +2 -10
- package/dist/middleware/auth-apikey.js +1 -1
- package/dist/middleware/auth-bearer.d.ts +2 -10
- package/dist/middleware/auth-bearer.js +1 -1
- package/dist/middleware/auth-cookie.d.ts +2 -10
- package/dist/middleware/auth-cookie.js +1 -1
- package/dist/middleware/cors.d.ts +5 -11
- package/dist/middleware/cors.js +13 -6
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/middleware-factories.d.ts +9 -0
- package/dist/middleware/middleware-factories.js +19 -0
- package/dist/middleware/middleware.types.d.ts +27 -0
- package/dist/middleware/middleware.types.js +1 -0
- package/dist/middleware/remote-auth.d.ts +1 -1
- package/dist/middleware/remote-auth.js +1 -1
- package/dist/middleware/telemetry.d.ts +4 -20
- package/dist/middleware/telemetry.js +1 -1
- package/dist/middleware-runner.d.ts +2 -1
- package/dist/pikku-state.d.ts +2 -1
- package/dist/services/{ai-run-state-service.d.ts → agent-run-state-service.d.ts} +5 -5
- package/dist/services/agent-run-state-service.js +1 -0
- package/dist/services/{ai-agent-runner-service.d.ts → agent-runner-service.d.ts} +12 -12
- package/dist/services/agent-runner-service.js +1 -0
- package/dist/services/{ai-storage-service.d.ts → agent-storage-service.d.ts} +7 -7
- package/dist/services/agent-storage-service.js +1 -0
- package/dist/services/audit-service.d.ts +1 -1
- package/dist/services/credential-wire-service.js +1 -1
- package/dist/services/email-service.d.ts +1 -1
- package/dist/services/file-scenario-run-store.d.ts +58 -0
- package/dist/services/file-scenario-run-store.js +214 -0
- package/dist/services/http-personas.d.ts +1 -1
- package/dist/services/http-personas.js +3 -3
- package/dist/services/{in-memory-ai-run-state-service.d.ts → in-memory-agent-run-state-service.d.ts} +5 -5
- package/dist/services/{in-memory-ai-run-state-service.js → in-memory-agent-run-state-service.js} +1 -1
- package/dist/services/in-memory-workflow-service.d.ts +1 -1
- package/dist/services/index.d.ts +9 -5
- package/dist/services/index.js +4 -1
- package/dist/services/local-secrets.d.ts +1 -1
- package/dist/services/local-secrets.js +1 -1
- package/dist/services/logger.d.ts +7 -7
- package/dist/services/meta-service.d.ts +5 -4
- package/dist/services/scoped-secret-service.d.ts +1 -1
- package/dist/services/secret-service.d.ts +1 -1
- package/dist/services/typed-secret-service.d.ts +16 -2
- package/dist/services/typed-secret-service.js +5 -0
- package/dist/services/webhook-service.d.ts +1 -1
- package/dist/services/workflow-service.d.ts +2 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +1 -0
- package/dist/testing/service-tests/agent-run-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/agent-run-service-tests.js +3 -3
- package/dist/testing/service-tests/agent-storage-service-tests.d.ts +3 -0
- package/dist/testing/service-tests/{ai-storage-service-tests.js → agent-storage-service-tests.js} +4 -4
- package/dist/testing/service-tests.d.ts +4 -4
- package/dist/testing/service-tests.js +4 -4
- package/dist/types/core.types.d.ts +37 -187
- package/dist/types/core.types.js +1 -19
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +1 -0
- package/dist/types/state.types.d.ts +8 -6
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +2 -0
- package/dist/wirings/actor-flow/run-conversation.d.ts +2 -2
- package/dist/wirings/addon/addon-runner.d.ts +17 -0
- package/dist/wirings/addon/addon-runner.js +150 -0
- package/dist/wirings/addon/index.d.ts +6 -0
- package/dist/wirings/addon/index.js +3 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
- package/dist/wirings/addon/remote-addon-auth.js +39 -0
- package/dist/wirings/addon/wire-addon.d.ts +80 -0
- package/dist/wirings/addon/wire-addon.js +120 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
- package/dist/wirings/addon/wire-remote-addon.js +11 -0
- package/dist/wirings/{ai-agent/ai-agent-agui.d.ts → agent/agent-agui.d.ts} +2 -2
- package/dist/wirings/{ai-agent/ai-agent-agui.js → agent/agent-agui.js} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-finalize.d.ts → agent/agent-finalize.d.ts} +10 -10
- package/dist/wirings/{ai-agent/ai-agent-finalize.js → agent/agent-finalize.js} +7 -7
- package/dist/wirings/{ai-agent/ai-agent-helpers.d.ts → agent/agent-helpers.d.ts} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-interrupt.d.ts → agent/agent-interrupt.d.ts} +4 -4
- package/dist/wirings/{ai-agent/ai-agent-interrupt.js → agent/agent-interrupt.js} +2 -2
- package/dist/wirings/{ai-agent/ai-agent-memory.d.ts → agent/agent-memory.d.ts} +14 -14
- package/dist/wirings/{ai-agent/ai-agent-memory.js → agent/agent-memory.js} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-model-config.js → agent/agent-model-config.js} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-prepare.d.ts → agent/agent-prepare.d.ts} +24 -24
- package/dist/wirings/{ai-agent/ai-agent-prepare.js → agent/agent-prepare.js} +17 -17
- package/dist/wirings/agent/agent-registry.d.ts +16 -0
- package/dist/wirings/{ai-agent/ai-agent-registry.js → agent/agent-registry.js} +9 -9
- package/dist/wirings/{ai-agent → agent}/agent-rpc.js +8 -8
- package/dist/wirings/agent/agent-runner.d.ts +7 -0
- package/dist/wirings/{ai-agent/ai-agent-runner.js → agent/agent-runner.js} +49 -50
- package/dist/wirings/{ai-agent/ai-agent-stream.d.ts → agent/agent-stream.d.ts} +15 -15
- package/dist/wirings/{ai-agent/ai-agent-stream.js → agent/agent-stream.js} +78 -78
- package/dist/wirings/{ai-agent/ai-agent-turn.d.ts → agent/agent-turn.d.ts} +5 -5
- package/dist/wirings/{ai-agent/ai-agent-turn.js → agent/agent-turn.js} +4 -4
- package/dist/wirings/agent/agent-utils.d.ts +14 -0
- package/dist/wirings/agent/agent-utils.js +17 -0
- package/dist/wirings/{ai-agent/ai-agent.types.d.ts → agent/agent.types.d.ts} +47 -46
- package/dist/wirings/agent/agent.types.js +1 -0
- package/dist/wirings/agent/index.d.ts +12 -0
- package/dist/wirings/agent/index.js +10 -0
- package/dist/wirings/{ai-agent → agent}/voice-input.d.ts +1 -1
- package/dist/wirings/{ai-agent → agent}/voice-input.js +5 -5
- package/dist/wirings/{ai-agent → agent}/voice-output.d.ts +2 -3
- package/dist/wirings/{ai-agent → agent}/voice-output.js +8 -8
- package/dist/wirings/{ai-scorer/ai-scorer-grade.d.ts → agent-scorer/agent-scorer-grade.d.ts} +3 -3
- package/dist/wirings/{ai-scorer/ai-scorer-grade.js → agent-scorer/agent-scorer-grade.js} +6 -6
- package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +30 -0
- package/dist/wirings/{ai-scorer/ai-scorer-judge.js → agent-scorer/agent-scorer-judge.js} +57 -5
- package/dist/wirings/{ai-scorer/ai-scorer-live.d.ts → agent-scorer/agent-scorer-live.d.ts} +1 -1
- package/dist/wirings/{ai-scorer/ai-scorer-live.js → agent-scorer/agent-scorer-live.js} +3 -3
- package/dist/wirings/{ai-scorer/ai-scorer-registry.d.ts → agent-scorer/agent-scorer-registry.d.ts} +6 -6
- package/dist/wirings/{ai-scorer/ai-scorer-registry.js → agent-scorer/agent-scorer-registry.js} +4 -4
- package/dist/wirings/{ai-scorer/ai-scorer-snapshots.d.ts → agent-scorer/agent-scorer-snapshots.d.ts} +1 -1
- package/dist/wirings/{ai-scorer/ai-scorer-worker.d.ts → agent-scorer/agent-scorer-worker.d.ts} +3 -3
- package/dist/wirings/{ai-scorer/ai-scorer-worker.js → agent-scorer/agent-scorer-worker.js} +9 -7
- package/dist/wirings/{ai-scorer/ai-scorer.d.ts → agent-scorer/agent-scorer.d.ts} +12 -6
- package/dist/wirings/{ai-scorer/ai-scorer.js → agent-scorer/agent-scorer.js} +4 -3
- package/dist/wirings/{ai-scorer/ai-scorer.types.d.ts → agent-scorer/agent-scorer.types.d.ts} +24 -4
- package/dist/wirings/agent-scorer/agent-scorer.types.js +4 -0
- package/dist/wirings/agent-scorer/index.d.ts +6 -0
- package/dist/wirings/agent-scorer/index.js +5 -0
- package/dist/wirings/channel/channel-common.d.ts +2 -1
- package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
- package/dist/wirings/channel/channel-rpc.types.d.ts +2 -2
- package/dist/wirings/channel/channel.types.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.d.ts +1 -0
- package/dist/wirings/cli/channel/index.d.ts +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +2 -1
- package/dist/wirings/cli/cli-runner.js +4 -1
- package/dist/wirings/cli/cli.types.d.ts +21 -2
- package/dist/wirings/cli/command-parser.js +157 -23
- package/dist/wirings/gateway/gateway.types.d.ts +2 -1
- package/dist/wirings/http/http-runner.d.ts +1 -1
- package/dist/wirings/http/http-runner.js +1 -1
- package/dist/wirings/http/http.types.d.ts +2 -2
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
- package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
- package/dist/wirings/mcp/mcp.types.d.ts +1 -1
- package/dist/wirings/persona/index.d.ts +1 -1
- package/dist/wirings/persona/index.js +1 -1
- package/dist/wirings/persona/persona.types.d.ts +14 -0
- package/dist/wirings/queue/queue.types.d.ts +1 -1
- package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
- package/dist/wirings/rpc/index.d.ts +0 -6
- package/dist/wirings/rpc/index.js +0 -3
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
- package/dist/wirings/rpc/remote-addon-auth.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
- package/dist/wirings/rpc/rpc-runner.js +4 -4
- package/dist/wirings/rpc/rpc-types.d.ts +1 -1
- package/dist/wirings/rpc/wire-addon.d.ts +1 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
- package/dist/wirings/scope/index.d.ts +1 -0
- package/dist/wirings/scope/index.js +1 -0
- package/dist/wirings/secret/secret.types.d.ts +10 -0
- package/dist/wirings/secret/validate-secret-definitions.js +2 -0
- package/dist/wirings/variable/validate-variable-definitions.js +2 -0
- package/dist/wirings/variable/variable.types.d.ts +9 -0
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +1 -1
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +1 -1
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
- package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
- package/dist/wirings/workflow/graph/graph-node.js +2 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
- package/dist/wirings/workflow/graph/graph-runner.js +283 -31
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
- package/dist/wirings/workflow/index.d.ts +2 -0
- package/dist/wirings/workflow/index.js +1 -0
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +14 -4
- package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -1
- package/dist/wirings/workflow/pikku-workflow-service.js +3 -4
- package/dist/wirings/workflow/run-timeline.d.ts +2 -3
- package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
- package/dist/wirings/workflow/scenario-run.types.js +1 -0
- package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
- package/dist/wirings/workflow/scenario-step-guards.js +0 -8
- package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
- package/dist/wirings/workflow/workflow-approval.js +2 -1
- package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
- package/dist/wirings/workflow/workflow.types.d.ts +2 -1
- package/knowledge/decisions/index.md +2 -0
- package/knowledge/decisions/internals/{a-non-streaming-agent-run-registers-with-airunstate-too.md → a-non-streaming-agent-run-registers-with-agentrunstate-too.md} +6 -6
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +1 -1
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +1 -1
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-agui-bridge-obeys-the-client-ordering-contract.md → agent-agui-bridge-obeys-the-client-ordering-contract.md} +5 -5
- package/knowledge/decisions/internals/{ai-agent-audio-chunks-carry-the-format-the-provider-returned.md → agent-audio-chunks-carry-the-format-the-provider-returned.md} +2 -2
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-credential-suspensions-hide-the-tool-result.md → agent-credential-suspensions-hide-the-tool-result.md} +2 -2
- package/knowledge/decisions/internals/{ai-agent-delegate-and-supervise-hide-different-text.md → agent-delegate-and-supervise-hide-different-text.md} +4 -4
- package/knowledge/decisions/internals/{ai-agent-llm-tool-arguments-have-nulls-stripped.md → agent-llm-tool-arguments-have-nulls-stripped.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-model-config-stays-a-single-resolution-seam.md → agent-model-config-stays-a-single-resolution-seam.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-onerror-hooks-cannot-change-the-failure.md → agent-onerror-hooks-cannot-change-the-failure.md} +6 -6
- package/knowledge/decisions/internals/{ai-agent-runner-methods-must-keep-their-receiver.md → agent-runner-methods-must-keep-their-receiver.md} +4 -4
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-stream-persistence-is-best-effort.md → agent-stream-persistence-is-best-effort.md} +4 -4
- package/knowledge/decisions/internals/{ai-agent-sub-agents-inherit-the-parent-context-block.md → agent-sub-agents-inherit-the-parent-context-block.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-tool-execute-failures-are-logged-unconditionally.md → agent-tool-execute-failures-are-logged-unconditionally.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-voice-input-transcribes-audio-parts-in-place.md → agent-voice-input-transcribes-audio-parts-in-place.md} +2 -2
- package/knowledge/decisions/internals/{ai-agent-working-memory-is-persisted-only-when-valid.md → agent-working-memory-is-persisted-only-when-valid.md} +2 -2
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +2 -2
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +3 -3
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +2 -2
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +1 -1
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +1 -1
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
- package/knowledge/decisions/internals/index.md +4 -2
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +1 -1
- package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +1 -1
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +1 -1
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +5 -5
- package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +2 -2
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +2 -2
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +1 -1
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
- package/knowledge/decisions/security/{ai-agent-approval-forwarding-requires-a-symbol-brand.md → agent-approval-forwarding-requires-a-symbol-brand.md} +3 -3
- package/knowledge/decisions/security/{ai-agent-credential-requests-are-symbol-branded.md → agent-credential-requests-are-symbol-branded.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-gate-requires-a-session-only-when-auth-is-true.md → agent-gate-requires-a-session-only-when-auth-is-true.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-ownership-failures-never-echo-the-resource.md → agent-ownership-failures-never-echo-the-resource.md} +2 -2
- package/knowledge/decisions/security/{ai-agent-resume-re-runs-the-authorization-gate.md → agent-resume-re-runs-the-authorization-gate.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-sessionless-deployments-have-no-thread-ownership.md → agent-sessionless-deployments-have-no-thread-ownership.md} +5 -5
- package/knowledge/decisions/security/{ai-agent-thread-ownership-composes-the-session-principal.md → agent-thread-ownership-composes-the-session-principal.md} +2 -2
- package/knowledge/decisions/security/{ai-agent-tool-filtering-reads-the-live-function-config.md → agent-tool-filtering-reads-the-live-function-config.md} +2 -2
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +3 -3
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +3 -3
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +21 -13
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
- package/knowledge/decisions/security/index.md +3 -2
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +2 -2
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
- package/knowledge/index.md +3 -1
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
- package/knowledge/questions/index.md +2 -0
- package/package.json +16 -14
- package/run-tests.sh +0 -0
- package/scripts/generate-api-report.d.mts +1 -1
- package/scripts/generate-api-report.mjs +67 -60
- package/scripts/generate-api-report.mts +37 -47
- package/src/agent-naming.test.ts +68 -0
- package/src/api-report.test.ts +70 -1
- package/src/app-alias-surface.test.ts +179 -0
- package/src/app-leaf-surface.test.ts +217 -0
- package/src/bootstrap-compat/root.ts +20 -0
- package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
- package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
- package/src/classification/index.ts +38 -0
- package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
- package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
- package/src/crypto-utils.ts +1 -1
- package/src/dev/reload-meta.test.ts +1 -1
- package/src/errors/index.ts +9 -0
- package/src/errors/serialized-error.ts +9 -0
- package/src/factory-functions.test.ts +4 -2
- package/src/function/function-meta.types.ts +151 -0
- package/src/function/function-runner.test.ts +4 -2
- package/src/function/function-runner.ts +47 -14
- package/src/function/functions.types.ts +11 -7
- package/src/function/index.ts +24 -5
- package/src/function/list.types.ts +1 -3
- package/src/middleware/auth-apikey.ts +4 -2
- package/src/middleware/auth-bearer.test.ts +1 -1
- package/src/middleware/auth-bearer.ts +4 -2
- package/src/middleware/auth-cookie.ts +4 -1
- package/src/middleware/cors.test.ts +126 -5
- package/src/middleware/cors.ts +19 -8
- package/src/middleware/index.ts +16 -0
- package/src/middleware/middleware-factories.ts +62 -0
- package/src/middleware/middleware.types.ts +61 -0
- package/src/middleware/remote-auth.test.ts +1 -1
- package/src/middleware/remote-auth.ts +1 -1
- package/src/middleware/telemetry.ts +4 -2
- package/src/middleware-runner.test.ts +2 -3
- package/src/middleware-runner.ts +2 -2
- package/src/no-root-barrel.test.ts +114 -0
- package/src/permissions.ts +2 -4
- package/src/pikku-state.ts +6 -4
- package/src/public-surface.json +90 -170
- package/src/public-surface.json.README +20 -2
- package/src/public-surface.test.ts +31 -3
- package/src/remote.test.ts +1 -1
- package/src/removed-legacy-exports.test.ts +5 -1
- package/src/services/{ai-run-state-service.ts → agent-run-state-service.ts} +5 -5
- package/src/services/{ai-agent-runner-service.ts → agent-runner-service.ts} +18 -18
- package/src/services/{ai-storage-service.ts → agent-storage-service.ts} +7 -7
- package/src/services/audit-service.ts +1 -1
- package/src/services/credential-wire-service.ts +1 -1
- package/src/services/email-service.ts +2 -4
- package/src/services/file-scenario-run-store.test.ts +349 -0
- package/src/services/file-scenario-run-store.ts +282 -0
- package/src/services/http-personas-converse.test.ts +3 -3
- package/src/services/http-personas.ts +4 -4
- package/src/services/{in-memory-ai-run-state-service.ts → in-memory-agent-run-state-service.ts} +7 -7
- package/src/services/in-memory-workflow-service.ts +1 -1
- package/src/services/index.ts +22 -10
- package/src/services/local-content-request-handler.ts +1 -2
- package/src/services/local-secrets.ts +1 -1
- package/src/services/logger.ts +7 -7
- package/src/services/meta-service.ts +5 -5
- package/src/services/queue-webhook-service.test.ts +1 -1
- package/src/services/scoped-secret-service.ts +1 -1
- package/src/services/secret-service.ts +1 -1
- package/src/services/typed-secret-service.test.ts +52 -0
- package/src/services/typed-secret-service.ts +26 -2
- package/src/services/webhook-service.ts +1 -1
- package/src/services/workflow-service.ts +2 -1
- package/src/template-alias-surface.test.ts +240 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/service-tests/agent-run-service-tests.ts +4 -4
- package/src/testing/service-tests/{ai-storage-service-tests.ts → agent-storage-service-tests.ts} +8 -8
- package/src/testing/service-tests.ts +10 -8
- package/src/types/core.types.ts +40 -292
- package/src/types/index.ts +2 -0
- package/src/types/state.types.ts +12 -14
- package/src/types/typed-credentials.test.ts +72 -0
- package/src/utils.ts +34 -0
- package/src/wirings/actor-flow/run-conversation.test.ts +2 -2
- package/src/wirings/actor-flow/run-conversation.ts +7 -9
- package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
- package/src/wirings/addon/index.ts +12 -0
- package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
- package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
- package/src/wirings/{ai-agent/ai-agent-agui.test.ts → agent/agent-agui.test.ts} +126 -105
- package/src/wirings/{ai-agent/ai-agent-agui.ts → agent/agent-agui.ts} +7 -7
- package/src/wirings/{ai-agent/ai-agent-authorization.test.ts → agent/agent-authorization.test.ts} +6 -6
- package/src/wirings/{ai-agent/ai-agent-finalize.test.ts → agent/agent-finalize.test.ts} +17 -16
- package/src/wirings/{ai-agent/ai-agent-finalize.ts → agent/agent-finalize.ts} +22 -22
- package/src/wirings/{ai-agent/ai-agent-helpers.test.ts → agent/agent-helpers.test.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-helpers.ts → agent/agent-helpers.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-interrupt.test.ts → agent/agent-interrupt.test.ts} +67 -77
- package/src/wirings/{ai-agent/ai-agent-interrupt.ts → agent/agent-interrupt.ts} +5 -5
- package/src/wirings/{ai-agent/ai-agent-memory.test.ts → agent/agent-memory.test.ts} +12 -12
- package/src/wirings/{ai-agent/ai-agent-memory.ts → agent/agent-memory.ts} +36 -36
- package/src/wirings/{ai-agent/ai-agent-model-config.test.ts → agent/agent-model-config.test.ts} +2 -5
- package/src/wirings/{ai-agent/ai-agent-model-config.ts → agent/agent-model-config.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-prepare.test.ts → agent/agent-prepare.test.ts} +18 -18
- package/src/wirings/{ai-agent/ai-agent-prepare.ts → agent/agent-prepare.ts} +60 -56
- package/src/wirings/{ai-agent/ai-agent-registry.test.ts → agent/agent-registry.test.ts} +49 -43
- package/src/wirings/{ai-agent/ai-agent-registry.ts → agent/agent-registry.ts} +14 -14
- package/src/wirings/{ai-agent/ai-agent-resume-authorization.test.ts → agent/agent-resume-authorization.test.ts} +18 -18
- package/src/wirings/{ai-agent → agent}/agent-rpc.ts +16 -20
- package/src/wirings/{ai-agent/ai-agent-runner.test.ts → agent/agent-runner.test.ts} +105 -106
- package/src/wirings/{ai-agent/ai-agent-runner.ts → agent/agent-runner.ts} +91 -82
- package/src/wirings/{ai-agent/ai-agent-stream-output-hooks.test.ts → agent/agent-stream-output-hooks.test.ts} +25 -25
- package/src/wirings/{ai-agent/ai-agent-stream.test.ts → agent/agent-stream.test.ts} +147 -143
- package/src/wirings/{ai-agent/ai-agent-stream.ts → agent/agent-stream.ts} +148 -148
- package/src/wirings/{ai-agent/ai-agent-thread-ownership.test.ts → agent/agent-thread-ownership.test.ts} +24 -28
- package/src/wirings/{ai-agent/ai-agent-turn.test.ts → agent/agent-turn.test.ts} +3 -5
- package/src/wirings/{ai-agent/ai-agent-turn.ts → agent/agent-turn.ts} +7 -7
- package/src/wirings/agent/agent-utils.ts +20 -0
- package/src/wirings/{ai-agent/ai-agent.types.ts → agent/agent.types.ts} +54 -51
- package/src/wirings/agent/index.ts +57 -0
- package/src/wirings/{ai-agent → agent}/voice-input.test.ts +15 -15
- package/src/wirings/{ai-agent → agent}/voice-input.ts +11 -11
- package/src/wirings/{ai-agent → agent}/voice-output.test.ts +25 -27
- package/src/wirings/{ai-agent → agent}/voice-output.ts +11 -11
- package/src/wirings/{ai-scorer/ai-scorer-grade.test.ts → agent-scorer/agent-scorer-grade.test.ts} +8 -8
- package/src/wirings/{ai-scorer/ai-scorer-grade.ts → agent-scorer/agent-scorer-grade.ts} +9 -9
- package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +285 -0
- package/src/wirings/agent-scorer/agent-scorer-judge.ts +180 -0
- package/src/wirings/{ai-scorer/ai-scorer-live.test.ts → agent-scorer/agent-scorer-live.test.ts} +11 -11
- package/src/wirings/{ai-scorer/ai-scorer-live.ts → agent-scorer/agent-scorer-live.ts} +3 -3
- package/src/wirings/{ai-scorer/ai-scorer-registry.ts → agent-scorer/agent-scorer-registry.ts} +11 -8
- package/src/wirings/{ai-scorer/ai-scorer-sampling.test.ts → agent-scorer/agent-scorer-sampling.test.ts} +1 -1
- package/src/wirings/{ai-scorer/ai-scorer-snapshots.test.ts → agent-scorer/agent-scorer-snapshots.test.ts} +2 -2
- package/src/wirings/{ai-scorer/ai-scorer-snapshots.ts → agent-scorer/agent-scorer-snapshots.ts} +1 -1
- package/src/wirings/{ai-scorer/ai-scorer-worker.test.ts → agent-scorer/agent-scorer-worker.test.ts} +15 -15
- package/src/wirings/{ai-scorer/ai-scorer-worker.ts → agent-scorer/agent-scorer-worker.ts} +9 -7
- package/src/wirings/{ai-scorer/ai-scorer.ts → agent-scorer/agent-scorer.ts} +15 -7
- package/src/wirings/{ai-scorer/ai-scorer.types.ts → agent-scorer/agent-scorer.types.ts} +27 -6
- package/src/wirings/agent-scorer/index.ts +23 -0
- package/src/wirings/channel/channel-common.ts +4 -2
- package/src/wirings/channel/channel-handler.ts +2 -5
- package/src/wirings/channel/channel-middleware-runner.ts +1 -1
- package/src/wirings/channel/channel-rpc.types.ts +3 -7
- package/src/wirings/channel/channel.types.ts +1 -2
- package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
- package/src/wirings/channel/serverless/index.ts +1 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
- package/src/wirings/cli/channel/index.ts +1 -3
- package/src/wirings/cli/cli-runner.test.ts +1 -1
- package/src/wirings/cli/cli-runner.ts +11 -7
- package/src/wirings/cli/cli.types.ts +24 -3
- package/src/wirings/cli/command-parser.test.ts +388 -1
- package/src/wirings/cli/command-parser.ts +189 -29
- package/src/wirings/gateway/gateway-runner.test.ts +1 -2
- package/src/wirings/gateway/gateway-runner.ts +3 -6
- package/src/wirings/gateway/gateway.types.ts +5 -4
- package/src/wirings/http/http-routes.test.ts +1 -2
- package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
- package/src/wirings/http/http-runner.test.ts +3 -8
- package/src/wirings/http/http-runner.ts +9 -3
- package/src/wirings/http/http.types.ts +3 -12
- package/src/wirings/http/index.ts +1 -0
- package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
- package/src/wirings/mcp/mcp-runner.test.ts +1 -1
- package/src/wirings/mcp/mcp.types.ts +1 -2
- package/src/wirings/persona/index.ts +1 -4
- package/src/wirings/persona/persona.types.ts +14 -0
- package/src/wirings/queue/queue-identity.test.ts +1 -1
- package/src/wirings/queue/queue.types.ts +2 -6
- package/src/wirings/queue/signed-queue-service.ts +1 -1
- package/src/wirings/rpc/index.ts +0 -12
- package/src/wirings/rpc/rpc-runner.test.ts +4 -4
- package/src/wirings/rpc/rpc-runner.ts +5 -5
- package/src/wirings/rpc/rpc-types.ts +1 -1
- package/src/wirings/scheduler/scheduler.types.ts +2 -5
- package/src/wirings/scope/index.ts +1 -0
- package/src/wirings/secret/secret.types.ts +10 -0
- package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
- package/src/wirings/secret/validate-secret-definitions.ts +2 -0
- package/src/wirings/variable/validate-variable-definitions.test.ts +23 -0
- package/src/wirings/variable/validate-variable-definitions.ts +2 -0
- package/src/wirings/variable/variable.types.ts +9 -0
- package/src/wirings/virtual-user/index.ts +1 -4
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +2 -2
- package/src/wirings/virtual-user/run-virtual-user.test.ts +2 -2
- package/src/wirings/virtual-user/run-virtual-user.ts +3 -3
- package/src/wirings/virtual-user/virtual-user-agents.ts +1 -1
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
- package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
- package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
- package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
- package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
- package/src/wirings/workflow/graph/graph-node.ts +16 -1
- package/src/wirings/workflow/graph/graph-runner.ts +387 -61
- package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
- package/src/wirings/workflow/index.ts +8 -0
- package/src/wirings/workflow/pikku-scenario-service.ts +59 -19
- package/src/wirings/workflow/pikku-workflow-service.ts +6 -8
- package/src/wirings/workflow/run-timeline.ts +2 -2
- package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
- package/src/wirings/workflow/scenario-run.types.ts +186 -0
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +32 -7
- package/src/wirings/workflow/scenario-step.types.ts +27 -12
- package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
- package/src/wirings/workflow/workflow-approval.ts +2 -1
- package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
- package/src/wirings/workflow/workflow.types.ts +4 -12
- package/src/wirings-stay-decoupled.test.ts +7 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +3 -2
- package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
- package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
- package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
- package/dist/wirings/ai-agent/index.d.ts +0 -12
- package/dist/wirings/ai-agent/index.js +0 -10
- package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
- package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
- package/dist/wirings/ai-scorer/index.d.ts +0 -6
- package/dist/wirings/ai-scorer/index.js +0 -5
- package/src/ecosystem.ts +0 -40
- package/src/index.ts +0 -255
- package/src/wirings/ai-agent/ai-agent-utils.ts +0 -1
- package/src/wirings/ai-agent/index.ts +0 -65
- package/src/wirings/ai-scorer/ai-scorer-judge.test.ts +0 -143
- package/src/wirings/ai-scorer/ai-scorer-judge.ts +0 -120
- package/src/wirings/ai-scorer/index.ts +0 -24
- /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
- /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
- /package/dist/{services/ai-storage-service.js → ecosystem/gateway.js} +0 -0
- /package/dist/{wirings/ai-agent/ai-agent.types.js → ecosystem/node.js} +0 -0
- /package/dist/wirings/{ai-agent/ai-agent-helpers.js → agent/agent-helpers.js} +0 -0
- /package/dist/wirings/{ai-agent/ai-agent-model-config.d.ts → agent/agent-model-config.d.ts} +0 -0
- /package/dist/wirings/{ai-agent → agent}/agent-rpc.d.ts +0 -0
- /package/dist/wirings/{ai-scorer/ai-scorer-sampling.d.ts → agent-scorer/agent-scorer-sampling.d.ts} +0 -0
- /package/dist/wirings/{ai-scorer/ai-scorer-sampling.js → agent-scorer/agent-scorer-sampling.js} +0 -0
- /package/dist/wirings/{ai-scorer/ai-scorer-snapshots.js → agent-scorer/agent-scorer-snapshots.js} +0 -0
- /package/src/{column-form.ts → classification/column-form.ts} +0 -0
- /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
- /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
- /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
- /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
- /package/src/wirings/{ai-scorer/ai-scorer-sampling.ts → agent-scorer/agent-scorer-sampling.ts} +0 -0
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
AgentInput,
|
|
3
|
+
AgentOutput,
|
|
4
|
+
AgentStep,
|
|
5
|
+
AgentMemoryConfig,
|
|
6
|
+
CoreAgent,
|
|
7
|
+
PikkuAgentMiddlewareHooks,
|
|
8
8
|
AgentRunState,
|
|
9
|
-
} from './
|
|
9
|
+
} from './agent.types.js'
|
|
10
10
|
import type {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from '../../services/
|
|
15
|
-
import type {
|
|
16
|
-
import type {
|
|
11
|
+
AgentStepResult,
|
|
12
|
+
AgentRunnerParams,
|
|
13
|
+
AgentRunnerService,
|
|
14
|
+
} from '../../services/agent-runner-service.js'
|
|
15
|
+
import type { AgentStorageService } from '../../services/agent-storage-service.js'
|
|
16
|
+
import type { AgentRunStateService } from '../../services/agent-run-state-service.js'
|
|
17
17
|
|
|
18
18
|
import {
|
|
19
19
|
saveMessages,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
loadContextMessages,
|
|
22
22
|
trimMessages,
|
|
23
23
|
getWorkingMemoryMiddleware,
|
|
24
|
-
} from './
|
|
24
|
+
} from './agent-memory.js'
|
|
25
25
|
import {
|
|
26
26
|
prepareAgentRun,
|
|
27
27
|
resolveAgent,
|
|
@@ -31,9 +31,9 @@ import {
|
|
|
31
31
|
agentSessionScope,
|
|
32
32
|
assertResourcePrincipalOwner,
|
|
33
33
|
assertAgentAuthorized,
|
|
34
|
-
type
|
|
35
|
-
} from './
|
|
36
|
-
import { checkForApprovals, appendStepMessages } from './
|
|
34
|
+
type RunAgentParams,
|
|
35
|
+
} from './agent-prepare.js'
|
|
36
|
+
import { checkForApprovals, appendStepMessages } from './agent-stream.js'
|
|
37
37
|
import {
|
|
38
38
|
AgentInterruptedError,
|
|
39
39
|
isAbortError,
|
|
@@ -41,22 +41,22 @@ import {
|
|
|
41
41
|
registerInterruptibleRun,
|
|
42
42
|
trackInterruptNote,
|
|
43
43
|
trackToolExecution,
|
|
44
|
-
} from './
|
|
44
|
+
} from './agent-interrupt.js'
|
|
45
45
|
import { pikkuState, getSingletonServices } from '../../pikku-state.js'
|
|
46
46
|
import {
|
|
47
47
|
applyInputMiddleware,
|
|
48
48
|
describeApprovals,
|
|
49
49
|
notifyAfterStep,
|
|
50
50
|
toAccumulatedStep,
|
|
51
|
-
} from './
|
|
51
|
+
} from './agent-turn.js'
|
|
52
52
|
import {
|
|
53
53
|
applyOutputMiddleware,
|
|
54
54
|
finalizeAgentRun,
|
|
55
55
|
lastUserMessageText,
|
|
56
|
-
} from './
|
|
57
|
-
import { resolveModelConfig } from './
|
|
56
|
+
} from './agent-finalize.js'
|
|
57
|
+
import { resolveModelConfig } from './agent-model-config.js'
|
|
58
58
|
import { AIProviderNotConfiguredError } from '../../errors/errors.js'
|
|
59
|
-
import { randomUUID } from './
|
|
59
|
+
import { deniedToolResult, randomUUID } from './agent-utils.js'
|
|
60
60
|
|
|
61
61
|
function stripNulls(obj: unknown): unknown {
|
|
62
62
|
if (obj === null) return undefined
|
|
@@ -86,12 +86,12 @@ function extractStructuredAssistantOutput(object: unknown): {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
export async function
|
|
89
|
+
export async function runAgent(
|
|
90
90
|
agentName: string,
|
|
91
|
-
input:
|
|
92
|
-
params:
|
|
91
|
+
input: AgentInput,
|
|
92
|
+
params: RunAgentParams,
|
|
93
93
|
agentSessionMap?: Map<string, string>
|
|
94
|
-
): Promise<
|
|
94
|
+
): Promise<AgentOutput> {
|
|
95
95
|
const sessionMap = agentSessionMap ?? new Map<string, string>()
|
|
96
96
|
|
|
97
97
|
input = {
|
|
@@ -119,13 +119,13 @@ export async function runAIAgent(
|
|
|
119
119
|
runnerParams.agentId = agentName
|
|
120
120
|
|
|
121
121
|
const singletonServices = getSingletonServices()
|
|
122
|
-
const {
|
|
123
|
-
if (!
|
|
124
|
-
throw new Error('
|
|
122
|
+
const { agentRunState } = singletonServices
|
|
123
|
+
if (!agentRunState) {
|
|
124
|
+
throw new Error('AgentRunStateService not available in singletonServices')
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
if (missingRpcs.length > 0) {
|
|
128
|
-
const runId = await
|
|
128
|
+
const runId = await agentRunState.createRun({
|
|
129
129
|
agentName,
|
|
130
130
|
threadId,
|
|
131
131
|
resourceId: input.resourceId,
|
|
@@ -145,22 +145,22 @@ export async function runAIAgent(
|
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
const
|
|
148
|
+
const agentMiddlewares: PikkuAgentMiddlewareHooks[] = [
|
|
149
149
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
150
150
|
threadId,
|
|
151
151
|
workingMemorySchemaName,
|
|
152
152
|
logger: singletonServices.logger,
|
|
153
153
|
schemaService: singletonServices.schema,
|
|
154
154
|
}),
|
|
155
|
-
...(agent.
|
|
155
|
+
...(agent.agentMiddleware ?? []),
|
|
156
156
|
]
|
|
157
157
|
|
|
158
|
-
// One bag per run, shared by every middleware — see
|
|
158
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
159
159
|
const sharedNotes: Record<string, unknown> = {}
|
|
160
160
|
|
|
161
161
|
const { messages: modifiedMessages, instructions: modifiedInstructions } =
|
|
162
162
|
await applyInputMiddleware(
|
|
163
|
-
|
|
163
|
+
agentMiddlewares,
|
|
164
164
|
singletonServices,
|
|
165
165
|
{
|
|
166
166
|
messages: runnerParams.messages,
|
|
@@ -176,7 +176,7 @@ export async function runAIAgent(
|
|
|
176
176
|
const persistedUserMessage =
|
|
177
177
|
lastModified?.id === userMessage.id ? lastModified : userMessage
|
|
178
178
|
|
|
179
|
-
const runId = await
|
|
179
|
+
const runId = await agentRunState.createRun({
|
|
180
180
|
agentName,
|
|
181
181
|
threadId,
|
|
182
182
|
resourceId: input.resourceId,
|
|
@@ -192,9 +192,9 @@ export async function runAIAgent(
|
|
|
192
192
|
runnerParams.tools = trackToolExecution(runnerParams.tools, interruptHandle)
|
|
193
193
|
|
|
194
194
|
try {
|
|
195
|
-
const accumulatedSteps:
|
|
195
|
+
const accumulatedSteps: AgentStep[] = []
|
|
196
196
|
const totalUsage = { inputTokens: 0, outputTokens: 0 }
|
|
197
|
-
let lastStepResult:
|
|
197
|
+
let lastStepResult: AgentStepResult | null = null
|
|
198
198
|
|
|
199
199
|
for (let step = 0; step < maxSteps; step++) {
|
|
200
200
|
if (agent.prepareStep) {
|
|
@@ -218,7 +218,12 @@ export async function runAIAgent(
|
|
|
218
218
|
totalUsage.inputTokens += stepResult.usage.inputTokens
|
|
219
219
|
totalUsage.outputTokens += stepResult.usage.outputTokens
|
|
220
220
|
|
|
221
|
-
await notifyAfterStep(
|
|
221
|
+
await notifyAfterStep(
|
|
222
|
+
agentMiddlewares,
|
|
223
|
+
singletonServices,
|
|
224
|
+
step,
|
|
225
|
+
stepResult
|
|
226
|
+
)
|
|
222
227
|
|
|
223
228
|
accumulatedSteps.push(toAccumulatedStep(stepResult))
|
|
224
229
|
|
|
@@ -271,7 +276,7 @@ export async function runAIAgent(
|
|
|
271
276
|
])
|
|
272
277
|
}
|
|
273
278
|
|
|
274
|
-
await
|
|
279
|
+
await agentRunState.updateRun(runId, {
|
|
275
280
|
status: 'suspended',
|
|
276
281
|
suspendReason: 'approval',
|
|
277
282
|
pendingApprovals,
|
|
@@ -309,7 +314,7 @@ export async function runAIAgent(
|
|
|
309
314
|
}
|
|
310
315
|
|
|
311
316
|
const { text: outputText, steps: outputSteps } =
|
|
312
|
-
await applyOutputMiddleware(
|
|
317
|
+
await applyOutputMiddleware(agentMiddlewares, singletonServices, {
|
|
313
318
|
text: finalText,
|
|
314
319
|
messages: runnerParams.messages,
|
|
315
320
|
steps: result.steps,
|
|
@@ -329,7 +334,7 @@ export async function runAIAgent(
|
|
|
329
334
|
}
|
|
330
335
|
)
|
|
331
336
|
|
|
332
|
-
await finalizeAgentRun(
|
|
337
|
+
await finalizeAgentRun(agentRunState, {
|
|
333
338
|
runId,
|
|
334
339
|
agentName,
|
|
335
340
|
threadId,
|
|
@@ -352,7 +357,7 @@ export async function runAIAgent(
|
|
|
352
357
|
// knowledge: decisions/internals/an-agent-interrupt-is-not-a-failure.md
|
|
353
358
|
const interruption = interruptHandle.interruption
|
|
354
359
|
if (interruption || isAbortError(error)) {
|
|
355
|
-
await
|
|
360
|
+
await agentRunState.updateRun(runId, { status: 'interrupted' })
|
|
356
361
|
if (storage) {
|
|
357
362
|
trackInterruptNote(
|
|
358
363
|
threadId,
|
|
@@ -361,7 +366,7 @@ export async function runAIAgent(
|
|
|
361
366
|
}
|
|
362
367
|
throw new AgentInterruptedError(runId, interruption ?? { reason: 'user' })
|
|
363
368
|
}
|
|
364
|
-
for (const mw of
|
|
369
|
+
for (const mw of agentMiddlewares) {
|
|
365
370
|
if (mw.onError) {
|
|
366
371
|
try {
|
|
367
372
|
await mw.onError(singletonServices, {
|
|
@@ -372,7 +377,7 @@ export async function runAIAgent(
|
|
|
372
377
|
} catch {}
|
|
373
378
|
}
|
|
374
379
|
}
|
|
375
|
-
await
|
|
380
|
+
await agentRunState.updateRun(runId, {
|
|
376
381
|
status: 'failed',
|
|
377
382
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
378
383
|
})
|
|
@@ -382,19 +387,19 @@ export async function runAIAgent(
|
|
|
382
387
|
}
|
|
383
388
|
}
|
|
384
389
|
|
|
385
|
-
export async function
|
|
390
|
+
export async function resumeAgentSync(
|
|
386
391
|
runId: string,
|
|
387
392
|
approvals: { toolCallId: string; approved: boolean }[],
|
|
388
|
-
params:
|
|
393
|
+
params: RunAgentParams,
|
|
389
394
|
expectedAgentName?: string
|
|
390
|
-
): Promise<
|
|
395
|
+
): Promise<AgentOutput> {
|
|
391
396
|
const singletonServices = getSingletonServices()
|
|
392
|
-
const {
|
|
393
|
-
if (!
|
|
394
|
-
throw new Error('
|
|
397
|
+
const { agentRunState } = singletonServices
|
|
398
|
+
if (!agentRunState) {
|
|
399
|
+
throw new Error('AgentRunStateService not available in singletonServices')
|
|
395
400
|
}
|
|
396
401
|
|
|
397
|
-
const run = await
|
|
402
|
+
const run = await agentRunState.getRun(runId)
|
|
398
403
|
if (!run) throw new Error(`No run found for runId ${runId}`)
|
|
399
404
|
assertResourcePrincipalOwner(
|
|
400
405
|
params,
|
|
@@ -417,7 +422,7 @@ export async function resumeAIAgentSync(
|
|
|
417
422
|
|
|
418
423
|
const { storage } = resolveMemoryServices(agent, singletonServices)
|
|
419
424
|
const memoryConfig = agent.memory
|
|
420
|
-
const agentRunner = singletonServices.
|
|
425
|
+
const agentRunner = singletonServices.agentRunner
|
|
421
426
|
if (!agentRunner) {
|
|
422
427
|
throw new AIProviderNotConfiguredError()
|
|
423
428
|
}
|
|
@@ -436,7 +441,7 @@ export async function resumeAIAgentSync(
|
|
|
436
441
|
// for may run the tool.
|
|
437
442
|
const claimedIds = new Set<string>()
|
|
438
443
|
for (const { toolCallId, approved } of approvals) {
|
|
439
|
-
const claimed = await
|
|
444
|
+
const claimed = await agentRunState.resolveApproval(
|
|
440
445
|
toolCallId,
|
|
441
446
|
approved ? 'approved' : 'denied'
|
|
442
447
|
)
|
|
@@ -458,7 +463,7 @@ export async function resumeAIAgentSync(
|
|
|
458
463
|
resolvedName,
|
|
459
464
|
packageName,
|
|
460
465
|
undefined,
|
|
461
|
-
agent.
|
|
466
|
+
agent.agentMiddleware ?? []
|
|
462
467
|
)
|
|
463
468
|
|
|
464
469
|
const toolCallMessages: {
|
|
@@ -479,8 +484,7 @@ export async function resumeAIAgentSync(
|
|
|
479
484
|
let toolError: string | undefined
|
|
480
485
|
|
|
481
486
|
if (rejectedIds.has(toolCallId)) {
|
|
482
|
-
resultStr =
|
|
483
|
-
'The user explicitly declined this action. Inform them that it was declined and do not retry.'
|
|
487
|
+
resultStr = deniedToolResult()
|
|
484
488
|
} else if (approvedIds.has(toolCallId)) {
|
|
485
489
|
const matchingTool = tools.find((t) => t.name === pending.toolName)
|
|
486
490
|
if (!matchingTool) {
|
|
@@ -538,7 +542,7 @@ export async function resumeAIAgentSync(
|
|
|
538
542
|
])
|
|
539
543
|
}
|
|
540
544
|
|
|
541
|
-
await
|
|
545
|
+
await agentRunState.updateRun(runId, { status: 'running' })
|
|
542
546
|
|
|
543
547
|
return continueAfterToolResultSync(
|
|
544
548
|
run,
|
|
@@ -549,7 +553,7 @@ export async function resumeAIAgentSync(
|
|
|
549
553
|
memoryConfig,
|
|
550
554
|
agentRunner,
|
|
551
555
|
params,
|
|
552
|
-
|
|
556
|
+
agentRunState,
|
|
553
557
|
// The approved tools were executed here, before the model was re-entered,
|
|
554
558
|
// so they belong to the run's step record — otherwise a tool that failed
|
|
555
559
|
// after approval leaves no trace on the run at all.
|
|
@@ -569,16 +573,16 @@ export async function resumeAIAgentSync(
|
|
|
569
573
|
|
|
570
574
|
async function continueAfterToolResultSync(
|
|
571
575
|
run: AgentRunState,
|
|
572
|
-
agent:
|
|
576
|
+
agent: CoreAgent,
|
|
573
577
|
packageName: string | null,
|
|
574
578
|
resolvedName: string,
|
|
575
|
-
storage:
|
|
576
|
-
memoryConfig:
|
|
577
|
-
agentRunner:
|
|
578
|
-
params:
|
|
579
|
-
|
|
580
|
-
resumedToolStep?:
|
|
581
|
-
): Promise<
|
|
579
|
+
storage: AgentStorageService | undefined,
|
|
580
|
+
memoryConfig: AgentMemoryConfig | undefined,
|
|
581
|
+
agentRunner: AgentRunnerService,
|
|
582
|
+
params: RunAgentParams,
|
|
583
|
+
agentRunState: AgentRunStateService,
|
|
584
|
+
resumedToolStep?: AgentStep
|
|
585
|
+
): Promise<AgentOutput> {
|
|
582
586
|
const singletonServices = getSingletonServices()
|
|
583
587
|
const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta')
|
|
584
588
|
const meta = agentsMeta[resolvedName]
|
|
@@ -606,21 +610,21 @@ async function continueAfterToolResultSync(
|
|
|
606
610
|
|
|
607
611
|
const instructions = await buildInstructions(resolvedName, packageName)
|
|
608
612
|
|
|
609
|
-
const
|
|
613
|
+
const agentMiddlewares: PikkuAgentMiddlewareHooks[] = [
|
|
610
614
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
611
615
|
threadId: run.threadId,
|
|
612
616
|
workingMemorySchemaName,
|
|
613
617
|
logger: singletonServices.logger,
|
|
614
618
|
schemaService: singletonServices.schema,
|
|
615
619
|
}),
|
|
616
|
-
...(agent.
|
|
620
|
+
...(agent.agentMiddleware ?? []),
|
|
617
621
|
]
|
|
618
|
-
// One bag per run, shared by every middleware — see
|
|
622
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
619
623
|
const sharedNotes: Record<string, unknown> = {}
|
|
620
624
|
|
|
621
625
|
const { messages: modifiedMessages, instructions: modifiedInstructions } =
|
|
622
626
|
await applyInputMiddleware(
|
|
623
|
-
|
|
627
|
+
agentMiddlewares,
|
|
624
628
|
singletonServices,
|
|
625
629
|
{ messages: trimmedMessages, instructions: instructions },
|
|
626
630
|
sharedNotes
|
|
@@ -633,13 +637,13 @@ async function continueAfterToolResultSync(
|
|
|
633
637
|
resolvedName,
|
|
634
638
|
packageName,
|
|
635
639
|
undefined,
|
|
636
|
-
|
|
640
|
+
agentMiddlewares
|
|
637
641
|
)
|
|
638
642
|
|
|
639
643
|
const resolved = resolveModelConfig(resolvedName, agent)
|
|
640
644
|
const maxSteps = resolved.maxSteps ?? 10
|
|
641
645
|
|
|
642
|
-
const runnerParams:
|
|
646
|
+
const runnerParams: AgentRunnerParams = {
|
|
643
647
|
model: resolved.model,
|
|
644
648
|
temperature: resolved.temperature,
|
|
645
649
|
instructions: modifiedInstructions,
|
|
@@ -666,12 +670,12 @@ async function continueAfterToolResultSync(
|
|
|
666
670
|
// `saveMessages`, and the approved tool's messages were already written to
|
|
667
671
|
// the thread before the model was re-entered. It belongs to the run's step
|
|
668
672
|
// record, not to persistence.
|
|
669
|
-
const withResumedStep = (steps:
|
|
673
|
+
const withResumedStep = (steps: AgentStep[]): AgentStep[] =>
|
|
670
674
|
resumedToolStep ? [resumedToolStep, ...steps] : steps
|
|
671
675
|
|
|
672
|
-
const accumulatedSteps:
|
|
676
|
+
const accumulatedSteps: AgentStep[] = []
|
|
673
677
|
const totalUsage = { inputTokens: 0, outputTokens: 0 }
|
|
674
|
-
let lastStepResult:
|
|
678
|
+
let lastStepResult: AgentStepResult | null = null
|
|
675
679
|
|
|
676
680
|
for (let step = 0; step < maxSteps; step++) {
|
|
677
681
|
const stepResult = await agentRunner.run(runnerParams)
|
|
@@ -680,7 +684,12 @@ async function continueAfterToolResultSync(
|
|
|
680
684
|
totalUsage.inputTokens += stepResult.usage.inputTokens
|
|
681
685
|
totalUsage.outputTokens += stepResult.usage.outputTokens
|
|
682
686
|
|
|
683
|
-
await notifyAfterStep(
|
|
687
|
+
await notifyAfterStep(
|
|
688
|
+
agentMiddlewares,
|
|
689
|
+
singletonServices,
|
|
690
|
+
step,
|
|
691
|
+
stepResult
|
|
692
|
+
)
|
|
684
693
|
|
|
685
694
|
accumulatedSteps.push(toAccumulatedStep(stepResult))
|
|
686
695
|
|
|
@@ -735,7 +744,7 @@ async function continueAfterToolResultSync(
|
|
|
735
744
|
])
|
|
736
745
|
}
|
|
737
746
|
|
|
738
|
-
await
|
|
747
|
+
await agentRunState.updateRun(run.runId, {
|
|
739
748
|
status: 'suspended',
|
|
740
749
|
suspendReason: 'approval',
|
|
741
750
|
pendingApprovals,
|
|
@@ -772,7 +781,7 @@ async function continueAfterToolResultSync(
|
|
|
772
781
|
}
|
|
773
782
|
|
|
774
783
|
const { text: outputText, steps: outputSteps } =
|
|
775
|
-
await applyOutputMiddleware(
|
|
784
|
+
await applyOutputMiddleware(agentMiddlewares, singletonServices, {
|
|
776
785
|
text: finalText,
|
|
777
786
|
messages: runnerParams.messages,
|
|
778
787
|
steps: withResumedStep(result.steps),
|
|
@@ -793,7 +802,7 @@ async function continueAfterToolResultSync(
|
|
|
793
802
|
}
|
|
794
803
|
)
|
|
795
804
|
|
|
796
|
-
await finalizeAgentRun(
|
|
805
|
+
await finalizeAgentRun(agentRunState, {
|
|
797
806
|
runId: run.runId,
|
|
798
807
|
agentName: resolvedName,
|
|
799
808
|
threadId: run.threadId,
|
|
@@ -815,7 +824,7 @@ async function continueAfterToolResultSync(
|
|
|
815
824
|
} catch (error) {
|
|
816
825
|
const interruption = interruptHandle.interruption
|
|
817
826
|
if (interruption || isAbortError(error)) {
|
|
818
|
-
await
|
|
827
|
+
await agentRunState.updateRun(run.runId, { status: 'interrupted' })
|
|
819
828
|
if (storage) {
|
|
820
829
|
trackInterruptNote(
|
|
821
830
|
run.threadId,
|
|
@@ -827,7 +836,7 @@ async function continueAfterToolResultSync(
|
|
|
827
836
|
interruption ?? { reason: 'user' }
|
|
828
837
|
)
|
|
829
838
|
}
|
|
830
|
-
for (const mw of
|
|
839
|
+
for (const mw of agentMiddlewares) {
|
|
831
840
|
if (mw.onError) {
|
|
832
841
|
try {
|
|
833
842
|
await mw.onError(singletonServices, {
|
|
@@ -838,7 +847,7 @@ async function continueAfterToolResultSync(
|
|
|
838
847
|
} catch {}
|
|
839
848
|
}
|
|
840
849
|
}
|
|
841
|
-
await
|
|
850
|
+
await agentRunState.updateRun(run.runId, {
|
|
842
851
|
status: 'failed',
|
|
843
852
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
844
853
|
})
|
|
@@ -2,16 +2,16 @@ import { beforeEach, describe, test } from 'node:test'
|
|
|
2
2
|
import assert from 'node:assert/strict'
|
|
3
3
|
|
|
4
4
|
import { resetPikkuState, pikkuState } from '../../pikku-state.js'
|
|
5
|
-
import {
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
5
|
+
import { streamAgent } from './agent-stream.js'
|
|
6
|
+
import type { CoreAgent, PikkuAgentMiddlewareHooks } from './agent.types.js'
|
|
7
|
+
import type { AgentStepResult } from '../../services/agent-runner-service.js'
|
|
8
8
|
|
|
9
9
|
beforeEach(() => {
|
|
10
10
|
resetPikkuState()
|
|
11
11
|
})
|
|
12
12
|
|
|
13
13
|
const addTestAgent = (agentName: string) => {
|
|
14
|
-
const agent:
|
|
14
|
+
const agent: CoreAgent = {
|
|
15
15
|
name: agentName,
|
|
16
16
|
description: 'test agent',
|
|
17
17
|
instructions: 'be helpful',
|
|
@@ -28,8 +28,8 @@ const addTestAgent = (agentName: string) => {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
const makeStepResult = (
|
|
31
|
-
overrides?: Partial<
|
|
32
|
-
):
|
|
31
|
+
overrides?: Partial<AgentStepResult>
|
|
32
|
+
): AgentStepResult => ({
|
|
33
33
|
text: '',
|
|
34
34
|
toolCalls: [],
|
|
35
35
|
toolResults: [],
|
|
@@ -38,7 +38,7 @@ const makeStepResult = (
|
|
|
38
38
|
...overrides,
|
|
39
39
|
})
|
|
40
40
|
|
|
41
|
-
describe('
|
|
41
|
+
describe('streamAgent output hooks', () => {
|
|
42
42
|
test('does not run modifyOutput on a streamed run, and warns the hook it is inert there', async () => {
|
|
43
43
|
addTestAgent('stream-modify-output-agent')
|
|
44
44
|
|
|
@@ -46,7 +46,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
46
46
|
const modifyOutputCalls: unknown[] = []
|
|
47
47
|
const sideEffects: string[] = []
|
|
48
48
|
|
|
49
|
-
const middleware:
|
|
49
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
50
50
|
modifyOutput: async (_services, ctx) => {
|
|
51
51
|
modifyOutputCalls.push(ctx)
|
|
52
52
|
sideEffects.push(ctx.text)
|
|
@@ -56,7 +56,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
56
56
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
57
57
|
'stream-modify-output-agent'
|
|
58
58
|
)!
|
|
59
|
-
agent.
|
|
59
|
+
agent.agentMiddleware = [middleware] as any
|
|
60
60
|
pikkuState(null, 'agent', 'agents').set('stream-modify-output-agent', agent)
|
|
61
61
|
|
|
62
62
|
const mockServices = {
|
|
@@ -66,13 +66,13 @@ describe('streamAIAgent output hooks', () => {
|
|
|
66
66
|
error: () => {},
|
|
67
67
|
debug: () => {},
|
|
68
68
|
},
|
|
69
|
-
|
|
69
|
+
agentRunner: {
|
|
70
70
|
stream: async (_params: any, channel: any) => {
|
|
71
71
|
channel.send({ type: 'text-delta', text: 'Hello' })
|
|
72
72
|
return makeStepResult({ text: 'Hello', finishReason: 'stop' })
|
|
73
73
|
},
|
|
74
74
|
},
|
|
75
|
-
|
|
75
|
+
agentRunState: {
|
|
76
76
|
createRun: async () => 'run-modify-output',
|
|
77
77
|
updateRun: async () => {},
|
|
78
78
|
},
|
|
@@ -80,7 +80,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
80
80
|
|
|
81
81
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
82
82
|
|
|
83
|
-
const result = await
|
|
83
|
+
const result = await streamAgent(
|
|
84
84
|
'stream-modify-output-agent',
|
|
85
85
|
{
|
|
86
86
|
message: 'hello',
|
|
@@ -139,7 +139,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
139
139
|
error: () => {},
|
|
140
140
|
debug: () => {},
|
|
141
141
|
},
|
|
142
|
-
|
|
142
|
+
agentRunner: {
|
|
143
143
|
stream: async (_params: any, channel: any) => {
|
|
144
144
|
channel.send({
|
|
145
145
|
type: 'text-delta',
|
|
@@ -148,11 +148,11 @@ describe('streamAIAgent output hooks', () => {
|
|
|
148
148
|
return makeStepResult({ text: 'Noted', finishReason: 'stop' })
|
|
149
149
|
},
|
|
150
150
|
},
|
|
151
|
-
|
|
151
|
+
agentRunState: {
|
|
152
152
|
createRun: async () => 'run-working-memory',
|
|
153
153
|
updateRun: async () => {},
|
|
154
154
|
},
|
|
155
|
-
|
|
155
|
+
agentStorage: {
|
|
156
156
|
createThread: async () => {},
|
|
157
157
|
getMessages: async () => [],
|
|
158
158
|
saveMessages: async () => {},
|
|
@@ -169,7 +169,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
169
169
|
|
|
170
170
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
171
171
|
|
|
172
|
-
await
|
|
172
|
+
await streamAgent(
|
|
173
173
|
'stream-working-memory-agent',
|
|
174
174
|
{
|
|
175
175
|
message: 'remember I live in Berlin',
|
|
@@ -210,7 +210,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
210
210
|
error: () => {},
|
|
211
211
|
debug: () => {},
|
|
212
212
|
},
|
|
213
|
-
|
|
213
|
+
agentRunner: {
|
|
214
214
|
stream: async (_params: any, channel: any) => {
|
|
215
215
|
channel.send({
|
|
216
216
|
type: 'tool-call',
|
|
@@ -240,11 +240,11 @@ describe('streamAIAgent output hooks', () => {
|
|
|
240
240
|
return makeStepResult({ text: 'done', finishReason: 'stop' })
|
|
241
241
|
},
|
|
242
242
|
},
|
|
243
|
-
|
|
243
|
+
agentRunState: {
|
|
244
244
|
createRun: async () => 'run-tool-error',
|
|
245
245
|
updateRun: async () => {},
|
|
246
246
|
},
|
|
247
|
-
|
|
247
|
+
agentStorage: {
|
|
248
248
|
createThread: async () => {},
|
|
249
249
|
getMessages: async () => [],
|
|
250
250
|
saveMessages: async (_threadId: string, messages: any[]) => {
|
|
@@ -255,7 +255,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
255
255
|
|
|
256
256
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
257
257
|
|
|
258
|
-
await
|
|
258
|
+
await streamAgent(
|
|
259
259
|
'stream-tool-error-agent',
|
|
260
260
|
{
|
|
261
261
|
message: 'look it up',
|
|
@@ -290,7 +290,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
290
290
|
|
|
291
291
|
const warnings: unknown[][] = []
|
|
292
292
|
|
|
293
|
-
const middleware:
|
|
293
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
294
294
|
modifyOutput: async (_services, ctx) => ({
|
|
295
295
|
text: ctx.text,
|
|
296
296
|
messages: ctx.messages,
|
|
@@ -300,7 +300,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
300
300
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
301
301
|
'stream-both-hooks-agent'
|
|
302
302
|
)!
|
|
303
|
-
agent.
|
|
303
|
+
agent.agentMiddleware = [middleware] as any
|
|
304
304
|
pikkuState(null, 'agent', 'agents').set('stream-both-hooks-agent', agent)
|
|
305
305
|
|
|
306
306
|
const mockServices = {
|
|
@@ -310,13 +310,13 @@ describe('streamAIAgent output hooks', () => {
|
|
|
310
310
|
error: () => {},
|
|
311
311
|
debug: () => {},
|
|
312
312
|
},
|
|
313
|
-
|
|
313
|
+
agentRunner: {
|
|
314
314
|
stream: async (_params: any, channel: any) => {
|
|
315
315
|
channel.send({ type: 'text-delta', text: 'Hi' })
|
|
316
316
|
return makeStepResult({ text: 'Hi', finishReason: 'stop' })
|
|
317
317
|
},
|
|
318
318
|
},
|
|
319
|
-
|
|
319
|
+
agentRunState: {
|
|
320
320
|
createRun: async () => 'run-both-hooks',
|
|
321
321
|
updateRun: async () => {},
|
|
322
322
|
},
|
|
@@ -324,7 +324,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
324
324
|
|
|
325
325
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
326
326
|
|
|
327
|
-
await
|
|
327
|
+
await streamAgent(
|
|
328
328
|
'stream-both-hooks-agent',
|
|
329
329
|
{
|
|
330
330
|
message: 'hello',
|