@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,19 +1,19 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
AgentInput,
|
|
3
|
+
AgentOutput,
|
|
4
|
+
AgentStep,
|
|
5
|
+
AgentMemoryConfig,
|
|
6
|
+
CoreAgent,
|
|
7
|
+
PikkuAgentMiddlewareHooks,
|
|
8
8
|
AgentRunState,
|
|
9
|
-
} from './
|
|
9
|
+
} from './agent.types.js'
|
|
10
10
|
import type {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from '../../services/
|
|
15
|
-
import type {
|
|
16
|
-
import type {
|
|
11
|
+
AgentStepResult,
|
|
12
|
+
AgentRunnerParams,
|
|
13
|
+
AgentRunnerService,
|
|
14
|
+
} from '../../services/agent-runner-service.js'
|
|
15
|
+
import type { AgentStorageService } from '../../services/agent-storage-service.js'
|
|
16
|
+
import type { AgentRunStateService } from '../../services/agent-run-state-service.js'
|
|
17
17
|
|
|
18
18
|
import {
|
|
19
19
|
saveMessages,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
loadContextMessages,
|
|
22
22
|
trimMessages,
|
|
23
23
|
getWorkingMemoryMiddleware,
|
|
24
|
-
} from './
|
|
24
|
+
} from './agent-memory.js'
|
|
25
25
|
import {
|
|
26
26
|
prepareAgentRun,
|
|
27
27
|
resolveAgent,
|
|
@@ -31,9 +31,9 @@ import {
|
|
|
31
31
|
agentSessionScope,
|
|
32
32
|
assertResourcePrincipalOwner,
|
|
33
33
|
assertAgentAuthorized,
|
|
34
|
-
type
|
|
35
|
-
} from './
|
|
36
|
-
import { checkForApprovals, appendStepMessages } from './
|
|
34
|
+
type RunAgentParams,
|
|
35
|
+
} from './agent-prepare.js'
|
|
36
|
+
import { checkForApprovals, appendStepMessages } from './agent-stream.js'
|
|
37
37
|
import {
|
|
38
38
|
AgentInterruptedError,
|
|
39
39
|
isAbortError,
|
|
@@ -41,22 +41,22 @@ import {
|
|
|
41
41
|
registerInterruptibleRun,
|
|
42
42
|
trackInterruptNote,
|
|
43
43
|
trackToolExecution,
|
|
44
|
-
} from './
|
|
44
|
+
} from './agent-interrupt.js'
|
|
45
45
|
import { pikkuState, getSingletonServices } from '../../pikku-state.js'
|
|
46
46
|
import {
|
|
47
47
|
applyInputMiddleware,
|
|
48
48
|
describeApprovals,
|
|
49
49
|
notifyAfterStep,
|
|
50
50
|
toAccumulatedStep,
|
|
51
|
-
} from './
|
|
51
|
+
} from './agent-turn.js'
|
|
52
52
|
import {
|
|
53
53
|
applyOutputMiddleware,
|
|
54
54
|
finalizeAgentRun,
|
|
55
55
|
lastUserMessageText,
|
|
56
|
-
} from './
|
|
57
|
-
import { resolveModelConfig } from './
|
|
56
|
+
} from './agent-finalize.js'
|
|
57
|
+
import { resolveModelConfig } from './agent-model-config.js'
|
|
58
58
|
import { AIProviderNotConfiguredError } from '../../errors/errors.js'
|
|
59
|
-
import { randomUUID } from './
|
|
59
|
+
import { randomUUID } from './agent-utils.js'
|
|
60
60
|
|
|
61
61
|
function stripNulls(obj: unknown): unknown {
|
|
62
62
|
if (obj === null) return undefined
|
|
@@ -86,12 +86,12 @@ function extractStructuredAssistantOutput(object: unknown): {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
export async function
|
|
89
|
+
export async function runAgent(
|
|
90
90
|
agentName: string,
|
|
91
|
-
input:
|
|
92
|
-
params:
|
|
91
|
+
input: AgentInput,
|
|
92
|
+
params: RunAgentParams,
|
|
93
93
|
agentSessionMap?: Map<string, string>
|
|
94
|
-
): Promise<
|
|
94
|
+
): Promise<AgentOutput> {
|
|
95
95
|
const sessionMap = agentSessionMap ?? new Map<string, string>()
|
|
96
96
|
|
|
97
97
|
input = {
|
|
@@ -119,13 +119,13 @@ export async function runAIAgent(
|
|
|
119
119
|
runnerParams.agentId = agentName
|
|
120
120
|
|
|
121
121
|
const singletonServices = getSingletonServices()
|
|
122
|
-
const {
|
|
123
|
-
if (!
|
|
124
|
-
throw new Error('
|
|
122
|
+
const { agentRunState } = singletonServices
|
|
123
|
+
if (!agentRunState) {
|
|
124
|
+
throw new Error('AgentRunStateService not available in singletonServices')
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
if (missingRpcs.length > 0) {
|
|
128
|
-
const runId = await
|
|
128
|
+
const runId = await agentRunState.createRun({
|
|
129
129
|
agentName,
|
|
130
130
|
threadId,
|
|
131
131
|
resourceId: input.resourceId,
|
|
@@ -145,22 +145,22 @@ export async function runAIAgent(
|
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
const
|
|
148
|
+
const agentMiddlewares: PikkuAgentMiddlewareHooks[] = [
|
|
149
149
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
150
150
|
threadId,
|
|
151
151
|
workingMemorySchemaName,
|
|
152
152
|
logger: singletonServices.logger,
|
|
153
153
|
schemaService: singletonServices.schema,
|
|
154
154
|
}),
|
|
155
|
-
...(agent.
|
|
155
|
+
...(agent.agentMiddleware ?? []),
|
|
156
156
|
]
|
|
157
157
|
|
|
158
|
-
// One bag per run, shared by every middleware — see
|
|
158
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
159
159
|
const sharedNotes: Record<string, unknown> = {}
|
|
160
160
|
|
|
161
161
|
const { messages: modifiedMessages, instructions: modifiedInstructions } =
|
|
162
162
|
await applyInputMiddleware(
|
|
163
|
-
|
|
163
|
+
agentMiddlewares,
|
|
164
164
|
singletonServices,
|
|
165
165
|
{
|
|
166
166
|
messages: runnerParams.messages,
|
|
@@ -176,7 +176,7 @@ export async function runAIAgent(
|
|
|
176
176
|
const persistedUserMessage =
|
|
177
177
|
lastModified?.id === userMessage.id ? lastModified : userMessage
|
|
178
178
|
|
|
179
|
-
const runId = await
|
|
179
|
+
const runId = await agentRunState.createRun({
|
|
180
180
|
agentName,
|
|
181
181
|
threadId,
|
|
182
182
|
resourceId: input.resourceId,
|
|
@@ -192,9 +192,9 @@ export async function runAIAgent(
|
|
|
192
192
|
runnerParams.tools = trackToolExecution(runnerParams.tools, interruptHandle)
|
|
193
193
|
|
|
194
194
|
try {
|
|
195
|
-
const accumulatedSteps:
|
|
195
|
+
const accumulatedSteps: AgentStep[] = []
|
|
196
196
|
const totalUsage = { inputTokens: 0, outputTokens: 0 }
|
|
197
|
-
let lastStepResult:
|
|
197
|
+
let lastStepResult: AgentStepResult | null = null
|
|
198
198
|
|
|
199
199
|
for (let step = 0; step < maxSteps; step++) {
|
|
200
200
|
if (agent.prepareStep) {
|
|
@@ -218,7 +218,12 @@ export async function runAIAgent(
|
|
|
218
218
|
totalUsage.inputTokens += stepResult.usage.inputTokens
|
|
219
219
|
totalUsage.outputTokens += stepResult.usage.outputTokens
|
|
220
220
|
|
|
221
|
-
await notifyAfterStep(
|
|
221
|
+
await notifyAfterStep(
|
|
222
|
+
agentMiddlewares,
|
|
223
|
+
singletonServices,
|
|
224
|
+
step,
|
|
225
|
+
stepResult
|
|
226
|
+
)
|
|
222
227
|
|
|
223
228
|
accumulatedSteps.push(toAccumulatedStep(stepResult))
|
|
224
229
|
|
|
@@ -271,7 +276,7 @@ export async function runAIAgent(
|
|
|
271
276
|
])
|
|
272
277
|
}
|
|
273
278
|
|
|
274
|
-
await
|
|
279
|
+
await agentRunState.updateRun(runId, {
|
|
275
280
|
status: 'suspended',
|
|
276
281
|
suspendReason: 'approval',
|
|
277
282
|
pendingApprovals,
|
|
@@ -309,7 +314,7 @@ export async function runAIAgent(
|
|
|
309
314
|
}
|
|
310
315
|
|
|
311
316
|
const { text: outputText, steps: outputSteps } =
|
|
312
|
-
await applyOutputMiddleware(
|
|
317
|
+
await applyOutputMiddleware(agentMiddlewares, singletonServices, {
|
|
313
318
|
text: finalText,
|
|
314
319
|
messages: runnerParams.messages,
|
|
315
320
|
steps: result.steps,
|
|
@@ -329,7 +334,7 @@ export async function runAIAgent(
|
|
|
329
334
|
}
|
|
330
335
|
)
|
|
331
336
|
|
|
332
|
-
await finalizeAgentRun(
|
|
337
|
+
await finalizeAgentRun(agentRunState, {
|
|
333
338
|
runId,
|
|
334
339
|
agentName,
|
|
335
340
|
threadId,
|
|
@@ -352,7 +357,7 @@ export async function runAIAgent(
|
|
|
352
357
|
// knowledge: decisions/internals/an-agent-interrupt-is-not-a-failure.md
|
|
353
358
|
const interruption = interruptHandle.interruption
|
|
354
359
|
if (interruption || isAbortError(error)) {
|
|
355
|
-
await
|
|
360
|
+
await agentRunState.updateRun(runId, { status: 'interrupted' })
|
|
356
361
|
if (storage) {
|
|
357
362
|
trackInterruptNote(
|
|
358
363
|
threadId,
|
|
@@ -361,7 +366,7 @@ export async function runAIAgent(
|
|
|
361
366
|
}
|
|
362
367
|
throw new AgentInterruptedError(runId, interruption ?? { reason: 'user' })
|
|
363
368
|
}
|
|
364
|
-
for (const mw of
|
|
369
|
+
for (const mw of agentMiddlewares) {
|
|
365
370
|
if (mw.onError) {
|
|
366
371
|
try {
|
|
367
372
|
await mw.onError(singletonServices, {
|
|
@@ -372,7 +377,7 @@ export async function runAIAgent(
|
|
|
372
377
|
} catch {}
|
|
373
378
|
}
|
|
374
379
|
}
|
|
375
|
-
await
|
|
380
|
+
await agentRunState.updateRun(runId, {
|
|
376
381
|
status: 'failed',
|
|
377
382
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
378
383
|
})
|
|
@@ -382,19 +387,19 @@ export async function runAIAgent(
|
|
|
382
387
|
}
|
|
383
388
|
}
|
|
384
389
|
|
|
385
|
-
export async function
|
|
390
|
+
export async function resumeAgentSync(
|
|
386
391
|
runId: string,
|
|
387
392
|
approvals: { toolCallId: string; approved: boolean }[],
|
|
388
|
-
params:
|
|
393
|
+
params: RunAgentParams,
|
|
389
394
|
expectedAgentName?: string
|
|
390
|
-
): Promise<
|
|
395
|
+
): Promise<AgentOutput> {
|
|
391
396
|
const singletonServices = getSingletonServices()
|
|
392
|
-
const {
|
|
393
|
-
if (!
|
|
394
|
-
throw new Error('
|
|
397
|
+
const { agentRunState } = singletonServices
|
|
398
|
+
if (!agentRunState) {
|
|
399
|
+
throw new Error('AgentRunStateService not available in singletonServices')
|
|
395
400
|
}
|
|
396
401
|
|
|
397
|
-
const run = await
|
|
402
|
+
const run = await agentRunState.getRun(runId)
|
|
398
403
|
if (!run) throw new Error(`No run found for runId ${runId}`)
|
|
399
404
|
assertResourcePrincipalOwner(
|
|
400
405
|
params,
|
|
@@ -417,7 +422,7 @@ export async function resumeAIAgentSync(
|
|
|
417
422
|
|
|
418
423
|
const { storage } = resolveMemoryServices(agent, singletonServices)
|
|
419
424
|
const memoryConfig = agent.memory
|
|
420
|
-
const agentRunner = singletonServices.
|
|
425
|
+
const agentRunner = singletonServices.agentRunner
|
|
421
426
|
if (!agentRunner) {
|
|
422
427
|
throw new AIProviderNotConfiguredError()
|
|
423
428
|
}
|
|
@@ -436,7 +441,7 @@ export async function resumeAIAgentSync(
|
|
|
436
441
|
// for may run the tool.
|
|
437
442
|
const claimedIds = new Set<string>()
|
|
438
443
|
for (const { toolCallId, approved } of approvals) {
|
|
439
|
-
const claimed = await
|
|
444
|
+
const claimed = await agentRunState.resolveApproval(
|
|
440
445
|
toolCallId,
|
|
441
446
|
approved ? 'approved' : 'denied'
|
|
442
447
|
)
|
|
@@ -458,7 +463,7 @@ export async function resumeAIAgentSync(
|
|
|
458
463
|
resolvedName,
|
|
459
464
|
packageName,
|
|
460
465
|
undefined,
|
|
461
|
-
agent.
|
|
466
|
+
agent.agentMiddleware ?? []
|
|
462
467
|
)
|
|
463
468
|
|
|
464
469
|
const toolCallMessages: {
|
|
@@ -538,7 +543,7 @@ export async function resumeAIAgentSync(
|
|
|
538
543
|
])
|
|
539
544
|
}
|
|
540
545
|
|
|
541
|
-
await
|
|
546
|
+
await agentRunState.updateRun(runId, { status: 'running' })
|
|
542
547
|
|
|
543
548
|
return continueAfterToolResultSync(
|
|
544
549
|
run,
|
|
@@ -549,7 +554,7 @@ export async function resumeAIAgentSync(
|
|
|
549
554
|
memoryConfig,
|
|
550
555
|
agentRunner,
|
|
551
556
|
params,
|
|
552
|
-
|
|
557
|
+
agentRunState,
|
|
553
558
|
// The approved tools were executed here, before the model was re-entered,
|
|
554
559
|
// so they belong to the run's step record — otherwise a tool that failed
|
|
555
560
|
// after approval leaves no trace on the run at all.
|
|
@@ -569,16 +574,16 @@ export async function resumeAIAgentSync(
|
|
|
569
574
|
|
|
570
575
|
async function continueAfterToolResultSync(
|
|
571
576
|
run: AgentRunState,
|
|
572
|
-
agent:
|
|
577
|
+
agent: CoreAgent,
|
|
573
578
|
packageName: string | null,
|
|
574
579
|
resolvedName: string,
|
|
575
|
-
storage:
|
|
576
|
-
memoryConfig:
|
|
577
|
-
agentRunner:
|
|
578
|
-
params:
|
|
579
|
-
|
|
580
|
-
resumedToolStep?:
|
|
581
|
-
): Promise<
|
|
580
|
+
storage: AgentStorageService | undefined,
|
|
581
|
+
memoryConfig: AgentMemoryConfig | undefined,
|
|
582
|
+
agentRunner: AgentRunnerService,
|
|
583
|
+
params: RunAgentParams,
|
|
584
|
+
agentRunState: AgentRunStateService,
|
|
585
|
+
resumedToolStep?: AgentStep
|
|
586
|
+
): Promise<AgentOutput> {
|
|
582
587
|
const singletonServices = getSingletonServices()
|
|
583
588
|
const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta')
|
|
584
589
|
const meta = agentsMeta[resolvedName]
|
|
@@ -606,21 +611,21 @@ async function continueAfterToolResultSync(
|
|
|
606
611
|
|
|
607
612
|
const instructions = await buildInstructions(resolvedName, packageName)
|
|
608
613
|
|
|
609
|
-
const
|
|
614
|
+
const agentMiddlewares: PikkuAgentMiddlewareHooks[] = [
|
|
610
615
|
...getWorkingMemoryMiddleware(memoryConfig, storage, {
|
|
611
616
|
threadId: run.threadId,
|
|
612
617
|
workingMemorySchemaName,
|
|
613
618
|
logger: singletonServices.logger,
|
|
614
619
|
schemaService: singletonServices.schema,
|
|
615
620
|
}),
|
|
616
|
-
...(agent.
|
|
621
|
+
...(agent.agentMiddleware ?? []),
|
|
617
622
|
]
|
|
618
|
-
// One bag per run, shared by every middleware — see
|
|
623
|
+
// One bag per run, shared by every middleware — see PikkuAgentMiddlewareHooks.
|
|
619
624
|
const sharedNotes: Record<string, unknown> = {}
|
|
620
625
|
|
|
621
626
|
const { messages: modifiedMessages, instructions: modifiedInstructions } =
|
|
622
627
|
await applyInputMiddleware(
|
|
623
|
-
|
|
628
|
+
agentMiddlewares,
|
|
624
629
|
singletonServices,
|
|
625
630
|
{ messages: trimmedMessages, instructions: instructions },
|
|
626
631
|
sharedNotes
|
|
@@ -633,13 +638,13 @@ async function continueAfterToolResultSync(
|
|
|
633
638
|
resolvedName,
|
|
634
639
|
packageName,
|
|
635
640
|
undefined,
|
|
636
|
-
|
|
641
|
+
agentMiddlewares
|
|
637
642
|
)
|
|
638
643
|
|
|
639
644
|
const resolved = resolveModelConfig(resolvedName, agent)
|
|
640
645
|
const maxSteps = resolved.maxSteps ?? 10
|
|
641
646
|
|
|
642
|
-
const runnerParams:
|
|
647
|
+
const runnerParams: AgentRunnerParams = {
|
|
643
648
|
model: resolved.model,
|
|
644
649
|
temperature: resolved.temperature,
|
|
645
650
|
instructions: modifiedInstructions,
|
|
@@ -666,12 +671,12 @@ async function continueAfterToolResultSync(
|
|
|
666
671
|
// `saveMessages`, and the approved tool's messages were already written to
|
|
667
672
|
// the thread before the model was re-entered. It belongs to the run's step
|
|
668
673
|
// record, not to persistence.
|
|
669
|
-
const withResumedStep = (steps:
|
|
674
|
+
const withResumedStep = (steps: AgentStep[]): AgentStep[] =>
|
|
670
675
|
resumedToolStep ? [resumedToolStep, ...steps] : steps
|
|
671
676
|
|
|
672
|
-
const accumulatedSteps:
|
|
677
|
+
const accumulatedSteps: AgentStep[] = []
|
|
673
678
|
const totalUsage = { inputTokens: 0, outputTokens: 0 }
|
|
674
|
-
let lastStepResult:
|
|
679
|
+
let lastStepResult: AgentStepResult | null = null
|
|
675
680
|
|
|
676
681
|
for (let step = 0; step < maxSteps; step++) {
|
|
677
682
|
const stepResult = await agentRunner.run(runnerParams)
|
|
@@ -680,7 +685,12 @@ async function continueAfterToolResultSync(
|
|
|
680
685
|
totalUsage.inputTokens += stepResult.usage.inputTokens
|
|
681
686
|
totalUsage.outputTokens += stepResult.usage.outputTokens
|
|
682
687
|
|
|
683
|
-
await notifyAfterStep(
|
|
688
|
+
await notifyAfterStep(
|
|
689
|
+
agentMiddlewares,
|
|
690
|
+
singletonServices,
|
|
691
|
+
step,
|
|
692
|
+
stepResult
|
|
693
|
+
)
|
|
684
694
|
|
|
685
695
|
accumulatedSteps.push(toAccumulatedStep(stepResult))
|
|
686
696
|
|
|
@@ -735,7 +745,7 @@ async function continueAfterToolResultSync(
|
|
|
735
745
|
])
|
|
736
746
|
}
|
|
737
747
|
|
|
738
|
-
await
|
|
748
|
+
await agentRunState.updateRun(run.runId, {
|
|
739
749
|
status: 'suspended',
|
|
740
750
|
suspendReason: 'approval',
|
|
741
751
|
pendingApprovals,
|
|
@@ -772,7 +782,7 @@ async function continueAfterToolResultSync(
|
|
|
772
782
|
}
|
|
773
783
|
|
|
774
784
|
const { text: outputText, steps: outputSteps } =
|
|
775
|
-
await applyOutputMiddleware(
|
|
785
|
+
await applyOutputMiddleware(agentMiddlewares, singletonServices, {
|
|
776
786
|
text: finalText,
|
|
777
787
|
messages: runnerParams.messages,
|
|
778
788
|
steps: withResumedStep(result.steps),
|
|
@@ -793,7 +803,7 @@ async function continueAfterToolResultSync(
|
|
|
793
803
|
}
|
|
794
804
|
)
|
|
795
805
|
|
|
796
|
-
await finalizeAgentRun(
|
|
806
|
+
await finalizeAgentRun(agentRunState, {
|
|
797
807
|
runId: run.runId,
|
|
798
808
|
agentName: resolvedName,
|
|
799
809
|
threadId: run.threadId,
|
|
@@ -815,7 +825,7 @@ async function continueAfterToolResultSync(
|
|
|
815
825
|
} catch (error) {
|
|
816
826
|
const interruption = interruptHandle.interruption
|
|
817
827
|
if (interruption || isAbortError(error)) {
|
|
818
|
-
await
|
|
828
|
+
await agentRunState.updateRun(run.runId, { status: 'interrupted' })
|
|
819
829
|
if (storage) {
|
|
820
830
|
trackInterruptNote(
|
|
821
831
|
run.threadId,
|
|
@@ -827,7 +837,7 @@ async function continueAfterToolResultSync(
|
|
|
827
837
|
interruption ?? { reason: 'user' }
|
|
828
838
|
)
|
|
829
839
|
}
|
|
830
|
-
for (const mw of
|
|
840
|
+
for (const mw of agentMiddlewares) {
|
|
831
841
|
if (mw.onError) {
|
|
832
842
|
try {
|
|
833
843
|
await mw.onError(singletonServices, {
|
|
@@ -838,7 +848,7 @@ async function continueAfterToolResultSync(
|
|
|
838
848
|
} catch {}
|
|
839
849
|
}
|
|
840
850
|
}
|
|
841
|
-
await
|
|
851
|
+
await agentRunState.updateRun(run.runId, {
|
|
842
852
|
status: 'failed',
|
|
843
853
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
844
854
|
})
|
|
@@ -2,16 +2,16 @@ 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 {
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
5
|
+
import { streamAgent } from './agent-stream.js'
|
|
6
|
+
import type { CoreAgent, PikkuAgentMiddlewareHooks } from './agent.types.js'
|
|
7
|
+
import type { AgentStepResult } from '../../services/agent-runner-service.js'
|
|
8
8
|
|
|
9
9
|
beforeEach(() => {
|
|
10
10
|
resetPikkuState()
|
|
11
11
|
})
|
|
12
12
|
|
|
13
13
|
const addTestAgent = (agentName: string) => {
|
|
14
|
-
const agent:
|
|
14
|
+
const agent: CoreAgent = {
|
|
15
15
|
name: agentName,
|
|
16
16
|
description: 'test agent',
|
|
17
17
|
instructions: 'be helpful',
|
|
@@ -28,8 +28,8 @@ const addTestAgent = (agentName: string) => {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
const makeStepResult = (
|
|
31
|
-
overrides?: Partial<
|
|
32
|
-
):
|
|
31
|
+
overrides?: Partial<AgentStepResult>
|
|
32
|
+
): AgentStepResult => ({
|
|
33
33
|
text: '',
|
|
34
34
|
toolCalls: [],
|
|
35
35
|
toolResults: [],
|
|
@@ -38,7 +38,7 @@ const makeStepResult = (
|
|
|
38
38
|
...overrides,
|
|
39
39
|
})
|
|
40
40
|
|
|
41
|
-
describe('
|
|
41
|
+
describe('streamAgent output hooks', () => {
|
|
42
42
|
test('does not run modifyOutput on a streamed run, and warns the hook it is inert there', async () => {
|
|
43
43
|
addTestAgent('stream-modify-output-agent')
|
|
44
44
|
|
|
@@ -46,7 +46,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
46
46
|
const modifyOutputCalls: unknown[] = []
|
|
47
47
|
const sideEffects: string[] = []
|
|
48
48
|
|
|
49
|
-
const middleware:
|
|
49
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
50
50
|
modifyOutput: async (_services, ctx) => {
|
|
51
51
|
modifyOutputCalls.push(ctx)
|
|
52
52
|
sideEffects.push(ctx.text)
|
|
@@ -56,7 +56,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
56
56
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
57
57
|
'stream-modify-output-agent'
|
|
58
58
|
)!
|
|
59
|
-
agent.
|
|
59
|
+
agent.agentMiddleware = [middleware] as any
|
|
60
60
|
pikkuState(null, 'agent', 'agents').set('stream-modify-output-agent', agent)
|
|
61
61
|
|
|
62
62
|
const mockServices = {
|
|
@@ -66,13 +66,13 @@ describe('streamAIAgent output hooks', () => {
|
|
|
66
66
|
error: () => {},
|
|
67
67
|
debug: () => {},
|
|
68
68
|
},
|
|
69
|
-
|
|
69
|
+
agentRunner: {
|
|
70
70
|
stream: async (_params: any, channel: any) => {
|
|
71
71
|
channel.send({ type: 'text-delta', text: 'Hello' })
|
|
72
72
|
return makeStepResult({ text: 'Hello', finishReason: 'stop' })
|
|
73
73
|
},
|
|
74
74
|
},
|
|
75
|
-
|
|
75
|
+
agentRunState: {
|
|
76
76
|
createRun: async () => 'run-modify-output',
|
|
77
77
|
updateRun: async () => {},
|
|
78
78
|
},
|
|
@@ -80,7 +80,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
80
80
|
|
|
81
81
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
82
82
|
|
|
83
|
-
const result = await
|
|
83
|
+
const result = await streamAgent(
|
|
84
84
|
'stream-modify-output-agent',
|
|
85
85
|
{
|
|
86
86
|
message: 'hello',
|
|
@@ -139,7 +139,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
139
139
|
error: () => {},
|
|
140
140
|
debug: () => {},
|
|
141
141
|
},
|
|
142
|
-
|
|
142
|
+
agentRunner: {
|
|
143
143
|
stream: async (_params: any, channel: any) => {
|
|
144
144
|
channel.send({
|
|
145
145
|
type: 'text-delta',
|
|
@@ -148,11 +148,11 @@ describe('streamAIAgent output hooks', () => {
|
|
|
148
148
|
return makeStepResult({ text: 'Noted', finishReason: 'stop' })
|
|
149
149
|
},
|
|
150
150
|
},
|
|
151
|
-
|
|
151
|
+
agentRunState: {
|
|
152
152
|
createRun: async () => 'run-working-memory',
|
|
153
153
|
updateRun: async () => {},
|
|
154
154
|
},
|
|
155
|
-
|
|
155
|
+
agentStorage: {
|
|
156
156
|
createThread: async () => {},
|
|
157
157
|
getMessages: async () => [],
|
|
158
158
|
saveMessages: async () => {},
|
|
@@ -169,7 +169,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
169
169
|
|
|
170
170
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
171
171
|
|
|
172
|
-
await
|
|
172
|
+
await streamAgent(
|
|
173
173
|
'stream-working-memory-agent',
|
|
174
174
|
{
|
|
175
175
|
message: 'remember I live in Berlin',
|
|
@@ -210,7 +210,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
210
210
|
error: () => {},
|
|
211
211
|
debug: () => {},
|
|
212
212
|
},
|
|
213
|
-
|
|
213
|
+
agentRunner: {
|
|
214
214
|
stream: async (_params: any, channel: any) => {
|
|
215
215
|
channel.send({
|
|
216
216
|
type: 'tool-call',
|
|
@@ -240,11 +240,11 @@ describe('streamAIAgent output hooks', () => {
|
|
|
240
240
|
return makeStepResult({ text: 'done', finishReason: 'stop' })
|
|
241
241
|
},
|
|
242
242
|
},
|
|
243
|
-
|
|
243
|
+
agentRunState: {
|
|
244
244
|
createRun: async () => 'run-tool-error',
|
|
245
245
|
updateRun: async () => {},
|
|
246
246
|
},
|
|
247
|
-
|
|
247
|
+
agentStorage: {
|
|
248
248
|
createThread: async () => {},
|
|
249
249
|
getMessages: async () => [],
|
|
250
250
|
saveMessages: async (_threadId: string, messages: any[]) => {
|
|
@@ -255,7 +255,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
255
255
|
|
|
256
256
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
257
257
|
|
|
258
|
-
await
|
|
258
|
+
await streamAgent(
|
|
259
259
|
'stream-tool-error-agent',
|
|
260
260
|
{
|
|
261
261
|
message: 'look it up',
|
|
@@ -290,7 +290,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
290
290
|
|
|
291
291
|
const warnings: unknown[][] = []
|
|
292
292
|
|
|
293
|
-
const middleware:
|
|
293
|
+
const middleware: PikkuAgentMiddlewareHooks = {
|
|
294
294
|
modifyOutput: async (_services, ctx) => ({
|
|
295
295
|
text: ctx.text,
|
|
296
296
|
messages: ctx.messages,
|
|
@@ -300,7 +300,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
300
300
|
const agent = pikkuState(null, 'agent', 'agents').get(
|
|
301
301
|
'stream-both-hooks-agent'
|
|
302
302
|
)!
|
|
303
|
-
agent.
|
|
303
|
+
agent.agentMiddleware = [middleware] as any
|
|
304
304
|
pikkuState(null, 'agent', 'agents').set('stream-both-hooks-agent', agent)
|
|
305
305
|
|
|
306
306
|
const mockServices = {
|
|
@@ -310,13 +310,13 @@ describe('streamAIAgent output hooks', () => {
|
|
|
310
310
|
error: () => {},
|
|
311
311
|
debug: () => {},
|
|
312
312
|
},
|
|
313
|
-
|
|
313
|
+
agentRunner: {
|
|
314
314
|
stream: async (_params: any, channel: any) => {
|
|
315
315
|
channel.send({ type: 'text-delta', text: 'Hi' })
|
|
316
316
|
return makeStepResult({ text: 'Hi', finishReason: 'stop' })
|
|
317
317
|
},
|
|
318
318
|
},
|
|
319
|
-
|
|
319
|
+
agentRunState: {
|
|
320
320
|
createRun: async () => 'run-both-hooks',
|
|
321
321
|
updateRun: async () => {},
|
|
322
322
|
},
|
|
@@ -324,7 +324,7 @@ describe('streamAIAgent output hooks', () => {
|
|
|
324
324
|
|
|
325
325
|
pikkuState(null, 'package', 'singletonServices', mockServices)
|
|
326
326
|
|
|
327
|
-
await
|
|
327
|
+
await streamAgent(
|
|
328
328
|
'stream-both-hooks-agent',
|
|
329
329
|
{
|
|
330
330
|
message: 'hello',
|