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
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import { MAX_INPUT_LENGTH } from '../../config/terminal-limits.js';
|
|
32
32
|
import { isAllowedRequestHost, isAllowedRequestOrigin } from '../network-auth-policy.js';
|
|
33
|
+
import { WsConnectionRegistry } from '../ws-connection-registry.js';
|
|
33
34
|
/** Micro-batch interval for terminal output (ms). Short enough for low latency,
|
|
34
35
|
* long enough to group Ink's rapid cursor-up redraw sequences into single frames. */
|
|
35
36
|
const WS_BATCH_INTERVAL_MS = 8;
|
|
@@ -48,8 +49,14 @@ const DEC_2026_START = '\x1b[?2026h';
|
|
|
48
49
|
const DEC_2026_END = '\x1b[?2026l';
|
|
49
50
|
/** Max concurrent WS connections per session. Prevents listener/bandwidth multiplication. */
|
|
50
51
|
const MAX_WS_PER_SESSION = 5;
|
|
51
|
-
/**
|
|
52
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Track live WS connections per session, keyed by clientId (COD-137).
|
|
54
|
+
* Replaces a bare counter that over-counted across the async-close gap on
|
|
55
|
+
* reconnect (spurious 4008). A same-`cid` reconnect supersedes its own socket
|
|
56
|
+
* (reclaims the slot) instead of consuming a new one; cid-less upgrades are
|
|
57
|
+
* admitted anonymously up to the cap. See ws-connection-registry.ts.
|
|
58
|
+
*/
|
|
59
|
+
const sessionWsRegistry = new WsConnectionRegistry(MAX_WS_PER_SESSION);
|
|
53
60
|
export function registerWsRoutes(app, ctx, getHostPolicy) {
|
|
54
61
|
app.get('/ws/sessions/:id/terminal', { websocket: true }, (socket, req) => {
|
|
55
62
|
// Reject cross-site WebSocket hijacking (CSWSH) and DNS-rebinding before doing
|
|
@@ -68,15 +75,40 @@ export function registerWsRoutes(app, ctx, getHostPolicy) {
|
|
|
68
75
|
socket.close(4004, 'Session not found');
|
|
69
76
|
return;
|
|
70
77
|
}
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
// Structured transport logging — surfaces WS open/close/timeout churn so the
|
|
79
|
+
// tunnel-flap behavior (COD-134) is observable in the server logs. Fastify is
|
|
80
|
+
// configured logger:false, so we log via console (→ journald under systemd).
|
|
81
|
+
// Enforce per-session connection limit, scoped by clientId. A same-cid
|
|
82
|
+
// reconnect reclaims its own slot (registry evicts the stale socket), so a
|
|
83
|
+
// drop+reconnect burst can no longer over-count across the async-close gap
|
|
84
|
+
// and trip a spurious 4008. cid-less upgrades are admitted anonymously.
|
|
85
|
+
const cid = typeof req.query?.cid === 'string' && req.query.cid.length > 0 ? req.query.cid : null;
|
|
86
|
+
const { admitted, evictedSocket } = sessionWsRegistry.register(id, cid, socket);
|
|
87
|
+
if (!admitted) {
|
|
88
|
+
console.warn('[ws] terminal rejected: too many connections', {
|
|
89
|
+
sessionId: id,
|
|
90
|
+
wsCount: sessionWsRegistry.liveCount(id),
|
|
91
|
+
});
|
|
74
92
|
socket.close(4008, 'Too many connections');
|
|
75
93
|
return;
|
|
76
94
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
95
|
+
if (evictedSocket) {
|
|
96
|
+
// Same client reconnected; retire the stale socket so it doesn't linger.
|
|
97
|
+
console.info('[ws] terminal superseded by reconnect', { sessionId: id });
|
|
98
|
+
try {
|
|
99
|
+
evictedSocket.close(4010, 'Superseded by reconnect');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
/* socket may already be closing */
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
console.info('[ws] terminal open', { sessionId: id, wsCount: sessionWsRegistry.liveCount(id) });
|
|
106
|
+
// Eagerly free the slot on error/terminate — don't wait for the async
|
|
107
|
+
// 'close' (idempotent with the 'close' handler below). This is what kills
|
|
108
|
+
// the reconnect over-count: the slot is released the instant the socket dies.
|
|
109
|
+
socket.on('error', () => {
|
|
110
|
+
sessionWsRegistry.unregister(id, socket);
|
|
111
|
+
});
|
|
80
112
|
// Per-connection micro-batch state
|
|
81
113
|
let batchChunks = [];
|
|
82
114
|
let batchSize = 0;
|
|
@@ -203,10 +235,14 @@ export function registerWsRoutes(app, ctx, getHostPolicy) {
|
|
|
203
235
|
return;
|
|
204
236
|
socket.ping();
|
|
205
237
|
pongTimeout = setTimeout(() => {
|
|
238
|
+
console.warn('[ws] terminal ping timeout — terminating', { sessionId: id });
|
|
239
|
+
// Free the slot eagerly — terminate()'s 'close' may lag, and a client
|
|
240
|
+
// reconnecting after a stale-connection drop must not be over-counted.
|
|
241
|
+
sessionWsRegistry.unregister(id, socket);
|
|
206
242
|
socket.terminate();
|
|
207
243
|
}, WS_PONG_TIMEOUT_MS);
|
|
208
244
|
}, WS_PING_INTERVAL_MS);
|
|
209
|
-
socket.on('close', () => {
|
|
245
|
+
socket.on('close', (code, reason) => {
|
|
210
246
|
clearInterval(pingInterval);
|
|
211
247
|
if (pongTimeout)
|
|
212
248
|
clearTimeout(pongTimeout);
|
|
@@ -218,14 +254,17 @@ export function registerWsRoutes(app, ctx, getHostPolicy) {
|
|
|
218
254
|
session.off('needsRefresh', onNeedsRefresh);
|
|
219
255
|
session.off('exit', onSessionExit);
|
|
220
256
|
session.releaseDesktopSizing(sizingToken);
|
|
221
|
-
//
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
257
|
+
// Release this socket's slot. Idempotent and identity-matched: if this
|
|
258
|
+
// socket was already superseded (a same-cid reconnect took its slot) or
|
|
259
|
+
// eagerly unregistered on terminate/error, this is a no-op and the
|
|
260
|
+
// reconnected socket keeps the slot.
|
|
261
|
+
sessionWsRegistry.unregister(id, socket);
|
|
262
|
+
console.info('[ws] terminal close', {
|
|
263
|
+
sessionId: id,
|
|
264
|
+
code,
|
|
265
|
+
reason: String(reason),
|
|
266
|
+
wsCount: sessionWsRegistry.liveCount(id),
|
|
267
|
+
});
|
|
229
268
|
});
|
|
230
269
|
});
|
|
231
270
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAmB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"ws-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"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"}
|
package/dist/web/schemas.d.ts
CHANGED
|
@@ -113,6 +113,29 @@ export declare const CreateCaseSchema: z.ZodObject<{
|
|
|
113
113
|
name: z.ZodString;
|
|
114
114
|
description: z.ZodOptional<z.ZodString>;
|
|
115
115
|
}, z.core.$strip>;
|
|
116
|
+
export declare const RemoteHostSchema: z.ZodObject<{
|
|
117
|
+
id: z.ZodString;
|
|
118
|
+
label: z.ZodString;
|
|
119
|
+
host: z.ZodString;
|
|
120
|
+
username: z.ZodString;
|
|
121
|
+
port: z.ZodOptional<z.ZodNumber>;
|
|
122
|
+
identityFile: z.ZodOptional<z.ZodString>;
|
|
123
|
+
socksProxy: z.ZodOptional<z.ZodString>;
|
|
124
|
+
jumpHost: z.ZodOptional<z.ZodString>;
|
|
125
|
+
extraSshOptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
126
|
+
commands: z.ZodOptional<z.ZodObject<{
|
|
127
|
+
shell: z.ZodOptional<z.ZodString>;
|
|
128
|
+
claude: z.ZodOptional<z.ZodString>;
|
|
129
|
+
opencode: z.ZodOptional<z.ZodString>;
|
|
130
|
+
codex: z.ZodOptional<z.ZodString>;
|
|
131
|
+
gemini: z.ZodOptional<z.ZodString>;
|
|
132
|
+
}, z.core.$strict>>;
|
|
133
|
+
}, z.core.$strip>;
|
|
134
|
+
export declare const RemoteCaseLinkSchema: z.ZodObject<{
|
|
135
|
+
name: z.ZodString;
|
|
136
|
+
hostId: z.ZodString;
|
|
137
|
+
remotePath: z.ZodString;
|
|
138
|
+
}, z.core.$strip>;
|
|
116
139
|
/**
|
|
117
140
|
* Schema for POST /api/quick-start
|
|
118
141
|
* Creates case (if needed) and starts interactive session.
|
|
@@ -282,6 +305,10 @@ export declare const SettingsUpdateSchema: z.ZodObject<{
|
|
|
282
305
|
claudeMode: z.ZodOptional<z.ZodString>;
|
|
283
306
|
allowedTools: z.ZodOptional<z.ZodString>;
|
|
284
307
|
codexDangerouslyBypassApprovals: z.ZodOptional<z.ZodBoolean>;
|
|
308
|
+
terminalScrollbackLines: z.ZodOptional<z.ZodNumber>;
|
|
309
|
+
tmuxHistoryLimit: z.ZodOptional<z.ZodNumber>;
|
|
310
|
+
terminalBufferMaxBytes: z.ZodOptional<z.ZodNumber>;
|
|
311
|
+
terminalBufferTrimBytes: z.ZodOptional<z.ZodNumber>;
|
|
285
312
|
nice: z.ZodOptional<z.ZodObject<{
|
|
286
313
|
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
287
314
|
niceValue: z.ZodOptional<z.ZodNumber>;
|
|
@@ -452,6 +479,92 @@ export declare const ScheduledRunSchema: z.ZodObject<{
|
|
|
452
479
|
workingDir: z.ZodOptional<z.ZodString>;
|
|
453
480
|
durationMinutes: z.ZodOptional<z.ZodNumber>;
|
|
454
481
|
}, z.core.$strip>;
|
|
482
|
+
/** POST /api/cron/jobs — full job definition. */
|
|
483
|
+
export declare const CronJobSchema: z.ZodObject<{
|
|
484
|
+
name: z.ZodString;
|
|
485
|
+
agentType: z.ZodEnum<{
|
|
486
|
+
claude: "claude";
|
|
487
|
+
shell: "shell";
|
|
488
|
+
opencode: "opencode";
|
|
489
|
+
codex: "codex";
|
|
490
|
+
gemini: "gemini";
|
|
491
|
+
}>;
|
|
492
|
+
workingDir: z.ZodString;
|
|
493
|
+
launchCommand: z.ZodOptional<z.ZodString>;
|
|
494
|
+
promptMode: z.ZodEnum<{
|
|
495
|
+
inline_text: "inline_text";
|
|
496
|
+
prompt_file_path: "prompt_file_path";
|
|
497
|
+
}>;
|
|
498
|
+
promptText: z.ZodOptional<z.ZodString>;
|
|
499
|
+
promptFilePath: z.ZodOptional<z.ZodString>;
|
|
500
|
+
inputMode: z.ZodEnum<{
|
|
501
|
+
paste: "paste";
|
|
502
|
+
typed: "typed";
|
|
503
|
+
}>;
|
|
504
|
+
scheduleType: z.ZodEnum<{
|
|
505
|
+
interval: "interval";
|
|
506
|
+
once: "once";
|
|
507
|
+
daily: "daily";
|
|
508
|
+
weekly: "weekly";
|
|
509
|
+
}>;
|
|
510
|
+
runAt: z.ZodOptional<z.ZodNumber>;
|
|
511
|
+
intervalMinutes: z.ZodOptional<z.ZodNumber>;
|
|
512
|
+
dailyTime: z.ZodOptional<z.ZodString>;
|
|
513
|
+
weeklyDays: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
|
|
514
|
+
weeklyTime: z.ZodOptional<z.ZodString>;
|
|
515
|
+
enabled: z.ZodBoolean;
|
|
516
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
517
|
+
concurrencyPolicy: z.ZodEnum<{
|
|
518
|
+
warn_only: "warn_only";
|
|
519
|
+
skip_if_same_agent_running: "skip_if_same_agent_running";
|
|
520
|
+
}>;
|
|
521
|
+
autoClosePreviousSession: z.ZodOptional<z.ZodBoolean>;
|
|
522
|
+
}, z.core.$strip>;
|
|
523
|
+
/** PUT /api/cron/jobs/:id — partial update. */
|
|
524
|
+
export declare const CronJobUpdateSchema: z.ZodObject<{
|
|
525
|
+
name: z.ZodOptional<z.ZodString>;
|
|
526
|
+
agentType: z.ZodOptional<z.ZodEnum<{
|
|
527
|
+
claude: "claude";
|
|
528
|
+
shell: "shell";
|
|
529
|
+
opencode: "opencode";
|
|
530
|
+
codex: "codex";
|
|
531
|
+
gemini: "gemini";
|
|
532
|
+
}>>;
|
|
533
|
+
workingDir: z.ZodOptional<z.ZodString>;
|
|
534
|
+
launchCommand: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
535
|
+
promptMode: z.ZodOptional<z.ZodEnum<{
|
|
536
|
+
inline_text: "inline_text";
|
|
537
|
+
prompt_file_path: "prompt_file_path";
|
|
538
|
+
}>>;
|
|
539
|
+
promptText: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
540
|
+
promptFilePath: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
541
|
+
inputMode: z.ZodOptional<z.ZodEnum<{
|
|
542
|
+
paste: "paste";
|
|
543
|
+
typed: "typed";
|
|
544
|
+
}>>;
|
|
545
|
+
scheduleType: z.ZodOptional<z.ZodEnum<{
|
|
546
|
+
interval: "interval";
|
|
547
|
+
once: "once";
|
|
548
|
+
daily: "daily";
|
|
549
|
+
weekly: "weekly";
|
|
550
|
+
}>>;
|
|
551
|
+
runAt: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
552
|
+
intervalMinutes: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
553
|
+
dailyTime: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
554
|
+
weeklyDays: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodNumber>>>;
|
|
555
|
+
weeklyTime: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
556
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
557
|
+
notes: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
558
|
+
concurrencyPolicy: z.ZodOptional<z.ZodEnum<{
|
|
559
|
+
warn_only: "warn_only";
|
|
560
|
+
skip_if_same_agent_running: "skip_if_same_agent_running";
|
|
561
|
+
}>>;
|
|
562
|
+
autoClosePreviousSession: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
|
|
563
|
+
}, z.core.$strip>;
|
|
564
|
+
/** PUT /api/cron/jobs/:id/enabled */
|
|
565
|
+
export declare const CronJobEnabledSchema: z.ZodObject<{
|
|
566
|
+
enabled: z.ZodBoolean;
|
|
567
|
+
}, z.core.$strip>;
|
|
455
568
|
/** POST /api/cases/link */
|
|
456
569
|
export declare const LinkCaseSchema: z.ZodObject<{
|
|
457
570
|
name: z.ZodString;
|
|
@@ -526,6 +639,10 @@ export declare const SubagentWindowStatesSchema: z.ZodObject<{
|
|
|
526
639
|
}, z.core.$loose>;
|
|
527
640
|
/** PUT /api/subagent-parents */
|
|
528
641
|
export declare const SubagentParentMapSchema: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
642
|
+
/** POST /api/sessions/:id/interactive */
|
|
643
|
+
export declare const InteractiveStartSchema: z.ZodObject<{
|
|
644
|
+
clearBreaker: z.ZodOptional<z.ZodBoolean>;
|
|
645
|
+
}, z.core.$strip>;
|
|
529
646
|
/** POST /api/sessions/:id/interactive-respawn */
|
|
530
647
|
export declare const InteractiveRespawnSchema: z.ZodObject<{
|
|
531
648
|
respawnConfig: z.ZodOptional<z.ZodObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/web/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/web/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/web/schemas.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { z } from 'zod';
|
|
10
10
|
import { SAFE_PATH_PATTERN, isSafePushEndpoint } from '../utils/index.js';
|
|
11
|
+
import { MAX_TERMINAL_BUFFER_BYTES, MAX_TERMINAL_SCROLLBACK_LINES, MIN_TERMINAL_BUFFER_BYTES, MIN_TERMINAL_SCROLLBACK_LINES, } from '../config/terminal-history.js';
|
|
11
12
|
// ========== Path Validation ==========
|
|
12
13
|
/** Validate a path string: no shell metacharacters, no traversal, must be absolute */
|
|
13
14
|
export function isValidWorkingDir(p) {
|
|
@@ -238,6 +239,84 @@ export const CreateCaseSchema = z.object({
|
|
|
238
239
|
.regex(/^[a-zA-Z0-9_-]+$/, 'Invalid case name format. Use only letters, numbers, hyphens, underscores.'),
|
|
239
240
|
description: z.string().max(1000).optional(),
|
|
240
241
|
});
|
|
242
|
+
const RemoteCommandOverridesSchema = z
|
|
243
|
+
.object({
|
|
244
|
+
shell: z.string().min(1).max(300).optional(),
|
|
245
|
+
claude: z.string().min(1).max(300).optional(),
|
|
246
|
+
opencode: z.string().min(1).max(300).optional(),
|
|
247
|
+
codex: z.string().min(1).max(300).optional(),
|
|
248
|
+
gemini: z.string().min(1).max(300).optional(),
|
|
249
|
+
})
|
|
250
|
+
.strict()
|
|
251
|
+
.optional();
|
|
252
|
+
// COD-107 — advanced SSH connection options. These ultimately exec as shell
|
|
253
|
+
// (ProxyCommand etc.), but are OPERATOR-entered host config (never attacker- or
|
|
254
|
+
// terminal-output-influenced), so we validate as defense-in-depth, not as the
|
|
255
|
+
// security boundary. Reject newline/NUL/backtick/`$(` shell-injection vectors.
|
|
256
|
+
const NO_SHELL_INJECTION = /^[^\n\r\0`]*$/;
|
|
257
|
+
const noCommandSubstitution = (s) => !s.includes('$(');
|
|
258
|
+
// `remotePath`/`identityFile` are shell-escaped, then the whole launch command is
|
|
259
|
+
// embedded via `JSON.stringify(...)` inside `bash -c "..."` (tmux-manager). That
|
|
260
|
+
// outer DOUBLE-quote layer re-exposes `$(...)`, backticks, and `$VAR` even though
|
|
261
|
+
// the inner value is single-quoted — so a `$(cmd)` in the path would run LOCALLY at
|
|
262
|
+
// launch. Reject `$` and backtick (and newline/CR/NUL) entirely at the boundary.
|
|
263
|
+
const NO_SHELL_META = /^[^\n\r\0`$]*$/;
|
|
264
|
+
export const RemoteHostSchema = z.object({
|
|
265
|
+
id: z.string().regex(/^[a-zA-Z0-9_-]+$/, 'Invalid remote host id'),
|
|
266
|
+
label: z.string().min(1).max(100),
|
|
267
|
+
host: z
|
|
268
|
+
.string()
|
|
269
|
+
.min(1)
|
|
270
|
+
.max(255)
|
|
271
|
+
.regex(/^[a-zA-Z0-9._:-]+$/, 'Invalid SSH host'),
|
|
272
|
+
username: z
|
|
273
|
+
.string()
|
|
274
|
+
.min(1)
|
|
275
|
+
.max(100)
|
|
276
|
+
.regex(/^[a-zA-Z0-9._-]+$/, 'Invalid SSH username'),
|
|
277
|
+
port: z.number().int().min(1).max(65535).optional(),
|
|
278
|
+
// Identity (private-key) file PATH only — never key bytes. Reject shell
|
|
279
|
+
// metacharacters ($, backtick) that survive into the `bash -c` launch layer.
|
|
280
|
+
identityFile: z.string().min(1).max(4096).regex(NO_SHELL_META, 'Invalid identity file path').optional(),
|
|
281
|
+
// SOCKS5 proxy as host:port (e.g. 127.0.0.1:1080).
|
|
282
|
+
socksProxy: z
|
|
283
|
+
.string()
|
|
284
|
+
.regex(/^[\w.-]+:\d{1,5}$/, 'SOCKS proxy must be host:port')
|
|
285
|
+
.optional(),
|
|
286
|
+
// SSH jump host: a comma-separated chain of [user@]host[:port] hops. Structural
|
|
287
|
+
// ALLOWLIST (not an open denylist) — only chars valid in user/host/port/IPv6,
|
|
288
|
+
// so no shell metacharacter (;, |, &, space, $, quotes, …) can appear. The value
|
|
289
|
+
// is also shellescaped at command-build time (buildSshConnectionArgs); this is the
|
|
290
|
+
// belt to that suspenders.
|
|
291
|
+
jumpHost: z
|
|
292
|
+
.string()
|
|
293
|
+
.min(1)
|
|
294
|
+
.max(255)
|
|
295
|
+
.regex(/^(?:[A-Za-z0-9._-]+@)?[A-Za-z0-9.:[\]-]+(?::\d{1,5})?(?:,(?:[A-Za-z0-9._-]+@)?[A-Za-z0-9.:[\]-]+(?::\d{1,5})?)*$/, 'Jump host must be [user@]host[:port] (comma-separated for multiple hops)')
|
|
296
|
+
.optional(),
|
|
297
|
+
// Arbitrary extra -o KEY=VALUE options (escape hatch); each must be KEY=VALUE.
|
|
298
|
+
extraSshOptions: z
|
|
299
|
+
.array(z
|
|
300
|
+
.string()
|
|
301
|
+
.min(3)
|
|
302
|
+
.max(1024)
|
|
303
|
+
.regex(/^[A-Za-z][A-Za-z0-9]*=.+$/, 'Extra SSH option must be KEY=VALUE')
|
|
304
|
+
.regex(NO_SHELL_INJECTION, 'Invalid characters in SSH option')
|
|
305
|
+
.refine(noCommandSubstitution, 'Invalid characters in SSH option'))
|
|
306
|
+
.max(32)
|
|
307
|
+
.optional(),
|
|
308
|
+
commands: RemoteCommandOverridesSchema,
|
|
309
|
+
});
|
|
310
|
+
export const RemoteCaseLinkSchema = z.object({
|
|
311
|
+
name: z.string().regex(/^[a-zA-Z0-9_-]+$/, 'Invalid case name format'),
|
|
312
|
+
hostId: z.string().regex(/^[a-zA-Z0-9_-]+$/, 'Invalid remote host id'),
|
|
313
|
+
remotePath: z
|
|
314
|
+
.string()
|
|
315
|
+
.min(1)
|
|
316
|
+
.max(2000)
|
|
317
|
+
.regex(/^\//, 'Remote path must be absolute')
|
|
318
|
+
.regex(NO_SHELL_META, 'Invalid characters in remote path'),
|
|
319
|
+
});
|
|
241
320
|
// ========== Quick Start ==========
|
|
242
321
|
/**
|
|
243
322
|
* Schema for POST /api/quick-start
|
|
@@ -377,6 +456,16 @@ export const SettingsUpdateSchema = z
|
|
|
377
456
|
allowedTools: z.string().max(2000).optional(),
|
|
378
457
|
// Codex CLI settings
|
|
379
458
|
codexDangerouslyBypassApprovals: z.boolean().optional(),
|
|
459
|
+
// Terminal history and retention
|
|
460
|
+
terminalScrollbackLines: z
|
|
461
|
+
.number()
|
|
462
|
+
.int()
|
|
463
|
+
.min(MIN_TERMINAL_SCROLLBACK_LINES)
|
|
464
|
+
.max(MAX_TERMINAL_SCROLLBACK_LINES)
|
|
465
|
+
.optional(),
|
|
466
|
+
tmuxHistoryLimit: z.number().int().min(MIN_TERMINAL_SCROLLBACK_LINES).max(MAX_TERMINAL_SCROLLBACK_LINES).optional(),
|
|
467
|
+
terminalBufferMaxBytes: z.number().int().min(MIN_TERMINAL_BUFFER_BYTES).max(MAX_TERMINAL_BUFFER_BYTES).optional(),
|
|
468
|
+
terminalBufferTrimBytes: z.number().int().min(MIN_TERMINAL_BUFFER_BYTES).max(MAX_TERMINAL_BUFFER_BYTES).optional(),
|
|
380
469
|
// CPU priority
|
|
381
470
|
nice: z
|
|
382
471
|
.object({
|
|
@@ -443,7 +532,18 @@ export const SettingsUpdateSchema = z
|
|
|
443
532
|
.max(20)
|
|
444
533
|
.optional(),
|
|
445
534
|
})
|
|
446
|
-
.strict()
|
|
535
|
+
.strict()
|
|
536
|
+
.superRefine((settings, ctx) => {
|
|
537
|
+
if (settings.terminalBufferMaxBytes !== undefined &&
|
|
538
|
+
settings.terminalBufferTrimBytes !== undefined &&
|
|
539
|
+
settings.terminalBufferTrimBytes > settings.terminalBufferMaxBytes) {
|
|
540
|
+
ctx.addIssue({
|
|
541
|
+
code: z.ZodIssueCode.custom,
|
|
542
|
+
path: ['terminalBufferTrimBytes'],
|
|
543
|
+
message: 'terminalBufferTrimBytes must be less than or equal to terminalBufferMaxBytes',
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
});
|
|
447
547
|
/**
|
|
448
548
|
* Schema for POST /api/sessions/:id/input with length limit
|
|
449
549
|
*/
|
|
@@ -522,6 +622,64 @@ export const ScheduledRunSchema = z.object({
|
|
|
522
622
|
workingDir: safePathSchema.optional(),
|
|
523
623
|
durationMinutes: z.number().int().min(1).max(14400).optional(),
|
|
524
624
|
});
|
|
625
|
+
// ========== Cron Jobs ==========
|
|
626
|
+
/** 'HH:MM' 24-hour time. */
|
|
627
|
+
const hhmmSchema = z.string().regex(/^([01]?\d|2[0-3]):[0-5]\d$/, 'Time must be HH:MM (24-hour)');
|
|
628
|
+
/** Prompt delivery is single-line only (writeViaMux/Ink constraint) — reject newlines outright. */
|
|
629
|
+
const noNewlines = (v) => !/[\r\n]/.test(v);
|
|
630
|
+
/** Shared field shape for creating/updating a scheduled job. */
|
|
631
|
+
const CronJobBaseSchema = z.object({
|
|
632
|
+
name: z.string().min(1).max(200),
|
|
633
|
+
agentType: z.enum(['claude', 'shell', 'opencode', 'codex', 'gemini']),
|
|
634
|
+
workingDir: safePathSchema,
|
|
635
|
+
launchCommand: z.string().max(2000).refine(noNewlines, 'launchCommand must be a single line').optional(),
|
|
636
|
+
promptMode: z.enum(['inline_text', 'prompt_file_path']),
|
|
637
|
+
promptText: z
|
|
638
|
+
.string()
|
|
639
|
+
.max(100000)
|
|
640
|
+
.refine(noNewlines, 'promptText must be a single line (multi-line prompts are not supported)')
|
|
641
|
+
.optional(),
|
|
642
|
+
promptFilePath: safePathSchema.optional(),
|
|
643
|
+
inputMode: z.enum(['paste', 'typed']),
|
|
644
|
+
scheduleType: z.enum(['once', 'interval', 'daily', 'weekly']),
|
|
645
|
+
runAt: z.number().int().positive().optional(),
|
|
646
|
+
intervalMinutes: z.number().int().min(1).max(525600).optional(),
|
|
647
|
+
dailyTime: hhmmSchema.optional(),
|
|
648
|
+
weeklyDays: z.array(z.number().int().min(0).max(6)).min(1).max(7).optional(),
|
|
649
|
+
weeklyTime: hhmmSchema.optional(),
|
|
650
|
+
enabled: z.boolean(),
|
|
651
|
+
notes: z.string().max(2000).optional(),
|
|
652
|
+
concurrencyPolicy: z.enum(['warn_only', 'skip_if_same_agent_running']),
|
|
653
|
+
autoClosePreviousSession: z.boolean().optional(),
|
|
654
|
+
});
|
|
655
|
+
/** Cross-field validation: required fields depend on promptMode + scheduleType. */
|
|
656
|
+
function refineCronJob(val, ctx) {
|
|
657
|
+
const add = (message, path) => ctx.addIssue({ code: 'custom', message, path: [path] });
|
|
658
|
+
if (val.promptMode === 'inline_text' && !val.promptText) {
|
|
659
|
+
add('promptText is required when promptMode is inline_text', 'promptText');
|
|
660
|
+
}
|
|
661
|
+
if (val.promptMode === 'prompt_file_path' && !val.promptFilePath) {
|
|
662
|
+
add('promptFilePath is required when promptMode is prompt_file_path', 'promptFilePath');
|
|
663
|
+
}
|
|
664
|
+
if (val.scheduleType === 'once' && val.runAt === undefined) {
|
|
665
|
+
add('runAt is required for a one-time schedule', 'runAt');
|
|
666
|
+
}
|
|
667
|
+
if (val.scheduleType === 'interval' && val.intervalMinutes === undefined) {
|
|
668
|
+
add('intervalMinutes is required for an interval schedule', 'intervalMinutes');
|
|
669
|
+
}
|
|
670
|
+
if (val.scheduleType === 'daily' && !val.dailyTime) {
|
|
671
|
+
add('dailyTime is required for a daily schedule', 'dailyTime');
|
|
672
|
+
}
|
|
673
|
+
if (val.scheduleType === 'weekly' && (!val.weeklyTime || !val.weeklyDays?.length)) {
|
|
674
|
+
add('weeklyDays and weeklyTime are required for a weekly schedule', 'weeklyTime');
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
/** POST /api/cron/jobs — full job definition. */
|
|
678
|
+
export const CronJobSchema = CronJobBaseSchema.superRefine(refineCronJob);
|
|
679
|
+
/** PUT /api/cron/jobs/:id — partial update. */
|
|
680
|
+
export const CronJobUpdateSchema = CronJobBaseSchema.partial();
|
|
681
|
+
/** PUT /api/cron/jobs/:id/enabled */
|
|
682
|
+
export const CronJobEnabledSchema = z.object({ enabled: z.boolean() });
|
|
525
683
|
/** POST /api/cases/link */
|
|
526
684
|
export const LinkCaseSchema = z.object({
|
|
527
685
|
name: z.string().regex(/^[a-zA-Z0-9_-]+$/, 'Invalid case name format'),
|
|
@@ -580,6 +738,15 @@ export const SubagentWindowStatesSchema = z
|
|
|
580
738
|
.passthrough();
|
|
581
739
|
/** PUT /api/subagent-parents */
|
|
582
740
|
export const SubagentParentMapSchema = z.record(z.string(), z.string());
|
|
741
|
+
/** POST /api/sessions/:id/interactive */
|
|
742
|
+
export const InteractiveStartSchema = z.object({
|
|
743
|
+
/**
|
|
744
|
+
* COD-118: explicit user-initiated restart — clears a tripped PTY-exit circuit
|
|
745
|
+
* breaker before starting. Automatic reconnect/re-attach callers (e.g. the
|
|
746
|
+
* frontend's selectSession auto-attach) must NOT send this flag.
|
|
747
|
+
*/
|
|
748
|
+
clearBreaker: z.boolean().optional(),
|
|
749
|
+
});
|
|
583
750
|
/** POST /api/sessions/:id/interactive-respawn */
|
|
584
751
|
export const InteractiveRespawnSchema = z.object({
|
|
585
752
|
respawnConfig: RespawnConfigSchema.optional(),
|