@pikku/core 0.12.83 → 0.12.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +492 -0
- package/README.md +1 -1
- package/dist/bootstrap-compat/root.d.ts +20 -0
- package/dist/classification/column-form.d.ts +32 -0
- package/dist/classification/column-form.js +42 -0
- package/dist/classification/data-classification.d.ts +64 -0
- package/dist/classification/index.d.ts +13 -0
- package/dist/classification/index.js +2 -0
- package/dist/classification/secret-value.d.ts +56 -0
- package/dist/classification/secret-value.js +46 -0
- package/dist/crypto-utils.d.ts +1 -1
- package/dist/ecosystem/agent-scorer.d.ts +12 -0
- package/dist/ecosystem/agent-scorer.js +5 -0
- package/dist/ecosystem/agent.d.ts +21 -0
- package/dist/ecosystem/agent.js +6 -0
- package/dist/ecosystem/channel/local.d.ts +3 -0
- package/dist/ecosystem/channel/local.js +3 -0
- package/dist/ecosystem/channel/serverless.d.ts +9 -0
- package/dist/ecosystem/channel/serverless.js +1 -0
- package/dist/ecosystem/channel.d.ts +15 -0
- package/dist/ecosystem/channel.js +5 -0
- package/dist/ecosystem/cli/channel.d.ts +16 -0
- package/dist/ecosystem/cli/channel.js +2 -0
- package/dist/ecosystem/cli.d.ts +9 -0
- package/dist/ecosystem/cli.js +2 -0
- package/dist/ecosystem/credential.d.ts +10 -0
- package/dist/ecosystem/credential.js +1 -0
- package/dist/ecosystem/crypto-utils.d.ts +8 -0
- package/dist/ecosystem/crypto-utils.js +1 -0
- package/dist/ecosystem/dev.d.ts +9 -0
- package/dist/ecosystem/dev.js +2 -0
- package/dist/ecosystem/errors.d.ts +8 -0
- package/dist/ecosystem/errors.js +2 -0
- package/dist/ecosystem/function.d.ts +13 -0
- package/dist/ecosystem/function.js +2 -0
- package/dist/ecosystem/gateway.d.ts +1 -0
- package/dist/ecosystem/hmac.d.ts +1 -0
- package/dist/ecosystem/hmac.js +1 -0
- package/dist/ecosystem/http.d.ts +13 -0
- package/dist/ecosystem/http.js +5 -0
- package/dist/ecosystem/mcp.d.ts +3 -0
- package/dist/ecosystem/mcp.js +2 -0
- package/dist/ecosystem/middleware.d.ts +18 -0
- package/dist/ecosystem/middleware.js +7 -0
- package/dist/ecosystem/node-host-resolver.d.ts +1 -0
- package/dist/ecosystem/node-host-resolver.js +1 -0
- package/dist/ecosystem/node.d.ts +1 -0
- package/dist/ecosystem/oauth2.d.ts +1 -0
- package/dist/ecosystem/oauth2.js +1 -0
- package/dist/ecosystem/persona.d.ts +17 -0
- package/dist/ecosystem/persona.js +5 -0
- package/dist/ecosystem/queue.d.ts +13 -0
- package/dist/ecosystem/queue.js +4 -0
- package/dist/ecosystem/remote.d.ts +8 -0
- package/dist/ecosystem/remote.js +1 -0
- package/dist/ecosystem/role.d.ts +4 -0
- package/dist/ecosystem/role.js +2 -0
- package/dist/ecosystem/rpc.d.ts +6 -0
- package/dist/ecosystem/rpc.js +3 -0
- package/dist/ecosystem/safe-fetch.d.ts +7 -0
- package/dist/ecosystem/safe-fetch.js +1 -0
- package/dist/ecosystem/scenario.d.ts +21 -0
- package/dist/ecosystem/scenario.js +8 -0
- package/dist/ecosystem/scheduler.d.ts +3 -0
- package/dist/ecosystem/scheduler.js +2 -0
- package/dist/ecosystem/schema.d.ts +2 -0
- package/dist/ecosystem/schema.js +1 -0
- package/dist/ecosystem/scope.d.ts +5 -0
- package/dist/ecosystem/scope.js +3 -0
- package/dist/ecosystem/secret.d.ts +11 -0
- package/dist/ecosystem/secret.js +2 -0
- package/dist/ecosystem/services/istanbul-coverage.d.ts +1 -0
- package/dist/ecosystem/services/istanbul-coverage.js +1 -0
- package/dist/ecosystem/services/local-content-request-handler.d.ts +9 -0
- package/dist/ecosystem/services/local-content-request-handler.js +1 -0
- package/dist/ecosystem/services/local-content.d.ts +2 -0
- package/dist/ecosystem/services/local-content.js +1 -0
- package/dist/ecosystem/services/local-meta.d.ts +1 -0
- package/dist/ecosystem/services/local-meta.js +1 -0
- package/dist/ecosystem/services/v8-coverage.d.ts +1 -0
- package/dist/ecosystem/services/v8-coverage.js +1 -0
- package/dist/ecosystem/services.d.ts +36 -0
- package/dist/ecosystem/services.js +12 -0
- package/dist/ecosystem/testing.d.ts +7 -0
- package/dist/ecosystem/testing.js +1 -0
- package/dist/ecosystem/trigger.d.ts +2 -0
- package/dist/ecosystem/trigger.js +1 -0
- package/dist/ecosystem/types.d.ts +12 -0
- package/dist/ecosystem/types.js +6 -0
- package/dist/ecosystem/variable.d.ts +9 -0
- package/dist/ecosystem/variable.js +1 -0
- package/dist/ecosystem/virtual-user.d.ts +24 -0
- package/dist/ecosystem/virtual-user.js +8 -0
- package/dist/ecosystem/workflow.d.ts +20 -0
- package/dist/ecosystem/workflow.js +6 -0
- package/dist/errors/index.d.ts +8 -0
- package/dist/errors/index.js +1 -0
- package/dist/errors/serialized-error.d.ts +7 -0
- package/dist/errors/serialized-error.js +1 -0
- package/dist/function/function-meta.types.d.ts +139 -0
- package/dist/function/function-meta.types.js +1 -0
- package/dist/function/function-runner.d.ts +3 -2
- package/dist/function/function-runner.js +31 -11
- package/dist/function/functions.types.d.ts +10 -2
- package/dist/function/index.d.ts +8 -2
- package/dist/function/index.js +4 -1
- package/dist/function/pikku-request.d.ts +8 -0
- package/dist/function/pikku-request.js +15 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.js +3 -3
- package/dist/middleware/auth-apikey.d.ts +2 -10
- package/dist/middleware/auth-apikey.js +1 -1
- package/dist/middleware/auth-bearer.d.ts +2 -10
- package/dist/middleware/auth-bearer.js +1 -1
- package/dist/middleware/auth-cookie.d.ts +2 -10
- package/dist/middleware/auth-cookie.js +1 -1
- package/dist/middleware/cors.d.ts +5 -11
- package/dist/middleware/cors.js +13 -6
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/middleware-factories.d.ts +9 -0
- package/dist/middleware/middleware-factories.js +19 -0
- package/dist/middleware/middleware.types.d.ts +27 -0
- package/dist/middleware/middleware.types.js +1 -0
- package/dist/middleware/remote-auth.d.ts +1 -1
- package/dist/middleware/remote-auth.js +1 -1
- package/dist/middleware/telemetry.d.ts +4 -20
- package/dist/middleware/telemetry.js +1 -1
- package/dist/middleware-runner.d.ts +2 -1
- package/dist/pikku-state.d.ts +2 -1
- package/dist/services/{ai-run-state-service.d.ts → agent-run-state-service.d.ts} +5 -5
- package/dist/services/agent-run-state-service.js +1 -0
- package/dist/services/{ai-agent-runner-service.d.ts → agent-runner-service.d.ts} +12 -12
- package/dist/services/agent-runner-service.js +1 -0
- package/dist/services/{ai-storage-service.d.ts → agent-storage-service.d.ts} +7 -7
- package/dist/services/agent-storage-service.js +1 -0
- package/dist/services/audit-service.d.ts +1 -1
- package/dist/services/credential-wire-service.js +1 -1
- package/dist/services/email-service.d.ts +1 -1
- package/dist/services/file-scenario-run-store.d.ts +58 -0
- package/dist/services/file-scenario-run-store.js +214 -0
- package/dist/services/http-personas.d.ts +1 -1
- package/dist/services/http-personas.js +3 -3
- package/dist/services/{in-memory-ai-run-state-service.d.ts → in-memory-agent-run-state-service.d.ts} +5 -5
- package/dist/services/{in-memory-ai-run-state-service.js → in-memory-agent-run-state-service.js} +1 -1
- package/dist/services/in-memory-workflow-service.d.ts +1 -1
- package/dist/services/index.d.ts +9 -5
- package/dist/services/index.js +4 -1
- package/dist/services/local-secrets.d.ts +1 -1
- package/dist/services/local-secrets.js +1 -1
- package/dist/services/logger.d.ts +7 -7
- package/dist/services/meta-service.d.ts +5 -4
- package/dist/services/scoped-secret-service.d.ts +1 -1
- package/dist/services/secret-service.d.ts +1 -1
- package/dist/services/typed-secret-service.d.ts +16 -2
- package/dist/services/typed-secret-service.js +5 -0
- package/dist/services/webhook-service.d.ts +1 -1
- package/dist/services/workflow-service.d.ts +2 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +1 -0
- package/dist/testing/service-tests/agent-run-service-tests.d.ts +1 -1
- package/dist/testing/service-tests/agent-run-service-tests.js +3 -3
- package/dist/testing/service-tests/agent-storage-service-tests.d.ts +3 -0
- package/dist/testing/service-tests/{ai-storage-service-tests.js → agent-storage-service-tests.js} +4 -4
- package/dist/testing/service-tests.d.ts +4 -4
- package/dist/testing/service-tests.js +4 -4
- package/dist/types/core.types.d.ts +37 -187
- package/dist/types/core.types.js +1 -19
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +1 -0
- package/dist/types/state.types.d.ts +8 -6
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +2 -0
- package/dist/wirings/actor-flow/run-conversation.d.ts +2 -2
- package/dist/wirings/addon/addon-runner.d.ts +17 -0
- package/dist/wirings/addon/addon-runner.js +150 -0
- package/dist/wirings/addon/index.d.ts +6 -0
- package/dist/wirings/addon/index.js +3 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
- package/dist/wirings/addon/remote-addon-auth.js +39 -0
- package/dist/wirings/addon/wire-addon.d.ts +80 -0
- package/dist/wirings/addon/wire-addon.js +120 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
- package/dist/wirings/addon/wire-remote-addon.js +11 -0
- package/dist/wirings/{ai-agent/ai-agent-agui.d.ts → agent/agent-agui.d.ts} +2 -2
- package/dist/wirings/{ai-agent/ai-agent-agui.js → agent/agent-agui.js} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-finalize.d.ts → agent/agent-finalize.d.ts} +10 -10
- package/dist/wirings/{ai-agent/ai-agent-finalize.js → agent/agent-finalize.js} +7 -7
- package/dist/wirings/{ai-agent/ai-agent-helpers.d.ts → agent/agent-helpers.d.ts} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-interrupt.d.ts → agent/agent-interrupt.d.ts} +4 -4
- package/dist/wirings/{ai-agent/ai-agent-interrupt.js → agent/agent-interrupt.js} +2 -2
- package/dist/wirings/{ai-agent/ai-agent-memory.d.ts → agent/agent-memory.d.ts} +14 -14
- package/dist/wirings/{ai-agent/ai-agent-memory.js → agent/agent-memory.js} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-model-config.js → agent/agent-model-config.js} +1 -1
- package/dist/wirings/{ai-agent/ai-agent-prepare.d.ts → agent/agent-prepare.d.ts} +24 -24
- package/dist/wirings/{ai-agent/ai-agent-prepare.js → agent/agent-prepare.js} +17 -17
- package/dist/wirings/agent/agent-registry.d.ts +16 -0
- package/dist/wirings/{ai-agent/ai-agent-registry.js → agent/agent-registry.js} +9 -9
- package/dist/wirings/{ai-agent → agent}/agent-rpc.js +8 -8
- package/dist/wirings/agent/agent-runner.d.ts +7 -0
- package/dist/wirings/{ai-agent/ai-agent-runner.js → agent/agent-runner.js} +49 -50
- package/dist/wirings/{ai-agent/ai-agent-stream.d.ts → agent/agent-stream.d.ts} +15 -15
- package/dist/wirings/{ai-agent/ai-agent-stream.js → agent/agent-stream.js} +78 -78
- package/dist/wirings/{ai-agent/ai-agent-turn.d.ts → agent/agent-turn.d.ts} +5 -5
- package/dist/wirings/{ai-agent/ai-agent-turn.js → agent/agent-turn.js} +4 -4
- package/dist/wirings/agent/agent-utils.d.ts +14 -0
- package/dist/wirings/agent/agent-utils.js +17 -0
- package/dist/wirings/{ai-agent/ai-agent.types.d.ts → agent/agent.types.d.ts} +47 -46
- package/dist/wirings/agent/agent.types.js +1 -0
- package/dist/wirings/agent/index.d.ts +12 -0
- package/dist/wirings/agent/index.js +10 -0
- package/dist/wirings/{ai-agent → agent}/voice-input.d.ts +1 -1
- package/dist/wirings/{ai-agent → agent}/voice-input.js +5 -5
- package/dist/wirings/{ai-agent → agent}/voice-output.d.ts +2 -3
- package/dist/wirings/{ai-agent → agent}/voice-output.js +8 -8
- package/dist/wirings/{ai-scorer/ai-scorer-grade.d.ts → agent-scorer/agent-scorer-grade.d.ts} +3 -3
- package/dist/wirings/{ai-scorer/ai-scorer-grade.js → agent-scorer/agent-scorer-grade.js} +6 -6
- package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +30 -0
- package/dist/wirings/{ai-scorer/ai-scorer-judge.js → agent-scorer/agent-scorer-judge.js} +57 -5
- package/dist/wirings/{ai-scorer/ai-scorer-live.d.ts → agent-scorer/agent-scorer-live.d.ts} +1 -1
- package/dist/wirings/{ai-scorer/ai-scorer-live.js → agent-scorer/agent-scorer-live.js} +3 -3
- package/dist/wirings/{ai-scorer/ai-scorer-registry.d.ts → agent-scorer/agent-scorer-registry.d.ts} +6 -6
- package/dist/wirings/{ai-scorer/ai-scorer-registry.js → agent-scorer/agent-scorer-registry.js} +4 -4
- package/dist/wirings/{ai-scorer/ai-scorer-snapshots.d.ts → agent-scorer/agent-scorer-snapshots.d.ts} +1 -1
- package/dist/wirings/{ai-scorer/ai-scorer-worker.d.ts → agent-scorer/agent-scorer-worker.d.ts} +3 -3
- package/dist/wirings/{ai-scorer/ai-scorer-worker.js → agent-scorer/agent-scorer-worker.js} +9 -7
- package/dist/wirings/{ai-scorer/ai-scorer.d.ts → agent-scorer/agent-scorer.d.ts} +12 -6
- package/dist/wirings/{ai-scorer/ai-scorer.js → agent-scorer/agent-scorer.js} +4 -3
- package/dist/wirings/{ai-scorer/ai-scorer.types.d.ts → agent-scorer/agent-scorer.types.d.ts} +24 -4
- package/dist/wirings/agent-scorer/agent-scorer.types.js +4 -0
- package/dist/wirings/agent-scorer/index.d.ts +6 -0
- package/dist/wirings/agent-scorer/index.js +5 -0
- package/dist/wirings/channel/channel-common.d.ts +2 -1
- package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
- package/dist/wirings/channel/channel-rpc.types.d.ts +2 -2
- package/dist/wirings/channel/channel.types.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.d.ts +1 -0
- package/dist/wirings/cli/channel/index.d.ts +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +2 -1
- package/dist/wirings/cli/cli-runner.js +4 -1
- package/dist/wirings/cli/cli.types.d.ts +21 -2
- package/dist/wirings/cli/command-parser.js +157 -23
- package/dist/wirings/gateway/gateway.types.d.ts +2 -1
- package/dist/wirings/http/http-runner.d.ts +1 -1
- package/dist/wirings/http/http-runner.js +1 -1
- package/dist/wirings/http/http.types.d.ts +2 -2
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
- package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
- package/dist/wirings/mcp/mcp.types.d.ts +1 -1
- package/dist/wirings/persona/index.d.ts +1 -1
- package/dist/wirings/persona/index.js +1 -1
- package/dist/wirings/persona/persona.types.d.ts +14 -0
- package/dist/wirings/queue/queue.types.d.ts +1 -1
- package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
- package/dist/wirings/rpc/index.d.ts +0 -6
- package/dist/wirings/rpc/index.js +0 -3
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
- package/dist/wirings/rpc/remote-addon-auth.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
- package/dist/wirings/rpc/rpc-runner.js +4 -4
- package/dist/wirings/rpc/rpc-types.d.ts +1 -1
- package/dist/wirings/rpc/wire-addon.d.ts +1 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
- package/dist/wirings/scope/index.d.ts +1 -0
- package/dist/wirings/scope/index.js +1 -0
- package/dist/wirings/secret/secret.types.d.ts +10 -0
- package/dist/wirings/secret/validate-secret-definitions.js +2 -0
- package/dist/wirings/variable/validate-variable-definitions.js +2 -0
- package/dist/wirings/variable/variable.types.d.ts +9 -0
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +1 -1
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +1 -1
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
- package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
- package/dist/wirings/workflow/graph/graph-node.js +2 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
- package/dist/wirings/workflow/graph/graph-runner.js +283 -31
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
- package/dist/wirings/workflow/index.d.ts +2 -0
- package/dist/wirings/workflow/index.js +1 -0
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +14 -4
- package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -1
- package/dist/wirings/workflow/pikku-workflow-service.js +3 -4
- package/dist/wirings/workflow/run-timeline.d.ts +2 -3
- package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
- package/dist/wirings/workflow/scenario-run.types.js +1 -0
- package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
- package/dist/wirings/workflow/scenario-step-guards.js +0 -8
- package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
- package/dist/wirings/workflow/workflow-approval.js +2 -1
- package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
- package/dist/wirings/workflow/workflow.types.d.ts +2 -1
- package/knowledge/decisions/index.md +2 -0
- package/knowledge/decisions/internals/{a-non-streaming-agent-run-registers-with-airunstate-too.md → a-non-streaming-agent-run-registers-with-agentrunstate-too.md} +6 -6
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +1 -1
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +1 -1
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-agui-bridge-obeys-the-client-ordering-contract.md → agent-agui-bridge-obeys-the-client-ordering-contract.md} +5 -5
- package/knowledge/decisions/internals/{ai-agent-audio-chunks-carry-the-format-the-provider-returned.md → agent-audio-chunks-carry-the-format-the-provider-returned.md} +2 -2
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-credential-suspensions-hide-the-tool-result.md → agent-credential-suspensions-hide-the-tool-result.md} +2 -2
- package/knowledge/decisions/internals/{ai-agent-delegate-and-supervise-hide-different-text.md → agent-delegate-and-supervise-hide-different-text.md} +4 -4
- package/knowledge/decisions/internals/{ai-agent-llm-tool-arguments-have-nulls-stripped.md → agent-llm-tool-arguments-have-nulls-stripped.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-model-config-stays-a-single-resolution-seam.md → agent-model-config-stays-a-single-resolution-seam.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-onerror-hooks-cannot-change-the-failure.md → agent-onerror-hooks-cannot-change-the-failure.md} +6 -6
- package/knowledge/decisions/internals/{ai-agent-runner-methods-must-keep-their-receiver.md → agent-runner-methods-must-keep-their-receiver.md} +4 -4
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +1 -1
- package/knowledge/decisions/internals/{ai-agent-stream-persistence-is-best-effort.md → agent-stream-persistence-is-best-effort.md} +4 -4
- package/knowledge/decisions/internals/{ai-agent-sub-agents-inherit-the-parent-context-block.md → agent-sub-agents-inherit-the-parent-context-block.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-tool-execute-failures-are-logged-unconditionally.md → agent-tool-execute-failures-are-logged-unconditionally.md} +3 -3
- package/knowledge/decisions/internals/{ai-agent-voice-input-transcribes-audio-parts-in-place.md → agent-voice-input-transcribes-audio-parts-in-place.md} +2 -2
- package/knowledge/decisions/internals/{ai-agent-working-memory-is-persisted-only-when-valid.md → agent-working-memory-is-persisted-only-when-valid.md} +2 -2
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +2 -2
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +3 -3
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +2 -2
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +1 -1
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +1 -1
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
- package/knowledge/decisions/internals/index.md +4 -2
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +1 -1
- package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +1 -1
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +1 -1
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +5 -5
- package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +2 -2
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +2 -2
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +1 -1
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
- package/knowledge/decisions/security/{ai-agent-approval-forwarding-requires-a-symbol-brand.md → agent-approval-forwarding-requires-a-symbol-brand.md} +3 -3
- package/knowledge/decisions/security/{ai-agent-credential-requests-are-symbol-branded.md → agent-credential-requests-are-symbol-branded.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-gate-requires-a-session-only-when-auth-is-true.md → agent-gate-requires-a-session-only-when-auth-is-true.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-ownership-failures-never-echo-the-resource.md → agent-ownership-failures-never-echo-the-resource.md} +2 -2
- package/knowledge/decisions/security/{ai-agent-resume-re-runs-the-authorization-gate.md → agent-resume-re-runs-the-authorization-gate.md} +4 -4
- package/knowledge/decisions/security/{ai-agent-sessionless-deployments-have-no-thread-ownership.md → agent-sessionless-deployments-have-no-thread-ownership.md} +5 -5
- package/knowledge/decisions/security/{ai-agent-thread-ownership-composes-the-session-principal.md → agent-thread-ownership-composes-the-session-principal.md} +2 -2
- package/knowledge/decisions/security/{ai-agent-tool-filtering-reads-the-live-function-config.md → agent-tool-filtering-reads-the-live-function-config.md} +2 -2
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +3 -3
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +3 -3
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +21 -13
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
- package/knowledge/decisions/security/index.md +3 -2
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +2 -2
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
- package/knowledge/index.md +3 -1
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
- package/knowledge/questions/index.md +2 -0
- package/package.json +16 -14
- package/run-tests.sh +0 -0
- package/scripts/generate-api-report.d.mts +1 -1
- package/scripts/generate-api-report.mjs +67 -60
- package/scripts/generate-api-report.mts +37 -47
- package/src/agent-naming.test.ts +68 -0
- package/src/api-report.test.ts +70 -1
- package/src/app-alias-surface.test.ts +179 -0
- package/src/app-leaf-surface.test.ts +217 -0
- package/src/bootstrap-compat/root.ts +20 -0
- package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
- package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
- package/src/classification/index.ts +38 -0
- package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
- package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
- package/src/crypto-utils.ts +1 -1
- package/src/dev/reload-meta.test.ts +1 -1
- package/src/errors/index.ts +9 -0
- package/src/errors/serialized-error.ts +9 -0
- package/src/factory-functions.test.ts +4 -2
- package/src/function/function-meta.types.ts +151 -0
- package/src/function/function-runner.test.ts +4 -2
- package/src/function/function-runner.ts +47 -14
- package/src/function/functions.types.ts +11 -7
- package/src/function/index.ts +24 -5
- package/src/function/list.types.ts +1 -3
- package/src/middleware/auth-apikey.ts +4 -2
- package/src/middleware/auth-bearer.test.ts +1 -1
- package/src/middleware/auth-bearer.ts +4 -2
- package/src/middleware/auth-cookie.ts +4 -1
- package/src/middleware/cors.test.ts +126 -5
- package/src/middleware/cors.ts +19 -8
- package/src/middleware/index.ts +16 -0
- package/src/middleware/middleware-factories.ts +62 -0
- package/src/middleware/middleware.types.ts +61 -0
- package/src/middleware/remote-auth.test.ts +1 -1
- package/src/middleware/remote-auth.ts +1 -1
- package/src/middleware/telemetry.ts +4 -2
- package/src/middleware-runner.test.ts +2 -3
- package/src/middleware-runner.ts +2 -2
- package/src/no-root-barrel.test.ts +114 -0
- package/src/permissions.ts +2 -4
- package/src/pikku-state.ts +6 -4
- package/src/public-surface.json +90 -170
- package/src/public-surface.json.README +20 -2
- package/src/public-surface.test.ts +31 -3
- package/src/remote.test.ts +1 -1
- package/src/removed-legacy-exports.test.ts +5 -1
- package/src/services/{ai-run-state-service.ts → agent-run-state-service.ts} +5 -5
- package/src/services/{ai-agent-runner-service.ts → agent-runner-service.ts} +18 -18
- package/src/services/{ai-storage-service.ts → agent-storage-service.ts} +7 -7
- package/src/services/audit-service.ts +1 -1
- package/src/services/credential-wire-service.ts +1 -1
- package/src/services/email-service.ts +2 -4
- package/src/services/file-scenario-run-store.test.ts +349 -0
- package/src/services/file-scenario-run-store.ts +282 -0
- package/src/services/http-personas-converse.test.ts +3 -3
- package/src/services/http-personas.ts +4 -4
- package/src/services/{in-memory-ai-run-state-service.ts → in-memory-agent-run-state-service.ts} +7 -7
- package/src/services/in-memory-workflow-service.ts +1 -1
- package/src/services/index.ts +22 -10
- package/src/services/local-content-request-handler.ts +1 -2
- package/src/services/local-secrets.ts +1 -1
- package/src/services/logger.ts +7 -7
- package/src/services/meta-service.ts +5 -5
- package/src/services/queue-webhook-service.test.ts +1 -1
- package/src/services/scoped-secret-service.ts +1 -1
- package/src/services/secret-service.ts +1 -1
- package/src/services/typed-secret-service.test.ts +52 -0
- package/src/services/typed-secret-service.ts +26 -2
- package/src/services/webhook-service.ts +1 -1
- package/src/services/workflow-service.ts +2 -1
- package/src/template-alias-surface.test.ts +240 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/service-tests/agent-run-service-tests.ts +4 -4
- package/src/testing/service-tests/{ai-storage-service-tests.ts → agent-storage-service-tests.ts} +8 -8
- package/src/testing/service-tests.ts +10 -8
- package/src/types/core.types.ts +40 -292
- package/src/types/index.ts +2 -0
- package/src/types/state.types.ts +12 -14
- package/src/types/typed-credentials.test.ts +72 -0
- package/src/utils.ts +34 -0
- package/src/wirings/actor-flow/run-conversation.test.ts +2 -2
- package/src/wirings/actor-flow/run-conversation.ts +7 -9
- package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
- package/src/wirings/addon/index.ts +12 -0
- package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
- package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
- package/src/wirings/{ai-agent/ai-agent-agui.test.ts → agent/agent-agui.test.ts} +126 -105
- package/src/wirings/{ai-agent/ai-agent-agui.ts → agent/agent-agui.ts} +7 -7
- package/src/wirings/{ai-agent/ai-agent-authorization.test.ts → agent/agent-authorization.test.ts} +6 -6
- package/src/wirings/{ai-agent/ai-agent-finalize.test.ts → agent/agent-finalize.test.ts} +17 -16
- package/src/wirings/{ai-agent/ai-agent-finalize.ts → agent/agent-finalize.ts} +22 -22
- package/src/wirings/{ai-agent/ai-agent-helpers.test.ts → agent/agent-helpers.test.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-helpers.ts → agent/agent-helpers.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-interrupt.test.ts → agent/agent-interrupt.test.ts} +67 -77
- package/src/wirings/{ai-agent/ai-agent-interrupt.ts → agent/agent-interrupt.ts} +5 -5
- package/src/wirings/{ai-agent/ai-agent-memory.test.ts → agent/agent-memory.test.ts} +12 -12
- package/src/wirings/{ai-agent/ai-agent-memory.ts → agent/agent-memory.ts} +36 -36
- package/src/wirings/{ai-agent/ai-agent-model-config.test.ts → agent/agent-model-config.test.ts} +2 -5
- package/src/wirings/{ai-agent/ai-agent-model-config.ts → agent/agent-model-config.ts} +1 -1
- package/src/wirings/{ai-agent/ai-agent-prepare.test.ts → agent/agent-prepare.test.ts} +18 -18
- package/src/wirings/{ai-agent/ai-agent-prepare.ts → agent/agent-prepare.ts} +60 -56
- package/src/wirings/{ai-agent/ai-agent-registry.test.ts → agent/agent-registry.test.ts} +49 -43
- package/src/wirings/{ai-agent/ai-agent-registry.ts → agent/agent-registry.ts} +14 -14
- package/src/wirings/{ai-agent/ai-agent-resume-authorization.test.ts → agent/agent-resume-authorization.test.ts} +18 -18
- package/src/wirings/{ai-agent → agent}/agent-rpc.ts +16 -20
- package/src/wirings/{ai-agent/ai-agent-runner.test.ts → agent/agent-runner.test.ts} +105 -106
- package/src/wirings/{ai-agent/ai-agent-runner.ts → agent/agent-runner.ts} +91 -82
- package/src/wirings/{ai-agent/ai-agent-stream-output-hooks.test.ts → agent/agent-stream-output-hooks.test.ts} +25 -25
- package/src/wirings/{ai-agent/ai-agent-stream.test.ts → agent/agent-stream.test.ts} +147 -143
- package/src/wirings/{ai-agent/ai-agent-stream.ts → agent/agent-stream.ts} +148 -148
- package/src/wirings/{ai-agent/ai-agent-thread-ownership.test.ts → agent/agent-thread-ownership.test.ts} +24 -28
- package/src/wirings/{ai-agent/ai-agent-turn.test.ts → agent/agent-turn.test.ts} +3 -5
- package/src/wirings/{ai-agent/ai-agent-turn.ts → agent/agent-turn.ts} +7 -7
- package/src/wirings/agent/agent-utils.ts +20 -0
- package/src/wirings/{ai-agent/ai-agent.types.ts → agent/agent.types.ts} +54 -51
- package/src/wirings/agent/index.ts +57 -0
- package/src/wirings/{ai-agent → agent}/voice-input.test.ts +15 -15
- package/src/wirings/{ai-agent → agent}/voice-input.ts +11 -11
- package/src/wirings/{ai-agent → agent}/voice-output.test.ts +25 -27
- package/src/wirings/{ai-agent → agent}/voice-output.ts +11 -11
- package/src/wirings/{ai-scorer/ai-scorer-grade.test.ts → agent-scorer/agent-scorer-grade.test.ts} +8 -8
- package/src/wirings/{ai-scorer/ai-scorer-grade.ts → agent-scorer/agent-scorer-grade.ts} +9 -9
- package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +285 -0
- package/src/wirings/agent-scorer/agent-scorer-judge.ts +180 -0
- package/src/wirings/{ai-scorer/ai-scorer-live.test.ts → agent-scorer/agent-scorer-live.test.ts} +11 -11
- package/src/wirings/{ai-scorer/ai-scorer-live.ts → agent-scorer/agent-scorer-live.ts} +3 -3
- package/src/wirings/{ai-scorer/ai-scorer-registry.ts → agent-scorer/agent-scorer-registry.ts} +11 -8
- package/src/wirings/{ai-scorer/ai-scorer-sampling.test.ts → agent-scorer/agent-scorer-sampling.test.ts} +1 -1
- package/src/wirings/{ai-scorer/ai-scorer-snapshots.test.ts → agent-scorer/agent-scorer-snapshots.test.ts} +2 -2
- package/src/wirings/{ai-scorer/ai-scorer-snapshots.ts → agent-scorer/agent-scorer-snapshots.ts} +1 -1
- package/src/wirings/{ai-scorer/ai-scorer-worker.test.ts → agent-scorer/agent-scorer-worker.test.ts} +15 -15
- package/src/wirings/{ai-scorer/ai-scorer-worker.ts → agent-scorer/agent-scorer-worker.ts} +9 -7
- package/src/wirings/{ai-scorer/ai-scorer.ts → agent-scorer/agent-scorer.ts} +15 -7
- package/src/wirings/{ai-scorer/ai-scorer.types.ts → agent-scorer/agent-scorer.types.ts} +27 -6
- package/src/wirings/agent-scorer/index.ts +23 -0
- package/src/wirings/channel/channel-common.ts +4 -2
- package/src/wirings/channel/channel-handler.ts +2 -5
- package/src/wirings/channel/channel-middleware-runner.ts +1 -1
- package/src/wirings/channel/channel-rpc.types.ts +3 -7
- package/src/wirings/channel/channel.types.ts +1 -2
- package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
- package/src/wirings/channel/serverless/index.ts +1 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
- package/src/wirings/cli/channel/index.ts +1 -3
- package/src/wirings/cli/cli-runner.test.ts +1 -1
- package/src/wirings/cli/cli-runner.ts +11 -7
- package/src/wirings/cli/cli.types.ts +24 -3
- package/src/wirings/cli/command-parser.test.ts +388 -1
- package/src/wirings/cli/command-parser.ts +189 -29
- package/src/wirings/gateway/gateway-runner.test.ts +1 -2
- package/src/wirings/gateway/gateway-runner.ts +3 -6
- package/src/wirings/gateway/gateway.types.ts +5 -4
- package/src/wirings/http/http-routes.test.ts +1 -2
- package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
- package/src/wirings/http/http-runner.test.ts +3 -8
- package/src/wirings/http/http-runner.ts +9 -3
- package/src/wirings/http/http.types.ts +3 -12
- package/src/wirings/http/index.ts +1 -0
- package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
- package/src/wirings/mcp/mcp-runner.test.ts +1 -1
- package/src/wirings/mcp/mcp.types.ts +1 -2
- package/src/wirings/persona/index.ts +1 -4
- package/src/wirings/persona/persona.types.ts +14 -0
- package/src/wirings/queue/queue-identity.test.ts +1 -1
- package/src/wirings/queue/queue.types.ts +2 -6
- package/src/wirings/queue/signed-queue-service.ts +1 -1
- package/src/wirings/rpc/index.ts +0 -12
- package/src/wirings/rpc/rpc-runner.test.ts +4 -4
- package/src/wirings/rpc/rpc-runner.ts +5 -5
- package/src/wirings/rpc/rpc-types.ts +1 -1
- package/src/wirings/scheduler/scheduler.types.ts +2 -5
- package/src/wirings/scope/index.ts +1 -0
- package/src/wirings/secret/secret.types.ts +10 -0
- package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
- package/src/wirings/secret/validate-secret-definitions.ts +2 -0
- package/src/wirings/variable/validate-variable-definitions.test.ts +23 -0
- package/src/wirings/variable/validate-variable-definitions.ts +2 -0
- package/src/wirings/variable/variable.types.ts +9 -0
- package/src/wirings/virtual-user/index.ts +1 -4
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +2 -2
- package/src/wirings/virtual-user/run-virtual-user.test.ts +2 -2
- package/src/wirings/virtual-user/run-virtual-user.ts +3 -3
- package/src/wirings/virtual-user/virtual-user-agents.ts +1 -1
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
- package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
- package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
- package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
- package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
- package/src/wirings/workflow/graph/graph-node.ts +16 -1
- package/src/wirings/workflow/graph/graph-runner.ts +387 -61
- package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
- package/src/wirings/workflow/index.ts +8 -0
- package/src/wirings/workflow/pikku-scenario-service.ts +59 -19
- package/src/wirings/workflow/pikku-workflow-service.ts +6 -8
- package/src/wirings/workflow/run-timeline.ts +2 -2
- package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
- package/src/wirings/workflow/scenario-run.types.ts +186 -0
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +32 -7
- package/src/wirings/workflow/scenario-step.types.ts +27 -12
- package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
- package/src/wirings/workflow/workflow-approval.ts +2 -1
- package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
- package/src/wirings/workflow/workflow.types.ts +4 -12
- package/src/wirings-stay-decoupled.test.ts +7 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +3 -2
- package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
- package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
- package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
- package/dist/wirings/ai-agent/index.d.ts +0 -12
- package/dist/wirings/ai-agent/index.js +0 -10
- package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
- package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
- package/dist/wirings/ai-scorer/index.d.ts +0 -6
- package/dist/wirings/ai-scorer/index.js +0 -5
- package/src/ecosystem.ts +0 -40
- package/src/index.ts +0 -255
- package/src/wirings/ai-agent/ai-agent-utils.ts +0 -1
- package/src/wirings/ai-agent/index.ts +0 -65
- package/src/wirings/ai-scorer/ai-scorer-judge.test.ts +0 -143
- package/src/wirings/ai-scorer/ai-scorer-judge.ts +0 -120
- package/src/wirings/ai-scorer/index.ts +0 -24
- /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
- /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
- /package/dist/{services/ai-storage-service.js → ecosystem/gateway.js} +0 -0
- /package/dist/{wirings/ai-agent/ai-agent.types.js → ecosystem/node.js} +0 -0
- /package/dist/wirings/{ai-agent/ai-agent-helpers.js → agent/agent-helpers.js} +0 -0
- /package/dist/wirings/{ai-agent/ai-agent-model-config.d.ts → agent/agent-model-config.d.ts} +0 -0
- /package/dist/wirings/{ai-agent → agent}/agent-rpc.d.ts +0 -0
- /package/dist/wirings/{ai-scorer/ai-scorer-sampling.d.ts → agent-scorer/agent-scorer-sampling.d.ts} +0 -0
- /package/dist/wirings/{ai-scorer/ai-scorer-sampling.js → agent-scorer/agent-scorer-sampling.js} +0 -0
- /package/dist/wirings/{ai-scorer/ai-scorer-snapshots.js → agent-scorer/agent-scorer-snapshots.js} +0 -0
- /package/src/{column-form.ts → classification/column-form.ts} +0 -0
- /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
- /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
- /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
- /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
- /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
- /package/src/wirings/{ai-scorer/ai-scorer-sampling.ts → agent-scorer/agent-scorer-sampling.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,495 @@
|
|
|
1
|
+
## 0.12.86
|
|
2
|
+
|
|
3
|
+
### Patch Changes
|
|
4
|
+
|
|
5
|
+
- 5a1a962: cors: stop naming the first allowlist entry for a disallowed origin, and add jsonb binding helpers
|
|
6
|
+
|
|
7
|
+
`cors()` with an array `origin` used to fall back to `origin[0]` whenever the
|
|
8
|
+
request origin was not in the allowlist, so every response carried a
|
|
9
|
+
valid-looking `Access-Control-Allow-Origin` naming an origin the caller was not.
|
|
10
|
+
Browsers still blocked the request, but as an origin _mismatch_ rather than
|
|
11
|
+
"origin not allowed", and `curl` showed the same fixed origin for every request
|
|
12
|
+
including bogus ones — which sent people debugging the wrong layer. A request
|
|
13
|
+
origin that is not on the list now gets no `Access-Control-Allow-Origin` and no
|
|
14
|
+
`Access-Control-Allow-Credentials` at all, plus a debug-level log naming the
|
|
15
|
+
rejected origin. A request with no `Origin` header is not a cross-origin request
|
|
16
|
+
and likewise no longer receives a fabricated one. Wildcard and single-string
|
|
17
|
+
`origin` behaviour is unchanged.
|
|
18
|
+
|
|
19
|
+
`@pikku/kysely-postgres` now exports `jsonbText`, `jsonbValue` and `jsonbMerge`.
|
|
20
|
+
postgres.js infers a bound parameter's type from the cast that follows it and
|
|
21
|
+
JSON-encodes anything it believes is jsonb, so a hand-written
|
|
22
|
+
``sql`coalesce(...) || ${JSON.stringify(patch)}::jsonb` `` arrives
|
|
23
|
+
double-encoded and merges into a two-element array instead of an object. The
|
|
24
|
+
helpers route the value through an intermediate `::text` cast, which is correct
|
|
25
|
+
on every driver.
|
|
26
|
+
|
|
27
|
+
## 0.12.85
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- 7722ceb: Split the addon leaf so an application cannot shadow a linked addon's own
|
|
32
|
+
|
|
33
|
+
An addon authored its services through `#pikku/addon`, and so did an
|
|
34
|
+
application installing one. Node keeps those apart — `#pikku/*` is a
|
|
35
|
+
package-private subpath import, resolved against the addon's own
|
|
36
|
+
`package.json` — but tsconfig `paths` are global to a tsx process, and every
|
|
37
|
+
runtime template maps `#pikku/*` onto a sibling package. A linked addon's
|
|
38
|
+
`#pikku/addon` was resolved against the _application's_ leaf, which holds the
|
|
39
|
+
install half and none of the authoring exports, and every template failed to
|
|
40
|
+
boot with `does not provide an export named 'pikkuAddonServices'`.
|
|
41
|
+
|
|
42
|
+
The authoring half now sits at `#pikku/addon/setup`. An application generates a
|
|
43
|
+
flat `.pikku/<leaf>`, so there is nothing there for that specifier to match and
|
|
44
|
+
the resolver falls back to Node, which reads the addon's own imports. Addons
|
|
45
|
+
declaring themselves import `pikkuAddonConfig`, `pikkuAddonServices` and
|
|
46
|
+
`pikkuAddonWireServices` from `#pikku/addon/setup`; `wireAddon` and
|
|
47
|
+
`wireRemoteAddon` stay at `#pikku/addon`.
|
|
48
|
+
|
|
49
|
+
`wireAddon` and `wireRemoteAddon` also move off `@pikku/core/rpc` onto
|
|
50
|
+
`@pikku/core/addon`. Being reached over rpc is how an addon is called rather
|
|
51
|
+
than what it is, and it put the whole addon surface behind the rpc subpath for
|
|
52
|
+
consumers that only wanted to install one.
|
|
53
|
+
|
|
54
|
+
- 375c1ff: A `ref()`-wired addon route now reads the function's schemas, services and permissions from the addon's package rather than the consuming app's.
|
|
55
|
+
|
|
56
|
+
Resolving a namespaced target by namespace re-pointed the function's config and metadata into the addon's package state but left every other package-scoped lookup on the wire's package. The addon registers `SignDataInput` under its own package, so the runner looked it up under `main`, and the route answered 500 for every input it was given — along with the addon's package singleton services, which is what left its credentials unreachable.
|
|
57
|
+
|
|
58
|
+
The wiring itself is still the consuming app's, so middleware, addon tags, addon auth and addon scopes keep resolving against the app: those read the declarations the app made about the addon, and moving them would put back the unrun credential and session middleware that resolving by namespace was introduced to fix.
|
|
59
|
+
|
|
60
|
+
- 02a70cd: fix(core): a scenario assertion is attempted once, not six times
|
|
61
|
+
|
|
62
|
+
`given`, `when` and `then` already opted out of the workflow-wide retry
|
|
63
|
+
default, with a comment saying why: retrying a failed assertion is the wrong
|
|
64
|
+
behaviour for a test primitive. The `expect*` family did not. It passed its
|
|
65
|
+
options straight through to the step engine and inherited
|
|
66
|
+
`DEFAULT_STEP_RETRIES`, so every `expectError`, `expectService`,
|
|
67
|
+
`expectEventually` and `expectScore` got six attempts.
|
|
68
|
+
|
|
69
|
+
What that buys is not resilience:
|
|
70
|
+
|
|
71
|
+
- `expectError` re-invokes the RPC it is asserting against, five more times,
|
|
72
|
+
after it has already done the thing it was not supposed to do.
|
|
73
|
+
- `expectEventually` restarts a poll that has already spent its own `within`
|
|
74
|
+
deadline, so a 30s bound is really 3 minutes.
|
|
75
|
+
- `expectScore` re-runs an LLM judge until a grade lands inside the band. That
|
|
76
|
+
is the one that found this: a judge scored a deliberately useless answer a
|
|
77
|
+
full 1, and the scenario went green on the next attempt.
|
|
78
|
+
|
|
79
|
+
An assertion now defaults to `retries: 0` like every other scenario step, and
|
|
80
|
+
a caller that genuinely wants attempts still asks for them. The unit tests for
|
|
81
|
+
these helpers had each been passing `retries: 0` by hand to make a failure fail
|
|
82
|
+
promptly; those workarounds are gone.
|
|
83
|
+
|
|
84
|
+
A scenario that was only passing because an assertion was retried will now
|
|
85
|
+
report it.
|
|
86
|
+
|
|
87
|
+
- aeef159: fix(cli): let commands that seed a project run outside one
|
|
88
|
+
|
|
89
|
+
Every `pikku` invocation loaded `pikku.config.json` before the command was
|
|
90
|
+
dispatched — `createConfig` in the CLI's service factory called
|
|
91
|
+
`getPikkuCLIConfig` unconditionally. In a directory that is not a Pikku project
|
|
92
|
+
the upward search stops at the repo root and throws `Config file
|
|
93
|
+
pikku.config.json not found`, so the command never ran. That is right for
|
|
94
|
+
commands that read a project, and wrong for `pikku skills install`, whose entire
|
|
95
|
+
job is to write agent skills into a repo that has no Pikku config yet. The
|
|
96
|
+
command needed the thing it exists to precede.
|
|
97
|
+
|
|
98
|
+
`executeCLI` now passes the resolved command path to `createConfig`, and the CLI
|
|
99
|
+
treats `skills` as config-free: it still uses a project config when one is there,
|
|
100
|
+
so behaviour inside a project is unchanged, and falls back to an empty config
|
|
101
|
+
when there is none. Commands that read a project are untouched and still refuse
|
|
102
|
+
to run without one.
|
|
103
|
+
|
|
104
|
+
Also stops a lie in the failure path. A config that was found but could not be
|
|
105
|
+
loaded — a missing field tripping the resolver, malformed JSON — was reported as
|
|
106
|
+
`Config file not found: <path>`, naming a file that was sitting right there and
|
|
107
|
+
sending the reader to look for it. It now reads `Failed to load config file`.
|
|
108
|
+
|
|
109
|
+
- a281de6: A CLI option's type now drives how it is parsed, and it comes from the command function's input schema rather than a second hand-written declaration.
|
|
110
|
+
|
|
111
|
+
`CLIOption` gains `type?: 'string' | 'number' | 'boolean' | 'string[]'` (replacing the never-honoured `array` flag). Declared, it wins over whatever the schema says; left unset, the parser reads the type off the command function's input schema — the same schema the function is validated against — falling back to `default` and then to `'string'`. A `'string[]'` option consumes one token and splits it on commas; every other non-boolean option consumes the next token verbatim, so values that begin with `-` (base64url tokens, negative numbers, dash-leading name patterns) parse correctly. A boolean option is a flag: it consumes the next token only when that token is an explicit literal (`true`/`false`/`1`/`0`/`yes`/`no`), so `--watch false` still turns a default-on flag off instead of leaving `false` behind as a positional.
|
|
112
|
+
|
|
113
|
+
Because the schema is now what types an option, `pikku serve --console --port 4077` no longer reads `--port` as the value of `--console`, and a numeric option arrives as a number instead of a string. An explicit `type` is mostly needed for options that belong to no function input — the `pikku all` filters, which the config factory reads straight off the CLI data, are declared `string[]`, and the CLI's ad-hoc `parseCommaSeparated` normalisation is gone.
|
|
114
|
+
|
|
115
|
+
An array option takes either one comma list or the flag repeated. It never consumes more than one token, because `--tags alpha beta` cannot be told apart from an option followed by a positional; the stray token is reported as an unexpected argument rather than dropped.
|
|
116
|
+
|
|
117
|
+
- 266e3bc: One door per name: `@pikku/core/ecosystem/*` and the package root are gone
|
|
118
|
+
|
|
119
|
+
`@pikku/core` published every module twice. `ecosystem/http` re-exported
|
|
120
|
+
`./http`, `ecosystem/services` re-exported `./services`, and a name was
|
|
121
|
+
reachable through either — so every addition had to be made in two places, and a
|
|
122
|
+
consumer's import said nothing about what it actually used. The package root was
|
|
123
|
+
the same problem at a larger scale: a single barrel of 206 names that no bundler
|
|
124
|
+
could take apart, and the one specifier that revealed nothing at all.
|
|
125
|
+
|
|
126
|
+
Both are deleted. Every name now lives on the subpath that owns it, and every
|
|
127
|
+
import carries that subpath — `@pikku/core/http`, `@pikku/core/services`,
|
|
128
|
+
`@pikku/core/errors`, `@pikku/core/types`.
|
|
129
|
+
|
|
130
|
+
Deleting the facades meant the raw subpaths had to become a superset of them,
|
|
131
|
+
which they were not: the facade tree had accumulated 25 names with no raw home
|
|
132
|
+
and about 26 more filed under a different area than the module they came from.
|
|
133
|
+
Those names moved to the area that owns them, and three areas were published as
|
|
134
|
+
new entry points rather than left on a root that is going away — `./types` (the
|
|
135
|
+
shared type surface, the largest single destination), `./state` and
|
|
136
|
+
`./classification`.
|
|
137
|
+
|
|
138
|
+
`./classification` is one door onto one subject: what a value is and how it must
|
|
139
|
+
be handled. Its three halves would each have been an entry point — the brands
|
|
140
|
+
and manifest types, the stored-form helpers (`hashToken`, `unsafeAsSealed` and
|
|
141
|
+
friends), and `SecretValue` — split by whether a name happens to be a type or a
|
|
142
|
+
value, which is the same defect as the facades. The duration and versioned-id
|
|
143
|
+
helpers went to `./utils`, which already published, and `PikkuRequest` went to
|
|
144
|
+
`./function`: it is the transport-agnostic request base, not an HTTP one — HTTP
|
|
145
|
+
has `PikkuHTTPAbstractRequest`, and the only thing outside core that extends
|
|
146
|
+
`PikkuRequest` is Azure's timer request.
|
|
147
|
+
|
|
148
|
+
`./types` inherited the root barrel's habit before it inherited its contents, so
|
|
149
|
+
the names with an owner elsewhere were moved off it. The middleware types and the
|
|
150
|
+
five middleware factories — `pikkuMiddleware`, `pikkuMiddlewareFactory`,
|
|
151
|
+
`pikkuChannelMiddleware`, `pikkuChannelMiddlewareFactory` and
|
|
152
|
+
`pikkuAgentMiddleware`, runtime values on a types entry point — are now
|
|
153
|
+
`@pikku/core/middleware`; the function meta types are `@pikku/core/function`;
|
|
154
|
+
`SerializedError` is `@pikku/core/errors`; and the generic TypeScript helpers
|
|
155
|
+
(`MakeRequired`, `PickRequired`, `PickOptional`, `RequireAtLeastOne`,
|
|
156
|
+
`JSONPrimitive`, `JSONValue`) are `@pikku/core/utils`. What is left on `./types`
|
|
157
|
+
is the vocabulary the wirings share, which no single module owns.
|
|
158
|
+
|
|
159
|
+
`pikku` was itself a root barrel — `export * from '@pikku/core'` — and
|
|
160
|
+
now exports only the services it bundles.
|
|
161
|
+
|
|
162
|
+
One module survives at the old specifier, and only for the bootstrap:
|
|
163
|
+
`packages/cli` is generated by the _published_ CLI pinned in its `build.sh`, and
|
|
164
|
+
that CLI still writes a bare `@pikku/core` into the files it generates for the
|
|
165
|
+
CLI itself. `bootstrap-compat/root.ts` carries the eight types it names, a test
|
|
166
|
+
in core fails if that list grows, and it goes when the pin moves to a CLI
|
|
167
|
+
released from this branch. The adapter names the pinned CLI reaches for —
|
|
168
|
+
`pikkuState` and `CreateWireServices` — are rewritten to `@pikku/core/state` and
|
|
169
|
+
`@pikku/core/types` by the same `build.sh` patch pass, so no second shim is
|
|
170
|
+
needed for them.
|
|
171
|
+
|
|
172
|
+
A guard test keeps the root shut: it parses imports and rejects a bare
|
|
173
|
+
`@pikku/core` rather than grepping for it, because several tests hold a user's
|
|
174
|
+
file as a template literal, where `import … from '@pikku/core'` is fixture text
|
|
175
|
+
rather than an import this repo makes.
|
|
176
|
+
|
|
177
|
+
An agent scaffold a project generated under an older CLI is refreshed rather
|
|
178
|
+
than left to fail: `pikku all` already deleted one importing an entry point
|
|
179
|
+
`@pikku/core` no longer publishes, and the `#pikku` hub joins that list.
|
|
180
|
+
Without it a project that scaffolds the agent endpoint but
|
|
181
|
+
declares no agents keeps the old file forever — the generator that would rewrite
|
|
182
|
+
it only runs when agents exist, and the file being present is what stops it
|
|
183
|
+
being regenerated as missing.
|
|
184
|
+
|
|
185
|
+
`pikku new addon` also wrote a tsconfig `paths` map naming only the deleted hub.
|
|
186
|
+
An addon's `imports` map points into `dist`, so `paths` is what resolves
|
|
187
|
+
`#pikku/<leaf>` for the addon's own source build — it now names the two leaf
|
|
188
|
+
patterns, in both the addon and its test harness.
|
|
189
|
+
|
|
190
|
+
- 02a70cd: fix(core): a denied tool call still reads as denied after a reload
|
|
191
|
+
|
|
192
|
+
The result stored for a denied approval was a bare sentence written for the
|
|
193
|
+
model. A client has no way to tell that apart from a tool that succeeded and
|
|
194
|
+
returned prose, so it could only show the denial from what it had just done
|
|
195
|
+
itself — the optimistic `{ approved: false }` it writes when the deny button is
|
|
196
|
+
clicked. The moment the thread re-rendered from storage, that local knowledge
|
|
197
|
+
was gone and the denied call came back as a successful one, green badge and all.
|
|
198
|
+
In a delegated run, where the parent keeps streaming after the denial, this was
|
|
199
|
+
the only state a user ever saw.
|
|
200
|
+
|
|
201
|
+
The stored and streamed result now carries `approved: false` alongside the same
|
|
202
|
+
sentence, so the denial survives the round trip and both readers get what they
|
|
203
|
+
need. The action was never actually performed in either case; only the reporting
|
|
204
|
+
of it was wrong.
|
|
205
|
+
|
|
206
|
+
- 786dae5: Bump every dependency whose latest release is a major across the monorepo, and
|
|
207
|
+
port the code the majors broke: `cookie` 2's `parseCookie`/`stringifySetCookie`
|
|
208
|
+
API in `@pikku/core` and the three runtime HTTP adapters, and assistant-ui 0.15's
|
|
209
|
+
store client in `@pikku/assistant-ui`.
|
|
210
|
+
- 6eef0a0: Bump every dependency to its latest compatible minor/patch across the monorepo.
|
|
211
|
+
- 3561d67: feat(graph): per-item `forEach` fanout for declarative workflow graphs
|
|
212
|
+
|
|
213
|
+
A graph node can now run once per element of an upstream array:
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
postVideo: {
|
|
217
|
+
forEach: 'getMyVideo', // or (ref) => ref('getMyVideo', 'rows')
|
|
218
|
+
mode: 'sequential', // optional, defaults to 'parallel'
|
|
219
|
+
input: (ref, template, $item) => ({ url: $item('URL VIDEO') }),
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Each element runs as its own step instance (`postVideo[0]`, `postVideo[1]`, …)
|
|
224
|
+
and the node's result is the ordered array of per-item results, so a fanned node
|
|
225
|
+
chains straight into another `forEach`. Downstream nodes wait for every item. A
|
|
226
|
+
non-array source fails the run loudly instead of coercing.
|
|
227
|
+
|
|
228
|
+
The change is additive: `forEach` and `mode` are new optional node fields, and
|
|
229
|
+
`$item` is appended after `template` so existing `input: (ref) => …` and
|
|
230
|
+
`input: (ref, template) => …` nodes are unchanged.
|
|
231
|
+
|
|
232
|
+
- a91c433: HTTP routes wired with `ref('ns:fn')` now record the addon function id as their own `pikkuFuncId`, the same way the CLI and channel wirings already do, instead of minting a per-route wrapper function and linking it back through `refTarget`. The `refTarget` field is gone from `HTTPWiringMeta`, and the runtime resolves a namespaced route function against the addon package's own metadata.
|
|
233
|
+
- 02a70cd: fix(core): a judge grades the run, not just the sentence it ended with
|
|
234
|
+
|
|
235
|
+
The prompt built for an LLM judge carried the user's question, the agent's
|
|
236
|
+
answer and, for a reference-based judge, the answer key — but never the tool
|
|
237
|
+
calls, although `ScorerInput` has always carried them and heuristic scorers
|
|
238
|
+
read them.
|
|
239
|
+
|
|
240
|
+
An answer produced from a tool and the same sentence invented by the model are
|
|
241
|
+
identical in the output alone; they differ only in what the run did to get
|
|
242
|
+
there. Asked to grade a todo agent that had just listed the user's todos
|
|
243
|
+
correctly, a judge given only the answer called it "a plausible-looking list"
|
|
244
|
+
that "offers no real access to your actual list, making it effectively a guess",
|
|
245
|
+
and scored 0.2 what it scored 1 on other runs with near-identical answers. It
|
|
246
|
+
was applying its rubric correctly to the evidence it had; the evidence was the
|
|
247
|
+
problem.
|
|
248
|
+
|
|
249
|
+
The default prompt now names the tools the run called, and marks the ones that
|
|
250
|
+
failed. `pikkuAgentJudge` takes a `toolCalls` option for how much of the
|
|
251
|
+
trajectory to disclose:
|
|
252
|
+
|
|
253
|
+
- `names` (default) — which tools ran and which failed. No arguments, no
|
|
254
|
+
results, no error text. Enough to settle whether the run had real access,
|
|
255
|
+
which is what the 0.2 was doubting.
|
|
256
|
+
- `full` — arguments and results too, truncated so one fat result cannot crowd
|
|
257
|
+
the answer out of the judge's context. For a judge that grades the answer
|
|
258
|
+
_against_ what the tool returned.
|
|
259
|
+
- `off` — no trajectory at all.
|
|
260
|
+
|
|
261
|
+
A judge is a third-party model, and a tool's arguments and results are the most
|
|
262
|
+
sensitive thing a run touches, so the default discloses the least that fixes
|
|
263
|
+
the bug. Output middleware still has its pass first either way: a scorer sees
|
|
264
|
+
the post-middleware snapshot, so anything a `modifyOutput` redacted is already
|
|
265
|
+
gone before `toolCalls` is consulted.
|
|
266
|
+
|
|
267
|
+
A run that called nothing gets no section rather than an empty one, and a
|
|
268
|
+
scorer supplying its own `prompt` is unaffected. `ScorerJudgeConfig.toolCalls`
|
|
269
|
+
is required — `pikkuAgentJudge` resolves the default, so only code building
|
|
270
|
+
that type by hand is affected.
|
|
271
|
+
|
|
272
|
+
- 9537f74: Every definer an app calls is now reachable through its `#pikku` leaf.
|
|
273
|
+
|
|
274
|
+
`defineCredential` had no generated door, so a credential file had to name
|
|
275
|
+
`@pikku/core/credential` directly — the one import in an otherwise
|
|
276
|
+
`#pikku`-only wiring that reached past the leaf. It is now generated into the
|
|
277
|
+
project's own `.pikku` alongside `defineSecret`, `defineVariable` and
|
|
278
|
+
`defineScope`, and `cors` joins the names the `#pikku/http` leaf carries.
|
|
279
|
+
|
|
280
|
+
A leaf index re-exports every entry file the leaf has rather than only the
|
|
281
|
+
first, so the definer and the typed service map are both reachable through
|
|
282
|
+
`#pikku/<leaf>` instead of one of them being left behind a relative path into
|
|
283
|
+
`.pikku`.
|
|
284
|
+
|
|
285
|
+
The definition types are also generated before the leaf indexes are written,
|
|
286
|
+
not after. They read only `config`, so nothing held them back to the inspected
|
|
287
|
+
pass, and running them there left the first codegen after an upgrade with a
|
|
288
|
+
`#pikku/credentials` that resolved but was missing `defineCredential`.
|
|
289
|
+
|
|
290
|
+
- 2b57ca8: A persona can name the `app` they sign into, and a browser run takes a url per app (`--app-url <app>=<url>`, or `appUrls` on the environment). Each actor's browser context navigates against its own app's base, so a product that is more than one frontend can be proved in one run — including a scenario that crosses from one app to the other. A run whose personas name an app nobody gave a url for is refused rather than browsing the wrong app's pages.
|
|
291
|
+
- 266e3bc: `#pikku` is a namespace, not a module: one subpath per wiring
|
|
292
|
+
|
|
293
|
+
The bare `#pikku` specifier resolved to `.pikku/pikku-types.gen.ts`, a hub that
|
|
294
|
+
re-exported all twelve wiring leaves with `export *` — undoing the split the
|
|
295
|
+
leaves exist for, each of which still says so in its own generated header
|
|
296
|
+
("HTTP-specific type definitions for tree-shaking optimization"). Reaching that
|
|
297
|
+
hub put 33 distinct `@pikku/core` subpaths into the module graph, and neither
|
|
298
|
+
consumer could drop them again: bundlers keep `export *` chains because the app
|
|
299
|
+
declares no `sideEffects`, and Node and tsx do not tree-shake at all, so an app
|
|
300
|
+
with no queues still executed `@pikku/core/queue` at boot.
|
|
301
|
+
|
|
302
|
+
The hub is gone. An app now imports the leaf the name belongs to —
|
|
303
|
+
`#pikku/function`, `#pikku/http`, `#pikku/workflow` — and a project's `imports`
|
|
304
|
+
map declares two patterns, because both resolvers pick the more specific one:
|
|
305
|
+
|
|
306
|
+
```json
|
|
307
|
+
"#pikku/*.js": "./.pikku/*.ts",
|
|
308
|
+
"#pikku/*": "./.pikku/*/index.ts"
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
A source tree names the `.ts` on both. Webpack, esbuild and Bun all rewrite a
|
|
312
|
+
`.js` specifier to the `.ts` beside it for a relative import but not for an
|
|
313
|
+
imports-map target, so a `.js` target there resolves to a file that does not
|
|
314
|
+
exist. The two places that keep `.js` are the ones where it is the real file: a
|
|
315
|
+
published addon, whose map points into `dist`, and a project that imports a
|
|
316
|
+
declaration-only generated file such as `pikku-rpc-wirings-map.gen.d.ts`, where
|
|
317
|
+
naming the `.js` lets the type resolver's own mapping reach the `.d.ts`.
|
|
318
|
+
|
|
319
|
+
`pikku` generates the leaf indexes and removes the hub, and `pikku validate`
|
|
320
|
+
reports a barrel import as an error. The split also turns the addon boundary
|
|
321
|
+
from advice into a rule: an addon never generates the wiring leaves, so
|
|
322
|
+
`#pikku/http` fails at the specifier rather than yielding "no exported member"
|
|
323
|
+
from a hub that quietly dropped the re-export.
|
|
324
|
+
|
|
325
|
+
- 9fce0f1: Give a persona step its actor instead of making it unwrap one
|
|
326
|
+
|
|
327
|
+
`requireActor(scenarioStep)` was the first line of every step that acts as
|
|
328
|
+
somebody, and it existed because the actor lived on the `scenarioStep` wire as
|
|
329
|
+
an optional property. A property of a wire member is either optional for every
|
|
330
|
+
binding or required for all of them, so the only expressible answer was
|
|
331
|
+
"optional", and each step paid for it with a guard.
|
|
332
|
+
|
|
333
|
+
The actor is now its own wire member, `wire.actor`, injected by the runner. Wire
|
|
334
|
+
members can be required per binding, so a step declares whether it runs as
|
|
335
|
+
somebody and the type follows:
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
export const buysAnApple = pikkuScenarioStep<
|
|
339
|
+
{ qty: number },
|
|
340
|
+
{ orderId: string }
|
|
341
|
+
>({
|
|
342
|
+
name: 'buysAnApple',
|
|
343
|
+
actor: true,
|
|
344
|
+
default: async (_services, { qty }, { actor }) =>
|
|
345
|
+
actor.invoke('placeOrder', { qty }),
|
|
346
|
+
})
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
A `browser` binding implies it — a window is opened as somebody, so every
|
|
350
|
+
binding of a step that has one gets the actor too. A step that declares neither
|
|
351
|
+
has no `actor` on its wire at all, rather than an optional one: a pure assertion
|
|
352
|
+
over what an earlier step returned has nobody to be, and `attemptsSignIn`
|
|
353
|
+
deliberately posts credentials instead of reusing an actor's established
|
|
354
|
+
session. That distinction is why the requirement is declared per step rather
|
|
355
|
+
than inferred from the step being a persona step — "persona step ⇒ has an actor"
|
|
356
|
+
is false, and a guard built on it rejects the 61 steps in the e2e suite that
|
|
357
|
+
correctly run without one.
|
|
358
|
+
|
|
359
|
+
Dispatching a step that declared an actor without `{ actor: actors.x }` now
|
|
360
|
+
fails before the body runs, with `ScenarioActorRequired` naming the step.
|
|
361
|
+
`ScenarioBrowserActorRequired` is replaced by it, and `requireActor` is gone
|
|
362
|
+
from `@pikku/core/scenario` and the generated `#pikku/scenario` barrel.
|
|
363
|
+
|
|
364
|
+
- 83683a0: Give the scenario test surface its own `#pikku/scenario` entry
|
|
365
|
+
|
|
366
|
+
Scenario files are app code, so they belong inside the generated alias — but
|
|
367
|
+
they are a distinct surface from wiring, and folding ~11 test-only names into
|
|
368
|
+
the main hub would crowd it for every app that never writes a scenario. They
|
|
369
|
+
get their own sub-entry instead.
|
|
370
|
+
|
|
371
|
+
The generated scenario barrel now re-exports the helpers a step file reaches
|
|
372
|
+
for — `requireScenarioEnv`, `createCookieJar`, `pollUntil`,
|
|
373
|
+
`createScenarioRunner`, `postScenarioJson`, `readScenarioHttpResponse` and the
|
|
374
|
+
types beside them — so a scenario file has one specifier to import from and
|
|
375
|
+
never has to know whether a helper is typed against this project or shipped by
|
|
376
|
+
the framework. The names come from the `@pikku/core/scenario` and
|
|
377
|
+
`@pikku/core/persona` subpaths that own them.
|
|
378
|
+
|
|
379
|
+
- 456c88b: Scenario runs are now kept, and the console reads them back.
|
|
380
|
+
|
|
381
|
+
Every `pikku scenario run` files a record: the run's outcome and counts, each
|
|
382
|
+
scenario's result with the prose of the steps as they read at the time, and the
|
|
383
|
+
screenshots and video it left behind. The steps are snapshotted rather than
|
|
384
|
+
referenced, so a run still reads correctly after the scenario that produced it
|
|
385
|
+
has been rewritten.
|
|
386
|
+
|
|
387
|
+
`ScenarioRunStore` is the interface, `FileScenarioRunStore` the on-disk
|
|
388
|
+
implementation the CLI writes to — one folder per run, `run.json` beside its
|
|
389
|
+
artifacts, under `<outDir>/scenario-runs`. It is a store in its own right rather
|
|
390
|
+
than a corner of the workflow service, so a hosted console can keep the same
|
|
391
|
+
records in a database and its footage in object storage without the functions
|
|
392
|
+
that read them knowing the difference.
|
|
393
|
+
|
|
394
|
+
The console's Scenarios page gained a Runs view (`?view=runs`) listing past
|
|
395
|
+
runs, with a run's results, its step ladder, failures, and the screenshots and
|
|
396
|
+
video inline. Reading and deleting runs are gated by the new
|
|
397
|
+
`pikku:console:scenarios:read` and `pikku:console:scenarios:manage` scopes.
|
|
398
|
+
|
|
399
|
+
- 456c88b: Scenario runs now record video by default and keep the footage that is worth watching.
|
|
400
|
+
|
|
401
|
+
Playwright decides recording when a window opens, which is before anyone knows
|
|
402
|
+
whether the scenario passed — so `--video failed` (the new default) records every
|
|
403
|
+
scenario and discards the passes. `--video all` keeps everything, `--video off`
|
|
404
|
+
records nothing. Recording costs ~0.1-0.5s per actor context, nearly all of it
|
|
405
|
+
finalising the file on close; only kept videos are encoded, so a green run pays
|
|
406
|
+
no encoding at all.
|
|
407
|
+
|
|
408
|
+
Kept recordings are filed under `<run>/<scenario>/<actor>` alongside that
|
|
409
|
+
scenario's screenshots, rather than landing in one flat folder under
|
|
410
|
+
Playwright's own generated filenames.
|
|
411
|
+
|
|
412
|
+
Encoding is now h264/mp4 rather than VP9/webm: measured on scenario footage it
|
|
413
|
+
runs ~11x faster and lands ~30% smaller, and mp4 plays in every browser.
|
|
414
|
+
|
|
415
|
+
`--screenshots` is unchanged and still opt-in.
|
|
416
|
+
|
|
417
|
+
- c127273: fix: type `wire.getCredential` from the generated `CredentialsMap`
|
|
418
|
+
|
|
419
|
+
`wire.getCredential('slack')` now resolves its value type from the project's
|
|
420
|
+
credentials codegen, the way `services.credentials.get('slack')` already did.
|
|
421
|
+
`PikkuWire` takes a `TypedCredentials` parameter and the generated function
|
|
422
|
+
types bind `CredentialsMap` into it; a name the map does not know stays callable
|
|
423
|
+
with an explicit type argument.
|
|
424
|
+
|
|
425
|
+
## 0.12.84
|
|
426
|
+
|
|
427
|
+
### Patch Changes
|
|
428
|
+
|
|
429
|
+
- 7406bfe: Rename the agent runtime from `AI*` to `Agent*` (#596)
|
|
430
|
+
|
|
431
|
+
`AI` described the model provider, not the thing being named. Every symbol that
|
|
432
|
+
belongs to the agent runtime now says `Agent`; the symbols that genuinely wrap a
|
|
433
|
+
model provider — `AIEmbeddingService`, `AIProviderOptions`, `AIEmbedParams`,
|
|
434
|
+
`AITranscriptionParams`, `AIGenerateImageParams` and their siblings, and the
|
|
435
|
+
`@pikku/ai-vercel` / `@pikku/ai-deepinfra` / `@pikku/ai-voice` packages — keep
|
|
436
|
+
their names.
|
|
437
|
+
|
|
438
|
+
**Wiring**
|
|
439
|
+
- `pikkuAIAgent` → `pikkuAgent`, `pikkuAIScorer` → `pikkuAgentScorer`,
|
|
440
|
+
`pikkuAIJudge` → `pikkuAgentJudge`
|
|
441
|
+
- `CoreAIAgent` → `CoreAgent`, `AIAgentInput` → `AgentInput`, `AIAgentStep` →
|
|
442
|
+
`AgentStep`, `AIMessage` → `AgentMessage`, and the rest of the agent types
|
|
443
|
+
- `AIAgentRunnerService` → `AgentRunnerService`, `AIStorageService` →
|
|
444
|
+
`AgentStorageService`, `AIRunStateService` → `AgentRunStateService`
|
|
445
|
+
|
|
446
|
+
**Entry points**
|
|
447
|
+
|
|
448
|
+
`@pikku/core/agent` → `@pikku/core/agent`, `@pikku/core/agent-scorer` →
|
|
449
|
+
`@pikku/core/agent-scorer`.
|
|
450
|
+
|
|
451
|
+
**Queues**
|
|
452
|
+
|
|
453
|
+
The scorer queues are now `agent-score-fast` and `agent-score-slow`. Drain the
|
|
454
|
+
old `ai-score-fast` / `ai-score-slow` queues before deploying — jobs still
|
|
455
|
+
sitting on them when the new workers start will never be picked up.
|
|
456
|
+
|
|
457
|
+
**Scaffolds**
|
|
458
|
+
|
|
459
|
+
The agent scaffold pikku wrote for your project — `<scaffold>/agent/agent.gen.ts`
|
|
460
|
+
and its schemas file — imports `@pikku/core/ai-agent`, which no longer exists. A
|
|
461
|
+
scaffold is normally written once and then left alone, so `pikku all` would find
|
|
462
|
+
it present and leave the broken import in place. It now deletes an agent scaffold
|
|
463
|
+
importing either removed entry point and regenerates it in the same run. Anything
|
|
464
|
+
you added to that file goes with it, so move local edits out first.
|
|
465
|
+
|
|
466
|
+
**Database**
|
|
467
|
+
|
|
468
|
+
The agent tables are renamed: `ai_threads`, `ai_message`, `ai_tool_call`,
|
|
469
|
+
`ai_working_memory`, `ai_run` and `ai_run_score` become `agent_threads`,
|
|
470
|
+
`agent_message`, `agent_tool_call`, `agent_working_memory`, `agent_run` and
|
|
471
|
+
`agent_run_score`, along with their indexes and the `ai_working_memory_pk`
|
|
472
|
+
constraint. The same rename applies to the MongoDB collections.
|
|
473
|
+
|
|
474
|
+
`ensurePikkuSchema` creates tables it cannot find, so an existing database will
|
|
475
|
+
get empty `agent_*` tables and leave the old data stranded in `ai_*`. Rename
|
|
476
|
+
them before the first boot on the new version:
|
|
477
|
+
|
|
478
|
+
```sql
|
|
479
|
+
ALTER TABLE ai_threads RENAME TO agent_threads;
|
|
480
|
+
ALTER TABLE ai_message RENAME TO agent_message;
|
|
481
|
+
ALTER TABLE ai_tool_call RENAME TO agent_tool_call;
|
|
482
|
+
ALTER TABLE ai_working_memory RENAME TO agent_working_memory;
|
|
483
|
+
ALTER TABLE ai_run RENAME TO agent_run;
|
|
484
|
+
ALTER TABLE ai_run_score RENAME TO agent_run_score;
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
- 6794681: Publish the ecosystem surface as per-area sub-barrels under `@pikku/core/ecosystem/*`, and point generated code, the CLI, the inspector and the runtime adapters at them.
|
|
488
|
+
|
|
489
|
+
348 names that only generated code, the toolchain or a runtime adapter ever imports now have a second home on `@pikku/core/ecosystem/<area>` — one sub-barrel per area, matching how core already publishes its entrypoints, so no single barrel grows without bound and a consumer only pulls in the area it uses.
|
|
490
|
+
|
|
491
|
+
This step is additive: every name is still exported from the entrypoint it was published from before, so nothing downstream breaks. Removing them from the app-facing barrels is a later change, and needs a release carrying `./ecosystem/*` first.
|
|
492
|
+
|
|
1
493
|
## 0.12.83
|
|
2
494
|
|
|
3
495
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ Wire them to HTTP, queues, cron, channels or MCP, then run `npx pikku` to
|
|
|
30
30
|
regenerate the bootstrap files and typed clients.
|
|
31
31
|
|
|
32
32
|
Subpath exports cover the individual wiring types — `@pikku/core/http`,
|
|
33
|
-
`@pikku/core/workflow`, `@pikku/core/channel`, `@pikku/core/
|
|
33
|
+
`@pikku/core/workflow`, `@pikku/core/channel`, `@pikku/core/agent` and more.
|
|
34
34
|
|
|
35
35
|
## Docs
|
|
36
36
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap compatibility, not a public entry point.
|
|
3
|
+
*
|
|
4
|
+
* The package root carried a 206-name barrel; it is gone, and every name now
|
|
5
|
+
* lives on the subpath that owns it. What is left here is the handful of types
|
|
6
|
+
* the CLI pinned in `packages/cli/build.sh` still writes into the files it
|
|
7
|
+
* generates for the CLI itself — an unresolved type there is a silent `any` in
|
|
8
|
+
* the CLI's own generated surface, not a build failure, which is why this
|
|
9
|
+
* exists rather than letting it break loudly.
|
|
10
|
+
*
|
|
11
|
+
* `bootstrap-compat.test.ts` fails if the pinned CLI's output drifts from this
|
|
12
|
+
* list. Delete this file and its `exports` entry once the pin moves to a CLI
|
|
13
|
+
* released from this branch.
|
|
14
|
+
*/
|
|
15
|
+
export type { PikkuWire, SecretlessServices } from '../types/core.types.js';
|
|
16
|
+
export type { CorePikkuMiddleware } from '../middleware/middleware.types.js';
|
|
17
|
+
export type { PickRequired } from '../utils.js';
|
|
18
|
+
export type { CorePermissionGroup } from '../function/functions.types.js';
|
|
19
|
+
export type { ListInput, ListOutput } from '../function/list.types.js';
|
|
20
|
+
export type { SecretService } from '../services/secret-service.js';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { HashedValue, SealedValue, WrappedValue } from './data-classification.js';
|
|
2
|
+
/**
|
|
3
|
+
* SHA-256 of a credential, lowercase hex — the sole producer of `HashedValue`.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately unpeppered. These are high-entropy random bearer tokens, not
|
|
6
|
+
* passwords: there is no candidate set to search, so a pepper would add a key
|
|
7
|
+
* to manage and a rotation story to own while buying nothing. A column holding
|
|
8
|
+
* a *low*-entropy secret is not a `hashed` column — it wants a password KDF and
|
|
9
|
+
* a different type entirely.
|
|
10
|
+
*
|
|
11
|
+
* Async because it runs on WebCrypto rather than `node:crypto`, so the same
|
|
12
|
+
* code path works in a Worker. Callers that hash a bearer token on every
|
|
13
|
+
* request are already async.
|
|
14
|
+
*/
|
|
15
|
+
export declare const hashToken: (raw: string) => Promise<HashedValue>;
|
|
16
|
+
/**
|
|
17
|
+
* Assert that a string already in storage is ciphertext of the given form.
|
|
18
|
+
*
|
|
19
|
+
* The brands exist so that new writes must come from a real encrypt/hash call,
|
|
20
|
+
* but three paths legitimately hold such a value as a bare `string`: a
|
|
21
|
+
* migration backfilling rows written before the column declared its form, a
|
|
22
|
+
* test fixture, and a value arriving over the wire from a service that sealed
|
|
23
|
+
* it elsewhere. Each of those is a promise the caller is making, not something
|
|
24
|
+
* the type system can check — which is why these are named to be greppable and
|
|
25
|
+
* why there is no non-`unsafe` spelling. If one of these appears in ordinary
|
|
26
|
+
* request-handling code, that is the bug.
|
|
27
|
+
*/
|
|
28
|
+
export declare const unsafeAsWrapped: (stored: string) => WrappedValue;
|
|
29
|
+
/** See `unsafeAsWrapped`. */
|
|
30
|
+
export declare const unsafeAsSealed: (stored: string) => SealedValue;
|
|
31
|
+
/** See `unsafeAsWrapped`. */
|
|
32
|
+
export declare const unsafeAsHashed: (stored: string) => HashedValue;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SHA-256 of a credential, lowercase hex — the sole producer of `HashedValue`.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately unpeppered. These are high-entropy random bearer tokens, not
|
|
5
|
+
* passwords: there is no candidate set to search, so a pepper would add a key
|
|
6
|
+
* to manage and a rotation story to own while buying nothing. A column holding
|
|
7
|
+
* a *low*-entropy secret is not a `hashed` column — it wants a password KDF and
|
|
8
|
+
* a different type entirely.
|
|
9
|
+
*
|
|
10
|
+
* Async because it runs on WebCrypto rather than `node:crypto`, so the same
|
|
11
|
+
* code path works in a Worker. Callers that hash a bearer token on every
|
|
12
|
+
* request are already async.
|
|
13
|
+
*/
|
|
14
|
+
export const hashToken = async (raw) => {
|
|
15
|
+
const subtle = globalThis.crypto?.subtle;
|
|
16
|
+
if (!subtle) {
|
|
17
|
+
throw new Error('WebCrypto not available');
|
|
18
|
+
}
|
|
19
|
+
const digest = await subtle.digest('SHA-256', new TextEncoder().encode(raw));
|
|
20
|
+
let hex = '';
|
|
21
|
+
for (const byte of new Uint8Array(digest)) {
|
|
22
|
+
hex += byte.toString(16).padStart(2, '0');
|
|
23
|
+
}
|
|
24
|
+
return hex;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Assert that a string already in storage is ciphertext of the given form.
|
|
28
|
+
*
|
|
29
|
+
* The brands exist so that new writes must come from a real encrypt/hash call,
|
|
30
|
+
* but three paths legitimately hold such a value as a bare `string`: a
|
|
31
|
+
* migration backfilling rows written before the column declared its form, a
|
|
32
|
+
* test fixture, and a value arriving over the wire from a service that sealed
|
|
33
|
+
* it elsewhere. Each of those is a promise the caller is making, not something
|
|
34
|
+
* the type system can check — which is why these are named to be greppable and
|
|
35
|
+
* why there is no non-`unsafe` spelling. If one of these appears in ordinary
|
|
36
|
+
* request-handling code, that is the bug.
|
|
37
|
+
*/
|
|
38
|
+
export const unsafeAsWrapped = (stored) => stored;
|
|
39
|
+
/** See `unsafeAsWrapped`. */
|
|
40
|
+
export const unsafeAsSealed = (stored) => stored;
|
|
41
|
+
/** See `unsafeAsWrapped`. */
|
|
42
|
+
export const unsafeAsHashed = (stored) => stored;
|