@pikku/core 0.12.83 → 0.12.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +1 -1
- package/dist/ecosystem/agent-scorer.d.ts +12 -0
- package/dist/ecosystem/agent-scorer.js +5 -0
- package/dist/ecosystem/agent.d.ts +18 -0
- package/dist/ecosystem/agent.js +6 -0
- package/dist/ecosystem/ai-agent.d.ts +18 -0
- package/dist/ecosystem/ai-agent.js +6 -0
- package/dist/ecosystem/ai-scorer.d.ts +12 -0
- package/dist/ecosystem/ai-scorer.js +5 -0
- package/dist/ecosystem/channel/local.d.ts +1 -0
- package/dist/ecosystem/channel/local.js +1 -0
- package/dist/ecosystem/channel.d.ts +12 -0
- package/dist/ecosystem/channel.js +4 -0
- package/dist/ecosystem/cli/channel.d.ts +16 -0
- package/dist/ecosystem/cli/channel.js +2 -0
- package/dist/ecosystem/cli.d.ts +9 -0
- package/dist/ecosystem/cli.js +2 -0
- package/dist/ecosystem/credential.d.ts +9 -0
- package/dist/ecosystem/credential.js +1 -0
- package/dist/ecosystem/dev.d.ts +8 -0
- package/dist/ecosystem/dev.js +1 -0
- package/dist/ecosystem/function.d.ts +13 -0
- package/dist/ecosystem/function.js +2 -0
- package/dist/ecosystem/gateway.d.ts +1 -0
- package/dist/ecosystem/gateway.js +1 -0
- package/dist/ecosystem/hmac.d.ts +1 -0
- package/dist/ecosystem/hmac.js +1 -0
- package/dist/ecosystem/http.d.ts +11 -0
- package/dist/ecosystem/http.js +3 -0
- package/dist/ecosystem/mcp.d.ts +3 -0
- package/dist/ecosystem/mcp.js +2 -0
- package/dist/ecosystem/middleware.d.ts +17 -0
- package/dist/ecosystem/middleware.js +6 -0
- package/dist/ecosystem/node-host-resolver.d.ts +1 -0
- package/dist/ecosystem/node-host-resolver.js +1 -0
- package/dist/ecosystem/node.d.ts +1 -0
- package/dist/ecosystem/node.js +1 -0
- package/dist/ecosystem/oauth2.d.ts +1 -0
- package/dist/ecosystem/oauth2.js +1 -0
- package/dist/ecosystem/persona.d.ts +15 -0
- package/dist/ecosystem/persona.js +4 -0
- package/dist/ecosystem/queue.d.ts +11 -0
- package/dist/ecosystem/queue.js +2 -0
- package/dist/ecosystem/remote.d.ts +8 -0
- package/dist/ecosystem/remote.js +1 -0
- package/dist/ecosystem/role.d.ts +3 -0
- package/dist/ecosystem/role.js +2 -0
- package/dist/ecosystem/rpc.d.ts +4 -0
- package/dist/ecosystem/rpc.js +2 -0
- package/dist/ecosystem/safe-fetch.d.ts +7 -0
- package/dist/ecosystem/safe-fetch.js +1 -0
- package/dist/ecosystem/scenario.d.ts +15 -0
- package/dist/ecosystem/scenario.js +4 -0
- package/dist/ecosystem/scheduler.d.ts +2 -0
- package/dist/ecosystem/scheduler.js +1 -0
- package/dist/ecosystem/schema.d.ts +1 -0
- package/dist/ecosystem/schema.js +1 -0
- package/dist/ecosystem/scope.d.ts +3 -0
- package/dist/ecosystem/scope.js +2 -0
- package/dist/ecosystem/secret.d.ts +9 -0
- package/dist/ecosystem/secret.js +1 -0
- package/dist/ecosystem/services/istanbul-coverage.d.ts +1 -0
- package/dist/ecosystem/services/istanbul-coverage.js +1 -0
- package/dist/ecosystem/services/local-content-request-handler.d.ts +9 -0
- package/dist/ecosystem/services/local-content-request-handler.js +1 -0
- package/dist/ecosystem/services/local-content.d.ts +1 -0
- package/dist/ecosystem/services/local-content.js +1 -0
- package/dist/ecosystem/services/v8-coverage.d.ts +1 -0
- package/dist/ecosystem/services/v8-coverage.js +1 -0
- package/dist/ecosystem/services.d.ts +28 -0
- package/dist/ecosystem/services.js +6 -0
- package/dist/ecosystem/testing.d.ts +7 -0
- package/dist/ecosystem/testing.js +1 -0
- package/dist/ecosystem/trigger.d.ts +1 -0
- package/dist/ecosystem/trigger.js +1 -0
- package/dist/ecosystem/types.d.ts +9 -0
- package/dist/ecosystem/types.js +5 -0
- package/dist/ecosystem/variable.d.ts +8 -0
- package/dist/ecosystem/variable.js +1 -0
- package/dist/ecosystem/virtual-user.d.ts +21 -0
- package/dist/ecosystem/virtual-user.js +5 -0
- package/dist/ecosystem/workflow.d.ts +18 -0
- package/dist/ecosystem/workflow.js +4 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.js +3 -3
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-cookie.d.ts +1 -1
- package/dist/middleware/cors.d.ts +1 -1
- package/dist/middleware/remote-auth.d.ts +1 -1
- package/dist/middleware/telemetry.d.ts +2 -2
- package/dist/services/agent-run-state-service.d.ts +29 -0
- package/dist/services/agent-run-state-service.js +1 -0
- package/dist/services/agent-runner-service.d.ts +220 -0
- package/dist/services/agent-runner-service.js +1 -0
- package/dist/services/agent-storage-service.d.ts +18 -0
- package/dist/services/agent-storage-service.js +1 -0
- package/dist/services/http-personas.d.ts +1 -1
- package/dist/services/http-personas.js +3 -3
- package/dist/services/in-memory-agent-run-state-service.d.ts +19 -0
- package/dist/services/in-memory-agent-run-state-service.js +54 -0
- package/dist/services/index.d.ts +4 -4
- package/dist/services/index.js +1 -1
- package/dist/services/meta-service.d.ts +3 -3
- package/dist/testing/service-tests/agent-run-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/agent-run-service-tests.js +3 -3
- package/dist/testing/service-tests/agent-storage-service-tests.d.ts +3 -0
- package/dist/testing/service-tests/agent-storage-service-tests.js +302 -0
- package/dist/testing/service-tests.d.ts +4 -4
- package/dist/testing/service-tests.js +4 -4
- package/dist/types/core.types.d.ts +10 -10
- package/dist/types/core.types.js +1 -1
- package/dist/types/state.types.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.d.ts +2 -2
- package/dist/wirings/agent/agent-agui.d.ts +79 -0
- package/dist/wirings/agent/agent-agui.js +327 -0
- package/dist/wirings/agent/agent-finalize.d.ts +58 -0
- package/dist/wirings/agent/agent-finalize.js +138 -0
- package/dist/wirings/agent/agent-helpers.d.ts +35 -0
- package/dist/wirings/agent/agent-helpers.js +47 -0
- package/dist/wirings/agent/agent-interrupt.d.ts +153 -0
- package/dist/wirings/agent/agent-interrupt.js +257 -0
- package/dist/wirings/agent/agent-memory.d.ts +42 -0
- package/dist/wirings/agent/agent-memory.js +333 -0
- package/dist/wirings/agent/agent-model-config.d.ts +16 -0
- package/dist/wirings/agent/agent-model-config.js +51 -0
- package/dist/wirings/agent/agent-prepare.d.ts +117 -0
- package/dist/wirings/agent/agent-prepare.js +728 -0
- package/dist/wirings/agent/agent-registry.d.ts +16 -0
- package/dist/wirings/agent/agent-registry.js +51 -0
- package/dist/wirings/agent/agent-rpc.d.ts +15 -0
- package/dist/wirings/agent/agent-rpc.js +53 -0
- package/dist/wirings/agent/agent-runner.d.ts +7 -0
- package/dist/wirings/agent/agent-runner.js +580 -0
- package/dist/wirings/agent/agent-stream.d.ts +41 -0
- package/dist/wirings/agent/agent-stream.js +1029 -0
- package/dist/wirings/agent/agent-turn.d.ts +57 -0
- package/dist/wirings/agent/agent-turn.js +82 -0
- package/dist/wirings/agent/agent-utils.d.ts +1 -0
- package/dist/wirings/agent/agent-utils.js +1 -0
- package/dist/wirings/agent/agent.types.d.ts +625 -0
- package/dist/wirings/agent/agent.types.js +1 -0
- package/dist/wirings/agent/index.d.ts +12 -0
- package/dist/wirings/agent/index.js +10 -0
- package/dist/wirings/agent/voice-input.d.ts +69 -0
- package/dist/wirings/agent/voice-input.js +150 -0
- package/dist/wirings/agent/voice-output.d.ts +85 -0
- package/dist/wirings/agent/voice-output.js +196 -0
- package/dist/wirings/agent-scorer/agent-scorer-grade.d.ts +26 -0
- package/dist/wirings/agent-scorer/agent-scorer-grade.js +33 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +17 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +92 -0
- package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +15 -0
- package/dist/wirings/agent-scorer/agent-scorer-live.js +38 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +18 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.js +46 -0
- package/dist/wirings/agent-scorer/agent-scorer-sampling.d.ts +8 -0
- package/dist/wirings/agent-scorer/agent-scorer-sampling.js +31 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +40 -0
- package/dist/wirings/agent-scorer/agent-scorer-worker.d.ts +15 -0
- package/dist/wirings/agent-scorer/agent-scorer-worker.js +60 -0
- package/dist/wirings/agent-scorer/agent-scorer.d.ts +39 -0
- package/dist/wirings/agent-scorer/agent-scorer.js +40 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +90 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.js +4 -0
- package/dist/wirings/agent-scorer/index.d.ts +6 -0
- package/dist/wirings/agent-scorer/index.js +5 -0
- package/dist/wirings/ai-agent/voice-output.d.ts +1 -2
- package/dist/wirings/channel/channel-rpc.types.d.ts +2 -2
- package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
- package/dist/wirings/rpc/rpc-runner.js +2 -2
- package/dist/wirings/rpc/rpc-types.d.ts +1 -1
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +1 -1
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +1 -1
- package/dist/wirings/workflow/run-timeline.d.ts +1 -2
- package/knowledge/decisions/internals/{a-non-streaming-agent-run-registers-with-airunstate-too.md → a-non-streaming-agent-run-registers-with-agentrunstate-too.md} +6 -6
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +1 -1
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-agui-bridge-obeys-the-client-ordering-contract.md → agent-agui-bridge-obeys-the-client-ordering-contract.md} +5 -5
- package/knowledge/decisions/internals/{ai-agent-audio-chunks-carry-the-format-the-provider-returned.md → agent-audio-chunks-carry-the-format-the-provider-returned.md} +2 -2
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-credential-suspensions-hide-the-tool-result.md → agent-credential-suspensions-hide-the-tool-result.md} +2 -2
- package/knowledge/decisions/internals/{ai-agent-delegate-and-supervise-hide-different-text.md → agent-delegate-and-supervise-hide-different-text.md} +4 -4
- package/knowledge/decisions/internals/{ai-agent-llm-tool-arguments-have-nulls-stripped.md → agent-llm-tool-arguments-have-nulls-stripped.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-model-config-stays-a-single-resolution-seam.md → agent-model-config-stays-a-single-resolution-seam.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-onerror-hooks-cannot-change-the-failure.md → agent-onerror-hooks-cannot-change-the-failure.md} +6 -6
- package/knowledge/decisions/internals/{ai-agent-runner-methods-must-keep-their-receiver.md → agent-runner-methods-must-keep-their-receiver.md} +4 -4
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-stream-persistence-is-best-effort.md → agent-stream-persistence-is-best-effort.md} +4 -4
- package/knowledge/decisions/internals/{ai-agent-sub-agents-inherit-the-parent-context-block.md → agent-sub-agents-inherit-the-parent-context-block.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-tool-execute-failures-are-logged-unconditionally.md → agent-tool-execute-failures-are-logged-unconditionally.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-voice-input-transcribes-audio-parts-in-place.md → agent-voice-input-transcribes-audio-parts-in-place.md} +2 -2
- package/knowledge/decisions/internals/{ai-agent-working-memory-is-persisted-only-when-valid.md → agent-working-memory-is-persisted-only-when-valid.md} +2 -2
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +2 -2
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +3 -3
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +2 -2
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +1 -1
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +1 -1
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +1 -1
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +1 -1
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +1 -1
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +5 -5
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +2 -2
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +2 -2
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +1 -1
- package/knowledge/decisions/security/{ai-agent-approval-forwarding-requires-a-symbol-brand.md → agent-approval-forwarding-requires-a-symbol-brand.md} +3 -3
- package/knowledge/decisions/security/{ai-agent-credential-requests-are-symbol-branded.md → agent-credential-requests-are-symbol-branded.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-gate-requires-a-session-only-when-auth-is-true.md → agent-gate-requires-a-session-only-when-auth-is-true.md} +3 -3
- package/knowledge/decisions/security/{ai-agent-ownership-failures-never-echo-the-resource.md → agent-ownership-failures-never-echo-the-resource.md} +2 -2
- package/knowledge/decisions/security/{ai-agent-resume-re-runs-the-authorization-gate.md → agent-resume-re-runs-the-authorization-gate.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-sessionless-deployments-have-no-thread-ownership.md → agent-sessionless-deployments-have-no-thread-ownership.md} +5 -5
- package/knowledge/decisions/security/{ai-agent-thread-ownership-composes-the-session-principal.md → agent-thread-ownership-composes-the-session-principal.md} +2 -2
- package/knowledge/decisions/security/{ai-agent-tool-filtering-reads-the-live-function-config.md → agent-tool-filtering-reads-the-live-function-config.md} +2 -2
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +3 -3
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +3 -3
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +20 -13
- package/knowledge/decisions/security/index.md +1 -2
- package/package.json +4 -3
- package/scripts/generate-api-report.mts +32 -8
- package/src/agent-naming.test.ts +68 -0
- package/src/ecosystem/agent-scorer.ts +24 -0
- package/src/ecosystem/agent.ts +42 -0
- package/src/ecosystem/channel/local.ts +1 -0
- package/src/ecosystem/channel.ts +22 -0
- package/src/ecosystem/cli/channel.ts +25 -0
- package/src/ecosystem/cli.ts +21 -0
- package/src/ecosystem/credential.ts +10 -0
- package/src/ecosystem/dev.ts +12 -0
- package/src/ecosystem/function.ts +28 -0
- package/src/ecosystem/gateway.ts +4 -0
- package/src/ecosystem/hmac.ts +1 -0
- package/src/ecosystem/http.ts +22 -0
- package/src/ecosystem/mcp.ts +17 -0
- package/src/ecosystem/middleware.ts +27 -0
- package/src/ecosystem/node-host-resolver.ts +1 -0
- package/src/ecosystem/node.ts +5 -0
- package/src/ecosystem/oauth2.ts +4 -0
- package/src/ecosystem/persona.ts +30 -0
- package/src/ecosystem/queue.ts +23 -0
- package/src/ecosystem/remote.ts +9 -0
- package/src/ecosystem/role.ts +13 -0
- package/src/ecosystem/rpc.ts +7 -0
- package/src/ecosystem/safe-fetch.ts +8 -0
- package/src/ecosystem/scenario.ts +32 -0
- package/src/ecosystem/scheduler.ts +5 -0
- package/src/ecosystem/schema.ts +1 -0
- package/src/ecosystem/scope.ts +14 -0
- package/src/ecosystem/secret.ts +15 -0
- package/src/ecosystem/services/istanbul-coverage.ts +1 -0
- package/src/ecosystem/services/local-content-request-handler.ts +16 -0
- package/src/ecosystem/services/local-content.ts +1 -0
- package/src/ecosystem/services/v8-coverage.ts +1 -0
- package/src/ecosystem/services.ts +82 -0
- package/src/ecosystem/testing.ts +8 -0
- package/src/ecosystem/trigger.ts +7 -0
- package/src/ecosystem/types.ts +34 -0
- package/src/ecosystem/variable.ts +14 -0
- package/src/ecosystem/virtual-user.ts +48 -0
- package/src/ecosystem/workflow.ts +68 -0
- package/src/index.ts +8 -19
- package/src/pikku-state.ts +3 -3
- package/src/public-surface.json +173 -68
- package/src/public-surface.json.README +20 -2
- package/src/public-surface.test.ts +31 -3
- package/src/services/{ai-run-state-service.ts → agent-run-state-service.ts} +5 -5
- package/src/services/{ai-agent-runner-service.ts → agent-runner-service.ts} +18 -18
- package/src/services/{ai-storage-service.ts → agent-storage-service.ts} +7 -7
- package/src/services/http-personas-converse.test.ts +3 -3
- package/src/services/http-personas.ts +4 -4
- package/src/services/{in-memory-ai-run-state-service.ts → in-memory-agent-run-state-service.ts} +7 -7
- package/src/services/index.ts +9 -9
- package/src/services/meta-service.ts +3 -3
- package/src/testing/service-tests/agent-run-service-tests.ts +4 -4
- package/src/testing/service-tests/{ai-storage-service-tests.ts → agent-storage-service-tests.ts} +8 -8
- package/src/testing/service-tests.ts +10 -8
- package/src/types/core.types.ts +12 -12
- package/src/types/state.types.ts +6 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +2 -2
- package/src/wirings/actor-flow/run-conversation.ts +7 -9
- package/src/wirings/{ai-agent/ai-agent-agui.test.ts → agent/agent-agui.test.ts} +126 -105
- package/src/wirings/{ai-agent/ai-agent-agui.ts → agent/agent-agui.ts} +7 -7
- package/src/wirings/{ai-agent/ai-agent-authorization.test.ts → agent/agent-authorization.test.ts} +6 -6
- package/src/wirings/{ai-agent/ai-agent-finalize.test.ts → agent/agent-finalize.test.ts} +17 -16
- package/src/wirings/{ai-agent/ai-agent-finalize.ts → agent/agent-finalize.ts} +22 -22
- package/src/wirings/{ai-agent/ai-agent-helpers.test.ts → agent/agent-helpers.test.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-helpers.ts → agent/agent-helpers.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-interrupt.test.ts → agent/agent-interrupt.test.ts} +67 -77
- package/src/wirings/{ai-agent/ai-agent-interrupt.ts → agent/agent-interrupt.ts} +5 -5
- package/src/wirings/{ai-agent/ai-agent-memory.test.ts → agent/agent-memory.test.ts} +12 -12
- package/src/wirings/{ai-agent/ai-agent-memory.ts → agent/agent-memory.ts} +36 -36
- package/src/wirings/{ai-agent/ai-agent-model-config.test.ts → agent/agent-model-config.test.ts} +2 -5
- package/src/wirings/{ai-agent/ai-agent-model-config.ts → agent/agent-model-config.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-prepare.test.ts → agent/agent-prepare.test.ts} +18 -18
- package/src/wirings/{ai-agent/ai-agent-prepare.ts → agent/agent-prepare.ts} +52 -51
- package/src/wirings/{ai-agent/ai-agent-registry.test.ts → agent/agent-registry.test.ts} +49 -43
- package/src/wirings/{ai-agent/ai-agent-registry.ts → agent/agent-registry.ts} +14 -14
- package/src/wirings/{ai-agent/ai-agent-resume-authorization.test.ts → agent/agent-resume-authorization.test.ts} +18 -18
- package/src/wirings/{ai-agent → agent}/agent-rpc.ts +16 -20
- package/src/wirings/{ai-agent/ai-agent-runner.test.ts → agent/agent-runner.test.ts} +105 -106
- package/src/wirings/{ai-agent/ai-agent-runner.ts → agent/agent-runner.ts} +90 -80
- package/src/wirings/{ai-agent/ai-agent-stream-output-hooks.test.ts → agent/agent-stream-output-hooks.test.ts} +25 -25
- package/src/wirings/{ai-agent/ai-agent-stream.test.ts → agent/agent-stream.test.ts} +147 -143
- package/src/wirings/{ai-agent/ai-agent-stream.ts → agent/agent-stream.ts} +147 -146
- package/src/wirings/{ai-agent/ai-agent-thread-ownership.test.ts → agent/agent-thread-ownership.test.ts} +24 -28
- package/src/wirings/{ai-agent/ai-agent-turn.test.ts → agent/agent-turn.test.ts} +3 -5
- package/src/wirings/{ai-agent/ai-agent-turn.ts → agent/agent-turn.ts} +7 -7
- package/src/wirings/{ai-agent/ai-agent.types.ts → agent/agent.types.ts} +51 -48
- package/src/wirings/agent/index.ts +56 -0
- package/src/wirings/{ai-agent → agent}/voice-input.test.ts +15 -15
- package/src/wirings/{ai-agent → agent}/voice-input.ts +11 -11
- package/src/wirings/{ai-agent → agent}/voice-output.test.ts +23 -23
- package/src/wirings/{ai-agent → agent}/voice-output.ts +11 -11
- package/src/wirings/{ai-scorer/ai-scorer-grade.test.ts → agent-scorer/agent-scorer-grade.test.ts} +8 -8
- package/src/wirings/{ai-scorer/ai-scorer-grade.ts → agent-scorer/agent-scorer-grade.ts} +9 -9
- package/src/wirings/{ai-scorer/ai-scorer-judge.test.ts → agent-scorer/agent-scorer-judge.test.ts} +11 -14
- package/src/wirings/{ai-scorer/ai-scorer-judge.ts → agent-scorer/agent-scorer-judge.ts} +11 -11
- package/src/wirings/{ai-scorer/ai-scorer-live.test.ts → agent-scorer/agent-scorer-live.test.ts} +11 -11
- package/src/wirings/{ai-scorer/ai-scorer-live.ts → agent-scorer/agent-scorer-live.ts} +3 -3
- package/src/wirings/{ai-scorer/ai-scorer-registry.ts → agent-scorer/agent-scorer-registry.ts} +11 -8
- package/src/wirings/{ai-scorer/ai-scorer-sampling.test.ts → agent-scorer/agent-scorer-sampling.test.ts} +1 -1
- package/src/wirings/{ai-scorer/ai-scorer-snapshots.test.ts → agent-scorer/agent-scorer-snapshots.test.ts} +2 -2
- package/src/wirings/{ai-scorer/ai-scorer-snapshots.ts → agent-scorer/agent-scorer-snapshots.ts} +1 -1
- package/src/wirings/{ai-scorer/ai-scorer-worker.test.ts → agent-scorer/agent-scorer-worker.test.ts} +15 -15
- package/src/wirings/{ai-scorer/ai-scorer-worker.ts → agent-scorer/agent-scorer-worker.ts} +9 -7
- package/src/wirings/{ai-scorer/ai-scorer.ts → agent-scorer/agent-scorer.ts} +7 -7
- package/src/wirings/{ai-scorer/ai-scorer.types.ts → agent-scorer/agent-scorer.types.ts} +6 -6
- package/src/wirings/agent-scorer/index.ts +22 -0
- package/src/wirings/channel/channel-rpc.types.ts +2 -2
- package/src/wirings/rpc/rpc-runner.ts +2 -2
- package/src/wirings/rpc/rpc-types.ts +1 -1
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +1 -1
- package/src/wirings/virtual-user/run-virtual-user.test.ts +2 -2
- package/src/wirings/virtual-user/run-virtual-user.ts +3 -3
- package/src/wirings/virtual-user/virtual-user-agents.ts +1 -1
- package/src/wirings/workflow/run-timeline.ts +1 -1
- package/src/wirings-stay-decoupled.test.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/src/wirings/ai-agent/index.ts +0 -65
- package/src/wirings/ai-scorer/index.ts +0 -24
- /package/src/wirings/{ai-agent/ai-agent-utils.ts → agent/agent-utils.ts} +0 -0
- /package/src/wirings/{ai-scorer/ai-scorer-sampling.ts → agent-scorer/agent-scorer-sampling.ts} +0 -0
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
setSingletonServices,
|
|
8
8
|
} from '../../pikku-state.js'
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from './
|
|
10
|
+
addAgent,
|
|
11
|
+
approveAgent,
|
|
12
|
+
getAgents,
|
|
13
|
+
getAgentsMeta,
|
|
14
|
+
} from './agent-registry.js'
|
|
15
15
|
import { clearPermissionsCache } from '../../permissions.js'
|
|
16
16
|
import { ForbiddenError, MissingScopeError } from '../../errors/errors.js'
|
|
17
|
-
import type {
|
|
17
|
+
import type { CoreAgent } from './agent.types.js'
|
|
18
18
|
import type { CoreUserSession } from '../../types/core.types.js'
|
|
19
19
|
|
|
20
20
|
const logger = {
|
|
@@ -26,7 +26,7 @@ const logger = {
|
|
|
26
26
|
|
|
27
27
|
const registerAgent = (
|
|
28
28
|
agentName: string,
|
|
29
|
-
overrides: Partial<
|
|
29
|
+
overrides: Partial<CoreAgent> = {}
|
|
30
30
|
) => {
|
|
31
31
|
const agent = {
|
|
32
32
|
name: agentName,
|
|
@@ -34,7 +34,7 @@ const registerAgent = (
|
|
|
34
34
|
goal: `${agentName} goal`,
|
|
35
35
|
model: 'test/test-model',
|
|
36
36
|
...overrides,
|
|
37
|
-
} as
|
|
37
|
+
} as CoreAgent
|
|
38
38
|
pikkuState(null, 'agent', 'agents').set(agentName, agent)
|
|
39
39
|
pikkuState(null, 'agent', 'agentsMeta')[agentName] = { ...agent } as any
|
|
40
40
|
return agent
|
|
@@ -53,7 +53,7 @@ beforeEach(() => {
|
|
|
53
53
|
setSingletonServices({ logger } as any)
|
|
54
54
|
})
|
|
55
55
|
|
|
56
|
-
describe('
|
|
56
|
+
describe('addAgent', () => {
|
|
57
57
|
test('skips registration when metadata is missing and warns', () => {
|
|
58
58
|
const warnings: string[] = []
|
|
59
59
|
const originalWarn = console.warn
|
|
@@ -62,7 +62,7 @@ describe('addAIAgent', () => {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
try {
|
|
65
|
-
|
|
65
|
+
addAgent('missing-agent', {
|
|
66
66
|
name: 'missing-agent',
|
|
67
67
|
description: 'desc',
|
|
68
68
|
goal: 'goal',
|
|
@@ -73,7 +73,7 @@ describe('addAIAgent', () => {
|
|
|
73
73
|
console.warn = originalWarn
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
assert.equal(
|
|
76
|
+
assert.equal(getAgents().has('missing-agent'), false)
|
|
77
77
|
assert.match(warnings[0], /Skipping AI agent 'missing-agent'/)
|
|
78
78
|
})
|
|
79
79
|
|
|
@@ -84,7 +84,7 @@ describe('addAIAgent', () => {
|
|
|
84
84
|
goal: 'goal',
|
|
85
85
|
} as any
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
addAgent('assistant', {
|
|
88
88
|
name: 'assistant',
|
|
89
89
|
description: 'desc',
|
|
90
90
|
goal: 'goal',
|
|
@@ -92,10 +92,10 @@ describe('addAIAgent', () => {
|
|
|
92
92
|
model: 'model',
|
|
93
93
|
} as any)
|
|
94
94
|
|
|
95
|
-
assert.equal(
|
|
95
|
+
assert.equal(getAgents().get('assistant')?.name, 'assistant')
|
|
96
96
|
assert.throws(
|
|
97
97
|
() =>
|
|
98
|
-
|
|
98
|
+
addAgent('assistant', {
|
|
99
99
|
name: 'assistant',
|
|
100
100
|
description: 'desc',
|
|
101
101
|
goal: 'goal',
|
|
@@ -109,7 +109,7 @@ describe('addAIAgent', () => {
|
|
|
109
109
|
})
|
|
110
110
|
})
|
|
111
111
|
|
|
112
|
-
describe('
|
|
112
|
+
describe('approveAgent', () => {
|
|
113
113
|
const ownerParams = {
|
|
114
114
|
sessionService: sessionService({ userId: 'resource-1' } as CoreUserSession),
|
|
115
115
|
} as any
|
|
@@ -117,13 +117,13 @@ describe('approveAIAgent', () => {
|
|
|
117
117
|
test('throws when run state service is missing, run is missing, or run is not suspended', async () => {
|
|
118
118
|
registerAgent('agent')
|
|
119
119
|
|
|
120
|
-
await assert.rejects(() =>
|
|
121
|
-
message: '
|
|
120
|
+
await assert.rejects(() => approveAgent(null as any, 'run-1', []), {
|
|
121
|
+
message: 'AgentRunStateService not available',
|
|
122
122
|
})
|
|
123
123
|
|
|
124
124
|
await assert.rejects(
|
|
125
125
|
() =>
|
|
126
|
-
|
|
126
|
+
approveAgent(
|
|
127
127
|
{
|
|
128
128
|
getRun: async () => null,
|
|
129
129
|
updateRun: async () => {},
|
|
@@ -140,7 +140,7 @@ describe('approveAIAgent', () => {
|
|
|
140
140
|
|
|
141
141
|
await assert.rejects(
|
|
142
142
|
() =>
|
|
143
|
-
|
|
143
|
+
approveAgent(
|
|
144
144
|
{
|
|
145
145
|
getRun: async () => ({
|
|
146
146
|
runId: 'run-1',
|
|
@@ -171,7 +171,7 @@ describe('approveAIAgent', () => {
|
|
|
171
171
|
|
|
172
172
|
test('rejects approval when run agent does not match expected agent', async () => {
|
|
173
173
|
registerAgent('internal-agent')
|
|
174
|
-
const
|
|
174
|
+
const agentRunState = {
|
|
175
175
|
getRun: async () => ({
|
|
176
176
|
runId: 'run-1',
|
|
177
177
|
agentName: 'internal-agent',
|
|
@@ -188,8 +188,8 @@ describe('approveAIAgent', () => {
|
|
|
188
188
|
|
|
189
189
|
await assert.rejects(
|
|
190
190
|
() =>
|
|
191
|
-
|
|
192
|
-
|
|
191
|
+
approveAgent(
|
|
192
|
+
agentRunState,
|
|
193
193
|
'run-1',
|
|
194
194
|
[{ toolCallId: 'call-1', approved: true }],
|
|
195
195
|
'public-agent',
|
|
@@ -205,7 +205,7 @@ describe('approveAIAgent', () => {
|
|
|
205
205
|
test('marks run resumed when at least one approval is granted', async () => {
|
|
206
206
|
registerAgent('assistant')
|
|
207
207
|
const updates: any[] = []
|
|
208
|
-
const result = await
|
|
208
|
+
const result = await approveAgent(
|
|
209
209
|
{
|
|
210
210
|
getRun: async () => ({
|
|
211
211
|
runId: 'run-2',
|
|
@@ -264,7 +264,7 @@ describe('approveAIAgent', () => {
|
|
|
264
264
|
test('keeps run suspended when nothing is approved', async () => {
|
|
265
265
|
registerAgent('assistant')
|
|
266
266
|
const updates: any[] = []
|
|
267
|
-
const result = await
|
|
267
|
+
const result = await approveAgent(
|
|
268
268
|
{
|
|
269
269
|
getRun: async () => ({
|
|
270
270
|
runId: 'run-3',
|
|
@@ -310,7 +310,7 @@ describe('approveAIAgent', () => {
|
|
|
310
310
|
})
|
|
311
311
|
})
|
|
312
312
|
|
|
313
|
-
describe('
|
|
313
|
+
describe('approveAgent authorization', () => {
|
|
314
314
|
const suspendedRun = (agentName: string, resourceId: string) => ({
|
|
315
315
|
runId: 'run-auth',
|
|
316
316
|
agentName,
|
|
@@ -329,7 +329,7 @@ describe('approveAIAgent authorization', () => {
|
|
|
329
329
|
const updates: any[] = []
|
|
330
330
|
return {
|
|
331
331
|
updates,
|
|
332
|
-
|
|
332
|
+
agentRunState: {
|
|
333
333
|
getRun: async () => suspendedRun(agentName, resourceId),
|
|
334
334
|
updateRun: async (_runId: string, patch: any) => {
|
|
335
335
|
updates.push(patch)
|
|
@@ -340,12 +340,15 @@ describe('approveAIAgent authorization', () => {
|
|
|
340
340
|
|
|
341
341
|
test('rejects when the run belongs to another session principal', async () => {
|
|
342
342
|
registerAgent('owned-agent')
|
|
343
|
-
const { updates,
|
|
343
|
+
const { updates, agentRunState } = runStateFor(
|
|
344
|
+
'owned-agent',
|
|
345
|
+
'user-a:default'
|
|
346
|
+
)
|
|
344
347
|
|
|
345
348
|
await assert.rejects(
|
|
346
349
|
() =>
|
|
347
|
-
|
|
348
|
-
|
|
350
|
+
approveAgent(
|
|
351
|
+
agentRunState,
|
|
349
352
|
'run-auth',
|
|
350
353
|
[{ toolCallId: 'call-1', approved: true }],
|
|
351
354
|
undefined,
|
|
@@ -359,13 +362,13 @@ describe('approveAIAgent authorization', () => {
|
|
|
359
362
|
test('rejects when the agent permissions deny', async () => {
|
|
360
363
|
registerAgent('denied-agent', {
|
|
361
364
|
permissions: { denied: async () => false },
|
|
362
|
-
} as Partial<
|
|
363
|
-
const { updates,
|
|
365
|
+
} as Partial<CoreAgent>)
|
|
366
|
+
const { updates, agentRunState } = runStateFor('denied-agent', 'u1')
|
|
364
367
|
|
|
365
368
|
await assert.rejects(
|
|
366
369
|
() =>
|
|
367
|
-
|
|
368
|
-
|
|
370
|
+
approveAgent(
|
|
371
|
+
agentRunState,
|
|
369
372
|
'run-auth',
|
|
370
373
|
[{ toolCallId: 'call-1', approved: true }],
|
|
371
374
|
undefined,
|
|
@@ -378,12 +381,12 @@ describe('approveAIAgent authorization', () => {
|
|
|
378
381
|
|
|
379
382
|
test('rejects when a required scope is no longer held', async () => {
|
|
380
383
|
registerAgent('scoped-agent', { scopes: ['admin:refund'] })
|
|
381
|
-
const { updates,
|
|
384
|
+
const { updates, agentRunState } = runStateFor('scoped-agent', 'u1')
|
|
382
385
|
|
|
383
386
|
await assert.rejects(
|
|
384
387
|
() =>
|
|
385
|
-
|
|
386
|
-
|
|
388
|
+
approveAgent(
|
|
389
|
+
agentRunState,
|
|
387
390
|
'run-auth',
|
|
388
391
|
[{ toolCallId: 'call-1', approved: true }],
|
|
389
392
|
undefined,
|
|
@@ -401,11 +404,11 @@ describe('approveAIAgent authorization', () => {
|
|
|
401
404
|
|
|
402
405
|
test('rejects when auth is required and the session is gone', async () => {
|
|
403
406
|
registerAgent('auth-agent', { auth: true })
|
|
404
|
-
const { updates,
|
|
407
|
+
const { updates, agentRunState } = runStateFor('auth-agent', 'resource-1')
|
|
405
408
|
|
|
406
409
|
await assert.rejects(
|
|
407
410
|
() =>
|
|
408
|
-
|
|
411
|
+
approveAgent(agentRunState, 'run-auth', [
|
|
409
412
|
{ toolCallId: 'call-1', approved: true },
|
|
410
413
|
]),
|
|
411
414
|
ForbiddenError
|
|
@@ -415,10 +418,13 @@ describe('approveAIAgent authorization', () => {
|
|
|
415
418
|
|
|
416
419
|
test('allows the owning session through the gate', async () => {
|
|
417
420
|
registerAgent('owned-agent', { scopes: ['admin:refund'] })
|
|
418
|
-
const { updates,
|
|
421
|
+
const { updates, agentRunState } = runStateFor(
|
|
422
|
+
'owned-agent',
|
|
423
|
+
'user-a:default'
|
|
424
|
+
)
|
|
419
425
|
|
|
420
|
-
const result = await
|
|
421
|
-
|
|
426
|
+
const result = await approveAgent(
|
|
427
|
+
agentRunState,
|
|
422
428
|
'run-auth',
|
|
423
429
|
[{ toolCallId: 'call-1', approved: true }],
|
|
424
430
|
undefined,
|
|
@@ -437,9 +443,9 @@ describe('approveAIAgent authorization', () => {
|
|
|
437
443
|
})
|
|
438
444
|
})
|
|
439
445
|
|
|
440
|
-
describe('
|
|
446
|
+
describe('getAgentsMeta', () => {
|
|
441
447
|
test('returns the shared metadata registry', () => {
|
|
442
|
-
const meta =
|
|
448
|
+
const meta = getAgentsMeta()
|
|
443
449
|
meta.assistant = { name: 'assistant' } as any
|
|
444
450
|
assert.equal(
|
|
445
451
|
pikkuState(null, 'agent', 'agentsMeta').assistant.name,
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CoreAgent, AgentRunState } from './agent.types.js'
|
|
2
2
|
import { pikkuState } from '../../pikku-state.js'
|
|
3
|
-
import type {
|
|
3
|
+
import type { AgentRunStateService } from '../../services/agent-run-state-service.js'
|
|
4
4
|
import {
|
|
5
5
|
agentSessionScope,
|
|
6
6
|
assertAgentAuthorized,
|
|
7
7
|
assertResourcePrincipalOwner,
|
|
8
8
|
resolveAgent,
|
|
9
|
-
type
|
|
10
|
-
} from './
|
|
9
|
+
type RunAgentParams,
|
|
10
|
+
} from './agent-prepare.js'
|
|
11
11
|
|
|
12
|
-
export const
|
|
12
|
+
export const addAgent = (
|
|
13
13
|
agentName: string,
|
|
14
|
-
agent:
|
|
14
|
+
agent: CoreAgent<any, any>,
|
|
15
15
|
packageName: string | null = null
|
|
16
16
|
) => {
|
|
17
17
|
const agentsMeta = pikkuState(packageName, 'agent', 'agentsMeta')
|
|
@@ -29,12 +29,12 @@ export const addAIAgent = (
|
|
|
29
29
|
agents.set(agentName, agent)
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
export async function
|
|
33
|
-
|
|
32
|
+
export async function approveAgent(
|
|
33
|
+
agentRunState: AgentRunStateService,
|
|
34
34
|
runId: string,
|
|
35
35
|
approvals: { toolCallId: string; approved: boolean }[],
|
|
36
36
|
expectedAgentName?: string,
|
|
37
|
-
params:
|
|
37
|
+
params: RunAgentParams = {}
|
|
38
38
|
): Promise<{
|
|
39
39
|
status: 'resumed' | 'suspended'
|
|
40
40
|
runId: string
|
|
@@ -42,9 +42,9 @@ export async function approveAIAgent(
|
|
|
42
42
|
rejected: string[]
|
|
43
43
|
remainingApprovals: number
|
|
44
44
|
}> {
|
|
45
|
-
if (!
|
|
45
|
+
if (!agentRunState) throw new Error('AgentRunStateService not available')
|
|
46
46
|
|
|
47
|
-
const run = await
|
|
47
|
+
const run = await agentRunState.getRun(runId)
|
|
48
48
|
if (!run) throw new Error('Run not found: ' + runId)
|
|
49
49
|
assertResourcePrincipalOwner(
|
|
50
50
|
params,
|
|
@@ -76,7 +76,7 @@ export async function approveAIAgent(
|
|
|
76
76
|
)
|
|
77
77
|
|
|
78
78
|
const hasApproved = approvedIds.size > 0
|
|
79
|
-
await
|
|
79
|
+
await agentRunState.updateRun(runId, {
|
|
80
80
|
status: hasApproved ? 'running' : 'suspended',
|
|
81
81
|
pendingApprovals: remaining.length > 0 ? remaining : undefined,
|
|
82
82
|
})
|
|
@@ -90,10 +90,10 @@ export async function approveAIAgent(
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
export const
|
|
93
|
+
export const getAgents = () => {
|
|
94
94
|
return pikkuState(null, 'agent', 'agents')
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
export const
|
|
97
|
+
export const getAgentsMeta = () => {
|
|
98
98
|
return pikkuState(null, 'agent', 'agentsMeta')
|
|
99
99
|
}
|
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
pikkuState,
|
|
7
7
|
setSingletonServices,
|
|
8
8
|
} from '../../pikku-state.js'
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { resumeAgentSync } from './agent-runner.js'
|
|
10
|
+
import { resumeAgent } from './agent-stream.js'
|
|
11
11
|
import { clearPermissionsCache } from '../../permissions.js'
|
|
12
12
|
import { ForbiddenError, MissingScopeError } from '../../errors/errors.js'
|
|
13
|
-
import type {
|
|
13
|
+
import type { CoreAgent } from './agent.types.js'
|
|
14
14
|
import type { CoreUserSession } from '../../types/core.types.js'
|
|
15
15
|
|
|
16
16
|
const logger = {
|
|
@@ -39,7 +39,7 @@ const setup = (agentName: string, resourceId = 'u1') => {
|
|
|
39
39
|
const resolved: string[] = []
|
|
40
40
|
setSingletonServices({
|
|
41
41
|
logger,
|
|
42
|
-
|
|
42
|
+
agentRunState: {
|
|
43
43
|
getRun: async () => suspendedRun(agentName, resourceId),
|
|
44
44
|
resolveApproval: async (toolCallId: string) => {
|
|
45
45
|
resolved.push(toolCallId)
|
|
@@ -52,15 +52,15 @@ const setup = (agentName: string, resourceId = 'u1') => {
|
|
|
52
52
|
|
|
53
53
|
const addAgent = (
|
|
54
54
|
agentName: string,
|
|
55
|
-
overrides: Partial<
|
|
56
|
-
):
|
|
57
|
-
const agent:
|
|
55
|
+
overrides: Partial<CoreAgent> = {}
|
|
56
|
+
): CoreAgent => {
|
|
57
|
+
const agent: CoreAgent = {
|
|
58
58
|
name: agentName,
|
|
59
59
|
description: `${agentName} description`,
|
|
60
60
|
goal: `${agentName} goal`,
|
|
61
61
|
model: 'test/test-model',
|
|
62
62
|
...overrides,
|
|
63
|
-
} as
|
|
63
|
+
} as CoreAgent
|
|
64
64
|
|
|
65
65
|
pikkuState(null, 'agent', 'agents').set(agentName, agent)
|
|
66
66
|
return agent
|
|
@@ -78,16 +78,16 @@ beforeEach(() => {
|
|
|
78
78
|
clearPermissionsCache()
|
|
79
79
|
})
|
|
80
80
|
|
|
81
|
-
describe('
|
|
81
|
+
describe('resumeAgentSync authorization', () => {
|
|
82
82
|
test('rejects when the agent permissions deny', async () => {
|
|
83
83
|
const resolved = setup('denied-agent')
|
|
84
84
|
addAgent('denied-agent', {
|
|
85
85
|
permissions: { denied: async () => false },
|
|
86
|
-
} as Partial<
|
|
86
|
+
} as Partial<CoreAgent>)
|
|
87
87
|
|
|
88
88
|
await assert.rejects(
|
|
89
89
|
() =>
|
|
90
|
-
|
|
90
|
+
resumeAgentSync(
|
|
91
91
|
RUN_ID,
|
|
92
92
|
[{ toolCallId: TOOL_CALL_ID, approved: true }],
|
|
93
93
|
{ sessionService: sessionService({ userId: 'u1' }) } as any
|
|
@@ -107,7 +107,7 @@ describe('resumeAIAgentSync authorization', () => {
|
|
|
107
107
|
|
|
108
108
|
await assert.rejects(
|
|
109
109
|
() =>
|
|
110
|
-
|
|
110
|
+
resumeAgentSync(
|
|
111
111
|
RUN_ID,
|
|
112
112
|
[{ toolCallId: TOOL_CALL_ID, approved: true }],
|
|
113
113
|
{
|
|
@@ -128,7 +128,7 @@ describe('resumeAIAgentSync authorization', () => {
|
|
|
128
128
|
|
|
129
129
|
await assert.rejects(
|
|
130
130
|
() =>
|
|
131
|
-
|
|
131
|
+
resumeAgentSync(
|
|
132
132
|
RUN_ID,
|
|
133
133
|
[{ toolCallId: TOOL_CALL_ID, approved: true }],
|
|
134
134
|
{
|
|
@@ -150,7 +150,7 @@ describe('resumeAIAgentSync authorization', () => {
|
|
|
150
150
|
|
|
151
151
|
await assert.rejects(
|
|
152
152
|
() =>
|
|
153
|
-
|
|
153
|
+
resumeAgentSync(
|
|
154
154
|
RUN_ID,
|
|
155
155
|
[{ toolCallId: TOOL_CALL_ID, approved: true }],
|
|
156
156
|
{ sessionService: sessionService(undefined) } as any
|
|
@@ -160,7 +160,7 @@ describe('resumeAIAgentSync authorization', () => {
|
|
|
160
160
|
})
|
|
161
161
|
})
|
|
162
162
|
|
|
163
|
-
describe('
|
|
163
|
+
describe('resumeAgent (streaming) authorization', () => {
|
|
164
164
|
const channel = {
|
|
165
165
|
send: async () => {},
|
|
166
166
|
close: async () => {},
|
|
@@ -170,11 +170,11 @@ describe('resumeAIAgent (streaming) authorization', () => {
|
|
|
170
170
|
const resolved = setup('stream-denied')
|
|
171
171
|
addAgent('stream-denied', {
|
|
172
172
|
permissions: { denied: async () => false },
|
|
173
|
-
} as Partial<
|
|
173
|
+
} as Partial<CoreAgent>)
|
|
174
174
|
|
|
175
175
|
await assert.rejects(
|
|
176
176
|
() =>
|
|
177
|
-
|
|
177
|
+
resumeAgent(
|
|
178
178
|
{ runId: RUN_ID, toolCallId: TOOL_CALL_ID, approved: true },
|
|
179
179
|
channel,
|
|
180
180
|
{ sessionService: sessionService({ userId: 'u1' }) } as any
|
|
@@ -190,7 +190,7 @@ describe('resumeAIAgent (streaming) authorization', () => {
|
|
|
190
190
|
|
|
191
191
|
await assert.rejects(
|
|
192
192
|
() =>
|
|
193
|
-
|
|
193
|
+
resumeAgent(
|
|
194
194
|
{ runId: RUN_ID, toolCallId: TOOL_CALL_ID, approved: true },
|
|
195
195
|
channel,
|
|
196
196
|
{
|
|
@@ -2,15 +2,11 @@ import type { PikkuRawWire } from '../../types/core.types.js'
|
|
|
2
2
|
import type { SessionService } from '../../services/user-session-service.js'
|
|
3
3
|
import type { CoreUserSession } from '../../types/core.types.js'
|
|
4
4
|
import type { PikkuRPC } from '../rpc/rpc-types.js'
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
resumeAIAgent,
|
|
11
|
-
interruptAIAgent,
|
|
12
|
-
} from './ai-agent-stream.js'
|
|
13
|
-
import { wrapChannelWithAGUI } from './ai-agent-agui.js'
|
|
5
|
+
import type { AgentInput, AgentStreamChannel } from './agent.types.js'
|
|
6
|
+
import type { StreamAgentOptions } from './agent-prepare.js'
|
|
7
|
+
import { runAgent, resumeAgentSync } from './agent-runner.js'
|
|
8
|
+
import { streamAgent, resumeAgent, interruptAgent } from './agent-stream.js'
|
|
9
|
+
import { wrapChannelWithAGUI } from './agent-agui.js'
|
|
14
10
|
|
|
15
11
|
export type AgentRPCOptions = {
|
|
16
12
|
sessionService?: SessionService<CoreUserSession>
|
|
@@ -32,14 +28,14 @@ export const createAgentRPC = (
|
|
|
32
28
|
getCredential: wire.getCredential?.bind(wire),
|
|
33
29
|
})
|
|
34
30
|
|
|
35
|
-
const streamingChannel = ():
|
|
36
|
-
const channel = wire.channel as unknown as
|
|
31
|
+
const streamingChannel = (): AgentStreamChannel => {
|
|
32
|
+
const channel = wire.channel as unknown as AgentStreamChannel | undefined
|
|
37
33
|
if (!channel) throw new Error('No channel available for streaming')
|
|
38
34
|
return channel
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
/** `run` and `approve` return the same shape; only the call differs. */
|
|
42
|
-
const asRunResult = (result: Awaited<ReturnType<typeof
|
|
38
|
+
const asRunResult = (result: Awaited<ReturnType<typeof runAgent>>) => ({
|
|
43
39
|
runId: result.runId,
|
|
44
40
|
result: result.object ?? result.text,
|
|
45
41
|
usage: result.usage,
|
|
@@ -50,8 +46,8 @@ export const createAgentRPC = (
|
|
|
50
46
|
})
|
|
51
47
|
|
|
52
48
|
return {
|
|
53
|
-
run: async (agentName: string, input:
|
|
54
|
-
asRunResult(await
|
|
49
|
+
run: async (agentName: string, input: AgentInput) =>
|
|
50
|
+
asRunResult(await runAgent(agentName, input, params())),
|
|
55
51
|
|
|
56
52
|
stream: async (
|
|
57
53
|
agentName: string,
|
|
@@ -62,10 +58,10 @@ export const createAgentRPC = (
|
|
|
62
58
|
model?: string
|
|
63
59
|
temperature?: number
|
|
64
60
|
},
|
|
65
|
-
streamOptions?:
|
|
61
|
+
streamOptions?: StreamAgentOptions
|
|
66
62
|
) => {
|
|
67
63
|
let currentRunId: string | undefined
|
|
68
|
-
await
|
|
64
|
+
await streamAgent(
|
|
69
65
|
agentName,
|
|
70
66
|
input,
|
|
71
67
|
wrapChannelWithAGUI(streamingChannel(), {
|
|
@@ -87,9 +83,9 @@ export const createAgentRPC = (
|
|
|
87
83
|
resume: async (
|
|
88
84
|
runId: string,
|
|
89
85
|
input: { toolCallId: string; approved: boolean },
|
|
90
|
-
streamOptions?:
|
|
86
|
+
streamOptions?: StreamAgentOptions
|
|
91
87
|
) => {
|
|
92
|
-
await
|
|
88
|
+
await resumeAgent(
|
|
93
89
|
{ runId, ...input },
|
|
94
90
|
wrapChannelWithAGUI(streamingChannel(), { runId }),
|
|
95
91
|
params(),
|
|
@@ -98,7 +94,7 @@ export const createAgentRPC = (
|
|
|
98
94
|
},
|
|
99
95
|
|
|
100
96
|
interrupt: async (runId: string, reason?: 'speech' | 'user' | 'timeout') =>
|
|
101
|
-
|
|
97
|
+
interruptAgent(
|
|
102
98
|
{ runId, ...(reason ? { reason } : {}) },
|
|
103
99
|
{ sessionService: options.sessionService }
|
|
104
100
|
),
|
|
@@ -109,7 +105,7 @@ export const createAgentRPC = (
|
|
|
109
105
|
expectedAgentName?: string
|
|
110
106
|
) =>
|
|
111
107
|
asRunResult(
|
|
112
|
-
await
|
|
108
|
+
await resumeAgentSync(
|
|
113
109
|
runId,
|
|
114
110
|
approvals,
|
|
115
111
|
{ sessionService: options.sessionService },
|