devcontour-harness 0.0.0-stage → 0.1.0-alpha.6
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/LICENSE +21 -0
- package/README.md +183 -2
- package/docs/architecture.md +473 -0
- package/docs/compatibility-versions.md +56 -0
- package/docs/compatibility.md +192 -0
- package/docs/connectors.md +323 -0
- package/docs/contracts.md +603 -0
- package/docs/integrations/hindsight.md +148 -0
- package/docs/quickstart.md +182 -0
- package/docs/release-notes/0.1.0-alpha.6.md +238 -0
- package/docs/review-probes.md +120 -0
- package/docs/review-protocol.md +251 -0
- package/docs/toolchains.md +167 -0
- package/docs/turbo-starter.md +269 -0
- package/docs/upgrade.md +202 -0
- package/examples/README.md +27 -0
- package/examples/external-connector/README.md +19 -0
- package/examples/external-connector/connector.mjs +55 -0
- package/examples/files-only/README.md +28 -0
- package/examples/files-only/context/norms/rules.md +4 -0
- package/examples/files-only/graph.json +23 -0
- package/examples/files-only/policy.json +30 -0
- package/examples/one-vendor/README.md +19 -0
- package/examples/one-vendor/policy.json +27 -0
- package/examples/single-task/README.md +18 -0
- package/examples/single-task/graph.json +27 -0
- package/examples/single-task/policy-same-vendor.json +55 -0
- package/examples/single-task/policy.json +52 -0
- package/examples/single-task/src/.gitkeep +0 -0
- package/examples/single-task/test/run.js +19 -0
- package/examples/toolchains/README.md +32 -0
- package/examples/toolchains/go/bad/label/label.go +9 -0
- package/examples/toolchains/go/good/label/label.go +9 -0
- package/examples/toolchains/go/policy.json +79 -0
- package/examples/toolchains/go/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/go/repo/_gitignore +1 -0
- package/examples/toolchains/go/repo/go.mod +5 -0
- package/examples/toolchains/go/repo/go.sum +2 -0
- package/examples/toolchains/go/repo/label/label.go +9 -0
- package/examples/toolchains/go/repo/label/label_test.go +27 -0
- package/examples/toolchains/go/repo/label/version.go +9 -0
- package/examples/toolchains/go/task.json +25 -0
- package/examples/toolchains/mixed-go/bad/backend/label/label.go +9 -0
- package/examples/toolchains/mixed-go/bad/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-go/good/backend/label/label.go +9 -0
- package/examples/toolchains/mixed-go/good/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-go/policy.json +126 -0
- package/examples/toolchains/mixed-go/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/mixed-go/repo/_gitignore +6 -0
- package/examples/toolchains/mixed-go/repo/backend/go.mod +3 -0
- package/examples/toolchains/mixed-go/repo/backend/label/label.go +9 -0
- package/examples/toolchains/mixed-go/repo/backend/label/label_test.go +30 -0
- package/examples/toolchains/mixed-go/repo/contract/check.mjs +17 -0
- package/examples/toolchains/mixed-go/repo/contract/label.json +9 -0
- package/examples/toolchains/mixed-go/repo/frontend/package.json +15 -0
- package/examples/toolchains/mixed-go/repo/frontend/pnpm-lock.yaml +22 -0
- package/examples/toolchains/mixed-go/repo/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-go/repo/frontend/test/label.test.js +11 -0
- package/examples/toolchains/mixed-go/task.json +25 -0
- package/examples/toolchains/mixed-python/bad/backend/src/fx_backend/__init__.py +6 -0
- package/examples/toolchains/mixed-python/bad/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-python/good/backend/src/fx_backend/__init__.py +6 -0
- package/examples/toolchains/mixed-python/good/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-python/policy.json +121 -0
- package/examples/toolchains/mixed-python/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/mixed-python/repo/_gitignore +6 -0
- package/examples/toolchains/mixed-python/repo/backend/.python-version +1 -0
- package/examples/toolchains/mixed-python/repo/backend/pyproject.toml +19 -0
- package/examples/toolchains/mixed-python/repo/backend/src/fx_backend/__init__.py +6 -0
- package/examples/toolchains/mixed-python/repo/backend/tests/test_label.py +11 -0
- package/examples/toolchains/mixed-python/repo/backend/uv.lock +108 -0
- package/examples/toolchains/mixed-python/repo/contract/check.mjs +17 -0
- package/examples/toolchains/mixed-python/repo/contract/label.json +9 -0
- package/examples/toolchains/mixed-python/repo/frontend/package.json +15 -0
- package/examples/toolchains/mixed-python/repo/frontend/pnpm-lock.yaml +22 -0
- package/examples/toolchains/mixed-python/repo/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-python/repo/frontend/test/label.test.js +11 -0
- package/examples/toolchains/mixed-python/task.json +25 -0
- package/examples/toolchains/npm/bad/src/label.js +4 -0
- package/examples/toolchains/npm/good/src/label.js +4 -0
- package/examples/toolchains/npm/policy.json +82 -0
- package/examples/toolchains/npm/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/npm/repo/_gitignore +4 -0
- package/examples/toolchains/npm/repo/package-lock.json +22 -0
- package/examples/toolchains/npm/repo/package.json +13 -0
- package/examples/toolchains/npm/repo/src/label.js +4 -0
- package/examples/toolchains/npm/repo/test/label.test.js +13 -0
- package/examples/toolchains/npm/task.json +25 -0
- package/examples/toolchains/pnpm/bad/packages/label/src/label.js +4 -0
- package/examples/toolchains/pnpm/good/packages/label/src/label.js +4 -0
- package/examples/toolchains/pnpm/policy.json +85 -0
- package/examples/toolchains/pnpm/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/pnpm/repo/_gitignore +4 -0
- package/examples/toolchains/pnpm/repo/package.json +10 -0
- package/examples/toolchains/pnpm/repo/packages/checker/check.mjs +5 -0
- package/examples/toolchains/pnpm/repo/packages/checker/package.json +9 -0
- package/examples/toolchains/pnpm/repo/packages/label/package.json +14 -0
- package/examples/toolchains/pnpm/repo/packages/label/src/label.js +4 -0
- package/examples/toolchains/pnpm/repo/packages/label/test/label.test.js +13 -0
- package/examples/toolchains/pnpm/repo/pnpm-lock.yaml +29 -0
- package/examples/toolchains/pnpm/repo/pnpm-workspace.yaml +2 -0
- package/examples/toolchains/pnpm/task.json +25 -0
- package/examples/toolchains/python/bad/src/fx_label/__init__.py +6 -0
- package/examples/toolchains/python/good/src/fx_label/__init__.py +6 -0
- package/examples/toolchains/python/policy.json +80 -0
- package/examples/toolchains/python/repo/.python-version +1 -0
- package/examples/toolchains/python/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/python/repo/_gitignore +5 -0
- package/examples/toolchains/python/repo/pyproject.toml +19 -0
- package/examples/toolchains/python/repo/src/fx_label/__init__.py +6 -0
- package/examples/toolchains/python/repo/tests/test_label.py +13 -0
- package/examples/toolchains/python/repo/uv.lock +108 -0
- package/examples/toolchains/python/task.json +25 -0
- package/examples/toolchains/turbo/bad/packages/label/src/label.js +4 -0
- package/examples/toolchains/turbo/good/packages/label/src/label.js +4 -0
- package/examples/toolchains/turbo/policy.json +110 -0
- package/examples/toolchains/turbo/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/turbo/repo/_gitignore +4 -0
- package/examples/toolchains/turbo/repo/package.json +13 -0
- package/examples/toolchains/turbo/repo/packages/checker/check.mjs +5 -0
- package/examples/toolchains/turbo/repo/packages/checker/package.json +9 -0
- package/examples/toolchains/turbo/repo/packages/label/package.json +14 -0
- package/examples/toolchains/turbo/repo/packages/label/src/label.js +4 -0
- package/examples/toolchains/turbo/repo/packages/label/test/label.test.js +13 -0
- package/examples/toolchains/turbo/repo/pnpm-lock.yaml +94 -0
- package/examples/toolchains/turbo/repo/pnpm-workspace.yaml +2 -0
- package/examples/toolchains/turbo/repo/turbo.json +7 -0
- package/examples/toolchains/turbo/task.json +25 -0
- package/examples/turbo-starter/README.md +16 -0
- package/examples/turbo-starter/changes/issued-at-consumer-only.patch +12 -0
- package/examples/turbo-starter/changes/issued-at.patch +130 -0
- package/examples/turbo-starter/cleanup.mjs +58 -0
- package/examples/turbo-starter/graph.json +32 -0
- package/examples/turbo-starter/harness/acceptance/db-isolation.test.mjs +97 -0
- package/examples/turbo-starter/harness/acceptance/env-probe.test.mjs +75 -0
- package/examples/turbo-starter/harness/acceptance/generation.test.mjs +54 -0
- package/examples/turbo-starter/harness/acceptance/issued-at.test.mjs +43 -0
- package/examples/turbo-starter/harness/acceptance/lifecycle-probe.test.mjs +47 -0
- package/examples/turbo-starter/harness/compose-bridge.mjs +593 -0
- package/examples/turbo-starter/harness/compose.acceptance.yml +23 -0
- package/examples/turbo-starter/harness/env/backend.env.template +7 -0
- package/examples/turbo-starter/harness/env/compose.env.template +6 -0
- package/examples/turbo-starter/policy.json +109 -0
- package/examples/turbo-starter/policy.lifecycle.json +114 -0
- package/examples/turbo-starter/setup.mjs +352 -0
- package/examples/two-vendors/policy.json +30 -0
- package/lib/agents/cli-adapter.d.ts +48 -0
- package/lib/agents/cli-adapter.js +386 -0
- package/lib/agents/inspect.d.ts +6 -0
- package/lib/agents/inspect.js +46 -0
- package/lib/agents/probe-server.d.ts +2 -0
- package/lib/agents/probe-server.js +13 -0
- package/lib/agents/review-probe.d.ts +295 -0
- package/lib/agents/review-probe.js +872 -0
- package/lib/agents/runtime-events.d.ts +11 -0
- package/lib/agents/runtime-events.js +21 -0
- package/lib/agents/schemas.d.ts +217 -0
- package/lib/agents/schemas.js +124 -0
- package/lib/agents/usage.d.ts +8 -0
- package/lib/agents/usage.js +83 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.js +491 -0
- package/lib/connectors/files.d.ts +108 -0
- package/lib/connectors/files.js +133 -0
- package/lib/contracts/checks.d.ts +307 -0
- package/lib/contracts/checks.js +181 -0
- package/lib/contracts/cli.d.ts +3895 -0
- package/lib/contracts/cli.js +664 -0
- package/lib/contracts/context.d.ts +135 -0
- package/lib/contracts/context.js +129 -0
- package/lib/contracts/digest.d.ts +9 -0
- package/lib/contracts/digest.js +22 -0
- package/lib/contracts/errors.d.ts +81 -0
- package/lib/contracts/errors.js +70 -0
- package/lib/contracts/events.d.ts +827 -0
- package/lib/contracts/events.js +258 -0
- package/lib/contracts/execution.d.ts +3216 -0
- package/lib/contracts/execution.js +872 -0
- package/lib/contracts/failure.d.ts +67 -0
- package/lib/contracts/failure.js +127 -0
- package/lib/contracts/index.d.ts +18 -0
- package/lib/contracts/index.js +18 -0
- package/lib/contracts/policy.d.ts +1080 -0
- package/lib/contracts/policy.js +544 -0
- package/lib/contracts/ports.d.ts +417 -0
- package/lib/contracts/ports.js +1 -0
- package/lib/contracts/primitives.d.ts +63 -0
- package/lib/contracts/primitives.js +73 -0
- package/lib/contracts/profiles.d.ts +336 -0
- package/lib/contracts/profiles.js +109 -0
- package/lib/contracts/published.d.ts +3237 -0
- package/lib/contracts/published.js +34 -0
- package/lib/contracts/result.d.ts +1280 -0
- package/lib/contracts/result.js +311 -0
- package/lib/contracts/review.d.ts +441 -0
- package/lib/contracts/review.js +477 -0
- package/lib/contracts/toolchain.d.ts +96 -0
- package/lib/contracts/toolchain.js +89 -0
- package/lib/contracts/version.d.ts +17 -0
- package/lib/contracts/version.js +17 -0
- package/lib/contracts/work.d.ts +173 -0
- package/lib/contracts/work.js +178 -0
- package/lib/control/base-move.d.ts +44 -0
- package/lib/control/base-move.js +90 -0
- package/lib/control/doctor.d.ts +50 -0
- package/lib/control/doctor.js +113 -0
- package/lib/control/harness.d.ts +1125 -0
- package/lib/control/harness.js +741 -0
- package/lib/control/provenance.d.ts +17 -0
- package/lib/control/provenance.js +25 -0
- package/lib/control/recovery.d.ts +237 -0
- package/lib/control/recovery.js +236 -0
- package/lib/control/review.d.ts +62 -0
- package/lib/control/review.js +178 -0
- package/lib/control/workflow.d.ts +247 -0
- package/lib/control/workflow.js +259 -0
- package/lib/engine/budget.d.ts +345 -0
- package/lib/engine/budget.js +278 -0
- package/lib/engine/classify.d.ts +8 -0
- package/lib/engine/classify.js +32 -0
- package/lib/engine/engine.d.ts +1527 -0
- package/lib/engine/engine.js +2259 -0
- package/lib/engine/failure.d.ts +1 -0
- package/lib/engine/failure.js +3 -0
- package/lib/engine/joint-runner.d.ts +257 -0
- package/lib/engine/joint-runner.js +254 -0
- package/lib/engine/measured.d.ts +15 -0
- package/lib/engine/measured.js +82 -0
- package/lib/engine/prompt.d.ts +66 -0
- package/lib/engine/prompt.js +131 -0
- package/lib/engine/property-recovery.d.ts +50 -0
- package/lib/engine/property-recovery.js +171 -0
- package/lib/engine/repair.d.ts +33 -0
- package/lib/engine/repair.js +82 -0
- package/lib/engine/result.d.ts +9 -0
- package/lib/engine/result.js +218 -0
- package/lib/engine/reuse.d.ts +80 -0
- package/lib/engine/reuse.js +102 -0
- package/lib/engine/runner.d.ts +360 -0
- package/lib/engine/runner.js +1836 -0
- package/lib/engine/standalone.d.ts +6 -0
- package/lib/engine/standalone.js +48 -0
- package/lib/engine/usage.d.ts +87 -0
- package/lib/engine/usage.js +165 -0
- package/lib/environment/isolation.d.ts +110 -0
- package/lib/environment/isolation.js +238 -0
- package/lib/environment/lifecycle.d.ts +40 -0
- package/lib/environment/lifecycle.js +197 -0
- package/lib/environment/live-calls.d.ts +14 -0
- package/lib/environment/live-calls.js +73 -0
- package/lib/environment/os-tools.d.ts +16 -0
- package/lib/environment/os-tools.js +35 -0
- package/lib/environment/process.d.ts +32 -0
- package/lib/environment/process.js +369 -0
- package/lib/environment/redaction.d.ts +22 -0
- package/lib/environment/redaction.js +102 -0
- package/lib/environment/resources.d.ts +31 -0
- package/lib/environment/resources.js +120 -0
- package/lib/index.d.ts +65 -0
- package/lib/index.js +67 -0
- package/lib/integrations/connector/commands.d.ts +358 -0
- package/lib/integrations/connector/commands.js +428 -0
- package/lib/integrations/connector/config.d.ts +215 -0
- package/lib/integrations/connector/config.js +214 -0
- package/lib/integrations/connector/delivery.d.ts +107 -0
- package/lib/integrations/connector/delivery.js +591 -0
- package/lib/integrations/connector/fake.d.ts +291 -0
- package/lib/integrations/connector/fake.js +786 -0
- package/lib/integrations/connector/history.d.ts +124 -0
- package/lib/integrations/connector/history.js +497 -0
- package/lib/integrations/connector/index.d.ts +16 -0
- package/lib/integrations/connector/index.js +16 -0
- package/lib/integrations/connector/redact.d.ts +19 -0
- package/lib/integrations/connector/redact.js +91 -0
- package/lib/integrations/connector/registry.d.ts +15 -0
- package/lib/integrations/connector/registry.js +43 -0
- package/lib/integrations/connector/snapshot.d.ts +131 -0
- package/lib/integrations/connector/snapshot.js +422 -0
- package/lib/integrations/connector/source.d.ts +37 -0
- package/lib/integrations/connector/source.js +73 -0
- package/lib/integrations/connector/steps.d.ts +71 -0
- package/lib/integrations/connector/steps.js +188 -0
- package/lib/integrations/connector/store.d.ts +140 -0
- package/lib/integrations/connector/store.js +277 -0
- package/lib/integrations/connector/summary.d.ts +38 -0
- package/lib/integrations/connector/summary.js +59 -0
- package/lib/integrations/connector/testing-worker.d.ts +1 -0
- package/lib/integrations/connector/testing-worker.js +81 -0
- package/lib/integrations/connector/testing.d.ts +205 -0
- package/lib/integrations/connector/testing.js +1615 -0
- package/lib/integrations/connector/transport.d.ts +240 -0
- package/lib/integrations/connector/transport.js +28 -0
- package/lib/integrations/memory/context.d.ts +120 -0
- package/lib/integrations/memory/context.js +239 -0
- package/lib/integrations/memory/index.d.ts +8 -0
- package/lib/integrations/memory/index.js +8 -0
- package/lib/integrations/memory/provider.d.ts +79 -0
- package/lib/integrations/memory/provider.js +22 -0
- package/lib/integrations/memory/sink.d.ts +56 -0
- package/lib/integrations/memory/sink.js +116 -0
- package/lib/integrations/memory/testing.d.ts +44 -0
- package/lib/integrations/memory/testing.js +61 -0
- package/lib/integrations/relay-v1/index.d.ts +122 -0
- package/lib/integrations/relay-v1/index.js +860 -0
- package/lib/integrations/relay-v2/index.d.ts +145 -0
- package/lib/integrations/relay-v2/index.js +752 -0
- package/lib/integrations/relay-v2/process.d.ts +32 -0
- package/lib/integrations/relay-v2/process.js +112 -0
- package/lib/integrations/relay-v2/protocol.d.ts +172 -0
- package/lib/integrations/relay-v2/protocol.js +142 -0
- package/lib/package.d.ts +2 -0
- package/lib/package.js +3 -0
- package/lib/profiles/resolve.d.ts +190 -0
- package/lib/profiles/resolve.js +273 -0
- package/lib/storage/document.d.ts +1234 -0
- package/lib/storage/document.js +80 -0
- package/lib/storage/sqlite.d.ts +35 -0
- package/lib/storage/sqlite.js +260 -0
- package/lib/testing/index.d.ts +5 -0
- package/lib/testing/index.js +5 -0
- package/lib/testing/store-contract.d.ts +8 -0
- package/lib/testing/store-contract.js +167 -0
- package/lib/toolchains/index.d.ts +9 -0
- package/lib/toolchains/index.js +9 -0
- package/lib/toolchains/inspect.d.ts +105 -0
- package/lib/toolchains/inspect.js +831 -0
- package/lib/toolchains/manifests.d.ts +67 -0
- package/lib/toolchains/manifests.js +238 -0
- package/lib/toolchains/probe.d.ts +28 -0
- package/lib/toolchains/probe.js +54 -0
- package/lib/toolchains/recipes.d.ts +33 -0
- package/lib/toolchains/recipes.js +51 -0
- package/lib/validate.d.ts +36 -0
- package/lib/validate.js +175 -0
- package/lib/verification/acceptance.d.ts +284 -0
- package/lib/verification/acceptance.js +670 -0
- package/lib/verification/checks.d.ts +72 -0
- package/lib/verification/checks.js +190 -0
- package/lib/verification/confirm.d.ts +125 -0
- package/lib/verification/confirm.js +411 -0
- package/lib/verification/corpus.d.ts +1303 -0
- package/lib/verification/corpus.js +744 -0
- package/lib/verification/dependencies.d.ts +66 -0
- package/lib/verification/dependencies.js +144 -0
- package/lib/verification/gates.d.ts +160 -0
- package/lib/verification/gates.js +600 -0
- package/lib/verification/joint.d.ts +63 -0
- package/lib/verification/joint.js +121 -0
- package/lib/verification/proof.d.ts +54 -0
- package/lib/verification/proof.js +96 -0
- package/lib/verification/property.d.ts +86 -0
- package/lib/verification/property.js +214 -0
- package/lib/verification/requirements.d.ts +25 -0
- package/lib/verification/requirements.js +69 -0
- package/lib/verification/self-check.d.ts +29 -0
- package/lib/verification/self-check.js +99 -0
- package/lib/verification/spike.d.ts +79 -0
- package/lib/verification/spike.js +124 -0
- package/package.json +100 -4
- package/profiles/expo-mobile.json +15 -0
- package/profiles/go-api.json +15 -0
- package/profiles/go-gotestsum.json +21 -0
- package/profiles/mobile-maestro.json +29 -0
- package/profiles/nest-api.json +26 -0
- package/profiles/next-product.json +72 -0
- package/profiles/node-checks.json +77 -0
- package/profiles/npm-ci.json +22 -0
- package/profiles/pnpm-frozen.json +24 -0
- package/profiles/python-api.json +32 -0
- package/profiles/python-uv.json +26 -0
- package/profiles/react-native.json +50 -0
- package/profiles/react-vite-admin.json +71 -0
- package/schemas/context-snapshot.schema.json +231 -0
- package/schemas/contract-document.schema.json +385 -0
- package/schemas/execution-document.schema.json +3695 -0
- package/schemas/execution-policy.schema.json +2196 -0
- package/schemas/joint-verification.schema.json +617 -0
- package/schemas/result-envelope.schema.json +1652 -0
- package/schemas/review-record.schema.json +177 -0
- package/schemas/run-event.schema.json +2458 -0
- package/schemas/run-result.schema.json +1570 -0
- package/schemas/stack-profile.schema.json +535 -0
- package/schemas/work-graph.schema.json +381 -0
- package/schemas/work-order.schema.json +256 -0
- package/skills/harness/SKILL.md +64 -0
- package/templates/AGENTS.md +13 -0
- package/templates/controller-mode/AGENTS.controller.md +58 -0
- package/templates/controller-mode/README.md +44 -0
- package/templates/graph.json +22 -0
- package/templates/policy.json +28 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Нейтральный договор внешней памяти (Hindsight и подобные). Harness не
|
|
4
|
+
* зависит от SDK, MCP или сетевого клиента: реальный адаптер реализует эти
|
|
5
|
+
* два метода у себя и подключается явно, через opt-in entrypoint
|
|
6
|
+
* `devcontour-harness/integrations/memory`. Ядро и `./contracts` этот модуль
|
|
7
|
+
* не импортируют.
|
|
8
|
+
*/
|
|
9
|
+
/** Запрос recall: identity банка/проекта, текст и пределы, которые провайдер обязан соблюдать. */
|
|
10
|
+
export interface MemoryQuery {
|
|
11
|
+
bank: string;
|
|
12
|
+
project: string;
|
|
13
|
+
text: string;
|
|
14
|
+
maxItems: number;
|
|
15
|
+
maxBytes: number;
|
|
16
|
+
maxCostUnits?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Ответ recall — фактические байты тела ответа провайдера (`body`, JSON по
|
|
20
|
+
* `memoryRecallBodySchema`). Байты закрепляются как есть: digest считается
|
|
21
|
+
* от них, а не от пересобранного объекта.
|
|
22
|
+
*/
|
|
23
|
+
export interface MemoryRecallResponse {
|
|
24
|
+
body: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const memoryItemSchema: z.ZodObject<{
|
|
27
|
+
id: z.ZodString;
|
|
28
|
+
text: z.ZodString;
|
|
29
|
+
score: z.ZodOptional<z.ZodNumber>;
|
|
30
|
+
mandatory: z.ZodOptional<z.ZodBoolean>;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
export type MemoryItem = z.infer<typeof memoryItemSchema>;
|
|
33
|
+
export declare const memoryRecallBodySchema: z.ZodObject<{
|
|
34
|
+
items: z.ZodArray<z.ZodObject<{
|
|
35
|
+
id: z.ZodString;
|
|
36
|
+
text: z.ZodString;
|
|
37
|
+
score: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
mandatory: z.ZodOptional<z.ZodBoolean>;
|
|
39
|
+
}, z.core.$strict>>;
|
|
40
|
+
costUnits: z.ZodOptional<z.ZodNumber>;
|
|
41
|
+
providerVersion: z.ZodOptional<z.ZodString>;
|
|
42
|
+
}, z.core.$strict>;
|
|
43
|
+
export type MemoryRecallBody = z.infer<typeof memoryRecallBodySchema>;
|
|
44
|
+
/** Провайдер recall. Ошибка или ответ вне схемы — недоступность, а не пустой успех. */
|
|
45
|
+
export interface MemoryRecallProvider {
|
|
46
|
+
readonly id: string;
|
|
47
|
+
recall(query: MemoryQuery, signal: AbortSignal): Promise<MemoryRecallResponse>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Документ подтверждённого итога для retain. `documentId` — стабильная
|
|
51
|
+
* identity одного результата (upsert документа); `operationId` — identity
|
|
52
|
+
* одной операции доставки (идемпотентность асинхронного retain). Это разные
|
|
53
|
+
* гарантии: upsert не предотвращает повторную асинхронную обработку.
|
|
54
|
+
*/
|
|
55
|
+
export interface MemoryDocument {
|
|
56
|
+
bank: string;
|
|
57
|
+
project: string;
|
|
58
|
+
documentId: string;
|
|
59
|
+
operationId: string;
|
|
60
|
+
content: string;
|
|
61
|
+
metadata: Record<string, string>;
|
|
62
|
+
}
|
|
63
|
+
export declare const memoryRetainAckSchema: z.ZodObject<{
|
|
64
|
+
status: z.ZodEnum<{
|
|
65
|
+
accepted: "accepted";
|
|
66
|
+
stored: "stored";
|
|
67
|
+
}>;
|
|
68
|
+
receipt: z.ZodOptional<z.ZodString>;
|
|
69
|
+
costUnits: z.ZodOptional<z.ZodNumber>;
|
|
70
|
+
}, z.core.$strict>;
|
|
71
|
+
export type MemoryRetainAck = z.infer<typeof memoryRetainAckSchema>;
|
|
72
|
+
/** Провайдер retain. Исключение — сбой доставки памяти; harness записывает его отдельно. */
|
|
73
|
+
export interface MemoryRetainProvider {
|
|
74
|
+
readonly id: string;
|
|
75
|
+
retain(document: MemoryDocument, signal: AbortSignal): Promise<MemoryRetainAck>;
|
|
76
|
+
}
|
|
77
|
+
export type MemoryProvider = MemoryRecallProvider & MemoryRetainProvider;
|
|
78
|
+
/** ID провайдера входит в ID источника и получателя — та же форма, что у остальных ID. */
|
|
79
|
+
export declare const providerIdSchema: z.ZodString;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { idSchema } from "../../contracts/index.js";
|
|
3
|
+
export const memoryItemSchema = z.strictObject({
|
|
4
|
+
id: z.string().min(1).max(200),
|
|
5
|
+
text: z.string().max(1_000_000),
|
|
6
|
+
score: z.number().optional(),
|
|
7
|
+
/** Элемент, который нельзя отбросить по пределу: его обрезка — отказ, а не пометка. */
|
|
8
|
+
mandatory: z.boolean().optional(),
|
|
9
|
+
});
|
|
10
|
+
export const memoryRecallBodySchema = z.strictObject({
|
|
11
|
+
items: z.array(memoryItemSchema).max(10_000),
|
|
12
|
+
/** Стоимость recall в единицах провайдера; учитывается отдельно от coding runtime. */
|
|
13
|
+
costUnits: z.number().nonnegative().optional(),
|
|
14
|
+
providerVersion: z.string().min(1).max(100).optional(),
|
|
15
|
+
});
|
|
16
|
+
export const memoryRetainAckSchema = z.strictObject({
|
|
17
|
+
status: z.enum(['stored', 'accepted']),
|
|
18
|
+
receipt: z.string().min(1).max(500).optional(),
|
|
19
|
+
costUnits: z.number().nonnegative().optional(),
|
|
20
|
+
});
|
|
21
|
+
/** ID провайдера входит в ID источника и получателя — та же форма, что у остальных ID. */
|
|
22
|
+
export const providerIdSchema = idSchema;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type DeliveryOutcome, type ResultSink, type RunResult } from '../../contracts/index.ts';
|
|
2
|
+
import { type MemoryDocument, type MemoryRetainProvider } from './provider.ts';
|
|
3
|
+
export interface MemoryResultSinkOptions {
|
|
4
|
+
/** ID получателя; по умолчанию `memory-<provider.id>` — отдельный от Git и Relay ключ доставки. */
|
|
5
|
+
id?: string;
|
|
6
|
+
bank: string;
|
|
7
|
+
project: string;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
}
|
|
10
|
+
/** Учёт записи во внешнюю память — отдельно от usage coding runtime. */
|
|
11
|
+
export interface MemoryRetainUsage {
|
|
12
|
+
retainCalls: number;
|
|
13
|
+
costUnits: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Детерминированный UUID (форма версии 5, вариант RFC 4122) из hex-digest:
|
|
17
|
+
* `operation_id` Hindsight — UUID, а повтор обязан дать тот же.
|
|
18
|
+
*/
|
|
19
|
+
export declare function uuidOf(digest: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Стабильная identity документа результата: провайдер, bank, project,
|
|
22
|
+
* поручение, попытка и digest самого результата. Повтор доставки того же
|
|
23
|
+
* результата даёт тот же `documentId` (upsert), другой результат — другой.
|
|
24
|
+
*/
|
|
25
|
+
export declare const memoryDocumentId: (providerId: string, bank: string, project: string, result: RunResult) => string;
|
|
26
|
+
/**
|
|
27
|
+
* Текст подтверждённого итога: только то, что записал controller (исход,
|
|
28
|
+
* SHA, gates и их итоги, находки ревью). Пересказ writer сюда не входит.
|
|
29
|
+
*/
|
|
30
|
+
export declare function memoryContent(result: RunResult): string;
|
|
31
|
+
/**
|
|
32
|
+
* Получатель подтверждённого итога во внешней памяти. Это обычный
|
|
33
|
+
* `ResultSink`: harness ведёт его доставку отдельной записью по своему
|
|
34
|
+
* ключу (`<sink>:<work>:<run>`), так что сбой памяти не трогает принятый
|
|
35
|
+
* Git-результат и receipt других получателей, а повтор
|
|
36
|
+
* (`Harness.deliver(work, sink)`) отправляет только память — с тем же
|
|
37
|
+
* `documentId` и `operationId`, без нового writer.
|
|
38
|
+
*
|
|
39
|
+
* Сохраняются только принятые результаты; остальные исходы доставляются
|
|
40
|
+
* явной отметкой «пропущено» без обращения к провайдеру.
|
|
41
|
+
*/
|
|
42
|
+
export declare class MemoryResultSink implements ResultSink {
|
|
43
|
+
readonly provider: MemoryRetainProvider;
|
|
44
|
+
readonly options: MemoryResultSinkOptions;
|
|
45
|
+
readonly id: string;
|
|
46
|
+
readonly usage: MemoryRetainUsage;
|
|
47
|
+
constructor(provider: MemoryRetainProvider, options: MemoryResultSinkOptions);
|
|
48
|
+
documentId(result: RunResult): string;
|
|
49
|
+
/** Документ доставки: `operationId` стабилен для ключа доставки и документа. */
|
|
50
|
+
document(key: string, result: RunResult): MemoryDocument;
|
|
51
|
+
deliver({ key, result }: {
|
|
52
|
+
key: string;
|
|
53
|
+
result: RunResult;
|
|
54
|
+
}): Promise<DeliveryOutcome>;
|
|
55
|
+
}
|
|
56
|
+
export declare const memoryResultSink: (provider: MemoryRetainProvider, options: MemoryResultSinkOptions) => MemoryResultSink;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { HarnessError, digestOf, } from "../../contracts/index.js";
|
|
2
|
+
import { memoryRetainAckSchema, providerIdSchema, } from "./provider.js";
|
|
3
|
+
/**
|
|
4
|
+
* Детерминированный UUID (форма версии 5, вариант RFC 4122) из hex-digest:
|
|
5
|
+
* `operation_id` Hindsight — UUID, а повтор обязан дать тот же.
|
|
6
|
+
*/
|
|
7
|
+
export function uuidOf(digest) {
|
|
8
|
+
const h = digest.slice(0, 32).split('');
|
|
9
|
+
h[12] = '5';
|
|
10
|
+
h[16] = ((parseInt(h[16], 16) & 0x3) | 0x8).toString(16);
|
|
11
|
+
const s = h.join('');
|
|
12
|
+
return `${s.slice(0, 8)}-${s.slice(8, 12)}-${s.slice(12, 16)}-${s.slice(16, 20)}-${s.slice(20, 32)}`;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Стабильная identity документа результата: провайдер, bank, project,
|
|
16
|
+
* поручение, попытка и digest самого результата. Повтор доставки того же
|
|
17
|
+
* результата даёт тот же `documentId` (upsert), другой результат — другой.
|
|
18
|
+
*/
|
|
19
|
+
export const memoryDocumentId = (providerId, bank, project, result) => 'dch-' +
|
|
20
|
+
digestOf({
|
|
21
|
+
provider: providerId,
|
|
22
|
+
bank,
|
|
23
|
+
project,
|
|
24
|
+
work: result.workOrderId,
|
|
25
|
+
run: result.runId,
|
|
26
|
+
result: digestOf(result),
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Текст подтверждённого итога: только то, что записал controller (исход,
|
|
30
|
+
* SHA, gates и их итоги, находки ревью). Пересказ writer сюда не входит.
|
|
31
|
+
*/
|
|
32
|
+
export function memoryContent(result) {
|
|
33
|
+
return [
|
|
34
|
+
`Harness result for work order ${result.workOrderId} (run ${result.runId}): ${result.outcome}.`,
|
|
35
|
+
`Source: ${result.source.connector} ${result.source.ref} @ ${result.source.revision}.`,
|
|
36
|
+
result.outcome === 'accepted'
|
|
37
|
+
? `Accepted commit: ${result.shas.result} (base ${result.shas.base}).`
|
|
38
|
+
: `Stop reason: ${result.stopReason.code}: ${result.stopReason.message}`,
|
|
39
|
+
'Controller evidence: ' +
|
|
40
|
+
JSON.stringify(result.evidence.map((e) => ({ gate: e.gate, phase: e.phase, passed: e.passed }))),
|
|
41
|
+
...(result.findings.length
|
|
42
|
+
? ['Review findings: ' + JSON.stringify(result.findings.map((f) => f.message))]
|
|
43
|
+
: []),
|
|
44
|
+
].join('\n');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Получатель подтверждённого итога во внешней памяти. Это обычный
|
|
48
|
+
* `ResultSink`: harness ведёт его доставку отдельной записью по своему
|
|
49
|
+
* ключу (`<sink>:<work>:<run>`), так что сбой памяти не трогает принятый
|
|
50
|
+
* Git-результат и receipt других получателей, а повтор
|
|
51
|
+
* (`Harness.deliver(work, sink)`) отправляет только память — с тем же
|
|
52
|
+
* `documentId` и `operationId`, без нового writer.
|
|
53
|
+
*
|
|
54
|
+
* Сохраняются только принятые результаты; остальные исходы доставляются
|
|
55
|
+
* явной отметкой «пропущено» без обращения к провайдеру.
|
|
56
|
+
*/
|
|
57
|
+
export class MemoryResultSink {
|
|
58
|
+
provider;
|
|
59
|
+
options;
|
|
60
|
+
id;
|
|
61
|
+
usage = { retainCalls: 0, costUnits: 0 };
|
|
62
|
+
constructor(provider, options) {
|
|
63
|
+
this.provider = provider;
|
|
64
|
+
this.options = options;
|
|
65
|
+
providerIdSchema.parse(provider.id);
|
|
66
|
+
this.id = providerIdSchema.parse(options.id ?? 'memory-' + provider.id);
|
|
67
|
+
}
|
|
68
|
+
documentId(result) {
|
|
69
|
+
return memoryDocumentId(this.provider.id, this.options.bank, this.options.project, result);
|
|
70
|
+
}
|
|
71
|
+
/** Документ доставки: `operationId` стабилен для ключа доставки и документа. */
|
|
72
|
+
document(key, result) {
|
|
73
|
+
const documentId = this.documentId(result);
|
|
74
|
+
return {
|
|
75
|
+
bank: this.options.bank,
|
|
76
|
+
project: this.options.project,
|
|
77
|
+
documentId,
|
|
78
|
+
operationId: uuidOf(digestOf({ key, documentId })),
|
|
79
|
+
content: memoryContent(result),
|
|
80
|
+
metadata: {
|
|
81
|
+
workOrderId: result.workOrderId,
|
|
82
|
+
runId: result.runId,
|
|
83
|
+
outcome: result.outcome,
|
|
84
|
+
sourceConnector: result.source.connector,
|
|
85
|
+
sourceRef: result.source.ref,
|
|
86
|
+
sourceRevision: result.source.revision,
|
|
87
|
+
...(result.outcome === 'accepted' ? { resultSha: result.shas.result } : {}),
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async deliver({ key, result }) {
|
|
92
|
+
if (result.outcome !== 'accepted')
|
|
93
|
+
return {
|
|
94
|
+
status: 'delivered',
|
|
95
|
+
receipt: `skipped: memory retains only accepted results (outcome ${result.outcome})`,
|
|
96
|
+
};
|
|
97
|
+
const document = this.document(key, result);
|
|
98
|
+
this.usage.retainCalls++;
|
|
99
|
+
const ack = memoryRetainAckSchema.safeParse(await this.provider.retain(document, AbortSignal.timeout(this.options.timeoutMs ?? 30_000)));
|
|
100
|
+
if (!ack.success)
|
|
101
|
+
throw new HarnessError('DELIVERY_FAILED', 'Ответ retain вне схемы: ' + ack.error.issues[0]?.message);
|
|
102
|
+
this.usage.costUnits += ack.data.costUnits ?? 0;
|
|
103
|
+
return {
|
|
104
|
+
status: 'delivered',
|
|
105
|
+
receipt: [
|
|
106
|
+
`memory:${this.provider.id}`,
|
|
107
|
+
`bank=${document.bank}`,
|
|
108
|
+
`document=${document.documentId}`,
|
|
109
|
+
`operation=${document.operationId}`,
|
|
110
|
+
`status=${ack.data.status}`,
|
|
111
|
+
...(ack.data.receipt ? [`receipt=${ack.data.receipt}`] : []),
|
|
112
|
+
].join(' '),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export const memoryResultSink = (provider, options) => new MemoryResultSink(provider, options);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { MemoryDocument, MemoryItem, MemoryProvider, MemoryQuery, MemoryRetainAck } from './provider.ts';
|
|
2
|
+
/**
|
|
3
|
+
* FIXTURE ONLY. Детерминированный провайдер памяти для тестов: ответы по
|
|
4
|
+
* сценарию, счётчики обращений, смена ответа, недоступность и отказ retain
|
|
5
|
+
* до или после записи. Ни сети, ни ключей, ни SDK.
|
|
6
|
+
*/
|
|
7
|
+
export declare class FakeMemoryProvider implements MemoryProvider {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly extra: {
|
|
10
|
+
costUnits?: number;
|
|
11
|
+
providerVersion?: string;
|
|
12
|
+
};
|
|
13
|
+
readonly calls: {
|
|
14
|
+
recall: number;
|
|
15
|
+
retain: number;
|
|
16
|
+
};
|
|
17
|
+
readonly queries: MemoryQuery[];
|
|
18
|
+
/** Документы по `documentId` — upsert, как у памяти с document identity. */
|
|
19
|
+
readonly documents: Map<string, MemoryDocument>;
|
|
20
|
+
/** Каждая принятая операция retain по порядку (`operationId`). */
|
|
21
|
+
readonly operations: string[];
|
|
22
|
+
/** Каждый вызов retain: какой документ и операция пришли (включая неудачные). */
|
|
23
|
+
readonly log: {
|
|
24
|
+
documentId: string;
|
|
25
|
+
operationId: string;
|
|
26
|
+
}[];
|
|
27
|
+
private body;
|
|
28
|
+
private down;
|
|
29
|
+
private retainFailures;
|
|
30
|
+
constructor(id: string, items: MemoryItem[], extra?: {
|
|
31
|
+
costUnits?: number;
|
|
32
|
+
providerVersion?: string;
|
|
33
|
+
});
|
|
34
|
+
/** Новый ответ recall (например, после согласования). */
|
|
35
|
+
respond(items: MemoryItem[]): void;
|
|
36
|
+
unavailable(reason?: string): void;
|
|
37
|
+
available(): void;
|
|
38
|
+
/** Следующие вызовы retain падают: до записи или после неё (неизвестный исход). */
|
|
39
|
+
failRetain(...modes: ('before-store' | 'after-store')[]): void;
|
|
40
|
+
recall(query: MemoryQuery): Promise<{
|
|
41
|
+
body: string;
|
|
42
|
+
}>;
|
|
43
|
+
retain(document: MemoryDocument): Promise<MemoryRetainAck>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FIXTURE ONLY. Детерминированный провайдер памяти для тестов: ответы по
|
|
3
|
+
* сценарию, счётчики обращений, смена ответа, недоступность и отказ retain
|
|
4
|
+
* до или после записи. Ни сети, ни ключей, ни SDK.
|
|
5
|
+
*/
|
|
6
|
+
export class FakeMemoryProvider {
|
|
7
|
+
id;
|
|
8
|
+
extra;
|
|
9
|
+
calls = { recall: 0, retain: 0 };
|
|
10
|
+
queries = [];
|
|
11
|
+
/** Документы по `documentId` — upsert, как у памяти с document identity. */
|
|
12
|
+
documents = new Map();
|
|
13
|
+
/** Каждая принятая операция retain по порядку (`operationId`). */
|
|
14
|
+
operations = [];
|
|
15
|
+
/** Каждый вызов retain: какой документ и операция пришли (включая неудачные). */
|
|
16
|
+
log = [];
|
|
17
|
+
body;
|
|
18
|
+
down;
|
|
19
|
+
retainFailures = [];
|
|
20
|
+
constructor(id, items, extra = {}) {
|
|
21
|
+
this.id = id;
|
|
22
|
+
this.extra = extra;
|
|
23
|
+
this.body = { items, ...extra };
|
|
24
|
+
}
|
|
25
|
+
/** Новый ответ recall (например, после согласования). */
|
|
26
|
+
respond(items) {
|
|
27
|
+
this.body = { ...this.body, items };
|
|
28
|
+
}
|
|
29
|
+
unavailable(reason = 'connection refused') {
|
|
30
|
+
this.down = reason;
|
|
31
|
+
}
|
|
32
|
+
available() {
|
|
33
|
+
this.down = undefined;
|
|
34
|
+
}
|
|
35
|
+
/** Следующие вызовы retain падают: до записи или после неё (неизвестный исход). */
|
|
36
|
+
failRetain(...modes) {
|
|
37
|
+
this.retainFailures.push(...modes);
|
|
38
|
+
}
|
|
39
|
+
recall(query) {
|
|
40
|
+
this.calls.recall++;
|
|
41
|
+
this.queries.push(query);
|
|
42
|
+
if (this.down)
|
|
43
|
+
return Promise.reject(new Error(this.down));
|
|
44
|
+
return Promise.resolve({ body: JSON.stringify(this.body) });
|
|
45
|
+
}
|
|
46
|
+
retain(document) {
|
|
47
|
+
this.calls.retain++;
|
|
48
|
+
this.log.push({ documentId: document.documentId, operationId: document.operationId });
|
|
49
|
+
if (this.down)
|
|
50
|
+
return Promise.reject(new Error(this.down));
|
|
51
|
+
const failure = this.retainFailures.shift();
|
|
52
|
+
if (failure === 'before-store')
|
|
53
|
+
return Promise.reject(new Error('retain failed before store'));
|
|
54
|
+
this.documents.set(document.documentId, structuredClone(document));
|
|
55
|
+
if (!this.operations.includes(document.operationId))
|
|
56
|
+
this.operations.push(document.operationId);
|
|
57
|
+
if (failure === 'after-store')
|
|
58
|
+
return Promise.reject(new Error('retain response lost after store'));
|
|
59
|
+
return Promise.resolve({ status: 'stored', receipt: document.documentId });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type CheckpointInput, type CheckpointRecord, type CommentRecord, type HistoryMutation, type RelayTransport, type SessionRecord, type TaskColumn, type TaskRead, type TransportErrorKind, type TransportIdentity } from '../connector/transport.ts';
|
|
3
|
+
export declare const RELAY_V1_PROVIDER: "relay-v1-http";
|
|
4
|
+
/** Capability истории работы; без неё методы истории не вызывают routes. */
|
|
5
|
+
export declare const WORK_HISTORY_CAPABILITY = "relay-work-history-v1";
|
|
6
|
+
export declare const relayV1SettingsSchema: z.ZodObject<{
|
|
7
|
+
endpoint: z.ZodString;
|
|
8
|
+
projectId: z.ZodString;
|
|
9
|
+
actor: z.ZodString;
|
|
10
|
+
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
maxResponseBytes: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
}, z.core.$strict>;
|
|
13
|
+
export type RelayV1Settings = z.input<typeof relayV1SettingsSchema>;
|
|
14
|
+
type Settings = z.output<typeof relayV1SettingsSchema>;
|
|
15
|
+
export interface RelayV1Options {
|
|
16
|
+
/** Подмена `fetch` (тесты); по умолчанию глобальный `fetch` Node. */
|
|
17
|
+
fetch?: typeof fetch;
|
|
18
|
+
/** Генератор requestId; по умолчанию `dc-<uuid>`. Не идемпотентность. */
|
|
19
|
+
requestId?: () => string;
|
|
20
|
+
/** Сколько раз перезапускать постраничное чтение при смене версии списка. */
|
|
21
|
+
maxPageRestarts?: number;
|
|
22
|
+
/** Сколько раз повторять полное чтение задачи при несогласованных токенах. */
|
|
23
|
+
maxReadRetries?: number;
|
|
24
|
+
/** Роль автора комментариев. */
|
|
25
|
+
actorRole?: 'operator' | 'orchestrator' | 'worker';
|
|
26
|
+
}
|
|
27
|
+
export declare function classifyCode(code: string, status: number, mutation: boolean): TransportErrorKind;
|
|
28
|
+
export declare class RelayV1Transport implements RelayTransport {
|
|
29
|
+
readonly provider: "relay-v1-http";
|
|
30
|
+
readonly settings: Readonly<Settings>;
|
|
31
|
+
private readonly base;
|
|
32
|
+
private readonly fetchImpl;
|
|
33
|
+
private readonly nextRequestId;
|
|
34
|
+
private readonly maxPageRestarts;
|
|
35
|
+
private readonly maxReadRetries;
|
|
36
|
+
private readonly actorRole;
|
|
37
|
+
private capabilities;
|
|
38
|
+
constructor(settings: Settings, options?: RelayV1Options);
|
|
39
|
+
private fail;
|
|
40
|
+
private url;
|
|
41
|
+
/** Один HTTP-вызов без повторов: envelope, классификация, схема данных. */
|
|
42
|
+
private call;
|
|
43
|
+
private transportFailure;
|
|
44
|
+
private readLimited;
|
|
45
|
+
/** Полное постраничное чтение offset/limit/version; частичный список не возвращается. */
|
|
46
|
+
private pages;
|
|
47
|
+
private pagesOnce;
|
|
48
|
+
private enc;
|
|
49
|
+
identity(signal?: AbortSignal): Promise<TransportIdentity>;
|
|
50
|
+
/** Capability истории (кэш на транспорт); без неё route не вызывается. */
|
|
51
|
+
private requireHistory;
|
|
52
|
+
private summary;
|
|
53
|
+
private readTaskOnce;
|
|
54
|
+
/** Токен текущей редакции без полного чтения тел: ревизии и версии списков. */
|
|
55
|
+
private probe;
|
|
56
|
+
readTask(ref: string, signal?: AbortSignal): Promise<TaskRead>;
|
|
57
|
+
listComments(ref: string, signal?: AbortSignal): Promise<CommentRecord[]>;
|
|
58
|
+
addComment(ref: string, input: {
|
|
59
|
+
title: string;
|
|
60
|
+
body: string;
|
|
61
|
+
}, signal?: AbortSignal): Promise<{
|
|
62
|
+
commentId: string;
|
|
63
|
+
}>;
|
|
64
|
+
setCriterion(ref: string, input: {
|
|
65
|
+
criterionId: string;
|
|
66
|
+
completed: boolean;
|
|
67
|
+
ifRevision: number;
|
|
68
|
+
}, signal?: AbortSignal): Promise<{
|
|
69
|
+
revision: number;
|
|
70
|
+
}>;
|
|
71
|
+
move(ref: string, input: {
|
|
72
|
+
column: TaskColumn;
|
|
73
|
+
ifRevision: number;
|
|
74
|
+
}, signal?: AbortSignal): Promise<{
|
|
75
|
+
revision: number;
|
|
76
|
+
}>;
|
|
77
|
+
private session;
|
|
78
|
+
private checkpointRecord;
|
|
79
|
+
private historyPost;
|
|
80
|
+
startSession(input: {
|
|
81
|
+
title: string;
|
|
82
|
+
description: string;
|
|
83
|
+
client: string;
|
|
84
|
+
sourceSessionId?: string;
|
|
85
|
+
}, signal?: AbortSignal): Promise<HistoryMutation>;
|
|
86
|
+
getSession(ref: string, signal?: AbortSignal): Promise<SessionRecord>;
|
|
87
|
+
findSessions(marker: string, signal?: AbortSignal): Promise<SessionRecord[]>;
|
|
88
|
+
checkpoints(sessionRef: string, signal?: AbortSignal): Promise<CheckpointRecord[]>;
|
|
89
|
+
private checkpointBody;
|
|
90
|
+
openIntent(sessionRef: string, input: CheckpointInput & {
|
|
91
|
+
runId: string;
|
|
92
|
+
ifRevision: number;
|
|
93
|
+
}, signal?: AbortSignal): Promise<HistoryMutation>;
|
|
94
|
+
checkpoint(intentRef: string, kind: 'progress' | 'result' | 'cancel', input: CheckpointInput & {
|
|
95
|
+
runId: string;
|
|
96
|
+
ifRevision: number;
|
|
97
|
+
}, signal?: AbortSignal): Promise<HistoryMutation>;
|
|
98
|
+
fork(intentRef: string, input: {
|
|
99
|
+
runId: string;
|
|
100
|
+
ifRevision: number;
|
|
101
|
+
title: string;
|
|
102
|
+
description: string;
|
|
103
|
+
}, signal?: AbortSignal): Promise<HistoryMutation>;
|
|
104
|
+
attach(sessionRef: string, input: {
|
|
105
|
+
ifRevision: number;
|
|
106
|
+
client: string;
|
|
107
|
+
sourceSessionId?: string;
|
|
108
|
+
}, signal?: AbortSignal): Promise<HistoryMutation>;
|
|
109
|
+
takeover(sessionRef: string, input: {
|
|
110
|
+
ifRevision: number;
|
|
111
|
+
reason: string;
|
|
112
|
+
client: string;
|
|
113
|
+
}, signal?: AbortSignal): Promise<HistoryMutation>;
|
|
114
|
+
finishSession(sessionRef: string, outcome: 'complete' | 'cancel', input: {
|
|
115
|
+
runId?: string;
|
|
116
|
+
ifRevision: number;
|
|
117
|
+
result: string;
|
|
118
|
+
}, signal?: AbortSignal): Promise<HistoryMutation>;
|
|
119
|
+
}
|
|
120
|
+
/** Создаёт транспорт Relay v1 по проверенным настройкам; неверные — `INVALID_INPUT`. */
|
|
121
|
+
export declare function createTransport(settings: unknown, options?: RelayV1Options): RelayV1Transport;
|
|
122
|
+
export {};
|