@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
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { test, describe } from 'node:test'
|
|
2
|
+
import * as assert from 'assert'
|
|
3
|
+
import ts from 'typescript'
|
|
4
|
+
import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs'
|
|
5
|
+
import { dirname, join, relative } from 'node:path'
|
|
6
|
+
import { fileURLToPath } from 'node:url'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `#pikku` is the app tier's only door onto Pikku, and it is a namespace rather
|
|
10
|
+
* than a module: `#pikku/http`, `#pikku/workflow`, one subpath per wiring.
|
|
11
|
+
*
|
|
12
|
+
* The bare specifier used to resolve to `.pikku/pikku-types.gen.ts`, which
|
|
13
|
+
* re-exported all twelve wiring leaves with `export *` — undoing the split the
|
|
14
|
+
* leaves exist for, each of which still says so in its own header ("HTTP-specific
|
|
15
|
+
* type definitions for tree-shaking optimization"). Reaching that barrel put 33
|
|
16
|
+
* distinct `@pikku/core` subpaths into the module graph, and neither of the two
|
|
17
|
+
* consumers could drop them again: bundlers keep `export *` chains because the
|
|
18
|
+
* app declares no `sideEffects`, and Node and tsx do not tree-shake at all, so
|
|
19
|
+
* an app with no queues still executed `@pikku/core/queue` at boot.
|
|
20
|
+
*
|
|
21
|
+
* Deleting the barrel also turns the addon boundary from advice into a rule. An
|
|
22
|
+
* addon's leaves are never generated, so `#pikku/http` fails to resolve at the
|
|
23
|
+
* specifier rather than yielding "no exported member" from a hub that quietly
|
|
24
|
+
* dropped the re-export.
|
|
25
|
+
*/
|
|
26
|
+
const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '../../..')
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Membership is discovered, not listed: every directory holding a
|
|
30
|
+
* `pikku.config.json` is a Pikku project, so a project added later arrives
|
|
31
|
+
* guarded rather than invisible. Listing them by hand is how the ecosystem
|
|
32
|
+
* guard reported green on four packages it had never scanned.
|
|
33
|
+
*/
|
|
34
|
+
const skipped = new Set([
|
|
35
|
+
'node_modules',
|
|
36
|
+
'dist',
|
|
37
|
+
'.pikku',
|
|
38
|
+
'.next',
|
|
39
|
+
'build',
|
|
40
|
+
'.git',
|
|
41
|
+
'coverage',
|
|
42
|
+
])
|
|
43
|
+
|
|
44
|
+
const findProjects = (dir: string, out: string[] = []): string[] => {
|
|
45
|
+
for (const entry of readdirSync(dir)) {
|
|
46
|
+
if (skipped.has(entry)) continue
|
|
47
|
+
const path = join(dir, entry)
|
|
48
|
+
if (!statSync(path).isDirectory()) continue
|
|
49
|
+
if (existsSync(join(path, 'pikku.config.json'))) out.push(path)
|
|
50
|
+
findProjects(path, out)
|
|
51
|
+
}
|
|
52
|
+
return out
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const walk = (dir: string, out: string[] = []): string[] => {
|
|
56
|
+
for (const entry of readdirSync(dir)) {
|
|
57
|
+
if (skipped.has(entry)) continue
|
|
58
|
+
const path = join(dir, entry)
|
|
59
|
+
if (statSync(path).isDirectory()) walk(path, out)
|
|
60
|
+
else if (path.endsWith('.ts') || path.endsWith('.tsx')) out.push(path)
|
|
61
|
+
}
|
|
62
|
+
return out
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* `.gen.*` and `.d.ts` are the generator's own output — what they import is
|
|
67
|
+
* decided by the codegen templates, and `.pikku` is skipped outright.
|
|
68
|
+
*/
|
|
69
|
+
const isGenerated = (path: string) =>
|
|
70
|
+
path.includes('.gen.') || path.endsWith('.d.ts')
|
|
71
|
+
|
|
72
|
+
const projectSourceFiles = (project: string) => {
|
|
73
|
+
const files: string[] = []
|
|
74
|
+
for (const entry of readdirSync(project)) {
|
|
75
|
+
if (skipped.has(entry)) continue
|
|
76
|
+
const path = join(project, entry)
|
|
77
|
+
if (!statSync(path).isDirectory()) continue
|
|
78
|
+
if (existsSync(join(path, 'pikku.config.json'))) continue
|
|
79
|
+
walk(path, files)
|
|
80
|
+
}
|
|
81
|
+
return files.filter((file) => !isGenerated(file))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Parsed rather than grepped: the CLI's serializers hold the specifiers they
|
|
86
|
+
* emit inside template literals, and those are output text rather than imports
|
|
87
|
+
* the CLI itself makes.
|
|
88
|
+
*/
|
|
89
|
+
const barrelSpecifiers = (file: string) => {
|
|
90
|
+
const source = ts.createSourceFile(
|
|
91
|
+
file,
|
|
92
|
+
readFileSync(file, 'utf8'),
|
|
93
|
+
ts.ScriptTarget.Latest,
|
|
94
|
+
true
|
|
95
|
+
)
|
|
96
|
+
const found: { specifier: string; line: number }[] = []
|
|
97
|
+
for (const statement of source.statements) {
|
|
98
|
+
if (
|
|
99
|
+
!ts.isImportDeclaration(statement) &&
|
|
100
|
+
!ts.isExportDeclaration(statement)
|
|
101
|
+
) {
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
const moduleSpecifier = statement.moduleSpecifier
|
|
105
|
+
if (!moduleSpecifier || !ts.isStringLiteral(moduleSpecifier)) continue
|
|
106
|
+
const specifier = moduleSpecifier.text
|
|
107
|
+
const isBarrel =
|
|
108
|
+
specifier === '#pikku' ||
|
|
109
|
+
/^#pikku\/pikku-types\.gen(\.js)?$/.test(specifier)
|
|
110
|
+
if (!isBarrel) continue
|
|
111
|
+
const { line } = source.getLineAndCharacterOfPosition(
|
|
112
|
+
statement.getStart(source)
|
|
113
|
+
)
|
|
114
|
+
found.push({ specifier, line: line + 1 })
|
|
115
|
+
}
|
|
116
|
+
return found
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Names a leaf carries, mapped to the leaf that carries them. An app reaching
|
|
121
|
+
* `@pikku/core` for one of these is the smell that says the generator is not
|
|
122
|
+
* emitting something it should — the definer is already generated into the
|
|
123
|
+
* project's own `.pikku`, so naming core instead couples the app to a package
|
|
124
|
+
* it otherwise never imports.
|
|
125
|
+
*/
|
|
126
|
+
const namesOwnedByALeaf = new Map<string, string>([
|
|
127
|
+
['defineCredential', '#pikku/credentials'],
|
|
128
|
+
['defineSecret', '#pikku/secrets'],
|
|
129
|
+
['defineVariable', '#pikku/variables'],
|
|
130
|
+
['defineScope', '#pikku/scopes'],
|
|
131
|
+
['defineSystemRole', '#pikku/scopes'],
|
|
132
|
+
['cors', '#pikku/http'],
|
|
133
|
+
['InvalidOriginError', '#pikku/error'],
|
|
134
|
+
])
|
|
135
|
+
|
|
136
|
+
const coreNamesThatHaveALeaf = (file: string) => {
|
|
137
|
+
const source = ts.createSourceFile(
|
|
138
|
+
file,
|
|
139
|
+
readFileSync(file, 'utf8'),
|
|
140
|
+
ts.ScriptTarget.Latest,
|
|
141
|
+
true
|
|
142
|
+
)
|
|
143
|
+
const found: { name: string; leaf: string; line: number }[] = []
|
|
144
|
+
for (const statement of source.statements) {
|
|
145
|
+
if (!ts.isImportDeclaration(statement)) continue
|
|
146
|
+
const moduleSpecifier = statement.moduleSpecifier
|
|
147
|
+
if (!ts.isStringLiteral(moduleSpecifier)) continue
|
|
148
|
+
if (!/^@pikku\/core(\/|$)/.test(moduleSpecifier.text)) continue
|
|
149
|
+
|
|
150
|
+
const bindings = statement.importClause?.namedBindings
|
|
151
|
+
if (!bindings || !ts.isNamedImports(bindings)) continue
|
|
152
|
+
for (const element of bindings.elements) {
|
|
153
|
+
const name = (element.propertyName ?? element.name).text
|
|
154
|
+
const leaf = namesOwnedByALeaf.get(name)
|
|
155
|
+
if (!leaf) continue
|
|
156
|
+
const { line } = source.getLineAndCharacterOfPosition(
|
|
157
|
+
element.getStart(source)
|
|
158
|
+
)
|
|
159
|
+
found.push({ name, leaf, line: line + 1 })
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return found
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
describe('app leaf surface', () => {
|
|
166
|
+
test('no Pikku project reaches past a leaf for a name the leaf carries', () => {
|
|
167
|
+
const projects = findProjects(repoRoot)
|
|
168
|
+
assert.ok(projects.length > 0, 'expected to discover Pikku projects')
|
|
169
|
+
|
|
170
|
+
// A project nested inside another (an addon under `e2e/packages`) is
|
|
171
|
+
// discovered on its own account and again as its parent's source, so the
|
|
172
|
+
// same offence is reached twice.
|
|
173
|
+
const offenders = new Set<string>()
|
|
174
|
+
for (const project of projects) {
|
|
175
|
+
for (const file of projectSourceFiles(project)) {
|
|
176
|
+
for (const { name, leaf, line } of coreNamesThatHaveALeaf(file)) {
|
|
177
|
+
offenders.add(
|
|
178
|
+
`${relative(repoRoot, file)}:${line} ${name} — import it from '${leaf}'`
|
|
179
|
+
)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
assert.deepStrictEqual(
|
|
185
|
+
[...offenders].sort(),
|
|
186
|
+
[],
|
|
187
|
+
`An app developer imports from '#pikku/<leaf>'. Reaching past it to ` +
|
|
188
|
+
`'@pikku/core' for a name the leaf already carries is the smell that ` +
|
|
189
|
+
`says the generator is not emitting something it should.\n\n` +
|
|
190
|
+
[...offenders].sort().join('\n')
|
|
191
|
+
)
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
test('no Pikku project reaches the app tier through a barrel', () => {
|
|
195
|
+
const projects = findProjects(repoRoot)
|
|
196
|
+
assert.ok(projects.length > 0, 'expected to discover Pikku projects')
|
|
197
|
+
|
|
198
|
+
const offenders: string[] = []
|
|
199
|
+
for (const project of projects) {
|
|
200
|
+
for (const file of projectSourceFiles(project)) {
|
|
201
|
+
for (const { specifier, line } of barrelSpecifiers(file)) {
|
|
202
|
+
offenders.push(`${relative(repoRoot, file)}:${line} ${specifier}`)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
assert.deepStrictEqual(
|
|
208
|
+
offenders,
|
|
209
|
+
[],
|
|
210
|
+
`The app tier reaches Pikku through one subpath per wiring — ` +
|
|
211
|
+
`'#pikku/http', '#pikku/workflow', '#pikku/function'.\n` +
|
|
212
|
+
`A barrel import pulls every wiring's core dependencies into the ` +
|
|
213
|
+
`module graph, and nothing downstream can drop them again.\n\n` +
|
|
214
|
+
offenders.join('\n')
|
|
215
|
+
)
|
|
216
|
+
})
|
|
217
|
+
})
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap compatibility, not a public entry point.
|
|
3
|
+
*
|
|
4
|
+
* The package root carried a 206-name barrel; it is gone, and every name now
|
|
5
|
+
* lives on the subpath that owns it. What is left here is the handful of types
|
|
6
|
+
* the CLI pinned in `packages/cli/build.sh` still writes into the files it
|
|
7
|
+
* generates for the CLI itself — an unresolved type there is a silent `any` in
|
|
8
|
+
* the CLI's own generated surface, not a build failure, which is why this
|
|
9
|
+
* exists rather than letting it break loudly.
|
|
10
|
+
*
|
|
11
|
+
* `bootstrap-compat.test.ts` fails if the pinned CLI's output drifts from this
|
|
12
|
+
* list. Delete this file and its `exports` entry once the pin moves to a CLI
|
|
13
|
+
* released from this branch.
|
|
14
|
+
*/
|
|
15
|
+
export type { PikkuWire, SecretlessServices } from '../types/core.types.js'
|
|
16
|
+
export type { CorePikkuMiddleware } from '../middleware/middleware.types.js'
|
|
17
|
+
export type { PickRequired } from '../utils.js'
|
|
18
|
+
export type { CorePermissionGroup } from '../function/functions.types.js'
|
|
19
|
+
export type { ListInput, ListOutput } from '../function/list.types.js'
|
|
20
|
+
export type { SecretService } from '../services/secret-service.js'
|
|
@@ -11,7 +11,7 @@ import type {
|
|
|
11
11
|
SealedValue,
|
|
12
12
|
WrappedValue,
|
|
13
13
|
} from './data-classification.js'
|
|
14
|
-
import { deriveKEK, envelopeEncrypt, envelopeRewrap } from '
|
|
14
|
+
import { deriveKEK, envelopeEncrypt, envelopeRewrap } from '../crypto-utils.js'
|
|
15
15
|
|
|
16
16
|
const KEY_MATERIAL = 'x'.repeat(32)
|
|
17
17
|
|
|
@@ -87,7 +87,7 @@ describe('the envelope primitives produce the brand', () => {
|
|
|
87
87
|
test('decrypting accepts a bare string, so reading a row back needs no cast', async () => {
|
|
88
88
|
const kek = await deriveKEK(KEY_MATERIAL, 'c2FsdA')
|
|
89
89
|
const { ciphertext, wrappedDEK } = await envelopeEncrypt(kek, 'value')
|
|
90
|
-
const { envelopeDecrypt } = await import('
|
|
90
|
+
const { envelopeDecrypt } = await import('../crypto-utils.js')
|
|
91
91
|
const fromRow: string = ciphertext
|
|
92
92
|
assert.equal(
|
|
93
93
|
await envelopeDecrypt<string>(kek, fromRow, wrappedDEK),
|
|
@@ -5,11 +5,7 @@ export type Secret<T> = T & { readonly __classification__?: 'secret' }
|
|
|
5
5
|
|
|
6
6
|
export type Classification = 'public' | 'private' | 'pii' | 'secret'
|
|
7
7
|
export type AnonymizeStrategy =
|
|
8
|
-
| 'fake:
|
|
9
|
-
| 'fake:name'
|
|
10
|
-
| 'hash'
|
|
11
|
-
| 'keep'
|
|
12
|
-
| null
|
|
8
|
+
'fake:email' | 'fake:name' | 'hash' | 'keep' | null
|
|
13
9
|
|
|
14
10
|
// knowledge: decisions/internals/core-column-form-is-an-axis-of-its-own.md
|
|
15
11
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a value is, and how it must be handled: the classification brands a
|
|
3
|
+
* column carries, the stored forms those brands map to, and the wrapper that
|
|
4
|
+
* keeps a secret out of a log.
|
|
5
|
+
*
|
|
6
|
+
* These arrived as three entry points — one for the types, one for the
|
|
7
|
+
* runtime helpers, one for `SecretValue` — which is the same subject behind
|
|
8
|
+
* three doors, split by whether a name happens to be a type or a value.
|
|
9
|
+
*/
|
|
10
|
+
export type {
|
|
11
|
+
Private,
|
|
12
|
+
Pii,
|
|
13
|
+
Secret,
|
|
14
|
+
Classification,
|
|
15
|
+
AnonymizeStrategy,
|
|
16
|
+
ColumnForm,
|
|
17
|
+
WrappedValue,
|
|
18
|
+
SealedValue,
|
|
19
|
+
HashedValue,
|
|
20
|
+
ColumnClassification,
|
|
21
|
+
ClassificationManifest,
|
|
22
|
+
} from './data-classification.js'
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
hashToken,
|
|
26
|
+
unsafeAsWrapped,
|
|
27
|
+
unsafeAsSealed,
|
|
28
|
+
unsafeAsHashed,
|
|
29
|
+
} from './column-form.js'
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
REDACTED,
|
|
33
|
+
SecretCoercionError,
|
|
34
|
+
SecretValue,
|
|
35
|
+
createSecretValue,
|
|
36
|
+
isSecretValue,
|
|
37
|
+
} from './secret-value.js'
|
|
38
|
+
export type { Safe } from './secret-value.js'
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
type Safe,
|
|
9
9
|
type SecretValue,
|
|
10
10
|
} from './secret-value.js'
|
|
11
|
-
import type { Logger } from '
|
|
12
|
-
import type { AuditLog } from '
|
|
11
|
+
import type { Logger } from '../services/logger.js'
|
|
12
|
+
import type { AuditLog } from '../services/audit-service.js'
|
|
13
13
|
|
|
14
14
|
const VALUE = 'sk-live-DEADBEEF'
|
|
15
15
|
|
|
@@ -70,12 +70,7 @@ export const isSecretValue = (value: unknown): value is SecretValue<unknown> =>
|
|
|
70
70
|
type IsAny<T> = 0 extends 1 & T ? true : false
|
|
71
71
|
|
|
72
72
|
type Passthrough =
|
|
73
|
-
|
|
|
74
|
-
| Date
|
|
75
|
-
| RegExp
|
|
76
|
-
| Error
|
|
77
|
-
| ArrayBuffer
|
|
78
|
-
| ArrayBufferView
|
|
73
|
+
Function | Date | RegExp | Error | ArrayBuffer | ArrayBufferView
|
|
79
74
|
|
|
80
75
|
/**
|
|
81
76
|
* Rejects a `SecretValue` anywhere in `T`, however deeply nested, by collapsing
|
package/src/crypto-utils.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { tmpdir } from 'node:os'
|
|
|
6
6
|
|
|
7
7
|
import { pikkuState, resetPikkuState } from '../pikku-state.js'
|
|
8
8
|
import { getSchema } from '../schema.js'
|
|
9
|
-
import { wireAddon } from '../wirings/
|
|
9
|
+
import { wireAddon } from '../wirings/addon/wire-addon.js'
|
|
10
10
|
import { reloadGeneratedMeta, reconcileAddonRegistry } from './reload-meta.js'
|
|
11
11
|
|
|
12
12
|
const createMockLogger = () => {
|
package/src/errors/index.ts
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
1
|
export * from './errors.js'
|
|
2
2
|
export { PikkuError, addError } from './error-handler.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Types the exports above mention but do not themselves export. Without
|
|
6
|
+
* them a consumer's declaration emit has no name for the type it infers,
|
|
7
|
+
* and fails with TS2883 rather than reaching for the original entry point.
|
|
8
|
+
*/
|
|
9
|
+
export type { ErrorDetails } from './error-handler.js'
|
|
10
|
+
export { isExpectedError } from './error-handler.js'
|
|
11
|
+
export type { SerializedError } from './serialized-error.js'
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SerializedError {
|
|
2
|
+
message: string
|
|
3
|
+
stack?: string
|
|
4
|
+
code?: string
|
|
5
|
+
// Set for a deliberate PikkuError; survives step-boundary rehydration so
|
|
6
|
+
// the workflow runner logs the message alone rather than a stack trace.
|
|
7
|
+
expected?: boolean
|
|
8
|
+
[key: string]: any
|
|
9
|
+
}
|
|
@@ -3,10 +3,12 @@ import assert from 'node:assert'
|
|
|
3
3
|
import {
|
|
4
4
|
pikkuAuth,
|
|
5
5
|
pikkuPermission,
|
|
6
|
-
pikkuMiddleware,
|
|
7
6
|
pikkuPermissionFactory,
|
|
7
|
+
} from './function/functions.types.js'
|
|
8
|
+
import {
|
|
9
|
+
pikkuMiddleware,
|
|
8
10
|
pikkuMiddlewareFactory,
|
|
9
|
-
} from './
|
|
11
|
+
} from './middleware/middleware-factories.js'
|
|
10
12
|
|
|
11
13
|
test('pikkuPermission returns the same function', async () => {
|
|
12
14
|
const originalFn = async () => true
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { MiddlewareMetadata } from '../middleware/middleware.types.js'
|
|
2
|
+
import type { AuditDurability } from '../services/audit-service.js'
|
|
3
|
+
import type {
|
|
4
|
+
ScenarioStepKind,
|
|
5
|
+
ScenarioSurface,
|
|
6
|
+
} from '../wirings/workflow/scenario-step.types.js'
|
|
7
|
+
import type { CommonWireMeta } from '../types/core.types.js'
|
|
8
|
+
|
|
9
|
+
export interface FunctionServicesMeta {
|
|
10
|
+
optimized: boolean
|
|
11
|
+
services: string[]
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface FunctionWiresMeta {
|
|
15
|
+
optimized: boolean
|
|
16
|
+
wires: string[]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A reference to a permission function, resolved by name. Function-scoped
|
|
21
|
+
* only: there are no wire- or tag-level permission references.
|
|
22
|
+
*/
|
|
23
|
+
export type PermissionMetadata = {
|
|
24
|
+
type: 'wire'
|
|
25
|
+
name: string
|
|
26
|
+
inline?: boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type FunctionRuntimeMeta = {
|
|
30
|
+
pikkuFuncId: string
|
|
31
|
+
inputSchemaName: string | null
|
|
32
|
+
outputSchemaName: string | null
|
|
33
|
+
/** Scopes the session must hold to run this function. All are required (AND). */
|
|
34
|
+
scopes?: string[]
|
|
35
|
+
expose?: boolean
|
|
36
|
+
/**
|
|
37
|
+
* A sessionless function's own `auth: true`. `sessionless` carries the
|
|
38
|
+
* baseline — a `pikkuFunc` always requires a session — and this carries the
|
|
39
|
+
* tightening a `pikkuSessionlessFunc` applies to itself. Both are needed to
|
|
40
|
+
* know whether a function is gated without running it.
|
|
41
|
+
*/
|
|
42
|
+
auth?: boolean
|
|
43
|
+
/**
|
|
44
|
+
* The author's declaration that this function's permission check lives in its
|
|
45
|
+
* own body. Carries no runtime effect — it records a gate codegen cannot see,
|
|
46
|
+
* so an audit is not left to guess whether a sessionless function is open.
|
|
47
|
+
* Refused unless `allow.permissionsInBody` is set in `pikku.config.json`.
|
|
48
|
+
*/
|
|
49
|
+
permissionsInBody?: boolean
|
|
50
|
+
remote?: boolean
|
|
51
|
+
/**
|
|
52
|
+
* A step RPC: invoked by name only from a scenario run and refused
|
|
53
|
+
* everywhere else, so it is never network-callable.
|
|
54
|
+
*/
|
|
55
|
+
scenarioStep?: boolean
|
|
56
|
+
/**
|
|
57
|
+
* The body of a `pikkuScenario(...)`. Only ever run by `pikku scenario run`,
|
|
58
|
+
* so it is held back from the app bootstrap and from every deployed unit.
|
|
59
|
+
*/
|
|
60
|
+
scenario?: boolean
|
|
61
|
+
mcp?: boolean
|
|
62
|
+
readonly?: boolean
|
|
63
|
+
deploy?: 'serverless' | 'server' | 'auto'
|
|
64
|
+
sessionless?: boolean
|
|
65
|
+
/** When true, workflow steps calling this function are dispatched via the queue. No queue service configured is a hard error. */
|
|
66
|
+
workflowQueued?: boolean
|
|
67
|
+
/** Retry count when this function is used as a workflow step. */
|
|
68
|
+
workflowRetries?: number
|
|
69
|
+
/** Timeout when this function is used as a workflow step (e.g. '30s', '5m'). */
|
|
70
|
+
workflowTimeout?: string
|
|
71
|
+
/**
|
|
72
|
+
* Scenario steps only: which surfaces this step declares a binding for.
|
|
73
|
+
*
|
|
74
|
+
* The reporter derives coverage from this — a `then` with no binding for the
|
|
75
|
+
* surface the run targeted was never actually witnessed there, which is a gap
|
|
76
|
+
* worth counting rather than excusing.
|
|
77
|
+
*/
|
|
78
|
+
scenarioStepSurfaces?: ScenarioSurface[]
|
|
79
|
+
/**
|
|
80
|
+
* Scenario steps only: this step runs as a persona, so every call site must
|
|
81
|
+
* pass one and the runner injects it as `wire.actor`.
|
|
82
|
+
*
|
|
83
|
+
* Declared by `actor: true`, or implied by a `browser` binding — a window is
|
|
84
|
+
* opened as somebody. Absent on a step with nobody to be: an assertion over
|
|
85
|
+
* what an earlier step returned, or one posting credentials precisely because
|
|
86
|
+
* it must not reuse an actor's session.
|
|
87
|
+
*/
|
|
88
|
+
scenarioStepRequiresActor?: boolean
|
|
89
|
+
/**
|
|
90
|
+
* Scenario steps only: who acts. Absent means `persona` — the ordinary step,
|
|
91
|
+
* and the only kind that existed before the other two.
|
|
92
|
+
*
|
|
93
|
+
* A `platform` or `addon` step is the app or a third-party system acting, and
|
|
94
|
+
* it must never reach a virtual user's catalogue. That is not tidiness: a
|
|
95
|
+
* virtual user that can invoke "Stripe's webhook arrives" can forge its own
|
|
96
|
+
* payment success, and every finding downstream of that is worthless.
|
|
97
|
+
*/
|
|
98
|
+
scenarioStepKind?: ScenarioStepKind
|
|
99
|
+
/** Addon steps only: the addon whose system acts — `wireAddon`'s `name`. */
|
|
100
|
+
scenarioStepAddon?: string
|
|
101
|
+
/** Scenario steps only: the prose a reporter renders, with `{placeholders}` filled from the step's recorded input. */
|
|
102
|
+
scenarioStepTemplate?: string
|
|
103
|
+
/**
|
|
104
|
+
* The function's `audit` config, resolved — `audit: true` reads as
|
|
105
|
+
* `{ durability: 'best-effort' }`. Absent means the function records nothing:
|
|
106
|
+
* `auditLog.write()` from an unmarked function is dropped with a warning, so
|
|
107
|
+
* this is the only place a reader can see which functions have a trail at all
|
|
108
|
+
* without running them.
|
|
109
|
+
*
|
|
110
|
+
* Informational. The runner resolves audit from the live function config, not
|
|
111
|
+
* from here, so meta and runtime cannot disagree about whether audit is on.
|
|
112
|
+
*/
|
|
113
|
+
audit?: {
|
|
114
|
+
durability: AuditDurability
|
|
115
|
+
}
|
|
116
|
+
version?: number
|
|
117
|
+
approvalRequired?: boolean
|
|
118
|
+
approvalDescription?: string
|
|
119
|
+
implementationHash?: string
|
|
120
|
+
contractHash?: string
|
|
121
|
+
inputHash?: string
|
|
122
|
+
outputHash?: string
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export type FunctionMeta = FunctionRuntimeMeta &
|
|
126
|
+
Partial<
|
|
127
|
+
{
|
|
128
|
+
name: string
|
|
129
|
+
/** `remote`: a contract with no local body, answered by a connected client. */
|
|
130
|
+
functionType: 'user' | 'inline' | 'helper' | 'remote'
|
|
131
|
+
funcWrapper: string
|
|
132
|
+
services: FunctionServicesMeta
|
|
133
|
+
wires: FunctionWiresMeta
|
|
134
|
+
inputs: string[] | null
|
|
135
|
+
outputs: string[] | null
|
|
136
|
+
middleware: MiddlewareMetadata[]
|
|
137
|
+
permissions: PermissionMetadata[]
|
|
138
|
+
isDirectFunction: boolean
|
|
139
|
+
sourceFile: string
|
|
140
|
+
exportedName: string
|
|
141
|
+
/** File containing the handler body when it differs from sourceFile (imported handlers) */
|
|
142
|
+
bodySourceFile?: string
|
|
143
|
+
/** 1-indexed first line of the handler body (verbose meta; coverage mapping) */
|
|
144
|
+
bodyStart: number
|
|
145
|
+
/** 1-indexed last line of the handler body (verbose meta; coverage mapping) */
|
|
146
|
+
bodyEnd: number
|
|
147
|
+
} & CommonWireMeta
|
|
148
|
+
>
|
|
149
|
+
|
|
150
|
+
export type FunctionsRuntimeMeta = Record<string, FunctionRuntimeMeta>
|
|
151
|
+
export type FunctionsMeta = Record<string, FunctionMeta>
|
|
@@ -6,10 +6,12 @@ import {
|
|
|
6
6
|
getFunctionNames,
|
|
7
7
|
runPikkuFunc,
|
|
8
8
|
} from './function-runner.js'
|
|
9
|
-
import { addGlobalPermission
|
|
9
|
+
import { addGlobalPermission } from '../permissions.js'
|
|
10
|
+
import { addTagMiddleware } from '../middleware-runner.js'
|
|
10
11
|
import { addSchema } from '../schema.js'
|
|
11
12
|
import { resetPikkuState, pikkuState } from '../pikku-state.js'
|
|
12
|
-
import type { CoreServices
|
|
13
|
+
import type { CoreServices } from '../types/core.types.js'
|
|
14
|
+
import type { CorePikkuMiddleware } from '../middleware/middleware.types.js'
|
|
13
15
|
import type { CorePermissionGroup } from './functions.types.js'
|
|
14
16
|
import { PikkuSessionService } from '../services/user-session-service.js'
|
|
15
17
|
import { MissingScopeError, ReadonlySessionError } from '../errors/errors.js'
|