actoviq-agent-sdk 0.3.0 → 0.4.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-zh.md +37 -2
- package/README.md +37 -2
- package/bin/actoviq-tui.js +5 -0
- package/dist/src/cli/actoviq-react.js +93 -13
- package/dist/src/cli/actoviq-react.js.map +1 -1
- package/dist/src/cli/actoviq-tui.d.ts +3 -0
- package/dist/src/cli/actoviq-tui.d.ts.map +1 -0
- package/dist/src/cli/actoviq-tui.js +76 -0
- package/dist/src/cli/actoviq-tui.js.map +1 -0
- package/dist/src/config/actoviqSettingsStore.d.ts.map +1 -1
- package/dist/src/config/actoviqSettingsStore.js +8 -2
- package/dist/src/config/actoviqSettingsStore.js.map +1 -1
- package/dist/src/config/anthropicEnvMapping.d.ts +18 -0
- package/dist/src/config/anthropicEnvMapping.d.ts.map +1 -0
- package/dist/src/config/anthropicEnvMapping.js +49 -0
- package/dist/src/config/anthropicEnvMapping.js.map +1 -0
- package/dist/src/config/modelTiers.d.ts +12 -0
- package/dist/src/config/modelTiers.d.ts.map +1 -0
- package/dist/src/config/modelTiers.js +31 -0
- package/dist/src/config/modelTiers.js.map +1 -0
- package/dist/src/config/projectSessionDirectory.d.ts +8 -0
- package/dist/src/config/projectSessionDirectory.d.ts.map +1 -0
- package/dist/src/config/projectSessionDirectory.js +83 -0
- package/dist/src/config/projectSessionDirectory.js.map +1 -0
- package/dist/src/config/resolveRuntimeConfig.d.ts.map +1 -1
- package/dist/src/config/resolveRuntimeConfig.js +73 -21
- package/dist/src/config/resolveRuntimeConfig.js.map +1 -1
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/connectionManager.d.ts.map +1 -1
- package/dist/src/mcp/connectionManager.js +10 -1
- package/dist/src/mcp/connectionManager.js.map +1 -1
- package/dist/src/memory/actoviqMemory.d.ts.map +1 -1
- package/dist/src/memory/actoviqMemory.js +10 -6
- package/dist/src/memory/actoviqMemory.js.map +1 -1
- package/dist/src/memory/actoviqTranscriptLogger.d.ts.map +1 -1
- package/dist/src/memory/actoviqTranscriptLogger.js +2 -2
- package/dist/src/memory/actoviqTranscriptLogger.js.map +1 -1
- package/dist/src/parity/actoviqBridgeEvents.d.ts.map +1 -1
- package/dist/src/parity/actoviqBridgeEvents.js +4 -2
- package/dist/src/parity/actoviqBridgeEvents.js.map +1 -1
- package/dist/src/parity/actoviqBridgeSdk.d.ts.map +1 -1
- package/dist/src/parity/actoviqBridgeSdk.js +9 -1
- package/dist/src/parity/actoviqBridgeSdk.js.map +1 -1
- package/dist/src/parity/actoviqCleanBridgeCompatSdk.d.ts +277 -0
- package/dist/src/parity/actoviqCleanBridgeCompatSdk.d.ts.map +1 -0
- package/dist/src/parity/actoviqCleanBridgeCompatSdk.js +1395 -0
- package/dist/src/parity/actoviqCleanBridgeCompatSdk.js.map +1 -0
- package/dist/src/parity/portableSessions.d.ts.map +1 -1
- package/dist/src/parity/portableSessions.js +6 -2
- package/dist/src/parity/portableSessions.js.map +1 -1
- package/dist/src/provider/client.d.ts +5 -0
- package/dist/src/provider/client.d.ts.map +1 -1
- package/dist/src/provider/client.js +82 -8
- package/dist/src/provider/client.js.map +1 -1
- package/dist/src/provider/openai-client.d.ts.map +1 -1
- package/dist/src/provider/openai-client.js +43 -4
- package/dist/src/provider/openai-client.js.map +1 -1
- package/dist/src/provider/openai-model-api.d.ts.map +1 -1
- package/dist/src/provider/openai-model-api.js +3 -0
- package/dist/src/provider/openai-model-api.js.map +1 -1
- package/dist/src/provider/openai-types.d.ts +1 -0
- package/dist/src/provider/openai-types.d.ts.map +1 -1
- package/dist/src/runtime/actoviqAgentDefinitions.d.ts +8 -0
- package/dist/src/runtime/actoviqAgentDefinitions.d.ts.map +1 -0
- package/dist/src/runtime/actoviqAgentDefinitions.js +165 -0
- package/dist/src/runtime/actoviqAgentDefinitions.js.map +1 -0
- package/dist/src/runtime/actoviqAgents.d.ts +26 -2
- package/dist/src/runtime/actoviqAgents.d.ts.map +1 -1
- package/dist/src/runtime/actoviqAgents.js +237 -26
- package/dist/src/runtime/actoviqAgents.js.map +1 -1
- package/dist/src/runtime/actoviqApiMicrocompact.d.ts +14 -0
- package/dist/src/runtime/actoviqApiMicrocompact.d.ts.map +1 -1
- package/dist/src/runtime/actoviqApiMicrocompact.js +102 -0
- package/dist/src/runtime/actoviqApiMicrocompact.js.map +1 -1
- package/dist/src/runtime/actoviqBackgroundTasks.d.ts +15 -1
- package/dist/src/runtime/actoviqBackgroundTasks.d.ts.map +1 -1
- package/dist/src/runtime/actoviqBackgroundTasks.js +72 -10
- package/dist/src/runtime/actoviqBackgroundTasks.js.map +1 -1
- package/dist/src/runtime/actoviqCompact.d.ts +59 -0
- package/dist/src/runtime/actoviqCompact.d.ts.map +1 -1
- package/dist/src/runtime/actoviqCompact.js +344 -15
- package/dist/src/runtime/actoviqCompact.js.map +1 -1
- package/dist/src/runtime/actoviqModelApi.d.ts.map +1 -1
- package/dist/src/runtime/actoviqModelApi.js +20 -4
- package/dist/src/runtime/actoviqModelApi.js.map +1 -1
- package/dist/src/runtime/actoviqPermissions.d.ts +5 -2
- package/dist/src/runtime/actoviqPermissions.d.ts.map +1 -1
- package/dist/src/runtime/actoviqPermissions.js +91 -202
- package/dist/src/runtime/actoviqPermissions.js.map +1 -1
- package/dist/src/runtime/actoviqSessionPermissions.d.ts +5 -0
- package/dist/src/runtime/actoviqSessionPermissions.d.ts.map +1 -0
- package/dist/src/runtime/actoviqSessionPermissions.js +44 -0
- package/dist/src/runtime/actoviqSessionPermissions.js.map +1 -0
- package/dist/src/runtime/agentClient.d.ts +37 -3
- package/dist/src/runtime/agentClient.d.ts.map +1 -1
- package/dist/src/runtime/agentClient.js +1112 -100
- package/dist/src/runtime/agentClient.js.map +1 -1
- package/dist/src/runtime/agentSession.d.ts +8 -5
- package/dist/src/runtime/agentSession.d.ts.map +1 -1
- package/dist/src/runtime/agentSession.js +11 -4
- package/dist/src/runtime/agentSession.js.map +1 -1
- package/dist/src/runtime/conversationEngine.d.ts +2 -0
- package/dist/src/runtime/conversationEngine.d.ts.map +1 -1
- package/dist/src/runtime/conversationEngine.js +575 -36
- package/dist/src/runtime/conversationEngine.js.map +1 -1
- package/dist/src/runtime/defaultActoviqAgents.d.ts +3 -0
- package/dist/src/runtime/defaultActoviqAgents.d.ts.map +1 -0
- package/dist/src/runtime/defaultActoviqAgents.js +85 -0
- package/dist/src/runtime/defaultActoviqAgents.js.map +1 -0
- package/dist/src/runtime/safetyChecks.d.ts.map +1 -1
- package/dist/src/runtime/safetyChecks.js +15 -9
- package/dist/src/runtime/safetyChecks.js.map +1 -1
- package/dist/src/runtime/sessionManager.d.ts.map +1 -1
- package/dist/src/runtime/sessionManager.js +10 -5
- package/dist/src/runtime/sessionManager.js.map +1 -1
- package/dist/src/runtime/tools.d.ts.map +1 -1
- package/dist/src/runtime/tools.js +1 -0
- package/dist/src/runtime/tools.js.map +1 -1
- package/dist/src/scheduling/cron.d.ts.map +1 -1
- package/dist/src/scheduling/cron.js +3 -1
- package/dist/src/scheduling/cron.js.map +1 -1
- package/dist/src/storage/backgroundTaskStore.d.ts.map +1 -1
- package/dist/src/storage/backgroundTaskStore.js +3 -2
- package/dist/src/storage/backgroundTaskStore.js.map +1 -1
- package/dist/src/storage/mailboxStore.d.ts.map +1 -1
- package/dist/src/storage/mailboxStore.js +3 -3
- package/dist/src/storage/mailboxStore.js.map +1 -1
- package/dist/src/storage/pathSafety.d.ts +4 -0
- package/dist/src/storage/pathSafety.d.ts.map +1 -0
- package/dist/src/storage/pathSafety.js +28 -0
- package/dist/src/storage/pathSafety.js.map +1 -0
- package/dist/src/storage/sessionStore.d.ts +2 -2
- package/dist/src/storage/sessionStore.d.ts.map +1 -1
- package/dist/src/storage/sessionStore.js +23 -8
- package/dist/src/storage/sessionStore.js.map +1 -1
- package/dist/src/storage/teammateStore.d.ts.map +1 -1
- package/dist/src/storage/teammateStore.js +3 -2
- package/dist/src/storage/teammateStore.js.map +1 -1
- package/dist/src/swarm/actoviqSwarm.d.ts.map +1 -1
- package/dist/src/swarm/actoviqSwarm.js +6 -6
- package/dist/src/swarm/actoviqSwarm.js.map +1 -1
- package/dist/src/tools/actoviqCoreTools.d.ts +7 -2
- package/dist/src/tools/actoviqCoreTools.d.ts.map +1 -1
- package/dist/src/tools/actoviqCoreTools.js +2 -2
- package/dist/src/tools/actoviqCoreTools.js.map +1 -1
- package/dist/src/tools/actoviqFileTools.d.ts.map +1 -1
- package/dist/src/tools/actoviqFileTools.js +16 -5
- package/dist/src/tools/actoviqFileTools.js.map +1 -1
- package/dist/src/tools/actoviqNotebookEdit.d.ts.map +1 -1
- package/dist/src/tools/actoviqNotebookEdit.js +121 -4
- package/dist/src/tools/actoviqNotebookEdit.js.map +1 -1
- package/dist/src/tools/actoviqShellTools.d.ts.map +1 -1
- package/dist/src/tools/actoviqShellTools.js +38 -9
- package/dist/src/tools/actoviqShellTools.js.map +1 -1
- package/dist/src/tools/actoviqWebTools.d.ts.map +1 -1
- package/dist/src/tools/actoviqWebTools.js +50 -18
- package/dist/src/tools/actoviqWebTools.js.map +1 -1
- package/dist/src/tools/bash/BashTool.d.ts.map +1 -1
- package/dist/src/tools/bash/BashTool.js +47 -14
- package/dist/src/tools/bash/BashTool.js.map +1 -1
- package/dist/src/tools/todo/TodoWriteTool.d.ts +14 -0
- package/dist/src/tools/todo/TodoWriteTool.d.ts.map +1 -1
- package/dist/src/tools/todo/TodoWriteTool.js +45 -2
- package/dist/src/tools/todo/TodoWriteTool.js.map +1 -1
- package/dist/src/tui/actoviqTui.d.ts +13 -0
- package/dist/src/tui/actoviqTui.d.ts.map +1 -0
- package/dist/src/tui/actoviqTui.js +1594 -0
- package/dist/src/tui/actoviqTui.js.map +1 -0
- package/dist/src/tui/ansi.d.ts +33 -0
- package/dist/src/tui/ansi.d.ts.map +1 -0
- package/dist/src/tui/ansi.js +127 -0
- package/dist/src/tui/ansi.js.map +1 -0
- package/dist/src/tui/editor.d.ts +56 -0
- package/dist/src/tui/editor.d.ts.map +1 -0
- package/dist/src/tui/editor.js +253 -0
- package/dist/src/tui/editor.js.map +1 -0
- package/dist/src/tui/pluginCatalog.d.ts +13 -0
- package/dist/src/tui/pluginCatalog.d.ts.map +1 -0
- package/dist/src/tui/pluginCatalog.js +78 -0
- package/dist/src/tui/pluginCatalog.js.map +1 -0
- package/dist/src/tui/screen.d.ts +28 -0
- package/dist/src/tui/screen.d.ts.map +1 -0
- package/dist/src/tui/screen.js +119 -0
- package/dist/src/tui/screen.js.map +1 -0
- package/dist/src/tui/selection.d.ts +9 -0
- package/dist/src/tui/selection.d.ts.map +1 -0
- package/dist/src/tui/selection.js +16 -0
- package/dist/src/tui/selection.js.map +1 -0
- package/dist/src/tui/transcript.d.ts +41 -0
- package/dist/src/tui/transcript.d.ts.map +1 -0
- package/dist/src/tui/transcript.js +147 -0
- package/dist/src/tui/transcript.js.map +1 -0
- package/dist/src/types.d.ts +233 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/workflow/workflowEngine.js +26 -3
- package/dist/src/workflow/workflowEngine.js.map +1 -1
- package/dist/src/workspace/actoviqWorkspace.d.ts.map +1 -1
- package/dist/src/workspace/actoviqWorkspace.js +25 -2
- package/dist/src/workspace/actoviqWorkspace.js.map +1 -1
- package/package.json +26 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isRecord } from '../runtime/helpers.js';
|
|
4
|
+
export async function discoverActoviqPlugins(options) {
|
|
5
|
+
const candidates = [
|
|
6
|
+
path.join(options.homeDir, '.actoviq', 'plugins'),
|
|
7
|
+
path.join(options.workDir, '.actoviq', 'plugins'),
|
|
8
|
+
...(options.configuredDirs ?? []),
|
|
9
|
+
];
|
|
10
|
+
const roots = [...new Set(candidates.map(candidate => path.resolve(candidate)))];
|
|
11
|
+
const entries = new Map();
|
|
12
|
+
for (const root of roots) {
|
|
13
|
+
const direct = await readPlugin(root);
|
|
14
|
+
if (direct) {
|
|
15
|
+
entries.set(direct.path, direct);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
let children;
|
|
19
|
+
try {
|
|
20
|
+
children = await readdir(root, { withFileTypes: true });
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
for (const child of children) {
|
|
26
|
+
if (!child.isDirectory())
|
|
27
|
+
continue;
|
|
28
|
+
const plugin = await readPlugin(path.join(root, child.name));
|
|
29
|
+
if (plugin)
|
|
30
|
+
entries.set(plugin.path, plugin);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return [...entries.values()].sort((left, right) => left.name.localeCompare(right.name));
|
|
34
|
+
}
|
|
35
|
+
async function readPlugin(root) {
|
|
36
|
+
const manifestPaths = [
|
|
37
|
+
path.join(root, '.actoviq-plugin', 'plugin.json'),
|
|
38
|
+
path.join(root, 'plugin.json'),
|
|
39
|
+
];
|
|
40
|
+
for (const manifestPath of manifestPaths) {
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(await readFile(manifestPath, 'utf8'));
|
|
43
|
+
if (!isRecord(parsed))
|
|
44
|
+
continue;
|
|
45
|
+
return {
|
|
46
|
+
name: typeof parsed.name === 'string' ? parsed.name : path.basename(root),
|
|
47
|
+
path: root,
|
|
48
|
+
description: typeof parsed.description === 'string' ? parsed.description : undefined,
|
|
49
|
+
version: typeof parsed.version === 'string' ? parsed.version : undefined,
|
|
50
|
+
capabilities: await detectCapabilities(root),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Try the next supported manifest location.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
async function detectCapabilities(root) {
|
|
60
|
+
const candidates = [
|
|
61
|
+
['skills', path.join(root, 'skills')],
|
|
62
|
+
['agents', path.join(root, 'agents')],
|
|
63
|
+
['mcp', path.join(root, 'mcp.json')],
|
|
64
|
+
['hooks', path.join(root, 'hooks')],
|
|
65
|
+
];
|
|
66
|
+
const capabilities = [];
|
|
67
|
+
for (const [name, candidate] of candidates) {
|
|
68
|
+
try {
|
|
69
|
+
await stat(candidate);
|
|
70
|
+
capabilities.push(name);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Optional capability is absent.
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return capabilities;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=pluginCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginCatalog.js","sourceRoot":"","sources":["../../../src/tui/pluginCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ScreenOutput {
|
|
2
|
+
write(text: string): void;
|
|
3
|
+
columns?: number;
|
|
4
|
+
rows?: number;
|
|
5
|
+
on?(event: 'resize', listener: () => void): unknown;
|
|
6
|
+
off?(event: 'resize', listener: () => void): unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare class TuiScreen {
|
|
9
|
+
private readonly out;
|
|
10
|
+
private dynamicLines;
|
|
11
|
+
private dynamicVisualCount;
|
|
12
|
+
private started;
|
|
13
|
+
private readonly resizeListener;
|
|
14
|
+
constructor(out: ScreenOutput);
|
|
15
|
+
get width(): number;
|
|
16
|
+
get height(): number;
|
|
17
|
+
start(): void;
|
|
18
|
+
/** Erase the dynamic region, restore the cursor, and detach listeners. */
|
|
19
|
+
stop(): void;
|
|
20
|
+
/** Print lines permanently into scrollback above the dynamic region. */
|
|
21
|
+
appendStatic(lines: readonly string[]): void;
|
|
22
|
+
/** Replace the dynamic bottom region. Lines are pre-wrapped to width. */
|
|
23
|
+
setDynamic(lines: readonly string[]): void;
|
|
24
|
+
private redraw;
|
|
25
|
+
private redrawChangedLines;
|
|
26
|
+
private buildDynamicPaint;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=screen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../../src/tui/screen.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;IACpD,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;CACtD;AAED,qBAAa,SAAS;IAMR,OAAO,CAAC,QAAQ,CAAC,GAAG;IALhC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;gBAEzB,GAAG,EAAE,YAAY;IAE9C,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,KAAK,IAAI,IAAI;IAOb,0EAA0E;IAC1E,IAAI,IAAI,IAAI;IASZ,wEAAwE;IACxE,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAc5C,yEAAyE;IACzE,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAmB1C,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,iBAAiB;CAa1B"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scrollback-friendly renderer for the Actoviq TUI, mirroring Claude Code's
|
|
3
|
+
* default REPL model (Ink <Static> + dynamic bottom region) without React:
|
|
4
|
+
*
|
|
5
|
+
* - Transcript lines are printed permanently into the normal terminal
|
|
6
|
+
* scrollback (`appendStatic`).
|
|
7
|
+
* - A bottom dynamic region (status line, prompt bar, menus, dialogs) is
|
|
8
|
+
* redrawn in place (`setDynamic`).
|
|
9
|
+
*
|
|
10
|
+
* The real terminal cursor stays hidden and parked at the top-left of the
|
|
11
|
+
* dynamic region; the input caret is drawn as an inverse-video cell by the
|
|
12
|
+
* caller. That single invariant keeps erase/redraw bookkeeping trivial.
|
|
13
|
+
*/
|
|
14
|
+
import { wrapToWidth } from './ansi.js';
|
|
15
|
+
const HIDE_CURSOR = '\x1b[?25l';
|
|
16
|
+
const SHOW_CURSOR = '\x1b[?25h';
|
|
17
|
+
const CLEAR_DOWN = '\x1b[0J';
|
|
18
|
+
const CLEAR_LINE_RIGHT = '\x1b[0K';
|
|
19
|
+
const SAVE_CURSOR = '\x1b[s';
|
|
20
|
+
const RESTORE_CURSOR = '\x1b[u';
|
|
21
|
+
export class TuiScreen {
|
|
22
|
+
out;
|
|
23
|
+
dynamicLines = [];
|
|
24
|
+
dynamicVisualCount = 0;
|
|
25
|
+
started = false;
|
|
26
|
+
resizeListener = () => this.redraw();
|
|
27
|
+
constructor(out) {
|
|
28
|
+
this.out = out;
|
|
29
|
+
}
|
|
30
|
+
get width() {
|
|
31
|
+
return Math.max(this.out.columns ?? 80, 10);
|
|
32
|
+
}
|
|
33
|
+
get height() {
|
|
34
|
+
return Math.max(this.out.rows ?? 24, 6);
|
|
35
|
+
}
|
|
36
|
+
start() {
|
|
37
|
+
if (this.started)
|
|
38
|
+
return;
|
|
39
|
+
this.started = true;
|
|
40
|
+
this.out.write(HIDE_CURSOR);
|
|
41
|
+
this.out.on?.('resize', this.resizeListener);
|
|
42
|
+
}
|
|
43
|
+
/** Erase the dynamic region, restore the cursor, and detach listeners. */
|
|
44
|
+
stop() {
|
|
45
|
+
if (!this.started)
|
|
46
|
+
return;
|
|
47
|
+
this.started = false;
|
|
48
|
+
this.out.off?.('resize', this.resizeListener);
|
|
49
|
+
this.out.write(CLEAR_DOWN + SHOW_CURSOR);
|
|
50
|
+
this.dynamicLines = [];
|
|
51
|
+
this.dynamicVisualCount = 0;
|
|
52
|
+
}
|
|
53
|
+
/** Print lines permanently into scrollback above the dynamic region. */
|
|
54
|
+
appendStatic(lines) {
|
|
55
|
+
if (lines.length === 0)
|
|
56
|
+
return;
|
|
57
|
+
const wrapped = [];
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
wrapped.push(...wrapToWidth(line, this.width));
|
|
60
|
+
}
|
|
61
|
+
this.out.write(CLEAR_DOWN +
|
|
62
|
+
wrapped.join('\n') +
|
|
63
|
+
'\n' +
|
|
64
|
+
this.buildDynamicPaint());
|
|
65
|
+
}
|
|
66
|
+
/** Replace the dynamic bottom region. Lines are pre-wrapped to width. */
|
|
67
|
+
setDynamic(lines) {
|
|
68
|
+
const wrapped = [];
|
|
69
|
+
for (const line of lines) {
|
|
70
|
+
wrapped.push(...wrapToWidth(line, this.width));
|
|
71
|
+
}
|
|
72
|
+
// Keep the region within the viewport so cursor-up math stays valid.
|
|
73
|
+
const maxRows = this.height - 1;
|
|
74
|
+
const nextLines = wrapped.slice(0, maxRows);
|
|
75
|
+
if (sameLines(this.dynamicLines, nextLines))
|
|
76
|
+
return;
|
|
77
|
+
const previousLines = this.dynamicLines;
|
|
78
|
+
this.dynamicLines = nextLines;
|
|
79
|
+
if (previousLines.length === nextLines.length && nextLines.length > 0) {
|
|
80
|
+
this.redrawChangedLines(previousLines);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.redraw();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
redraw() {
|
|
87
|
+
this.out.write(CLEAR_DOWN + this.buildDynamicPaint());
|
|
88
|
+
}
|
|
89
|
+
redrawChangedLines(previousLines) {
|
|
90
|
+
let output = SAVE_CURSOR;
|
|
91
|
+
for (let index = 0; index < this.dynamicLines.length; index += 1) {
|
|
92
|
+
if (previousLines[index] === this.dynamicLines[index])
|
|
93
|
+
continue;
|
|
94
|
+
output += RESTORE_CURSOR;
|
|
95
|
+
if (index > 0)
|
|
96
|
+
output += `\x1b[${index}B`;
|
|
97
|
+
output += `\r${this.dynamicLines[index]}${CLEAR_LINE_RIGHT}`;
|
|
98
|
+
}
|
|
99
|
+
output += RESTORE_CURSOR;
|
|
100
|
+
this.out.write(output);
|
|
101
|
+
}
|
|
102
|
+
buildDynamicPaint() {
|
|
103
|
+
if (this.dynamicLines.length === 0) {
|
|
104
|
+
this.dynamicVisualCount = 0;
|
|
105
|
+
return '';
|
|
106
|
+
}
|
|
107
|
+
this.dynamicVisualCount = this.dynamicLines.length;
|
|
108
|
+
// Park the cursor back at the start of the region (column 1, top row).
|
|
109
|
+
let output = this.dynamicLines.join('\n') + '\r';
|
|
110
|
+
if (this.dynamicVisualCount > 1) {
|
|
111
|
+
output += `\x1b[${this.dynamicVisualCount - 1}A`;
|
|
112
|
+
}
|
|
113
|
+
return output;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function sameLines(left, right) {
|
|
117
|
+
return left.length === right.length && left.every((line, index) => line === right[index]);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../../src/tui/screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAC7B,MAAM,cAAc,GAAG,QAAQ,CAAC;AAUhC,MAAM,OAAO,SAAS;IAMS;IALrB,YAAY,GAAa,EAAE,CAAC;IAC5B,kBAAkB,GAAG,CAAC,CAAC;IACvB,OAAO,GAAG,KAAK,CAAC;IACP,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAEtD,YAA6B,GAAiB;QAAjB,QAAG,GAAH,GAAG,CAAc;IAAG,CAAC;IAElD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,0EAA0E;IAC1E,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,wEAAwE;IACxE,YAAY,CAAC,KAAwB;QACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,UAAU;YACR,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB,IAAI;YACJ,IAAI,CAAC,iBAAiB,EAAE,CAC3B,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,UAAU,CAAC,KAAwB;QACjC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,qEAAqE;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;YAAE,OAAO;QAEpD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,aAAa,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,kBAAkB,CAAC,aAAgC;QACzD,IAAI,MAAM,GAAG,WAAW,CAAC;QACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACjE,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;gBAAE,SAAS;YAChE,MAAM,IAAI,cAAc,CAAC;YACzB,IAAI,KAAK,GAAG,CAAC;gBAAE,MAAM,IAAI,QAAQ,KAAK,GAAG,CAAC;YAC1C,MAAM,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,gBAAgB,EAAE,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,cAAc,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QACnD,uEAAuE;QACvE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,QAAQ,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,IAAuB,EAAE,KAAwB;IAClE,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5F,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface TuiSelectionItem {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
detail?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function filterTuiSelectionItems(items: readonly TuiSelectionItem[], query: string): TuiSelectionItem[];
|
|
8
|
+
export declare function moveTuiSelection(selected: number, itemCount: number, delta: number): number;
|
|
9
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/tui/selection.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,KAAK,EAAE,MAAM,GACZ,gBAAgB,EAAE,CAUpB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function filterTuiSelectionItems(items, query) {
|
|
2
|
+
const normalized = query.trim().toLowerCase();
|
|
3
|
+
if (!normalized) {
|
|
4
|
+
return [...items];
|
|
5
|
+
}
|
|
6
|
+
return items.filter(item => [item.id, item.label, item.description, item.detail]
|
|
7
|
+
.filter((value) => typeof value === 'string')
|
|
8
|
+
.some(value => value.toLowerCase().includes(normalized)));
|
|
9
|
+
}
|
|
10
|
+
export function moveTuiSelection(selected, itemCount, delta) {
|
|
11
|
+
if (itemCount <= 0) {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
return (selected + delta + itemCount) % itemCount;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/tui/selection.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,uBAAuB,CACrC,KAAkC,EAClC,KAAa;IAEb,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACzB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;SACjD,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;SAC7D,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,SAAiB,EACjB,KAAa;IAEb,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Pick the most human-meaningful field of a tool input for the ⏺ line. */
|
|
2
|
+
export declare function summarizeToolInput(name: string, input: unknown): string;
|
|
3
|
+
export declare function formatUserPrompt(text: string): string[];
|
|
4
|
+
export declare function formatQueuedPrompt(text: string): string[];
|
|
5
|
+
export declare function formatToolCall(name: string, input: unknown, width: number): string[];
|
|
6
|
+
export declare function formatToolResult(result: {
|
|
7
|
+
isError: boolean;
|
|
8
|
+
durationMs?: number;
|
|
9
|
+
outputText?: string;
|
|
10
|
+
}, width: number): string[];
|
|
11
|
+
export declare function formatThinking(text: string, width: number): string[];
|
|
12
|
+
export declare function formatCompactNotice(trigger: 'auto' | 'reactive' | string, tokenEstimateBefore?: number, tokenEstimateAfter?: number): string[];
|
|
13
|
+
export declare function formatErrorLine(message: string): string[];
|
|
14
|
+
export declare function formatInfoLine(message: string): string[];
|
|
15
|
+
export declare function formatDivider(width: number): string[];
|
|
16
|
+
export declare function formatBanner(options: {
|
|
17
|
+
workDir: string;
|
|
18
|
+
model: string;
|
|
19
|
+
toolCount: number;
|
|
20
|
+
permissionMode: string;
|
|
21
|
+
version?: string;
|
|
22
|
+
width?: number;
|
|
23
|
+
}): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Incremental flusher for streamed assistant text: complete visual lines move
|
|
26
|
+
* into scrollback while the trailing partial line stays in the dynamic
|
|
27
|
+
* region, giving flicker-free streaming with native scrollback.
|
|
28
|
+
*/
|
|
29
|
+
export declare class StreamFlusher {
|
|
30
|
+
private readonly width;
|
|
31
|
+
private buffer;
|
|
32
|
+
constructor(width: () => number);
|
|
33
|
+
get hasContent(): boolean;
|
|
34
|
+
/** Feed a delta; returns full logical lines ready for scrollback. */
|
|
35
|
+
push(delta: string): string[];
|
|
36
|
+
/** The partial line to show live in the dynamic region. */
|
|
37
|
+
tail(): string;
|
|
38
|
+
/** Flush whatever remains (message completed). */
|
|
39
|
+
drain(): string[];
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../src/tui/transcript.ts"],"names":[],"mappings":"AAOA,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAiCvE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGvD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKpF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACtE,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,CAYV;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIpE;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,EACrC,mBAAmB,CAAC,EAAE,MAAM,EAC5B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,EAAE,CAMV;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,EAAE,CAWX;AAED;;;;GAIG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,MAAM,CAAM;gBAES,KAAK,EAAE,MAAM,MAAM;IAEhD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,qEAAqE;IACrE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAkB7B,2DAA2D;IAC3D,IAAI,IAAI,MAAM;IAId,kDAAkD;IAClD,KAAK,IAAI,MAAM,EAAE;CAMlB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure transcript-line formatters for the Actoviq TUI. These return styled
|
|
3
|
+
* strings (not yet wrapped); the screen layer wraps them to the terminal
|
|
4
|
+
* width before printing into scrollback.
|
|
5
|
+
*/
|
|
6
|
+
import { A, truncateToWidth } from './ansi.js';
|
|
7
|
+
/** Pick the most human-meaningful field of a tool input for the ⏺ line. */
|
|
8
|
+
export function summarizeToolInput(name, input) {
|
|
9
|
+
if (typeof input !== 'object' || input === null) {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
const record = input;
|
|
13
|
+
const preferredKeys = [
|
|
14
|
+
'command',
|
|
15
|
+
'file_path',
|
|
16
|
+
'notebook_path',
|
|
17
|
+
'pattern',
|
|
18
|
+
'path',
|
|
19
|
+
'url',
|
|
20
|
+
'skill',
|
|
21
|
+
'description',
|
|
22
|
+
'prompt',
|
|
23
|
+
'query',
|
|
24
|
+
'todos',
|
|
25
|
+
];
|
|
26
|
+
for (const key of preferredKeys) {
|
|
27
|
+
const value = record[key];
|
|
28
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
29
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
30
|
+
}
|
|
31
|
+
if (key === 'todos' && Array.isArray(value)) {
|
|
32
|
+
return `${value.length} item${value.length === 1 ? '' : 's'}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const json = JSON.stringify(record);
|
|
37
|
+
return json === '{}' ? '' : json;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function formatUserPrompt(text) {
|
|
44
|
+
const lines = text.split('\n');
|
|
45
|
+
return lines.map((line, index) => `${A.gray}${index === 0 ? '>' : ' '}${A.reset} ${A.bold}${line}${A.reset}`);
|
|
46
|
+
}
|
|
47
|
+
export function formatQueuedPrompt(text) {
|
|
48
|
+
return [`${A.gray}⧗ queued:${A.reset} ${A.dim}${text.replace(/\s+/g, ' ')}${A.reset}`];
|
|
49
|
+
}
|
|
50
|
+
export function formatToolCall(name, input, width) {
|
|
51
|
+
const summary = summarizeToolInput(name, input);
|
|
52
|
+
const head = `${A.green}⏺${A.reset} ${A.bold}${name}${A.reset}`;
|
|
53
|
+
if (!summary)
|
|
54
|
+
return [head];
|
|
55
|
+
return [`${head}${A.dim}(${truncateToWidth(summary, Math.max(width - name.length - 6, 16))})${A.reset}`];
|
|
56
|
+
}
|
|
57
|
+
export function formatToolResult(result, width) {
|
|
58
|
+
const mark = result.isError ? `${A.red}✗` : `${A.green}✓`;
|
|
59
|
+
const duration = typeof result.durationMs === 'number'
|
|
60
|
+
? result.durationMs < 1000
|
|
61
|
+
? `${result.durationMs}ms`
|
|
62
|
+
: `${(result.durationMs / 1000).toFixed(1)}s`
|
|
63
|
+
: '';
|
|
64
|
+
const output = (result.outputText ?? '').replace(/\s+/g, ' ').trim();
|
|
65
|
+
const meta = [duration, output].filter(Boolean).join(' · ');
|
|
66
|
+
const budget = Math.max(width - 6, 16);
|
|
67
|
+
return [` ${A.gray}⎿${A.reset} ${mark}${A.reset} ${A.dim}${truncateToWidth(meta, budget)}${A.reset}`];
|
|
68
|
+
}
|
|
69
|
+
export function formatThinking(text, width) {
|
|
70
|
+
const condensed = text.replace(/\s+/g, ' ').trim();
|
|
71
|
+
if (!condensed)
|
|
72
|
+
return [];
|
|
73
|
+
return [`${A.dim}∴ ${truncateToWidth(condensed, Math.max(width - 4, 16))}${A.reset}`];
|
|
74
|
+
}
|
|
75
|
+
export function formatCompactNotice(trigger, tokenEstimateBefore, tokenEstimateAfter) {
|
|
76
|
+
const detail = typeof tokenEstimateBefore === 'number' && typeof tokenEstimateAfter === 'number'
|
|
77
|
+
? ` (~${Math.round(tokenEstimateBefore / 1000)}k → ~${Math.round(tokenEstimateAfter / 1000)}k tokens)`
|
|
78
|
+
: '';
|
|
79
|
+
return [`${A.magenta}∿ context compacted${A.reset}${A.dim} · ${trigger}${detail}${A.reset}`];
|
|
80
|
+
}
|
|
81
|
+
export function formatErrorLine(message) {
|
|
82
|
+
return [`${A.red}✗ ${message}${A.reset}`];
|
|
83
|
+
}
|
|
84
|
+
export function formatInfoLine(message) {
|
|
85
|
+
return [`${A.dim}${message}${A.reset}`];
|
|
86
|
+
}
|
|
87
|
+
export function formatDivider(width) {
|
|
88
|
+
return [`${A.gray}${'─'.repeat(Math.max(Math.min(width, 80), 8))}${A.reset}`];
|
|
89
|
+
}
|
|
90
|
+
export function formatBanner(options) {
|
|
91
|
+
const width = Math.max(options.width ?? 80, 20);
|
|
92
|
+
const title = `Hadamard Agent${options.version ? ` v${options.version}` : ''}`;
|
|
93
|
+
const workDir = truncateToWidth(options.workDir, Math.max(width - 10, 20));
|
|
94
|
+
return [
|
|
95
|
+
`${A.cyan}${A.bold}✻ ${title}${A.reset}`,
|
|
96
|
+
`${A.dim} cwd ${A.reset}${workDir}`,
|
|
97
|
+
`${A.dim} model ${A.reset}${options.model} ${A.dim}· permissions: ${options.permissionMode}${A.reset}`,
|
|
98
|
+
`${A.dim} tools ${A.reset}${options.toolCount} loaded`,
|
|
99
|
+
'',
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Incremental flusher for streamed assistant text: complete visual lines move
|
|
104
|
+
* into scrollback while the trailing partial line stays in the dynamic
|
|
105
|
+
* region, giving flicker-free streaming with native scrollback.
|
|
106
|
+
*/
|
|
107
|
+
export class StreamFlusher {
|
|
108
|
+
width;
|
|
109
|
+
buffer = '';
|
|
110
|
+
constructor(width) {
|
|
111
|
+
this.width = width;
|
|
112
|
+
}
|
|
113
|
+
get hasContent() {
|
|
114
|
+
return this.buffer.length > 0;
|
|
115
|
+
}
|
|
116
|
+
/** Feed a delta; returns full logical lines ready for scrollback. */
|
|
117
|
+
push(delta) {
|
|
118
|
+
this.buffer += delta;
|
|
119
|
+
const lines = this.buffer.split('\n');
|
|
120
|
+
this.buffer = lines.pop() ?? '';
|
|
121
|
+
const flushed = [];
|
|
122
|
+
for (const line of lines) {
|
|
123
|
+
flushed.push(line);
|
|
124
|
+
}
|
|
125
|
+
// Overlong trailing line: flush all but the final partial visual row so
|
|
126
|
+
// the dynamic region stays one line tall.
|
|
127
|
+
const width = Math.max(this.width(), 8);
|
|
128
|
+
while (this.buffer.length > 3 * width) {
|
|
129
|
+
flushed.push(this.buffer.slice(0, width));
|
|
130
|
+
this.buffer = this.buffer.slice(width);
|
|
131
|
+
}
|
|
132
|
+
return flushed;
|
|
133
|
+
}
|
|
134
|
+
/** The partial line to show live in the dynamic region. */
|
|
135
|
+
tail() {
|
|
136
|
+
return this.buffer;
|
|
137
|
+
}
|
|
138
|
+
/** Flush whatever remains (message completed). */
|
|
139
|
+
drain() {
|
|
140
|
+
if (this.buffer.length === 0)
|
|
141
|
+
return [];
|
|
142
|
+
const rest = this.buffer;
|
|
143
|
+
this.buffer = '';
|
|
144
|
+
return [rest];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/tui/transcript.ts"],"names":[],"mappings":"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"}
|