handmux 0.33.3 → 0.34.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/build-meta.json +3 -3
- package/dist/package.json +13 -13
- package/dist/public/assets/{abnfDiagram-O67JEVCF-DzcfOMEY.js → abnfDiagram-O67JEVCF-CfEOyxDH.js} +1 -1
- package/dist/public/assets/{arc-DilDrUip.js → arc-CWOmUQMu.js} +1 -1
- package/dist/public/assets/{architectureDiagram-NJMV4G6O-BKqsYDXc.js → architectureDiagram-NJMV4G6O-BkLlCd5w.js} +1 -1
- package/dist/public/assets/{blockDiagram-BEXU5L5S-SOU8LU5R.js → blockDiagram-BEXU5L5S-Ciuoprd6.js} +1 -1
- package/dist/public/assets/{c4Diagram-YGBWAQC7-jlEYAcK7.js → c4Diagram-YGBWAQC7-DM9-eJxf.js} +1 -1
- package/dist/public/assets/channel-Cci2XuJS.js +1 -0
- package/dist/public/assets/{chunk-2Q5K7J3B-EmZek5gL.js → chunk-2Q5K7J3B-D1c3AmPs.js} +1 -1
- package/dist/public/assets/{chunk-3FUC2YCW-vWSdv5T0.js → chunk-3FUC2YCW-Bl68bUES.js} +2 -2
- package/dist/public/assets/{chunk-5VM5RSS4-CTq93v-W.js → chunk-5VM5RSS4-X_LQ24Gn.js} +1 -1
- package/dist/public/assets/{chunk-GTNCS2PH-CAJcJM89.js → chunk-GTNCS2PH-CNEFfAzS.js} +1 -1
- package/dist/public/assets/{chunk-GWA4HPMP-DNGjRh2z.js → chunk-GWA4HPMP-C7DkZlNq.js} +1 -1
- package/dist/public/assets/{chunk-JWPE2WC7-V3f12iv4.js → chunk-JWPE2WC7-CMFCw_nU.js} +1 -1
- package/dist/public/assets/{chunk-NETBCI7D-DkFvLTBh.js → chunk-NETBCI7D-C5uY9Nj5.js} +1 -1
- package/dist/public/assets/{chunk-WEXAMYUT-C90Om8QA.js → chunk-WEXAMYUT-CyJYuumg.js} +1 -1
- package/dist/public/assets/{chunk-XXDRQBXY-DgJEqXMx.js → chunk-XXDRQBXY-Hhi1Qat7.js} +1 -1
- package/dist/public/assets/{classDiagram-v2-NBCMYWYE-CcVuk60h.js → classDiagram-v2-NBCMYWYE-CUVpgYkQ.js} +1 -1
- package/dist/public/assets/{cose-bilkent-JH36ORCC-QzlibSkL.js → cose-bilkent-JH36ORCC-CvKLCNyf.js} +1 -1
- package/dist/public/assets/{cynefin-OW5HDTMX-BdPWjKNn.js → cynefin-OW5HDTMX-BWav6_j0.js} +1 -1
- package/dist/public/assets/{cynefinDiagram-VND7K2PF-BYvDWk7H.js → cynefinDiagram-VND7K2PF-N-o2dJ6N.js} +1 -1
- package/dist/public/assets/{dagre-6A5THRUB-O0Rfcov2.js → dagre-6A5THRUB-MD8RkRhV.js} +1 -1
- package/dist/public/assets/{diagram-22UHCM2B-BSeOxvT0.js → diagram-22UHCM2B-GMOFN-eG.js} +1 -1
- package/dist/public/assets/{diagram-3UASUU5V-BXZ9aFB5.js → diagram-3UASUU5V-Dpldk42J.js} +1 -1
- package/dist/public/assets/{diagram-ATOU4E4O-gwdDj9oQ.js → diagram-ATOU4E4O-C8iQ5gco.js} +1 -1
- package/dist/public/assets/{diagram-CDSNMT55-DuiOYtlt.js → diagram-CDSNMT55-B9uLzKhV.js} +1 -1
- package/dist/public/assets/{diagram-MLGK6HIB-CknFpvvj.js → diagram-MLGK6HIB-DErxpCbQ.js} +1 -1
- package/dist/public/assets/{diagram-MPIPVDR6-DosvPFYV.js → diagram-MPIPVDR6-D2DFt4wW.js} +1 -1
- package/dist/public/assets/{ebnfDiagram-ZINNZB2B-BD02fFDy.js → ebnfDiagram-ZINNZB2B-CXdiw8VF.js} +1 -1
- package/dist/public/assets/{elk-276RUBZZ-Cz_rwa70.js → elk-276RUBZZ-B8THaPhk.js} +1 -1
- package/dist/public/assets/{erDiagram-OPXOYQCR-BW-0ErnE.js → erDiagram-OPXOYQCR-CB66OCnA.js} +1 -1
- package/dist/public/assets/{flowDiagram-KWPJA3E3-r23LuSoD.js → flowDiagram-KWPJA3E3-C9ZJri7o.js} +1 -1
- package/dist/public/assets/{ganttDiagram-FUAMR5RP-CpT6foaA.js → ganttDiagram-FUAMR5RP-CbCpJoQp.js} +1 -1
- package/dist/public/assets/{gitGraphDiagram-X574FWY7-1P5ZJ5NA.js → gitGraphDiagram-X574FWY7-B54Zfqy2.js} +1 -1
- package/dist/public/assets/index-Dp0a9bVz.css +32 -0
- package/dist/public/assets/index-bFpfaPZi.js +363 -0
- package/dist/public/assets/{infoDiagram-VRGFBTTK-D6_j45sr.js → infoDiagram-VRGFBTTK-Cm8cRNo1.js} +1 -1
- package/dist/public/assets/{ishikawaDiagram-OU5B5YK6-mWpWGOJC.js → ishikawaDiagram-OU5B5YK6-DDlIGelT.js} +1 -1
- package/dist/public/assets/{journeyDiagram-ZHPQQLJL-Ck9t_Cws.js → journeyDiagram-ZHPQQLJL-Bi3Itxu4.js} +1 -1
- package/dist/public/assets/{kanban-definition-PNTS6WVX-BrTVkHVx.js → kanban-definition-PNTS6WVX-DAMbX7MM.js} +1 -1
- package/dist/public/assets/{linear-FAIA063v.js → linear-MAhVrjlB.js} +1 -1
- package/dist/public/assets/{mermaid.core-yMH0alVZ.js → mermaid.core-DuEETMGj.js} +4 -4
- package/dist/public/assets/{mindmap-definition-NLK3R4M7-Bo2z5P7P.js → mindmap-definition-NLK3R4M7-BYstGJ4o.js} +1 -1
- package/dist/public/assets/{pegDiagram-GJSIUBJH-CCOnaekJ.js → pegDiagram-GJSIUBJH-DaHHVjAd.js} +1 -1
- package/dist/public/assets/{pieDiagram-5QR66LMP-sVXghfWy.js → pieDiagram-5QR66LMP-B1VuPvcW.js} +1 -1
- package/dist/public/assets/{quadrantDiagram-O4NWA36T-CQwZHV8P.js → quadrantDiagram-O4NWA36T-Cv0WKpnS.js} +1 -1
- package/dist/public/assets/{railroadDiagram-XR7U4H2S-OLkjMZrH.js → railroadDiagram-XR7U4H2S-B1bku2zK.js} +1 -1
- package/dist/public/assets/{requirementDiagram-PLB6GJNP-CQ0jcPXA.js → requirementDiagram-PLB6GJNP-C73LGTz4.js} +1 -1
- package/dist/public/assets/{sankeyDiagram-IPEJSGJF-ChBjgDzc.js → sankeyDiagram-IPEJSGJF-DsGIjgz6.js} +1 -1
- package/dist/public/assets/{sequenceDiagram-PO4LG4MO-D5qNos3-.js → sequenceDiagram-PO4LG4MO-CUYiZBzY.js} +1 -1
- package/dist/public/assets/{sizeCapture-INFHLROL-CSFFOw07.js → sizeCapture-INFHLROL-BZ66sANG.js} +1 -1
- package/dist/public/assets/{stateDiagram-v2-GCMORJYK-Cydkl0es.js → stateDiagram-v2-GCMORJYK-1ETj6tOy.js} +1 -1
- package/dist/public/assets/{swimlanes-2SLR337P-BB0rJ1sZ.js → swimlanes-2SLR337P-Ct6oNBoE.js} +1 -1
- package/dist/public/assets/swimlanesDiagram-TC7HE7FX-7GrZvyr4.js +8 -0
- package/dist/public/assets/{timeline-definition-EJHVYXUP-CId4BnZK.js → timeline-definition-EJHVYXUP-D0vSfYcC.js} +1 -1
- package/dist/public/assets/{usecaseDiagram-POWQR4AR-qbT3h8lp.js → usecaseDiagram-POWQR4AR-Dy0YO-j7.js} +1 -1
- package/dist/public/assets/{vennDiagram-UO4OBE2U-DOY2R4Gb.js → vennDiagram-UO4OBE2U-DkrJdx67.js} +1 -1
- package/dist/public/assets/{wardleyDiagram-VNRHLVJA-VCA2v6fy.js → wardleyDiagram-VNRHLVJA-CPuHAJIV.js} +1 -1
- package/dist/public/assets/{xychartDiagram-PMCCYNJV-oquZadS8.js → xychartDiagram-PMCCYNJV-BwwGXvBZ.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/src/agent-runtime/adapter.js +1 -1
- package/dist/src/agent-runtime/builtinRuntime.js +50 -8
- package/dist/src/agent-runtime/conversation.js +99 -6
- package/dist/src/agent-runtime/conversationRestart.js +201 -0
- package/dist/src/agent-runtime/inbox.js +37 -6
- package/dist/src/agent-runtime/runtime.js +35 -2
- package/dist/src/agent-runtime/tmuxRuntime.js +86 -4
- package/dist/src/agents/codex.js +1 -0
- package/dist/src/agents/codexConversationRestart.js +655 -0
- package/dist/src/agents/codexRestartReceipt.js +243 -0
- package/dist/src/agents/nativeInbox.js +29 -10
- package/dist/src/agents/nativeInboxSources.js +9 -3
- package/dist/src/apiAccountProviders.js +2 -2
- package/dist/src/cli/tunlite.js +14 -4
- package/dist/src/codexAppServer.js +1 -0
- package/dist/src/routes/agents.js +71 -0
- package/dist/src/routes/terminal.js +10 -3
- package/dist/src/server.js +12 -0
- package/dist/src/terminalStream.js +19 -3
- package/dist/src/tmux/commands.js +27 -10
- package/package.json +4 -4
- package/dist/public/assets/channel-CwtCksJU.js +0 -1
- package/dist/public/assets/index-CCO6YrGs.css +0 -32
- package/dist/public/assets/index-paby27To.js +0 -199
- package/dist/public/assets/swimlanesDiagram-TC7HE7FX-BBvp48yM.js +0 -8
|
@@ -155,6 +155,21 @@ export async function processStartedAt(run, pid) {
|
|
|
155
155
|
const parsed = Date.parse(String(await run('ps', ['-p', String(pid), '-o', 'lstart='])).trim());
|
|
156
156
|
return Number.isFinite(parsed) ? parsed : undefined;
|
|
157
157
|
}
|
|
158
|
+
function processPresence(pid) {
|
|
159
|
+
try {
|
|
160
|
+
process.kill(pid, 0);
|
|
161
|
+
return 'present';
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const code = typeof error === 'object' && error !== null && 'code' in error
|
|
165
|
+
? String(error.code) : '';
|
|
166
|
+
if (code === 'ESRCH')
|
|
167
|
+
return 'missing';
|
|
168
|
+
if (code === 'EPERM' || code === 'EACCES')
|
|
169
|
+
return 'present';
|
|
170
|
+
return 'unknown';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
158
173
|
export function createLocalAgentProcessContext({ run = defaultRun, } = {}) {
|
|
159
174
|
const PS_FORMAT = 'pid=,ppid=,stat=,etime=,tty=,command=';
|
|
160
175
|
const rowsCache = new Map();
|
|
@@ -190,15 +205,15 @@ export function createLocalAgentProcessContext({ run = defaultRun, } = {}) {
|
|
|
190
205
|
};
|
|
191
206
|
// One `ps` read, shared by both evidence methods below. The full-system scan is only the fallback for a
|
|
192
207
|
// platform whose targeted query returns nothing; rows are always re-filtered to the pane's own tty.
|
|
193
|
-
const foregroundGroup = async (pane) => {
|
|
208
|
+
const foregroundGroup = async (pane, fresh = false) => {
|
|
194
209
|
const tty = normTty(pane.tty);
|
|
195
210
|
if (!tty)
|
|
196
211
|
return { tty: '', rows: [] };
|
|
197
|
-
const cached = rowsCache.get(tty);
|
|
212
|
+
const cached = fresh ? undefined : rowsCache.get(tty);
|
|
198
213
|
const now = Date.now();
|
|
199
|
-
if (cached?.rows && cached.expiresAt > now)
|
|
214
|
+
if (!fresh && cached?.rows && cached.expiresAt > now)
|
|
200
215
|
return { tty, rows: cached.rows };
|
|
201
|
-
if (cached?.promise && cached.expiresAt > now)
|
|
216
|
+
if (!fresh && cached?.promise && cached.expiresAt > now)
|
|
202
217
|
return { tty, rows: await cached.promise };
|
|
203
218
|
const promise = (async () => {
|
|
204
219
|
let output = await run('ps', ['-t', tty, '-o', PS_FORMAT]);
|
|
@@ -206,6 +221,8 @@ export function createLocalAgentProcessContext({ run = defaultRun, } = {}) {
|
|
|
206
221
|
output = await run('ps', ['-Ao', PS_FORMAT]);
|
|
207
222
|
return foregroundRows(output).filter((row) => row.tty === tty);
|
|
208
223
|
})();
|
|
224
|
+
if (fresh)
|
|
225
|
+
return { tty, rows: await promise };
|
|
209
226
|
const entry = {
|
|
210
227
|
expiresAt: Date.now() + PROCESS_EVIDENCE_INFLIGHT_MS,
|
|
211
228
|
promise,
|
|
@@ -260,6 +277,28 @@ export function createLocalAgentProcessContext({ run = defaultRun, } = {}) {
|
|
|
260
277
|
};
|
|
261
278
|
return { ...value };
|
|
262
279
|
},
|
|
280
|
+
async inspectForegroundFresh(pane) {
|
|
281
|
+
const { tty, rows } = await foregroundGroup(pane, true);
|
|
282
|
+
if (!tty)
|
|
283
|
+
return null;
|
|
284
|
+
const row = foregroundLeaf(rows, tty, pane.currentCommand);
|
|
285
|
+
if (!row)
|
|
286
|
+
return null;
|
|
287
|
+
const processStart = await processStartedAt(run, row.pid);
|
|
288
|
+
if (processStart === undefined)
|
|
289
|
+
return null;
|
|
290
|
+
const executable = await executablePath(run, row.pid);
|
|
291
|
+
if (!executable)
|
|
292
|
+
return null;
|
|
293
|
+
return {
|
|
294
|
+
pid: row.pid,
|
|
295
|
+
ppid: row.ppid,
|
|
296
|
+
startedAt: processStart,
|
|
297
|
+
tty: pane.tty ?? `/dev/${tty}`,
|
|
298
|
+
executable,
|
|
299
|
+
...(row.command ? { commandLine: row.command } : {}),
|
|
300
|
+
};
|
|
301
|
+
},
|
|
263
302
|
async inspectForegroundGroup(pane) {
|
|
264
303
|
const tty = normTty(pane.tty);
|
|
265
304
|
if (!tty)
|
|
@@ -280,11 +319,54 @@ export function createLocalAgentProcessContext({ run = defaultRun, } = {}) {
|
|
|
280
319
|
}));
|
|
281
320
|
return value.map((entry) => ({ ...entry }));
|
|
282
321
|
},
|
|
322
|
+
async inspectForegroundGroupFresh(pane) {
|
|
323
|
+
const tty = normTty(pane.tty);
|
|
324
|
+
if (!tty)
|
|
325
|
+
return [];
|
|
326
|
+
const { rows } = await foregroundGroup(pane, true);
|
|
327
|
+
const value = await Promise.all(rows.map(async (row) => {
|
|
328
|
+
const [startedAt, executable] = await Promise.all([
|
|
329
|
+
processStartedAt(run, row.pid), executablePath(run, row.pid),
|
|
330
|
+
]);
|
|
331
|
+
if (startedAt === undefined || !executable)
|
|
332
|
+
return null;
|
|
333
|
+
return {
|
|
334
|
+
pid: row.pid,
|
|
335
|
+
ppid: row.ppid,
|
|
336
|
+
tty: pane.tty ?? `/dev/${row.tty}`,
|
|
337
|
+
startedAt,
|
|
338
|
+
executable,
|
|
339
|
+
...(row.command ? { commandLine: row.command } : {}),
|
|
340
|
+
};
|
|
341
|
+
}));
|
|
342
|
+
return value.filter((entry) => entry !== null)
|
|
343
|
+
.map((entry) => ({ ...entry }));
|
|
344
|
+
},
|
|
283
345
|
// One `ps -p`, and deliberately no executable lookup: a lease only needs to know that the pid it was
|
|
284
346
|
// attached to is still the same process generation.
|
|
285
347
|
async inspectProcess(pid) {
|
|
286
348
|
const startedAt = await processStartedAt(run, pid);
|
|
287
349
|
return startedAt === undefined ? null : { pid, startedAt };
|
|
288
350
|
},
|
|
351
|
+
async inspectProcessGenerationFresh(identity) {
|
|
352
|
+
if (!Number.isSafeInteger(identity.pid) || identity.pid <= 0
|
|
353
|
+
|| !Number.isSafeInteger(identity.startedAt) || identity.startedAt <= 0)
|
|
354
|
+
return 'unknown';
|
|
355
|
+
const initialPresence = processPresence(identity.pid);
|
|
356
|
+
if (initialPresence === 'missing')
|
|
357
|
+
return 'exited';
|
|
358
|
+
if (initialPresence === 'unknown')
|
|
359
|
+
return 'unknown';
|
|
360
|
+
try {
|
|
361
|
+
const currentStartedAt = await processStartedAt(run, identity.pid);
|
|
362
|
+
if (currentStartedAt !== undefined) {
|
|
363
|
+
return currentStartedAt === identity.startedAt ? 'same' : 'replaced';
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
return 'unknown';
|
|
368
|
+
}
|
|
369
|
+
return processPresence(identity.pid) === 'missing' ? 'exited' : 'unknown';
|
|
370
|
+
},
|
|
289
371
|
};
|
|
290
372
|
}
|
package/dist/src/agents/codex.js
CHANGED
|
@@ -302,6 +302,7 @@ export const codex = {
|
|
|
302
302
|
inbox: { apiVersion: 1 },
|
|
303
303
|
conversation: { apiVersion: 1 },
|
|
304
304
|
conversationActivation: { apiVersion: 1 },
|
|
305
|
+
conversationRestart: { apiVersion: 1 },
|
|
305
306
|
conversationGoal: { apiVersion: 1 },
|
|
306
307
|
conversationPlan: { apiVersion: 1 },
|
|
307
308
|
conversationContext: { apiVersion: 1 },
|