arc402-cli 1.0.0-rc.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -2
- package/dist/abis.d.ts +1 -0
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +29 -1
- package/dist/abis.js.map +1 -1
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +106 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/compute.d.ts +14 -0
- package/dist/commands/compute.d.ts.map +1 -0
- package/dist/commands/compute.js +466 -0
- package/dist/commands/compute.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +67 -0
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/discover.d.ts.map +1 -1
- package/dist/commands/discover.js +60 -15
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +205 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/tunnel.d.ts +3 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +281 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +299 -65
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +146 -9
- package/dist/commands/watch.js.map +1 -1
- package/dist/commands/workroom.d.ts.map +1 -1
- package/dist/commands/workroom.js +112 -6
- package/dist/commands/workroom.js.map +1 -1
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +41 -4
- package/dist/config.js.map +1 -1
- package/dist/daemon/compute-metering.d.ts +61 -0
- package/dist/daemon/compute-metering.d.ts.map +1 -0
- package/dist/daemon/compute-metering.js +299 -0
- package/dist/daemon/compute-metering.js.map +1 -0
- package/dist/daemon/compute-session.d.ts +100 -0
- package/dist/daemon/compute-session.d.ts.map +1 -0
- package/dist/daemon/compute-session.js +231 -0
- package/dist/daemon/compute-session.js.map +1 -0
- package/dist/daemon/config.d.ts +33 -1
- package/dist/daemon/config.d.ts.map +1 -1
- package/dist/daemon/config.js +69 -0
- package/dist/daemon/config.js.map +1 -1
- package/dist/daemon/credentials.d.ts +24 -0
- package/dist/daemon/credentials.d.ts.map +1 -0
- package/dist/daemon/credentials.js +80 -0
- package/dist/daemon/credentials.js.map +1 -0
- package/dist/daemon/delivery-client.d.ts +35 -0
- package/dist/daemon/delivery-client.d.ts.map +1 -0
- package/dist/daemon/delivery-client.js +231 -0
- package/dist/daemon/delivery-client.js.map +1 -0
- package/dist/daemon/file-delivery.d.ts +98 -0
- package/dist/daemon/file-delivery.d.ts.map +1 -0
- package/dist/daemon/file-delivery.js +461 -0
- package/dist/daemon/file-delivery.js.map +1 -0
- package/dist/daemon/index.d.ts +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +793 -227
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/notify.d.ts +35 -6
- package/dist/daemon/notify.d.ts.map +1 -1
- package/dist/daemon/notify.js +176 -48
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/worker-executor.d.ts +71 -0
- package/dist/daemon/worker-executor.d.ts.map +1 -0
- package/dist/daemon/worker-executor.js +382 -0
- package/dist/daemon/worker-executor.js.map +1 -0
- package/dist/drain-v4.js +2 -2
- package/dist/drain-v4.js.map +1 -1
- package/dist/endpoint-notify.d.ts +9 -1
- package/dist/endpoint-notify.d.ts.map +1 -1
- package/dist/endpoint-notify.js +116 -3
- package/dist/endpoint-notify.js.map +1 -1
- package/dist/index.js +81 -1
- package/dist/index.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +8 -0
- package/dist/program.js.map +1 -1
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +69 -486
- package/dist/repl.js.map +1 -1
- package/dist/tui/App.d.ts +12 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +154 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/Footer.d.ts +11 -0
- package/dist/tui/Footer.d.ts.map +1 -0
- package/dist/tui/Footer.js +13 -0
- package/dist/tui/Footer.js.map +1 -0
- package/dist/tui/Header.d.ts +14 -0
- package/dist/tui/Header.d.ts.map +1 -0
- package/dist/tui/Header.js +19 -0
- package/dist/tui/Header.js.map +1 -0
- package/dist/tui/InputLine.d.ts +11 -0
- package/dist/tui/InputLine.d.ts.map +1 -0
- package/dist/tui/InputLine.js +145 -0
- package/dist/tui/InputLine.js.map +1 -0
- package/dist/tui/Viewport.d.ts +14 -0
- package/dist/tui/Viewport.d.ts.map +1 -0
- package/dist/tui/Viewport.js +48 -0
- package/dist/tui/Viewport.js.map +1 -0
- package/dist/tui/WalletConnectPairing.d.ts +23 -0
- package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
- package/dist/tui/WalletConnectPairing.js +61 -0
- package/dist/tui/WalletConnectPairing.js.map +1 -0
- 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 +21 -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 +10 -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 +23 -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 +10 -0
- package/dist/tui/components/ConfirmPrompt.js.map +1 -0
- package/dist/tui/components/CustomTextInput.d.ts +15 -0
- package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
- package/dist/tui/components/CustomTextInput.js +99 -0
- package/dist/tui/components/CustomTextInput.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 +61 -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 +32 -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 +29 -0
- package/dist/tui/components/Toast.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +55 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/useChat.d.ts +11 -0
- package/dist/tui/useChat.d.ts.map +1 -0
- package/dist/tui/useChat.js +91 -0
- package/dist/tui/useChat.js.map +1 -0
- package/dist/tui/useCommand.d.ts +12 -0
- package/dist/tui/useCommand.d.ts.map +1 -0
- package/dist/tui/useCommand.js +137 -0
- package/dist/tui/useCommand.js.map +1 -0
- package/dist/tui/useNotifications.d.ts +9 -0
- package/dist/tui/useNotifications.d.ts.map +1 -0
- package/dist/tui/useNotifications.js +17 -0
- package/dist/tui/useNotifications.js.map +1 -0
- package/dist/tui/useScroll.d.ts +17 -0
- package/dist/tui/useScroll.d.ts.map +1 -0
- package/dist/tui/useScroll.js +46 -0
- package/dist/tui/useScroll.js.map +1 -0
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +2 -0
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/qr-render.d.ts +25 -0
- package/dist/ui/qr-render.d.ts.map +1 -0
- package/dist/ui/qr-render.js +90 -0
- package/dist/ui/qr-render.js.map +1 -0
- package/dist/ui/rpc-fallback.d.ts +11 -0
- package/dist/ui/rpc-fallback.d.ts.map +1 -0
- package/dist/ui/rpc-fallback.js +58 -0
- package/dist/ui/rpc-fallback.js.map +1 -0
- package/dist/walletconnect.d.ts +4 -0
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js.map +1 -1
- package/package.json +11 -3
- package/scripts/authorize-machine-key.ts +0 -43
- package/scripts/drain-wallet.ts +0 -149
- package/scripts/execute-spend-only.ts +0 -81
- package/scripts/register-agent-userop.ts +0 -186
- package/src/abis.ts +0 -187
- package/src/bundler.ts +0 -235
- package/src/client.ts +0 -36
- package/src/coinbase-smart-wallet.ts +0 -51
- package/src/commands/accept.ts +0 -64
- package/src/commands/agent-handshake.ts +0 -72
- package/src/commands/agent.ts +0 -691
- package/src/commands/agreements.ts +0 -350
- package/src/commands/arbitrator.ts +0 -180
- package/src/commands/arena-handshake.ts +0 -257
- package/src/commands/arena.ts +0 -122
- package/src/commands/cancel.ts +0 -35
- package/src/commands/channel.ts +0 -218
- package/src/commands/coldstart.ts +0 -165
- package/src/commands/config.ts +0 -58
- package/src/commands/contract-interaction.ts +0 -166
- package/src/commands/daemon.ts +0 -978
- package/src/commands/deliver.ts +0 -148
- package/src/commands/discover.ts +0 -297
- package/src/commands/dispute.ts +0 -375
- package/src/commands/endpoint.ts +0 -620
- package/src/commands/feed.ts +0 -229
- package/src/commands/hire.ts +0 -245
- package/src/commands/migrate.ts +0 -177
- package/src/commands/negotiate.ts +0 -271
- package/src/commands/openshell.ts +0 -1055
- package/src/commands/owner.ts +0 -35
- package/src/commands/policy.ts +0 -263
- package/src/commands/relay.ts +0 -273
- package/src/commands/remediate.ts +0 -24
- package/src/commands/reputation.ts +0 -79
- package/src/commands/setup.ts +0 -343
- package/src/commands/trust.ts +0 -27
- package/src/commands/verify.ts +0 -91
- package/src/commands/wallet.ts +0 -3280
- package/src/commands/watch.ts +0 -23
- package/src/commands/watchtower.ts +0 -248
- package/src/commands/workroom.ts +0 -959
- package/src/config.ts +0 -174
- package/src/daemon/config.ts +0 -308
- package/src/daemon/hire-listener.ts +0 -226
- package/src/daemon/index.ts +0 -955
- package/src/daemon/job-lifecycle.ts +0 -215
- package/src/daemon/notify.ts +0 -157
- package/src/daemon/token-metering.ts +0 -183
- package/src/daemon/userops.ts +0 -119
- package/src/daemon/wallet-monitor.ts +0 -90
- package/src/drain-v4.ts +0 -159
- package/src/endpoint-config.ts +0 -83
- package/src/endpoint-notify.ts +0 -46
- package/src/index.ts +0 -26
- package/src/openshell-runtime.ts +0 -277
- package/src/program.ts +0 -83
- package/src/repl.ts +0 -680
- package/src/signing.ts +0 -28
- package/src/telegram-notify.ts +0 -88
- package/src/ui/banner.ts +0 -51
- package/src/ui/colors.ts +0 -30
- package/src/ui/format.ts +0 -77
- package/src/ui/spinner.ts +0 -56
- package/src/ui/tree.ts +0 -16
- package/src/utils/format.ts +0 -48
- package/src/utils/hash.ts +0 -5
- package/src/utils/time.ts +0 -15
- package/src/wallet-router.ts +0 -178
- package/src/walletconnect-session.ts +0 -27
- package/src/walletconnect.ts +0 -294
- package/test/time.test.js +0 -11
- package/tsconfig.json +0 -19
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":";;;;;AA+CA,8BAwBC;;AAtED,6BAA6B;AAC7B,+BAA4B;AAC5B,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,8DAA8D;AAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAQtE,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,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,8DAA8D;QAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAA4B,CAAC;QAC/D,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;AAEM,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,IAAA,YAAM,EAC9B,uBAAC,SAAG,IACF,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;IAEF,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface UseChatResult {
|
|
2
|
+
send: (message: string, onLine: (line: string) => void) => Promise<void>;
|
|
3
|
+
isSending: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Sends messages to the OpenClaw gateway and streams responses
|
|
7
|
+
* line-by-line into the viewport buffer via onLine callback.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useChat(): UseChatResult;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=useChat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/tui/useChat.ts"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,aAAa,CAyFvC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.useChat = useChat;
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const colors_1 = require("../ui/colors");
|
|
10
|
+
/**
|
|
11
|
+
* Sends messages to the OpenClaw gateway and streams responses
|
|
12
|
+
* line-by-line into the viewport buffer via onLine callback.
|
|
13
|
+
*/
|
|
14
|
+
function useChat() {
|
|
15
|
+
const [isSending, setIsSending] = (0, react_1.useState)(false);
|
|
16
|
+
const send = (0, react_1.useCallback)(async (message, onLine) => {
|
|
17
|
+
setIsSending(true);
|
|
18
|
+
const trimmed = message.trim().slice(0, 10000);
|
|
19
|
+
// Show thinking placeholder
|
|
20
|
+
onLine(chalk_1.default.dim(" ◈ ") + chalk_1.default.dim("thinking..."));
|
|
21
|
+
let res;
|
|
22
|
+
try {
|
|
23
|
+
res = await fetch("http://localhost:19000/api/agent", {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: { "Content-Type": "application/json" },
|
|
26
|
+
body: JSON.stringify({ message: trimmed, session: "arc402-tui" }),
|
|
27
|
+
signal: AbortSignal.timeout(30000),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
32
|
+
const isDown = msg.includes("ECONNREFUSED") ||
|
|
33
|
+
msg.includes("fetch failed") ||
|
|
34
|
+
msg.includes("ENOTFOUND") ||
|
|
35
|
+
msg.includes("UND_ERR_SOCKET");
|
|
36
|
+
if (isDown) {
|
|
37
|
+
onLine(" " +
|
|
38
|
+
chalk_1.default.yellow("⚠") +
|
|
39
|
+
" " +
|
|
40
|
+
chalk_1.default.dim("OpenClaw gateway not running. Start with: ") +
|
|
41
|
+
chalk_1.default.white("openclaw gateway start"));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
onLine(` ${colors_1.c.failure} ${chalk_1.default.red(msg)}`);
|
|
45
|
+
}
|
|
46
|
+
setIsSending(false);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!res.body) {
|
|
50
|
+
onLine(chalk_1.default.dim(" ◈ ") + chalk_1.default.white("(empty response)"));
|
|
51
|
+
setIsSending(false);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const flushLine = (line) => {
|
|
55
|
+
// Unwrap SSE data lines
|
|
56
|
+
if (line.startsWith("data: ")) {
|
|
57
|
+
line = line.slice(6);
|
|
58
|
+
if (line === "[DONE]")
|
|
59
|
+
return;
|
|
60
|
+
try {
|
|
61
|
+
const j = JSON.parse(line);
|
|
62
|
+
line = j.text ?? j.content ?? j.delta?.text ?? line;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* use raw */
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (line.trim()) {
|
|
69
|
+
onLine(chalk_1.default.dim(" ◈ ") + chalk_1.default.white(line));
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const reader = res.body.getReader();
|
|
73
|
+
const decoder = new TextDecoder();
|
|
74
|
+
let buffer = "";
|
|
75
|
+
while (true) {
|
|
76
|
+
const { done, value } = await reader.read();
|
|
77
|
+
if (done)
|
|
78
|
+
break;
|
|
79
|
+
buffer += decoder.decode(value, { stream: true });
|
|
80
|
+
const lines = buffer.split("\n");
|
|
81
|
+
buffer = lines.pop() ?? "";
|
|
82
|
+
for (const line of lines)
|
|
83
|
+
flushLine(line);
|
|
84
|
+
}
|
|
85
|
+
if (buffer.trim())
|
|
86
|
+
flushLine(buffer);
|
|
87
|
+
setIsSending(false);
|
|
88
|
+
}, []);
|
|
89
|
+
return { send, isSending };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=useChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChat.js","sourceRoot":"","sources":["../../src/tui/useChat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface UseCommandResult {
|
|
2
|
+
execute: (input: string, onLine: (line: string) => void) => Promise<void>;
|
|
3
|
+
isRunning: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Dispatches parsed commands to the commander program.
|
|
7
|
+
* Captures stdout/stderr by monkey-patching process.stdout.write
|
|
8
|
+
* and routes all output to the viewport buffer via onLine callback.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useCommand(): UseCommandResult;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=useCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCommand.d.ts","sourceRoot":"","sources":["../../src/tui/useCommand.ts"],"names":[],"mappings":"AAKA,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;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CA+F7C"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.useCommand = useCommand;
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const program_1 = require("../program");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const colors_1 = require("../ui/colors");
|
|
11
|
+
/**
|
|
12
|
+
* Dispatches parsed commands to the commander program.
|
|
13
|
+
* Captures stdout/stderr by monkey-patching process.stdout.write
|
|
14
|
+
* and routes all output to the viewport buffer via onLine callback.
|
|
15
|
+
*/
|
|
16
|
+
function useCommand() {
|
|
17
|
+
const [isRunning, setIsRunning] = (0, react_1.useState)(false);
|
|
18
|
+
const execute = (0, react_1.useCallback)(async (input, onLine) => {
|
|
19
|
+
setIsRunning(true);
|
|
20
|
+
// Capture stdout/stderr
|
|
21
|
+
const originalStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
22
|
+
const originalStderrWrite = process.stderr.write.bind(process.stderr);
|
|
23
|
+
let captureBuffer = "";
|
|
24
|
+
const flushBuffer = () => {
|
|
25
|
+
if (!captureBuffer)
|
|
26
|
+
return;
|
|
27
|
+
const lines = captureBuffer.split("\n");
|
|
28
|
+
captureBuffer = lines.pop() ?? "";
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
onLine(line);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const capturedWrite = (chunk, encodingOrCb, cb) => {
|
|
34
|
+
const str = typeof chunk === "string"
|
|
35
|
+
? chunk
|
|
36
|
+
: Buffer.from(chunk).toString("utf8");
|
|
37
|
+
captureBuffer += str;
|
|
38
|
+
flushBuffer();
|
|
39
|
+
// call callback if provided
|
|
40
|
+
const callback = typeof encodingOrCb === "function" ? encodingOrCb : cb;
|
|
41
|
+
if (callback)
|
|
42
|
+
callback();
|
|
43
|
+
return true;
|
|
44
|
+
};
|
|
45
|
+
// Monkey-patch (cast through unknown to bypass strict overload checking)
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
process.stdout.write = capturedWrite;
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
process.stderr.write = capturedWrite;
|
|
50
|
+
try {
|
|
51
|
+
const tokens = parseTokens(input);
|
|
52
|
+
const prog = (0, program_1.createProgram)();
|
|
53
|
+
prog.exitOverride();
|
|
54
|
+
prog.configureOutput({
|
|
55
|
+
writeOut: (str) => process.stdout.write(str),
|
|
56
|
+
writeErr: (str) => process.stderr.write(str),
|
|
57
|
+
});
|
|
58
|
+
await prog.parseAsync(["node", "arc402", ...tokens]);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const e = err;
|
|
62
|
+
if (e.code === "commander.helpDisplayed" ||
|
|
63
|
+
e.code === "commander.version" ||
|
|
64
|
+
e.code === "commander.executeSubCommandAsync") {
|
|
65
|
+
// already written or normal exit — no-op
|
|
66
|
+
}
|
|
67
|
+
else if (e.code === "commander.unknownCommand") {
|
|
68
|
+
const tokens = parseTokens(input);
|
|
69
|
+
onLine(` ${colors_1.c.failure} ${chalk_1.default.red(`Unknown command: ${chalk_1.default.white(tokens[0])}`)} `);
|
|
70
|
+
onLine(chalk_1.default.dim(" Type 'help' for available commands"));
|
|
71
|
+
}
|
|
72
|
+
else if (e.code?.startsWith("commander.")) {
|
|
73
|
+
onLine(` ${colors_1.c.failure} ${chalk_1.default.red(e.message ?? String(err))}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
onLine(` ${colors_1.c.failure} ${chalk_1.default.red(e.message ?? String(err))}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
// Flush remaining buffer
|
|
81
|
+
if (captureBuffer.trim()) {
|
|
82
|
+
onLine(captureBuffer);
|
|
83
|
+
captureBuffer = "";
|
|
84
|
+
}
|
|
85
|
+
// Restore original write functions
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
|
+
process.stdout.write = originalStdoutWrite;
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
process.stderr.write = originalStderrWrite;
|
|
90
|
+
setIsRunning(false);
|
|
91
|
+
}
|
|
92
|
+
}, []);
|
|
93
|
+
return { execute, isRunning };
|
|
94
|
+
}
|
|
95
|
+
// Shell-style tokenizer
|
|
96
|
+
function parseTokens(input) {
|
|
97
|
+
const tokens = [];
|
|
98
|
+
let current = "";
|
|
99
|
+
let inQuote = false;
|
|
100
|
+
let quoteChar = "";
|
|
101
|
+
let escape = false;
|
|
102
|
+
for (const ch of input) {
|
|
103
|
+
if (escape) {
|
|
104
|
+
current += ch;
|
|
105
|
+
escape = false;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (inQuote) {
|
|
109
|
+
if (quoteChar === '"' && ch === "\\") {
|
|
110
|
+
escape = true;
|
|
111
|
+
}
|
|
112
|
+
else if (ch === quoteChar) {
|
|
113
|
+
inQuote = false;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
current += ch;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (ch === '"' || ch === "'") {
|
|
120
|
+
inQuote = true;
|
|
121
|
+
quoteChar = ch;
|
|
122
|
+
}
|
|
123
|
+
else if (ch === " ") {
|
|
124
|
+
if (current) {
|
|
125
|
+
tokens.push(current);
|
|
126
|
+
current = "";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
current += ch;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (current)
|
|
134
|
+
tokens.push(current);
|
|
135
|
+
return tokens;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=useCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useNotifications = useNotifications;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
let _nextId = 0;
|
|
6
|
+
function useNotifications() {
|
|
7
|
+
const [toasts, setToasts] = (0, react_1.useState)([]);
|
|
8
|
+
const push = (0, react_1.useCallback)((message, variant = "info", duration) => {
|
|
9
|
+
const id = `toast-${++_nextId}`;
|
|
10
|
+
setToasts((prev) => [...prev, { id, message, variant, duration }]);
|
|
11
|
+
}, []);
|
|
12
|
+
const dismiss = (0, react_1.useCallback)((id) => {
|
|
13
|
+
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
14
|
+
}, []);
|
|
15
|
+
return { toasts, push, dismiss };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=useNotifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNotifications.js","sourceRoot":"","sources":["../../src/tui/useNotifications.ts"],"names":[],"mappings":";;AAWA,4CAgBC;AA3BD,iCAA8C;AAG9C,IAAI,OAAO,GAAG,CAAC,CAAC;AAQhB,SAAgB,gBAAgB;IAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAc,EAAE,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAG,IAAA,mBAAW,EACtB,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,IAAA,mBAAW,EAAC,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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface UseScrollResult {
|
|
2
|
+
scrollOffset: number;
|
|
3
|
+
setScrollOffset: (offset: number) => void;
|
|
4
|
+
viewportHeight: number;
|
|
5
|
+
isAutoScroll: boolean;
|
|
6
|
+
scrollUp: (lines?: number) => void;
|
|
7
|
+
scrollDown: (lines?: number) => void;
|
|
8
|
+
snapToBottom: () => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Manages scroll state for the Viewport.
|
|
12
|
+
* scrollOffset=0 means auto-scroll (pinned to bottom).
|
|
13
|
+
* Positive scrollOffset means scrolled up by that many lines.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useScroll(viewportHeight: number): UseScrollResult;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=useScroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScroll.d.ts","sourceRoot":"","sources":["../../src/tui/useScroll.ts"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CA8CjE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useScroll = useScroll;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ink_1 = require("ink");
|
|
6
|
+
/**
|
|
7
|
+
* Manages scroll state for the Viewport.
|
|
8
|
+
* scrollOffset=0 means auto-scroll (pinned to bottom).
|
|
9
|
+
* Positive scrollOffset means scrolled up by that many lines.
|
|
10
|
+
*/
|
|
11
|
+
function useScroll(viewportHeight) {
|
|
12
|
+
const [scrollOffset, setScrollOffsetState] = (0, react_1.useState)(0);
|
|
13
|
+
const isAutoScroll = scrollOffset === 0;
|
|
14
|
+
const setScrollOffset = (0, react_1.useCallback)((offset) => {
|
|
15
|
+
setScrollOffsetState(Math.max(0, offset));
|
|
16
|
+
}, []);
|
|
17
|
+
const scrollUp = (0, react_1.useCallback)((lines) => {
|
|
18
|
+
const step = lines ?? viewportHeight;
|
|
19
|
+
setScrollOffsetState((prev) => prev + step);
|
|
20
|
+
}, [viewportHeight]);
|
|
21
|
+
const scrollDown = (0, react_1.useCallback)((lines) => {
|
|
22
|
+
const step = lines ?? viewportHeight;
|
|
23
|
+
setScrollOffsetState((prev) => Math.max(0, prev - step));
|
|
24
|
+
}, [viewportHeight]);
|
|
25
|
+
const snapToBottom = (0, react_1.useCallback)(() => {
|
|
26
|
+
setScrollOffsetState(0);
|
|
27
|
+
}, []);
|
|
28
|
+
(0, ink_1.useInput)((_input, key) => {
|
|
29
|
+
if (key.pageUp) {
|
|
30
|
+
scrollUp(viewportHeight);
|
|
31
|
+
}
|
|
32
|
+
else if (key.pageDown) {
|
|
33
|
+
scrollDown(viewportHeight);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
scrollOffset,
|
|
38
|
+
setScrollOffset,
|
|
39
|
+
viewportHeight,
|
|
40
|
+
isAutoScroll,
|
|
41
|
+
scrollUp,
|
|
42
|
+
scrollDown,
|
|
43
|
+
snapToBottom,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=useScroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScroll.js","sourceRoot":"","sources":["../../src/tui/useScroll.ts"],"names":[],"mappings":";;AAkBA,8BA8CC;AAhED,iCAA8C;AAC9C,6BAA+B;AAY/B;;;;GAIG;AACH,SAAgB,SAAS,CAAC,cAAsB;IAC9C,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,GAAG,IAAA,gBAAQ,EAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC;IAExC,MAAM,eAAe,GAAG,IAAA,mBAAW,EAAC,CAAC,MAAc,EAAE,EAAE;QACrD,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAC1B,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,KAAK,IAAI,cAAc,CAAC;QACrC,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,UAAU,GAAG,IAAA,mBAAW,EAC5B,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,KAAK,IAAI,cAAc,CAAC;QACrC,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QACpC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,cAAQ,EAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxB,UAAU,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,YAAY;QACZ,eAAe;QACf,cAAc;QACd,YAAY;QACZ,QAAQ;QACR,UAAU;QACV,YAAY;KACb,CAAC;AACJ,CAAC"}
|
package/dist/ui/format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrD;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAMR;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrD;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAMR;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAgB9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
package/dist/ui/format.js
CHANGED
|
@@ -40,6 +40,8 @@ function formatBalance(ethAmount, tokenAmount, tokenSymbol) {
|
|
|
40
40
|
function formatTimeAgo(timestampSeconds) {
|
|
41
41
|
const now = Math.floor(Date.now() / 1000);
|
|
42
42
|
const delta = now - timestampSeconds;
|
|
43
|
+
if (delta < 0)
|
|
44
|
+
return "in " + formatDuration(Math.abs(delta));
|
|
43
45
|
if (delta < 60)
|
|
44
46
|
return "just now";
|
|
45
47
|
if (delta < 3600) {
|
package/dist/ui/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":";AAAA,iFAAiF;;AAMjF,sCAGC;AAOD,kCAEC;AAKD,sCAUC;AAOD,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface QRRenderOptions {
|
|
2
|
+
/** Error correction level. L = smallest QR. Default: 'L' */
|
|
3
|
+
errorCorrection?: "L" | "M" | "Q" | "H";
|
|
4
|
+
/** Quiet zone size in modules. Default: 1 (standard is 4, but 1 suffices for terminal) */
|
|
5
|
+
quiet?: number;
|
|
6
|
+
/** Invert colors for dark terminal backgrounds. Default: true */
|
|
7
|
+
invert?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Render a QR code as terminal-friendly half-block Unicode characters.
|
|
11
|
+
* Returns an array of strings, one per terminal row.
|
|
12
|
+
*
|
|
13
|
+
* Uses qrcode library for matrix generation, custom renderer for compact output.
|
|
14
|
+
* Key optimizations vs qrcode-terminal:
|
|
15
|
+
* - Error correction L (not M) — ~20% fewer modules
|
|
16
|
+
* - Quiet zone 1 (not 4) — saves ~6 rows
|
|
17
|
+
* - Half-block chars: each terminal row = 2 QR module rows
|
|
18
|
+
*/
|
|
19
|
+
export declare function renderQR(data: string, options?: QRRenderOptions): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Render QR code to stdout (for non-TUI / child process context).
|
|
22
|
+
* Drop-in replacement for qrcode-terminal.generate().
|
|
23
|
+
*/
|
|
24
|
+
export declare function printQR(data: string, options?: QRRenderOptions): void;
|
|
25
|
+
//# sourceMappingURL=qr-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-render.d.ts","sourceRoot":"","sources":["../../src/ui/qr-render.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,eAAe,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACxC,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CA2D1E;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAKrE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderQR = renderQR;
|
|
7
|
+
exports.printQR = printQR;
|
|
8
|
+
const qrcode_1 = __importDefault(require("qrcode"));
|
|
9
|
+
/**
|
|
10
|
+
* Render a QR code as terminal-friendly half-block Unicode characters.
|
|
11
|
+
* Returns an array of strings, one per terminal row.
|
|
12
|
+
*
|
|
13
|
+
* Uses qrcode library for matrix generation, custom renderer for compact output.
|
|
14
|
+
* Key optimizations vs qrcode-terminal:
|
|
15
|
+
* - Error correction L (not M) — ~20% fewer modules
|
|
16
|
+
* - Quiet zone 1 (not 4) — saves ~6 rows
|
|
17
|
+
* - Half-block chars: each terminal row = 2 QR module rows
|
|
18
|
+
*/
|
|
19
|
+
function renderQR(data, options) {
|
|
20
|
+
const ec = options?.errorCorrection ?? "L";
|
|
21
|
+
const quiet = options?.quiet ?? 1;
|
|
22
|
+
const invert = options?.invert ?? true;
|
|
23
|
+
// Generate QR matrix
|
|
24
|
+
const qr = qrcode_1.default.create(data, {
|
|
25
|
+
errorCorrectionLevel: ec,
|
|
26
|
+
});
|
|
27
|
+
const size = qr.modules.size;
|
|
28
|
+
const modules = qr.modules.data;
|
|
29
|
+
// Helper: is module at (row, col) dark? (with quiet zone)
|
|
30
|
+
const totalSize = size + quiet * 2;
|
|
31
|
+
const isDark = (row, col) => {
|
|
32
|
+
const r = row - quiet;
|
|
33
|
+
const c = col - quiet;
|
|
34
|
+
if (r < 0 || r >= size || c < 0 || c >= size)
|
|
35
|
+
return false;
|
|
36
|
+
return modules[r * size + c] === 1;
|
|
37
|
+
};
|
|
38
|
+
const lines = [];
|
|
39
|
+
// Process 2 rows at a time using half-block characters
|
|
40
|
+
for (let row = 0; row < totalSize; row += 2) {
|
|
41
|
+
let line = "";
|
|
42
|
+
for (let col = 0; col < totalSize; col++) {
|
|
43
|
+
const top = isDark(row, col);
|
|
44
|
+
const bottom = row + 1 < totalSize ? isDark(row + 1, col) : false;
|
|
45
|
+
if (invert) {
|
|
46
|
+
// Dark terminal: dark modules = space (background), light = filled
|
|
47
|
+
if (top && bottom) {
|
|
48
|
+
line += " "; // both dark → background
|
|
49
|
+
}
|
|
50
|
+
else if (top && !bottom) {
|
|
51
|
+
line += "▄"; // top dark, bottom light → bottom half filled
|
|
52
|
+
}
|
|
53
|
+
else if (!top && bottom) {
|
|
54
|
+
line += "▀"; // top light, bottom dark → top half filled
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
line += "█"; // both light → full block
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Light terminal: dark modules = filled
|
|
62
|
+
if (top && bottom) {
|
|
63
|
+
line += "█";
|
|
64
|
+
}
|
|
65
|
+
else if (top && !bottom) {
|
|
66
|
+
line += "▀";
|
|
67
|
+
}
|
|
68
|
+
else if (!top && bottom) {
|
|
69
|
+
line += "▄";
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
line += " ";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
lines.push(line);
|
|
77
|
+
}
|
|
78
|
+
return lines;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Render QR code to stdout (for non-TUI / child process context).
|
|
82
|
+
* Drop-in replacement for qrcode-terminal.generate().
|
|
83
|
+
*/
|
|
84
|
+
function printQR(data, options) {
|
|
85
|
+
const lines = renderQR(data, options);
|
|
86
|
+
for (const line of lines) {
|
|
87
|
+
console.log(" " + line);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=qr-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-render.js","sourceRoot":"","sources":["../../src/ui/qr-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ethers } from "ethers";
|
|
2
|
+
/** Check if verbose mode is enabled via --verbose flag or ARC402_DEBUG env */
|
|
3
|
+
export declare function isVerbose(): boolean;
|
|
4
|
+
/** Log only when verbose mode is on */
|
|
5
|
+
export declare function verbose(...args: unknown[]): void;
|
|
6
|
+
/**
|
|
7
|
+
* Try a read-only call on the configured RPC first, then fall back
|
|
8
|
+
* to public RPCs. Write operations always use the configured RPC.
|
|
9
|
+
*/
|
|
10
|
+
export declare function callWithFallback<T>(configuredRpcUrl: string, fn: (provider: ethers.JsonRpcProvider) => Promise<T>): Promise<T>;
|
|
11
|
+
//# sourceMappingURL=rpc-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-fallback.d.ts","sourceRoot":"","sources":["../../src/ui/rpc-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYhC,8EAA8E;AAC9E,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,uCAAuC;AACvC,wBAAgB,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAIhD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,gBAAgB,EAAE,MAAM,EACxB,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,GACnD,OAAO,CAAC,CAAC,CAAC,CA2BZ"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isVerbose = isVerbose;
|
|
4
|
+
exports.verbose = verbose;
|
|
5
|
+
exports.callWithFallback = callWithFallback;
|
|
6
|
+
const ethers_1 = require("ethers");
|
|
7
|
+
/**
|
|
8
|
+
* Public RPC endpoints for Base mainnet, ordered by reliability.
|
|
9
|
+
* Used as fallbacks when the configured RPC fails on read-only calls.
|
|
10
|
+
*/
|
|
11
|
+
const BASE_FALLBACK_RPCS = [
|
|
12
|
+
"https://base.llamarpc.com",
|
|
13
|
+
"https://base-rpc.publicnode.com",
|
|
14
|
+
"https://1rpc.io/base",
|
|
15
|
+
];
|
|
16
|
+
/** Check if verbose mode is enabled via --verbose flag or ARC402_DEBUG env */
|
|
17
|
+
function isVerbose() {
|
|
18
|
+
return process.argv.includes("--verbose") || process.env.ARC402_DEBUG === "1";
|
|
19
|
+
}
|
|
20
|
+
/** Log only when verbose mode is on */
|
|
21
|
+
function verbose(...args) {
|
|
22
|
+
if (isVerbose()) {
|
|
23
|
+
console.log("\x1b[2m [verbose]", ...args, "\x1b[22m");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Try a read-only call on the configured RPC first, then fall back
|
|
28
|
+
* to public RPCs. Write operations always use the configured RPC.
|
|
29
|
+
*/
|
|
30
|
+
async function callWithFallback(configuredRpcUrl, fn) {
|
|
31
|
+
// Try configured RPC first
|
|
32
|
+
try {
|
|
33
|
+
verbose(`RPC call via ${configuredRpcUrl}`);
|
|
34
|
+
const provider = new ethers_1.ethers.JsonRpcProvider(configuredRpcUrl);
|
|
35
|
+
const result = await fn(provider);
|
|
36
|
+
verbose(`RPC call succeeded`);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
verbose(`RPC failed on ${configuredRpcUrl}: ${e instanceof Error ? e.message.slice(0, 80) : String(e)}`);
|
|
41
|
+
}
|
|
42
|
+
// Try each fallback
|
|
43
|
+
for (const rpc of BASE_FALLBACK_RPCS) {
|
|
44
|
+
try {
|
|
45
|
+
verbose(`Falling back to ${rpc}`);
|
|
46
|
+
const provider = new ethers_1.ethers.JsonRpcProvider(rpc);
|
|
47
|
+
const result = await fn(provider);
|
|
48
|
+
verbose(`Fallback succeeded on ${rpc}`);
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
verbose(`Fallback failed on ${rpc}: ${e instanceof Error ? e.message.slice(0, 80) : String(e)}`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
throw new Error("All RPC endpoints failed for read-only call");
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=rpc-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-fallback.js","sourceRoot":"","sources":["../../src/ui/rpc-fallback.ts"],"names":[],"mappings":";;AAaA,8BAEC;AAGD,0BAIC;AAMD,4CA8BC;AA1DD,mCAAgC;AAEhC;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IACzB,2BAA2B;IAC3B,iCAAiC;IACjC,sBAAsB;CACvB,CAAC;AAEF,8EAA8E;AAC9E,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC;AAChF,CAAC;AAED,uCAAuC;AACvC,SAAgB,OAAO,CAAC,GAAG,IAAe;IACxC,IAAI,SAAS,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,gBAAgB,CACpC,gBAAwB,EACxB,EAAoD;IAEpD,2BAA2B;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,eAAM,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,iBAAiB,gBAAgB,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,oBAAoB;IACpB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,eAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;YAClC,OAAO,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,sBAAsB,GAAG,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjG,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;AACjE,CAAC"}
|