reasonix 0.43.0 → 0.44.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 (169) hide show
  1. package/README.md +49 -11
  2. package/README.zh-CN.md +35 -7
  3. package/dashboard/app.css +225 -4
  4. package/dashboard/dist/app.js +6441 -6080
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/data/deepseek-tokenizer.json.gz +0 -0
  7. package/dist/cli/{acp-DAGPCVFZ.js → acp-TYZ2CTDL.js} +28 -30
  8. package/dist/cli/acp-TYZ2CTDL.js.map +1 -0
  9. package/dist/cli/chat-TH7VNNCJ.js +51 -0
  10. package/dist/cli/chunk-2425HK6U.js +0 -0
  11. package/dist/cli/chunk-25T6CVUP.js +0 -0
  12. package/dist/cli/chunk-2UQP6H6T.js +0 -0
  13. package/dist/cli/{chunk-3Z6IBU3D.js → chunk-2V6EAEUW.js} +95 -31
  14. package/dist/cli/chunk-2V6EAEUW.js.map +1 -0
  15. package/dist/cli/{chunk-XCGGEJTI.js → chunk-4CTDEJUF.js} +2 -2
  16. package/dist/cli/chunk-4QUNBQQ2.js +0 -0
  17. package/dist/cli/{chunk-74EX7SUH.js → chunk-5QCB62C4.js} +33 -7
  18. package/dist/cli/{chunk-74EX7SUH.js.map → chunk-5QCB62C4.js.map} +1 -1
  19. package/dist/cli/chunk-6OWJV3YW.js +390 -0
  20. package/dist/cli/chunk-6OWJV3YW.js.map +1 -0
  21. package/dist/cli/chunk-6PBZN4VI.js +0 -0
  22. package/dist/cli/{chunk-7O5ALB4C.js → chunk-7CIGMZT3.js} +2 -2
  23. package/dist/cli/{chunk-H6PS7IUE.js → chunk-7UCMM425.js} +7 -3
  24. package/dist/cli/chunk-7UCMM425.js.map +1 -0
  25. package/dist/cli/{chunk-TJX6BFZZ.js → chunk-AB2RED3C.js} +3 -3
  26. package/dist/cli/{chunk-XPDVG52A.js → chunk-AVFXO2EZ.js} +361 -13
  27. package/dist/cli/chunk-AVFXO2EZ.js.map +1 -0
  28. package/dist/cli/{chunk-FHOGSSCH.js → chunk-C53JQES5.js} +3 -3
  29. package/dist/cli/{chunk-RE4RAVFF.js → chunk-CGDR2ELH.js} +92 -30
  30. package/dist/cli/chunk-CGDR2ELH.js.map +1 -0
  31. package/dist/cli/{chunk-OSZC7C6F.js → chunk-CWZKQ5FE.js} +7 -4
  32. package/dist/cli/chunk-CWZKQ5FE.js.map +1 -0
  33. package/dist/cli/{devtools-YECO25QO.js → chunk-FEZK652I.js} +10 -85
  34. package/dist/cli/chunk-FEZK652I.js.map +1 -0
  35. package/dist/cli/{chunk-45U62RI3.js → chunk-HNXDZGC6.js} +104 -2
  36. package/dist/cli/chunk-HNXDZGC6.js.map +1 -0
  37. package/dist/cli/chunk-J5XJHLWM.js +0 -0
  38. package/dist/cli/chunk-JMBMLOBP.js +0 -0
  39. package/dist/cli/{chunk-5JJRUIPA.js → chunk-JNAQYELD.js} +16 -8
  40. package/dist/cli/{chunk-5JJRUIPA.js.map → chunk-JNAQYELD.js.map} +1 -1
  41. package/dist/cli/{chunk-YFGF5NKA.js → chunk-KGBG6M2X.js} +19 -15
  42. package/dist/cli/chunk-KGBG6M2X.js.map +1 -0
  43. package/dist/cli/{chunk-3BXRZFWS.js → chunk-KLQTAZIY.js} +12 -4
  44. package/dist/cli/chunk-KLQTAZIY.js.map +1 -0
  45. package/dist/cli/{chunk-VK5HG73G.js → chunk-KM465GST.js} +9 -9
  46. package/dist/cli/{chunk-DOYHN4KB.js → chunk-LIR2HBQH.js} +2 -2
  47. package/dist/cli/{chunk-YYQAUTTN.js → chunk-MJ6W5UN3.js} +2 -2
  48. package/dist/cli/{chunk-6PZ3CXBP.js → chunk-MRHHQJAQ.js} +5 -4
  49. package/dist/cli/chunk-MRHHQJAQ.js.map +1 -0
  50. package/dist/cli/{chunk-PQXPXJBJ.js → chunk-NVURFF27.js} +16 -5
  51. package/dist/cli/chunk-NVURFF27.js.map +1 -0
  52. package/dist/cli/{chunk-2R4QCDOZ.js → chunk-OPFUUYHL.js} +540 -287
  53. package/dist/cli/chunk-OPFUUYHL.js.map +1 -0
  54. package/dist/cli/chunk-PLHAZOLZ.js +0 -0
  55. package/dist/cli/{chunk-HFEAY5DT.js → chunk-R3CTO2HM.js} +2 -2
  56. package/dist/cli/{chunk-O52OLQL3.js → chunk-RDRC3XDT.js} +136 -38
  57. package/dist/cli/chunk-RDRC3XDT.js.map +1 -0
  58. package/dist/cli/chunk-S4XVGLRW.js +0 -0
  59. package/dist/cli/chunk-SZ5XES2N.js +0 -0
  60. package/dist/cli/{chunk-2K65GZBT.js → chunk-TEUDEGX2.js} +64 -19
  61. package/dist/cli/chunk-TEUDEGX2.js.map +1 -0
  62. package/dist/cli/{chunk-2Z35JOA4.js → chunk-TKVXTQ3T.js} +4 -4
  63. package/dist/cli/{chunk-2Z35JOA4.js.map → chunk-TKVXTQ3T.js.map} +1 -1
  64. package/dist/cli/chunk-TUK7OWJA.js +0 -0
  65. package/dist/cli/{chunk-32TIKD5U.js → chunk-TXJMRPIL.js} +3 -3
  66. package/dist/cli/{chunk-2KDUS647.js → chunk-V26WPN3J.js} +7 -4
  67. package/dist/cli/chunk-V26WPN3J.js.map +1 -0
  68. package/dist/cli/{chunk-F3PXYSNN.js → chunk-WK3UFQY3.js} +2 -2
  69. package/dist/cli/{chunk-6G3CUUFG.js → chunk-X53B3JIX.js} +3 -3
  70. package/dist/cli/{chunk-6G3CUUFG.js.map → chunk-X53B3JIX.js.map} +1 -1
  71. package/dist/cli/chunk-XJXDHAES.js +0 -0
  72. package/dist/cli/{chunk-6AK4EY3D.js → chunk-XSU4QVFW.js} +1 -81
  73. package/dist/cli/chunk-XSU4QVFW.js.map +1 -0
  74. package/dist/cli/chunk-XXC2BYTV.js +0 -0
  75. package/dist/cli/{chunk-P7EKE5ZQ.js → chunk-Z4S7EYXG.js} +4482 -1310
  76. package/dist/cli/chunk-Z4S7EYXG.js.map +1 -0
  77. package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
  78. package/dist/cli/{chunk-YQ6NTIIE.js → chunk-ZZYBBX5N.js} +13 -5
  79. package/dist/cli/chunk-ZZYBBX5N.js.map +1 -0
  80. package/dist/cli/{code-SMKEW6CD.js → code-PSVJ3KEN.js} +48 -36
  81. package/dist/cli/code-PSVJ3KEN.js.map +1 -0
  82. package/dist/cli/{commands-FVVB5FZF.js → commands-OCU42XG4.js} +4 -4
  83. package/dist/cli/{commit-HE4VSPZ7.js → commit-XCQIQCYG.js} +3 -3
  84. package/dist/cli/{desktop-Q7NDXCON.js → desktop-KWGR4BNE.js} +210 -69
  85. package/dist/cli/desktop-KWGR4BNE.js.map +1 -0
  86. package/dist/cli/devtools-HW3WDT3Q.js +91 -0
  87. package/dist/cli/devtools-HW3WDT3Q.js.map +1 -0
  88. package/dist/cli/{diff-435UTPC5.js → diff-NHANTNC3.js} +9 -9
  89. package/dist/cli/{doctor-OT7KH75K.js → doctor-CC5CLOGG.js} +10 -10
  90. package/dist/cli/events-XEFAD5VX.js +0 -0
  91. package/dist/cli/index.js +132 -94
  92. package/dist/cli/index.js.map +1 -1
  93. package/dist/cli/{mcp-WUL2WO75.js → mcp-MPVGBBJF.js} +2 -2
  94. package/dist/cli/{mcp-browse-RR7R4XET.js → mcp-browse-4XOTC3FJ.js} +3 -3
  95. package/dist/cli/{mcp-inspect-REGLYBWT.js → mcp-inspect-CEMGKKAH.js} +14 -9
  96. package/dist/cli/mcp-inspect-CEMGKKAH.js.map +1 -0
  97. package/dist/cli/{prompt-UW6EFLVR.js → prompt-2D7ID24X.js} +4 -4
  98. package/dist/cli/prune-sessions-3RWUBYRS.js +0 -0
  99. package/dist/cli/{replay-YOURXV4C.js → replay-SR44E6RS.js} +10 -10
  100. package/dist/cli/{run-Q6BUXV66.js → run-MDGL27WL.js} +35 -36
  101. package/dist/cli/run-MDGL27WL.js.map +1 -0
  102. package/dist/cli/{server-XGDBRWMB.js → server-27ARQXIZ.js} +67 -24
  103. package/dist/cli/server-27ARQXIZ.js.map +1 -0
  104. package/dist/cli/{sessions-FH7QVYSY.js → sessions-CKQXCYGP.js} +18 -18
  105. package/dist/cli/sessions-CKQXCYGP.js.map +1 -0
  106. package/dist/cli/{setup-VDS6SVEP.js → setup-TPAGSVXO.js} +6 -6
  107. package/dist/cli/{stats-MQVI2XQH.js → stats-DPUBZNVX.js} +6 -4
  108. package/dist/cli/update-6ITLPRDV.js +0 -0
  109. package/dist/cli/{version-DAHGZY5N.js → version-2X3BHVVK.js} +15 -15
  110. package/dist/index.d.ts +181 -53
  111. package/dist/index.js +1322 -533
  112. package/dist/index.js.map +1 -1
  113. package/package.json +21 -8
  114. package/dist/cli/.-3G6VX5S7.js +0 -327
  115. package/dist/cli/.-6YRPB2C7.js +0 -329
  116. package/dist/cli/.-EYSVINK3.js +0 -317
  117. package/dist/cli/acp-DAGPCVFZ.js.map +0 -1
  118. package/dist/cli/chat-7ES4IBNH.js +0 -50
  119. package/dist/cli/chunk-2K65GZBT.js.map +0 -1
  120. package/dist/cli/chunk-2KDUS647.js.map +0 -1
  121. package/dist/cli/chunk-2R4QCDOZ.js.map +0 -1
  122. package/dist/cli/chunk-3BXRZFWS.js.map +0 -1
  123. package/dist/cli/chunk-3Z6IBU3D.js.map +0 -1
  124. package/dist/cli/chunk-45U62RI3.js.map +0 -1
  125. package/dist/cli/chunk-6AK4EY3D.js.map +0 -1
  126. package/dist/cli/chunk-6PZ3CXBP.js.map +0 -1
  127. package/dist/cli/chunk-H6PS7IUE.js.map +0 -1
  128. package/dist/cli/chunk-O52OLQL3.js.map +0 -1
  129. package/dist/cli/chunk-OSZC7C6F.js.map +0 -1
  130. package/dist/cli/chunk-P7EKE5ZQ.js.map +0 -1
  131. package/dist/cli/chunk-PQXPXJBJ.js.map +0 -1
  132. package/dist/cli/chunk-PV55UMTO.js +0 -200
  133. package/dist/cli/chunk-PV55UMTO.js.map +0 -1
  134. package/dist/cli/chunk-RE4RAVFF.js.map +0 -1
  135. package/dist/cli/chunk-XPDVG52A.js.map +0 -1
  136. package/dist/cli/chunk-YFGF5NKA.js.map +0 -1
  137. package/dist/cli/chunk-YQ6NTIIE.js.map +0 -1
  138. package/dist/cli/code-SMKEW6CD.js.map +0 -1
  139. package/dist/cli/desktop-Q7NDXCON.js.map +0 -1
  140. package/dist/cli/devtools-YECO25QO.js.map +0 -1
  141. package/dist/cli/doctor-OT7KH75K.js.map +0 -1
  142. package/dist/cli/mcp-inspect-REGLYBWT.js.map +0 -1
  143. package/dist/cli/prompt-UW6EFLVR.js.map +0 -1
  144. package/dist/cli/run-Q6BUXV66.js.map +0 -1
  145. package/dist/cli/server-XGDBRWMB.js.map +0 -1
  146. package/dist/cli/sessions-FH7QVYSY.js.map +0 -1
  147. package/dist/cli/stats-MQVI2XQH.js.map +0 -1
  148. /package/dist/cli/{.-3G6VX5S7.js.map → chat-TH7VNNCJ.js.map} +0 -0
  149. /package/dist/cli/{chunk-XCGGEJTI.js.map → chunk-4CTDEJUF.js.map} +0 -0
  150. /package/dist/cli/{chunk-7O5ALB4C.js.map → chunk-7CIGMZT3.js.map} +0 -0
  151. /package/dist/cli/{chunk-TJX6BFZZ.js.map → chunk-AB2RED3C.js.map} +0 -0
  152. /package/dist/cli/{chunk-FHOGSSCH.js.map → chunk-C53JQES5.js.map} +0 -0
  153. /package/dist/cli/{chunk-VK5HG73G.js.map → chunk-KM465GST.js.map} +0 -0
  154. /package/dist/cli/{chunk-DOYHN4KB.js.map → chunk-LIR2HBQH.js.map} +0 -0
  155. /package/dist/cli/{chunk-YYQAUTTN.js.map → chunk-MJ6W5UN3.js.map} +0 -0
  156. /package/dist/cli/{chunk-HFEAY5DT.js.map → chunk-R3CTO2HM.js.map} +0 -0
  157. /package/dist/cli/{chunk-32TIKD5U.js.map → chunk-TXJMRPIL.js.map} +0 -0
  158. /package/dist/cli/{chunk-F3PXYSNN.js.map → chunk-WK3UFQY3.js.map} +0 -0
  159. /package/dist/cli/{commands-FVVB5FZF.js.map → commands-OCU42XG4.js.map} +0 -0
  160. /package/dist/cli/{commit-HE4VSPZ7.js.map → commit-XCQIQCYG.js.map} +0 -0
  161. /package/dist/cli/{diff-435UTPC5.js.map → diff-NHANTNC3.js.map} +0 -0
  162. /package/dist/cli/{.-6YRPB2C7.js.map → doctor-CC5CLOGG.js.map} +0 -0
  163. /package/dist/cli/{mcp-WUL2WO75.js.map → mcp-MPVGBBJF.js.map} +0 -0
  164. /package/dist/cli/{mcp-browse-RR7R4XET.js.map → mcp-browse-4XOTC3FJ.js.map} +0 -0
  165. /package/dist/cli/{.-EYSVINK3.js.map → prompt-2D7ID24X.js.map} +0 -0
  166. /package/dist/cli/{replay-YOURXV4C.js.map → replay-SR44E6RS.js.map} +0 -0
  167. /package/dist/cli/{setup-VDS6SVEP.js.map → setup-TPAGSVXO.js.map} +0 -0
  168. /package/dist/cli/{chat-7ES4IBNH.js.map → stats-DPUBZNVX.js.map} +0 -0
  169. /package/dist/cli/{version-DAHGZY5N.js.map → version-2X3BHVVK.js.map} +0 -0
@@ -7,7 +7,10 @@ import {
7
7
  defaultUsageLogPath,
8
8
  formatLogSize,
9
9
  readUsageLog
10
- } from "./chunk-HFEAY5DT.js";
10
+ } from "./chunk-R3CTO2HM.js";
11
+ import {
12
+ t
13
+ } from "./chunk-CGDR2ELH.js";
11
14
 
12
15
  // src/cli/commands/stats.ts
13
16
  import { existsSync, readFileSync } from "fs";
@@ -49,8 +52,8 @@ function dashboard(opts) {
49
52
  console.log("");
50
53
  console.log(` ${path}`);
51
54
  console.log("");
52
- console.log("run `reasonix chat`, `reasonix code`, or `reasonix run <task>` \u2014 every turn");
53
- console.log("appends one line to the log and `reasonix stats` will roll it up.");
55
+ console.log(t("stats.usageHint"));
56
+ console.log(t("stats.usageDetail"));
54
57
  return;
55
58
  }
56
59
  const agg = aggregateUsage(records, { now: opts.now });
@@ -147,4 +150,4 @@ export {
147
150
  statsCommand,
148
151
  renderDashboard
149
152
  };
150
- //# sourceMappingURL=chunk-OSZC7C6F.js.map
153
+ //# sourceMappingURL=chunk-CWZKQ5FE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/stats.ts"],"sourcesContent":["/** `reasonix stats [path]` — path arg switches to per-transcript mode; default is the cross-session dashboard. */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { t } from \"../../i18n/index.js\";\nimport {\n type UsageAggregate,\n type UsageBucket,\n aggregateUsage,\n bucketCacheHitRatio,\n bucketSavingsFraction,\n defaultUsageLogPath,\n formatLogSize,\n readUsageLog,\n} from \"../../telemetry/usage.js\";\n\nexport interface StatsOptions {\n /** Optional transcript path. Absent → dashboard mode. */\n transcript?: string;\n /** Override usage log location (tests). */\n logPath?: string;\n /** Inject a fixed timestamp (tests) so rolling windows are deterministic. */\n now?: number;\n}\n\nexport function statsCommand(opts: StatsOptions): void {\n if (opts.transcript) {\n transcriptSummary(opts.transcript);\n return;\n }\n dashboard(opts);\n}\n\nfunction transcriptSummary(path: string): void {\n if (!existsSync(path)) {\n console.error(`no such transcript: ${path}`);\n process.exit(1);\n }\n const lines = readFileSync(path, \"utf8\").split(/\\r?\\n/).filter(Boolean);\n let assistantTurns = 0;\n let toolCalls = 0;\n let lastTurn = 0;\n for (const line of lines) {\n try {\n const rec = JSON.parse(line);\n if (rec.role === \"assistant_final\") assistantTurns++;\n if (rec.role === \"tool\") toolCalls++;\n if (typeof rec.turn === \"number\") lastTurn = Math.max(lastTurn, rec.turn);\n } catch {\n /* skip */\n }\n }\n console.log(`transcript: ${path}`);\n console.log(`assistant turns: ${assistantTurns}`);\n console.log(`tool invocations: ${toolCalls}`);\n console.log(`last turn index: ${lastTurn}`);\n}\n\nfunction dashboard(opts: StatsOptions): void {\n const path = opts.logPath ?? defaultUsageLogPath();\n const records = readUsageLog(path);\n if (records.length === 0) {\n console.log(\"no usage data yet.\");\n console.log(\"\");\n console.log(` ${path}`);\n console.log(\"\");\n console.log(t(\"stats.usageHint\"));\n console.log(t(\"stats.usageDetail\"));\n return;\n }\n\n const agg = aggregateUsage(records, { now: opts.now });\n console.log(renderDashboard(agg, path));\n}\n\n/** Pure renderer — pulled out so tests can assert on the string directly. */\nexport function renderDashboard(agg: UsageAggregate, logPath: string): string {\n const lines: string[] = [];\n const size = formatLogSize(logPath);\n lines.push(`Reasonix usage — ${logPath}${size ? ` (${size})` : \"\"}`);\n lines.push(\"\");\n lines.push(header());\n lines.push(divider());\n for (const b of agg.buckets) {\n lines.push(bucketRow(b));\n }\n lines.push(\"\");\n\n // Model + session breakdown — both trim to top 3 so a user with 20\n // sessions doesn't drown the table.\n if (agg.byModel.length > 0) {\n const totalTurns = agg.buckets[agg.buckets.length - 1]?.turns ?? 0;\n const top = agg.byModel[0];\n if (top && totalTurns > 0) {\n const pct = ((top.turns / totalTurns) * 100).toFixed(0);\n lines.push(`most used model: ${top.model} (${pct}% of turns)`);\n }\n }\n if (agg.bySession.length > 0) {\n const top = agg.bySession[0];\n if (top) lines.push(`top session: ${top.session} (${top.turns} turns)`);\n }\n if (agg.firstSeen) {\n lines.push(`tracked since: ${new Date(agg.firstSeen).toISOString().slice(0, 10)}`);\n }\n if (agg.subagents) {\n lines.push(\"\");\n lines.push(renderSubagentSection(agg.subagents));\n }\n return lines.join(\"\\n\");\n}\n\nfunction renderSubagentSection(sub: NonNullable<UsageAggregate[\"subagents\"]>): string {\n const lines: string[] = [];\n const seconds = (sub.totalDurationMs / 1000).toFixed(1);\n lines.push(\n `subagent activity: ${sub.total} run(s) · $${sub.costUsd.toFixed(6)} · ${seconds}s total`,\n );\n // Show at most 5 skills so the section never dwarfs the main table.\n const top = sub.bySkill.slice(0, 5);\n for (const s of top) {\n const sec = (s.durationMs / 1000).toFixed(1);\n lines.push(\n ` ${pad(s.skillName, 18)} ${pad(`${s.count}`, 4, \"right\")} $${s.costUsd.toFixed(6)} ${sec}s`,\n );\n }\n if (sub.bySkill.length > top.length) {\n lines.push(` (+${sub.bySkill.length - top.length} more)`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction header(): string {\n // Fixed column widths so alignment works in any TTY.\n // `cache saved` reports DeepSeek's hit-vs-miss USD diff; the existing\n // `saved` column is the % saved vs Claude-Sonnet equivalent.\n return [\n pad(\"\", 10),\n pad(\"turns\", 8, \"right\"),\n pad(\"cache hit\", 10, \"right\"),\n pad(\"cost (USD)\", 14, \"right\"),\n pad(\"cache saved\", 14, \"right\"),\n pad(\"vs Claude\", 14, \"right\"),\n pad(\"saved\", 10, \"right\"),\n ].join(\" \");\n}\n\nfunction divider(): string {\n return \"-\".repeat(86);\n}\n\nfunction bucketRow(b: UsageBucket): string {\n const hit = bucketCacheHitRatio(b);\n const savings = bucketSavingsFraction(b);\n return [\n pad(b.label, 10),\n pad(b.turns.toString(), 8, \"right\"),\n pad(b.turns > 0 ? `${(hit * 100).toFixed(1)}%` : \"—\", 10, \"right\"),\n pad(b.turns > 0 ? `$${b.costUsd.toFixed(6)}` : \"—\", 14, \"right\"),\n pad(\n b.turns > 0 && b.cacheSavingsUsd > 0 ? `$${b.cacheSavingsUsd.toFixed(4)}` : \"—\",\n 14,\n \"right\",\n ),\n pad(b.turns > 0 ? `$${b.claudeEquivUsd.toFixed(4)}` : \"—\", 14, \"right\"),\n pad(b.turns > 0 && savings > 0 ? `${(savings * 100).toFixed(1)}%` : \"—\", 10, \"right\"),\n ].join(\" \");\n}\n\nfunction pad(s: string, width: number, align: \"left\" | \"right\" = \"left\"): string {\n if (s.length >= width) return s;\n const fill = \" \".repeat(width - s.length);\n return align === \"right\" ? `${fill}${s}` : `${s}${fill}`;\n}\n"],"mappings":"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","names":[]}
@@ -1336,6 +1336,9 @@ var require_sender = __commonJS({
1336
1336
  "use strict";
1337
1337
  var { Duplex } = __require("stream");
1338
1338
  var { randomFillSync } = __require("crypto");
1339
+ var {
1340
+ types: { isUint8Array }
1341
+ } = __require("util");
1339
1342
  var PerMessageDeflate2 = require_permessage_deflate();
1340
1343
  var { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants();
1341
1344
  var { isBlob, isValidStatusCode } = require_validation();
@@ -1489,8 +1492,10 @@ var require_sender = __commonJS({
1489
1492
  buf.writeUInt16BE(code, 0);
1490
1493
  if (typeof data === "string") {
1491
1494
  buf.write(data, 2);
1492
- } else {
1495
+ } else if (isUint8Array(data)) {
1493
1496
  buf.set(data, 2);
1497
+ } else {
1498
+ throw new TypeError("Second argument must be a string or a Uint8Array");
1494
1499
  }
1495
1500
  }
1496
1501
  const options = {
@@ -3633,87 +3638,7 @@ var import_websocket = __toESM(require_websocket(), 1);
3633
3638
  var import_websocket_server = __toESM(require_websocket_server(), 1);
3634
3639
  var wrapper_default = import_websocket.default;
3635
3640
 
3636
- // node_modules/ink/build/devtools-window-polyfill.js
3637
- var customGlobal = globalThis;
3638
- customGlobal.WebSocket ||= wrapper_default;
3639
- customGlobal.window ||= globalThis;
3640
- customGlobal.self ||= globalThis;
3641
- customGlobal.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__ = [
3642
- {
3643
- // ComponentFilterElementType
3644
- type: 1,
3645
- // ElementTypeHostComponent
3646
- value: 7,
3647
- isEnabled: true
3648
- },
3649
- {
3650
- // ComponentFilterDisplayName
3651
- type: 2,
3652
- value: "InternalApp",
3653
- isEnabled: true,
3654
- isValid: true
3655
- },
3656
- {
3657
- // ComponentFilterDisplayName
3658
- type: 2,
3659
- value: "InternalAppContext",
3660
- isEnabled: true,
3661
- isValid: true
3662
- },
3663
- {
3664
- // ComponentFilterDisplayName
3665
- type: 2,
3666
- value: "InternalStdoutContext",
3667
- isEnabled: true,
3668
- isValid: true
3669
- },
3670
- {
3671
- // ComponentFilterDisplayName
3672
- type: 2,
3673
- value: "InternalStderrContext",
3674
- isEnabled: true,
3675
- isValid: true
3676
- },
3677
- {
3678
- // ComponentFilterDisplayName
3679
- type: 2,
3680
- value: "InternalStdinContext",
3681
- isEnabled: true,
3682
- isValid: true
3683
- },
3684
- {
3685
- // ComponentFilterDisplayName
3686
- type: 2,
3687
- value: "InternalFocusContext",
3688
- isEnabled: true,
3689
- isValid: true
3690
- }
3691
- ];
3692
-
3693
- // node_modules/ink/build/devtools.js
3694
- import devtools from "react-devtools-core";
3695
- var isDevToolsReachable = async () => new Promise((resolve) => {
3696
- const socket = new wrapper_default("ws://localhost:8097");
3697
- const timeout = setTimeout(() => {
3698
- socket.terminate();
3699
- resolve(false);
3700
- }, 2e3);
3701
- timeout.unref();
3702
- socket.on("open", () => {
3703
- clearTimeout(timeout);
3704
- socket.terminate();
3705
- resolve(true);
3706
- });
3707
- socket.on("error", () => {
3708
- clearTimeout(timeout);
3709
- socket.terminate();
3710
- resolve(false);
3711
- });
3712
- });
3713
- if (await isDevToolsReachable()) {
3714
- devtools.initialize();
3715
- devtools.connectToDevTools();
3716
- } else {
3717
- console.warn("DEV is set to true, but the React DevTools server is not running. Start it with:\n\n$ npx react-devtools\n");
3718
- }
3719
- //# sourceMappingURL=devtools-YECO25QO.js.map
3641
+ export {
3642
+ wrapper_default
3643
+ };
3644
+ //# sourceMappingURL=chunk-FEZK652I.js.map