@xopcai/xopc 0.0.28 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +216 -0
- package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +1 -0
- package/dist/gateway/static/root/assets/{apps-page-Co95hLOJ.js → apps-page-Bmq19MS-.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-Co95hLOJ.js.map → apps-page-Bmq19MS-.js.map} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +9 -0
- package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +1 -0
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +2 -0
- package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +1 -0
- package/dist/gateway/static/root/assets/{cron-utils-BmzF4m1y.js → cron-utils-N1PqD2DB.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-utils-BmzF4m1y.js.map → cron-utils-N1PqD2DB.js.map} +1 -1
- package/dist/gateway/static/root/assets/{dist-Dn-ufXyc.js → dist--p2HQ2QF.js} +2 -2
- package/dist/gateway/static/root/assets/{dist-Dn-ufXyc.js.map → dist--p2HQ2QF.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BZ8xQ74_.js → extension-debug-page-DwHCB_6T.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-BZ8xQ74_.js.map → extension-debug-page-DwHCB_6T.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BlNgKxwW.js → extension-page-BsYwQIex.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-BlNgKxwW.js.map → extension-page-BsYwQIex.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CWTdW_oY.js → extension-settings-page-nsisEgjB.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-CWTdW_oY.js.map → extension-settings-page-nsisEgjB.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-CR8zUHGR.js +4734 -0
- package/dist/gateway/static/root/assets/{index-lV8FGWlt.js.map → index-CR8zUHGR.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-Dnfha4O2.css +1 -0
- package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +2 -0
- package/dist/gateway/static/root/assets/{logs-page-DG31RpvG.js.map → logs-page-CQwdV_Xw.js.map} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +2 -0
- package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js.map +1 -0
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +1 -0
- package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +3 -0
- package/dist/gateway/static/root/assets/{skills-page-lb7vYtlP.js.map → skills-page-Clg8deH0.js.map} +1 -1
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/agent/lifecycle/hook-handler.d.ts +2 -0
- package/dist/src/agent/lifecycle/hook-handler.js +24 -0
- package/dist/src/agent/lifecycle/hook-handler.js.map +1 -1
- package/dist/src/agent/messaging/command-handler.js +10 -2
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +77 -20
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +15 -0
- package/dist/src/agent/service.js +21 -1
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/channels/index.js +2 -2
- package/dist/src/channels/manager.js +2 -2
- package/dist/src/cli/agent-chat-log-level-preset.d.ts +3 -2
- package/dist/src/cli/agent-chat-log-level-preset.js +6 -3
- package/dist/src/cli/agent-chat-log-level-preset.js.map +1 -1
- package/dist/src/cli/index.js +4 -3
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/config/schema.js +5 -2
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/extensions/hooks.js +5 -1
- package/dist/src/extensions/hooks.js.map +1 -1
- package/dist/src/extensions/loader.d.ts +1 -0
- package/dist/src/extensions/loader.js +3 -1
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/sdk/index.d.ts +1 -1
- package/dist/src/extensions/sdk/index.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +8 -0
- package/dist/src/extensions/types/hooks.d.ts +16 -1
- package/dist/src/extensions/types/hooks.js +1 -0
- package/dist/src/extensions/types/hooks.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +19 -1
- package/dist/src/gateway/agents-admin.js +164 -3
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/hono/app.js +1 -0
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +59 -5
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +2 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +1 -0
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +17 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -0
- package/dist/src/gateway/service.js +31 -4
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/session/client-history.d.ts +21 -0
- package/dist/src/session/client-history.js +89 -0
- package/dist/src/session/client-history.js.map +1 -0
- package/dist/src/session/index.d.ts +1 -0
- package/dist/src/session/index.js +2 -1
- package/dist/src/session/manager.d.ts +2 -0
- package/dist/src/session/manager.js +5 -0
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/thinking-resolve.js +1 -1
- package/dist/src/session/thinking-resolve.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +1 -1
- package/dist/src/tui/backends/embedded-backend.js +15 -2
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +4 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +34 -4
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.d.ts +4 -0
- package/dist/src/tui/chat-history.js +29 -0
- package/dist/src/tui/chat-history.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +3 -1
- package/dist/src/tui/components/chat-log.js +17 -3
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +8 -2
- package/dist/src/tui/components/custom-editor.js.map +1 -1
- package/dist/src/tui/components/fuzzy-filter.d.ts +17 -0
- package/dist/src/tui/components/fuzzy-filter.js +85 -0
- package/dist/src/tui/components/fuzzy-filter.js.map +1 -0
- package/dist/src/tui/components/searchable-select-list.d.ts +39 -0
- package/dist/src/tui/components/searchable-select-list.js +257 -0
- package/dist/src/tui/components/searchable-select-list.js.map +1 -0
- package/dist/src/tui/theme.d.ts +2 -0
- package/dist/src/tui/theme.js +7 -1
- package/dist/src/tui/theme.js.map +1 -1
- package/dist/src/tui/tui-agent-events.d.ts +7 -0
- package/dist/src/tui/tui-agent-events.js +103 -0
- package/dist/src/tui/tui-agent-events.js.map +1 -0
- package/dist/src/tui/tui-backend.d.ts +8 -12
- package/dist/src/tui/tui-commands.d.ts +23 -0
- package/dist/src/tui/tui-commands.js +165 -0
- package/dist/src/tui/tui-commands.js.map +1 -0
- package/dist/src/tui/tui-lifecycle.d.ts +26 -0
- package/dist/src/tui/tui-lifecycle.js +57 -0
- package/dist/src/tui/tui-lifecycle.js.map +1 -0
- package/dist/src/tui/tui-local-shell.d.ts +28 -0
- package/dist/src/tui/tui-local-shell.js +147 -0
- package/dist/src/tui/tui-local-shell.js.map +1 -0
- package/dist/src/tui/tui-overlays.d.ts +8 -0
- package/dist/src/tui/tui-overlays.js +22 -0
- package/dist/src/tui/tui-overlays.js.map +1 -0
- package/dist/src/tui/tui-picker-overlay.d.ts +26 -0
- package/dist/src/tui/tui-picker-overlay.js +69 -0
- package/dist/src/tui/tui-picker-overlay.js.map +1 -0
- package/dist/src/tui/tui-stdio-filter.d.ts +17 -0
- package/dist/src/tui/tui-stdio-filter.js +96 -0
- package/dist/src/tui/tui-stdio-filter.js.map +1 -0
- package/dist/src/tui/tui-submit.d.ts +25 -0
- package/dist/src/tui/tui-submit.js +102 -0
- package/dist/src/tui/tui-submit.js.map +1 -0
- package/dist/src/tui/tui-suspend.d.ts +10 -0
- package/dist/src/tui/tui-suspend.js +18 -0
- package/dist/src/tui/tui-suspend.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +1 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.d.ts +2 -0
- package/dist/src/tui/tui.js +175 -312
- package/dist/src/tui/tui.js.map +1 -1
- package/package.json +2 -6
- package/dist/gateway/static/root/assets/agents-DplaQYS2.js +0 -216
- package/dist/gateway/static/root/assets/agents-DplaQYS2.js.map +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CkfSST0k.js +0 -9
- package/dist/gateway/static/root/assets/channels-settings-CkfSST0k.js.map +0 -1
- package/dist/gateway/static/root/assets/cron-page-D9q6KqL8.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-D9q6KqL8.js.map +0 -1
- package/dist/gateway/static/root/assets/index-OT4cGzon.css +0 -1
- package/dist/gateway/static/root/assets/index-lV8FGWlt.js +0 -4734
- package/dist/gateway/static/root/assets/logs-page-DG31RpvG.js +0 -2
- package/dist/gateway/static/root/assets/sessions-page-CdmjxDEM.js +0 -2
- package/dist/gateway/static/root/assets/sessions-page-CdmjxDEM.js.map +0 -1
- package/dist/gateway/static/root/assets/settings-page-DU2XLf5s.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-DU2XLf5s.js.map +0 -1
- package/dist/gateway/static/root/assets/skills-page-lb7vYtlP.js +0 -3
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//#region src/tui/tui-stdio-filter.ts
|
|
2
|
+
/**
|
|
3
|
+
* While pi-tui owns the screen, strip whole-line pino JSON from stdout/stderr.
|
|
4
|
+
* ANSI chunks must pass through immediately (see runTui).
|
|
5
|
+
*
|
|
6
|
+
* Longer-term (openclaw-style): prefer routing logger transports away from stdout when the TUI
|
|
7
|
+
* is active (e.g. file-only + explicit subsystem tags) instead of patching stdio here.
|
|
8
|
+
*/
|
|
9
|
+
function isLikelyPinoJsonLogLine(line) {
|
|
10
|
+
const t = line.trim();
|
|
11
|
+
if (!t.startsWith("{")) return false;
|
|
12
|
+
try {
|
|
13
|
+
return typeof JSON.parse(t).level === "number";
|
|
14
|
+
} catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Patch process stdout/stderr; call `restore()` before exiting the TUI. */
|
|
19
|
+
function installTuiStdioFilter() {
|
|
20
|
+
const originalStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
21
|
+
const originalStderrWrite = process.stderr.write.bind(process.stderr);
|
|
22
|
+
let suppressLogs = true;
|
|
23
|
+
const stdoutBuf = { s: "" };
|
|
24
|
+
const stderrBuf = { s: "" };
|
|
25
|
+
const takeEmitCompleteLines = (buf) => {
|
|
26
|
+
let emit = "";
|
|
27
|
+
while (true) {
|
|
28
|
+
const idx = buf.s.indexOf("\n");
|
|
29
|
+
if (idx === -1) break;
|
|
30
|
+
const line = buf.s.slice(0, idx);
|
|
31
|
+
buf.s = buf.s.slice(idx + 1);
|
|
32
|
+
if (!isLikelyPinoJsonLogLine(line)) emit += `${line}\n`;
|
|
33
|
+
}
|
|
34
|
+
return emit;
|
|
35
|
+
};
|
|
36
|
+
const installBufferedLogFilter = (original, buf) => function filteredWrite(chunk, ...rest) {
|
|
37
|
+
if (!suppressLogs) {
|
|
38
|
+
const extra = typeof chunk === "string" ? chunk : chunk instanceof Buffer ? chunk.toString() : "";
|
|
39
|
+
const combined = buf.s ? buf.s + extra : extra;
|
|
40
|
+
buf.s = "";
|
|
41
|
+
return combined.length > 0 ? original(combined, ...rest) : true;
|
|
42
|
+
}
|
|
43
|
+
const text = typeof chunk === "string" ? chunk : chunk instanceof Buffer ? chunk.toString() : "";
|
|
44
|
+
if (text.includes("\x1B")) {
|
|
45
|
+
let emit = takeEmitCompleteLines(buf);
|
|
46
|
+
if (buf.s.length > 0) {
|
|
47
|
+
if (!buf.s.trimStart().startsWith("{")) {
|
|
48
|
+
emit += buf.s;
|
|
49
|
+
buf.s = "";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (emit.length > 0) original(emit, ...rest);
|
|
53
|
+
return original(text, ...rest);
|
|
54
|
+
}
|
|
55
|
+
buf.s += text;
|
|
56
|
+
const emit = takeEmitCompleteLines(buf);
|
|
57
|
+
return emit.length > 0 ? original(emit, ...rest) : true;
|
|
58
|
+
};
|
|
59
|
+
const patch = () => {
|
|
60
|
+
process.stdout.write = installBufferedLogFilter(originalStdoutWrite, stdoutBuf);
|
|
61
|
+
process.stderr.write = installBufferedLogFilter(originalStderrWrite, stderrBuf);
|
|
62
|
+
};
|
|
63
|
+
const flushRemainder = (buf, orig) => {
|
|
64
|
+
const rest = buf.s.trimEnd();
|
|
65
|
+
buf.s = "";
|
|
66
|
+
if (!rest.length) return;
|
|
67
|
+
if (!isLikelyPinoJsonLogLine(rest)) orig(`${rest}\n`);
|
|
68
|
+
};
|
|
69
|
+
const unpatch = () => {
|
|
70
|
+
process.stdout.write = originalStdoutWrite;
|
|
71
|
+
process.stderr.write = originalStderrWrite;
|
|
72
|
+
};
|
|
73
|
+
patch();
|
|
74
|
+
return {
|
|
75
|
+
restore: () => {
|
|
76
|
+
suppressLogs = false;
|
|
77
|
+
flushRemainder(stdoutBuf, originalStdoutWrite);
|
|
78
|
+
flushRemainder(stderrBuf, originalStderrWrite);
|
|
79
|
+
unpatch();
|
|
80
|
+
},
|
|
81
|
+
pause: () => {
|
|
82
|
+
suppressLogs = false;
|
|
83
|
+
flushRemainder(stdoutBuf, originalStdoutWrite);
|
|
84
|
+
flushRemainder(stderrBuf, originalStderrWrite);
|
|
85
|
+
unpatch();
|
|
86
|
+
},
|
|
87
|
+
resume: () => {
|
|
88
|
+
suppressLogs = true;
|
|
89
|
+
patch();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { installTuiStdioFilter, isLikelyPinoJsonLogLine };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=tui-stdio-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-stdio-filter.js","names":[],"sources":["../../../src/tui/tui-stdio-filter.ts"],"sourcesContent":["/**\n * While pi-tui owns the screen, strip whole-line pino JSON from stdout/stderr.\n * ANSI chunks must pass through immediately (see runTui).\n *\n * Longer-term (openclaw-style): prefer routing logger transports away from stdout when the TUI\n * is active (e.g. file-only + explicit subsystem tags) instead of patching stdio here.\n */\n\nexport function isLikelyPinoJsonLogLine(line: string): boolean {\n const t = line.trim();\n if (!t.startsWith('{')) return false;\n try {\n const parsed = JSON.parse(t) as { level?: unknown };\n return typeof parsed.level === 'number';\n } catch {\n return false;\n }\n}\n\nexport type TuiStdioFilterHandle = {\n restore: () => void;\n /** Restore native stdio writes temporarily (e.g. inherited child process). */\n pause: () => void;\n /** Re-apply filtering after `pause()`. */\n resume: () => void;\n};\n\n/** Patch process stdout/stderr; call `restore()` before exiting the TUI. */\nexport function installTuiStdioFilter(): TuiStdioFilterHandle {\n const originalStdoutWrite = process.stdout.write.bind(process.stdout);\n const originalStderrWrite = process.stderr.write.bind(process.stderr);\n let suppressLogs = true;\n\n const stdoutBuf = { s: '' };\n const stderrBuf = { s: '' };\n\n const takeEmitCompleteLines = (buf: { s: string }): string => {\n let emit = '';\n while (true) {\n const idx = buf.s.indexOf('\\n');\n if (idx === -1) break;\n const line = buf.s.slice(0, idx);\n buf.s = buf.s.slice(idx + 1);\n if (!isLikelyPinoJsonLogLine(line)) {\n emit += `${line}\\n`;\n }\n }\n return emit;\n };\n\n const installBufferedLogFilter = (\n original: typeof process.stdout.write,\n buf: { s: string },\n ): typeof process.stdout.write =>\n function filteredWrite(chunk: unknown, ...rest: unknown[]): boolean {\n if (!suppressLogs) {\n const extra = typeof chunk === 'string' ? chunk : chunk instanceof Buffer ? chunk.toString() : '';\n const combined = buf.s ? buf.s + extra : extra;\n buf.s = '';\n return combined.length > 0\n ? ((original as Function)(combined, ...rest) as boolean)\n : true;\n }\n const text = typeof chunk === 'string' ? chunk : chunk instanceof Buffer ? chunk.toString() : '';\n if (text.includes('\\x1b')) {\n let emit = takeEmitCompleteLines(buf);\n if (buf.s.length > 0) {\n const tail = buf.s.trimStart();\n if (!tail.startsWith('{')) {\n emit += buf.s;\n buf.s = '';\n }\n }\n if (emit.length > 0) {\n (original as Function)(emit, ...rest);\n }\n return (original as Function)(text, ...rest) as boolean;\n }\n buf.s += text;\n const emit = takeEmitCompleteLines(buf);\n return emit.length > 0 ? ((original as Function)(emit, ...rest) as boolean) : true;\n } as typeof process.stdout.write;\n\n const patch = () => {\n process.stdout.write = installBufferedLogFilter(originalStdoutWrite, stdoutBuf);\n process.stderr.write = installBufferedLogFilter(originalStderrWrite, stderrBuf);\n };\n\n const flushRemainder = (buf: { s: string }, orig: typeof process.stdout.write): void => {\n const rest = buf.s.trimEnd();\n buf.s = '';\n if (!rest.length) return;\n if (!isLikelyPinoJsonLogLine(rest)) {\n orig(`${rest}\\n`);\n }\n };\n\n const unpatch = () => {\n process.stdout.write = originalStdoutWrite;\n process.stderr.write = originalStderrWrite;\n };\n\n patch();\n\n return {\n restore: () => {\n suppressLogs = false;\n flushRemainder(stdoutBuf, originalStdoutWrite);\n flushRemainder(stderrBuf, originalStderrWrite);\n unpatch();\n },\n pause: () => {\n suppressLogs = false;\n flushRemainder(stdoutBuf, originalStdoutWrite);\n flushRemainder(stderrBuf, originalStderrWrite);\n unpatch();\n },\n resume: () => {\n suppressLogs = true;\n patch();\n },\n };\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,wBAAwB,MAAuB;CAC7D,MAAM,IAAI,KAAK,MAAM;AACrB,KAAI,CAAC,EAAE,WAAW,IAAI,CAAE,QAAO;AAC/B,KAAI;AAEF,SAAO,OADQ,KAAK,MAAM,EACN,CAAC,UAAU;SACzB;AACN,SAAO;;;;AAaX,SAAgB,wBAA8C;CAC5D,MAAM,sBAAsB,QAAQ,OAAO,MAAM,KAAK,QAAQ,OAAO;CACrE,MAAM,sBAAsB,QAAQ,OAAO,MAAM,KAAK,QAAQ,OAAO;CACrE,IAAI,eAAe;CAEnB,MAAM,YAAY,EAAE,GAAG,IAAI;CAC3B,MAAM,YAAY,EAAE,GAAG,IAAI;CAE3B,MAAM,yBAAyB,QAA+B;EAC5D,IAAI,OAAO;AACX,SAAO,MAAM;GACX,MAAM,MAAM,IAAI,EAAE,QAAQ,KAAK;AAC/B,OAAI,QAAQ,GAAI;GAChB,MAAM,OAAO,IAAI,EAAE,MAAM,GAAG,IAAI;AAChC,OAAI,IAAI,IAAI,EAAE,MAAM,MAAM,EAAE;AAC5B,OAAI,CAAC,wBAAwB,KAAK,CAChC,SAAQ,GAAG,KAAK;;AAGpB,SAAO;;CAGT,MAAM,4BACJ,UACA,QAEA,SAAS,cAAc,OAAgB,GAAG,MAA0B;AAClE,MAAI,CAAC,cAAc;GACjB,MAAM,QAAQ,OAAO,UAAU,WAAW,QAAQ,iBAAiB,SAAS,MAAM,UAAU,GAAG;GAC/F,MAAM,WAAW,IAAI,IAAI,IAAI,IAAI,QAAQ;AACzC,OAAI,IAAI;AACR,UAAO,SAAS,SAAS,IACnB,SAAsB,UAAU,GAAG,KAAK,GAC1C;;EAEN,MAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,iBAAiB,SAAS,MAAM,UAAU,GAAG;AAC9F,MAAI,KAAK,SAAS,OAAO,EAAE;GACzB,IAAI,OAAO,sBAAsB,IAAI;AACrC,OAAI,IAAI,EAAE,SAAS;QAEb,CADS,IAAI,EAAE,WACV,CAAC,WAAW,IAAI,EAAE;AACzB,aAAQ,IAAI;AACZ,SAAI,IAAI;;;AAGZ,OAAI,KAAK,SAAS,EACf,UAAsB,MAAM,GAAG,KAAK;AAEvC,UAAQ,SAAsB,MAAM,GAAG,KAAK;;AAE9C,MAAI,KAAK;EACT,MAAM,OAAO,sBAAsB,IAAI;AACvC,SAAO,KAAK,SAAS,IAAM,SAAsB,MAAM,GAAG,KAAK,GAAe;;CAGlF,MAAM,cAAc;AAClB,UAAQ,OAAO,QAAQ,yBAAyB,qBAAqB,UAAU;AAC/E,UAAQ,OAAO,QAAQ,yBAAyB,qBAAqB,UAAU;;CAGjF,MAAM,kBAAkB,KAAoB,SAA4C;EACtF,MAAM,OAAO,IAAI,EAAE,SAAS;AAC5B,MAAI,IAAI;AACR,MAAI,CAAC,KAAK,OAAQ;AAClB,MAAI,CAAC,wBAAwB,KAAK,CAChC,MAAK,GAAG,KAAK,IAAI;;CAIrB,MAAM,gBAAgB;AACpB,UAAQ,OAAO,QAAQ;AACvB,UAAQ,OAAO,QAAQ;;AAGzB,QAAO;AAEP,QAAO;EACL,eAAe;AACb,kBAAe;AACf,kBAAe,WAAW,oBAAoB;AAC9C,kBAAe,WAAW,oBAAoB;AAC9C,YAAS;;EAEX,aAAa;AACX,kBAAe;AACf,kBAAe,WAAW,oBAAoB;AAC9C,kBAAe,WAAW,oBAAoB;AAC9C,YAAS;;EAEX,cAAc;AACZ,kBAAe;AACf,UAAO;;EAEV"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Submit handling aligned with openclaw: `!` local shell lines + paste burst coalescing
|
|
3
|
+
* for terminals that split multiline paste into rapid single-line submits.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createEditorSubmitHandler(params: {
|
|
6
|
+
editor: {
|
|
7
|
+
setText: (value: string) => void;
|
|
8
|
+
addToHistory: (value: string) => void;
|
|
9
|
+
};
|
|
10
|
+
handleCommand: (value: string) => void | Promise<void>;
|
|
11
|
+
sendMessage: (value: string) => void | Promise<void>;
|
|
12
|
+
handleBangLine: (value: string) => void | Promise<void>;
|
|
13
|
+
}): (text: string) => void;
|
|
14
|
+
export declare function shouldEnableWindowsGitBashPasteFallback(params?: {
|
|
15
|
+
platform?: string;
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
}): boolean;
|
|
18
|
+
export declare function createSubmitBurstCoalescer(params: {
|
|
19
|
+
submit: (value: string) => void;
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
burstWindowMs?: number;
|
|
22
|
+
now?: () => number;
|
|
23
|
+
setTimer?: typeof setTimeout;
|
|
24
|
+
clearTimer?: typeof clearTimeout;
|
|
25
|
+
}): (value: string) => void;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
//#region src/tui/tui-submit.ts
|
|
2
|
+
/**
|
|
3
|
+
* Submit handling aligned with openclaw: `!` local shell lines + paste burst coalescing
|
|
4
|
+
* for terminals that split multiline paste into rapid single-line submits.
|
|
5
|
+
*/
|
|
6
|
+
function normalizeLowercaseStringOrEmpty(value) {
|
|
7
|
+
return value.trim().toLowerCase();
|
|
8
|
+
}
|
|
9
|
+
function createEditorSubmitHandler(params) {
|
|
10
|
+
return (text) => {
|
|
11
|
+
const raw = text;
|
|
12
|
+
const value = raw.trim();
|
|
13
|
+
params.editor.setText("");
|
|
14
|
+
if (!value) return;
|
|
15
|
+
if (raw.startsWith("!") && raw !== "!") {
|
|
16
|
+
params.editor.addToHistory(raw);
|
|
17
|
+
params.handleBangLine(raw);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
params.editor.addToHistory(value);
|
|
21
|
+
if (value.startsWith("/")) {
|
|
22
|
+
params.handleCommand(value);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
params.sendMessage(value);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function shouldEnableWindowsGitBashPasteFallback(params) {
|
|
29
|
+
const platform = params?.platform ?? process.platform;
|
|
30
|
+
const env = params?.env ?? process.env;
|
|
31
|
+
const termProgram = normalizeLowercaseStringOrEmpty(env.TERM_PROGRAM ?? "");
|
|
32
|
+
if (platform === "darwin") {
|
|
33
|
+
if (termProgram.includes("iterm") || termProgram.includes("apple_terminal")) return true;
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (platform !== "win32") return false;
|
|
37
|
+
const msystem = (env.MSYSTEM ?? "").toUpperCase();
|
|
38
|
+
const shell = env.SHELL ?? "";
|
|
39
|
+
if (msystem.startsWith("MINGW") || msystem.startsWith("MSYS")) return true;
|
|
40
|
+
if (normalizeLowercaseStringOrEmpty(shell).includes("bash")) return true;
|
|
41
|
+
return termProgram.includes("mintty");
|
|
42
|
+
}
|
|
43
|
+
function createSubmitBurstCoalescer(params) {
|
|
44
|
+
const windowMs = Math.max(1, params.burstWindowMs ?? 50);
|
|
45
|
+
const now = params.now ?? (() => Date.now());
|
|
46
|
+
const setTimer = params.setTimer ?? setTimeout;
|
|
47
|
+
const clearTimer = params.clearTimer ?? clearTimeout;
|
|
48
|
+
let pending = null;
|
|
49
|
+
let pendingAt = 0;
|
|
50
|
+
let flushTimer = null;
|
|
51
|
+
const clearFlushTimer = () => {
|
|
52
|
+
if (!flushTimer) return;
|
|
53
|
+
clearTimer(flushTimer);
|
|
54
|
+
flushTimer = null;
|
|
55
|
+
};
|
|
56
|
+
const flushPending = () => {
|
|
57
|
+
if (pending === null) return;
|
|
58
|
+
const flushed = pending;
|
|
59
|
+
pending = null;
|
|
60
|
+
pendingAt = 0;
|
|
61
|
+
clearFlushTimer();
|
|
62
|
+
params.submit(flushed);
|
|
63
|
+
};
|
|
64
|
+
const scheduleFlush = () => {
|
|
65
|
+
clearFlushTimer();
|
|
66
|
+
flushTimer = setTimer(() => {
|
|
67
|
+
flushPending();
|
|
68
|
+
}, windowMs);
|
|
69
|
+
};
|
|
70
|
+
return (value) => {
|
|
71
|
+
if (!params.enabled) {
|
|
72
|
+
params.submit(value);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (value.includes("\n")) {
|
|
76
|
+
flushPending();
|
|
77
|
+
params.submit(value);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const ts = now();
|
|
81
|
+
if (pending === null) {
|
|
82
|
+
pending = value;
|
|
83
|
+
pendingAt = ts;
|
|
84
|
+
scheduleFlush();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (ts - pendingAt <= windowMs) {
|
|
88
|
+
pending = `${pending}\n${value}`;
|
|
89
|
+
pendingAt = ts;
|
|
90
|
+
scheduleFlush();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
flushPending();
|
|
94
|
+
pending = value;
|
|
95
|
+
pendingAt = ts;
|
|
96
|
+
scheduleFlush();
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { createEditorSubmitHandler, createSubmitBurstCoalescer, shouldEnableWindowsGitBashPasteFallback };
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=tui-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-submit.js","names":[],"sources":["../../../src/tui/tui-submit.ts"],"sourcesContent":["/**\n * Submit handling aligned with openclaw: `!` local shell lines + paste burst coalescing\n * for terminals that split multiline paste into rapid single-line submits.\n */\n\nfunction normalizeLowercaseStringOrEmpty(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport function createEditorSubmitHandler(params: {\n editor: {\n setText: (value: string) => void;\n addToHistory: (value: string) => void;\n };\n handleCommand: (value: string) => void | Promise<void>;\n sendMessage: (value: string) => void | Promise<void>;\n handleBangLine: (value: string) => void | Promise<void>;\n}) {\n return (text: string) => {\n const raw = text;\n const value = raw.trim();\n params.editor.setText('');\n\n if (!value) {\n return;\n }\n\n if (raw.startsWith('!') && raw !== '!') {\n params.editor.addToHistory(raw);\n void params.handleBangLine(raw);\n return;\n }\n\n params.editor.addToHistory(value);\n\n if (value.startsWith('/')) {\n void params.handleCommand(value);\n return;\n }\n\n void params.sendMessage(value);\n };\n}\n\nexport function shouldEnableWindowsGitBashPasteFallback(params?: {\n platform?: string;\n env?: NodeJS.ProcessEnv;\n}): boolean {\n const platform = params?.platform ?? process.platform;\n const env = params?.env ?? process.env;\n const termProgram = normalizeLowercaseStringOrEmpty(env.TERM_PROGRAM ?? '');\n\n if (platform === 'darwin') {\n if (termProgram.includes('iterm') || termProgram.includes('apple_terminal')) {\n return true;\n }\n return false;\n }\n\n if (platform !== 'win32') {\n return false;\n }\n\n const msystem = (env.MSYSTEM ?? '').toUpperCase();\n const shell = env.SHELL ?? '';\n if (msystem.startsWith('MINGW') || msystem.startsWith('MSYS')) {\n return true;\n }\n if (normalizeLowercaseStringOrEmpty(shell).includes('bash')) {\n return true;\n }\n return termProgram.includes('mintty');\n}\n\nexport function createSubmitBurstCoalescer(params: {\n submit: (value: string) => void;\n enabled: boolean;\n burstWindowMs?: number;\n now?: () => number;\n setTimer?: typeof setTimeout;\n clearTimer?: typeof clearTimeout;\n}) {\n const windowMs = Math.max(1, params.burstWindowMs ?? 50);\n const now = params.now ?? (() => Date.now());\n const setTimer = params.setTimer ?? setTimeout;\n const clearTimer = params.clearTimer ?? clearTimeout;\n let pending: string | null = null;\n let pendingAt = 0;\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearFlushTimer = () => {\n if (!flushTimer) {\n return;\n }\n clearTimer(flushTimer);\n flushTimer = null;\n };\n\n const flushPending = () => {\n if (pending === null) {\n return;\n }\n const flushed = pending;\n pending = null;\n pendingAt = 0;\n clearFlushTimer();\n params.submit(flushed);\n };\n\n const scheduleFlush = () => {\n clearFlushTimer();\n flushTimer = setTimer(() => {\n flushPending();\n }, windowMs);\n };\n\n return (value: string) => {\n if (!params.enabled) {\n params.submit(value);\n return;\n }\n if (value.includes('\\n')) {\n flushPending();\n params.submit(value);\n return;\n }\n const ts = now();\n if (pending === null) {\n pending = value;\n pendingAt = ts;\n scheduleFlush();\n return;\n }\n if (ts - pendingAt <= windowMs) {\n pending = `${pending}\\n${value}`;\n pendingAt = ts;\n scheduleFlush();\n return;\n }\n flushPending();\n pending = value;\n pendingAt = ts;\n scheduleFlush();\n };\n}\n"],"mappings":";;;;;AAKA,SAAS,gCAAgC,OAAuB;AAC9D,QAAO,MAAM,MAAM,CAAC,aAAa;;AAGnC,SAAgB,0BAA0B,QAQvC;AACD,SAAQ,SAAiB;EACvB,MAAM,MAAM;EACZ,MAAM,QAAQ,IAAI,MAAM;AACxB,SAAO,OAAO,QAAQ,GAAG;AAEzB,MAAI,CAAC,MACH;AAGF,MAAI,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK;AACtC,UAAO,OAAO,aAAa,IAAI;AAC1B,UAAO,eAAe,IAAI;AAC/B;;AAGF,SAAO,OAAO,aAAa,MAAM;AAEjC,MAAI,MAAM,WAAW,IAAI,EAAE;AACpB,UAAO,cAAc,MAAM;AAChC;;AAGG,SAAO,YAAY,MAAM;;;AAIlC,SAAgB,wCAAwC,QAG5C;CACV,MAAM,WAAW,QAAQ,YAAY,QAAQ;CAC7C,MAAM,MAAM,QAAQ,OAAO,QAAQ;CACnC,MAAM,cAAc,gCAAgC,IAAI,gBAAgB,GAAG;AAE3E,KAAI,aAAa,UAAU;AACzB,MAAI,YAAY,SAAS,QAAQ,IAAI,YAAY,SAAS,iBAAiB,CACzE,QAAO;AAET,SAAO;;AAGT,KAAI,aAAa,QACf,QAAO;CAGT,MAAM,WAAW,IAAI,WAAW,IAAI,aAAa;CACjD,MAAM,QAAQ,IAAI,SAAS;AAC3B,KAAI,QAAQ,WAAW,QAAQ,IAAI,QAAQ,WAAW,OAAO,CAC3D,QAAO;AAET,KAAI,gCAAgC,MAAM,CAAC,SAAS,OAAO,CACzD,QAAO;AAET,QAAO,YAAY,SAAS,SAAS;;AAGvC,SAAgB,2BAA2B,QAOxC;CACD,MAAM,WAAW,KAAK,IAAI,GAAG,OAAO,iBAAiB,GAAG;CACxD,MAAM,MAAM,OAAO,cAAc,KAAK,KAAK;CAC3C,MAAM,WAAW,OAAO,YAAY;CACpC,MAAM,aAAa,OAAO,cAAc;CACxC,IAAI,UAAyB;CAC7B,IAAI,YAAY;CAChB,IAAI,aAAmD;CAEvD,MAAM,wBAAwB;AAC5B,MAAI,CAAC,WACH;AAEF,aAAW,WAAW;AACtB,eAAa;;CAGf,MAAM,qBAAqB;AACzB,MAAI,YAAY,KACd;EAEF,MAAM,UAAU;AAChB,YAAU;AACV,cAAY;AACZ,mBAAiB;AACjB,SAAO,OAAO,QAAQ;;CAGxB,MAAM,sBAAsB;AAC1B,mBAAiB;AACjB,eAAa,eAAe;AAC1B,iBAAc;KACb,SAAS;;AAGd,SAAQ,UAAkB;AACxB,MAAI,CAAC,OAAO,SAAS;AACnB,UAAO,OAAO,MAAM;AACpB;;AAEF,MAAI,MAAM,SAAS,KAAK,EAAE;AACxB,iBAAc;AACd,UAAO,OAAO,MAAM;AACpB;;EAEF,MAAM,KAAK,KAAK;AAChB,MAAI,YAAY,MAAM;AACpB,aAAU;AACV,eAAY;AACZ,kBAAe;AACf;;AAEF,MAAI,KAAK,aAAa,UAAU;AAC9B,aAAU,GAAG,QAAQ,IAAI;AACzB,eAAY;AACZ,kBAAe;AACf;;AAEF,gBAAc;AACd,YAAU;AACV,cAAY;AACZ,iBAAe"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type DrainableTui } from './tui-lifecycle.js';
|
|
2
|
+
type StartableTui = DrainableTui & {
|
|
3
|
+
start: () => void;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Pause the TUI (drain stdin + stop), run async work with a normal terminal, then restart.
|
|
7
|
+
* Caller should refocus the editor after `start()` if needed.
|
|
8
|
+
*/
|
|
9
|
+
export declare function withTuiSuspended<T>(tui: StartableTui, work: () => Promise<T>): Promise<T>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { drainAndStopTuiSafely } from "./tui-lifecycle.js";
|
|
2
|
+
//#region src/tui/tui-suspend.ts
|
|
3
|
+
/**
|
|
4
|
+
* Pause the TUI (drain stdin + stop), run async work with a normal terminal, then restart.
|
|
5
|
+
* Caller should refocus the editor after `start()` if needed.
|
|
6
|
+
*/
|
|
7
|
+
async function withTuiSuspended(tui, work) {
|
|
8
|
+
await drainAndStopTuiSafely(tui);
|
|
9
|
+
try {
|
|
10
|
+
return await work();
|
|
11
|
+
} finally {
|
|
12
|
+
tui.start();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { withTuiSuspended };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=tui-suspend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-suspend.js","names":[],"sources":["../../../src/tui/tui-suspend.ts"],"sourcesContent":["import { drainAndStopTuiSafely, type DrainableTui } from './tui-lifecycle.js';\n\ntype StartableTui = DrainableTui & { start: () => void };\n\n/**\n * Pause the TUI (drain stdin + stop), run async work with a normal terminal, then restart.\n * Caller should refocus the editor after `start()` if needed.\n */\nexport async function withTuiSuspended<T>(tui: StartableTui, work: () => Promise<T>): Promise<T> {\n await drainAndStopTuiSafely(tui);\n try {\n return await work();\n } finally {\n tui.start();\n }\n}\n"],"mappings":";;;;;;AAQA,eAAsB,iBAAoB,KAAmB,MAAoC;AAC/F,OAAM,sBAAsB,IAAI;AAChC,KAAI;AACF,SAAO,MAAM,MAAM;WACX;AACR,MAAI,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-types.js","names":[],"sources":["../../../src/tui/tui-types.ts"],"sourcesContent":["/** TUI configuration options passed from CLI. */\nexport interface TuiOptions {\n /** Connect to a running gateway instead of embedded mode. */\n url?: string;\n /** Gateway bearer token. */\n token?: string;\n /** Session key to resume. */\n session?: string;\n /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\n /** Run in embedded (local) mode — no gateway required. */\n local?: boolean;\n}\n\nexport type TuiExitReason = 'exit' | 'signal';\n\nexport interface TuiResult {\n exitReason: TuiExitReason;\n}\n\n/** SSE events emitted by POST /api/agent. */\nexport interface AgentSSEStatusEvent {\n status: string;\n runId: string;\n}\n\nexport interface AgentSSETokenEvent {\n content: string;\n}\n\nexport interface AgentSSEThinkingEvent {\n content: string;\n isDelta?: boolean;\n}\n\nexport interface AgentSSEToolStartEvent {\n toolName: string;\n toolCallId: string;\n args?: unknown;\n}\n\nexport interface AgentSSEToolEndEvent {\n toolName: string;\n toolCallId: string;\n isError: boolean;\n result?: string;\n}\n\nexport interface AgentSSEErrorEvent {\n content: string;\n}\n\nexport interface AgentSSEResultEvent {\n ok: boolean;\n payload?: { status?: string; summary?: string };\n}\n\n/** Parsed SSE event from the stream. */\nexport interface ParsedSSEEvent {\n event: string;\n data: string;\n id?: string;\n}\n\n/** Activity status for the TUI status bar. */\nexport type ActivityStatus =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'running';\n\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n displayName?: string;\n}\n\n/** Mutable state bag for the TUI runtime. */\nexport interface TuiState {\n currentSessionKey: string;\n activeRunId: string | null;\n isConnected: boolean;\n activityStatus: ActivityStatus;\n connectionStatus: string;\n sessionInfo: SessionInfo;\n autoMessageSent: boolean;\n historyLoaded: boolean;\n toolsExpanded: boolean;\n showThinking: boolean;\n lastCtrlCAt: number;\n exitRequested: boolean;\n}\n\nexport function createInitialState(sessionKey: string): TuiState {\n return {\n currentSessionKey: sessionKey,\n activeRunId: null,\n isConnected: false,\n activityStatus: 'idle',\n connectionStatus: 'connecting',\n sessionInfo: {},\n autoMessageSent: false,\n historyLoaded: false,\n toolsExpanded: false,\n showThinking: false,\n lastCtrlCAt: 0,\n exitRequested: false,\n };\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"file":"tui-types.js","names":[],"sources":["../../../src/tui/tui-types.ts"],"sourcesContent":["/** TUI configuration options passed from CLI. */\nexport interface TuiOptions {\n /** Connect to a running gateway instead of embedded mode. */\n url?: string;\n /** Gateway bearer token. */\n token?: string;\n /** Session key to resume. */\n session?: string;\n /** Thinking level override. */\n thinking?: string;\n /** Single message to send on start, then stay open. */\n message?: string;\n /** Run in embedded (local) mode — no gateway required. */\n local?: boolean;\n}\n\nexport type TuiExitReason = 'exit' | 'signal';\n\nexport interface TuiResult {\n exitReason: TuiExitReason;\n}\n\n/** SSE events emitted by POST /api/agent. */\nexport interface AgentSSEStatusEvent {\n status: string;\n runId: string;\n}\n\nexport interface AgentSSETokenEvent {\n content: string;\n}\n\nexport interface AgentSSEThinkingEvent {\n content: string;\n isDelta?: boolean;\n}\n\nexport interface AgentSSEToolStartEvent {\n toolName: string;\n toolCallId: string;\n args?: unknown;\n}\n\nexport interface AgentSSEToolEndEvent {\n toolName: string;\n toolCallId: string;\n isError: boolean;\n result?: string;\n}\n\nexport interface AgentSSEErrorEvent {\n content: string;\n}\n\nexport interface AgentSSEResultEvent {\n ok: boolean;\n payload?: { status?: string; summary?: string };\n}\n\n/** Parsed SSE event from the stream. */\nexport interface ParsedSSEEvent {\n event: string;\n data: string;\n id?: string;\n}\n\n/** Activity status for the TUI status bar. */\nexport type ActivityStatus =\n | 'idle'\n | 'sending'\n | 'waiting'\n | 'streaming'\n | 'running';\n\n/** Session metadata shown in the TUI footer. */\nexport interface SessionInfo {\n model?: string;\n modelProvider?: string;\n thinkingLevel?: string;\n contextTokens?: number | null;\n totalTokens?: number | null;\n displayName?: string;\n}\n\n/** Mutable state bag for the TUI runtime. */\nexport interface TuiState {\n currentSessionKey: string;\n activeRunId: string | null;\n isConnected: boolean;\n activityStatus: ActivityStatus;\n connectionStatus: string;\n sessionInfo: SessionInfo;\n autoMessageSent: boolean;\n historyLoaded: boolean;\n toolsExpanded: boolean;\n showThinking: boolean;\n /** Last Ctrl+C timestamp for double-press exit (see `resolveCtrlCAction`). */\n lastCtrlCAt: number;\n exitRequested: boolean;\n}\n\nexport function createInitialState(sessionKey: string): TuiState {\n return {\n currentSessionKey: sessionKey,\n activeRunId: null,\n isConnected: false,\n activityStatus: 'idle',\n connectionStatus: 'connecting',\n sessionInfo: {},\n autoMessageSent: false,\n historyLoaded: false,\n toolsExpanded: false,\n showThinking: false,\n lastCtrlCAt: 0,\n exitRequested: false,\n };\n}\n"],"mappings":";AAqGA,SAAgB,mBAAmB,YAA8B;AAC/D,QAAO;EACL,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,kBAAkB;EAClB,aAAa,EAAE;EACf,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,cAAc;EACd,aAAa;EACb,eAAe;EAChB"}
|
package/dist/src/tui/tui.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { type TuiOptions, type TuiResult } from './tui-types.js';
|
|
2
2
|
export type { TuiOptions, TuiResult };
|
|
3
|
+
export { createBackspaceDeduper, drainAndStopTuiSafely, type DrainableTui, isIgnorableTuiStopError, resolveCtrlCAction, stopTuiSafely, } from './tui-lifecycle.js';
|
|
4
|
+
export { withTuiSuspended } from './tui-suspend.js';
|
|
3
5
|
export declare function runTui(opts: TuiOptions): Promise<TuiResult>;
|