aicodeman 1.2.1 → 1.3.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/README.md +264 -90
- package/dist/attachment-magic.d.ts +13 -0
- package/dist/attachment-magic.d.ts.map +1 -1
- package/dist/attachment-magic.js +47 -0
- package/dist/attachment-magic.js.map +1 -1
- package/dist/attachment-registry.d.ts.map +1 -1
- package/dist/attachment-registry.js +13 -2
- package/dist/attachment-registry.js.map +1 -1
- package/dist/config/buffer-limits.d.ts +2 -3
- package/dist/config/buffer-limits.d.ts.map +1 -1
- package/dist/config/buffer-limits.js +5 -5
- package/dist/config/buffer-limits.js.map +1 -1
- package/dist/config/map-limits.d.ts +11 -0
- package/dist/config/map-limits.d.ts.map +1 -1
- package/dist/config/map-limits.js +11 -0
- package/dist/config/map-limits.js.map +1 -1
- package/dist/config/server-timing.d.ts +6 -0
- package/dist/config/server-timing.d.ts.map +1 -1
- package/dist/config/server-timing.js +9 -0
- package/dist/config/server-timing.js.map +1 -1
- package/dist/config/terminal-history.d.ts +30 -0
- package/dist/config/terminal-history.d.ts.map +1 -0
- package/dist/config/terminal-history.js +43 -0
- package/dist/config/terminal-history.js.map +1 -0
- package/dist/cron/cron-input.d.ts +30 -0
- package/dist/cron/cron-input.d.ts.map +1 -0
- package/dist/cron/cron-input.js +7 -0
- package/dist/cron/cron-input.js.map +1 -0
- package/dist/cron/cron-service.d.ts +92 -0
- package/dist/cron/cron-service.d.ts.map +1 -0
- package/dist/cron/cron-service.js +606 -0
- package/dist/cron/cron-service.js.map +1 -0
- package/dist/cron/cron-time.d.ts +29 -0
- package/dist/cron/cron-time.d.ts.map +1 -0
- package/dist/cron/cron-time.js +87 -0
- package/dist/cron/cron-time.js.map +1 -0
- package/dist/document-thumbnailer.d.ts +1 -1
- package/dist/document-thumbnailer.d.ts.map +1 -1
- package/dist/document-thumbnailer.js +11 -2
- package/dist/document-thumbnailer.js.map +1 -1
- package/dist/generated-artifact-attachments.d.ts +26 -0
- package/dist/generated-artifact-attachments.d.ts.map +1 -0
- package/dist/generated-artifact-attachments.js +61 -0
- package/dist/generated-artifact-attachments.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/mux-interface.d.ts +37 -5
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/remote-hosts.d.ts +66 -0
- package/dist/remote-hosts.d.ts.map +1 -0
- package/dist/remote-hosts.js +198 -0
- package/dist/remote-hosts.js.map +1 -0
- package/dist/services/unified-session-service.d.ts +115 -0
- package/dist/services/unified-session-service.d.ts.map +1 -0
- package/dist/services/unified-session-service.js +173 -0
- package/dist/services/unified-session-service.js.map +1 -0
- package/dist/session-cli-builder.d.ts +3 -1
- package/dist/session-cli-builder.d.ts.map +1 -1
- package/dist/session-cli-builder.js +26 -7
- package/dist/session-cli-builder.js.map +1 -1
- package/dist/session-pty-exit-breaker.d.ts +66 -0
- package/dist/session-pty-exit-breaker.d.ts.map +1 -0
- package/dist/session-pty-exit-breaker.js +77 -0
- package/dist/session-pty-exit-breaker.js.map +1 -0
- package/dist/session.d.ts +27 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +102 -11
- package/dist/session.js.map +1 -1
- package/dist/state-store.d.ts +14 -0
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +49 -0
- package/dist/state-store.js.map +1 -1
- package/dist/tmux-manager.d.ts +100 -8
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +249 -26
- package/dist/tmux-manager.js.map +1 -1
- package/dist/types/api.d.ts +11 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/api.js.map +1 -1
- package/dist/types/app-state.d.ts +5 -0
- package/dist/types/app-state.d.ts.map +1 -1
- package/dist/types/app-state.js.map +1 -1
- package/dist/types/cron.d.ts +88 -0
- package/dist/types/cron.d.ts.map +1 -0
- package/dist/types/cron.js +13 -0
- package/dist/types/cron.js.map +1 -0
- package/dist/types/session.d.ts +57 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/web/heic-jpeg-converter.d.ts +24 -0
- package/dist/web/heic-jpeg-converter.d.ts.map +1 -0
- package/dist/web/heic-jpeg-converter.js +76 -0
- package/dist/web/heic-jpeg-converter.js.map +1 -0
- package/dist/web/heic-jpeg-worker.d.ts +44 -0
- package/dist/web/heic-jpeg-worker.d.ts.map +1 -0
- package/dist/web/heic-jpeg-worker.js +78 -0
- package/dist/web/heic-jpeg-worker.js.map +1 -0
- package/dist/web/ports/config-port.d.ts +2 -0
- package/dist/web/ports/config-port.d.ts.map +1 -1
- package/dist/web/ports/cron-port.d.ts +9 -0
- package/dist/web/ports/cron-port.d.ts.map +1 -0
- package/dist/web/ports/cron-port.js +6 -0
- package/dist/web/ports/cron-port.js.map +1 -0
- package/dist/web/ports/index.d.ts +1 -0
- package/dist/web/ports/index.d.ts.map +1 -1
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.b0534652.js +38 -0
- package/dist/web/public/app.b0534652.js.br +0 -0
- package/dist/web/public/app.b0534652.js.gz +0 -0
- package/dist/web/public/{constants.1c779517.js → constants.5b18ed64.js} +65 -0
- package/dist/web/public/constants.5b18ed64.js.br +0 -0
- package/dist/web/public/constants.5b18ed64.js.gz +0 -0
- package/dist/web/public/cron-ui.js +328 -0
- package/dist/web/public/cron-ui.js.br +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
- package/dist/web/public/index.html +296 -25
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.63794d0b.js +1 -0
- package/dist/web/public/input-cjk.63794d0b.js.br +0 -0
- package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.3f91acef.js.gz +0 -0
- package/dist/web/public/mobile-handlers.b5a667ef.js.gz +0 -0
- package/dist/web/public/mobile.0644e3ac.css +1 -0
- package/dist/web/public/mobile.0644e3ac.css.br +0 -0
- package/dist/web/public/mobile.0644e3ac.css.gz +0 -0
- package/dist/web/public/notification-manager.ca9dc40d.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.772e92c9.js → panels-ui.ca03853f.js} +25 -17
- package/dist/web/public/panels-ui.ca03853f.js.br +0 -0
- package/dist/web/public/panels-ui.ca03853f.js.gz +0 -0
- package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
- package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
- package/dist/web/public/respawn-ui.2d249da9.js.gz +0 -0
- package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
- package/dist/web/public/session-ui.b51814ef.js +49 -0
- package/dist/web/public/session-ui.b51814ef.js.br +0 -0
- package/dist/web/public/session-ui.b51814ef.js.gz +0 -0
- package/dist/web/public/settings-ui.6c67c125.js +67 -0
- package/dist/web/public/settings-ui.6c67c125.js.br +0 -0
- package/dist/web/public/settings-ui.6c67c125.js.gz +0 -0
- package/dist/web/public/styles.e1ba7849.css +1 -0
- package/dist/web/public/styles.e1ba7849.css.br +0 -0
- package/dist/web/public/styles.e1ba7849.css.gz +0 -0
- package/dist/web/public/subagent-windows.69b60c35.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/terminal-ui.dbf141fa.js +3 -0
- package/dist/web/public/terminal-ui.dbf141fa.js.br +0 -0
- package/dist/web/public/terminal-ui.dbf141fa.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
- package/dist/web/routes/case-routes.d.ts.map +1 -1
- package/dist/web/routes/case-routes.js +115 -1
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/cron-routes.d.ts +11 -0
- package/dist/web/routes/cron-routes.d.ts.map +1 -0
- package/dist/web/routes/cron-routes.js +70 -0
- package/dist/web/routes/cron-routes.js.map +1 -0
- package/dist/web/routes/index.d.ts +1 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +1 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/respawn-routes.d.ts.map +1 -1
- package/dist/web/routes/respawn-routes.js +3 -0
- package/dist/web/routes/respawn-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +614 -68
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/system-routes.d.ts.map +1 -1
- package/dist/web/routes/system-routes.js +5 -0
- package/dist/web/routes/system-routes.js.map +1 -1
- package/dist/web/routes/ws-routes.d.ts.map +1 -1
- package/dist/web/routes/ws-routes.js +56 -17
- package/dist/web/routes/ws-routes.js.map +1 -1
- package/dist/web/schemas.d.ts +117 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +168 -1
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +9 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +82 -13
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-listener-wiring.d.ts +5 -1
- package/dist/web/session-listener-wiring.d.ts.map +1 -1
- package/dist/web/session-listener-wiring.js +23 -1
- package/dist/web/session-listener-wiring.js.map +1 -1
- package/dist/web/sse-events.d.ts +15 -0
- package/dist/web/sse-events.d.ts.map +1 -1
- package/dist/web/sse-events.js +17 -0
- package/dist/web/sse-events.js.map +1 -1
- package/dist/web/ws-connection-registry.d.ts +77 -0
- package/dist/web/ws-connection-registry.d.ts.map +1 -0
- package/dist/web/ws-connection-registry.js +99 -0
- package/dist/web/ws-connection-registry.js.map +1 -0
- package/package.json +3 -1
- package/dist/web/public/app.a8d73c32.js +0 -38
- package/dist/web/public/app.a8d73c32.js.br +0 -0
- package/dist/web/public/app.a8d73c32.js.gz +0 -0
- package/dist/web/public/constants.1c779517.js.br +0 -0
- package/dist/web/public/constants.1c779517.js.gz +0 -0
- package/dist/web/public/input-cjk.4e950e0a.js +0 -1
- package/dist/web/public/input-cjk.4e950e0a.js.br +0 -0
- package/dist/web/public/input-cjk.4e950e0a.js.gz +0 -0
- package/dist/web/public/mobile.8a9aff7a.css +0 -1
- package/dist/web/public/mobile.8a9aff7a.css.br +0 -0
- package/dist/web/public/mobile.8a9aff7a.css.gz +0 -0
- package/dist/web/public/panels-ui.772e92c9.js.br +0 -0
- package/dist/web/public/panels-ui.772e92c9.js.gz +0 -0
- package/dist/web/public/session-ui.da3e53f2.js +0 -36
- package/dist/web/public/session-ui.da3e53f2.js.br +0 -0
- package/dist/web/public/session-ui.da3e53f2.js.gz +0 -0
- package/dist/web/public/settings-ui.38feb956.js +0 -61
- package/dist/web/public/settings-ui.38feb956.js.br +0 -0
- package/dist/web/public/settings-ui.38feb956.js.gz +0 -0
- package/dist/web/public/styles.1b3e6147.css +0 -1
- package/dist/web/public/styles.1b3e6147.css.br +0 -0
- package/dist/web/public/styles.1b3e6147.css.gz +0 -0
- package/dist/web/public/terminal-ui.865f21f6.js +0 -3
- package/dist/web/public/terminal-ui.865f21f6.js.br +0 -0
- package/dist/web/public/terminal-ui.865f21f6.js.gz +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pure next-run-time calculations for the cron.
|
|
3
|
+
*
|
|
4
|
+
* All functions are pure and take an explicit `after` timestamp (epoch ms) so
|
|
5
|
+
* they are deterministic and unit-testable. Times use the SERVER'S LOCAL
|
|
6
|
+
* timezone for v0.1 (per the build brief) — daily/weekly wall-clock times are
|
|
7
|
+
* interpreted via the host's local time.
|
|
8
|
+
*/
|
|
9
|
+
import type { CronJob } from '../types/cron.js';
|
|
10
|
+
/** Parse an 'HH:MM' (24-hour) string into hours/minutes, or null if invalid. */
|
|
11
|
+
export declare function parseHHMM(value: string | undefined): {
|
|
12
|
+
hours: number;
|
|
13
|
+
minutes: number;
|
|
14
|
+
} | null;
|
|
15
|
+
/**
|
|
16
|
+
* Compute the next fire time strictly relevant to `after`, or null if the job
|
|
17
|
+
* has no future run (e.g. a completed one-time job, or invalid config).
|
|
18
|
+
*
|
|
19
|
+
* For `once`, returns the absolute `runAt` (even if already in the past, so a
|
|
20
|
+
* missed one-time job still fires once) until it has `completedOnce`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function computeNextRunAt(job: CronJob, after: number): number | null;
|
|
23
|
+
/**
|
|
24
|
+
* Duplicate-launch guard key: identifies a specific due time for a job. The
|
|
25
|
+
* cron records the key it last consumed so an overlapping or restarted
|
|
26
|
+
* loop will not launch the same due time twice.
|
|
27
|
+
*/
|
|
28
|
+
export declare function dueKeyFor(jobId: string, fireTime: number): string;
|
|
29
|
+
//# sourceMappingURL=cron-time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-time.d.ts","sourceRoot":"","sources":["../../src/cron/cron-time.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQ9F;AAaD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgC3E;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pure next-run-time calculations for the cron.
|
|
3
|
+
*
|
|
4
|
+
* All functions are pure and take an explicit `after` timestamp (epoch ms) so
|
|
5
|
+
* they are deterministic and unit-testable. Times use the SERVER'S LOCAL
|
|
6
|
+
* timezone for v0.1 (per the build brief) — daily/weekly wall-clock times are
|
|
7
|
+
* interpreted via the host's local time.
|
|
8
|
+
*/
|
|
9
|
+
/** Parse an 'HH:MM' (24-hour) string into hours/minutes, or null if invalid. */
|
|
10
|
+
export function parseHHMM(value) {
|
|
11
|
+
if (!value)
|
|
12
|
+
return null;
|
|
13
|
+
const m = /^(\d{1,2}):(\d{2})$/.exec(value.trim());
|
|
14
|
+
if (!m)
|
|
15
|
+
return null;
|
|
16
|
+
const hours = Number(m[1]);
|
|
17
|
+
const minutes = Number(m[2]);
|
|
18
|
+
if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59)
|
|
19
|
+
return null;
|
|
20
|
+
return { hours, minutes };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns the epoch-ms timestamp for `hours:minutes` (local time) on the day of
|
|
24
|
+
* `base`, shifted by `dayOffset` days.
|
|
25
|
+
*/
|
|
26
|
+
function atLocalTime(base, hours, minutes, dayOffset) {
|
|
27
|
+
const d = new Date(base);
|
|
28
|
+
d.setHours(hours, minutes, 0, 0);
|
|
29
|
+
d.setDate(d.getDate() + dayOffset);
|
|
30
|
+
return d.getTime();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compute the next fire time strictly relevant to `after`, or null if the job
|
|
34
|
+
* has no future run (e.g. a completed one-time job, or invalid config).
|
|
35
|
+
*
|
|
36
|
+
* For `once`, returns the absolute `runAt` (even if already in the past, so a
|
|
37
|
+
* missed one-time job still fires once) until it has `completedOnce`.
|
|
38
|
+
*/
|
|
39
|
+
export function computeNextRunAt(job, after) {
|
|
40
|
+
switch (job.scheduleType) {
|
|
41
|
+
case 'once': {
|
|
42
|
+
if (job.completedOnce)
|
|
43
|
+
return null;
|
|
44
|
+
return typeof job.runAt === 'number' ? job.runAt : null;
|
|
45
|
+
}
|
|
46
|
+
case 'interval': {
|
|
47
|
+
const minutes = job.intervalMinutes;
|
|
48
|
+
if (!minutes || minutes <= 0)
|
|
49
|
+
return null;
|
|
50
|
+
return after + minutes * 60_000;
|
|
51
|
+
}
|
|
52
|
+
case 'daily': {
|
|
53
|
+
const t = parseHHMM(job.dailyTime);
|
|
54
|
+
if (!t)
|
|
55
|
+
return null;
|
|
56
|
+
let next = atLocalTime(after, t.hours, t.minutes, 0);
|
|
57
|
+
if (next <= after)
|
|
58
|
+
next = atLocalTime(after, t.hours, t.minutes, 1);
|
|
59
|
+
return next;
|
|
60
|
+
}
|
|
61
|
+
case 'weekly': {
|
|
62
|
+
const t = parseHHMM(job.weeklyTime);
|
|
63
|
+
if (!t)
|
|
64
|
+
return null;
|
|
65
|
+
const days = (job.weeklyDays ?? []).filter((d) => d >= 0 && d <= 6);
|
|
66
|
+
if (days.length === 0)
|
|
67
|
+
return null;
|
|
68
|
+
for (let offset = 0; offset <= 7; offset++) {
|
|
69
|
+
const cand = atLocalTime(after, t.hours, t.minutes, offset);
|
|
70
|
+
if (cand > after && days.includes(new Date(cand).getDay()))
|
|
71
|
+
return cand;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
default:
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Duplicate-launch guard key: identifies a specific due time for a job. The
|
|
81
|
+
* cron records the key it last consumed so an overlapping or restarted
|
|
82
|
+
* loop will not launch the same due time twice.
|
|
83
|
+
*/
|
|
84
|
+
export function dueKeyFor(jobId, fireTime) {
|
|
85
|
+
return `${jobId}:${fireTime}`;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=cron-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-time.js","sourceRoot":"","sources":["../../src/cron/cron-time.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export interface ThumbnailResult {
|
|
5
5
|
content: Buffer;
|
|
6
|
-
contentType:
|
|
6
|
+
contentType: string;
|
|
7
7
|
}
|
|
8
8
|
export declare function generateFirstPageThumbnail(filePath: string, extension: string): Promise<ThumbnailResult | null>;
|
|
9
9
|
//# sourceMappingURL=document-thumbnailer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-thumbnailer.d.ts","sourceRoot":"","sources":["../src/document-thumbnailer.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"document-thumbnailer.d.ts","sourceRoot":"","sources":["../src/document-thumbnailer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAwBrH"}
|
|
@@ -10,12 +10,21 @@ import { getOfficePreviewPdfPath } from './document-preview-cache.js';
|
|
|
10
10
|
import { runWithConversionLimit } from './document-conversion-limiter.js';
|
|
11
11
|
const execFileAsync = promisify(execFile);
|
|
12
12
|
const THUMBNAIL_CONVERSION_TIMEOUT_MS = 5 * 60_000;
|
|
13
|
+
/** Browser-renderable image formats served as-is (no conversion). */
|
|
14
|
+
const IMAGE_PASSTHROUGH_CONTENT_TYPES = {
|
|
15
|
+
png: 'image/png',
|
|
16
|
+
jpg: 'image/jpeg',
|
|
17
|
+
jpeg: 'image/jpeg',
|
|
18
|
+
gif: 'image/gif',
|
|
19
|
+
webp: 'image/webp',
|
|
20
|
+
};
|
|
13
21
|
export async function generateFirstPageThumbnail(filePath, extension) {
|
|
14
22
|
const ext = extension.toLowerCase().replace(/^\./, '');
|
|
15
23
|
try {
|
|
16
24
|
await fs.stat(filePath);
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
const passthroughContentType = IMAGE_PASSTHROUGH_CONTENT_TYPES[ext];
|
|
26
|
+
if (passthroughContentType) {
|
|
27
|
+
return { content: await fs.readFile(filePath), contentType: passthroughContentType };
|
|
19
28
|
}
|
|
20
29
|
if (ext === 'pdf') {
|
|
21
30
|
return renderPdfFirstPage(filePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-thumbnailer.js","sourceRoot":"","sources":["../src/document-thumbnailer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,+BAA+B,GAAG,CAAC,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"document-thumbnailer.js","sourceRoot":"","sources":["../src/document-thumbnailer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Codex generated-artifact attachment registration.
|
|
3
|
+
*
|
|
4
|
+
* Codex image generation prints paths such as `Saved to: file://...`. These
|
|
5
|
+
* paths are registered directly when they fall within allowed locations (the
|
|
6
|
+
* session workspace or the well-known Codex generated-artifact directories
|
|
7
|
+
* anchored at the user's home). The trust decision is made on the
|
|
8
|
+
* realpath-RESOLVED path so a symlink staged at an allowed location cannot
|
|
9
|
+
* smuggle an arbitrary host file past workspace confinement.
|
|
10
|
+
*/
|
|
11
|
+
import { type AttachmentRegistrationResult } from './attachment-registry.js';
|
|
12
|
+
export interface GeneratedArtifactRegistrationOptions {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
filePath: string;
|
|
15
|
+
sessionWorkingDir: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function registerGeneratedArtifactAttachment(options: GeneratedArtifactRegistrationOptions): Promise<AttachmentRegistrationResult>;
|
|
18
|
+
/**
|
|
19
|
+
* True when `filePath` (absolute; callers should pass the realpath-resolved
|
|
20
|
+
* path) is inside the session workspace or one of the well-known Codex
|
|
21
|
+
* generated-artifact directories under the current user's home. The marker
|
|
22
|
+
* directories are prefix-anchored to `os.homedir()` — a `.codex/...` subtree
|
|
23
|
+
* elsewhere on the filesystem does NOT qualify.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isAllowedGeneratedArtifactPath(filePath: string, workingDir: string): boolean;
|
|
26
|
+
//# sourceMappingURL=generated-artifact-attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-artifact-attachments.d.ts","sourceRoot":"","sources":["../src/generated-artifact-attachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAA8B,KAAK,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAEzG,MAAM,WAAW,oCAAoC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,4BAA4B,CAAC,CAevC;AAaD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAI5F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Codex generated-artifact attachment registration.
|
|
3
|
+
*
|
|
4
|
+
* Codex image generation prints paths such as `Saved to: file://...`. These
|
|
5
|
+
* paths are registered directly when they fall within allowed locations (the
|
|
6
|
+
* session workspace or the well-known Codex generated-artifact directories
|
|
7
|
+
* anchored at the user's home). The trust decision is made on the
|
|
8
|
+
* realpath-RESOLVED path so a symlink staged at an allowed location cannot
|
|
9
|
+
* smuggle an arbitrary host file past workspace confinement.
|
|
10
|
+
*/
|
|
11
|
+
import { realpathSync } from 'node:fs';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { join, normalize, sep } from 'node:path';
|
|
14
|
+
import { registerExternalAttachment } from './attachment-registry.js';
|
|
15
|
+
export async function registerGeneratedArtifactAttachment(options) {
|
|
16
|
+
// Decide trust on the symlink-resolved path. If it can't be resolved, fall
|
|
17
|
+
// back to the strict force-confined policy (registration will 404 a missing
|
|
18
|
+
// file anyway).
|
|
19
|
+
let forceWorkspaceConfinement = true;
|
|
20
|
+
try {
|
|
21
|
+
const resolvedPath = realpathSync(options.filePath);
|
|
22
|
+
forceWorkspaceConfinement = !isAllowedGeneratedArtifactPath(resolvedPath, options.sessionWorkingDir);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Keep force confinement.
|
|
26
|
+
}
|
|
27
|
+
return registerExternalAttachment(options.sessionId, options.filePath, {
|
|
28
|
+
sessionWorkingDir: options.sessionWorkingDir,
|
|
29
|
+
forceWorkspaceConfinement,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Well-known Codex generated-artifact directories, anchored at the user's home. */
|
|
33
|
+
function codexGeneratedDirs() {
|
|
34
|
+
const home = homedir();
|
|
35
|
+
return [
|
|
36
|
+
join(home, '.codex-personal', 'generated_images'),
|
|
37
|
+
join(home, '.codex', 'generated_images'),
|
|
38
|
+
join(home, '.codex-personal', 'generated_artifacts'),
|
|
39
|
+
join(home, '.codex', 'generated_artifacts'),
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* True when `filePath` (absolute; callers should pass the realpath-resolved
|
|
44
|
+
* path) is inside the session workspace or one of the well-known Codex
|
|
45
|
+
* generated-artifact directories under the current user's home. The marker
|
|
46
|
+
* directories are prefix-anchored to `os.homedir()` — a `.codex/...` subtree
|
|
47
|
+
* elsewhere on the filesystem does NOT qualify.
|
|
48
|
+
*/
|
|
49
|
+
export function isAllowedGeneratedArtifactPath(filePath, workingDir) {
|
|
50
|
+
const normalizedPath = normalize(filePath);
|
|
51
|
+
if (isPathInside(normalizedPath, workingDir))
|
|
52
|
+
return true;
|
|
53
|
+
return codexGeneratedDirs().some((dir) => isPathInside(normalizedPath, dir));
|
|
54
|
+
}
|
|
55
|
+
function isPathInside(filePath, rootPath) {
|
|
56
|
+
const normalizedRoot = normalize(rootPath);
|
|
57
|
+
if (filePath === normalizedRoot)
|
|
58
|
+
return true;
|
|
59
|
+
return filePath.startsWith(normalizedRoot.endsWith(sep) ? normalizedRoot : normalizedRoot + sep);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=generated-artifact-attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-artifact-attachments.js","sourceRoot":"","sources":["../src/generated-artifact-attachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,0BAA0B,EAAqC,MAAM,0BAA0B,CAAC;AAQzG,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,OAA6C;IAE7C,2EAA2E;IAC3E,4EAA4E;IAC5E,gBAAgB;IAChB,IAAI,yBAAyB,GAAG,IAAI,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpD,yBAAyB,GAAG,CAAC,8BAA8B,CAAC,YAAY,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvG,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,OAAO,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE;QACrE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,yBAAyB;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,oFAAoF;AACpF,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,kBAAkB,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,qBAAqB,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,qBAAqB,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAgB,EAAE,UAAkB;IACjF,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,QAAgB;IACtD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;AACnG,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,17 @@ import { program } from './cli.js';
|
|
|
11
11
|
// Detect if we're running the web server (long-lived process)
|
|
12
12
|
// In web mode, we should NOT exit on transient errors — log and continue
|
|
13
13
|
const isWebMode = process.argv.includes('web');
|
|
14
|
+
// COD-115: Codeman IS a tmux controller; it must never present as a tmux *client*.
|
|
15
|
+
// If the web server is launched from inside a tmux pane it inherits TMUX/TMUX_PANE,
|
|
16
|
+
// and tmux's nesting guard then kills every new attach-bridge PTY (exit 1 → respawn
|
|
17
|
+
// loop, crash-looping any new tmux-backed session). Scrub at the root so every
|
|
18
|
+
// downstream `{...process.env}` spread (attach, send-keys, create) is clean regardless
|
|
19
|
+
// of launch context. `delete` (not `= undefined`, which node-pty serializes as the
|
|
20
|
+
// literal string "undefined" and fails to clear).
|
|
21
|
+
if (isWebMode) {
|
|
22
|
+
delete process.env.TMUX;
|
|
23
|
+
delete process.env.TMUX_PANE;
|
|
24
|
+
}
|
|
14
25
|
import { MAX_CONSECUTIVE_ERRORS, ERROR_RESET_MS } from './config/server-timing.js';
|
|
15
26
|
// Track consecutive unhandled errors in web mode — restart after too many
|
|
16
27
|
let consecutiveErrors = 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,8DAA8D;AAC9D,yEAAyE;AACzE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEnF,0EAA0E;AAC1E,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAC1B,IAAI,eAAe,GAAyC,IAAI,CAAC;AAEjE,SAAS,UAAU;IACjB,iBAAiB,EAAE,CAAC;IACpB,IAAI,eAAe;QAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IACnD,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE;QAChC,iBAAiB,GAAG,CAAC,CAAC;IACxB,CAAC,EAAE,cAAc,CAAC,CAAC;IAEnB,IAAI,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,WAAW,sBAAsB,6DAA6D,CAAC,CAAC;QAC9G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACpF,UAAU,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,UAAU,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,UAAU;AACV,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,8DAA8D;AAC9D,yEAAyE;AACzE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAE/C,mFAAmF;AACnF,oFAAoF;AACpF,oFAAoF;AACpF,+EAA+E;AAC/E,uFAAuF;AACvF,mFAAmF;AACnF,kDAAkD;AAClD,IAAI,SAAS,EAAE,CAAC;IACd,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AAC/B,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEnF,0EAA0E;AAC1E,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAC1B,IAAI,eAAe,GAAyC,IAAI,CAAC;AAEjE,SAAS,UAAU;IACjB,iBAAiB,EAAE,CAAC;IACpB,IAAI,eAAe;QAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IACnD,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE;QAChC,iBAAiB,GAAG,CAAC,CAAC;IACxB,CAAC,EAAE,cAAc,CAAC,CAAC;IAEnB,IAAI,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,WAAW,sBAAsB,6DAA6D,CAAC,CAAC;QAC9G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACpF,UAAU,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,UAAU,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,UAAU;AACV,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/mux-interface.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @module mux-interface
|
|
7
7
|
*/
|
|
8
8
|
import type { EventEmitter } from 'node:events';
|
|
9
|
-
import type { ProcessStats, PersistedRespawnConfig, NiceConfig, ClaudeMode, SessionMode, OpenCodeConfig, CodexConfig, EffortLevel, GeminiConfig } from './types.js';
|
|
9
|
+
import type { ProcessStats, PersistedRespawnConfig, NiceConfig, ClaudeMode, SessionMode, OpenCodeConfig, CodexConfig, EffortLevel, GeminiConfig, SessionRemote } from './types.js';
|
|
10
10
|
/**
|
|
11
11
|
* Multiplexer session metadata.
|
|
12
12
|
*/
|
|
@@ -21,6 +21,8 @@ export interface MuxSession {
|
|
|
21
21
|
createdAt: number;
|
|
22
22
|
/** Working directory */
|
|
23
23
|
workingDir: string;
|
|
24
|
+
/** Remote execution metadata for local tmux sessions wrapping SSH */
|
|
25
|
+
remote?: SessionRemote;
|
|
24
26
|
/** Session mode */
|
|
25
27
|
mode: SessionMode;
|
|
26
28
|
/** Whether webserver is attached to this session */
|
|
@@ -58,6 +60,10 @@ export interface CreateSessionOptions {
|
|
|
58
60
|
envOverrides?: Record<string, string>;
|
|
59
61
|
/** Claude CLI effort level, injected as a `--settings` soft default (overridable via /effort in-session) */
|
|
60
62
|
effort?: EffortLevel;
|
|
63
|
+
/** tmux history-limit (scrollback lines) to set for this session. */
|
|
64
|
+
historyLimit?: number;
|
|
65
|
+
/** Remote execution metadata for local tmux sessions wrapping SSH */
|
|
66
|
+
remote?: SessionRemote;
|
|
61
67
|
}
|
|
62
68
|
/** Options for respawning a dead pane. */
|
|
63
69
|
export interface RespawnPaneOptions {
|
|
@@ -77,6 +83,23 @@ export interface RespawnPaneOptions {
|
|
|
77
83
|
envOverrides?: Record<string, string>;
|
|
78
84
|
/** Claude CLI effort level (preserved across respawns, injected via `--settings`) */
|
|
79
85
|
effort?: EffortLevel;
|
|
86
|
+
/** tmux history-limit (scrollback lines) to set for this session after respawn. */
|
|
87
|
+
historyLimit?: number;
|
|
88
|
+
/** Remote execution metadata for local tmux sessions wrapping SSH */
|
|
89
|
+
remote?: SessionRemote;
|
|
90
|
+
}
|
|
91
|
+
/** Options for pane buffer capture (COD-47 full-history mode). */
|
|
92
|
+
export interface PaneCaptureOptions {
|
|
93
|
+
/** Capture the entire tmux scrollback instead of just the visible frame. */
|
|
94
|
+
fullHistory?: boolean;
|
|
95
|
+
/** Bound the full-history capture to this many scrollback lines (`-S -<N>`). */
|
|
96
|
+
historyLimitLines?: number;
|
|
97
|
+
/**
|
|
98
|
+
* Byte cap the consumer will keep from the capture. Sizes the child-process
|
|
99
|
+
* stdout buffer (with slack) so multi-MB scrollback dumps aren't killed by
|
|
100
|
+
* the 1MB execSync default (ENOBUFS).
|
|
101
|
+
*/
|
|
102
|
+
maxCaptureBytes?: number;
|
|
80
103
|
}
|
|
81
104
|
/**
|
|
82
105
|
* Terminal multiplexer interface.
|
|
@@ -130,6 +153,8 @@ export interface TerminalMultiplexer extends EventEmitter {
|
|
|
130
153
|
clearRespawnConfig(sessionId: string): void;
|
|
131
154
|
/** Update Ralph enabled state for a session */
|
|
132
155
|
updateRalphEnabled(sessionId: string, enabled: boolean): void;
|
|
156
|
+
/** Apply a tmux history-limit to all tracked sessions. */
|
|
157
|
+
setHistoryLimit(limit: number): Promise<void>;
|
|
133
158
|
/**
|
|
134
159
|
* Reconcile tracked sessions with actual running sessions.
|
|
135
160
|
* Finds dead sessions and discovers unknown ones.
|
|
@@ -163,9 +188,16 @@ export interface TerminalMultiplexer extends EventEmitter {
|
|
|
163
188
|
isPaneDead(muxName: string): boolean;
|
|
164
189
|
/** Respawn a dead pane with a fresh command. Returns the new PID or null on failure. */
|
|
165
190
|
respawnPane(options: RespawnPaneOptions): Promise<number | null>;
|
|
166
|
-
/**
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
191
|
+
/**
|
|
192
|
+
* Capture a pane's current tmux buffer with ANSI escape codes preserved.
|
|
193
|
+
* Pass `{ fullHistory: true }` to capture the entire scrollback as linear
|
|
194
|
+
* text instead of just the visible single-screen frame (COD-47).
|
|
195
|
+
*/
|
|
196
|
+
capturePaneBuffer?(muxName: string, paneTarget?: string, opts?: PaneCaptureOptions): string | null;
|
|
197
|
+
/**
|
|
198
|
+
* Capture the active pane's current tmux buffer with ANSI escape codes preserved.
|
|
199
|
+
* Pass `{ fullHistory: true }` to capture the entire scrollback (COD-47).
|
|
200
|
+
*/
|
|
201
|
+
captureActivePaneBuffer?(muxName: string, opts?: PaneCaptureOptions): string | null;
|
|
170
202
|
}
|
|
171
203
|
//# sourceMappingURL=mux-interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mux-interface.d.ts","sourceRoot":"","sources":["../src/mux-interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,
|
|
1
|
+
{"version":3,"file":"mux-interface.d.ts","sourceRoot":"","sources":["../src/mux-interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { RemoteCase, RemoteHost, RemoteSshOptions, SessionMode, SessionRemote } from './types.js';
|
|
2
|
+
export declare function remoteHostsPath(configDir: string): string;
|
|
3
|
+
export declare function remoteCasesPath(configDir: string): string;
|
|
4
|
+
export declare function readRemoteHosts(configDir: string): Promise<RemoteHost[]>;
|
|
5
|
+
export declare function writeRemoteHosts(configDir: string, hosts: RemoteHost[]): Promise<void>;
|
|
6
|
+
export declare function readRemoteCases(configDir: string): Promise<RemoteCase[]>;
|
|
7
|
+
export declare function writeRemoteCases(configDir: string, cases: RemoteCase[]): Promise<void>;
|
|
8
|
+
export declare function defaultRemoteCommandForMode(mode: SessionMode): string;
|
|
9
|
+
export declare function remoteSshTarget(host: Pick<RemoteHost, 'username' | 'host'>): string;
|
|
10
|
+
/**
|
|
11
|
+
* COD-107 — build the ordered, shell-safe ssh CONNECTION tokens shared by both
|
|
12
|
+
* the durable-launch command (`buildRemoteLaunchCommand`) and the tmux
|
|
13
|
+
* prerequisite probe (`buildRemoteTmuxCheckCommand`), so the prereq check and
|
|
14
|
+
* the real launch connect with IDENTICAL options (they can't drift).
|
|
15
|
+
*
|
|
16
|
+
* Returns the leading tokens of an ssh command line (NOT including `-t`, the
|
|
17
|
+
* target, or any remote command). Order:
|
|
18
|
+
* ssh -o BatchMode=yes
|
|
19
|
+
* [-o ConnectTimeout=10] (default; suppressed if extraSshOptions sets it)
|
|
20
|
+
* [-p <port>]
|
|
21
|
+
* [-i <abs-identity>] (~/$HOME expanded, then shellescaped)
|
|
22
|
+
* [-J <jumpHost>] (shellescaped, single token)
|
|
23
|
+
* [-o ProxyCommand=nc -X 5 -x <socks> %h %p] (ONE shellescaped -o token)
|
|
24
|
+
* [-o <KEY=VALUE>] … (each extra option, shellescaped)
|
|
25
|
+
*
|
|
26
|
+
* Escaping notes (the risky part):
|
|
27
|
+
* - The ProxyCommand is emitted as a single shellescaped `-o KEY=VALUE`, so the
|
|
28
|
+
* whole value (spaces + `%h`/`%p`) reaches ssh as one argument and `%h %p`
|
|
29
|
+
* survive verbatim — ssh expands them to the real host/port, not the shell.
|
|
30
|
+
* - A default `-o ConnectTimeout=10` bounds the wait on an unreachable/blackholed
|
|
31
|
+
* host (else the pane hangs on the OS TCP timeout). It is omitted when the
|
|
32
|
+
* operator already set ConnectTimeout via extraSshOptions, so their value wins.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildSshConnectionArgs(remote: RemoteSshOptions & Pick<RemoteHost, 'port'>): string[];
|
|
35
|
+
/**
|
|
36
|
+
* COD-104 — build the SSH command that checks the remote host has tmux.
|
|
37
|
+
*
|
|
38
|
+
* Durable remote sessions run the agent inside a tmux server ON the remote host
|
|
39
|
+
* (`tmux -L codeman new-session -A …`), so tmux is now a hard prerequisite there.
|
|
40
|
+
* `command -v tmux` exits 0 (and prints the path) when tmux is installed.
|
|
41
|
+
*
|
|
42
|
+
* COD-107 — connects with the SAME options as the real launch
|
|
43
|
+
* (`buildSshConnectionArgs`) so a proxied/custom-port/identity host that the
|
|
44
|
+
* launch can reach also passes the prereq probe (and vice-versa).
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildRemoteTmuxCheckCommand(host: Pick<RemoteHost, 'username' | 'host' | 'port'> & RemoteSshOptions): string;
|
|
47
|
+
export interface RemoteTmuxCheckResult {
|
|
48
|
+
ok: boolean;
|
|
49
|
+
/** Resolved tmux path on the remote (when ok). */
|
|
50
|
+
tmuxPath?: string;
|
|
51
|
+
/** Human-readable failure reason (when !ok). */
|
|
52
|
+
error?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* COD-104 — verify the remote host has tmux installed (required for durable
|
|
56
|
+
* remote sessions). Returns a structured result with a clear, user-facing error
|
|
57
|
+
* when tmux is missing or the host is unreachable. Never throws.
|
|
58
|
+
*/
|
|
59
|
+
export declare function checkRemoteTmuxAvailable(host: Pick<RemoteHost, 'username' | 'host' | 'port'> & RemoteSshOptions): Promise<RemoteTmuxCheckResult>;
|
|
60
|
+
export declare function remoteDisplayPath(remote: Pick<SessionRemote, 'username' | 'host' | 'remotePath'> | {
|
|
61
|
+
username: string;
|
|
62
|
+
host: string;
|
|
63
|
+
path: string;
|
|
64
|
+
}): string;
|
|
65
|
+
export declare function toSessionRemote(host: RemoteHost, remoteCase: RemoteCase): SessionRemote;
|
|
66
|
+
//# sourceMappingURL=remote-hosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-hosts.d.ts","sourceRoot":"","sources":["../src/remote-hosts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAOpB,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAiBD,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAE9E;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5F;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAE9E;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAYrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG,MAAM,CAEnF;AA0BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAcpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,gBAAgB,GACtE,MAAM,CAGR;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,gBAAgB,GACtE,OAAO,CAAC,qBAAqB,CAAC,CA4BhC;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjH,MAAM,CAGR;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,aAAa,CAgBvF"}
|