@textjs/app 0.0.0-stage → 1.0.3

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 (335) hide show
  1. package/README.md +34 -2
  2. package/bin/text.js +29 -0
  3. package/bin/text.ts +13 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/cli/build.d.ts +39 -0
  6. package/dist/cli/build.d.ts.map +1 -0
  7. package/dist/cli/build.js +157 -0
  8. package/dist/cli/build.js.map +1 -0
  9. package/dist/cli/config.d.ts +22 -0
  10. package/dist/cli/config.d.ts.map +1 -0
  11. package/dist/cli/config.js +73 -0
  12. package/dist/cli/config.js.map +1 -0
  13. package/dist/cli/dev.d.ts +12 -0
  14. package/dist/cli/dev.d.ts.map +1 -0
  15. package/dist/cli/dev.js +49 -0
  16. package/dist/cli/dev.js.map +1 -0
  17. package/dist/cli/index.d.ts +26 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +192 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/run.d.ts +31 -0
  22. package/dist/cli/run.d.ts.map +1 -0
  23. package/dist/cli/run.js +111 -0
  24. package/dist/cli/run.js.map +1 -0
  25. package/dist/cli/start.d.ts +14 -0
  26. package/dist/cli/start.d.ts.map +1 -0
  27. package/dist/cli/start.js +183 -0
  28. package/dist/cli/start.js.map +1 -0
  29. package/dist/cli/ui.d.ts +35 -0
  30. package/dist/cli/ui.d.ts.map +1 -0
  31. package/dist/cli/ui.js +73 -0
  32. package/dist/cli/ui.js.map +1 -0
  33. package/dist/client.d.ts +34 -0
  34. package/dist/client.d.ts.map +1 -0
  35. package/dist/client.js +93 -0
  36. package/dist/client.js.map +1 -0
  37. package/dist/config.d.ts +143 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +28 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/context.d.ts +44 -0
  42. package/dist/context.d.ts.map +1 -0
  43. package/dist/context.js +26 -0
  44. package/dist/context.js.map +1 -0
  45. package/dist/dev-errors.d.ts +68 -0
  46. package/dist/dev-errors.d.ts.map +1 -0
  47. package/dist/dev-errors.js +121 -0
  48. package/dist/dev-errors.js.map +1 -0
  49. package/dist/devtools.d.ts +64 -0
  50. package/dist/devtools.d.ts.map +1 -0
  51. package/dist/devtools.js +186 -0
  52. package/dist/devtools.js.map +1 -0
  53. package/dist/frame-mirror.d.ts +19 -0
  54. package/dist/frame-mirror.d.ts.map +1 -0
  55. package/dist/frame-mirror.js +141 -0
  56. package/dist/frame-mirror.js.map +1 -0
  57. package/dist/frame-protocol.d.ts +175 -0
  58. package/dist/frame-protocol.d.ts.map +1 -0
  59. package/dist/frame-protocol.js +369 -0
  60. package/dist/frame-protocol.js.map +1 -0
  61. package/dist/history.d.ts +54 -0
  62. package/dist/history.d.ts.map +1 -0
  63. package/dist/history.js +152 -0
  64. package/dist/history.js.map +1 -0
  65. package/dist/index.d.ts +9 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +8 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/link.d.ts +32 -0
  70. package/dist/link.d.ts.map +1 -0
  71. package/dist/link.js +54 -0
  72. package/dist/link.js.map +1 -0
  73. package/dist/live-player.d.ts +83 -0
  74. package/dist/live-player.d.ts.map +1 -0
  75. package/dist/live-player.js +413 -0
  76. package/dist/live-player.js.map +1 -0
  77. package/dist/live-protocol.d.ts +132 -0
  78. package/dist/live-protocol.d.ts.map +1 -0
  79. package/dist/live-protocol.js +278 -0
  80. package/dist/live-protocol.js.map +1 -0
  81. package/dist/live-stub.d.ts +10 -0
  82. package/dist/live-stub.d.ts.map +1 -0
  83. package/dist/live-stub.js +32 -0
  84. package/dist/live-stub.js.map +1 -0
  85. package/dist/mcp/cli.d.ts +22 -0
  86. package/dist/mcp/cli.d.ts.map +1 -0
  87. package/dist/mcp/cli.js +177 -0
  88. package/dist/mcp/cli.js.map +1 -0
  89. package/dist/mcp/frame.d.ts +58 -0
  90. package/dist/mcp/frame.d.ts.map +1 -0
  91. package/dist/mcp/frame.js +169 -0
  92. package/dist/mcp/frame.js.map +1 -0
  93. package/dist/mcp/index.d.ts +15 -0
  94. package/dist/mcp/index.d.ts.map +1 -0
  95. package/dist/mcp/index.js +15 -0
  96. package/dist/mcp/index.js.map +1 -0
  97. package/dist/mcp/inspect.d.ts +95 -0
  98. package/dist/mcp/inspect.d.ts.map +1 -0
  99. package/dist/mcp/inspect.js +386 -0
  100. package/dist/mcp/inspect.js.map +1 -0
  101. package/dist/mcp/keys.d.ts +20 -0
  102. package/dist/mcp/keys.d.ts.map +1 -0
  103. package/dist/mcp/keys.js +87 -0
  104. package/dist/mcp/keys.js.map +1 -0
  105. package/dist/mcp/logs.d.ts +63 -0
  106. package/dist/mcp/logs.d.ts.map +1 -0
  107. package/dist/mcp/logs.js +217 -0
  108. package/dist/mcp/logs.js.map +1 -0
  109. package/dist/mcp/server.d.ts +64 -0
  110. package/dist/mcp/server.d.ts.map +1 -0
  111. package/dist/mcp/server.js +485 -0
  112. package/dist/mcp/server.js.map +1 -0
  113. package/dist/mcp/session.d.ts +230 -0
  114. package/dist/mcp/session.d.ts.map +1 -0
  115. package/dist/mcp/session.js +742 -0
  116. package/dist/mcp/session.js.map +1 -0
  117. package/dist/navigation-errors.d.ts +28 -0
  118. package/dist/navigation-errors.d.ts.map +1 -0
  119. package/dist/navigation-errors.js +43 -0
  120. package/dist/navigation-errors.js.map +1 -0
  121. package/dist/navigation.d.ts +21 -0
  122. package/dist/navigation.d.ts.map +1 -0
  123. package/dist/navigation.js +33 -0
  124. package/dist/navigation.js.map +1 -0
  125. package/dist/router.d.ts +76 -0
  126. package/dist/router.d.ts.map +1 -0
  127. package/dist/router.js +296 -0
  128. package/dist/router.js.map +1 -0
  129. package/dist/routing.d.ts +101 -0
  130. package/dist/routing.d.ts.map +1 -0
  131. package/dist/routing.js +286 -0
  132. package/dist/routing.js.map +1 -0
  133. package/dist/server/adapters/build-step.d.ts +34 -0
  134. package/dist/server/adapters/build-step.d.ts.map +1 -0
  135. package/dist/server/adapters/build-step.js +112 -0
  136. package/dist/server/adapters/build-step.js.map +1 -0
  137. package/dist/server/adapters/bun.d.ts +8 -0
  138. package/dist/server/adapters/bun.d.ts.map +1 -0
  139. package/dist/server/adapters/bun.js +89 -0
  140. package/dist/server/adapters/bun.js.map +1 -0
  141. package/dist/server/adapters/bundle.d.ts +21 -0
  142. package/dist/server/adapters/bundle.d.ts.map +1 -0
  143. package/dist/server/adapters/bundle.js +86 -0
  144. package/dist/server/adapters/bundle.js.map +1 -0
  145. package/dist/server/adapters/cloudflare.d.ts +29 -0
  146. package/dist/server/adapters/cloudflare.d.ts.map +1 -0
  147. package/dist/server/adapters/cloudflare.js +105 -0
  148. package/dist/server/adapters/cloudflare.js.map +1 -0
  149. package/dist/server/adapters/index.d.ts +10 -0
  150. package/dist/server/adapters/index.d.ts.map +1 -0
  151. package/dist/server/adapters/index.js +24 -0
  152. package/dist/server/adapters/index.js.map +1 -0
  153. package/dist/server/adapters/runtime-node.d.ts +16 -0
  154. package/dist/server/adapters/runtime-node.d.ts.map +1 -0
  155. package/dist/server/adapters/runtime-node.js +29 -0
  156. package/dist/server/adapters/runtime-node.js.map +1 -0
  157. package/dist/server/adapters/runtime.d.ts +42 -0
  158. package/dist/server/adapters/runtime.d.ts.map +1 -0
  159. package/dist/server/adapters/runtime.js +115 -0
  160. package/dist/server/adapters/runtime.js.map +1 -0
  161. package/dist/server/adapters/shared.d.ts +66 -0
  162. package/dist/server/adapters/shared.d.ts.map +1 -0
  163. package/dist/server/adapters/shared.js +124 -0
  164. package/dist/server/adapters/shared.js.map +1 -0
  165. package/dist/server/adapters/static.d.ts +9 -0
  166. package/dist/server/adapters/static.d.ts.map +1 -0
  167. package/dist/server/adapters/static.js +70 -0
  168. package/dist/server/adapters/static.js.map +1 -0
  169. package/dist/server/adapters/vercel.d.ts +43 -0
  170. package/dist/server/adapters/vercel.d.ts.map +1 -0
  171. package/dist/server/adapters/vercel.js +119 -0
  172. package/dist/server/adapters/vercel.js.map +1 -0
  173. package/dist/server/bun-jsx.d.ts +18 -0
  174. package/dist/server/bun-jsx.d.ts.map +1 -0
  175. package/dist/server/bun-jsx.js +56 -0
  176. package/dist/server/bun-jsx.js.map +1 -0
  177. package/dist/server/cache-route.d.ts +38 -0
  178. package/dist/server/cache-route.d.ts.map +1 -0
  179. package/dist/server/cache-route.js +109 -0
  180. package/dist/server/cache-route.js.map +1 -0
  181. package/dist/server/cache.d.ts +131 -0
  182. package/dist/server/cache.d.ts.map +1 -0
  183. package/dist/server/cache.js +409 -0
  184. package/dist/server/cache.js.map +1 -0
  185. package/dist/server/frames.d.ts +45 -0
  186. package/dist/server/frames.d.ts.map +1 -0
  187. package/dist/server/frames.js +294 -0
  188. package/dist/server/frames.js.map +1 -0
  189. package/dist/server/http.d.ts +80 -0
  190. package/dist/server/http.d.ts.map +1 -0
  191. package/dist/server/http.js +453 -0
  192. package/dist/server/http.js.map +1 -0
  193. package/dist/server/jsx-dev-runtime.d.ts +5 -0
  194. package/dist/server/jsx-dev-runtime.d.ts.map +1 -0
  195. package/dist/server/jsx-dev-runtime.js +6 -0
  196. package/dist/server/jsx-dev-runtime.js.map +1 -0
  197. package/dist/server/jsx-runtime.d.ts +10 -0
  198. package/dist/server/jsx-runtime.d.ts.map +1 -0
  199. package/dist/server/jsx-runtime.js +11 -0
  200. package/dist/server/jsx-runtime.js.map +1 -0
  201. package/dist/server/live-app.d.ts +87 -0
  202. package/dist/server/live-app.d.ts.map +1 -0
  203. package/dist/server/live-app.js +307 -0
  204. package/dist/server/live-app.js.map +1 -0
  205. package/dist/server/live-build.d.ts +70 -0
  206. package/dist/server/live-build.d.ts.map +1 -0
  207. package/dist/server/live-build.js +222 -0
  208. package/dist/server/live-build.js.map +1 -0
  209. package/dist/server/live-dev.d.ts +62 -0
  210. package/dist/server/live-dev.d.ts.map +1 -0
  211. package/dist/server/live-dev.js +313 -0
  212. package/dist/server/live-dev.js.map +1 -0
  213. package/dist/server/live-manifest.d.ts +23 -0
  214. package/dist/server/live-manifest.d.ts.map +1 -0
  215. package/dist/server/live-manifest.js +7 -0
  216. package/dist/server/live-manifest.js.map +1 -0
  217. package/dist/server/live-prod.d.ts +30 -0
  218. package/dist/server/live-prod.d.ts.map +1 -0
  219. package/dist/server/live-prod.js +97 -0
  220. package/dist/server/live-prod.js.map +1 -0
  221. package/dist/server/live-routes.d.ts +72 -0
  222. package/dist/server/live-routes.d.ts.map +1 -0
  223. package/dist/server/live-routes.js +274 -0
  224. package/dist/server/live-routes.js.map +1 -0
  225. package/dist/server/live-web.d.ts +16 -0
  226. package/dist/server/live-web.d.ts.map +1 -0
  227. package/dist/server/live-web.js +159 -0
  228. package/dist/server/live-web.js.map +1 -0
  229. package/dist/server/live.d.ts +138 -0
  230. package/dist/server/live.d.ts.map +1 -0
  231. package/dist/server/live.js +542 -0
  232. package/dist/server/live.js.map +1 -0
  233. package/dist/server/middleware-node.d.ts +48 -0
  234. package/dist/server/middleware-node.d.ts.map +1 -0
  235. package/dist/server/middleware-node.js +167 -0
  236. package/dist/server/middleware-node.js.map +1 -0
  237. package/dist/server/middleware-runtime.d.ts +97 -0
  238. package/dist/server/middleware-runtime.d.ts.map +1 -0
  239. package/dist/server/middleware-runtime.js +447 -0
  240. package/dist/server/middleware-runtime.js.map +1 -0
  241. package/dist/server/middleware.d.ts +145 -0
  242. package/dist/server/middleware.d.ts.map +1 -0
  243. package/dist/server/middleware.js +365 -0
  244. package/dist/server/middleware.js.map +1 -0
  245. package/dist/server/ppr.d.ts +22 -0
  246. package/dist/server/ppr.d.ts.map +1 -0
  247. package/dist/server/ppr.js +58 -0
  248. package/dist/server/ppr.js.map +1 -0
  249. package/dist/server/scan.d.ts +48 -0
  250. package/dist/server/scan.d.ts.map +1 -0
  251. package/dist/server/scan.js +161 -0
  252. package/dist/server/scan.js.map +1 -0
  253. package/dist/server/server-components.d.ts +65 -0
  254. package/dist/server/server-components.d.ts.map +1 -0
  255. package/dist/server/server-components.js +215 -0
  256. package/dist/server/server-components.js.map +1 -0
  257. package/dist/terminal.d.ts +5 -0
  258. package/dist/terminal.d.ts.map +1 -0
  259. package/dist/terminal.js +5 -0
  260. package/dist/terminal.js.map +1 -0
  261. package/dist/testing.d.ts +5 -0
  262. package/dist/testing.d.ts.map +1 -0
  263. package/dist/testing.js +5 -0
  264. package/dist/testing.js.map +1 -0
  265. package/dist/vite-plugin.d.ts +51 -0
  266. package/dist/vite-plugin.d.ts.map +1 -0
  267. package/dist/vite-plugin.js +403 -0
  268. package/dist/vite-plugin.js.map +1 -0
  269. package/package.json +130 -4
  270. package/src/cli/build.ts +182 -0
  271. package/src/cli/config.ts +72 -0
  272. package/src/cli/dev.ts +54 -0
  273. package/src/cli/index.ts +185 -0
  274. package/src/cli/run.ts +124 -0
  275. package/src/cli/start.ts +194 -0
  276. package/src/cli/ui.ts +93 -0
  277. package/src/client.tsx +122 -0
  278. package/src/config.ts +155 -0
  279. package/src/context.ts +69 -0
  280. package/src/dev-errors.ts +167 -0
  281. package/src/devtools.tsx +419 -0
  282. package/src/frame-mirror.ts +145 -0
  283. package/src/frame-protocol.ts +435 -0
  284. package/src/history.ts +201 -0
  285. package/src/index.ts +9 -0
  286. package/src/link.tsx +108 -0
  287. package/src/live-player.ts +449 -0
  288. package/src/live-protocol.ts +317 -0
  289. package/src/live-stub.tsx +32 -0
  290. package/src/mcp/cli.ts +188 -0
  291. package/src/mcp/frame.ts +224 -0
  292. package/src/mcp/index.ts +15 -0
  293. package/src/mcp/inspect.ts +445 -0
  294. package/src/mcp/keys.ts +86 -0
  295. package/src/mcp/logs.ts +225 -0
  296. package/src/mcp/server.ts +595 -0
  297. package/src/mcp/session.ts +821 -0
  298. package/src/navigation-errors.ts +60 -0
  299. package/src/navigation.ts +44 -0
  300. package/src/router.tsx +497 -0
  301. package/src/routing.ts +344 -0
  302. package/src/server/adapters/build-step.ts +135 -0
  303. package/src/server/adapters/bun.ts +92 -0
  304. package/src/server/adapters/bundle.ts +97 -0
  305. package/src/server/adapters/cloudflare.ts +111 -0
  306. package/src/server/adapters/index.ts +29 -0
  307. package/src/server/adapters/runtime-node.ts +34 -0
  308. package/src/server/adapters/runtime.ts +145 -0
  309. package/src/server/adapters/shared.ts +159 -0
  310. package/src/server/adapters/static.ts +68 -0
  311. package/src/server/adapters/vercel.ts +149 -0
  312. package/src/server/bun-jsx.ts +65 -0
  313. package/src/server/cache-route.ts +139 -0
  314. package/src/server/cache.ts +498 -0
  315. package/src/server/frames.ts +326 -0
  316. package/src/server/http.ts +467 -0
  317. package/src/server/jsx-dev-runtime.ts +9 -0
  318. package/src/server/jsx-runtime.ts +13 -0
  319. package/src/server/live-app.tsx +374 -0
  320. package/src/server/live-build.ts +258 -0
  321. package/src/server/live-dev.ts +357 -0
  322. package/src/server/live-manifest.ts +25 -0
  323. package/src/server/live-prod.ts +120 -0
  324. package/src/server/live-routes.ts +298 -0
  325. package/src/server/live-web.ts +170 -0
  326. package/src/server/live.ts +551 -0
  327. package/src/server/middleware-node.ts +168 -0
  328. package/src/server/middleware-runtime.ts +478 -0
  329. package/src/server/middleware.ts +451 -0
  330. package/src/server/ppr.ts +62 -0
  331. package/src/server/scan.ts +190 -0
  332. package/src/server/server-components.ts +224 -0
  333. package/src/terminal.ts +5 -0
  334. package/src/testing.ts +5 -0
  335. package/src/vite-plugin.ts +413 -0
@@ -0,0 +1,386 @@
1
+ /**
2
+ * Component + scene tree inspection for `text mcp`.
3
+ *
4
+ * The React tree is read from fibers: `<FiberProbe>` (a class component
5
+ * mounted around the app) exposes its fiber via `_reactInternals`, which React
6
+ * sets on every class instance in development and production builds alike.
7
+ * Host fibers (`tx-box` / `tx-text` / raw text) point at their `SceneNode`
8
+ * (`stateNode`), whose `screenRect` from the last paint gives cell bounds.
9
+ */
10
+ import { Component } from "react";
11
+ import { paintOwners } from "@textjs/react/devtools-hook";
12
+ // React 19 work tags (react-reconciler/src/ReactWorkTags.js).
13
+ const FunctionComponent = 0;
14
+ const ClassComponent = 1;
15
+ const HostRoot = 3;
16
+ const HostPortal = 4;
17
+ const HostComponent = 5;
18
+ const HostText = 6;
19
+ const ForwardRef = 11;
20
+ const SuspenseComponent = 13;
21
+ const MemoComponent = 14;
22
+ const SimpleMemoComponent = 15;
23
+ const OffscreenComponent = 22;
24
+ const ActivityComponent = 31;
25
+ export class FiberProbe extends Component {
26
+ render() {
27
+ return this.props.children;
28
+ }
29
+ }
30
+ /** The current HostRoot fiber of the tree `probe` is mounted in. */
31
+ function currentRoot(probe) {
32
+ const fiber = probe?._reactInternals;
33
+ if (!fiber)
34
+ return null;
35
+ let f = fiber;
36
+ while (f.return)
37
+ f = f.return;
38
+ if (f.tag !== HostRoot)
39
+ return null;
40
+ const root = f.stateNode;
41
+ return root?.current ?? f;
42
+ }
43
+ function displayName(fiber) {
44
+ const t = fiber.type;
45
+ switch (fiber.tag) {
46
+ case FunctionComponent:
47
+ case ClassComponent:
48
+ case SimpleMemoComponent:
49
+ return (t && (t.displayName || t.name)) || "Anonymous";
50
+ case ForwardRef: {
51
+ const r = t?.render;
52
+ return t?.displayName || (r && (r.displayName || r.name)) || "ForwardRef";
53
+ }
54
+ case MemoComponent: {
55
+ const inner = t?.type;
56
+ return t?.displayName || inner?.displayName || inner?.name || inner?.render?.name || "Memo";
57
+ }
58
+ default:
59
+ return null;
60
+ }
61
+ }
62
+ function sceneOf(fiber) {
63
+ if (fiber.tag !== HostComponent && fiber.tag !== HostText)
64
+ return null;
65
+ const node = fiber.stateNode;
66
+ return node && typeof node === "object" && "screenRect" in node ? node : null;
67
+ }
68
+ function rectOf(node) {
69
+ if (!node.painted)
70
+ return null;
71
+ const r = node.screenRect;
72
+ if (r.width <= 0 || r.height <= 0)
73
+ return null;
74
+ return { x: r.x, y: r.y, width: r.width, height: r.height };
75
+ }
76
+ function union(a, b) {
77
+ if (!a)
78
+ return b ?? null;
79
+ if (!b)
80
+ return a;
81
+ const x0 = Math.min(a.x, b.x);
82
+ const y0 = Math.min(a.y, b.y);
83
+ const x1 = Math.max(a.x + a.width, b.x + b.width);
84
+ const y1 = Math.max(a.y + a.height, b.y + b.height);
85
+ return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
86
+ }
87
+ function textOf(node) {
88
+ if (node.type === "raw-text")
89
+ return node.text;
90
+ let s = "";
91
+ for (const c of node.children)
92
+ s += textOf(c);
93
+ return s;
94
+ }
95
+ function isHiddenOffscreen(fiber) {
96
+ return (fiber.tag === OffscreenComponent || fiber.tag === ActivityComponent) && fiber.memoizedState !== null;
97
+ }
98
+ /** `Symbol.for("textjs.focusOwner")`: the marker `useFocus()` leaves in hook state (`@textjs/react` `FOCUS_OWNER`). */
99
+ const FOCUS_OWNER = Symbol.for("textjs.focusOwner");
100
+ function hooksOf(fiber) {
101
+ if (fiber.tag !== FunctionComponent && fiber.tag !== ForwardRef && fiber.tag !== SimpleMemoComponent)
102
+ return null;
103
+ return fiber.memoizedState;
104
+ }
105
+ /** Focus ids this component registered with `useFocus()` (tagged `useMemo` state). */
106
+ function focusOwnerIds(fiber) {
107
+ const out = [];
108
+ let hook = hooksOf(fiber);
109
+ let guard = 0;
110
+ while (hook && typeof hook === "object" && guard++ < 200) {
111
+ const v = hook.memoizedState;
112
+ const value = Array.isArray(v) ? v[0] : undefined;
113
+ const id = value !== null && typeof value === "object" ? value[FOCUS_OWNER] : undefined;
114
+ if (typeof id === "string")
115
+ out.push(id);
116
+ hook = (hook.next ?? null);
117
+ }
118
+ return out;
119
+ }
120
+ /**
121
+ * Fallback for focus ids registered without the marker (older `@textjs/react`):
122
+ * strings in hook state (`useId()` values, `useCallback` deps).
123
+ */
124
+ function hookStrings(fiber, wanted) {
125
+ let hook = hooksOf(fiber);
126
+ let guard = 0;
127
+ while (hook && typeof hook === "object" && guard++ < 200) {
128
+ const v = hook.memoizedState;
129
+ if (typeof v === "string" && wanted.has(v))
130
+ return v;
131
+ // `useCallback(fn, [manager, id])` inside `useFocus` (covers explicit `id` options).
132
+ if (Array.isArray(v) && Array.isArray(v[1])) {
133
+ const dep = v[1].find((d) => typeof d === "string" && wanted.has(d));
134
+ if (typeof dep === "string")
135
+ return dep;
136
+ }
137
+ hook = (hook.next ?? null);
138
+ }
139
+ return undefined;
140
+ }
141
+ /** The focus id `fiber` owns: its `useFocus()` marker, else an unclaimed id seen in its hook state. */
142
+ function focusIdOf(fiber, wanted, claimed) {
143
+ const tagged = focusOwnerIds(fiber).find((id) => wanted.has(id));
144
+ if (tagged !== undefined)
145
+ return tagged;
146
+ if (claimed.size >= wanted.size)
147
+ return undefined;
148
+ const fallback = hookStrings(fiber, wanted);
149
+ return fallback !== undefined && !claimed.has(fallback) ? fallback : undefined;
150
+ }
151
+ /** Every registered focus id claimed by a `useFocus()` marker under `start`. */
152
+ function claimedFocusIds(start, wanted) {
153
+ const out = new Set();
154
+ const stack = [start];
155
+ while (stack.length > 0) {
156
+ const f = stack.pop();
157
+ for (const id of focusOwnerIds(f))
158
+ if (wanted.has(id))
159
+ out.add(id);
160
+ for (let c = f.child; c; c = c.sibling)
161
+ stack.push(c);
162
+ }
163
+ return out;
164
+ }
165
+ /**
166
+ * Walk the React tree under `probe`. Components are attributed to the focus id
167
+ * they registered with `useFocus()` (its `FOCUS_OWNER` hook-state marker).
168
+ */
169
+ export function inspect(probe, focus, options = {}) {
170
+ const { hosts = true, maxDepth = 40, component, hideEmpty = true } = options;
171
+ const activeFocusId = focus.getActiveId();
172
+ const entries = focus.snapshot();
173
+ const wanted = new Set(entries.map((e) => e.id));
174
+ const focusBounds = new Map();
175
+ const root = currentRoot(probe);
176
+ const probeFiber = root ? findProbe(root) : null;
177
+ const needle = component?.toLowerCase();
178
+ const claimed = probeFiber ? claimedFocusIds(probeFiber, wanted) : new Set();
179
+ /**
180
+ * Returns the built nodes for `fiber` (several when the fiber itself is
181
+ * transparent), its painted bounds, and the bounds of portals rendered
182
+ * below it (kept apart: they paint in the root layer).
183
+ */
184
+ const visit = (fiber) => {
185
+ if (isHiddenOffscreen(fiber))
186
+ return { nodes: [], bounds: null, portal: null };
187
+ const name = displayName(fiber);
188
+ const scene = sceneOf(fiber);
189
+ const isSuspense = fiber.tag === SuspenseComponent;
190
+ const isPortal = fiber.tag === HostPortal;
191
+ const visible = name !== null || (hosts && scene !== null) || isSuspense || isPortal;
192
+ const kids = [];
193
+ let bounds = scene ? rectOf(scene) : null;
194
+ let portalBounds = null;
195
+ // Raw text inside <Text> has no own layout; its owner's rect covers it.
196
+ if (scene?.type === "raw-text")
197
+ bounds = null;
198
+ if (fiber.tag !== HostText) {
199
+ for (let c = fiber.child; c; c = c.sibling) {
200
+ const r = visit(c);
201
+ kids.push(...r.nodes);
202
+ // A portal paints in the root layer, not inside its logical parent.
203
+ if (c.tag === HostPortal)
204
+ portalBounds = union(portalBounds, r.bounds);
205
+ else
206
+ bounds = union(bounds, r.bounds);
207
+ portalBounds = union(portalBounds, r.portal);
208
+ }
209
+ }
210
+ if (isPortal) {
211
+ bounds = union(bounds, portalBounds);
212
+ portalBounds = null;
213
+ }
214
+ if (!visible)
215
+ return { nodes: kids, bounds, portal: portalBounds };
216
+ // A component that only renders a portal (<Modal>) is shown where the portal paints.
217
+ const shown = bounds ?? portalBounds;
218
+ const node = { kind: "component", name: name ?? "" };
219
+ if (scene) {
220
+ node.kind = scene.type === "box" ? "box" : "text";
221
+ node.name = scene.type === "box" ? "box" : "text";
222
+ if (scene.type !== "box") {
223
+ const t = textOf(scene);
224
+ node.text = t.length > 120 ? `${t.slice(0, 117)}…` : t;
225
+ }
226
+ else {
227
+ const label = scene.props.title ?? scene.props.wireframeLabel;
228
+ if (label)
229
+ node.label = String(label).trim();
230
+ }
231
+ }
232
+ else if (isSuspense) {
233
+ node.kind = "suspense";
234
+ node.name = "Suspense";
235
+ }
236
+ else if (isPortal) {
237
+ node.kind = "portal";
238
+ node.name = "Portal";
239
+ }
240
+ if (fiber.key !== null)
241
+ node.key = fiber.key;
242
+ if (shown)
243
+ node.bounds = shown;
244
+ if (name !== null) {
245
+ const fid = focusIdOf(fiber, wanted, claimed);
246
+ if (fid !== undefined) {
247
+ node.focusId = fid;
248
+ if (fid === activeFocusId)
249
+ node.focused = true;
250
+ if (!focusBounds.has(fid))
251
+ focusBounds.set(fid, { component: name, bounds: shown });
252
+ }
253
+ }
254
+ // Text hosts already carry their text; raw-text children add nothing.
255
+ const children = node.kind === "text" ? kids.filter((k) => k.kind !== "text" || k.text !== node.text) : kids;
256
+ if (children.length > 0)
257
+ node.children = children;
258
+ if (hideEmpty && (node.kind === "component" || node.kind === "portal") && !shown && children.length === 0 && node.focusId === undefined)
259
+ return { nodes: [], bounds, portal: portalBounds };
260
+ return { nodes: [node], bounds, portal: portalBounds };
261
+ };
262
+ let tree = null;
263
+ if (probeFiber) {
264
+ const nodes = [];
265
+ let bounds = null;
266
+ for (let c = probeFiber.child; c; c = c.sibling) {
267
+ const r = visit(c);
268
+ nodes.push(...r.nodes);
269
+ bounds = union(bounds, r.bounds);
270
+ }
271
+ // The whole tree is walked (bounds and focus attribution need every host);
272
+ // `maxDepth` limits what is returned, counted from the matched roots.
273
+ const trim = (n, depth) => {
274
+ if (!n.children)
275
+ return n;
276
+ if (depth + 1 >= maxDepth) {
277
+ const { children: _children, ...rest } = n;
278
+ return rest;
279
+ }
280
+ return { ...n, children: n.children.map((c) => trim(c, depth + 1)) };
281
+ };
282
+ tree = { kind: "component", name: "App", ...(bounds ? { bounds } : {}), children: nodes.map((n) => trim(n, 0)) };
283
+ if (needle) {
284
+ const matches = [];
285
+ const search = (n) => {
286
+ if (n.kind === "component" && n.name.toLowerCase().includes(needle)) {
287
+ matches.push(trim(n, 0));
288
+ return;
289
+ }
290
+ n.children?.forEach(search);
291
+ };
292
+ nodes.forEach(search);
293
+ tree = { kind: "component", name: `App (matching "${component}")`, children: matches };
294
+ }
295
+ }
296
+ const focusables = entries.map((e) => {
297
+ const hit = focusBounds.get(e.id);
298
+ return {
299
+ id: e.id,
300
+ focused: e.id === activeFocusId,
301
+ tabbable: e.tabbable,
302
+ ...(hit ? { component: hit.component } : {}),
303
+ ...(hit?.bounds ? { bounds: hit.bounds } : {}),
304
+ };
305
+ });
306
+ return { tree, focusables, activeFocusId };
307
+ }
308
+ function findProbe(root) {
309
+ const stack = [root];
310
+ while (stack.length > 0) {
311
+ const f = stack.pop();
312
+ if (f.tag === ClassComponent && f.type === FiberProbe)
313
+ return f;
314
+ for (let c = f.child; c; c = c.sibling)
315
+ stack.push(c);
316
+ }
317
+ return null;
318
+ }
319
+ /** Render a tree as indented text: `Name [x,y w×h] "text" focus=id`. */
320
+ export function formatTree(node, indent = "") {
321
+ let line = `${indent}${node.kind === "component" || node.kind === "suspense" || node.kind === "portal" ? node.name : node.kind}`;
322
+ if (node.key !== undefined)
323
+ line += ` key=${JSON.stringify(node.key)}`;
324
+ if (node.label)
325
+ line += ` (${node.label})`;
326
+ if (node.bounds)
327
+ line += ` [${node.bounds.x},${node.bounds.y} ${node.bounds.width}×${node.bounds.height}]`;
328
+ if (node.text !== undefined)
329
+ line += ` ${JSON.stringify(node.text)}`;
330
+ if (node.focusId !== undefined)
331
+ line += ` focus=${node.focusId}${node.focused ? " (focused)" : ""}`;
332
+ const lines = [line];
333
+ for (const c of node.children ?? [])
334
+ lines.push(formatTree(c, `${indent} `));
335
+ return lines.join("\n");
336
+ }
337
+ /**
338
+ * Hit-tester for cells: the topmost painted host scene node at `(x, y)` in
339
+ * paint order (overflow clipping, scroll offsets, absolute `zIndex` layers
340
+ * and portals such as `<Modal>`), attributed to its component chain.
341
+ * Ownership is computed once per tester.
342
+ */
343
+ export function createHitTester(probe, grid) {
344
+ const none = { component: null, path: [] };
345
+ const root = currentRoot(probe);
346
+ const start = root ? findProbe(root) : null;
347
+ if (!start)
348
+ return () => none;
349
+ const { cols, rows } = grid;
350
+ const owners = new Int32Array(cols * rows);
351
+ paintOwners(grid.root, cols, rows, owners);
352
+ const hosts = new Map();
353
+ const stack = [];
354
+ for (let c = start.child; c; c = c.sibling)
355
+ stack.push(c);
356
+ while (stack.length > 0) {
357
+ const f = stack.pop();
358
+ if (isHiddenOffscreen(f))
359
+ continue;
360
+ const scene = sceneOf(f);
361
+ if (scene)
362
+ hosts.set(scene.id, f);
363
+ for (let c = f.child; c; c = c.sibling)
364
+ stack.push(c);
365
+ }
366
+ return (x, y) => {
367
+ if (x < 0 || y < 0 || x >= cols || y >= rows)
368
+ return none;
369
+ const host = hosts.get(owners[y * cols + x]);
370
+ if (!host)
371
+ return none;
372
+ const path = [];
373
+ for (let f = host; f && f !== start; f = f.return) {
374
+ const name = displayName(f);
375
+ if (name !== null)
376
+ path.push(name);
377
+ }
378
+ path.reverse();
379
+ return { component: path[path.length - 1] ?? null, path };
380
+ };
381
+ }
382
+ /** {@link createHitTester} for a single cell. */
383
+ export function hitTest(probe, grid, x, y) {
384
+ return createHitTester(probe, grid)(x, y);
385
+ }
386
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/mcp/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Key input for the `press` tool: `"ctrl+k"`, `"down down enter"`,
3
+ * `["tab", "shift+tab"]`, `"down*3"` (repeat). Every combo is validated before
4
+ * any key is sent, so a typo never leaves the app half-driven.
5
+ */
6
+ import { type KeyInputEvent } from "@textjs/core";
7
+ /** Upper bound on keys per `press` call (guards against `down*100000`). */
8
+ export declare const MAX_KEYS_PER_CALL = 500;
9
+ export declare class KeySpecError extends Error {
10
+ readonly code: string | undefined;
11
+ constructor(message: string, code?: string);
12
+ }
13
+ /** Expand `keys` into validated key events, in order. */
14
+ export declare function parseKeyInput(keys: string | readonly string[]): KeyInputEvent[];
15
+ /**
16
+ * Key events that type `text` one grapheme at a time (`\n` presses return,
17
+ * `\t` tab), so an emoji with modifiers or a ZWJ sequence is one keystroke.
18
+ */
19
+ export declare function textToKeyEvents(text: string): KeyInputEvent[];
20
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/mcp/keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAW,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAG3D,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;gBACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAK3C;AASD,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,aAAa,EAAE,CAuB/E;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAyB7D"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Key input for the `press` tool: `"ctrl+k"`, `"down down enter"`,
3
+ * `["tab", "shift+tab"]`, `"down*3"` (repeat). Every combo is validated before
4
+ * any key is sent, so a typo never leaves the app half-driven.
5
+ */
6
+ import { txError } from "@textjs/core";
7
+ import { keyEventFromCombo, parseKeys } from "@textjs/react";
8
+ /** Upper bound on keys per `press` call (guards against `down*100000`). */
9
+ export const MAX_KEYS_PER_CALL = 500;
10
+ export class KeySpecError extends Error {
11
+ code;
12
+ constructor(message, code) {
13
+ super(message);
14
+ this.name = "KeySpecError";
15
+ this.code = code;
16
+ }
17
+ }
18
+ function splitSteps(spec) {
19
+ const trimmed = spec.trim();
20
+ // A bare " " means the space bar, matching `@textjs/react/testing`.
21
+ if (trimmed === "")
22
+ return spec.length > 0 ? ["space"] : [];
23
+ return trimmed.split(/\s+/);
24
+ }
25
+ /** Expand `keys` into validated key events, in order. */
26
+ export function parseKeyInput(keys) {
27
+ const steps = (typeof keys === "string" ? [keys] : keys).flatMap(splitSteps);
28
+ const out = [];
29
+ for (const step of steps) {
30
+ const rep = /^(.+?)\*(\d+)$/.exec(step);
31
+ const combo = rep ? rep[1] : step;
32
+ const count = rep ? Number(rep[2]) : 1;
33
+ if (count < 1)
34
+ throw new KeySpecError(`Repeat count must be at least 1 in "${step}".`);
35
+ let event;
36
+ try {
37
+ // `"a,b"` would parse as alternatives; a press is always one concrete stroke.
38
+ if (combo !== "," && parseKeys(combo).length !== 1)
39
+ throw txError("TX009", combo);
40
+ event = keyEventFromCombo(combo);
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : String(error);
44
+ const code = error.code;
45
+ throw new KeySpecError(message, typeof code === "string" ? code : undefined);
46
+ }
47
+ if (out.length + count > MAX_KEYS_PER_CALL)
48
+ throw new KeySpecError(`Too many keys in one call (max ${MAX_KEYS_PER_CALL}).`);
49
+ for (let i = 0; i < count; i++)
50
+ out.push({ ...event });
51
+ }
52
+ if (out.length === 0)
53
+ throw new KeySpecError("No keys given. Pass combos like \"down\", \"ctrl+k\" or \"tab tab enter\".");
54
+ return out;
55
+ }
56
+ const graphemes = new Intl.Segmenter(undefined, { granularity: "grapheme" });
57
+ /**
58
+ * Key events that type `text` one grapheme at a time (`\n` presses return,
59
+ * `\t` tab), so an emoji with modifiers or a ZWJ sequence is one keystroke.
60
+ */
61
+ export function textToKeyEvents(text) {
62
+ const out = [];
63
+ for (const { segment: ch } of graphemes.segment(text.replace(/\r\n?/g, "\n"))) {
64
+ if (ch === "\n") {
65
+ out.push(keyEventFromCombo("return"));
66
+ continue;
67
+ }
68
+ if (ch === "\t") {
69
+ out.push(keyEventFromCombo("tab"));
70
+ continue;
71
+ }
72
+ const upper = ch.length === 1 && ch >= "A" && ch <= "Z";
73
+ out.push({
74
+ type: "key",
75
+ key: ch === " " ? "space" : ch.toLowerCase(),
76
+ input: ch,
77
+ code: "",
78
+ repeat: false,
79
+ ctrl: false,
80
+ meta: false,
81
+ shift: upper,
82
+ alt: false,
83
+ });
84
+ }
85
+ return out;
86
+ }
87
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/mcp/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Console capture for `text mcp`. On the stdio transport stdout carries
3
+ * JSON-RPC, so app output must never reach it: every `console.*` call is
4
+ * recorded into a bounded ring buffer that agents read with the `logs` tool.
5
+ */
6
+ export type LogLevel = "log" | "info" | "warn" | "error" | "debug";
7
+ export interface LogEntry {
8
+ /** Monotonic sequence number (stable across `logs` calls; use it as a cursor). */
9
+ seq: number;
10
+ /** Milliseconds since the session started. */
11
+ t: number;
12
+ level: LogLevel;
13
+ /** Where the entry came from: app `console.*`, a React error callback, or the host process. */
14
+ source: "console" | "react" | "process" | "server";
15
+ message: string;
16
+ /** `TX###` code when the logged error carries one. */
17
+ code?: string;
18
+ }
19
+ /** `TX###` code of an error-like value (duck-typed so this works with any Text.js version). */
20
+ export declare function txCodeOf(value: unknown): string | undefined;
21
+ /**
22
+ * Format console arguments like Node's `util.format`, dropping `%c` styling
23
+ * (the browser console's styled-span syntax) together with the style argument
24
+ * it consumes. Directives are scanned left to right, so `%%c` stays a literal
25
+ * `%c` and `%s` / `%c` mixes consume arguments in order.
26
+ */
27
+ export declare function formatLogArgs(args: readonly unknown[]): string;
28
+ export declare class LogBuffer {
29
+ private readonly capacity;
30
+ private readonly entries;
31
+ private seq;
32
+ private readonly started;
33
+ private readonly listeners;
34
+ constructor(capacity?: number);
35
+ /** Record an entry; `indent` is the `console.group` depth (two spaces per level). */
36
+ push(level: LogLevel, source: LogEntry["source"], args: readonly unknown[], indent?: number): LogEntry;
37
+ /** Entries with `seq > since`, optionally filtered by level, newest last. */
38
+ read(options?: {
39
+ since?: number;
40
+ levels?: readonly LogLevel[];
41
+ limit?: number;
42
+ }): LogEntry[];
43
+ /** Highest sequence number issued so far. */
44
+ get cursor(): number;
45
+ /** Errors logged after `since`. */
46
+ errorsSince(since: number): number;
47
+ clear(): void;
48
+ onEntry(listener: (entry: LogEntry) => void): () => void;
49
+ }
50
+ export interface ConsoleCapture {
51
+ restore(): void;
52
+ }
53
+ /**
54
+ * Route every `console` method into `buffer`. `mirror` additionally receives
55
+ * each entry (e.g. stderr when `--verbose`); stdout is never written.
56
+ *
57
+ * All methods are replaced, not just `log`/`info`/`warn`/`error`/`debug`: Bun's
58
+ * native `console.count`, `group`, `table`, `dir`, `write` (and Node's) print
59
+ * straight to file descriptor 1, which would corrupt a stdio JSON-RPC stream,
60
+ * and `assert` / `timeLog` / `timeEnd` would bypass the buffer.
61
+ */
62
+ export declare function captureConsole(buffer: LogBuffer, mirror?: (entry: LogEntry) => void): ConsoleCapture;
63
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/mcp/logs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,QAAQ,CAAC;IAChB,+FAA+F;IAC/F,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,+FAA+F;AAC/F,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAO3D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAmB9D;AAED,qBAAa,SAAS;IAMR,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;gBAErC,QAAQ,SAAQ;IAE7C,qFAAqF;IACrF,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,MAAM,SAAI,GAAG,QAAQ;IAWjG,6EAA6E;IAC7E,IAAI,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,QAAQ,EAAE;IAMhG,6CAA6C;IAC7C,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,mCAAmC;IACnC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAMlC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;CAIzD;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,IAAI,IAAI,CAAC;CACjB;AAID;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,cAAc,CAkGpG"}