@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,10 +1,11 @@
|
|
|
1
1
|
import type { CorePermissionGroup, CorePikkuPermission } from '../../function/functions.types.js';
|
|
2
|
-
import type { CorePikkuMiddleware, MiddlewareMetadata
|
|
3
|
-
import type {
|
|
2
|
+
import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
|
|
3
|
+
import type { PermissionMetadata } from '../../function/function-meta.types.js';
|
|
4
|
+
import type { AIProviderOptions } from '../../services/agent-runner-service.js';
|
|
4
5
|
import type { PikkuChannel } from '../channel/channel.types.js';
|
|
5
6
|
import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js';
|
|
6
7
|
import type { ApprovalPolicy } from '../channel/channel-rpc.js';
|
|
7
|
-
export interface
|
|
8
|
+
export interface AgentThread {
|
|
8
9
|
id: string;
|
|
9
10
|
resourceId: string;
|
|
10
11
|
title?: string;
|
|
@@ -12,7 +13,7 @@ export interface AIThread {
|
|
|
12
13
|
createdAt: Date;
|
|
13
14
|
updatedAt: Date;
|
|
14
15
|
}
|
|
15
|
-
export type
|
|
16
|
+
export type AgentContentPart = {
|
|
16
17
|
type: 'text';
|
|
17
18
|
text: string;
|
|
18
19
|
} | {
|
|
@@ -34,12 +35,12 @@ export type AIContentPart = {
|
|
|
34
35
|
type: 'generative-ui';
|
|
35
36
|
spec: unknown;
|
|
36
37
|
};
|
|
37
|
-
export interface
|
|
38
|
+
export interface AgentToolCall {
|
|
38
39
|
id: string;
|
|
39
40
|
name: string;
|
|
40
41
|
args: Record<string, unknown>;
|
|
41
42
|
}
|
|
42
|
-
export interface
|
|
43
|
+
export interface AgentToolResult {
|
|
43
44
|
id: string;
|
|
44
45
|
name: string;
|
|
45
46
|
result: string;
|
|
@@ -51,12 +52,12 @@ export interface AIToolResult {
|
|
|
51
52
|
*/
|
|
52
53
|
error?: string;
|
|
53
54
|
}
|
|
54
|
-
export interface
|
|
55
|
+
export interface AgentMessage {
|
|
55
56
|
id: string;
|
|
56
57
|
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
57
|
-
content?: string |
|
|
58
|
-
toolCalls?:
|
|
59
|
-
toolResults?:
|
|
58
|
+
content?: string | AgentContentPart[];
|
|
59
|
+
toolCalls?: AgentToolCall[];
|
|
60
|
+
toolResults?: AgentToolResult[];
|
|
60
61
|
reasoningContent?: string;
|
|
61
62
|
/**
|
|
62
63
|
* Set on an assistant message whose generation was cut short by
|
|
@@ -77,7 +78,7 @@ export interface AIMessage {
|
|
|
77
78
|
undelivered?: boolean;
|
|
78
79
|
createdAt: Date;
|
|
79
80
|
}
|
|
80
|
-
export interface
|
|
81
|
+
export interface AgentStep {
|
|
81
82
|
usage: {
|
|
82
83
|
inputTokens: number;
|
|
83
84
|
outputTokens: number;
|
|
@@ -90,18 +91,18 @@ export interface AIAgentStep {
|
|
|
90
91
|
error?: string;
|
|
91
92
|
}[];
|
|
92
93
|
}
|
|
93
|
-
export interface
|
|
94
|
+
export interface AgentInputAttachment {
|
|
94
95
|
type: 'image' | 'file';
|
|
95
96
|
data?: string;
|
|
96
97
|
url?: string;
|
|
97
98
|
mediaType?: string;
|
|
98
99
|
filename?: string;
|
|
99
100
|
}
|
|
100
|
-
export interface
|
|
101
|
+
export interface AgentInput {
|
|
101
102
|
message: string;
|
|
102
103
|
threadId: string;
|
|
103
104
|
resourceId: string;
|
|
104
|
-
attachments?:
|
|
105
|
+
attachments?: AgentInputAttachment[];
|
|
105
106
|
model?: string;
|
|
106
107
|
temperature?: number;
|
|
107
108
|
/** Structured context injected into the system instructions for this request.
|
|
@@ -109,12 +110,12 @@ export interface AIAgentInput {
|
|
|
109
110
|
* so the agent can call tools without asking the user for identifiers. */
|
|
110
111
|
context?: string;
|
|
111
112
|
}
|
|
112
|
-
export interface
|
|
113
|
+
export interface AgentOutput {
|
|
113
114
|
runId: string;
|
|
114
115
|
text: string;
|
|
115
116
|
object?: unknown;
|
|
116
117
|
threadId: string;
|
|
117
|
-
steps:
|
|
118
|
+
steps: AgentStep[];
|
|
118
119
|
usage: {
|
|
119
120
|
inputTokens: number;
|
|
120
121
|
outputTokens: number;
|
|
@@ -147,7 +148,7 @@ export type SessionScope = 'user' | 'org';
|
|
|
147
148
|
* written by whoever runs the server it executes on. A capability runs on
|
|
148
149
|
* someone else's machine, so it requires the field instead.
|
|
149
150
|
*/
|
|
150
|
-
export interface
|
|
151
|
+
export interface AgentToolDef extends Partial<ApprovalPolicy> {
|
|
151
152
|
name: string;
|
|
152
153
|
description: string;
|
|
153
154
|
inputSchema: Record<string, unknown>;
|
|
@@ -168,9 +169,9 @@ export interface AIAgentToolDef extends Partial<ApprovalPolicy> {
|
|
|
168
169
|
*/
|
|
169
170
|
forwardsApproval?: boolean;
|
|
170
171
|
}
|
|
171
|
-
export interface
|
|
172
|
+
export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown> = Record<string, unknown>, Services = any> {
|
|
172
173
|
modifyInput?: (services: Services, ctx: {
|
|
173
|
-
messages:
|
|
174
|
+
messages: AgentMessage[];
|
|
174
175
|
instructions: string;
|
|
175
176
|
/**
|
|
176
177
|
* Notes about this run that every middleware can read and write, as
|
|
@@ -190,15 +191,15 @@ export interface PikkuAIMiddlewareHooks<State extends Record<string, unknown> =
|
|
|
190
191
|
*/
|
|
191
192
|
shared: Record<string, unknown>;
|
|
192
193
|
}) => Promise<{
|
|
193
|
-
messages:
|
|
194
|
+
messages: AgentMessage[];
|
|
194
195
|
instructions: string;
|
|
195
196
|
}> | {
|
|
196
|
-
messages:
|
|
197
|
+
messages: AgentMessage[];
|
|
197
198
|
instructions: string;
|
|
198
199
|
};
|
|
199
200
|
modifyOutputStream?: (services: Services, ctx: {
|
|
200
|
-
event:
|
|
201
|
-
allEvents: readonly
|
|
201
|
+
event: AgentStreamEvent;
|
|
202
|
+
allEvents: readonly AgentStreamEvent[];
|
|
202
203
|
/** Private to this middleware, for this run. Cross-middleware facts go in `shared`. */
|
|
203
204
|
state: State;
|
|
204
205
|
/** Per-run notes shared with every middleware — see {@link modifyInput}. */
|
|
@@ -217,14 +218,14 @@ export interface PikkuAIMiddlewareHooks<State extends Record<string, unknown> =
|
|
|
217
218
|
* it matters — and a hook that emits must make sure anything still
|
|
218
219
|
* outstanding has landed before it lets `done` through.
|
|
219
220
|
*/
|
|
220
|
-
emit: (event:
|
|
221
|
+
emit: (event: AgentStreamEvent) => Promise<void>;
|
|
221
222
|
/**
|
|
222
223
|
* Aborts when the run is interrupted. Pass it to any provider call the
|
|
223
224
|
* hook makes: work started for a reply the user has already talked over
|
|
224
225
|
* is billed but never heard.
|
|
225
226
|
*/
|
|
226
227
|
signal?: AbortSignal;
|
|
227
|
-
}) => Promise<
|
|
228
|
+
}) => Promise<AgentStreamEvent | AgentStreamEvent[] | null> | AgentStreamEvent | AgentStreamEvent[] | null;
|
|
228
229
|
/**
|
|
229
230
|
* The last chance to rewrite what the run produced, before it is persisted
|
|
230
231
|
* and returned.
|
|
@@ -242,20 +243,20 @@ export interface PikkuAIMiddlewareHooks<State extends Record<string, unknown> =
|
|
|
242
243
|
*/
|
|
243
244
|
modifyOutput?: (services: Services, ctx: {
|
|
244
245
|
text: string;
|
|
245
|
-
messages:
|
|
246
|
+
messages: AgentMessage[];
|
|
246
247
|
usage: {
|
|
247
248
|
inputTokens: number;
|
|
248
249
|
outputTokens: number;
|
|
249
250
|
};
|
|
250
|
-
toolCalls: NonNullable<
|
|
251
|
+
toolCalls: NonNullable<AgentStep['toolCalls']>;
|
|
251
252
|
}) => Promise<{
|
|
252
253
|
text: string;
|
|
253
|
-
messages:
|
|
254
|
-
toolCalls?: NonNullable<
|
|
254
|
+
messages: AgentMessage[];
|
|
255
|
+
toolCalls?: NonNullable<AgentStep['toolCalls']>;
|
|
255
256
|
}> | {
|
|
256
257
|
text: string;
|
|
257
|
-
messages:
|
|
258
|
-
toolCalls?: NonNullable<
|
|
258
|
+
messages: AgentMessage[];
|
|
259
|
+
toolCalls?: NonNullable<AgentStep['toolCalls']>;
|
|
259
260
|
};
|
|
260
261
|
beforeToolCall?: (services: Services, ctx: {
|
|
261
262
|
toolName: string;
|
|
@@ -301,17 +302,17 @@ export interface PikkuAIMiddlewareHooks<State extends Record<string, unknown> =
|
|
|
301
302
|
onError?: (services: Services, ctx: {
|
|
302
303
|
error: Error;
|
|
303
304
|
stepNumber: number;
|
|
304
|
-
messages:
|
|
305
|
+
messages: AgentMessage[];
|
|
305
306
|
}) => Promise<void> | void;
|
|
306
307
|
}
|
|
307
|
-
export type
|
|
308
|
+
export type AgentMemoryConfig = {
|
|
308
309
|
storage?: string;
|
|
309
310
|
vector?: string;
|
|
310
311
|
embedder?: string;
|
|
311
312
|
lastMessages?: number;
|
|
312
313
|
workingMemory?: unknown;
|
|
313
314
|
};
|
|
314
|
-
export type
|
|
315
|
+
export type CoreAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMiddleware = CorePikkuMiddleware<any>, Scope extends string = string, Scorer extends string = string> = {
|
|
315
316
|
name: string;
|
|
316
317
|
description: string;
|
|
317
318
|
summary?: string;
|
|
@@ -348,7 +349,7 @@ export type CoreAIAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMi
|
|
|
348
349
|
*/
|
|
349
350
|
scorers?: Scorer[];
|
|
350
351
|
agentMode?: 'delegate' | 'supervise';
|
|
351
|
-
memory?:
|
|
352
|
+
memory?: AgentMemoryConfig;
|
|
352
353
|
maxSteps?: number;
|
|
353
354
|
toolChoice?: 'auto' | 'required' | 'none';
|
|
354
355
|
/**
|
|
@@ -366,15 +367,15 @@ export type CoreAIAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMi
|
|
|
366
367
|
tags?: string[];
|
|
367
368
|
prepareStep?: (ctx: {
|
|
368
369
|
stepNumber: number;
|
|
369
|
-
messages:
|
|
370
|
-
tools:
|
|
370
|
+
messages: AgentMessage[];
|
|
371
|
+
tools: AgentToolDef[];
|
|
371
372
|
toolChoice: 'auto' | 'required' | 'none';
|
|
372
373
|
model: string;
|
|
373
374
|
stop: () => void;
|
|
374
375
|
}) => void | Promise<void>;
|
|
375
376
|
middleware?: PikkuMiddleware[];
|
|
376
377
|
channelMiddleware?: CorePikkuChannelMiddleware<any, any>[];
|
|
377
|
-
|
|
378
|
+
agentMiddleware?: PikkuAgentMiddlewareHooks<any, any>[];
|
|
378
379
|
/**
|
|
379
380
|
* Whether a session is required to run this agent. Defaults to `false`, since
|
|
380
381
|
* agents are commonly invoked from an already-authenticated `pikkuFunc` or
|
|
@@ -389,12 +390,12 @@ export type CoreAIAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMi
|
|
|
389
390
|
* which OR together, a scope can only narrow access.
|
|
390
391
|
*
|
|
391
392
|
* Narrowed to the generated `ScopeId` union in a project's own
|
|
392
|
-
*
|
|
393
|
+
* `#pikku/scopes`, so an undeclared scope is a compile error.
|
|
393
394
|
*/
|
|
394
395
|
scopes?: Scope[];
|
|
395
396
|
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
396
397
|
};
|
|
397
|
-
export type
|
|
398
|
+
export type AgentStreamEvent = {
|
|
398
399
|
type: 'step-start';
|
|
399
400
|
stepNumber: number;
|
|
400
401
|
agent?: string;
|
|
@@ -529,7 +530,7 @@ export type AIStreamEvent = {
|
|
|
529
530
|
} | {
|
|
530
531
|
type: 'done';
|
|
531
532
|
};
|
|
532
|
-
export interface
|
|
533
|
+
export interface AgentStreamChannel extends PikkuChannel<unknown, AgentStreamEvent> {
|
|
533
534
|
}
|
|
534
535
|
export type PendingApproval = {
|
|
535
536
|
type: 'tool-call';
|
|
@@ -602,14 +603,14 @@ export interface AgentRunService {
|
|
|
602
603
|
owners?: string[];
|
|
603
604
|
limit?: number;
|
|
604
605
|
offset?: number;
|
|
605
|
-
}): Promise<
|
|
606
|
-
getThread(threadId: string): Promise<
|
|
607
|
-
getThreadMessages(threadId: string): Promise<
|
|
606
|
+
}): Promise<AgentThread[]>;
|
|
607
|
+
getThread(threadId: string): Promise<AgentThread | null>;
|
|
608
|
+
getThreadMessages(threadId: string): Promise<AgentMessage[]>;
|
|
608
609
|
getThreadRuns(threadId: string): Promise<AgentRunRow[]>;
|
|
609
610
|
deleteThread(threadId: string): Promise<boolean>;
|
|
610
611
|
getDistinctAgentNames(): Promise<string[]>;
|
|
611
612
|
}
|
|
612
|
-
export type
|
|
613
|
+
export type AgentsMeta = Record<string, Omit<CoreAgent, 'input' | 'output' | 'tools' | 'agents' | 'workflows' | 'middleware' | 'channelMiddleware' | 'agentMiddleware' | 'permissions'> & {
|
|
613
614
|
tools?: string[];
|
|
614
615
|
agents?: string[];
|
|
615
616
|
workflows?: string[];
|
|
@@ -618,7 +619,7 @@ export type AIAgentMeta = Record<string, Omit<CoreAIAgent, 'input' | 'output' |
|
|
|
618
619
|
workingMemorySchema: string | null;
|
|
619
620
|
middleware?: MiddlewareMetadata[];
|
|
620
621
|
channelMiddleware?: MiddlewareMetadata[];
|
|
621
|
-
|
|
622
|
+
agentMiddleware?: MiddlewareMetadata[];
|
|
622
623
|
permissions?: PermissionMetadata[];
|
|
623
624
|
sourceFile?: string;
|
|
624
625
|
exportedName?: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { agent, agentStream, agentResume, agentApprove, agentInterrupt, } from './agent-helpers.js';
|
|
2
|
+
export { wrapChannelWithAGUI } from './agent-agui.js';
|
|
3
|
+
export { runAgent, resumeAgentSync } from './agent-runner.js';
|
|
4
|
+
export { resolveModelAlias } from './agent-model-config.js';
|
|
5
|
+
export { streamAgent, resumeAgent, interruptAgent } from './agent-stream.js';
|
|
6
|
+
export { voiceInput, NoSpeechDetectedError, SPOKEN_TURN, SPOKEN_TRANSCRIPT, } from './voice-input.js';
|
|
7
|
+
export { voiceOutput, unspeakableScripts, voiceForText, type SpeakableScripts, type VoiceOutputState, } from './voice-output.js';
|
|
8
|
+
export { AgentInterruptedError, signalRunInterrupt } from './agent-interrupt.js';
|
|
9
|
+
export type { AgentInterruption, AgentInterruptResult, InterruptibleRunHandle, } from './agent-interrupt.js';
|
|
10
|
+
export { type RunAgentParams, type StreamAgentOptions, ToolApprovalRequired, ToolCredentialRequired, canAccessThread, isOwnedByPrincipal, threadOwnerConstraint, } from './agent-prepare.js';
|
|
11
|
+
export { addAgent } from './agent-registry.js';
|
|
12
|
+
export type { AgentInput, AgentsMeta, AgentMemoryConfig, AgentStep, AgentContentPart, AgentRunRow, AgentRunService, AgentRunState, AgentMessage, AgentStreamChannel, AgentStreamEvent, AgentThread, CoreAgent, PendingApproval, PikkuAgentMiddlewareHooks, } from './agent.types.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { agent, agentStream, agentResume, agentApprove, agentInterrupt, } from './agent-helpers.js';
|
|
2
|
+
export { wrapChannelWithAGUI } from './agent-agui.js';
|
|
3
|
+
export { runAgent, resumeAgentSync } from './agent-runner.js';
|
|
4
|
+
export { resolveModelAlias } from './agent-model-config.js';
|
|
5
|
+
export { streamAgent, resumeAgent, interruptAgent } from './agent-stream.js';
|
|
6
|
+
export { voiceInput, NoSpeechDetectedError, SPOKEN_TURN, SPOKEN_TRANSCRIPT, } from './voice-input.js';
|
|
7
|
+
export { voiceOutput, unspeakableScripts, voiceForText, } from './voice-output.js';
|
|
8
|
+
export { AgentInterruptedError, signalRunInterrupt } from './agent-interrupt.js';
|
|
9
|
+
export { ToolApprovalRequired, ToolCredentialRequired, canAccessThread, isOwnedByPrincipal, threadOwnerConstraint, } from './agent-prepare.js';
|
|
10
|
+
export { addAgent } from './agent-registry.js';
|
|
@@ -58,7 +58,7 @@ export declare const voiceInput: (config?: {
|
|
|
58
58
|
language?: string;
|
|
59
59
|
model?: string;
|
|
60
60
|
allowedAudioHosts?: string[];
|
|
61
|
-
}) => import("./
|
|
61
|
+
}) => import("./agent.types.js").PikkuAgentMiddlewareHooks<Record<string, unknown>, import("../../types/core.types.js").CoreSingletonServices<{
|
|
62
62
|
logLevel?: import("../../services/logger.js").LogLevel;
|
|
63
63
|
secrets?: {
|
|
64
64
|
requireAllowedHosts?: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { pikkuAgentMiddleware } from '../../middleware/middleware-factories.js';
|
|
2
2
|
import { safeFetch } from '../../utils/safe-fetch.js';
|
|
3
3
|
function base64ToUint8Array(base64) {
|
|
4
4
|
const binary = atob(base64);
|
|
@@ -78,10 +78,10 @@ export const SPOKEN_TURN = 'voice:spokenTurn';
|
|
|
78
78
|
* bubble followed by an answer to a question they cannot see.
|
|
79
79
|
*/
|
|
80
80
|
export const SPOKEN_TRANSCRIPT = 'voice:transcript';
|
|
81
|
-
export const voiceInput = (config) =>
|
|
81
|
+
export const voiceInput = (config) => pikkuAgentMiddleware({
|
|
82
82
|
modifyInput: async (services, { messages, instructions, shared }) => {
|
|
83
|
-
const
|
|
84
|
-
if (!
|
|
83
|
+
const agentRunner = services.agentRunner;
|
|
84
|
+
if (!agentRunner?.transcribe)
|
|
85
85
|
return { messages, instructions };
|
|
86
86
|
const last = messages[messages.length - 1];
|
|
87
87
|
const parts = last?.role === 'user' && typeof last.content !== 'string'
|
|
@@ -110,7 +110,7 @@ export const voiceInput = (config) => pikkuAIMiddleware({
|
|
|
110
110
|
if (audioData.byteLength > MAX_AUDIO_SIZE) {
|
|
111
111
|
throw new Error('Audio file exceeds maximum size');
|
|
112
112
|
}
|
|
113
|
-
const result = await
|
|
113
|
+
const result = await agentRunner.transcribe({
|
|
114
114
|
model: config.model,
|
|
115
115
|
audio: audioData,
|
|
116
116
|
...(config.language
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type VoiceOutputState = {
|
|
1
|
+
export type VoiceOutputState = {
|
|
2
2
|
textBuffer?: string;
|
|
3
3
|
/**
|
|
4
4
|
* The audio emitted so far, as a chain.
|
|
@@ -74,7 +74,7 @@ export declare const voiceOutput: (config?: {
|
|
|
74
74
|
* meant to be heard.
|
|
75
75
|
*/
|
|
76
76
|
always?: boolean;
|
|
77
|
-
}) => import("./
|
|
77
|
+
}) => import("./agent.types.js").PikkuAgentMiddlewareHooks<VoiceOutputState, import("../../types/core.types.js").CoreSingletonServices<{
|
|
78
78
|
logLevel?: import("../../services/logger.js").LogLevel;
|
|
79
79
|
secrets?: {
|
|
80
80
|
requireAllowedHosts?: boolean;
|
|
@@ -83,4 +83,3 @@ export declare const voiceOutput: (config?: {
|
|
|
83
83
|
webhook?: import("../../services/webhook-service.js").WebhookServiceConfig;
|
|
84
84
|
postgres?: import("../../types/core.types.js").PostgresConfig;
|
|
85
85
|
}>>;
|
|
86
|
-
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { pikkuAgentMiddleware } from '../../middleware/middleware-factories.js';
|
|
2
2
|
import { SPOKEN_TURN } from './voice-input.js';
|
|
3
3
|
function bufferToBase64(data) {
|
|
4
4
|
let binary = '';
|
|
@@ -81,8 +81,8 @@ export const voiceForText = (text, speakable, fallback) => {
|
|
|
81
81
|
}
|
|
82
82
|
return fallback;
|
|
83
83
|
};
|
|
84
|
-
async function synthesizeAudio(
|
|
85
|
-
const result = await
|
|
84
|
+
async function synthesizeAudio(agentRunner, input) {
|
|
85
|
+
const result = await agentRunner.generateSpeech?.({
|
|
86
86
|
model: input.model,
|
|
87
87
|
text: input.text,
|
|
88
88
|
voice: input.voice,
|
|
@@ -93,17 +93,17 @@ async function synthesizeAudio(aiAgentRunner, input) {
|
|
|
93
93
|
abortSignal: input.abortSignal,
|
|
94
94
|
});
|
|
95
95
|
if (!result) {
|
|
96
|
-
throw new Error('voiceOutput requires an
|
|
96
|
+
throw new Error('voiceOutput requires an agentRunner with generateSpeech support');
|
|
97
97
|
}
|
|
98
98
|
return {
|
|
99
99
|
bytes: result.audio.uint8Array,
|
|
100
100
|
format: result.audio.format || input.format || 'pcm16',
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
|
-
export const voiceOutput = (config) =>
|
|
103
|
+
export const voiceOutput = (config) => pikkuAgentMiddleware({
|
|
104
104
|
modifyOutputStream: async (services, { event, state, shared, emit, signal }) => {
|
|
105
|
-
const {
|
|
106
|
-
if (!
|
|
105
|
+
const { agentRunner, logger } = services;
|
|
106
|
+
if (!agentRunner?.generateSpeech)
|
|
107
107
|
return event;
|
|
108
108
|
// knowledge: decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md
|
|
109
109
|
if (!config?.always && shared[SPOKEN_TURN] === false)
|
|
@@ -140,7 +140,7 @@ export const voiceOutput = (config) => pikkuAIMiddleware({
|
|
|
140
140
|
// Settled into a value rather than left as a rejectable promise: it
|
|
141
141
|
// sits unobserved until the chain reaches it, and an unhandled
|
|
142
142
|
// rejection in that window would take the process down.
|
|
143
|
-
const synthesis = synthesizeAudio(
|
|
143
|
+
const synthesis = synthesizeAudio(agentRunner, {
|
|
144
144
|
model: config.model,
|
|
145
145
|
text,
|
|
146
146
|
voice,
|
package/dist/wirings/{ai-scorer/ai-scorer-grade.d.ts → agent-scorer/agent-scorer-grade.d.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ScoreJob, ScorerOutput } from './
|
|
1
|
+
import type { ScoreJob, ScorerOutput } from './agent-scorer.types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Grade one run with one scorer.
|
|
4
4
|
*
|
|
@@ -11,8 +11,8 @@ import type { ScoreJob, ScorerOutput } from './ai-scorer.types.js';
|
|
|
11
11
|
* runs against servers that may have no run-state adapter at all.
|
|
12
12
|
*/
|
|
13
13
|
export declare const gradeRun: (job: ScoreJob, services: {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
agentRunner?: unknown;
|
|
15
|
+
agentRunState?: {
|
|
16
16
|
saveScore: (score: {
|
|
17
17
|
runId: string;
|
|
18
18
|
scorerName: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { runJudge } from './
|
|
2
|
-
import {
|
|
1
|
+
import { runJudge } from './agent-scorer-judge.js';
|
|
2
|
+
import { resolveAgentScorer } from './agent-scorer-registry.js';
|
|
3
3
|
/**
|
|
4
4
|
* Grade one run with one scorer.
|
|
5
5
|
*
|
|
@@ -13,15 +13,15 @@ import { resolveAIScorer } from './ai-scorer-registry.js';
|
|
|
13
13
|
*/
|
|
14
14
|
export const gradeRun = async (job, services, options) => {
|
|
15
15
|
const { scorerName, ...input } = job;
|
|
16
|
-
const scorer =
|
|
16
|
+
const scorer = resolveAgentScorer(scorerName);
|
|
17
17
|
const result = scorer.score
|
|
18
18
|
? await scorer.score(input, services)
|
|
19
|
-
: await runJudge(scorer, input, services.
|
|
19
|
+
: await runJudge(scorer, input, services.agentRunner);
|
|
20
20
|
if (options.persist) {
|
|
21
|
-
if (!services.
|
|
21
|
+
if (!services.agentRunState) {
|
|
22
22
|
throw new Error(`AI run state service not initialized: cannot record the '${scorerName}' grade of run ${job.runId}`);
|
|
23
23
|
}
|
|
24
|
-
await services.
|
|
24
|
+
await services.agentRunState.saveScore({
|
|
25
25
|
runId: job.runId,
|
|
26
26
|
scorerName,
|
|
27
27
|
score: result.score,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentRunnerService } from '../../services/agent-runner-service.js';
|
|
2
|
+
import type { PikkuAgentScorer, ScorerInput, ScorerJudgeConfig, ScorerOutput } from './agent-scorer.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The message a judge grades when its scorer supplies no `prompt`.
|
|
5
|
+
*
|
|
6
|
+
* A reference-based judge is shown the answer key; a reference-free one is not,
|
|
7
|
+
* and grades the answer on its own merits.
|
|
8
|
+
*
|
|
9
|
+
* The tool calls are shown because without them a judge cannot tell a fact from
|
|
10
|
+
* a fabrication. Grading a todo agent that had just listed the user's todos
|
|
11
|
+
* correctly, a judge given only the answer called it "a plausible-looking list"
|
|
12
|
+
* that "offers no real access to your actual list, making it effectively a
|
|
13
|
+
* guess", and scored 0.2 what it scored 1 on other runs — right by its rubric,
|
|
14
|
+
* on the evidence it was given, and wrong about the run. An agent that answers
|
|
15
|
+
* from a tool and one that invents the same sentence are indistinguishable in
|
|
16
|
+
* the output alone; they differ only in what the run did to get there.
|
|
17
|
+
*
|
|
18
|
+
* How much of that to show is `judge.toolCalls`, and the default stops at the
|
|
19
|
+
* names: the 0.2 was the judge doubting the run had any access, and a name
|
|
20
|
+
* settles that without handing a third-party model the rows.
|
|
21
|
+
*/
|
|
22
|
+
export declare const buildJudgePrompt: (judge: ScorerJudgeConfig, input: ScorerInput) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Run an LLM judge and force the `{ score, reason }` contract, so a scorer
|
|
25
|
+
* author writes a rubric rather than a parser.
|
|
26
|
+
*
|
|
27
|
+
* A judge has no tools, which is the one case where an output schema is
|
|
28
|
+
* reliably honoured.
|
|
29
|
+
*/
|
|
30
|
+
export declare const runJudge: (scorer: PikkuAgentScorer<any>, input: ScorerInput, agentRunner: AgentRunnerService | undefined) => Promise<ScorerOutput>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { randomUUID } from '../
|
|
1
|
+
import { randomUUID } from '../agent/agent-utils.js';
|
|
2
2
|
const JUDGE_OUTPUT_SCHEMA = {
|
|
3
3
|
type: 'object',
|
|
4
4
|
properties: {
|
|
@@ -16,11 +16,59 @@ const JUDGE_OUTPUT_SCHEMA = {
|
|
|
16
16
|
required: ['score', 'reason'],
|
|
17
17
|
additionalProperties: false,
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* The default disclosure: which tools ran and which failed, and nothing about
|
|
21
|
+
* what went in or came back. A judge that can see a run reached `listTodos`
|
|
22
|
+
* can tell a retrieved list from an invented one, which is the whole of what
|
|
23
|
+
* the trajectory is needed for — the rows themselves it does not need, and an
|
|
24
|
+
* error string is a tool's own words about the caller's data, so it is
|
|
25
|
+
* summarised rather than quoted.
|
|
26
|
+
*/
|
|
27
|
+
const describeToolCallName = (call) => `- ${call.name}${call.error ? ' (failed)' : ''}`;
|
|
28
|
+
/** Everything about a call, for a judge that grades against what came back. */
|
|
29
|
+
const describeToolCall = (call) => {
|
|
30
|
+
const outcome = call.error
|
|
31
|
+
? `failed: ${call.error}`
|
|
32
|
+
: `returned ${formatToolValue(call.result)}`;
|
|
33
|
+
return `- ${call.name}(${formatToolValue(call.args)}) ${outcome}`;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A tool's arguments and result are arbitrary JSON, and some of it is large —
|
|
37
|
+
* a listing, a document, a page of search results. Truncating keeps a single
|
|
38
|
+
* fat call from crowding the answer out of the judge's context; what survives
|
|
39
|
+
* is the head, which is where the shape of a value is.
|
|
40
|
+
*/
|
|
41
|
+
const TOOL_VALUE_LIMIT = 500;
|
|
42
|
+
const formatToolValue = (value) => {
|
|
43
|
+
if (value === undefined) {
|
|
44
|
+
return 'nothing';
|
|
45
|
+
}
|
|
46
|
+
const text = typeof value === 'string' ? value : JSON.stringify(value);
|
|
47
|
+
if (text === undefined) {
|
|
48
|
+
return 'nothing';
|
|
49
|
+
}
|
|
50
|
+
return text.length > TOOL_VALUE_LIMIT
|
|
51
|
+
? `${text.slice(0, TOOL_VALUE_LIMIT)}… (truncated)`
|
|
52
|
+
: text;
|
|
53
|
+
};
|
|
19
54
|
/**
|
|
20
55
|
* The message a judge grades when its scorer supplies no `prompt`.
|
|
21
56
|
*
|
|
22
57
|
* A reference-based judge is shown the answer key; a reference-free one is not,
|
|
23
58
|
* and grades the answer on its own merits.
|
|
59
|
+
*
|
|
60
|
+
* The tool calls are shown because without them a judge cannot tell a fact from
|
|
61
|
+
* a fabrication. Grading a todo agent that had just listed the user's todos
|
|
62
|
+
* correctly, a judge given only the answer called it "a plausible-looking list"
|
|
63
|
+
* that "offers no real access to your actual list, making it effectively a
|
|
64
|
+
* guess", and scored 0.2 what it scored 1 on other runs — right by its rubric,
|
|
65
|
+
* on the evidence it was given, and wrong about the run. An agent that answers
|
|
66
|
+
* from a tool and one that invents the same sentence are indistinguishable in
|
|
67
|
+
* the output alone; they differ only in what the run did to get there.
|
|
68
|
+
*
|
|
69
|
+
* How much of that to show is `judge.toolCalls`, and the default stops at the
|
|
70
|
+
* names: the 0.2 was the judge doubting the run had any access, and a name
|
|
71
|
+
* settles that without handing a third-party model the rows.
|
|
24
72
|
*/
|
|
25
73
|
export const buildJudgePrompt = (judge, input) => {
|
|
26
74
|
if (judge.prompt)
|
|
@@ -30,6 +78,10 @@ export const buildJudgePrompt = (judge, input) => {
|
|
|
30
78
|
sections.push(`Reference answer:\n${input.reference}`);
|
|
31
79
|
}
|
|
32
80
|
sections.push(`Assistant answered:\n${input.output}`);
|
|
81
|
+
if (judge.toolCalls !== 'off' && input.toolCalls.length > 0) {
|
|
82
|
+
const describe = judge.toolCalls === 'full' ? describeToolCall : describeToolCallName;
|
|
83
|
+
sections.push(`Tools the assistant ran:\n${input.toolCalls.map(describe).join('\n')}`);
|
|
84
|
+
}
|
|
33
85
|
sections.push(judge.goal);
|
|
34
86
|
sections.push('Respond with a score 0..1 and a brief reason.');
|
|
35
87
|
return sections.join('\n\n');
|
|
@@ -51,13 +103,13 @@ const normalizeScore = (scorerName, value) => {
|
|
|
51
103
|
* A judge has no tools, which is the one case where an output schema is
|
|
52
104
|
* reliably honoured.
|
|
53
105
|
*/
|
|
54
|
-
export const runJudge = async (scorer, input,
|
|
106
|
+
export const runJudge = async (scorer, input, agentRunner) => {
|
|
55
107
|
const judge = scorer.judge;
|
|
56
108
|
if (!judge) {
|
|
57
109
|
throw new Error(`Scorer '${scorer.name}' is not a judge`);
|
|
58
110
|
}
|
|
59
|
-
if (!
|
|
60
|
-
throw new Error(`Judge '${scorer.name}' needs an AI provider, but no
|
|
111
|
+
if (!agentRunner) {
|
|
112
|
+
throw new Error(`Judge '${scorer.name}' needs an AI provider, but no agentRunner is registered in this process. ` +
|
|
61
113
|
`A worker deployed apart from the API has to register one to run the slow scoring lane.`);
|
|
62
114
|
}
|
|
63
115
|
if (scorer.requiresReference && input.reference === undefined) {
|
|
@@ -71,7 +123,7 @@ export const runJudge = async (scorer, input, aiAgentRunner) => {
|
|
|
71
123
|
createdAt: new Date(),
|
|
72
124
|
},
|
|
73
125
|
];
|
|
74
|
-
const result = await
|
|
126
|
+
const result = await agentRunner.run({
|
|
75
127
|
model: judge.model,
|
|
76
128
|
instructions: judge.goal,
|
|
77
129
|
messages,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { scorersForAgent } from './
|
|
2
|
-
import { isSampled } from './
|
|
3
|
-
import { SCORER_LANE_QUEUES } from './
|
|
1
|
+
import { scorersForAgent } from './agent-scorer-registry.js';
|
|
2
|
+
import { isSampled } from './agent-scorer-sampling.js';
|
|
3
|
+
import { SCORER_LANE_QUEUES } from './agent-scorer.types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Grade one finished run on live traffic.
|
|
6
6
|
*
|
package/dist/wirings/{ai-scorer/ai-scorer-registry.d.ts → agent-scorer/agent-scorer-registry.d.ts}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
1
|
+
import type { PikkuAgentScorer } from './agent-scorer.types.js';
|
|
2
|
+
export declare const addAgentScorer: (scorerName: string, scorer: PikkuAgentScorer<any>, packageName?: string | null) => void;
|
|
3
|
+
export declare const getAgentScorers: () => Map<string, PikkuAgentScorer>;
|
|
4
|
+
export declare const getAgentScorersMeta: () => import("./agent-scorer.types.js").ScorerMeta;
|
|
5
5
|
/**
|
|
6
6
|
* Resolve a scorer by name across every registered package, the way an agent's
|
|
7
7
|
* tools are resolved: a scorer declared in an addon is nameable by an app agent.
|
|
8
8
|
*/
|
|
9
|
-
export declare const
|
|
9
|
+
export declare const resolveAgentScorer: (scorerName: string) => PikkuAgentScorer<any>;
|
|
10
10
|
/**
|
|
11
11
|
* The scorers an agent asked to be graded by.
|
|
12
12
|
*
|
|
@@ -15,4 +15,4 @@ export declare const resolveAIScorer: (scorerName: string) => PikkuAIScorer<any>
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const scorersForAgent: (agentName: string, logger?: {
|
|
17
17
|
warn: (message: string) => void;
|
|
18
|
-
}) =>
|
|
18
|
+
}) => PikkuAgentScorer<any>[];
|