arc402-cli 0.8.0 → 0.9.1
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/INK6-UX-SPEC.md +446 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +23 -7
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Header.d.ts +1 -1
- package/dist/tui/Header.d.ts.map +1 -1
- package/dist/tui/Header.js +6 -5
- package/dist/tui/Header.js.map +1 -1
- package/dist/tui/InputLine.d.ts +1 -2
- package/dist/tui/InputLine.d.ts.map +1 -1
- package/dist/tui/InputLine.js +76 -24
- package/dist/tui/InputLine.js.map +1 -1
- package/dist/tui/Viewport.d.ts.map +1 -1
- package/dist/tui/Viewport.js +4 -7
- package/dist/tui/Viewport.js.map +1 -1
- package/dist/tui/components/Button.d.ts +7 -0
- package/dist/tui/components/Button.d.ts.map +1 -0
- package/dist/tui/components/Button.js +18 -0
- package/dist/tui/components/Button.js.map +1 -0
- package/dist/tui/components/CeremonyView.d.ts +13 -0
- package/dist/tui/components/CeremonyView.d.ts.map +1 -0
- package/dist/tui/components/CeremonyView.js +7 -0
- package/dist/tui/components/CeremonyView.js.map +1 -0
- package/dist/tui/components/CompletionDropdown.d.ts +7 -0
- package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
- package/dist/tui/components/CompletionDropdown.js +20 -0
- package/dist/tui/components/CompletionDropdown.js.map +1 -0
- package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
- package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
- package/dist/tui/components/ConfirmPrompt.js +7 -0
- package/dist/tui/components/ConfirmPrompt.js.map +1 -0
- package/dist/tui/components/InteractiveTable.d.ts +14 -0
- package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
- package/dist/tui/components/InteractiveTable.js +58 -0
- package/dist/tui/components/InteractiveTable.js.map +1 -0
- package/dist/tui/components/StepSpinner.d.ts +11 -0
- package/dist/tui/components/StepSpinner.d.ts.map +1 -0
- package/dist/tui/components/StepSpinner.js +29 -0
- package/dist/tui/components/StepSpinner.js.map +1 -0
- package/dist/tui/components/Toast.d.ts +18 -0
- package/dist/tui/components/Toast.d.ts.map +1 -0
- package/dist/tui/components/Toast.js +25 -0
- package/dist/tui/components/Toast.js.map +1 -0
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +15 -1
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/useCommand.d.ts +3 -2
- package/dist/tui/useCommand.d.ts.map +1 -1
- package/dist/tui/useCommand.js +89 -7
- package/dist/tui/useCommand.js.map +1 -1
- package/dist/tui/useNotifications.d.ts +9 -0
- package/dist/tui/useNotifications.d.ts.map +1 -0
- package/dist/tui/useNotifications.js +14 -0
- package/dist/tui/useNotifications.js.map +1 -0
- package/dist/ui/banner.d.ts +12 -0
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +23 -0
- package/dist/ui/banner.js.map +1 -1
- package/package.json +1 -1
- package/src/tui/App.tsx +36 -17
- package/src/tui/Header.tsx +26 -5
- package/src/tui/InputLine.tsx +107 -32
- package/src/tui/Viewport.tsx +4 -7
- package/src/tui/components/Button.tsx +38 -0
- package/src/tui/components/CeremonyView.tsx +39 -0
- package/src/tui/components/CompletionDropdown.tsx +59 -0
- package/src/tui/components/ConfirmPrompt.tsx +36 -0
- package/src/tui/components/InteractiveTable.tsx +112 -0
- package/src/tui/components/StepSpinner.tsx +84 -0
- package/src/tui/components/Toast.tsx +59 -0
- package/src/tui/index.tsx +20 -1
- package/src/tui/useCommand.ts +98 -8
- package/src/tui/useNotifications.ts +28 -0
- package/src/ui/banner.ts +27 -0
package/dist/tui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAC;AAExF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAQtE,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAW,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;YAC5B,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1B,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAChD;SACF,CAAC,CAAC;QACH,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,IAAI,aAAiC,CAAC;IACtC,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC;QACvC,aAAa,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,OAA2B,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAClD,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAC,GAAG,IACF,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,GAChB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"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"}
|
package/dist/tui/useCommand.d.ts
CHANGED
|
@@ -4,8 +4,9 @@ interface UseCommandResult {
|
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
6
|
* Dispatches parsed commands to the commander program.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Interactive commands (WalletConnect, prompts) spawn a child process
|
|
8
|
+
* because Ink holds stdin in raw mode.
|
|
9
|
+
* Non-interactive commands run in-process with stdout monkey-patching.
|
|
9
10
|
*/
|
|
10
11
|
export declare function useCommand(): UseCommandResult;
|
|
11
12
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCommand.d.ts","sourceRoot":"","sources":["../../src/tui/useCommand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useCommand.d.ts","sourceRoot":"","sources":["../../src/tui/useCommand.ts"],"names":[],"mappings":"AAsCA,UAAU,gBAAgB;IACxB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CAuJ7C"}
|
package/dist/tui/useCommand.js
CHANGED
|
@@ -1,16 +1,87 @@
|
|
|
1
1
|
import { useState, useCallback } from "react";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
2
3
|
import { createProgram } from "../program.js";
|
|
3
4
|
import chalk from "chalk";
|
|
4
5
|
import { c } from "../ui/colors.js";
|
|
6
|
+
const INTERACTIVE_COMMANDS = new Set([
|
|
7
|
+
"wallet deploy",
|
|
8
|
+
"wallet set-guardian",
|
|
9
|
+
"wallet unfreeze",
|
|
10
|
+
"wallet authorize-machine-key",
|
|
11
|
+
"wallet revoke-machine-key",
|
|
12
|
+
"wallet set-passkey",
|
|
13
|
+
"wallet set-interceptor",
|
|
14
|
+
"wallet set-velocity-limit",
|
|
15
|
+
"wallet upgrade-registry",
|
|
16
|
+
"wallet execute-registry-upgrade",
|
|
17
|
+
"wallet cancel-registry-upgrade",
|
|
18
|
+
"wallet register-policy",
|
|
19
|
+
"wallet whitelist-contract",
|
|
20
|
+
"wallet governance setup",
|
|
21
|
+
"wallet policy set-limit",
|
|
22
|
+
"wallet policy set-daily-limit",
|
|
23
|
+
"wallet policy set",
|
|
24
|
+
"wallet import",
|
|
25
|
+
"config init",
|
|
26
|
+
]);
|
|
27
|
+
function isInteractiveCommand(input) {
|
|
28
|
+
const trimmed = input.trim();
|
|
29
|
+
for (const cmd of INTERACTIVE_COMMANDS) {
|
|
30
|
+
if (trimmed === cmd || trimmed.startsWith(cmd + " ")) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
5
36
|
/**
|
|
6
37
|
* Dispatches parsed commands to the commander program.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
38
|
+
* Interactive commands (WalletConnect, prompts) spawn a child process
|
|
39
|
+
* because Ink holds stdin in raw mode.
|
|
40
|
+
* Non-interactive commands run in-process with stdout monkey-patching.
|
|
9
41
|
*/
|
|
10
42
|
export function useCommand() {
|
|
11
43
|
const [isRunning, setIsRunning] = useState(false);
|
|
12
|
-
const
|
|
13
|
-
|
|
44
|
+
const executeInteractive = useCallback((input, onLine) => {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
const tokens = parseTokens(input);
|
|
47
|
+
const child = spawn(process.execPath, [process.argv[1], ...tokens], {
|
|
48
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
49
|
+
env: { ...process.env, ARC402_NO_TUI: "1", FORCE_COLOR: "1" },
|
|
50
|
+
cwd: process.cwd(),
|
|
51
|
+
});
|
|
52
|
+
let stdoutRemainder = "";
|
|
53
|
+
let stderrRemainder = "";
|
|
54
|
+
child.stdout?.on("data", (chunk) => {
|
|
55
|
+
stdoutRemainder += chunk.toString("utf8");
|
|
56
|
+
const lines = stdoutRemainder.split("\n");
|
|
57
|
+
stdoutRemainder = lines.pop() ?? "";
|
|
58
|
+
for (const line of lines)
|
|
59
|
+
onLine(line);
|
|
60
|
+
});
|
|
61
|
+
child.stderr?.on("data", (chunk) => {
|
|
62
|
+
stderrRemainder += chunk.toString("utf8");
|
|
63
|
+
const lines = stderrRemainder.split("\n");
|
|
64
|
+
stderrRemainder = lines.pop() ?? "";
|
|
65
|
+
for (const line of lines)
|
|
66
|
+
onLine(line);
|
|
67
|
+
});
|
|
68
|
+
child.on("close", (code) => {
|
|
69
|
+
if (stdoutRemainder.trim())
|
|
70
|
+
onLine(stdoutRemainder);
|
|
71
|
+
if (stderrRemainder.trim())
|
|
72
|
+
onLine(stderrRemainder);
|
|
73
|
+
if (code !== 0 && code !== null) {
|
|
74
|
+
onLine(` ${c.failure} ${chalk.red(`Command exited with code ${code}`)}`);
|
|
75
|
+
}
|
|
76
|
+
resolve();
|
|
77
|
+
});
|
|
78
|
+
child.on("error", (err) => {
|
|
79
|
+
onLine(` ${c.failure} ${chalk.red(`Failed to spawn: ${err.message}`)}`);
|
|
80
|
+
resolve();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}, []);
|
|
84
|
+
const executeInProcess = useCallback(async (input, onLine) => {
|
|
14
85
|
// Capture stdout/stderr
|
|
15
86
|
const originalStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
16
87
|
const originalStderrWrite = process.stderr.write.bind(process.stderr);
|
|
@@ -30,13 +101,11 @@ export function useCommand() {
|
|
|
30
101
|
: Buffer.from(chunk).toString("utf8");
|
|
31
102
|
captureBuffer += str;
|
|
32
103
|
flushBuffer();
|
|
33
|
-
// call callback if provided
|
|
34
104
|
const callback = typeof encodingOrCb === "function" ? encodingOrCb : cb;
|
|
35
105
|
if (callback)
|
|
36
106
|
callback();
|
|
37
107
|
return true;
|
|
38
108
|
};
|
|
39
|
-
// Monkey-patch (cast through unknown to bypass strict overload checking)
|
|
40
109
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
41
110
|
process.stdout.write = capturedWrite;
|
|
42
111
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -81,9 +150,22 @@ export function useCommand() {
|
|
|
81
150
|
process.stdout.write = originalStdoutWrite;
|
|
82
151
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
152
|
process.stderr.write = originalStderrWrite;
|
|
84
|
-
setIsRunning(false);
|
|
85
153
|
}
|
|
86
154
|
}, []);
|
|
155
|
+
const execute = useCallback(async (input, onLine) => {
|
|
156
|
+
setIsRunning(true);
|
|
157
|
+
try {
|
|
158
|
+
if (isInteractiveCommand(input)) {
|
|
159
|
+
await executeInteractive(input, onLine);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
await executeInProcess(input, onLine);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
setIsRunning(false);
|
|
167
|
+
}
|
|
168
|
+
}, [executeInteractive, executeInProcess]);
|
|
87
169
|
return { execute, isRunning };
|
|
88
170
|
}
|
|
89
171
|
// Shell-style tokenizer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCommand.js","sourceRoot":"","sources":["../../src/tui/useCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"useCommand.js","sourceRoot":"","sources":["../../src/tui/useCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ToastData, ToastVariant } from "./components/Toast.js";
|
|
2
|
+
interface UseNotificationsResult {
|
|
3
|
+
toasts: ToastData[];
|
|
4
|
+
push: (message: string, variant?: ToastVariant, duration?: number) => void;
|
|
5
|
+
dismiss: (id: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function useNotifications(): UseNotificationsResult;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=useNotifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNotifications.d.ts","sourceRoot":"","sources":["../../src/tui/useNotifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrE,UAAU,sBAAsB;IAC9B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,IAAI,sBAAsB,CAgBzD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useState, useCallback } from "react";
|
|
2
|
+
let _nextId = 0;
|
|
3
|
+
export function useNotifications() {
|
|
4
|
+
const [toasts, setToasts] = useState([]);
|
|
5
|
+
const push = useCallback((message, variant = "info", duration) => {
|
|
6
|
+
const id = `toast-${++_nextId}`;
|
|
7
|
+
setToasts((prev) => [...prev, { id, message, variant, duration }]);
|
|
8
|
+
}, []);
|
|
9
|
+
const dismiss = useCallback((id) => {
|
|
10
|
+
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
11
|
+
}, []);
|
|
12
|
+
return { toasts, push, dismiss };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=useNotifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNotifications.js","sourceRoot":"","sources":["../../src/tui/useNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAG9C,IAAI,OAAO,GAAG,CAAC,CAAC;AAQhB,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,OAAe,EAAE,UAAwB,MAAM,EAAE,QAAiB,EAAE,EAAE;QACrE,MAAM,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC;QAChC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QACzC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}
|
package/dist/ui/banner.d.ts
CHANGED
|
@@ -5,5 +5,17 @@ export interface BannerConfig {
|
|
|
5
5
|
}
|
|
6
6
|
/** Returns banner as an array of plain lines (no trailing newlines). */
|
|
7
7
|
export declare function getBannerLines(config?: BannerConfig): string[];
|
|
8
|
+
export interface StatusItem {
|
|
9
|
+
label: string;
|
|
10
|
+
value: string;
|
|
11
|
+
}
|
|
12
|
+
/** Returns the ASCII art lines (no status info) and a subtitle line. */
|
|
13
|
+
export declare function getBannerArt(): {
|
|
14
|
+
artLines: string[];
|
|
15
|
+
subtitle: string;
|
|
16
|
+
separator: string;
|
|
17
|
+
};
|
|
18
|
+
/** Returns structured status items for flexWrap rendering. */
|
|
19
|
+
export declare function getStatusItems(config?: BannerConfig): StatusItem[];
|
|
8
20
|
export declare function renderBanner(config?: BannerConfig): void;
|
|
9
21
|
//# sourceMappingURL=banner.d.ts.map
|
package/dist/ui/banner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,CAsB9D;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAIxD"}
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,CAsB9D;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wEAAwE;AACxE,wBAAgB,YAAY,IAAI;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAU1F;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,EAAE,CAMlE;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAIxD"}
|
package/dist/ui/banner.js
CHANGED
|
@@ -33,6 +33,29 @@ export function getBannerLines(config) {
|
|
|
33
33
|
lines.push("");
|
|
34
34
|
return lines;
|
|
35
35
|
}
|
|
36
|
+
/** Returns the ASCII art lines (no status info) and a subtitle line. */
|
|
37
|
+
export function getBannerArt() {
|
|
38
|
+
const artLines = [];
|
|
39
|
+
for (const l of ART.split("\n").slice(1)) {
|
|
40
|
+
artLines.push(chalk.cyan(l));
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
artLines,
|
|
44
|
+
subtitle: " " + chalk.dim(`agent-to-agent arcing · v${_pkg.version}`),
|
|
45
|
+
separator: " " + SEPARATOR,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Returns structured status items for flexWrap rendering. */
|
|
49
|
+
export function getStatusItems(config) {
|
|
50
|
+
const items = [];
|
|
51
|
+
if (config?.network)
|
|
52
|
+
items.push({ label: "Network", value: config.network });
|
|
53
|
+
if (config?.wallet)
|
|
54
|
+
items.push({ label: "Wallet", value: config.wallet });
|
|
55
|
+
if (config?.balance)
|
|
56
|
+
items.push({ label: "Balance", value: config.balance });
|
|
57
|
+
return items;
|
|
58
|
+
}
|
|
36
59
|
export function renderBanner(config) {
|
|
37
60
|
for (const line of getBannerLines(config)) {
|
|
38
61
|
console.log(line);
|
package/dist/ui/banner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAC;AAEzF,MAAM,GAAG,GAAG;;;;;;wDAM4C,CAAC;AAEzD,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAQ1E,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,sCAAsC;IACtC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;IAC5B,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,MAAM,CAAC,MAAM;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,MAAM,CAAC,OAAO;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/tui/App.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useState, useCallback, useEffect } from "react";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
|
-
import { Box, Text, useApp } from "ink";
|
|
3
|
+
import { Box, Text, useApp, useInput, useStdout } from "ink";
|
|
4
4
|
import { Header } from "./Header.js";
|
|
5
5
|
import { Viewport } from "./Viewport.js";
|
|
6
6
|
import { Footer } from "./Footer.js";
|
|
@@ -8,6 +8,8 @@ import { InputLine } from "./InputLine.js";
|
|
|
8
8
|
import { useCommand } from "./useCommand.js";
|
|
9
9
|
import { useChat } from "./useChat.js";
|
|
10
10
|
import { useScroll } from "./useScroll.js";
|
|
11
|
+
import { useNotifications } from "./useNotifications.js";
|
|
12
|
+
import { ToastContainer } from "./components/Toast.js";
|
|
11
13
|
import { createProgram } from "../program.js";
|
|
12
14
|
import chalk from "chalk";
|
|
13
15
|
|
|
@@ -27,6 +29,9 @@ interface AppProps {
|
|
|
27
29
|
*/
|
|
28
30
|
export function App({ version, network, wallet, balance }: AppProps) {
|
|
29
31
|
const { exit } = useApp();
|
|
32
|
+
|
|
33
|
+
const { stdout } = useStdout();
|
|
34
|
+
|
|
30
35
|
const [outputBuffer, setOutputBuffer] = useState<string[]>([
|
|
31
36
|
chalk.dim(" Type 'help' to see available commands"),
|
|
32
37
|
"",
|
|
@@ -36,15 +41,15 @@ export function App({ version, network, wallet, balance }: AppProps) {
|
|
|
36
41
|
const { execute, isRunning } = useCommand();
|
|
37
42
|
const { send, isSending } = useChat();
|
|
38
43
|
|
|
39
|
-
// Approximate viewport height for scroll management
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const rows = process.stdout.rows ?? 24;
|
|
43
|
-
const viewportHeight = Math.max(1, rows - HEADER_ROWS - FOOTER_ROWS);
|
|
44
|
+
// Approximate viewport height for scroll management (used by useScroll)
|
|
45
|
+
const rows = stdout?.rows ?? process.stdout.rows ?? 24;
|
|
46
|
+
const viewportHeight = Math.max(1, rows - 18);
|
|
44
47
|
|
|
45
48
|
const { scrollOffset, isAutoScroll, scrollUp, scrollDown, snapToBottom } =
|
|
46
49
|
useScroll(viewportHeight);
|
|
47
50
|
|
|
51
|
+
const { toasts, dismiss: dismissToast } = useNotifications();
|
|
52
|
+
|
|
48
53
|
// Get top-level command names for dispatch detection
|
|
49
54
|
const [topCmds] = useState<string[]>(() => {
|
|
50
55
|
try {
|
|
@@ -55,6 +60,20 @@ export function App({ version, network, wallet, balance }: AppProps) {
|
|
|
55
60
|
}
|
|
56
61
|
});
|
|
57
62
|
|
|
63
|
+
// ── Enhanced keyboard shortcuts ────────────────────────────────────────
|
|
64
|
+
useInput((input, key) => {
|
|
65
|
+
// Ctrl+L — clear viewport
|
|
66
|
+
if (key.ctrl && input === "l") {
|
|
67
|
+
setOutputBuffer([]);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Escape — cancel / clear (snap to bottom if scrolled)
|
|
71
|
+
if (key.escape) {
|
|
72
|
+
snapToBottom();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
58
77
|
const appendLine = useCallback((line: string) => {
|
|
59
78
|
setOutputBuffer((prev) => [...prev, line]);
|
|
60
79
|
}, []);
|
|
@@ -183,19 +202,16 @@ export function App({ version, network, wallet, balance }: AppProps) {
|
|
|
183
202
|
|
|
184
203
|
const isDisabled = isProcessing || isRunning || isSending;
|
|
185
204
|
|
|
205
|
+
const cols = Math.min(stdout?.columns ?? process.stdout.columns ?? 80, 120);
|
|
206
|
+
|
|
186
207
|
return (
|
|
187
208
|
<Box flexDirection="column" height="100%">
|
|
188
|
-
{/*
|
|
189
|
-
<Header
|
|
190
|
-
version={version}
|
|
191
|
-
network={network}
|
|
192
|
-
wallet={wallet}
|
|
193
|
-
balance={balance}
|
|
194
|
-
/>
|
|
209
|
+
{/* BANNER — memoized, participates in flex layout */}
|
|
210
|
+
<Header version={version} network={network} wallet={wallet} balance={balance} />
|
|
195
211
|
|
|
196
212
|
{/* Separator */}
|
|
197
|
-
<Box>
|
|
198
|
-
<Text dimColor>{"─".repeat(
|
|
213
|
+
<Box flexShrink={0}>
|
|
214
|
+
<Text dimColor>{"─".repeat(cols)}</Text>
|
|
199
215
|
</Box>
|
|
200
216
|
|
|
201
217
|
{/* VIEWPORT — fills remaining space */}
|
|
@@ -205,9 +221,12 @@ export function App({ version, network, wallet, balance }: AppProps) {
|
|
|
205
221
|
isAutoScroll={isAutoScroll}
|
|
206
222
|
/>
|
|
207
223
|
|
|
224
|
+
{/* Notification toasts — above footer */}
|
|
225
|
+
<ToastContainer toasts={toasts} onDismiss={dismissToast} />
|
|
226
|
+
|
|
208
227
|
{/* Bottom separator */}
|
|
209
|
-
<Box>
|
|
210
|
-
<Text dimColor>{"─".repeat(
|
|
228
|
+
<Box flexShrink={0}>
|
|
229
|
+
<Text dimColor>{"─".repeat(cols)}</Text>
|
|
211
230
|
</Box>
|
|
212
231
|
|
|
213
232
|
{/* FOOTER — fixed, input pinned */}
|
package/src/tui/Header.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
|
-
import {
|
|
3
|
+
import { getBannerArt, getStatusItems } from "../ui/banner.js";
|
|
4
|
+
import type { BannerConfig } from "../ui/banner.js";
|
|
4
5
|
|
|
5
6
|
interface HeaderProps {
|
|
6
7
|
version: string;
|
|
@@ -11,20 +12,40 @@ interface HeaderProps {
|
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Fixed header showing the ASCII art banner + status info.
|
|
14
|
-
*
|
|
15
|
+
* Status items use flexWrap to adapt to narrow terminals.
|
|
15
16
|
*/
|
|
16
17
|
export const Header = React.memo(function Header({
|
|
17
18
|
network,
|
|
18
19
|
wallet,
|
|
19
20
|
balance,
|
|
20
21
|
}: HeaderProps) {
|
|
21
|
-
const
|
|
22
|
+
const { artLines, subtitle, separator } = getBannerArt();
|
|
23
|
+
const statusItems = getStatusItems({ network, wallet, balance });
|
|
22
24
|
|
|
23
25
|
return (
|
|
24
|
-
<Box flexDirection="column">
|
|
25
|
-
{
|
|
26
|
+
<Box flexDirection="column" flexShrink={0}>
|
|
27
|
+
{artLines.map((line, i) => (
|
|
26
28
|
<Text key={i}>{line}</Text>
|
|
27
29
|
))}
|
|
30
|
+
<Text>{""}</Text>
|
|
31
|
+
<Text>{subtitle}</Text>
|
|
32
|
+
<Text>{separator}</Text>
|
|
33
|
+
{statusItems.length > 0 && (
|
|
34
|
+
<>
|
|
35
|
+
<Text>{""}</Text>
|
|
36
|
+
<Box flexWrap="wrap" columnGap={2}>
|
|
37
|
+
{statusItems.map((item) => (
|
|
38
|
+
<Box key={item.label}>
|
|
39
|
+
<Text dimColor>{item.label}</Text>
|
|
40
|
+
<Text> {item.value}</Text>
|
|
41
|
+
</Box>
|
|
42
|
+
))}
|
|
43
|
+
</Box>
|
|
44
|
+
</>
|
|
45
|
+
)}
|
|
46
|
+
<Text>{""}</Text>
|
|
47
|
+
<Text dimColor>{" Type 'help' to get started"}</Text>
|
|
48
|
+
<Text>{""}</Text>
|
|
28
49
|
</Box>
|
|
29
50
|
);
|
|
30
51
|
});
|