@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,14 +1,14 @@
|
|
|
1
|
-
import { finalizeAgentRun, lastUserMessageText
|
|
1
|
+
import { finalizeAgentRun, lastUserMessageText } from './agent-finalize.js';
|
|
2
2
|
import { pikkuState, getSingletonServices } from '../../pikku-state.js';
|
|
3
|
-
import { applyInputMiddleware } from './
|
|
3
|
+
import { applyInputMiddleware } from './agent-turn.js';
|
|
4
4
|
import { AIProviderNotConfiguredError } from '../../errors/errors.js';
|
|
5
|
-
import { randomUUID } from './
|
|
5
|
+
import { deniedToolResult, randomUUID } from './agent-utils.js';
|
|
6
6
|
import { SPOKEN_TRANSCRIPT } from './voice-input.js';
|
|
7
7
|
import { combineChannelMiddleware, wrapChannelWithMiddleware, } from '../channel/channel-middleware-runner.js';
|
|
8
|
-
import { resolveMemoryServices, loadContextMessages, trimMessages, getWorkingMemoryMiddleware, } from './
|
|
9
|
-
import { prepareAgentRun, resolveAgent, buildInstructions, buildToolDefs, createScopedChannel, resolveOwnerResourceId, agentSessionScope, assertResourceOwner, assertResourcePrincipalOwner, assertAgentAuthorized, ToolApprovalRequired, ToolCredentialRequired, APPROVAL_REQUIRED, CREDENTIAL_REQUIRED, } from './
|
|
10
|
-
import { resolveModelConfig } from './
|
|
11
|
-
import { getInFlightTools, isAbortError, persistOrphanedToolResults, registerInterruptibleRun, signalRunInterrupt, trackInterruptNote, trackToolExecution, } from './
|
|
8
|
+
import { resolveMemoryServices, loadContextMessages, trimMessages, getWorkingMemoryMiddleware, } from './agent-memory.js';
|
|
9
|
+
import { prepareAgentRun, resolveAgent, buildInstructions, buildToolDefs, createScopedChannel, resolveOwnerResourceId, agentSessionScope, assertResourceOwner, assertResourcePrincipalOwner, assertAgentAuthorized, ToolApprovalRequired, ToolCredentialRequired, APPROVAL_REQUIRED, CREDENTIAL_REQUIRED, } from './agent-prepare.js';
|
|
10
|
+
import { resolveModelConfig } from './agent-model-config.js';
|
|
11
|
+
import { getInFlightTools, isAbortError, persistOrphanedToolResults, registerInterruptibleRun, signalRunInterrupt, trackInterruptNote, trackToolExecution, } from './agent-interrupt.js';
|
|
12
12
|
function createPersistingChannel(parent, storage, threadId, logger) {
|
|
13
13
|
let fullText = '';
|
|
14
14
|
let stepText = '';
|
|
@@ -175,17 +175,17 @@ const warnedUnstreamedOutputHooks = new Set();
|
|
|
175
175
|
* rewrites in `modifyOutput` only — a redaction hook, typically — is therefore
|
|
176
176
|
* silently ineffective when the agent is streamed, and is told so once.
|
|
177
177
|
*/
|
|
178
|
-
const warnUnstreamedOutputHooks = (agentName,
|
|
178
|
+
const warnUnstreamedOutputHooks = (agentName, agentMiddlewares, logger) => {
|
|
179
179
|
if (warnedUnstreamedOutputHooks.has(agentName))
|
|
180
180
|
return;
|
|
181
|
-
const unstreamed =
|
|
181
|
+
const unstreamed = agentMiddlewares.some((mw) => mw.modifyOutput && !mw.modifyOutputStream);
|
|
182
182
|
if (!unstreamed)
|
|
183
183
|
return;
|
|
184
184
|
warnedUnstreamedOutputHooks.add(agentName);
|
|
185
185
|
logger?.warn(`Agent '${agentName}' has AI middleware with modifyOutput but no modifyOutputStream — modifyOutput does not apply to streamed runs. Implement modifyOutputStream to affect a streamed reply.`);
|
|
186
186
|
};
|
|
187
|
-
async function postStreamCleanup(persistingChannel,
|
|
188
|
-
await finalizeAgentRun(
|
|
187
|
+
async function postStreamCleanup(persistingChannel, agentRunState, runId, run) {
|
|
188
|
+
await finalizeAgentRun(agentRunState, {
|
|
189
189
|
runId,
|
|
190
190
|
agentName: run.agentName,
|
|
191
191
|
threadId: run.threadId,
|
|
@@ -204,7 +204,7 @@ async function postStreamCleanup(persistingChannel, aiRunState, runId, run) {
|
|
|
204
204
|
});
|
|
205
205
|
}
|
|
206
206
|
async function runStreamStepLoop(params) {
|
|
207
|
-
const { agent, runnerParams, maxSteps, agentRunner, streamChannel, channel,
|
|
207
|
+
const { agent, runnerParams, maxSteps, agentRunner, streamChannel, channel, agentMiddlewares, } = params;
|
|
208
208
|
const singletonServices = getSingletonServices();
|
|
209
209
|
for (let step = 0; step < maxSteps; step++) {
|
|
210
210
|
if (agent.prepareStep) {
|
|
@@ -224,7 +224,7 @@ async function runStreamStepLoop(params) {
|
|
|
224
224
|
}
|
|
225
225
|
channel.send({ type: 'step-start', stepNumber: step });
|
|
226
226
|
const stepResult = await agentRunner.stream(runnerParams, streamChannel);
|
|
227
|
-
for (const mw of
|
|
227
|
+
for (const mw of agentMiddlewares) {
|
|
228
228
|
if (mw.afterStep) {
|
|
229
229
|
await mw.afterStep(singletonServices, {
|
|
230
230
|
stepNumber: step,
|
|
@@ -291,7 +291,7 @@ export function checkForApprovals(stepResult, tools) {
|
|
|
291
291
|
export function checkForCredentialRequests(stepResult) {
|
|
292
292
|
const requests = [];
|
|
293
293
|
for (const tr of stepResult.toolResults) {
|
|
294
|
-
// knowledge: decisions/security/
|
|
294
|
+
// knowledge: decisions/security/agent-credential-requests-are-symbol-branded.md
|
|
295
295
|
if (tr.result &&
|
|
296
296
|
typeof tr.result === 'object' &&
|
|
297
297
|
CREDENTIAL_REQUIRED in tr.result) {
|
|
@@ -345,7 +345,7 @@ export function appendStepMessages(runnerParams, stepResult) {
|
|
|
345
345
|
runnerParams.messages.push(toolMsg);
|
|
346
346
|
}
|
|
347
347
|
}
|
|
348
|
-
function handleApprovals(approvals, runId, channel,
|
|
348
|
+
function handleApprovals(approvals, runId, channel, agentRunState, persistingChannel) {
|
|
349
349
|
return (async () => {
|
|
350
350
|
await persistingChannel.flush();
|
|
351
351
|
const pendingApprovals = approvals.map((err) => err.agentRunId
|
|
@@ -363,7 +363,7 @@ function handleApprovals(approvals, runId, channel, aiRunState, persistingChanne
|
|
|
363
363
|
toolName: err.toolName,
|
|
364
364
|
args: err.args,
|
|
365
365
|
});
|
|
366
|
-
await
|
|
366
|
+
await agentRunState.updateRun(runId, {
|
|
367
367
|
status: 'suspended',
|
|
368
368
|
suspendReason: 'approval',
|
|
369
369
|
pendingApprovals,
|
|
@@ -383,7 +383,7 @@ function handleApprovals(approvals, runId, channel, aiRunState, persistingChanne
|
|
|
383
383
|
channel.close();
|
|
384
384
|
})();
|
|
385
385
|
}
|
|
386
|
-
function handleCredentialRequests(requests, runId, channel,
|
|
386
|
+
function handleCredentialRequests(requests, runId, channel, agentRunState, persistingChannel) {
|
|
387
387
|
return (async () => {
|
|
388
388
|
await persistingChannel.flush();
|
|
389
389
|
const pendingApprovals = requests.map((req) => ({
|
|
@@ -395,7 +395,7 @@ function handleCredentialRequests(requests, runId, channel, aiRunState, persisti
|
|
|
395
395
|
credentialType: req.credentialType,
|
|
396
396
|
connectUrl: req.connectUrl,
|
|
397
397
|
}));
|
|
398
|
-
await
|
|
398
|
+
await agentRunState.updateRun(runId, {
|
|
399
399
|
status: 'suspended',
|
|
400
400
|
suspendReason: 'credential',
|
|
401
401
|
pendingApprovals,
|
|
@@ -416,7 +416,7 @@ function handleCredentialRequests(requests, runId, channel, aiRunState, persisti
|
|
|
416
416
|
channel.close();
|
|
417
417
|
})();
|
|
418
418
|
}
|
|
419
|
-
export async function
|
|
419
|
+
export async function streamAgent(agentName, input, channel, params, agentSessionMap, options) {
|
|
420
420
|
const sessionMap = agentSessionMap ?? new Map();
|
|
421
421
|
const normalizedInput = {
|
|
422
422
|
...input,
|
|
@@ -426,12 +426,12 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
426
426
|
const { agent, packageName, resolvedName, agentRunner, storage, memoryConfig, threadId, userMessage, runnerParams, maxSteps, missingRpcs, workingMemorySchemaName, } = await prepareAgentRun(agentName, normalizedInput, params, sessionMap, streamContext);
|
|
427
427
|
runnerParams.agentId = agentName;
|
|
428
428
|
const singletonServices = getSingletonServices();
|
|
429
|
-
const {
|
|
430
|
-
if (!
|
|
431
|
-
throw new Error('
|
|
429
|
+
const { agentRunState } = singletonServices;
|
|
430
|
+
if (!agentRunState) {
|
|
431
|
+
throw new Error('AgentRunStateService not available in singletonServices');
|
|
432
432
|
}
|
|
433
433
|
if (missingRpcs.length > 0) {
|
|
434
|
-
await
|
|
434
|
+
await agentRunState.createRun({
|
|
435
435
|
agentName,
|
|
436
436
|
threadId,
|
|
437
437
|
resourceId: normalizedInput.resourceId,
|
|
@@ -446,18 +446,18 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
446
446
|
channel.send({ type: 'done' });
|
|
447
447
|
return '';
|
|
448
448
|
}
|
|
449
|
-
const
|
|
449
|
+
const agentMiddlewares = [
|
|
450
450
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
451
451
|
threadId,
|
|
452
452
|
workingMemorySchemaName,
|
|
453
453
|
logger: singletonServices.logger,
|
|
454
454
|
schemaService: singletonServices.schema,
|
|
455
455
|
}),
|
|
456
|
-
...(agent.
|
|
456
|
+
...(agent.agentMiddleware ?? []),
|
|
457
457
|
];
|
|
458
|
-
// One bag per run, shared by every middleware — see
|
|
458
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
459
459
|
const sharedNotes = {};
|
|
460
|
-
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(
|
|
460
|
+
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(agentMiddlewares, singletonServices, {
|
|
461
461
|
messages: runnerParams.messages,
|
|
462
462
|
instructions: runnerParams.instructions,
|
|
463
463
|
}, sharedNotes);
|
|
@@ -471,7 +471,7 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
471
471
|
// knowledge: decisions/internals/thread-history-records-the-transcript-not-the-audio.md
|
|
472
472
|
const lastModified = modifiedMessages[modifiedMessages.length - 1];
|
|
473
473
|
const persistedUserMessage = lastModified?.id === userMessage.id ? lastModified : userMessage;
|
|
474
|
-
const runId = await
|
|
474
|
+
const runId = await agentRunState.createRun({
|
|
475
475
|
agentName,
|
|
476
476
|
threadId,
|
|
477
477
|
resourceId: normalizedInput.resourceId,
|
|
@@ -490,8 +490,8 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
490
490
|
if (storage) {
|
|
491
491
|
await storage.saveMessages(threadId, [persistedUserMessage]);
|
|
492
492
|
}
|
|
493
|
-
warnUnstreamedOutputHooks(agentName,
|
|
494
|
-
const streamMiddleware =
|
|
493
|
+
warnUnstreamedOutputHooks(agentName, agentMiddlewares, singletonServices.logger);
|
|
494
|
+
const streamMiddleware = agentMiddlewares
|
|
495
495
|
.filter((mw) => mw.modifyOutputStream)
|
|
496
496
|
.map((mw) => {
|
|
497
497
|
const state = {};
|
|
@@ -571,17 +571,17 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
571
571
|
streamChannel: outputChannel,
|
|
572
572
|
persistingChannel,
|
|
573
573
|
channel,
|
|
574
|
-
|
|
574
|
+
agentMiddlewares,
|
|
575
575
|
});
|
|
576
576
|
if (loopResult.outcome === 'approval') {
|
|
577
|
-
await handleApprovals(loopResult.approvals, runId, channel,
|
|
577
|
+
await handleApprovals(loopResult.approvals, runId, channel, agentRunState, persistingChannel);
|
|
578
578
|
return persistingChannel.fullText;
|
|
579
579
|
}
|
|
580
580
|
if (loopResult.outcome === 'credential') {
|
|
581
|
-
await handleCredentialRequests(loopResult.credentialRequests, runId, channel,
|
|
581
|
+
await handleCredentialRequests(loopResult.credentialRequests, runId, channel, agentRunState, persistingChannel);
|
|
582
582
|
return persistingChannel.fullText;
|
|
583
583
|
}
|
|
584
|
-
await postStreamCleanup(persistingChannel,
|
|
584
|
+
await postStreamCleanup(persistingChannel, agentRunState, runId, {
|
|
585
585
|
agentName,
|
|
586
586
|
threadId,
|
|
587
587
|
resourceId: input.resourceId,
|
|
@@ -598,7 +598,7 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
598
598
|
const interruption = interruptHandle.interruption;
|
|
599
599
|
if (interruption || isAbortError(err)) {
|
|
600
600
|
await persistingChannel.flush({ interrupted: true });
|
|
601
|
-
await
|
|
601
|
+
await agentRunState.updateRun(runId, { status: 'interrupted' });
|
|
602
602
|
// Deliberately not awaited. A tool still running must not hold the stream
|
|
603
603
|
// open — the whole point of barge-in is that the agent stops now — so the
|
|
604
604
|
// note lands later and the next run on this thread waits for it instead.
|
|
@@ -615,7 +615,7 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
615
615
|
channel.close();
|
|
616
616
|
return persistingChannel.fullText;
|
|
617
617
|
}
|
|
618
|
-
for (const mw of
|
|
618
|
+
for (const mw of agentMiddlewares) {
|
|
619
619
|
if (mw.onError) {
|
|
620
620
|
try {
|
|
621
621
|
await mw.onError(singletonServices, {
|
|
@@ -627,7 +627,7 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
627
627
|
catch { }
|
|
628
628
|
}
|
|
629
629
|
}
|
|
630
|
-
await
|
|
630
|
+
await agentRunState.updateRun(runId, {
|
|
631
631
|
status: 'failed',
|
|
632
632
|
errorMessage: err instanceof Error ? err.message : String(err),
|
|
633
633
|
});
|
|
@@ -646,9 +646,9 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
646
646
|
/**
|
|
647
647
|
* Stop an in-flight run on behalf of a caller, after checking the run is theirs.
|
|
648
648
|
*
|
|
649
|
-
* Unlike {@link
|
|
649
|
+
* Unlike {@link resumeAgent} this needs no channel: it does not continue the
|
|
650
650
|
* stream, it ends one. The `interrupted` event and the truncated message are
|
|
651
|
-
* emitted by the original {@link
|
|
651
|
+
* emitted by the original {@link streamAgent} call on its own channel, so this
|
|
652
652
|
* can be reached over a plain RPC while the stream is held open elsewhere —
|
|
653
653
|
* which is exactly the shape a voice barge-in needs.
|
|
654
654
|
*
|
|
@@ -661,12 +661,12 @@ export async function streamAIAgent(agentName, input, channel, params, agentSess
|
|
|
661
661
|
* Returns `false` when there was nothing to stop. Racing a run that finishes on
|
|
662
662
|
* its own is the normal case in voice, so it is not an error.
|
|
663
663
|
*/
|
|
664
|
-
export async function
|
|
665
|
-
const {
|
|
666
|
-
if (!
|
|
667
|
-
throw new Error('
|
|
664
|
+
export async function interruptAgent(input, params) {
|
|
665
|
+
const { agentRunState, logger } = getSingletonServices();
|
|
666
|
+
if (!agentRunState) {
|
|
667
|
+
throw new Error('AgentRunStateService not available in singletonServices');
|
|
668
668
|
}
|
|
669
|
-
const run = await
|
|
669
|
+
const run = await agentRunState.getRun(input.runId);
|
|
670
670
|
if (!run) {
|
|
671
671
|
throw new Error(`No run found for runId ${input.runId}`);
|
|
672
672
|
}
|
|
@@ -683,13 +683,13 @@ export async function interruptAIAgent(input, params) {
|
|
|
683
683
|
// model call does nothing to a tool already executing.
|
|
684
684
|
return { stopped, inFlightTools: getInFlightTools(input.runId) };
|
|
685
685
|
}
|
|
686
|
-
export async function
|
|
686
|
+
export async function resumeAgent(input, channel, params, options) {
|
|
687
687
|
const singletonServices = getSingletonServices();
|
|
688
|
-
const {
|
|
689
|
-
if (!
|
|
690
|
-
throw new Error('
|
|
688
|
+
const { agentRunState } = singletonServices;
|
|
689
|
+
if (!agentRunState) {
|
|
690
|
+
throw new Error('AgentRunStateService not available in singletonServices');
|
|
691
691
|
}
|
|
692
|
-
const run = await
|
|
692
|
+
const run = await agentRunState.getRun(input.runId);
|
|
693
693
|
if (!run) {
|
|
694
694
|
throw new Error(`No run found for runId ${input.runId}`);
|
|
695
695
|
}
|
|
@@ -703,21 +703,21 @@ export async function resumeAIAgent(input, channel, params, options) {
|
|
|
703
703
|
// The read above is not a claim — concurrent resumes all see the same pending
|
|
704
704
|
// approval. `resolveApproval` is the claim, and the loser must not go on to
|
|
705
705
|
// run the tool a second time.
|
|
706
|
-
const claimed = await
|
|
706
|
+
const claimed = await agentRunState.resolveApproval(input.toolCallId, input.approved ? 'approved' : 'denied');
|
|
707
707
|
if (!claimed) {
|
|
708
708
|
throw new Error(`Approval for toolCallId ${input.toolCallId} was already resolved by another caller`);
|
|
709
709
|
}
|
|
710
710
|
const { storage } = resolveMemoryServices(agent, singletonServices);
|
|
711
711
|
const memoryConfig = agent.memory;
|
|
712
|
-
const agentRunner = singletonServices.
|
|
712
|
+
const agentRunner = singletonServices.agentRunner;
|
|
713
713
|
if (!agentRunner) {
|
|
714
714
|
throw new AIProviderNotConfiguredError();
|
|
715
715
|
}
|
|
716
716
|
if (!input.approved) {
|
|
717
717
|
if (pending.type === 'agent-call') {
|
|
718
|
-
await
|
|
718
|
+
await agentRunState.updateRun(pending.agentRunId, { status: 'failed' });
|
|
719
719
|
}
|
|
720
|
-
const denialResult =
|
|
720
|
+
const denialResult = deniedToolResult();
|
|
721
721
|
if (storage) {
|
|
722
722
|
await storage.saveMessages(run.threadId, [
|
|
723
723
|
{
|
|
@@ -745,19 +745,19 @@ export async function resumeAIAgent(input, channel, params, options) {
|
|
|
745
745
|
: pending.agentName,
|
|
746
746
|
result: denialResult,
|
|
747
747
|
});
|
|
748
|
-
const updatedRun = await
|
|
748
|
+
const updatedRun = await agentRunState.getRun(run.runId);
|
|
749
749
|
const remaining = updatedRun?.pendingApprovals ?? [];
|
|
750
750
|
if (remaining.length > 0) {
|
|
751
751
|
channel.send({ type: 'done' });
|
|
752
752
|
channel.close();
|
|
753
753
|
return;
|
|
754
754
|
}
|
|
755
|
-
await
|
|
756
|
-
await continueAfterToolResult(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, channel, params,
|
|
755
|
+
await agentRunState.updateRun(run.runId, { status: 'running' });
|
|
756
|
+
await continueAfterToolResult(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, channel, params, agentRunState, options);
|
|
757
757
|
return;
|
|
758
758
|
}
|
|
759
759
|
if (pending.type === 'agent-call') {
|
|
760
|
-
const subRun = await
|
|
760
|
+
const subRun = await agentRunState.getRun(pending.agentRunId);
|
|
761
761
|
if (!subRun) {
|
|
762
762
|
throw new Error(`Sub-agent run not found: ${pending.agentRunId}`);
|
|
763
763
|
}
|
|
@@ -773,7 +773,7 @@ export async function resumeAIAgent(input, channel, params, options) {
|
|
|
773
773
|
session: 'resume',
|
|
774
774
|
input: null,
|
|
775
775
|
});
|
|
776
|
-
await
|
|
776
|
+
await resumeAgent({
|
|
777
777
|
runId: pending.agentRunId,
|
|
778
778
|
toolCallId: subPending.toolCallId,
|
|
779
779
|
approved: true,
|
|
@@ -806,8 +806,8 @@ export async function resumeAIAgent(input, channel, params, options) {
|
|
|
806
806
|
channel,
|
|
807
807
|
options: { ...options, requiresToolApproval: false },
|
|
808
808
|
};
|
|
809
|
-
const
|
|
810
|
-
const { tools } = await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, streamContext,
|
|
809
|
+
const agentMiddlewaresForResume = agent.agentMiddleware ?? [];
|
|
810
|
+
const { tools } = await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, streamContext, agentMiddlewaresForResume);
|
|
811
811
|
const matchingTool = tools.find((t) => t.name === pending.toolName);
|
|
812
812
|
if (!matchingTool) {
|
|
813
813
|
throw new Error(`Tool "${pending.toolName}" not found in agent definition`);
|
|
@@ -853,17 +853,17 @@ export async function resumeAIAgent(input, channel, params, options) {
|
|
|
853
853
|
...(toolError ? { error: toolError } : {}),
|
|
854
854
|
});
|
|
855
855
|
}
|
|
856
|
-
const updatedRun = await
|
|
856
|
+
const updatedRun = await agentRunState.getRun(run.runId);
|
|
857
857
|
const remaining = updatedRun?.pendingApprovals ?? [];
|
|
858
858
|
if (remaining.length > 0) {
|
|
859
859
|
channel.send({ type: 'done' });
|
|
860
860
|
channel.close();
|
|
861
861
|
return;
|
|
862
862
|
}
|
|
863
|
-
await
|
|
864
|
-
await continueAfterToolResult(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, channel, params,
|
|
863
|
+
await agentRunState.updateRun(run.runId, { status: 'running' });
|
|
864
|
+
await continueAfterToolResult(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, channel, params, agentRunState, options);
|
|
865
865
|
}
|
|
866
|
-
async function continueAfterToolResult(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, channel, params,
|
|
866
|
+
async function continueAfterToolResult(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, channel, params, agentRunState, options) {
|
|
867
867
|
const singletonServices = getSingletonServices();
|
|
868
868
|
const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta');
|
|
869
869
|
const meta = agentsMeta[resolvedName];
|
|
@@ -880,22 +880,22 @@ async function continueAfterToolResult(run, agent, packageName, resolvedName, st
|
|
|
880
880
|
const allMessages = [...contextMessages, ...messages];
|
|
881
881
|
const trimmedMessages = trimMessages(allMessages);
|
|
882
882
|
const instructions = await buildInstructions(resolvedName, packageName);
|
|
883
|
-
const
|
|
883
|
+
const agentMiddlewares = [
|
|
884
884
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
885
885
|
threadId: run.threadId,
|
|
886
886
|
workingMemorySchemaName,
|
|
887
887
|
logger: singletonServices.logger,
|
|
888
888
|
schemaService: singletonServices.schema,
|
|
889
889
|
}),
|
|
890
|
-
...(agent.
|
|
890
|
+
...(agent.agentMiddleware ?? []),
|
|
891
891
|
];
|
|
892
|
-
// One bag per run, shared by every middleware — see
|
|
892
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
893
893
|
const sharedNotes = {};
|
|
894
|
-
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(
|
|
894
|
+
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(agentMiddlewares, singletonServices, { messages: trimmedMessages, instructions: instructions }, sharedNotes);
|
|
895
895
|
// knowledge: decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md
|
|
896
896
|
const interruptHandle = registerInterruptibleRun(run.runId);
|
|
897
|
-
warnUnstreamedOutputHooks(run.agentName,
|
|
898
|
-
const streamMiddleware =
|
|
897
|
+
warnUnstreamedOutputHooks(run.agentName, agentMiddlewares, singletonServices.logger);
|
|
898
|
+
const streamMiddleware = agentMiddlewares
|
|
899
899
|
.filter((mw) => mw.modifyOutputStream)
|
|
900
900
|
.map((mw) => {
|
|
901
901
|
const state = {};
|
|
@@ -935,7 +935,7 @@ async function continueAfterToolResult(run, agent, packageName, resolvedName, st
|
|
|
935
935
|
? wrapChannelWithMiddleware({ channel: persistingChannel }, singletonServices, allChannelMiddleware).channel
|
|
936
936
|
: persistingChannel;
|
|
937
937
|
const streamContext = { channel, options };
|
|
938
|
-
const resumeTools = (await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, streamContext,
|
|
938
|
+
const resumeTools = (await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, streamContext, agentMiddlewares)).tools;
|
|
939
939
|
const resolved = resolveModelConfig(resolvedName, agent);
|
|
940
940
|
const maxSteps = resolved.maxSteps ?? 10;
|
|
941
941
|
const runnerParams = {
|
|
@@ -962,17 +962,17 @@ async function continueAfterToolResult(run, agent, packageName, resolvedName, st
|
|
|
962
962
|
streamChannel: wrappedChannel,
|
|
963
963
|
persistingChannel,
|
|
964
964
|
channel,
|
|
965
|
-
|
|
965
|
+
agentMiddlewares,
|
|
966
966
|
});
|
|
967
967
|
if (loopResult.outcome === 'approval') {
|
|
968
|
-
await handleApprovals(loopResult.approvals, run.runId, channel,
|
|
968
|
+
await handleApprovals(loopResult.approvals, run.runId, channel, agentRunState, persistingChannel);
|
|
969
969
|
return;
|
|
970
970
|
}
|
|
971
971
|
if (loopResult.outcome === 'credential') {
|
|
972
|
-
await handleCredentialRequests(loopResult.credentialRequests, run.runId, channel,
|
|
972
|
+
await handleCredentialRequests(loopResult.credentialRequests, run.runId, channel, agentRunState, persistingChannel);
|
|
973
973
|
return;
|
|
974
974
|
}
|
|
975
|
-
await postStreamCleanup(persistingChannel,
|
|
975
|
+
await postStreamCleanup(persistingChannel, agentRunState, run.runId, {
|
|
976
976
|
...run,
|
|
977
977
|
input: lastUserMessageText(runnerParams.messages),
|
|
978
978
|
});
|
|
@@ -986,7 +986,7 @@ async function continueAfterToolResult(run, agent, packageName, resolvedName, st
|
|
|
986
986
|
const interruption = interruptHandle.interruption;
|
|
987
987
|
if (interruption || isAbortError(err)) {
|
|
988
988
|
await persistingChannel.flush({ interrupted: true });
|
|
989
|
-
await
|
|
989
|
+
await agentRunState.updateRun(run.runId, { status: 'interrupted' });
|
|
990
990
|
if (storage) {
|
|
991
991
|
trackInterruptNote(run.threadId, persistOrphanedToolResults(interruptHandle, storage, run.threadId));
|
|
992
992
|
}
|
|
@@ -1000,7 +1000,7 @@ async function continueAfterToolResult(run, agent, packageName, resolvedName, st
|
|
|
1000
1000
|
channel.close();
|
|
1001
1001
|
return;
|
|
1002
1002
|
}
|
|
1003
|
-
for (const mw of
|
|
1003
|
+
for (const mw of agentMiddlewares) {
|
|
1004
1004
|
if (mw.onError) {
|
|
1005
1005
|
try {
|
|
1006
1006
|
await mw.onError(singletonServices, {
|
|
@@ -1012,7 +1012,7 @@ async function continueAfterToolResult(run, agent, packageName, resolvedName, st
|
|
|
1012
1012
|
catch { }
|
|
1013
1013
|
}
|
|
1014
1014
|
}
|
|
1015
|
-
await
|
|
1015
|
+
await agentRunState.updateRun(run.runId, {
|
|
1016
1016
|
status: 'failed',
|
|
1017
1017
|
errorMessage: err instanceof Error ? err.message : String(err),
|
|
1018
1018
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CoreSingletonServices } from '../../types/core.types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { PikkuAgentMiddlewareHooks } from './agent.types.js';
|
|
3
3
|
/** Exactly what `modifyInput` accepts and returns, taken from the hook itself. */
|
|
4
|
-
type TurnInput = Pick<Parameters<NonNullable<
|
|
4
|
+
type TurnInput = Pick<Parameters<NonNullable<PikkuAgentMiddlewareHooks['modifyInput']>>[1], 'messages' | 'instructions'>;
|
|
5
5
|
/**
|
|
6
6
|
* Run every `modifyInput` hook in order, threading each result into the next.
|
|
7
7
|
*
|
|
@@ -10,14 +10,14 @@ type TurnInput = Pick<Parameters<NonNullable<PikkuAIMiddlewareHooks['modifyInput
|
|
|
10
10
|
* caller keeps, because hooks use it to pass things forward (`voiceInput`
|
|
11
11
|
* leaves the transcript there for `voiceOutput`).
|
|
12
12
|
*/
|
|
13
|
-
export declare const applyInputMiddleware: (
|
|
13
|
+
export declare const applyInputMiddleware: (agentMiddlewares: PikkuAgentMiddlewareHooks[], singletonServices: CoreSingletonServices, input: TurnInput, sharedNotes: Record<string, unknown>) => Promise<TurnInput>;
|
|
14
14
|
/** The step fields both agent paths hand to `afterStep`, taken from the hook. */
|
|
15
|
-
type StepResult = Omit<Parameters<NonNullable<
|
|
15
|
+
type StepResult = Omit<Parameters<NonNullable<PikkuAgentMiddlewareHooks['afterStep']>>[1], 'stepNumber'>;
|
|
16
16
|
/**
|
|
17
17
|
* Notify every `afterStep` hook. The payload is the step verbatim plus its
|
|
18
18
|
* ordinal — a hook that wants the run's totals accumulates them itself.
|
|
19
19
|
*/
|
|
20
|
-
export declare const notifyAfterStep: (
|
|
20
|
+
export declare const notifyAfterStep: (agentMiddlewares: PikkuAgentMiddlewareHooks[], singletonServices: CoreSingletonServices, stepNumber: number, stepResult: StepResult) => Promise<void>;
|
|
21
21
|
/**
|
|
22
22
|
* The step shape kept on the run: each tool call paired with its result.
|
|
23
23
|
*
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* caller keeps, because hooks use it to pass things forward (`voiceInput`
|
|
7
7
|
* leaves the transcript there for `voiceOutput`).
|
|
8
8
|
*/
|
|
9
|
-
export const applyInputMiddleware = async (
|
|
9
|
+
export const applyInputMiddleware = async (agentMiddlewares, singletonServices, input, sharedNotes) => {
|
|
10
10
|
let { messages, instructions } = input;
|
|
11
|
-
for (const mw of
|
|
11
|
+
for (const mw of agentMiddlewares) {
|
|
12
12
|
if (!mw.modifyInput)
|
|
13
13
|
continue;
|
|
14
14
|
const result = await mw.modifyInput(singletonServices, {
|
|
@@ -25,8 +25,8 @@ export const applyInputMiddleware = async (aiMiddlewares, singletonServices, inp
|
|
|
25
25
|
* Notify every `afterStep` hook. The payload is the step verbatim plus its
|
|
26
26
|
* ordinal — a hook that wants the run's totals accumulates them itself.
|
|
27
27
|
*/
|
|
28
|
-
export const notifyAfterStep = async (
|
|
29
|
-
for (const mw of
|
|
28
|
+
export const notifyAfterStep = async (agentMiddlewares, singletonServices, stepNumber, stepResult) => {
|
|
29
|
+
for (const mw of agentMiddlewares) {
|
|
30
30
|
if (!mw.afterStep)
|
|
31
31
|
continue;
|
|
32
32
|
await mw.afterStep(singletonServices, {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const randomUUID: () => string;
|
|
2
|
+
/**
|
|
3
|
+
* The tool result stored and streamed when a user denies an approval.
|
|
4
|
+
*
|
|
5
|
+
* Two readers, one string. The model needs the sentence — it has to tell the
|
|
6
|
+
* user the action was declined and not retry it. A client needs to know a
|
|
7
|
+
* denial when it sees one, so it can render the call as denied rather than as
|
|
8
|
+
* a successful call that happened to return prose; that is what `approved`
|
|
9
|
+
* carries, and it is the same flag a client sets optimistically the moment the
|
|
10
|
+
* deny button is clicked. Emitting only the sentence made the two disagree:
|
|
11
|
+
* live the call showed denied, and on any re-render from storage the same call
|
|
12
|
+
* came back green.
|
|
13
|
+
*/
|
|
14
|
+
export declare const deniedToolResult: () => string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const randomUUID = () => globalThis.crypto.randomUUID();
|
|
2
|
+
/**
|
|
3
|
+
* The tool result stored and streamed when a user denies an approval.
|
|
4
|
+
*
|
|
5
|
+
* Two readers, one string. The model needs the sentence — it has to tell the
|
|
6
|
+
* user the action was declined and not retry it. A client needs to know a
|
|
7
|
+
* denial when it sees one, so it can render the call as denied rather than as
|
|
8
|
+
* a successful call that happened to return prose; that is what `approved`
|
|
9
|
+
* carries, and it is the same flag a client sets optimistically the moment the
|
|
10
|
+
* deny button is clicked. Emitting only the sentence made the two disagree:
|
|
11
|
+
* live the call showed denied, and on any re-render from storage the same call
|
|
12
|
+
* came back green.
|
|
13
|
+
*/
|
|
14
|
+
export const deniedToolResult = () => JSON.stringify({
|
|
15
|
+
approved: false,
|
|
16
|
+
message: 'The user explicitly declined this action. Inform them that it was declined and do not retry.',
|
|
17
|
+
});
|