@pikku/core 0.12.82 → 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 +101 -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 +9 -10
- package/dist/services/index.js +3 -3
- package/dist/services/meta-service.d.ts +5 -4
- 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 +12 -11
- package/dist/types/core.types.js +1 -1
- package/dist/types/state.types.d.ts +11 -6
- 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/ai-agent-prepare.js +2 -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/addon-runner.d.ts +4 -0
- package/dist/wirings/rpc/addon-runner.js +14 -2
- package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
- package/dist/wirings/rpc/rpc-runner.js +4 -2
- package/dist/wirings/rpc/rpc-types.d.ts +5 -1
- package/dist/wirings/rpc/wire-addon.d.ts +12 -0
- package/dist/wirings/rpc/wire-addon.js +4 -0
- 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/feature.d.ts +2 -1
- package/dist/wirings/workflow/index.d.ts +3 -14
- package/dist/wirings/workflow/index.js +0 -8
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +10 -0
- package/dist/wirings/workflow/pikku-scenario-service.js +9 -0
- package/dist/wirings/workflow/run-timeline.d.ts +1 -2
- package/dist/wirings/workflow/scenario.types.d.ts +37 -0
- package/dist/wirings/workflow/scenario.types.js +1 -0
- package/dist/wirings/workflow/workflow.types.d.ts +2 -37
- 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 -4
- 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 +183 -91
- 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 +13 -24
- package/src/services/meta-service.ts +5 -7
- 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 +13 -13
- package/src/types/state.types.ts +11 -10
- 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} +54 -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/addon-runner.ts +31 -3
- package/src/wirings/rpc/addon-secrets.test.ts +130 -0
- package/src/wirings/rpc/rpc-runner.ts +4 -2
- package/src/wirings/rpc/rpc-types.ts +5 -1
- package/src/wirings/rpc/wire-addon.ts +16 -0
- 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/feature.ts +2 -5
- package/src/wirings/workflow/index.ts +1 -49
- package/src/wirings/workflow/pikku-scenario-service.ts +21 -1
- package/src/wirings/workflow/run-timeline.ts +1 -1
- package/src/wirings/workflow/scenario.types.ts +63 -0
- package/src/wirings/workflow/workflow.types.ts +1 -54
- 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
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { describe, it, mock } from 'node:test'
|
|
2
2
|
import assert from 'node:assert/strict'
|
|
3
3
|
import { EventSchemas } from '@ag-ui/core'
|
|
4
|
-
import { wrapChannelWithAGUI } from './
|
|
5
|
-
import type {
|
|
4
|
+
import { wrapChannelWithAGUI } from './agent-agui.js'
|
|
5
|
+
import type { AgentStreamChannel, AgentStreamEvent } from './agent.types.js'
|
|
6
6
|
|
|
7
|
-
function makeChannel(): { channel:
|
|
7
|
+
function makeChannel(): { channel: AgentStreamChannel; events: unknown[] } {
|
|
8
8
|
const events: unknown[] = []
|
|
9
|
-
const channel:
|
|
9
|
+
const channel: AgentStreamChannel = {
|
|
10
10
|
channelId: 'test-id',
|
|
11
11
|
openingData: null,
|
|
12
12
|
state: 'open',
|
|
@@ -39,9 +39,9 @@ describe('wrapChannelWithAGUI — text streaming', () => {
|
|
|
39
39
|
const { channel, events } = makeChannel()
|
|
40
40
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
41
41
|
|
|
42
|
-
wrapped.send({ type: 'text-delta', text: 'a' } as
|
|
43
|
-
wrapped.send({ type: 'text-delta', text: 'b' } as
|
|
44
|
-
wrapped.send({ type: 'text-delta', text: 'c' } as
|
|
42
|
+
wrapped.send({ type: 'text-delta', text: 'a' } as AgentStreamEvent)
|
|
43
|
+
wrapped.send({ type: 'text-delta', text: 'b' } as AgentStreamEvent)
|
|
44
|
+
wrapped.send({ type: 'text-delta', text: 'c' } as AgentStreamEvent)
|
|
45
45
|
|
|
46
46
|
assert.equal(
|
|
47
47
|
events.filter((e: any) => e.type === 'TEXT_MESSAGE_START').length,
|
|
@@ -57,9 +57,9 @@ describe('wrapChannelWithAGUI — text streaming', () => {
|
|
|
57
57
|
const { channel, events } = makeChannel()
|
|
58
58
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
59
59
|
|
|
60
|
-
wrapped.send({ type: 'text-delta', text: 'hello' } as
|
|
61
|
-
wrapped.send({ type: 'text-delta', text: ' world' } as
|
|
62
|
-
wrapped.send({ type: 'done' } as
|
|
60
|
+
wrapped.send({ type: 'text-delta', text: 'hello' } as AgentStreamEvent)
|
|
61
|
+
wrapped.send({ type: 'text-delta', text: ' world' } as AgentStreamEvent)
|
|
62
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
63
63
|
|
|
64
64
|
const start = find(events, 'TEXT_MESSAGE_START')
|
|
65
65
|
const end = find(events, 'TEXT_MESSAGE_END')
|
|
@@ -79,8 +79,8 @@ describe('wrapChannelWithAGUI — text streaming', () => {
|
|
|
79
79
|
const { channel, events } = makeChannel()
|
|
80
80
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
81
81
|
|
|
82
|
-
wrapped.send({ type: 'text-delta', text: 'hi' } as
|
|
83
|
-
wrapped.send({ type: 'done' } as
|
|
82
|
+
wrapped.send({ type: 'text-delta', text: 'hi' } as AgentStreamEvent)
|
|
83
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
84
84
|
|
|
85
85
|
assert.ok(find(events, 'TEXT_MESSAGE_END'))
|
|
86
86
|
})
|
|
@@ -89,8 +89,8 @@ describe('wrapChannelWithAGUI — text streaming', () => {
|
|
|
89
89
|
const { channel, events } = makeChannel()
|
|
90
90
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
91
91
|
|
|
92
|
-
wrapped.send({ type: 'text-delta', text: 'partial' } as
|
|
93
|
-
wrapped.send({ type: 'error', message: 'oops' } as
|
|
92
|
+
wrapped.send({ type: 'text-delta', text: 'partial' } as AgentStreamEvent)
|
|
93
|
+
wrapped.send({ type: 'error', message: 'oops' } as AgentStreamEvent)
|
|
94
94
|
|
|
95
95
|
const t = types(events)
|
|
96
96
|
assert.ok(t.indexOf('TEXT_MESSAGE_END') < t.indexOf('RUN_ERROR'))
|
|
@@ -100,7 +100,7 @@ describe('wrapChannelWithAGUI — text streaming', () => {
|
|
|
100
100
|
const { channel, events } = makeChannel()
|
|
101
101
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
102
102
|
|
|
103
|
-
wrapped.send({ type: 'done' } as
|
|
103
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
104
104
|
|
|
105
105
|
assert.equal(
|
|
106
106
|
events.filter((e: any) => e.type === 'TEXT_MESSAGE_END').length,
|
|
@@ -114,8 +114,14 @@ describe('wrapChannelWithAGUI — reasoning streaming', () => {
|
|
|
114
114
|
const { channel, events } = makeChannel()
|
|
115
115
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
116
116
|
|
|
117
|
-
wrapped.send({
|
|
118
|
-
|
|
117
|
+
wrapped.send({
|
|
118
|
+
type: 'reasoning-delta',
|
|
119
|
+
text: 'step 1',
|
|
120
|
+
} as AgentStreamEvent)
|
|
121
|
+
wrapped.send({
|
|
122
|
+
type: 'reasoning-delta',
|
|
123
|
+
text: 'step 2',
|
|
124
|
+
} as AgentStreamEvent)
|
|
119
125
|
|
|
120
126
|
assert.equal(
|
|
121
127
|
events.filter((e: any) => e.type === 'THINKING_TEXT_MESSAGE_START')
|
|
@@ -133,8 +139,11 @@ describe('wrapChannelWithAGUI — reasoning streaming', () => {
|
|
|
133
139
|
const { channel, events } = makeChannel()
|
|
134
140
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
135
141
|
|
|
136
|
-
wrapped.send({
|
|
137
|
-
|
|
142
|
+
wrapped.send({
|
|
143
|
+
type: 'reasoning-delta',
|
|
144
|
+
text: 'thinking',
|
|
145
|
+
} as AgentStreamEvent)
|
|
146
|
+
wrapped.send({ type: 'text-delta', text: 'answer' } as AgentStreamEvent)
|
|
138
147
|
|
|
139
148
|
const t = types(events)
|
|
140
149
|
assert.ok(t.includes('THINKING_TEXT_MESSAGE_END'))
|
|
@@ -150,13 +159,13 @@ describe('wrapChannelWithAGUI — reasoning streaming', () => {
|
|
|
150
159
|
wrapped.send({
|
|
151
160
|
type: 'reasoning-delta',
|
|
152
161
|
text: 'reasoning',
|
|
153
|
-
} as
|
|
162
|
+
} as AgentStreamEvent)
|
|
154
163
|
wrapped.send({
|
|
155
164
|
type: 'tool-call',
|
|
156
165
|
toolCallId: 'tc1',
|
|
157
166
|
toolName: 'fn',
|
|
158
167
|
args: {},
|
|
159
|
-
} as
|
|
168
|
+
} as AgentStreamEvent)
|
|
160
169
|
|
|
161
170
|
const t = types(events)
|
|
162
171
|
assert.ok(
|
|
@@ -168,8 +177,11 @@ describe('wrapChannelWithAGUI — reasoning streaming', () => {
|
|
|
168
177
|
const { channel, events } = makeChannel()
|
|
169
178
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
170
179
|
|
|
171
|
-
wrapped.send({
|
|
172
|
-
|
|
180
|
+
wrapped.send({
|
|
181
|
+
type: 'reasoning-delta',
|
|
182
|
+
text: 'reason',
|
|
183
|
+
} as AgentStreamEvent)
|
|
184
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
173
185
|
|
|
174
186
|
const start = find(events, 'THINKING_TEXT_MESSAGE_START')
|
|
175
187
|
const end = find(events, 'THINKING_TEXT_MESSAGE_END')
|
|
@@ -186,13 +198,13 @@ describe('wrapChannelWithAGUI — tool calls', () => {
|
|
|
186
198
|
const { channel, events } = makeChannel()
|
|
187
199
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
188
200
|
|
|
189
|
-
wrapped.send({ type: 'text-delta', text: 'preamble' } as
|
|
201
|
+
wrapped.send({ type: 'text-delta', text: 'preamble' } as AgentStreamEvent)
|
|
190
202
|
wrapped.send({
|
|
191
203
|
type: 'tool-call',
|
|
192
204
|
toolCallId: 'tc1',
|
|
193
205
|
toolName: 'myTool',
|
|
194
206
|
args: { x: 1 },
|
|
195
|
-
} as
|
|
207
|
+
} as AgentStreamEvent)
|
|
196
208
|
|
|
197
209
|
const t = types(events)
|
|
198
210
|
assert.ok(t.indexOf('TEXT_MESSAGE_END') < t.indexOf('TOOL_CALL_START'))
|
|
@@ -207,7 +219,7 @@ describe('wrapChannelWithAGUI — tool calls', () => {
|
|
|
207
219
|
toolCallId: 'tc1',
|
|
208
220
|
toolName: 'search',
|
|
209
221
|
args: { q: 'hi' },
|
|
210
|
-
} as
|
|
222
|
+
} as AgentStreamEvent)
|
|
211
223
|
|
|
212
224
|
const t = types(events)
|
|
213
225
|
const startIdx = t.indexOf('TOOL_CALL_START')
|
|
@@ -227,7 +239,7 @@ describe('wrapChannelWithAGUI — tool calls', () => {
|
|
|
227
239
|
toolCallId: 'abc',
|
|
228
240
|
toolName: 'myFunc',
|
|
229
241
|
args: { n: 42 },
|
|
230
|
-
} as
|
|
242
|
+
} as AgentStreamEvent)
|
|
231
243
|
|
|
232
244
|
const start = find(events, 'TOOL_CALL_START')
|
|
233
245
|
const args = find(events, 'TOOL_CALL_ARGS')
|
|
@@ -248,13 +260,13 @@ describe('wrapChannelWithAGUI — tool calls', () => {
|
|
|
248
260
|
toolCallId: 'tc1',
|
|
249
261
|
toolName: 'fn1',
|
|
250
262
|
args: {},
|
|
251
|
-
} as
|
|
263
|
+
} as AgentStreamEvent)
|
|
252
264
|
wrapped.send({
|
|
253
265
|
type: 'tool-call',
|
|
254
266
|
toolCallId: 'tc2',
|
|
255
267
|
toolName: 'fn2',
|
|
256
268
|
args: {},
|
|
257
|
-
} as
|
|
269
|
+
} as AgentStreamEvent)
|
|
258
270
|
|
|
259
271
|
const starts = (events as any[]).filter((e) => e.type === 'TOOL_CALL_START')
|
|
260
272
|
const ends = (events as any[]).filter((e) => e.type === 'TOOL_CALL_END')
|
|
@@ -273,7 +285,7 @@ describe('wrapChannelWithAGUI — tool calls', () => {
|
|
|
273
285
|
toolCallId: 'tc1',
|
|
274
286
|
toolName: 'fn',
|
|
275
287
|
result: { ok: true },
|
|
276
|
-
} as
|
|
288
|
+
} as AgentStreamEvent)
|
|
277
289
|
|
|
278
290
|
const r = find(events, 'TOOL_CALL_RESULT')
|
|
279
291
|
assert.equal(r.content, '{"ok":true}')
|
|
@@ -289,7 +301,7 @@ describe('wrapChannelWithAGUI — tool calls', () => {
|
|
|
289
301
|
toolCallId: 'tc1',
|
|
290
302
|
toolName: 'fn',
|
|
291
303
|
result: 'plain text',
|
|
292
|
-
} as
|
|
304
|
+
} as AgentStreamEvent)
|
|
293
305
|
|
|
294
306
|
const r = find(events, 'TOOL_CALL_RESULT')
|
|
295
307
|
assert.equal(r.content, 'plain text')
|
|
@@ -305,8 +317,8 @@ describe('wrapChannelWithAGUI — run lifecycle', () => {
|
|
|
305
317
|
type: 'usage',
|
|
306
318
|
tokens: { input: 100, output: 50 },
|
|
307
319
|
model: 'claude-3-5',
|
|
308
|
-
} as
|
|
309
|
-
wrapped.send({ type: 'done' } as
|
|
320
|
+
} as AgentStreamEvent)
|
|
321
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
310
322
|
|
|
311
323
|
const f = find(events, 'RUN_FINISHED')
|
|
312
324
|
assert.ok(f)
|
|
@@ -324,8 +336,8 @@ describe('wrapChannelWithAGUI — run lifecycle', () => {
|
|
|
324
336
|
type: 'usage',
|
|
325
337
|
tokens: { input: 1, output: 1 },
|
|
326
338
|
model: 'm',
|
|
327
|
-
} as
|
|
328
|
-
wrapped.send({ type: 'done' } as
|
|
339
|
+
} as AgentStreamEvent)
|
|
340
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
329
341
|
|
|
330
342
|
assert.equal(events.filter((e: any) => e.type === 'RUN_FINISHED').length, 1)
|
|
331
343
|
})
|
|
@@ -334,7 +346,7 @@ describe('wrapChannelWithAGUI — run lifecycle', () => {
|
|
|
334
346
|
const { channel, events } = makeChannel()
|
|
335
347
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
336
348
|
|
|
337
|
-
wrapped.send({ type: 'done' } as
|
|
349
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
338
350
|
|
|
339
351
|
assert.ok(find(events, 'RUN_FINISHED'))
|
|
340
352
|
})
|
|
@@ -343,13 +355,13 @@ describe('wrapChannelWithAGUI — run lifecycle', () => {
|
|
|
343
355
|
const { channel, events } = makeChannel()
|
|
344
356
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
345
357
|
|
|
346
|
-
wrapped.send({ type: 'text-delta', text: 'hi' } as
|
|
358
|
+
wrapped.send({ type: 'text-delta', text: 'hi' } as AgentStreamEvent)
|
|
347
359
|
wrapped.send({
|
|
348
360
|
type: 'usage',
|
|
349
361
|
tokens: { input: 1, output: 1 },
|
|
350
362
|
model: 'm',
|
|
351
|
-
} as
|
|
352
|
-
wrapped.send({ type: 'done' } as
|
|
363
|
+
} as AgentStreamEvent)
|
|
364
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
353
365
|
|
|
354
366
|
const t = types(events)
|
|
355
367
|
assert.ok(t.indexOf('TEXT_MESSAGE_END') < t.indexOf('RUN_FINISHED'))
|
|
@@ -359,8 +371,11 @@ describe('wrapChannelWithAGUI — run lifecycle', () => {
|
|
|
359
371
|
const { channel, events } = makeChannel()
|
|
360
372
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
361
373
|
|
|
362
|
-
wrapped.send({ type: 'text-delta', text: 'partial' } as
|
|
363
|
-
wrapped.send({
|
|
374
|
+
wrapped.send({ type: 'text-delta', text: 'partial' } as AgentStreamEvent)
|
|
375
|
+
wrapped.send({
|
|
376
|
+
type: 'error',
|
|
377
|
+
message: 'network timeout',
|
|
378
|
+
} as AgentStreamEvent)
|
|
364
379
|
|
|
365
380
|
const err = find(events, 'RUN_ERROR')
|
|
366
381
|
assert.ok(err)
|
|
@@ -373,8 +388,11 @@ describe('wrapChannelWithAGUI — run lifecycle', () => {
|
|
|
373
388
|
const { channel, events } = makeChannel()
|
|
374
389
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
375
390
|
|
|
376
|
-
wrapped.send({
|
|
377
|
-
|
|
391
|
+
wrapped.send({
|
|
392
|
+
type: 'reasoning-delta',
|
|
393
|
+
text: 'thinking',
|
|
394
|
+
} as AgentStreamEvent)
|
|
395
|
+
wrapped.send({ type: 'error', message: 'fail' } as AgentStreamEvent)
|
|
378
396
|
|
|
379
397
|
const t = types(events)
|
|
380
398
|
assert.ok(t.indexOf('THINKING_TEXT_MESSAGE_END') < t.indexOf('RUN_ERROR'))
|
|
@@ -390,7 +408,7 @@ describe('wrapChannelWithAGUI — step events', () => {
|
|
|
390
408
|
type: 'step-start',
|
|
391
409
|
stepNumber: 1,
|
|
392
410
|
agent: 'researcher',
|
|
393
|
-
} as
|
|
411
|
+
} as AgentStreamEvent)
|
|
394
412
|
|
|
395
413
|
const s = find(events, 'STEP_STARTED')
|
|
396
414
|
assert.ok(s)
|
|
@@ -403,7 +421,7 @@ describe('wrapChannelWithAGUI — step events', () => {
|
|
|
403
421
|
const { channel, events } = makeChannel()
|
|
404
422
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
405
423
|
|
|
406
|
-
wrapped.send({ type: 'step-start', stepNumber: 1 } as
|
|
424
|
+
wrapped.send({ type: 'step-start', stepNumber: 1 } as AgentStreamEvent)
|
|
407
425
|
|
|
408
426
|
const s = find(events, 'STEP_STARTED')
|
|
409
427
|
assert.ok(s)
|
|
@@ -424,7 +442,7 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
424
442
|
reason: 'irreversible action',
|
|
425
443
|
agent: 'admin-agent',
|
|
426
444
|
session: 'sess-1',
|
|
427
|
-
} as
|
|
445
|
+
} as AgentStreamEvent)
|
|
428
446
|
|
|
429
447
|
const c = find(events, 'CUSTOM', 'pikku:approval-request')
|
|
430
448
|
assert.ok(c)
|
|
@@ -440,13 +458,16 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
440
458
|
const { channel, events } = makeChannel()
|
|
441
459
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
442
460
|
|
|
443
|
-
wrapped.send({
|
|
461
|
+
wrapped.send({
|
|
462
|
+
type: 'text-delta',
|
|
463
|
+
text: 'about to ask',
|
|
464
|
+
} as AgentStreamEvent)
|
|
444
465
|
wrapped.send({
|
|
445
466
|
type: 'approval-request',
|
|
446
467
|
toolCallId: 'tc1',
|
|
447
468
|
toolName: 'fn',
|
|
448
469
|
args: {},
|
|
449
|
-
} as
|
|
470
|
+
} as AgentStreamEvent)
|
|
450
471
|
|
|
451
472
|
const t = types(events)
|
|
452
473
|
assert.ok(t.indexOf('TEXT_MESSAGE_END') < t.indexOf('CUSTOM'))
|
|
@@ -466,7 +487,7 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
466
487
|
connectUrl: 'https://github.com/oauth',
|
|
467
488
|
runId: 'run-abc',
|
|
468
489
|
agent: 'dev-agent',
|
|
469
|
-
} as
|
|
490
|
+
} as AgentStreamEvent)
|
|
470
491
|
|
|
471
492
|
const c = find(events, 'CUSTOM', 'pikku:credential-request')
|
|
472
493
|
assert.ok(c)
|
|
@@ -484,7 +505,7 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
484
505
|
wrapped.send({
|
|
485
506
|
type: 'generative-ui',
|
|
486
507
|
spec: { component: 'Chart', props: { data: [1, 2] } },
|
|
487
|
-
} as
|
|
508
|
+
} as AgentStreamEvent)
|
|
488
509
|
|
|
489
510
|
const c = find(events, 'CUSTOM', 'pikku:generative-ui')
|
|
490
511
|
assert.ok(c)
|
|
@@ -502,7 +523,7 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
502
523
|
type: 'data',
|
|
503
524
|
name: 'search-results',
|
|
504
525
|
data: [{ title: 'foo' }],
|
|
505
|
-
} as
|
|
526
|
+
} as AgentStreamEvent)
|
|
506
527
|
|
|
507
528
|
const c = find(events, 'CUSTOM', 'pikku:data')
|
|
508
529
|
assert.ok(c)
|
|
@@ -519,7 +540,7 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
519
540
|
agentName: 'sub-agent',
|
|
520
541
|
session: 'sess-2',
|
|
521
542
|
input: { query: 'hello' },
|
|
522
|
-
} as
|
|
543
|
+
} as AgentStreamEvent)
|
|
523
544
|
|
|
524
545
|
const c = find(events, 'CUSTOM', 'pikku:agent-call')
|
|
525
546
|
assert.ok(c)
|
|
@@ -537,7 +558,7 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
537
558
|
agentName: 'sub-agent',
|
|
538
559
|
session: 'sess-2',
|
|
539
560
|
result: 'done',
|
|
540
|
-
} as
|
|
561
|
+
} as AgentStreamEvent)
|
|
541
562
|
|
|
542
563
|
const c = find(events, 'CUSTOM', 'pikku:agent-result')
|
|
543
564
|
assert.ok(c)
|
|
@@ -553,7 +574,7 @@ describe('wrapChannelWithAGUI — Pikku CUSTOM events', () => {
|
|
|
553
574
|
type: 'suspended',
|
|
554
575
|
reason: 'rpc-missing',
|
|
555
576
|
missingRpcs: ['stripe.charge'],
|
|
556
|
-
} as
|
|
577
|
+
} as AgentStreamEvent)
|
|
557
578
|
|
|
558
579
|
const c = find(events, 'CUSTOM', 'pikku:suspended')
|
|
559
580
|
assert.ok(c)
|
|
@@ -571,7 +592,7 @@ describe('wrapChannelWithAGUI — speech', () => {
|
|
|
571
592
|
type: 'audio-delta',
|
|
572
593
|
data: 'base64abc',
|
|
573
594
|
format: 'mp3',
|
|
574
|
-
} as
|
|
595
|
+
} as AgentStreamEvent)
|
|
575
596
|
|
|
576
597
|
// AG-UI has no speech event, but dropping it makes a voice agent reached
|
|
577
598
|
// over HTTP inaudible: every sentence is synthesized and billed, then
|
|
@@ -585,7 +606,7 @@ describe('wrapChannelWithAGUI — speech', () => {
|
|
|
585
606
|
const { channel, events } = makeChannel()
|
|
586
607
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
587
608
|
|
|
588
|
-
wrapped.send({ type: 'audio-done' } as
|
|
609
|
+
wrapped.send({ type: 'audio-done' } as AgentStreamEvent)
|
|
589
610
|
|
|
590
611
|
assert.ok(find(events, 'CUSTOM', 'pikku:audio-done'))
|
|
591
612
|
})
|
|
@@ -597,7 +618,7 @@ describe('wrapChannelWithAGUI — speech', () => {
|
|
|
597
618
|
wrapped.send({
|
|
598
619
|
type: 'transcript',
|
|
599
620
|
text: 'what the user said',
|
|
600
|
-
} as
|
|
621
|
+
} as AgentStreamEvent)
|
|
601
622
|
|
|
602
623
|
// The client sent audio, so this is the only way it learns what its own
|
|
603
624
|
// turn was. Dropped, the user's message renders as an empty bubble.
|
|
@@ -610,13 +631,13 @@ describe('wrapChannelWithAGUI — speech', () => {
|
|
|
610
631
|
const { channel, events } = makeChannel()
|
|
611
632
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
612
633
|
|
|
613
|
-
wrapped.send({ type: 'text-delta', text: 'hello' } as
|
|
634
|
+
wrapped.send({ type: 'text-delta', text: 'hello' } as AgentStreamEvent)
|
|
614
635
|
wrapped.send({
|
|
615
636
|
type: 'audio-delta',
|
|
616
637
|
data: 'abc',
|
|
617
638
|
format: 'mp3',
|
|
618
|
-
} as
|
|
619
|
-
wrapped.send({ type: 'text-delta', text: ' there' } as
|
|
639
|
+
} as AgentStreamEvent)
|
|
640
|
+
wrapped.send({ type: 'text-delta', text: ' there' } as AgentStreamEvent)
|
|
620
641
|
|
|
621
642
|
// Audio arrives interleaved with the text it is saying. Ending the message
|
|
622
643
|
// around it would render one reply as several.
|
|
@@ -786,8 +807,8 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
786
807
|
runId: 'run-1',
|
|
787
808
|
})
|
|
788
809
|
|
|
789
|
-
wrapped.send({ type: 'text-delta', text: 'hi' } as
|
|
790
|
-
wrapped.send({ type: 'done' } as
|
|
810
|
+
wrapped.send({ type: 'text-delta', text: 'hi' } as AgentStreamEvent)
|
|
811
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
791
812
|
|
|
792
813
|
const first = events[0] as any
|
|
793
814
|
assert.equal(first.type, 'RUN_STARTED')
|
|
@@ -802,7 +823,7 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
802
823
|
runId: 'run-1',
|
|
803
824
|
})
|
|
804
825
|
|
|
805
|
-
wrapped.send({ type: 'done' } as
|
|
826
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
806
827
|
|
|
807
828
|
const f = find(events, 'RUN_FINISHED')
|
|
808
829
|
assert.equal(f.threadId, 'thread-1')
|
|
@@ -813,35 +834,35 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
813
834
|
const { channel, events } = makeChannel()
|
|
814
835
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
815
836
|
|
|
816
|
-
wrapped.send({ type: 'step-start', stepNumber: 0 } as
|
|
837
|
+
wrapped.send({ type: 'step-start', stepNumber: 0 } as AgentStreamEvent)
|
|
817
838
|
wrapped.send({
|
|
818
839
|
type: 'tool-call',
|
|
819
840
|
toolCallId: 'tc1',
|
|
820
841
|
toolName: 'listTodos',
|
|
821
842
|
args: {},
|
|
822
|
-
} as
|
|
843
|
+
} as AgentStreamEvent)
|
|
823
844
|
wrapped.send({
|
|
824
845
|
type: 'tool-result',
|
|
825
846
|
toolCallId: 'tc1',
|
|
826
847
|
toolName: 'listTodos',
|
|
827
848
|
result: ['a'],
|
|
828
|
-
} as
|
|
849
|
+
} as AgentStreamEvent)
|
|
829
850
|
wrapped.send({
|
|
830
851
|
type: 'usage',
|
|
831
852
|
tokens: { input: 10, output: 5 },
|
|
832
853
|
model: 'gpt-4o',
|
|
833
|
-
} as
|
|
834
|
-
wrapped.send({ type: 'step-start', stepNumber: 1 } as
|
|
854
|
+
} as AgentStreamEvent)
|
|
855
|
+
wrapped.send({ type: 'step-start', stepNumber: 1 } as AgentStreamEvent)
|
|
835
856
|
wrapped.send({
|
|
836
857
|
type: 'text-delta',
|
|
837
858
|
text: 'You have 1 todo',
|
|
838
|
-
} as
|
|
859
|
+
} as AgentStreamEvent)
|
|
839
860
|
wrapped.send({
|
|
840
861
|
type: 'usage',
|
|
841
862
|
tokens: { input: 20, output: 8 },
|
|
842
863
|
model: 'gpt-4o',
|
|
843
|
-
} as
|
|
844
|
-
wrapped.send({ type: 'done' } as
|
|
864
|
+
} as AgentStreamEvent)
|
|
865
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
845
866
|
|
|
846
867
|
const finishes = (events as any[]).filter((e) => e.type === 'RUN_FINISHED')
|
|
847
868
|
assert.equal(finishes.length, 1)
|
|
@@ -861,14 +882,14 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
861
882
|
const { channel, events } = makeChannel()
|
|
862
883
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
863
884
|
|
|
864
|
-
wrapped.send({ type: 'done' } as
|
|
885
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
865
886
|
wrapped.send({
|
|
866
887
|
type: 'usage',
|
|
867
888
|
tokens: { input: 1, output: 1 },
|
|
868
889
|
model: 'm',
|
|
869
|
-
} as
|
|
870
|
-
wrapped.send({ type: 'text-delta', text: 'late' } as
|
|
871
|
-
wrapped.send({ type: 'done' } as
|
|
890
|
+
} as AgentStreamEvent)
|
|
891
|
+
wrapped.send({ type: 'text-delta', text: 'late' } as AgentStreamEvent)
|
|
892
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
872
893
|
|
|
873
894
|
assert.equal((events as any[]).at(-1).type, 'RUN_FINISHED')
|
|
874
895
|
assert.equal(events.filter((e: any) => e.type === 'RUN_FINISHED').length, 1)
|
|
@@ -883,7 +904,7 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
883
904
|
toolCallId: 'tc1',
|
|
884
905
|
toolName: 'fn',
|
|
885
906
|
result: 'ok',
|
|
886
|
-
} as
|
|
907
|
+
} as AgentStreamEvent)
|
|
887
908
|
|
|
888
909
|
const r = find(events, 'TOOL_CALL_RESULT')
|
|
889
910
|
assert.ok(r.messageId, 'TOOL_CALL_RESULT requires a messageId')
|
|
@@ -898,7 +919,7 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
898
919
|
toolCallId: 'tc1',
|
|
899
920
|
toolName: 'addTodo',
|
|
900
921
|
args: { text: 'buy milk' },
|
|
901
|
-
} as
|
|
922
|
+
} as AgentStreamEvent)
|
|
902
923
|
|
|
903
924
|
const t = types(events)
|
|
904
925
|
const argsIdx = t.indexOf('TOOL_CALL_ARGS')
|
|
@@ -913,9 +934,9 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
913
934
|
const { channel, events } = makeChannel()
|
|
914
935
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
915
936
|
|
|
916
|
-
wrapped.send({ type: 'reasoning-delta', text: 'hmm' } as
|
|
917
|
-
wrapped.send({ type: 'text-delta', text: 'answer' } as
|
|
918
|
-
wrapped.send({ type: 'done' } as
|
|
937
|
+
wrapped.send({ type: 'reasoning-delta', text: 'hmm' } as AgentStreamEvent)
|
|
938
|
+
wrapped.send({ type: 'text-delta', text: 'answer' } as AgentStreamEvent)
|
|
939
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
919
940
|
|
|
920
941
|
const t = types(events)
|
|
921
942
|
assert.ok(
|
|
@@ -931,14 +952,14 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
931
952
|
const { channel, events } = makeChannel()
|
|
932
953
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
933
954
|
|
|
934
|
-
wrapped.send({ type: 'step-start', stepNumber: 0 } as
|
|
955
|
+
wrapped.send({ type: 'step-start', stepNumber: 0 } as AgentStreamEvent)
|
|
935
956
|
wrapped.send({
|
|
936
957
|
type: 'step-start',
|
|
937
958
|
stepNumber: 0,
|
|
938
959
|
agent: 'todoAgent',
|
|
939
|
-
} as
|
|
940
|
-
wrapped.send({ type: 'step-start', stepNumber: 1 } as
|
|
941
|
-
wrapped.send({ type: 'done' } as
|
|
960
|
+
} as AgentStreamEvent)
|
|
961
|
+
wrapped.send({ type: 'step-start', stepNumber: 1 } as AgentStreamEvent)
|
|
962
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
942
963
|
|
|
943
964
|
const startNames = (events as any[])
|
|
944
965
|
.filter((e) => e.type === 'STEP_STARTED')
|
|
@@ -954,7 +975,7 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
954
975
|
runId: 'r1',
|
|
955
976
|
})
|
|
956
977
|
|
|
957
|
-
const send = (e: any) => wrapped.send(e as
|
|
978
|
+
const send = (e: any) => wrapped.send(e as AgentStreamEvent)
|
|
958
979
|
send({ type: 'step-start', stepNumber: 0 })
|
|
959
980
|
send({
|
|
960
981
|
type: 'tool-call',
|
|
@@ -1034,13 +1055,13 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
1034
1055
|
const { channel, events } = makeChannel()
|
|
1035
1056
|
const wrapped = wrapChannelWithAGUI(channel)
|
|
1036
1057
|
|
|
1037
|
-
wrapped.send({ type: 'step-start', stepNumber: 0 } as
|
|
1058
|
+
wrapped.send({ type: 'step-start', stepNumber: 0 } as AgentStreamEvent)
|
|
1038
1059
|
wrapped.send({
|
|
1039
1060
|
type: 'tool-call',
|
|
1040
1061
|
toolCallId: 'tc1',
|
|
1041
1062
|
toolName: 'addTodo',
|
|
1042
1063
|
args: { text: 'x' },
|
|
1043
|
-
} as
|
|
1064
|
+
} as AgentStreamEvent)
|
|
1044
1065
|
wrapped.send({
|
|
1045
1066
|
type: 'approval-request',
|
|
1046
1067
|
toolCallId: 'tc1',
|
|
@@ -1048,8 +1069,8 @@ describe('wrapChannelWithAGUI — AG-UI protocol conformance', () => {
|
|
|
1048
1069
|
args: { text: 'x' },
|
|
1049
1070
|
reason: 'Add a todo',
|
|
1050
1071
|
runId: 'run-9',
|
|
1051
|
-
} as
|
|
1052
|
-
wrapped.send({ type: 'done' } as
|
|
1072
|
+
} as AgentStreamEvent)
|
|
1073
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
1053
1074
|
|
|
1054
1075
|
assertClientAcceptsStream(events as any[])
|
|
1055
1076
|
const c = find(events, 'CUSTOM', 'pikku:approval-request')
|
|
@@ -1067,33 +1088,33 @@ describe('wrapChannelWithAGUI — realistic full turn', () => {
|
|
|
1067
1088
|
wrapped.send({
|
|
1068
1089
|
type: 'reasoning-delta',
|
|
1069
1090
|
text: 'let me search',
|
|
1070
|
-
} as
|
|
1091
|
+
} as AgentStreamEvent)
|
|
1071
1092
|
wrapped.send({
|
|
1072
1093
|
type: 'text-delta',
|
|
1073
1094
|
text: 'I will look that up.',
|
|
1074
|
-
} as
|
|
1095
|
+
} as AgentStreamEvent)
|
|
1075
1096
|
wrapped.send({
|
|
1076
1097
|
type: 'tool-call',
|
|
1077
1098
|
toolCallId: 'tc1',
|
|
1078
1099
|
toolName: 'search',
|
|
1079
1100
|
args: { q: 'pikku' },
|
|
1080
|
-
} as
|
|
1101
|
+
} as AgentStreamEvent)
|
|
1081
1102
|
wrapped.send({
|
|
1082
1103
|
type: 'tool-result',
|
|
1083
1104
|
toolCallId: 'tc1',
|
|
1084
1105
|
toolName: 'search',
|
|
1085
1106
|
result: 'found it',
|
|
1086
|
-
} as
|
|
1107
|
+
} as AgentStreamEvent)
|
|
1087
1108
|
wrapped.send({
|
|
1088
1109
|
type: 'text-delta',
|
|
1089
1110
|
text: 'Here is what I found.',
|
|
1090
|
-
} as
|
|
1111
|
+
} as AgentStreamEvent)
|
|
1091
1112
|
wrapped.send({
|
|
1092
1113
|
type: 'usage',
|
|
1093
1114
|
tokens: { input: 200, output: 80 },
|
|
1094
1115
|
model: 'gpt-4o',
|
|
1095
|
-
} as
|
|
1096
|
-
wrapped.send({ type: 'done' } as
|
|
1116
|
+
} as AgentStreamEvent)
|
|
1117
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
1097
1118
|
|
|
1098
1119
|
const t = types(events)
|
|
1099
1120
|
assert.ok(t.includes('THINKING_TEXT_MESSAGE_START'))
|
|
@@ -1119,8 +1140,8 @@ describe('wrapChannelWithAGUI — late-bound runId', () => {
|
|
|
1119
1140
|
})
|
|
1120
1141
|
|
|
1121
1142
|
runId = 'run-from-state-service'
|
|
1122
|
-
wrapped.send({ type: 'text-delta', text: 'hi' } as
|
|
1123
|
-
wrapped.send({ type: 'done' } as
|
|
1143
|
+
wrapped.send({ type: 'text-delta', text: 'hi' } as AgentStreamEvent)
|
|
1144
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
1124
1145
|
|
|
1125
1146
|
const started = find(events, 'RUN_STARTED')
|
|
1126
1147
|
const finished = find(events, 'RUN_FINISHED')
|
|
@@ -1133,13 +1154,13 @@ describe('wrapChannelWithAGUI — late-bound runId', () => {
|
|
|
1133
1154
|
wrapChannelWithAGUI(explicit.channel, {
|
|
1134
1155
|
runId: 'explicit-run',
|
|
1135
1156
|
getRunId: () => 'ignored',
|
|
1136
|
-
}).send({ type: 'done' } as
|
|
1157
|
+
}).send({ type: 'done' } as AgentStreamEvent)
|
|
1137
1158
|
assert.equal(find(explicit.events, 'RUN_STARTED').runId, 'explicit-run')
|
|
1138
1159
|
|
|
1139
1160
|
const fallback = makeChannel()
|
|
1140
1161
|
wrapChannelWithAGUI(fallback.channel, {
|
|
1141
1162
|
getRunId: () => undefined,
|
|
1142
|
-
}).send({ type: 'done' } as
|
|
1163
|
+
}).send({ type: 'done' } as AgentStreamEvent)
|
|
1143
1164
|
const started = find(fallback.events, 'RUN_STARTED')
|
|
1144
1165
|
assert.ok(started.runId)
|
|
1145
1166
|
assert.equal(started.runId, find(fallback.events, 'RUN_FINISHED').runId)
|
|
@@ -1154,13 +1175,13 @@ describe('wrapChannelWithAGUI — interruption', () => {
|
|
|
1154
1175
|
wrapped.send({
|
|
1155
1176
|
type: 'text-delta',
|
|
1156
1177
|
text: 'I will delete the ',
|
|
1157
|
-
} as
|
|
1178
|
+
} as AgentStreamEvent)
|
|
1158
1179
|
wrapped.send({
|
|
1159
1180
|
type: 'interrupted',
|
|
1160
1181
|
runId: 'r',
|
|
1161
1182
|
text: 'I will delete the ',
|
|
1162
1183
|
reason: 'speech',
|
|
1163
|
-
} as
|
|
1184
|
+
} as AgentStreamEvent)
|
|
1164
1185
|
|
|
1165
1186
|
// Leaving TEXT_MESSAGE_END unsent would strand the assistant bubble in a
|
|
1166
1187
|
// streaming state that never resolves.
|
|
@@ -1177,14 +1198,14 @@ describe('wrapChannelWithAGUI — interruption', () => {
|
|
|
1177
1198
|
const { channel, events } = makeChannel()
|
|
1178
1199
|
const wrapped = wrapChannelWithAGUI(channel, { threadId: 't', runId: 'r' })
|
|
1179
1200
|
|
|
1180
|
-
wrapped.send({ type: 'text-delta', text: 'partial' } as
|
|
1201
|
+
wrapped.send({ type: 'text-delta', text: 'partial' } as AgentStreamEvent)
|
|
1181
1202
|
wrapped.send({
|
|
1182
1203
|
type: 'interrupted',
|
|
1183
1204
|
runId: 'r',
|
|
1184
1205
|
text: 'partial',
|
|
1185
1206
|
reason: 'speech',
|
|
1186
|
-
} as
|
|
1187
|
-
wrapped.send({ type: 'done' } as
|
|
1207
|
+
} as AgentStreamEvent)
|
|
1208
|
+
wrapped.send({ type: 'done' } as AgentStreamEvent)
|
|
1188
1209
|
|
|
1189
1210
|
assert.equal(events.filter((e: any) => e.type === 'RUN_FINISHED').length, 1)
|
|
1190
1211
|
assert.equal(events.filter((e: any) => e.type === 'RUN_ERROR').length, 0)
|