@quantiya/codevibe-core 2.0.1 → 2.0.3
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/__tests__/prompt-parser.test.d.ts +1 -0
- package/dist/adapter/registry.d.ts +69 -2
- package/dist/appsync/__tests__/appsync-client-event-source-filter.test.d.ts +1 -0
- package/dist/appsync/__tests__/appsync-client-task-group.test.d.ts +1 -0
- package/dist/appsync/__tests__/cleanup-subscription.test.d.ts +1 -0
- package/dist/appsync/__tests__/coerce-awsjson-and-review-summary.test.d.ts +1 -0
- package/dist/appsync/__tests__/cp1f-quorum-sdk.test.d.ts +1 -0
- package/dist/appsync/__tests__/event-throttle.test.d.ts +1 -0
- package/dist/appsync/appsync-client.d.ts +621 -10
- package/dist/appsync/event-throttle.d.ts +28 -0
- package/dist/appsync/index.d.ts +3 -0
- package/dist/appsync/queries.d.ts +19 -0
- package/dist/audit-keys/index.d.ts +32 -0
- package/dist/auth/auth-service.d.ts +32 -2
- package/dist/auth/auth-telemetry.d.ts +19 -1
- package/dist/auth/index.d.ts +1 -0
- package/dist/companion-mode/__tests__/detect-parallel.test.d.ts +1 -0
- package/dist/companion-mode/index.d.ts +4 -3
- package/dist/companion-mode/persist-preference.d.ts +1 -1
- package/dist/config/config.d.ts +8 -1
- package/dist/continuation/__tests__/dirty-state-collector.test.d.ts +1 -0
- package/dist/continuation/__tests__/integration.test.d.ts +1 -0
- package/dist/continuation/__tests__/packet-reader.test.d.ts +1 -0
- package/dist/continuation/__tests__/packet-writer.test.d.ts +1 -0
- package/dist/continuation/__tests__/parity.test.d.ts +1 -0
- package/dist/continuation/__tests__/status-cli.test.d.ts +1 -0
- package/dist/continuation/dirty-state-collector.d.ts +46 -0
- package/dist/continuation/index.d.ts +8 -0
- package/dist/continuation/packet-reader.d.ts +33 -0
- package/dist/continuation/packet-writer.d.ts +86 -0
- package/dist/continuation/types.d.ts +239 -0
- package/dist/credential-broker/__tests__/broker.test.d.ts +1 -0
- package/dist/credential-broker/__tests__/canonical.test.d.ts +1 -0
- package/dist/credential-broker/__tests__/scrubber.test.d.ts +1 -0
- package/dist/credential-broker/__tests__/upstream-client.test.d.ts +1 -0
- package/dist/credential-broker/__tests__/vendor-key-store.test.d.ts +1 -0
- package/dist/credential-broker/audit-sink.d.ts +69 -0
- package/dist/credential-broker/broker-config.d.ts +39 -0
- package/dist/credential-broker/broker-token.d.ts +123 -0
- package/dist/credential-broker/broker.d.ts +165 -0
- package/dist/credential-broker/canonical.d.ts +119 -0
- package/dist/credential-broker/index.d.ts +15 -0
- package/dist/credential-broker/scrubber.d.ts +45 -0
- package/dist/credential-broker/types.d.ts +141 -0
- package/dist/credential-broker/upstream-client.d.ts +20 -0
- package/dist/credential-broker/vendor-key-store.d.ts +54 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +427 -124
- package/dist/keychain/__tests__/keychain-backend.test.d.ts +1 -0
- package/dist/keychain/keychain-backend.d.ts +82 -0
- package/dist/local-executor/__tests__/agentic-disposable-repo.test.d.ts +1 -0
- package/dist/local-executor/__tests__/agentic-resolve.test.d.ts +1 -0
- package/dist/local-executor/__tests__/agentic-resolver-flag.test.d.ts +1 -0
- package/dist/local-executor/__tests__/class-a-sign.test.d.ts +1 -0
- package/dist/local-executor/__tests__/class1-reconcilers.test.d.ts +1 -0
- package/dist/local-executor/__tests__/class2-resolver.test.d.ts +1 -0
- package/dist/local-executor/__tests__/confined-model-caller.test.d.ts +1 -0
- package/dist/local-executor/__tests__/conflict-classifier.test.d.ts +1 -0
- package/dist/local-executor/__tests__/conflict-resolution-durable-store.test.d.ts +1 -0
- package/dist/local-executor/__tests__/conflict-resolution-store.test.d.ts +1 -0
- package/dist/local-executor/__tests__/cp1f-quorum-consumer.test.d.ts +1 -0
- package/dist/local-executor/__tests__/cp7-audit-writer.test.d.ts +1 -0
- package/dist/local-executor/__tests__/durable-store.test.d.ts +1 -0
- package/dist/local-executor/__tests__/git-lock-retry.test.d.ts +1 -0
- package/dist/local-executor/__tests__/implementor-argv.test.d.ts +1 -0
- package/dist/local-executor/__tests__/local-executor-teams.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-conflict-extract.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-conflict-git.integration.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-conflict-resolve-agentic.integration.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-conflict-resolve.integration.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-journal-store.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-train-agentic-recovery.integration.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-train-w3.integration.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-train-waveb.integration.test.d.ts +1 -0
- package/dist/local-executor/__tests__/merge-train.test.d.ts +1 -0
- package/dist/local-executor/__tests__/promote-wal-store.test.d.ts +1 -0
- package/dist/local-executor/__tests__/revert-reconcile.test.d.ts +1 -0
- package/dist/local-executor/__tests__/revert-runner.test.d.ts +1 -0
- package/dist/local-executor/__tests__/shared-contract-detector.test.d.ts +1 -0
- package/dist/local-executor/__tests__/substrate-engage.test.d.ts +1 -0
- package/dist/local-executor/__tests__/team-execution-flag.test.d.ts +1 -0
- package/dist/local-executor/__tests__/track-registry.test.d.ts +1 -0
- package/dist/local-executor/__tests__/wb2-review-bundle.test.d.ts +1 -0
- package/dist/local-executor/__tests__/wb2-substrate-spawn.live.test.d.ts +1 -0
- package/dist/local-executor/__tests__/workspace-shadow.test.d.ts +1 -0
- package/dist/local-executor/__tests__/worktree-merge.test.d.ts +1 -0
- package/dist/local-executor/agentic-disposable-repo.d.ts +52 -0
- package/dist/local-executor/agentic-resolve.d.ts +54 -0
- package/dist/local-executor/agentic-resolver-flag.d.ts +9 -0
- package/dist/local-executor/authority.d.ts +33 -1
- package/dist/local-executor/class-a-emit.d.ts +3 -1
- package/dist/local-executor/class-a-sign.d.ts +57 -0
- package/dist/local-executor/class-b-consumer.d.ts +159 -4
- package/dist/local-executor/class-b-verify.d.ts +30 -0
- package/dist/local-executor/class1-reconcilers.d.ts +58 -0
- package/dist/local-executor/class2-resolver.d.ts +74 -0
- package/dist/local-executor/confined-model-caller.d.ts +39 -0
- package/dist/local-executor/conflict-classifier.d.ts +21 -0
- package/dist/local-executor/conflict-resolution-durable-store.d.ts +61 -0
- package/dist/local-executor/conflict-resolution-store.d.ts +210 -0
- package/dist/local-executor/conflict-types.d.ts +86 -0
- package/dist/local-executor/cp7-audit-writer.d.ts +152 -0
- package/dist/local-executor/durable-store.d.ts +334 -0
- package/dist/local-executor/git-lock-retry.d.ts +40 -0
- package/dist/local-executor/hook-bridge.d.ts +1 -1
- package/dist/local-executor/implementor-argv.d.ts +183 -0
- package/dist/local-executor/index.d.ts +44 -3
- package/dist/local-executor/local-executor-impl.d.ts +645 -4
- package/dist/local-executor/merge-conflict-extract.d.ts +34 -0
- package/dist/local-executor/merge-conflict-resolve.d.ts +101 -0
- package/dist/local-executor/merge-journal-store.d.ts +311 -0
- package/dist/local-executor/merge-train.d.ts +713 -0
- package/dist/local-executor/promote-wal-store.d.ts +301 -0
- package/dist/local-executor/resolution-set-index.d.ts +51 -0
- package/dist/local-executor/revert-reconcile.d.ts +89 -0
- package/dist/local-executor/revert-runner.d.ts +17 -0
- package/dist/local-executor/shared-contract-detector.d.ts +57 -0
- package/dist/local-executor/spawn.d.ts +29 -1
- package/dist/local-executor/task-group-types.d.ts +346 -0
- package/dist/local-executor/team-execution-flag.d.ts +21 -0
- package/dist/local-executor/track-registry.d.ts +50 -0
- package/dist/local-executor/types.d.ts +238 -4
- package/dist/local-executor/wb2-review-bundle.d.ts +59 -0
- package/dist/local-executor/workspace-shadow.d.ts +290 -0
- package/dist/local-executor/worktree-merge.d.ts +601 -0
- package/dist/local-model/__tests__/installer.test.d.ts +1 -0
- package/dist/local-model/__tests__/manager.test.d.ts +1 -0
- package/dist/local-model/__tests__/ollama.test.d.ts +1 -0
- package/dist/local-model/__tests__/runtime.test.d.ts +1 -0
- package/dist/local-model/__tests__/state.test.d.ts +1 -0
- package/dist/local-model/manager.d.ts +119 -0
- package/dist/local-model/ollama.d.ts +27 -0
- package/dist/local-model/runtime.d.ts +27 -0
- package/dist/local-model/state.d.ts +32 -0
- package/dist/orchestration/detect-agents.d.ts +15 -2
- package/dist/orchestration/setup-types.d.ts +2 -1
- package/dist/orchestration-shell/__tests__/attachments.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/audit-browser.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/audited-path-fixes.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/bracketed-paste.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cli-group-halt-wiring.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cli-orchestration-session-bootstrap.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cli-probe-group-status.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cli-quorum-loop-tier.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cli-verdict-classifier-wiring.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/context-store.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp10-585-accept-echo-target.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp10-585-loop.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp10-585-prompts.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp12-w2b-team-loop.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp12-w4-team-recovery.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp1f-quorum-loop.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp606-team-track-user-resolved.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/cp7-reviewer-substrate.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/declared-test-runner.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/familiarize-routing.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/gate-decision-submit.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/gate-details-panel.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/gate-verdict-details-dispatch.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/group-decision-submit.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/image-attach-e2e.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/input-bar-autocomplete.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/live-region-cap.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/live-static-order.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/model-cli.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/non-gate-prompt-routing.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/orchestration-app-group-decision-transport.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/orchestration-app-layout.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/reissue-team-retained-spec.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/review-summary-render.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/reviewer-wizard.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/reviewers-format.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/root-discovery.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/serialize-submissions.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/slash-suggest.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/status-format.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/task-progress.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/team-decompose-routing.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/team-decompose-types.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/team-decompose.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/team-e2e-smoke.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/tier2-reviewer-selection.test.d.ts +1 -0
- package/dist/orchestration-shell/__tests__/web-browsing.test.d.ts +1 -0
- package/dist/orchestration-shell/attachments.d.ts +152 -0
- package/dist/orchestration-shell/audit-browser.d.ts +115 -0
- package/dist/orchestration-shell/audit-runner.d.ts +59 -0
- package/dist/orchestration-shell/bracketed-paste.d.ts +26 -0
- package/dist/orchestration-shell/cli.d.ts +336 -1
- package/dist/orchestration-shell/cli.js +40580 -4692
- package/dist/orchestration-shell/components/AuditLogPanel.d.ts +11 -0
- package/dist/orchestration-shell/components/ConversationPane.d.ts +7 -1
- package/dist/orchestration-shell/components/GateDetailsPanel.d.ts +57 -0
- package/dist/orchestration-shell/components/GatePanelEntry.d.ts +9 -0
- package/dist/orchestration-shell/components/GatePromptEntry.d.ts +7 -0
- package/dist/orchestration-shell/components/InputBar.d.ts +17 -3
- package/dist/orchestration-shell/components/LiveProgressLine.d.ts +8 -0
- package/dist/orchestration-shell/components/MultiTrackStatusNode.d.ts +8 -0
- package/dist/orchestration-shell/components/OrchestrationApp.d.ts +81 -15
- package/dist/orchestration-shell/components/ReviewerSetupWizard.d.ts +24 -0
- package/dist/orchestration-shell/components/StatusBar.d.ts +15 -2
- package/dist/orchestration-shell/context-store.d.ts +389 -0
- package/dist/orchestration-shell/declared-test-runner.d.ts +84 -0
- package/dist/orchestration-shell/emit-shell-event.d.ts +1 -1
- package/dist/orchestration-shell/gate-decision-submit.d.ts +245 -0
- package/dist/orchestration-shell/gate-prompts.d.ts +361 -3
- package/dist/orchestration-shell/index.d.ts +613 -1
- package/dist/orchestration-shell/ink-runtime.d.ts +21 -1
- package/dist/orchestration-shell/live-region-cap.d.ts +70 -0
- package/dist/orchestration-shell/live-static-order.d.ts +22 -0
- package/dist/orchestration-shell/non-tty-fallback.d.ts +21 -0
- package/dist/orchestration-shell/quorum-loop.d.ts +1900 -0
- package/dist/orchestration-shell/root-discovery.d.ts +25 -0
- package/dist/orchestration-shell/route-browse.d.ts +20 -0
- package/dist/orchestration-shell/slash-router.d.ts +20 -1
- package/dist/orchestration-shell/slash-routes/continuation.d.ts +71 -0
- package/dist/orchestration-shell/slash-routes/reviewers.d.ts +41 -0
- package/dist/orchestration-shell/slash-suggest.d.ts +29 -0
- package/dist/orchestration-shell/status-format.d.ts +59 -0
- package/dist/orchestration-shell/task-progress.d.ts +122 -0
- package/dist/orchestration-shell/team-decompose.d.ts +196 -0
- package/dist/orchestration-shell/types.d.ts +363 -3
- package/dist/orchestration-shell/vendor/ink-parse-keypress.d.ts +42 -0
- package/dist/orchestration-shell/web/extract.d.ts +11 -0
- package/dist/orchestration-shell/web/fetch.d.ts +15 -0
- package/dist/orchestration-shell/web/ip.d.ts +26 -0
- package/dist/orchestration-shell/web/sanitize.d.ts +14 -0
- package/dist/orchestration-shell/web/search.d.ts +16 -0
- package/dist/planner/__tests__/local-gemma.test.d.ts +1 -0
- package/dist/planner/index.d.ts +2 -0
- package/dist/planner/local-advisory.d.ts +84 -0
- package/dist/planner/local-gemma.d.ts +23 -0
- package/dist/planner/types.d.ts +16 -6
- package/dist/reviewer/__tests__/antigravity-provider.test.d.ts +1 -0
- package/dist/reviewer/__tests__/claude-provider-json.test.d.ts +1 -0
- package/dist/reviewer/__tests__/cp7-reviewer-sandbox.test.d.ts +1 -0
- package/dist/reviewer/__tests__/output-parser-classifier-helpers.test.d.ts +1 -0
- package/dist/reviewer/__tests__/verdict-classifier.test.d.ts +1 -0
- package/dist/reviewer/index.d.ts +2 -0
- package/dist/reviewer/output-parser.d.ts +48 -12
- package/dist/reviewer/provider.d.ts +107 -3
- package/dist/reviewer/providers/__tests__/failure-classifier.test.d.ts +1 -0
- package/dist/reviewer/providers/antigravity.d.ts +49 -0
- package/dist/reviewer/providers/claude.d.ts +19 -4
- package/dist/reviewer/providers/codex.d.ts +47 -5
- package/dist/reviewer/providers/failure-classifier.d.ts +26 -0
- package/dist/reviewer/providers/gemini.d.ts +5 -4
- package/dist/reviewer/registry.d.ts +5 -5
- package/dist/reviewer/subprocess.d.ts +37 -0
- package/dist/reviewer/token-usage.d.ts +32 -0
- package/dist/reviewer/types.d.ts +5 -5
- package/dist/reviewer/verdict-classifier.d.ts +62 -0
- package/dist/session/__tests__/prepare-event-timestamp.test.d.ts +1 -0
- package/dist/session/index.d.ts +1 -0
- package/dist/session/prepare-event-timestamp.d.ts +30 -0
- package/dist/substrate/__tests__/docker.test.d.ts +1 -0
- package/dist/substrate/__tests__/forwarder.test.d.ts +1 -0
- package/dist/substrate/__tests__/git-proxy.test.d.ts +1 -0
- package/dist/substrate/__tests__/sandbox-exec.test.d.ts +1 -0
- package/dist/substrate/__tests__/substrate-e2e.integration.test.d.ts +1 -0
- package/dist/substrate/command-runner.d.ts +19 -0
- package/dist/substrate/docker.d.ts +134 -0
- package/dist/substrate/errors.d.ts +33 -0
- package/dist/substrate/forwarder.d.ts +67 -0
- package/dist/substrate/git-proxy.d.ts +35 -0
- package/dist/substrate/index.d.ts +12 -0
- package/dist/substrate/relay-script.d.ts +27 -0
- package/dist/substrate/sandbox-exec.d.ts +116 -0
- package/dist/substrate/types.d.ts +218 -0
- package/dist/substrate-launch/__tests__/apikey-bootstrap.test.d.ts +1 -0
- package/dist/substrate-launch/__tests__/creditless-loop.integration.test.d.ts +1 -0
- package/dist/substrate-launch/__tests__/engage-substrate.test.d.ts +1 -0
- package/dist/substrate-launch/__tests__/fallback-ladder.test.d.ts +1 -0
- package/dist/substrate-launch/__tests__/le-env-scrub.test.d.ts +1 -0
- package/dist/substrate-launch/__tests__/sanitized-env.test.d.ts +1 -0
- package/dist/substrate-launch/apikey-bootstrap.d.ts +84 -0
- package/dist/substrate-launch/engage-substrate.d.ts +102 -0
- package/dist/substrate-launch/fallback-ladder.d.ts +49 -0
- package/dist/substrate-launch/index.d.ts +12 -0
- package/dist/substrate-launch/le-env-scrub.d.ts +77 -0
- package/dist/substrate-launch/sanitized-env.d.ts +73 -0
- package/dist/types/auth.d.ts +6 -1
- package/dist/types/events.d.ts +3 -1
- package/dist/types/reviewer.d.ts +6 -6
- package/package.json +7 -3
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
import type { SubstrateHandle, SubstrateProc } from '../substrate/types';
|
|
2
3
|
import type { AuthorityRefusal, AuthorityScope } from './authority';
|
|
3
4
|
export type ProcessRole = 'implementor' | 'reviewer' | 'health_probe' | 'auth_probe' | 'model_probe';
|
|
4
|
-
export type AgentKind = 'CLAUDE' | 'GEMINI' | 'CODEX';
|
|
5
|
+
export type AgentKind = 'CLAUDE' | 'GEMINI' | 'CODEX' | 'ANTIGRAVITY';
|
|
5
6
|
export type FailureClass = null | 'quota_exhausted' | 'auth_failed' | 'timeout' | 'unavailable' | 'user_aborted';
|
|
6
7
|
export interface SpawnArgs {
|
|
7
8
|
argv: string[];
|
|
@@ -13,8 +14,11 @@ export interface SpawnArgs {
|
|
|
13
14
|
stdinTty?: boolean;
|
|
14
15
|
stdinPayload?: string;
|
|
15
16
|
signal?: AbortSignal;
|
|
17
|
+
taskId?: string;
|
|
16
18
|
onProcessSpawned?: ProcessSpawnedHook;
|
|
17
19
|
onProcessExited?: ProcessExitedHook;
|
|
20
|
+
substrate?: SubstrateHandle;
|
|
21
|
+
requireConfined?: boolean;
|
|
18
22
|
}
|
|
19
23
|
export interface ProcessSpawnedInfo {
|
|
20
24
|
pid: number;
|
|
@@ -58,6 +62,10 @@ export declare class SpawnArgsInvalid extends Error {
|
|
|
58
62
|
readonly offendingKey?: string | undefined;
|
|
59
63
|
constructor(reason: string, offendingKey?: string | undefined);
|
|
60
64
|
}
|
|
65
|
+
export declare class SpawnConfinementUnavailable extends Error {
|
|
66
|
+
readonly reason: string;
|
|
67
|
+
constructor(reason: string);
|
|
68
|
+
}
|
|
61
69
|
export declare const MARKER_ENV_KEYS: {
|
|
62
70
|
readonly CHILD: "CODEVIBE_CHILD_PROCESS";
|
|
63
71
|
readonly ROLE: "CODEVIBE_PROCESS_ROLE";
|
|
@@ -78,6 +86,32 @@ export type AuthorityAction = {
|
|
|
78
86
|
command: string;
|
|
79
87
|
argv: string[];
|
|
80
88
|
};
|
|
89
|
+
export interface GateDispatchPayload {
|
|
90
|
+
/** The DETERMINISTIC gate_id of this gate-run (the round-0 proposal gate id at START). */
|
|
91
|
+
gateRunId: string;
|
|
92
|
+
/** `"verification" | "reviewer_quorum" | "final_approval"` (snake_case wire form). */
|
|
93
|
+
gateType: string;
|
|
94
|
+
/** Present ONLY for `verification` gates (CP-3 — out of scope for CP-1.f single-task). */
|
|
95
|
+
verificationChecks?: string[];
|
|
96
|
+
/**
|
|
97
|
+
* Present ONLY once the per-seat reviewer panel is resolved. ABSENT at START
|
|
98
|
+
* (the proposal hasn't arrived) — `start_ports.rs:296` sets `reviewer_seats:
|
|
99
|
+
* None`. Each row is the camelCase `ReviewerSeatRow`
|
|
100
|
+
* (`{seatId, agentKind, role, reviewerPacketRef}`).
|
|
101
|
+
*/
|
|
102
|
+
reviewerSeats?: GateDispatchReviewerSeat[];
|
|
103
|
+
/** Present ONLY for `final_approval` gates. */
|
|
104
|
+
finalApprovalSurface?: string;
|
|
105
|
+
}
|
|
106
|
+
/** One reviewer-seat row inside `GateDispatchPayload.reviewerSeats` (camelCase). */
|
|
107
|
+
export interface GateDispatchReviewerSeat {
|
|
108
|
+
seatId: number;
|
|
109
|
+
/** UPPERCASE agent kind: `"CLAUDE" | "CODEX" | "GEMINI"`. */
|
|
110
|
+
agentKind: string;
|
|
111
|
+
/** UPPERCASE lens: `"ARCHITECTURE" | "CORRECTNESS" | ...`. */
|
|
112
|
+
role: string;
|
|
113
|
+
reviewerPacketRef: string;
|
|
114
|
+
}
|
|
81
115
|
export interface SignedEnvelope {
|
|
82
116
|
algorithm: 'ed25519' | 'p384-ecdsa';
|
|
83
117
|
publicKeyId: string;
|
|
@@ -85,6 +119,168 @@ export interface SignedEnvelope {
|
|
|
85
119
|
issuedAt: string;
|
|
86
120
|
nonceUlid: string;
|
|
87
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Cross-track-conflict dispute context (§2.2, #C12-19). Present ONLY on a
|
|
124
|
+
* dispute re-dispatch; ABSENT (undefined) on a fresh `TrackAssigned`. The
|
|
125
|
+
* re-dispatched implementor/reviewers use it to know what to reconcile.
|
|
126
|
+
*/
|
|
127
|
+
export interface TrackConflictContext {
|
|
128
|
+
conflict_id: string;
|
|
129
|
+
shared_contract_ref: string;
|
|
130
|
+
peer_track_findings: unknown;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* §2.2 `TrackAssigned` payload — launch track N. The LE spawns the implementor
|
|
134
|
+
* for this track in `state_dir`, idempotent by
|
|
135
|
+
* `(task_group_id, track_index, dispatch_generation)` (#C12-14/#C12-17).
|
|
136
|
+
*/
|
|
137
|
+
export interface TrackAssignedPayload {
|
|
138
|
+
task_group_id: string;
|
|
139
|
+
track_index: number;
|
|
140
|
+
task_id: string;
|
|
141
|
+
/** UPPERCASE adapter discriminator (CLAUDE | GEMINI | CODEX). */
|
|
142
|
+
implementor_agent: AgentKind;
|
|
143
|
+
/** snake_case OwnershipScope (advanced to the per-track authority scope). */
|
|
144
|
+
ownership_scope: {
|
|
145
|
+
write_paths: string[];
|
|
146
|
+
shared_contracts: {
|
|
147
|
+
path: string;
|
|
148
|
+
access: 'write' | 'read';
|
|
149
|
+
}[];
|
|
150
|
+
test_surfaces: string[];
|
|
151
|
+
auto_modified_files: string[];
|
|
152
|
+
};
|
|
153
|
+
is_shared_test_owner: boolean;
|
|
154
|
+
/** `<repo>/.codevibe/state/<task_group_id>/<track_index>/`. */
|
|
155
|
+
state_dir: string;
|
|
156
|
+
dispatch_id: string;
|
|
157
|
+
dispatch_generation: number;
|
|
158
|
+
/** Option — present on a dispute re-dispatch (#C12-19), absent on fresh. */
|
|
159
|
+
conflict_context?: TrackConflictContext;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* §2.2 `MergeGateDispatch` payload — run the shared integration verification.
|
|
163
|
+
* The `owner_track_index` track runs the integration check named by
|
|
164
|
+
* `integration_check_spec` (§12 Q1 — CP-3 verification-gate kinds, NOT a
|
|
165
|
+
* free-form shell), classifies + signs the result (#C12-8), and reports
|
|
166
|
+
* `submitMergeGateVerdict`.
|
|
167
|
+
*/
|
|
168
|
+
export interface MergeGateDispatchPayload {
|
|
169
|
+
task_group_id: string;
|
|
170
|
+
merge_gate_id: string;
|
|
171
|
+
/**
|
|
172
|
+
* §12 Q1 — names CP-3 verification-runner wrapper(s). On the wire this is the
|
|
173
|
+
* `VerificationGateKind` list the owner track named at `createTaskGroup`. A
|
|
174
|
+
* single string is accepted for forward-compat and coerced to a 1-element
|
|
175
|
+
* list by the runner.
|
|
176
|
+
*/
|
|
177
|
+
integration_check_spec: string | string[];
|
|
178
|
+
owner_track_index: number;
|
|
179
|
+
dispatch_id: string;
|
|
180
|
+
dispatch_generation: number;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* §2.2 `TaskGroupHalted` payload — group halted/escalated (expanded escalation
|
|
184
|
+
* fields per the Stage-2 §11.3 fix). The LE surfaces the choices to the UI
|
|
185
|
+
* (NOTIFICATION) + signals the in-flight track processes to stop. The deep
|
|
186
|
+
* auto-resolution decision tree is server-side (#C12-3) — the LE only consumes,
|
|
187
|
+
* surfaces, and stops. [DEFERRED — GA/CP-12 Wave 3+] for choice-driven
|
|
188
|
+
* auto-actions.
|
|
189
|
+
*/
|
|
190
|
+
export interface TaskGroupHaltedPayload {
|
|
191
|
+
task_group_id: string;
|
|
192
|
+
halt_reason: string;
|
|
193
|
+
per_track_status: {
|
|
194
|
+
track_index: number;
|
|
195
|
+
state: string;
|
|
196
|
+
agent?: string;
|
|
197
|
+
}[];
|
|
198
|
+
gates_passed_failed?: unknown;
|
|
199
|
+
/**
|
|
200
|
+
* #584 r2 — internally-tagged union pinned to core-rs `HaltFixOwner`
|
|
201
|
+
* (`class_b_envelope.rs`, `rename_all = "snake_case"` tags +
|
|
202
|
+
* `rename_all_fields = "camelCase"`): wire `{kind: "track", trackIndex}` |
|
|
203
|
+
* `{kind: "serial_owner"}`. `normalizeTaskGroupHaltedWire` maps the field to
|
|
204
|
+
* the internal snake_case `track_index`.
|
|
205
|
+
*/
|
|
206
|
+
recommended_fix_owner?: {
|
|
207
|
+
kind: string;
|
|
208
|
+
track_index?: number;
|
|
209
|
+
};
|
|
210
|
+
remaining_budget?: {
|
|
211
|
+
auto_revise_used?: number;
|
|
212
|
+
auto_revise_cap?: number;
|
|
213
|
+
wallclock_elapsed_ms?: number;
|
|
214
|
+
wallclock_cap_ms?: number;
|
|
215
|
+
};
|
|
216
|
+
/**
|
|
217
|
+
* #584 r2 — pinned to core-rs `HaltChoice` (same serde shape as
|
|
218
|
+
* `HaltFixOwner`): wire `{kind: "retry_serial_owner" | "retry_track" |
|
|
219
|
+
* "continue_manually" | "accept_partial" | "abort", trackIndex?}` — NOT a
|
|
220
|
+
* string list (the pre-#584 annotation was a wrong pin). Display-only.
|
|
221
|
+
*/
|
|
222
|
+
choices: {
|
|
223
|
+
kind: string;
|
|
224
|
+
track_index?: number;
|
|
225
|
+
}[];
|
|
226
|
+
}
|
|
227
|
+
import type { AgentKind as ReviewerAgentKind, ReviewerRole } from '../reviewer/types';
|
|
228
|
+
/**
|
|
229
|
+
* CP-1.f §3.C.21 — `REVIEWER_DISPATCH` Class B payload (engine → desktop).
|
|
230
|
+
* Tells the desktop to spawn one reviewer subprocess for the named seat; the
|
|
231
|
+
* rendered prompt is FETCHED out-of-band via `getReviewerPrompt` (the dispatch
|
|
232
|
+
* carries no inline prompt). Pinned to `class_b_envelope.rs::ReviewerDispatchPayload`.
|
|
233
|
+
*/
|
|
234
|
+
export interface ReviewerDispatchPayload {
|
|
235
|
+
/** Gate this dispatch belongs to (UUID string). */
|
|
236
|
+
gateId: string;
|
|
237
|
+
/**
|
|
238
|
+
* RESOLVED seat-id STRING (post-promotion), e.g. `"1::codex"` or bare `"1"`.
|
|
239
|
+
* The numeric seat for `getReviewerPrompt` is the substring before `"::"`.
|
|
240
|
+
*/
|
|
241
|
+
seatId: string;
|
|
242
|
+
/** Lowercase agent kind (`"claude" | "gemini" | "codex"`) — chosen from the resolved plan. */
|
|
243
|
+
agentKind: ReviewerAgentKind;
|
|
244
|
+
/** snake_case reviewer lens for the seat (e.g. `"correctness"`). */
|
|
245
|
+
role: ReviewerRole;
|
|
246
|
+
/** Deterministic dispatch ULID (LOCK #C3F-6). */
|
|
247
|
+
dispatchUlid: string;
|
|
248
|
+
/** Attempt number (0-indexed) used as the ULID seed. */
|
|
249
|
+
attemptNumber: number;
|
|
250
|
+
/** Producer process-id (no-same-process self-review check, LOCK #C3F-7). */
|
|
251
|
+
producerProcessId: string;
|
|
252
|
+
/** Producer session-id (paired with `producerProcessId`). */
|
|
253
|
+
producerSessionId: string;
|
|
254
|
+
}
|
|
255
|
+
/** One reviewer's REVISE finding inside `ReviseFeedbackPayload.seatFindings`. */
|
|
256
|
+
export interface ReviseSeatFinding {
|
|
257
|
+
/** Resolved seat-id string (post-promotion if applicable). */
|
|
258
|
+
seatId: string;
|
|
259
|
+
/** snake_case reviewer lens. */
|
|
260
|
+
role: ReviewerRole;
|
|
261
|
+
/** Free-form findings narrative. */
|
|
262
|
+
findings: string;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* CP-1.f §3.C.23 — `REVISE_FEEDBACK` Class B payload (engine → desktop). The
|
|
266
|
+
* desktop re-runs the implementor for round N+1 with the aggregated findings,
|
|
267
|
+
* then `submitImplementorOutput(nextGateId, nextRound)`. Pinned to
|
|
268
|
+
* `class_b_envelope.rs::ReviseFeedbackPayload`.
|
|
269
|
+
*/
|
|
270
|
+
export interface ReviseFeedbackPayload {
|
|
271
|
+
/** The OLD (parent) gate id that produced the REVISE. */
|
|
272
|
+
gateId: string;
|
|
273
|
+
/** Per-seat REVISE findings (ordered by ascending seat_id). */
|
|
274
|
+
seatFindings: ReviseSeatFinding[];
|
|
275
|
+
/** Round number (0-indexed) the REVISE landed at. */
|
|
276
|
+
roundNumber: number;
|
|
277
|
+
/** The DETERMINISTIC round-N+1 gate id the desktop targets with `submitImplementorOutput`. */
|
|
278
|
+
nextGateId: string;
|
|
279
|
+
/** The round number of the next round (`roundNumber + 1`). */
|
|
280
|
+
nextRound: number;
|
|
281
|
+
/** DETERMINISTIC dedup key keyed `(parentGateId, nextGateId, nextRound)` — the double-spawn guard. */
|
|
282
|
+
reviseFeedbackId: string;
|
|
283
|
+
}
|
|
88
284
|
export type ClassBInbound = {
|
|
89
285
|
kind: 'PlannerDecisionApproved';
|
|
90
286
|
signedEnvelope: SignedEnvelope;
|
|
@@ -105,6 +301,26 @@ export type ClassBInbound = {
|
|
|
105
301
|
kind: 'PolicyRejection';
|
|
106
302
|
signedEnvelope: SignedEnvelope;
|
|
107
303
|
payload: unknown;
|
|
304
|
+
} | {
|
|
305
|
+
kind: 'TrackAssigned';
|
|
306
|
+
signedEnvelope: SignedEnvelope;
|
|
307
|
+
payload: unknown;
|
|
308
|
+
} | {
|
|
309
|
+
kind: 'MergeGateDispatch';
|
|
310
|
+
signedEnvelope: SignedEnvelope;
|
|
311
|
+
payload: unknown;
|
|
312
|
+
} | {
|
|
313
|
+
kind: 'TaskGroupHalted';
|
|
314
|
+
signedEnvelope: SignedEnvelope;
|
|
315
|
+
payload: unknown;
|
|
316
|
+
} | {
|
|
317
|
+
kind: 'ReviewerDispatch';
|
|
318
|
+
signedEnvelope: SignedEnvelope;
|
|
319
|
+
payload: unknown;
|
|
320
|
+
} | {
|
|
321
|
+
kind: 'ReviseFeedback';
|
|
322
|
+
signedEnvelope: SignedEnvelope;
|
|
323
|
+
payload: unknown;
|
|
108
324
|
};
|
|
109
325
|
export type ExecutorError = {
|
|
110
326
|
kind: 'AuthorityRefusal';
|
|
@@ -170,11 +386,29 @@ export interface LocalExecutor {
|
|
|
170
386
|
ingestHookEvent(event: HookEvent): Promise<void>;
|
|
171
387
|
/** Read-only view of the current TASK_AUTHORIZED.authorityScope. */
|
|
172
388
|
authorityScope(): Readonly<AuthorityScope>;
|
|
173
|
-
/**
|
|
174
|
-
|
|
389
|
+
/**
|
|
390
|
+
* CP-1.c STUB; CP-1.e wires real AppSync subscription + signature verification.
|
|
391
|
+
* `envelopeTaskId` (Audited-path fix B) — the outer Class B envelope's taskId,
|
|
392
|
+
* forwarded so a PolicyRejection (payload carries no taskId) discards exactly
|
|
393
|
+
* the rejected task's shadow. Optional for non-WS callers / tests.
|
|
394
|
+
*/
|
|
395
|
+
consumeClassB(packet: ClassBInbound, envelopeTaskId?: string): Promise<void>;
|
|
396
|
+
/**
|
|
397
|
+
* CP-12 W4 (#593) — team-dispatch recovery. Re-launch a track whose round-0
|
|
398
|
+
* `TrackAssigned` was dropped by the emit-before-subscribe race (the engine
|
|
399
|
+
* emits the per-track dispatch ~0.5s before the desktop's Class B subscription
|
|
400
|
+
* is established → live AppSync does not replay it). Exposes the private
|
|
401
|
+
* `launchTrack` body (register + brief bridge) and returns the explicit result
|
|
402
|
+
* the QuorumLoop `recoverTeamTracks` discriminates (`duplicate` returned BEFORE
|
|
403
|
+
* the bridge → recovery repairs the brief; `rejected` did not launch → skip).
|
|
404
|
+
* The single-track LE / non-team path never calls this (recovery is gated on a
|
|
405
|
+
* team session). Optional on the interface for non-team `LocalExecutor`
|
|
406
|
+
* implementations / tests.
|
|
407
|
+
*/
|
|
408
|
+
recoverLaunchTrack?(payload: TrackAssignedPayload): Promise<'registered' | 'duplicate' | 'rejected'>;
|
|
175
409
|
}
|
|
176
410
|
export interface SpawnedProcess {
|
|
177
|
-
child: ChildProcess;
|
|
411
|
+
child: ChildProcess | SubstrateProc;
|
|
178
412
|
pid: number;
|
|
179
413
|
role: ProcessRole;
|
|
180
414
|
agentKind: AgentKind | undefined;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §2.6 — a single conflicted path rendered to concrete 3-way CONTENT for the
|
|
3
|
+
* reviewer prompt. Each side is either decoded text, a per-side snippet (head+tail
|
|
4
|
+
* with a truncation marker), or a placeholder line (`[absent…]`/`[binary…]`/
|
|
5
|
+
* `[non-UTF-8…]`). Additive — absent ⇒ today's bare base→tip diff.
|
|
6
|
+
*/
|
|
7
|
+
export interface RenderedConflict {
|
|
8
|
+
path: string;
|
|
9
|
+
/** Rendered content OR a placeholder. base = the merge-base side. */
|
|
10
|
+
base: string;
|
|
11
|
+
/** integration-tip side (`ours`). */
|
|
12
|
+
ours: string;
|
|
13
|
+
/** incoming-track side (`theirs`). */
|
|
14
|
+
theirs: string;
|
|
15
|
+
}
|
|
16
|
+
/** §2.6 — one track's intent diff (base → trackTip), already byte-bounded. */
|
|
17
|
+
export interface TrackIntentDiff {
|
|
18
|
+
trackIndex: number;
|
|
19
|
+
implementorAgent?: string;
|
|
20
|
+
/** unified base→trackTip diff (byte-bounded by `readDiffHermetic`). */
|
|
21
|
+
diff: string;
|
|
22
|
+
}
|
|
23
|
+
/** §2.6 — the rendered intent bundle handed to the dispatcher (additive callback fields). */
|
|
24
|
+
export interface RenderedTier2Bundle {
|
|
25
|
+
conflictBundle: readonly RenderedConflict[];
|
|
26
|
+
trackIntentDiffs: readonly TrackIntentDiff[];
|
|
27
|
+
}
|
|
28
|
+
/** §2.6 (locked) byte budgets. The aggregate ceiling must clear the 512 KiB diff with headroom. */
|
|
29
|
+
export declare const WAVE_B_TIER2_MAX_BUNDLE_BYTES: number;
|
|
30
|
+
export declare const WB2_BUNDLE_PER_SIDE_MAX_BYTES: number;
|
|
31
|
+
export declare const WB2_INTENT_DIFF_MAX_BYTES: number;
|
|
32
|
+
/**
|
|
33
|
+
* Render ONE side of a conflict (already-fetched bytes) to prompt-safe text under
|
|
34
|
+
* the per-side cap. NEVER emits raw bytes for a binary / non-UTF-8 / absent side —
|
|
35
|
+
* a placeholder line instead (Q-BINARY locked). A side over the per-side cap is
|
|
36
|
+
* snippet-trimmed head+tail with an explicit `[…truncated N bytes…]` marker
|
|
37
|
+
* (Q-OVERFLOW locked — the ONLY truncate-with-marker affordance).
|
|
38
|
+
*
|
|
39
|
+
* @param bytes the side's raw blob bytes, or `null` when the path is absent on this side.
|
|
40
|
+
* @param oid the side's blob OID (for the binary/non-UTF-8 placeholder), if known.
|
|
41
|
+
*/
|
|
42
|
+
export declare function renderConflictSide(bytes: Buffer | null, oid: string | undefined, perSideMaxBytes?: number): string;
|
|
43
|
+
/**
|
|
44
|
+
* Render the §2.6 bundle into prompt sections, appended AFTER the base→tip diff
|
|
45
|
+
* block. Returns `''` when the bundle is empty/absent (graceful degrade → today's
|
|
46
|
+
* behavior). Pure string assembly — no overflow decision here (the dispatcher owns
|
|
47
|
+
* the aggregate-ceiling fail-closed check, see {@link bundleSectionsOverBudget}).
|
|
48
|
+
*/
|
|
49
|
+
export declare function renderTier2BundleSections(bundle: {
|
|
50
|
+
conflictBundle?: readonly RenderedConflict[];
|
|
51
|
+
trackIntentDiffs?: readonly TrackIntentDiff[];
|
|
52
|
+
}): string;
|
|
53
|
+
/**
|
|
54
|
+
* The LOCK fail-closed aggregate check: TRUE iff the rendered diff + bundle sections
|
|
55
|
+
* exceed the aggregate ceiling. The dispatcher fails closed (NO-PROMOTE) when true —
|
|
56
|
+
* the per-side snippet trim keeps individual sides under the per-side cap, but the
|
|
57
|
+
* AGGREGATE never silently drops a whole conflict or intent diff to fit (§2.6 line 108).
|
|
58
|
+
*/
|
|
59
|
+
export declare function bundleSectionsOverBudget(diff: string, bundleSections: string, maxBundleBytes?: number): boolean;
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import type { PromoteManifestInput } from './durable-store';
|
|
2
|
+
/** Default TTL after which an orphaned shadow is GC-eligible (#GC-1). */
|
|
3
|
+
export declare const DEFAULT_SHADOW_TTL_MS: number;
|
|
4
|
+
/** `change_kind` values mirroring the pinned engine `ExecuteFirstFile` contract. */
|
|
5
|
+
export type ShadowChangeKind = 'created' | 'modified' | 'deleted';
|
|
6
|
+
/** One captured changed file in the shadow-vs-real diff (§D3). */
|
|
7
|
+
export interface ShadowDiffFile {
|
|
8
|
+
/** Path RELATIVE to the workspace root (matches the engine contract). */
|
|
9
|
+
path: string;
|
|
10
|
+
change_kind: ShadowChangeKind;
|
|
11
|
+
/** The captured content (created/modified) or empty for deleted. */
|
|
12
|
+
content: string;
|
|
13
|
+
}
|
|
14
|
+
/** Persisted promote-state marker (#PR-4). */
|
|
15
|
+
type ShadowPromoteState = 'pending' | 'promoted';
|
|
16
|
+
/** Injected for deterministic tests; production uses the real fs/git. */
|
|
17
|
+
export interface ShadowEnv {
|
|
18
|
+
/** Sleep between git-op retries. */
|
|
19
|
+
sleep?: (ms: number) => Promise<void>;
|
|
20
|
+
/** Override the per-task state dir root (default `~/.codevibe/shadow-state`). */
|
|
21
|
+
stateRootDir?: string;
|
|
22
|
+
/** Override the shadow temp-dir root (default `os.tmpdir()`). */
|
|
23
|
+
shadowRootDir?: string;
|
|
24
|
+
/** TTL for the GC reaper. */
|
|
25
|
+
ttlMs?: number;
|
|
26
|
+
/** Hook to terminate task-spawned children rooted in the shadow before teardown. */
|
|
27
|
+
killChildrenInShadow?: (shadowDir: string) => Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* CP-14 Wave A (`team.execution=worktree_merge`) — make the shadow worktree a
|
|
31
|
+
* PERSISTENT track branch instead of a detached HEAD, so the merge-train can
|
|
32
|
+
* merge the track's committed tip. `baseSha` is the ONE group base pinned BEFORE
|
|
33
|
+
* the first track shadow is created (so every track roots at the same base — a
|
|
34
|
+
* deterministic merge-train input). Git-only: a non-git workspace is ineligible.
|
|
35
|
+
*/
|
|
36
|
+
export interface TrackBranchSpec {
|
|
37
|
+
/** The persistent branch name, e.g. `codevibe/track/<groupId>/<trackIndex>`. */
|
|
38
|
+
name: string;
|
|
39
|
+
/** The pinned group base commit the branch is created at. */
|
|
40
|
+
baseSha: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The desktop's per-task shadow workspace. ONE instance per active task; the
|
|
44
|
+
* QuorumLoop creates it before the round-0 spawn, points the implementor cwd at
|
|
45
|
+
* `shadowDir`, captures the diff after the implementor exits, and the class-B
|
|
46
|
+
* consumer promotes (TaskAuthorized) or discards (every other terminal).
|
|
47
|
+
*/
|
|
48
|
+
export declare class WorkspaceShadow {
|
|
49
|
+
readonly taskId: string;
|
|
50
|
+
/** The real workspace root (canonical). */
|
|
51
|
+
readonly workingDir: string;
|
|
52
|
+
/** The shadow dir the implementor spawns in (its cwd). */
|
|
53
|
+
readonly shadowDir: string;
|
|
54
|
+
/** True when the shadow is a `git worktree` (vs a non-git file copy). */
|
|
55
|
+
readonly isGit: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* CP-14 Wave A — the persistent track branch this shadow worktree sits on
|
|
58
|
+
* (`worktree_merge` only); undefined on the legacy detached-HEAD path. When
|
|
59
|
+
* set, the seam commits to this branch (see {@link commitTrack}) instead of
|
|
60
|
+
* the in-place promote.
|
|
61
|
+
*/
|
|
62
|
+
readonly trackBranch?: string;
|
|
63
|
+
/** Paths (RELATIVE to workingDir) materialized into the shadow — the TRACKED SET. */
|
|
64
|
+
private trackedSet;
|
|
65
|
+
/** Pre-task content hash per tracked path (null = absent at create), #PR-2. */
|
|
66
|
+
private preTaskHashes;
|
|
67
|
+
/** The per-task durable state dir (under the app-data dir), survives restarts. */
|
|
68
|
+
private readonly stateDir;
|
|
69
|
+
private readonly env;
|
|
70
|
+
private readonly sleep;
|
|
71
|
+
private constructor();
|
|
72
|
+
/** @internal — test introspection of the tracked set. */
|
|
73
|
+
get trackedSetForTests(): ReadonlySet<string>;
|
|
74
|
+
/**
|
|
75
|
+
* Create the shadow BEFORE the round-0 spawn + record the TRACKED SET.
|
|
76
|
+
*
|
|
77
|
+
* - git repo → `git worktree add` (PRIMARY: cheap, shared object store, real
|
|
78
|
+
* `.git` so the agent's own `npm test`/`git diff` work).
|
|
79
|
+
* - non-git → file-copy of `workingDir` excluding `.git`/secrets/gitignored
|
|
80
|
+
* + symlink the real `node_modules` (read-through, never a promote target).
|
|
81
|
+
*
|
|
82
|
+
* Fail-closed (#SR-2): a create failure throws — the caller surfaces it and
|
|
83
|
+
* does NOT spawn against a half-built shadow.
|
|
84
|
+
*/
|
|
85
|
+
static create(taskId: string, workingDir: string, env?: ShadowEnv, opts?: {
|
|
86
|
+
trackBranch?: TrackBranchSpec;
|
|
87
|
+
}): Promise<WorkspaceShadow>;
|
|
88
|
+
/**
|
|
89
|
+
* Capture the shadow-vs-real diff AFTER `await handle.done`, bounded STRICTLY
|
|
90
|
+
* to the tracked set (#PM-2 / agy H2):
|
|
91
|
+
* - created — in shadow, NOT in the tracked baseline.
|
|
92
|
+
* - modified — tracked path whose shadow content differs from the baseline.
|
|
93
|
+
* - deleted — was in the tracked baseline AND the agent removed it from the
|
|
94
|
+
* shadow (NOT merely "absent from shadow", which would falsely
|
|
95
|
+
* flag every excluded path → catastrophic-delete).
|
|
96
|
+
*
|
|
97
|
+
* git → `git diff` (already tracked-scoped); non-git → tree-compare bounded to
|
|
98
|
+
* the tracked set. Across revise rounds the diff is CUMULATIVE shadow-vs-real.
|
|
99
|
+
*/
|
|
100
|
+
captureDiff(): Promise<ShadowDiffFile[]>;
|
|
101
|
+
private captureGitDiff;
|
|
102
|
+
private captureCopyDiff;
|
|
103
|
+
/**
|
|
104
|
+
* CP-14 Wave A (`worktree_merge`) — commit the shadow worktree's full content
|
|
105
|
+
* (the dirty-replay baseline + the implementor's edits + any new untracked
|
|
106
|
+
* files) onto the persistent track branch, and return the committed tip SHA
|
|
107
|
+
* (the merge-train input). This REPLACES the legacy in-place {@link promote}
|
|
108
|
+
* for track shadows: the user tree is NOT touched here — the change lands only
|
|
109
|
+
* when the merge gate promotes the integration tip.
|
|
110
|
+
*
|
|
111
|
+
* Deterministic for recovery-replay stability: pinned bot identity + a pinned
|
|
112
|
+
* `@0` author/committer date + hooks/gpg disabled, so a re-run over identical
|
|
113
|
+
* content yields an identical SHA. `--allow-empty` so a no-op track still
|
|
114
|
+
* produces a real base-rooted tip (no `#EF-1`-style born-halt; the merge-train
|
|
115
|
+
* fast-forwards it).
|
|
116
|
+
*
|
|
117
|
+
* Requires a git track-branch shadow (created with `opts.trackBranch`); throws
|
|
118
|
+
* otherwise — a missing tip must FAIL CLOSED upstream, never be silently empty.
|
|
119
|
+
*
|
|
120
|
+
* REVIEW-INTEGRITY (#598-11 parity, Stage-1 HIGH): the commit is built from the
|
|
121
|
+
* REVIEWED, drift-checked `diff` content (the in-memory `ShadowDiffFile[]` the
|
|
122
|
+
* caller already validated against the reviewed snapshot) via a THROWAWAY index
|
|
123
|
+
* + `git hash-object`/`commit-tree` — the live worktree is NEVER re-read. This
|
|
124
|
+
* matches the legacy `promote(diff)`, which applies the captured `diff[].content`
|
|
125
|
+
* (not a re-read), so a detached writer that mutates the worktree after the
|
|
126
|
+
* drift-check cannot inject UNREVIEWED bytes into the track tip. The branch sits
|
|
127
|
+
* at the pinned base (its only commit-to-be) and the diff is "everything vs
|
|
128
|
+
* base", so `read-tree base` + apply-diff reconstructs exactly the reviewed tree.
|
|
129
|
+
*/
|
|
130
|
+
commitTrack(diff: readonly ShadowDiffFile[], opts?: {
|
|
131
|
+
message?: string;
|
|
132
|
+
}): Promise<string>;
|
|
133
|
+
/**
|
|
134
|
+
* Materialize the changed-file SET over the TRACKED SET ONLY (#PM-1/#PM-2):
|
|
135
|
+
* copy the shadow's changed files onto the real tree (create/overwrite) +
|
|
136
|
+
* delete the real files that were in the tracked baseline AND the agent
|
|
137
|
+
* removed. NEVER touches a real-tree path outside the tracked set.
|
|
138
|
+
*
|
|
139
|
+
* Idempotent (#PR-4): a `promoted` marker short-circuits — a packet +
|
|
140
|
+
* recovery double-fire is a safe no-op.
|
|
141
|
+
*
|
|
142
|
+
* Per-file TOCTOU guard (#PR-2): before overwrite/delete, the real file's
|
|
143
|
+
* current hash is compared to the pre-task hash (null = absent). A mismatch
|
|
144
|
+
* (concurrent edit/create/delete) is ESCALATED via the returned conflicts —
|
|
145
|
+
* never blind-clobbered.
|
|
146
|
+
*
|
|
147
|
+
* Fail-closed (#SR-2): on any conflict OR fs error the caller surfaces
|
|
148
|
+
* "could not promote — N files at <paths>". Returns the conflicts/errors so
|
|
149
|
+
* the caller renders them; throws only on a marker-write failure.
|
|
150
|
+
*/
|
|
151
|
+
promote(diff: ShadowDiffFile[], opts?: {
|
|
152
|
+
/**
|
|
153
|
+
* PHASE-589/469 W3.1 (C1) — capture a durable revert manifest for a TEAM
|
|
154
|
+
* track. For each in-scope, hash-matched file the promote is about to
|
|
155
|
+
* apply, read its PRE-IMAGE content + hash BEFORE the tree mutates and
|
|
156
|
+
* emit a {@link PromoteManifestInput} entry. `trackIndex` / the starting
|
|
157
|
+
* `promoteOrder` are caller-supplied (the group-wide monotonic order); the
|
|
158
|
+
* captured entries carry `promoteOrder = base + i` in capture order.
|
|
159
|
+
* Single-impl promotes pass no opts → byte-identical to the legacy path.
|
|
160
|
+
*
|
|
161
|
+
* `persist` (REQUIRED when `captureManifest` is set) is awaited with the
|
|
162
|
+
* captured entries BEFORE the FIRST file is mutated (LOCK #589-I: the
|
|
163
|
+
* manifest is durable before the tree changes, so a mid-promote crash
|
|
164
|
+
* still leaves a recoverable undo record). The entries are captured in a
|
|
165
|
+
* read-only PRE-PASS (no mutation), persisted, THEN applied.
|
|
166
|
+
*/
|
|
167
|
+
captureManifest?: {
|
|
168
|
+
trackIndex: number;
|
|
169
|
+
promoteOrderBase: number;
|
|
170
|
+
persist: (entries: PromoteManifestInput[]) => Promise<void>;
|
|
171
|
+
};
|
|
172
|
+
}): Promise<{
|
|
173
|
+
/**
|
|
174
|
+
* Whether this call actually MATERIALIZED files onto the real tree. `false`
|
|
175
|
+
* means it was an idempotent no-op (a prior promote already landed via the
|
|
176
|
+
* durable `promoted` marker — a packet + recovery double-fire). The caller
|
|
177
|
+
* uses this to suppress duplicate `promoting`/`promoted` progress + the
|
|
178
|
+
* "Applied N files" milestone on a re-delivered TaskAuthorized packet.
|
|
179
|
+
*/
|
|
180
|
+
materialized: boolean;
|
|
181
|
+
promoted: string[];
|
|
182
|
+
conflicts: string[];
|
|
183
|
+
errors: Array<{
|
|
184
|
+
path: string;
|
|
185
|
+
error: string;
|
|
186
|
+
}>;
|
|
187
|
+
/**
|
|
188
|
+
* PHASE-589/469 W3.1 (C1) — the captured pre-image manifest entries (only
|
|
189
|
+
* populated when `opts.captureManifest` was passed). The caller persists
|
|
190
|
+
* these via `RevertManifestStore.appendPromote` BEFORE relying on the
|
|
191
|
+
* applied tree (the capture itself already ran before the mutation). One
|
|
192
|
+
* entry per file that the promote actually applied.
|
|
193
|
+
*/
|
|
194
|
+
manifestEntries: PromoteManifestInput[];
|
|
195
|
+
}>;
|
|
196
|
+
/**
|
|
197
|
+
* Tear down the shadow on every non-`TaskAuthorized` terminal (reject/abort,
|
|
198
|
+
* each Halted reason, parser-empty, session-end, crash). Leaves the real tree
|
|
199
|
+
* byte-identical to its pre-task state (a discard never touched it).
|
|
200
|
+
*
|
|
201
|
+
* git-worktree → `git worktree remove --force` (+ `git worktree prune`),
|
|
202
|
+
* NEVER raw `rm -rf` (leaks `.git/worktrees/`, #GC-2). Non-git copy → `rm -rf`
|
|
203
|
+
* (the symlinked `node_modules` is unlinked, never follow-delete).
|
|
204
|
+
*
|
|
205
|
+
* Before teardown, terminate task-spawned children rooted in the shadow; if
|
|
206
|
+
* removal still fails (stray watcher), the durable marker is left in place so
|
|
207
|
+
* the next-startup GC retries (#GC-2 lazy cleanup).
|
|
208
|
+
*
|
|
209
|
+
* `preserveStateDir` (the ORPHAN-teardown mode, restart-race fix 2026-06-11):
|
|
210
|
+
* tear down ONLY this instance's uuid-suffixed `shadowDir` and NEVER the
|
|
211
|
+
* per-task SHARED `stateDir`. A restart reuses the SAME taskId, so a fresh
|
|
212
|
+
* shadow B's durable `pending` marker lives in the same `stateDir`; tearing
|
|
213
|
+
* down the orphaned old instance A with a full `discard()` would `fs.rm` that
|
|
214
|
+
* SHARED dir and delete B's authorized-but-pending #PR-4 marker (B becomes
|
|
215
|
+
* unrecoverable after a crash — a sealed-LOCK violation). The orphan branch in
|
|
216
|
+
* QuorumLoop.discardShadow passes `{ preserveStateDir: true }` because the
|
|
217
|
+
* shared `stateDir` belongs to the LIVE mapped shadow B, not the orphan.
|
|
218
|
+
*/
|
|
219
|
+
discard(opts?: {
|
|
220
|
+
preserveStateDir?: boolean;
|
|
221
|
+
}): Promise<void>;
|
|
222
|
+
/**
|
|
223
|
+
* Orphan-teardown shorthand (restart-race fix 2026-06-11): tear down ONLY this
|
|
224
|
+
* instance's `shadowDir` (worktree-aware per #GC-2) and PRESERVE the SHARED
|
|
225
|
+
* per-task `stateDir` — used by `QuorumLoop.discardShadow`'s instance-mismatch
|
|
226
|
+
* branch when a newer shadow (same taskId) has replaced this one in the map.
|
|
227
|
+
*/
|
|
228
|
+
discardOrphan(): Promise<void>;
|
|
229
|
+
private removeGitWorktree;
|
|
230
|
+
private writeStateMarker;
|
|
231
|
+
private readStateMarker;
|
|
232
|
+
/**
|
|
233
|
+
* Read the durable promote-state marker WITHOUT mutating the tree (#PR-4). The
|
|
234
|
+
* QuorumLoop checks this BEFORE `captureDiff` so a re-delivered TaskAuthorized
|
|
235
|
+
* packet (the promote already landed) short-circuits to a silent no-op without
|
|
236
|
+
* a wasteful diff re-capture + without re-emitting the `promoting`/`promoted`
|
|
237
|
+
* progress + the "Applied N files" milestone. `null` = no marker (a fresh /
|
|
238
|
+
* torn-down shadow) → caller treats it as not-yet-promoted (the promote()
|
|
239
|
+
* idempotency guard is still the authority).
|
|
240
|
+
*/
|
|
241
|
+
readPromoteState(): Promise<ShadowPromoteState | null>;
|
|
242
|
+
/**
|
|
243
|
+
* Reconstruct a `WorkspaceShadow` from a durable marker (a crash lost the
|
|
244
|
+
* in-memory tracked set + pre-task hashes). The tracked set is re-derived
|
|
245
|
+
* from the live shadow + real tree; promote then re-captures the diff. Used
|
|
246
|
+
* ONLY by the recovery/GC paths (`reopenShadow` / `reapOrphanShadows`).
|
|
247
|
+
*/
|
|
248
|
+
static fromRecovered(recovered: RecoveredShadow, env?: ShadowEnv): Promise<WorkspaceShadow>;
|
|
249
|
+
}
|
|
250
|
+
/** A recovered shadow state (read from the durable per-task marker). */
|
|
251
|
+
export interface RecoveredShadow {
|
|
252
|
+
taskId: string;
|
|
253
|
+
shadowDir: string;
|
|
254
|
+
workingDir: string;
|
|
255
|
+
isGit: boolean;
|
|
256
|
+
promoteState: ShadowPromoteState;
|
|
257
|
+
createdAtMs: number;
|
|
258
|
+
/** The durable state dir for this task (for cleanup). */
|
|
259
|
+
stateDir: string;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Read every durable per-task shadow marker under the state root. The reconnect/
|
|
263
|
+
* startup recovery (#PR-4) reads these to find an authorized-but-pending shadow
|
|
264
|
+
* to promote; the GC reaper (#GC-1) reads them to delete orphaned shadows.
|
|
265
|
+
*/
|
|
266
|
+
export declare function listRecoverableShadows(env?: ShadowEnv): Promise<RecoveredShadow[]>;
|
|
267
|
+
/**
|
|
268
|
+
* Reconstruct a `WorkspaceShadow` from a durable marker so the recovery path
|
|
269
|
+
* can re-run promote/discard against an already-created shadow. The tracked set
|
|
270
|
+
* + pre-task hashes are re-derived from the live shadow vs the real tree (a
|
|
271
|
+
* crash lost the in-memory state). For a git worktree this is `git status`; for
|
|
272
|
+
* a copy shadow it is a tree-compare. The promote then re-captures the diff.
|
|
273
|
+
*/
|
|
274
|
+
export declare function reopenShadow(recovered: RecoveredShadow, env?: ShadowEnv): Promise<WorkspaceShadow | null>;
|
|
275
|
+
/**
|
|
276
|
+
* GC orphaned shadows (#GC-1): on session-start/WS-resync, discard any shadow
|
|
277
|
+
* whose task is NOT in `activeTaskIds` AND whose promote-state is NOT `promoted`
|
|
278
|
+
* pending an authorized-but-not-yet-promoted recovery, PLUS a TTL on shadow age.
|
|
279
|
+
* NEVER deletes an authorized-but-pending shadow (that is the recovery path's job).
|
|
280
|
+
*
|
|
281
|
+
* `keepTaskIds` are the tasks the desktop still considers active/recoverable
|
|
282
|
+
* (the caller passes the active task id + any authorized-but-pending tasks it
|
|
283
|
+
* intends to recover). A `promoted` shadow whose code already landed is GC'd
|
|
284
|
+
* (its real tree is done) regardless of TTL.
|
|
285
|
+
*/
|
|
286
|
+
export declare function reapOrphanShadows(keepTaskIds: ReadonlySet<string>, env?: ShadowEnv): Promise<{
|
|
287
|
+
reaped: string[];
|
|
288
|
+
retained: string[];
|
|
289
|
+
}>;
|
|
290
|
+
export {};
|