@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,40 +1,37 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
AgentStreamChannel,
|
|
3
|
+
AgentStreamEvent,
|
|
4
|
+
AgentStep,
|
|
5
|
+
AgentMessage,
|
|
6
|
+
AgentToolCall,
|
|
7
|
+
AgentToolResult,
|
|
8
|
+
PikkuAgentMiddlewareHooks,
|
|
9
9
|
AgentRunState,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} from './
|
|
13
|
-
import {
|
|
14
|
-
finalizeAgentRun,
|
|
15
|
-
lastUserMessageText,
|
|
16
|
-
} from './ai-agent-finalize.js'
|
|
10
|
+
CoreAgent,
|
|
11
|
+
AgentMemoryConfig,
|
|
12
|
+
} from './agent.types.js'
|
|
13
|
+
import { finalizeAgentRun, lastUserMessageText } from './agent-finalize.js'
|
|
17
14
|
import { pikkuState, getSingletonServices } from '../../pikku-state.js'
|
|
18
|
-
import { applyInputMiddleware } from './
|
|
15
|
+
import { applyInputMiddleware } from './agent-turn.js'
|
|
19
16
|
import { AIProviderNotConfiguredError } from '../../errors/errors.js'
|
|
20
|
-
import { randomUUID } from './
|
|
17
|
+
import { deniedToolResult, randomUUID } from './agent-utils.js'
|
|
21
18
|
import { SPOKEN_TRANSCRIPT } from './voice-input.js'
|
|
22
19
|
import {
|
|
23
20
|
combineChannelMiddleware,
|
|
24
21
|
wrapChannelWithMiddleware,
|
|
25
22
|
} from '../channel/channel-middleware-runner.js'
|
|
26
|
-
import type {
|
|
23
|
+
import type { AgentStorageService } from '../../services/agent-storage-service.js'
|
|
27
24
|
import type {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
} from '../../services/
|
|
25
|
+
AgentRunnerParams,
|
|
26
|
+
AgentStepResult,
|
|
27
|
+
} from '../../services/agent-runner-service.js'
|
|
31
28
|
|
|
32
29
|
import {
|
|
33
30
|
resolveMemoryServices,
|
|
34
31
|
loadContextMessages,
|
|
35
32
|
trimMessages,
|
|
36
33
|
getWorkingMemoryMiddleware,
|
|
37
|
-
} from './
|
|
34
|
+
} from './agent-memory.js'
|
|
38
35
|
import {
|
|
39
36
|
prepareAgentRun,
|
|
40
37
|
resolveAgent,
|
|
@@ -50,13 +47,13 @@ import {
|
|
|
50
47
|
ToolCredentialRequired,
|
|
51
48
|
APPROVAL_REQUIRED,
|
|
52
49
|
CREDENTIAL_REQUIRED,
|
|
53
|
-
type
|
|
54
|
-
type
|
|
50
|
+
type RunAgentParams,
|
|
51
|
+
type StreamAgentOptions,
|
|
55
52
|
type StreamContext,
|
|
56
|
-
} from './
|
|
57
|
-
import { resolveModelConfig } from './
|
|
58
|
-
import type {
|
|
59
|
-
import type {
|
|
53
|
+
} from './agent-prepare.js'
|
|
54
|
+
import { resolveModelConfig } from './agent-model-config.js'
|
|
55
|
+
import type { AgentRunStateService } from '../../services/agent-run-state-service.js'
|
|
56
|
+
import type { AgentRunnerService } from '../../services/agent-runner-service.js'
|
|
60
57
|
import {
|
|
61
58
|
getInFlightTools,
|
|
62
59
|
isAbortError,
|
|
@@ -67,27 +64,27 @@ import {
|
|
|
67
64
|
trackToolExecution,
|
|
68
65
|
type AgentInterruption,
|
|
69
66
|
type AgentInterruptResult,
|
|
70
|
-
} from './
|
|
67
|
+
} from './agent-interrupt.js'
|
|
71
68
|
|
|
72
|
-
type PersistingChannel =
|
|
69
|
+
type PersistingChannel = AgentStreamChannel & {
|
|
73
70
|
fullText: string
|
|
74
71
|
flush: (opts?: { interrupted?: boolean }) => Promise<void>
|
|
75
72
|
totalUsage: { inputTokens: number; outputTokens: number; model?: string }
|
|
76
73
|
/** Every tool the run called, kept for the whole run rather than per step. */
|
|
77
|
-
runToolCalls: NonNullable<
|
|
74
|
+
runToolCalls: NonNullable<AgentStep['toolCalls']>
|
|
78
75
|
}
|
|
79
76
|
|
|
80
77
|
function createPersistingChannel(
|
|
81
|
-
parent:
|
|
82
|
-
storage:
|
|
78
|
+
parent: AgentStreamChannel,
|
|
79
|
+
storage: AgentStorageService | undefined,
|
|
83
80
|
threadId: string,
|
|
84
81
|
logger?: { error: (...args: any[]) => void }
|
|
85
82
|
): PersistingChannel {
|
|
86
83
|
let fullText = ''
|
|
87
84
|
let stepText = ''
|
|
88
85
|
let stepGenerativeUI: unknown | null = null
|
|
89
|
-
let stepToolCalls:
|
|
90
|
-
let stepToolResults:
|
|
86
|
+
let stepToolCalls: AgentToolCall[] = []
|
|
87
|
+
let stepToolResults: AgentToolResult[] = []
|
|
91
88
|
const totalUsage: {
|
|
92
89
|
inputTokens: number
|
|
93
90
|
outputTokens: number
|
|
@@ -98,7 +95,7 @@ function createPersistingChannel(
|
|
|
98
95
|
}
|
|
99
96
|
// Survives the per-step flush below, which clears its own buffers: the run
|
|
100
97
|
// record needs every call the run made, not just the last step's.
|
|
101
|
-
const runToolCalls: NonNullable<
|
|
98
|
+
const runToolCalls: NonNullable<AgentStep['toolCalls']> = []
|
|
102
99
|
|
|
103
100
|
const flushStep = async (opts?: { interrupted?: boolean }) => {
|
|
104
101
|
if (!storage) return
|
|
@@ -111,7 +108,7 @@ function createPersistingChannel(
|
|
|
111
108
|
stepToolCalls = []
|
|
112
109
|
stepToolResults = []
|
|
113
110
|
if (text || generativeUI != null || calls.length > 0) {
|
|
114
|
-
const assistantMsg:
|
|
111
|
+
const assistantMsg: AgentMessage = {
|
|
115
112
|
id: randomUUID(),
|
|
116
113
|
role: 'assistant',
|
|
117
114
|
content:
|
|
@@ -125,7 +122,7 @@ function createPersistingChannel(
|
|
|
125
122
|
...(opts?.interrupted ? { interrupted: true } : {}),
|
|
126
123
|
createdAt: new Date(),
|
|
127
124
|
}
|
|
128
|
-
const messages:
|
|
125
|
+
const messages: AgentMessage[] = [assistantMsg]
|
|
129
126
|
if (results.length > 0) {
|
|
130
127
|
messages.push({
|
|
131
128
|
id: randomUUID(),
|
|
@@ -167,7 +164,7 @@ function createPersistingChannel(
|
|
|
167
164
|
flush: flushStep,
|
|
168
165
|
close: () => parent.close(),
|
|
169
166
|
sendBinary: (data) => parent.sendBinary(data),
|
|
170
|
-
send: (event:
|
|
167
|
+
send: (event: AgentStreamEvent) => {
|
|
171
168
|
// Accumulated whether or not storage is configured: `fullText` is what
|
|
172
169
|
// the client was streamed, and an interrupted run has to be able to
|
|
173
170
|
// report the fragment it got through even with persistence turned off.
|
|
@@ -259,11 +256,11 @@ const warnedUnstreamedOutputHooks = new Set<string>()
|
|
|
259
256
|
*/
|
|
260
257
|
const warnUnstreamedOutputHooks = (
|
|
261
258
|
agentName: string,
|
|
262
|
-
|
|
259
|
+
agentMiddlewares: PikkuAgentMiddlewareHooks[],
|
|
263
260
|
logger?: { warn: (...args: any[]) => void }
|
|
264
261
|
) => {
|
|
265
262
|
if (warnedUnstreamedOutputHooks.has(agentName)) return
|
|
266
|
-
const unstreamed =
|
|
263
|
+
const unstreamed = agentMiddlewares.some(
|
|
267
264
|
(mw) => mw.modifyOutput && !mw.modifyOutputStream
|
|
268
265
|
)
|
|
269
266
|
if (!unstreamed) return
|
|
@@ -275,7 +272,7 @@ const warnUnstreamedOutputHooks = (
|
|
|
275
272
|
|
|
276
273
|
async function postStreamCleanup(
|
|
277
274
|
persistingChannel: PersistingChannel,
|
|
278
|
-
|
|
275
|
+
agentRunState: AgentRunStateService,
|
|
279
276
|
runId: string,
|
|
280
277
|
run: {
|
|
281
278
|
agentName: string
|
|
@@ -284,7 +281,7 @@ async function postStreamCleanup(
|
|
|
284
281
|
input: string
|
|
285
282
|
}
|
|
286
283
|
): Promise<void> {
|
|
287
|
-
await finalizeAgentRun(
|
|
284
|
+
await finalizeAgentRun(agentRunState, {
|
|
288
285
|
runId,
|
|
289
286
|
agentName: run.agentName,
|
|
290
287
|
threadId: run.threadId,
|
|
@@ -304,14 +301,14 @@ async function postStreamCleanup(
|
|
|
304
301
|
}
|
|
305
302
|
|
|
306
303
|
type StepLoopParams = {
|
|
307
|
-
agent:
|
|
308
|
-
runnerParams:
|
|
304
|
+
agent: CoreAgent
|
|
305
|
+
runnerParams: AgentRunnerParams
|
|
309
306
|
maxSteps: number
|
|
310
|
-
agentRunner:
|
|
311
|
-
streamChannel:
|
|
307
|
+
agentRunner: AgentRunnerService
|
|
308
|
+
streamChannel: AgentStreamChannel
|
|
312
309
|
persistingChannel: PersistingChannel
|
|
313
|
-
channel:
|
|
314
|
-
|
|
310
|
+
channel: AgentStreamChannel
|
|
311
|
+
agentMiddlewares: PikkuAgentMiddlewareHooks[]
|
|
315
312
|
}
|
|
316
313
|
|
|
317
314
|
type StepLoopResult =
|
|
@@ -329,7 +326,7 @@ async function runStreamStepLoop(
|
|
|
329
326
|
agentRunner,
|
|
330
327
|
streamChannel,
|
|
331
328
|
channel,
|
|
332
|
-
|
|
329
|
+
agentMiddlewares,
|
|
333
330
|
} = params
|
|
334
331
|
|
|
335
332
|
const singletonServices = getSingletonServices()
|
|
@@ -354,7 +351,7 @@ async function runStreamStepLoop(
|
|
|
354
351
|
|
|
355
352
|
const stepResult = await agentRunner.stream(runnerParams, streamChannel)
|
|
356
353
|
|
|
357
|
-
for (const mw of
|
|
354
|
+
for (const mw of agentMiddlewares) {
|
|
358
355
|
if (mw.afterStep) {
|
|
359
356
|
await mw.afterStep(singletonServices, {
|
|
360
357
|
stepNumber: step,
|
|
@@ -397,8 +394,8 @@ async function runStreamStepLoop(
|
|
|
397
394
|
}
|
|
398
395
|
|
|
399
396
|
export function checkForApprovals(
|
|
400
|
-
stepResult:
|
|
401
|
-
tools:
|
|
397
|
+
stepResult: AgentStepResult,
|
|
398
|
+
tools: AgentRunnerParams['tools']
|
|
402
399
|
): ToolApprovalRequired[] {
|
|
403
400
|
const approvals: ToolApprovalRequired[] = []
|
|
404
401
|
for (const tc of stepResult.toolCalls) {
|
|
@@ -471,11 +468,11 @@ export function checkForApprovals(
|
|
|
471
468
|
}
|
|
472
469
|
|
|
473
470
|
export function checkForCredentialRequests(
|
|
474
|
-
stepResult:
|
|
471
|
+
stepResult: AgentStepResult
|
|
475
472
|
): ToolCredentialRequired[] {
|
|
476
473
|
const requests: ToolCredentialRequired[] = []
|
|
477
474
|
for (const tr of stepResult.toolResults) {
|
|
478
|
-
// knowledge: decisions/security/
|
|
475
|
+
// knowledge: decisions/security/agent-credential-requests-are-symbol-branded.md
|
|
479
476
|
if (
|
|
480
477
|
tr.result &&
|
|
481
478
|
typeof tr.result === 'object' &&
|
|
@@ -505,8 +502,8 @@ export function checkForCredentialRequests(
|
|
|
505
502
|
}
|
|
506
503
|
|
|
507
504
|
export function appendStepMessages(
|
|
508
|
-
runnerParams:
|
|
509
|
-
stepResult:
|
|
505
|
+
runnerParams: AgentRunnerParams,
|
|
506
|
+
stepResult: AgentStepResult
|
|
510
507
|
): void {
|
|
511
508
|
const structuredOutput =
|
|
512
509
|
stepResult.object && typeof stepResult.object === 'object'
|
|
@@ -522,7 +519,7 @@ export function appendStepMessages(
|
|
|
522
519
|
]
|
|
523
520
|
: stepResult.text || undefined
|
|
524
521
|
|
|
525
|
-
const assistantMsg:
|
|
522
|
+
const assistantMsg: AgentMessage = {
|
|
526
523
|
id: randomUUID(),
|
|
527
524
|
role: 'assistant',
|
|
528
525
|
content: assistantContent,
|
|
@@ -542,7 +539,7 @@ export function appendStepMessages(
|
|
|
542
539
|
runnerParams.messages.push(assistantMsg)
|
|
543
540
|
|
|
544
541
|
if (stepResult.toolResults.length > 0) {
|
|
545
|
-
const toolMsg:
|
|
542
|
+
const toolMsg: AgentMessage = {
|
|
546
543
|
id: randomUUID(),
|
|
547
544
|
role: 'tool',
|
|
548
545
|
toolResults: stepResult.toolResults.map((tr) => ({
|
|
@@ -560,8 +557,8 @@ export function appendStepMessages(
|
|
|
560
557
|
function handleApprovals(
|
|
561
558
|
approvals: ToolApprovalRequired[],
|
|
562
559
|
runId: string,
|
|
563
|
-
channel:
|
|
564
|
-
|
|
560
|
+
channel: AgentStreamChannel,
|
|
561
|
+
agentRunState: AgentRunStateService,
|
|
565
562
|
persistingChannel: PersistingChannel
|
|
566
563
|
): Promise<void> {
|
|
567
564
|
return (async () => {
|
|
@@ -585,7 +582,7 @@ function handleApprovals(
|
|
|
585
582
|
}
|
|
586
583
|
)
|
|
587
584
|
|
|
588
|
-
await
|
|
585
|
+
await agentRunState.updateRun(runId, {
|
|
589
586
|
status: 'suspended',
|
|
590
587
|
suspendReason: 'approval',
|
|
591
588
|
pendingApprovals,
|
|
@@ -610,8 +607,8 @@ function handleApprovals(
|
|
|
610
607
|
function handleCredentialRequests(
|
|
611
608
|
requests: ToolCredentialRequired[],
|
|
612
609
|
runId: string,
|
|
613
|
-
channel:
|
|
614
|
-
|
|
610
|
+
channel: AgentStreamChannel,
|
|
611
|
+
agentRunState: AgentRunStateService,
|
|
615
612
|
persistingChannel: PersistingChannel
|
|
616
613
|
): Promise<void> {
|
|
617
614
|
return (async () => {
|
|
@@ -627,7 +624,7 @@ function handleCredentialRequests(
|
|
|
627
624
|
connectUrl: req.connectUrl,
|
|
628
625
|
}))
|
|
629
626
|
|
|
630
|
-
await
|
|
627
|
+
await agentRunState.updateRun(runId, {
|
|
631
628
|
status: 'suspended',
|
|
632
629
|
suspendReason: 'credential',
|
|
633
630
|
pendingApprovals,
|
|
@@ -650,7 +647,7 @@ function handleCredentialRequests(
|
|
|
650
647
|
})()
|
|
651
648
|
}
|
|
652
649
|
|
|
653
|
-
export async function
|
|
650
|
+
export async function streamAgent(
|
|
654
651
|
agentName: string,
|
|
655
652
|
input: {
|
|
656
653
|
message: string
|
|
@@ -659,10 +656,10 @@ export async function streamAIAgent(
|
|
|
659
656
|
model?: string
|
|
660
657
|
temperature?: number
|
|
661
658
|
},
|
|
662
|
-
channel:
|
|
663
|
-
params:
|
|
659
|
+
channel: AgentStreamChannel,
|
|
660
|
+
params: RunAgentParams,
|
|
664
661
|
agentSessionMap?: Map<string, string>,
|
|
665
|
-
options?:
|
|
662
|
+
options?: StreamAgentOptions
|
|
666
663
|
): Promise<string> {
|
|
667
664
|
const sessionMap = agentSessionMap ?? new Map<string, string>()
|
|
668
665
|
|
|
@@ -701,13 +698,13 @@ export async function streamAIAgent(
|
|
|
701
698
|
runnerParams.agentId = agentName
|
|
702
699
|
|
|
703
700
|
const singletonServices = getSingletonServices()
|
|
704
|
-
const {
|
|
705
|
-
if (!
|
|
706
|
-
throw new Error('
|
|
701
|
+
const { agentRunState } = singletonServices
|
|
702
|
+
if (!agentRunState) {
|
|
703
|
+
throw new Error('AgentRunStateService not available in singletonServices')
|
|
707
704
|
}
|
|
708
705
|
|
|
709
706
|
if (missingRpcs.length > 0) {
|
|
710
|
-
await
|
|
707
|
+
await agentRunState.createRun({
|
|
711
708
|
agentName,
|
|
712
709
|
threadId,
|
|
713
710
|
resourceId: normalizedInput.resourceId,
|
|
@@ -723,22 +720,22 @@ export async function streamAIAgent(
|
|
|
723
720
|
return ''
|
|
724
721
|
}
|
|
725
722
|
|
|
726
|
-
const
|
|
723
|
+
const agentMiddlewares: PikkuAgentMiddlewareHooks[] = [
|
|
727
724
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
728
725
|
threadId,
|
|
729
726
|
workingMemorySchemaName,
|
|
730
727
|
logger: singletonServices.logger,
|
|
731
728
|
schemaService: singletonServices.schema,
|
|
732
729
|
}),
|
|
733
|
-
...(agent.
|
|
730
|
+
...(agent.agentMiddleware ?? []),
|
|
734
731
|
]
|
|
735
732
|
|
|
736
|
-
// One bag per run, shared by every middleware — see
|
|
733
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
737
734
|
const sharedNotes: Record<string, unknown> = {}
|
|
738
735
|
|
|
739
736
|
const { messages: modifiedMessages, instructions: modifiedInstructions } =
|
|
740
737
|
await applyInputMiddleware(
|
|
741
|
-
|
|
738
|
+
agentMiddlewares,
|
|
742
739
|
singletonServices,
|
|
743
740
|
{
|
|
744
741
|
messages: runnerParams.messages,
|
|
@@ -760,7 +757,7 @@ export async function streamAIAgent(
|
|
|
760
757
|
const persistedUserMessage =
|
|
761
758
|
lastModified?.id === userMessage.id ? lastModified : userMessage
|
|
762
759
|
|
|
763
|
-
const runId = await
|
|
760
|
+
const runId = await agentRunState.createRun({
|
|
764
761
|
agentName,
|
|
765
762
|
threadId,
|
|
766
763
|
resourceId: normalizedInput.resourceId,
|
|
@@ -782,13 +779,17 @@ export async function streamAIAgent(
|
|
|
782
779
|
await storage.saveMessages(threadId, [persistedUserMessage])
|
|
783
780
|
}
|
|
784
781
|
|
|
785
|
-
warnUnstreamedOutputHooks(
|
|
782
|
+
warnUnstreamedOutputHooks(
|
|
783
|
+
agentName,
|
|
784
|
+
agentMiddlewares,
|
|
785
|
+
singletonServices.logger
|
|
786
|
+
)
|
|
786
787
|
|
|
787
|
-
const streamMiddleware =
|
|
788
|
+
const streamMiddleware = agentMiddlewares
|
|
788
789
|
.filter((mw) => mw.modifyOutputStream)
|
|
789
790
|
.map((mw) => {
|
|
790
791
|
const state: Record<string, unknown> = {}
|
|
791
|
-
const allEvents:
|
|
792
|
+
const allEvents: AgentStreamEvent[] = []
|
|
792
793
|
return async (services: any, event: any, next: any) => {
|
|
793
794
|
allEvents.push(event)
|
|
794
795
|
const result = await mw.modifyOutputStream!(services, {
|
|
@@ -837,13 +838,13 @@ export async function streamAIAgent(
|
|
|
837
838
|
{ channel: persistingChannel },
|
|
838
839
|
singletonServices,
|
|
839
840
|
allChannelMiddleware
|
|
840
|
-
).channel as
|
|
841
|
+
).channel as AgentStreamChannel)
|
|
841
842
|
: persistingChannel
|
|
842
843
|
|
|
843
|
-
const credentialFilteredChannel:
|
|
844
|
+
const credentialFilteredChannel: AgentStreamChannel = {
|
|
844
845
|
...wrappedChannel,
|
|
845
846
|
// knowledge: decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md
|
|
846
|
-
send: (event:
|
|
847
|
+
send: (event: AgentStreamEvent) => {
|
|
847
848
|
if (
|
|
848
849
|
event.type === 'tool-result' &&
|
|
849
850
|
event.result !== null &&
|
|
@@ -864,7 +865,7 @@ export async function streamAIAgent(
|
|
|
864
865
|
const outputChannel = isDelegateMode
|
|
865
866
|
? {
|
|
866
867
|
...credentialFilteredChannel,
|
|
867
|
-
send: (event:
|
|
868
|
+
send: (event: AgentStreamEvent) => {
|
|
868
869
|
if (
|
|
869
870
|
delegateState.delegated &&
|
|
870
871
|
(event.type === 'text-delta' || event.type === 'reasoning-delta')
|
|
@@ -885,7 +886,7 @@ export async function streamAIAgent(
|
|
|
885
886
|
streamChannel: outputChannel,
|
|
886
887
|
persistingChannel,
|
|
887
888
|
channel,
|
|
888
|
-
|
|
889
|
+
agentMiddlewares,
|
|
889
890
|
})
|
|
890
891
|
|
|
891
892
|
if (loopResult.outcome === 'approval') {
|
|
@@ -893,7 +894,7 @@ export async function streamAIAgent(
|
|
|
893
894
|
loopResult.approvals,
|
|
894
895
|
runId,
|
|
895
896
|
channel,
|
|
896
|
-
|
|
897
|
+
agentRunState,
|
|
897
898
|
persistingChannel
|
|
898
899
|
)
|
|
899
900
|
return persistingChannel.fullText
|
|
@@ -904,13 +905,13 @@ export async function streamAIAgent(
|
|
|
904
905
|
loopResult.credentialRequests,
|
|
905
906
|
runId,
|
|
906
907
|
channel,
|
|
907
|
-
|
|
908
|
+
agentRunState,
|
|
908
909
|
persistingChannel
|
|
909
910
|
)
|
|
910
911
|
return persistingChannel.fullText
|
|
911
912
|
}
|
|
912
913
|
|
|
913
|
-
await postStreamCleanup(persistingChannel,
|
|
914
|
+
await postStreamCleanup(persistingChannel, agentRunState, runId, {
|
|
914
915
|
agentName,
|
|
915
916
|
threadId,
|
|
916
917
|
resourceId: input.resourceId,
|
|
@@ -927,7 +928,7 @@ export async function streamAIAgent(
|
|
|
927
928
|
const interruption = interruptHandle.interruption
|
|
928
929
|
if (interruption || isAbortError(err)) {
|
|
929
930
|
await persistingChannel.flush({ interrupted: true })
|
|
930
|
-
await
|
|
931
|
+
await agentRunState.updateRun(runId, { status: 'interrupted' })
|
|
931
932
|
// Deliberately not awaited. A tool still running must not hold the stream
|
|
932
933
|
// open — the whole point of barge-in is that the agent stops now — so the
|
|
933
934
|
// note lands later and the next run on this thread waits for it instead.
|
|
@@ -948,7 +949,7 @@ export async function streamAIAgent(
|
|
|
948
949
|
return persistingChannel.fullText
|
|
949
950
|
}
|
|
950
951
|
|
|
951
|
-
for (const mw of
|
|
952
|
+
for (const mw of agentMiddlewares) {
|
|
952
953
|
if (mw.onError) {
|
|
953
954
|
try {
|
|
954
955
|
await mw.onError(singletonServices, {
|
|
@@ -959,7 +960,7 @@ export async function streamAIAgent(
|
|
|
959
960
|
} catch {}
|
|
960
961
|
}
|
|
961
962
|
}
|
|
962
|
-
await
|
|
963
|
+
await agentRunState.updateRun(runId, {
|
|
963
964
|
status: 'failed',
|
|
964
965
|
errorMessage: err instanceof Error ? err.message : String(err),
|
|
965
966
|
})
|
|
@@ -978,9 +979,9 @@ export async function streamAIAgent(
|
|
|
978
979
|
/**
|
|
979
980
|
* Stop an in-flight run on behalf of a caller, after checking the run is theirs.
|
|
980
981
|
*
|
|
981
|
-
* Unlike {@link
|
|
982
|
+
* Unlike {@link resumeAgent} this needs no channel: it does not continue the
|
|
982
983
|
* stream, it ends one. The `interrupted` event and the truncated message are
|
|
983
|
-
* emitted by the original {@link
|
|
984
|
+
* emitted by the original {@link streamAgent} call on its own channel, so this
|
|
984
985
|
* can be reached over a plain RPC while the stream is held open elsewhere —
|
|
985
986
|
* which is exactly the shape a voice barge-in needs.
|
|
986
987
|
*
|
|
@@ -993,16 +994,16 @@ export async function streamAIAgent(
|
|
|
993
994
|
* Returns `false` when there was nothing to stop. Racing a run that finishes on
|
|
994
995
|
* its own is the normal case in voice, so it is not an error.
|
|
995
996
|
*/
|
|
996
|
-
export async function
|
|
997
|
+
export async function interruptAgent(
|
|
997
998
|
input: { runId: string; reason?: AgentInterruption['reason'] },
|
|
998
|
-
params:
|
|
999
|
+
params: RunAgentParams
|
|
999
1000
|
): Promise<AgentInterruptResult> {
|
|
1000
|
-
const {
|
|
1001
|
-
if (!
|
|
1002
|
-
throw new Error('
|
|
1001
|
+
const { agentRunState, logger } = getSingletonServices()
|
|
1002
|
+
if (!agentRunState) {
|
|
1003
|
+
throw new Error('AgentRunStateService not available in singletonServices')
|
|
1003
1004
|
}
|
|
1004
1005
|
|
|
1005
|
-
const run = await
|
|
1006
|
+
const run = await agentRunState.getRun(input.runId)
|
|
1006
1007
|
if (!run) {
|
|
1007
1008
|
throw new Error(`No run found for runId ${input.runId}`)
|
|
1008
1009
|
}
|
|
@@ -1033,23 +1034,23 @@ export async function interruptAIAgent(
|
|
|
1033
1034
|
return { stopped, inFlightTools: getInFlightTools(input.runId) }
|
|
1034
1035
|
}
|
|
1035
1036
|
|
|
1036
|
-
export async function
|
|
1037
|
+
export async function resumeAgent(
|
|
1037
1038
|
input: {
|
|
1038
1039
|
runId: string
|
|
1039
1040
|
toolCallId: string
|
|
1040
1041
|
approved: boolean
|
|
1041
1042
|
},
|
|
1042
|
-
channel:
|
|
1043
|
-
params:
|
|
1044
|
-
options?:
|
|
1043
|
+
channel: AgentStreamChannel,
|
|
1044
|
+
params: RunAgentParams,
|
|
1045
|
+
options?: StreamAgentOptions
|
|
1045
1046
|
): Promise<void> {
|
|
1046
1047
|
const singletonServices = getSingletonServices()
|
|
1047
|
-
const {
|
|
1048
|
-
if (!
|
|
1049
|
-
throw new Error('
|
|
1048
|
+
const { agentRunState } = singletonServices
|
|
1049
|
+
if (!agentRunState) {
|
|
1050
|
+
throw new Error('AgentRunStateService not available in singletonServices')
|
|
1050
1051
|
}
|
|
1051
1052
|
|
|
1052
|
-
const run = await
|
|
1053
|
+
const run = await agentRunState.getRun(input.runId)
|
|
1053
1054
|
if (!run) {
|
|
1054
1055
|
throw new Error(`No run found for runId ${input.runId}`)
|
|
1055
1056
|
}
|
|
@@ -1076,7 +1077,7 @@ export async function resumeAIAgent(
|
|
|
1076
1077
|
// The read above is not a claim — concurrent resumes all see the same pending
|
|
1077
1078
|
// approval. `resolveApproval` is the claim, and the loser must not go on to
|
|
1078
1079
|
// run the tool a second time.
|
|
1079
|
-
const claimed = await
|
|
1080
|
+
const claimed = await agentRunState.resolveApproval(
|
|
1080
1081
|
input.toolCallId,
|
|
1081
1082
|
input.approved ? 'approved' : 'denied'
|
|
1082
1083
|
)
|
|
@@ -1088,18 +1089,17 @@ export async function resumeAIAgent(
|
|
|
1088
1089
|
|
|
1089
1090
|
const { storage } = resolveMemoryServices(agent, singletonServices)
|
|
1090
1091
|
const memoryConfig = agent.memory
|
|
1091
|
-
const agentRunner = singletonServices.
|
|
1092
|
+
const agentRunner = singletonServices.agentRunner
|
|
1092
1093
|
if (!agentRunner) {
|
|
1093
1094
|
throw new AIProviderNotConfiguredError()
|
|
1094
1095
|
}
|
|
1095
1096
|
|
|
1096
1097
|
if (!input.approved) {
|
|
1097
1098
|
if (pending.type === 'agent-call') {
|
|
1098
|
-
await
|
|
1099
|
+
await agentRunState.updateRun(pending.agentRunId, { status: 'failed' })
|
|
1099
1100
|
}
|
|
1100
1101
|
|
|
1101
|
-
const denialResult =
|
|
1102
|
-
'The user explicitly declined this action. Inform them that it was declined and do not retry.'
|
|
1102
|
+
const denialResult = deniedToolResult()
|
|
1103
1103
|
|
|
1104
1104
|
if (storage) {
|
|
1105
1105
|
await storage.saveMessages(run.threadId, [
|
|
@@ -1132,7 +1132,7 @@ export async function resumeAIAgent(
|
|
|
1132
1132
|
result: denialResult,
|
|
1133
1133
|
})
|
|
1134
1134
|
|
|
1135
|
-
const updatedRun = await
|
|
1135
|
+
const updatedRun = await agentRunState.getRun(run.runId)
|
|
1136
1136
|
const remaining = updatedRun?.pendingApprovals ?? []
|
|
1137
1137
|
|
|
1138
1138
|
if (remaining.length > 0) {
|
|
@@ -1141,7 +1141,7 @@ export async function resumeAIAgent(
|
|
|
1141
1141
|
return
|
|
1142
1142
|
}
|
|
1143
1143
|
|
|
1144
|
-
await
|
|
1144
|
+
await agentRunState.updateRun(run.runId, { status: 'running' })
|
|
1145
1145
|
|
|
1146
1146
|
await continueAfterToolResult(
|
|
1147
1147
|
run,
|
|
@@ -1153,14 +1153,14 @@ export async function resumeAIAgent(
|
|
|
1153
1153
|
agentRunner,
|
|
1154
1154
|
channel,
|
|
1155
1155
|
params,
|
|
1156
|
-
|
|
1156
|
+
agentRunState,
|
|
1157
1157
|
options
|
|
1158
1158
|
)
|
|
1159
1159
|
return
|
|
1160
1160
|
}
|
|
1161
1161
|
|
|
1162
1162
|
if (pending.type === 'agent-call') {
|
|
1163
|
-
const subRun = await
|
|
1163
|
+
const subRun = await agentRunState.getRun(pending.agentRunId)
|
|
1164
1164
|
if (!subRun) {
|
|
1165
1165
|
throw new Error(`Sub-agent run not found: ${pending.agentRunId}`)
|
|
1166
1166
|
}
|
|
@@ -1181,7 +1181,7 @@ export async function resumeAIAgent(
|
|
|
1181
1181
|
input: null,
|
|
1182
1182
|
})
|
|
1183
1183
|
|
|
1184
|
-
await
|
|
1184
|
+
await resumeAgent(
|
|
1185
1185
|
{
|
|
1186
1186
|
runId: pending.agentRunId,
|
|
1187
1187
|
toolCallId: subPending.toolCallId,
|
|
@@ -1220,8 +1220,8 @@ export async function resumeAIAgent(
|
|
|
1220
1220
|
channel,
|
|
1221
1221
|
options: { ...options, requiresToolApproval: false },
|
|
1222
1222
|
}
|
|
1223
|
-
const
|
|
1224
|
-
agent.
|
|
1223
|
+
const agentMiddlewaresForResume: PikkuAgentMiddlewareHooks[] =
|
|
1224
|
+
agent.agentMiddleware ?? []
|
|
1225
1225
|
const { tools } = await buildToolDefs(
|
|
1226
1226
|
params,
|
|
1227
1227
|
new Map<string, string>(),
|
|
@@ -1229,7 +1229,7 @@ export async function resumeAIAgent(
|
|
|
1229
1229
|
resolvedName,
|
|
1230
1230
|
packageName,
|
|
1231
1231
|
streamContext,
|
|
1232
|
-
|
|
1232
|
+
agentMiddlewaresForResume
|
|
1233
1233
|
)
|
|
1234
1234
|
|
|
1235
1235
|
const matchingTool = tools.find((t) => t.name === pending.toolName)
|
|
@@ -1284,7 +1284,7 @@ export async function resumeAIAgent(
|
|
|
1284
1284
|
})
|
|
1285
1285
|
}
|
|
1286
1286
|
|
|
1287
|
-
const updatedRun = await
|
|
1287
|
+
const updatedRun = await agentRunState.getRun(run.runId)
|
|
1288
1288
|
const remaining = updatedRun?.pendingApprovals ?? []
|
|
1289
1289
|
|
|
1290
1290
|
if (remaining.length > 0) {
|
|
@@ -1293,7 +1293,7 @@ export async function resumeAIAgent(
|
|
|
1293
1293
|
return
|
|
1294
1294
|
}
|
|
1295
1295
|
|
|
1296
|
-
await
|
|
1296
|
+
await agentRunState.updateRun(run.runId, { status: 'running' })
|
|
1297
1297
|
|
|
1298
1298
|
await continueAfterToolResult(
|
|
1299
1299
|
run,
|
|
@@ -1305,23 +1305,23 @@ export async function resumeAIAgent(
|
|
|
1305
1305
|
agentRunner,
|
|
1306
1306
|
channel,
|
|
1307
1307
|
params,
|
|
1308
|
-
|
|
1308
|
+
agentRunState,
|
|
1309
1309
|
options
|
|
1310
1310
|
)
|
|
1311
1311
|
}
|
|
1312
1312
|
|
|
1313
1313
|
async function continueAfterToolResult(
|
|
1314
1314
|
run: AgentRunState,
|
|
1315
|
-
agent:
|
|
1315
|
+
agent: CoreAgent,
|
|
1316
1316
|
packageName: string | null,
|
|
1317
1317
|
resolvedName: string,
|
|
1318
|
-
storage:
|
|
1319
|
-
memoryConfig:
|
|
1320
|
-
agentRunner:
|
|
1321
|
-
channel:
|
|
1322
|
-
params:
|
|
1323
|
-
|
|
1324
|
-
options?:
|
|
1318
|
+
storage: AgentStorageService | undefined,
|
|
1319
|
+
memoryConfig: AgentMemoryConfig | undefined,
|
|
1320
|
+
agentRunner: AgentRunnerService,
|
|
1321
|
+
channel: AgentStreamChannel,
|
|
1322
|
+
params: RunAgentParams,
|
|
1323
|
+
agentRunState: AgentRunStateService,
|
|
1324
|
+
options?: StreamAgentOptions
|
|
1325
1325
|
): Promise<void> {
|
|
1326
1326
|
const singletonServices = getSingletonServices()
|
|
1327
1327
|
const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta')
|
|
@@ -1350,21 +1350,21 @@ async function continueAfterToolResult(
|
|
|
1350
1350
|
|
|
1351
1351
|
const instructions = await buildInstructions(resolvedName, packageName)
|
|
1352
1352
|
|
|
1353
|
-
const
|
|
1353
|
+
const agentMiddlewares: PikkuAgentMiddlewareHooks[] = [
|
|
1354
1354
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
1355
1355
|
threadId: run.threadId,
|
|
1356
1356
|
workingMemorySchemaName,
|
|
1357
1357
|
logger: singletonServices.logger,
|
|
1358
1358
|
schemaService: singletonServices.schema,
|
|
1359
1359
|
}),
|
|
1360
|
-
...(agent.
|
|
1360
|
+
...(agent.agentMiddleware ?? []),
|
|
1361
1361
|
]
|
|
1362
|
-
// One bag per run, shared by every middleware — see
|
|
1362
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
1363
1363
|
const sharedNotes: Record<string, unknown> = {}
|
|
1364
1364
|
|
|
1365
1365
|
const { messages: modifiedMessages, instructions: modifiedInstructions } =
|
|
1366
1366
|
await applyInputMiddleware(
|
|
1367
|
-
|
|
1367
|
+
agentMiddlewares,
|
|
1368
1368
|
singletonServices,
|
|
1369
1369
|
{ messages: trimmedMessages, instructions: instructions },
|
|
1370
1370
|
sharedNotes
|
|
@@ -1375,15 +1375,15 @@ async function continueAfterToolResult(
|
|
|
1375
1375
|
|
|
1376
1376
|
warnUnstreamedOutputHooks(
|
|
1377
1377
|
run.agentName,
|
|
1378
|
-
|
|
1378
|
+
agentMiddlewares,
|
|
1379
1379
|
singletonServices.logger
|
|
1380
1380
|
)
|
|
1381
1381
|
|
|
1382
|
-
const streamMiddleware =
|
|
1382
|
+
const streamMiddleware = agentMiddlewares
|
|
1383
1383
|
.filter((mw) => mw.modifyOutputStream)
|
|
1384
1384
|
.map((mw) => {
|
|
1385
1385
|
const state: Record<string, unknown> = {}
|
|
1386
|
-
const allEvents:
|
|
1386
|
+
const allEvents: AgentStreamEvent[] = []
|
|
1387
1387
|
return async (services: any, event: any, next: any) => {
|
|
1388
1388
|
allEvents.push(event)
|
|
1389
1389
|
const result = await mw.modifyOutputStream!(services, {
|
|
@@ -1430,7 +1430,7 @@ async function continueAfterToolResult(
|
|
|
1430
1430
|
{ channel: persistingChannel },
|
|
1431
1431
|
singletonServices,
|
|
1432
1432
|
allChannelMiddleware
|
|
1433
|
-
).channel as
|
|
1433
|
+
).channel as AgentStreamChannel)
|
|
1434
1434
|
: persistingChannel
|
|
1435
1435
|
|
|
1436
1436
|
const streamContext: StreamContext = { channel, options }
|
|
@@ -1442,14 +1442,14 @@ async function continueAfterToolResult(
|
|
|
1442
1442
|
resolvedName,
|
|
1443
1443
|
packageName,
|
|
1444
1444
|
streamContext,
|
|
1445
|
-
|
|
1445
|
+
agentMiddlewares
|
|
1446
1446
|
)
|
|
1447
1447
|
).tools
|
|
1448
1448
|
|
|
1449
1449
|
const resolved = resolveModelConfig(resolvedName, agent)
|
|
1450
1450
|
const maxSteps = resolved.maxSteps ?? 10
|
|
1451
1451
|
|
|
1452
|
-
const runnerParams:
|
|
1452
|
+
const runnerParams: AgentRunnerParams = {
|
|
1453
1453
|
model: resolved.model,
|
|
1454
1454
|
temperature: resolved.temperature,
|
|
1455
1455
|
instructions: modifiedInstructions,
|
|
@@ -1475,7 +1475,7 @@ async function continueAfterToolResult(
|
|
|
1475
1475
|
streamChannel: wrappedChannel,
|
|
1476
1476
|
persistingChannel,
|
|
1477
1477
|
channel,
|
|
1478
|
-
|
|
1478
|
+
agentMiddlewares,
|
|
1479
1479
|
})
|
|
1480
1480
|
|
|
1481
1481
|
if (loopResult.outcome === 'approval') {
|
|
@@ -1483,7 +1483,7 @@ async function continueAfterToolResult(
|
|
|
1483
1483
|
loopResult.approvals,
|
|
1484
1484
|
run.runId,
|
|
1485
1485
|
channel,
|
|
1486
|
-
|
|
1486
|
+
agentRunState,
|
|
1487
1487
|
persistingChannel
|
|
1488
1488
|
)
|
|
1489
1489
|
return
|
|
@@ -1494,13 +1494,13 @@ async function continueAfterToolResult(
|
|
|
1494
1494
|
loopResult.credentialRequests,
|
|
1495
1495
|
run.runId,
|
|
1496
1496
|
channel,
|
|
1497
|
-
|
|
1497
|
+
agentRunState,
|
|
1498
1498
|
persistingChannel
|
|
1499
1499
|
)
|
|
1500
1500
|
return
|
|
1501
1501
|
}
|
|
1502
1502
|
|
|
1503
|
-
await postStreamCleanup(persistingChannel,
|
|
1503
|
+
await postStreamCleanup(persistingChannel, agentRunState, run.runId, {
|
|
1504
1504
|
...run,
|
|
1505
1505
|
input: lastUserMessageText(runnerParams.messages),
|
|
1506
1506
|
})
|
|
@@ -1514,7 +1514,7 @@ async function continueAfterToolResult(
|
|
|
1514
1514
|
const interruption = interruptHandle.interruption
|
|
1515
1515
|
if (interruption || isAbortError(err)) {
|
|
1516
1516
|
await persistingChannel.flush({ interrupted: true })
|
|
1517
|
-
await
|
|
1517
|
+
await agentRunState.updateRun(run.runId, { status: 'interrupted' })
|
|
1518
1518
|
if (storage) {
|
|
1519
1519
|
trackInterruptNote(
|
|
1520
1520
|
run.threadId,
|
|
@@ -1532,7 +1532,7 @@ async function continueAfterToolResult(
|
|
|
1532
1532
|
return
|
|
1533
1533
|
}
|
|
1534
1534
|
|
|
1535
|
-
for (const mw of
|
|
1535
|
+
for (const mw of agentMiddlewares) {
|
|
1536
1536
|
if (mw.onError) {
|
|
1537
1537
|
try {
|
|
1538
1538
|
await mw.onError(singletonServices, {
|
|
@@ -1543,7 +1543,7 @@ async function continueAfterToolResult(
|
|
|
1543
1543
|
} catch {}
|
|
1544
1544
|
}
|
|
1545
1545
|
}
|
|
1546
|
-
await
|
|
1546
|
+
await agentRunState.updateRun(run.runId, {
|
|
1547
1547
|
status: 'failed',
|
|
1548
1548
|
errorMessage: err instanceof Error ? err.message : String(err),
|
|
1549
1549
|
})
|