@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
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Resuming a suspended agent run re-runs the agent's authorization gate
|
|
4
4
|
description: Ownership of the run is not enough — a grant revoked while the run was suspended must block the approval
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Resuming a suspended agent run re-runs the agent's authorization gate
|
|
9
9
|
|
|
10
|
-
Both `
|
|
11
|
-
(`
|
|
12
|
-
ownership and before touching `
|
|
10
|
+
Both `resumeAgent` (`agent-stream.ts`) and `resumeAgentSync`
|
|
11
|
+
(`agent-runner.ts`) call `assertAgentAuthorized` after asserting run
|
|
12
|
+
ownership and before touching `agentRunState.resolveApproval`.
|
|
13
13
|
|
|
14
14
|
Ownership proves the run belongs to the caller, not that the caller may still
|
|
15
15
|
act on it: a suspension can outlive the permission that created it, and the whole
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Agent thread ownership fails closed when there is no principal
|
|
4
4
|
description: A sessionless caller gets an ephemeral owner and reaches no stored thread, rather than reaching all of them
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Agent thread ownership fails closed when there is no principal
|
|
9
9
|
|
|
10
10
|
`canAccessThread` returns `false` and `threadOwnerConstraint` returns `[]` when
|
|
11
11
|
the session carries neither `userId` nor `orgId`
|
|
12
|
-
(`packages/core/src/wirings/
|
|
12
|
+
(`packages/core/src/wirings/agent/agent-prepare.ts`).
|
|
13
13
|
`resolveOwnerResourceId` never accepts the client-supplied `resourceId` as an
|
|
14
14
|
ownership key; without a principal it mints an ephemeral `anon-<uuid>` owner
|
|
15
15
|
memoized on the request's params object.
|
|
@@ -17,8 +17,8 @@ memoized on the request's params object.
|
|
|
17
17
|
Agent wirings default to `auth: false`, so "no session" is the common case
|
|
18
18
|
rather than an exotic one. Treating it as "no ownership model to enforce" made
|
|
19
19
|
every ownership check vacuous: a caller named any `resourceId` and reached that
|
|
20
|
-
thread, and because `undefined` on `AgentRunService.listThreads` means
|
|
21
|
-
|
|
20
|
+
thread, and because `undefined` on `AgentRunService.listThreads` means _no
|
|
21
|
+
filter_ rather than _no rows_, a sessionless `getAgentThreads` returned every
|
|
22
22
|
thread in the deployment. The ephemeral owner is what keeps one-shot
|
|
23
23
|
conversations working while denying continuity — it is unguessable, so nothing
|
|
24
24
|
stored can be reached, and it is stable within a request, so a sub-agent
|
|
@@ -32,7 +32,7 @@ field, never in its body.
|
|
|
32
32
|
|
|
33
33
|
**What this rules out:** returning `undefined` from `threadOwnerConstraint` for
|
|
34
34
|
any caller; deriving `owners` from request input instead of the session; reading
|
|
35
|
-
`auth: false` as permission to skip ownership on a
|
|
35
|
+
`auth: false` as permission to skip ownership on a _stored_ thread; and
|
|
36
36
|
persisting the anonymous owner anywhere, which would turn an ephemeral identity
|
|
37
37
|
into a forgeable one. Cross-request thread continuity without a session is not
|
|
38
38
|
available by design — wire a session to get it back. See
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: An agent thread key is always prefixed with the trusted principal
|
|
4
4
|
description: Ownership keys are composed as principal:resourceId, so a client id can sub-divide its own boundary but never widen it
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# An agent thread key is always prefixed with the trusted principal
|
|
9
9
|
|
|
10
|
-
`resolveOwnerResourceId` in `packages/core/src/wirings/
|
|
10
|
+
`resolveOwnerResourceId` in `packages/core/src/wirings/agent/agent-prepare.ts`
|
|
11
11
|
composes the ownership key for a thread or run as `principal:resourceId`. The
|
|
12
12
|
principal is the trusted one — `session.userId` for the default `'user'`
|
|
13
13
|
`SessionScope`, `session.orgId` for `'org'` — and the client-supplied
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: Agent tool permission filtering reads the live function config, not the metadata
|
|
4
4
|
description: The pikkuAuth brand survives only on live permission objects, so a metadata-driven check would silently admit every gated tool
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Agent tool permission filtering reads the live function config, not the metadata
|
|
9
9
|
|
|
10
|
-
`buildToolDefs` in `packages/core/src/wirings/
|
|
10
|
+
`buildToolDefs` in `packages/core/src/wirings/agent/agent-prepare.ts`
|
|
11
11
|
decides which tools and sub-agents to expose to the model by calling
|
|
12
12
|
`checkAuthPermissions` against the permission objects held in the live function
|
|
13
13
|
(or agent) config in `pikkuState`, using the metadata only to learn that a
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: An agent approval is claimed before the tool runs
|
|
4
4
|
description: resolveApproval is a compare-and-swap returning whether this caller won, because the read that precedes it is not a claim and ten concurrent approvals would otherwise mean ten refunds
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# An agent approval is claimed before the tool runs
|
|
@@ -15,7 +15,7 @@ same tool call all observed `suspended`, all snapshotted the same list, and all
|
|
|
15
15
|
reached `execute`. `resolveApproval` returned `void`, so a loser could not even
|
|
16
16
|
tell.
|
|
17
17
|
|
|
18
|
-
`resolveApproval` is now the claim, and returns whether
|
|
18
|
+
`resolveApproval` is now the claim, and returns whether _this_ caller made it.
|
|
19
19
|
The stores implement it as a compare-and-swap: Kysely updates the run row only
|
|
20
20
|
while `status = 'suspended'` and `pendingApprovals` still equals the list it
|
|
21
21
|
read; the tool-call stores move the row off `approvalStatus = 'pending'` and
|
|
@@ -23,7 +23,7 @@ count the rows they changed. Both resume paths run the tool only for the ids the
|
|
|
23
23
|
claimed, and a caller that claimed nothing gets an error rather than a silent
|
|
24
24
|
re-run.
|
|
25
25
|
|
|
26
|
-
The claim is per tool call, not per run, so concurrent approvals of
|
|
26
|
+
The claim is per tool call, not per run, so concurrent approvals of _different_
|
|
27
27
|
tool calls on one run all proceed — which is the case that made a run-level
|
|
28
28
|
`claimSuspendedRun` the worse fit.
|
|
29
29
|
|
|
@@ -11,7 +11,7 @@ An approval gate is asked for so it can be answered for afterwards. "Who
|
|
|
11
11
|
released the funds" is the entire point of four-eyes sign-off, and until this
|
|
12
12
|
change none of it was kept.
|
|
13
13
|
|
|
14
|
-
Run state is where a decision
|
|
14
|
+
Run state is where a decision _waits_, not where it is kept. The record under
|
|
15
15
|
`workflowRuns.state.__approval_<hex>` is overwritten by the next write to that
|
|
16
16
|
key, and cleared outright — `decidedBy: undefined` included — whenever a
|
|
17
17
|
decision is refused on replay. A trail that erases exactly the events worth
|
|
@@ -31,7 +31,7 @@ shape it had before there was anything to record.
|
|
|
31
31
|
|
|
32
32
|
`deleteRun` cascades: `workflowStep` is `onDelete('cascade')` from
|
|
33
33
|
`workflowRuns`, and `workflowStepHistory` from `workflowStep`. Deleting a run
|
|
34
|
-
therefore deletes the sign-off with it — and a
|
|
34
|
+
therefore deletes the sign-off with it — and a _refused_ attempt never reaches a
|
|
35
35
|
step at all, so it was never in that trail to begin with.
|
|
36
36
|
|
|
37
37
|
Every answer — accepted, refused at submission, or cleared on replay — is
|
|
@@ -55,5 +55,5 @@ in `pikkuSchemas`.
|
|
|
55
55
|
**What this rules out:** a dedicated `workflowApprovals` table. It would have to
|
|
56
56
|
be implemented in all seven backends and would still be deleted with the run
|
|
57
57
|
unless it deliberately broke the cascade — at which point it is the audit table
|
|
58
|
-
with extra steps. If approvals later need to be
|
|
58
|
+
with extra steps. If approvals later need to be _queried_ as a first-class
|
|
59
59
|
entity rather than read back from the trail, that is when to revisit.
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: An empty owners constraint matches nothing
|
|
4
4
|
description: owners is an authorization boundary, so every storage backend must treat [] as no rows rather than no filter
|
|
5
|
-
tags:
|
|
5
|
+
tags: agent, storage
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# An empty owners constraint matches nothing
|
|
9
9
|
|
|
10
10
|
Every `AgentRunService.listThreads` implementation returns `[]` immediately when
|
|
11
|
-
`owners` is present and empty — `kysely-
|
|
11
|
+
`owners` is present and empty — `kysely-agent-run-service.ts`,
|
|
12
12
|
`redis-agent-run-service.ts`, `mongodb-agent-run-service.ts`. The conformance
|
|
13
13
|
suite in `packages/core/src/testing/service-tests.ts` pins it, so a new backend
|
|
14
14
|
inherits the requirement instead of rediscovering it.
|
|
@@ -27,4 +27,4 @@ return; the two decisions only hold together.
|
|
|
27
27
|
`if (owners)` path; treating `owners: []` as equivalent to `owners: undefined`
|
|
28
28
|
at any layer; and adding a backend without the conformance suite.
|
|
29
29
|
|
|
30
|
-
See [[
|
|
30
|
+
See [[agent-sessionless-deployments-have-no-thread-ownership]].
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: decision
|
|
3
3
|
title: The console addon's privileged functions gate themselves
|
|
4
4
|
description: Thread listing is owner-scoped unless the caller holds admin, and addon installation requires an admin session, rather than trusting the host to register a global permission
|
|
5
|
-
tags: addon,
|
|
5
|
+
tags: addon, agent, rpc
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# The console addon's privileged functions gate themselves
|
|
@@ -27,14 +27,18 @@ runner's, which for a `pikkuSessionlessFunc` fires only when the function itself
|
|
|
27
27
|
sets `auth: true`.
|
|
28
28
|
|
|
29
29
|
The addon's original authorization story was a single package-scoped
|
|
30
|
-
`addGlobalPermission([isAdmin], '@pikku/addon-console')` that the
|
|
30
|
+
`addGlobalPermission([isAdmin], '@pikku/addon-console')` that the _host_
|
|
31
31
|
registered, which `runPermissions` resolves in the callee's package namespace and
|
|
32
32
|
applies to every function at once. Nothing generated that call — the scaffold
|
|
33
33
|
emitted only a comment recommending it, and `resolveGlobalPermissions` returns an
|
|
34
34
|
empty list when the host registered none, which `runPermissions` treats as
|
|
35
35
|
allow. An app that followed the scaffold and stopped there had a fully open
|
|
36
|
-
console surface.
|
|
37
|
-
instead, which the function runner
|
|
36
|
+
console surface. Every console function now declares its own
|
|
37
|
+
`pikku:console:<area>:<action>` scope instead, which the function runner
|
|
38
|
+
enforces per call. A blanket `wireAddon({ …, scopes: ['admin'] })` stood in for
|
|
39
|
+
that briefly; it is gone, because a single grant covering secrets, source
|
|
40
|
+
editing and the audit trail alike is not something an operator can reason
|
|
41
|
+
about.
|
|
38
42
|
|
|
39
43
|
The two functions whose failure mode is worst still do not depend on any
|
|
40
44
|
package-wide gate:
|
|
@@ -51,16 +55,20 @@ storage backend already treats as no rows.
|
|
|
51
55
|
attacker-chosen package name and write a wiring file into the project. They were
|
|
52
56
|
`pikkuSessionlessFunc` with `auth: false`, which — behind a `no-auth` RPC route
|
|
53
57
|
and with no host global permission — meant an unauthenticated POST reached
|
|
54
|
-
`execFileSync`. They now declare `auth: true` and
|
|
55
|
-
by `verifyScopes` in the
|
|
56
|
-
|
|
57
|
-
not the
|
|
58
|
-
`wireAddon({ name: 'console', package: '@pikku/addon-console' })`
|
|
58
|
+
`execFileSync`. They now declare `auth: true` and
|
|
59
|
+
`scopes: ['pikku:console:addons:install']`, enforced by `verifyScopes` in the
|
|
60
|
+
function runner before the body runs. Both gates are
|
|
61
|
+
checked whether or not the host registered a global permission — an app that
|
|
62
|
+
hand-wires `wireAddon({ name: 'console', package: '@pikku/addon-console' })`
|
|
59
63
|
still cannot reach `execFileSync` unauthenticated.
|
|
60
64
|
|
|
61
|
-
|
|
62
|
-
`wireScope` tree
|
|
63
|
-
functions come from
|
|
65
|
+
The scopes are spelled as literals here because they are scope ids in this
|
|
66
|
+
addon's own `wireScope` tree. The `admin:scopes:*` gates on the scope-admin
|
|
67
|
+
functions come from a different tree — those functions now live in
|
|
68
|
+
`@pikku/addon-admin`, which declares its own. The generated secret and variable
|
|
69
|
+
brokers live in the app's own scaffold rather than the addon, so the addon
|
|
70
|
+
boundary never covered them; they carry `pikku:console:secrets:*` and
|
|
71
|
+
`pikku:console:variables:*` themselves.
|
|
64
72
|
|
|
65
73
|
**What this rules out:** treating the host's `addGlobalPermission` as the only
|
|
66
74
|
gate in front of an operation that installs code or reads another principal's
|
|
@@ -72,5 +80,5 @@ is-this-localhost test.
|
|
|
72
80
|
|
|
73
81
|
See [[addon-scopes-are-resolved-where-the-function-runs]],
|
|
74
82
|
[[an-empty-owners-constraint-matches-nothing]],
|
|
75
|
-
[[
|
|
83
|
+
[[agent-sessionless-deployments-have-no-thread-ownership]] and
|
|
76
84
|
[[global-permissions-and-function-permissions-are-independent-gates]].
|
|
@@ -10,7 +10,7 @@ tags: core
|
|
|
10
10
|
`packages/core/src/utils/safe-fetch.ts` guards every outbound fetch that core
|
|
11
11
|
makes on a caller-supplied URL. `@pikku/core` runs in edge runtimes (Cloudflare
|
|
12
12
|
Workers) that have no Node `dns` module, so the guard cannot resolve a hostname
|
|
13
|
-
and inspect the resulting address. It instead rejects address
|
|
13
|
+
and inspect the resulting address. It instead rejects address _literals_ that are
|
|
14
14
|
obviously internal — loopback, `10/8`, `172.16/12`, `192.168/16`, `0.0.0.0/8`,
|
|
15
15
|
link-local `169.254/16` (the cloud metadata endpoint), IPv6 `::`, `::1`,
|
|
16
16
|
`fe80::/10` and `fc00::/7` — plus the alias forms that reach the same targets:
|
package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md
CHANGED
|
@@ -13,8 +13,8 @@ every `runPikkuFunc` call in the gateway runner, copying `await wire.getSession(
|
|
|
13
13
|
onto `wire.session` when the latter is unset. Gateway middleware is the only
|
|
14
14
|
place a webhook can acquire a session at all — typically by mapping a verified
|
|
15
15
|
platform sender id to a user. Middleware that assigns `wire.session` directly
|
|
16
|
-
needs no help, but the idiomatic `wire.setSession()` writes into the
|
|
17
|
-
wiring'
|
|
16
|
+
needs no help, but the idiomatic `wire.setSession()` writes into the _enclosing
|
|
17
|
+
wiring's_ session service, and the handler's own invocation does not read that
|
|
18
18
|
service.
|
|
19
19
|
|
|
20
20
|
Without the bridge, the failure mode is silent and it fails open in the way that
|
|
@@ -23,7 +23,7 @@ satisfy an admin-only function's requirements, because the two gates are
|
|
|
23
23
|
evaluated independently against separate inputs. An empty or absent group passes,
|
|
24
24
|
so declaring no permissions means "globals only", not "deny".
|
|
25
25
|
|
|
26
|
-
Globals are bucketed per package, and a function reads
|
|
26
|
+
Globals are bucketed per package, and a function reads _both_ the root bucket and
|
|
27
27
|
its own package's — root first. The generated `addGlobalPermission` wrapper takes
|
|
28
28
|
no package argument, so an application's rules only ever land in the root bucket;
|
|
29
29
|
resolving the package bucket alone meant a host rule like "every request needs a
|
package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md
CHANGED
|
@@ -26,11 +26,11 @@ they divide into two kinds, and the difference is what can actually be
|
|
|
26
26
|
prevented rather than merely reported:
|
|
27
27
|
|
|
28
28
|
- **Prevention.** uWebSockets drives `res.onData` itself, so it counts bytes and
|
|
29
|
-
|
|
29
|
+
_drops_ chunks past the limit rather than concatenating, replying 413 before
|
|
30
30
|
routing — the only point at which the buffering can be stopped, which is why
|
|
31
31
|
it deviates from the fetch adapter's 404-an-unmatched-route order. Fastify
|
|
32
32
|
delegates to native `bodyLimit`, set only when `maxBodySize` is configured so
|
|
33
|
-
the default never
|
|
33
|
+
the default never _loosens_ fastify's stricter 1 MB. `PikkuExpressServer`
|
|
34
34
|
feeds the limit into `express.json`/`text`/`urlencoded`.
|
|
35
35
|
- **Rejection only.** `express-middleware` is handed an already-parsed body, so
|
|
36
36
|
its guard makes the rejection uniform but cannot reclaim the memory; a
|
|
@@ -9,13 +9,14 @@ description: Who may do what in core — gates, defaults, and the failures they
|
|
|
9
9
|
A rule about who may do what, and which way it fails when it is unsure.
|
|
10
10
|
|
|
11
11
|
<!-- pikku:knowledge-index -->
|
|
12
|
+
|
|
12
13
|
- [A dropped audit write is always logged](a-dropped-audit-write-is-always-logged.md) — The no-op audit service falls back to the singleton logger when the wire carries none, so an unconfigured audit call is never silent
|
|
13
14
|
- [A function never receives the secret service](a-function-never-receives-the-secret-service.md) — Every function-, permission- and auth-facing services type is bounded by SecretlessServices, so reaching for `secrets` in a function body is a type error rather than a lint
|
|
14
15
|
- [A graph run starts at an entry node the graph declared](a-graph-run-starts-at-an-entry-node-the-graph-declared.md) — startNode may only name a node in meta.entryNodeIds, and no generated route offers it, because otherwise a caller picks which half of the graph to skip
|
|
15
16
|
- [A permission gets a wire it cannot reply on](a-permission-gets-a-wire-it-cannot-reply-on.md) — The permission wire is typed with Out = never so a permission cannot send on the channel; that narrowing is not a subtype, so the call site asserts
|
|
16
17
|
- [A step runs the function the workflow dispatched it with](a-step-runs-the-function-the-workflow-dispatched-it-with.md) — StepState records the step's function name so the worker can reject a queue message naming a different one, because the step executes under the run owner's identity
|
|
17
18
|
- [A virtual user is never offered a scenario, platform or addon step](a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md) — Being able to invoke "the webhook arrives" lets the user manufacture the outcome it exists to discover, which invalidates every finding downstream
|
|
18
|
-
- [A workflow run is read
|
|
19
|
+
- [A workflow run is read and approved by its owner](a-workflow-run-is-read-and-approved-by-its-owner.md) — A run started through a session records that user and only that user may read it or answer its approval gates; a run with no recorded owner has no ownership to enforce
|
|
19
20
|
- [An actor's missing approval decision defaults to denied](actor-flow-missing-approval-decisions-default-to-denied.md) — Every pending tool call gets an explicit decision; an id the persona LLM omitted is denied, so a dropped field can never read as consent
|
|
20
21
|
- [Actor sign-in is proven by Set-Cookie, not a non-empty jar](actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md) — HttpScenarioActor tracks its own signedIn flag and requires the sign-in response itself to set a cookie, because a populated jar proves nothing
|
|
21
22
|
- [Actor sign-in only works for actor-flagged users](actor-sign-in-only-works-for-actor-flagged-users.md) — The scenario actor secret mints sessions for user rows flagged actor and nothing else, so holding it never impersonates a real user
|
|
@@ -31,7 +32,6 @@ A rule about who may do what, and which way it fails when it is unsure.
|
|
|
31
32
|
- [An agent thread key is always prefixed with the trusted principal](ai-agent-thread-ownership-composes-the-session-principal.md) — Ownership keys are composed as principal:resourceId, so a client id can sub-divide its own boundary but never widen it
|
|
32
33
|
- [Agent tool permission filtering reads the live function config, not the metadata](ai-agent-tool-filtering-reads-the-live-function-config.md) — The pikkuAuth brand survives only on live permission objects, so a metadata-driven check would silently admit every gated tool
|
|
33
34
|
- [An agent approval is claimed before the tool runs](an-agent-approval-is-claimed-before-the-tool-runs.md) — resolveApproval is a compare-and-swap returning whether this caller won, because the read that precedes it is not a claim and ten concurrent approvals would otherwise mean ten refunds
|
|
34
|
-
- [An approval answer outlives the run it answered](an-approval-answer-outlives-the-run-it-answered.md) — Run state holds a decision only while the gate is open, so the settled answer carries decidedBy/decidedAt into the step result and every attempt is written to the audit sink, which has no foreign key to the run
|
|
35
35
|
- [An empty owners constraint matches nothing](an-empty-owners-constraint-matches-nothing.md) — owners is an authorization boundary, so every storage backend must treat [] as no rows rather than no filter
|
|
36
36
|
- [An exposed function with no gate is reported at codegen, not at boot](an-exposed-ungated-function-is-a-codegen-warning.md) — The check runs in the inspector where function meta and every wireAddon declaration are both in hand, because neither source alone can tell a gated function from an ungated one
|
|
37
37
|
- [An upload is counted as it arrives, not buffered and then measured](an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md) — Reading the whole body before checking its size hands an unauthenticated caller a way to spend the server's memory
|
|
@@ -61,4 +61,5 @@ A rule about who may do what, and which way it fails when it is unsure.
|
|
|
61
61
|
- [A queued workflow step rehydrates its session from the persisted run wire](workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md) — The queue job payload is just `{ runId }`, so without threading `pikkuUserId` an authed step sees no session and throws
|
|
62
62
|
- [Scenario sessions are isolated per actor and reset between scenarios](workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md) — One jar per actor keeps two personas from sharing a session; a browser reset keeps one scenario from leaving the next signed in as somebody else
|
|
63
63
|
- [A scenario step is never registered as a callable RPC and never dispatched on the queue](workflow-scenario-steps-are-never-network-invocable.md) — A step drives a browser and holds an actor's session, so exposing it as an RPC would put that reach on the network
|
|
64
|
+
|
|
64
65
|
<!-- /pikku:knowledge-index -->
|
package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md
CHANGED
|
@@ -9,7 +9,7 @@ tags: mcp
|
|
|
9
9
|
|
|
10
10
|
`RunMCPEndpointParams.exposeErrors` in
|
|
11
11
|
`packages/core/src/wirings/mcp/mcp-runner.ts` defaults to `!isProduction()`, and
|
|
12
|
-
`runMCPPikkuFunc` checks `exposeErrors && !isProduction()`
|
|
12
|
+
`runMCPPikkuFunc` checks `exposeErrors && !isProduction()` _again_ when building
|
|
13
13
|
the `-32603` internal-error response that carries `{ message, stack }`. The
|
|
14
14
|
second check looks redundant against the default — it is not. The default only
|
|
15
15
|
applies when the caller omits the option; a caller that passes
|
|
@@ -19,10 +19,10 @@ set by whoever enqueues the job. The adapter surfaces it as
|
|
|
19
19
|
The claim is now HMAC-signed at enqueue and verified in `runQueueJob` — see
|
|
20
20
|
[[queue-job-identities-are-signed-at-enqueue]], which supersedes the "any
|
|
21
21
|
producer may name any user" reading below. Everything here still holds for the
|
|
22
|
-
|
|
22
|
+
_authorization_ question: signing proves the producer held the deployment
|
|
23
23
|
secret, not that it was entitled to name that user.
|
|
24
24
|
|
|
25
|
-
There is no re-authentication at the worker boundary — the queue payload
|
|
25
|
+
There is no re-authentication at the worker boundary — the queue payload _is_ the
|
|
26
26
|
credential. Workers run with `auth: false`, so nothing downstream re-checks that
|
|
27
27
|
the producer was entitled to name that user. This is deliberate: the whole point
|
|
28
28
|
is to let a background job resolve the same per-user credentials the original
|
|
@@ -35,5 +35,5 @@ client-supplied field flow into `JobOptions.pikkuUserId` without an authorizatio
|
|
|
35
35
|
check first. It also rules out treating the queue as an authorization boundary —
|
|
36
36
|
do not add a "the worker validated the producer's rights" assumption anywhere
|
|
37
37
|
downstream, and do not drop the id from the wire on the theory that workers are
|
|
38
|
-
unauthenticated anyway. Dropping an id that fails
|
|
38
|
+
unauthenticated anyway. Dropping an id that fails _signature_ verification is a
|
|
39
39
|
different matter and is what the worker now does.
|
package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md
CHANGED
|
@@ -23,7 +23,7 @@ logged or traced. Binding a `credentialId` without a wire that supports
|
|
|
23
23
|
credentials throws rather than falling back to a shared secret.
|
|
24
24
|
|
|
25
25
|
Resolution fails closed. `null` is returned only when no auth is bound at all,
|
|
26
|
-
which is the addon declaring its remote surface public. Once auth
|
|
26
|
+
which is the addon declaring its remote surface public. Once auth _is_ bound, a
|
|
27
27
|
resolved value of `null`, `undefined` or `''` raises `RemoteAddonAuthError` (401)
|
|
28
28
|
instead of dispatching an unauthenticated request that the host might accept as
|
|
29
29
|
anonymous.
|
package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md
CHANGED
|
@@ -16,7 +16,7 @@ dispatcher that cannot know what it dispatches to — wrong the moment one
|
|
|
16
16
|
legitimately public sessionless function exists. For `userAdmin` it was
|
|
17
17
|
redundant: the generated functions are `pikkuFunc` with `scopes:
|
|
18
18
|
['admin:users:list']`, gated twice over already. But for `agent`, `workflow`,
|
|
19
|
-
`events` and `scenarios` it was the
|
|
19
|
+
`events` and `scenarios` it was the _only_ gate, because those generate real
|
|
20
20
|
endpoints the app never authors and has nowhere else to declare a gate for.
|
|
21
21
|
A uniform collapse to boolean would have silently opened four surfaces.
|
|
22
22
|
|
|
@@ -33,7 +33,7 @@ it.
|
|
|
33
33
|
|
|
34
34
|
The object form is also what makes the legacy strings safe to remove. An
|
|
35
35
|
earlier design used `string` for the output path, under which `"no-auth"` would
|
|
36
|
-
have parsed as
|
|
36
|
+
have parsed as _a file named `no-auth`_ — every unmigrated config silently
|
|
37
37
|
producing nonsense instead of failing. With `boolean | object`, a string is
|
|
38
38
|
never valid, so `resolveScaffoldFeature` refuses `'auth'` and `'no-auth'` by
|
|
39
39
|
name and prints the replacement. Coercing them was rejected outright: the value
|
|
@@ -17,7 +17,7 @@ them on every build.
|
|
|
17
17
|
The fix is a declaration — `selfAuthenticated: true` on the function config —
|
|
18
18
|
not analysis of the body. Detection would have to recognise an open-ended set of
|
|
19
19
|
authorization idioms, and it fails in the expensive direction: a body that
|
|
20
|
-
|
|
20
|
+
_looks_ like it checks something silences the warning for a function that
|
|
21
21
|
checks nothing. A declaration cannot be wrong by accident. Someone typed it,
|
|
22
22
|
it is greppable, and it survives into meta where an audit reads it as what it
|
|
23
23
|
is — a claim by a named author, not an inference.
|
|
@@ -13,8 +13,8 @@ requested. `LocalContent` requires a `JWTService` and throws without one; a
|
|
|
13
13
|
verifier with no key available rejects with 403 rather than allowing the
|
|
14
14
|
request, logging once per process so an attacker-triggerable path cannot flood.
|
|
15
15
|
|
|
16
|
-
A signature over `{signedAt, expiresAt, notBefore}` alone proves only
|
|
17
|
-
URL was issued, never
|
|
16
|
+
A signature over `{signedAt, expiresAt, notBefore}` alone proves only _when_ a
|
|
17
|
+
URL was issued, never _what_ it was issued for. Any valid token was a skeleton
|
|
18
18
|
key: swap the pathname from a public thumbnail to a private document and the
|
|
19
19
|
signature still verifies. Timestamps bound the window; only the path binds the
|
|
20
20
|
asset.
|
package/knowledge/index.md
CHANGED
|
@@ -6,7 +6,7 @@ description: Why @pikku/core is built the way it is — the reasoning that used
|
|
|
6
6
|
|
|
7
7
|
# Knowledge
|
|
8
8
|
|
|
9
|
-
Pikku's source says
|
|
9
|
+
Pikku's source says _what_ it does. These notes say _why_, for the handful of
|
|
10
10
|
choices where the code alone reads as arbitrary or, worse, reads as a mistake.
|
|
11
11
|
|
|
12
12
|
The rule that produced this directory: **reasoning never lives in code.** A
|
|
@@ -19,6 +19,8 @@ meta files, the export surface. A note that repeats them is a copy that will
|
|
|
19
19
|
drift.
|
|
20
20
|
|
|
21
21
|
<!-- pikku:knowledge-index -->
|
|
22
|
+
|
|
22
23
|
- [decisions](decisions/index.md) — a rule that was chosen, and what it rules out
|
|
23
24
|
- [questions](questions/index.md) — something asked and not yet answered
|
|
25
|
+
|
|
24
26
|
<!-- /pikku:knowledge-index -->
|
package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md
CHANGED
|
@@ -14,7 +14,7 @@ tags: core, channel
|
|
|
14
14
|
`channel-common.ts` and `channel-handler.ts` — assert across the gap.
|
|
15
15
|
|
|
16
16
|
A factory is `(input: In) => CorePikkuChannelMiddleware`: the author is meant to
|
|
17
|
-
|
|
17
|
+
_call_ it at wiring time and put the result in the array.
|
|
18
18
|
`combineChannelMiddleware` contains no factory-resolution branch, and neither
|
|
19
19
|
does `combineMiddleware` for ordinary middleware — that is consistent and
|
|
20
20
|
deliberate. So a bare, uncalled factory in `channelMiddleware` would be pushed
|
|
@@ -11,6 +11,8 @@ currently makes a choice that nobody has defended — the choice stays, the doub
|
|
|
11
11
|
gets recorded.
|
|
12
12
|
|
|
13
13
|
<!-- pikku:knowledge-index -->
|
|
14
|
+
|
|
14
15
|
- [A channel's middleware list accepts bare factories that nothing ever resolves](channel-middleware-accepts-bare-factories-that-nothing-resolves.md) — CoreChannel.channelMiddleware admits CorePikkuChannelMiddlewareFactory, but no runner calls one, so a bare factory would stall the chain
|
|
15
16
|
- [An unauthorized channel reply is sent outside the channel's declared Out type](unauthorized-channel-replies-escape-the-declared-out-type.md) — processMessageHandlers sends a bare string on auth failure, which no generated client type admits — nobody has decided what the typed shape should be
|
|
17
|
+
|
|
16
18
|
<!-- /pikku:knowledge-index -->
|
package/package.json
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pikku/core",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.86",
|
|
4
4
|
"description": "The Pikku runtime — functions, wirings, services, middleware and types",
|
|
5
5
|
"author": "yasser.fadl@gmail.com",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"module": "dist/index.js",
|
|
8
|
-
"main": "dist/index.js",
|
|
9
7
|
"type": "module",
|
|
10
8
|
"scripts": {
|
|
11
9
|
"tsc": "tsc && tsc -p tsconfig.type-tests.json",
|
|
@@ -21,14 +19,15 @@
|
|
|
21
19
|
"sideEffects": [
|
|
22
20
|
"./dist/errors/errors.js",
|
|
23
21
|
"./dist/wirings/rpc/rpc-runner.js",
|
|
24
|
-
"./dist/wirings/
|
|
22
|
+
"./dist/wirings/addon/remote-addon-auth.js",
|
|
25
23
|
"./dist/wirings/workflow/workflow-approval-policy.js",
|
|
26
24
|
"./dist/wirings/workflow/workflow-errors.js",
|
|
27
25
|
"./dist/wirings/workflow/workflow-run-ownership.js",
|
|
28
26
|
"./dist/wirings/workflow/pikku-scenario-service.js"
|
|
29
27
|
],
|
|
30
28
|
"exports": {
|
|
31
|
-
".": "./dist/
|
|
29
|
+
".": "./dist/bootstrap-compat/root.js",
|
|
30
|
+
"./types": "./dist/types/index.js",
|
|
32
31
|
"./middleware": "./dist/middleware/index.js",
|
|
33
32
|
"./function": "./dist/function/index.js",
|
|
34
33
|
"./channel": "./dist/wirings/channel/index.js",
|
|
@@ -46,11 +45,12 @@
|
|
|
46
45
|
"./scheduler": "./dist/wirings/scheduler/index.js",
|
|
47
46
|
"./trigger": "./dist/wirings/trigger/index.js",
|
|
48
47
|
"./rpc": "./dist/wirings/rpc/index.js",
|
|
48
|
+
"./addon": "./dist/wirings/addon/index.js",
|
|
49
49
|
"./safe-fetch": "./dist/utils/safe-fetch.js",
|
|
50
50
|
"./node-host-resolver": "./dist/utils/node-host-resolver.js",
|
|
51
51
|
"./mcp": "./dist/wirings/mcp/index.js",
|
|
52
|
-
"./
|
|
53
|
-
"./
|
|
52
|
+
"./agent": "./dist/wirings/agent/index.js",
|
|
53
|
+
"./agent-scorer": "./dist/wirings/agent-scorer/index.js",
|
|
54
54
|
"./gateway": "./dist/wirings/gateway/index.js",
|
|
55
55
|
"./cli": "./dist/wirings/cli/index.js",
|
|
56
56
|
"./cli/command-parser": "./dist/wirings/cli/command-parser.js",
|
|
@@ -73,7 +73,9 @@
|
|
|
73
73
|
"./services/temporary-file-service": "./dist/services/temporary-file-service.js",
|
|
74
74
|
"./crypto-utils": "./dist/crypto-utils.js",
|
|
75
75
|
"./hmac": "./dist/utils/hmac.js",
|
|
76
|
-
"./
|
|
76
|
+
"./state": "./dist/pikku-state.js",
|
|
77
|
+
"./classification": "./dist/classification/index.js",
|
|
78
|
+
"./utils": "./dist/utils.js",
|
|
77
79
|
"./schema": "./dist/schema.js",
|
|
78
80
|
"./testing": "./dist/testing/index.js",
|
|
79
81
|
"./dev": "./dist/dev/hot-reload.js"
|
|
@@ -81,19 +83,19 @@
|
|
|
81
83
|
"dependencies": {
|
|
82
84
|
"@standard-schema/spec": "^1.1.0",
|
|
83
85
|
"@types/json-schema": "^7.0.15",
|
|
84
|
-
"cookie": "^
|
|
86
|
+
"cookie": "^2.0.1",
|
|
85
87
|
"json-schema": "^0.4.0",
|
|
86
|
-
"path-to-regexp": "^8.
|
|
88
|
+
"path-to-regexp": "^8.4.2",
|
|
87
89
|
"picoquery": "^2.5.0"
|
|
88
90
|
},
|
|
89
91
|
"devDependencies": {
|
|
90
92
|
"@ag-ui/core": "0.0.57",
|
|
91
|
-
"@types/node": "^24.
|
|
92
|
-
"esbuild": "~0.
|
|
93
|
-
"tsx": "^4.
|
|
93
|
+
"@types/node": "^24.13.3",
|
|
94
|
+
"esbuild": "~0.28.2",
|
|
95
|
+
"tsx": "^4.23.12",
|
|
94
96
|
"typescript": "^6.0.3"
|
|
95
97
|
},
|
|
96
98
|
"engines": {
|
|
97
99
|
"node": ">=24"
|
|
98
100
|
}
|
|
99
|
-
}
|
|
101
|
+
}
|
package/run-tests.sh
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {}
|
|
1
|
+
export {}
|