vibe64 0.1.21 → 0.1.22
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/assets/ProjectTypeGate-B3NHteXC.js +1 -0
- package/dist/assets/ProjectTypeGate-fJcYj6sR.css +1 -0
- package/dist/assets/{SetupReadinessGate-DkkorR2Y.js → SetupReadinessGate-2twHjoYZ.js} +1 -1
- package/dist/assets/{ShellLayout-BcKS2HG9.js → ShellLayout-BjAbXfzf.js} +1 -1
- package/dist/assets/{VTabs-BJ8MKoig.js → VTabs-BLGGdbms.js} +1 -1
- package/dist/assets/{error-CwT53qTu.js → error-DvUPciuh.js} +1 -1
- package/dist/assets/history-DfM4ewyV.js +1 -0
- package/dist/assets/home-sh4v0vz7.js +1 -0
- package/dist/assets/index-C4JbNnml.css +1 -0
- package/dist/assets/{index-BJxDQvyK.js → index-CdFWokfE.js} +1 -1
- package/dist/assets/index-D4oqjV9n.js +132 -0
- package/dist/assets/{index-CY-wDjNv.js → index-DqoYKexs.js} +15 -15
- package/dist/assets/{placement-7FCYadh2.js → placement-QfRaYTFY.js} +1 -1
- package/dist/assets/{setup-BzzdD38G.js → setup-B-WOti3H.js} +2 -2
- package/dist/assets/{streamEvents-Ba9kHw-1.js → streamEvents-CIqegoLa.js} +1 -1
- package/dist/assets/{studioGateApi-hkZdLr1Y.js → studioGateApi-CFtez6lH.js} +1 -1
- package/dist/assets/{target-scripts-8hczu84t.js → target-scripts-CI-nAISO.js} +1 -1
- package/dist/assets/useStudioTerminal-I8tuBymw.js +1 -0
- package/dist/assets/vibe64SessionPanelModel-DLdexNxC.js +1 -0
- package/dist/index.html +1 -1
- package/node_modules/@local/setup-doctor-core/src/server/doctorToolchain.js +4 -0
- package/node_modules/@local/studio-terminal-core/src/server/gitGithubTransport.js +33 -0
- package/node_modules/@local/studio-terminal-core/src/server/index.js +1 -0
- package/node_modules/@local/studio-terminal-core/src/server/terminalSessions.js +51 -1
- package/node_modules/@local/vibe64-adapters/src/server/adapter.js +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/adapter.js +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/databaseRuntime.js +50 -0
- package/node_modules/@local/vibe64-adapters/src/server/configStore.js +22 -1
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/agent_conversation.txt +0 -2
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/draft_issue.txt +18 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/make_plan.txt +14 -2
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/prepare_for_merge.txt +2 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/resolve_pull_request.txt +1 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/run_deep_ui_check.txt +7 -3
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/commitPush.js +4 -22
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/factMetadata.js +21 -20
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/issuePr.js +27 -4
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/mergeSync.js +65 -8
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/worktreeDependencies.js +12 -25
- package/node_modules/@local/vibe64-adapters/src/server/workflowSessionActions.js +77 -20
- package/node_modules/@local/vibe64-core/src/server/terminalWebSocketRoutes.js +14 -5
- package/node_modules/@local/vibe64-project/src/server/actions.js +21 -0
- package/node_modules/@local/vibe64-project/src/server/registerRoutes.js +6 -0
- package/node_modules/@local/vibe64-project/src/server/service.js +125 -8
- package/node_modules/@local/vibe64-runtime/src/server/coreProjectTools.js +135 -0
- package/node_modules/@local/vibe64-runtime/src/server/index.js +4 -0
- package/node_modules/@local/vibe64-runtime/src/server/projectToolRegistry.js +434 -0
- package/node_modules/@local/vibe64-runtime/src/server/runtime.js +40 -16
- package/node_modules/@local/vibe64-runtime/src/server/sessionWorktreeState.js +25 -0
- package/node_modules/@local/vibe64-runtime/src/server/terminalFailureFixRequest.js +112 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowArtifacts.js +2 -2
- package/node_modules/@local/vibe64-runtime/src/server/workflowDefinitionBuilders.js +1 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowDefinitionComposers.js +192 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowMachine.js +5 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreCoding.js +1309 -419
- package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreLifecycle.js +540 -358
- package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreMaintenance.js +5 -26
- package/node_modules/@local/vibe64-runtime/src/server/workflowPresentation.js +153 -26
- package/node_modules/@local/vibe64-runtime/src/server/workflowStepMachineHelpers.js +63 -10
- package/node_modules/@local/vibe64-runtime/src/server/workflowStepMachines.js +63 -2
- package/node_modules/@local/vibe64-sessions/src/server/inputSchemas.js +5 -0
- package/node_modules/@local/vibe64-sessions/src/server/service.js +8 -9
- package/node_modules/@local/vibe64-terminals/src/server/actions.js +65 -0
- package/node_modules/@local/vibe64-terminals/src/server/codexTerminal.js +608 -23
- package/node_modules/@local/vibe64-terminals/src/server/commandTerminal.js +261 -4
- package/node_modules/@local/vibe64-terminals/src/server/fixCodexJobs.js +420 -0
- package/node_modules/@local/vibe64-terminals/src/server/inputSchemas.js +240 -0
- package/node_modules/@local/vibe64-terminals/src/server/launchTargetTerminal.js +2 -0
- package/node_modules/@local/vibe64-terminals/src/server/registerRoutes.js +226 -0
- package/node_modules/@local/vibe64-terminals/src/server/service.js +140 -1
- package/node_modules/@local/vibe64-terminals/src/server/targetToolchainTerminal.js +1 -1
- package/node_modules/@local/vibe64-terminals/src/server/terminalShared.js +34 -0
- package/node_modules/node-pty/build/Makefile +369 -0
- package/node_modules/node-pty/build/Release/pty.node +0 -0
- package/node_modules/node-pty/build/binding.Makefile +6 -0
- package/node_modules/node-pty/build/config.gypi +440 -0
- package/node_modules/node-pty/build/pty.target.mk +166 -0
- package/node_modules/node-pty/node-addon-api/node_addon_api.Makefile +6 -0
- package/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +104 -0
- package/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +108 -0
- package/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +104 -0
- package/node_modules/which/CHANGELOG.md +166 -0
- package/package.json +2 -2
- package/packages/setup-doctor-core/src/server/doctorToolchain.js +4 -0
- package/packages/studio-terminal-core/src/server/gitGithubTransport.js +33 -0
- package/packages/studio-terminal-core/src/server/index.js +1 -0
- package/packages/studio-terminal-core/src/server/terminalSessions.js +51 -1
- package/packages/vibe64-adapters/src/server/adapter.js +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/adapter.js +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/databaseRuntime.js +50 -0
- package/packages/vibe64-adapters/src/server/configStore.js +22 -1
- package/packages/vibe64-adapters/src/server/systemPrompts/agent_conversation.txt +0 -2
- package/packages/vibe64-adapters/src/server/systemPrompts/draft_issue.txt +18 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/make_plan.txt +14 -2
- package/packages/vibe64-adapters/src/server/systemPrompts/prepare_for_merge.txt +2 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/resolve_pull_request.txt +1 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/run_deep_ui_check.txt +7 -3
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/commitPush.js +4 -22
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/factMetadata.js +21 -20
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/issuePr.js +27 -4
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/mergeSync.js +65 -8
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/worktreeDependencies.js +12 -25
- package/packages/vibe64-adapters/src/server/workflowSessionActions.js +77 -20
- package/packages/vibe64-core/src/server/terminalWebSocketRoutes.js +14 -5
- package/packages/vibe64-project/src/server/actions.js +21 -0
- package/packages/vibe64-project/src/server/registerRoutes.js +6 -0
- package/packages/vibe64-project/src/server/service.js +125 -8
- package/packages/vibe64-runtime/src/server/coreProjectTools.js +135 -0
- package/packages/vibe64-runtime/src/server/index.js +4 -0
- package/packages/vibe64-runtime/src/server/projectToolRegistry.js +434 -0
- package/packages/vibe64-runtime/src/server/runtime.js +40 -16
- package/packages/vibe64-runtime/src/server/sessionWorktreeState.js +25 -0
- package/packages/vibe64-runtime/src/server/terminalFailureFixRequest.js +112 -0
- package/packages/vibe64-runtime/src/server/workflowArtifacts.js +2 -2
- package/packages/vibe64-runtime/src/server/workflowDefinitionBuilders.js +1 -0
- package/packages/vibe64-runtime/src/server/workflowDefinitionComposers.js +192 -0
- package/packages/vibe64-runtime/src/server/workflowMachine.js +5 -0
- package/packages/vibe64-runtime/src/server/workflowModules/coreCoding.js +1309 -419
- package/packages/vibe64-runtime/src/server/workflowModules/coreLifecycle.js +540 -358
- package/packages/vibe64-runtime/src/server/workflowModules/coreMaintenance.js +5 -26
- package/packages/vibe64-runtime/src/server/workflowPresentation.js +153 -26
- package/packages/vibe64-runtime/src/server/workflowStepMachineHelpers.js +63 -10
- package/packages/vibe64-runtime/src/server/workflowStepMachines.js +63 -2
- package/packages/vibe64-sessions/src/server/inputSchemas.js +5 -0
- package/packages/vibe64-sessions/src/server/service.js +8 -9
- package/packages/vibe64-terminals/src/server/actions.js +65 -0
- package/packages/vibe64-terminals/src/server/codexTerminal.js +608 -23
- package/packages/vibe64-terminals/src/server/commandTerminal.js +261 -4
- package/packages/vibe64-terminals/src/server/fixCodexJobs.js +420 -0
- package/packages/vibe64-terminals/src/server/inputSchemas.js +240 -0
- package/packages/vibe64-terminals/src/server/launchTargetTerminal.js +2 -0
- package/packages/vibe64-terminals/src/server/registerRoutes.js +226 -0
- package/packages/vibe64-terminals/src/server/service.js +140 -1
- package/packages/vibe64-terminals/src/server/targetToolchainTerminal.js +1 -1
- package/packages/vibe64-terminals/src/server/terminalShared.js +34 -0
- package/dist/assets/ProjectTypeGate-DStq4W4X.js +0 -1
- package/dist/assets/ProjectTypeGate-Dh2ycSoM.css +0 -1
- package/dist/assets/history-HQ_XliX2.js +0 -1
- package/dist/assets/home-B89EbUmA.js +0 -1
- package/dist/assets/index-16P0GeGq.js +0 -134
- package/dist/assets/index-eMhOXhf_.css +0 -1
- package/dist/assets/useStudioTerminal-D9TNb50w.js +0 -1
- package/dist/assets/vibe64SessionPanelModel-DvY_IbW3.js +0 -1
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { chmod, mkdir, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import process from "node:process";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
normalizeText,
|
|
9
|
+
vibe64Error
|
|
10
|
+
} from "@local/vibe64-core/server/core";
|
|
11
|
+
import {
|
|
12
|
+
vibe64ErrorResponse,
|
|
13
|
+
vibe64StatusCode
|
|
14
|
+
} from "@local/vibe64-core/server/serverResponses";
|
|
15
|
+
|
|
16
|
+
const FIX_CODEX_JOB_STATUSES = new Set(["fixed", "blocked"]);
|
|
17
|
+
const FIX_CODEX_HELPER_SOCKET_CONTAINER_DIR = "/vibe64-fix-helper";
|
|
18
|
+
const FIX_CODEX_HELPER_SOCKET_NAME = `fix-codex-${process.pid}.sock`;
|
|
19
|
+
const FIX_CODEX_HELPER_SCRIPT_NAME = "vibe64-fix-codex-report.mjs";
|
|
20
|
+
const MAX_FIX_CODEX_HELPER_BODY_BYTES = 128 * 1024;
|
|
21
|
+
const helperServers = new Map();
|
|
22
|
+
|
|
23
|
+
function publicFixCodexJob(job = {}) {
|
|
24
|
+
return {
|
|
25
|
+
completedAt: job.completedAt || "",
|
|
26
|
+
createdAt: job.createdAt || "",
|
|
27
|
+
id: job.id || "",
|
|
28
|
+
message: job.message || "",
|
|
29
|
+
scope: job.scope || "project",
|
|
30
|
+
status: job.status || "running",
|
|
31
|
+
subject: job.subject || "",
|
|
32
|
+
targetRoot: job.targetRoot || "",
|
|
33
|
+
terminalSessionId: job.terminalSessionId || "",
|
|
34
|
+
verificationSummary: job.verificationSummary || ""
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function normalizeFixStatus(status = "") {
|
|
39
|
+
const normalizedStatus = normalizeText(status);
|
|
40
|
+
if (!FIX_CODEX_JOB_STATUSES.has(normalizedStatus)) {
|
|
41
|
+
throw vibe64Error(
|
|
42
|
+
`Invalid Fix Codex status: ${normalizedStatus || "(empty)"}.`,
|
|
43
|
+
"vibe64_fix_codex_status_invalid"
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return normalizedStatus;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function createFixCodexJobStore({
|
|
50
|
+
clock = () => new Date()
|
|
51
|
+
} = {}) {
|
|
52
|
+
const jobs = new Map();
|
|
53
|
+
|
|
54
|
+
function createJob({
|
|
55
|
+
prompt = "",
|
|
56
|
+
scope = "project",
|
|
57
|
+
subject = "",
|
|
58
|
+
targetRoot = ""
|
|
59
|
+
} = {}) {
|
|
60
|
+
const id = crypto.randomUUID();
|
|
61
|
+
const token = crypto.randomBytes(32).toString("hex");
|
|
62
|
+
const job = {
|
|
63
|
+
completedAt: "",
|
|
64
|
+
createdAt: clock().toISOString(),
|
|
65
|
+
id,
|
|
66
|
+
message: "",
|
|
67
|
+
prompt: String(prompt || ""),
|
|
68
|
+
reportToken: token,
|
|
69
|
+
scope: normalizeText(scope) || "project",
|
|
70
|
+
status: "running",
|
|
71
|
+
subject: normalizeText(subject),
|
|
72
|
+
targetRoot: normalizeText(targetRoot),
|
|
73
|
+
terminalSessionId: "",
|
|
74
|
+
verificationSummary: ""
|
|
75
|
+
};
|
|
76
|
+
jobs.set(id, job);
|
|
77
|
+
return {
|
|
78
|
+
job: publicFixCodexJob(job),
|
|
79
|
+
token
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function requireJob(jobId = "") {
|
|
84
|
+
const job = jobs.get(normalizeText(jobId));
|
|
85
|
+
if (!job) {
|
|
86
|
+
throw vibe64Error(
|
|
87
|
+
"Fix Codex job was not found.",
|
|
88
|
+
"vibe64_fix_codex_job_not_found"
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return job;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function attachTerminal(jobId = "", terminalSessionId = "") {
|
|
95
|
+
const job = requireJob(jobId);
|
|
96
|
+
job.terminalSessionId = normalizeText(terminalSessionId);
|
|
97
|
+
return publicFixCodexJob(job);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function readJob(jobId = "") {
|
|
101
|
+
return publicFixCodexJob(requireJob(jobId));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function reportJob(jobId = "", input = {}) {
|
|
105
|
+
const job = requireJob(jobId);
|
|
106
|
+
if (job.status !== "running") {
|
|
107
|
+
throw vibe64Error(
|
|
108
|
+
"Fix Codex job has already been reported.",
|
|
109
|
+
"vibe64_fix_codex_already_reported"
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const token = normalizeText(input.token);
|
|
113
|
+
if (!token || token !== job.reportToken) {
|
|
114
|
+
throw vibe64Error(
|
|
115
|
+
"Fix Codex report token is invalid.",
|
|
116
|
+
"vibe64_fix_codex_token_invalid"
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
job.status = normalizeFixStatus(input.status);
|
|
120
|
+
job.message = normalizeText(input.message);
|
|
121
|
+
job.verificationSummary = normalizeText(input.verificationSummary);
|
|
122
|
+
job.completedAt = clock().toISOString();
|
|
123
|
+
job.reportToken = "";
|
|
124
|
+
return publicFixCodexJob(job);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return Object.freeze({
|
|
128
|
+
attachTerminal,
|
|
129
|
+
createJob,
|
|
130
|
+
readJob,
|
|
131
|
+
reportJob
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const defaultFixCodexJobStore = createFixCodexJobStore();
|
|
136
|
+
|
|
137
|
+
function helperRuntimeHostDir(targetRoot = "") {
|
|
138
|
+
return path.join(path.resolve(targetRoot), ".vibe64", "runtime");
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function helperSocketHostPath(targetRoot = "") {
|
|
142
|
+
return path.join(helperRuntimeHostDir(targetRoot), FIX_CODEX_HELPER_SOCKET_NAME);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function helperSocketContainerPath() {
|
|
146
|
+
return path.posix.join(FIX_CODEX_HELPER_SOCKET_CONTAINER_DIR, FIX_CODEX_HELPER_SOCKET_NAME);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function helperScriptHostPath(targetRoot = "") {
|
|
150
|
+
return path.join(helperRuntimeHostDir(targetRoot), FIX_CODEX_HELPER_SCRIPT_NAME);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function helperMount(targetRoot = "") {
|
|
154
|
+
return {
|
|
155
|
+
source: helperRuntimeHostDir(targetRoot),
|
|
156
|
+
target: FIX_CODEX_HELPER_SOCKET_CONTAINER_DIR
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async function readRequestJson(request) {
|
|
161
|
+
let body = "";
|
|
162
|
+
for await (const chunk of request) {
|
|
163
|
+
body += chunk;
|
|
164
|
+
if (Buffer.byteLength(body) > MAX_FIX_CODEX_HELPER_BODY_BYTES) {
|
|
165
|
+
const error = new Error("Fix Codex helper input is too large.");
|
|
166
|
+
error.code = "vibe64_fix_codex_helper_input_too_large";
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const parsed = JSON.parse(body || "{}");
|
|
172
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
173
|
+
} catch {
|
|
174
|
+
const error = new Error("Fix Codex helper input must be valid JSON.");
|
|
175
|
+
error.code = "vibe64_fix_codex_helper_invalid_json";
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function sendJson(response, statusCode, payload = {}) {
|
|
181
|
+
response.writeHead(statusCode, {
|
|
182
|
+
"Content-Type": "application/json; charset=utf-8"
|
|
183
|
+
});
|
|
184
|
+
response.end(`${JSON.stringify(payload, null, 2)}\n`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function helperScriptSource() {
|
|
188
|
+
return `#!/usr/bin/env node
|
|
189
|
+
import http from "node:http";
|
|
190
|
+
import process from "node:process";
|
|
191
|
+
|
|
192
|
+
function readStdin() {
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
let text = "";
|
|
195
|
+
process.stdin.setEncoding("utf8");
|
|
196
|
+
process.stdin.on("data", (chunk) => {
|
|
197
|
+
text += chunk;
|
|
198
|
+
});
|
|
199
|
+
process.stdin.once("error", reject);
|
|
200
|
+
process.stdin.once("end", () => resolve(text));
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async function payloadTextFromArgs(args) {
|
|
205
|
+
const jsonIndex = args.indexOf("--json");
|
|
206
|
+
if (jsonIndex >= 0) {
|
|
207
|
+
return args[jsonIndex + 1] || "";
|
|
208
|
+
}
|
|
209
|
+
return readStdin();
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function parsePayload(text) {
|
|
213
|
+
try {
|
|
214
|
+
const parsed = JSON.parse(String(text || "").trim() || "{}");
|
|
215
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
216
|
+
} catch {
|
|
217
|
+
throw new Error("Usage: vibe64-fix-codex-report --json '{\\"status\\":\\"fixed\\", ...}' or pipe JSON on stdin.");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function postJsonToSocket({ payload, socketPath }) {
|
|
222
|
+
const body = JSON.stringify(payload);
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
const request = http.request({
|
|
225
|
+
headers: {
|
|
226
|
+
"Content-Length": Buffer.byteLength(body),
|
|
227
|
+
"Content-Type": "application/json"
|
|
228
|
+
},
|
|
229
|
+
method: "POST",
|
|
230
|
+
path: "/fix-codex/report",
|
|
231
|
+
socketPath
|
|
232
|
+
}, (response) => {
|
|
233
|
+
let text = "";
|
|
234
|
+
response.setEncoding("utf8");
|
|
235
|
+
response.on("data", (chunk) => {
|
|
236
|
+
text += chunk;
|
|
237
|
+
});
|
|
238
|
+
response.once("end", () => resolve({
|
|
239
|
+
statusCode: response.statusCode,
|
|
240
|
+
text
|
|
241
|
+
}));
|
|
242
|
+
});
|
|
243
|
+
request.once("error", reject);
|
|
244
|
+
request.end(body);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const socketPath = process.env.VIBE64_FIX_CODEX_REPORT_SOCKET || "";
|
|
249
|
+
const jobId = process.env.VIBE64_FIX_CODEX_JOB_ID || "";
|
|
250
|
+
const token = process.env.VIBE64_FIX_CODEX_TOKEN || "";
|
|
251
|
+
|
|
252
|
+
try {
|
|
253
|
+
if (!socketPath || !jobId || !token) {
|
|
254
|
+
throw new Error("Vibe64 Fix Codex helper environment is not available.");
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const payload = {
|
|
258
|
+
...parsePayload(await payloadTextFromArgs(process.argv.slice(2))),
|
|
259
|
+
jobId,
|
|
260
|
+
token
|
|
261
|
+
};
|
|
262
|
+
const response = await postJsonToSocket({
|
|
263
|
+
payload,
|
|
264
|
+
socketPath
|
|
265
|
+
});
|
|
266
|
+
process.stdout.write(response.text);
|
|
267
|
+
if (Number(response.statusCode) >= 400) {
|
|
268
|
+
process.exitCode = 1;
|
|
269
|
+
}
|
|
270
|
+
} catch (error) {
|
|
271
|
+
process.stderr.write(\`\${error?.message || error}\\n\`);
|
|
272
|
+
process.exitCode = 1;
|
|
273
|
+
}
|
|
274
|
+
`;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function helperEnvironment({
|
|
278
|
+
jobId = "",
|
|
279
|
+
targetRoot = "",
|
|
280
|
+
token = ""
|
|
281
|
+
} = {}) {
|
|
282
|
+
return {
|
|
283
|
+
VIBE64_FIX_CODEX_JOB_ID: normalizeText(jobId),
|
|
284
|
+
VIBE64_FIX_CODEX_REPORT_HELPER: helperScriptHostPath(targetRoot),
|
|
285
|
+
VIBE64_FIX_CODEX_REPORT_SOCKET: helperSocketContainerPath(),
|
|
286
|
+
VIBE64_FIX_CODEX_TOKEN: normalizeText(token)
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
async function writeHelperScript(targetRoot = "") {
|
|
291
|
+
const scriptPath = helperScriptHostPath(targetRoot);
|
|
292
|
+
await mkdir(path.dirname(scriptPath), {
|
|
293
|
+
recursive: true
|
|
294
|
+
});
|
|
295
|
+
await writeFile(scriptPath, helperScriptSource(), "utf8");
|
|
296
|
+
await chmod(scriptPath, 0o755);
|
|
297
|
+
return scriptPath;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async function ensureFixCodexHelperServer({
|
|
301
|
+
fixJobStore,
|
|
302
|
+
targetRoot = ""
|
|
303
|
+
} = {}) {
|
|
304
|
+
const socketPath = helperSocketHostPath(targetRoot);
|
|
305
|
+
const existing = helperServers.get(socketPath);
|
|
306
|
+
if (existing?.fixJobStore === fixJobStore) {
|
|
307
|
+
return existing.server;
|
|
308
|
+
}
|
|
309
|
+
if (existing?.server) {
|
|
310
|
+
await new Promise((resolve) => {
|
|
311
|
+
existing.server.close(() => resolve());
|
|
312
|
+
}).catch(() => null);
|
|
313
|
+
helperServers.delete(socketPath);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
await mkdir(path.dirname(socketPath), {
|
|
317
|
+
recursive: true
|
|
318
|
+
});
|
|
319
|
+
await rm(socketPath, {
|
|
320
|
+
force: true
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
const server = createServer(async (request, response) => {
|
|
324
|
+
if (request.method !== "POST" || request.url !== "/fix-codex/report") {
|
|
325
|
+
sendJson(response, 404, {
|
|
326
|
+
ok: false,
|
|
327
|
+
errors: [
|
|
328
|
+
{
|
|
329
|
+
code: "vibe64_fix_codex_helper_route_not_found",
|
|
330
|
+
message: "Unknown Vibe64 Fix Codex helper route."
|
|
331
|
+
}
|
|
332
|
+
]
|
|
333
|
+
});
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
const input = await readRequestJson(request);
|
|
339
|
+
const job = fixJobStore.reportJob(input.jobId, input);
|
|
340
|
+
sendJson(response, 200, {
|
|
341
|
+
fixJob: job,
|
|
342
|
+
ok: true
|
|
343
|
+
});
|
|
344
|
+
} catch (error) {
|
|
345
|
+
const payload = vibe64ErrorResponse(error, {
|
|
346
|
+
fallbackCode: "vibe64_fix_codex_helper_request_failed",
|
|
347
|
+
fallbackMessage: "Vibe64 Fix Codex helper request failed."
|
|
348
|
+
});
|
|
349
|
+
sendJson(response, vibe64StatusCode(payload), payload);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
await new Promise((resolve, reject) => {
|
|
354
|
+
server.once("error", reject);
|
|
355
|
+
server.listen(socketPath, () => {
|
|
356
|
+
server.off("error", reject);
|
|
357
|
+
resolve();
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
server.unref?.();
|
|
361
|
+
helperServers.set(socketPath, {
|
|
362
|
+
fixJobStore,
|
|
363
|
+
server
|
|
364
|
+
});
|
|
365
|
+
return server;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
async function prepareFixCodexReportHelper({
|
|
369
|
+
fixJobStore,
|
|
370
|
+
jobId = "",
|
|
371
|
+
targetRoot = "",
|
|
372
|
+
token = ""
|
|
373
|
+
} = {}) {
|
|
374
|
+
await ensureFixCodexHelperServer({
|
|
375
|
+
fixJobStore,
|
|
376
|
+
targetRoot
|
|
377
|
+
});
|
|
378
|
+
await writeHelperScript(targetRoot);
|
|
379
|
+
return {
|
|
380
|
+
env: helperEnvironment({
|
|
381
|
+
jobId,
|
|
382
|
+
targetRoot,
|
|
383
|
+
token
|
|
384
|
+
}),
|
|
385
|
+
mount: helperMount(targetRoot)
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function fixCodexReportInstructions({
|
|
390
|
+
job = {},
|
|
391
|
+
token = ""
|
|
392
|
+
} = {}) {
|
|
393
|
+
return [
|
|
394
|
+
"Fix Codex reporting:",
|
|
395
|
+
"When the fix is complete or blocked, report exactly once using the local Vibe64 Fix Codex callback.",
|
|
396
|
+
"Preferred helper command:",
|
|
397
|
+
`node "$VIBE64_FIX_CODEX_REPORT_HELPER" --json '${JSON.stringify({
|
|
398
|
+
status: "fixed",
|
|
399
|
+
message: "What changed or what blocked the fix.",
|
|
400
|
+
verificationSummary: "Commands run and results, or why verification was not possible."
|
|
401
|
+
})}'`,
|
|
402
|
+
"Callback fields:",
|
|
403
|
+
JSON.stringify({
|
|
404
|
+
jobId: job.id || "",
|
|
405
|
+
status: "fixed | blocked",
|
|
406
|
+
token,
|
|
407
|
+
message: "What changed or what blocked the fix.",
|
|
408
|
+
verificationSummary: "Commands run and results, or why verification was not possible."
|
|
409
|
+
}, null, 2)
|
|
410
|
+
].join("\n");
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export {
|
|
414
|
+
FIX_CODEX_JOB_STATUSES,
|
|
415
|
+
createFixCodexJobStore,
|
|
416
|
+
defaultFixCodexJobStore,
|
|
417
|
+
fixCodexReportInstructions,
|
|
418
|
+
prepareFixCodexReportHelper,
|
|
419
|
+
publicFixCodexJob
|
|
420
|
+
};
|
|
@@ -42,6 +42,190 @@ const commandTerminalFields = {
|
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
+
const projectToolRunFields = {
|
|
46
|
+
parameters: {
|
|
47
|
+
type: "object",
|
|
48
|
+
additionalProperties: true,
|
|
49
|
+
required: false
|
|
50
|
+
},
|
|
51
|
+
toolId: {
|
|
52
|
+
type: "string",
|
|
53
|
+
noTrim: false,
|
|
54
|
+
required: true
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const projectToolFixFields = {
|
|
59
|
+
actionId: {
|
|
60
|
+
type: "string",
|
|
61
|
+
noTrim: false,
|
|
62
|
+
required: false
|
|
63
|
+
},
|
|
64
|
+
actionLabel: {
|
|
65
|
+
type: "string",
|
|
66
|
+
noTrim: false,
|
|
67
|
+
required: false
|
|
68
|
+
},
|
|
69
|
+
attemptedCommand: {
|
|
70
|
+
type: "string",
|
|
71
|
+
noTrim: false,
|
|
72
|
+
required: false
|
|
73
|
+
},
|
|
74
|
+
closeError: {
|
|
75
|
+
type: "string",
|
|
76
|
+
noTrim: false,
|
|
77
|
+
required: false
|
|
78
|
+
},
|
|
79
|
+
commandPreview: {
|
|
80
|
+
type: "string",
|
|
81
|
+
noTrim: false,
|
|
82
|
+
required: false
|
|
83
|
+
},
|
|
84
|
+
exitCode: {
|
|
85
|
+
type: "string",
|
|
86
|
+
noTrim: false,
|
|
87
|
+
required: false
|
|
88
|
+
},
|
|
89
|
+
output: {
|
|
90
|
+
type: "string",
|
|
91
|
+
noTrim: true,
|
|
92
|
+
required: false
|
|
93
|
+
},
|
|
94
|
+
terminalSessionId: {
|
|
95
|
+
type: "string",
|
|
96
|
+
noTrim: false,
|
|
97
|
+
required: false
|
|
98
|
+
},
|
|
99
|
+
terminalStatus: {
|
|
100
|
+
type: "string",
|
|
101
|
+
noTrim: false,
|
|
102
|
+
required: false
|
|
103
|
+
},
|
|
104
|
+
toolId: {
|
|
105
|
+
type: "string",
|
|
106
|
+
noTrim: false,
|
|
107
|
+
required: true
|
|
108
|
+
},
|
|
109
|
+
toolLabel: {
|
|
110
|
+
type: "string",
|
|
111
|
+
noTrim: false,
|
|
112
|
+
required: false
|
|
113
|
+
},
|
|
114
|
+
userMessage: {
|
|
115
|
+
type: "string",
|
|
116
|
+
noTrim: false,
|
|
117
|
+
required: false
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const sessionTerminalFixFields = {
|
|
122
|
+
actionId: {
|
|
123
|
+
type: "string",
|
|
124
|
+
noTrim: false,
|
|
125
|
+
required: false
|
|
126
|
+
},
|
|
127
|
+
actionLabel: {
|
|
128
|
+
type: "string",
|
|
129
|
+
noTrim: false,
|
|
130
|
+
required: false
|
|
131
|
+
},
|
|
132
|
+
attemptedCommand: {
|
|
133
|
+
type: "string",
|
|
134
|
+
noTrim: false,
|
|
135
|
+
required: false
|
|
136
|
+
},
|
|
137
|
+
closeError: {
|
|
138
|
+
type: "string",
|
|
139
|
+
noTrim: false,
|
|
140
|
+
required: false
|
|
141
|
+
},
|
|
142
|
+
commandPreview: {
|
|
143
|
+
type: "string",
|
|
144
|
+
noTrim: false,
|
|
145
|
+
required: false
|
|
146
|
+
},
|
|
147
|
+
currentStep: {
|
|
148
|
+
type: "string",
|
|
149
|
+
noTrim: false,
|
|
150
|
+
required: false
|
|
151
|
+
},
|
|
152
|
+
exitCode: {
|
|
153
|
+
type: "string",
|
|
154
|
+
noTrim: false,
|
|
155
|
+
required: false
|
|
156
|
+
},
|
|
157
|
+
launchTargetId: {
|
|
158
|
+
type: "string",
|
|
159
|
+
noTrim: false,
|
|
160
|
+
required: false
|
|
161
|
+
},
|
|
162
|
+
launchTargetLabel: {
|
|
163
|
+
type: "string",
|
|
164
|
+
noTrim: false,
|
|
165
|
+
required: false
|
|
166
|
+
},
|
|
167
|
+
output: {
|
|
168
|
+
type: "string",
|
|
169
|
+
noTrim: true,
|
|
170
|
+
required: false
|
|
171
|
+
},
|
|
172
|
+
sessionId: sessionIdField,
|
|
173
|
+
shellTarget: {
|
|
174
|
+
type: "string",
|
|
175
|
+
noTrim: false,
|
|
176
|
+
required: false
|
|
177
|
+
},
|
|
178
|
+
stepStatus: {
|
|
179
|
+
type: "string",
|
|
180
|
+
noTrim: false,
|
|
181
|
+
required: false
|
|
182
|
+
},
|
|
183
|
+
terminalKind: {
|
|
184
|
+
type: "string",
|
|
185
|
+
noTrim: false,
|
|
186
|
+
required: false
|
|
187
|
+
},
|
|
188
|
+
terminalSessionId: {
|
|
189
|
+
type: "string",
|
|
190
|
+
noTrim: false,
|
|
191
|
+
required: false
|
|
192
|
+
},
|
|
193
|
+
terminalStatus: {
|
|
194
|
+
type: "string",
|
|
195
|
+
noTrim: false,
|
|
196
|
+
required: false
|
|
197
|
+
},
|
|
198
|
+
userMessage: {
|
|
199
|
+
type: "string",
|
|
200
|
+
noTrim: false,
|
|
201
|
+
required: false
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
const fixCodexReportFields = {
|
|
206
|
+
message: {
|
|
207
|
+
type: "string",
|
|
208
|
+
noTrim: false,
|
|
209
|
+
required: false
|
|
210
|
+
},
|
|
211
|
+
status: {
|
|
212
|
+
type: "string",
|
|
213
|
+
enum: ["fixed", "blocked"],
|
|
214
|
+
noTrim: false,
|
|
215
|
+
required: true
|
|
216
|
+
},
|
|
217
|
+
token: {
|
|
218
|
+
type: "string",
|
|
219
|
+
noTrim: false,
|
|
220
|
+
required: true
|
|
221
|
+
},
|
|
222
|
+
verificationSummary: {
|
|
223
|
+
type: "string",
|
|
224
|
+
noTrim: false,
|
|
225
|
+
required: false
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
45
229
|
const launchTargetFields = {
|
|
46
230
|
launchTargetId: {
|
|
47
231
|
type: "string",
|
|
@@ -89,6 +273,55 @@ const commandTerminalActionInputValidator = deepFreeze({
|
|
|
89
273
|
mode: "patch"
|
|
90
274
|
});
|
|
91
275
|
|
|
276
|
+
const projectToolRunInputValidator = deepFreeze({
|
|
277
|
+
schema: createSchema({
|
|
278
|
+
parameters: projectToolRunFields.parameters
|
|
279
|
+
}),
|
|
280
|
+
mode: "patch"
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const projectToolRunActionInputValidator = deepFreeze({
|
|
284
|
+
schema: createSchema(projectToolRunFields),
|
|
285
|
+
mode: "patch"
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
const projectToolFixInputValidator = deepFreeze({
|
|
289
|
+
schema: createSchema({
|
|
290
|
+
...projectToolFixFields,
|
|
291
|
+
toolId: {
|
|
292
|
+
...projectToolFixFields.toolId,
|
|
293
|
+
required: false
|
|
294
|
+
}
|
|
295
|
+
}),
|
|
296
|
+
mode: "patch"
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
const projectToolFixActionInputValidator = deepFreeze({
|
|
300
|
+
schema: createSchema(projectToolFixFields),
|
|
301
|
+
mode: "patch"
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
const sessionTerminalFixInputValidator = deepFreeze({
|
|
305
|
+
schema: createSchema({
|
|
306
|
+
...sessionTerminalFixFields,
|
|
307
|
+
sessionId: {
|
|
308
|
+
...sessionTerminalFixFields.sessionId,
|
|
309
|
+
required: false
|
|
310
|
+
}
|
|
311
|
+
}),
|
|
312
|
+
mode: "patch"
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
const sessionTerminalFixActionInputValidator = deepFreeze({
|
|
316
|
+
schema: createSchema(sessionTerminalFixFields),
|
|
317
|
+
mode: "patch"
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
const fixCodexReportInputValidator = deepFreeze({
|
|
321
|
+
schema: createSchema(fixCodexReportFields),
|
|
322
|
+
mode: "patch"
|
|
323
|
+
});
|
|
324
|
+
|
|
92
325
|
const launchTargetInputValidator = deepFreeze({
|
|
93
326
|
schema: createSchema(launchTargetFields),
|
|
94
327
|
mode: "patch"
|
|
@@ -130,6 +363,13 @@ export {
|
|
|
130
363
|
launchTargetActionInputValidator,
|
|
131
364
|
launchTargetInputValidator,
|
|
132
365
|
openLaunchTargetActionInputValidator,
|
|
366
|
+
fixCodexReportInputValidator,
|
|
367
|
+
projectToolFixActionInputValidator,
|
|
368
|
+
projectToolFixInputValidator,
|
|
369
|
+
projectToolRunActionInputValidator,
|
|
370
|
+
projectToolRunInputValidator,
|
|
371
|
+
sessionTerminalFixActionInputValidator,
|
|
372
|
+
sessionTerminalFixInputValidator,
|
|
133
373
|
shellTerminalActionInputValidator,
|
|
134
374
|
shellTerminalInputValidator
|
|
135
375
|
};
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
ensureTargetRuntimeNetwork
|
|
16
16
|
} from "@local/studio-terminal-core/server/runtimeContainers";
|
|
17
17
|
import {
|
|
18
|
+
commandInvocation,
|
|
18
19
|
vibe64Result,
|
|
19
20
|
launchTargetTerminalNamespace,
|
|
20
21
|
sessionTerminalCwd,
|
|
@@ -396,6 +397,7 @@ function createLaunchTargetTerminalController({
|
|
|
396
397
|
maxRunning: 1,
|
|
397
398
|
metadata: {
|
|
398
399
|
...(spec.metadata || {}),
|
|
400
|
+
attemptedCommand: commandInvocation(spec),
|
|
399
401
|
envHash: launchEnvHash,
|
|
400
402
|
launchTargetId: launchTarget.id,
|
|
401
403
|
launchTargetLabel: launchTarget.label,
|