reasonix 0.51.0 → 0.52.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/dashboard/dist/app.css +1 -1
- package/dashboard/dist/app.js +3 -3
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/{acp-XEUHGG7X.js → acp-NEUYWGUU.js} +26 -26
- package/dist/cli/chat-QA6IVFJD.js +49 -0
- package/dist/cli/{chunk-HGK57NBN.js → chunk-2W4F3RIZ.js} +2 -2
- package/dist/cli/{chunk-UO6E7FN3.js → chunk-3OXD5CBM.js} +32756 -31192
- package/dist/cli/chunk-3OXD5CBM.js.map +1 -0
- package/dist/cli/{chunk-UMZ6KHTS.js → chunk-5YLEKX2V.js} +2 -2
- package/dist/cli/{chunk-BA5R6BAE.js → chunk-6QBUXA73.js} +2 -2
- package/dist/cli/chunk-77JIQ7SL.js +40 -0
- package/dist/cli/chunk-77JIQ7SL.js.map +1 -0
- package/dist/cli/{chunk-6XWXIVQ3.js → chunk-AMSK3ZLB.js} +2 -2
- package/dist/cli/chunk-AMSK3ZLB.js.map +1 -0
- package/dist/cli/{chunk-A5PBEIJ7.js → chunk-AOYUW3HR.js} +37 -4
- package/dist/cli/chunk-AOYUW3HR.js.map +1 -0
- package/dist/cli/{chunk-3YRTIWFX.js → chunk-ARBGTNHM.js} +2 -2
- package/dist/cli/{chunk-3BTK5BHI.js → chunk-B4MOGWHW.js} +2 -2
- package/dist/cli/{chunk-5AIDYVH2.js → chunk-CFJY64UA.js} +2 -2
- package/dist/cli/{chunk-SBHF5NWD.js → chunk-CGVW5W7N.js} +14 -14
- package/dist/cli/{chunk-SBHF5NWD.js.map → chunk-CGVW5W7N.js.map} +1 -1
- package/dist/cli/{chunk-DVD67FXQ.js → chunk-CLHMV6OL.js} +568 -66
- package/dist/cli/chunk-CLHMV6OL.js.map +1 -0
- package/dist/cli/{chunk-2WUEAI2I.js → chunk-CPCUMMSR.js} +3 -3
- package/dist/cli/{chunk-JHWQDJZA.js → chunk-CTRM32BP.js} +2 -2
- package/dist/cli/{chunk-544J4PXD.js → chunk-D6WRFR6V.js} +5 -5
- package/dist/cli/{chunk-N4SEBLU4.js → chunk-DLTE4GBY.js} +3 -3
- package/dist/cli/{chunk-NRROJXXT.js → chunk-FY5UERSG.js} +9 -9
- package/dist/cli/{chunk-C2MRSJTV.js → chunk-GFJJEW3Z.js} +18 -10
- package/dist/cli/chunk-GFJJEW3Z.js.map +1 -0
- package/dist/cli/{chunk-R6KIHEF3.js → chunk-GNRKXRRE.js} +743 -660
- package/dist/cli/chunk-GNRKXRRE.js.map +1 -0
- package/dist/cli/{chunk-SXSAWOB7.js → chunk-HI6THNAZ.js} +19 -17
- package/dist/cli/chunk-HI6THNAZ.js.map +1 -0
- package/dist/cli/{chunk-K4YQFULP.js → chunk-HNZ4727T.js} +15 -15
- package/dist/cli/chunk-I3NE5S63.js +54 -0
- package/dist/cli/{chunk-EAMXOWUW.js.map → chunk-I3NE5S63.js.map} +1 -1
- package/dist/cli/{chunk-FEZK652I.js → chunk-MVLPXZAA.js} +834 -10
- package/dist/cli/chunk-MVLPXZAA.js.map +1 -0
- package/dist/cli/{chunk-36BM7INR.js → chunk-MW64SQUE.js} +2 -2
- package/dist/cli/{chunk-Z3MKG7MQ.js → chunk-OMNRXZNA.js} +2 -2
- package/dist/cli/{chunk-7YPMTE3U.js → chunk-RCC73DWQ.js} +5 -9
- package/dist/cli/chunk-RCC73DWQ.js.map +1 -0
- package/dist/cli/{chunk-2HVTBFCI.js → chunk-RHQOGG43.js} +5 -3
- package/dist/cli/chunk-RHQOGG43.js.map +1 -0
- package/dist/cli/{chunk-EWVFGYT6.js → chunk-VVPV5HU6.js} +2 -2
- package/dist/cli/{chunk-7YB26OQO.js → chunk-WPY7AFS6.js} +2 -2
- package/dist/cli/{chunk-BM6BBFAV.js → chunk-XBYHNZ5Z.js} +2 -2
- package/dist/cli/{chunk-WPOKBW5E.js → chunk-XNMXVL6C.js} +2 -2
- package/dist/cli/{chunk-SVD4UPRQ.js → chunk-XUZHBQSM.js} +2 -2
- package/dist/cli/{chunk-Q46B3Z7H.js → chunk-YMYX6QTC.js} +8 -5
- package/dist/cli/{chunk-Q46B3Z7H.js.map → chunk-YMYX6QTC.js.map} +1 -1
- package/dist/cli/{chunk-K3QJ3GKI.js → chunk-Z663GVUB.js} +3 -3
- package/dist/cli/{code-BMXLBC7D.js → code-WN6D4VZO.js} +35 -36
- package/dist/cli/{code-BMXLBC7D.js.map → code-WN6D4VZO.js.map} +1 -1
- package/dist/cli/{commands-E4RZXMF6.js → commands-DHETOY7O.js} +4 -4
- package/dist/cli/{commit-KSRQ64IL.js → commit-BBUYAKZV.js} +3 -3
- package/dist/cli/{config-QNDONOTU.js → config-KV7VV5LG.js} +4 -2
- package/dist/cli/{desktop-H3ZHIMDA.js → desktop-LJVXWXNF.js} +557 -70
- package/dist/cli/desktop-LJVXWXNF.js.map +1 -0
- package/dist/cli/diff-2JHMQAHI.js +165 -0
- package/dist/cli/{diff-I4PYI43W.js.map → diff-2JHMQAHI.js.map} +1 -1
- package/dist/cli/{doctor-Y2E4MY2F.js → doctor-GI5LOEZL.js} +11 -11
- package/dist/cli/{events-47HOT7ZA.js → events-LBKMLFM4.js} +5 -5
- package/dist/cli/index.js +40 -39
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-76DK63ZB.js → mcp-DKEJK5ND.js} +3 -3
- package/dist/cli/{mcp-browse-SDNUGO74.js → mcp-browse-V7KWDY32.js} +15 -15
- package/dist/cli/{mcp-browse-SDNUGO74.js.map → mcp-browse-V7KWDY32.js.map} +1 -1
- package/dist/cli/{mcp-inspect-BL5DEO5M.js → mcp-inspect-MTABNHVM.js} +5 -5
- package/dist/cli/{prompt-JLATI3P7.js → prompt-ATI7DKHF.js} +5 -5
- package/dist/cli/{prune-sessions-WHZDFUKD.js → prune-sessions-YQQSZTZS.js} +4 -4
- package/dist/cli/{replay-MHXS7C7Z.js → replay-ZJQ4I4CJ.js} +30 -30
- package/dist/cli/{replay-MHXS7C7Z.js.map → replay-ZJQ4I4CJ.js.map} +1 -1
- package/dist/cli/{run-SXNCPRJE.js → run-HFPRNWJY.js} +22 -22
- package/dist/cli/{server-GEHOE6CO.js → server-UHKO2VVM.js} +23 -23
- package/dist/cli/{sessions-EPBFYISL.js → sessions-IQEWWUH3.js} +16 -16
- package/dist/cli/setup-5BYKCL62.js +502 -0
- package/dist/cli/setup-5BYKCL62.js.map +1 -0
- package/dist/cli/{stats-4WB4XHBP.js → stats-OFCGOQMZ.js} +6 -6
- package/dist/cli/{version-4SP3DLLH.js → version-EODUFAAI.js} +16 -16
- package/dist/index.d.ts +12 -1
- package/dist/index.js +613 -78
- package/dist/index.js.map +1 -1
- package/package.json +21 -3
- package/dist/cli/chat-NJ2Q5KHG.js +0 -50
- package/dist/cli/chunk-2HVTBFCI.js.map +0 -1
- package/dist/cli/chunk-5BBC6YMV.js +0 -832
- package/dist/cli/chunk-5BBC6YMV.js.map +0 -1
- package/dist/cli/chunk-6XWXIVQ3.js.map +0 -1
- package/dist/cli/chunk-7YPMTE3U.js.map +0 -1
- package/dist/cli/chunk-A5PBEIJ7.js.map +0 -1
- package/dist/cli/chunk-C2MRSJTV.js.map +0 -1
- package/dist/cli/chunk-DVD67FXQ.js.map +0 -1
- package/dist/cli/chunk-EAMXOWUW.js +0 -54
- package/dist/cli/chunk-FEZK652I.js.map +0 -1
- package/dist/cli/chunk-R6KIHEF3.js.map +0 -1
- package/dist/cli/chunk-SXSAWOB7.js.map +0 -1
- package/dist/cli/chunk-UO6E7FN3.js.map +0 -1
- package/dist/cli/chunk-UPW544V3.js +0 -96
- package/dist/cli/chunk-UPW544V3.js.map +0 -1
- package/dist/cli/desktop-H3ZHIMDA.js.map +0 -1
- package/dist/cli/devtools-HW3WDT3Q.js +0 -91
- package/dist/cli/devtools-HW3WDT3Q.js.map +0 -1
- package/dist/cli/diff-I4PYI43W.js +0 -165
- package/dist/cli/setup-IW2XR5XI.js +0 -593
- package/dist/cli/setup-IW2XR5XI.js.map +0 -1
- /package/dist/cli/{acp-XEUHGG7X.js.map → acp-NEUYWGUU.js.map} +0 -0
- /package/dist/cli/{chat-NJ2Q5KHG.js.map → chat-QA6IVFJD.js.map} +0 -0
- /package/dist/cli/{chunk-HGK57NBN.js.map → chunk-2W4F3RIZ.js.map} +0 -0
- /package/dist/cli/{chunk-UMZ6KHTS.js.map → chunk-5YLEKX2V.js.map} +0 -0
- /package/dist/cli/{chunk-BA5R6BAE.js.map → chunk-6QBUXA73.js.map} +0 -0
- /package/dist/cli/{chunk-3YRTIWFX.js.map → chunk-ARBGTNHM.js.map} +0 -0
- /package/dist/cli/{chunk-3BTK5BHI.js.map → chunk-B4MOGWHW.js.map} +0 -0
- /package/dist/cli/{chunk-5AIDYVH2.js.map → chunk-CFJY64UA.js.map} +0 -0
- /package/dist/cli/{chunk-2WUEAI2I.js.map → chunk-CPCUMMSR.js.map} +0 -0
- /package/dist/cli/{chunk-JHWQDJZA.js.map → chunk-CTRM32BP.js.map} +0 -0
- /package/dist/cli/{chunk-544J4PXD.js.map → chunk-D6WRFR6V.js.map} +0 -0
- /package/dist/cli/{chunk-N4SEBLU4.js.map → chunk-DLTE4GBY.js.map} +0 -0
- /package/dist/cli/{chunk-NRROJXXT.js.map → chunk-FY5UERSG.js.map} +0 -0
- /package/dist/cli/{chunk-K4YQFULP.js.map → chunk-HNZ4727T.js.map} +0 -0
- /package/dist/cli/{chunk-36BM7INR.js.map → chunk-MW64SQUE.js.map} +0 -0
- /package/dist/cli/{chunk-Z3MKG7MQ.js.map → chunk-OMNRXZNA.js.map} +0 -0
- /package/dist/cli/{chunk-EWVFGYT6.js.map → chunk-VVPV5HU6.js.map} +0 -0
- /package/dist/cli/{chunk-7YB26OQO.js.map → chunk-WPY7AFS6.js.map} +0 -0
- /package/dist/cli/{chunk-BM6BBFAV.js.map → chunk-XBYHNZ5Z.js.map} +0 -0
- /package/dist/cli/{chunk-WPOKBW5E.js.map → chunk-XNMXVL6C.js.map} +0 -0
- /package/dist/cli/{chunk-SVD4UPRQ.js.map → chunk-XUZHBQSM.js.map} +0 -0
- /package/dist/cli/{chunk-K3QJ3GKI.js.map → chunk-Z663GVUB.js.map} +0 -0
- /package/dist/cli/{commands-E4RZXMF6.js.map → commands-DHETOY7O.js.map} +0 -0
- /package/dist/cli/{commit-KSRQ64IL.js.map → commit-BBUYAKZV.js.map} +0 -0
- /package/dist/cli/{config-QNDONOTU.js.map → config-KV7VV5LG.js.map} +0 -0
- /package/dist/cli/{doctor-Y2E4MY2F.js.map → doctor-GI5LOEZL.js.map} +0 -0
- /package/dist/cli/{events-47HOT7ZA.js.map → events-LBKMLFM4.js.map} +0 -0
- /package/dist/cli/{mcp-76DK63ZB.js.map → mcp-DKEJK5ND.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-BL5DEO5M.js.map → mcp-inspect-MTABNHVM.js.map} +0 -0
- /package/dist/cli/{prompt-JLATI3P7.js.map → prompt-ATI7DKHF.js.map} +0 -0
- /package/dist/cli/{prune-sessions-WHZDFUKD.js.map → prune-sessions-YQQSZTZS.js.map} +0 -0
- /package/dist/cli/{run-SXNCPRJE.js.map → run-HFPRNWJY.js.map} +0 -0
- /package/dist/cli/{server-GEHOE6CO.js.map → server-UHKO2VVM.js.map} +0 -0
- /package/dist/cli/{sessions-EPBFYISL.js.map → sessions-IQEWWUH3.js.map} +0 -0
- /package/dist/cli/{stats-4WB4XHBP.js.map → stats-OFCGOQMZ.js.map} +0 -0
- /package/dist/cli/{version-4SP3DLLH.js.map → version-EODUFAAI.js.map} +0 -0
|
@@ -13,12 +13,12 @@ import {
|
|
|
13
13
|
} from "./chunk-PLHAZOLZ.js";
|
|
14
14
|
import {
|
|
15
15
|
t
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-CLHMV6OL.js";
|
|
17
17
|
import {
|
|
18
18
|
defaultConfigPath,
|
|
19
19
|
readConfig,
|
|
20
20
|
writeConfig
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-AOYUW3HR.js";
|
|
22
22
|
import "./chunk-TUK7OWJA.js";
|
|
23
23
|
|
|
24
24
|
// src/cli/commands/mcp.ts
|
|
@@ -285,4 +285,4 @@ export {
|
|
|
285
285
|
mcpListCommand,
|
|
286
286
|
mcpSearchCommand
|
|
287
287
|
};
|
|
288
|
-
//# sourceMappingURL=mcp-
|
|
288
|
+
//# sourceMappingURL=mcp-DKEJK5ND.js.map
|
|
@@ -9,13 +9,13 @@ import {
|
|
|
9
9
|
specStringFor
|
|
10
10
|
} from "./chunk-XJXDHAES.js";
|
|
11
11
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
} from "./chunk-
|
|
12
|
+
Br,
|
|
13
|
+
L,
|
|
14
|
+
W,
|
|
15
|
+
Wo,
|
|
16
|
+
fc,
|
|
17
|
+
require_react
|
|
18
|
+
} from "./chunk-3OXD5CBM.js";
|
|
19
19
|
import "./chunk-PLHAZOLZ.js";
|
|
20
20
|
import {
|
|
21
21
|
loadDotenv
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
import {
|
|
24
24
|
readConfig,
|
|
25
25
|
writeConfig
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-AOYUW3HR.js";
|
|
27
27
|
import {
|
|
28
28
|
__toESM
|
|
29
29
|
} from "./chunk-TUK7OWJA.js";
|
|
@@ -42,7 +42,7 @@ function rankAndFilter(entries, query) {
|
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
function McpBrowseApp() {
|
|
45
|
-
const app =
|
|
45
|
+
const app = fc();
|
|
46
46
|
const [state, setState] = (0, import_react.useState)({
|
|
47
47
|
handle: null,
|
|
48
48
|
loading: true,
|
|
@@ -121,7 +121,7 @@ function McpBrowseApp() {
|
|
|
121
121
|
},
|
|
122
122
|
[setStatus]
|
|
123
123
|
);
|
|
124
|
-
|
|
124
|
+
Br((input, key) => {
|
|
125
125
|
if (key.escape || key.ctrl && input === "c") {
|
|
126
126
|
app.exit();
|
|
127
127
|
return;
|
|
@@ -156,17 +156,17 @@ function McpBrowseApp() {
|
|
|
156
156
|
Math.min(state.selected - Math.floor(VISIBLE_ROWS / 2), filtered.length - VISIBLE_ROWS)
|
|
157
157
|
);
|
|
158
158
|
const window = filtered.slice(Math.max(0, start), Math.max(0, start) + VISIBLE_ROWS);
|
|
159
|
-
return /* @__PURE__ */ import_react.default.createElement(
|
|
159
|
+
return /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(W, null, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "cyan" }, "\u25C8 MCP marketplace"), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, ` \xB7 ${state.status}`)), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, null, "search: "), /* @__PURE__ */ import_react.default.createElement(L, { color: "white" }, state.query || "(type to filter)"), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, ` ${filtered.length} match${filtered.length === 1 ? "" : "es"}`)), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1, flexDirection: "column" }, window.length === 0 ? /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, state.loading ? "loading\u2026" : "no entries") : window.map((e, i) => {
|
|
160
160
|
const idx = (start || 0) + i;
|
|
161
161
|
const active = idx === state.selected;
|
|
162
162
|
const tag = e.source === "official" ? "[off]" : e.source === "smithery" ? "[smt]" : "[loc]";
|
|
163
163
|
const pop = e.popularity !== void 0 ? ` \xB7 ${e.popularity.toLocaleString()}` : "";
|
|
164
|
-
return /* @__PURE__ */ import_react.default.createElement(
|
|
165
|
-
})), selected ? /* @__PURE__ */ import_react.default.createElement(
|
|
164
|
+
return /* @__PURE__ */ import_react.default.createElement(W, { key: e.name }, /* @__PURE__ */ import_react.default.createElement(L, { color: active ? "cyan" : void 0 }, active ? "\u25B8 " : " "), /* @__PURE__ */ import_react.default.createElement(L, { bold: active }, e.name.padEnd(40).slice(0, 40)), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, ` ${tag}${pop}`));
|
|
165
|
+
})), selected ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "white" }, overlay?.[selected.name]?.title ?? selected.title, overlay?.[selected.name] ? /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, ` \xB7 ${selected.title}`) : null), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, overlay?.[selected.name]?.description ?? selected.description?.slice(0, 160) ?? null), selected.install ? /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, `spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? "\u2014"} \xB7 ${selected.install.transport}`) : /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, "(smithery listing \u2014 install info not exposed)"), selected.install?.requiredEnv?.length ? /* @__PURE__ */ import_react.default.createElement(L, { color: "yellow" }, `needs: ${selected.install.requiredEnv.join(", ")}`) : null) : null, /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, "type to filter \xB7 \u2191\u2193 pick \xB7 enter install \xB7 tab load more \xB7 esc quit")));
|
|
166
166
|
}
|
|
167
167
|
async function mcpBrowseCommand(_opts = {}) {
|
|
168
168
|
loadDotenv();
|
|
169
|
-
const { waitUntilExit } =
|
|
169
|
+
const { waitUntilExit } = Wo(/* @__PURE__ */ import_react.default.createElement(McpBrowseApp, null), {
|
|
170
170
|
exitOnCtrlC: true,
|
|
171
171
|
patchConsole: false
|
|
172
172
|
});
|
|
@@ -175,4 +175,4 @@ async function mcpBrowseCommand(_opts = {}) {
|
|
|
175
175
|
export {
|
|
176
176
|
mcpBrowseCommand
|
|
177
177
|
};
|
|
178
|
-
//# sourceMappingURL=mcp-browse-
|
|
178
|
+
//# sourceMappingURL=mcp-browse-V7KWDY32.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/mcp-browse.tsx"],"sourcesContent":["/** `reasonix mcp browse` — Ink TUI for the MCP marketplace. Lazy-loads pages on scroll. */\n\nimport { Box, Text, render, useApp, useInput } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { readConfig, writeConfig } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { loadOverlay } from \"../../mcp/marketplace-overlay/loader.js\";\nimport {\n type RegistryHandle,\n loadMorePages,\n openRegistry,\n specStringFor,\n} from \"../../mcp/registry-fetch.js\";\nimport type { RegistryEntry } from \"../../mcp/registry-types.js\";\n\nconst VISIBLE_ROWS = 12;\n\ninterface State {\n handle: RegistryHandle | null;\n loading: boolean;\n query: string;\n selected: number;\n status: string;\n}\n\nfunction rankAndFilter(entries: RegistryEntry[], query: string): RegistryEntry[] {\n const q = query.trim().toLowerCase();\n const list = q\n ? entries.filter((e) => `${e.name} ${e.title} ${e.description}`.toLowerCase().includes(q))\n : entries;\n return [...list].sort((a, b) => {\n const ap = a.popularity ?? -1;\n const bp = b.popularity ?? -1;\n if (ap !== bp) return bp - ap;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction McpBrowseApp() {\n const app = useApp();\n const [state, setState] = useState<State>({\n handle: null,\n loading: true,\n query: \"\",\n selected: 0,\n status: \"opening registry…\",\n });\n\n const setStatus = useCallback((status: string) => {\n setState((s) => ({ ...s, status }));\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const handle = await openRegistry({});\n if (cancelled) return;\n const ageMs = Date.now() - handle.fetchedAt;\n const ageStr =\n ageMs < 60_000 ? `${Math.floor(ageMs / 1000)}s` : `${Math.floor(ageMs / 60_000)}m`;\n setState((s) => ({\n ...s,\n handle,\n loading: false,\n status: `${handle.source} · ${handle.cache.entries.length} entries${\n handle.fromCache ? ` · cached ${ageStr} ago` : \"\"\n }`,\n }));\n } catch (err) {\n if (cancelled) return;\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const filtered = useMemo(() => {\n if (!state.handle) return [];\n return rankAndFilter(state.handle.cache.entries, state.query);\n }, [state.handle, state.query]);\n\n const selected = filtered[state.selected];\n\n const fetchMore = useCallback(async () => {\n if (!state.handle || state.loading) return;\n if (state.handle.cache.pagination.nextCursor === null) {\n setStatus(\"no more pages — registry exhausted\");\n return;\n }\n setState((s) => ({ ...s, loading: true, status: \"loading more…\" }));\n try {\n const r = await loadMorePages(state.handle, { pages: 5 });\n setState((s) => ({\n ...s,\n loading: false,\n status: `+${r.newEntries} entries (${state.handle?.cache.entries.length ?? 0} total)${\n r.exhausted ? \" · exhausted\" : \"\"\n }`,\n }));\n } catch (err) {\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n }, [state.handle, state.loading, setStatus]);\n\n const install = useCallback(\n (entry: RegistryEntry) => {\n if (!entry.install) {\n setStatus(`${entry.name} has no install info (smithery listing)`);\n return;\n }\n try {\n const spec = specStringFor(entry.name, entry.install);\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n setStatus(`already installed: ${spec}`);\n return;\n }\n writeConfig({ ...cfg, mcp: [...existing, spec] });\n setStatus(`installed → ${spec}`);\n } catch (err) {\n setStatus(`install failed: ${(err as Error).message}`);\n }\n },\n [setStatus],\n );\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === \"c\")) {\n app.exit();\n return;\n }\n if (key.upArrow) {\n setState((s) => ({ ...s, selected: Math.max(0, s.selected - 1) }));\n return;\n }\n if (key.downArrow) {\n setState((s) => ({ ...s, selected: Math.min(filtered.length - 1, s.selected + 1) }));\n return;\n }\n if (key.return) {\n if (selected) install(selected);\n return;\n }\n if (key.tab || (key.ctrl && input === \"n\")) {\n void fetchMore();\n return;\n }\n if (key.backspace || key.delete) {\n setState((s) => ({ ...s, query: s.query.slice(0, -1), selected: 0 }));\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setState((s) => ({ ...s, query: s.query + input, selected: 0 }));\n }\n });\n\n const overlay = useMemo(() => loadOverlay(\"zh-CN\"), []);\n\n const start = Math.max(\n 0,\n Math.min(state.selected - Math.floor(VISIBLE_ROWS / 2), filtered.length - VISIBLE_ROWS),\n );\n const window = filtered.slice(Math.max(0, start), Math.max(0, start) + VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color=\"cyan\">\n ◈ MCP marketplace\n </Text>\n <Text dimColor>{` · ${state.status}`}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>search: </Text>\n <Text color=\"white\">{state.query || \"(type to filter)\"}</Text>\n <Text dimColor>{` ${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}`}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {window.length === 0 ? (\n <Text dimColor>{state.loading ? \"loading…\" : \"no entries\"}</Text>\n ) : (\n window.map((e, i) => {\n const idx = (start || 0) + i;\n const active = idx === state.selected;\n const tag =\n e.source === \"official\" ? \"[off]\" : e.source === \"smithery\" ? \"[smt]\" : \"[loc]\";\n const pop = e.popularity !== undefined ? ` · ${e.popularity.toLocaleString()}` : \"\";\n return (\n <Box key={e.name}>\n <Text color={active ? \"cyan\" : undefined}>{active ? \"▸ \" : \" \"}</Text>\n <Text bold={active}>{e.name.padEnd(40).slice(0, 40)}</Text>\n <Text dimColor>{` ${tag}${pop}`}</Text>\n </Box>\n );\n })\n )}\n </Box>\n {selected ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\">\n {overlay?.[selected.name]?.title ?? selected.title}\n {overlay?.[selected.name] ? (\n <Text dimColor>{` \\u00b7 ${selected.title}`}</Text>\n ) : null}\n </Text>\n <Text dimColor>\n {overlay?.[selected.name]?.description ?? selected.description?.slice(0, 160) ?? null}\n </Text>\n {selected.install ? (\n <Text dimColor>\n {`spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? \"—\"} · ${selected.install.transport}`}\n </Text>\n ) : (\n <Text dimColor>(smithery listing — install info not exposed)</Text>\n )}\n {selected.install?.requiredEnv?.length ? (\n <Text color=\"yellow\">{`needs: ${selected.install.requiredEnv.join(\", \")}`}</Text>\n ) : null}\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>type to filter · ↑↓ pick · enter install · tab load more · esc quit</Text>\n </Box>\n </Box>\n );\n}\n\nexport interface McpBrowseOptions {\n /** Reserved — currently unused, kept for symmetry with other commands. */\n _unused?: never;\n}\n\nexport async function mcpBrowseCommand(_opts: McpBrowseOptions = {}): Promise<void> {\n loadDotenv();\n const { waitUntilExit } = render(<McpBrowseApp />, {\n exitOnCtrlC: true,\n patchConsole: false,\n });\n await waitUntilExit();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,mBAAiE;AAYjE,IAAM,eAAe;AAUrB,SAAS,cAAc,SAA0B,OAAgC;AAC/E,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAM,OAAO,IACT,QAAQ,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,SAAS,CAAC,CAAC,IACvF;AACJ,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,UAAM,KAAK,EAAE,cAAc;AAC3B,UAAM,KAAK,EAAE,cAAc;AAC3B,QAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AACH;AAEA,SAAS,eAAe;AACtB,QAAM,MAAM,gBAAO;AACnB,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAgB;AAAA,IACxC,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,gBAAY,0BAAY,CAAC,WAAmB;AAChD,aAAS,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,QAAI,YAAY;AAChB,KAAC,YAAY;AACX,UAAI;AACF,cAAM,SAAS,MAAM,aAAa,CAAC,CAAC;AACpC,YAAI,UAAW;AACf,cAAM,QAAQ,KAAK,IAAI,IAAI,OAAO;AAClC,cAAM,SACJ,QAAQ,MAAS,GAAG,KAAK,MAAM,QAAQ,GAAI,CAAC,MAAM,GAAG,KAAK,MAAM,QAAQ,GAAM,CAAC;AACjF,iBAAS,CAAC,OAAO;AAAA,UACf,GAAG;AAAA,UACH;AAAA,UACA,SAAS;AAAA,UACT,QAAQ,GAAG,OAAO,MAAM,SAAM,OAAO,MAAM,QAAQ,MAAM,WACvD,OAAO,YAAY,gBAAa,MAAM,SAAS,EACjD;AAAA,QACF,EAAE;AAAA,MACJ,SAAS,KAAK;AACZ,YAAI,UAAW;AACf,iBAAS,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,OAAO,QAAQ,UAAW,IAAc,OAAO,GAAG,EAAE;AAAA,MACxF;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW,sBAAQ,MAAM;AAC7B,QAAI,CAAC,MAAM,OAAQ,QAAO,CAAC;AAC3B,WAAO,cAAc,MAAM,OAAO,MAAM,SAAS,MAAM,KAAK;AAAA,EAC9D,GAAG,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAC;AAE9B,QAAM,WAAW,SAAS,MAAM,QAAQ;AAExC,QAAM,gBAAY,0BAAY,YAAY;AACxC,QAAI,CAAC,MAAM,UAAU,MAAM,QAAS;AACpC,QAAI,MAAM,OAAO,MAAM,WAAW,eAAe,MAAM;AACrD,gBAAU,yCAAoC;AAC9C;AAAA,IACF;AACA,aAAS,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,MAAM,QAAQ,qBAAgB,EAAE;AAClE,QAAI;AACF,YAAM,IAAI,MAAM,cAAc,MAAM,QAAQ,EAAE,OAAO,EAAE,CAAC;AACxD,eAAS,CAAC,OAAO;AAAA,QACf,GAAG;AAAA,QACH,SAAS;AAAA,QACT,QAAQ,IAAI,EAAE,UAAU,aAAa,MAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,UAC1E,EAAE,YAAY,oBAAiB,EACjC;AAAA,MACF,EAAE;AAAA,IACJ,SAAS,KAAK;AACZ,eAAS,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,OAAO,QAAQ,UAAW,IAAc,OAAO,GAAG,EAAE;AAAA,IACxF;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,MAAM,SAAS,SAAS,CAAC;AAE3C,QAAM,cAAU;AAAA,IACd,CAAC,UAAyB;AACxB,UAAI,CAAC,MAAM,SAAS;AAClB,kBAAU,GAAG,MAAM,IAAI,yCAAyC;AAChE;AAAA,MACF;AACA,UAAI;AACF,cAAM,OAAO,cAAc,MAAM,MAAM,MAAM,OAAO;AACpD,cAAM,MAAM,WAAW;AACvB,cAAM,WAAW,IAAI,OAAO,CAAC;AAC7B,YAAI,SAAS,SAAS,IAAI,GAAG;AAC3B,oBAAU,sBAAsB,IAAI,EAAE;AACtC;AAAA,QACF;AACA,oBAAY,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,UAAU,IAAI,EAAE,CAAC;AAChD,kBAAU,oBAAe,IAAI,EAAE;AAAA,MACjC,SAAS,KAAK;AACZ,kBAAU,mBAAoB,IAAc,OAAO,EAAE;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,oBAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,UAAW,IAAI,QAAQ,UAAU,KAAM;AAC7C,UAAI,KAAK;AACT;AAAA,IACF;AACA,QAAI,IAAI,SAAS;AACf,eAAS,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,KAAK,IAAI,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE;AACjE;AAAA,IACF;AACA,QAAI,IAAI,WAAW;AACjB,eAAS,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,KAAK,IAAI,SAAS,SAAS,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE;AACnF;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AACd,UAAI,SAAU,SAAQ,QAAQ;AAC9B;AAAA,IACF;AACA,QAAI,IAAI,OAAQ,IAAI,QAAQ,UAAU,KAAM;AAC1C,WAAK,UAAU;AACf;AAAA,IACF;AACA,QAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,eAAS,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,MAAM,GAAG,EAAE,GAAG,UAAU,EAAE,EAAE;AACpE;AAAA,IACF;AACA,QAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AACnC,eAAS,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,QAAQ,OAAO,UAAU,EAAE,EAAE;AAAA,IACjE;AAAA,EACF,CAAC;AAED,QAAM,cAAU,sBAAQ,MAAM,YAAY,OAAO,GAAG,CAAC,CAAC;AAEtD,QAAM,QAAQ,KAAK;AAAA,IACjB;AAAA,IACA,KAAK,IAAI,MAAM,WAAW,KAAK,MAAM,eAAe,CAAC,GAAG,SAAS,SAAS,YAAY;AAAA,EACxF;AACA,QAAM,SAAS,SAAS,MAAM,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY;AAEnF,SACE,6BAAAA,QAAA,cAAC,eAAI,eAAc,UAAS,UAAU,KACpC,6BAAAA,QAAA,cAAC,mBACC,6BAAAA,QAAA,cAAC,QAAK,MAAI,MAAC,OAAM,UAAO,wBAExB,GACA,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAE,WAAQ,MAAM,MAAM,EAAG,CACzC,GACA,6BAAAA,QAAA,cAAC,eAAI,WAAW,KACd,6BAAAA,QAAA,cAAC,YAAK,UAAQ,GACd,6BAAAA,QAAA,cAAC,QAAK,OAAM,WAAS,MAAM,SAAS,kBAAmB,GACvD,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAE,KAAK,SAAS,MAAM,SAAS,SAAS,WAAW,IAAI,KAAK,IAAI,EAAG,CACnF,GACA,6BAAAA,QAAA,cAAC,eAAI,WAAW,GAAG,eAAc,YAC9B,OAAO,WAAW,IACjB,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAE,MAAM,UAAU,kBAAa,YAAa,IAE1D,OAAO,IAAI,CAAC,GAAG,MAAM;AACnB,UAAM,OAAO,SAAS,KAAK;AAC3B,UAAM,SAAS,QAAQ,MAAM;AAC7B,UAAM,MACJ,EAAE,WAAW,aAAa,UAAU,EAAE,WAAW,aAAa,UAAU;AAC1E,UAAM,MAAM,EAAE,eAAe,SAAY,SAAM,EAAE,WAAW,eAAe,CAAC,KAAK;AACjF,WACE,6BAAAA,QAAA,cAAC,eAAI,KAAK,EAAE,QACV,6BAAAA,QAAA,cAAC,QAAK,OAAO,SAAS,SAAS,UAAY,SAAS,YAAO,IAAK,GAChE,6BAAAA,QAAA,cAAC,QAAK,MAAM,UAAS,EAAE,KAAK,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE,CAAE,GACpD,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAE,IAAI,GAAG,GAAG,GAAG,EAAG,CAClC;AAAA,EAEJ,CAAC,CAEL,GACC,WACC,6BAAAA,QAAA,cAAC,eAAI,WAAW,GAAG,eAAc,YAC/B,6BAAAA,QAAA,cAAC,QAAK,MAAI,MAAC,OAAM,WACd,UAAU,SAAS,IAAI,GAAG,SAAS,SAAS,OAC5C,UAAU,SAAS,IAAI,IACtB,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAE,WAAa,SAAS,KAAK,EAAG,IAC5C,IACN,GACA,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QACX,UAAU,SAAS,IAAI,GAAG,eAAe,SAAS,aAAa,MAAM,GAAG,GAAG,KAAK,IACnF,GACC,SAAS,UACR,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QACX,SAAS,SAAS,QAAQ,OAAO,IAAI,SAAS,QAAQ,aAAa,SAAS,QAAQ,OAAO,QAAG,SAAM,SAAS,QAAQ,SAAS,EACjI,IAEA,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAC,oDAA6C,GAE7D,SAAS,SAAS,aAAa,SAC9B,6BAAAA,QAAA,cAAC,QAAK,OAAM,YAAU,UAAU,SAAS,QAAQ,YAAY,KAAK,IAAI,CAAC,EAAG,IACxE,IACN,IACE,MACJ,6BAAAA,QAAA,cAAC,eAAI,WAAW,KACd,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAC,2FAAmE,CACpF,CACF;AAEJ;AAOA,eAAsB,iBAAiB,QAA0B,CAAC,GAAkB;AAClF,aAAW;AACX,QAAM,EAAE,cAAc,IAAI,eAAO,6BAAAA,QAAA,cAAC,kBAAa,GAAI;AAAA,IACjD,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,cAAc;AACtB;","names":["React"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/mcp-browse.tsx"],"sourcesContent":["/** `reasonix mcp browse` — Ink TUI for the MCP marketplace. Lazy-loads pages on scroll. */\n\nimport { Box, Text, render, useApp, useInput } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { readConfig, writeConfig } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { loadOverlay } from \"../../mcp/marketplace-overlay/loader.js\";\nimport {\n type RegistryHandle,\n loadMorePages,\n openRegistry,\n specStringFor,\n} from \"../../mcp/registry-fetch.js\";\nimport type { RegistryEntry } from \"../../mcp/registry-types.js\";\n\nconst VISIBLE_ROWS = 12;\n\ninterface State {\n handle: RegistryHandle | null;\n loading: boolean;\n query: string;\n selected: number;\n status: string;\n}\n\nfunction rankAndFilter(entries: RegistryEntry[], query: string): RegistryEntry[] {\n const q = query.trim().toLowerCase();\n const list = q\n ? entries.filter((e) => `${e.name} ${e.title} ${e.description}`.toLowerCase().includes(q))\n : entries;\n return [...list].sort((a, b) => {\n const ap = a.popularity ?? -1;\n const bp = b.popularity ?? -1;\n if (ap !== bp) return bp - ap;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction McpBrowseApp() {\n const app = useApp();\n const [state, setState] = useState<State>({\n handle: null,\n loading: true,\n query: \"\",\n selected: 0,\n status: \"opening registry…\",\n });\n\n const setStatus = useCallback((status: string) => {\n setState((s) => ({ ...s, status }));\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const handle = await openRegistry({});\n if (cancelled) return;\n const ageMs = Date.now() - handle.fetchedAt;\n const ageStr =\n ageMs < 60_000 ? `${Math.floor(ageMs / 1000)}s` : `${Math.floor(ageMs / 60_000)}m`;\n setState((s) => ({\n ...s,\n handle,\n loading: false,\n status: `${handle.source} · ${handle.cache.entries.length} entries${\n handle.fromCache ? ` · cached ${ageStr} ago` : \"\"\n }`,\n }));\n } catch (err) {\n if (cancelled) return;\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const filtered = useMemo(() => {\n if (!state.handle) return [];\n return rankAndFilter(state.handle.cache.entries, state.query);\n }, [state.handle, state.query]);\n\n const selected = filtered[state.selected];\n\n const fetchMore = useCallback(async () => {\n if (!state.handle || state.loading) return;\n if (state.handle.cache.pagination.nextCursor === null) {\n setStatus(\"no more pages — registry exhausted\");\n return;\n }\n setState((s) => ({ ...s, loading: true, status: \"loading more…\" }));\n try {\n const r = await loadMorePages(state.handle, { pages: 5 });\n setState((s) => ({\n ...s,\n loading: false,\n status: `+${r.newEntries} entries (${state.handle?.cache.entries.length ?? 0} total)${\n r.exhausted ? \" · exhausted\" : \"\"\n }`,\n }));\n } catch (err) {\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n }, [state.handle, state.loading, setStatus]);\n\n const install = useCallback(\n (entry: RegistryEntry) => {\n if (!entry.install) {\n setStatus(`${entry.name} has no install info (smithery listing)`);\n return;\n }\n try {\n const spec = specStringFor(entry.name, entry.install);\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n setStatus(`already installed: ${spec}`);\n return;\n }\n writeConfig({ ...cfg, mcp: [...existing, spec] });\n setStatus(`installed → ${spec}`);\n } catch (err) {\n setStatus(`install failed: ${(err as Error).message}`);\n }\n },\n [setStatus],\n );\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === \"c\")) {\n app.exit();\n return;\n }\n if (key.upArrow) {\n setState((s) => ({ ...s, selected: Math.max(0, s.selected - 1) }));\n return;\n }\n if (key.downArrow) {\n setState((s) => ({ ...s, selected: Math.min(filtered.length - 1, s.selected + 1) }));\n return;\n }\n if (key.return) {\n if (selected) install(selected);\n return;\n }\n if (key.tab || (key.ctrl && input === \"n\")) {\n void fetchMore();\n return;\n }\n if (key.backspace || key.delete) {\n setState((s) => ({ ...s, query: s.query.slice(0, -1), selected: 0 }));\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setState((s) => ({ ...s, query: s.query + input, selected: 0 }));\n }\n });\n\n const overlay = useMemo(() => loadOverlay(\"zh-CN\"), []);\n\n const start = Math.max(\n 0,\n Math.min(state.selected - Math.floor(VISIBLE_ROWS / 2), filtered.length - VISIBLE_ROWS),\n );\n const window = filtered.slice(Math.max(0, start), Math.max(0, start) + VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color=\"cyan\">\n ◈ MCP marketplace\n </Text>\n <Text dimColor>{` · ${state.status}`}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>search: </Text>\n <Text color=\"white\">{state.query || \"(type to filter)\"}</Text>\n <Text dimColor>{` ${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}`}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {window.length === 0 ? (\n <Text dimColor>{state.loading ? \"loading…\" : \"no entries\"}</Text>\n ) : (\n window.map((e, i) => {\n const idx = (start || 0) + i;\n const active = idx === state.selected;\n const tag =\n e.source === \"official\" ? \"[off]\" : e.source === \"smithery\" ? \"[smt]\" : \"[loc]\";\n const pop = e.popularity !== undefined ? ` · ${e.popularity.toLocaleString()}` : \"\";\n return (\n <Box key={e.name}>\n <Text color={active ? \"cyan\" : undefined}>{active ? \"▸ \" : \" \"}</Text>\n <Text bold={active}>{e.name.padEnd(40).slice(0, 40)}</Text>\n <Text dimColor>{` ${tag}${pop}`}</Text>\n </Box>\n );\n })\n )}\n </Box>\n {selected ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\">\n {overlay?.[selected.name]?.title ?? selected.title}\n {overlay?.[selected.name] ? (\n <Text dimColor>{` \\u00b7 ${selected.title}`}</Text>\n ) : null}\n </Text>\n <Text dimColor>\n {overlay?.[selected.name]?.description ?? selected.description?.slice(0, 160) ?? null}\n </Text>\n {selected.install ? (\n <Text dimColor>\n {`spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? \"—\"} · ${selected.install.transport}`}\n </Text>\n ) : (\n <Text dimColor>(smithery listing — install info not exposed)</Text>\n )}\n {selected.install?.requiredEnv?.length ? (\n <Text color=\"yellow\">{`needs: ${selected.install.requiredEnv.join(\", \")}`}</Text>\n ) : null}\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>type to filter · ↑↓ pick · enter install · tab load more · esc quit</Text>\n </Box>\n </Box>\n );\n}\n\nexport interface McpBrowseOptions {\n /** Reserved — currently unused, kept for symmetry with other commands. */\n _unused?: never;\n}\n\nexport async function mcpBrowseCommand(_opts: McpBrowseOptions = {}): Promise<void> {\n loadDotenv();\n const { waitUntilExit } = render(<McpBrowseApp />, {\n exitOnCtrlC: true,\n patchConsole: false,\n });\n await waitUntilExit();\n}\n"],"mappings":"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","names":["React"]}
|
|
@@ -3,19 +3,19 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
|
|
|
3
3
|
import {
|
|
4
4
|
buildTransportFromSpec,
|
|
5
5
|
preflightStdioSpec
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XUZHBQSM.js";
|
|
7
7
|
import {
|
|
8
8
|
McpClient,
|
|
9
9
|
inspectMcpServer
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-25T6CVUP.js";
|
|
10
|
+
} from "./chunk-RCC73DWQ.js";
|
|
12
11
|
import "./chunk-XXC2BYTV.js";
|
|
12
|
+
import "./chunk-25T6CVUP.js";
|
|
13
13
|
import {
|
|
14
14
|
normalizeMcpConfig,
|
|
15
15
|
overlayMatchedSpec,
|
|
16
16
|
parseMcpSpec,
|
|
17
17
|
readConfig
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-AOYUW3HR.js";
|
|
19
19
|
import "./chunk-TUK7OWJA.js";
|
|
20
20
|
|
|
21
21
|
// src/cli/commands/mcp-inspect.ts
|
|
@@ -146,4 +146,4 @@ export {
|
|
|
146
146
|
formatMcpInspectFailure,
|
|
147
147
|
mcpInspectCommand
|
|
148
148
|
};
|
|
149
|
-
//# sourceMappingURL=mcp-inspect-
|
|
149
|
+
//# sourceMappingURL=mcp-inspect-MTABNHVM.js.map
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
CODE_SYSTEM_PROMPT,
|
|
5
5
|
codeSystemBase,
|
|
6
6
|
codeSystemPrompt
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-2W4F3RIZ.js";
|
|
8
|
+
import "./chunk-DLTE4GBY.js";
|
|
9
|
+
import "./chunk-CLHMV6OL.js";
|
|
10
|
+
import "./chunk-AOYUW3HR.js";
|
|
11
11
|
import "./chunk-TUK7OWJA.js";
|
|
12
12
|
export {
|
|
13
13
|
CODE_SYSTEM_PROMPT,
|
|
14
14
|
codeSystemBase,
|
|
15
15
|
codeSystemPrompt
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=prompt-
|
|
17
|
+
//# sourceMappingURL=prompt-ATI7DKHF.js.map
|
|
@@ -3,11 +3,11 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
|
|
|
3
3
|
import {
|
|
4
4
|
listSessions,
|
|
5
5
|
pruneStaleSessions
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-AMSK3ZLB.js";
|
|
7
7
|
import {
|
|
8
8
|
t
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-CLHMV6OL.js";
|
|
10
|
+
import "./chunk-AOYUW3HR.js";
|
|
11
11
|
import "./chunk-TUK7OWJA.js";
|
|
12
12
|
|
|
13
13
|
// src/cli/commands/prune-sessions.ts
|
|
@@ -45,4 +45,4 @@ function pruneSessionsCommand(opts) {
|
|
|
45
45
|
export {
|
|
46
46
|
pruneSessionsCommand
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=prune-sessions-
|
|
48
|
+
//# sourceMappingURL=prune-sessions-YQQSZTZS.js.map
|
|
@@ -2,41 +2,41 @@
|
|
|
2
2
|
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
3
|
import {
|
|
4
4
|
RecordView
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-I3NE5S63.js";
|
|
6
6
|
import {
|
|
7
7
|
Bar,
|
|
8
|
-
ChromeRule
|
|
9
|
-
|
|
10
|
-
} from "./chunk-UPW544V3.js";
|
|
8
|
+
ChromeRule
|
|
9
|
+
} from "./chunk-77JIQ7SL.js";
|
|
11
10
|
import {
|
|
12
11
|
computeCumulativeStats,
|
|
13
12
|
groupRecordsByTurn,
|
|
14
13
|
replayFromFile
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-BA5R6BAE.js";
|
|
14
|
+
} from "./chunk-D6WRFR6V.js";
|
|
17
15
|
import {
|
|
18
16
|
COLOR,
|
|
19
17
|
GRADIENT
|
|
20
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-RHQOGG43.js";
|
|
21
19
|
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
Br,
|
|
21
|
+
L,
|
|
22
|
+
W,
|
|
23
|
+
Wo,
|
|
24
|
+
bv,
|
|
25
|
+
fc,
|
|
26
26
|
require_react,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
import "./chunk-C2MRSJTV.js";
|
|
27
|
+
stringWidth,
|
|
28
|
+
vv
|
|
29
|
+
} from "./chunk-3OXD5CBM.js";
|
|
30
|
+
import "./chunk-GFJJEW3Z.js";
|
|
32
31
|
import "./chunk-25T6CVUP.js";
|
|
32
|
+
import "./chunk-6QBUXA73.js";
|
|
33
33
|
import {
|
|
34
34
|
t
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-CLHMV6OL.js";
|
|
36
36
|
import {
|
|
37
37
|
formatBalance,
|
|
38
38
|
formatCost
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-AOYUW3HR.js";
|
|
40
40
|
import {
|
|
41
41
|
__toESM
|
|
42
42
|
} from "./chunk-TUK7OWJA.js";
|
|
@@ -62,7 +62,7 @@ function StatsPanel({
|
|
|
62
62
|
sessionName
|
|
63
63
|
}) {
|
|
64
64
|
const coldStart = summary.turns <= COLD_START_TURNS;
|
|
65
|
-
return /* @__PURE__ */ import_react.default.createElement(
|
|
65
|
+
return /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(
|
|
66
66
|
ChromeRow,
|
|
67
67
|
{
|
|
68
68
|
editMode,
|
|
@@ -94,7 +94,7 @@ function ChromeRow({
|
|
|
94
94
|
const costLabel = `[${formatCost(summary.totalCostUsd, balance?.currency)}]`;
|
|
95
95
|
const cacheLabel = "[c \u25B0\u25B0\u25B0\u25B0\u25B0\u25B0 100%]";
|
|
96
96
|
const updateLabel = updateAvailable ? `\u2191 ${updateAvailable}` : "";
|
|
97
|
-
const { stdout } =
|
|
97
|
+
const { stdout } = bv();
|
|
98
98
|
const cols = (stdout?.columns ?? 80) - 2;
|
|
99
99
|
const SEP_DOT = stringWidth(" \xB7 ");
|
|
100
100
|
const SEP_ARROW = stringWidth(" \u203A ");
|
|
@@ -115,15 +115,15 @@ function ChromeRow({
|
|
|
115
115
|
if (showSession) budget -= sessionW;
|
|
116
116
|
const showUpdate = updateW > 0 && budget >= updateW;
|
|
117
117
|
if (showUpdate) budget -= updateW;
|
|
118
|
-
return /* @__PURE__ */ import_react.default.createElement(
|
|
119
|
-
|
|
118
|
+
return /* @__PURE__ */ import_react.default.createElement(W, null, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: GRADIENT[0] }, "\u25C8 "), /* @__PURE__ */ import_react.default.createElement(L, { color: COLOR.brand, bold: true }, "reasonix"), projectName ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(L, { color: COLOR.info, dimColor: true }, " \xB7 "), /* @__PURE__ */ import_react.default.createElement(L, null, projectName), showSession && sessionName ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(L, { color: COLOR.info, dimColor: true }, " \u203A "), /* @__PURE__ */ import_react.default.createElement(L, { color: COLOR.info }, sessionName)) : null) : null, /* @__PURE__ */ import_react.default.createElement(W, { flexGrow: 1 }), showUpdate ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(L, { color: COLOR.warn, bold: true }, updateLabel), /* @__PURE__ */ import_react.default.createElement(L, null, " ")) : null, modePill ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(L, { color: modePill.color, bold: true }, `[${modePill.label}]`), /* @__PURE__ */ import_react.default.createElement(L, null, " ")) : null, /* @__PURE__ */ import_react.default.createElement(
|
|
119
|
+
L,
|
|
120
120
|
{
|
|
121
121
|
color: summary.turns === 0 || coldStart ? COLOR.info : sessionCostColor(summary.totalCostUsd),
|
|
122
122
|
bold: summary.turns > 0 && !coldStart,
|
|
123
123
|
dimColor: summary.turns === 0 || coldStart
|
|
124
124
|
},
|
|
125
125
|
costLabel
|
|
126
|
-
), showBalance && balance ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
|
|
126
|
+
), showBalance && balance ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(L, null, " "), /* @__PURE__ */ import_react.default.createElement(L, { color: balance.total < 1 ? COLOR.err : balance.total < 5 ? COLOR.warn : COLOR.ok }, balanceLabel)) : null, showCache ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(L, null, " "), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, "["), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, "c "), /* @__PURE__ */ import_react.default.createElement(
|
|
127
127
|
Bar,
|
|
128
128
|
{
|
|
129
129
|
ratio: summary.cacheHitRatio,
|
|
@@ -131,7 +131,7 @@ function ChromeRow({
|
|
|
131
131
|
cells: 6,
|
|
132
132
|
dim: coldStart
|
|
133
133
|
}
|
|
134
|
-
), /* @__PURE__ */ import_react.default.createElement(
|
|
134
|
+
), /* @__PURE__ */ import_react.default.createElement(L, null, " "), /* @__PURE__ */ import_react.default.createElement(L, { color: coldStart ? void 0 : cacheColor, dimColor: coldStart }, coldStart && summary.turns === 0 ? "\u2014" : `${cachePct}%`), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, "]")) : null);
|
|
135
135
|
}
|
|
136
136
|
function pickModePill(planMode, editMode) {
|
|
137
137
|
if (planMode) return { label: t("statsPanel.modePlan"), color: COLOR.err };
|
|
@@ -143,7 +143,7 @@ function pickModePill(planMode, editMode) {
|
|
|
143
143
|
function BudgetRow({ spent, cap }) {
|
|
144
144
|
const pct = Math.max(0, spent / cap * 100);
|
|
145
145
|
const color = pct >= 100 ? "#f87171" : pct >= 80 ? "#fbbf24" : "#94a3b8";
|
|
146
|
-
return /* @__PURE__ */ import_react.default.createElement(
|
|
146
|
+
return /* @__PURE__ */ import_react.default.createElement(W, null, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("statsPanel.budget")), /* @__PURE__ */ import_react.default.createElement(L, { color }, `$${spent.toFixed(4)} / $${cap.toFixed(2)}`, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, ` (${pct.toFixed(0)}%)`)));
|
|
147
147
|
}
|
|
148
148
|
function sessionCostColor(cost) {
|
|
149
149
|
if (cost <= 0) return void 0;
|
|
@@ -154,10 +154,10 @@ function sessionCostColor(cost) {
|
|
|
154
154
|
|
|
155
155
|
// src/cli/ui/ReplayApp.tsx
|
|
156
156
|
function ReplayApp({ meta, pages }) {
|
|
157
|
-
const { exit } =
|
|
157
|
+
const { exit } = fc();
|
|
158
158
|
const maxIdx = Math.max(0, pages.length - 1);
|
|
159
159
|
const [idx, setIdx] = (0, import_react2.useState)(maxIdx);
|
|
160
|
-
|
|
160
|
+
Br((input, key) => {
|
|
161
161
|
if (input === "q" || key.ctrl && input === "c") {
|
|
162
162
|
exit();
|
|
163
163
|
return;
|
|
@@ -192,7 +192,7 @@ function ReplayApp({ meta, pages }) {
|
|
|
192
192
|
const prefixHash = cumStats.prefixHashes.length === 1 ? cumStats.prefixHashes[0].slice(0, 16) : cumStats.prefixHashes.length === 0 ? t("replayApp.untracked") : t("replayApp.churned", { count: cumStats.prefixHashes.length });
|
|
193
193
|
const currentPage = pages[idx];
|
|
194
194
|
const progressLabel = pages.length === 0 ? t("replayApp.emptyTranscript") : t("replayApp.turnProgress", { current: idx + 1, total: pages.length });
|
|
195
|
-
return /* @__PURE__ */ import_react2.default.createElement(
|
|
195
|
+
return /* @__PURE__ */ import_react2.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react2.default.createElement(StatsPanel, { summary }), /* @__PURE__ */ import_react2.default.createElement(W, { flexDirection: "column", marginTop: 1, paddingX: 1 }, /* @__PURE__ */ import_react2.default.createElement(W, { justifyContent: "space-between" }, /* @__PURE__ */ import_react2.default.createElement(L, { color: "cyan", bold: true }, progressLabel), meta ? /* @__PURE__ */ import_react2.default.createElement(L, { dimColor: true }, meta.source, meta.task ? ` \xB7 ${meta.task}` : "", meta.mode ? ` \xB7 ${meta.mode}` : "") : null), currentPage ? /* @__PURE__ */ import_react2.default.createElement(vv, { items: currentPage.records.map((rec, i) => ({ key: `${idx}-${i}`, rec })) }, ({ key, rec }) => /* @__PURE__ */ import_react2.default.createElement(RecordView, { key, rec })) : /* @__PURE__ */ import_react2.default.createElement(L, { dimColor: true, italic: true }, t("replayApp.noRecords"))), /* @__PURE__ */ import_react2.default.createElement(W, { marginTop: 1, paddingX: 1, borderStyle: "single", borderColor: "gray" }, /* @__PURE__ */ import_react2.default.createElement(L, { dimColor: true }, /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "j"), "/", /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "\u2193"), "/", /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "space"), " next \xB7 ", /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "k"), "/", /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "\u2191"), " prev \xB7 ", /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "g"), " first \xB7 ", /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "G"), " last \xB7", " ", /* @__PURE__ */ import_react2.default.createElement(L, { bold: true }, "q"), " quit")));
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
// src/cli/commands/replay.ts
|
|
@@ -204,7 +204,7 @@ async function replayCommand(opts) {
|
|
|
204
204
|
}
|
|
205
205
|
const { parsed } = replayFromFile(opts.path);
|
|
206
206
|
const pages = groupRecordsByTurn(parsed.records);
|
|
207
|
-
const { waitUntilExit } =
|
|
207
|
+
const { waitUntilExit } = Wo(import_react3.default.createElement(ReplayApp, { meta: parsed.meta, pages }), {
|
|
208
208
|
exitOnCtrlC: true,
|
|
209
209
|
patchConsole: false
|
|
210
210
|
});
|
|
@@ -279,4 +279,4 @@ function oneLine(s, max = 200) {
|
|
|
279
279
|
export {
|
|
280
280
|
replayCommand
|
|
281
281
|
};
|
|
282
|
-
//# sourceMappingURL=replay-
|
|
282
|
+
//# sourceMappingURL=replay-ZJQ4I4CJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/replay.ts","../../src/cli/ui/ReplayApp.tsx","../../src/cli/ui/StatsPanel.tsx"],"sourcesContent":["import { render } from \"ink\";\nimport React from \"react\";\nimport type { TranscriptRecord } from \"../../transcript/log.js\";\nimport { groupRecordsByTurn, replayFromFile } from \"../../transcript/replay.js\";\nimport { ReplayApp } from \"../ui/ReplayApp.js\";\n\nexport interface ReplayOptions {\n path: string;\n head?: number;\n tail?: number;\n /** Force stdout pretty-print mode (no Ink TUI). Also auto-enabled when stdout is not a TTY. */\n print?: boolean;\n}\n\nexport async function replayCommand(opts: ReplayOptions): Promise<void> {\n const wantPrint =\n opts.print || !process.stdout.isTTY || opts.head !== undefined || opts.tail !== undefined;\n if (wantPrint) {\n printReplay(opts);\n return;\n }\n\n const { parsed } = replayFromFile(opts.path);\n const pages = groupRecordsByTurn(parsed.records);\n const { waitUntilExit } = render(React.createElement(ReplayApp, { meta: parsed.meta, pages }), {\n exitOnCtrlC: true,\n patchConsole: false,\n });\n await waitUntilExit();\n}\n\n// stdout pretty-print path (original behavior, preserved for piping / CI)\n\nfunction printReplay(opts: ReplayOptions): void {\n const { parsed, stats } = replayFromFile(opts.path);\n\n if (parsed.meta) {\n const m = parsed.meta;\n const bits: string[] = [`source=${m.source}`];\n if (m.model) bits.push(`model=${m.model}`);\n if (m.task) bits.push(`task=${m.task}`);\n if (m.mode) bits.push(`mode=${m.mode}`);\n if (m.repeat !== undefined) bits.push(`repeat=${m.repeat}`);\n bits.push(`started=${m.startedAt}`);\n console.log(`[meta] ${bits.join(\" \")}`);\n console.log(\"\");\n }\n\n const records = sliceRecords(parsed.records, opts);\n for (const rec of records) {\n renderRecord(rec);\n }\n\n console.log(\"\");\n console.log(\"── summary ─────────────────────────────────────────\");\n console.log(`model calls: ${stats.turns}`);\n console.log(`user turns: ${stats.userTurns}`);\n console.log(`tool calls: ${stats.toolCalls}`);\n console.log(`cache hit: ${(stats.cacheHitRatio * 100).toFixed(1)}%`);\n console.log(`cost: $${stats.totalCostUsd.toFixed(6)}`);\n console.log(`claude equivalent: $${stats.claudeEquivalentUsd.toFixed(6)}`);\n console.log(`savings vs claude: ${stats.savingsVsClaudePct.toFixed(1)}%`);\n console.log(`models: ${stats.models.join(\", \") || \"—\"}`);\n console.log(`prefix hashes: ${stats.prefixHashes.length} distinct`);\n if (stats.prefixHashes.length === 1) {\n console.log(` (byte-stable prefix: ${stats.prefixHashes[0]?.slice(0, 16)}…)`);\n } else if (stats.prefixHashes.length > 1) {\n console.log(\" (prefix churned — cache-hostile session)\");\n }\n}\n\nfunction sliceRecords(records: TranscriptRecord[], opts: ReplayOptions): TranscriptRecord[] {\n if (opts.head !== undefined && opts.head > 0) return records.slice(0, opts.head);\n if (opts.tail !== undefined && opts.tail > 0) return records.slice(-opts.tail);\n return records;\n}\n\nfunction renderRecord(rec: TranscriptRecord): void {\n const turn = `[t${rec.turn}]`;\n if (rec.role === \"user\") {\n console.log(`${turn} USER: ${oneLine(rec.content)}`);\n } else if (rec.role === \"assistant_final\") {\n const cost = rec.cost !== undefined ? ` $${rec.cost.toFixed(6)}` : \"\";\n const cache =\n rec.usage &&\n (rec.usage.prompt_cache_hit_tokens !== undefined ||\n rec.usage.prompt_cache_miss_tokens !== undefined)\n ? (() => {\n const hit = rec.usage!.prompt_cache_hit_tokens ?? 0;\n const miss = rec.usage!.prompt_cache_miss_tokens ?? 0;\n const total = hit + miss;\n return total > 0 ? ` cache=${((hit / total) * 100).toFixed(1)}%` : \"\";\n })()\n : \"\";\n console.log(`${turn} AGENT:${cost}${cache} ${oneLine(rec.content)}`);\n } else if (rec.role === \"tool\") {\n const args = rec.args ? ` args=${oneLine(rec.args, 80)}` : \"\";\n console.log(`${turn} TOOL ${rec.tool ?? \"?\"}:${args} → ${oneLine(rec.content, 120)}`);\n } else if (rec.role === \"error\") {\n console.log(`${turn} ERROR: ${rec.error ?? rec.content}`);\n } else if (rec.role === \"done\") {\n // Suppress — visually noisy, not informative in replay.\n } else {\n console.log(`${turn} ${rec.role}: ${oneLine(rec.content)}`);\n }\n}\n\nfunction oneLine(s: string, max = 200): string {\n const collapsed = s.replace(/\\s+/g, \" \").trim();\n return collapsed.length > max ? `${collapsed.slice(0, max)}…` : collapsed;\n}\n","/**\n * Ink TUI for `reasonix replay`. Read-only: no input box, no loop.\n * j/k navigation across turn-pages, cumulative stats sidebar updates\n * as you move through time.\n *\n * The navigation logic (grouping records into pages, computing cumulative\n * stats) lives in src/replay.ts as pure functions; this file is just\n * presentation + key bindings.\n */\n\nimport { Box, Static, Text, useApp, useInput } from \"ink\";\nimport React, { useMemo, useState } from \"react\";\nimport { t } from \"../../i18n/index.js\";\nimport type { TranscriptMeta } from \"../../transcript/log.js\";\nimport { type TurnPage, computeCumulativeStats } from \"../../transcript/replay.js\";\nimport { RecordView } from \"./RecordView.js\";\nimport { StatsPanel } from \"./StatsPanel.js\";\n\nexport interface ReplayAppProps {\n meta: TranscriptMeta | null;\n pages: TurnPage[];\n}\n\nexport function ReplayApp({ meta, pages }: ReplayAppProps) {\n const { exit } = useApp();\n const maxIdx = Math.max(0, pages.length - 1);\n // Start at the last page — more useful than \"start from the beginning\"\n // in practice: users mostly want to see the summary + last turn first.\n const [idx, setIdx] = useState(maxIdx);\n\n useInput((input, key) => {\n if (input === \"q\" || (key.ctrl && input === \"c\")) {\n exit();\n return;\n }\n if (input === \"j\" || key.downArrow || input === \" \" || key.return) {\n setIdx((i) => Math.min(maxIdx, i + 1));\n } else if (input === \"k\" || key.upArrow) {\n setIdx((i) => Math.max(0, i - 1));\n } else if (input === \"g\") {\n setIdx(0);\n } else if (input === \"G\") {\n setIdx(maxIdx);\n } else if (input === \"h\" || key.leftArrow) {\n setIdx(0);\n } else if (input === \"l\" || key.rightArrow) {\n setIdx(maxIdx);\n }\n });\n\n const cumStats = useMemo(() => computeCumulativeStats(pages, idx), [pages, idx]);\n\n const summary = {\n turns: cumStats.turns,\n totalCostUsd: cumStats.totalCostUsd,\n totalInputCostUsd: cumStats.totalInputCostUsd,\n totalOutputCostUsd: cumStats.totalOutputCostUsd,\n claudeEquivalentUsd: cumStats.claudeEquivalentUsd,\n savingsVsClaudePct: cumStats.savingsVsClaudePct,\n cacheHitRatio: cumStats.cacheHitRatio,\n // Replay is read-only — no live last-turn prompt tokens to show.\n lastPromptTokens: 0,\n lastTurnCostUsd: 0,\n };\n\n const prefixHash =\n cumStats.prefixHashes.length === 1\n ? cumStats.prefixHashes[0]!.slice(0, 16)\n : cumStats.prefixHashes.length === 0\n ? t(\"replayApp.untracked\")\n : t(\"replayApp.churned\", { count: cumStats.prefixHashes.length });\n\n const currentPage = pages[idx];\n const progressLabel =\n pages.length === 0\n ? t(\"replayApp.emptyTranscript\")\n : t(\"replayApp.turnProgress\", { current: idx + 1, total: pages.length });\n\n return (\n <Box flexDirection=\"column\">\n <StatsPanel summary={summary} />\n\n <Box flexDirection=\"column\" marginTop={1} paddingX={1}>\n <Box justifyContent=\"space-between\">\n <Text color=\"cyan\" bold>\n {progressLabel}\n </Text>\n {meta ? (\n <Text dimColor>\n {meta.source}\n {meta.task ? ` · ${meta.task}` : \"\"}\n {meta.mode ? ` · ${meta.mode}` : \"\"}\n </Text>\n ) : null}\n </Box>\n\n {currentPage ? (\n <Static items={currentPage.records.map((rec, i) => ({ key: `${idx}-${i}`, rec }))}>\n {({ key, rec }) => <RecordView key={key} rec={rec} />}\n </Static>\n ) : (\n <Text dimColor italic>\n {t(\"replayApp.noRecords\")}\n </Text>\n )}\n </Box>\n\n <Box marginTop={1} paddingX={1} borderStyle=\"single\" borderColor=\"gray\">\n <Text dimColor>\n <Text bold>j</Text>/<Text bold>↓</Text>/<Text bold>space</Text> next · <Text bold>k</Text>\n /<Text bold>↑</Text> prev · <Text bold>g</Text> first · <Text bold>G</Text> last ·{\" \"}\n <Text bold>q</Text> quit\n </Text>\n </Box>\n </Box>\n );\n}\n","import { basename } from \"node:path\";\nimport { Box, Text, useStdout } from \"ink\";\nimport React from \"react\";\nimport stringWidth from \"string-width\";\nimport type { EditMode } from \"../../config.js\";\nimport { t } from \"../../i18n/index.js\";\nimport type { SessionSummary } from \"../../telemetry/stats.js\";\nimport { Bar, ChromeRule } from \"./primitives.js\";\nimport { COLOR, GRADIENT } from \"./theme.js\";\nimport { formatBalance, formatCost } from \"./theme/tokens.js\";\n\nconst COLD_START_TURNS = 3;\n\nexport interface StatsPanelProps {\n summary: SessionSummary;\n planMode?: boolean;\n editMode?: EditMode;\n balance?: { currency: string; total: number } | null;\n updateAvailable?: string | null;\n budgetUsd?: number | null;\n rootDir?: string;\n sessionName?: string | null;\n}\n\nexport function StatsPanel({\n summary,\n planMode,\n editMode,\n balance,\n updateAvailable,\n budgetUsd,\n rootDir,\n sessionName,\n}: StatsPanelProps) {\n const coldStart = summary.turns <= COLD_START_TURNS;\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <ChromeRow\n editMode={editMode}\n planMode={planMode}\n summary={summary}\n coldStart={coldStart}\n rootDir={rootDir}\n sessionName={sessionName ?? null}\n updateAvailable={updateAvailable}\n balance={balance ?? null}\n />\n <ChromeRule />\n {budgetUsd !== null && budgetUsd !== undefined ? (\n <BudgetRow spent={summary.totalCostUsd} cap={budgetUsd} />\n ) : null}\n </Box>\n );\n}\n\nfunction ChromeRow({\n editMode,\n planMode,\n summary,\n coldStart,\n rootDir,\n sessionName,\n updateAvailable,\n balance,\n}: {\n editMode?: EditMode;\n planMode?: boolean;\n summary: SessionSummary;\n coldStart: boolean;\n rootDir?: string;\n sessionName?: string | null;\n updateAvailable?: string | null;\n balance?: { currency: string; total: number } | null;\n}) {\n const modePill = pickModePill(planMode, editMode);\n const projectName = rootDir ? basename(rootDir) : null;\n const cachePct = (summary.cacheHitRatio * 100).toFixed(1);\n const cacheColor =\n summary.cacheHitRatio >= 0.7 ? COLOR.ok : summary.cacheHitRatio >= 0.4 ? COLOR.warn : COLOR.err;\n const balanceLabel = balance\n ? `[${formatBalance(balance.total, balance.currency, { label: true })}]`\n : \"\";\n const costLabel = `[${formatCost(summary.totalCostUsd, balance?.currency)}]`;\n const cacheLabel = \"[c ▰▰▰▰▰▰ 100%]\";\n const updateLabel = updateAvailable ? `↑ ${updateAvailable}` : \"\";\n\n // Greedy width-aware fit. Layout (every gap = 2 cells):\n // [brand][·project][›session]<spacer>[update][mode][cost][balance][cache]\n // Always shown: brand, project (if rootDir), mode (if set), cost.\n // Optional, dropped greedy by priority: balance > cache > session > update.\n const { stdout } = useStdout();\n const cols = (stdout?.columns ?? 80) - 2; // subtract paddingX={1} on both sides\n const SEP_DOT = stringWidth(\" · \");\n const SEP_ARROW = stringWidth(\" › \");\n const GAP = 2;\n\n const fixedLeft =\n stringWidth(\"◈ reasonix\") + (projectName ? SEP_DOT + stringWidth(projectName) : 0);\n const modeW = modePill ? GAP + stringWidth(`[${modePill.label}]`) : 0;\n const fixedRight = modeW + stringWidth(costLabel);\n let budget = cols - fixedLeft - fixedRight;\n\n const balW = balance ? GAP + stringWidth(balanceLabel) : 0;\n const cacheW = GAP + stringWidth(cacheLabel);\n const sessionW = sessionName ? SEP_ARROW + stringWidth(sessionName) : 0;\n const updateW = updateLabel ? GAP + stringWidth(updateLabel) : 0;\n\n const showBalance = balW > 0 && budget >= balW;\n if (showBalance) budget -= balW;\n const showCache = budget >= cacheW;\n if (showCache) budget -= cacheW;\n const showSession = sessionW > 0 && budget >= sessionW;\n if (showSession) budget -= sessionW;\n const showUpdate = updateW > 0 && budget >= updateW;\n if (showUpdate) budget -= updateW;\n\n return (\n <Box>\n <Text bold color={GRADIENT[0]}>\n {\"◈ \"}\n </Text>\n <Text color={COLOR.brand} bold>\n reasonix\n </Text>\n {projectName ? (\n <>\n <Text color={COLOR.info} dimColor>\n {\" · \"}\n </Text>\n <Text>{projectName}</Text>\n {showSession && sessionName ? (\n <>\n <Text color={COLOR.info} dimColor>\n {\" › \"}\n </Text>\n <Text color={COLOR.info}>{sessionName}</Text>\n </>\n ) : null}\n </>\n ) : null}\n\n <Box flexGrow={1} />\n\n {showUpdate ? (\n <>\n <Text color={COLOR.warn} bold>\n {updateLabel}\n </Text>\n <Text>{\" \"}</Text>\n </>\n ) : null}\n {modePill ? (\n <>\n <Text color={modePill.color} bold>\n {`[${modePill.label}]`}\n </Text>\n <Text>{\" \"}</Text>\n </>\n ) : null}\n <Text\n color={\n summary.turns === 0 || coldStart ? COLOR.info : sessionCostColor(summary.totalCostUsd)\n }\n bold={summary.turns > 0 && !coldStart}\n dimColor={summary.turns === 0 || coldStart}\n >\n {costLabel}\n </Text>\n {showBalance && balance ? (\n <>\n <Text>{\" \"}</Text>\n <Text color={balance.total < 1 ? COLOR.err : balance.total < 5 ? COLOR.warn : COLOR.ok}>\n {balanceLabel}\n </Text>\n </>\n ) : null}\n {showCache ? (\n <>\n <Text>{\" \"}</Text>\n <Text dimColor>{\"[\"}</Text>\n <Text dimColor>{\"c \"}</Text>\n <Bar\n ratio={summary.cacheHitRatio}\n color={coldStart ? COLOR.info : cacheColor}\n cells={6}\n dim={coldStart}\n />\n <Text> </Text>\n <Text color={coldStart ? undefined : cacheColor} dimColor={coldStart}>\n {coldStart && summary.turns === 0 ? \"—\" : `${cachePct}%`}\n </Text>\n <Text dimColor>{\"]\"}</Text>\n </>\n ) : null}\n </Box>\n );\n}\n\nfunction pickModePill(\n planMode: boolean | undefined,\n editMode: EditMode | undefined,\n): { label: string; color: string } | null {\n if (planMode) return { label: t(\"statsPanel.modePlan\"), color: COLOR.err };\n if (editMode === \"yolo\") return { label: t(\"statsPanel.modeYolo\"), color: COLOR.err };\n if (editMode === \"auto\") return { label: t(\"statsPanel.modeAuto\"), color: COLOR.primary };\n if (editMode === \"review\") return { label: t(\"statsPanel.modeReview\"), color: COLOR.info };\n return null;\n}\n\nfunction BudgetRow({ spent, cap }: { spent: number; cap: number }) {\n const pct = Math.max(0, (spent / cap) * 100);\n const color = pct >= 100 ? \"#f87171\" : pct >= 80 ? \"#fbbf24\" : \"#94a3b8\";\n return (\n <Box>\n <Text dimColor>{t(\"statsPanel.budget\")}</Text>\n <Text color={color}>\n {`$${spent.toFixed(4)} / $${cap.toFixed(2)}`}\n <Text dimColor>{` (${pct.toFixed(0)}%)`}</Text>\n </Text>\n </Box>\n );\n}\n\nfunction sessionCostColor(cost: number): string | undefined {\n if (cost <= 0) return undefined;\n if (cost >= 5) return COLOR.err;\n if (cost >= 0.5) return COLOR.warn;\n return COLOR.ok;\n}\n"],"mappings":"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","names":["import_react","import_react","React","React","React"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/replay.ts","../../src/cli/ui/ReplayApp.tsx","../../src/cli/ui/StatsPanel.tsx"],"sourcesContent":["import { render } from \"ink\";\nimport React from \"react\";\nimport type { TranscriptRecord } from \"../../transcript/log.js\";\nimport { groupRecordsByTurn, replayFromFile } from \"../../transcript/replay.js\";\nimport { ReplayApp } from \"../ui/ReplayApp.js\";\n\nexport interface ReplayOptions {\n path: string;\n head?: number;\n tail?: number;\n /** Force stdout pretty-print mode (no Ink TUI). Also auto-enabled when stdout is not a TTY. */\n print?: boolean;\n}\n\nexport async function replayCommand(opts: ReplayOptions): Promise<void> {\n const wantPrint =\n opts.print || !process.stdout.isTTY || opts.head !== undefined || opts.tail !== undefined;\n if (wantPrint) {\n printReplay(opts);\n return;\n }\n\n const { parsed } = replayFromFile(opts.path);\n const pages = groupRecordsByTurn(parsed.records);\n const { waitUntilExit } = render(React.createElement(ReplayApp, { meta: parsed.meta, pages }), {\n exitOnCtrlC: true,\n patchConsole: false,\n });\n await waitUntilExit();\n}\n\n// stdout pretty-print path (original behavior, preserved for piping / CI)\n\nfunction printReplay(opts: ReplayOptions): void {\n const { parsed, stats } = replayFromFile(opts.path);\n\n if (parsed.meta) {\n const m = parsed.meta;\n const bits: string[] = [`source=${m.source}`];\n if (m.model) bits.push(`model=${m.model}`);\n if (m.task) bits.push(`task=${m.task}`);\n if (m.mode) bits.push(`mode=${m.mode}`);\n if (m.repeat !== undefined) bits.push(`repeat=${m.repeat}`);\n bits.push(`started=${m.startedAt}`);\n console.log(`[meta] ${bits.join(\" \")}`);\n console.log(\"\");\n }\n\n const records = sliceRecords(parsed.records, opts);\n for (const rec of records) {\n renderRecord(rec);\n }\n\n console.log(\"\");\n console.log(\"── summary ─────────────────────────────────────────\");\n console.log(`model calls: ${stats.turns}`);\n console.log(`user turns: ${stats.userTurns}`);\n console.log(`tool calls: ${stats.toolCalls}`);\n console.log(`cache hit: ${(stats.cacheHitRatio * 100).toFixed(1)}%`);\n console.log(`cost: $${stats.totalCostUsd.toFixed(6)}`);\n console.log(`claude equivalent: $${stats.claudeEquivalentUsd.toFixed(6)}`);\n console.log(`savings vs claude: ${stats.savingsVsClaudePct.toFixed(1)}%`);\n console.log(`models: ${stats.models.join(\", \") || \"—\"}`);\n console.log(`prefix hashes: ${stats.prefixHashes.length} distinct`);\n if (stats.prefixHashes.length === 1) {\n console.log(` (byte-stable prefix: ${stats.prefixHashes[0]?.slice(0, 16)}…)`);\n } else if (stats.prefixHashes.length > 1) {\n console.log(\" (prefix churned — cache-hostile session)\");\n }\n}\n\nfunction sliceRecords(records: TranscriptRecord[], opts: ReplayOptions): TranscriptRecord[] {\n if (opts.head !== undefined && opts.head > 0) return records.slice(0, opts.head);\n if (opts.tail !== undefined && opts.tail > 0) return records.slice(-opts.tail);\n return records;\n}\n\nfunction renderRecord(rec: TranscriptRecord): void {\n const turn = `[t${rec.turn}]`;\n if (rec.role === \"user\") {\n console.log(`${turn} USER: ${oneLine(rec.content)}`);\n } else if (rec.role === \"assistant_final\") {\n const cost = rec.cost !== undefined ? ` $${rec.cost.toFixed(6)}` : \"\";\n const cache =\n rec.usage &&\n (rec.usage.prompt_cache_hit_tokens !== undefined ||\n rec.usage.prompt_cache_miss_tokens !== undefined)\n ? (() => {\n const hit = rec.usage!.prompt_cache_hit_tokens ?? 0;\n const miss = rec.usage!.prompt_cache_miss_tokens ?? 0;\n const total = hit + miss;\n return total > 0 ? ` cache=${((hit / total) * 100).toFixed(1)}%` : \"\";\n })()\n : \"\";\n console.log(`${turn} AGENT:${cost}${cache} ${oneLine(rec.content)}`);\n } else if (rec.role === \"tool\") {\n const args = rec.args ? ` args=${oneLine(rec.args, 80)}` : \"\";\n console.log(`${turn} TOOL ${rec.tool ?? \"?\"}:${args} → ${oneLine(rec.content, 120)}`);\n } else if (rec.role === \"error\") {\n console.log(`${turn} ERROR: ${rec.error ?? rec.content}`);\n } else if (rec.role === \"done\") {\n // Suppress — visually noisy, not informative in replay.\n } else {\n console.log(`${turn} ${rec.role}: ${oneLine(rec.content)}`);\n }\n}\n\nfunction oneLine(s: string, max = 200): string {\n const collapsed = s.replace(/\\s+/g, \" \").trim();\n return collapsed.length > max ? `${collapsed.slice(0, max)}…` : collapsed;\n}\n","/**\n * Ink TUI for `reasonix replay`. Read-only: no input box, no loop.\n * j/k navigation across turn-pages, cumulative stats sidebar updates\n * as you move through time.\n *\n * The navigation logic (grouping records into pages, computing cumulative\n * stats) lives in src/replay.ts as pure functions; this file is just\n * presentation + key bindings.\n */\n\nimport { Box, Static, Text, useApp, useInput } from \"ink\";\nimport React, { useMemo, useState } from \"react\";\nimport { t } from \"../../i18n/index.js\";\nimport type { TranscriptMeta } from \"../../transcript/log.js\";\nimport { type TurnPage, computeCumulativeStats } from \"../../transcript/replay.js\";\nimport { RecordView } from \"./RecordView.js\";\nimport { StatsPanel } from \"./StatsPanel.js\";\n\nexport interface ReplayAppProps {\n meta: TranscriptMeta | null;\n pages: TurnPage[];\n}\n\nexport function ReplayApp({ meta, pages }: ReplayAppProps) {\n const { exit } = useApp();\n const maxIdx = Math.max(0, pages.length - 1);\n // Start at the last page — more useful than \"start from the beginning\"\n // in practice: users mostly want to see the summary + last turn first.\n const [idx, setIdx] = useState(maxIdx);\n\n useInput((input, key) => {\n if (input === \"q\" || (key.ctrl && input === \"c\")) {\n exit();\n return;\n }\n if (input === \"j\" || key.downArrow || input === \" \" || key.return) {\n setIdx((i) => Math.min(maxIdx, i + 1));\n } else if (input === \"k\" || key.upArrow) {\n setIdx((i) => Math.max(0, i - 1));\n } else if (input === \"g\") {\n setIdx(0);\n } else if (input === \"G\") {\n setIdx(maxIdx);\n } else if (input === \"h\" || key.leftArrow) {\n setIdx(0);\n } else if (input === \"l\" || key.rightArrow) {\n setIdx(maxIdx);\n }\n });\n\n const cumStats = useMemo(() => computeCumulativeStats(pages, idx), [pages, idx]);\n\n const summary = {\n turns: cumStats.turns,\n totalCostUsd: cumStats.totalCostUsd,\n totalInputCostUsd: cumStats.totalInputCostUsd,\n totalOutputCostUsd: cumStats.totalOutputCostUsd,\n claudeEquivalentUsd: cumStats.claudeEquivalentUsd,\n savingsVsClaudePct: cumStats.savingsVsClaudePct,\n cacheHitRatio: cumStats.cacheHitRatio,\n // Replay is read-only — no live last-turn prompt tokens to show.\n lastPromptTokens: 0,\n lastTurnCostUsd: 0,\n };\n\n const prefixHash =\n cumStats.prefixHashes.length === 1\n ? cumStats.prefixHashes[0]!.slice(0, 16)\n : cumStats.prefixHashes.length === 0\n ? t(\"replayApp.untracked\")\n : t(\"replayApp.churned\", { count: cumStats.prefixHashes.length });\n\n const currentPage = pages[idx];\n const progressLabel =\n pages.length === 0\n ? t(\"replayApp.emptyTranscript\")\n : t(\"replayApp.turnProgress\", { current: idx + 1, total: pages.length });\n\n return (\n <Box flexDirection=\"column\">\n <StatsPanel summary={summary} />\n\n <Box flexDirection=\"column\" marginTop={1} paddingX={1}>\n <Box justifyContent=\"space-between\">\n <Text color=\"cyan\" bold>\n {progressLabel}\n </Text>\n {meta ? (\n <Text dimColor>\n {meta.source}\n {meta.task ? ` · ${meta.task}` : \"\"}\n {meta.mode ? ` · ${meta.mode}` : \"\"}\n </Text>\n ) : null}\n </Box>\n\n {currentPage ? (\n <Static items={currentPage.records.map((rec, i) => ({ key: `${idx}-${i}`, rec }))}>\n {({ key, rec }) => <RecordView key={key} rec={rec} />}\n </Static>\n ) : (\n <Text dimColor italic>\n {t(\"replayApp.noRecords\")}\n </Text>\n )}\n </Box>\n\n <Box marginTop={1} paddingX={1} borderStyle=\"single\" borderColor=\"gray\">\n <Text dimColor>\n <Text bold>j</Text>/<Text bold>↓</Text>/<Text bold>space</Text> next · <Text bold>k</Text>\n /<Text bold>↑</Text> prev · <Text bold>g</Text> first · <Text bold>G</Text> last ·{\" \"}\n <Text bold>q</Text> quit\n </Text>\n </Box>\n </Box>\n );\n}\n","import { basename } from \"node:path\";\nimport { Box, Text, useStdout } from \"ink\";\nimport React from \"react\";\nimport stringWidth from \"string-width\";\nimport type { EditMode } from \"../../config.js\";\nimport { t } from \"../../i18n/index.js\";\nimport type { SessionSummary } from \"../../telemetry/stats.js\";\nimport { Bar, ChromeRule } from \"./primitives.js\";\nimport { COLOR, GRADIENT } from \"./theme.js\";\nimport { formatBalance, formatCost } from \"./theme/tokens.js\";\n\nconst COLD_START_TURNS = 3;\n\nexport interface StatsPanelProps {\n summary: SessionSummary;\n planMode?: boolean;\n editMode?: EditMode;\n balance?: { currency: string; total: number } | null;\n updateAvailable?: string | null;\n budgetUsd?: number | null;\n rootDir?: string;\n sessionName?: string | null;\n}\n\nexport function StatsPanel({\n summary,\n planMode,\n editMode,\n balance,\n updateAvailable,\n budgetUsd,\n rootDir,\n sessionName,\n}: StatsPanelProps) {\n const coldStart = summary.turns <= COLD_START_TURNS;\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <ChromeRow\n editMode={editMode}\n planMode={planMode}\n summary={summary}\n coldStart={coldStart}\n rootDir={rootDir}\n sessionName={sessionName ?? null}\n updateAvailable={updateAvailable}\n balance={balance ?? null}\n />\n <ChromeRule />\n {budgetUsd !== null && budgetUsd !== undefined ? (\n <BudgetRow spent={summary.totalCostUsd} cap={budgetUsd} />\n ) : null}\n </Box>\n );\n}\n\nfunction ChromeRow({\n editMode,\n planMode,\n summary,\n coldStart,\n rootDir,\n sessionName,\n updateAvailable,\n balance,\n}: {\n editMode?: EditMode;\n planMode?: boolean;\n summary: SessionSummary;\n coldStart: boolean;\n rootDir?: string;\n sessionName?: string | null;\n updateAvailable?: string | null;\n balance?: { currency: string; total: number } | null;\n}) {\n const modePill = pickModePill(planMode, editMode);\n const projectName = rootDir ? basename(rootDir) : null;\n const cachePct = (summary.cacheHitRatio * 100).toFixed(1);\n const cacheColor =\n summary.cacheHitRatio >= 0.7 ? COLOR.ok : summary.cacheHitRatio >= 0.4 ? COLOR.warn : COLOR.err;\n const balanceLabel = balance\n ? `[${formatBalance(balance.total, balance.currency, { label: true })}]`\n : \"\";\n const costLabel = `[${formatCost(summary.totalCostUsd, balance?.currency)}]`;\n const cacheLabel = \"[c ▰▰▰▰▰▰ 100%]\";\n const updateLabel = updateAvailable ? `↑ ${updateAvailable}` : \"\";\n\n // Greedy width-aware fit. Layout (every gap = 2 cells):\n // [brand][·project][›session]<spacer>[update][mode][cost][balance][cache]\n // Always shown: brand, project (if rootDir), mode (if set), cost.\n // Optional, dropped greedy by priority: balance > cache > session > update.\n const { stdout } = useStdout();\n const cols = (stdout?.columns ?? 80) - 2; // subtract paddingX={1} on both sides\n const SEP_DOT = stringWidth(\" · \");\n const SEP_ARROW = stringWidth(\" › \");\n const GAP = 2;\n\n const fixedLeft =\n stringWidth(\"◈ reasonix\") + (projectName ? SEP_DOT + stringWidth(projectName) : 0);\n const modeW = modePill ? GAP + stringWidth(`[${modePill.label}]`) : 0;\n const fixedRight = modeW + stringWidth(costLabel);\n let budget = cols - fixedLeft - fixedRight;\n\n const balW = balance ? GAP + stringWidth(balanceLabel) : 0;\n const cacheW = GAP + stringWidth(cacheLabel);\n const sessionW = sessionName ? SEP_ARROW + stringWidth(sessionName) : 0;\n const updateW = updateLabel ? GAP + stringWidth(updateLabel) : 0;\n\n const showBalance = balW > 0 && budget >= balW;\n if (showBalance) budget -= balW;\n const showCache = budget >= cacheW;\n if (showCache) budget -= cacheW;\n const showSession = sessionW > 0 && budget >= sessionW;\n if (showSession) budget -= sessionW;\n const showUpdate = updateW > 0 && budget >= updateW;\n if (showUpdate) budget -= updateW;\n\n return (\n <Box>\n <Text bold color={GRADIENT[0]}>\n {\"◈ \"}\n </Text>\n <Text color={COLOR.brand} bold>\n reasonix\n </Text>\n {projectName ? (\n <>\n <Text color={COLOR.info} dimColor>\n {\" · \"}\n </Text>\n <Text>{projectName}</Text>\n {showSession && sessionName ? (\n <>\n <Text color={COLOR.info} dimColor>\n {\" › \"}\n </Text>\n <Text color={COLOR.info}>{sessionName}</Text>\n </>\n ) : null}\n </>\n ) : null}\n\n <Box flexGrow={1} />\n\n {showUpdate ? (\n <>\n <Text color={COLOR.warn} bold>\n {updateLabel}\n </Text>\n <Text>{\" \"}</Text>\n </>\n ) : null}\n {modePill ? (\n <>\n <Text color={modePill.color} bold>\n {`[${modePill.label}]`}\n </Text>\n <Text>{\" \"}</Text>\n </>\n ) : null}\n <Text\n color={\n summary.turns === 0 || coldStart ? COLOR.info : sessionCostColor(summary.totalCostUsd)\n }\n bold={summary.turns > 0 && !coldStart}\n dimColor={summary.turns === 0 || coldStart}\n >\n {costLabel}\n </Text>\n {showBalance && balance ? (\n <>\n <Text>{\" \"}</Text>\n <Text color={balance.total < 1 ? COLOR.err : balance.total < 5 ? COLOR.warn : COLOR.ok}>\n {balanceLabel}\n </Text>\n </>\n ) : null}\n {showCache ? (\n <>\n <Text>{\" \"}</Text>\n <Text dimColor>{\"[\"}</Text>\n <Text dimColor>{\"c \"}</Text>\n <Bar\n ratio={summary.cacheHitRatio}\n color={coldStart ? COLOR.info : cacheColor}\n cells={6}\n dim={coldStart}\n />\n <Text> </Text>\n <Text color={coldStart ? undefined : cacheColor} dimColor={coldStart}>\n {coldStart && summary.turns === 0 ? \"—\" : `${cachePct}%`}\n </Text>\n <Text dimColor>{\"]\"}</Text>\n </>\n ) : null}\n </Box>\n );\n}\n\nfunction pickModePill(\n planMode: boolean | undefined,\n editMode: EditMode | undefined,\n): { label: string; color: string } | null {\n if (planMode) return { label: t(\"statsPanel.modePlan\"), color: COLOR.err };\n if (editMode === \"yolo\") return { label: t(\"statsPanel.modeYolo\"), color: COLOR.err };\n if (editMode === \"auto\") return { label: t(\"statsPanel.modeAuto\"), color: COLOR.primary };\n if (editMode === \"review\") return { label: t(\"statsPanel.modeReview\"), color: COLOR.info };\n return null;\n}\n\nfunction BudgetRow({ spent, cap }: { spent: number; cap: number }) {\n const pct = Math.max(0, (spent / cap) * 100);\n const color = pct >= 100 ? \"#f87171\" : pct >= 80 ? \"#fbbf24\" : \"#94a3b8\";\n return (\n <Box>\n <Text dimColor>{t(\"statsPanel.budget\")}</Text>\n <Text color={color}>\n {`$${spent.toFixed(4)} / $${cap.toFixed(2)}`}\n <Text dimColor>{` (${pct.toFixed(0)}%)`}</Text>\n </Text>\n </Box>\n );\n}\n\nfunction sessionCostColor(cost: number): string | undefined {\n if (cost <= 0) return undefined;\n if (cost >= 5) return COLOR.err;\n if (cost >= 0.5) return COLOR.warn;\n return COLOR.ok;\n}\n"],"mappings":"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","names":["import_react","import_react","React","React","React"]}
|