@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
|
@@ -6,29 +6,29 @@ import {
|
|
|
6
6
|
appendStepMessages,
|
|
7
7
|
checkForApprovals,
|
|
8
8
|
checkForCredentialRequests,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from './
|
|
9
|
+
resumeAgent,
|
|
10
|
+
streamAgent,
|
|
11
|
+
} from './agent-stream.js'
|
|
12
12
|
import {
|
|
13
13
|
ToolApprovalRequired,
|
|
14
14
|
APPROVAL_REQUIRED,
|
|
15
15
|
CREDENTIAL_REQUIRED,
|
|
16
|
-
} from './
|
|
16
|
+
} from './agent-prepare.js'
|
|
17
17
|
import type {
|
|
18
18
|
AgentRunState,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} from './
|
|
24
|
-
import type {
|
|
19
|
+
CoreAgent,
|
|
20
|
+
AgentStreamEvent,
|
|
21
|
+
AgentMessage,
|
|
22
|
+
PikkuAgentMiddlewareHooks,
|
|
23
|
+
} from './agent.types.js'
|
|
24
|
+
import type { AgentStepResult } from '../../services/agent-runner-service.js'
|
|
25
25
|
|
|
26
26
|
beforeEach(() => {
|
|
27
27
|
resetPikkuState()
|
|
28
28
|
})
|
|
29
29
|
|
|
30
30
|
const addTestAgent = (agentName: string) => {
|
|
31
|
-
const agent:
|
|
31
|
+
const agent: CoreAgent = {
|
|
32
32
|
name: agentName,
|
|
33
33
|
description: 'test agent',
|
|
34
34
|
instructions: 'be helpful',
|
|
@@ -45,8 +45,8 @@ const addTestAgent = (agentName: string) => {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
const makeStepResult = (
|
|
48
|
-
overrides?: Partial<
|
|
49
|
-
):
|
|
48
|
+
overrides?: Partial<AgentStepResult>
|
|
49
|
+
): AgentStepResult => ({
|
|
50
50
|
text: '',
|
|
51
51
|
toolCalls: [],
|
|
52
52
|
toolResults: [],
|
|
@@ -55,12 +55,12 @@ const makeStepResult = (
|
|
|
55
55
|
...overrides,
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
-
describe('
|
|
58
|
+
describe('streamAgent', () => {
|
|
59
59
|
test('marks run as failed and emits error/done when stream runner throws', async () => {
|
|
60
60
|
addTestAgent('failing-stream-agent')
|
|
61
61
|
|
|
62
62
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
63
|
-
const events:
|
|
63
|
+
const events: AgentStreamEvent[] = []
|
|
64
64
|
|
|
65
65
|
const mockServices = {
|
|
66
66
|
logger: {
|
|
@@ -69,12 +69,12 @@ describe('streamAIAgent', () => {
|
|
|
69
69
|
error: () => {},
|
|
70
70
|
debug: () => {},
|
|
71
71
|
},
|
|
72
|
-
|
|
72
|
+
agentRunner: {
|
|
73
73
|
stream: async () => {
|
|
74
74
|
throw new Error('stream failed')
|
|
75
75
|
},
|
|
76
76
|
},
|
|
77
|
-
|
|
77
|
+
agentRunState: {
|
|
78
78
|
createRun: async () => 'run-1',
|
|
79
79
|
updateRun: async (runId: string, patch: unknown) => {
|
|
80
80
|
updates.push({ runId, patch })
|
|
@@ -84,7 +84,7 @@ describe('streamAIAgent', () => {
|
|
|
84
84
|
|
|
85
85
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
86
86
|
|
|
87
|
-
await
|
|
87
|
+
await streamAgent(
|
|
88
88
|
'failing-stream-agent',
|
|
89
89
|
{
|
|
90
90
|
message: 'hello',
|
|
@@ -95,7 +95,7 @@ describe('streamAIAgent', () => {
|
|
|
95
95
|
channelId: 'channel-1',
|
|
96
96
|
openingData: undefined,
|
|
97
97
|
state: 'open',
|
|
98
|
-
send: (event:
|
|
98
|
+
send: (event: AgentStreamEvent) => {
|
|
99
99
|
events.push(event)
|
|
100
100
|
},
|
|
101
101
|
close: () => {},
|
|
@@ -119,7 +119,7 @@ describe('streamAIAgent', () => {
|
|
|
119
119
|
addTestAgent('simple-stream-agent')
|
|
120
120
|
|
|
121
121
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
122
|
-
const events:
|
|
122
|
+
const events: AgentStreamEvent[] = []
|
|
123
123
|
|
|
124
124
|
const mockServices = {
|
|
125
125
|
logger: {
|
|
@@ -128,12 +128,12 @@ describe('streamAIAgent', () => {
|
|
|
128
128
|
error: () => {},
|
|
129
129
|
debug: () => {},
|
|
130
130
|
},
|
|
131
|
-
|
|
132
|
-
stream: async (): Promise<
|
|
131
|
+
agentRunner: {
|
|
132
|
+
stream: async (): Promise<AgentStepResult> => {
|
|
133
133
|
return makeStepResult({ text: 'Hello world' })
|
|
134
134
|
},
|
|
135
135
|
},
|
|
136
|
-
|
|
136
|
+
agentRunState: {
|
|
137
137
|
createRun: async () => 'run-simple',
|
|
138
138
|
updateRun: async (runId: string, patch: unknown) => {
|
|
139
139
|
updates.push({ runId, patch })
|
|
@@ -143,7 +143,7 @@ describe('streamAIAgent', () => {
|
|
|
143
143
|
|
|
144
144
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
145
145
|
|
|
146
|
-
await
|
|
146
|
+
await streamAgent(
|
|
147
147
|
'simple-stream-agent',
|
|
148
148
|
{
|
|
149
149
|
message: 'hello',
|
|
@@ -154,7 +154,7 @@ describe('streamAIAgent', () => {
|
|
|
154
154
|
channelId: 'channel-simple',
|
|
155
155
|
openingData: undefined,
|
|
156
156
|
state: 'open',
|
|
157
|
-
send: (event:
|
|
157
|
+
send: (event: AgentStreamEvent) => {
|
|
158
158
|
events.push(event)
|
|
159
159
|
},
|
|
160
160
|
close: () => {},
|
|
@@ -175,10 +175,10 @@ describe('streamAIAgent', () => {
|
|
|
175
175
|
description: 'test agent',
|
|
176
176
|
instructions: 'be helpful',
|
|
177
177
|
model: 'test/test-model',
|
|
178
|
-
} as
|
|
178
|
+
} as CoreAgent)
|
|
179
179
|
|
|
180
180
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
181
|
-
const events:
|
|
181
|
+
const events: AgentStreamEvent[] = []
|
|
182
182
|
|
|
183
183
|
const mockServices = {
|
|
184
184
|
logger: {
|
|
@@ -187,11 +187,11 @@ describe('streamAIAgent', () => {
|
|
|
187
187
|
error: () => {},
|
|
188
188
|
debug: () => {},
|
|
189
189
|
},
|
|
190
|
-
|
|
191
|
-
stream: async (): Promise<
|
|
190
|
+
agentRunner: {
|
|
191
|
+
stream: async (): Promise<AgentStepResult> =>
|
|
192
192
|
makeStepResult({ text: 'Hello world' }),
|
|
193
193
|
},
|
|
194
|
-
|
|
194
|
+
agentRunState: {
|
|
195
195
|
createRun: async () => 'run-no-meta',
|
|
196
196
|
updateRun: async (runId: string, patch: unknown) => {
|
|
197
197
|
updates.push({ runId, patch })
|
|
@@ -201,7 +201,7 @@ describe('streamAIAgent', () => {
|
|
|
201
201
|
|
|
202
202
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
203
203
|
|
|
204
|
-
await
|
|
204
|
+
await streamAgent(
|
|
205
205
|
agentName,
|
|
206
206
|
{
|
|
207
207
|
message: 'hello',
|
|
@@ -212,7 +212,7 @@ describe('streamAIAgent', () => {
|
|
|
212
212
|
channelId: 'channel-no-meta',
|
|
213
213
|
openingData: undefined,
|
|
214
214
|
state: 'open',
|
|
215
|
-
send: (event:
|
|
215
|
+
send: (event: AgentStreamEvent) => {
|
|
216
216
|
events.push(event)
|
|
217
217
|
},
|
|
218
218
|
close: () => {},
|
|
@@ -234,7 +234,7 @@ describe('streamAIAgent', () => {
|
|
|
234
234
|
addTestAgent('approval-stream-agent')
|
|
235
235
|
|
|
236
236
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
237
|
-
const events:
|
|
237
|
+
const events: AgentStreamEvent[] = []
|
|
238
238
|
|
|
239
239
|
const mockServices = {
|
|
240
240
|
logger: {
|
|
@@ -243,8 +243,8 @@ describe('streamAIAgent', () => {
|
|
|
243
243
|
error: () => {},
|
|
244
244
|
debug: () => {},
|
|
245
245
|
},
|
|
246
|
-
|
|
247
|
-
stream: async (): Promise<
|
|
246
|
+
agentRunner: {
|
|
247
|
+
stream: async (): Promise<AgentStepResult> => {
|
|
248
248
|
return makeStepResult({
|
|
249
249
|
toolCalls: [
|
|
250
250
|
{
|
|
@@ -256,7 +256,7 @@ describe('streamAIAgent', () => {
|
|
|
256
256
|
})
|
|
257
257
|
},
|
|
258
258
|
},
|
|
259
|
-
|
|
259
|
+
agentRunState: {
|
|
260
260
|
createRun: async () => 'run-2',
|
|
261
261
|
updateRun: async (runId: string, patch: unknown) => {
|
|
262
262
|
updates.push({ runId, patch })
|
|
@@ -281,7 +281,7 @@ describe('streamAIAgent', () => {
|
|
|
281
281
|
properties: { id: { type: 'number' } },
|
|
282
282
|
})
|
|
283
283
|
|
|
284
|
-
await
|
|
284
|
+
await streamAgent(
|
|
285
285
|
agentName,
|
|
286
286
|
{
|
|
287
287
|
message: 'hello',
|
|
@@ -292,7 +292,7 @@ describe('streamAIAgent', () => {
|
|
|
292
292
|
channelId: 'channel-2',
|
|
293
293
|
openingData: undefined,
|
|
294
294
|
state: 'open',
|
|
295
|
-
send: (event:
|
|
295
|
+
send: (event: AgentStreamEvent) => {
|
|
296
296
|
events.push(event)
|
|
297
297
|
},
|
|
298
298
|
close: () => {},
|
|
@@ -340,7 +340,7 @@ describe('streamAIAgent', () => {
|
|
|
340
340
|
addTestAgent('multi-approval-agent')
|
|
341
341
|
|
|
342
342
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
343
|
-
const events:
|
|
343
|
+
const events: AgentStreamEvent[] = []
|
|
344
344
|
|
|
345
345
|
const mockServices = {
|
|
346
346
|
logger: {
|
|
@@ -349,8 +349,8 @@ describe('streamAIAgent', () => {
|
|
|
349
349
|
error: () => {},
|
|
350
350
|
debug: () => {},
|
|
351
351
|
},
|
|
352
|
-
|
|
353
|
-
stream: async (): Promise<
|
|
352
|
+
agentRunner: {
|
|
353
|
+
stream: async (): Promise<AgentStepResult> => {
|
|
354
354
|
return makeStepResult({
|
|
355
355
|
toolCalls: [
|
|
356
356
|
{
|
|
@@ -372,7 +372,7 @@ describe('streamAIAgent', () => {
|
|
|
372
372
|
})
|
|
373
373
|
},
|
|
374
374
|
},
|
|
375
|
-
|
|
375
|
+
agentRunState: {
|
|
376
376
|
createRun: async () => 'run-multi-approval',
|
|
377
377
|
updateRun: async (runId: string, patch: unknown) => {
|
|
378
378
|
updates.push({ runId, patch })
|
|
@@ -398,7 +398,7 @@ describe('streamAIAgent', () => {
|
|
|
398
398
|
properties: { title: { type: 'string' } },
|
|
399
399
|
})
|
|
400
400
|
|
|
401
|
-
await
|
|
401
|
+
await streamAgent(
|
|
402
402
|
agentName,
|
|
403
403
|
{
|
|
404
404
|
message: 'create 3 todos',
|
|
@@ -409,7 +409,7 @@ describe('streamAIAgent', () => {
|
|
|
409
409
|
channelId: 'channel-multi-approval',
|
|
410
410
|
openingData: undefined,
|
|
411
411
|
state: 'open',
|
|
412
|
-
send: (event:
|
|
412
|
+
send: (event: AgentStreamEvent) => {
|
|
413
413
|
events.push(event)
|
|
414
414
|
},
|
|
415
415
|
close: () => {},
|
|
@@ -436,7 +436,7 @@ describe('streamAIAgent', () => {
|
|
|
436
436
|
addTestAgent('addon-approval-agent')
|
|
437
437
|
|
|
438
438
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
439
|
-
const events:
|
|
439
|
+
const events: AgentStreamEvent[] = []
|
|
440
440
|
|
|
441
441
|
const mockServices = {
|
|
442
442
|
logger: {
|
|
@@ -445,8 +445,8 @@ describe('streamAIAgent', () => {
|
|
|
445
445
|
error: () => {},
|
|
446
446
|
debug: () => {},
|
|
447
447
|
},
|
|
448
|
-
|
|
449
|
-
stream: async (params: any): Promise<
|
|
448
|
+
agentRunner: {
|
|
449
|
+
stream: async (params: any): Promise<AgentStepResult> => {
|
|
450
450
|
const addTodoTool = params.tools.find(
|
|
451
451
|
(t: any) => t.name === 'todos__addTodo'
|
|
452
452
|
)
|
|
@@ -468,7 +468,7 @@ describe('streamAIAgent', () => {
|
|
|
468
468
|
})
|
|
469
469
|
},
|
|
470
470
|
},
|
|
471
|
-
|
|
471
|
+
agentRunState: {
|
|
472
472
|
createRun: async () => 'run-addon-approval',
|
|
473
473
|
updateRun: async (runId: string, patch: unknown) => {
|
|
474
474
|
updates.push({ runId, patch })
|
|
@@ -496,7 +496,7 @@ describe('streamAIAgent', () => {
|
|
|
496
496
|
const agentName = 'addon-approval-agent'
|
|
497
497
|
pikkuState(null, 'agent', 'agentsMeta')[agentName].tools = ['todos:addTodo']
|
|
498
498
|
|
|
499
|
-
await
|
|
499
|
+
await streamAgent(
|
|
500
500
|
agentName,
|
|
501
501
|
{
|
|
502
502
|
message: 'add a todo',
|
|
@@ -507,7 +507,7 @@ describe('streamAIAgent', () => {
|
|
|
507
507
|
channelId: 'channel-addon-approval',
|
|
508
508
|
openingData: undefined,
|
|
509
509
|
state: 'open',
|
|
510
|
-
send: (event:
|
|
510
|
+
send: (event: AgentStreamEvent) => {
|
|
511
511
|
events.push(event)
|
|
512
512
|
},
|
|
513
513
|
close: () => {},
|
|
@@ -536,7 +536,7 @@ describe('streamAIAgent', () => {
|
|
|
536
536
|
]
|
|
537
537
|
|
|
538
538
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
539
|
-
const events:
|
|
539
|
+
const events: AgentStreamEvent[] = []
|
|
540
540
|
|
|
541
541
|
const mockServices = {
|
|
542
542
|
logger: {
|
|
@@ -545,8 +545,8 @@ describe('streamAIAgent', () => {
|
|
|
545
545
|
error: () => {},
|
|
546
546
|
debug: () => {},
|
|
547
547
|
},
|
|
548
|
-
|
|
549
|
-
stream: async (): Promise<
|
|
548
|
+
agentRunner: {
|
|
549
|
+
stream: async (): Promise<AgentStepResult> => {
|
|
550
550
|
return makeStepResult({
|
|
551
551
|
toolCalls: [
|
|
552
552
|
{
|
|
@@ -573,7 +573,7 @@ describe('streamAIAgent', () => {
|
|
|
573
573
|
})
|
|
574
574
|
},
|
|
575
575
|
},
|
|
576
|
-
|
|
576
|
+
agentRunState: {
|
|
577
577
|
createRun: async () => 'run-3',
|
|
578
578
|
updateRun: async (runId: string, patch: unknown) => {
|
|
579
579
|
updates.push({ runId, patch })
|
|
@@ -583,7 +583,7 @@ describe('streamAIAgent', () => {
|
|
|
583
583
|
|
|
584
584
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
585
585
|
|
|
586
|
-
await
|
|
586
|
+
await streamAgent(
|
|
587
587
|
'parent-agent',
|
|
588
588
|
{
|
|
589
589
|
message: 'hello',
|
|
@@ -594,7 +594,7 @@ describe('streamAIAgent', () => {
|
|
|
594
594
|
channelId: 'channel-3',
|
|
595
595
|
openingData: undefined,
|
|
596
596
|
state: 'open',
|
|
597
|
-
send: (event:
|
|
597
|
+
send: (event: AgentStreamEvent) => {
|
|
598
598
|
events.push(event)
|
|
599
599
|
},
|
|
600
600
|
close: () => {},
|
|
@@ -635,7 +635,7 @@ describe('streamAIAgent', () => {
|
|
|
635
635
|
addTestAgent('multi-step-agent')
|
|
636
636
|
|
|
637
637
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
638
|
-
const events:
|
|
638
|
+
const events: AgentStreamEvent[] = []
|
|
639
639
|
let callCount = 0
|
|
640
640
|
|
|
641
641
|
const mockServices = {
|
|
@@ -645,8 +645,8 @@ describe('streamAIAgent', () => {
|
|
|
645
645
|
error: () => {},
|
|
646
646
|
debug: () => {},
|
|
647
647
|
},
|
|
648
|
-
|
|
649
|
-
stream: async (): Promise<
|
|
648
|
+
agentRunner: {
|
|
649
|
+
stream: async (): Promise<AgentStepResult> => {
|
|
650
650
|
callCount++
|
|
651
651
|
if (callCount === 1) {
|
|
652
652
|
return makeStepResult({
|
|
@@ -667,7 +667,7 @@ describe('streamAIAgent', () => {
|
|
|
667
667
|
return makeStepResult({ text: 'Final answer', finishReason: 'stop' })
|
|
668
668
|
},
|
|
669
669
|
},
|
|
670
|
-
|
|
670
|
+
agentRunState: {
|
|
671
671
|
createRun: async () => 'run-multi',
|
|
672
672
|
updateRun: async (runId: string, patch: unknown) => {
|
|
673
673
|
updates.push({ runId, patch })
|
|
@@ -677,7 +677,7 @@ describe('streamAIAgent', () => {
|
|
|
677
677
|
|
|
678
678
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
679
679
|
|
|
680
|
-
await
|
|
680
|
+
await streamAgent(
|
|
681
681
|
'multi-step-agent',
|
|
682
682
|
{
|
|
683
683
|
message: 'hello',
|
|
@@ -688,7 +688,7 @@ describe('streamAIAgent', () => {
|
|
|
688
688
|
channelId: 'channel-multi',
|
|
689
689
|
openingData: undefined,
|
|
690
690
|
state: 'open',
|
|
691
|
-
send: (event:
|
|
691
|
+
send: (event: AgentStreamEvent) => {
|
|
692
692
|
events.push(event)
|
|
693
693
|
},
|
|
694
694
|
close: () => {},
|
|
@@ -707,7 +707,7 @@ describe('streamAIAgent', () => {
|
|
|
707
707
|
addTestAgent('afterstep-stream-agent')
|
|
708
708
|
|
|
709
709
|
const afterStepCalls: unknown[] = []
|
|
710
|
-
const middleware:
|
|
710
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
711
711
|
afterStep: async (_services, ctx) => {
|
|
712
712
|
afterStepCalls.push(ctx)
|
|
713
713
|
},
|
|
@@ -715,11 +715,11 @@ describe('streamAIAgent', () => {
|
|
|
715
715
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
716
716
|
'afterstep-stream-agent'
|
|
717
717
|
)!
|
|
718
|
-
agent.
|
|
718
|
+
agent.agentMiddleware = [middleware] as any
|
|
719
719
|
pikkuState(null, 'agent', 'agents').set('afterstep-stream-agent', agent)
|
|
720
720
|
|
|
721
721
|
let callCount = 0
|
|
722
|
-
const events:
|
|
722
|
+
const events: AgentStreamEvent[] = []
|
|
723
723
|
|
|
724
724
|
const mockServices = {
|
|
725
725
|
logger: {
|
|
@@ -728,8 +728,8 @@ describe('streamAIAgent', () => {
|
|
|
728
728
|
error: () => {},
|
|
729
729
|
debug: () => {},
|
|
730
730
|
},
|
|
731
|
-
|
|
732
|
-
stream: async (): Promise<
|
|
731
|
+
agentRunner: {
|
|
732
|
+
stream: async (): Promise<AgentStepResult> => {
|
|
733
733
|
callCount++
|
|
734
734
|
if (callCount === 1) {
|
|
735
735
|
return makeStepResult({
|
|
@@ -750,7 +750,7 @@ describe('streamAIAgent', () => {
|
|
|
750
750
|
})
|
|
751
751
|
},
|
|
752
752
|
},
|
|
753
|
-
|
|
753
|
+
agentRunState: {
|
|
754
754
|
createRun: async () => 'run-as',
|
|
755
755
|
updateRun: async () => {},
|
|
756
756
|
},
|
|
@@ -758,14 +758,14 @@ describe('streamAIAgent', () => {
|
|
|
758
758
|
|
|
759
759
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
760
760
|
|
|
761
|
-
await
|
|
761
|
+
await streamAgent(
|
|
762
762
|
'afterstep-stream-agent',
|
|
763
763
|
{ message: 'hi', threadId: 't-as', resourceId: 'r-as' },
|
|
764
764
|
{
|
|
765
765
|
channelId: 'c-as',
|
|
766
766
|
openingData: undefined,
|
|
767
767
|
state: 'open',
|
|
768
|
-
send: (event:
|
|
768
|
+
send: (event: AgentStreamEvent) => events.push(event),
|
|
769
769
|
close: () => {},
|
|
770
770
|
},
|
|
771
771
|
{}
|
|
@@ -782,7 +782,7 @@ describe('streamAIAgent', () => {
|
|
|
782
782
|
addTestAgent('onerror-stream-agent')
|
|
783
783
|
|
|
784
784
|
const onErrorCalls: unknown[] = []
|
|
785
|
-
const middleware:
|
|
785
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
786
786
|
onError: async (_services, ctx) => {
|
|
787
787
|
onErrorCalls.push(ctx)
|
|
788
788
|
},
|
|
@@ -790,10 +790,10 @@ describe('streamAIAgent', () => {
|
|
|
790
790
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
791
791
|
'onerror-stream-agent'
|
|
792
792
|
)!
|
|
793
|
-
agent.
|
|
793
|
+
agent.agentMiddleware = [middleware] as any
|
|
794
794
|
pikkuState(null, 'agent', 'agents').set('onerror-stream-agent', agent)
|
|
795
795
|
|
|
796
|
-
const events:
|
|
796
|
+
const events: AgentStreamEvent[] = []
|
|
797
797
|
const mockServices = {
|
|
798
798
|
logger: {
|
|
799
799
|
info: () => {},
|
|
@@ -801,12 +801,12 @@ describe('streamAIAgent', () => {
|
|
|
801
801
|
error: () => {},
|
|
802
802
|
debug: () => {},
|
|
803
803
|
},
|
|
804
|
-
|
|
804
|
+
agentRunner: {
|
|
805
805
|
stream: async () => {
|
|
806
806
|
throw new Error('stream boom')
|
|
807
807
|
},
|
|
808
808
|
},
|
|
809
|
-
|
|
809
|
+
agentRunState: {
|
|
810
810
|
createRun: async () => 'run-oe',
|
|
811
811
|
updateRun: async () => {},
|
|
812
812
|
},
|
|
@@ -814,14 +814,14 @@ describe('streamAIAgent', () => {
|
|
|
814
814
|
|
|
815
815
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
816
816
|
|
|
817
|
-
await
|
|
817
|
+
await streamAgent(
|
|
818
818
|
'onerror-stream-agent',
|
|
819
819
|
{ message: 'hi', threadId: 't-oe', resourceId: 'r-oe' },
|
|
820
820
|
{
|
|
821
821
|
channelId: 'c-oe',
|
|
822
822
|
openingData: undefined,
|
|
823
823
|
state: 'open',
|
|
824
|
-
send: (event:
|
|
824
|
+
send: (event: AgentStreamEvent) => events.push(event),
|
|
825
825
|
close: () => {},
|
|
826
826
|
},
|
|
827
827
|
{}
|
|
@@ -837,7 +837,7 @@ describe('streamAIAgent', () => {
|
|
|
837
837
|
addTestAgent('toolhooks-stream-agent')
|
|
838
838
|
|
|
839
839
|
const hookCalls: { hook: string; ctx: any }[] = []
|
|
840
|
-
const middleware:
|
|
840
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
841
841
|
beforeToolCall: async (_services, ctx) => {
|
|
842
842
|
hookCalls.push({ hook: 'before', ctx })
|
|
843
843
|
return { args: { ...ctx.args, injected: true } }
|
|
@@ -849,7 +849,7 @@ describe('streamAIAgent', () => {
|
|
|
849
849
|
}
|
|
850
850
|
const agentName = 'toolhooks-stream-agent'
|
|
851
851
|
const agent = pikkuState(null, 'agent', 'agents').get(agentName)!
|
|
852
|
-
agent.
|
|
852
|
+
agent.agentMiddleware = [middleware] as any
|
|
853
853
|
agent.tools = ['myTool']
|
|
854
854
|
pikkuState(null, 'agent', 'agents').set(agentName, agent)
|
|
855
855
|
pikkuState(null, 'agent', 'agentsMeta')[agentName].tools = ['myTool']
|
|
@@ -858,7 +858,7 @@ describe('streamAIAgent', () => {
|
|
|
858
858
|
description: 'test tool',
|
|
859
859
|
}
|
|
860
860
|
|
|
861
|
-
const events:
|
|
861
|
+
const events: AgentStreamEvent[] = []
|
|
862
862
|
let callCount = 0
|
|
863
863
|
|
|
864
864
|
const mockServices = {
|
|
@@ -868,11 +868,11 @@ describe('streamAIAgent', () => {
|
|
|
868
868
|
error: () => {},
|
|
869
869
|
debug: () => {},
|
|
870
870
|
},
|
|
871
|
-
|
|
871
|
+
agentRunner: {
|
|
872
872
|
stream: async (
|
|
873
873
|
params: any,
|
|
874
874
|
_channel: any
|
|
875
|
-
): Promise<
|
|
875
|
+
): Promise<AgentStepResult> => {
|
|
876
876
|
callCount++
|
|
877
877
|
if (callCount === 1) {
|
|
878
878
|
const tool = params.tools.find((t: any) => t.name === 'myTool')
|
|
@@ -889,7 +889,7 @@ describe('streamAIAgent', () => {
|
|
|
889
889
|
return makeStepResult({ text: 'done', finishReason: 'stop' })
|
|
890
890
|
},
|
|
891
891
|
},
|
|
892
|
-
|
|
892
|
+
agentRunState: {
|
|
893
893
|
createRun: async () => 'run-th',
|
|
894
894
|
updateRun: async () => {},
|
|
895
895
|
},
|
|
@@ -898,14 +898,14 @@ describe('streamAIAgent', () => {
|
|
|
898
898
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
899
899
|
pikkuState(null, 'package', 'createWireServices', () => ({}))
|
|
900
900
|
|
|
901
|
-
await
|
|
901
|
+
await streamAgent(
|
|
902
902
|
agentName,
|
|
903
903
|
{ message: 'hi', threadId: 't-th', resourceId: 'r-th' },
|
|
904
904
|
{
|
|
905
905
|
channelId: 'c-th',
|
|
906
906
|
openingData: undefined,
|
|
907
907
|
state: 'open',
|
|
908
|
-
send: (event:
|
|
908
|
+
send: (event: AgentStreamEvent) => events.push(event),
|
|
909
909
|
close: () => {},
|
|
910
910
|
},
|
|
911
911
|
{}
|
|
@@ -925,7 +925,7 @@ describe('streamAIAgent', () => {
|
|
|
925
925
|
addTestAgent('credential-stream-agent')
|
|
926
926
|
|
|
927
927
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
928
|
-
const events:
|
|
928
|
+
const events: AgentStreamEvent[] = []
|
|
929
929
|
|
|
930
930
|
const mockServices = {
|
|
931
931
|
logger: {
|
|
@@ -934,11 +934,11 @@ describe('streamAIAgent', () => {
|
|
|
934
934
|
error: () => {},
|
|
935
935
|
debug: () => {},
|
|
936
936
|
},
|
|
937
|
-
|
|
937
|
+
agentRunner: {
|
|
938
938
|
stream: async (
|
|
939
939
|
_params: unknown,
|
|
940
|
-
streamChannel:
|
|
941
|
-
): Promise<
|
|
940
|
+
streamChannel: AgentStreamChannel | null
|
|
941
|
+
): Promise<AgentStepResult> => {
|
|
942
942
|
const credentialResult = {
|
|
943
943
|
[CREDENTIAL_REQUIRED]: true,
|
|
944
944
|
__credentialRequired: true,
|
|
@@ -966,7 +966,7 @@ describe('streamAIAgent', () => {
|
|
|
966
966
|
})
|
|
967
967
|
},
|
|
968
968
|
},
|
|
969
|
-
|
|
969
|
+
agentRunState: {
|
|
970
970
|
createRun: async () => 'run-cred',
|
|
971
971
|
updateRun: async (runId: string, patch: unknown) => {
|
|
972
972
|
updates.push({ runId, patch })
|
|
@@ -976,7 +976,7 @@ describe('streamAIAgent', () => {
|
|
|
976
976
|
|
|
977
977
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
978
978
|
|
|
979
|
-
await
|
|
979
|
+
await streamAgent(
|
|
980
980
|
'credential-stream-agent',
|
|
981
981
|
{
|
|
982
982
|
message: 'connect',
|
|
@@ -987,7 +987,7 @@ describe('streamAIAgent', () => {
|
|
|
987
987
|
channelId: 'channel-cred',
|
|
988
988
|
openingData: undefined,
|
|
989
989
|
state: 'open',
|
|
990
|
-
send: (event:
|
|
990
|
+
send: (event: AgentStreamEvent) => events.push(event),
|
|
991
991
|
close: () => {},
|
|
992
992
|
},
|
|
993
993
|
{}
|
|
@@ -1038,12 +1038,13 @@ describe('streamAIAgent', () => {
|
|
|
1038
1038
|
test('persists streamed events, applies output stream middleware, and updates usage', async () => {
|
|
1039
1039
|
addTestAgent('persisted-stream-agent')
|
|
1040
1040
|
|
|
1041
|
-
const events:
|
|
1042
|
-
const savedMessages: Array<{ threadId: string; messages:
|
|
1041
|
+
const events: AgentStreamEvent[] = []
|
|
1042
|
+
const savedMessages: Array<{ threadId: string; messages: AgentMessage[] }> =
|
|
1043
|
+
[]
|
|
1043
1044
|
const updates: Array<{ runId: string; patch: unknown }> = []
|
|
1044
1045
|
const middlewareStateSnapshots: number[] = []
|
|
1045
1046
|
|
|
1046
|
-
const middleware:
|
|
1047
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
1047
1048
|
modifyOutputStream: async (_services, ctx) => {
|
|
1048
1049
|
const count = Number((ctx.state.count as number | undefined) ?? 0) + 1
|
|
1049
1050
|
ctx.state.count = count
|
|
@@ -1051,7 +1052,10 @@ describe('streamAIAgent', () => {
|
|
|
1051
1052
|
if (ctx.event.type === 'text-delta') {
|
|
1052
1053
|
return [
|
|
1053
1054
|
ctx.event,
|
|
1054
|
-
{
|
|
1055
|
+
{
|
|
1056
|
+
type: 'reasoning-delta',
|
|
1057
|
+
text: `seen:${count}`,
|
|
1058
|
+
} as AgentStreamEvent,
|
|
1055
1059
|
]
|
|
1056
1060
|
}
|
|
1057
1061
|
return ctx.event
|
|
@@ -1064,7 +1068,7 @@ describe('streamAIAgent', () => {
|
|
|
1064
1068
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
1065
1069
|
'persisted-stream-agent'
|
|
1066
1070
|
)!
|
|
1067
|
-
agent.
|
|
1071
|
+
agent.agentMiddleware = [middleware] as any
|
|
1068
1072
|
pikkuState(null, 'agent', 'agents').set('persisted-stream-agent', agent)
|
|
1069
1073
|
|
|
1070
1074
|
const mockServices = {
|
|
@@ -1074,11 +1078,11 @@ describe('streamAIAgent', () => {
|
|
|
1074
1078
|
error: () => {},
|
|
1075
1079
|
debug: () => {},
|
|
1076
1080
|
},
|
|
1077
|
-
|
|
1081
|
+
agentRunner: {
|
|
1078
1082
|
stream: async (
|
|
1079
1083
|
_params: any,
|
|
1080
1084
|
channel: any
|
|
1081
|
-
): Promise<
|
|
1085
|
+
): Promise<AgentStepResult> => {
|
|
1082
1086
|
channel.send({ type: 'text-delta', text: 'Hello' })
|
|
1083
1087
|
channel.send({
|
|
1084
1088
|
type: 'tool-call',
|
|
@@ -1096,7 +1100,7 @@ describe('streamAIAgent', () => {
|
|
|
1096
1100
|
type: 'usage',
|
|
1097
1101
|
tokens: { input: 3, output: 4 },
|
|
1098
1102
|
model: 'test/test-model',
|
|
1099
|
-
} as
|
|
1103
|
+
} as AgentStreamEvent)
|
|
1100
1104
|
return makeStepResult({
|
|
1101
1105
|
text: 'Hello',
|
|
1102
1106
|
usage: { inputTokens: 3, outputTokens: 4 },
|
|
@@ -1104,16 +1108,16 @@ describe('streamAIAgent', () => {
|
|
|
1104
1108
|
})
|
|
1105
1109
|
},
|
|
1106
1110
|
},
|
|
1107
|
-
|
|
1111
|
+
agentRunState: {
|
|
1108
1112
|
createRun: async () => 'run-persisted',
|
|
1109
1113
|
updateRun: async (runId: string, patch: unknown) => {
|
|
1110
1114
|
updates.push({ runId, patch })
|
|
1111
1115
|
},
|
|
1112
1116
|
},
|
|
1113
|
-
|
|
1117
|
+
agentStorage: {
|
|
1114
1118
|
createThread: async () => {},
|
|
1115
1119
|
getMessages: async () => [],
|
|
1116
|
-
saveMessages: async (threadId: string, messages:
|
|
1120
|
+
saveMessages: async (threadId: string, messages: AgentMessage[]) => {
|
|
1117
1121
|
savedMessages.push({ threadId, messages })
|
|
1118
1122
|
},
|
|
1119
1123
|
},
|
|
@@ -1121,7 +1125,7 @@ describe('streamAIAgent', () => {
|
|
|
1121
1125
|
|
|
1122
1126
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
1123
1127
|
|
|
1124
|
-
const result = await
|
|
1128
|
+
const result = await streamAgent(
|
|
1125
1129
|
'persisted-stream-agent',
|
|
1126
1130
|
{
|
|
1127
1131
|
message: 'hello',
|
|
@@ -1132,7 +1136,7 @@ describe('streamAIAgent', () => {
|
|
|
1132
1136
|
channelId: 'channel-persisted',
|
|
1133
1137
|
openingData: undefined,
|
|
1134
1138
|
state: 'open',
|
|
1135
|
-
send: (event:
|
|
1139
|
+
send: (event: AgentStreamEvent) => events.push(event),
|
|
1136
1140
|
close: () => {},
|
|
1137
1141
|
},
|
|
1138
1142
|
{}
|
|
@@ -1164,7 +1168,7 @@ describe('streamAIAgent', () => {
|
|
|
1164
1168
|
test('a storage failure while streaming does not become an unhandled rejection', async () => {
|
|
1165
1169
|
addTestAgent('storage-failure-agent')
|
|
1166
1170
|
|
|
1167
|
-
const events:
|
|
1171
|
+
const events: AgentStreamEvent[] = []
|
|
1168
1172
|
const loggedErrors: unknown[] = []
|
|
1169
1173
|
|
|
1170
1174
|
const mockServices = {
|
|
@@ -1176,34 +1180,34 @@ describe('streamAIAgent', () => {
|
|
|
1176
1180
|
},
|
|
1177
1181
|
debug: () => {},
|
|
1178
1182
|
},
|
|
1179
|
-
|
|
1183
|
+
agentRunner: {
|
|
1180
1184
|
stream: async (
|
|
1181
1185
|
_params: unknown,
|
|
1182
|
-
channel:
|
|
1183
|
-
): Promise<
|
|
1186
|
+
channel: AgentStreamChannel
|
|
1187
|
+
): Promise<AgentStepResult> => {
|
|
1184
1188
|
channel.send({
|
|
1185
1189
|
type: 'text-delta',
|
|
1186
1190
|
text: 'persisted text',
|
|
1187
|
-
} as
|
|
1191
|
+
} as AgentStreamEvent)
|
|
1188
1192
|
channel.send({
|
|
1189
1193
|
type: 'usage',
|
|
1190
1194
|
tokens: { input: 1, output: 1 },
|
|
1191
1195
|
model: 'test/test-model',
|
|
1192
|
-
} as
|
|
1196
|
+
} as AgentStreamEvent)
|
|
1193
1197
|
return makeStepResult({ text: 'persisted text' })
|
|
1194
1198
|
},
|
|
1195
1199
|
},
|
|
1196
|
-
|
|
1200
|
+
agentRunState: {
|
|
1197
1201
|
createRun: async () => 'run-storage-failure',
|
|
1198
1202
|
updateRun: async () => {},
|
|
1199
1203
|
},
|
|
1200
|
-
|
|
1204
|
+
agentStorage: {
|
|
1201
1205
|
getThread: async () => undefined,
|
|
1202
1206
|
createThread: async () => {},
|
|
1203
1207
|
getMessages: async () => [],
|
|
1204
|
-
saveMessages: async (_threadId: string, messages:
|
|
1208
|
+
saveMessages: async (_threadId: string, messages: AgentMessage[]) => {
|
|
1205
1209
|
if (messages.some((m) => m.role !== 'user')) {
|
|
1206
|
-
throw new Error('UNIQUE constraint failed:
|
|
1210
|
+
throw new Error('UNIQUE constraint failed: agent_tool_call.id')
|
|
1207
1211
|
}
|
|
1208
1212
|
},
|
|
1209
1213
|
},
|
|
@@ -1216,7 +1220,7 @@ describe('streamAIAgent', () => {
|
|
|
1216
1220
|
process.on('unhandledRejection', onUnhandled)
|
|
1217
1221
|
|
|
1218
1222
|
try {
|
|
1219
|
-
await
|
|
1223
|
+
await streamAgent(
|
|
1220
1224
|
'storage-failure-agent',
|
|
1221
1225
|
{
|
|
1222
1226
|
message: 'hello',
|
|
@@ -1227,7 +1231,7 @@ describe('streamAIAgent', () => {
|
|
|
1227
1231
|
channelId: 'channel-storage-failure',
|
|
1228
1232
|
openingData: undefined,
|
|
1229
1233
|
state: 'open',
|
|
1230
|
-
send: (event:
|
|
1234
|
+
send: (event: AgentStreamEvent) => {
|
|
1231
1235
|
events.push(event)
|
|
1232
1236
|
},
|
|
1233
1237
|
close: () => {},
|
|
@@ -1251,7 +1255,7 @@ describe('streamAIAgent', () => {
|
|
|
1251
1255
|
})
|
|
1252
1256
|
})
|
|
1253
1257
|
|
|
1254
|
-
describe('
|
|
1258
|
+
describe('agent-stream helpers', () => {
|
|
1255
1259
|
test('checkForApprovals expands nested sub-approvals and explicit tool approvals', () => {
|
|
1256
1260
|
const approvals = checkForApprovals(
|
|
1257
1261
|
{
|
|
@@ -1313,7 +1317,7 @@ describe('ai-agent-stream helpers', () => {
|
|
|
1313
1317
|
})
|
|
1314
1318
|
|
|
1315
1319
|
test('checkForApprovals ignores a forged __approvalRequired marker from a plain tool (C3)', () => {
|
|
1316
|
-
const forgedResult:
|
|
1320
|
+
const forgedResult: AgentStepResult = {
|
|
1317
1321
|
text: '',
|
|
1318
1322
|
toolCalls: [
|
|
1319
1323
|
{ toolCallId: 'tc-1', toolName: 'searchDocs', args: { q: 'x' } },
|
|
@@ -1356,7 +1360,7 @@ describe('ai-agent-stream helpers', () => {
|
|
|
1356
1360
|
})
|
|
1357
1361
|
|
|
1358
1362
|
test('checkForApprovals ignores a string-key marker from a forwardsApproval tool without the Symbol brand (C3)', () => {
|
|
1359
|
-
const forgedResult:
|
|
1363
|
+
const forgedResult: AgentStepResult = {
|
|
1360
1364
|
text: '',
|
|
1361
1365
|
toolCalls: [
|
|
1362
1366
|
{ toolCallId: 'tc-1', toolName: 'delegatingTool', args: { q: 'x' } },
|
|
@@ -1400,7 +1404,7 @@ describe('ai-agent-stream helpers', () => {
|
|
|
1400
1404
|
})
|
|
1401
1405
|
|
|
1402
1406
|
test('checkForApprovals honours a Symbol-branded marker from a forwardsApproval tool (C3)', () => {
|
|
1403
|
-
const brandedResult:
|
|
1407
|
+
const brandedResult: AgentStepResult = {
|
|
1404
1408
|
text: '',
|
|
1405
1409
|
toolCalls: [
|
|
1406
1410
|
{ toolCallId: 'tc-1', toolName: 'delegatingTool', args: { q: 'x' } },
|
|
@@ -1438,7 +1442,7 @@ describe('ai-agent-stream helpers', () => {
|
|
|
1438
1442
|
})
|
|
1439
1443
|
|
|
1440
1444
|
test('checkForCredentialRequests ignores an unbranded __credentialRequired marker (C3)', () => {
|
|
1441
|
-
const forgedResult:
|
|
1445
|
+
const forgedResult: AgentStepResult = {
|
|
1442
1446
|
text: '',
|
|
1443
1447
|
toolCalls: [
|
|
1444
1448
|
{ toolCallId: 'tc-1', toolName: 'searchDocs', args: { q: 'x' } },
|
|
@@ -1472,7 +1476,7 @@ describe('ai-agent-stream helpers', () => {
|
|
|
1472
1476
|
}
|
|
1473
1477
|
const roundTripped = JSON.parse(JSON.stringify(branded))
|
|
1474
1478
|
|
|
1475
|
-
const result:
|
|
1479
|
+
const result: AgentStepResult = {
|
|
1476
1480
|
text: '',
|
|
1477
1481
|
toolCalls: [
|
|
1478
1482
|
{ toolCallId: 'tc-1', toolName: 'echoTool', args: { q: 'x' } },
|
|
@@ -1488,7 +1492,7 @@ describe('ai-agent-stream helpers', () => {
|
|
|
1488
1492
|
})
|
|
1489
1493
|
|
|
1490
1494
|
test('checkForCredentialRequests honours a Symbol-branded credential request (C3)', () => {
|
|
1491
|
-
const brandedResult:
|
|
1495
|
+
const brandedResult: AgentStepResult = {
|
|
1492
1496
|
text: '',
|
|
1493
1497
|
toolCalls: [
|
|
1494
1498
|
{ toolCallId: 'tc-1', toolName: 'secretTool', args: { id: 1 } },
|
|
@@ -1546,7 +1550,7 @@ describe('ai-agent-stream helpers', () => {
|
|
|
1546
1550
|
assert.equal(requests[0].credentialType, 'oauth2')
|
|
1547
1551
|
assert.equal(requests[0].connectUrl, '/connect')
|
|
1548
1552
|
|
|
1549
|
-
const runnerParams = { messages: [] as
|
|
1553
|
+
const runnerParams = { messages: [] as AgentMessage[] } as any
|
|
1550
1554
|
appendStepMessages(runnerParams, {
|
|
1551
1555
|
text: 'hello',
|
|
1552
1556
|
toolCalls: [
|
|
@@ -1573,11 +1577,11 @@ const asOwner = (resourceId: string) => ({
|
|
|
1573
1577
|
sessionService: { get: () => ({ userId: resourceId }) } as never,
|
|
1574
1578
|
})
|
|
1575
1579
|
|
|
1576
|
-
describe('
|
|
1580
|
+
describe('resumeAgent', () => {
|
|
1577
1581
|
test('rejecting one approval while others remain only resolves and finishes the stream', async () => {
|
|
1578
1582
|
addTestAgent('resume-stream-agent')
|
|
1579
1583
|
|
|
1580
|
-
const events:
|
|
1584
|
+
const events: AgentStreamEvent[] = []
|
|
1581
1585
|
const updates: any[] = []
|
|
1582
1586
|
const resolveCalls: any[] = []
|
|
1583
1587
|
const savedMessages: any[] = []
|
|
@@ -1620,12 +1624,12 @@ describe('resumeAIAgent', () => {
|
|
|
1620
1624
|
error: () => {},
|
|
1621
1625
|
debug: () => {},
|
|
1622
1626
|
},
|
|
1623
|
-
|
|
1627
|
+
agentRunner: {
|
|
1624
1628
|
stream: async () => {
|
|
1625
1629
|
throw new Error('should not continue')
|
|
1626
1630
|
},
|
|
1627
1631
|
},
|
|
1628
|
-
|
|
1632
|
+
agentRunState: {
|
|
1629
1633
|
getRun: async () => remainingRun,
|
|
1630
1634
|
resolveApproval: async (toolCallId: string, status: string) => {
|
|
1631
1635
|
resolveCalls.push({ toolCallId, status })
|
|
@@ -1635,15 +1639,15 @@ describe('resumeAIAgent', () => {
|
|
|
1635
1639
|
updates.push(patch)
|
|
1636
1640
|
},
|
|
1637
1641
|
},
|
|
1638
|
-
|
|
1639
|
-
saveMessages: async (_threadId: string, messages:
|
|
1642
|
+
agentStorage: {
|
|
1643
|
+
saveMessages: async (_threadId: string, messages: AgentMessage[]) => {
|
|
1640
1644
|
savedMessages.push(messages)
|
|
1641
1645
|
},
|
|
1642
1646
|
},
|
|
1643
1647
|
} as any
|
|
1644
1648
|
|
|
1645
1649
|
let first = true
|
|
1646
|
-
mockServices.
|
|
1650
|
+
mockServices.agentRunState.getRun = async () => {
|
|
1647
1651
|
if (first) {
|
|
1648
1652
|
first = false
|
|
1649
1653
|
return initialRun
|
|
@@ -1653,13 +1657,13 @@ describe('resumeAIAgent', () => {
|
|
|
1653
1657
|
|
|
1654
1658
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
1655
1659
|
|
|
1656
|
-
await
|
|
1660
|
+
await resumeAgent(
|
|
1657
1661
|
{ runId: 'run-1', toolCallId: 'tool-1', approved: false },
|
|
1658
1662
|
{
|
|
1659
1663
|
channelId: 'resume-channel',
|
|
1660
1664
|
openingData: undefined,
|
|
1661
1665
|
state: 'open',
|
|
1662
|
-
send: (event:
|
|
1666
|
+
send: (event: AgentStreamEvent) => events.push(event),
|
|
1663
1667
|
close: () => {},
|
|
1664
1668
|
},
|
|
1665
1669
|
asOwner('resource-1')
|
|
@@ -1693,7 +1697,7 @@ describe('resumeAIAgent', () => {
|
|
|
1693
1697
|
func: async (_services: any, input: any) => ({ deployed: input.env }),
|
|
1694
1698
|
})
|
|
1695
1699
|
|
|
1696
|
-
const events:
|
|
1700
|
+
const events: AgentStreamEvent[] = []
|
|
1697
1701
|
const updates: any[] = []
|
|
1698
1702
|
const resolveCalls: any[] = []
|
|
1699
1703
|
const savedMessages: any[] = []
|
|
@@ -1726,17 +1730,17 @@ describe('resumeAIAgent', () => {
|
|
|
1726
1730
|
error: () => {},
|
|
1727
1731
|
debug: () => {},
|
|
1728
1732
|
},
|
|
1729
|
-
|
|
1733
|
+
agentRunner: {
|
|
1730
1734
|
stream: async (
|
|
1731
1735
|
_params: any,
|
|
1732
1736
|
channel: any
|
|
1733
|
-
): Promise<
|
|
1737
|
+
): Promise<AgentStepResult> => {
|
|
1734
1738
|
channel.send({ type: 'text-delta', text: 'continued' })
|
|
1735
1739
|
channel.send({
|
|
1736
1740
|
type: 'usage',
|
|
1737
1741
|
tokens: { input: 2, output: 3 },
|
|
1738
1742
|
model: 'test/test-model',
|
|
1739
|
-
} as
|
|
1743
|
+
} as AgentStreamEvent)
|
|
1740
1744
|
return makeStepResult({
|
|
1741
1745
|
text: 'continued',
|
|
1742
1746
|
usage: { inputTokens: 2, outputTokens: 3 },
|
|
@@ -1744,7 +1748,7 @@ describe('resumeAIAgent', () => {
|
|
|
1744
1748
|
})
|
|
1745
1749
|
},
|
|
1746
1750
|
},
|
|
1747
|
-
|
|
1751
|
+
agentRunState: {
|
|
1748
1752
|
getRun: async () => {
|
|
1749
1753
|
getRunCalls++
|
|
1750
1754
|
return getRunCalls === 1 ? run : { ...run, pendingApprovals: [] }
|
|
@@ -1757,8 +1761,8 @@ describe('resumeAIAgent', () => {
|
|
|
1757
1761
|
updates.push(patch)
|
|
1758
1762
|
},
|
|
1759
1763
|
},
|
|
1760
|
-
|
|
1761
|
-
saveMessages: async (_threadId: string, messages:
|
|
1764
|
+
agentStorage: {
|
|
1765
|
+
saveMessages: async (_threadId: string, messages: AgentMessage[]) => {
|
|
1762
1766
|
savedMessages.push(messages)
|
|
1763
1767
|
},
|
|
1764
1768
|
getMessages: async () => [],
|
|
@@ -1767,13 +1771,13 @@ describe('resumeAIAgent', () => {
|
|
|
1767
1771
|
|
|
1768
1772
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
1769
1773
|
|
|
1770
|
-
await
|
|
1774
|
+
await resumeAgent(
|
|
1771
1775
|
{ runId: 'run-approve', toolCallId: 'tool-1', approved: true },
|
|
1772
1776
|
{
|
|
1773
1777
|
channelId: 'resume-channel',
|
|
1774
1778
|
openingData: undefined,
|
|
1775
1779
|
state: 'open',
|
|
1776
|
-
send: (event:
|
|
1780
|
+
send: (event: AgentStreamEvent) => events.push(event),
|
|
1777
1781
|
close: () => {},
|
|
1778
1782
|
},
|
|
1779
1783
|
asOwner('resource-approve')
|