reasonix 0.52.0 → 0.53.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.
Files changed (143) hide show
  1. package/README.md +1 -0
  2. package/README.zh-CN.md +1 -0
  3. package/dashboard/dist/app.css +1 -1
  4. package/dashboard/dist/app.js +13 -13
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/dist/cli/{acp-NEUYWGUU.js → acp-ABNDGEYC.js} +63 -30
  7. package/dist/cli/acp-ABNDGEYC.js.map +1 -0
  8. package/dist/cli/chat-377YZV56.js +49 -0
  9. package/dist/cli/{chunk-FY5UERSG.js → chunk-2WZT27GR.js} +9 -9
  10. package/dist/cli/{chunk-B4MOGWHW.js → chunk-4EHRIP5U.js} +7 -7
  11. package/dist/cli/chunk-4EHRIP5U.js.map +1 -0
  12. package/dist/cli/{chunk-RCC73DWQ.js → chunk-4SBXAHR6.js} +4 -4
  13. package/dist/cli/{chunk-5YLEKX2V.js → chunk-4V4TKQMB.js} +4 -4
  14. package/dist/cli/{chunk-5YLEKX2V.js.map → chunk-4V4TKQMB.js.map} +1 -1
  15. package/dist/cli/chunk-7ZO6H6ZK.js +54 -0
  16. package/dist/cli/chunk-7ZO6H6ZK.js.map +1 -0
  17. package/dist/cli/{chunk-3OXD5CBM.js → chunk-A6GSOADP.js} +17870 -16070
  18. package/dist/cli/chunk-A6GSOADP.js.map +1 -0
  19. package/dist/cli/{chunk-Z663GVUB.js → chunk-APOSDBAU.js} +3 -3
  20. package/dist/cli/{chunk-CTRM32BP.js → chunk-B5JISV5I.js} +2 -2
  21. package/dist/cli/{chunk-HNZ4727T.js → chunk-DFHI2MRB.js} +412 -152
  22. package/dist/cli/chunk-DFHI2MRB.js.map +1 -0
  23. package/dist/cli/{chunk-CGVW5W7N.js → chunk-EPIHGOM3.js} +14 -14
  24. package/dist/cli/{chunk-CGVW5W7N.js.map → chunk-EPIHGOM3.js.map} +1 -1
  25. package/dist/cli/{chunk-77JIQ7SL.js → chunk-EQFZIHKJ.js} +8 -8
  26. package/dist/cli/chunk-EQFZIHKJ.js.map +1 -0
  27. package/dist/cli/{chunk-XNMXVL6C.js → chunk-FB27YXPX.js} +2 -2
  28. package/dist/cli/{chunk-ARBGTNHM.js → chunk-FK7NXDRP.js} +2 -2
  29. package/dist/cli/{chunk-AOYUW3HR.js → chunk-GCNBIWK7.js} +22 -2
  30. package/dist/cli/chunk-GCNBIWK7.js.map +1 -0
  31. package/dist/cli/{chunk-XBYHNZ5Z.js → chunk-GMQVINZK.js} +13 -5
  32. package/dist/cli/chunk-GMQVINZK.js.map +1 -0
  33. package/dist/cli/{chunk-MVLPXZAA.js → chunk-GOASYYZ4.js} +43 -11
  34. package/dist/cli/{chunk-MVLPXZAA.js.map → chunk-GOASYYZ4.js.map} +1 -1
  35. package/dist/cli/{chunk-WPY7AFS6.js → chunk-I4SH5Z7S.js} +2 -2
  36. package/dist/cli/{chunk-MW64SQUE.js → chunk-J26XOB2T.js} +2 -2
  37. package/dist/cli/{chunk-DLTE4GBY.js → chunk-J4MYMBJ7.js} +3 -3
  38. package/dist/cli/{chunk-CFJY64UA.js → chunk-LRO63VNK.js} +2 -2
  39. package/dist/cli/{chunk-XUZHBQSM.js → chunk-MQJR7YQ2.js} +2 -2
  40. package/dist/cli/{chunk-CPCUMMSR.js → chunk-NVI4XPOQ.js} +3 -3
  41. package/dist/cli/{chunk-RHQOGG43.js → chunk-OHSVEXFF.js} +3 -3
  42. package/dist/cli/chunk-OHSVEXFF.js.map +1 -0
  43. package/dist/cli/{chunk-AMSK3ZLB.js → chunk-P5SUHDUQ.js} +2 -2
  44. package/dist/cli/{chunk-GFJJEW3Z.js → chunk-QSKDP3OS.js} +55 -5
  45. package/dist/cli/chunk-QSKDP3OS.js.map +1 -0
  46. package/dist/cli/{chunk-D6WRFR6V.js → chunk-R7JMQMLD.js} +6 -5
  47. package/dist/cli/chunk-R7JMQMLD.js.map +1 -0
  48. package/dist/cli/{chunk-VVPV5HU6.js → chunk-RRZIIMAF.js} +2 -2
  49. package/dist/cli/{chunk-GNRKXRRE.js → chunk-S3QII236.js} +369 -359
  50. package/dist/cli/{chunk-GNRKXRRE.js.map → chunk-S3QII236.js.map} +1 -1
  51. package/dist/cli/{chunk-HI6THNAZ.js → chunk-TGP7JGHN.js} +32 -14
  52. package/dist/cli/chunk-TGP7JGHN.js.map +1 -0
  53. package/dist/cli/{chunk-CLHMV6OL.js → chunk-U7G72DHQ.js} +83 -42
  54. package/dist/cli/chunk-U7G72DHQ.js.map +1 -0
  55. package/dist/cli/{chunk-OMNRXZNA.js → chunk-URAI4YRL.js} +2 -2
  56. package/dist/cli/{chunk-6QBUXA73.js → chunk-V4AXMN4X.js} +2 -2
  57. package/dist/cli/{chunk-2W4F3RIZ.js → chunk-XHP6NYOT.js} +3 -2
  58. package/dist/cli/{chunk-2W4F3RIZ.js.map → chunk-XHP6NYOT.js.map} +1 -1
  59. package/dist/cli/{code-WN6D4VZO.js → code-JPFZJYVW.js} +34 -34
  60. package/dist/cli/{commands-DHETOY7O.js → commands-IUL2CLKH.js} +4 -4
  61. package/dist/cli/{commit-BBUYAKZV.js → commit-JT7LYBTL.js} +3 -3
  62. package/dist/cli/{config-KV7VV5LG.js → config-T4RWI5NG.js} +6 -2
  63. package/dist/cli/{desktop-LJVXWXNF.js → desktop-AUBW2SLL.js} +122 -38
  64. package/dist/cli/desktop-AUBW2SLL.js.map +1 -0
  65. package/dist/cli/devtools-O5HOMAGZ.js +3 -0
  66. package/dist/cli/diff-NINZHUJR.js +165 -0
  67. package/dist/cli/diff-NINZHUJR.js.map +1 -0
  68. package/dist/cli/{doctor-GI5LOEZL.js → doctor-OMAYGY4F.js} +10 -10
  69. package/dist/cli/{events-LBKMLFM4.js → events-5IVFJ4H3.js} +5 -5
  70. package/dist/cli/index.js +38 -38
  71. package/dist/cli/{mcp-DKEJK5ND.js → mcp-ECGJACAP.js} +3 -3
  72. package/dist/cli/{mcp-browse-V7KWDY32.js → mcp-browse-NGEOHVJB.js} +15 -15
  73. package/dist/cli/mcp-browse-NGEOHVJB.js.map +1 -0
  74. package/dist/cli/{mcp-inspect-MTABNHVM.js → mcp-inspect-ZIMNRG7G.js} +5 -5
  75. package/dist/cli/{prompt-ATI7DKHF.js → prompt-JCC3A7AA.js} +5 -5
  76. package/dist/cli/{prune-sessions-YQQSZTZS.js → prune-sessions-TE4BJYO2.js} +4 -4
  77. package/dist/cli/{replay-ZJQ4I4CJ.js → replay-2UUTCRTG.js} +29 -29
  78. package/dist/cli/replay-2UUTCRTG.js.map +1 -0
  79. package/dist/cli/{run-HFPRNWJY.js → run-ABQYOPVM.js} +22 -22
  80. package/dist/cli/{server-UHKO2VVM.js → server-MPCXIW2O.js} +27 -25
  81. package/dist/cli/{server-UHKO2VVM.js.map → server-MPCXIW2O.js.map} +1 -1
  82. package/dist/cli/{sessions-IQEWWUH3.js → sessions-YBPRGIAF.js} +16 -16
  83. package/dist/cli/{setup-5BYKCL62.js → setup-A34LF2QE.js} +42 -42
  84. package/dist/cli/setup-A34LF2QE.js.map +1 -0
  85. package/dist/cli/{stats-OFCGOQMZ.js → stats-GKG5JZQX.js} +6 -6
  86. package/dist/cli/stats-GKG5JZQX.js.map +1 -0
  87. package/dist/cli/{version-EODUFAAI.js → version-JD6QSM4X.js} +16 -16
  88. package/dist/index.d.ts +36 -5
  89. package/dist/index.js +443 -73
  90. package/dist/index.js.map +1 -1
  91. package/package.json +7 -2
  92. package/dist/cli/acp-NEUYWGUU.js.map +0 -1
  93. package/dist/cli/chat-QA6IVFJD.js +0 -49
  94. package/dist/cli/chunk-3OXD5CBM.js.map +0 -1
  95. package/dist/cli/chunk-77JIQ7SL.js.map +0 -1
  96. package/dist/cli/chunk-AOYUW3HR.js.map +0 -1
  97. package/dist/cli/chunk-B4MOGWHW.js.map +0 -1
  98. package/dist/cli/chunk-CLHMV6OL.js.map +0 -1
  99. package/dist/cli/chunk-D6WRFR6V.js.map +0 -1
  100. package/dist/cli/chunk-GFJJEW3Z.js.map +0 -1
  101. package/dist/cli/chunk-HI6THNAZ.js.map +0 -1
  102. package/dist/cli/chunk-HNZ4727T.js.map +0 -1
  103. package/dist/cli/chunk-I3NE5S63.js +0 -54
  104. package/dist/cli/chunk-I3NE5S63.js.map +0 -1
  105. package/dist/cli/chunk-RHQOGG43.js.map +0 -1
  106. package/dist/cli/chunk-XBYHNZ5Z.js.map +0 -1
  107. package/dist/cli/desktop-LJVXWXNF.js.map +0 -1
  108. package/dist/cli/diff-2JHMQAHI.js +0 -165
  109. package/dist/cli/diff-2JHMQAHI.js.map +0 -1
  110. package/dist/cli/mcp-browse-V7KWDY32.js.map +0 -1
  111. package/dist/cli/replay-ZJQ4I4CJ.js.map +0 -1
  112. package/dist/cli/setup-5BYKCL62.js.map +0 -1
  113. /package/dist/cli/{chat-QA6IVFJD.js.map → chat-377YZV56.js.map} +0 -0
  114. /package/dist/cli/{chunk-FY5UERSG.js.map → chunk-2WZT27GR.js.map} +0 -0
  115. /package/dist/cli/{chunk-RCC73DWQ.js.map → chunk-4SBXAHR6.js.map} +0 -0
  116. /package/dist/cli/{chunk-Z663GVUB.js.map → chunk-APOSDBAU.js.map} +0 -0
  117. /package/dist/cli/{chunk-CTRM32BP.js.map → chunk-B5JISV5I.js.map} +0 -0
  118. /package/dist/cli/{chunk-XNMXVL6C.js.map → chunk-FB27YXPX.js.map} +0 -0
  119. /package/dist/cli/{chunk-ARBGTNHM.js.map → chunk-FK7NXDRP.js.map} +0 -0
  120. /package/dist/cli/{chunk-WPY7AFS6.js.map → chunk-I4SH5Z7S.js.map} +0 -0
  121. /package/dist/cli/{chunk-MW64SQUE.js.map → chunk-J26XOB2T.js.map} +0 -0
  122. /package/dist/cli/{chunk-DLTE4GBY.js.map → chunk-J4MYMBJ7.js.map} +0 -0
  123. /package/dist/cli/{chunk-CFJY64UA.js.map → chunk-LRO63VNK.js.map} +0 -0
  124. /package/dist/cli/{chunk-XUZHBQSM.js.map → chunk-MQJR7YQ2.js.map} +0 -0
  125. /package/dist/cli/{chunk-CPCUMMSR.js.map → chunk-NVI4XPOQ.js.map} +0 -0
  126. /package/dist/cli/{chunk-AMSK3ZLB.js.map → chunk-P5SUHDUQ.js.map} +0 -0
  127. /package/dist/cli/{chunk-VVPV5HU6.js.map → chunk-RRZIIMAF.js.map} +0 -0
  128. /package/dist/cli/{chunk-OMNRXZNA.js.map → chunk-URAI4YRL.js.map} +0 -0
  129. /package/dist/cli/{chunk-6QBUXA73.js.map → chunk-V4AXMN4X.js.map} +0 -0
  130. /package/dist/cli/{code-WN6D4VZO.js.map → code-JPFZJYVW.js.map} +0 -0
  131. /package/dist/cli/{commands-DHETOY7O.js.map → commands-IUL2CLKH.js.map} +0 -0
  132. /package/dist/cli/{commit-BBUYAKZV.js.map → commit-JT7LYBTL.js.map} +0 -0
  133. /package/dist/cli/{config-KV7VV5LG.js.map → config-T4RWI5NG.js.map} +0 -0
  134. /package/dist/cli/{doctor-GI5LOEZL.js.map → devtools-O5HOMAGZ.js.map} +0 -0
  135. /package/dist/cli/{prompt-ATI7DKHF.js.map → doctor-OMAYGY4F.js.map} +0 -0
  136. /package/dist/cli/{events-LBKMLFM4.js.map → events-5IVFJ4H3.js.map} +0 -0
  137. /package/dist/cli/{mcp-DKEJK5ND.js.map → mcp-ECGJACAP.js.map} +0 -0
  138. /package/dist/cli/{mcp-inspect-MTABNHVM.js.map → mcp-inspect-ZIMNRG7G.js.map} +0 -0
  139. /package/dist/cli/{stats-OFCGOQMZ.js.map → prompt-JCC3A7AA.js.map} +0 -0
  140. /package/dist/cli/{prune-sessions-YQQSZTZS.js.map → prune-sessions-TE4BJYO2.js.map} +0 -0
  141. /package/dist/cli/{run-HFPRNWJY.js.map → run-ABQYOPVM.js.map} +0 -0
  142. /package/dist/cli/{sessions-IQEWWUH3.js.map → sessions-YBPRGIAF.js.map} +0 -0
  143. /package/dist/cli/{version-EODUFAAI.js.map → version-JD6QSM4X.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/diff.ts","../../src/cli/ui/DiffApp.tsx"],"sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { render } from \"ink\";\nimport React from \"react\";\nimport { diffTranscripts, renderMarkdown, renderSummaryTable } from \"../../transcript/diff.js\";\nimport { readTranscript } from \"../../transcript/log.js\";\nimport { DiffApp } from \"../ui/DiffApp.js\";\n\nexport interface DiffOptions {\n a: string;\n b: string;\n mdPath?: string;\n labelA?: string;\n labelB?: string;\n /** Force stdout summary table (no Ink TUI). Auto when stdout isn't a TTY. */\n print?: boolean;\n /** Force the TUI even when stdout isn't a TTY (rare). */\n tui?: boolean;\n}\n\nexport async function diffCommand(opts: DiffOptions): Promise<void> {\n const aParsed = readTranscript(opts.a);\n const bParsed = readTranscript(opts.b);\n\n const report = diffTranscripts(\n { label: opts.labelA ?? basename(opts.a), parsed: aParsed },\n { label: opts.labelB ?? basename(opts.b), parsed: bParsed },\n );\n\n const wantMarkdown = !!opts.mdPath;\n const wantPrint = opts.print || !process.stdout.isTTY;\n const wantTui = opts.tui || (!wantPrint && !wantMarkdown);\n\n if (wantMarkdown) {\n // Markdown export implies the user wants an artifact, not a TUI.\n // Still echo the stdout summary to confirm the action.\n console.log(renderSummaryTable(report));\n const md = renderMarkdown(report);\n writeFileSync(opts.mdPath!, md, \"utf8\");\n console.log(`\\nmarkdown report written to ${opts.mdPath}`);\n return;\n }\n\n if (wantTui) {\n const { waitUntilExit } = render(React.createElement(DiffApp, { report }), {\n exitOnCtrlC: true,\n patchConsole: false,\n });\n await waitUntilExit();\n return;\n }\n\n // stdout fallback (piped, --print, or non-TTY)\n console.log(renderSummaryTable(report));\n}\n","/**\n * Ink TUI for `reasonix diff`. Split-pane: A on the left, B on the right,\n * shared cursor. Header shows aggregate deltas; footer shows the current\n * pair's divergence note (if any) + key cheat sheet.\n *\n * j/k moves the cursor by one turn; n/N jumps to the next/prev divergent\n * turn — which is the whole point of a diff tool. Quit with q.\n *\n * Pure navigation lives in src/diff.ts (findNextDivergence / findPrevDivergence).\n */\n\nimport { Box, Static, Text, useApp, useInput } from \"ink\";\nimport React, { useState } from \"react\";\nimport { t } from \"../../i18n/index.js\";\nimport {\n type DiffReport,\n type TurnPair,\n findNextDivergence,\n findPrevDivergence,\n} from \"../../transcript/diff.js\";\nimport { RecordView } from \"./RecordView.js\";\n\nexport interface DiffAppProps {\n report: DiffReport;\n}\n\nexport function DiffApp({ report }: DiffAppProps) {\n const { exit } = useApp();\n const maxIdx = Math.max(0, report.pairs.length - 1);\n // Start at the first divergence when one exists — that's the user's most\n // likely destination. Falls back to idx 0 for fully-matching diffs.\n const initialIdx = report.firstDivergenceTurn\n ? report.pairs.findIndex((p) => p.turn === report.firstDivergenceTurn)\n : 0;\n const [idx, setIdx] = useState(Math.max(0, initialIdx));\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 === \"n\") {\n const next = findNextDivergence(report.pairs, idx);\n if (next !== -1) setIdx(next);\n } else if (input === \"N\" || input === \"p\") {\n const prev = findPrevDivergence(report.pairs, idx);\n if (prev !== -1) setIdx(prev);\n }\n });\n\n const pair = report.pairs[idx];\n\n return (\n <Box flexDirection=\"column\">\n <DiffHeader report={report} />\n\n <Box marginTop={1} paddingX={1} justifyContent=\"space-between\">\n <Text color=\"ansi:cyan\" bold>\n {t(\"diffApp.turnLabel\", {\n turn: pair?.turn ?? \"?\",\n current: idx + 1,\n total: report.pairs.length,\n })}\n </Text>\n <Text>{pair ? <KindBadge kind={pair.kind} /> : null}</Text>\n </Box>\n\n <Box flexDirection=\"row\" marginTop={1}>\n <Pane label={report.a.label} headerColor=\"ansi:blue\" records={paneRecords(pair, \"a\")} />\n <Pane label={report.b.label} headerColor=\"ansi:magenta\" records={paneRecords(pair, \"b\")} />\n </Box>\n\n {pair?.divergenceNote ? (\n <Box marginTop={1} paddingX={1}>\n <Text color=\"ansi:yellow\">★ </Text>\n <Text>{pair.divergenceNote}</Text>\n </Box>\n ) : null}\n\n <Box marginTop={1} paddingX={1} borderStyle=\"single\" borderColor=\"ansi:blackBright\">\n <Text dim>\n <Text bold>j</Text>/<Text bold>\\u2193</Text> next \\u00b7 <Text bold>k</Text>/\n <Text bold>\\u2191</Text> prev \\u00b7 <Text bold>n</Text> next-diverge \\u00b7{\" \"}\n <Text bold>N</Text>/<Text bold>p</Text> prev-diverge \\u00b7 <Text bold>g</Text>/\n <Text bold>G</Text> first/last \\u00b7 <Text bold>q</Text> quit\n </Text>\n </Box>\n </Box>\n );\n}\n\n// ----------------------------------------------------------------------------\n\nfunction DiffHeader({ report }: { report: DiffReport }) {\n const a = report.a;\n const b = report.b;\n\n const cacheDelta = b.stats.cacheHitRatio - a.stats.cacheHitRatio;\n const costDelta =\n a.stats.totalCostUsd > 0\n ? ((b.stats.totalCostUsd - a.stats.totalCostUsd) / a.stats.totalCostUsd) * 100\n : 0;\n\n // Prefix stability one-liner (same logic as the stdout summary).\n const aStable = a.stats.prefixHashes.length <= 1;\n const bStable = b.stats.prefixHashes.length <= 1;\n let prefixLine: string | null = null;\n if (aStable !== bStable) {\n const stableLabel = aStable ? report.a.label : report.b.label;\n const churnLabel = aStable ? report.b.label : report.a.label;\n const churnCount = aStable ? b.stats.prefixHashes.length : a.stats.prefixHashes.length;\n prefixLine = `${stableLabel} stayed byte-stable; ${churnLabel} churned ${churnCount} distinct prefixes.`;\n } else if (a.stats.prefixHashes[0] && a.stats.prefixHashes[0] === b.stats.prefixHashes[0]) {\n prefixLine = `shared prefix hash ${a.stats.prefixHashes[0].slice(0, 12)}… — cache delta attributable to log stability, not prompt change.`;\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"ansi:cyan\" paddingX={1}>\n <Box justifyContent=\"space-between\">\n <Text>\n <Text color=\"ansi:cyan\" bold>\n {t(\"diffApp.title\")}\n </Text>\n <Text dim> \\u00b7 A=</Text>\n <Text color=\"ansi:blue\">{a.label}</Text>\n <Text dim> vs B=</Text>\n <Text color=\"ansi:magenta\">{b.label}</Text>\n </Text>\n <Text dim>{t(\"diffApp.turnsAligned\", { count: report.pairs.length })}</Text>\n </Box>\n\n <Box marginTop={1} gap={3}>\n <Text>\n <Text dim>cache </Text>\n <Text>{(a.stats.cacheHitRatio * 100).toFixed(1)}%</Text>\n <Text dim> → </Text>\n <Text>{(b.stats.cacheHitRatio * 100).toFixed(1)}%</Text>\n <Text color={cacheDelta >= 0 ? \"ansi:green\" : \"ansi:red\"} bold>\n {\" \"}\n {cacheDelta >= 0 ? \"+\" : \"\"}\n {(cacheDelta * 100).toFixed(1)}pp\n </Text>\n </Text>\n <Text>\n <Text dim>cost </Text>\n <Text>${a.stats.totalCostUsd.toFixed(6)}</Text>\n <Text dim> → </Text>\n <Text>${b.stats.totalCostUsd.toFixed(6)}</Text>\n <Text color={costDelta <= 0 ? \"ansi:green\" : \"ansi:red\"} bold>\n {\" \"}\n {costDelta >= 0 ? \"+\" : \"\"}\n {costDelta.toFixed(1)}%\n </Text>\n </Text>\n <Text>\n <Text dim>model calls </Text>\n <Text>\n {a.stats.turns} → {b.stats.turns}\n </Text>\n </Text>\n </Box>\n\n {prefixLine ? (\n <Box marginTop={1}>\n <Text dim italic>\n {prefixLine}\n </Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction Pane({\n label,\n headerColor,\n records,\n}: {\n label: string;\n headerColor: \"ansi:blue\" | \"ansi:magenta\";\n records: TurnPair[\"aTools\"];\n}) {\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n paddingX={1}\n borderStyle=\"single\"\n borderColor={headerColor}\n >\n <Text color={headerColor} bold>\n {label}\n </Text>\n {records.length === 0 ? (\n <Box marginTop={1}>\n <Text dim italic>\n {t(\"diffApp.paneEmpty\")}\n </Text>\n </Box>\n ) : (\n <Static items={records.map((rec, i) => ({ key: `${label}-${i}`, rec }))}>\n {({ key, rec }) => <RecordView key={key} rec={rec} compact />}\n </Static>\n )}\n </Box>\n );\n}\n\nfunction KindBadge({ kind }: { kind: TurnPair[\"kind\"] }) {\n if (kind === \"match\") {\n return <Text color=\"ansi:green\">{t(\"diffApp.kindMatch\")}</Text>;\n }\n if (kind === \"diverge\") {\n return <Text color=\"ansi:yellow\">{t(\"diffApp.kindDiverge\")}</Text>;\n }\n if (kind === \"only_in_a\") {\n return <Text color=\"ansi:blue\">{t(\"diffApp.kindOnlyInA\")}</Text>;\n }\n return <Text color=\"ansi:magenta\">{t(\"diffApp.kindOnlyInB\")}</Text>;\n}\n\n// ----------------------------------------------------------------------------\n\nfunction paneRecords(pair: TurnPair | undefined, side: \"a\" | \"b\"): TurnPair[\"aTools\"] {\n if (!pair) return [];\n const tools = side === \"a\" ? pair.aTools : pair.bTools;\n const assistant = side === \"a\" ? pair.aAssistant : pair.bAssistant;\n const out: TurnPair[\"aTools\"] = [...tools];\n if (assistant) out.push(assistant);\n return out;\n}\n"],"mappings":"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","names":["import_react","React","React"]}
@@ -4,24 +4,24 @@ import {
4
4
  doctorCommand,
5
5
  formatDoctorJson,
6
6
  runDoctorChecks
7
- } from "./chunk-HI6THNAZ.js";
8
- import "./chunk-VVPV5HU6.js";
9
- import "./chunk-WPY7AFS6.js";
7
+ } from "./chunk-TGP7JGHN.js";
8
+ import "./chunk-RRZIIMAF.js";
9
+ import "./chunk-I4SH5Z7S.js";
10
10
  import "./chunk-YMYX6QTC.js";
11
11
  import "./chunk-BOWSNGQC.js";
12
- import "./chunk-CPCUMMSR.js";
12
+ import "./chunk-QSKDP3OS.js";
13
+ import "./chunk-25T6CVUP.js";
14
+ import "./chunk-NVI4XPOQ.js";
13
15
  import "./chunk-6UNHNVJR.js";
14
- import "./chunk-AMSK3ZLB.js";
16
+ import "./chunk-P5SUHDUQ.js";
15
17
  import "./chunk-XXC2BYTV.js";
16
- import "./chunk-GFJJEW3Z.js";
17
- import "./chunk-25T6CVUP.js";
18
18
  import "./chunk-2UQP6H6T.js";
19
- import "./chunk-CLHMV6OL.js";
20
- import "./chunk-AOYUW3HR.js";
19
+ import "./chunk-U7G72DHQ.js";
20
+ import "./chunk-GCNBIWK7.js";
21
21
  import "./chunk-TUK7OWJA.js";
22
22
  export {
23
23
  doctorCommand,
24
24
  formatDoctorJson,
25
25
  runDoctorChecks
26
26
  };
27
- //# sourceMappingURL=doctor-GI5LOEZL.js.map
27
+ //# sourceMappingURL=doctor-OMAYGY4F.js.map
@@ -5,12 +5,12 @@ import {
5
5
  } from "./chunk-J5XJHLWM.js";
6
6
  import {
7
7
  eventLogPath
8
- } from "./chunk-XNMXVL6C.js";
9
- import "./chunk-AMSK3ZLB.js";
8
+ } from "./chunk-FB27YXPX.js";
9
+ import "./chunk-P5SUHDUQ.js";
10
10
  import {
11
11
  t
12
- } from "./chunk-CLHMV6OL.js";
13
- import "./chunk-AOYUW3HR.js";
12
+ } from "./chunk-U7G72DHQ.js";
13
+ import "./chunk-GCNBIWK7.js";
14
14
  import "./chunk-TUK7OWJA.js";
15
15
 
16
16
  // src/core/reducers.ts
@@ -341,4 +341,4 @@ function mapReplacer(_key, value) {
341
341
  export {
342
342
  eventsCommand
343
343
  };
344
- //# sourceMappingURL=events-LBKMLFM4.js.map
344
+ //# sourceMappingURL=events-5IVFJ4H3.js.map
package/dist/cli/index.js CHANGED
@@ -5,36 +5,36 @@ import {
5
5
  startCpuProfile,
6
6
  stopAndSaveCpuProfile
7
7
  } from "./chunk-ZZM6QJ4W.js";
8
- import "./chunk-HNZ4727T.js";
9
- import "./chunk-MW64SQUE.js";
10
- import "./chunk-D6WRFR6V.js";
11
- import "./chunk-RCC73DWQ.js";
12
- import "./chunk-5YLEKX2V.js";
13
- import "./chunk-2W4F3RIZ.js";
8
+ import "./chunk-DFHI2MRB.js";
9
+ import "./chunk-4SBXAHR6.js";
10
+ import "./chunk-J26XOB2T.js";
11
+ import "./chunk-R7JMQMLD.js";
12
+ import "./chunk-4V4TKQMB.js";
13
+ import "./chunk-FK7NXDRP.js";
14
+ import "./chunk-V4AXMN4X.js";
15
+ import "./chunk-XHP6NYOT.js";
14
16
  import {
15
17
  applyMemoryStack,
16
18
  escalationContract
17
- } from "./chunk-DLTE4GBY.js";
19
+ } from "./chunk-J4MYMBJ7.js";
18
20
  import {
19
21
  installProxyIfConfigured
20
22
  } from "./chunk-YMYX6QTC.js";
21
23
  import "./chunk-BOWSNGQC.js";
22
- import "./chunk-CPCUMMSR.js";
24
+ import "./chunk-QSKDP3OS.js";
25
+ import "./chunk-25T6CVUP.js";
26
+ import "./chunk-NVI4XPOQ.js";
23
27
  import "./chunk-6UNHNVJR.js";
24
28
  import {
25
29
  listSessions
26
- } from "./chunk-AMSK3ZLB.js";
30
+ } from "./chunk-P5SUHDUQ.js";
27
31
  import {
28
32
  VERSION
29
33
  } from "./chunk-XXC2BYTV.js";
30
- import "./chunk-GFJJEW3Z.js";
31
- import "./chunk-25T6CVUP.js";
32
34
  import "./chunk-2UQP6H6T.js";
33
- import "./chunk-ARBGTNHM.js";
34
- import "./chunk-6QBUXA73.js";
35
35
  import {
36
36
  t
37
- } from "./chunk-CLHMV6OL.js";
37
+ } from "./chunk-U7G72DHQ.js";
38
38
  import {
39
39
  DEFAULT_MODEL,
40
40
  ensureDashboardToken,
@@ -46,7 +46,7 @@ import {
46
46
  readConfig,
47
47
  saveReasoningEffort,
48
48
  specToRaw
49
- } from "./chunk-AOYUW3HR.js";
49
+ } from "./chunk-GCNBIWK7.js";
50
50
  import {
51
51
  __commonJS,
52
52
  __require,
@@ -3345,11 +3345,11 @@ program2.action(async (opts) => {
3345
3345
  const cfg = readConfig();
3346
3346
  const mode = resolveBareCommandMode(cfg);
3347
3347
  if (mode === "setup") {
3348
- const { setupCommand } = await import("./setup-5BYKCL62.js");
3348
+ const { setupCommand } = await import("./setup-A34LF2QE.js");
3349
3349
  await setupCommand({ forceKeyStep: true });
3350
3350
  return;
3351
3351
  }
3352
- const { codeCommand } = await import("./code-WN6D4VZO.js");
3352
+ const { codeCommand } = await import("./code-JPFZJYVW.js");
3353
3353
  await codeCommand({
3354
3354
  dir: process.cwd(),
3355
3355
  forceResume: !!opts.continue,
@@ -3357,7 +3357,7 @@ program2.action(async (opts) => {
3357
3357
  });
3358
3358
  });
3359
3359
  program2.command("setup").description(t("cli.setup")).action(async () => {
3360
- const { setupCommand } = await import("./setup-5BYKCL62.js");
3360
+ const { setupCommand } = await import("./setup-A34LF2QE.js");
3361
3361
  await setupCommand({ forceKeyStep: true });
3362
3362
  });
3363
3363
  program2.command("code [dir]").description(t("cli.code")).option("-m, --model <id>", t("ui.modelOverride")).option("--effort <level>", t("ui.effortHintShort")).option("--no-session", t("ui.noSession")).option("--no-mouse", t("ui.noMouseHint")).option("--no-proxy", t("ui.noProxyHint")).option("-r, --resume", t("ui.resumeHint")).option("-n, --new", t("ui.newHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--no-dashboard", t("ui.noDashboard")).option("--open-dashboard", t("ui.openDashboardHint")).option("--dashboard-port <port>", t("ui.dashboardPortHint")).option(
@@ -3370,7 +3370,7 @@ program2.command("code [dir]").description(t("cli.code")).option("-m, --model <i
3370
3370
  persistEffortFlag(opts.effort);
3371
3371
  const profiling = await maybeStartCpuProfile(opts.profile);
3372
3372
  try {
3373
- const { codeCommand } = await import("./code-WN6D4VZO.js");
3373
+ const { codeCommand } = await import("./code-JPFZJYVW.js");
3374
3374
  await codeCommand({
3375
3375
  dir,
3376
3376
  model: opts.model,
@@ -3421,7 +3421,7 @@ program2.command("chat").description(t("cli.chat")).option("-m, --model <id>", t
3421
3421
  (msg) => process.stderr.write(`${msg}
3422
3422
  `)
3423
3423
  );
3424
- const { chatCommand } = await import("./chat-QA6IVFJD.js");
3424
+ const { chatCommand } = await import("./chat-377YZV56.js");
3425
3425
  const chatBase = opts.system ?? defaultSystemPrompt(defaults.model);
3426
3426
  const chatCwd = process.cwd();
3427
3427
  const chatRebuildSystem = () => applyMemoryStack(chatBase, chatCwd);
@@ -3464,7 +3464,7 @@ program2.command("run <task>").description(t("cli.run")).option("-m, --model <id
3464
3464
  effort: opts.effort,
3465
3465
  noConfig: opts.config === false
3466
3466
  });
3467
- const { runCommand } = await import("./run-HFPRNWJY.js");
3467
+ const { runCommand } = await import("./run-ABQYOPVM.js");
3468
3468
  await runCommand({
3469
3469
  task,
3470
3470
  model: defaults.model,
@@ -3488,7 +3488,7 @@ program2.command("acp").description("run reasonix as an Agent Client Protocol (A
3488
3488
  effort: opts.effort,
3489
3489
  noConfig: false
3490
3490
  });
3491
- const { acpCommand } = await import("./acp-NEUYWGUU.js");
3491
+ const { acpCommand } = await import("./acp-ABNDGEYC.js");
3492
3492
  await acpCommand({
3493
3493
  model: defaults.model,
3494
3494
  budgetUsd: parseBudgetFlag(opts.budget),
@@ -3507,7 +3507,7 @@ program2.command("desktop").description("headless JSON-RPC chat for the desktop
3507
3507
  effort: opts.effort,
3508
3508
  noConfig: false
3509
3509
  });
3510
- const { desktopCommand } = await import("./desktop-LJVXWXNF.js");
3510
+ const { desktopCommand } = await import("./desktop-AUBW2SLL.js");
3511
3511
  await desktopCommand({
3512
3512
  model: defaults.model,
3513
3513
  budgetUsd: parseBudgetFlag(opts.budget),
@@ -3515,27 +3515,27 @@ program2.command("desktop").description("headless JSON-RPC chat for the desktop
3515
3515
  });
3516
3516
  });
3517
3517
  program2.command("stats [transcript]").description(t("cli.stats")).action(async (transcript) => {
3518
- const { statsCommand } = await import("./stats-OFCGOQMZ.js");
3518
+ const { statsCommand } = await import("./stats-GKG5JZQX.js");
3519
3519
  statsCommand({ transcript });
3520
3520
  });
3521
3521
  program2.command("doctor").description(t("cli.doctor")).option("--json", t("ui.jsonHint")).action(async (opts) => {
3522
- const { doctorCommand } = await import("./doctor-GI5LOEZL.js");
3522
+ const { doctorCommand } = await import("./doctor-OMAYGY4F.js");
3523
3523
  await doctorCommand({ json: !!opts.json });
3524
3524
  });
3525
3525
  program2.command("commit").description(t("cli.commit")).option("-m, --model <id>", t("ui.modelOverrideFlash")).option("-y, --yes", t("ui.skipConfirmHint")).action(async (opts) => {
3526
- const { commitCommand } = await import("./commit-BBUYAKZV.js");
3526
+ const { commitCommand } = await import("./commit-JT7LYBTL.js");
3527
3527
  await commitCommand({ model: opts.model, yes: !!opts.yes });
3528
3528
  });
3529
3529
  program2.command("sessions [name]").description(t("cli.sessions")).option("-v, --verbose", t("ui.verboseHint")).action(async (name, opts) => {
3530
- const { sessionsCommand } = await import("./sessions-IQEWWUH3.js");
3530
+ const { sessionsCommand } = await import("./sessions-YBPRGIAF.js");
3531
3531
  sessionsCommand({ name, verbose: !!opts.verbose });
3532
3532
  });
3533
3533
  program2.command("prune-sessions").description(t("cli.pruneSessions")).option("--days <n>", t("ui.pruneDaysHint"), (v) => Number.parseInt(v, 10)).option("--dry-run", t("ui.pruneDryRunHint")).action(async (opts) => {
3534
- const { pruneSessionsCommand } = await import("./prune-sessions-YQQSZTZS.js");
3534
+ const { pruneSessionsCommand } = await import("./prune-sessions-TE4BJYO2.js");
3535
3535
  pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });
3536
3536
  });
3537
3537
  program2.command("events <name>").description(t("cli.events")).option("--type <type>", t("ui.eventTypeHint")).option("--since <id>", t("ui.eventSinceHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.eventTailHint"), (v) => Number.parseInt(v, 10)).option("--json", t("ui.jsonHint")).option("--projection", t("ui.projectionHint")).action(async (name, opts) => {
3538
- const { eventsCommand } = await import("./events-LBKMLFM4.js");
3538
+ const { eventsCommand } = await import("./events-5IVFJ4H3.js");
3539
3539
  eventsCommand({
3540
3540
  name,
3541
3541
  type: opts.type,
@@ -3546,7 +3546,7 @@ program2.command("events <name>").description(t("cli.events")).option("--type <t
3546
3546
  });
3547
3547
  });
3548
3548
  program2.command("replay <transcript>").description(t("cli.replay")).option("--print", t("ui.printHint")).option("--head <n>", t("ui.headHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.tailHint"), (v) => Number.parseInt(v, 10)).action(async (transcript, opts) => {
3549
- const { replayCommand } = await import("./replay-ZJQ4I4CJ.js");
3549
+ const { replayCommand } = await import("./replay-2UUTCRTG.js");
3550
3550
  await replayCommand({
3551
3551
  path: transcript,
3552
3552
  print: !!opts.print,
@@ -3555,7 +3555,7 @@ program2.command("replay <transcript>").description(t("cli.replay")).option("--p
3555
3555
  });
3556
3556
  });
3557
3557
  program2.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>", t("ui.mdReportHint")).option("--print", t("ui.printHintTable")).option("--tui", t("ui.tuiHint")).option("--label-a <label>", t("ui.labelAHint")).option("--label-b <label>", t("ui.labelBHint")).action(async (a, b, opts) => {
3558
- const { diffCommand } = await import("./diff-2JHMQAHI.js");
3558
+ const { diffCommand } = await import("./diff-NINZHUJR.js");
3559
3559
  await diffCommand({
3560
3560
  a,
3561
3561
  b,
@@ -3569,7 +3569,7 @@ program2.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>"
3569
3569
  var mcp = program2.command("mcp").description(t("cli.mcp"));
3570
3570
  mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("ui.jsonHintCatalog")).option("--local", t("ui.mcpLocalHint")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--pages <n>", t("ui.mcpPagesHint"), (v) => Number.parseInt(v, 10)).option("--all", t("ui.mcpAllHint")).action(async (opts) => {
3571
3571
  try {
3572
- const { mcpListCommand } = await import("./mcp-DKEJK5ND.js");
3572
+ const { mcpListCommand } = await import("./mcp-ECGJACAP.js");
3573
3573
  await mcpListCommand({
3574
3574
  json: !!opts.json,
3575
3575
  local: !!opts.local,
@@ -3586,7 +3586,7 @@ mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("
3586
3586
  });
3587
3587
  mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("--json", t("ui.jsonHintCatalog")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (query, opts) => {
3588
3588
  try {
3589
- const { mcpSearchCommand } = await import("./mcp-DKEJK5ND.js");
3589
+ const { mcpSearchCommand } = await import("./mcp-ECGJACAP.js");
3590
3590
  await mcpSearchCommand(query, {
3591
3591
  json: !!opts.json,
3592
3592
  refresh: !!opts.refresh,
@@ -3601,7 +3601,7 @@ mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("
3601
3601
  });
3602
3602
  mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option("--refresh", t("ui.mcpRefreshHint")).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (name, opts) => {
3603
3603
  try {
3604
- const { mcpInstallCommand } = await import("./mcp-DKEJK5ND.js");
3604
+ const { mcpInstallCommand } = await import("./mcp-ECGJACAP.js");
3605
3605
  await mcpInstallCommand(name, {
3606
3606
  refresh: !!opts.refresh,
3607
3607
  maxPages: typeof opts.maxPages === "number" && opts.maxPages > 0 ? opts.maxPages : void 0
@@ -3614,7 +3614,7 @@ mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option(
3614
3614
  });
3615
3615
  mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async () => {
3616
3616
  try {
3617
- const { mcpBrowseCommand } = await import("./mcp-browse-V7KWDY32.js");
3617
+ const { mcpBrowseCommand } = await import("./mcp-browse-NGEOHVJB.js");
3618
3618
  await mcpBrowseCommand();
3619
3619
  } catch (err) {
3620
3620
  process.stderr.write(`mcp browse failed: ${err.message}
@@ -3623,7 +3623,7 @@ mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async ()
3623
3623
  }
3624
3624
  });
3625
3625
  mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option("--json", t("ui.jsonHintReport")).action(async (spec, opts) => {
3626
- const { formatMcpInspectFailure, mcpInspectCommand } = await import("./mcp-inspect-MTABNHVM.js");
3626
+ const { formatMcpInspectFailure, mcpInspectCommand } = await import("./mcp-inspect-ZIMNRG7G.js");
3627
3627
  try {
3628
3628
  await mcpInspectCommand({ spec, json: !!opts.json });
3629
3629
  } catch (err) {
@@ -3633,7 +3633,7 @@ mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option(
3633
3633
  }
3634
3634
  });
3635
3635
  program2.command("version").description(t("cli.version")).action(async () => {
3636
- const { versionCommand } = await import("./version-EODUFAAI.js");
3636
+ const { versionCommand } = await import("./version-JD6QSM4X.js");
3637
3637
  versionCommand();
3638
3638
  });
3639
3639
  program2.command("update").description(t("cli.update")).option("--dry-run", t("ui.dryRunHint")).action(async (opts) => {
@@ -3642,7 +3642,7 @@ program2.command("update").description(t("cli.update")).option("--dry-run", t("u
3642
3642
  });
3643
3643
  program2.command("index").description(t("cli.index")).option("--rebuild", t("ui.rebuildHint")).option("--model <name>", t("ui.embedModelHint")).option("--dir <path>", t("ui.projectDirHint")).option("--ollama-url <url>", t("ui.ollamaUrlHint")).option("-y, --yes", t("ui.skipPromptsHint")).action(
3644
3644
  async (opts) => {
3645
- const { indexCommand } = await import("./commands-DHETOY7O.js");
3645
+ const { indexCommand } = await import("./commands-IUL2CLKH.js");
3646
3646
  await indexCommand(opts);
3647
3647
  }
3648
3648
  );
@@ -13,12 +13,12 @@ import {
13
13
  } from "./chunk-PLHAZOLZ.js";
14
14
  import {
15
15
  t
16
- } from "./chunk-CLHMV6OL.js";
16
+ } from "./chunk-U7G72DHQ.js";
17
17
  import {
18
18
  defaultConfigPath,
19
19
  readConfig,
20
20
  writeConfig
21
- } from "./chunk-AOYUW3HR.js";
21
+ } from "./chunk-GCNBIWK7.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-DKEJK5ND.js.map
288
+ //# sourceMappingURL=mcp-ECGJACAP.js.map
@@ -9,13 +9,13 @@ import {
9
9
  specStringFor
10
10
  } from "./chunk-XJXDHAES.js";
11
11
  import {
12
- Br,
13
- L,
14
- W,
15
- Wo,
16
- fc,
17
- require_react
18
- } from "./chunk-3OXD5CBM.js";
12
+ Box_default,
13
+ Text,
14
+ renderSync,
15
+ require_react,
16
+ use_app_default,
17
+ use_input_default
18
+ } from "./chunk-A6GSOADP.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-AOYUW3HR.js";
26
+ } from "./chunk-GCNBIWK7.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 = fc();
45
+ const app = use_app_default();
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
- Br((input, key) => {
124
+ use_input_default((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(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) => {
159
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(Box_default, null, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:cyan" }, "\u25C8 MCP marketplace"), /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, ` \xB7 ${state.status}`)), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, null, "search: "), /* @__PURE__ */ import_react.default.createElement(Text, { color: "ansi:white" }, state.query || "(type to filter)"), /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, ` ${filtered.length} match${filtered.length === 1 ? "" : "es"}`)), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, window.length === 0 ? /* @__PURE__ */ import_react.default.createElement(Text, { dim: 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(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")));
164
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, { key: e.name }, /* @__PURE__ */ import_react.default.createElement(Text, { color: active ? "ansi:cyan" : void 0 }, active ? "\u25B8 " : " "), /* @__PURE__ */ import_react.default.createElement(Text, { bold: active }, e.name.padEnd(40).slice(0, 40)), /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, ` ${tag}${pop}`));
165
+ })), selected ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:white" }, overlay?.[selected.name]?.title ?? selected.title, overlay?.[selected.name] ? /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, ` \xB7 ${selected.title}`) : null), /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, overlay?.[selected.name]?.description ?? selected.description?.slice(0, 160) ?? null), selected.install ? /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, `spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? "\u2014"} \xB7 ${selected.install.transport}`) : /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, "(smithery listing \u2014 install info not exposed)"), selected.install?.requiredEnv?.length ? /* @__PURE__ */ import_react.default.createElement(Text, { color: "ansi:yellow" }, `needs: ${selected.install.requiredEnv.join(", ")}`) : null) : null, /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: 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 } = Wo(/* @__PURE__ */ import_react.default.createElement(McpBrowseApp, null), {
169
+ const { waitUntilExit } = renderSync(/* @__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-V7KWDY32.js.map
178
+ //# sourceMappingURL=mcp-browse-NGEOHVJB.js.map
@@ -0,0 +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=\"ansi:cyan\">\n ◈ MCP marketplace\n </Text>\n <Text dim>{` · ${state.status}`}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>search: </Text>\n <Text color=\"ansi:white\">{state.query || \"(type to filter)\"}</Text>\n <Text dim>{` ${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}`}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {window.length === 0 ? (\n <Text dim>{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 ? \"ansi:cyan\" : undefined}>{active ? \"▸ \" : \" \"}</Text>\n <Text bold={active}>{e.name.padEnd(40).slice(0, 40)}</Text>\n <Text dim>{` ${tag}${pop}`}</Text>\n </Box>\n );\n })\n )}\n </Box>\n {selected ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"ansi:white\">\n {overlay?.[selected.name]?.title ?? selected.title}\n {overlay?.[selected.name] ? <Text dim>{` \\u00b7 ${selected.title}`}</Text> : null}\n </Text>\n <Text dim>\n {overlay?.[selected.name]?.description ?? selected.description?.slice(0, 160) ?? null}\n </Text>\n {selected.install ? (\n <Text dim>\n {`spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? \"—\"} · ${selected.install.transport}`}\n </Text>\n ) : (\n <Text dim>(smithery listing — install info not exposed)</Text>\n )}\n {selected.install?.requiredEnv?.length ? (\n <Text color=\"ansi:yellow\">{`needs: ${selected.install.requiredEnv.join(\", \")}`}</Text>\n ) : null}\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dim>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-XUZHBQSM.js";
6
+ } from "./chunk-MQJR7YQ2.js";
7
7
  import {
8
8
  McpClient,
9
9
  inspectMcpServer
10
- } from "./chunk-RCC73DWQ.js";
11
- import "./chunk-XXC2BYTV.js";
10
+ } from "./chunk-4SBXAHR6.js";
12
11
  import "./chunk-25T6CVUP.js";
12
+ import "./chunk-XXC2BYTV.js";
13
13
  import {
14
14
  normalizeMcpConfig,
15
15
  overlayMatchedSpec,
16
16
  parseMcpSpec,
17
17
  readConfig
18
- } from "./chunk-AOYUW3HR.js";
18
+ } from "./chunk-GCNBIWK7.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-MTABNHVM.js.map
149
+ //# sourceMappingURL=mcp-inspect-ZIMNRG7G.js.map
@@ -4,14 +4,14 @@ import {
4
4
  CODE_SYSTEM_PROMPT,
5
5
  codeSystemBase,
6
6
  codeSystemPrompt
7
- } from "./chunk-2W4F3RIZ.js";
8
- import "./chunk-DLTE4GBY.js";
9
- import "./chunk-CLHMV6OL.js";
10
- import "./chunk-AOYUW3HR.js";
7
+ } from "./chunk-XHP6NYOT.js";
8
+ import "./chunk-J4MYMBJ7.js";
9
+ import "./chunk-U7G72DHQ.js";
10
+ import "./chunk-GCNBIWK7.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-ATI7DKHF.js.map
17
+ //# sourceMappingURL=prompt-JCC3A7AA.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-AMSK3ZLB.js";
6
+ } from "./chunk-P5SUHDUQ.js";
7
7
  import {
8
8
  t
9
- } from "./chunk-CLHMV6OL.js";
10
- import "./chunk-AOYUW3HR.js";
9
+ } from "./chunk-U7G72DHQ.js";
10
+ import "./chunk-GCNBIWK7.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-YQQSZTZS.js.map
48
+ //# sourceMappingURL=prune-sessions-TE4BJYO2.js.map