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.
Files changed (143) hide show
  1. package/dist/assets/ProjectTypeGate-B3NHteXC.js +1 -0
  2. package/dist/assets/ProjectTypeGate-fJcYj6sR.css +1 -0
  3. package/dist/assets/{SetupReadinessGate-DkkorR2Y.js → SetupReadinessGate-2twHjoYZ.js} +1 -1
  4. package/dist/assets/{ShellLayout-BcKS2HG9.js → ShellLayout-BjAbXfzf.js} +1 -1
  5. package/dist/assets/{VTabs-BJ8MKoig.js → VTabs-BLGGdbms.js} +1 -1
  6. package/dist/assets/{error-CwT53qTu.js → error-DvUPciuh.js} +1 -1
  7. package/dist/assets/history-DfM4ewyV.js +1 -0
  8. package/dist/assets/home-sh4v0vz7.js +1 -0
  9. package/dist/assets/index-C4JbNnml.css +1 -0
  10. package/dist/assets/{index-BJxDQvyK.js → index-CdFWokfE.js} +1 -1
  11. package/dist/assets/index-D4oqjV9n.js +132 -0
  12. package/dist/assets/{index-CY-wDjNv.js → index-DqoYKexs.js} +15 -15
  13. package/dist/assets/{placement-7FCYadh2.js → placement-QfRaYTFY.js} +1 -1
  14. package/dist/assets/{setup-BzzdD38G.js → setup-B-WOti3H.js} +2 -2
  15. package/dist/assets/{streamEvents-Ba9kHw-1.js → streamEvents-CIqegoLa.js} +1 -1
  16. package/dist/assets/{studioGateApi-hkZdLr1Y.js → studioGateApi-CFtez6lH.js} +1 -1
  17. package/dist/assets/{target-scripts-8hczu84t.js → target-scripts-CI-nAISO.js} +1 -1
  18. package/dist/assets/useStudioTerminal-I8tuBymw.js +1 -0
  19. package/dist/assets/vibe64SessionPanelModel-DLdexNxC.js +1 -0
  20. package/dist/index.html +1 -1
  21. package/node_modules/@local/setup-doctor-core/src/server/doctorToolchain.js +4 -0
  22. package/node_modules/@local/studio-terminal-core/src/server/gitGithubTransport.js +33 -0
  23. package/node_modules/@local/studio-terminal-core/src/server/index.js +1 -0
  24. package/node_modules/@local/studio-terminal-core/src/server/terminalSessions.js +51 -1
  25. package/node_modules/@local/vibe64-adapters/src/server/adapter.js +4 -0
  26. package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/adapter.js +5 -0
  27. package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/databaseRuntime.js +50 -0
  28. package/node_modules/@local/vibe64-adapters/src/server/configStore.js +22 -1
  29. package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/agent_conversation.txt +0 -2
  30. package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/draft_issue.txt +18 -0
  31. package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/make_plan.txt +14 -2
  32. package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/prepare_for_merge.txt +2 -0
  33. package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/resolve_pull_request.txt +1 -0
  34. package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/run_deep_ui_check.txt +7 -3
  35. package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/commitPush.js +4 -22
  36. package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/factMetadata.js +21 -20
  37. package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/issuePr.js +27 -4
  38. package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/mergeSync.js +65 -8
  39. package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/worktreeDependencies.js +12 -25
  40. package/node_modules/@local/vibe64-adapters/src/server/workflowSessionActions.js +77 -20
  41. package/node_modules/@local/vibe64-core/src/server/terminalWebSocketRoutes.js +14 -5
  42. package/node_modules/@local/vibe64-project/src/server/actions.js +21 -0
  43. package/node_modules/@local/vibe64-project/src/server/registerRoutes.js +6 -0
  44. package/node_modules/@local/vibe64-project/src/server/service.js +125 -8
  45. package/node_modules/@local/vibe64-runtime/src/server/coreProjectTools.js +135 -0
  46. package/node_modules/@local/vibe64-runtime/src/server/index.js +4 -0
  47. package/node_modules/@local/vibe64-runtime/src/server/projectToolRegistry.js +434 -0
  48. package/node_modules/@local/vibe64-runtime/src/server/runtime.js +40 -16
  49. package/node_modules/@local/vibe64-runtime/src/server/sessionWorktreeState.js +25 -0
  50. package/node_modules/@local/vibe64-runtime/src/server/terminalFailureFixRequest.js +112 -0
  51. package/node_modules/@local/vibe64-runtime/src/server/workflowArtifacts.js +2 -2
  52. package/node_modules/@local/vibe64-runtime/src/server/workflowDefinitionBuilders.js +1 -0
  53. package/node_modules/@local/vibe64-runtime/src/server/workflowDefinitionComposers.js +192 -0
  54. package/node_modules/@local/vibe64-runtime/src/server/workflowMachine.js +5 -0
  55. package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreCoding.js +1309 -419
  56. package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreLifecycle.js +540 -358
  57. package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreMaintenance.js +5 -26
  58. package/node_modules/@local/vibe64-runtime/src/server/workflowPresentation.js +153 -26
  59. package/node_modules/@local/vibe64-runtime/src/server/workflowStepMachineHelpers.js +63 -10
  60. package/node_modules/@local/vibe64-runtime/src/server/workflowStepMachines.js +63 -2
  61. package/node_modules/@local/vibe64-sessions/src/server/inputSchemas.js +5 -0
  62. package/node_modules/@local/vibe64-sessions/src/server/service.js +8 -9
  63. package/node_modules/@local/vibe64-terminals/src/server/actions.js +65 -0
  64. package/node_modules/@local/vibe64-terminals/src/server/codexTerminal.js +608 -23
  65. package/node_modules/@local/vibe64-terminals/src/server/commandTerminal.js +261 -4
  66. package/node_modules/@local/vibe64-terminals/src/server/fixCodexJobs.js +420 -0
  67. package/node_modules/@local/vibe64-terminals/src/server/inputSchemas.js +240 -0
  68. package/node_modules/@local/vibe64-terminals/src/server/launchTargetTerminal.js +2 -0
  69. package/node_modules/@local/vibe64-terminals/src/server/registerRoutes.js +226 -0
  70. package/node_modules/@local/vibe64-terminals/src/server/service.js +140 -1
  71. package/node_modules/@local/vibe64-terminals/src/server/targetToolchainTerminal.js +1 -1
  72. package/node_modules/@local/vibe64-terminals/src/server/terminalShared.js +34 -0
  73. package/node_modules/node-pty/build/Makefile +369 -0
  74. package/node_modules/node-pty/build/Release/pty.node +0 -0
  75. package/node_modules/node-pty/build/binding.Makefile +6 -0
  76. package/node_modules/node-pty/build/config.gypi +440 -0
  77. package/node_modules/node-pty/build/pty.target.mk +166 -0
  78. package/node_modules/node-pty/node-addon-api/node_addon_api.Makefile +6 -0
  79. package/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +104 -0
  80. package/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +108 -0
  81. package/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +104 -0
  82. package/node_modules/which/CHANGELOG.md +166 -0
  83. package/package.json +2 -2
  84. package/packages/setup-doctor-core/src/server/doctorToolchain.js +4 -0
  85. package/packages/studio-terminal-core/src/server/gitGithubTransport.js +33 -0
  86. package/packages/studio-terminal-core/src/server/index.js +1 -0
  87. package/packages/studio-terminal-core/src/server/terminalSessions.js +51 -1
  88. package/packages/vibe64-adapters/src/server/adapter.js +4 -0
  89. package/packages/vibe64-adapters/src/server/adapters/laravel/adapter.js +5 -0
  90. package/packages/vibe64-adapters/src/server/adapters/laravel/databaseRuntime.js +50 -0
  91. package/packages/vibe64-adapters/src/server/configStore.js +22 -1
  92. package/packages/vibe64-adapters/src/server/systemPrompts/agent_conversation.txt +0 -2
  93. package/packages/vibe64-adapters/src/server/systemPrompts/draft_issue.txt +18 -0
  94. package/packages/vibe64-adapters/src/server/systemPrompts/make_plan.txt +14 -2
  95. package/packages/vibe64-adapters/src/server/systemPrompts/prepare_for_merge.txt +2 -0
  96. package/packages/vibe64-adapters/src/server/systemPrompts/resolve_pull_request.txt +1 -0
  97. package/packages/vibe64-adapters/src/server/systemPrompts/run_deep_ui_check.txt +7 -3
  98. package/packages/vibe64-adapters/src/server/workflowCommandTerminal/commitPush.js +4 -22
  99. package/packages/vibe64-adapters/src/server/workflowCommandTerminal/factMetadata.js +21 -20
  100. package/packages/vibe64-adapters/src/server/workflowCommandTerminal/issuePr.js +27 -4
  101. package/packages/vibe64-adapters/src/server/workflowCommandTerminal/mergeSync.js +65 -8
  102. package/packages/vibe64-adapters/src/server/workflowCommandTerminal/worktreeDependencies.js +12 -25
  103. package/packages/vibe64-adapters/src/server/workflowSessionActions.js +77 -20
  104. package/packages/vibe64-core/src/server/terminalWebSocketRoutes.js +14 -5
  105. package/packages/vibe64-project/src/server/actions.js +21 -0
  106. package/packages/vibe64-project/src/server/registerRoutes.js +6 -0
  107. package/packages/vibe64-project/src/server/service.js +125 -8
  108. package/packages/vibe64-runtime/src/server/coreProjectTools.js +135 -0
  109. package/packages/vibe64-runtime/src/server/index.js +4 -0
  110. package/packages/vibe64-runtime/src/server/projectToolRegistry.js +434 -0
  111. package/packages/vibe64-runtime/src/server/runtime.js +40 -16
  112. package/packages/vibe64-runtime/src/server/sessionWorktreeState.js +25 -0
  113. package/packages/vibe64-runtime/src/server/terminalFailureFixRequest.js +112 -0
  114. package/packages/vibe64-runtime/src/server/workflowArtifacts.js +2 -2
  115. package/packages/vibe64-runtime/src/server/workflowDefinitionBuilders.js +1 -0
  116. package/packages/vibe64-runtime/src/server/workflowDefinitionComposers.js +192 -0
  117. package/packages/vibe64-runtime/src/server/workflowMachine.js +5 -0
  118. package/packages/vibe64-runtime/src/server/workflowModules/coreCoding.js +1309 -419
  119. package/packages/vibe64-runtime/src/server/workflowModules/coreLifecycle.js +540 -358
  120. package/packages/vibe64-runtime/src/server/workflowModules/coreMaintenance.js +5 -26
  121. package/packages/vibe64-runtime/src/server/workflowPresentation.js +153 -26
  122. package/packages/vibe64-runtime/src/server/workflowStepMachineHelpers.js +63 -10
  123. package/packages/vibe64-runtime/src/server/workflowStepMachines.js +63 -2
  124. package/packages/vibe64-sessions/src/server/inputSchemas.js +5 -0
  125. package/packages/vibe64-sessions/src/server/service.js +8 -9
  126. package/packages/vibe64-terminals/src/server/actions.js +65 -0
  127. package/packages/vibe64-terminals/src/server/codexTerminal.js +608 -23
  128. package/packages/vibe64-terminals/src/server/commandTerminal.js +261 -4
  129. package/packages/vibe64-terminals/src/server/fixCodexJobs.js +420 -0
  130. package/packages/vibe64-terminals/src/server/inputSchemas.js +240 -0
  131. package/packages/vibe64-terminals/src/server/launchTargetTerminal.js +2 -0
  132. package/packages/vibe64-terminals/src/server/registerRoutes.js +226 -0
  133. package/packages/vibe64-terminals/src/server/service.js +140 -1
  134. package/packages/vibe64-terminals/src/server/targetToolchainTerminal.js +1 -1
  135. package/packages/vibe64-terminals/src/server/terminalShared.js +34 -0
  136. package/dist/assets/ProjectTypeGate-DStq4W4X.js +0 -1
  137. package/dist/assets/ProjectTypeGate-Dh2ycSoM.css +0 -1
  138. package/dist/assets/history-HQ_XliX2.js +0 -1
  139. package/dist/assets/home-B89EbUmA.js +0 -1
  140. package/dist/assets/index-16P0GeGq.js +0 -134
  141. package/dist/assets/index-eMhOXhf_.css +0 -1
  142. package/dist/assets/useStudioTerminal-D9TNb50w.js +0 -1
  143. 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,