@claudexor/cli 3.1.2 → 3.2.0
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/about-command.d.ts.map +1 -1
- package/dist/accounts-projection.d.ts +8 -1
- package/dist/accounts-projection.d.ts.map +1 -1
- package/dist/accounts-projection.js +33 -20
- package/dist/accounts-projection.js.map +1 -1
- package/dist/accounts-services.d.ts +206 -0
- package/dist/accounts-services.d.ts.map +1 -0
- package/dist/accounts-services.js +71 -0
- package/dist/accounts-services.js.map +1 -0
- package/dist/acp-surface-runner.d.ts +39 -0
- package/dist/acp-surface-runner.d.ts.map +1 -1
- package/dist/acp-surface-runner.js +104 -30
- package/dist/acp-surface-runner.js.map +1 -1
- package/dist/attachment-upload.d.ts +5 -0
- package/dist/attachment-upload.d.ts.map +1 -0
- package/dist/attachment-upload.js +64 -0
- package/dist/attachment-upload.js.map +1 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +6 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/choice-input.d.ts +7 -0
- package/dist/choice-input.d.ts.map +1 -0
- package/dist/choice-input.js +17 -0
- package/dist/choice-input.js.map +1 -0
- package/dist/claude-oauth-usage.js.map +1 -1
- package/dist/claudexord-entry.js.map +1 -1
- package/dist/claudexord.d.ts +1 -13
- package/dist/claudexord.d.ts.map +1 -1
- package/dist/claudexord.js +45 -69
- package/dist/claudexord.js.map +1 -1
- package/dist/cli-error.d.ts.map +1 -1
- package/dist/cli-error.js +21 -11
- package/dist/cli-error.js.map +1 -1
- package/dist/cli.js +143 -163
- package/dist/cli.js.map +1 -1
- package/dist/codex-device-login.js.map +1 -1
- package/dist/codex-quota-source.js.map +1 -1
- package/dist/command-flags.d.ts +16 -1
- package/dist/command-flags.d.ts.map +1 -1
- package/dist/command-flags.js +41 -19
- package/dist/command-flags.js.map +1 -1
- package/dist/command-registry.d.ts +21 -8
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +59 -116
- package/dist/command-registry.js.map +1 -1
- package/dist/command-scope.d.ts +13 -0
- package/dist/command-scope.d.ts.map +1 -0
- package/dist/command-scope.js +61 -0
- package/dist/command-scope.js.map +1 -0
- package/dist/control-services.d.ts +1631 -1003
- package/dist/control-services.d.ts.map +1 -1
- package/dist/control-services.js +38 -65
- package/dist/control-services.js.map +1 -1
- package/dist/credential-commands.d.ts.map +1 -1
- package/dist/credential-commands.js +13 -3
- package/dist/credential-commands.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-outcome.d.ts +3 -5
- package/dist/daemon-outcome.d.ts.map +1 -1
- package/dist/daemon-outcome.js +7 -19
- package/dist/daemon-outcome.js.map +1 -1
- package/dist/daemon-run.d.ts +21 -12
- package/dist/daemon-run.d.ts.map +1 -1
- package/dist/daemon-run.js +59 -40
- package/dist/daemon-run.js.map +1 -1
- package/dist/daemon-runtime-shutdown.d.ts +7 -0
- package/dist/daemon-runtime-shutdown.d.ts.map +1 -1
- package/dist/daemon-runtime-shutdown.js +29 -0
- package/dist/daemon-runtime-shutdown.js.map +1 -1
- package/dist/delegation-belt-descriptor.js.map +1 -1
- package/dist/delegation-output.d.ts +2 -0
- package/dist/delegation-output.d.ts.map +1 -1
- package/dist/delegation-output.js +3 -1
- package/dist/delegation-output.js.map +1 -1
- package/dist/harness-command.d.ts +13 -0
- package/dist/harness-command.d.ts.map +1 -0
- package/dist/harness-command.js +35 -0
- package/dist/harness-command.js.map +1 -0
- package/dist/harness-installer.d.ts +79 -0
- package/dist/harness-installer.d.ts.map +1 -0
- package/dist/harness-installer.js +256 -0
- package/dist/harness-installer.js.map +1 -0
- package/dist/interaction-prompt.d.ts +19 -0
- package/dist/interaction-prompt.d.ts.map +1 -0
- package/dist/interaction-prompt.js +114 -0
- package/dist/interaction-prompt.js.map +1 -0
- package/dist/live.d.ts +2 -6
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +88 -75
- package/dist/live.js.map +1 -1
- package/dist/mcp-daemon-unavailable.d.ts +6 -0
- package/dist/mcp-daemon-unavailable.d.ts.map +1 -0
- package/dist/mcp-daemon-unavailable.js +16 -0
- package/dist/mcp-daemon-unavailable.js.map +1 -0
- package/dist/mcp-run-projections.d.ts +29 -0
- package/dist/mcp-run-projections.d.ts.map +1 -1
- package/dist/mcp-run-projections.js +17 -17
- package/dist/mcp-run-projections.js.map +1 -1
- package/dist/mcp-runner.d.ts.map +1 -1
- package/dist/mcp-runner.js +81 -39
- package/dist/mcp-runner.js.map +1 -1
- package/dist/native-login.js.map +1 -1
- package/dist/ops-command-specs.d.ts +64 -0
- package/dist/ops-command-specs.d.ts.map +1 -0
- package/dist/ops-command-specs.js +146 -0
- package/dist/ops-command-specs.js.map +1 -0
- package/dist/ops-commands.d.ts.map +1 -1
- package/dist/ops-commands.js +23 -5
- package/dist/ops-commands.js.map +1 -1
- package/dist/orphan-reaper.js.map +1 -1
- package/dist/output-mode.d.ts +11 -0
- package/dist/output-mode.d.ts.map +1 -0
- package/dist/output-mode.js +28 -0
- package/dist/output-mode.js.map +1 -0
- package/dist/plan-question-loop.d.ts.map +1 -1
- package/dist/plan-question-loop.js +16 -13
- package/dist/plan-question-loop.js.map +1 -1
- package/dist/plugins.js +1 -1
- package/dist/plugins.js.map +1 -1
- package/dist/primary-output.d.ts +9 -4
- package/dist/primary-output.d.ts.map +1 -1
- package/dist/primary-output.js +50 -2
- package/dist/primary-output.js.map +1 -1
- package/dist/quota-subject-universe.d.ts +6 -0
- package/dist/quota-subject-universe.d.ts.map +1 -0
- package/dist/quota-subject-universe.js +31 -0
- package/dist/quota-subject-universe.js.map +1 -0
- package/dist/registry.js.map +1 -1
- package/dist/release-command.d.ts +1 -1
- package/dist/release-command.js +2 -2
- package/dist/remote-command-specs.d.ts +45 -0
- package/dist/remote-command-specs.d.ts.map +1 -0
- package/dist/remote-command-specs.js +29 -0
- package/dist/remote-command-specs.js.map +1 -0
- package/dist/remote-command.d.ts +11 -0
- package/dist/remote-command.d.ts.map +1 -0
- package/dist/remote-command.js +262 -0
- package/dist/remote-command.js.map +1 -0
- package/dist/remote-filesystem.d.ts +33 -0
- package/dist/remote-filesystem.d.ts.map +1 -0
- package/dist/remote-filesystem.js +280 -0
- package/dist/remote-filesystem.js.map +1 -0
- package/dist/repo-asset-authority.js.map +1 -1
- package/dist/request-preflight.d.ts +11 -2
- package/dist/request-preflight.d.ts.map +1 -1
- package/dist/request-preflight.js +36 -13
- package/dist/request-preflight.js.map +1 -1
- package/dist/retry-command-specs.d.ts.map +1 -1
- package/dist/retry-command-specs.js +2 -0
- package/dist/retry-command-specs.js.map +1 -1
- package/dist/run-applicability.d.ts +74 -0
- package/dist/run-applicability.d.ts.map +1 -0
- package/dist/run-applicability.js +72 -0
- package/dist/run-applicability.js.map +1 -0
- package/dist/run-detail-projections.d.ts +23 -0
- package/dist/run-detail-projections.d.ts.map +1 -1
- package/dist/run-detail-projections.js +32 -1
- package/dist/run-detail-projections.js.map +1 -1
- package/dist/run-detail-response.d.ts +7 -0
- package/dist/run-detail-response.d.ts.map +1 -0
- package/dist/run-detail-response.js +23 -0
- package/dist/run-detail-response.js.map +1 -0
- package/dist/run-facts-projection.d.ts +22 -0
- package/dist/run-facts-projection.d.ts.map +1 -0
- package/dist/run-facts-projection.js +86 -0
- package/dist/run-facts-projection.js.map +1 -0
- package/dist/runtime-replacement-stop.d.ts +25 -0
- package/dist/runtime-replacement-stop.d.ts.map +1 -0
- package/dist/runtime-replacement-stop.js +145 -0
- package/dist/runtime-replacement-stop.js.map +1 -0
- package/dist/settings-command.d.ts +1 -0
- package/dist/settings-command.d.ts.map +1 -1
- package/dist/settings-command.js +27 -21
- package/dist/settings-command.js.map +1 -1
- package/dist/settings-service.d.ts +7 -7
- package/dist/settings-service.d.ts.map +1 -1
- package/dist/settings-service.js +3 -3
- package/dist/settings-service.js.map +1 -1
- package/dist/setup-client-pty.d.ts +14 -0
- package/dist/setup-client-pty.d.ts.map +1 -0
- package/dist/setup-client-pty.js +61 -0
- package/dist/setup-client-pty.js.map +1 -0
- package/dist/setup-device-code-disclosure.d.ts +15 -0
- package/dist/setup-device-code-disclosure.d.ts.map +1 -0
- package/dist/setup-device-code-disclosure.js +52 -0
- package/dist/setup-device-code-disclosure.js.map +1 -0
- package/dist/setup-job-reducer.d.ts.map +1 -1
- package/dist/setup-job-reducer.js +1 -0
- package/dist/setup-job-reducer.js.map +1 -1
- package/dist/setup-job-store.d.ts +275 -75
- package/dist/setup-job-store.d.ts.map +1 -1
- package/dist/setup-job-store.js.map +1 -1
- package/dist/setup-job-support.js.map +1 -1
- package/dist/setup-jobs.d.ts +517 -137
- package/dist/setup-jobs.d.ts.map +1 -1
- package/dist/setup-jobs.js +68 -118
- package/dist/setup-jobs.js.map +1 -1
- package/dist/setup-lifecycle-binding.d.ts +7 -0
- package/dist/setup-lifecycle-binding.d.ts.map +1 -1
- package/dist/setup-lifecycle-binding.js +6 -0
- package/dist/setup-lifecycle-binding.js.map +1 -1
- package/dist/setup-login-child-lifecycle.d.ts +13 -0
- package/dist/setup-login-child-lifecycle.d.ts.map +1 -0
- package/dist/setup-login-child-lifecycle.js +45 -0
- package/dist/setup-login-child-lifecycle.js.map +1 -0
- package/dist/setup-login-inline.d.ts +11 -12
- package/dist/setup-login-inline.d.ts.map +1 -1
- package/dist/setup-login-inline.js +26 -15
- package/dist/setup-login-inline.js.map +1 -1
- package/dist/setup-login-permit.d.ts +10 -0
- package/dist/setup-login-permit.d.ts.map +1 -0
- package/dist/setup-login-permit.js +52 -0
- package/dist/setup-login-permit.js.map +1 -0
- package/dist/setup-login-protocol.d.ts.map +1 -1
- package/dist/setup-login-protocol.js +9 -2
- package/dist/setup-login-protocol.js.map +1 -1
- package/dist/setup-login-runner.d.ts +1 -0
- package/dist/setup-login-runner.d.ts.map +1 -1
- package/dist/setup-login-runner.js +20 -31
- package/dist/setup-login-runner.js.map +1 -1
- package/dist/setup-supervisor.d.ts.map +1 -1
- package/dist/setup-supervisor.js.map +1 -1
- package/dist/terminal-run-output.d.ts +12 -0
- package/dist/terminal-run-output.d.ts.map +1 -0
- package/dist/terminal-run-output.js +33 -0
- package/dist/terminal-run-output.js.map +1 -0
- package/dist/thread-execution-workspace.d.ts +15 -0
- package/dist/thread-execution-workspace.d.ts.map +1 -1
- package/dist/thread-execution-workspace.js +39 -5
- package/dist/thread-execution-workspace.js.map +1 -1
- package/dist/thread-turn-services.d.ts +104 -0
- package/dist/thread-turn-services.d.ts.map +1 -0
- package/dist/thread-turn-services.js +27 -0
- package/dist/thread-turn-services.js.map +1 -0
- package/package.json +23 -23
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { closeSync, constants, accessSync, fstatSync, openSync, readSync, readdirSync, realpathSync, statSync, } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { ControlDirectoryListing } from "@claudexor/schema";
|
|
5
|
+
const MAX_DIRECTORY_ENTRIES = 1_000;
|
|
6
|
+
const MAX_PROJECT_FILE_BYTES = 25 * 1024 * 1024;
|
|
7
|
+
// Enough bytes to identify every allowed raster signature (WebP needs 12).
|
|
8
|
+
const IMAGE_HEADER_BYTES = 12;
|
|
9
|
+
const PNG_MAGIC = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
10
|
+
/**
|
|
11
|
+
* QA-067: the project-file endpoint exists for exactly one consumer — the
|
|
12
|
+
* remote markdown image gallery. Content type is identified by magic bytes,
|
|
13
|
+
* never by file name: a file whose leading bytes are not a known raster
|
|
14
|
+
* signature is refused before any further content is read. A matching file's
|
|
15
|
+
* REMAINING bytes are then served verbatim — the sniff authenticates the
|
|
16
|
+
* header only, not the whole container, so a raster-prefixed polyglot (PNG
|
|
17
|
+
* magic + arbitrary tail) is served in full. Accepted risk: writing such a
|
|
18
|
+
* file into a registered project already requires owning the remote user.
|
|
19
|
+
* SVG is deliberately excluded: it is a scripting-capable text format, not a
|
|
20
|
+
* raster image.
|
|
21
|
+
*/
|
|
22
|
+
function sniffRasterImage(header) {
|
|
23
|
+
if (header.length >= 8 && header.subarray(0, 8).equals(PNG_MAGIC))
|
|
24
|
+
return "image/png";
|
|
25
|
+
if (header.length >= 3 && header[0] === 0xff && header[1] === 0xd8 && header[2] === 0xff) {
|
|
26
|
+
return "image/jpeg";
|
|
27
|
+
}
|
|
28
|
+
if (header.length >= 6) {
|
|
29
|
+
const gif = header.subarray(0, 6).toString("latin1");
|
|
30
|
+
if (gif === "GIF87a" || gif === "GIF89a")
|
|
31
|
+
return "image/gif";
|
|
32
|
+
}
|
|
33
|
+
if (header.length >= 12 &&
|
|
34
|
+
header.subarray(0, 4).toString("latin1") === "RIFF" &&
|
|
35
|
+
header.subarray(8, 12).toString("latin1") === "WEBP") {
|
|
36
|
+
return "image/webp";
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* QA-067: hidden trees under HOME (`~/.ssh`, `~/.gnupg`, `~/.aws`, harness
|
|
42
|
+
* homes, …) are where credentials and secret-bearing names live, and no
|
|
43
|
+
* legitimate remote project root lives inside one — so the picker neither
|
|
44
|
+
* lists a hidden directory nor lists INTO one.
|
|
45
|
+
*/
|
|
46
|
+
function hiddenUnderHome(home, canonical) {
|
|
47
|
+
const rel = relative(home, canonical);
|
|
48
|
+
if (rel === "")
|
|
49
|
+
return false;
|
|
50
|
+
return rel.split(sep).some((segment) => segment.startsWith("."));
|
|
51
|
+
}
|
|
52
|
+
function contained(root, candidate) {
|
|
53
|
+
const rel = relative(root, candidate);
|
|
54
|
+
return rel === "" || (!rel.startsWith(`..${sep}`) && rel !== ".." && !isAbsolute(rel));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* QA-067: a refusal must not be an existence oracle. The listing deliberately
|
|
58
|
+
* hides hidden trees and everything outside HOME, so the four refusal causes
|
|
59
|
+
* — absent, outside home, not a directory, hidden — must be indistinguishable
|
|
60
|
+
* by status, code, and message: one typed refusal with constant text that
|
|
61
|
+
* never echoes the requested path. Distinct responses here would confirm
|
|
62
|
+
* guessed secret-bearing names the listing never discloses.
|
|
63
|
+
*/
|
|
64
|
+
function refuseDirectoryListing() {
|
|
65
|
+
throw Object.assign(new Error("directory is not listable"), {
|
|
66
|
+
status: 404,
|
|
67
|
+
code: "directory_not_listable",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function canonicalDirectory(path, root) {
|
|
71
|
+
// Shape-only validation (no filesystem state involved) may stay specific.
|
|
72
|
+
if (!isAbsolute(path)) {
|
|
73
|
+
throw Object.assign(new Error("directory path must be absolute"), { status: 400 });
|
|
74
|
+
}
|
|
75
|
+
let canonical;
|
|
76
|
+
try {
|
|
77
|
+
canonical = realpathSync(path);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
refuseDirectoryListing();
|
|
81
|
+
}
|
|
82
|
+
if (!contained(root, canonical))
|
|
83
|
+
refuseDirectoryListing();
|
|
84
|
+
if (!statSync(canonical).isDirectory())
|
|
85
|
+
refuseDirectoryListing();
|
|
86
|
+
if (hiddenUnderHome(root, canonical))
|
|
87
|
+
refuseDirectoryListing();
|
|
88
|
+
return canonical;
|
|
89
|
+
}
|
|
90
|
+
export function listRemoteDirectory(requestedPath, homePath = homedir()) {
|
|
91
|
+
const home = realpathSync(homePath);
|
|
92
|
+
const path = canonicalDirectory(requestedPath || home, home);
|
|
93
|
+
const candidates = [];
|
|
94
|
+
for (const name of readdirSync(path)) {
|
|
95
|
+
// QA-067: project selection needs visible directories only — file names
|
|
96
|
+
// and dot-entries are undisclosed (they can carry secret-bearing names).
|
|
97
|
+
if (name.startsWith("."))
|
|
98
|
+
continue;
|
|
99
|
+
const lexical = join(path, name);
|
|
100
|
+
try {
|
|
101
|
+
const target = realpathSync(lexical);
|
|
102
|
+
if (!contained(home, target) || hiddenUnderHome(home, target))
|
|
103
|
+
continue;
|
|
104
|
+
const stat = statSync(target);
|
|
105
|
+
if (!stat.isDirectory())
|
|
106
|
+
continue;
|
|
107
|
+
let readable = true;
|
|
108
|
+
try {
|
|
109
|
+
accessSync(target, constants.R_OK);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
readable = false;
|
|
113
|
+
}
|
|
114
|
+
candidates.push({
|
|
115
|
+
name,
|
|
116
|
+
path: target,
|
|
117
|
+
kind: "directory",
|
|
118
|
+
readable,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Broken and inaccessible symlinks are not actionable picker entries.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
candidates.sort((left, right) => left.name.localeCompare(right.name));
|
|
126
|
+
const entries = candidates.slice(0, MAX_DIRECTORY_ENTRIES);
|
|
127
|
+
const parentPath = path === home ? null : resolve(path, "..");
|
|
128
|
+
return ControlDirectoryListing.parse({
|
|
129
|
+
path,
|
|
130
|
+
home,
|
|
131
|
+
parent: parentPath && contained(home, parentPath) ? parentPath : null,
|
|
132
|
+
entries,
|
|
133
|
+
truncated: candidates.length > MAX_DIRECTORY_ENTRIES,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
export function readScopedProjectFile(projects, projectId, requestedPath) {
|
|
137
|
+
const project = projects.get(projectId);
|
|
138
|
+
if (!project)
|
|
139
|
+
throw Object.assign(new Error(`no such project: ${projectId}`), { status: 404 });
|
|
140
|
+
if (!requestedPath ||
|
|
141
|
+
isAbsolute(requestedPath) ||
|
|
142
|
+
requestedPath.includes("\0") ||
|
|
143
|
+
requestedPath.split(/[\\/]/).includes("..")) {
|
|
144
|
+
throw Object.assign(new Error("project file path must be a contained relative path"), {
|
|
145
|
+
status: 400,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
const root = realpathSync(project.root);
|
|
149
|
+
const lexical = resolve(root, requestedPath);
|
|
150
|
+
let canonical;
|
|
151
|
+
let expected;
|
|
152
|
+
try {
|
|
153
|
+
canonical = realpathSync(lexical);
|
|
154
|
+
expected = statSync(canonical);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
throw Object.assign(new Error("project file does not exist"), { status: 404 });
|
|
158
|
+
}
|
|
159
|
+
if (!contained(root, canonical)) {
|
|
160
|
+
throw Object.assign(new Error("project file path escapes its registered project"), {
|
|
161
|
+
status: 403,
|
|
162
|
+
code: "project_file_path_escape",
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
let descriptor;
|
|
166
|
+
try {
|
|
167
|
+
descriptor = openSync(canonical, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
throw Object.assign(new Error("project file changed or is not a regular file"), {
|
|
171
|
+
status: 409,
|
|
172
|
+
code: "project_file_changed",
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const openedPath = openedDescriptorPath(descriptor, canonical);
|
|
177
|
+
if (!contained(root, openedPath)) {
|
|
178
|
+
throw Object.assign(new Error("opened project file escapes its registered project"), {
|
|
179
|
+
status: 403,
|
|
180
|
+
code: "project_file_path_escape",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const before = fstatSync(descriptor);
|
|
184
|
+
if (before.dev !== expected.dev || before.ino !== expected.ino || !before.isFile()) {
|
|
185
|
+
throw Object.assign(new Error("project file changed before it was opened"), {
|
|
186
|
+
status: 409,
|
|
187
|
+
code: "project_file_changed",
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (before.size > MAX_PROJECT_FILE_BYTES) {
|
|
191
|
+
throw Object.assign(new Error(`project file exceeds the ${MAX_PROJECT_FILE_BYTES} byte fetch limit`), { status: 413, code: "project_file_too_large" });
|
|
192
|
+
}
|
|
193
|
+
const buffer = Buffer.allocUnsafe(Math.min(MAX_PROJECT_FILE_BYTES + 1, before.size + 1));
|
|
194
|
+
let bytes = 0;
|
|
195
|
+
// Sniff the magic bytes FIRST: a non-image is refused before its content
|
|
196
|
+
// is read (QA-067 — this endpoint must never page a secret into memory).
|
|
197
|
+
while (bytes < Math.min(IMAGE_HEADER_BYTES, buffer.length)) {
|
|
198
|
+
const count = readSync(descriptor, buffer, bytes, Math.min(IMAGE_HEADER_BYTES, buffer.length) - bytes, null);
|
|
199
|
+
if (count === 0)
|
|
200
|
+
break;
|
|
201
|
+
bytes += count;
|
|
202
|
+
}
|
|
203
|
+
const contentType = sniffRasterImage(buffer.subarray(0, bytes));
|
|
204
|
+
if (!contentType) {
|
|
205
|
+
throw Object.assign(new Error("project file fetch serves raster images only"), {
|
|
206
|
+
status: 415,
|
|
207
|
+
code: "project_file_not_raster_image",
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
for (;;) {
|
|
211
|
+
const count = readSync(descriptor, buffer, bytes, buffer.length - bytes, null);
|
|
212
|
+
if (count === 0)
|
|
213
|
+
break;
|
|
214
|
+
bytes += count;
|
|
215
|
+
if (bytes > MAX_PROJECT_FILE_BYTES) {
|
|
216
|
+
throw Object.assign(new Error(`project file exceeds the ${MAX_PROJECT_FILE_BYTES} byte fetch limit`), { status: 413, code: "project_file_too_large" });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const after = fstatSync(descriptor);
|
|
220
|
+
let finalPath;
|
|
221
|
+
let final;
|
|
222
|
+
try {
|
|
223
|
+
finalPath = realpathSync(lexical);
|
|
224
|
+
final = statSync(finalPath);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
throw Object.assign(new Error("project file changed while it was being read"), {
|
|
228
|
+
status: 409,
|
|
229
|
+
code: "project_file_changed",
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (before.dev !== after.dev ||
|
|
233
|
+
before.ino !== after.ino ||
|
|
234
|
+
after.size !== bytes ||
|
|
235
|
+
final.dev !== after.dev ||
|
|
236
|
+
final.ino !== after.ino ||
|
|
237
|
+
finalPath !== canonical) {
|
|
238
|
+
throw Object.assign(new Error("project file changed while it was being read"), {
|
|
239
|
+
status: 409,
|
|
240
|
+
code: "project_file_changed",
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
data: buffer.subarray(0, bytes),
|
|
245
|
+
contentType,
|
|
246
|
+
fileName: openedPath.split(sep).at(-1) ?? "remote-file",
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
closeSync(descriptor);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* QA-067: the filesystem routes exist for the SSH remote runtime (the app
|
|
255
|
+
* browses the remote host through the control tunnel). A local daemon must not
|
|
256
|
+
* grow a generic bearer-reachable filesystem surface, so the services — and
|
|
257
|
+
* with them the routes, which answer 501 without a bound service — are wired
|
|
258
|
+
* only when the process runs as the remote runtime.
|
|
259
|
+
*/
|
|
260
|
+
export function remoteFilesystemServices(projects, env = process.env) {
|
|
261
|
+
if (env.CLAUDEXOR_REMOTE_RUNTIME !== "1")
|
|
262
|
+
return {};
|
|
263
|
+
return {
|
|
264
|
+
listDirectory: async (path) => listRemoteDirectory(path),
|
|
265
|
+
fetchProjectFile: async (projectId, path) => readScopedProjectFile(projects(), projectId, path),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function openedDescriptorPath(descriptor, fallback) {
|
|
269
|
+
// Linux exposes the kernel-bound pathname for an open descriptor. Darwin's
|
|
270
|
+
// /dev/fd entries are not symlinks and realpath cannot recover F_GETPATH, so
|
|
271
|
+
// the inode checks before and after the bounded descriptor read remain the
|
|
272
|
+
// portability fence there.
|
|
273
|
+
try {
|
|
274
|
+
return realpathSync(`/proc/self/fd/${descriptor}`);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return fallback;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=remote-filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-filesystem.js","sourceRoot":"","sources":["../src/remote-filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-asset-authority.js","sourceRoot":"","sources":["../src/repo-asset-authority.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6EAA6E;AAC7E,sEAAsE;AACtE,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,qEAAqE;AACrE,6DAA6D;AAC7D,EAAE;AACF,6EAA6E;AAC7E,uEAAuE;AACvE,uEAAuE;AACvE,EAAE;AACF,yEAAyE;AACzE,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AA+B7E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAsD;IAEtD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwD,CAAC;IACpF,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,KAAK,MAAM,OAAO,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,OAAO,KAAK,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;YACxE,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACtD,iBAAiB,IAAI,KAAK,CAAC;YAC3B,IAAI,YAAY;gBAAE,qBAAqB,IAAI,KAAK,CAAC;YACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE;gBACpB,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK;gBAC7C,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,YAAY;aACrD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;SACpF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;AAChE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CACtC,QAAsD;IAEtD,OAAO,yBAAyB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;AACnE,CAAC;AAED,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,QAAQ,GAAG,GAAG;IAChE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;AAC1D,CAAC;AAYD,+EAA+E;AAC/E,MAAM,UAAU,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"repo-asset-authority.js","sourceRoot":"","sources":["../src/repo-asset-authority.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import type { AdapterRegistry } from "@claudexor/core";
|
|
2
2
|
import type { ResourceStore } from "@claudexor/daemon";
|
|
3
3
|
import type { HarnessStatus } from "@claudexor/gateway";
|
|
4
|
-
import type
|
|
4
|
+
import { type AccessProfile, type ControlRunStartRequest, type GitCapability } from "@claudexor/schema";
|
|
5
5
|
interface RunRequirementsPreflightDependencies {
|
|
6
6
|
statusAll?: (cwd: string) => Promise<Array<Pick<HarnessStatus, "id" | "status" | "enabledIntents">>>;
|
|
7
7
|
registry?: AdapterRegistry;
|
|
8
8
|
accessDefault?: (cwd: string) => AccessProfile;
|
|
9
|
+
gitCapability?: () => Promise<GitCapability>;
|
|
10
|
+
requiresGit?: (request: ControlRunStartRequest) => boolean;
|
|
9
11
|
}
|
|
12
|
+
export interface RunRequirementsPreflightPolicy {
|
|
13
|
+
/** Thread turns defer Git to the durable daemon job; direct runs keep eager admission. */
|
|
14
|
+
git?: "eager" | "durable_job";
|
|
15
|
+
}
|
|
16
|
+
/** Canonical Git admission used both eagerly by direct runs and immediately
|
|
17
|
+
* pre-provider by durable thread jobs. */
|
|
18
|
+
export declare function preflightRunGitRequirement(request: ControlRunStartRequest, dependencies?: Pick<RunRequirementsPreflightDependencies, "gitCapability" | "requiresGit">): Promise<void>;
|
|
10
19
|
/** Refuse requests that no selected lane can satisfy before a run or turn is created. */
|
|
11
|
-
export declare function createRunRequirementsPreflight(resources: Pick<ResourceStore, "resolve">, noProjectRoot: string, dependencies?: RunRequirementsPreflightDependencies): (request: ControlRunStartRequest) => Promise<void>;
|
|
20
|
+
export declare function createRunRequirementsPreflight(resources: Pick<ResourceStore, "resolve">, noProjectRoot: string, dependencies?: RunRequirementsPreflightDependencies, policy?: RunRequirementsPreflightPolicy): (request: ControlRunStartRequest) => Promise<void>;
|
|
12
21
|
export {};
|
|
13
22
|
//# sourceMappingURL=request-preflight.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-preflight.d.ts","sourceRoot":"","sources":["../src/request-preflight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"request-preflight.d.ts","sourceRoot":"","sources":["../src/request-preflight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAEnB,MAAM,mBAAmB,CAAC;AAU3B,UAAU,oCAAoC;IAC5C,SAAS,CAAC,EAAE,CACV,GAAG,EAAE,MAAM,KACR,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,aAAa,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC;CAC5D;AAED,MAAM,WAAW,8BAA8B;IAC7C,0FAA0F;IAC1F,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CAC/B;AAED;0CAC0C;AAC1C,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,sBAAsB,EAC/B,YAAY,GAAE,IAAI,CAAC,oCAAoC,EAAE,eAAe,GAAG,aAAa,CAAM,GAC7F,OAAO,CAAC,IAAI,CAAC,CAef;AAED,yFAAyF;AACzF,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,EACzC,aAAa,EAAE,MAAM,EACrB,YAAY,GAAE,oCAAyC,EACvD,MAAM,GAAE,8BAAmC,GAC1C,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAkFpD"}
|
|
@@ -1,15 +1,39 @@
|
|
|
1
1
|
import { loadConfig } from "@claudexor/config";
|
|
2
2
|
import { RequestRequirementsResolver } from "@claudexor/orchestrator";
|
|
3
|
+
import { runStartRequiresGit, } from "@claudexor/schema";
|
|
4
|
+
import { gitCapabilityProblem, probeGitCapability } from "@claudexor/workspace";
|
|
3
5
|
import { buildGateway, buildRegistry } from "./registry.js";
|
|
4
6
|
const modeIntent = {
|
|
5
7
|
agent: "implement",
|
|
6
8
|
ask: "explain",
|
|
7
9
|
plan: "plan",
|
|
8
10
|
};
|
|
11
|
+
/** Canonical Git admission used both eagerly by direct runs and immediately
|
|
12
|
+
* pre-provider by durable thread jobs. */
|
|
13
|
+
export async function preflightRunGitRequirement(request, dependencies = {}) {
|
|
14
|
+
if (!(dependencies.requiresGit ?? runStartRequiresGit)(request))
|
|
15
|
+
return;
|
|
16
|
+
const git = await (dependencies.gitCapability ?? probeGitCapability)();
|
|
17
|
+
const blocker = gitCapabilityProblem(git);
|
|
18
|
+
if (!blocker)
|
|
19
|
+
return;
|
|
20
|
+
throw Object.assign(new Error(blocker.reason), {
|
|
21
|
+
status: 503,
|
|
22
|
+
code: blocker.code,
|
|
23
|
+
retryable: true,
|
|
24
|
+
requiredActions: [blocker.remediation ?? "Install Git and retry."],
|
|
25
|
+
context: {
|
|
26
|
+
capability: "git",
|
|
27
|
+
capabilityStatus: git.status,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
9
31
|
/** Refuse requests that no selected lane can satisfy before a run or turn is created. */
|
|
10
|
-
export function createRunRequirementsPreflight(resources, noProjectRoot, dependencies = {}) {
|
|
32
|
+
export function createRunRequirementsPreflight(resources, noProjectRoot, dependencies = {}, policy = {}) {
|
|
11
33
|
const requirements = new RequestRequirementsResolver();
|
|
12
34
|
return async (request) => {
|
|
35
|
+
if ((policy.git ?? "eager") === "eager")
|
|
36
|
+
await preflightRunGitRequirement(request, dependencies);
|
|
13
37
|
if ((request.attachments?.length ?? 0) === 0 && request.browser !== true)
|
|
14
38
|
return;
|
|
15
39
|
const cwd = request.scope.kind === "project" ? request.scope.root : noProjectRoot;
|
|
@@ -35,19 +59,18 @@ export function createRunRequirementsPreflight(resources, noProjectRoot, depende
|
|
|
35
59
|
throw requestError(`unknown harness lane: ${harnessId}`, 400, "harness_unavailable");
|
|
36
60
|
return { harnessId, manifest: await adapter.discover() };
|
|
37
61
|
}));
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
compatibleManifests.push({ harnessId, manifest });
|
|
47
|
-
}
|
|
48
|
-
if (compatibleManifests.length === 0) {
|
|
49
|
-
throw requestError("no eligible harness lane can receive every required attachment", 400, "attachment_pool_unsupported");
|
|
62
|
+
const attachmentAdmission = requirements.resolveAttachmentPool(explicitPool ? "explicit" : "auto", attachments, manifests.map(({ harnessId, manifest }) => ({
|
|
63
|
+
harnessId,
|
|
64
|
+
declarations: manifest.capability_profile.attachment_inputs,
|
|
65
|
+
available: true,
|
|
66
|
+
})));
|
|
67
|
+
if (attachmentAdmission.outcome === "refused") {
|
|
68
|
+
throw requestError(attachmentAdmission.message ??
|
|
69
|
+
"no eligible harness lane can receive every required attachment", 400, "attachment_pool_unsupported");
|
|
50
70
|
}
|
|
71
|
+
const compatibleManifests = attachmentAdmission.admittedHarnessIds
|
|
72
|
+
.map((harnessId) => manifests.find((entry) => entry.harnessId === harnessId))
|
|
73
|
+
.filter((entry) => entry !== undefined);
|
|
51
74
|
if (request.browser !== true)
|
|
52
75
|
return;
|
|
53
76
|
const access = intent === "implement"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-preflight.js","sourceRoot":"","sources":["../src/request-preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"request-preflight.js","sourceRoot":"","sources":["../src/request-preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-command-specs.d.ts","sourceRoot":"","sources":["../src/retry-command-specs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,mBAAmB,EAAE,SAAS,cAAc,
|
|
1
|
+
{"version":3,"file":"retry-command-specs.d.ts","sourceRoot":"","sources":["../src/retry-command-specs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,mBAAmB,EAAE,SAAS,cAAc,EAqBxD,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const RETRY_COMMAND_SPECS = [
|
|
2
2
|
{
|
|
3
3
|
id: "retry",
|
|
4
|
+
positionalPatterns: [{ min: 1, max: 1 }],
|
|
4
5
|
usageArgs: "<run_id>",
|
|
5
6
|
summary: "Exact Retry with the immutable original request and fresh preflight",
|
|
6
7
|
flags: ["json"],
|
|
@@ -10,6 +11,7 @@ export const RETRY_COMMAND_SPECS = [
|
|
|
10
11
|
},
|
|
11
12
|
{
|
|
12
13
|
id: "run-again",
|
|
14
|
+
positionalPatterns: [{ min: 1, max: 1 }],
|
|
13
15
|
usageArgs: "<run_id>",
|
|
14
16
|
summary: "Print an editable draft copied from a prior run",
|
|
15
17
|
flags: ["json"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-command-specs.js","sourceRoot":"","sources":["../src/retry-command-specs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAA8B;IAC5D;QACE,EAAE,EAAE,OAAO;QACX,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,qEAAqE;QAC9E,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,UAAU,EAAE,OAAO;QACnB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,IAAI;KACf;IACD;QACE,EAAE,EAAE,WAAW;QACf,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,iDAAiD;QAC1D,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,IAAI;KACf;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"retry-command-specs.js","sourceRoot":"","sources":["../src/retry-command-specs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAA8B;IAC5D;QACE,EAAE,EAAE,OAAO;QACX,kBAAkB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACxC,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,qEAAqE;QAC9E,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,UAAU,EAAE,OAAO;QACnB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,IAAI;KACf;IACD;QACE,EAAE,EAAE,WAAW;QACf,kBAAkB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACxC,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,iDAAiD;QAC1D,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,IAAI;KACf;CACF,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type GitCapability, type RunGitApplicabilityMatrix } from "@claudexor/schema";
|
|
2
|
+
export interface RunApplicabilityDependencies {
|
|
3
|
+
gitCapability?: () => Promise<GitCapability>;
|
|
4
|
+
protectedPaths?: (repoRoot: string) => readonly string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Project one complete matrix through the same predicate the actual thread
|
|
8
|
+
* resolver and run preflight use. Clients only select a cell from their exact
|
|
9
|
+
* outgoing wire; they never reproduce Git/worktree business rules.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildRunApplicabilityMatrix(input: {
|
|
12
|
+
repoRoot: string;
|
|
13
|
+
protectedPaths: readonly string[];
|
|
14
|
+
git: GitCapability;
|
|
15
|
+
}): RunGitApplicabilityMatrix;
|
|
16
|
+
/** Root-scoped service behind GET /run-applicability. */
|
|
17
|
+
export declare function projectRunApplicability(requestedRoot: string, dependencies?: RunApplicabilityDependencies): Promise<{
|
|
18
|
+
repoRoot: string;
|
|
19
|
+
git: {
|
|
20
|
+
status: "available" | "developer_tools_stub" | "failed" | "missing";
|
|
21
|
+
version: string | null;
|
|
22
|
+
detail: string | null;
|
|
23
|
+
remediation: string | null;
|
|
24
|
+
};
|
|
25
|
+
matrix: {
|
|
26
|
+
in_place: {
|
|
27
|
+
read_only: {
|
|
28
|
+
applicable: boolean;
|
|
29
|
+
requiresGit: boolean;
|
|
30
|
+
code: "git_developer_tools_stub" | "git_failed" | "git_missing" | null;
|
|
31
|
+
reason: string | null;
|
|
32
|
+
remediation: string | null;
|
|
33
|
+
};
|
|
34
|
+
agent_convergence: {
|
|
35
|
+
applicable: boolean;
|
|
36
|
+
requiresGit: boolean;
|
|
37
|
+
code: "git_developer_tools_stub" | "git_failed" | "git_missing" | null;
|
|
38
|
+
reason: string | null;
|
|
39
|
+
remediation: string | null;
|
|
40
|
+
};
|
|
41
|
+
agent_other: {
|
|
42
|
+
applicable: boolean;
|
|
43
|
+
requiresGit: boolean;
|
|
44
|
+
code: "git_developer_tools_stub" | "git_failed" | "git_missing" | null;
|
|
45
|
+
reason: string | null;
|
|
46
|
+
remediation: string | null;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
isolated: {
|
|
50
|
+
read_only: {
|
|
51
|
+
applicable: boolean;
|
|
52
|
+
requiresGit: boolean;
|
|
53
|
+
code: "git_developer_tools_stub" | "git_failed" | "git_missing" | null;
|
|
54
|
+
reason: string | null;
|
|
55
|
+
remediation: string | null;
|
|
56
|
+
};
|
|
57
|
+
agent_convergence: {
|
|
58
|
+
applicable: boolean;
|
|
59
|
+
requiresGit: boolean;
|
|
60
|
+
code: "git_developer_tools_stub" | "git_failed" | "git_missing" | null;
|
|
61
|
+
reason: string | null;
|
|
62
|
+
remediation: string | null;
|
|
63
|
+
};
|
|
64
|
+
agent_other: {
|
|
65
|
+
applicable: boolean;
|
|
66
|
+
requiresGit: boolean;
|
|
67
|
+
code: "git_developer_tools_stub" | "git_failed" | "git_missing" | null;
|
|
68
|
+
reason: string | null;
|
|
69
|
+
remediation: string | null;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
}>;
|
|
74
|
+
//# sourceMappingURL=run-applicability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-applicability.d.ts","sourceRoot":"","sources":["../src/run-applicability.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAElB,KAAK,yBAAyB,EAE/B,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,4BAA4B;IAC3C,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7C,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;CAC1D;AA+BD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,GAAG,EAAE,aAAa,CAAC;CACpB,GAAG,yBAAyB,CAqB5B;AAED,yDAAyD;AACzD,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,YAAY,GAAE,4BAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAehD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { loadConfig } from "@claudexor/config";
|
|
2
|
+
import { normalizeExistingProjectRoot } from "@claudexor/control-api";
|
|
3
|
+
import { ControlRunApplicabilityResponse, ThreadWorkspace, } from "@claudexor/schema";
|
|
4
|
+
import { gitCapabilityProblem, probeGitCapability } from "@claudexor/workspace";
|
|
5
|
+
import { threadRunStartRequiresGit } from "./thread-execution-workspace.js";
|
|
6
|
+
function requestFor(repoRoot, shape) {
|
|
7
|
+
const base = {
|
|
8
|
+
prompt: "run applicability projection",
|
|
9
|
+
scope: { kind: "project", root: repoRoot, context: "auto" },
|
|
10
|
+
execution: { isolation: shape === "read_only" ? "envelope" : "live" },
|
|
11
|
+
};
|
|
12
|
+
if (shape === "read_only")
|
|
13
|
+
return { ...base, mode: "ask" };
|
|
14
|
+
if (shape === "agent_convergence")
|
|
15
|
+
return { ...base, mode: "agent", untilClean: true };
|
|
16
|
+
return { ...base, mode: "agent" };
|
|
17
|
+
}
|
|
18
|
+
function cell(requiresGit, git) {
|
|
19
|
+
const blocker = gitCapabilityProblem(git);
|
|
20
|
+
if (!requiresGit || blocker === null) {
|
|
21
|
+
return {
|
|
22
|
+
applicable: true,
|
|
23
|
+
requiresGit,
|
|
24
|
+
code: null,
|
|
25
|
+
reason: null,
|
|
26
|
+
remediation: null,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
applicable: false,
|
|
31
|
+
requiresGit: true,
|
|
32
|
+
...blocker,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Project one complete matrix through the same predicate the actual thread
|
|
37
|
+
* resolver and run preflight use. Clients only select a cell from their exact
|
|
38
|
+
* outgoing wire; they never reproduce Git/worktree business rules.
|
|
39
|
+
*/
|
|
40
|
+
export function buildRunApplicabilityMatrix(input) {
|
|
41
|
+
const workspace = (mode) => ({
|
|
42
|
+
workspace: ThreadWorkspace.parse({ mode }),
|
|
43
|
+
});
|
|
44
|
+
const project = (mode) => {
|
|
45
|
+
const thread = workspace(mode);
|
|
46
|
+
const projectCell = (shape) => cell(threadRunStartRequiresGit(requestFor(input.repoRoot, shape), thread, input.protectedPaths), input.git);
|
|
47
|
+
return {
|
|
48
|
+
read_only: projectCell("read_only"),
|
|
49
|
+
agent_convergence: projectCell("agent_convergence"),
|
|
50
|
+
agent_other: projectCell("agent_other"),
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
in_place: project("in_place"),
|
|
55
|
+
isolated: project("isolated"),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Root-scoped service behind GET /run-applicability. */
|
|
59
|
+
export async function projectRunApplicability(requestedRoot, dependencies = {}) {
|
|
60
|
+
const repoRoot = normalizeExistingProjectRoot(requestedRoot);
|
|
61
|
+
const [git, protectedPaths] = await Promise.all([
|
|
62
|
+
(dependencies.gitCapability ?? probeGitCapability)(),
|
|
63
|
+
Promise.resolve(dependencies.protectedPaths?.(repoRoot) ??
|
|
64
|
+
loadConfig(repoRoot).project.constraints.protected_paths),
|
|
65
|
+
]);
|
|
66
|
+
return ControlRunApplicabilityResponse.parse({
|
|
67
|
+
repoRoot,
|
|
68
|
+
git,
|
|
69
|
+
matrix: buildRunApplicabilityMatrix({ repoRoot, protectedPaths, git }),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=run-applicability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-applicability.js","sourceRoot":"","sources":["../src/run-applicability.ts"],"names":[],"mappings":"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"}
|