@cleocode/core 2026.9.19 → 2026.9.21
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/dist/adapters/discovery.d.ts.map +1 -1
- package/dist/adapters/discovery.js +3 -10
- package/dist/adapters/discovery.js.map +1 -1
- package/dist/adrs/link-pipeline.js +2 -2
- package/dist/adrs/link-pipeline.js.map +1 -1
- package/dist/adrs/parse.js +3 -3
- package/dist/adrs/parse.js.map +1 -1
- package/dist/agents/invoke-meta-agent.d.ts.map +1 -1
- package/dist/agents/invoke-meta-agent.js +8 -4
- package/dist/agents/invoke-meta-agent.js.map +1 -1
- package/dist/bootstrap.d.ts +5 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +41 -21
- package/dist/bootstrap.js.map +1 -1
- package/dist/cloud/crypto.d.ts +47 -0
- package/dist/cloud/crypto.d.ts.map +1 -0
- package/dist/cloud/crypto.js +223 -0
- package/dist/cloud/crypto.js.map +1 -0
- package/dist/cloud/http.d.ts +52 -0
- package/dist/cloud/http.d.ts.map +1 -0
- package/dist/cloud/http.js +98 -0
- package/dist/cloud/http.js.map +1 -0
- package/dist/cloud/index.d.ts +19 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +19 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/journal.d.ts +169 -0
- package/dist/cloud/journal.d.ts.map +1 -0
- package/dist/cloud/journal.js +428 -0
- package/dist/cloud/journal.js.map +1 -0
- package/dist/cloud/keys.d.ts +213 -0
- package/dist/cloud/keys.d.ts.map +1 -0
- package/dist/cloud/keys.js +362 -0
- package/dist/cloud/keys.js.map +1 -0
- package/dist/cloud/manifest-check.d.ts +36 -0
- package/dist/cloud/manifest-check.d.ts.map +1 -0
- package/dist/cloud/manifest-check.js +70 -0
- package/dist/cloud/manifest-check.js.map +1 -0
- package/dist/cloud/projects.d.ts +13 -0
- package/dist/cloud/projects.d.ts.map +1 -0
- package/dist/cloud/projects.js +11 -0
- package/dist/cloud/projects.js.map +1 -0
- package/dist/cloud/signing.d.ts +105 -0
- package/dist/cloud/signing.d.ts.map +1 -0
- package/dist/cloud/signing.js +117 -0
- package/dist/cloud/signing.js.map +1 -0
- package/dist/cloud/streams.d.ts +6 -0
- package/dist/cloud/streams.d.ts.map +1 -0
- package/dist/cloud/streams.js +5 -0
- package/dist/cloud/streams.js.map +1 -0
- package/dist/decide/audit.d.ts +131 -0
- package/dist/decide/audit.d.ts.map +1 -0
- package/dist/decide/audit.js +98 -0
- package/dist/decide/audit.js.map +1 -0
- package/dist/decide/budget.d.ts +91 -0
- package/dist/decide/budget.d.ts.map +1 -0
- package/dist/decide/budget.js +194 -0
- package/dist/decide/budget.js.map +1 -0
- package/dist/decide/cache.d.ts +49 -0
- package/dist/decide/cache.d.ts.map +1 -0
- package/dist/decide/cache.js +87 -0
- package/dist/decide/cache.js.map +1 -0
- package/dist/decide/client.d.ts +103 -0
- package/dist/decide/client.d.ts.map +1 -0
- package/dist/decide/client.js +262 -0
- package/dist/decide/client.js.map +1 -0
- package/dist/decide/credentials.d.ts +159 -0
- package/dist/decide/credentials.d.ts.map +1 -0
- package/dist/decide/credentials.js +383 -0
- package/dist/decide/credentials.js.map +1 -0
- package/dist/decide/index.d.ts +18 -0
- package/dist/decide/index.d.ts.map +1 -0
- package/dist/decide/index.js +18 -0
- package/dist/decide/index.js.map +1 -0
- package/dist/decide/jev-wire.d.ts +155 -0
- package/dist/decide/jev-wire.d.ts.map +1 -0
- package/dist/decide/jev-wire.js +420 -0
- package/dist/decide/jev-wire.js.map +1 -0
- package/dist/decide/operations.d.ts +152 -0
- package/dist/decide/operations.d.ts.map +1 -0
- package/dist/decide/operations.js +199 -0
- package/dist/decide/operations.js.map +1 -0
- package/dist/decide/provider.d.ts +90 -0
- package/dist/decide/provider.d.ts.map +1 -0
- package/dist/decide/provider.js +43 -0
- package/dist/decide/provider.js.map +1 -0
- package/dist/decide/site.d.ts +148 -0
- package/dist/decide/site.d.ts.map +1 -0
- package/dist/decide/site.js +181 -0
- package/dist/decide/site.js.map +1 -0
- package/dist/decide/transport.d.ts +67 -0
- package/dist/decide/transport.d.ts.map +1 -0
- package/dist/decide/transport.js +350 -0
- package/dist/decide/transport.js.map +1 -0
- package/dist/docs/export-document.js +5908 -2436
- package/dist/docs/export-document.js.map +3 -3
- package/dist/docs/index.d.ts +2 -2
- package/dist/docs/index.d.ts.map +1 -1
- package/dist/docs/index.js +1 -1
- package/dist/docs/index.js.map +1 -1
- package/dist/docs/projection.d.ts.map +1 -1
- package/dist/docs/projection.js +2 -3
- package/dist/docs/projection.js.map +1 -1
- package/dist/docs/publish-pr.d.ts +69 -1
- package/dist/docs/publish-pr.d.ts.map +1 -1
- package/dist/docs/publish-pr.js +112 -10
- package/dist/docs/publish-pr.js.map +1 -1
- package/dist/doctor/db-substrate.d.ts +13 -8
- package/dist/doctor/db-substrate.d.ts.map +1 -1
- package/dist/doctor/db-substrate.js +39 -26
- package/dist/doctor/db-substrate.js.map +1 -1
- package/dist/doctor/index.d.ts +2 -0
- package/dist/doctor/index.d.ts.map +1 -1
- package/dist/doctor/index.js +1 -0
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/knowledge.d.ts.map +1 -1
- package/dist/doctor/knowledge.js +5 -15
- package/dist/doctor/knowledge.js.map +1 -1
- package/dist/doctor/nexus-schema-residency.d.ts +1 -1
- package/dist/doctor/nexus-schema-residency.d.ts.map +1 -1
- package/dist/doctor/nexus-schema-residency.js +3 -0
- package/dist/doctor/nexus-schema-residency.js.map +1 -1
- package/dist/doctor/project-identity.d.ts +44 -1
- package/dist/doctor/project-identity.d.ts.map +1 -1
- package/dist/doctor/project-identity.js +237 -10
- package/dist/doctor/project-identity.js.map +1 -1
- package/dist/doctor/projects.d.ts +170 -0
- package/dist/doctor/projects.d.ts.map +1 -0
- package/dist/doctor/projects.js +1075 -0
- package/dist/doctor/projects.js.map +1 -0
- package/dist/doctor/twin-collapse.d.ts +97 -0
- package/dist/doctor/twin-collapse.d.ts.map +1 -0
- package/dist/doctor/twin-collapse.js +168 -0
- package/dist/doctor/twin-collapse.js.map +1 -0
- package/dist/doctor/worktree-orphans.d.ts.map +1 -1
- package/dist/doctor/worktree-orphans.js +13 -29
- package/dist/doctor/worktree-orphans.js.map +1 -1
- package/dist/doctor/worktree-stores.d.ts +128 -0
- package/dist/doctor/worktree-stores.d.ts.map +1 -0
- package/dist/doctor/worktree-stores.js +374 -0
- package/dist/doctor/worktree-stores.js.map +1 -0
- package/dist/engine/engine-ops.d.ts.map +1 -1
- package/dist/engine/engine-ops.js +59 -23
- package/dist/engine/engine-ops.js.map +1 -1
- package/dist/error-catalog.d.ts.map +1 -1
- package/dist/error-catalog.js +21 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/error-registry.d.ts.map +1 -1
- package/dist/error-registry.js +40 -0
- package/dist/error-registry.js.map +1 -1
- package/dist/gc/cleanup.d.ts.map +1 -1
- package/dist/gc/cleanup.js +32 -19
- package/dist/gc/cleanup.js.map +1 -1
- package/dist/git/bounded-git.d.ts +170 -0
- package/dist/git/bounded-git.d.ts.map +1 -0
- package/dist/git/bounded-git.js +371 -0
- package/dist/git/bounded-git.js.map +1 -0
- package/dist/git/work-tree.d.ts +20 -0
- package/dist/git/work-tree.d.ts.map +1 -1
- package/dist/git/work-tree.js +20 -2
- package/dist/git/work-tree.js.map +1 -1
- package/dist/hooks/handlers/session-hooks.d.ts +11 -26
- package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/session-hooks.js +18 -47
- package/dist/hooks/handlers/session-hooks.js.map +1 -1
- package/dist/hooks/payload-schemas.d.ts +2 -2
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/init/engine-ops.d.ts.map +1 -1
- package/dist/init/engine-ops.js +23 -1
- package/dist/init/engine-ops.js.map +1 -1
- package/dist/init.d.ts +158 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +535 -44
- package/dist/init.js.map +1 -1
- package/dist/injection.d.ts +55 -0
- package/dist/injection.d.ts.map +1 -1
- package/dist/injection.js +102 -6
- package/dist/injection.js.map +1 -1
- package/dist/internal.d.ts +9 -5
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +8 -4
- package/dist/internal.js.map +1 -1
- package/dist/issue/diagnostics.d.ts.map +1 -1
- package/dist/issue/diagnostics.js +2 -1
- package/dist/issue/diagnostics.js.map +1 -1
- package/dist/lib/concurrency.d.ts +25 -0
- package/dist/lib/concurrency.d.ts.map +1 -0
- package/dist/lib/concurrency.js +43 -0
- package/dist/lib/concurrency.js.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lifecycle/engine-ops.d.ts.map +1 -1
- package/dist/lifecycle/engine-ops.js +4 -2
- package/dist/lifecycle/engine-ops.js.map +1 -1
- package/dist/lifecycle/stage-guidance.d.ts +5 -0
- package/dist/lifecycle/stage-guidance.d.ts.map +1 -1
- package/dist/lifecycle/stage-guidance.js +14 -4
- package/dist/lifecycle/stage-guidance.js.map +1 -1
- package/dist/llm/catalog-cache.d.ts +3 -2
- package/dist/llm/catalog-cache.d.ts.map +1 -1
- package/dist/llm/catalog-cache.js +5 -5
- package/dist/llm/catalog-cache.js.map +1 -1
- package/dist/llm/credentials.d.ts +4 -4
- package/dist/llm/credentials.js +6 -6
- package/dist/llm/credentials.js.map +1 -1
- package/dist/llm/plugin-facade.js +4312 -1798
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/llm/stable-device-id.d.ts.map +1 -1
- package/dist/llm/stable-device-id.js +3 -5
- package/dist/llm/stable-device-id.js.map +1 -1
- package/dist/memory/attention.d.ts.map +1 -1
- package/dist/memory/attention.js +30 -30
- package/dist/memory/attention.js.map +1 -1
- package/dist/memory/decision-contradiction.d.ts +152 -0
- package/dist/memory/decision-contradiction.d.ts.map +1 -0
- package/dist/memory/decision-contradiction.js +273 -0
- package/dist/memory/decision-contradiction.js.map +1 -0
- package/dist/memory/decisions.d.ts +42 -11
- package/dist/memory/decisions.d.ts.map +1 -1
- package/dist/memory/decisions.js +153 -56
- package/dist/memory/decisions.js.map +1 -1
- package/dist/memory/dialectic-evaluator.d.ts +7 -0
- package/dist/memory/dialectic-evaluator.d.ts.map +1 -1
- package/dist/memory/dialectic-evaluator.js +23 -8
- package/dist/memory/dialectic-evaluator.js.map +1 -1
- package/dist/memory/dispatch-trace-format.d.ts +39 -0
- package/dist/memory/dispatch-trace-format.d.ts.map +1 -0
- package/dist/memory/dispatch-trace-format.js +54 -0
- package/dist/memory/dispatch-trace-format.js.map +1 -0
- package/dist/memory/dispatch-trace.d.ts.map +1 -1
- package/dist/memory/dispatch-trace.js +1 -27
- package/dist/memory/dispatch-trace.js.map +1 -1
- package/dist/memory/engine-compat.d.ts +2 -0
- package/dist/memory/engine-compat.d.ts.map +1 -1
- package/dist/memory/engine-compat.js +1 -0
- package/dist/memory/engine-compat.js.map +1 -1
- package/dist/memory/import-from-provider.js +3 -3
- package/dist/memory/import-from-provider.js.map +1 -1
- package/dist/memory/learnings.d.ts +2 -2
- package/dist/memory/observation-type-decision.d.ts +96 -0
- package/dist/memory/observation-type-decision.d.ts.map +1 -0
- package/dist/memory/observation-type-decision.js +218 -0
- package/dist/memory/observation-type-decision.js.map +1 -0
- package/dist/memory/redaction.js +2 -0
- package/dist/memory/redaction.js.map +1 -1
- package/dist/memory/retrieval/build-retrieval-bundle.d.ts +9 -2
- package/dist/memory/retrieval/build-retrieval-bundle.d.ts.map +1 -1
- package/dist/memory/retrieval/build-retrieval-bundle.js +42 -11
- package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
- package/dist/memory/retrieval/get-current-session-id.d.ts +5 -0
- package/dist/memory/retrieval/get-current-session-id.d.ts.map +1 -1
- package/dist/memory/retrieval/get-current-session-id.js +7 -2
- package/dist/memory/retrieval/get-current-session-id.js.map +1 -1
- package/dist/memory/retrieval/observe.d.ts.map +1 -1
- package/dist/memory/retrieval/observe.js +30 -29
- package/dist/memory/retrieval/observe.js.map +1 -1
- package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
- package/dist/nexus/analyze-orchestrator.js +42 -29
- package/dist/nexus/analyze-orchestrator.js.map +1 -1
- package/dist/nexus/assessment-projection.d.ts +76 -0
- package/dist/nexus/assessment-projection.d.ts.map +1 -0
- package/dist/nexus/assessment-projection.js +143 -0
- package/dist/nexus/assessment-projection.js.map +1 -0
- package/dist/nexus/assessment-store.d.ts +14 -2
- package/dist/nexus/assessment-store.d.ts.map +1 -1
- package/dist/nexus/assessment-store.js +21 -3
- package/dist/nexus/assessment-store.js.map +1 -1
- package/dist/nexus/checkout-nonce.d.ts +48 -0
- package/dist/nexus/checkout-nonce.d.ts.map +1 -0
- package/dist/nexus/checkout-nonce.js +84 -0
- package/dist/nexus/checkout-nonce.js.map +1 -0
- package/dist/nexus/devices.d.ts +93 -0
- package/dist/nexus/devices.d.ts.map +1 -0
- package/dist/nexus/devices.js +141 -0
- package/dist/nexus/devices.js.map +1 -0
- package/dist/nexus/freshness.d.ts.map +1 -1
- package/dist/nexus/freshness.js +25 -6
- package/dist/nexus/freshness.js.map +1 -1
- package/dist/nexus/git-state.d.ts +225 -0
- package/dist/nexus/git-state.d.ts.map +1 -0
- package/dist/nexus/git-state.js +677 -0
- package/dist/nexus/git-state.js.map +1 -0
- package/dist/nexus/graph-manifest.d.ts +20 -4
- package/dist/nexus/graph-manifest.d.ts.map +1 -1
- package/dist/nexus/graph-manifest.js +40 -5
- package/dist/nexus/graph-manifest.js.map +1 -1
- package/dist/nexus/identity.d.ts +68 -23
- package/dist/nexus/identity.d.ts.map +1 -1
- package/dist/nexus/identity.js +99 -22
- package/dist/nexus/identity.js.map +1 -1
- package/dist/nexus/index.d.ts +5 -2
- package/dist/nexus/index.d.ts.map +1 -1
- package/dist/nexus/index.js +10 -4
- package/dist/nexus/index.js.map +1 -1
- package/dist/nexus/knowledge.d.ts +5 -0
- package/dist/nexus/knowledge.d.ts.map +1 -1
- package/dist/nexus/knowledge.js +26 -2
- package/dist/nexus/knowledge.js.map +1 -1
- package/dist/nexus/legacy-alias.d.ts +60 -0
- package/dist/nexus/legacy-alias.d.ts.map +1 -0
- package/dist/nexus/legacy-alias.js +68 -0
- package/dist/nexus/legacy-alias.js.map +1 -0
- package/dist/nexus/migrate-json-to-sqlite.js +2 -2
- package/dist/nexus/migrate-json-to-sqlite.js.map +1 -1
- package/dist/nexus/ops.d.ts +1 -0
- package/dist/nexus/ops.d.ts.map +1 -1
- package/dist/nexus/path-map.d.ts +264 -20
- package/dist/nexus/path-map.d.ts.map +1 -1
- package/dist/nexus/path-map.js +580 -44
- package/dist/nexus/path-map.js.map +1 -1
- package/dist/nexus/projects-clean.d.ts +9 -1
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +126 -14
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/projects-scan.d.ts +56 -1
- package/dist/nexus/projects-scan.d.ts.map +1 -1
- package/dist/nexus/projects-scan.js +144 -3
- package/dist/nexus/projects-scan.js.map +1 -1
- package/dist/nexus/registry-hygiene.d.ts +18 -2
- package/dist/nexus/registry-hygiene.d.ts.map +1 -1
- package/dist/nexus/registry-hygiene.js +37 -11
- package/dist/nexus/registry-hygiene.js.map +1 -1
- package/dist/nexus/registry-roots.d.ts +47 -0
- package/dist/nexus/registry-roots.d.ts.map +1 -0
- package/dist/nexus/registry-roots.js +79 -0
- package/dist/nexus/registry-roots.js.map +1 -0
- package/dist/nexus/registry.d.ts +50 -9
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +311 -156
- package/dist/nexus/registry.js.map +1 -1
- package/dist/nexus/stored-roots.d.ts +106 -0
- package/dist/nexus/stored-roots.d.ts.map +1 -0
- package/dist/nexus/stored-roots.js +180 -0
- package/dist/nexus/stored-roots.js.map +1 -0
- package/dist/nexus/transfer.d.ts.map +1 -1
- package/dist/nexus/transfer.js +3 -0
- package/dist/nexus/transfer.js.map +1 -1
- package/dist/nexus/user-profile-hygiene.d.ts +168 -0
- package/dist/nexus/user-profile-hygiene.d.ts.map +1 -0
- package/dist/nexus/user-profile-hygiene.js +305 -0
- package/dist/nexus/user-profile-hygiene.js.map +1 -0
- package/dist/nexus/user-profile.d.ts +53 -2
- package/dist/nexus/user-profile.d.ts.map +1 -1
- package/dist/nexus/user-profile.js +106 -4
- package/dist/nexus/user-profile.js.map +1 -1
- package/dist/orchestrate/pivot.d.ts.map +1 -1
- package/dist/orchestrate/pivot.js +5 -1
- package/dist/orchestrate/pivot.js.map +1 -1
- package/dist/orchestrate/spawn-ops.d.ts +12 -0
- package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
- package/dist/orchestrate/spawn-ops.js +152 -57
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestration/classify-readiness.d.ts +37 -1
- package/dist/orchestration/classify-readiness.d.ts.map +1 -1
- package/dist/orchestration/classify-readiness.js +48 -19
- package/dist/orchestration/classify-readiness.js.map +1 -1
- package/dist/orchestration/index.d.ts +3 -2
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/orchestration/index.js +2 -1
- package/dist/orchestration/index.js.map +1 -1
- package/dist/orchestration/owner-decision-readiness.d.ts +88 -0
- package/dist/orchestration/owner-decision-readiness.d.ts.map +1 -0
- package/dist/orchestration/owner-decision-readiness.js +152 -0
- package/dist/orchestration/owner-decision-readiness.js.map +1 -0
- package/dist/orchestration/psyche-memory-budget.d.ts +105 -0
- package/dist/orchestration/psyche-memory-budget.d.ts.map +1 -0
- package/dist/orchestration/psyche-memory-budget.js +383 -0
- package/dist/orchestration/psyche-memory-budget.js.map +1 -0
- package/dist/orchestration/spawn-prompt.d.ts +12 -1
- package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
- package/dist/orchestration/spawn-prompt.js +141 -179
- package/dist/orchestration/spawn-prompt.js.map +1 -1
- package/dist/orchestration/spawn.d.ts +7 -0
- package/dist/orchestration/spawn.d.ts.map +1 -1
- package/dist/orchestration/spawn.js +1 -0
- package/dist/orchestration/spawn.js.map +1 -1
- package/dist/paths.d.ts +24 -8
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +135 -71
- package/dist/paths.js.map +1 -1
- package/dist/platform.d.ts +6 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +8 -19
- package/dist/platform.js.map +1 -1
- package/dist/project-info.d.ts +18 -0
- package/dist/project-info.d.ts.map +1 -1
- package/dist/project-info.js +29 -1
- package/dist/project-info.js.map +1 -1
- package/dist/project-lifecycle.d.ts +91 -32
- package/dist/project-lifecycle.d.ts.map +1 -1
- package/dist/project-lifecycle.js +639 -75
- package/dist/project-lifecycle.js.map +1 -1
- package/dist/project-scope.d.ts +86 -4
- package/dist/project-scope.d.ts.map +1 -1
- package/dist/project-scope.js +226 -13
- package/dist/project-scope.js.map +1 -1
- package/dist/project-tombstone.d.ts +111 -0
- package/dist/project-tombstone.d.ts.map +1 -0
- package/dist/project-tombstone.js +220 -0
- package/dist/project-tombstone.js.map +1 -0
- package/dist/release/artifacts.d.ts.map +1 -1
- package/dist/release/artifacts.js +14 -9
- package/dist/release/artifacts.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +223 -0
- package/dist/release/ci-evidence.d.ts.map +1 -0
- package/dist/release/ci-evidence.js +652 -0
- package/dist/release/ci-evidence.js.map +1 -0
- package/dist/release/engine-ops.d.ts.map +1 -1
- package/dist/release/engine-ops.js +3 -3
- package/dist/release/engine-ops.js.map +1 -1
- package/dist/release/plan.d.ts.map +1 -1
- package/dist/release/plan.js +7 -6
- package/dist/release/plan.js.map +1 -1
- package/dist/release/pr-evidence.d.ts +38 -0
- package/dist/release/pr-evidence.d.ts.map +1 -1
- package/dist/release/pr-evidence.js +67 -11
- package/dist/release/pr-evidence.js.map +1 -1
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +3 -2
- package/dist/release/reconcile.js.map +1 -1
- package/dist/release/release-manifest.d.ts +2 -1
- package/dist/release/release-manifest.d.ts.map +1 -1
- package/dist/release/release-manifest.js +6 -5
- package/dist/release/release-manifest.js.map +1 -1
- package/dist/render/nexus/graph/index.d.ts +4 -0
- package/dist/render/nexus/graph/index.d.ts.map +1 -1
- package/dist/render/nexus/graph/index.js +57 -0
- package/dist/render/nexus/graph/index.js.map +1 -1
- package/dist/resources/spawn-wrapper.d.ts +8 -1
- package/dist/resources/spawn-wrapper.d.ts.map +1 -1
- package/dist/resources/spawn-wrapper.js +42 -5
- package/dist/resources/spawn-wrapper.js.map +1 -1
- package/dist/routing/build-command-groups.d.ts.map +1 -1
- package/dist/routing/build-command-groups.js +1 -0
- package/dist/routing/build-command-groups.js.map +1 -1
- package/dist/sagas/index.d.ts +1 -1
- package/dist/sagas/index.d.ts.map +1 -1
- package/dist/sagas/index.js +1 -1
- package/dist/sagas/index.js.map +1 -1
- package/dist/sagas/reconcile.d.ts +24 -4
- package/dist/sagas/reconcile.d.ts.map +1 -1
- package/dist/sagas/reconcile.js +226 -100
- package/dist/sagas/reconcile.js.map +1 -1
- package/dist/scaffold/ensure-config.d.ts.map +1 -1
- package/dist/scaffold/ensure-config.js +31 -1
- package/dist/scaffold/ensure-config.js.map +1 -1
- package/dist/scaffold/project-identity.d.ts +2 -8
- package/dist/scaffold/project-identity.d.ts.map +1 -1
- package/dist/scaffold/project-identity.js +5 -21
- package/dist/scaffold/project-identity.js.map +1 -1
- package/dist/security/input-sanitization.d.ts +9 -1
- package/dist/security/input-sanitization.d.ts.map +1 -1
- package/dist/security/input-sanitization.js +12 -2
- package/dist/security/input-sanitization.js.map +1 -1
- package/dist/selfimprove/fix-gen.js +4321 -1807
- package/dist/selfimprove/fix-gen.js.map +3 -3
- package/dist/sentient/propose-tick.d.ts.map +1 -1
- package/dist/sentient/propose-tick.js +4 -2
- package/dist/sentient/propose-tick.js.map +1 -1
- package/dist/sequence/index.d.ts.map +1 -1
- package/dist/sequence/index.js +6 -23
- package/dist/sequence/index.js.map +1 -1
- package/dist/session/engine-ops.d.ts +9 -0
- package/dist/session/engine-ops.d.ts.map +1 -1
- package/dist/session/engine-ops.js +110 -18
- package/dist/session/engine-ops.js.map +1 -1
- package/dist/sessions/assumptions.d.ts.map +1 -1
- package/dist/sessions/assumptions.js +7 -4
- package/dist/sessions/assumptions.js.map +1 -1
- package/dist/sessions/briefing.d.ts +6 -0
- package/dist/sessions/briefing.d.ts.map +1 -1
- package/dist/sessions/briefing.js +12 -1
- package/dist/sessions/briefing.js.map +1 -1
- package/dist/sessions/decisions.d.ts +38 -3
- package/dist/sessions/decisions.d.ts.map +1 -1
- package/dist/sessions/decisions.js +235 -21
- package/dist/sessions/decisions.js.map +1 -1
- package/dist/sessions/drift-watchdog.d.ts.map +1 -1
- package/dist/sessions/drift-watchdog.js +4 -2
- package/dist/sessions/drift-watchdog.js.map +1 -1
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +33 -4
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/session-end-snapshot-entry.d.ts +26 -0
- package/dist/sessions/session-end-snapshot-entry.d.ts.map +1 -0
- package/dist/sessions/session-end-snapshot-entry.js +59 -0
- package/dist/sessions/session-end-snapshot-entry.js.map +1 -0
- package/dist/sessions/session-end-snapshot.d.ts +114 -0
- package/dist/sessions/session-end-snapshot.d.ts.map +1 -0
- package/dist/sessions/session-end-snapshot.js +446 -0
- package/dist/sessions/session-end-snapshot.js.map +1 -0
- package/dist/sessions/session-manifest-mirror.d.ts.map +1 -1
- package/dist/sessions/session-manifest-mirror.js +10 -17
- package/dist/sessions/session-manifest-mirror.js.map +1 -1
- package/dist/sessions/session-switch.d.ts.map +1 -1
- package/dist/sessions/session-switch.js +5 -3
- package/dist/sessions/session-switch.js.map +1 -1
- package/dist/sessions/snapshot.d.ts.map +1 -1
- package/dist/sessions/snapshot.js +5 -4
- package/dist/sessions/snapshot.js.map +1 -1
- package/dist/sessions/terminal-identity.d.ts +169 -0
- package/dist/sessions/terminal-identity.d.ts.map +1 -0
- package/dist/sessions/terminal-identity.js +273 -0
- package/dist/sessions/terminal-identity.js.map +1 -0
- package/dist/setup/sections/verification.d.ts +1 -1
- package/dist/setup/sections/verification.d.ts.map +1 -1
- package/dist/setup/sections/verification.js +11 -15
- package/dist/setup/sections/verification.js.map +1 -1
- package/dist/skills/discovery.d.ts +8 -2
- package/dist/skills/discovery.d.ts.map +1 -1
- package/dist/skills/discovery.js +15 -3
- package/dist/skills/discovery.js.map +1 -1
- package/dist/skills/dispatch.d.ts +5 -2
- package/dist/skills/dispatch.d.ts.map +1 -1
- package/dist/skills/dispatch.js +5 -2
- package/dist/skills/dispatch.js.map +1 -1
- package/dist/skills/doctor.d.ts.map +1 -1
- package/dist/skills/doctor.js +5 -1
- package/dist/skills/doctor.js.map +1 -1
- package/dist/skills/federated-search.js +2 -2
- package/dist/skills/federated-search.js.map +1 -1
- package/dist/skills/index.d.ts +3 -3
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/install.d.ts +15 -2
- package/dist/skills/install.d.ts.map +1 -1
- package/dist/skills/install.js +21 -5
- package/dist/skills/install.js.map +1 -1
- package/dist/skills/migration.d.ts +5 -5
- package/dist/skills/migration.d.ts.map +1 -1
- package/dist/skills/migration.js +7 -9
- package/dist/skills/migration.js.map +1 -1
- package/dist/skills/orchestrator/startup.d.ts.map +1 -1
- package/dist/skills/orchestrator/startup.js +4 -2
- package/dist/skills/orchestrator/startup.js.map +1 -1
- package/dist/skills/skill-paths.d.ts +30 -3
- package/dist/skills/skill-paths.d.ts.map +1 -1
- package/dist/skills/skill-paths.js +28 -9
- package/dist/skills/skill-paths.js.map +1 -1
- package/dist/skills/skill-root.d.ts +60 -11
- package/dist/skills/skill-root.d.ts.map +1 -1
- package/dist/skills/skill-root.js +100 -14
- package/dist/skills/skill-root.js.map +1 -1
- package/dist/skills/skills-guard.js +5 -5
- package/dist/skills/skills-guard.js.map +1 -1
- package/dist/skills/types.d.ts +23 -0
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/types.js.map +1 -1
- package/dist/spawn/agent-identity.d.ts +51 -2
- package/dist/spawn/agent-identity.d.ts.map +1 -1
- package/dist/spawn/agent-identity.js +89 -26
- package/dist/spawn/agent-identity.js.map +1 -1
- package/dist/spawn/branch-lock.d.ts.map +1 -1
- package/dist/spawn/branch-lock.js +56 -79
- package/dist/spawn/branch-lock.js.map +1 -1
- package/dist/spawn/index.d.ts +2 -2
- package/dist/spawn/index.d.ts.map +1 -1
- package/dist/spawn/index.js +1 -1
- package/dist/spawn/index.js.map +1 -1
- package/dist/spawn/worktree-lock-holder.d.ts +37 -0
- package/dist/spawn/worktree-lock-holder.d.ts.map +1 -0
- package/dist/spawn/worktree-lock-holder.js +41 -0
- package/dist/spawn/worktree-lock-holder.js.map +1 -0
- package/dist/sticky/convert.d.ts.map +1 -1
- package/dist/sticky/convert.js +16 -4
- package/dist/sticky/convert.js.map +1 -1
- package/dist/store/attachment-store.d.ts +14 -0
- package/dist/store/attachment-store.d.ts.map +1 -1
- package/dist/store/attachment-store.js +11 -1
- package/dist/store/attachment-store.js.map +1 -1
- package/dist/store/backup-inspect.d.ts +7 -3
- package/dist/store/backup-inspect.d.ts.map +1 -1
- package/dist/store/backup-inspect.js +18 -7
- package/dist/store/backup-inspect.js.map +1 -1
- package/dist/store/backup-sidecar.d.ts +60 -0
- package/dist/store/backup-sidecar.d.ts.map +1 -0
- package/dist/store/backup-sidecar.js +96 -0
- package/dist/store/backup-sidecar.js.map +1 -0
- package/dist/store/data-accessor.d.ts +1 -1
- package/dist/store/data-accessor.d.ts.map +1 -1
- package/dist/store/data-accessor.js +6 -6
- package/dist/store/data-accessor.js.map +1 -1
- package/dist/store/data-safety-central.d.ts +13 -4
- package/dist/store/data-safety-central.d.ts.map +1 -1
- package/dist/store/data-safety-central.js +31 -4
- package/dist/store/data-safety-central.js.map +1 -1
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +10 -0
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/exodus/__fixtures__/representative-fixture.d.ts.map +1 -1
- package/dist/store/exodus/__fixtures__/representative-fixture.js +4 -0
- package/dist/store/exodus/__fixtures__/representative-fixture.js.map +1 -1
- package/dist/store/exodus/migrate.js +1 -1
- package/dist/store/exodus/migrate.js.map +1 -1
- package/dist/store/exodus/reconcile.js +1 -1
- package/dist/store/exodus/reconcile.js.map +1 -1
- package/dist/store/exodus/runtime-targets.d.ts +4 -3
- package/dist/store/exodus/runtime-targets.d.ts.map +1 -1
- package/dist/store/exodus/runtime-targets.js +4 -3
- package/dist/store/exodus/runtime-targets.js.map +1 -1
- package/dist/store/import-logging.d.ts.map +1 -1
- package/dist/store/import-logging.js +5 -4
- package/dist/store/import-logging.js.map +1 -1
- package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
- package/dist/store/legacy-tasks-lineage.js +2 -7
- package/dist/store/legacy-tasks-lineage.js.map +1 -1
- package/dist/store/lock.d.ts +1 -0
- package/dist/store/lock.d.ts.map +1 -1
- package/dist/store/lock.js +1 -0
- package/dist/store/lock.js.map +1 -1
- package/dist/store/memory-accessor.d.ts +8 -3
- package/dist/store/memory-accessor.d.ts.map +1 -1
- package/dist/store/memory-accessor.js +29 -13
- package/dist/store/memory-accessor.js.map +1 -1
- package/dist/store/memory-sqlite.d.ts.map +1 -1
- package/dist/store/memory-sqlite.js +5 -0
- package/dist/store/memory-sqlite.js.map +1 -1
- package/dist/store/open-cleo-db.d.ts.map +1 -1
- package/dist/store/open-cleo-db.js +11 -6
- package/dist/store/open-cleo-db.js.map +1 -1
- package/dist/store/portable-bundle-relocate.d.ts +13 -8
- package/dist/store/portable-bundle-relocate.d.ts.map +1 -1
- package/dist/store/portable-bundle-relocate.js +75 -31
- package/dist/store/portable-bundle-relocate.js.map +1 -1
- package/dist/store/portable-bundle-scan.d.ts.map +1 -1
- package/dist/store/portable-bundle-scan.js +2 -1
- package/dist/store/portable-bundle-scan.js.map +1 -1
- package/dist/store/portable-bundle.d.ts.map +1 -1
- package/dist/store/portable-bundle.js +7 -3
- package/dist/store/portable-bundle.js.map +1 -1
- package/dist/store/pre-repair-snapshot.d.ts +77 -0
- package/dist/store/pre-repair-snapshot.d.ts.map +1 -0
- package/dist/store/pre-repair-snapshot.js +122 -0
- package/dist/store/pre-repair-snapshot.js.map +1 -0
- package/dist/store/regenerators.d.ts +2 -1
- package/dist/store/regenerators.d.ts.map +1 -1
- package/dist/store/regenerators.js +17 -3
- package/dist/store/regenerators.js.map +1 -1
- package/dist/store/relocated-store-guard.d.ts +71 -0
- package/dist/store/relocated-store-guard.d.ts.map +1 -0
- package/dist/store/relocated-store-guard.js +138 -0
- package/dist/store/relocated-store-guard.js.map +1 -0
- package/dist/store/safety-data-accessor.d.ts +2 -2
- package/dist/store/safety-data-accessor.d.ts.map +1 -1
- package/dist/store/safety-data-accessor.js +2 -2
- package/dist/store/safety-data-accessor.js.map +1 -1
- package/dist/store/schema/attachments.d.ts +2 -2
- package/dist/store/schema/audit.d.ts +5 -5
- package/dist/store/schema/background-jobs.d.ts +1 -1
- package/dist/store/schema/cleo-global/models-catalog.d.ts +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +686 -0
- package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/nexus.js +175 -7
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/cleo-global/skills.d.ts +2 -2
- package/dist/store/schema/cleo-project/audit.d.ts +5 -5
- package/dist/store/schema/cleo-project/docs.d.ts +3 -3
- package/dist/store/schema/cleo-project/lifecycle.d.ts +3 -3
- package/dist/store/schema/cleo-project/provenance-commits.d.ts +2 -2
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +3 -3
- package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts +1 -1
- package/dist/store/schema/cleo-project/tasks-core.d.ts +6 -6
- package/dist/store/schema/cleo-shared/brain.d.ts +26 -26
- package/dist/store/schema/lifecycle.d.ts +3 -3
- package/dist/store/schema/manifest.d.ts +1 -1
- package/dist/store/schema/memory-schema.d.ts +26 -26
- package/dist/store/schema/nexus-schema.d.ts +696 -2
- package/dist/store/schema/nexus-schema.d.ts.map +1 -1
- package/dist/store/schema/nexus-schema.js +175 -19
- package/dist/store/schema/nexus-schema.js.map +1 -1
- package/dist/store/schema/provenance/releases.d.ts +1 -1
- package/dist/store/schema/skills-schema.d.ts +2 -2
- package/dist/store/schema/tasks.d.ts +5 -5
- package/dist/store/session-binding-schema.d.ts +132 -0
- package/dist/store/session-binding-schema.d.ts.map +1 -0
- package/dist/store/session-binding-schema.js +53 -0
- package/dist/store/session-binding-schema.js.map +1 -0
- package/dist/store/session-store.d.ts +262 -4
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +486 -26
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/snapshot-gate.d.ts +239 -0
- package/dist/store/snapshot-gate.d.ts.map +1 -0
- package/dist/store/snapshot-gate.js +398 -0
- package/dist/store/snapshot-gate.js.map +1 -0
- package/dist/store/split-brain-import.js +2 -2
- package/dist/store/split-brain-import.js.map +1 -1
- package/dist/store/sqlite-backup.d.ts +55 -13
- package/dist/store/sqlite-backup.d.ts.map +1 -1
- package/dist/store/sqlite-backup.js +414 -106
- package/dist/store/sqlite-backup.js.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts +15 -0
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +63 -4
- package/dist/store/sqlite-data-accessor.js.map +1 -1
- package/dist/store/sqlite.d.ts +1 -1
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +53 -5
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/store-write-guard.d.ts +28 -0
- package/dist/store/store-write-guard.d.ts.map +1 -0
- package/dist/store/store-write-guard.js +50 -0
- package/dist/store/store-write-guard.js.map +1 -0
- package/dist/store/table-classification.d.ts +143 -0
- package/dist/store/table-classification.d.ts.map +1 -0
- package/dist/store/table-classification.js +1866 -0
- package/dist/store/table-classification.js.map +1 -0
- package/dist/store/task-version.d.ts +72 -0
- package/dist/store/task-version.d.ts.map +1 -0
- package/dist/store/task-version.js +93 -0
- package/dist/store/task-version.js.map +1 -0
- package/dist/store/tasks-schema.d.ts +1 -0
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/tasks-schema.js +13 -0
- package/dist/store/tasks-schema.js.map +1 -1
- package/dist/store/tasks-sqlite.d.ts +10 -3
- package/dist/store/tasks-sqlite.d.ts.map +1 -1
- package/dist/store/tasks-sqlite.js +12 -3
- package/dist/store/tasks-sqlite.js.map +1 -1
- package/dist/store/twin-collapse.d.ts +275 -0
- package/dist/store/twin-collapse.d.ts.map +1 -0
- package/dist/store/twin-collapse.js +805 -0
- package/dist/store/twin-collapse.js.map +1 -0
- package/dist/store/umbrella-data-accessor.d.ts +2 -2
- package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
- package/dist/store/umbrella-data-accessor.js +2 -2
- package/dist/store/umbrella-data-accessor.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +63 -63
- package/dist/store/worktree-isolation-guard.d.ts +46 -24
- package/dist/store/worktree-isolation-guard.d.ts.map +1 -1
- package/dist/store/worktree-isolation-guard.js +69 -50
- package/dist/store/worktree-isolation-guard.js.map +1 -1
- package/dist/system/backup.d.ts.map +1 -1
- package/dist/system/backup.js +3 -67
- package/dist/system/backup.js.map +1 -1
- package/dist/system/cleo-link.d.ts +163 -0
- package/dist/system/cleo-link.d.ts.map +1 -0
- package/dist/system/cleo-link.js +246 -0
- package/dist/system/cleo-link.js.map +1 -0
- package/dist/system/dependencies.d.ts.map +1 -1
- package/dist/system/dependencies.js +26 -41
- package/dist/system/dependencies.js.map +1 -1
- package/dist/system/global-delivery.d.ts +205 -0
- package/dist/system/global-delivery.d.ts.map +1 -0
- package/dist/system/global-delivery.js +320 -0
- package/dist/system/global-delivery.js.map +1 -0
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +29 -6
- package/dist/system/health.js.map +1 -1
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +1 -20
- package/dist/system/project-health.js.map +1 -1
- package/dist/system/runtime.d.ts.map +1 -1
- package/dist/system/runtime.js +2 -12
- package/dist/system/runtime.js.map +1 -1
- package/dist/system/safestop.d.ts.map +1 -1
- package/dist/system/safestop.js +5 -2
- package/dist/system/safestop.js.map +1 -1
- package/dist/system/skill-fixtures.d.ts +200 -0
- package/dist/system/skill-fixtures.d.ts.map +1 -0
- package/dist/system/skill-fixtures.js +331 -0
- package/dist/system/skill-fixtures.js.map +1 -0
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +4 -2
- package/dist/tasks/add.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +173 -0
- package/dist/tasks/affected-packages.d.ts.map +1 -0
- package/dist/tasks/affected-packages.js +389 -0
- package/dist/tasks/affected-packages.js.map +1 -0
- package/dist/tasks/change-set.d.ts +151 -0
- package/dist/tasks/change-set.d.ts.map +1 -0
- package/dist/tasks/change-set.js +634 -0
- package/dist/tasks/change-set.js.map +1 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +10 -5
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/done-plan.d.ts +103 -0
- package/dist/tasks/done-plan.d.ts.map +1 -0
- package/dist/tasks/done-plan.js +541 -0
- package/dist/tasks/done-plan.js.map +1 -0
- package/dist/tasks/done-record.d.ts +127 -0
- package/dist/tasks/done-record.d.ts.map +1 -0
- package/dist/tasks/done-record.js +373 -0
- package/dist/tasks/done-record.js.map +1 -0
- package/dist/tasks/duplicate-detector.d.ts +68 -11
- package/dist/tasks/duplicate-detector.d.ts.map +1 -1
- package/dist/tasks/duplicate-detector.js +314 -58
- package/dist/tasks/duplicate-detector.js.map +1 -1
- package/dist/tasks/evidence-paths.d.ts +78 -0
- package/dist/tasks/evidence-paths.d.ts.map +1 -0
- package/dist/tasks/evidence-paths.js +150 -0
- package/dist/tasks/evidence-paths.js.map +1 -0
- package/dist/tasks/evidence.d.ts +55 -0
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +223 -26
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-preview.d.ts +5 -0
- package/dist/tasks/gate-preview.d.ts.map +1 -1
- package/dist/tasks/gate-preview.js +25 -21
- package/dist/tasks/gate-preview.js.map +1 -1
- package/dist/tasks/gate-result-cache.d.ts +205 -0
- package/dist/tasks/gate-result-cache.d.ts.map +1 -0
- package/dist/tasks/gate-result-cache.js +285 -0
- package/dist/tasks/gate-result-cache.js.map +1 -0
- package/dist/tasks/gate-runner.d.ts +126 -3
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +483 -28
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/session-scope.d.ts +3 -1
- package/dist/tasks/session-scope.d.ts.map +1 -1
- package/dist/tasks/session-scope.js +18 -3
- package/dist/tasks/session-scope.js.map +1 -1
- package/dist/tasks/tool-resolver.d.ts +23 -6
- package/dist/tasks/tool-resolver.d.ts.map +1 -1
- package/dist/tasks/tool-resolver.js +146 -8
- package/dist/tasks/tool-resolver.js.map +1 -1
- package/dist/tasks/tool-vacuity.d.ts +71 -0
- package/dist/tasks/tool-vacuity.d.ts.map +1 -0
- package/dist/tasks/tool-vacuity.js +334 -0
- package/dist/tasks/tool-vacuity.js.map +1 -0
- package/dist/tasks/update.d.ts +8 -0
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +159 -78
- package/dist/tasks/update.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +18 -2
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/doctor/checks.d.ts +20 -2
- package/dist/validation/doctor/checks.d.ts.map +1 -1
- package/dist/validation/doctor/checks.js +64 -4
- package/dist/validation/doctor/checks.js.map +1 -1
- package/dist/validation/doctor/index.d.ts +1 -1
- package/dist/validation/doctor/index.d.ts.map +1 -1
- package/dist/validation/doctor/index.js +1 -1
- package/dist/validation/doctor/index.js.map +1 -1
- package/dist/validation/doctor/utils.d.ts.map +1 -1
- package/dist/validation/doctor/utils.js +7 -2
- package/dist/validation/doctor/utils.js.map +1 -1
- package/dist/validation/engine-ops.d.ts +15 -0
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +249 -98
- package/dist/validation/engine-ops.js.map +1 -1
- package/migrations/drizzle-cleo-global/20260927000000_t12469-project-locations/migration.sql +121 -0
- package/migrations/drizzle-cleo-global/20260927010000_t12543-user-profile-project-scope/migration.sql +23 -0
- package/migrations/drizzle-cleo-global/20260928010000_t12470-location-candidates/migration.sql +72 -0
- package/migrations/drizzle-cleo-global/20260928020000_t12510-nexus-devices/migration.sql +34 -0
- package/migrations/drizzle-cleo-global/20260928030000_t12511-project-git-state/migration.sql +62 -0
- package/migrations/drizzle-cleo-project/20260927000000_t12499-session-terminal-bindings/migration.sql +34 -0
- package/migrations/drizzle-cleo-project/20260928000000_t12500-binding-provider-flag/migration.sql +15 -0
- package/package.json +23 -13
- package/schemas/config.schema.json +54 -0
- package/schemas/project-context.schema.json +51 -3
- package/schemas/project-info.schema.json +28 -1
- package/templates/CLEO-INJECTION.md +40 -332
- package/templates/CLEO-REFERENCE.md +303 -0
- package/templates/workflows/README.md +36 -14
- package/templates/workflows/release-prepare.yml.tmpl +7 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { argon2, createCipheriv, createDecipheriv, createHash, createHmac, createPrivateKey, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, sign, timingSafeEqual, verify, } from 'node:crypto';
|
|
2
|
+
import { KDF_LIMITS } from '@cleocode/contracts/cloud';
|
|
3
|
+
/**
|
|
4
|
+
* Cleo Nexus E2E primitives. Spec: docs/security/e2e-keys.md. Uses Node 24 node:crypto only.
|
|
5
|
+
* Every AEAD message derives a fresh subkey from a random 32-byte salt, so ChaCha20-Poly1305's
|
|
6
|
+
* 96-bit nonce is never reused under one key.
|
|
7
|
+
*/
|
|
8
|
+
const AEAD_VERSION = 0x01;
|
|
9
|
+
const SEAL_VERSION = 0x02;
|
|
10
|
+
const SALT = 32;
|
|
11
|
+
const NONCE = 12;
|
|
12
|
+
const TAG = 16;
|
|
13
|
+
export class DecryptError extends Error {
|
|
14
|
+
constructor(message = 'decryption failed: wrong key, wrong context, or tampered ciphertext') {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'DecryptError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export const randomKey = () => randomBytes(32);
|
|
20
|
+
function subkey(ikm, salt, purpose) {
|
|
21
|
+
return Buffer.from(hkdfSync('sha256', ikm, salt, `cleo-nexus/${purpose}/v1`, 32));
|
|
22
|
+
}
|
|
23
|
+
/** Derive a named key from a parent key (no salt). Examples: home-stream, verifier. */
|
|
24
|
+
export function deriveKey(parent, purpose) {
|
|
25
|
+
return Buffer.from(hkdfSync('sha256', parent, Buffer.alloc(0), `cleo-nexus/${purpose}/v1`, 32));
|
|
26
|
+
}
|
|
27
|
+
/** AEAD-encrypt `plaintext` under `key`, bound to `context` (AAD) and `purpose` (HKDF info). */
|
|
28
|
+
export function seal(key, plaintext, purpose, context) {
|
|
29
|
+
if (key.length !== 32)
|
|
30
|
+
throw new Error('key must be 32 bytes');
|
|
31
|
+
const salt = randomBytes(SALT);
|
|
32
|
+
const nonce = randomBytes(NONCE);
|
|
33
|
+
const cipher = createCipheriv('chacha20-poly1305', subkey(key, salt, purpose), nonce, {
|
|
34
|
+
authTagLength: TAG,
|
|
35
|
+
});
|
|
36
|
+
cipher.setAAD(Buffer.from(context, 'utf8'), { plaintextLength: plaintext.length });
|
|
37
|
+
const body = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
38
|
+
return Buffer.concat([Buffer.of(AEAD_VERSION), salt, nonce, body, cipher.getAuthTag()]);
|
|
39
|
+
}
|
|
40
|
+
export function open(key, envelope, purpose, context) {
|
|
41
|
+
const e = Buffer.from(envelope);
|
|
42
|
+
if (e.length < 1 + SALT + NONCE + TAG || e[0] !== AEAD_VERSION)
|
|
43
|
+
throw new DecryptError('not an AEAD v1 envelope');
|
|
44
|
+
const salt = e.subarray(1, 1 + SALT);
|
|
45
|
+
const nonce = e.subarray(1 + SALT, 1 + SALT + NONCE);
|
|
46
|
+
const body = e.subarray(1 + SALT + NONCE, e.length - TAG);
|
|
47
|
+
const tag = e.subarray(e.length - TAG);
|
|
48
|
+
try {
|
|
49
|
+
const d = createDecipheriv('chacha20-poly1305', subkey(key, salt, purpose), nonce, {
|
|
50
|
+
authTagLength: TAG,
|
|
51
|
+
});
|
|
52
|
+
d.setAAD(Buffer.from(context, 'utf8'), { plaintextLength: body.length });
|
|
53
|
+
d.setAuthTag(tag);
|
|
54
|
+
return Buffer.concat([d.update(body), d.final()]);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
throw new DecryptError();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ---------- X25519 sealed box ----------
|
|
61
|
+
const b64u = (b) => Buffer.from(b).toString('base64url');
|
|
62
|
+
function x25519Public(raw) {
|
|
63
|
+
return createPublicKey({ key: { kty: 'OKP', crv: 'X25519', x: b64u(raw) }, format: 'jwk' });
|
|
64
|
+
}
|
|
65
|
+
export function generateX25519() {
|
|
66
|
+
const { publicKey, privateKey } = generateKeyPairSync('x25519');
|
|
67
|
+
const jwk = privateKey.export({ format: 'jwk' });
|
|
68
|
+
return {
|
|
69
|
+
publicKey: Buffer.from(publicKey.export({ format: 'jwk' }).x, 'base64url'),
|
|
70
|
+
privateKey: Buffer.from(jwk.d, 'base64url'),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function x25519Private(pub, priv) {
|
|
74
|
+
return createPrivateKey({
|
|
75
|
+
key: { kty: 'OKP', crv: 'X25519', x: b64u(pub), d: b64u(priv) },
|
|
76
|
+
format: 'jwk',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** Encrypt to a recipient's X25519 public key. Only the holder of the private key can open it. */
|
|
80
|
+
export function sealTo(recipientPublic, plaintext, context) {
|
|
81
|
+
const eph = generateKeyPairSync('x25519');
|
|
82
|
+
const ephPub = Buffer.from(eph.publicKey.export({ format: 'jwk' }).x, 'base64url');
|
|
83
|
+
const shared = diffieHellman({
|
|
84
|
+
privateKey: eph.privateKey,
|
|
85
|
+
publicKey: x25519Public(recipientPublic),
|
|
86
|
+
});
|
|
87
|
+
const k = Buffer.from(hkdfSync('sha256', shared, Buffer.concat([ephPub, recipientPublic]), 'cleo-nexus/seal/v1', 32));
|
|
88
|
+
return Buffer.concat([Buffer.of(SEAL_VERSION), ephPub, seal(k, plaintext, 'seal', context)]);
|
|
89
|
+
}
|
|
90
|
+
export function openSealed(recipient, sealed, context) {
|
|
91
|
+
const s = Buffer.from(sealed);
|
|
92
|
+
if (s.length < 33 || s[0] !== SEAL_VERSION)
|
|
93
|
+
throw new DecryptError('not a sealed-box v2 envelope');
|
|
94
|
+
const ephPub = s.subarray(1, 33);
|
|
95
|
+
try {
|
|
96
|
+
const shared = diffieHellman({
|
|
97
|
+
privateKey: x25519Private(recipient.publicKey, recipient.privateKey),
|
|
98
|
+
publicKey: x25519Public(ephPub),
|
|
99
|
+
});
|
|
100
|
+
const k = Buffer.from(hkdfSync('sha256', shared, Buffer.concat([ephPub, recipient.publicKey]), 'cleo-nexus/seal/v1', 32));
|
|
101
|
+
return open(k, s.subarray(33), 'seal', context);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err instanceof DecryptError)
|
|
105
|
+
throw err;
|
|
106
|
+
throw new DecryptError();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// ---------- Ed25519 ----------
|
|
110
|
+
export function generateEd25519() {
|
|
111
|
+
const { publicKey, privateKey } = generateKeyPairSync('ed25519');
|
|
112
|
+
return {
|
|
113
|
+
publicKey: Buffer.from(publicKey.export({ format: 'jwk' }).x, 'base64url'),
|
|
114
|
+
privateKey: Buffer.from(privateKey.export({ format: 'jwk' }).d, 'base64url'),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export function signEd25519(kp, message) {
|
|
118
|
+
const key = createPrivateKey({
|
|
119
|
+
key: { kty: 'OKP', crv: 'Ed25519', x: b64u(kp.publicKey), d: b64u(kp.privateKey) },
|
|
120
|
+
format: 'jwk',
|
|
121
|
+
});
|
|
122
|
+
return sign(null, message, key);
|
|
123
|
+
}
|
|
124
|
+
export function verifyEd25519(publicKey, message, signature) {
|
|
125
|
+
try {
|
|
126
|
+
const key = createPublicKey({
|
|
127
|
+
key: { kty: 'OKP', crv: 'Ed25519', x: b64u(publicKey) },
|
|
128
|
+
format: 'jwk',
|
|
129
|
+
});
|
|
130
|
+
return verify(null, message, key, signature);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export const DEFAULT_KDF = { memoryKiB: 65_536, iterations: 3, parallelism: 1 };
|
|
137
|
+
export function newKdfParams() {
|
|
138
|
+
return { algorithm: 'argon2id', ...DEFAULT_KDF, salt: randomBytes(16).toString('base64') };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Refuse KDF parameters outside KDF_LIMITS. They come from the server, which must not be able to weaken
|
|
142
|
+
* the passphrase stretch or make the client allocate unbounded memory.
|
|
143
|
+
*/
|
|
144
|
+
export function checkKdfParams(p) {
|
|
145
|
+
const within = (v, b) => Number.isInteger(v) && v >= b.min && v <= b.max;
|
|
146
|
+
const salt = Buffer.from(p.salt, 'base64');
|
|
147
|
+
if (p.algorithm !== 'argon2id' ||
|
|
148
|
+
!within(p.memoryKiB, KDF_LIMITS.memoryKiB) ||
|
|
149
|
+
!within(p.iterations, KDF_LIMITS.iterations) ||
|
|
150
|
+
!within(p.parallelism, KDF_LIMITS.parallelism) ||
|
|
151
|
+
salt.length < 16 ||
|
|
152
|
+
salt.length > 64) {
|
|
153
|
+
throw new RangeError('KDF parameters are outside the accepted bounds');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export function passphraseKey(passphrase, p) {
|
|
157
|
+
checkKdfParams(p);
|
|
158
|
+
return new Promise((resolve, reject) => {
|
|
159
|
+
argon2('argon2id', {
|
|
160
|
+
message: Buffer.from(passphrase.normalize('NFKC'), 'utf8'),
|
|
161
|
+
nonce: Buffer.from(p.salt, 'base64'),
|
|
162
|
+
parallelism: p.parallelism,
|
|
163
|
+
tagLength: 32,
|
|
164
|
+
memory: p.memoryKiB,
|
|
165
|
+
passes: p.iterations,
|
|
166
|
+
}, (err, key) => (err ? reject(err) : resolve(Buffer.from(key))));
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// ---------- recovery key (Crockford base32, 13×4 chars with a 4-bit checksum) ----------
|
|
170
|
+
const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
|
171
|
+
export function encodeRecoveryKey(key) {
|
|
172
|
+
if (key.length !== 32)
|
|
173
|
+
throw new Error('recovery key must be 32 bytes');
|
|
174
|
+
const check = (createHash('sha256').update(key).digest()[0] ?? 0) >> 4;
|
|
175
|
+
let bits = 0n;
|
|
176
|
+
for (const b of key)
|
|
177
|
+
bits = (bits << 8n) | BigInt(b);
|
|
178
|
+
bits = (bits << 4n) | BigInt(check);
|
|
179
|
+
let out = '';
|
|
180
|
+
for (let i = 51; i >= 0; i--)
|
|
181
|
+
out += CROCKFORD[Number((bits >> BigInt(i * 5)) & 31n)];
|
|
182
|
+
return out.match(/.{4}/g)?.join('-') ?? out;
|
|
183
|
+
}
|
|
184
|
+
export function decodeRecoveryKey(text) {
|
|
185
|
+
const clean = text.toUpperCase().replace(/[-\s]/g, '').replace(/[IL]/g, '1').replace(/O/g, '0');
|
|
186
|
+
if (clean.length !== 52)
|
|
187
|
+
throw new Error('recovery key must be 52 characters');
|
|
188
|
+
let bits = 0n;
|
|
189
|
+
for (const ch of clean) {
|
|
190
|
+
const v = CROCKFORD.indexOf(ch);
|
|
191
|
+
if (v < 0)
|
|
192
|
+
throw new Error(`invalid recovery key character: ${ch}`);
|
|
193
|
+
bits = (bits << 5n) | BigInt(v);
|
|
194
|
+
}
|
|
195
|
+
const check = Number(bits & 15n);
|
|
196
|
+
bits >>= 4n;
|
|
197
|
+
const key = Buffer.alloc(32);
|
|
198
|
+
for (let i = 31; i >= 0; i--) {
|
|
199
|
+
key[i] = Number(bits & 255n);
|
|
200
|
+
bits >>= 8n;
|
|
201
|
+
}
|
|
202
|
+
if ((createHash('sha256').update(key).digest()[0] ?? 0) >> 4 !== check) {
|
|
203
|
+
throw new Error('recovery key checksum mismatch: check for a typo');
|
|
204
|
+
}
|
|
205
|
+
return key;
|
|
206
|
+
}
|
|
207
|
+
export function constantTimeEqual(a, b) {
|
|
208
|
+
return a.length === b.length && timingSafeEqual(a, b);
|
|
209
|
+
}
|
|
210
|
+
export const sha256Hex = (b) => createHash('sha256').update(b).digest('hex');
|
|
211
|
+
export const hmacSha256 = (key, message) => createHmac('sha256', key).update(message).digest();
|
|
212
|
+
/** A UUIDv7 (RFC 9562 §5.7): 48-bit Unix millis, then random bits. Used to mint checkpoint ids. */
|
|
213
|
+
export function uuidv7(now = Date.now()) {
|
|
214
|
+
const b = randomBytes(16);
|
|
215
|
+
const ms = BigInt(Math.max(0, Math.floor(now)));
|
|
216
|
+
for (let i = 0; i < 6; i++)
|
|
217
|
+
b[i] = Number((ms >> BigInt(8 * (5 - i))) & 0xffn);
|
|
218
|
+
b[6] = ((b[6] ?? 0) & 0x0f) | 0x70;
|
|
219
|
+
b[8] = ((b[8] ?? 0) & 0x3f) | 0x80;
|
|
220
|
+
const h = b.toString('hex');
|
|
221
|
+
return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/cloud/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,QAAQ,EAER,WAAW,EACX,IAAI,EACJ,eAAe,EACf,MAAM,GACP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD;;;;GAIG;AAEH,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,MAAM,KAAK,GAAG,EAAE,CAAC;AACjB,MAAM,GAAG,GAAG,EAAE,CAAC;AAEf,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAO,GAAG,qEAAqE;QACzF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAEvD,SAAS,MAAM,CAAC,GAAe,EAAE,IAAgB,EAAE,OAAe;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc,OAAO,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,SAAS,CAAC,MAAkB,EAAE,OAAe;IAC3D,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,OAAO,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,IAAI,CAClB,GAAe,EACf,SAAqB,EACrB,OAAe,EACf,OAAe;IAEf,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,cAAc,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE;QACpF,aAAa,EAAE,GAAG;KACnB,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,eAAe,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,GAAe,EACf,QAAoB,EACpB,OAAe,EACf,OAAe;IAEf,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY;QAC5D,MAAM,IAAI,YAAY,CAAC,yBAAyB,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE;YACjF,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QACH,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,0CAA0C;AAE1C,MAAM,IAAI,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAErE,SAAS,YAAY,CAAC,GAAe;IACnC,OAAO,eAAe,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9F,CAAC;AAOD,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAW,EAAE,WAAW,CAAC;QACpF,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAW,EAAE,WAAW,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAe,EAAE,IAAgB;IACtD,OAAO,gBAAgB,CAAC;QACtB,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QAC/D,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,MAAM,CACpB,eAA2B,EAC3B,SAAqB,EACrB,OAAe;IAEf,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAW,EAAE,WAAW,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,YAAY,CAAC,eAAe,CAAC;KACzC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAC/F,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAkB,EAAE,MAAkB,EAAE,OAAe;IAChF,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY;QACxC,MAAM,IAAI,YAAY,CAAC,8BAA8B,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC;YACpE,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CACnB,QAAQ,CACN,QAAQ,EACR,MAAM,EACN,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAC5C,oBAAoB,EACpB,EAAE,CACH,CACF,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,YAAY;YAAE,MAAM,GAAG,CAAC;QAC3C,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,gCAAgC;AAEhC,MAAM,UAAU,eAAe;IAC7B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACjE,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAW,EAAE,WAAW,CAAC;QACpF,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAW,EAAE,WAAW,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAW,EAAE,OAAmB;IAC1D,MAAM,GAAG,GAAG,gBAAgB,CAAC;QAC3B,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;QAClF,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,SAAqB,EACrB,OAAmB,EACnB,SAAqB;IAErB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,eAAe,CAAC;YAC1B,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;YACvD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAYD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAW,CAAC;AAEzF,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAAY;IACzC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAA+B,EAAE,EAAE,CAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,IACE,CAAC,CAAC,SAAS,KAAK,UAAU;QAC1B,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC;QAC1C,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC;QAC5C,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,MAAM,GAAG,EAAE,EAChB,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,gDAAgD,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,CAAY;IAC5D,cAAc,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CACJ,UAAU,EACV;YACE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC1D,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;YACpC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,CAAC,CAAC,SAAS;YACnB,MAAM,EAAE,CAAC,CAAC,UAAU;SACrB,EACD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0FAA0F;AAE1F,MAAM,SAAS,GAAG,kCAAkC,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACtF,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC/E,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,EAAE,CAAC;IACZ,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,EAAE,CAAC;IACd,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAa,EAAE,CAAa;IAC5D,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAe,EAAE,OAAmB,EAAU,EAAE,CACzE,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AAErD,mGAAmG;AACnG,MAAM,UAAU,MAAM,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;IAC7C,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ErrorCode } from '@cleocode/contracts/cloud';
|
|
2
|
+
/**
|
|
3
|
+
* `E_NETWORK`: the request never got an answer. `E_PROTOCOL`: the server answered with something the
|
|
4
|
+
* contract or the E2E checks do not allow (a malformed body, replayed or reordered segments, a rolled-back
|
|
5
|
+
* checkpoint). Both are client-side codes; the server never sends them.
|
|
6
|
+
*/
|
|
7
|
+
export type ClientErrorCode = ErrorCode | 'E_NETWORK' | 'E_PROTOCOL';
|
|
8
|
+
export declare class NexusError extends Error {
|
|
9
|
+
readonly code: ClientErrorCode;
|
|
10
|
+
readonly status: number;
|
|
11
|
+
readonly requestId: string | null;
|
|
12
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
13
|
+
constructor(code: ClientErrorCode, message: string, status: number, requestId: string | null, details?: Record<string, unknown> | undefined);
|
|
14
|
+
}
|
|
15
|
+
export type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
|
|
16
|
+
/** Anything with zod's `safeParse`: every response body is parsed against its contract schema. */
|
|
17
|
+
export interface ResponseSchema<T> {
|
|
18
|
+
safeParse(data: unknown): {
|
|
19
|
+
success: boolean;
|
|
20
|
+
data?: T;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface HttpOptions {
|
|
24
|
+
/** https, or http only for localhost (tests and local development). */
|
|
25
|
+
baseUrl: string;
|
|
26
|
+
token: string;
|
|
27
|
+
deviceId?: string;
|
|
28
|
+
fetch?: FetchLike;
|
|
29
|
+
/** Attempts for retryable failures: network, 5xx, 429. Default 4. */
|
|
30
|
+
maxAttempts?: number;
|
|
31
|
+
sleep?: (ms: number) => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
/** The longest a server-sent Retry-After may make the client wait. Longer values are clamped. */
|
|
34
|
+
export declare const MAX_RETRY_AFTER_MS = 30000;
|
|
35
|
+
/** True for https URLs, and for http URLs on a loopback host. */
|
|
36
|
+
export declare function isSecureUrl(url: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Minimal envelope-aware HTTP client. It retries only failures that are safe to retry. Every API
|
|
39
|
+
* write is idempotent or lineage-checked, so a retried write either no-ops or is refused explicitly.
|
|
40
|
+
* It never follows redirects, so a bearer token is never replayed to another origin.
|
|
41
|
+
*/
|
|
42
|
+
export declare class Http {
|
|
43
|
+
private readonly o;
|
|
44
|
+
private readonly fetch;
|
|
45
|
+
private readonly sleep;
|
|
46
|
+
constructor(o: HttpOptions);
|
|
47
|
+
/** Send a request and parse the success payload against `schema`. A payload that does not parse is E_PROTOCOL. */
|
|
48
|
+
request<T>(method: string, path: string, schema: ResponseSchema<T>, body?: unknown): Promise<T>;
|
|
49
|
+
}
|
|
50
|
+
/** Honour a numeric Retry-After, clamped to MAX_RETRY_AFTER_MS; otherwise back off exponentially. */
|
|
51
|
+
export declare function retryDelay(retryAfter: string | null, attempt: number): number;
|
|
52
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/cloud/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAErE,qBAAa,UAAW,SAAQ,KAAK;IAEjC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAE9B,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAJjC,IAAI,EAAE,eAAe,EAC9B,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAK7C;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjF,kGAAkG;AAClG,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAID,iGAAiG;AACjG,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAIzC,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOhD;AAED;;;;GAIG;AACH,qBAAa,IAAI;IAIH,OAAO,CAAC,QAAQ,CAAC,CAAC;IAH9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAEzB,CAAC,EAAE,WAAW;IAa3C,kHAAkH;IAC5G,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;CA0Dd;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM7E"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export class NexusError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
status;
|
|
4
|
+
requestId;
|
|
5
|
+
details;
|
|
6
|
+
constructor(code, message, status, requestId, details) {
|
|
7
|
+
super(`${code}: ${message}${requestId ? ` (request ${requestId})` : ''}`);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.requestId = requestId;
|
|
11
|
+
this.details = details;
|
|
12
|
+
this.name = 'NexusError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const RETRYABLE = new Set([429, 500, 502, 503, 504]);
|
|
16
|
+
/** The longest a server-sent Retry-After may make the client wait. Longer values are clamped. */
|
|
17
|
+
export const MAX_RETRY_AFTER_MS = 30_000;
|
|
18
|
+
const LOOPBACK = new Set(['localhost', '127.0.0.1', '[::1]']);
|
|
19
|
+
/** True for https URLs, and for http URLs on a loopback host. */
|
|
20
|
+
export function isSecureUrl(url) {
|
|
21
|
+
try {
|
|
22
|
+
const u = new URL(url);
|
|
23
|
+
return u.protocol === 'https:' || (u.protocol === 'http:' && LOOPBACK.has(u.hostname));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Minimal envelope-aware HTTP client. It retries only failures that are safe to retry. Every API
|
|
31
|
+
* write is idempotent or lineage-checked, so a retried write either no-ops or is refused explicitly.
|
|
32
|
+
* It never follows redirects, so a bearer token is never replayed to another origin.
|
|
33
|
+
*/
|
|
34
|
+
export class Http {
|
|
35
|
+
o;
|
|
36
|
+
fetch;
|
|
37
|
+
sleep;
|
|
38
|
+
constructor(o) {
|
|
39
|
+
this.o = o;
|
|
40
|
+
if (!isSecureUrl(o.baseUrl)) {
|
|
41
|
+
throw new NexusError('E_VALIDATION', 'baseUrl must be https (http is allowed only for localhost)', 0, null);
|
|
42
|
+
}
|
|
43
|
+
this.fetch = o.fetch ?? ((i, init) => globalThis.fetch(i, init));
|
|
44
|
+
this.sleep = o.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
45
|
+
}
|
|
46
|
+
/** Send a request and parse the success payload against `schema`. A payload that does not parse is E_PROTOCOL. */
|
|
47
|
+
async request(method, path, schema, body) {
|
|
48
|
+
const attempts = this.o.maxAttempts ?? 4;
|
|
49
|
+
let lastErr;
|
|
50
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
51
|
+
let res;
|
|
52
|
+
try {
|
|
53
|
+
const headers = { authorization: `Bearer ${this.o.token}` };
|
|
54
|
+
if (this.o.deviceId)
|
|
55
|
+
headers['x-cleo-device-id'] = this.o.deviceId;
|
|
56
|
+
if (body !== undefined)
|
|
57
|
+
headers['content-type'] = 'application/json';
|
|
58
|
+
res = await this.fetch(`${this.o.baseUrl}${path}`, {
|
|
59
|
+
method,
|
|
60
|
+
headers,
|
|
61
|
+
redirect: 'error',
|
|
62
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
lastErr = new NexusError('E_NETWORK', err.message, 0, null);
|
|
67
|
+
if (attempt < attempts)
|
|
68
|
+
await this.sleep(backoff(attempt));
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const json = (await res.json().catch(() => null));
|
|
72
|
+
const requestId = res.headers.get('x-request-id');
|
|
73
|
+
if (json?.success === true) {
|
|
74
|
+
const parsed = schema.safeParse(json.data);
|
|
75
|
+
if (!parsed.success) {
|
|
76
|
+
throw new NexusError('E_PROTOCOL', `${method} ${path}: response does not match the contract`, res.status, requestId);
|
|
77
|
+
}
|
|
78
|
+
return parsed.data;
|
|
79
|
+
}
|
|
80
|
+
const e = json && json.success === false ? json.error : null;
|
|
81
|
+
lastErr = new NexusError(e?.code ?? 'E_INTERNAL', e?.message ?? `HTTP ${res.status}`, res.status, e?.requestId ?? requestId, e?.details);
|
|
82
|
+
if (!RETRYABLE.has(res.status) || attempt === attempts)
|
|
83
|
+
throw lastErr;
|
|
84
|
+
await this.sleep(retryDelay(res.headers.get('retry-after'), attempt));
|
|
85
|
+
}
|
|
86
|
+
throw lastErr ?? new NexusError('E_NETWORK', 'request failed', 0, null);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** Honour a numeric Retry-After, clamped to MAX_RETRY_AFTER_MS; otherwise back off exponentially. */
|
|
90
|
+
export function retryDelay(retryAfter, attempt) {
|
|
91
|
+
const seconds = Number(retryAfter);
|
|
92
|
+
if (retryAfter !== null && retryAfter.trim() !== '' && Number.isFinite(seconds) && seconds > 0) {
|
|
93
|
+
return Math.min(MAX_RETRY_AFTER_MS, seconds * 1000);
|
|
94
|
+
}
|
|
95
|
+
return backoff(attempt);
|
|
96
|
+
}
|
|
97
|
+
const backoff = (attempt) => Math.min(8_000, 250 * 2 ** (attempt - 1)) + Math.floor(Math.random() * 100);
|
|
98
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/cloud/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cleo Nexus cloud client runtime (T12534): E2E crypto, key hierarchy, the envelope HTTP client,
|
|
3
|
+
* journal push/pull with signature verification, the checkpoint manifest regression check, and the
|
|
4
|
+
* segment signing message. `node:crypto` only; no dependencies.
|
|
5
|
+
*
|
|
6
|
+
* Wire types: `@cleocode/contracts/cloud` (T12533). Spec: cleo-nexus `docs/security/e2e-keys.md`.
|
|
7
|
+
* Server: kryptobaseddev/cleo-nexus (ADR-095). `cleo cloud …` commands (T12337) build on this.
|
|
8
|
+
*
|
|
9
|
+
* @module cloud
|
|
10
|
+
*/
|
|
11
|
+
export * from './crypto.js';
|
|
12
|
+
export * from './http.js';
|
|
13
|
+
export * from './journal.js';
|
|
14
|
+
export * from './keys.js';
|
|
15
|
+
export * from './manifest-check.js';
|
|
16
|
+
export * from './projects.js';
|
|
17
|
+
export * from './signing.js';
|
|
18
|
+
export * from './streams.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cleo Nexus cloud client runtime (T12534): E2E crypto, key hierarchy, the envelope HTTP client,
|
|
3
|
+
* journal push/pull with signature verification, the checkpoint manifest regression check, and the
|
|
4
|
+
* segment signing message. `node:crypto` only; no dependencies.
|
|
5
|
+
*
|
|
6
|
+
* Wire types: `@cleocode/contracts/cloud` (T12533). Spec: cleo-nexus `docs/security/e2e-keys.md`.
|
|
7
|
+
* Server: kryptobaseddev/cleo-nexus (ADR-095). `cleo cloud …` commands (T12337) build on this.
|
|
8
|
+
*
|
|
9
|
+
* @module cloud
|
|
10
|
+
*/
|
|
11
|
+
export * from './crypto.js';
|
|
12
|
+
export * from './http.js';
|
|
13
|
+
export * from './journal.js';
|
|
14
|
+
export * from './keys.js';
|
|
15
|
+
export * from './manifest-check.js';
|
|
16
|
+
export * from './projects.js';
|
|
17
|
+
export * from './signing.js';
|
|
18
|
+
export * from './streams.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { AppendSegmentResult, type Checkpoint, type Manifest, type ReplicaHeads, type RevocationPins, type Segment } from '@cleocode/contracts/cloud';
|
|
2
|
+
import { type KeyPair } from './crypto.js';
|
|
3
|
+
import { type FetchLike, type Http } from './http.js';
|
|
4
|
+
import { type TrustedSigners } from './keys.js';
|
|
5
|
+
import { type SegmentMetaFields } from './signing.js';
|
|
6
|
+
export type Uploader = (url: string, headers: Record<string, string>, bytes: Buffer) => Promise<void>;
|
|
7
|
+
/** Download `url`, refusing (and no longer reading) once more than `maxBytes` arrive. */
|
|
8
|
+
export type Downloader = (url: string, maxBytes: number) => Promise<Buffer>;
|
|
9
|
+
/**
|
|
10
|
+
* Why the client refused what the server sent. Every refusal carries one in `details.reason`, so the
|
|
11
|
+
* caller (and the tests) can tell the checks apart. None of them is retryable as is.
|
|
12
|
+
*/
|
|
13
|
+
export type RefusalReason = 'unknown-signer' | 'bad-signature' | 'hash-mismatch' | 'blob-hash' | 'blob-size' | 'decrypt' | 'payload' | 'seq-order' | 'replica-device' | 'replica-replay' | 'replica-gap' | 'page' | 'checkpoint-stream' | 'checkpoint-rollback' | 'checkpoint-replicas' | 'revoked-signer' | 'too-large';
|
|
14
|
+
/** The default downloader: https only, no redirects, and it stops reading past `maxBytes`. */
|
|
15
|
+
export declare function cappedDownloader(fetchImpl: FetchLike): Downloader;
|
|
16
|
+
export type SegmentMeta = SegmentMetaFields;
|
|
17
|
+
export interface PulledSegment {
|
|
18
|
+
seq: number;
|
|
19
|
+
replicaId: string;
|
|
20
|
+
replicaSeq: number;
|
|
21
|
+
deviceId: string;
|
|
22
|
+
plaintext: Buffer;
|
|
23
|
+
meta: SegmentMeta;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Where a replica's pull stands. The caller persists it in the same local transaction that applies the
|
|
27
|
+
* pulled ops, and passes it back to the next pull. It is what lets the client refuse replayed,
|
|
28
|
+
* reordered, re-attributed and gapped segments across pages and restarts.
|
|
29
|
+
*/
|
|
30
|
+
export interface PullCursor {
|
|
31
|
+
/** The last stream seq applied. The next pull asks for segments strictly after it. */
|
|
32
|
+
after: number;
|
|
33
|
+
/**
|
|
34
|
+
* True when `replicas` lists every replica with a segment at or below `after`: the cursor started at
|
|
35
|
+
* genesis, or was seeded from a checkpoint's signed replica map (cursorFromCheckpoint). A replica first
|
|
36
|
+
* seen later must then start at replicaSeq 0. False only for a cursor built some other way.
|
|
37
|
+
*/
|
|
38
|
+
knowsAllReplicas: boolean;
|
|
39
|
+
/** Per replica: the device that signs its segments (pinned at first sight) and the last replicaSeq applied. */
|
|
40
|
+
replicas: Record<string, {
|
|
41
|
+
deviceId: string;
|
|
42
|
+
replicaSeq: number;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
export declare const initialPullCursor: () => PullCursor;
|
|
46
|
+
/** A cursor that resumes right after a (verified) checkpoint, seeded from its signed replica map. */
|
|
47
|
+
export declare function cursorFromCheckpoint(cp: Pick<Checkpoint, 'coversSeq' | 'replicas'>): PullCursor;
|
|
48
|
+
/**
|
|
49
|
+
* The pins for revoking `deviceId`'s key: the last replicaSeq of each of its replicas in the given
|
|
50
|
+
* cursors, and the highest coversSeq of its checkpoints in the given (already verified) lists. Compute
|
|
51
|
+
* them from pulls this client verified itself, with the key trusted as pending (certifiedSigners with
|
|
52
|
+
* includePending), before signing the revocation.
|
|
53
|
+
*/
|
|
54
|
+
export declare function revocationPins(deviceId: string, streams: readonly {
|
|
55
|
+
streamId: string;
|
|
56
|
+
cursor: PullCursor;
|
|
57
|
+
checkpoints?: readonly Checkpoint[];
|
|
58
|
+
}[]): RevocationPins;
|
|
59
|
+
export interface JournalOptions {
|
|
60
|
+
http: Http;
|
|
61
|
+
streamId: string;
|
|
62
|
+
replicaId: string;
|
|
63
|
+
deviceId: string;
|
|
64
|
+
signing: KeyPair;
|
|
65
|
+
/** The stream data key: a project data key (PDK) or the home stream key (HSK). */
|
|
66
|
+
key: Buffer;
|
|
67
|
+
uploader?: Uploader;
|
|
68
|
+
downloader?: Downloader;
|
|
69
|
+
/** Used by the default uploader and downloader. Defaults to the global fetch. */
|
|
70
|
+
fetch?: FetchLike;
|
|
71
|
+
/** The largest segment blob a pull will download. Default 256 MiB. */
|
|
72
|
+
maxSegmentBlobBytes?: number;
|
|
73
|
+
}
|
|
74
|
+
/** sha256 of the canonical segment metadata. Covered by the segment signature and the ciphertext AAD. */
|
|
75
|
+
export declare const segmentMetaHash: (m: SegmentMetaFields) => string;
|
|
76
|
+
/** sha256 of the canonical manifest. Covered by the checkpoint signature. */
|
|
77
|
+
export declare const manifestHash: (m: Manifest) => string;
|
|
78
|
+
/** sha256 of the canonical replica map. Covered by the checkpoint signature. */
|
|
79
|
+
export declare const replicasHash: (r: ReplicaHeads) => string;
|
|
80
|
+
/**
|
|
81
|
+
* One replica's view of one journal stream. The caller owns durable state (`nextReplicaSeq`, the
|
|
82
|
+
* PullCursor and the highest checkpoint coversSeq seen) and must persist it in the same local
|
|
83
|
+
* transaction that records what was sent or applied.
|
|
84
|
+
*/
|
|
85
|
+
export declare class Journal {
|
|
86
|
+
private readonly o;
|
|
87
|
+
private readonly up;
|
|
88
|
+
private readonly down;
|
|
89
|
+
private readonly base;
|
|
90
|
+
private readonly maxSegmentBlobBytes;
|
|
91
|
+
constructor(o: JournalOptions);
|
|
92
|
+
/**
|
|
93
|
+
* Encrypt, sign and append one segment of ops. Safe to retry with the same replicaSeq, metadata and
|
|
94
|
+
* `sealed` bytes (from sealSegment): re-encrypting would change the hash and defeat idempotency.
|
|
95
|
+
*/
|
|
96
|
+
push(replicaSeq: number, plaintext: Uint8Array, meta: SegmentMeta, sealed?: Buffer): Promise<AppendSegmentResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Encrypt a segment without sending it, so the caller can persist the exact bytes before pushing.
|
|
99
|
+
* The AAD covers the metadata hash, so the same `meta` must be passed to push.
|
|
100
|
+
*/
|
|
101
|
+
sealSegment(replicaSeq: number, plaintext: Uint8Array, meta: SegmentMeta): Buffer;
|
|
102
|
+
/**
|
|
103
|
+
* Pull, verify and decrypt the segments after `cursor.after`. Nothing unverified is ever returned for
|
|
104
|
+
* applying: the pull stops with a NexusError (see RefusalReason) when a segment
|
|
105
|
+
* - is not strictly after the previous one (replayed or reordered: `seq-order`);
|
|
106
|
+
* - is signed by a device outside `trustedSigners` (`unknown-signer`), or its signature fails over the
|
|
107
|
+
* stream, replica, device, position, ciphertext hash and metadata hash (`bad-signature`);
|
|
108
|
+
* - belongs to a replica pinned to another device (`replica-device`), repeats a replicaSeq
|
|
109
|
+
* (`replica-replay`) or skips one (`replica-gap`);
|
|
110
|
+
* - is signed by a revoked key past its revocation pin (`revoked-signer`);
|
|
111
|
+
* - has bytes that do not match its hash (`hash-mismatch`, `blob-hash`, `blob-size`) or fail to decrypt.
|
|
112
|
+
* Returns the next cursor; persist it with the applied ops, together with the TrustState returned by the
|
|
113
|
+
* certifiedSigners call that built `trustedSigners`, in the same local transaction. Nothing in core does
|
|
114
|
+
* this yet; the caller must.
|
|
115
|
+
*/
|
|
116
|
+
pull(cursor: PullCursor, trustedSigners: TrustedSigners, limit?: number): Promise<{
|
|
117
|
+
segments: PulledSegment[];
|
|
118
|
+
head: number;
|
|
119
|
+
cursor: PullCursor;
|
|
120
|
+
}>;
|
|
121
|
+
private verifyAndOpen;
|
|
122
|
+
private decrypt;
|
|
123
|
+
/**
|
|
124
|
+
* Encrypt, upload and sign a checkpoint bundle, then register it. The client mints the checkpoint id,
|
|
125
|
+
* because the signature and the bundle's AAD both cover it. `cursor` is this replica's pull cursor at
|
|
126
|
+
* the point the bundle captures: it gives coversSeq and the signed replica map, so it must know every
|
|
127
|
+
* replica. The server verifies the signature and the replica map, and refuses lineage breaks and
|
|
128
|
+
* regressions. A retry of the same checkpoint returns it again.
|
|
129
|
+
*/
|
|
130
|
+
pushCheckpoint(args: {
|
|
131
|
+
bundle: Uint8Array;
|
|
132
|
+
manifest: Manifest;
|
|
133
|
+
cursor: PullCursor;
|
|
134
|
+
parentCheckpointId: string | null;
|
|
135
|
+
}): Promise<Checkpoint>;
|
|
136
|
+
/**
|
|
137
|
+
* Check a checkpoint record: it belongs to this stream, and a trusted key signed every field that
|
|
138
|
+
* matters (ids, lineage, coversSeq, manifest, replica map, bundle hash and size). Accepted signers:
|
|
139
|
+
* - the author, with a live key, or with a revoked key whose pin for this stream covers coversSeq;
|
|
140
|
+
* - otherwise, any live device that endorsed (re-signed) it.
|
|
141
|
+
*/
|
|
142
|
+
verifyCheckpoint(cp: Checkpoint, trustedSigners: TrustedSigners): void;
|
|
143
|
+
/**
|
|
144
|
+
* Re-sign (endorse) a checkpoint with this device's key, after checking it against `trustedSigners`,
|
|
145
|
+
* for example so that a checkpoint written by a device about to be revoked stays restorable without its pin.
|
|
146
|
+
*/
|
|
147
|
+
endorseCheckpoint(cp: Checkpoint, trustedSigners: TrustedSigners): Promise<Checkpoint>;
|
|
148
|
+
/**
|
|
149
|
+
* Download, verify and decrypt a checkpoint bundle (point-in-time restore). `minCoversSeq` is the
|
|
150
|
+
* highest checkpoint coversSeq this replica has already seen (the caller persists it): an older
|
|
151
|
+
* checkpoint is refused, so the server cannot roll the replica back. The returned cursor resumes the
|
|
152
|
+
* pull after the checkpoint, seeded from its signed replica map.
|
|
153
|
+
*/
|
|
154
|
+
restoreCheckpoint(checkpointId: string, trustedSigners: TrustedSigners, opts?: {
|
|
155
|
+
minCoversSeq?: number;
|
|
156
|
+
}): Promise<{
|
|
157
|
+
bundle: Buffer;
|
|
158
|
+
checkpoint: Checkpoint;
|
|
159
|
+
cursor: PullCursor;
|
|
160
|
+
}>;
|
|
161
|
+
private uploadBlob;
|
|
162
|
+
/**
|
|
163
|
+
* Download a segment stored as a blob. The blob may have been uploaded by another member, so it is
|
|
164
|
+
* fetched through the stream (`GET …/segments/:seq/blob`), not the caller's own blob scope. At most the
|
|
165
|
+
* announced size is read, and the bytes must match that size and the segment's sha256.
|
|
166
|
+
*/
|
|
167
|
+
downloadSegmentBlob(s: Pick<Segment, 'seq' | 'blobSha256'>): Promise<Buffer>;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/cloud/journal.ts"],"names":[],"mappings":"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"}
|