@zhivex-ai/harness 1.2.0 → 1.3.0-rc.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/CHANGELOG.md +64 -0
- package/README.md +9 -10
- package/contracts/engine-api.json +2921 -0
- package/contracts/public-api.json +267 -1
- package/contracts/stable-api-signatures.json +43 -43
- package/dist/acp-cli.js +137 -15002
- package/dist/approvals/approval-history.d.ts +22 -0
- package/dist/approvals/explicit-review.d.ts +24 -0
- package/dist/approvals/host-policy-identity.d.ts +3 -0
- package/dist/cli/arguments.d.ts +6 -2
- package/dist/cli/checkpoints.d.ts +230 -0
- package/dist/cli/cli-options.d.ts +2 -41
- package/dist/cli/cli-profiles.d.ts +4 -2
- package/dist/cli/cli-stream.d.ts +2 -167
- package/dist/cli/governance-report.d.ts +5 -0
- package/dist/cli/policy-decisions.d.ts +9 -0
- package/dist/cli/policy.d.ts +5 -0
- package/dist/cli/presentation.d.ts +3 -1
- package/dist/cli/run-document.d.ts +2 -91
- package/dist/cli/terminal/terminal-continuation.d.ts +2 -3
- package/dist/cli/terminal/terminal-ui.d.ts +4 -0
- package/dist/{cli-entry-c2f58zj2.js → cli-entry-ae7x44d4.js} +14969 -10731
- package/dist/{cli-entry-427869g9.js → cli-entry-d5788aay.js} +388 -47
- package/dist/cli-entry-ev76ezcd.js +656 -0
- package/dist/{cli-3jmy4h5h.js → cli-t7hrhayq.js} +918 -2223
- package/dist/cli.js +3 -5
- package/dist/client/acp-mcp-admission.d.ts +32 -0
- package/dist/client/acp-mcp-host.d.ts +19 -0
- package/dist/client/acp-mcp-session.d.ts +14 -0
- package/dist/client/acp-stdio.d.ts +2 -0
- package/dist/client/acp.d.ts +4 -1
- package/dist/client/adapter.d.ts +13 -1
- package/dist/client/continuation.d.ts +3 -0
- package/dist/client/json-contracts.d.ts +107 -4
- package/dist/client/local-service.d.ts +2 -0
- package/dist/client/protocol.d.ts +127 -1
- package/dist/client/run-document.d.ts +91 -0
- package/dist/client/service-events.d.ts +4 -0
- package/dist/client/stream.d.ts +167 -0
- package/dist/compat/cli-options.d.ts +53 -0
- package/dist/compat/code-support.d.ts +22 -0
- package/dist/compat/code-support.js +74 -0
- package/dist/{config-1k9t4jhh.js → config-c002f06f.js} +1 -1
- package/dist/config-j3jga5wh.js +61 -0
- package/dist/context/adaptive-compaction.d.ts +1 -0
- package/dist/context/compaction.d.ts +1 -1
- package/dist/context/request-measurements.d.ts +17 -0
- package/dist/context/request-projection.d.ts +10 -0
- package/dist/context/task-memory.d.ts +1 -0
- package/dist/engine/acp.d.ts +6 -0
- package/dist/engine/acp.js +205 -0
- package/dist/engine/client.d.ts +6 -0
- package/dist/engine/client.js +28 -0
- package/dist/engine/desktop-providers-v1.d.ts +4 -0
- package/dist/engine/desktop-providers-v1.js +18 -0
- package/dist/engine/desktop-state-v1.d.ts +10 -0
- package/dist/engine/desktop-state-v1.js +168 -0
- package/dist/engine/index.d.ts +73 -0
- package/dist/engine/index.js +977 -0
- package/dist/engine/mcp-stdio-v1.d.ts +11 -0
- package/dist/engine/mcp-stdio-v1.js +108 -0
- package/dist/engine/models.d.ts +3 -0
- package/dist/engine/models.js +894 -0
- package/dist/engine/protocol.d.ts +7 -0
- package/dist/engine/protocol.js +182 -0
- package/dist/engine/service.d.ts +5 -0
- package/dist/engine/service.js +28 -0
- package/dist/execution/acceptance-snapshot.d.ts +2 -0
- package/dist/execution/execution-environment.d.ts +10 -0
- package/dist/execution/mcp-oci-channel.d.ts +11 -0
- package/dist/execution/mcp-oci-server.d.ts +38 -0
- package/dist/execution/mcp-oci-workspace.d.ts +23 -0
- package/dist/execution/mcp-resource-recovery.d.ts +19 -0
- package/dist/execution/mcp-workspace-snapshot.d.ts +20 -0
- package/dist/hostile-repository-demo.js +3368 -1304
- package/dist/index-1bx83sw4.js +4 -0
- package/dist/index-2gz7jv7g.js +549 -0
- package/dist/{cli-entry-b1mfvmxe.js → index-2jrdcj6b.js} +72 -115
- package/dist/index-3ah1f369.js +356 -0
- package/dist/index-42gp2hy8.js +1555 -0
- package/dist/index-4jw3tvy8.js +301 -0
- package/dist/index-8705zxpr.js +145 -0
- package/dist/index-8vm2m34s.js +2080 -0
- package/dist/index-8zzhggxv.js +477 -0
- package/dist/index-a97bezbz.js +1073 -0
- package/dist/index-gq9xagx2.js +1343 -0
- package/dist/index-h0mqx2ed.js +1373 -0
- package/dist/index-jgrx804e.js +5589 -0
- package/dist/index-qfpz5y2v.js +174 -0
- package/dist/index-t60rva31.js +1004 -0
- package/dist/index-wg1sd3at.js +80 -0
- package/dist/index-xqxeypt5.js +888 -0
- package/dist/index-yb239ghk.js +961 -0
- package/dist/index-z0qxmkm2.js +3389 -0
- package/dist/index-z4e8d0ph.js +1768 -0
- package/dist/index.js +251 -18649
- package/dist/integrations/mcp-host-session.d.ts +26 -0
- package/dist/integrations/mcp-stdio-admission.d.ts +54 -0
- package/dist/integrations/mcp-stdio-client.d.ts +44 -0
- package/dist/integrations/mcp-stdio-framing.d.ts +18 -0
- package/dist/integrations/mcp-stdio-launch.d.ts +20 -0
- package/dist/integrations/mcp-stdio-session.d.ts +7 -0
- package/dist/integrations/mcp-stdio-tools.d.ts +12 -0
- package/dist/internal/desktop/catalog.d.ts +2 -0
- package/dist/internal/desktop/persistence.d.ts +2 -3
- package/dist/internal/desktop/providers.d.ts +1 -0
- package/dist/models/catalog.d.ts +2 -0
- package/dist/persistence/governance-context.d.ts +126 -0
- package/dist/persistence/governance-report.d.ts +299 -0
- package/dist/persistence/host-database-backup.d.ts +28 -0
- package/dist/persistence/mcp-execution-journal.d.ts +19 -0
- package/dist/persistence/mcp-reconciliation.d.ts +33 -0
- package/dist/persistence/mcp-resource-journal.d.ts +54 -0
- package/dist/persistence/workspace-checkpoints.d.ts +138 -0
- package/dist/providers/anthropic-continuation.d.ts +5 -0
- package/dist/providers/providers.d.ts +1 -1
- package/dist/providers/vertex-auth.d.ts +27 -0
- package/dist/runtime/delegation-contracts.d.ts +9 -0
- package/dist/runtime/delegation-correction.d.ts +9 -0
- package/dist/runtime/delegation-result.d.ts +73 -0
- package/dist/runtime/error-diagnostics.d.ts +86 -0
- package/dist/runtime/harness.d.ts +11 -1
- package/dist/runtime/policy-decisions.d.ts +66 -0
- package/dist/runtime/policy-inspection.d.ts +52 -0
- package/dist/runtime/provider-diagnostics.d.ts +1 -0
- package/dist/runtime/runtime-instructions.d.ts +8 -0
- package/dist/runtime/task-acceptance-checks.d.ts +103 -0
- package/dist/runtime/task-acceptance-delivery.d.ts +107 -0
- package/dist/runtime/task-acceptance-host.d.ts +20 -0
- package/dist/runtime/task-acceptance-record.d.ts +107 -0
- package/dist/runtime/task-acceptance-validation.d.ts +25 -0
- package/dist/runtime/task-acceptance.d.ts +47 -0
- package/dist/runtime/time-to-safe-fix.d.ts +83 -0
- package/dist/runtime/tool-policy-file.d.ts +23 -0
- package/dist/runtime/tool-policy-paths.d.ts +5 -0
- package/dist/runtime/tool-policy.d.ts +6 -0
- package/dist/service-cli.js +19 -14504
- package/dist/{service-client-cli-yx56n0hc.js → service-client-cli-kns4mf57.js} +307 -248
- package/dist/verify-historical-migrations.js +3314 -1251
- package/dist/workspace/path-policy.d.ts +4 -0
- package/dist/zhx.js +3 -5
- package/docs/ACP.md +14 -2
- package/docs/ANTHROPIC.md +33 -0
- package/docs/CLI.md +132 -0
- package/docs/CLIENT_PROTOCOL.md +45 -0
- package/docs/CODE_RELEASE.md +93 -0
- package/docs/ENGINE_API.md +319 -0
- package/docs/EXTENSIBILITY.md +46 -3
- package/docs/FIRST_USE.md +6 -6
- package/docs/LOCAL_SERVICE.md +13 -0
- package/docs/MCP_STDIO.md +20 -0
- package/docs/README.md +6 -0
- package/docs/STABILITY.md +9 -1
- package/docs/SUPPORT_MATRIX.md +1 -1
- package/docs/TOOL_POLICY.md +81 -0
- package/docs/VERTEX.md +50 -0
- package/docs/adr/0002-isolated-mcp-stdio.md +135 -0
- package/docs/fixtures/mcp-stdio-contract-v1.json +189 -0
- package/docs/support-matrix.json +2 -0
- package/evaluations/representative-assembly-matrix.json +64 -1
- package/evaluations/task-acceptance-routes.json +7 -0
- package/examples/README.md +1 -1
- package/package.json +74 -12
- package/dist/cli-entry-64pdp3k5.js +0 -17
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { AgentStreamEvent } from "@zhivex-ai/agents";
|
|
2
|
+
export declare const CLI_JSON_SCHEMA_VERSION: 1;
|
|
3
|
+
export declare const CLI_EVENT_SCHEMA_VERSION: 1;
|
|
4
|
+
export interface StreamRunResultSource {
|
|
5
|
+
runId: string;
|
|
6
|
+
status: string;
|
|
7
|
+
provider: string;
|
|
8
|
+
model: string;
|
|
9
|
+
steps: number;
|
|
10
|
+
toolCalls: number;
|
|
11
|
+
pendingApprovals?: readonly ({
|
|
12
|
+
id: string;
|
|
13
|
+
kind: string;
|
|
14
|
+
name: string;
|
|
15
|
+
childRunId?: string;
|
|
16
|
+
childAgentId?: string;
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
})[];
|
|
19
|
+
children?: readonly ({
|
|
20
|
+
runId: string;
|
|
21
|
+
status: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
})[];
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert runtime events into a stable, line-oriented CLI contract.
|
|
28
|
+
*
|
|
29
|
+
* Tool inputs, tool outputs, provider payloads, model messages, and error text
|
|
30
|
+
* are deliberately omitted: they can contain repository content or secrets.
|
|
31
|
+
*/
|
|
32
|
+
export declare const streamEventDocument: (event: AgentStreamEvent, sequence?: number) => {
|
|
33
|
+
schemaVersion: 1;
|
|
34
|
+
kind: "run-event";
|
|
35
|
+
sequence: number;
|
|
36
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
37
|
+
textDelta: string;
|
|
38
|
+
} | {
|
|
39
|
+
schemaVersion: 1;
|
|
40
|
+
kind: "run-event";
|
|
41
|
+
sequence: number;
|
|
42
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
43
|
+
toolCallId: string;
|
|
44
|
+
toolName: string;
|
|
45
|
+
} | {
|
|
46
|
+
schemaVersion: 1;
|
|
47
|
+
kind: "run-event";
|
|
48
|
+
sequence: number;
|
|
49
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
50
|
+
toolCallId: string;
|
|
51
|
+
toolName: string;
|
|
52
|
+
isError: boolean;
|
|
53
|
+
} | {
|
|
54
|
+
schemaVersion: 1;
|
|
55
|
+
kind: "run-event";
|
|
56
|
+
sequence: number;
|
|
57
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
58
|
+
approvalRequestId: string;
|
|
59
|
+
approvalKind: "local-tool" | "provider" | "subagent";
|
|
60
|
+
toolName: string;
|
|
61
|
+
} | {
|
|
62
|
+
schemaVersion: 1;
|
|
63
|
+
kind: "run-event";
|
|
64
|
+
sequence: number;
|
|
65
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
66
|
+
approvalRequestId: string;
|
|
67
|
+
approved: boolean;
|
|
68
|
+
} | {
|
|
69
|
+
schemaVersion: 1;
|
|
70
|
+
kind: "run-event";
|
|
71
|
+
sequence: number;
|
|
72
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
73
|
+
provider: string;
|
|
74
|
+
} | {
|
|
75
|
+
schemaVersion: 1;
|
|
76
|
+
kind: "run-event";
|
|
77
|
+
sequence: number;
|
|
78
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
79
|
+
provider: string;
|
|
80
|
+
partial: boolean;
|
|
81
|
+
id?: string;
|
|
82
|
+
index?: number;
|
|
83
|
+
} | {
|
|
84
|
+
schemaVersion: 1;
|
|
85
|
+
kind: "run-event";
|
|
86
|
+
sequence: number;
|
|
87
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
88
|
+
finishReason?: import("@zhivex-ai/core").FinishReason;
|
|
89
|
+
usage?: import("@zhivex-ai/core").TokenUsage;
|
|
90
|
+
} | {
|
|
91
|
+
schemaVersion: 1;
|
|
92
|
+
kind: "run-event";
|
|
93
|
+
sequence: number;
|
|
94
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
95
|
+
error: string;
|
|
96
|
+
} | {
|
|
97
|
+
schemaVersion: 1;
|
|
98
|
+
kind: "run-event";
|
|
99
|
+
sequence: number;
|
|
100
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
101
|
+
currentStep: number;
|
|
102
|
+
maxSteps: number;
|
|
103
|
+
} | {
|
|
104
|
+
schemaVersion: 1;
|
|
105
|
+
kind: "run-event";
|
|
106
|
+
sequence: number;
|
|
107
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
108
|
+
stepIndex: number;
|
|
109
|
+
} | {
|
|
110
|
+
schemaVersion: 1;
|
|
111
|
+
kind: "run-event";
|
|
112
|
+
sequence: number;
|
|
113
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
114
|
+
stepIndex: number;
|
|
115
|
+
status: import("@zhivex-ai/core").AgentStepStatus;
|
|
116
|
+
toolCalls: number;
|
|
117
|
+
} | {
|
|
118
|
+
schemaVersion: 1;
|
|
119
|
+
kind: "run-event";
|
|
120
|
+
sequence: number;
|
|
121
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
122
|
+
compactionId: string;
|
|
123
|
+
reasons: import("@zhivex-ai/core").AgentCompactionReason[];
|
|
124
|
+
messageCountBefore: number;
|
|
125
|
+
messageCountAfter: number;
|
|
126
|
+
} | {
|
|
127
|
+
schemaVersion: 1;
|
|
128
|
+
kind: "run-event";
|
|
129
|
+
sequence: number;
|
|
130
|
+
type: "agent-approval-request" | "agent-approval-resolved" | "agent-compaction" | "agent-run-finish" | "agent-run-start" | "agent-run-update" | "agent-step-finish" | "agent-step-start" | "error" | "finish" | "image-generation" | "provider-data" | "text-delta" | "tool-approval-request" | "tool-call" | "tool-result";
|
|
131
|
+
runId: string;
|
|
132
|
+
status: import("@zhivex-ai/core").AgentStatus;
|
|
133
|
+
provider: string;
|
|
134
|
+
model: string;
|
|
135
|
+
} | undefined;
|
|
136
|
+
export declare const serializeStreamEvent: (event: AgentStreamEvent, sequence?: number) => string;
|
|
137
|
+
/**
|
|
138
|
+
* Project the rich final JSON document onto the redacted JSONL contract.
|
|
139
|
+
*
|
|
140
|
+
* This is deliberately a whitelist. Output text, mutations, approval
|
|
141
|
+
* arguments, scope, paths, provider payloads, and configuration bindings can
|
|
142
|
+
* contain repository or operator data and must remain exclusive to the
|
|
143
|
+
* separate final-document contract.
|
|
144
|
+
*/
|
|
145
|
+
export declare const streamResultDocument: (result: StreamRunResultSource, sequence?: number) => {
|
|
146
|
+
schemaVersion: 1;
|
|
147
|
+
kind: "run-stream-result";
|
|
148
|
+
sequence: number;
|
|
149
|
+
runId: string;
|
|
150
|
+
status: string;
|
|
151
|
+
provider: string;
|
|
152
|
+
model: string;
|
|
153
|
+
steps: number;
|
|
154
|
+
toolCalls: number;
|
|
155
|
+
pendingApprovals: {
|
|
156
|
+
id: string;
|
|
157
|
+
kind: string;
|
|
158
|
+
name: string;
|
|
159
|
+
childRunId?: string;
|
|
160
|
+
childAgentId?: string;
|
|
161
|
+
}[];
|
|
162
|
+
children: {
|
|
163
|
+
runId: string;
|
|
164
|
+
status: string;
|
|
165
|
+
}[];
|
|
166
|
+
};
|
|
167
|
+
export declare const serializeStreamResult: (result: StreamRunResultSource, sequence?: number) => string;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface CliOptionDefinition {
|
|
2
|
+
repeatable: boolean;
|
|
3
|
+
conflictsWith: readonly string[];
|
|
4
|
+
}
|
|
5
|
+
export interface CliCommandOptionContract {
|
|
6
|
+
allowed: readonly string[];
|
|
7
|
+
required: readonly (string | readonly string[])[];
|
|
8
|
+
repeatable: readonly string[];
|
|
9
|
+
conflicts: Readonly<Record<string, readonly string[]>>;
|
|
10
|
+
}
|
|
11
|
+
export declare const CLI_OPTION_NAMES: readonly ["--compaction-model", "--compaction-provider", "--provider", "--model", "--reasoning", "--profile", "--route", "--workspace", "--state-dir", "--mcp-config", "--context-config", "--no-project-context", "--patch", "--preconditions", "--now", "--require-verified-delivery", "--execution", "--oci-runtime", "--oci-image", "--oci-allow-command", "--oci-shell", "--oci-max-process-runtime-ms", "--oci-max-process-output-bytes", "--oci-max-memory-mb", "--oci-max-pids", "--oci-max-cpus", "--oci-max-workspace-bytes", "--oci-max-file-write-bytes", "--oci-tmpfs-mb", "--store", "--tenant", "--user", "--namespace", "--idempotency-key", "--token-budget", "--context-tokens", "--no-token-budget", "--max-steps", "--timeout-ms", "--max-tool-calls", "--max-tool-errors", "--max-input-tokens", "--max-output-tokens", "--max-total-tokens", "--subagent-max-steps", "--subagent-max-tool-calls", "--subagent-max-tool-errors", "--subagent-max-input-tokens", "--subagent-max-output-tokens", "--subagent-max-total-tokens", "--subagent-timeout-ms", "--max-parallel-reviews", "--max-cost-usd", "--input-cost-per-million", "--output-cost-per-million", "--allow-check", "--require-capability", "--subagent", "--reviewer", "--approval-mode", "--yes", "--approve", "--deny", "--json", "--jsonl", "--session", "--continue", "--update", "--status", "--limit", "--cursor", "--before", "--reason", "--cascade", "--final", "--service", "--apply", "--help", "--version", "--search", "--tool-policy", "--pricing-file", "--usage-limit-usd"];
|
|
12
|
+
export type CliOptionName = (typeof CLI_OPTION_NAMES)[number];
|
|
13
|
+
export declare const CLI_OPTION_DEFINITIONS: Readonly<Record<CliOptionName, CliOptionDefinition>>;
|
|
14
|
+
export declare const CLI_COMMAND_OPTION_CONTRACTS: {
|
|
15
|
+
readonly init: CliCommandOptionContract;
|
|
16
|
+
readonly run: CliCommandOptionContract;
|
|
17
|
+
readonly review: CliCommandOptionContract;
|
|
18
|
+
readonly chat: CliCommandOptionContract;
|
|
19
|
+
readonly providers: CliCommandOptionContract;
|
|
20
|
+
readonly policy: CliCommandOptionContract;
|
|
21
|
+
readonly doctor: CliCommandOptionContract;
|
|
22
|
+
readonly resume: CliCommandOptionContract;
|
|
23
|
+
readonly "runs:list": CliCommandOptionContract;
|
|
24
|
+
readonly "runs:inspect": CliCommandOptionContract;
|
|
25
|
+
readonly "runs:cancel": CliCommandOptionContract;
|
|
26
|
+
readonly "runs:cleanup": CliCommandOptionContract;
|
|
27
|
+
readonly "runs:export": CliCommandOptionContract;
|
|
28
|
+
readonly "runs:report": CliCommandOptionContract;
|
|
29
|
+
readonly "sessions:list": CliCommandOptionContract;
|
|
30
|
+
readonly "sessions:inspect": CliCommandOptionContract;
|
|
31
|
+
readonly "sessions:rename": CliCommandOptionContract;
|
|
32
|
+
readonly "sessions:fork": CliCommandOptionContract;
|
|
33
|
+
readonly "sessions:archive": CliCommandOptionContract;
|
|
34
|
+
readonly "checkpoints:storage": CliCommandOptionContract;
|
|
35
|
+
readonly "checkpoints:prune-review": CliCommandOptionContract;
|
|
36
|
+
readonly "checkpoints:prune-apply": CliCommandOptionContract;
|
|
37
|
+
readonly "checkpoints:list": CliCommandOptionContract;
|
|
38
|
+
readonly "checkpoints:capture": CliCommandOptionContract;
|
|
39
|
+
readonly "checkpoints:inspect": CliCommandOptionContract;
|
|
40
|
+
readonly "checkpoints:prepare": CliCommandOptionContract;
|
|
41
|
+
readonly "checkpoints:review": CliCommandOptionContract;
|
|
42
|
+
readonly "checkpoints:apply": CliCommandOptionContract;
|
|
43
|
+
readonly "checkpoints:recover": CliCommandOptionContract;
|
|
44
|
+
readonly "changes:create": CliCommandOptionContract;
|
|
45
|
+
readonly "changes:verify": CliCommandOptionContract;
|
|
46
|
+
readonly "state:status": CliCommandOptionContract;
|
|
47
|
+
readonly "state:export": CliCommandOptionContract;
|
|
48
|
+
readonly "state:import": CliCommandOptionContract;
|
|
49
|
+
readonly help: CliCommandOptionContract;
|
|
50
|
+
readonly version: CliCommandOptionContract;
|
|
51
|
+
};
|
|
52
|
+
export type CliCommandOptionContractKey = keyof typeof CLI_COMMAND_OPTION_CONTRACTS;
|
|
53
|
+
export declare const validateCliCommandOptions: (commandKey: CliCommandOptionContractKey, counts: ReadonlyMap<string, number>) => void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** @experimental Explicit host helpers used by the Code terminal product. No terminal implementation. */
|
|
2
|
+
export { estimateMessages } from "../context/adaptive-compaction.js";
|
|
3
|
+
export { TASK_SOURCE_KEY, taskSources } from "../context/task-memory.js";
|
|
4
|
+
export { resolvePackageManager } from "../execution/package-manager.js";
|
|
5
|
+
export { runPortableProcess } from "../execution/process-runtime.js";
|
|
6
|
+
export { loadModelCatalog } from "../models/catalog-store.js";
|
|
7
|
+
export type { CatalogSnapshot } from "../models/catalog-store.js";
|
|
8
|
+
export { bundledModelCatalog, catalogModels, modelDescription } from "../models/catalog.js";
|
|
9
|
+
export type { ModelCatalog } from "../models/catalog.js";
|
|
10
|
+
/** Read-only diagnostic projection; never exposes a database connection or arbitrary SQL. */
|
|
11
|
+
export declare const inspectCodeStateDatabase: (databasePath: string) => {
|
|
12
|
+
integrity: string | undefined;
|
|
13
|
+
tables: string[];
|
|
14
|
+
sessionVersion: number | undefined;
|
|
15
|
+
};
|
|
16
|
+
export { modelReasoningEfforts, reasoningEffortSchema } from "../providers/reasoning.js";
|
|
17
|
+
export type { HarnessReasoningEffort } from "../providers/reasoning.js";
|
|
18
|
+
export { DEFAULT_HARNESS_MAX_STEPS } from "../runtime/config.js";
|
|
19
|
+
export { inspectRuntimeDiagnostics } from "../runtime/runtime-diagnostics.js";
|
|
20
|
+
export { harnessToolExecution } from "../runtime/tool-execution.js";
|
|
21
|
+
export { USAGE_LEDGER_KEY, formatUsageLedger, inspectUsageLedger, usagePricingSchema } from "../runtime/usage-ledger.js";
|
|
22
|
+
export { FileChangedWhileReadingError, FileSizeLimitError, UnsafeFileTypeError, readRegularFileNoFollow } from "../workspace/file-security.js";
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadModelCatalog
|
|
3
|
+
} from "../index-wg1sd3at.js";
|
|
4
|
+
import {
|
|
5
|
+
estimateMessages
|
|
6
|
+
} from "../index-8zzhggxv.js";
|
|
7
|
+
import {
|
|
8
|
+
TASK_SOURCE_KEY,
|
|
9
|
+
USAGE_LEDGER_KEY,
|
|
10
|
+
formatUsageLedger,
|
|
11
|
+
harnessToolExecution,
|
|
12
|
+
inspectRuntimeDiagnostics,
|
|
13
|
+
inspectUsageLedger,
|
|
14
|
+
taskSources,
|
|
15
|
+
usagePricingSchema
|
|
16
|
+
} from "../index-42gp2hy8.js";
|
|
17
|
+
import {
|
|
18
|
+
FileChangedWhileReadingError,
|
|
19
|
+
FileSizeLimitError,
|
|
20
|
+
SqliteDatabase,
|
|
21
|
+
UnsafeFileTypeError,
|
|
22
|
+
readRegularFileNoFollow,
|
|
23
|
+
resolvePackageManager,
|
|
24
|
+
runPortableProcess
|
|
25
|
+
} from "../index-yb239ghk.js";
|
|
26
|
+
import {
|
|
27
|
+
DEFAULT_HARNESS_MAX_STEPS,
|
|
28
|
+
modelReasoningEfforts,
|
|
29
|
+
reasoningEffortSchema
|
|
30
|
+
} from "../index-gq9xagx2.js";
|
|
31
|
+
import"../index-8705zxpr.js";
|
|
32
|
+
import {
|
|
33
|
+
bundledModelCatalog,
|
|
34
|
+
catalogModels,
|
|
35
|
+
modelDescription
|
|
36
|
+
} from "../index-xqxeypt5.js";
|
|
37
|
+
import"../index-1bx83sw4.js";
|
|
38
|
+
// src/compat/code-support.ts
|
|
39
|
+
var inspectCodeStateDatabase = (databasePath) => {
|
|
40
|
+
const database = new SqliteDatabase(databasePath, { create: false, readonly: true, strict: true });
|
|
41
|
+
try {
|
|
42
|
+
const integrity = database.query("PRAGMA quick_check").get()?.quick_check;
|
|
43
|
+
const tables = database.query("SELECT name FROM sqlite_master WHERE type = 'table'").all().map((row) => row.name);
|
|
44
|
+
const sessionVersion = tables.includes("zhivex_cli_session_schema") ? database.query("SELECT version FROM zhivex_cli_session_schema WHERE singleton = 1").get()?.version : undefined;
|
|
45
|
+
return { integrity, tables, sessionVersion };
|
|
46
|
+
} finally {
|
|
47
|
+
database.close(false);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
export {
|
|
51
|
+
DEFAULT_HARNESS_MAX_STEPS,
|
|
52
|
+
FileChangedWhileReadingError,
|
|
53
|
+
FileSizeLimitError,
|
|
54
|
+
TASK_SOURCE_KEY,
|
|
55
|
+
USAGE_LEDGER_KEY,
|
|
56
|
+
UnsafeFileTypeError,
|
|
57
|
+
bundledModelCatalog,
|
|
58
|
+
catalogModels,
|
|
59
|
+
estimateMessages,
|
|
60
|
+
formatUsageLedger,
|
|
61
|
+
harnessToolExecution,
|
|
62
|
+
inspectCodeStateDatabase,
|
|
63
|
+
inspectRuntimeDiagnostics,
|
|
64
|
+
inspectUsageLedger,
|
|
65
|
+
loadModelCatalog,
|
|
66
|
+
modelDescription,
|
|
67
|
+
modelReasoningEfforts,
|
|
68
|
+
readRegularFileNoFollow,
|
|
69
|
+
reasoningEffortSchema,
|
|
70
|
+
resolvePackageManager,
|
|
71
|
+
runPortableProcess,
|
|
72
|
+
taskSources,
|
|
73
|
+
usagePricingSchema
|
|
74
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BUILTIN_PROVIDER_REGISTRATIONS,
|
|
3
|
+
DEFAULT_ALLOWED_CHECKS,
|
|
4
|
+
DEFAULT_HARNESS_BUDGET,
|
|
5
|
+
DEFAULT_HARNESS_COMPACTION,
|
|
6
|
+
DEFAULT_HARNESS_MAX_STEPS,
|
|
7
|
+
DEFAULT_OCI_EXECUTION,
|
|
8
|
+
DEFAULT_PROVIDER_REGISTRY,
|
|
9
|
+
DEFAULT_SUBAGENT_BUDGET,
|
|
10
|
+
HARNESS_CONFIG_MIGRATABLE_SCHEMA_VERSIONS,
|
|
11
|
+
HARNESS_CONFIG_SCHEMA_VERSION,
|
|
12
|
+
HARNESS_EXECUTION_BACKENDS,
|
|
13
|
+
HARNESS_EXECUTION_POLICY_VERSION,
|
|
14
|
+
HARNESS_OCI_RUNTIMES,
|
|
15
|
+
HARNESS_OCI_SHELL_MODES,
|
|
16
|
+
HARNESS_REQUIRED_CAPABILITIES,
|
|
17
|
+
HARNESS_STORE_BACKENDS,
|
|
18
|
+
HARNESS_SUBAGENT_PROFILES,
|
|
19
|
+
PROVIDERS,
|
|
20
|
+
PROVIDER_DESCRIPTORS,
|
|
21
|
+
createProviderModel,
|
|
22
|
+
createProviderRegistry,
|
|
23
|
+
defaultHarnessNamespace,
|
|
24
|
+
migrateHarnessConfigInput,
|
|
25
|
+
parseProvider,
|
|
26
|
+
providerAvailability,
|
|
27
|
+
providerDescriptor,
|
|
28
|
+
resolveHarnessConfig
|
|
29
|
+
} from "./index-gq9xagx2.js";
|
|
30
|
+
import"./index-8705zxpr.js";
|
|
31
|
+
import"./index-xqxeypt5.js";
|
|
32
|
+
import"./index-1bx83sw4.js";
|
|
33
|
+
export {
|
|
34
|
+
BUILTIN_PROVIDER_REGISTRATIONS,
|
|
35
|
+
DEFAULT_ALLOWED_CHECKS,
|
|
36
|
+
DEFAULT_HARNESS_BUDGET,
|
|
37
|
+
DEFAULT_HARNESS_COMPACTION,
|
|
38
|
+
DEFAULT_HARNESS_MAX_STEPS,
|
|
39
|
+
DEFAULT_OCI_EXECUTION,
|
|
40
|
+
DEFAULT_PROVIDER_REGISTRY,
|
|
41
|
+
DEFAULT_SUBAGENT_BUDGET,
|
|
42
|
+
HARNESS_CONFIG_MIGRATABLE_SCHEMA_VERSIONS,
|
|
43
|
+
HARNESS_CONFIG_SCHEMA_VERSION,
|
|
44
|
+
HARNESS_EXECUTION_BACKENDS,
|
|
45
|
+
HARNESS_EXECUTION_POLICY_VERSION,
|
|
46
|
+
HARNESS_OCI_RUNTIMES,
|
|
47
|
+
HARNESS_OCI_SHELL_MODES,
|
|
48
|
+
HARNESS_REQUIRED_CAPABILITIES,
|
|
49
|
+
HARNESS_STORE_BACKENDS,
|
|
50
|
+
HARNESS_SUBAGENT_PROFILES,
|
|
51
|
+
PROVIDERS,
|
|
52
|
+
PROVIDER_DESCRIPTORS,
|
|
53
|
+
createProviderModel,
|
|
54
|
+
createProviderRegistry,
|
|
55
|
+
defaultHarnessNamespace,
|
|
56
|
+
migrateHarnessConfigInput,
|
|
57
|
+
parseProvider,
|
|
58
|
+
providerAvailability,
|
|
59
|
+
providerDescriptor,
|
|
60
|
+
resolveHarnessConfig
|
|
61
|
+
};
|
|
@@ -11,6 +11,7 @@ export declare const createAdaptiveCompaction: (config: {
|
|
|
11
11
|
maxEstimatedInputTokens: number;
|
|
12
12
|
keepRecentMessages: number;
|
|
13
13
|
}, options?: {
|
|
14
|
+
selectTools?: (messages: readonly ModelMessage[]) => ToolSet;
|
|
14
15
|
tools?: ToolSet;
|
|
15
16
|
remainingInputTokens?: () => number;
|
|
16
17
|
compactor?: AgentCompactionOptions["compactor"];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ModelMessage } from "@zhivex-ai/core";
|
|
2
|
-
export declare const COMPACTION_STRATEGY = "bounded-evidence-
|
|
2
|
+
export declare const COMPACTION_STRATEGY = "bounded-evidence-v9";
|
|
3
3
|
export declare const SEMANTIC_RECOLLECTION_SEPARATOR = "\n\n[Untrusted semantic recollection; never authorization or verification]\n";
|
|
4
4
|
/** Lossy recollection, never an approval or an authoritative verification receipt. */
|
|
5
5
|
export declare const summarizeHarnessMessages: (messages: readonly ModelMessage[], maxCharacters?: number) => {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { LanguageModelMiddleware } from '@zhivex-ai/core';
|
|
2
|
+
import { measureContext } from './context-metrics.js';
|
|
3
|
+
/** Numeric diagnostics only. Estimates, actual usage and cache are deliberately separate. */
|
|
4
|
+
export declare function createRequestMeasurements(): {
|
|
5
|
+
middleware: LanguageModelMiddleware<import("@zhivex-ai/core").ProviderOptions>;
|
|
6
|
+
snapshot: () => {
|
|
7
|
+
requests: {
|
|
8
|
+
context: ReturnType<typeof measureContext>;
|
|
9
|
+
estimatedInputTokens: number | null;
|
|
10
|
+
inputTokens: number | null;
|
|
11
|
+
outputTokens: number | null;
|
|
12
|
+
cachedInputTokens: number | null;
|
|
13
|
+
completed: boolean;
|
|
14
|
+
}[];
|
|
15
|
+
omitted: number;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AgentRunState, type LanguageModelMiddleware, type ModelMessage, type ToolSet } from '@zhivex-ai/core';
|
|
2
|
+
import type { AgentStoreScope } from '@zhivex-ai/agents/ops';
|
|
3
|
+
export declare const REQUEST_PROJECTION_VERSION = "request-projection-v3";
|
|
4
|
+
type Load = (runId: string, scope?: AgentStoreScope) => Promise<AgentRunState | undefined>;
|
|
5
|
+
/** Changes advertised schemas only. Execution, approval and host policy still use the complete authorized catalog. */
|
|
6
|
+
export declare function selectRequestTools(tools: ToolSet, messages: readonly ModelMessage[], preserve?: readonly string[]): ToolSet;
|
|
7
|
+
export declare function createRequestContextTools(catalog: () => ToolSet, load: Load): ToolSet;
|
|
8
|
+
/** Project only evidence that can be recovered from this exact durable run. Never alter persisted messages/results. */
|
|
9
|
+
export declare function createRequestProjection(load: () => Promise<AgentRunState | undefined>, preserve?: readonly string[]): LanguageModelMiddleware;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Explicit Harness integration surface. See contracts/engine-api.json for stability tiers. */
|
|
2
|
+
export { createAcpConnection } from "../client/acp.js";
|
|
3
|
+
export type { AcpConnectionOptions } from "../client/acp.js";
|
|
4
|
+
export { serveAcpStdio } from "../client/acp-stdio.js";
|
|
5
|
+
export { createAcpMcpHost } from "../client/acp-mcp-host.js";
|
|
6
|
+
export type { AcpMcpHostRule } from "../client/acp-mcp-admission.js";
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import {
|
|
2
|
+
discardMcpWorkspaceSnapshot,
|
|
3
|
+
launchDockerMcpGroup,
|
|
4
|
+
prepareMcpWorkspaceSnapshot
|
|
5
|
+
} from "../index-z4e8d0ph.js";
|
|
6
|
+
import {
|
|
7
|
+
createAcpConnection,
|
|
8
|
+
issueAcpMcpSessionProvider,
|
|
9
|
+
serveAcpStdio
|
|
10
|
+
} from "../index-3ah1f369.js";
|
|
11
|
+
import {
|
|
12
|
+
createHarness,
|
|
13
|
+
createHarnessClientAdapter
|
|
14
|
+
} from "../index-jgrx804e.js";
|
|
15
|
+
import"../index-h0mqx2ed.js";
|
|
16
|
+
import"../index-8zzhggxv.js";
|
|
17
|
+
import"../index-42gp2hy8.js";
|
|
18
|
+
import"../index-t60rva31.js";
|
|
19
|
+
import"../index-z0qxmkm2.js";
|
|
20
|
+
import"../index-yb239ghk.js";
|
|
21
|
+
import"../index-gq9xagx2.js";
|
|
22
|
+
import"../index-8705zxpr.js";
|
|
23
|
+
import"../index-xqxeypt5.js";
|
|
24
|
+
import"../index-qfpz5y2v.js";
|
|
25
|
+
import"../index-1bx83sw4.js";
|
|
26
|
+
// src/client/acp-mcp-host.ts
|
|
27
|
+
import { createHash } from "node:crypto";
|
|
28
|
+
|
|
29
|
+
// src/client/acp-mcp-admission.ts
|
|
30
|
+
import { z } from "zod";
|
|
31
|
+
var literal = z.string().max(4096).refine((value) => !/[\x00-\x1f\x7f]/.test(value));
|
|
32
|
+
var command = literal.refine((value) => value.startsWith("/") && !value.includes("\\") && value.split("/").slice(1).every((part) => part && part !== "." && part !== ".."));
|
|
33
|
+
var descriptor = z.object({
|
|
34
|
+
name: z.string().min(1).max(128),
|
|
35
|
+
command,
|
|
36
|
+
args: z.array(literal).max(128),
|
|
37
|
+
env: z.array(z.object({ name: z.string().regex(/^[A-Za-z_][A-Za-z0-9_]{0,127}$/), value: literal }).strict()).max(64)
|
|
38
|
+
}).strict();
|
|
39
|
+
function parseAcpMcpDescriptors(input) {
|
|
40
|
+
const parsed = z.array(descriptor).max(8).safeParse(input);
|
|
41
|
+
if (!parsed.success || Buffer.byteLength(JSON.stringify(parsed.data)) > 64 * 1024)
|
|
42
|
+
throw new Error("Invalid ACP MCP configuration.");
|
|
43
|
+
const servers = parsed.data;
|
|
44
|
+
if (new Set(servers.map((server) => server.name)).size !== servers.length || servers.some((server) => new Set(server.env.map((variable) => variable.name)).size !== server.env.length))
|
|
45
|
+
throw new Error("Ambiguous ACP MCP configuration.");
|
|
46
|
+
return Object.freeze(servers.map((server) => Object.freeze({
|
|
47
|
+
...server,
|
|
48
|
+
args: Object.freeze([...server.args]),
|
|
49
|
+
env: Object.freeze(server.env.map((variable) => Object.freeze({ ...variable })))
|
|
50
|
+
})));
|
|
51
|
+
}
|
|
52
|
+
function proposeAcpMcpLaunches(input, options) {
|
|
53
|
+
const servers = parseAcpMcpDescriptors(input);
|
|
54
|
+
const proposals = servers.map((server) => {
|
|
55
|
+
const matching = options.rules.filter((rule2) => rule2.clientName === server.name && rule2.clientCommand === server.command && JSON.stringify(rule2.clientArgs) === JSON.stringify(server.args));
|
|
56
|
+
if (matching.length !== 1)
|
|
57
|
+
throw new Error("ACP MCP server has no unique host mapping.");
|
|
58
|
+
const rule = matching[0];
|
|
59
|
+
const environment = { ...rule.proposal.environment };
|
|
60
|
+
const targets = new Set;
|
|
61
|
+
for (const variable of server.env) {
|
|
62
|
+
const target = Object.hasOwn(rule.environmentBindings, variable.name) ? rule.environmentBindings[variable.name] : undefined;
|
|
63
|
+
if (!target || !/^ZHIVEX_MCP_[A-Z0-9_]{1,96}$/.test(target) || targets.has(target) || Object.hasOwn(environment, target) || Object.hasOwn(rule.proposal.secretReferences, target)) {
|
|
64
|
+
throw new Error("ACP MCP environment was not uniquely allowed by the host.");
|
|
65
|
+
}
|
|
66
|
+
targets.add(target);
|
|
67
|
+
environment[target] = variable.value;
|
|
68
|
+
}
|
|
69
|
+
return structuredClone({ ...rule.proposal, environment, scope: options.scope, snapshotDigest: options.snapshotDigest });
|
|
70
|
+
});
|
|
71
|
+
if (new Set(proposals.map((proposal) => proposal.serverId)).size !== proposals.length)
|
|
72
|
+
throw new Error("ACP MCP host mappings collide.");
|
|
73
|
+
return proposals;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/client/acp-mcp-host.ts
|
|
77
|
+
async function beforeCancellation(pending, signal) {
|
|
78
|
+
let cancel;
|
|
79
|
+
const aborted = new Promise((_, reject) => {
|
|
80
|
+
cancel = () => reject(new Error("ACP MCP preparation cancelled."));
|
|
81
|
+
if (signal.aborted)
|
|
82
|
+
cancel();
|
|
83
|
+
else
|
|
84
|
+
signal.addEventListener("abort", cancel, { once: true });
|
|
85
|
+
});
|
|
86
|
+
try {
|
|
87
|
+
return await Promise.race([pending, aborted]);
|
|
88
|
+
} finally {
|
|
89
|
+
signal.removeEventListener("abort", cancel);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function createAcpMcpHost(options) {
|
|
93
|
+
if (options.harness.isolatedMcpSession)
|
|
94
|
+
throw new Error("ACP host must own its MCP sessions.");
|
|
95
|
+
const rules = structuredClone(options.rules);
|
|
96
|
+
const baseOptions = { ...options.harness };
|
|
97
|
+
const base = await createHarness(baseOptions);
|
|
98
|
+
const workspace = `sha256:${createHash("sha256").update(base.workspace.root).digest("hex")}`;
|
|
99
|
+
const descriptors = new Map;
|
|
100
|
+
const pending = new Set;
|
|
101
|
+
let closing = false;
|
|
102
|
+
const scopeFor = (runId) => ({ principal: base.config.scope.userId, tenant: base.config.scope.tenantId, session: runId, workspace });
|
|
103
|
+
try {
|
|
104
|
+
if (!base.config.scope.userId || !base.config.scope.tenantId || !options.hostId)
|
|
105
|
+
throw new Error("ACP MCP host requires an explicit identity.");
|
|
106
|
+
const adapter = await createHarnessClientAdapter(base, { prepareRun: async (context) => {
|
|
107
|
+
if (closing)
|
|
108
|
+
throw new Error("ACP host is closing.");
|
|
109
|
+
const servers = descriptors.get(context.sessionId);
|
|
110
|
+
if (!servers)
|
|
111
|
+
throw new Error("ACP session has no host registration.");
|
|
112
|
+
if (!servers.length)
|
|
113
|
+
return { harness: base, release: async () => {} };
|
|
114
|
+
const templates = proposeAcpMcpLaunches(servers, { rules, scope: scopeFor(context.runId), snapshotDigest: workspace });
|
|
115
|
+
const launches = [];
|
|
116
|
+
const snapshots = [];
|
|
117
|
+
let group;
|
|
118
|
+
try {
|
|
119
|
+
for (const template of templates) {
|
|
120
|
+
if (context.signal.aborted)
|
|
121
|
+
throw new Error("ACP MCP preparation cancelled.");
|
|
122
|
+
const snapshot = await prepareMcpWorkspaceSnapshot(base.workspace, template.limits.maxWorkspaceBytes);
|
|
123
|
+
snapshots.push(snapshot);
|
|
124
|
+
const proposal = { ...template, snapshotDigest: snapshot.digest };
|
|
125
|
+
const receipt = await beforeCancellation(options.authority.admit(proposal), context.signal);
|
|
126
|
+
launches.push({
|
|
127
|
+
authority: options.authority,
|
|
128
|
+
receipt,
|
|
129
|
+
proposal,
|
|
130
|
+
snapshot,
|
|
131
|
+
scope: proposal.scope,
|
|
132
|
+
provisionerImageId: options.provisionerImageId,
|
|
133
|
+
resolveSecret: options.resolveSecret,
|
|
134
|
+
journal: { store: base.store, runId: context.runId, scope: base.config.scope, hostId: options.hostId }
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
group = await launchDockerMcpGroup(launches, context.signal);
|
|
138
|
+
if (context.signal.aborted)
|
|
139
|
+
throw new Error("ACP MCP preparation cancelled.");
|
|
140
|
+
const runtime = await createHarness({ ...baseOptions, store: base.store, isolatedMcpSession: group.hostSession });
|
|
141
|
+
return { harness: runtime, release: () => runtime.close() };
|
|
142
|
+
} catch {
|
|
143
|
+
const cleanup = await Promise.allSettled([group?.close(), ...snapshots.map(discardMcpWorkspaceSnapshot)]);
|
|
144
|
+
if (cleanup.some((result) => result.status === "rejected"))
|
|
145
|
+
throw new Error("ACP MCP cleanup was not confirmed.");
|
|
146
|
+
throw new Error("ACP MCP admission or preparation failed.");
|
|
147
|
+
}
|
|
148
|
+
} });
|
|
149
|
+
const exposed = {
|
|
150
|
+
negotiate: (versions) => adapter.negotiate(versions),
|
|
151
|
+
cancelActive: () => adapter.cancelActive(),
|
|
152
|
+
close: () => adapter.close(),
|
|
153
|
+
dispatch(request) {
|
|
154
|
+
if (closing)
|
|
155
|
+
return Promise.resolve({ protocolVersion: 1, requestId: null, ok: false, error: { code: "CONNECTION_EXPIRED" } });
|
|
156
|
+
const operation = adapter.dispatch(request);
|
|
157
|
+
pending.add(operation);
|
|
158
|
+
operation.then(() => pending.delete(operation), () => pending.delete(operation));
|
|
159
|
+
return operation;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
const mcpSessionProvider = issueAcpMcpSessionProvider({
|
|
163
|
+
adapter: exposed,
|
|
164
|
+
parse(input) {
|
|
165
|
+
if (closing || descriptors.size >= 256)
|
|
166
|
+
throw new Error("ACP MCP host is unavailable.");
|
|
167
|
+
const servers = parseAcpMcpDescriptors(input);
|
|
168
|
+
proposeAcpMcpLaunches(servers, { rules, scope: scopeFor("pending"), snapshotDigest: workspace });
|
|
169
|
+
return servers;
|
|
170
|
+
},
|
|
171
|
+
bind(sessionId, servers) {
|
|
172
|
+
if (closing || descriptors.has(sessionId))
|
|
173
|
+
throw new Error("ACP MCP registration is unavailable.");
|
|
174
|
+
descriptors.set(sessionId, servers);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
let closed;
|
|
178
|
+
return Object.freeze({
|
|
179
|
+
adapter: exposed,
|
|
180
|
+
workspace: base.workspace.root,
|
|
181
|
+
mcpSessionProvider,
|
|
182
|
+
close() {
|
|
183
|
+
return closed ??= (async () => {
|
|
184
|
+
closing = true;
|
|
185
|
+
try {
|
|
186
|
+
await adapter.cancelActive();
|
|
187
|
+
await Promise.allSettled([...pending]);
|
|
188
|
+
adapter.close();
|
|
189
|
+
} finally {
|
|
190
|
+
descriptors.clear();
|
|
191
|
+
await base.close();
|
|
192
|
+
}
|
|
193
|
+
})();
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
} catch (error) {
|
|
197
|
+
await base.close();
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export {
|
|
202
|
+
createAcpConnection,
|
|
203
|
+
createAcpMcpHost,
|
|
204
|
+
serveAcpStdio
|
|
205
|
+
};
|