@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
|
@@ -5,14 +5,14 @@ import { ForbiddenError } from '../../errors/errors.js';
|
|
|
5
5
|
import { verifyScopes } from '../../scopes.js';
|
|
6
6
|
import { pikkuState, getSingletonServices } from '../../pikku-state.js';
|
|
7
7
|
import { createMiddlewareSessionWireProps } from '../../services/user-session-service.js';
|
|
8
|
-
import { randomUUID } from './
|
|
9
|
-
import { awaitPendingInterruptNote } from './
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
8
|
+
import { randomUUID } from './agent-utils.js';
|
|
9
|
+
import { awaitPendingInterruptNote } from './agent-interrupt.js';
|
|
10
|
+
import { streamAgent } from './agent-stream.js';
|
|
11
|
+
import { runAgent } from './agent-runner.js';
|
|
12
12
|
import { resolveNamespace, ContextAwareRPCService, } from '../../wirings/rpc/rpc-runner.js';
|
|
13
|
-
import { getOrCreatePackageSingletonServices } from '../../wirings/
|
|
14
|
-
import { resolveMemoryServices, loadContextMessages, trimMessages, } from './
|
|
15
|
-
import { resolveModelConfig } from './
|
|
13
|
+
import { getOrCreatePackageSingletonServices } from '../../wirings/addon/addon-runner.js';
|
|
14
|
+
import { resolveMemoryServices, loadContextMessages, trimMessages, } from './agent-memory.js';
|
|
15
|
+
import { resolveModelConfig } from './agent-model-config.js';
|
|
16
16
|
export function resolveSessionPrincipal(params, sessionScope) {
|
|
17
17
|
const session = params.sessionService?.get();
|
|
18
18
|
if ((sessionScope ?? 'user') === 'org') {
|
|
@@ -258,7 +258,7 @@ export function createScopedChannel(parent, agentName, session) {
|
|
|
258
258
|
export function buildSubAgentRunInput(message, threadId, resourceId, parentContext) {
|
|
259
259
|
return { message, threadId, resourceId, context: parentContext };
|
|
260
260
|
}
|
|
261
|
-
export async function buildToolDefs(params, agentSessionMap, resourceId, agentName, packageName, streamContext,
|
|
261
|
+
export async function buildToolDefs(params, agentSessionMap, resourceId, agentName, packageName, streamContext, agentMiddlewares, agentMode, parentContext) {
|
|
262
262
|
const singletonServices = getSingletonServices();
|
|
263
263
|
const tools = [];
|
|
264
264
|
const missingRpcs = [];
|
|
@@ -451,7 +451,7 @@ export async function buildToolDefs(params, agentSessionMap, resourceId, agentNa
|
|
|
451
451
|
subChannel.send(event);
|
|
452
452
|
},
|
|
453
453
|
};
|
|
454
|
-
const resultText = await
|
|
454
|
+
const resultText = await streamAgent(subAgentName, buildSubAgentRunInput(message, threadId, resourceId, parentContext), effectiveChannel, params, agentSessionMap, streamContext.options);
|
|
455
455
|
if (subChannel.approvals.length > 0) {
|
|
456
456
|
return {
|
|
457
457
|
[APPROVAL_REQUIRED]: true,
|
|
@@ -470,7 +470,7 @@ export async function buildToolDefs(params, agentSessionMap, resourceId, agentNa
|
|
|
470
470
|
});
|
|
471
471
|
return resultText;
|
|
472
472
|
}
|
|
473
|
-
const result = await
|
|
473
|
+
const result = await runAgent(subAgentName, buildSubAgentRunInput(message, threadId, resourceId, parentContext), params, agentSessionMap);
|
|
474
474
|
if (result.status === 'suspended' &&
|
|
475
475
|
result.pendingApprovals?.length) {
|
|
476
476
|
return {
|
|
@@ -553,14 +553,14 @@ export async function buildToolDefs(params, agentSessionMap, resourceId, agentNa
|
|
|
553
553
|
}
|
|
554
554
|
};
|
|
555
555
|
}
|
|
556
|
-
const hasToolHooks =
|
|
556
|
+
const hasToolHooks = agentMiddlewares?.some((mw) => mw.beforeToolCall || mw.afterToolCall);
|
|
557
557
|
if (hasToolHooks) {
|
|
558
558
|
for (const tool of tools) {
|
|
559
559
|
const originalExecute = tool.execute;
|
|
560
560
|
tool.execute = async (toolInput) => {
|
|
561
561
|
const toolCallId = randomUUID();
|
|
562
562
|
let args = (toolInput ?? {});
|
|
563
|
-
for (const mw of
|
|
563
|
+
for (const mw of agentMiddlewares) {
|
|
564
564
|
if (mw.beforeToolCall) {
|
|
565
565
|
const beforeResult = await mw.beforeToolCall(singletonServices, {
|
|
566
566
|
toolName: tool.name,
|
|
@@ -585,8 +585,8 @@ export async function buildToolDefs(params, agentSessionMap, resourceId, agentNa
|
|
|
585
585
|
result = err instanceof Error ? err.message : String(err);
|
|
586
586
|
}
|
|
587
587
|
const durationMs = Date.now() - startTime;
|
|
588
|
-
for (let i =
|
|
589
|
-
const mw =
|
|
588
|
+
for (let i = agentMiddlewares.length - 1; i >= 0; i--) {
|
|
589
|
+
const mw = agentMiddlewares[i];
|
|
590
590
|
if (mw.afterToolCall) {
|
|
591
591
|
const afterResult = await mw.afterToolCall(singletonServices, {
|
|
592
592
|
toolName: tool.name,
|
|
@@ -612,7 +612,7 @@ export async function prepareAgentRun(agentName, input, params, agentSessionMap,
|
|
|
612
612
|
const singletonServices = getSingletonServices();
|
|
613
613
|
const { agent, packageName, resolvedName } = resolveAgent(agentName);
|
|
614
614
|
await assertAgentAuthorized(agent, params, packageName);
|
|
615
|
-
let agentRunner = singletonServices.
|
|
615
|
+
let agentRunner = singletonServices.agentRunner;
|
|
616
616
|
if (!agentRunner) {
|
|
617
617
|
throw new AIProviderNotConfiguredError();
|
|
618
618
|
}
|
|
@@ -682,8 +682,8 @@ export async function prepareAgentRun(agentName, input, params, agentSessionMap,
|
|
|
682
682
|
};
|
|
683
683
|
const allMessages = [...contextMessages, ...messages, userMessage];
|
|
684
684
|
const trimmedMessages = trimMessages(allMessages);
|
|
685
|
-
const
|
|
686
|
-
const { tools, missingRpcs } = await buildToolDefs(params, agentSessionMap, input.resourceId, resolvedName, packageName, streamContext,
|
|
685
|
+
const agentMiddlewares = agent.agentMiddleware ?? [];
|
|
686
|
+
const { tools, missingRpcs } = await buildToolDefs(params, agentSessionMap, input.resourceId, resolvedName, packageName, streamContext, agentMiddlewares, agent.agentMode, input.context);
|
|
687
687
|
let instructions = await buildInstructions(resolvedName, packageName);
|
|
688
688
|
if (input.context) {
|
|
689
689
|
instructions = `${instructions}\n\nCurrent context (use these identifiers directly in tool calls — do not ask the user for them):\n${input.context}`;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CoreAgent } from './agent.types.js';
|
|
2
|
+
import type { AgentRunStateService } from '../../services/agent-run-state-service.js';
|
|
3
|
+
import { type RunAgentParams } from './agent-prepare.js';
|
|
4
|
+
export declare const addAgent: (agentName: string, agent: CoreAgent<any, any>, packageName?: string | null) => void;
|
|
5
|
+
export declare function approveAgent(agentRunState: AgentRunStateService, runId: string, approvals: {
|
|
6
|
+
toolCallId: string;
|
|
7
|
+
approved: boolean;
|
|
8
|
+
}[], expectedAgentName?: string, params?: RunAgentParams): Promise<{
|
|
9
|
+
status: 'resumed' | 'suspended';
|
|
10
|
+
runId: string;
|
|
11
|
+
approved: string[];
|
|
12
|
+
rejected: string[];
|
|
13
|
+
remainingApprovals: number;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const getAgents: () => Map<string, CoreAgent>;
|
|
16
|
+
export declare const getAgentsMeta: () => import("./agent.types.js").AgentsMeta;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { pikkuState } from '../../pikku-state.js';
|
|
2
|
-
import { agentSessionScope, assertAgentAuthorized, assertResourcePrincipalOwner, resolveAgent, } from './
|
|
3
|
-
export const
|
|
2
|
+
import { agentSessionScope, assertAgentAuthorized, assertResourcePrincipalOwner, resolveAgent, } from './agent-prepare.js';
|
|
3
|
+
export const addAgent = (agentName, agent, packageName = null) => {
|
|
4
4
|
const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta');
|
|
5
5
|
const agentMeta = agentsMeta[agentName];
|
|
6
6
|
if (!agentMeta) {
|
|
@@ -13,10 +13,10 @@ export const addAIAgent = (agentName, agent, packageName = null) => {
|
|
|
13
13
|
}
|
|
14
14
|
agents.set(agentName, agent);
|
|
15
15
|
};
|
|
16
|
-
export async function
|
|
17
|
-
if (!
|
|
18
|
-
throw new Error('
|
|
19
|
-
const run = await
|
|
16
|
+
export async function approveAgent(agentRunState, runId, approvals, expectedAgentName, params = {}) {
|
|
17
|
+
if (!agentRunState)
|
|
18
|
+
throw new Error('AgentRunStateService not available');
|
|
19
|
+
const run = await agentRunState.getRun(runId);
|
|
20
20
|
if (!run)
|
|
21
21
|
throw new Error('Run not found: ' + runId);
|
|
22
22
|
assertResourcePrincipalOwner(params, agentSessionScope(run.agentName), run.resourceId, 'run');
|
|
@@ -31,7 +31,7 @@ export async function approveAIAgent(aiRunState, runId, approvals, expectedAgent
|
|
|
31
31
|
const rejectedIds = new Set(approvals.filter((a) => !a.approved).map((a) => a.toolCallId));
|
|
32
32
|
const remaining = (run.pendingApprovals ?? []).filter((p) => !approvedIds.has(p.toolCallId) && !rejectedIds.has(p.toolCallId));
|
|
33
33
|
const hasApproved = approvedIds.size > 0;
|
|
34
|
-
await
|
|
34
|
+
await agentRunState.updateRun(runId, {
|
|
35
35
|
status: hasApproved ? 'running' : 'suspended',
|
|
36
36
|
pendingApprovals: remaining.length > 0 ? remaining : undefined,
|
|
37
37
|
});
|
|
@@ -43,9 +43,9 @@ export async function approveAIAgent(aiRunState, runId, approvals, expectedAgent
|
|
|
43
43
|
remainingApprovals: remaining.length,
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
export const
|
|
46
|
+
export const getAgents = () => {
|
|
47
47
|
return pikkuState(null, 'agent', 'agents');
|
|
48
48
|
};
|
|
49
|
-
export const
|
|
49
|
+
export const getAgentsMeta = () => {
|
|
50
50
|
return pikkuState(null, 'agent', 'agentsMeta');
|
|
51
51
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { wrapChannelWithAGUI } from './
|
|
1
|
+
import { runAgent, resumeAgentSync } from './agent-runner.js';
|
|
2
|
+
import { streamAgent, resumeAgent, interruptAgent } from './agent-stream.js';
|
|
3
|
+
import { wrapChannelWithAGUI } from './agent-agui.js';
|
|
4
4
|
/**
|
|
5
5
|
* `wire.rpc.agent`, implemented.
|
|
6
6
|
*
|
|
@@ -30,10 +30,10 @@ export const createAgentRPC = (wire, options) => {
|
|
|
30
30
|
}),
|
|
31
31
|
});
|
|
32
32
|
return {
|
|
33
|
-
run: async (agentName, input) => asRunResult(await
|
|
33
|
+
run: async (agentName, input) => asRunResult(await runAgent(agentName, input, params())),
|
|
34
34
|
stream: async (agentName, input, streamOptions) => {
|
|
35
35
|
let currentRunId;
|
|
36
|
-
await
|
|
36
|
+
await streamAgent(agentName, input, wrapChannelWithAGUI(streamingChannel(), {
|
|
37
37
|
threadId: input.threadId,
|
|
38
38
|
getRunId: () => currentRunId,
|
|
39
39
|
}), params(), undefined, {
|
|
@@ -45,9 +45,9 @@ export const createAgentRPC = (wire, options) => {
|
|
|
45
45
|
});
|
|
46
46
|
},
|
|
47
47
|
resume: async (runId, input, streamOptions) => {
|
|
48
|
-
await
|
|
48
|
+
await resumeAgent({ runId, ...input }, wrapChannelWithAGUI(streamingChannel(), { runId }), params(), streamOptions);
|
|
49
49
|
},
|
|
50
|
-
interrupt: async (runId, reason) =>
|
|
51
|
-
approve: async (runId, approvals, expectedAgentName) => asRunResult(await
|
|
50
|
+
interrupt: async (runId, reason) => interruptAgent({ runId, ...(reason ? { reason } : {}) }, { sessionService: options.sessionService }),
|
|
51
|
+
approve: async (runId, approvals, expectedAgentName) => asRunResult(await resumeAgentSync(runId, approvals, { sessionService: options.sessionService }, expectedAgentName)),
|
|
52
52
|
};
|
|
53
53
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentInput, AgentOutput } from './agent.types.js';
|
|
2
|
+
import { type RunAgentParams } from './agent-prepare.js';
|
|
3
|
+
export declare function runAgent(agentName: string, input: AgentInput, params: RunAgentParams, agentSessionMap?: Map<string, string>): Promise<AgentOutput>;
|
|
4
|
+
export declare function resumeAgentSync(runId: string, approvals: {
|
|
5
|
+
toolCallId: string;
|
|
6
|
+
approved: boolean;
|
|
7
|
+
}[], params: RunAgentParams, expectedAgentName?: string): Promise<AgentOutput>;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { saveMessages, resolveMemoryServices, loadContextMessages, trimMessages, getWorkingMemoryMiddleware, } from './
|
|
2
|
-
import { prepareAgentRun, resolveAgent, buildInstructions, buildToolDefs, resolveOwnerResourceId, agentSessionScope, assertResourcePrincipalOwner, assertAgentAuthorized, } from './
|
|
3
|
-
import { checkForApprovals, appendStepMessages } from './
|
|
4
|
-
import { AgentInterruptedError, isAbortError, persistOrphanedToolResults, registerInterruptibleRun, trackInterruptNote, trackToolExecution, } from './
|
|
1
|
+
import { saveMessages, resolveMemoryServices, loadContextMessages, trimMessages, getWorkingMemoryMiddleware, } from './agent-memory.js';
|
|
2
|
+
import { prepareAgentRun, resolveAgent, buildInstructions, buildToolDefs, resolveOwnerResourceId, agentSessionScope, assertResourcePrincipalOwner, assertAgentAuthorized, } from './agent-prepare.js';
|
|
3
|
+
import { checkForApprovals, appendStepMessages } from './agent-stream.js';
|
|
4
|
+
import { AgentInterruptedError, isAbortError, persistOrphanedToolResults, registerInterruptibleRun, trackInterruptNote, trackToolExecution, } from './agent-interrupt.js';
|
|
5
5
|
import { pikkuState, getSingletonServices } from '../../pikku-state.js';
|
|
6
|
-
import { applyInputMiddleware, describeApprovals, notifyAfterStep, toAccumulatedStep, } from './
|
|
7
|
-
import { applyOutputMiddleware, finalizeAgentRun, lastUserMessageText, } from './
|
|
8
|
-
import { resolveModelConfig } from './
|
|
6
|
+
import { applyInputMiddleware, describeApprovals, notifyAfterStep, toAccumulatedStep, } from './agent-turn.js';
|
|
7
|
+
import { applyOutputMiddleware, finalizeAgentRun, lastUserMessageText, } from './agent-finalize.js';
|
|
8
|
+
import { resolveModelConfig } from './agent-model-config.js';
|
|
9
9
|
import { AIProviderNotConfiguredError } from '../../errors/errors.js';
|
|
10
|
-
import { randomUUID } from './
|
|
10
|
+
import { deniedToolResult, randomUUID } from './agent-utils.js';
|
|
11
11
|
function stripNulls(obj) {
|
|
12
12
|
if (obj === null)
|
|
13
13
|
return undefined;
|
|
@@ -33,7 +33,7 @@ function extractStructuredAssistantOutput(object) {
|
|
|
33
33
|
uiSpec: record.ui ?? null,
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
|
-
export async function
|
|
36
|
+
export async function runAgent(agentName, input, params, agentSessionMap) {
|
|
37
37
|
const sessionMap = agentSessionMap ?? new Map();
|
|
38
38
|
input = {
|
|
39
39
|
...input,
|
|
@@ -42,12 +42,12 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
42
42
|
const { agent, agentRunner, storage, memoryConfig, threadId, userMessage, runnerParams, maxSteps, missingRpcs, workingMemorySchemaName, } = await prepareAgentRun(agentName, input, params, sessionMap);
|
|
43
43
|
runnerParams.agentId = agentName;
|
|
44
44
|
const singletonServices = getSingletonServices();
|
|
45
|
-
const {
|
|
46
|
-
if (!
|
|
47
|
-
throw new Error('
|
|
45
|
+
const { agentRunState } = singletonServices;
|
|
46
|
+
if (!agentRunState) {
|
|
47
|
+
throw new Error('AgentRunStateService not available in singletonServices');
|
|
48
48
|
}
|
|
49
49
|
if (missingRpcs.length > 0) {
|
|
50
|
-
const runId = await
|
|
50
|
+
const runId = await agentRunState.createRun({
|
|
51
51
|
agentName,
|
|
52
52
|
threadId,
|
|
53
53
|
resourceId: input.resourceId,
|
|
@@ -66,18 +66,18 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
66
66
|
usage: { inputTokens: 0, outputTokens: 0 },
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
|
-
const
|
|
69
|
+
const agentMiddlewares = [
|
|
70
70
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
71
71
|
threadId,
|
|
72
72
|
workingMemorySchemaName,
|
|
73
73
|
logger: singletonServices.logger,
|
|
74
74
|
schemaService: singletonServices.schema,
|
|
75
75
|
}),
|
|
76
|
-
...(agent.
|
|
76
|
+
...(agent.agentMiddleware ?? []),
|
|
77
77
|
];
|
|
78
|
-
// One bag per run, shared by every middleware — see
|
|
78
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
79
79
|
const sharedNotes = {};
|
|
80
|
-
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(
|
|
80
|
+
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(agentMiddlewares, singletonServices, {
|
|
81
81
|
messages: runnerParams.messages,
|
|
82
82
|
instructions: runnerParams.instructions,
|
|
83
83
|
}, sharedNotes);
|
|
@@ -86,7 +86,7 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
86
86
|
// knowledge: decisions/internals/thread-history-records-the-transcript-not-the-audio.md
|
|
87
87
|
const lastModified = modifiedMessages[modifiedMessages.length - 1];
|
|
88
88
|
const persistedUserMessage = lastModified?.id === userMessage.id ? lastModified : userMessage;
|
|
89
|
-
const runId = await
|
|
89
|
+
const runId = await agentRunState.createRun({
|
|
90
90
|
agentName,
|
|
91
91
|
threadId,
|
|
92
92
|
resourceId: input.resourceId,
|
|
@@ -123,7 +123,7 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
123
123
|
lastStepResult = stepResult;
|
|
124
124
|
totalUsage.inputTokens += stepResult.usage.inputTokens;
|
|
125
125
|
totalUsage.outputTokens += stepResult.usage.outputTokens;
|
|
126
|
-
await notifyAfterStep(
|
|
126
|
+
await notifyAfterStep(agentMiddlewares, singletonServices, step, stepResult);
|
|
127
127
|
accumulatedSteps.push(toAccumulatedStep(stepResult));
|
|
128
128
|
if (stepResult.toolCalls.length === 0)
|
|
129
129
|
break;
|
|
@@ -161,7 +161,7 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
161
161
|
},
|
|
162
162
|
]);
|
|
163
163
|
}
|
|
164
|
-
await
|
|
164
|
+
await agentRunState.updateRun(runId, {
|
|
165
165
|
status: 'suspended',
|
|
166
166
|
suspendReason: 'approval',
|
|
167
167
|
pendingApprovals,
|
|
@@ -193,7 +193,7 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
193
193
|
text: finalText,
|
|
194
194
|
steps: accumulatedSteps,
|
|
195
195
|
};
|
|
196
|
-
const { text: outputText, steps: outputSteps } = await applyOutputMiddleware(
|
|
196
|
+
const { text: outputText, steps: outputSteps } = await applyOutputMiddleware(agentMiddlewares, singletonServices, {
|
|
197
197
|
text: finalText,
|
|
198
198
|
messages: runnerParams.messages,
|
|
199
199
|
steps: result.steps,
|
|
@@ -204,7 +204,7 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
204
204
|
steps: outputSteps,
|
|
205
205
|
uiSpec: structuredOutput.uiSpec,
|
|
206
206
|
});
|
|
207
|
-
await finalizeAgentRun(
|
|
207
|
+
await finalizeAgentRun(agentRunState, {
|
|
208
208
|
runId,
|
|
209
209
|
agentName,
|
|
210
210
|
threadId,
|
|
@@ -227,13 +227,13 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
227
227
|
// knowledge: decisions/internals/an-agent-interrupt-is-not-a-failure.md
|
|
228
228
|
const interruption = interruptHandle.interruption;
|
|
229
229
|
if (interruption || isAbortError(error)) {
|
|
230
|
-
await
|
|
230
|
+
await agentRunState.updateRun(runId, { status: 'interrupted' });
|
|
231
231
|
if (storage) {
|
|
232
232
|
trackInterruptNote(threadId, persistOrphanedToolResults(interruptHandle, storage, threadId));
|
|
233
233
|
}
|
|
234
234
|
throw new AgentInterruptedError(runId, interruption ?? { reason: 'user' });
|
|
235
235
|
}
|
|
236
|
-
for (const mw of
|
|
236
|
+
for (const mw of agentMiddlewares) {
|
|
237
237
|
if (mw.onError) {
|
|
238
238
|
try {
|
|
239
239
|
await mw.onError(singletonServices, {
|
|
@@ -245,7 +245,7 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
245
245
|
catch { }
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
|
-
await
|
|
248
|
+
await agentRunState.updateRun(runId, {
|
|
249
249
|
status: 'failed',
|
|
250
250
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
251
251
|
});
|
|
@@ -255,13 +255,13 @@ export async function runAIAgent(agentName, input, params, agentSessionMap) {
|
|
|
255
255
|
interruptHandle.release();
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
|
-
export async function
|
|
258
|
+
export async function resumeAgentSync(runId, approvals, params, expectedAgentName) {
|
|
259
259
|
const singletonServices = getSingletonServices();
|
|
260
|
-
const {
|
|
261
|
-
if (!
|
|
262
|
-
throw new Error('
|
|
260
|
+
const { agentRunState } = singletonServices;
|
|
261
|
+
if (!agentRunState) {
|
|
262
|
+
throw new Error('AgentRunStateService not available in singletonServices');
|
|
263
263
|
}
|
|
264
|
-
const run = await
|
|
264
|
+
const run = await agentRunState.getRun(runId);
|
|
265
265
|
if (!run)
|
|
266
266
|
throw new Error(`No run found for runId ${runId}`);
|
|
267
267
|
assertResourcePrincipalOwner(params, agentSessionScope(run.agentName), run.resourceId, 'run');
|
|
@@ -275,7 +275,7 @@ export async function resumeAIAgentSync(runId, approvals, params, expectedAgentN
|
|
|
275
275
|
await assertAgentAuthorized(agent, params, packageName);
|
|
276
276
|
const { storage } = resolveMemoryServices(agent, singletonServices);
|
|
277
277
|
const memoryConfig = agent.memory;
|
|
278
|
-
const agentRunner = singletonServices.
|
|
278
|
+
const agentRunner = singletonServices.agentRunner;
|
|
279
279
|
if (!agentRunner) {
|
|
280
280
|
throw new AIProviderNotConfiguredError();
|
|
281
281
|
}
|
|
@@ -287,7 +287,7 @@ export async function resumeAIAgentSync(runId, approvals, params, expectedAgentN
|
|
|
287
287
|
// for may run the tool.
|
|
288
288
|
const claimedIds = new Set();
|
|
289
289
|
for (const { toolCallId, approved } of approvals) {
|
|
290
|
-
const claimed = await
|
|
290
|
+
const claimed = await agentRunState.resolveApproval(toolCallId, approved ? 'approved' : 'denied');
|
|
291
291
|
if (claimed) {
|
|
292
292
|
claimedIds.add(toolCallId);
|
|
293
293
|
}
|
|
@@ -295,7 +295,7 @@ export async function resumeAIAgentSync(runId, approvals, params, expectedAgentN
|
|
|
295
295
|
if (approvals.length > 0 && claimedIds.size === 0) {
|
|
296
296
|
throw new Error(`Approvals for run ${runId} were already resolved by another caller`);
|
|
297
297
|
}
|
|
298
|
-
const { tools } = await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, undefined, agent.
|
|
298
|
+
const { tools } = await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, undefined, agent.agentMiddleware ?? []);
|
|
299
299
|
const toolCallMessages = [];
|
|
300
300
|
for (const pending of savedPendingApprovals) {
|
|
301
301
|
if (pending.type !== 'tool-call')
|
|
@@ -306,8 +306,7 @@ export async function resumeAIAgentSync(runId, approvals, params, expectedAgentN
|
|
|
306
306
|
let resultStr;
|
|
307
307
|
let toolError;
|
|
308
308
|
if (rejectedIds.has(toolCallId)) {
|
|
309
|
-
resultStr =
|
|
310
|
-
'The user explicitly declined this action. Inform them that it was declined and do not retry.';
|
|
309
|
+
resultStr = deniedToolResult();
|
|
311
310
|
}
|
|
312
311
|
else if (approvedIds.has(toolCallId)) {
|
|
313
312
|
const matchingTool = tools.find((t) => t.name === pending.toolName);
|
|
@@ -362,8 +361,8 @@ export async function resumeAIAgentSync(runId, approvals, params, expectedAgentN
|
|
|
362
361
|
},
|
|
363
362
|
]);
|
|
364
363
|
}
|
|
365
|
-
await
|
|
366
|
-
return continueAfterToolResultSync(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, params,
|
|
364
|
+
await agentRunState.updateRun(runId, { status: 'running' });
|
|
365
|
+
return continueAfterToolResultSync(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, params, agentRunState,
|
|
367
366
|
// The approved tools were executed here, before the model was re-entered,
|
|
368
367
|
// so they belong to the run's step record — otherwise a tool that failed
|
|
369
368
|
// after approval leaves no trace on the run at all.
|
|
@@ -379,7 +378,7 @@ export async function resumeAIAgentSync(runId, approvals, params, expectedAgentN
|
|
|
379
378
|
}
|
|
380
379
|
: undefined);
|
|
381
380
|
}
|
|
382
|
-
async function continueAfterToolResultSync(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, params,
|
|
381
|
+
async function continueAfterToolResultSync(run, agent, packageName, resolvedName, storage, memoryConfig, agentRunner, params, agentRunState, resumedToolStep) {
|
|
383
382
|
const singletonServices = getSingletonServices();
|
|
384
383
|
const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta');
|
|
385
384
|
const meta = agentsMeta[resolvedName];
|
|
@@ -396,19 +395,19 @@ async function continueAfterToolResultSync(run, agent, packageName, resolvedName
|
|
|
396
395
|
const allMessages = [...contextMessages, ...messages];
|
|
397
396
|
const trimmedMessages = trimMessages(allMessages);
|
|
398
397
|
const instructions = await buildInstructions(resolvedName, packageName);
|
|
399
|
-
const
|
|
398
|
+
const agentMiddlewares = [
|
|
400
399
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
401
400
|
threadId: run.threadId,
|
|
402
401
|
workingMemorySchemaName,
|
|
403
402
|
logger: singletonServices.logger,
|
|
404
403
|
schemaService: singletonServices.schema,
|
|
405
404
|
}),
|
|
406
|
-
...(agent.
|
|
405
|
+
...(agent.agentMiddleware ?? []),
|
|
407
406
|
];
|
|
408
|
-
// One bag per run, shared by every middleware — see
|
|
407
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
409
408
|
const sharedNotes = {};
|
|
410
|
-
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(
|
|
411
|
-
const { tools: resumeTools } = await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, undefined,
|
|
409
|
+
const { messages: modifiedMessages, instructions: modifiedInstructions } = await applyInputMiddleware(agentMiddlewares, singletonServices, { messages: trimmedMessages, instructions: instructions }, sharedNotes);
|
|
410
|
+
const { tools: resumeTools } = await buildToolDefs(params, new Map(), run.resourceId, resolvedName, packageName, undefined, agentMiddlewares);
|
|
412
411
|
const resolved = resolveModelConfig(resolvedName, agent);
|
|
413
412
|
const maxSteps = resolved.maxSteps ?? 10;
|
|
414
413
|
const runnerParams = {
|
|
@@ -445,7 +444,7 @@ async function continueAfterToolResultSync(run, agent, packageName, resolvedName
|
|
|
445
444
|
lastStepResult = stepResult;
|
|
446
445
|
totalUsage.inputTokens += stepResult.usage.inputTokens;
|
|
447
446
|
totalUsage.outputTokens += stepResult.usage.outputTokens;
|
|
448
|
-
await notifyAfterStep(
|
|
447
|
+
await notifyAfterStep(agentMiddlewares, singletonServices, step, stepResult);
|
|
449
448
|
accumulatedSteps.push(toAccumulatedStep(stepResult));
|
|
450
449
|
if (stepResult.toolCalls.length === 0)
|
|
451
450
|
break;
|
|
@@ -485,7 +484,7 @@ async function continueAfterToolResultSync(run, agent, packageName, resolvedName
|
|
|
485
484
|
},
|
|
486
485
|
]);
|
|
487
486
|
}
|
|
488
|
-
await
|
|
487
|
+
await agentRunState.updateRun(run.runId, {
|
|
489
488
|
status: 'suspended',
|
|
490
489
|
suspendReason: 'approval',
|
|
491
490
|
pendingApprovals,
|
|
@@ -516,7 +515,7 @@ async function continueAfterToolResultSync(run, agent, packageName, resolvedName
|
|
|
516
515
|
text: finalText,
|
|
517
516
|
steps: accumulatedSteps,
|
|
518
517
|
};
|
|
519
|
-
const { text: outputText, steps: outputSteps } = await applyOutputMiddleware(
|
|
518
|
+
const { text: outputText, steps: outputSteps } = await applyOutputMiddleware(agentMiddlewares, singletonServices, {
|
|
520
519
|
text: finalText,
|
|
521
520
|
messages: runnerParams.messages,
|
|
522
521
|
steps: withResumedStep(result.steps),
|
|
@@ -528,7 +527,7 @@ async function continueAfterToolResultSync(run, agent, packageName, resolvedName
|
|
|
528
527
|
// re-entered, so only the steps this leg generated are persisted here.
|
|
529
528
|
steps: accumulatedSteps,
|
|
530
529
|
});
|
|
531
|
-
await finalizeAgentRun(
|
|
530
|
+
await finalizeAgentRun(agentRunState, {
|
|
532
531
|
runId: run.runId,
|
|
533
532
|
agentName: resolvedName,
|
|
534
533
|
threadId: run.threadId,
|
|
@@ -550,13 +549,13 @@ async function continueAfterToolResultSync(run, agent, packageName, resolvedName
|
|
|
550
549
|
catch (error) {
|
|
551
550
|
const interruption = interruptHandle.interruption;
|
|
552
551
|
if (interruption || isAbortError(error)) {
|
|
553
|
-
await
|
|
552
|
+
await agentRunState.updateRun(run.runId, { status: 'interrupted' });
|
|
554
553
|
if (storage) {
|
|
555
554
|
trackInterruptNote(run.threadId, persistOrphanedToolResults(interruptHandle, storage, run.threadId));
|
|
556
555
|
}
|
|
557
556
|
throw new AgentInterruptedError(run.runId, interruption ?? { reason: 'user' });
|
|
558
557
|
}
|
|
559
|
-
for (const mw of
|
|
558
|
+
for (const mw of agentMiddlewares) {
|
|
560
559
|
if (mw.onError) {
|
|
561
560
|
try {
|
|
562
561
|
await mw.onError(singletonServices, {
|
|
@@ -568,7 +567,7 @@ async function continueAfterToolResultSync(run, agent, packageName, resolvedName
|
|
|
568
567
|
catch { }
|
|
569
568
|
}
|
|
570
569
|
}
|
|
571
|
-
await
|
|
570
|
+
await agentRunState.updateRun(run.runId, {
|
|
572
571
|
status: 'failed',
|
|
573
572
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
574
573
|
});
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import { ToolApprovalRequired, ToolCredentialRequired, type
|
|
4
|
-
import { type AgentInterruption, type AgentInterruptResult } from './
|
|
5
|
-
export declare function checkForApprovals(stepResult:
|
|
6
|
-
export declare function checkForCredentialRequests(stepResult:
|
|
7
|
-
export declare function appendStepMessages(runnerParams:
|
|
8
|
-
export declare function
|
|
1
|
+
import type { AgentStreamChannel } from './agent.types.js';
|
|
2
|
+
import type { AgentRunnerParams, AgentStepResult } from '../../services/agent-runner-service.js';
|
|
3
|
+
import { ToolApprovalRequired, ToolCredentialRequired, type RunAgentParams, type StreamAgentOptions } from './agent-prepare.js';
|
|
4
|
+
import { type AgentInterruption, type AgentInterruptResult } from './agent-interrupt.js';
|
|
5
|
+
export declare function checkForApprovals(stepResult: AgentStepResult, tools: AgentRunnerParams['tools']): ToolApprovalRequired[];
|
|
6
|
+
export declare function checkForCredentialRequests(stepResult: AgentStepResult): ToolCredentialRequired[];
|
|
7
|
+
export declare function appendStepMessages(runnerParams: AgentRunnerParams, stepResult: AgentStepResult): void;
|
|
8
|
+
export declare function streamAgent(agentName: string, input: {
|
|
9
9
|
message: string;
|
|
10
10
|
threadId: string;
|
|
11
11
|
resourceId: string;
|
|
12
12
|
model?: string;
|
|
13
13
|
temperature?: number;
|
|
14
|
-
}, channel:
|
|
14
|
+
}, channel: AgentStreamChannel, params: RunAgentParams, agentSessionMap?: Map<string, string>, options?: StreamAgentOptions): Promise<string>;
|
|
15
15
|
/**
|
|
16
16
|
* Stop an in-flight run on behalf of a caller, after checking the run is theirs.
|
|
17
17
|
*
|
|
18
|
-
* Unlike {@link
|
|
18
|
+
* Unlike {@link resumeAgent} this needs no channel: it does not continue the
|
|
19
19
|
* stream, it ends one. The `interrupted` event and the truncated message are
|
|
20
|
-
* emitted by the original {@link
|
|
20
|
+
* emitted by the original {@link streamAgent} call on its own channel, so this
|
|
21
21
|
* can be reached over a plain RPC while the stream is held open elsewhere —
|
|
22
22
|
* which is exactly the shape a voice barge-in needs.
|
|
23
23
|
*
|
|
@@ -30,12 +30,12 @@ export declare function streamAIAgent(agentName: string, input: {
|
|
|
30
30
|
* Returns `false` when there was nothing to stop. Racing a run that finishes on
|
|
31
31
|
* its own is the normal case in voice, so it is not an error.
|
|
32
32
|
*/
|
|
33
|
-
export declare function
|
|
33
|
+
export declare function interruptAgent(input: {
|
|
34
34
|
runId: string;
|
|
35
35
|
reason?: AgentInterruption['reason'];
|
|
36
|
-
}, params:
|
|
37
|
-
export declare function
|
|
36
|
+
}, params: RunAgentParams): Promise<AgentInterruptResult>;
|
|
37
|
+
export declare function resumeAgent(input: {
|
|
38
38
|
runId: string;
|
|
39
39
|
toolCallId: string;
|
|
40
40
|
approved: boolean;
|
|
41
|
-
}, channel:
|
|
41
|
+
}, channel: AgentStreamChannel, params: RunAgentParams, options?: StreamAgentOptions): Promise<void>;
|