devcontour-harness 0.1.0-alpha.5 → 0.1.0-alpha.7
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/README.md +42 -2
- package/docs/compatibility-versions.md +56 -0
- package/docs/compatibility.md +2 -2
- package/docs/connectors.md +323 -0
- package/docs/contracts.md +33 -5
- package/docs/integrations/hindsight.md +148 -0
- package/docs/quickstart.md +1 -1
- package/docs/release-notes/0.1.0-alpha.6.md +238 -0
- package/docs/release-notes/0.1.0-alpha.7.md +71 -0
- package/docs/review-probes.md +199 -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 +77 -24
- package/examples/README.md +1 -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/lib/agents/cli-adapter.js +10 -1
- package/lib/agents/inspect.d.ts +56 -2
- package/lib/agents/inspect.js +264 -14
- package/lib/agents/review-probe.d.ts +229 -7
- package/lib/agents/review-probe.js +830 -72
- package/lib/agents/schemas.d.ts +3 -1
- package/lib/agents/schemas.js +7 -3
- package/lib/cli.js +167 -7
- package/lib/contracts/cli.d.ts +820 -11
- package/lib/contracts/cli.js +243 -4
- package/lib/contracts/errors.d.ts +3 -1
- package/lib/contracts/errors.js +2 -0
- package/lib/contracts/events.d.ts +37 -5
- package/lib/contracts/events.js +9 -0
- package/lib/contracts/execution.d.ts +389 -15
- package/lib/contracts/execution.js +76 -4
- package/lib/contracts/failure.js +5 -0
- package/lib/contracts/index.d.ts +1 -0
- package/lib/contracts/index.js +1 -0
- package/lib/contracts/policy.d.ts +15 -0
- package/lib/contracts/policy.js +10 -0
- package/lib/contracts/ports.d.ts +50 -0
- package/lib/contracts/profiles.d.ts +14 -0
- package/lib/contracts/profiles.js +4 -0
- package/lib/contracts/published.d.ts +279 -8
- package/lib/contracts/result.d.ts +171 -0
- package/lib/contracts/result.js +39 -1
- package/lib/contracts/review.d.ts +231 -0
- package/lib/contracts/review.js +326 -2
- package/lib/contracts/toolchain.d.ts +96 -0
- package/lib/contracts/toolchain.js +89 -0
- package/lib/control/doctor.d.ts +16 -1
- package/lib/control/doctor.js +45 -3
- package/lib/control/harness.d.ts +52 -6
- package/lib/control/harness.js +28 -1
- package/lib/control/recovery.d.ts +3 -1
- package/lib/control/review.js +23 -11
- package/lib/engine/budget.d.ts +3 -3
- package/lib/engine/classify.js +1 -0
- package/lib/engine/engine.d.ts +67 -17
- package/lib/engine/prompt.d.ts +29 -1
- package/lib/engine/prompt.js +57 -0
- package/lib/engine/property-recovery.js +2 -0
- package/lib/engine/result.js +52 -0
- package/lib/engine/reuse.js +6 -1
- package/lib/engine/runner.d.ts +25 -0
- package/lib/engine/runner.js +500 -123
- package/lib/environment/lifecycle.js +6 -0
- package/lib/environment/live-calls.js +3 -2
- package/lib/environment/os-tools.d.ts +16 -0
- package/lib/environment/os-tools.js +35 -0
- package/lib/environment/process.d.ts +8 -0
- package/lib/environment/process.js +13 -6
- 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/profiles/resolve.d.ts +5 -1
- package/lib/profiles/resolve.js +31 -0
- package/lib/storage/document.d.ts +116 -16
- 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/verification/acceptance.d.ts +16 -0
- package/lib/verification/acceptance.js +16 -0
- package/lib/verification/gates.d.ts +38 -0
- package/lib/verification/gates.js +108 -26
- package/package.json +22 -1
- package/profiles/go-gotestsum.json +21 -0
- package/profiles/npm-ci.json +22 -0
- package/profiles/pnpm-frozen.json +24 -0
- package/profiles/python-uv.json +26 -0
- package/schemas/execution-document.schema.json +345 -4
- package/schemas/execution-policy.schema.json +48 -0
- package/schemas/result-envelope.schema.json +213 -1
- package/schemas/run-event.schema.json +93 -0
- package/schemas/run-result.schema.json +207 -0
- package/schemas/stack-profile.schema.json +43 -0
- package/templates/controller-mode/AGENTS.controller.md +58 -0
- package/templates/controller-mode/README.md +44 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { type CheckpointInput, type CheckpointRecord, type CommentRecord, type CriterionRecord, type DocumentRecord, type HistoryMutation, type ProviderId, type RelayTransport, type SessionRecord, type TaskColumn, type TaskRead, type TransportIdentity } from './transport.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Управляемый поддельный backend задач для contract tests — **fixture, не
|
|
4
|
+
* настоящий Relay**. Он воспроизводит договор транспорта: CAS-ревизии задач
|
|
5
|
+
* и сессий, done guards, append-only комментарии, сессии с fencing по run,
|
|
6
|
+
* счётчик поколения, который растёт при каждой записи (как generation
|
|
7
|
+
* Relay-2), и многостраничное чтение задачи (между страницами может пройти
|
|
8
|
+
* чужая запись). Состояние — в памяти или в файле SQLite: второй вариант
|
|
9
|
+
* разделяется несколькими процессами (crash/restart и гонки владельцев).
|
|
10
|
+
*/
|
|
11
|
+
interface FakeTask {
|
|
12
|
+
id: string;
|
|
13
|
+
key: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
column: TaskColumn;
|
|
17
|
+
revision: number;
|
|
18
|
+
parentId: string | null;
|
|
19
|
+
dependencies: string[];
|
|
20
|
+
criteria: CriterionRecord[];
|
|
21
|
+
}
|
|
22
|
+
interface FakeSession extends SessionRecord {
|
|
23
|
+
runs: {
|
|
24
|
+
id: string;
|
|
25
|
+
state: 'active' | 'ended';
|
|
26
|
+
}[];
|
|
27
|
+
/** ID intent-чекпоинтов, ещё не закрытых. */
|
|
28
|
+
openIntents: string[];
|
|
29
|
+
accepted: string[];
|
|
30
|
+
}
|
|
31
|
+
interface FakeCheckpoint extends CheckpointRecord {
|
|
32
|
+
closed: boolean;
|
|
33
|
+
children: string[];
|
|
34
|
+
acceptedSessionIds: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface FakeState {
|
|
37
|
+
provider: ProviderId;
|
|
38
|
+
projectId: string;
|
|
39
|
+
generation: number;
|
|
40
|
+
seq: number;
|
|
41
|
+
tasks: Record<string, FakeTask>;
|
|
42
|
+
comments: Record<string, CommentRecord[]>;
|
|
43
|
+
documents: Record<string, DocumentRecord & {
|
|
44
|
+
targets: string[];
|
|
45
|
+
}>;
|
|
46
|
+
sessions: Record<string, FakeSession>;
|
|
47
|
+
checkpoints: Record<string, FakeCheckpoint>;
|
|
48
|
+
/** Принятые мутации по операциям (для отчёта; проверки считают по записям получателя). */
|
|
49
|
+
mutations: Record<string, number>;
|
|
50
|
+
}
|
|
51
|
+
/** Хранилище состояния подделки: в памяти либо в общей SQLite. */
|
|
52
|
+
export interface FakeBackend {
|
|
53
|
+
with<T>(fn: (state: FakeState) => T, write: boolean): T;
|
|
54
|
+
close(): void;
|
|
55
|
+
}
|
|
56
|
+
export declare const emptyFakeState: (provider: ProviderId, projectId: string) => FakeState;
|
|
57
|
+
export declare function memoryBackend(state: FakeState): FakeBackend;
|
|
58
|
+
/** Состояние в файле SQLite: каждая операция — транзакция `BEGIN IMMEDIATE`. */
|
|
59
|
+
export declare function fileBackend(file: string, init?: FakeState): FakeBackend;
|
|
60
|
+
/** Транспорт поверх подделки — тот же договор, что у настоящих адаптеров. */
|
|
61
|
+
export declare class FakeRelayTransport implements RelayTransport {
|
|
62
|
+
readonly backend: FakeBackend;
|
|
63
|
+
readonly options: {
|
|
64
|
+
provider: ProviderId;
|
|
65
|
+
actor: string;
|
|
66
|
+
history?: boolean;
|
|
67
|
+
};
|
|
68
|
+
readonly provider: ProviderId;
|
|
69
|
+
/** Хук между страницами чтения задачи: тесты вносят здесь чужую запись. */
|
|
70
|
+
onPage?: (page: 'task' | 'links' | 'documents', ref: string) => void | Promise<void>;
|
|
71
|
+
private readonly projectId;
|
|
72
|
+
constructor(backend: FakeBackend, options: {
|
|
73
|
+
provider: ProviderId;
|
|
74
|
+
actor: string;
|
|
75
|
+
history?: boolean;
|
|
76
|
+
});
|
|
77
|
+
private fail;
|
|
78
|
+
private read;
|
|
79
|
+
private write;
|
|
80
|
+
private static resolve;
|
|
81
|
+
private taskOf;
|
|
82
|
+
/** Транзитивно завершена: done, все критерии, дети и зависимости. */
|
|
83
|
+
static finished(s: FakeState, id: string, seen?: Set<string>): boolean;
|
|
84
|
+
private static summary;
|
|
85
|
+
identity(): Promise<TransportIdentity>;
|
|
86
|
+
readTask(ref: string): Promise<TaskRead>;
|
|
87
|
+
listComments(ref: string): Promise<CommentRecord[]>;
|
|
88
|
+
addComment(ref: string, input: {
|
|
89
|
+
title: string;
|
|
90
|
+
body: string;
|
|
91
|
+
}): Promise<{
|
|
92
|
+
commentId: string;
|
|
93
|
+
}>;
|
|
94
|
+
setCriterion(ref: string, input: {
|
|
95
|
+
criterionId: string;
|
|
96
|
+
completed: boolean;
|
|
97
|
+
ifRevision: number;
|
|
98
|
+
}): Promise<{
|
|
99
|
+
revision: number;
|
|
100
|
+
}>;
|
|
101
|
+
move(ref: string, input: {
|
|
102
|
+
column: TaskColumn;
|
|
103
|
+
ifRevision: number;
|
|
104
|
+
}): Promise<{
|
|
105
|
+
revision: number;
|
|
106
|
+
}>;
|
|
107
|
+
private requireHistory;
|
|
108
|
+
private sessionOf;
|
|
109
|
+
private view;
|
|
110
|
+
/** CAS ревизии сессии и fencing по run. */
|
|
111
|
+
private guard;
|
|
112
|
+
private newRun;
|
|
113
|
+
startSession(input: {
|
|
114
|
+
title: string;
|
|
115
|
+
description: string;
|
|
116
|
+
client: string;
|
|
117
|
+
}): Promise<HistoryMutation>;
|
|
118
|
+
getSession(ref: string): Promise<SessionRecord>;
|
|
119
|
+
findSessions(marker: string): Promise<SessionRecord[]>;
|
|
120
|
+
checkpoints(sessionRef: string): Promise<{
|
|
121
|
+
id: string;
|
|
122
|
+
key: string;
|
|
123
|
+
sessionId: string;
|
|
124
|
+
runId: string;
|
|
125
|
+
kind: "intent" | "progress" | "result" | "cancel";
|
|
126
|
+
intentId: string | null;
|
|
127
|
+
title: string;
|
|
128
|
+
body: string;
|
|
129
|
+
}[]>;
|
|
130
|
+
openIntent(sessionRef: string, input: CheckpointInput & {
|
|
131
|
+
runId: string;
|
|
132
|
+
ifRevision: number;
|
|
133
|
+
}): Promise<{
|
|
134
|
+
session: SessionRecord;
|
|
135
|
+
checkpoint: FakeCheckpoint;
|
|
136
|
+
}>;
|
|
137
|
+
checkpoint(intentRef: string, kind: 'progress' | 'result' | 'cancel', input: CheckpointInput & {
|
|
138
|
+
runId: string;
|
|
139
|
+
ifRevision: number;
|
|
140
|
+
}): Promise<{
|
|
141
|
+
session: SessionRecord;
|
|
142
|
+
checkpoint: FakeCheckpoint;
|
|
143
|
+
}>;
|
|
144
|
+
fork(intentRef: string, input: {
|
|
145
|
+
runId: string;
|
|
146
|
+
ifRevision: number;
|
|
147
|
+
title: string;
|
|
148
|
+
description: string;
|
|
149
|
+
}): Promise<{
|
|
150
|
+
session: SessionRecord;
|
|
151
|
+
childSession: SessionRecord;
|
|
152
|
+
}>;
|
|
153
|
+
attach(sessionRef: string, input: {
|
|
154
|
+
ifRevision: number;
|
|
155
|
+
client: string;
|
|
156
|
+
}): Promise<{
|
|
157
|
+
session: SessionRecord;
|
|
158
|
+
runId: string;
|
|
159
|
+
}>;
|
|
160
|
+
takeover(sessionRef: string, input: {
|
|
161
|
+
ifRevision: number;
|
|
162
|
+
reason: string;
|
|
163
|
+
client: string;
|
|
164
|
+
}): Promise<{
|
|
165
|
+
session: SessionRecord;
|
|
166
|
+
runId: string;
|
|
167
|
+
}>;
|
|
168
|
+
finishSession(sessionRef: string, outcome: 'complete' | 'cancel', input: {
|
|
169
|
+
runId?: string;
|
|
170
|
+
ifRevision: number;
|
|
171
|
+
result: string;
|
|
172
|
+
}): Promise<{
|
|
173
|
+
session: SessionRecord;
|
|
174
|
+
}>;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Действия «другого участника» прямо в подделке: постановка задач, правки,
|
|
178
|
+
* перехват сессии. Ядро коннектора ими не пользуется.
|
|
179
|
+
*/
|
|
180
|
+
export declare class FakeAdmin {
|
|
181
|
+
readonly backend: FakeBackend;
|
|
182
|
+
constructor(backend: FakeBackend);
|
|
183
|
+
private write;
|
|
184
|
+
createTask(input: {
|
|
185
|
+
title: string;
|
|
186
|
+
description: string;
|
|
187
|
+
column?: TaskColumn;
|
|
188
|
+
criteria?: {
|
|
189
|
+
title: string;
|
|
190
|
+
summary?: string;
|
|
191
|
+
}[];
|
|
192
|
+
dependencies?: string[];
|
|
193
|
+
parentId?: string;
|
|
194
|
+
}): {
|
|
195
|
+
id: string;
|
|
196
|
+
key: string;
|
|
197
|
+
criteria: string[];
|
|
198
|
+
};
|
|
199
|
+
task(id: string): FakeTask | undefined;
|
|
200
|
+
updateTask(id: string, patch: {
|
|
201
|
+
title?: string;
|
|
202
|
+
description?: string;
|
|
203
|
+
}): void;
|
|
204
|
+
addCriterion(id: string, title: string): string;
|
|
205
|
+
updateCriterion(id: string, criterionId: string, title: string): void;
|
|
206
|
+
completeCriterion(id: string, criterionId: string, completed?: boolean): void;
|
|
207
|
+
addDocument(taskId: string, doc: {
|
|
208
|
+
name: string;
|
|
209
|
+
body: string;
|
|
210
|
+
}): {
|
|
211
|
+
id: string;
|
|
212
|
+
};
|
|
213
|
+
updateDocument(id: string, body: string): void;
|
|
214
|
+
addDependency(id: string, dependsOn: string): void;
|
|
215
|
+
/** Перемещение с соблюдением done guards (как у человека в backend). */
|
|
216
|
+
move(id: string, column: TaskColumn): void;
|
|
217
|
+
comment(id: string, body: string, actor?: string): void;
|
|
218
|
+
takeover(sessionId: string): void;
|
|
219
|
+
state(): FakeState;
|
|
220
|
+
}
|
|
221
|
+
export interface Barrier {
|
|
222
|
+
/** Вызывается внутри транспорта: отметить прибытие и ждать разрешения. */
|
|
223
|
+
arrive(): Promise<void>;
|
|
224
|
+
}
|
|
225
|
+
/** Барьер одного процесса. */
|
|
226
|
+
export declare class LocalBarrier implements Barrier {
|
|
227
|
+
private arrived;
|
|
228
|
+
private released;
|
|
229
|
+
readonly reached: Promise<void>;
|
|
230
|
+
private readonly gate;
|
|
231
|
+
arrive(): Promise<void>;
|
|
232
|
+
release(): void;
|
|
233
|
+
}
|
|
234
|
+
/** Барьер между процессами: файлы `<name>.reached` и `<name>.release` в общем каталоге. */
|
|
235
|
+
export declare class FileBarrier implements Barrier {
|
|
236
|
+
readonly dir: string;
|
|
237
|
+
readonly name: string;
|
|
238
|
+
readonly timeoutMs: number;
|
|
239
|
+
constructor(dir: string, name: string, timeoutMs?: number);
|
|
240
|
+
private file;
|
|
241
|
+
arrive(): Promise<void>;
|
|
242
|
+
/** Ждать прибытия (конечный срок). */
|
|
243
|
+
reached(timeoutMs?: number): Promise<number>;
|
|
244
|
+
release(): void;
|
|
245
|
+
}
|
|
246
|
+
export type FaultAction =
|
|
247
|
+
/** Отказ до отправки (`unavailable`): получатель запроса не видел. */
|
|
248
|
+
'fail-before-send'
|
|
249
|
+
/** Запрос выполнен получателем, ответ потерян (`uncertain`). */
|
|
250
|
+
| 'drop-response'
|
|
251
|
+
/** Таймаут без применения (`uncertain`): исход для ядра неизвестен. */
|
|
252
|
+
| 'timeout'
|
|
253
|
+
/** Ответ не по договору после выполнения (`protocol`, мутация могла пройти). */
|
|
254
|
+
| 'protocol-after'
|
|
255
|
+
/** Подтверждённый структурный отказ получателя без выполнения (`refused`/`conflict` с кодом). */
|
|
256
|
+
| 'refuse'
|
|
257
|
+
/** Ждать барьер перед вызовом. */
|
|
258
|
+
| 'barrier'
|
|
259
|
+
/** Завершить процесс до вызова (crash до отправки). */
|
|
260
|
+
| 'exit-before'
|
|
261
|
+
/** Завершить процесс после выполнения получателем (crash до сохранения итога). */
|
|
262
|
+
| 'exit-after'
|
|
263
|
+
/** После вызова выполнить действие (чужая запись между страницами/чтениями). */
|
|
264
|
+
| 'after';
|
|
265
|
+
export interface FaultRule {
|
|
266
|
+
/** Метод транспорта (`addComment`, `readTask`, `checkpoint`…). */
|
|
267
|
+
op: keyof RelayTransport;
|
|
268
|
+
/** Номер вызова (с 1); без него — каждый вызов. */
|
|
269
|
+
nth?: number;
|
|
270
|
+
/** Сколько вызовов подряд, начиная с `nth`. */
|
|
271
|
+
times?: number;
|
|
272
|
+
action: FaultAction;
|
|
273
|
+
barrier?: Barrier;
|
|
274
|
+
after?: () => void | Promise<void>;
|
|
275
|
+
exitCode?: number;
|
|
276
|
+
/** Текст ошибки получателя вместо стандартного (например, с canary-строкой). */
|
|
277
|
+
message?: string;
|
|
278
|
+
/** Для `refuse`: класс и код отказа (по умолчанию refused/VALIDATION_ERROR). */
|
|
279
|
+
refusal?: {
|
|
280
|
+
kind: 'refused' | 'conflict';
|
|
281
|
+
code: string;
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Обёртка отказов вокруг **любого** транспорта (подделки или настоящего
|
|
286
|
+
* адаптера): управляемые точки отказа без случайных задержек.
|
|
287
|
+
*/
|
|
288
|
+
export declare function faultyTransport(inner: RelayTransport, rules: FaultRule[]): RelayTransport & {
|
|
289
|
+
calls: Record<string, number>;
|
|
290
|
+
};
|
|
291
|
+
export {};
|