@pikku/core 0.12.83 → 0.12.84
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 +68 -0
- package/README.md +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 +18 -0
- package/dist/ecosystem/agent.js +6 -0
- package/dist/ecosystem/ai-agent.d.ts +18 -0
- package/dist/ecosystem/ai-agent.js +6 -0
- package/dist/ecosystem/ai-scorer.d.ts +12 -0
- package/dist/ecosystem/ai-scorer.js +5 -0
- package/dist/ecosystem/channel/local.d.ts +1 -0
- package/dist/ecosystem/channel/local.js +1 -0
- package/dist/ecosystem/channel.d.ts +12 -0
- package/dist/ecosystem/channel.js +4 -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 +9 -0
- package/dist/ecosystem/credential.js +1 -0
- package/dist/ecosystem/dev.d.ts +8 -0
- package/dist/ecosystem/dev.js +1 -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/gateway.js +1 -0
- package/dist/ecosystem/hmac.d.ts +1 -0
- package/dist/ecosystem/hmac.js +1 -0
- package/dist/ecosystem/http.d.ts +11 -0
- package/dist/ecosystem/http.js +3 -0
- package/dist/ecosystem/mcp.d.ts +3 -0
- package/dist/ecosystem/mcp.js +2 -0
- package/dist/ecosystem/middleware.d.ts +17 -0
- package/dist/ecosystem/middleware.js +6 -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/node.js +1 -0
- package/dist/ecosystem/oauth2.d.ts +1 -0
- package/dist/ecosystem/oauth2.js +1 -0
- package/dist/ecosystem/persona.d.ts +15 -0
- package/dist/ecosystem/persona.js +4 -0
- package/dist/ecosystem/queue.d.ts +11 -0
- package/dist/ecosystem/queue.js +2 -0
- package/dist/ecosystem/remote.d.ts +8 -0
- package/dist/ecosystem/remote.js +1 -0
- package/dist/ecosystem/role.d.ts +3 -0
- package/dist/ecosystem/role.js +2 -0
- package/dist/ecosystem/rpc.d.ts +4 -0
- package/dist/ecosystem/rpc.js +2 -0
- package/dist/ecosystem/safe-fetch.d.ts +7 -0
- package/dist/ecosystem/safe-fetch.js +1 -0
- package/dist/ecosystem/scenario.d.ts +15 -0
- package/dist/ecosystem/scenario.js +4 -0
- package/dist/ecosystem/scheduler.d.ts +2 -0
- package/dist/ecosystem/scheduler.js +1 -0
- package/dist/ecosystem/schema.d.ts +1 -0
- package/dist/ecosystem/schema.js +1 -0
- package/dist/ecosystem/scope.d.ts +3 -0
- package/dist/ecosystem/scope.js +2 -0
- package/dist/ecosystem/secret.d.ts +9 -0
- package/dist/ecosystem/secret.js +1 -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 +1 -0
- package/dist/ecosystem/services/local-content.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 +28 -0
- package/dist/ecosystem/services.js +6 -0
- package/dist/ecosystem/testing.d.ts +7 -0
- package/dist/ecosystem/testing.js +1 -0
- package/dist/ecosystem/trigger.d.ts +1 -0
- package/dist/ecosystem/trigger.js +1 -0
- package/dist/ecosystem/types.d.ts +9 -0
- package/dist/ecosystem/types.js +5 -0
- package/dist/ecosystem/variable.d.ts +8 -0
- package/dist/ecosystem/variable.js +1 -0
- package/dist/ecosystem/virtual-user.d.ts +21 -0
- package/dist/ecosystem/virtual-user.js +5 -0
- package/dist/ecosystem/workflow.d.ts +18 -0
- package/dist/ecosystem/workflow.js +4 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.js +3 -3
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-cookie.d.ts +1 -1
- package/dist/middleware/cors.d.ts +1 -1
- package/dist/middleware/remote-auth.d.ts +1 -1
- package/dist/middleware/telemetry.d.ts +2 -2
- package/dist/services/agent-run-state-service.d.ts +29 -0
- package/dist/services/agent-run-state-service.js +1 -0
- package/dist/services/agent-runner-service.d.ts +220 -0
- package/dist/services/agent-runner-service.js +1 -0
- package/dist/services/agent-storage-service.d.ts +18 -0
- package/dist/services/agent-storage-service.js +1 -0
- package/dist/services/http-personas.d.ts +1 -1
- package/dist/services/http-personas.js +3 -3
- package/dist/services/in-memory-agent-run-state-service.d.ts +19 -0
- package/dist/services/in-memory-agent-run-state-service.js +54 -0
- package/dist/services/index.d.ts +4 -4
- package/dist/services/index.js +1 -1
- package/dist/services/meta-service.d.ts +3 -3
- 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/agent-storage-service-tests.js +302 -0
- package/dist/testing/service-tests.d.ts +4 -4
- package/dist/testing/service-tests.js +4 -4
- package/dist/types/core.types.d.ts +10 -10
- package/dist/types/core.types.js +1 -1
- package/dist/types/state.types.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.d.ts +2 -2
- package/dist/wirings/agent/agent-agui.d.ts +79 -0
- package/dist/wirings/agent/agent-agui.js +327 -0
- package/dist/wirings/agent/agent-finalize.d.ts +58 -0
- package/dist/wirings/agent/agent-finalize.js +138 -0
- package/dist/wirings/agent/agent-helpers.d.ts +35 -0
- package/dist/wirings/agent/agent-helpers.js +47 -0
- package/dist/wirings/agent/agent-interrupt.d.ts +153 -0
- package/dist/wirings/agent/agent-interrupt.js +257 -0
- package/dist/wirings/agent/agent-memory.d.ts +42 -0
- package/dist/wirings/agent/agent-memory.js +333 -0
- package/dist/wirings/agent/agent-model-config.d.ts +16 -0
- package/dist/wirings/agent/agent-model-config.js +51 -0
- package/dist/wirings/agent/agent-prepare.d.ts +117 -0
- package/dist/wirings/agent/agent-prepare.js +728 -0
- package/dist/wirings/agent/agent-registry.d.ts +16 -0
- package/dist/wirings/agent/agent-registry.js +51 -0
- package/dist/wirings/agent/agent-rpc.d.ts +15 -0
- package/dist/wirings/agent/agent-rpc.js +53 -0
- package/dist/wirings/agent/agent-runner.d.ts +7 -0
- package/dist/wirings/agent/agent-runner.js +580 -0
- package/dist/wirings/agent/agent-stream.d.ts +41 -0
- package/dist/wirings/agent/agent-stream.js +1029 -0
- package/dist/wirings/agent/agent-turn.d.ts +57 -0
- package/dist/wirings/agent/agent-turn.js +82 -0
- package/dist/wirings/agent/agent-utils.d.ts +1 -0
- package/dist/wirings/agent/agent-utils.js +1 -0
- package/dist/wirings/agent/agent.types.d.ts +625 -0
- 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/agent/voice-input.d.ts +69 -0
- package/dist/wirings/agent/voice-input.js +150 -0
- package/dist/wirings/agent/voice-output.d.ts +85 -0
- package/dist/wirings/agent/voice-output.js +196 -0
- package/dist/wirings/agent-scorer/agent-scorer-grade.d.ts +26 -0
- package/dist/wirings/agent-scorer/agent-scorer-grade.js +33 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +17 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +92 -0
- package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +15 -0
- package/dist/wirings/agent-scorer/agent-scorer-live.js +38 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +18 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.js +46 -0
- package/dist/wirings/agent-scorer/agent-scorer-sampling.d.ts +8 -0
- package/dist/wirings/agent-scorer/agent-scorer-sampling.js +31 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +40 -0
- package/dist/wirings/agent-scorer/agent-scorer-worker.d.ts +15 -0
- package/dist/wirings/agent-scorer/agent-scorer-worker.js +60 -0
- package/dist/wirings/agent-scorer/agent-scorer.d.ts +39 -0
- package/dist/wirings/agent-scorer/agent-scorer.js +40 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +90 -0
- 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/ai-agent/voice-output.d.ts +1 -2
- package/dist/wirings/channel/channel-rpc.types.d.ts +2 -2
- package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
- package/dist/wirings/rpc/rpc-runner.js +2 -2
- package/dist/wirings/rpc/rpc-types.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/workflow/run-timeline.d.ts +1 -2
- 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/actor-flow-drives-the-target-through-a-transport-seam.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-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/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.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-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-transcript-event-is-sent-ahead-of-the-run.md +2 -2
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +2 -2
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.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} +3 -3
- 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-empty-owners-constraint-matches-nothing.md +3 -3
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +20 -13
- package/knowledge/decisions/security/index.md +1 -2
- package/package.json +4 -3
- package/scripts/generate-api-report.mts +32 -8
- package/src/agent-naming.test.ts +68 -0
- package/src/ecosystem/agent-scorer.ts +24 -0
- package/src/ecosystem/agent.ts +42 -0
- package/src/ecosystem/channel/local.ts +1 -0
- package/src/ecosystem/channel.ts +22 -0
- package/src/ecosystem/cli/channel.ts +25 -0
- package/src/ecosystem/cli.ts +21 -0
- package/src/ecosystem/credential.ts +10 -0
- package/src/ecosystem/dev.ts +12 -0
- package/src/ecosystem/function.ts +28 -0
- package/src/ecosystem/gateway.ts +4 -0
- package/src/ecosystem/hmac.ts +1 -0
- package/src/ecosystem/http.ts +22 -0
- package/src/ecosystem/mcp.ts +17 -0
- package/src/ecosystem/middleware.ts +27 -0
- package/src/ecosystem/node-host-resolver.ts +1 -0
- package/src/ecosystem/node.ts +5 -0
- package/src/ecosystem/oauth2.ts +4 -0
- package/src/ecosystem/persona.ts +30 -0
- package/src/ecosystem/queue.ts +23 -0
- package/src/ecosystem/remote.ts +9 -0
- package/src/ecosystem/role.ts +13 -0
- package/src/ecosystem/rpc.ts +7 -0
- package/src/ecosystem/safe-fetch.ts +8 -0
- package/src/ecosystem/scenario.ts +32 -0
- package/src/ecosystem/scheduler.ts +5 -0
- package/src/ecosystem/schema.ts +1 -0
- package/src/ecosystem/scope.ts +14 -0
- package/src/ecosystem/secret.ts +15 -0
- package/src/ecosystem/services/istanbul-coverage.ts +1 -0
- package/src/ecosystem/services/local-content-request-handler.ts +16 -0
- package/src/ecosystem/services/local-content.ts +1 -0
- package/src/ecosystem/services/v8-coverage.ts +1 -0
- package/src/ecosystem/services.ts +82 -0
- package/src/ecosystem/testing.ts +8 -0
- package/src/ecosystem/trigger.ts +7 -0
- package/src/ecosystem/types.ts +34 -0
- package/src/ecosystem/variable.ts +14 -0
- package/src/ecosystem/virtual-user.ts +48 -0
- package/src/ecosystem/workflow.ts +68 -0
- package/src/index.ts +8 -19
- package/src/pikku-state.ts +3 -3
- package/src/public-surface.json +173 -68
- package/src/public-surface.json.README +20 -2
- package/src/public-surface.test.ts +31 -3
- 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/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/index.ts +9 -9
- package/src/services/meta-service.ts +3 -3
- 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 +12 -12
- package/src/types/state.types.ts +6 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +2 -2
- package/src/wirings/actor-flow/run-conversation.ts +7 -9
- 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} +52 -51
- 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} +90 -80
- 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} +147 -146
- 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/{ai-agent/ai-agent.types.ts → agent/agent.types.ts} +51 -48
- package/src/wirings/agent/index.ts +56 -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 +23 -23
- 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/{ai-scorer/ai-scorer-judge.test.ts → agent-scorer/agent-scorer-judge.test.ts} +11 -14
- package/src/wirings/{ai-scorer/ai-scorer-judge.ts → agent-scorer/agent-scorer-judge.ts} +11 -11
- 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} +7 -7
- package/src/wirings/{ai-scorer/ai-scorer.types.ts → agent-scorer/agent-scorer.types.ts} +6 -6
- package/src/wirings/agent-scorer/index.ts +22 -0
- package/src/wirings/channel/channel-rpc.types.ts +2 -2
- package/src/wirings/rpc/rpc-runner.ts +2 -2
- package/src/wirings/rpc/rpc-types.ts +1 -1
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +1 -1
- 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/workflow/run-timeline.ts +1 -1
- package/src/wirings-stay-decoupled.test.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/src/wirings/ai-agent/index.ts +0 -65
- package/src/wirings/ai-scorer/index.ts +0 -24
- /package/src/wirings/{ai-agent/ai-agent-utils.ts → agent/agent-utils.ts} +0 -0
- /package/src/wirings/{ai-scorer/ai-scorer-sampling.ts → agent-scorer/agent-scorer-sampling.ts} +0 -0
|
@@ -2,13 +2,13 @@ import { beforeEach, describe, test } from 'node:test'
|
|
|
2
2
|
import assert from 'node:assert/strict'
|
|
3
3
|
|
|
4
4
|
import { resetPikkuState, pikkuState } from '../../pikku-state.js'
|
|
5
|
-
import {
|
|
5
|
+
import { runAgent, resumeAgentSync } from './agent-runner.js'
|
|
6
6
|
import type {
|
|
7
7
|
AgentRunState,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from './
|
|
11
|
-
import type {
|
|
8
|
+
CoreAgent,
|
|
9
|
+
PikkuAgentMiddlewareHooks,
|
|
10
|
+
} from './agent.types.js'
|
|
11
|
+
import type { AgentStepResult } from '../../services/agent-runner-service.js'
|
|
12
12
|
import {
|
|
13
13
|
AIProviderNotConfiguredError,
|
|
14
14
|
ForbiddenError,
|
|
@@ -19,7 +19,7 @@ beforeEach(() => {
|
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
const addTestAgent = (agentName: string) => {
|
|
22
|
-
const agent:
|
|
22
|
+
const agent: CoreAgent = {
|
|
23
23
|
name: agentName,
|
|
24
24
|
description: 'test agent',
|
|
25
25
|
instructions: 'be helpful',
|
|
@@ -36,8 +36,8 @@ const addTestAgent = (agentName: string) => {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const makeStepResult = (
|
|
39
|
-
overrides?: Partial<
|
|
40
|
-
):
|
|
39
|
+
overrides?: Partial<AgentStepResult>
|
|
40
|
+
): AgentStepResult => ({
|
|
41
41
|
text: '',
|
|
42
42
|
toolCalls: [],
|
|
43
43
|
toolResults: [],
|
|
@@ -50,8 +50,8 @@ const asOwner = (resourceId: string) => ({
|
|
|
50
50
|
sessionService: { get: () => ({ userId: resourceId }) } as never,
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
-
describe('
|
|
54
|
-
test('throws when
|
|
53
|
+
describe('runAgent', () => {
|
|
54
|
+
test('throws when agentRunState service is missing', async () => {
|
|
55
55
|
addTestAgent('missing-run-state-agent')
|
|
56
56
|
|
|
57
57
|
pikkuState(null, 'package', 'singletonServices', {
|
|
@@ -61,25 +61,25 @@ describe('runAIAgent', () => {
|
|
|
61
61
|
error: () => {},
|
|
62
62
|
debug: () => {},
|
|
63
63
|
},
|
|
64
|
-
|
|
64
|
+
agentRunner: {
|
|
65
65
|
run: async () => makeStepResult({ text: 'unused' }),
|
|
66
66
|
},
|
|
67
67
|
} as any)
|
|
68
68
|
|
|
69
69
|
await assert.rejects(
|
|
70
70
|
() =>
|
|
71
|
-
|
|
71
|
+
runAgent(
|
|
72
72
|
'missing-run-state-agent',
|
|
73
73
|
{ message: 'hello', threadId: 't', resourceId: 'r' },
|
|
74
74
|
{}
|
|
75
75
|
),
|
|
76
76
|
{
|
|
77
|
-
message: '
|
|
77
|
+
message: 'AgentRunStateService not available in singletonServices',
|
|
78
78
|
}
|
|
79
79
|
)
|
|
80
80
|
})
|
|
81
81
|
|
|
82
|
-
test('throws AIProviderNotConfiguredError when
|
|
82
|
+
test('throws AIProviderNotConfiguredError when agentRunner is missing', async () => {
|
|
83
83
|
addTestAgent('no-provider-agent')
|
|
84
84
|
|
|
85
85
|
const mockServices = {
|
|
@@ -89,7 +89,7 @@ describe('runAIAgent', () => {
|
|
|
89
89
|
error: () => {},
|
|
90
90
|
debug: () => {},
|
|
91
91
|
},
|
|
92
|
-
|
|
92
|
+
agentRunState: {
|
|
93
93
|
createRun: async () => 'run-no-provider',
|
|
94
94
|
updateRun: async () => {},
|
|
95
95
|
},
|
|
@@ -99,7 +99,7 @@ describe('runAIAgent', () => {
|
|
|
99
99
|
|
|
100
100
|
await assert.rejects(
|
|
101
101
|
() =>
|
|
102
|
-
|
|
102
|
+
runAgent(
|
|
103
103
|
'no-provider-agent',
|
|
104
104
|
{ message: 'hello', threadId: 't', resourceId: 'r' },
|
|
105
105
|
{}
|
|
@@ -125,12 +125,12 @@ describe('runAIAgent', () => {
|
|
|
125
125
|
error: () => {},
|
|
126
126
|
debug: () => {},
|
|
127
127
|
},
|
|
128
|
-
|
|
128
|
+
agentRunner: {
|
|
129
129
|
run: async () => {
|
|
130
130
|
throw expectedError
|
|
131
131
|
},
|
|
132
132
|
},
|
|
133
|
-
|
|
133
|
+
agentRunState: {
|
|
134
134
|
createRun: async () => 'run-1',
|
|
135
135
|
updateRun: async (_runId: string, patch: unknown) => {
|
|
136
136
|
updates.push(patch)
|
|
@@ -142,7 +142,7 @@ describe('runAIAgent', () => {
|
|
|
142
142
|
|
|
143
143
|
await assert.rejects(
|
|
144
144
|
() =>
|
|
145
|
-
|
|
145
|
+
runAgent(
|
|
146
146
|
'failing-agent',
|
|
147
147
|
{
|
|
148
148
|
message: 'hello',
|
|
@@ -170,8 +170,8 @@ describe('runAIAgent', () => {
|
|
|
170
170
|
error: () => {},
|
|
171
171
|
debug: () => {},
|
|
172
172
|
},
|
|
173
|
-
|
|
174
|
-
run: async (): Promise<
|
|
173
|
+
agentRunner: {
|
|
174
|
+
run: async (): Promise<AgentStepResult> => {
|
|
175
175
|
callCount++
|
|
176
176
|
if (callCount === 1) {
|
|
177
177
|
return makeStepResult({
|
|
@@ -197,7 +197,7 @@ describe('runAIAgent', () => {
|
|
|
197
197
|
})
|
|
198
198
|
},
|
|
199
199
|
},
|
|
200
|
-
|
|
200
|
+
agentRunState: {
|
|
201
201
|
createRun: async () => 'run-multi',
|
|
202
202
|
updateRun: async () => {},
|
|
203
203
|
},
|
|
@@ -205,7 +205,7 @@ describe('runAIAgent', () => {
|
|
|
205
205
|
|
|
206
206
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
207
207
|
|
|
208
|
-
const result = await
|
|
208
|
+
const result = await runAgent(
|
|
209
209
|
'multi-step-agent',
|
|
210
210
|
{
|
|
211
211
|
message: 'hello',
|
|
@@ -226,13 +226,13 @@ describe('runAIAgent', () => {
|
|
|
226
226
|
addTestAgent('afterstep-agent')
|
|
227
227
|
|
|
228
228
|
const afterStepCalls: unknown[] = []
|
|
229
|
-
const middleware:
|
|
229
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
230
230
|
afterStep: async (_services, ctx) => {
|
|
231
231
|
afterStepCalls.push(ctx)
|
|
232
232
|
},
|
|
233
233
|
}
|
|
234
234
|
const agent = pikkuState(null, 'agent', 'agents').get('afterstep-agent')!
|
|
235
|
-
agent.
|
|
235
|
+
agent.agentMiddleware = [middleware] as any
|
|
236
236
|
pikkuState(null, 'agent', 'agents').set('afterstep-agent', agent)
|
|
237
237
|
|
|
238
238
|
let callCount = 0
|
|
@@ -243,8 +243,8 @@ describe('runAIAgent', () => {
|
|
|
243
243
|
error: () => {},
|
|
244
244
|
debug: () => {},
|
|
245
245
|
},
|
|
246
|
-
|
|
247
|
-
run: async (): Promise<
|
|
246
|
+
agentRunner: {
|
|
247
|
+
run: async (): Promise<AgentStepResult> => {
|
|
248
248
|
callCount++
|
|
249
249
|
if (callCount === 1) {
|
|
250
250
|
return makeStepResult({
|
|
@@ -266,7 +266,7 @@ describe('runAIAgent', () => {
|
|
|
266
266
|
})
|
|
267
267
|
},
|
|
268
268
|
},
|
|
269
|
-
|
|
269
|
+
agentRunState: {
|
|
270
270
|
createRun: async () => 'run-afterstep',
|
|
271
271
|
updateRun: async () => {},
|
|
272
272
|
},
|
|
@@ -274,7 +274,7 @@ describe('runAIAgent', () => {
|
|
|
274
274
|
|
|
275
275
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
276
276
|
|
|
277
|
-
await
|
|
277
|
+
await runAgent(
|
|
278
278
|
'afterstep-agent',
|
|
279
279
|
{ message: 'hi', threadId: 't1', resourceId: 'r1' },
|
|
280
280
|
{}
|
|
@@ -295,13 +295,13 @@ describe('runAIAgent', () => {
|
|
|
295
295
|
addTestAgent('onerror-agent')
|
|
296
296
|
|
|
297
297
|
const onErrorCalls: unknown[] = []
|
|
298
|
-
const middleware:
|
|
298
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
299
299
|
onError: async (_services, ctx) => {
|
|
300
300
|
onErrorCalls.push(ctx)
|
|
301
301
|
},
|
|
302
302
|
}
|
|
303
303
|
const agent = pikkuState(null, 'agent', 'agents').get('onerror-agent')!
|
|
304
|
-
agent.
|
|
304
|
+
agent.agentMiddleware = [middleware] as any
|
|
305
305
|
pikkuState(null, 'agent', 'agents').set('onerror-agent', agent)
|
|
306
306
|
|
|
307
307
|
const expectedError = new Error('boom')
|
|
@@ -312,12 +312,12 @@ describe('runAIAgent', () => {
|
|
|
312
312
|
error: () => {},
|
|
313
313
|
debug: () => {},
|
|
314
314
|
},
|
|
315
|
-
|
|
315
|
+
agentRunner: {
|
|
316
316
|
run: async () => {
|
|
317
317
|
throw expectedError
|
|
318
318
|
},
|
|
319
319
|
},
|
|
320
|
-
|
|
320
|
+
agentRunState: {
|
|
321
321
|
createRun: async () => 'run-err',
|
|
322
322
|
updateRun: async () => {},
|
|
323
323
|
},
|
|
@@ -327,7 +327,7 @@ describe('runAIAgent', () => {
|
|
|
327
327
|
|
|
328
328
|
await assert.rejects(
|
|
329
329
|
() =>
|
|
330
|
-
|
|
330
|
+
runAgent(
|
|
331
331
|
'onerror-agent',
|
|
332
332
|
{ message: 'hi', threadId: 't2', resourceId: 'r2' },
|
|
333
333
|
{}
|
|
@@ -344,7 +344,7 @@ describe('runAIAgent', () => {
|
|
|
344
344
|
test('onError hook failure does not suppress original error', async () => {
|
|
345
345
|
addTestAgent('onerror-throws-agent')
|
|
346
346
|
|
|
347
|
-
const middleware:
|
|
347
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
348
348
|
onError: async () => {
|
|
349
349
|
throw new Error('hook error')
|
|
350
350
|
},
|
|
@@ -352,7 +352,7 @@ describe('runAIAgent', () => {
|
|
|
352
352
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
353
353
|
'onerror-throws-agent'
|
|
354
354
|
)!
|
|
355
|
-
agent.
|
|
355
|
+
agent.agentMiddleware = [middleware] as any
|
|
356
356
|
pikkuState(null, 'agent', 'agents').set('onerror-throws-agent', agent)
|
|
357
357
|
|
|
358
358
|
const expectedError = new Error('original error')
|
|
@@ -363,12 +363,12 @@ describe('runAIAgent', () => {
|
|
|
363
363
|
error: () => {},
|
|
364
364
|
debug: () => {},
|
|
365
365
|
},
|
|
366
|
-
|
|
366
|
+
agentRunner: {
|
|
367
367
|
run: async () => {
|
|
368
368
|
throw expectedError
|
|
369
369
|
},
|
|
370
370
|
},
|
|
371
|
-
|
|
371
|
+
agentRunState: {
|
|
372
372
|
createRun: async () => 'run-safe',
|
|
373
373
|
updateRun: async () => {},
|
|
374
374
|
},
|
|
@@ -378,7 +378,7 @@ describe('runAIAgent', () => {
|
|
|
378
378
|
|
|
379
379
|
await assert.rejects(
|
|
380
380
|
() =>
|
|
381
|
-
|
|
381
|
+
runAgent(
|
|
382
382
|
'onerror-throws-agent',
|
|
383
383
|
{ message: 'hi', threadId: 't3', resourceId: 'r3' },
|
|
384
384
|
{}
|
|
@@ -401,12 +401,12 @@ describe('runAIAgent', () => {
|
|
|
401
401
|
error: () => {},
|
|
402
402
|
debug: () => {},
|
|
403
403
|
},
|
|
404
|
-
|
|
404
|
+
agentRunner: {
|
|
405
405
|
run: async () => {
|
|
406
406
|
throw new Error('should not run')
|
|
407
407
|
},
|
|
408
408
|
},
|
|
409
|
-
|
|
409
|
+
agentRunState: {
|
|
410
410
|
createRun: async (run: any) => {
|
|
411
411
|
createdRuns.push(run)
|
|
412
412
|
return 'run-missing-rpc'
|
|
@@ -417,7 +417,7 @@ describe('runAIAgent', () => {
|
|
|
417
417
|
|
|
418
418
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
419
419
|
|
|
420
|
-
const result = await
|
|
420
|
+
const result = await runAgent(
|
|
421
421
|
'missing-rpc-agent',
|
|
422
422
|
{ message: 'deploy', threadId: 'thread-1', resourceId: 'resource-1' },
|
|
423
423
|
asOwner('resource-1')
|
|
@@ -449,7 +449,7 @@ describe('runAIAgent', () => {
|
|
|
449
449
|
const inputMessages = [
|
|
450
450
|
{ id: 'extra', role: 'system', content: 'extra', createdAt: new Date() },
|
|
451
451
|
] as any
|
|
452
|
-
const middleware:
|
|
452
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
453
453
|
modifyInput: async (_services, ctx) => ({
|
|
454
454
|
instructions: `${ctx.instructions}\n\nextra rules`,
|
|
455
455
|
messages: [...ctx.messages, ...inputMessages],
|
|
@@ -460,7 +460,7 @@ describe('runAIAgent', () => {
|
|
|
460
460
|
}),
|
|
461
461
|
}
|
|
462
462
|
const agent = pikkuState(null, 'agent', 'agents').get('middleware-agent')!
|
|
463
|
-
agent.
|
|
463
|
+
agent.agentMiddleware = [middleware] as any
|
|
464
464
|
pikkuState(null, 'agent', 'agents').set('middleware-agent', agent)
|
|
465
465
|
|
|
466
466
|
const mockServices = {
|
|
@@ -470,8 +470,8 @@ describe('runAIAgent', () => {
|
|
|
470
470
|
error: () => {},
|
|
471
471
|
debug: () => {},
|
|
472
472
|
},
|
|
473
|
-
|
|
474
|
-
run: async (params: any): Promise<
|
|
473
|
+
agentRunner: {
|
|
474
|
+
run: async (params: any): Promise<AgentStepResult> => {
|
|
475
475
|
seenRunnerParams.push({
|
|
476
476
|
instructions: params.instructions,
|
|
477
477
|
messages: params.messages,
|
|
@@ -483,7 +483,7 @@ describe('runAIAgent', () => {
|
|
|
483
483
|
} as any)
|
|
484
484
|
},
|
|
485
485
|
},
|
|
486
|
-
|
|
486
|
+
agentRunState: {
|
|
487
487
|
createRun: async () => 'run-middleware',
|
|
488
488
|
updateRun: async () => {},
|
|
489
489
|
},
|
|
@@ -491,7 +491,7 @@ describe('runAIAgent', () => {
|
|
|
491
491
|
|
|
492
492
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
493
493
|
|
|
494
|
-
const result = await
|
|
494
|
+
const result = await runAgent(
|
|
495
495
|
'middleware-agent',
|
|
496
496
|
{ message: 'hello', threadId: 'thread-mw', resourceId: 'resource-mw' },
|
|
497
497
|
{}
|
|
@@ -522,13 +522,13 @@ describe('runAIAgent', () => {
|
|
|
522
522
|
error: () => {},
|
|
523
523
|
debug: () => {},
|
|
524
524
|
},
|
|
525
|
-
|
|
526
|
-
run: async (): Promise<
|
|
525
|
+
agentRunner: {
|
|
526
|
+
run: async (): Promise<AgentStepResult> => {
|
|
527
527
|
runnerCalls++
|
|
528
528
|
return makeStepResult({ text: 'should not happen' })
|
|
529
529
|
},
|
|
530
530
|
},
|
|
531
|
-
|
|
531
|
+
agentRunState: {
|
|
532
532
|
createRun: async () => 'run-stop',
|
|
533
533
|
updateRun: async (_runId: string, patch: any) => {
|
|
534
534
|
updates.push(patch)
|
|
@@ -538,7 +538,7 @@ describe('runAIAgent', () => {
|
|
|
538
538
|
|
|
539
539
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
540
540
|
|
|
541
|
-
const result = await
|
|
541
|
+
const result = await runAgent(
|
|
542
542
|
'prepare-stop-agent',
|
|
543
543
|
{
|
|
544
544
|
message: 'hello',
|
|
@@ -588,8 +588,8 @@ describe('runAIAgent', () => {
|
|
|
588
588
|
error: () => {},
|
|
589
589
|
debug: () => {},
|
|
590
590
|
},
|
|
591
|
-
|
|
592
|
-
run: async (): Promise<
|
|
591
|
+
agentRunner: {
|
|
592
|
+
run: async (): Promise<AgentStepResult> =>
|
|
593
593
|
makeStepResult({
|
|
594
594
|
text: 'Need approval',
|
|
595
595
|
toolCalls: [
|
|
@@ -603,13 +603,13 @@ describe('runAIAgent', () => {
|
|
|
603
603
|
finishReason: 'tool-calls',
|
|
604
604
|
}),
|
|
605
605
|
},
|
|
606
|
-
|
|
606
|
+
agentRunState: {
|
|
607
607
|
createRun: async () => 'run-approval',
|
|
608
608
|
updateRun: async (_runId: string, patch: any) => {
|
|
609
609
|
updates.push(patch)
|
|
610
610
|
},
|
|
611
611
|
},
|
|
612
|
-
|
|
612
|
+
agentStorage: {
|
|
613
613
|
createThread: async () => {},
|
|
614
614
|
getMessages: async () => [],
|
|
615
615
|
saveMessages: async (_threadId: string, messages: any[]) => {
|
|
@@ -620,7 +620,7 @@ describe('runAIAgent', () => {
|
|
|
620
620
|
|
|
621
621
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
622
622
|
|
|
623
|
-
const result = await
|
|
623
|
+
const result = await runAgent(
|
|
624
624
|
'approval-agent',
|
|
625
625
|
{ message: 'deploy', threadId: 'thread-a', resourceId: 'resource-a' },
|
|
626
626
|
{}
|
|
@@ -659,25 +659,25 @@ describe('runAIAgent', () => {
|
|
|
659
659
|
})
|
|
660
660
|
})
|
|
661
661
|
|
|
662
|
-
describe('
|
|
662
|
+
describe('resumeAgentSync', () => {
|
|
663
663
|
test('throws for missing services, missing runs, wrong status, and missing runner', async () => {
|
|
664
664
|
pikkuState(null, 'package', 'singletonServices', {} as any)
|
|
665
|
-
await assert.rejects(() =>
|
|
666
|
-
message: '
|
|
665
|
+
await assert.rejects(() => resumeAgentSync('run-x', [], {}), {
|
|
666
|
+
message: 'AgentRunStateService not available in singletonServices',
|
|
667
667
|
})
|
|
668
668
|
|
|
669
669
|
pikkuState(null, 'package', 'singletonServices', {
|
|
670
|
-
|
|
670
|
+
agentRunState: {
|
|
671
671
|
getRun: async () => null,
|
|
672
672
|
},
|
|
673
673
|
} as any)
|
|
674
|
-
await assert.rejects(() =>
|
|
674
|
+
await assert.rejects(() => resumeAgentSync('run-x', [], {}), {
|
|
675
675
|
message: 'No run found for runId run-x',
|
|
676
676
|
})
|
|
677
677
|
|
|
678
678
|
addTestAgent('resume-guard-agent')
|
|
679
679
|
pikkuState(null, 'package', 'singletonServices', {
|
|
680
|
-
|
|
680
|
+
agentRunState: {
|
|
681
681
|
getRun: async () => ({
|
|
682
682
|
runId: 'run-y',
|
|
683
683
|
agentName: 'resume-guard-agent',
|
|
@@ -690,12 +690,12 @@ describe('resumeAIAgentSync', () => {
|
|
|
690
690
|
}),
|
|
691
691
|
},
|
|
692
692
|
} as any)
|
|
693
|
-
await assert.rejects(() =>
|
|
693
|
+
await assert.rejects(() => resumeAgentSync('run-y', [], asOwner('r')), {
|
|
694
694
|
message: 'Run run-y is not suspended (status: completed)',
|
|
695
695
|
})
|
|
696
696
|
|
|
697
697
|
pikkuState(null, 'package', 'singletonServices', {
|
|
698
|
-
|
|
698
|
+
agentRunState: {
|
|
699
699
|
getRun: async () => ({
|
|
700
700
|
runId: 'run-z',
|
|
701
701
|
agentName: 'resume-guard-agent',
|
|
@@ -712,7 +712,7 @@ describe('resumeAIAgentSync', () => {
|
|
|
712
712
|
},
|
|
713
713
|
} as any)
|
|
714
714
|
await assert.rejects(
|
|
715
|
-
() =>
|
|
715
|
+
() => resumeAgentSync('run-z', [], asOwner('r')),
|
|
716
716
|
(error: unknown) => error instanceof AIProviderNotConfiguredError
|
|
717
717
|
)
|
|
718
718
|
})
|
|
@@ -769,14 +769,14 @@ describe('resumeAIAgentSync', () => {
|
|
|
769
769
|
error: () => {},
|
|
770
770
|
debug: () => {},
|
|
771
771
|
},
|
|
772
|
-
|
|
773
|
-
run: async (): Promise<
|
|
772
|
+
agentRunner: {
|
|
773
|
+
run: async (): Promise<AgentStepResult> =>
|
|
774
774
|
makeStepResult({
|
|
775
775
|
text: 'Resumed answer',
|
|
776
776
|
usage: { inputTokens: 5, outputTokens: 3 },
|
|
777
777
|
}),
|
|
778
778
|
},
|
|
779
|
-
|
|
779
|
+
agentRunState: {
|
|
780
780
|
getRun: async () => run,
|
|
781
781
|
createRun: async () => 'unused',
|
|
782
782
|
updateRun: async (_runId: string, patch: any) => {
|
|
@@ -787,7 +787,7 @@ describe('resumeAIAgentSync', () => {
|
|
|
787
787
|
return true
|
|
788
788
|
},
|
|
789
789
|
},
|
|
790
|
-
|
|
790
|
+
agentStorage: {
|
|
791
791
|
saveMessages: async (threadId: string, messages: any[]) => {
|
|
792
792
|
savedMessages.push({ threadId, messages })
|
|
793
793
|
},
|
|
@@ -797,7 +797,7 @@ describe('resumeAIAgentSync', () => {
|
|
|
797
797
|
|
|
798
798
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
799
799
|
|
|
800
|
-
const result = await
|
|
800
|
+
const result = await resumeAgentSync(
|
|
801
801
|
'run-resume',
|
|
802
802
|
[{ toolCallId: 'tc-1', approved: true }],
|
|
803
803
|
asOwner('resource-resume')
|
|
@@ -864,32 +864,31 @@ describe('resumeAIAgentSync', () => {
|
|
|
864
864
|
error: () => {},
|
|
865
865
|
debug: () => {},
|
|
866
866
|
},
|
|
867
|
-
|
|
868
|
-
run: async (): Promise<
|
|
867
|
+
agentRunner: {
|
|
868
|
+
run: async (): Promise<AgentStepResult> =>
|
|
869
869
|
makeStepResult({
|
|
870
870
|
text: 'Refunded',
|
|
871
871
|
usage: { inputTokens: 1, outputTokens: 1 },
|
|
872
872
|
}),
|
|
873
873
|
},
|
|
874
|
-
|
|
874
|
+
agentRunState: {
|
|
875
875
|
getRun: async () => run,
|
|
876
876
|
createRun: async () => 'unused',
|
|
877
877
|
updateRun: async () => {},
|
|
878
878
|
resolveApproval: async () => claimsLeft-- > 0,
|
|
879
879
|
},
|
|
880
|
-
|
|
880
|
+
agentStorage: {
|
|
881
881
|
saveMessages: async () => {},
|
|
882
882
|
getMessages: async () => [],
|
|
883
883
|
},
|
|
884
884
|
} as any)
|
|
885
885
|
|
|
886
886
|
const approvals = [{ toolCallId: 'tc-claim', approved: true }]
|
|
887
|
-
await
|
|
887
|
+
await resumeAgentSync('run-claim', approvals, asOwner('resource-claim'))
|
|
888
888
|
assert.equal(executions, 1, 'the winner ran the tool once')
|
|
889
889
|
|
|
890
890
|
await assert.rejects(
|
|
891
|
-
() =>
|
|
892
|
-
resumeAIAgentSync('run-claim', approvals, asOwner('resource-claim')),
|
|
891
|
+
() => resumeAgentSync('run-claim', approvals, asOwner('resource-claim')),
|
|
893
892
|
/already resolved by another caller/
|
|
894
893
|
)
|
|
895
894
|
assert.equal(executions, 1, 'the loser did not run it a second time')
|
|
@@ -927,14 +926,14 @@ describe('resumeAIAgentSync', () => {
|
|
|
927
926
|
error: () => {},
|
|
928
927
|
debug: () => {},
|
|
929
928
|
},
|
|
930
|
-
|
|
931
|
-
run: async (): Promise<
|
|
929
|
+
agentRunner: {
|
|
930
|
+
run: async (): Promise<AgentStepResult> =>
|
|
932
931
|
makeStepResult({
|
|
933
932
|
text: 'Declined',
|
|
934
933
|
usage: { inputTokens: 1, outputTokens: 1 },
|
|
935
934
|
}),
|
|
936
935
|
},
|
|
937
|
-
|
|
936
|
+
agentRunState: {
|
|
938
937
|
getRun: async () => baseRun,
|
|
939
938
|
createRun: async () => 'unused',
|
|
940
939
|
updateRun: async () => {},
|
|
@@ -943,7 +942,7 @@ describe('resumeAIAgentSync', () => {
|
|
|
943
942
|
return true
|
|
944
943
|
},
|
|
945
944
|
},
|
|
946
|
-
|
|
945
|
+
agentStorage: {
|
|
947
946
|
saveMessages: async (_threadId: string, messages: any[]) => {
|
|
948
947
|
savedMessages.push(messages)
|
|
949
948
|
},
|
|
@@ -953,7 +952,7 @@ describe('resumeAIAgentSync', () => {
|
|
|
953
952
|
|
|
954
953
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
955
954
|
|
|
956
|
-
const denied = await
|
|
955
|
+
const denied = await resumeAgentSync(
|
|
957
956
|
'run-deny',
|
|
958
957
|
[{ toolCallId: 'tc-2', approved: false }],
|
|
959
958
|
asOwner('resource-deny')
|
|
@@ -968,7 +967,7 @@ describe('resumeAIAgentSync', () => {
|
|
|
968
967
|
|
|
969
968
|
await assert.rejects(
|
|
970
969
|
() =>
|
|
971
|
-
|
|
970
|
+
resumeAgentSync(
|
|
972
971
|
'run-deny',
|
|
973
972
|
[{ toolCallId: 'tc-2', approved: false }],
|
|
974
973
|
asOwner('resource-deny'),
|
|
@@ -1030,19 +1029,19 @@ describe('resumeAIAgentSync', () => {
|
|
|
1030
1029
|
error: () => {},
|
|
1031
1030
|
debug: () => {},
|
|
1032
1031
|
},
|
|
1033
|
-
|
|
1034
|
-
run: async (): Promise<
|
|
1032
|
+
agentRunner: {
|
|
1033
|
+
run: async (): Promise<AgentStepResult> =>
|
|
1035
1034
|
makeStepResult({
|
|
1036
1035
|
text: 'Recovered',
|
|
1037
1036
|
usage: { inputTokens: 1, outputTokens: 1 },
|
|
1038
1037
|
}),
|
|
1039
1038
|
},
|
|
1040
|
-
|
|
1039
|
+
agentRunState: {
|
|
1041
1040
|
getRun: async () => run,
|
|
1042
1041
|
resolveApproval: async () => true,
|
|
1043
1042
|
updateRun: async () => {},
|
|
1044
1043
|
},
|
|
1045
|
-
|
|
1044
|
+
agentStorage: {
|
|
1046
1045
|
saveMessages: async (_threadId: string, messages: any[]) => {
|
|
1047
1046
|
savedMessages.push(messages)
|
|
1048
1047
|
},
|
|
@@ -1050,7 +1049,7 @@ describe('resumeAIAgentSync', () => {
|
|
|
1050
1049
|
},
|
|
1051
1050
|
} as any)
|
|
1052
1051
|
|
|
1053
|
-
const result = await
|
|
1052
|
+
const result = await resumeAgentSync(
|
|
1054
1053
|
'run-error',
|
|
1055
1054
|
[{ toolCallId: 'tc-error', approved: true }],
|
|
1056
1055
|
asOwner('resource-error')
|
|
@@ -1069,7 +1068,7 @@ describe('getCredential API key override', () => {
|
|
|
1069
1068
|
const overrideRunCalls: string[] = []
|
|
1070
1069
|
|
|
1071
1070
|
const overrideRunner = {
|
|
1072
|
-
run: async (): Promise<
|
|
1071
|
+
run: async (): Promise<AgentStepResult> => {
|
|
1073
1072
|
overrideRunCalls.push('override')
|
|
1074
1073
|
return makeStepResult({ text: 'from-override', finishReason: 'stop' })
|
|
1075
1074
|
},
|
|
@@ -1082,14 +1081,14 @@ describe('getCredential API key override', () => {
|
|
|
1082
1081
|
error: () => {},
|
|
1083
1082
|
debug: () => {},
|
|
1084
1083
|
},
|
|
1085
|
-
|
|
1086
|
-
run: async (): Promise<
|
|
1084
|
+
agentRunner: {
|
|
1085
|
+
run: async (): Promise<AgentStepResult> => {
|
|
1087
1086
|
originalRunCalls.push('original')
|
|
1088
1087
|
return makeStepResult({ text: 'from-original', finishReason: 'stop' })
|
|
1089
1088
|
},
|
|
1090
1089
|
withApiKey: (_key: string) => overrideRunner,
|
|
1091
1090
|
},
|
|
1092
|
-
|
|
1091
|
+
agentRunState: {
|
|
1093
1092
|
createRun: async () => 'run-key-override',
|
|
1094
1093
|
updateRun: async () => {},
|
|
1095
1094
|
},
|
|
@@ -1097,7 +1096,7 @@ describe('getCredential API key override', () => {
|
|
|
1097
1096
|
|
|
1098
1097
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
1099
1098
|
|
|
1100
|
-
const result = await
|
|
1099
|
+
const result = await runAgent(
|
|
1101
1100
|
'api-key-agent',
|
|
1102
1101
|
{ message: 'hi', threadId: 't-key', resourceId: 'r-key' },
|
|
1103
1102
|
{ getCredential: async () => ({ apiKey: 'my-secret-key' }) }
|
|
@@ -1120,8 +1119,8 @@ describe('getCredential API key override', () => {
|
|
|
1120
1119
|
error: () => {},
|
|
1121
1120
|
debug: () => {},
|
|
1122
1121
|
},
|
|
1123
|
-
|
|
1124
|
-
run: async (): Promise<
|
|
1122
|
+
agentRunner: {
|
|
1123
|
+
run: async (): Promise<AgentStepResult> => {
|
|
1125
1124
|
originalRunCalls.push('original')
|
|
1126
1125
|
return makeStepResult({ text: 'from-original', finishReason: 'stop' })
|
|
1127
1126
|
},
|
|
@@ -1133,7 +1132,7 @@ describe('getCredential API key override', () => {
|
|
|
1133
1132
|
}),
|
|
1134
1133
|
}),
|
|
1135
1134
|
},
|
|
1136
|
-
|
|
1135
|
+
agentRunState: {
|
|
1137
1136
|
createRun: async () => 'run-no-cred',
|
|
1138
1137
|
updateRun: async () => {},
|
|
1139
1138
|
},
|
|
@@ -1141,7 +1140,7 @@ describe('getCredential API key override', () => {
|
|
|
1141
1140
|
|
|
1142
1141
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
1143
1142
|
|
|
1144
|
-
const result = await
|
|
1143
|
+
const result = await runAgent(
|
|
1145
1144
|
'no-cred-agent',
|
|
1146
1145
|
{ message: 'hi', threadId: 't-no-cred', resourceId: 'r-no-cred' },
|
|
1147
1146
|
{ getCredential: async () => null }
|
|
@@ -1163,13 +1162,13 @@ describe('getCredential API key override', () => {
|
|
|
1163
1162
|
error: () => {},
|
|
1164
1163
|
debug: () => {},
|
|
1165
1164
|
},
|
|
1166
|
-
|
|
1167
|
-
run: async (): Promise<
|
|
1165
|
+
agentRunner: {
|
|
1166
|
+
run: async (): Promise<AgentStepResult> => {
|
|
1168
1167
|
originalRunCalls.push('original')
|
|
1169
1168
|
return makeStepResult({ text: 'from-original', finishReason: 'stop' })
|
|
1170
1169
|
},
|
|
1171
1170
|
},
|
|
1172
|
-
|
|
1171
|
+
agentRunState: {
|
|
1173
1172
|
createRun: async () => 'run-no-withkey',
|
|
1174
1173
|
updateRun: async () => {},
|
|
1175
1174
|
},
|
|
@@ -1177,7 +1176,7 @@ describe('getCredential API key override', () => {
|
|
|
1177
1176
|
|
|
1178
1177
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
1179
1178
|
|
|
1180
|
-
await
|
|
1179
|
+
await runAgent(
|
|
1181
1180
|
'no-withkey-agent',
|
|
1182
1181
|
{ message: 'hi', threadId: 't-no-withkey', resourceId: 'r-no-withkey' },
|
|
1183
1182
|
{ getCredential: async () => ({ apiKey: 'ignored-key' }) }
|
|
@@ -1207,11 +1206,11 @@ describe('C2 resume run ownership', () => {
|
|
|
1207
1206
|
test('rejects resuming a run owned by another user', async () => {
|
|
1208
1207
|
addTestAgent('resume-owner-agent')
|
|
1209
1208
|
pikkuState(null, 'package', 'singletonServices', {
|
|
1210
|
-
|
|
1209
|
+
agentRunState: { getRun: async () => suspendedRun('user-a') },
|
|
1211
1210
|
} as any)
|
|
1212
1211
|
|
|
1213
1212
|
await assert.rejects(
|
|
1214
|
-
() =>
|
|
1213
|
+
() => resumeAgentSync('run-owned', [], withSession('user-b')),
|
|
1215
1214
|
(e: unknown) => e instanceof ForbiddenError
|
|
1216
1215
|
)
|
|
1217
1216
|
})
|
|
@@ -1219,11 +1218,11 @@ describe('C2 resume run ownership', () => {
|
|
|
1219
1218
|
test('allows the owning user past the ownership gate', async () => {
|
|
1220
1219
|
addTestAgent('resume-owner-agent')
|
|
1221
1220
|
pikkuState(null, 'package', 'singletonServices', {
|
|
1222
|
-
|
|
1221
|
+
agentRunState: { getRun: async () => suspendedRun('user-a') },
|
|
1223
1222
|
} as any)
|
|
1224
1223
|
|
|
1225
1224
|
await assert.rejects(
|
|
1226
|
-
() =>
|
|
1225
|
+
() => resumeAgentSync('run-owned', [], withSession('user-a')),
|
|
1227
1226
|
(e: unknown) => e instanceof AIProviderNotConfiguredError
|
|
1228
1227
|
)
|
|
1229
1228
|
})
|