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.
Files changed (85) hide show
  1. package/dist/build-meta.json +3 -3
  2. package/dist/package.json +13 -13
  3. package/dist/public/assets/{abnfDiagram-O67JEVCF-DzcfOMEY.js → abnfDiagram-O67JEVCF-CfEOyxDH.js} +1 -1
  4. package/dist/public/assets/{arc-DilDrUip.js → arc-CWOmUQMu.js} +1 -1
  5. package/dist/public/assets/{architectureDiagram-NJMV4G6O-BKqsYDXc.js → architectureDiagram-NJMV4G6O-BkLlCd5w.js} +1 -1
  6. package/dist/public/assets/{blockDiagram-BEXU5L5S-SOU8LU5R.js → blockDiagram-BEXU5L5S-Ciuoprd6.js} +1 -1
  7. package/dist/public/assets/{c4Diagram-YGBWAQC7-jlEYAcK7.js → c4Diagram-YGBWAQC7-DM9-eJxf.js} +1 -1
  8. package/dist/public/assets/channel-Cci2XuJS.js +1 -0
  9. package/dist/public/assets/{chunk-2Q5K7J3B-EmZek5gL.js → chunk-2Q5K7J3B-D1c3AmPs.js} +1 -1
  10. package/dist/public/assets/{chunk-3FUC2YCW-vWSdv5T0.js → chunk-3FUC2YCW-Bl68bUES.js} +2 -2
  11. package/dist/public/assets/{chunk-5VM5RSS4-CTq93v-W.js → chunk-5VM5RSS4-X_LQ24Gn.js} +1 -1
  12. package/dist/public/assets/{chunk-GTNCS2PH-CAJcJM89.js → chunk-GTNCS2PH-CNEFfAzS.js} +1 -1
  13. package/dist/public/assets/{chunk-GWA4HPMP-DNGjRh2z.js → chunk-GWA4HPMP-C7DkZlNq.js} +1 -1
  14. package/dist/public/assets/{chunk-JWPE2WC7-V3f12iv4.js → chunk-JWPE2WC7-CMFCw_nU.js} +1 -1
  15. package/dist/public/assets/{chunk-NETBCI7D-DkFvLTBh.js → chunk-NETBCI7D-C5uY9Nj5.js} +1 -1
  16. package/dist/public/assets/{chunk-WEXAMYUT-C90Om8QA.js → chunk-WEXAMYUT-CyJYuumg.js} +1 -1
  17. package/dist/public/assets/{chunk-XXDRQBXY-DgJEqXMx.js → chunk-XXDRQBXY-Hhi1Qat7.js} +1 -1
  18. package/dist/public/assets/{classDiagram-v2-NBCMYWYE-CcVuk60h.js → classDiagram-v2-NBCMYWYE-CUVpgYkQ.js} +1 -1
  19. package/dist/public/assets/{cose-bilkent-JH36ORCC-QzlibSkL.js → cose-bilkent-JH36ORCC-CvKLCNyf.js} +1 -1
  20. package/dist/public/assets/{cynefin-OW5HDTMX-BdPWjKNn.js → cynefin-OW5HDTMX-BWav6_j0.js} +1 -1
  21. package/dist/public/assets/{cynefinDiagram-VND7K2PF-BYvDWk7H.js → cynefinDiagram-VND7K2PF-N-o2dJ6N.js} +1 -1
  22. package/dist/public/assets/{dagre-6A5THRUB-O0Rfcov2.js → dagre-6A5THRUB-MD8RkRhV.js} +1 -1
  23. package/dist/public/assets/{diagram-22UHCM2B-BSeOxvT0.js → diagram-22UHCM2B-GMOFN-eG.js} +1 -1
  24. package/dist/public/assets/{diagram-3UASUU5V-BXZ9aFB5.js → diagram-3UASUU5V-Dpldk42J.js} +1 -1
  25. package/dist/public/assets/{diagram-ATOU4E4O-gwdDj9oQ.js → diagram-ATOU4E4O-C8iQ5gco.js} +1 -1
  26. package/dist/public/assets/{diagram-CDSNMT55-DuiOYtlt.js → diagram-CDSNMT55-B9uLzKhV.js} +1 -1
  27. package/dist/public/assets/{diagram-MLGK6HIB-CknFpvvj.js → diagram-MLGK6HIB-DErxpCbQ.js} +1 -1
  28. package/dist/public/assets/{diagram-MPIPVDR6-DosvPFYV.js → diagram-MPIPVDR6-D2DFt4wW.js} +1 -1
  29. package/dist/public/assets/{ebnfDiagram-ZINNZB2B-BD02fFDy.js → ebnfDiagram-ZINNZB2B-CXdiw8VF.js} +1 -1
  30. package/dist/public/assets/{elk-276RUBZZ-Cz_rwa70.js → elk-276RUBZZ-B8THaPhk.js} +1 -1
  31. package/dist/public/assets/{erDiagram-OPXOYQCR-BW-0ErnE.js → erDiagram-OPXOYQCR-CB66OCnA.js} +1 -1
  32. package/dist/public/assets/{flowDiagram-KWPJA3E3-r23LuSoD.js → flowDiagram-KWPJA3E3-C9ZJri7o.js} +1 -1
  33. package/dist/public/assets/{ganttDiagram-FUAMR5RP-CpT6foaA.js → ganttDiagram-FUAMR5RP-CbCpJoQp.js} +1 -1
  34. package/dist/public/assets/{gitGraphDiagram-X574FWY7-1P5ZJ5NA.js → gitGraphDiagram-X574FWY7-B54Zfqy2.js} +1 -1
  35. package/dist/public/assets/index-Dp0a9bVz.css +32 -0
  36. package/dist/public/assets/index-bFpfaPZi.js +363 -0
  37. package/dist/public/assets/{infoDiagram-VRGFBTTK-D6_j45sr.js → infoDiagram-VRGFBTTK-Cm8cRNo1.js} +1 -1
  38. package/dist/public/assets/{ishikawaDiagram-OU5B5YK6-mWpWGOJC.js → ishikawaDiagram-OU5B5YK6-DDlIGelT.js} +1 -1
  39. package/dist/public/assets/{journeyDiagram-ZHPQQLJL-Ck9t_Cws.js → journeyDiagram-ZHPQQLJL-Bi3Itxu4.js} +1 -1
  40. package/dist/public/assets/{kanban-definition-PNTS6WVX-BrTVkHVx.js → kanban-definition-PNTS6WVX-DAMbX7MM.js} +1 -1
  41. package/dist/public/assets/{linear-FAIA063v.js → linear-MAhVrjlB.js} +1 -1
  42. package/dist/public/assets/{mermaid.core-yMH0alVZ.js → mermaid.core-DuEETMGj.js} +4 -4
  43. package/dist/public/assets/{mindmap-definition-NLK3R4M7-Bo2z5P7P.js → mindmap-definition-NLK3R4M7-BYstGJ4o.js} +1 -1
  44. package/dist/public/assets/{pegDiagram-GJSIUBJH-CCOnaekJ.js → pegDiagram-GJSIUBJH-DaHHVjAd.js} +1 -1
  45. package/dist/public/assets/{pieDiagram-5QR66LMP-sVXghfWy.js → pieDiagram-5QR66LMP-B1VuPvcW.js} +1 -1
  46. package/dist/public/assets/{quadrantDiagram-O4NWA36T-CQwZHV8P.js → quadrantDiagram-O4NWA36T-Cv0WKpnS.js} +1 -1
  47. package/dist/public/assets/{railroadDiagram-XR7U4H2S-OLkjMZrH.js → railroadDiagram-XR7U4H2S-B1bku2zK.js} +1 -1
  48. package/dist/public/assets/{requirementDiagram-PLB6GJNP-CQ0jcPXA.js → requirementDiagram-PLB6GJNP-C73LGTz4.js} +1 -1
  49. package/dist/public/assets/{sankeyDiagram-IPEJSGJF-ChBjgDzc.js → sankeyDiagram-IPEJSGJF-DsGIjgz6.js} +1 -1
  50. package/dist/public/assets/{sequenceDiagram-PO4LG4MO-D5qNos3-.js → sequenceDiagram-PO4LG4MO-CUYiZBzY.js} +1 -1
  51. package/dist/public/assets/{sizeCapture-INFHLROL-CSFFOw07.js → sizeCapture-INFHLROL-BZ66sANG.js} +1 -1
  52. package/dist/public/assets/{stateDiagram-v2-GCMORJYK-Cydkl0es.js → stateDiagram-v2-GCMORJYK-1ETj6tOy.js} +1 -1
  53. package/dist/public/assets/{swimlanes-2SLR337P-BB0rJ1sZ.js → swimlanes-2SLR337P-Ct6oNBoE.js} +1 -1
  54. package/dist/public/assets/swimlanesDiagram-TC7HE7FX-7GrZvyr4.js +8 -0
  55. package/dist/public/assets/{timeline-definition-EJHVYXUP-CId4BnZK.js → timeline-definition-EJHVYXUP-D0vSfYcC.js} +1 -1
  56. package/dist/public/assets/{usecaseDiagram-POWQR4AR-qbT3h8lp.js → usecaseDiagram-POWQR4AR-Dy0YO-j7.js} +1 -1
  57. package/dist/public/assets/{vennDiagram-UO4OBE2U-DOY2R4Gb.js → vennDiagram-UO4OBE2U-DkrJdx67.js} +1 -1
  58. package/dist/public/assets/{wardleyDiagram-VNRHLVJA-VCA2v6fy.js → wardleyDiagram-VNRHLVJA-CPuHAJIV.js} +1 -1
  59. package/dist/public/assets/{xychartDiagram-PMCCYNJV-oquZadS8.js → xychartDiagram-PMCCYNJV-BwwGXvBZ.js} +1 -1
  60. package/dist/public/index.html +2 -2
  61. package/dist/src/agent-runtime/adapter.js +1 -1
  62. package/dist/src/agent-runtime/builtinRuntime.js +50 -8
  63. package/dist/src/agent-runtime/conversation.js +99 -6
  64. package/dist/src/agent-runtime/conversationRestart.js +201 -0
  65. package/dist/src/agent-runtime/inbox.js +37 -6
  66. package/dist/src/agent-runtime/runtime.js +35 -2
  67. package/dist/src/agent-runtime/tmuxRuntime.js +86 -4
  68. package/dist/src/agents/codex.js +1 -0
  69. package/dist/src/agents/codexConversationRestart.js +655 -0
  70. package/dist/src/agents/codexRestartReceipt.js +243 -0
  71. package/dist/src/agents/nativeInbox.js +29 -10
  72. package/dist/src/agents/nativeInboxSources.js +9 -3
  73. package/dist/src/apiAccountProviders.js +2 -2
  74. package/dist/src/cli/tunlite.js +14 -4
  75. package/dist/src/codexAppServer.js +1 -0
  76. package/dist/src/routes/agents.js +71 -0
  77. package/dist/src/routes/terminal.js +10 -3
  78. package/dist/src/server.js +12 -0
  79. package/dist/src/terminalStream.js +19 -3
  80. package/dist/src/tmux/commands.js +27 -10
  81. package/package.json +4 -4
  82. package/dist/public/assets/channel-CwtCksJU.js +0 -1
  83. package/dist/public/assets/index-CCO6YrGs.css +0 -32
  84. package/dist/public/assets/index-paby27To.js +0 -199
  85. 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
  }
@@ -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 },