@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
|
@@ -10,7 +10,7 @@ tags: services
|
|
|
10
10
|
`QueueWebhookService.resolveJobOptions`
|
|
11
11
|
(`packages/core/src/services/queue-webhook-service.ts`) resolves retries as
|
|
12
12
|
per-call `retries` → `config.webhook.retries` → `DEFAULT_WEBHOOK_RETRIES`, then
|
|
13
|
-
|
|
13
|
+
_always_ puts `attempts: retries + 1` on the job options. It mirrors the workflow
|
|
14
14
|
service's policy resolution. Backoff is exponential unless a concrete
|
|
15
15
|
`retryDelay` selects a fixed one.
|
|
16
16
|
|
package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md
CHANGED
|
@@ -15,7 +15,7 @@ handlers run on the host at `serverUrl`. `pikku verify` enforces the
|
|
|
15
15
|
devDependency placement.
|
|
16
16
|
|
|
17
17
|
`ContextAwareRPCService.invokeAddonFunction` in `rpc-runner.ts` therefore checks
|
|
18
|
-
`resolved.addonConfig?.remote`
|
|
18
|
+
`resolved.addonConfig?.remote` _before_ it looks for local function meta, and
|
|
19
19
|
routes to `invokeRemoteAddonFunction`. That method POSTs the addon's own function
|
|
20
20
|
name — the bare name, not the namespaced `ns:fn` form, optionally remapped by
|
|
21
21
|
`remoteName` — to `${serverUrl}/remote/rpc/:rpcName`, authenticating as a client
|
package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md
CHANGED
|
@@ -15,7 +15,7 @@ throws `RPCNotFoundError`. It returns the resolving package alongside the
|
|
|
15
15
|
`runPikkuFunc` without a second lookup.
|
|
16
16
|
|
|
17
17
|
The package-first order exists because RPC meta only ever lives in root: addon
|
|
18
|
-
packages register their handlers under their own package name as
|
|
18
|
+
packages register their handlers under their own package name as _function_ meta,
|
|
19
19
|
never as RPC meta. Without the package probe, a bare `rpc('doThing')` made from
|
|
20
20
|
inside an addon would skip that addon's own `doThing` and either resolve to an
|
|
21
21
|
unrelated root function of the same name or fail outright. The versioned retry
|
|
@@ -12,8 +12,8 @@ All three run a named `pikkuScenarioStep` as one durable step. `given` and
|
|
|
12
12
|
identically either way.
|
|
13
13
|
|
|
14
14
|
`then` is a different operation. The phase is what decides how a step's surface
|
|
15
|
-
bindings are treated: for an action, the bindings are
|
|
16
|
-
chosen; for an assertion, they are
|
|
15
|
+
bindings are treated: for an action, the bindings are _alternatives_ and one is
|
|
16
|
+
chosen; for an assertion, they are _witnesses_ and every applicable one runs and
|
|
17
17
|
must agree. So the same step function invoked as `when` and as `then` executes a
|
|
18
18
|
different number of times against a different number of surfaces.
|
|
19
19
|
|
|
@@ -14,11 +14,11 @@ a directory listing which files ship and which files test.
|
|
|
14
14
|
|
|
15
15
|
So `validate` requires the declaration to be in a file named for what it is:
|
|
16
16
|
|
|
17
|
-
| declaration
|
|
18
|
-
|
|
|
19
|
-
| `pikkuScenario`, `pikkuFeature`
|
|
20
|
-
| `pikkuScenarioStep` and its platform/addon variants | `*.steps.ts` (or the above)
|
|
21
|
-
| `definePersonas`, `runVirtualUser`
|
|
17
|
+
| declaration | file |
|
|
18
|
+
| --------------------------------------------------- | --------------------------------- |
|
|
19
|
+
| `pikkuScenario`, `pikkuFeature` | `*.scenario.ts`, `*.scenarios.ts` |
|
|
20
|
+
| `pikkuScenarioStep` and its platform/addon variants | `*.steps.ts` (or the above) |
|
|
21
|
+
| `definePersonas`, `runVirtualUser` | `*.virtual-user.ts`, `*.vu.ts` |
|
|
22
22
|
|
|
23
23
|
Three suffixes for scenarios rather than one, because the split that matters is
|
|
24
24
|
scenarios apart from application code, not a particular spelling — `.steps.ts`
|
package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Speech synthesis picks a voice per sentence but announces a limitation once
|
|
4
4
|
description: A bilingual reply should speak the half it can, and repeating the notice for every sentence would bury the reply itself
|
|
5
|
-
tags: core,
|
|
5
|
+
tags: core, agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Speech synthesis picks a voice per sentence, and warns once per reply
|
package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md
CHANGED
|
@@ -8,7 +8,7 @@ tags: core, actor-flow
|
|
|
8
8
|
# The actor's instructions say the word "json"
|
|
9
9
|
|
|
10
10
|
Every call the actor makes wants a schema'd object back. A gateway that cannot
|
|
11
|
-
accept a JSON
|
|
11
|
+
accept a JSON _schema_ degrades to OpenAI's `json_object` response mode, and
|
|
12
12
|
that mode refuses the request outright — a hard API error, not a bad answer —
|
|
13
13
|
unless the literal word "json" appears somewhere in the prompt.
|
|
14
14
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: The agent `done` event goes through the middleware and is awaited
|
|
4
4
|
description: `done` is the only end-of-reply signal a stream hook gets, and buffering hooks flush on it — sending it raw discards work already paid for
|
|
5
|
-
tags: core,
|
|
5
|
+
tags: core, agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# The agent `done` event goes through the middleware and is awaited
|
|
@@ -9,7 +9,7 @@ tags: core, api
|
|
|
9
9
|
|
|
10
10
|
`public-surface.json` records `Object.keys(module)` for every entry point. That
|
|
11
11
|
is a real guard — it caught a new `./node-host-resolver` subpath and five
|
|
12
|
-
renames during a rebase — but it only sees
|
|
12
|
+
renames during a rebase — but it only sees _names_.
|
|
13
13
|
|
|
14
14
|
It cannot see:
|
|
15
15
|
|
package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md
CHANGED
|
@@ -1,11 +1,49 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: decision
|
|
3
|
-
title:
|
|
4
|
-
description:
|
|
3
|
+
title: One door per name — the ecosystem tier and the package root are both gone
|
|
4
|
+
description: the adapter surface was split onto @pikku/core/ecosystem to keep a stability promise at the root; publishing every module twice cost more than the promise was worth, so both the facades and the root barrel were deleted
|
|
5
5
|
tags: core, api
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
#
|
|
8
|
+
# One door per name
|
|
9
|
+
|
|
10
|
+
**Reversed.** The section below records why `@pikku/core/ecosystem` existed; it
|
|
11
|
+
is kept because the stability argument that produced it is still true and still
|
|
12
|
+
constrains what the subpaths may promise. What changed is the mechanism.
|
|
13
|
+
|
|
14
|
+
## What holds now
|
|
15
|
+
|
|
16
|
+
Every name lives on the subpath that owns the module it comes from, and every
|
|
17
|
+
import carries that subpath: `@pikku/core/http`, `@pikku/core/services`,
|
|
18
|
+
`@pikku/core/errors`, `@pikku/core/types`. There is no second specifier for the
|
|
19
|
+
same module and no package root — `.` resolves to a bootstrap shim, not an entry
|
|
20
|
+
point.
|
|
21
|
+
|
|
22
|
+
The facades did not survive contact with their own premise. `ecosystem/http`
|
|
23
|
+
re-exported `./http`, so a name was reachable through either door; every
|
|
24
|
+
addition had to be made twice, they drifted (25 names had accumulated in the
|
|
25
|
+
facade tier with no raw home, and about 26 more sat under a different area than
|
|
26
|
+
the module they came from), and a consumer's import told you nothing about what
|
|
27
|
+
it used. The package root was the same failure at a larger scale: 206 names in
|
|
28
|
+
one barrel that no bundler could take apart.
|
|
29
|
+
|
|
30
|
+
The stability distinction the split was built to express is now carried by
|
|
31
|
+
`public-surface.json` and `api-report.md`, which pin what each entry point
|
|
32
|
+
exports. Moving a symbol across an area boundary is still a visible diff; it
|
|
33
|
+
just no longer requires a parallel tree of re-export files to be visible.
|
|
34
|
+
|
|
35
|
+
Two modules survive at the old specifiers and are not entry points:
|
|
36
|
+
`bootstrap-compat/root.ts` and `bootstrap-compat/ecosystem.ts` exist because
|
|
37
|
+
`packages/cli` is generated by the published CLI pinned in its `build.sh`, which
|
|
38
|
+
still emits `@pikku/core/ecosystem` and a bare `@pikku/core`. A test pins their
|
|
39
|
+
exact contents so neither can grow, and both go when the pin moves to a CLI
|
|
40
|
+
released from this branch.
|
|
41
|
+
|
|
42
|
+
**What this rules out:** re-introducing any specifier that re-exports another
|
|
43
|
+
subpath's names. A curated facade over a module that is already published is the
|
|
44
|
+
thing that was tried; adding a name to two places is how it decays.
|
|
45
|
+
|
|
46
|
+
## Why the split existed (superseded)
|
|
9
47
|
|
|
10
48
|
`@pikku/core` has two kinds of consumer. An **application** writes functions and
|
|
11
49
|
wires them: `pikkuFunc`, `wireHTTP`, `PikkuWire`, the error catalogue. A
|
|
@@ -40,19 +78,5 @@ i.e. _the real API_, which is the opposite of the intended signal, and
|
|
|
40
78
|
`packages/runtimes/*` already claims the word while `packages/cli` is the
|
|
41
79
|
largest consumer here at 22 files.
|
|
42
80
|
|
|
43
|
-
`/ecosystem`
|
|
44
|
-
ecosystem — a runtime, a service, an addon, the CLI.
|
|
45
|
-
alias to the same module because the pinned bootstrap CLI still emits it.
|
|
46
|
-
|
|
47
|
-
Nothing was deleted. What stayed public is what applications actually
|
|
48
|
-
hand-write: `addTagMiddleware` (8 files), `addGlobalPermission`, `fetch` (31),
|
|
49
|
-
`wireAddon`, and the authoring helpers.
|
|
50
|
-
|
|
51
|
-
**What this rules out:** re-exporting anything from `/internal` at the package
|
|
52
|
-
root for convenience. The split is the whole point — `/internal` may change in
|
|
53
|
-
any release, and the root may not. It also rules out treating `/internal` as
|
|
54
|
-
private: it is a published entry point that runtime authors are expected to use,
|
|
55
|
-
just without the compatibility guarantee.
|
|
56
|
-
|
|
57
|
-
`public-surface.json` pins both, so moving a symbol across the line is a visible
|
|
58
|
-
diff rather than an accident.
|
|
81
|
+
`/ecosystem` said the true thing: you are building a package in the Pikku
|
|
82
|
+
ecosystem — a runtime, a service, an addon, the CLI.
|
|
@@ -24,6 +24,6 @@ same call.
|
|
|
24
24
|
|
|
25
25
|
**What this rules out:** adding a per-call `model` parameter, collapsing
|
|
26
26
|
`embedDocuments` and `embedQuery` into one `embed`, and pointing a vector store
|
|
27
|
-
at `
|
|
27
|
+
at `AgentRunnerService.embed` / `embedMany` instead — those take a per-call
|
|
28
28
|
model on purpose and drag in the whole agent-runner tool loop, and they give back
|
|
29
29
|
neither guarantee.
|
|
@@ -11,16 +11,16 @@ tags: core, rpc, performance
|
|
|
11
11
|
an object literal, and that literal declared `get agent()` so the agent facade
|
|
12
12
|
stayed lazy — most requests never touch it, and reading it builds five closures.
|
|
13
13
|
|
|
14
|
-
The laziness is right. Declaring the accessor
|
|
14
|
+
The laziness is right. Declaring the accessor _on the literal_ was not: a
|
|
15
15
|
literal containing an accessor needs a real property descriptor per instance,
|
|
16
16
|
which takes it off V8's fast object-literal construction path and slows the
|
|
17
17
|
whole object, not just the accessor.
|
|
18
18
|
|
|
19
19
|
Measured with `benchmarks/bench-profile-granular.ts`, three runs each:
|
|
20
20
|
|
|
21
|
-
| shape
|
|
22
|
-
|
|
|
23
|
-
| object literal with `get agent()`
|
|
21
|
+
| shape | per call |
|
|
22
|
+
| ----------------------------------- | ------------------------ |
|
|
23
|
+
| object literal with `get agent()` | 1.106 / 1.433 / 1.147 µs |
|
|
24
24
|
| class with `agent` on the prototype | 0.523 / 0.461 / 0.525 µs |
|
|
25
25
|
|
|
26
26
|
Roughly 2.4×, well outside the run-to-run variance, on a path every request
|
|
@@ -28,7 +28,7 @@ takes. On the same machine a full `fetchData` measures 12–19µs, so this was o
|
|
|
28
28
|
the order of a tenth of a request spent constructing one object.
|
|
29
29
|
|
|
30
30
|
The obvious alternative is worse. Making `agent` an eager property removes the
|
|
31
|
-
accessor but builds those five closures unconditionally, and measured
|
|
31
|
+
accessor but builds those five closures unconditionally, and measured _slower_
|
|
32
32
|
than the original at 1.967µs. A prototype accessor is the only shape that keeps
|
|
33
33
|
the laziness and the fast construction path.
|
|
34
34
|
|
|
@@ -9,7 +9,7 @@ tags: core, services
|
|
|
9
9
|
|
|
10
10
|
`HttpPersona`, `createHttpPersonas`, `readScenarioHttpResponse` and
|
|
11
11
|
`postScenarioJson` are exported from `@pikku/core/persona`, not from
|
|
12
|
-
`@pikku/core/services`. Their
|
|
12
|
+
`@pikku/core/services`. Their _types_ are re-exported freely — TypeScript erases
|
|
13
13
|
those and they cost a bundle nothing.
|
|
14
14
|
|
|
15
15
|
The values are different. They reach `http-personas`, which reaches the
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: A voice turn's transcript is sent before the run starts, on the raw channel
|
|
4
4
|
description: The client does not know what it said, and an answer starts streaming within a few hundred milliseconds — a question arriving after its answer reads as the wrong question
|
|
5
|
-
tags: core,
|
|
5
|
+
tags: core, agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# A voice turn's transcript is sent ahead of the run
|
|
@@ -10,7 +10,7 @@ tags: core, ai-agent
|
|
|
10
10
|
A voice client sends audio, so it does not know what it said. Until the
|
|
11
11
|
transcript reaches it, its own message renders as a blank bubble.
|
|
12
12
|
|
|
13
|
-
The event is sent
|
|
13
|
+
The event is sent _before_ the run rather than alongside it because the answer
|
|
14
14
|
begins streaming within a few hundred milliseconds. Sent concurrently, the
|
|
15
15
|
transcript routinely lands after the first tokens of its own answer — and a
|
|
16
16
|
question that appears beneath its answer reads as a question about something
|
package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md
CHANGED
|
@@ -7,7 +7,7 @@ tags: core, virtual-user
|
|
|
7
7
|
|
|
8
8
|
# The worker disposition is the only one not testing anything
|
|
9
9
|
|
|
10
|
-
Every other disposition exists to probe the product. The worker exists to
|
|
10
|
+
Every other disposition exists to probe the product. The worker exists to _use_
|
|
11
11
|
it, which changes every parameter: it abandons rarely, runs at a low temperature,
|
|
12
12
|
and is instructed to stop and report rather than guess its way past an obstacle.
|
|
13
13
|
|
package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Thread history records what the model was asked, which for a spoken turn is the transcript
|
|
4
4
|
description: The wire carried a base64 audio blob; persisting it writes megabytes of unreadable data and loses the only readable record of the turn
|
|
5
|
-
tags: core,
|
|
5
|
+
tags: core, agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Thread history records the transcript, not the audio that arrived
|
|
@@ -13,7 +13,7 @@ carried a base64 audio blob, and `voiceInput` replaced it with a transcript
|
|
|
13
13
|
before the model ever saw it.
|
|
14
14
|
|
|
15
15
|
Persisting the blob would write megabytes of unreadable data into the history
|
|
16
|
-
|
|
16
|
+
_and_ discard the only readable record of what was said — the worst of both.
|
|
17
17
|
|
|
18
18
|
Both the streaming and non-streaming paths do this, and both check identity
|
|
19
19
|
rather than assuming: a middleware is free to rewrite the message list into
|
|
@@ -10,7 +10,7 @@ tags: cli, validate, addons
|
|
|
10
10
|
`pikku workspace validate` was named after one of the things a repo can be.
|
|
11
11
|
Adding a second — "is this addon publishable" — invited a second command,
|
|
12
12
|
`pikku addon validate`, and that is where the naming falls apart: the addons
|
|
13
|
-
repo is a workspace
|
|
13
|
+
repo is a workspace _containing_ 217 publishable addons. Standing at its root,
|
|
14
14
|
`pikku addon validate` would have to refuse or sweep every package, at which
|
|
15
15
|
point it is doing the workspace thing anyway. The two nouns were never
|
|
16
16
|
alternatives.
|
|
@@ -67,7 +67,7 @@ and the published packages had drifted from it with nothing watching.
|
|
|
67
67
|
## The check walks whichever generated directory a package ships
|
|
68
68
|
|
|
69
69
|
`dist/.pikku` is the target shape (below), but the check cannot assume it: the
|
|
70
|
-
shape is what this work moved addons
|
|
70
|
+
shape is what this work moved addons _to_, and a package that has not moved —
|
|
71
71
|
or was published before it did — still carries `.pikku` at the root, listed in
|
|
72
72
|
`files` and mapped by `exports` as `./.pikku/*`. There it is a public entry
|
|
73
73
|
point rather than build input, and its imports climb one level fewer — to
|
|
@@ -100,7 +100,7 @@ workspace link and none of it resolved on install.
|
|
|
100
100
|
## Only a package that publishes gets the dist shape
|
|
101
101
|
|
|
102
102
|
The shape describes a tarball, so it means nothing for a `private` package —
|
|
103
|
-
and applying it there actively breaks: `exports`
|
|
103
|
+
and applying it there actively breaks: `exports` _is_ enforced across a
|
|
104
104
|
workspace link, so repointing a private fixture at `dist` makes every consumer
|
|
105
105
|
demand a directory that only a build produces. The three `verifiers/db-schema`
|
|
106
106
|
and `verifiers/addon-registry` fixtures have no build script at all, so `dist`
|
|
@@ -18,4 +18,4 @@ costs work to reproduce a fact that already holds.
|
|
|
18
18
|
|
|
19
19
|
**What this rules out:** "correcting" this to a topological walk because a graph
|
|
20
20
|
is present. The graph describes execution; the catalogue describes what the
|
|
21
|
-
scenario
|
|
21
|
+
scenario _says_, and those are read in declaration order.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Only an explicit `false` silences a spoken reply
|
|
4
4
|
description: The key being absent means no voice input is wired and nothing reported either way, so those callers keep the behaviour they had before the option existed
|
|
5
|
-
tags: core,
|
|
5
|
+
tags: core, agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Only an explicit `false` silences a spoken reply
|
package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md
CHANGED
|
@@ -9,7 +9,7 @@ tags: services
|
|
|
9
9
|
|
|
10
10
|
`pikkuWebhookWorkerFunc` (`packages/core/src/services/queue-webhook-service.ts`)
|
|
11
11
|
POSTs the delivery, then — when the job carries a `deliveryId` — calls
|
|
12
|
-
`webhookService.recordAttempt` with the outcome
|
|
12
|
+
`webhookService.recordAttempt` with the outcome _before_ throwing on a non-2xx.
|
|
13
13
|
The throw is what makes the queue retry, so recording first is the only way the
|
|
14
14
|
console's delivery history shows every try rather than just the final one.
|
|
15
15
|
|
|
@@ -16,7 +16,7 @@ output at `unknown`, because one map has to hold every trigger in the app.
|
|
|
16
16
|
|
|
17
17
|
Handing `CoreTriggerSource<TInput, TOutput>` to a slot typed
|
|
18
18
|
`CoreTriggerSource<unknown, unknown>` is not an upcast. `func` takes its input
|
|
19
|
-
as a
|
|
19
|
+
as a _parameter_, and parameters are contravariant: a function that accepts
|
|
20
20
|
`TInput` cannot stand in for one that accepts `unknown`, since `unknown` admits
|
|
21
21
|
values `TInput` does not. TypeScript is right to reject it, and no variance
|
|
22
22
|
annotation makes it go away — the registry genuinely holds functions whose input
|
|
@@ -14,7 +14,7 @@ deadline. A duplicate, late, or entirely dropped timer therefore all produce the
|
|
|
14
14
|
same answer, and losing the wake costs liveness — the run sits until something
|
|
15
15
|
else resumes it — never correctness.
|
|
16
16
|
|
|
17
|
-
`scheduleRunWake` deliberately enqueues a delayed
|
|
17
|
+
`scheduleRunWake` deliberately enqueues a delayed _orchestrator_ pass rather
|
|
18
18
|
than reusing `scheduleSleep`. `scheduleSleep` resolves the step it is given,
|
|
19
19
|
which for an approval would resolve the gate itself; the wake only nudges the
|
|
20
20
|
run to replay and re-evaluate, leaving the gate the sole judge of its own
|
|
@@ -20,7 +20,7 @@ driver written against an earlier version keeps compiling; the runner treats a
|
|
|
20
20
|
driver without them as one offering no isolation and no diagnostics.
|
|
21
21
|
`captureFailure` must never throw — a failure to capture must not replace the
|
|
22
22
|
failure being captured — and exists because a browser step fails with a selector
|
|
23
|
-
timeout that says nothing about
|
|
23
|
+
timeout that says nothing about _why_ the page never rendered; the answer is
|
|
24
24
|
almost always in the page's own console and request errors, which the driver has
|
|
25
25
|
been collecting all along.
|
|
26
26
|
|
|
@@ -18,7 +18,7 @@ The failure path is equally deliberate. `WorkflowAsyncException`,
|
|
|
18
18
|
`WorkflowCancelledException`, `WorkflowSuspendedException` and
|
|
19
19
|
`WorkflowDispatchException` are all excluded from the "mark the run failed"
|
|
20
20
|
branch: the first three already recorded their own status, and the fourth is
|
|
21
|
-
transient. When a run does fail, an
|
|
21
|
+
transient. When a run does fail, an _expected_ error (a `PikkuError`, e.g. a
|
|
22
22
|
build gate tripping) logs only its message — the message is the whole story, and
|
|
23
23
|
the `expected` flag survives the step-boundary rehydration that strips the
|
|
24
24
|
class. Anything else is logged in full so the trace is there to debug.
|
package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md
CHANGED
|
@@ -26,7 +26,7 @@ plus the version and variant bit twiddling) rather than pulled from the `uuid`
|
|
|
26
26
|
package, and `workflow-invocation-id.test.ts` pins it against the known
|
|
27
27
|
`www.example.com`-in-DNS-namespace vector.
|
|
28
28
|
|
|
29
|
-
Calling the same step name more than once in a run
|
|
29
|
+
Calling the same step name more than once in a run _is_ disambiguated. Ordinals
|
|
30
30
|
are already in: `nextStepKey` (`pikku-workflow-service.ts`) mints a physical key
|
|
31
31
|
per reach — `name`, then `name#1`, `name#2` — and every step entry point routes
|
|
32
32
|
through it, so `deriveInvocationId` hashes the physical key, not the logical
|
package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md
CHANGED
|
@@ -15,7 +15,7 @@ available to it without becoming public API on every workflow service a
|
|
|
15
15
|
production app instantiates.
|
|
16
16
|
|
|
17
17
|
The reason it is not a subclass is bundle size: a bundler drops an unused
|
|
18
|
-
|
|
18
|
+
_module_ but never an unused class member. Anything declared on
|
|
19
19
|
`PikkuWorkflowService` ships in every server built on Pikku, along with
|
|
20
20
|
everything it imports. `PikkuScenarioService` (`pikku-scenario-service.ts`) is
|
|
21
21
|
the one implementation today — steps, actors, lifecycle hooks, the browser
|
package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md
CHANGED
|
@@ -7,7 +7,7 @@ tags: workflow
|
|
|
7
7
|
|
|
8
8
|
# The workflow run timeline is a pure fold over durable history, with the row's status as the authority
|
|
9
9
|
|
|
10
|
-
`run-timeline.ts` turns `getRunHistory` — one row per step
|
|
10
|
+
`run-timeline.ts` turns `getRunHistory` — one row per step _attempt_, each with
|
|
11
11
|
lifecycle timestamps — into a flat, chronologically ordered event stream, and
|
|
12
12
|
folds that stream up to any point to recover what the run "knew" then: the same
|
|
13
13
|
step cache a replay would hold, plus the walked path. Both functions are pure,
|
|
@@ -30,11 +30,15 @@ caller, who is the only one who knows what was being waited for. Its own
|
|
|
30
30
|
defaults are shorter than the assertion wrappers': `within` 15s, `interval`
|
|
31
31
|
250ms.
|
|
32
32
|
|
|
33
|
-
`
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
`requireScenarioEnv` (`scenario-step-guards.ts`) exists for the mirror-image
|
|
34
|
+
reason: `env` is optional on the step wire because most steps need nothing from
|
|
35
|
+
it, so the narrowing happens in one place with a message that says what to do,
|
|
36
|
+
instead of every step file writing its own guard. The actor is not narrowed at
|
|
37
|
+
all — a step that runs as somebody declares `actor: true` (or a `browser`
|
|
38
|
+
binding, which cannot be provisioned without a window to open), and the runner
|
|
39
|
+
injects `wire.actor` non-optionally into every binding and refuses to dispatch
|
|
40
|
+
the step without one. A wire member can be required per binding; a property of
|
|
41
|
+
one cannot, which is why it is not on `scenarioStep`. `scenarioStep`'s `verifyStepName` call doubles as the guard for `then`
|
|
38
42
|
being a wire member — an accidental `await scenario` calls it with a resolve
|
|
39
43
|
function, which lands as a loud named error instead of a silent hang.
|
|
40
44
|
|
package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md
CHANGED
|
@@ -25,7 +25,7 @@ saying which phase it happened in.
|
|
|
25
25
|
suspended or waiting and teardown would fire mid-flight. When the scenario has
|
|
26
26
|
already failed for its own reason, an `after`-hook failure is attached as
|
|
27
27
|
`cause` and logged rather than replacing the headline; only a teardown failure
|
|
28
|
-
after a
|
|
28
|
+
after a _passing_ scenario fails the run.
|
|
29
29
|
|
|
30
30
|
At the feature level (`workflow.types.ts`, `CoreFeature`), hooks run once around
|
|
31
31
|
the whole group — `before → a → b → c → after` — not per scenario. That is the
|
|
@@ -15,7 +15,7 @@ ran it.
|
|
|
15
15
|
|
|
16
16
|
It earns its keep when the durable step name was built at runtime. A scenario
|
|
17
17
|
step called in a loop reaches the run as, say, `sees @pikku/addon-todos` while
|
|
18
|
-
it was declared as
|
|
18
|
+
it was declared as `sees ${packageName}`; the recorded step-function name is
|
|
19
19
|
then the only way to join that row back to its declaration. `inlineStep` also
|
|
20
20
|
records the `data` the step was called with for the same reason: a reporter
|
|
21
21
|
renders each step's prose from it, so two calls to one step stay
|
|
@@ -23,7 +23,7 @@ distinguishable by what they were asked to check.
|
|
|
23
23
|
|
|
24
24
|
Step lineage is recorded alongside it. `fromStepName` is the predecessor that
|
|
25
25
|
scheduled a step — the walked transition — captured by `rpcStep`/`inlineStep`
|
|
26
|
-
|
|
26
|
+
_before_ `nextStepKey` advances the lineage, and surfaced to a step as
|
|
27
27
|
`fromInvocationId`. In a cyclic graph `a → b → a → c`, the second `a` therefore
|
|
28
28
|
carries `b`'s id, which is what lets the walked path be reconstructed from the
|
|
29
29
|
chain alone.
|
|
@@ -28,7 +28,7 @@ one key per gate means two gates resolving concurrently cannot clobber each
|
|
|
28
28
|
other through a read-modify-write.
|
|
29
29
|
|
|
30
30
|
One consequence to know about: `approveStep`'s optional `reason` argument
|
|
31
|
-
addresses the
|
|
31
|
+
addresses the _first_ reach of a gate only. If a gate is reached again on a
|
|
32
32
|
later loop iteration, `nextStepKey` gives that row a `#N` suffix, and there is
|
|
33
33
|
currently no way for a caller to name it.
|
|
34
34
|
|
|
@@ -24,7 +24,7 @@ impossible rather than merely reported: secrets are resolved where things are
|
|
|
24
24
|
constructed — `pikkuServices`, `pikkuWireServices`, addon service factories,
|
|
25
25
|
middleware — and the function is handed the configured client.
|
|
26
26
|
|
|
27
|
-
The cost is that a function which needs to
|
|
27
|
+
The cost is that a function which needs to _ask about_ a secret rather than read
|
|
28
28
|
one — "is this key set?", for a readiness or provisioning check — cannot do it
|
|
29
29
|
directly either. It goes through a service that holds `secrets` and exposes only
|
|
30
30
|
that question, which is how `@pikku/addon-console` checks whether an installed
|
package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md
CHANGED
|
@@ -11,7 +11,7 @@ tags: workflow
|
|
|
11
11
|
off the queue message and hands it to `executeWorkflowStep`. That call runs as
|
|
12
12
|
the run's owner — `invokeStepRpc` copies `run.wire.pikkuUserId` onto the wire —
|
|
13
13
|
and `rpcWithWire` does not apply the `expose` gate that the public `/rpc` route
|
|
14
|
-
applies. So the message decided both
|
|
14
|
+
applies. So the message decided both _what_ ran and _as whom_.
|
|
15
15
|
|
|
16
16
|
The claim in `executeWorkflowStepInner` read the step's status and nothing else;
|
|
17
17
|
there was no stored function name to compare against. `StepState` now carries
|
|
@@ -11,11 +11,10 @@ tags: core, virtual-user
|
|
|
11
11
|
platform and addon steps, from what a virtual user may call.
|
|
12
12
|
|
|
13
13
|
For scenario bodies the argument is only efficiency: they are held out of every
|
|
14
|
-
deployed unit and are not network-callable, so offering one wastes a turn on a
|
|
15
|
-
404.
|
|
14
|
+
deployed unit and are not network-callable, so offering one wastes a turn on a 404.
|
|
16
15
|
|
|
17
16
|
For a platform or addon step the argument is the oracle itself. A virtual user's
|
|
18
|
-
findings are worth something
|
|
17
|
+
findings are worth something _because_ it cannot manufacture the outcomes it is
|
|
19
18
|
meant to discover. A user that could invoke "Stripe's webhook arrives" forges its
|
|
20
19
|
own payment success, and every finding downstream of that forgery is worthless —
|
|
21
20
|
not merely unreliable, but actively misleading, because it looks like evidence.
|
package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md
CHANGED
|
@@ -15,7 +15,7 @@ header even though the response was a 2xx.
|
|
|
15
15
|
A cookie jar cannot answer "did sign-in happen". A target app may set a cookie on
|
|
16
16
|
any request — a CSRF token, an anonymous session, a locale — so a non-empty jar
|
|
17
17
|
after a failed or skipped sign-in looks exactly like a successful one. What
|
|
18
|
-
actually proves a session was established is
|
|
18
|
+
actually proves a session was established is _this_ response setting a cookie. A
|
|
19
19
|
2xx alone is not enough either: an endpoint that returns 200 while quietly
|
|
20
20
|
declining to issue a session would leave the actor running every subsequent
|
|
21
21
|
request unauthenticated, and the scenario would report the resulting refusals as
|
|
@@ -18,7 +18,7 @@ it is closed the same way: `runPikkuFunc` resolves both from the addon config.
|
|
|
18
18
|
`auth` merges as an OR and `auth: false` is ignored. The RPC path treats it as a
|
|
19
19
|
default (`addonConfig?.auth ?? options.requiresAuth`) because there the addon
|
|
20
20
|
config is the only statement of intent. On a direct wiring the route already
|
|
21
|
-
carries its own `auth`, so honouring `false` would let an addon
|
|
21
|
+
carries its own `auth`, so honouring `false` would let an addon _weaken_ a gate
|
|
22
22
|
the app wrote — the inverse of what a wiring-level declaration should be able to
|
|
23
23
|
do. An addon may require a session the wiring did not; it may never waive one
|
|
24
24
|
the wiring did.
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Only a Symbol-branded framework result can request tool approval
|
|
4
4
|
description: Approval markers are trusted from the APPROVAL_REQUIRED Symbol on a forwardsApproval tool, never from a JSON key an LLM could emit
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Only a Symbol-branded framework result can request tool approval
|
|
9
9
|
|
|
10
10
|
`checkForApprovals` in
|
|
11
|
-
`packages/core/src/wirings/
|
|
11
|
+
`packages/core/src/wirings/agent/agent-stream.ts` honours a forwarded
|
|
12
12
|
approval only when both hold: the tool declares `forwardsApproval` (set solely by
|
|
13
13
|
framework code on the sub-agent delegating tools built in
|
|
14
|
-
`
|
|
14
|
+
`agent-prepare.ts`), and its result carries the `APPROVAL_REQUIRED` unique
|
|
15
15
|
Symbol. The companion `__approvalRequired` string key exists for transport, but
|
|
16
16
|
is never what the decision reads.
|
|
17
17
|
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Credential requests are trusted only when Symbol-branded
|
|
4
4
|
description: The string key is a wire field; the Symbol is the capability, and only core can mint it
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Credential requests are trusted only when Symbol-branded
|
|
9
9
|
|
|
10
10
|
A tool result asking the run to suspend and prompt for a credential is honoured
|
|
11
11
|
only when it carries the `CREDENTIAL_REQUIRED` Symbol minted in
|
|
12
|
-
`
|
|
12
|
+
`agent-prepare.ts`. `checkForCredentialRequests` in `agent-stream.ts`
|
|
13
13
|
tests for that Symbol, never for the `__credentialRequired` string key that
|
|
14
14
|
travels beside it on the wire.
|
|
15
15
|
|
|
@@ -24,7 +24,7 @@ primitive inside the product's own UI. This mirrors the `APPROVAL_REQUIRED`
|
|
|
24
24
|
brand, which exists for the identical reason one function over.
|
|
25
25
|
|
|
26
26
|
The brand survives because the object is passed by reference the whole way —
|
|
27
|
-
core's `buildToolDefs` wrapper returns it, the Vercel adapter's `
|
|
27
|
+
core's `buildToolDefs` wrapper returns it, the Vercel adapter's `agentTool` hands
|
|
28
28
|
it back verbatim, and the AI SDK puts the raw value on the stream part rather
|
|
29
29
|
than the JSON form it builds separately for the model.
|
|
30
30
|
|
|
@@ -33,5 +33,5 @@ result` for convenience, or introducing any path where a credential request is
|
|
|
33
33
|
reconstructed from parsed JSON rather than passed by reference — either one
|
|
34
34
|
silently converts the gate into a formality. Note the inverse holds for the
|
|
35
35
|
`credentialFilteredChannel` suppression later in the same file: that one
|
|
36
|
-
deliberately matches the
|
|
36
|
+
deliberately matches the _string_ key, because it hides tool results from the
|
|
37
37
|
client and a broader match leaks less, not more.
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: An agent requires a session only when auth is true, but always enforces scopes and permissions
|
|
4
4
|
description: Agents follow pikkuSessionlessFunc semantics so crons and queue workers can run them; scopes are an AND gate checked before any permission I/O
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# An agent requires a session only when auth is true, but always enforces scopes and permissions
|
|
9
9
|
|
|
10
10
|
`assertAgentAuthorized` in
|
|
11
|
-
`packages/core/src/wirings/
|
|
12
|
-
session presence (only when `
|
|
11
|
+
`packages/core/src/wirings/agent/agent-prepare.ts` enforces, in order:
|
|
12
|
+
session presence (only when `CoreAgent.auth === true`), then `scopes`, then
|
|
13
13
|
`permissions`. The ordering mirrors the function runner — scopes AND together so
|
|
14
14
|
they can only narrow access, and a missing scope short-circuits before any
|
|
15
15
|
permission function does I/O. Declared `scopes` are narrowed to the generated
|
|
16
|
-
`ScopeId` union in a project's
|
|
16
|
+
`ScopeId` union in a project's `#pikku/scopes`, so an undeclared scope is a
|
|
17
17
|
compile error.
|
|
18
18
|
|
|
19
19
|
`auth` defaults to `false` (i.e. `pikkuSessionlessFunc`, not `pikkuFunc`) because
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: An agent ownership failure never echoes the resource it refused
|
|
4
4
|
description: assertResourceOwner throws a bare ForbiddenError so the error cannot be used as an existence oracle, at the cost of thinner debugging output
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# An agent ownership failure never echoes the resource it refused
|
|
9
9
|
|
|
10
10
|
`assertResourceOwner` in
|
|
11
|
-
`packages/core/src/wirings/
|
|
11
|
+
`packages/core/src/wirings/agent/agent-prepare.ts` compares a stored
|
|
12
12
|
thread/run `resourceId` against the caller's composed owner key and throws
|
|
13
13
|
`ForbiddenError('Not authorized to access this thread' | '… run')` on a
|
|
14
14
|
mismatch. The message deliberately carries no id.
|