@hienlh/ppm 0.18.11 → 0.18.13

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 (571) hide show
  1. package/AGENTS.md +17 -5
  2. package/CHANGELOG.md +27 -0
  3. package/CLAUDE.md +3 -0
  4. package/README.md +87 -29
  5. package/assets/skills/ppm/SKILL.md +1 -1
  6. package/assets/skills/ppm/references/http-api.md +19 -1
  7. package/dist/web/assets/{adaptive-context-menu-DGCKKeTy.js → adaptive-context-menu-CbgPYQmj.js} +1 -1
  8. package/dist/web/assets/{ai-resource-editor-BOHHTTe7.js → ai-resource-editor-unM2HNmg.js} +1 -1
  9. package/dist/web/assets/{ai-settings-section-BigC_nZR.js → ai-settings-section-CdktdrwF.js} +1 -1
  10. package/dist/web/assets/{angular-html-BYPaydvh.js → angular-html-DcpbdcNG.js} +1 -1
  11. package/dist/web/assets/{angular-ts-Bb4AMKlk.js → angular-ts-Bv_WIk34.js} +1 -1
  12. package/dist/web/assets/api-client-BogqsFna.js +1 -0
  13. package/dist/web/assets/{api-settings-Bd3M4YpI.js → api-settings-BdCtex9i.js} +1 -1
  14. package/dist/web/assets/api-settings-DfXViPKz.js +1 -0
  15. package/dist/web/assets/{api-themes-Cpx419SL.js → api-themes-pRRoLvgD.js} +1 -1
  16. package/dist/web/assets/{apl-DB2VjFCS.js → apl-D5_lLszu.js} +1 -1
  17. package/dist/web/assets/architecture-PBZL5I3N-BzFm9ELu.js +1 -0
  18. package/dist/web/assets/{astro-BeoJdVpk.js → astro-CBHwddYL.js} +1 -1
  19. package/dist/web/assets/{audio-preview-BgFuTn-0.js → audio-preview-BD1iDovf.js} +1 -1
  20. package/dist/web/assets/{blade-Cf2q1sPf.js → blade-DGe1d2Pq.js} +1 -1
  21. package/dist/web/assets/{bsl-W1kOaNpu.js → bsl-2lyAzRJA.js} +1 -1
  22. package/dist/web/assets/{button-5zTrkEoN.js → button-2WCAS8dI.js} +1 -1
  23. package/dist/web/assets/{cairo-BoAZFcje.js → cairo-DjzZeJrq.js} +1 -1
  24. package/dist/web/assets/chat-tab-DzK8LGti.js +15 -0
  25. package/dist/web/assets/{cobol-B0Nm7RXj.js → cobol-cC3XIuAJ.js} +1 -1
  26. package/dist/web/assets/code-editor-CuMfPN9X.js +10 -0
  27. package/dist/web/assets/{coffee-BakMn3on.js → coffee-4eGboVoU.js} +1 -1
  28. package/dist/web/assets/{conflict-editor-BUs5k9q_.js → conflict-editor-DdJag4QK.js} +1 -1
  29. package/dist/web/assets/{context-menu-Bq92km4s.js → context-menu-BO1c9jKy.js} +1 -1
  30. package/dist/web/assets/{cpp-BRAJQHK2.js → cpp-DF9_G-OU.js} +1 -1
  31. package/dist/web/assets/{crystal-kqqO3zkK.js → crystal-OavZlzcm.js} +1 -1
  32. package/dist/web/assets/{csv-preview-ByoDgLAZ.js → csv-preview-DnXwouF3.js} +1 -1
  33. package/dist/web/assets/{data-grid-overlay-editor-Brkf9z41.js → data-grid-overlay-editor-B9Gpjm3l.js} +1 -1
  34. package/dist/web/assets/{database-viewer-Btc3h8Yu.js → database-viewer-Dk8oGyZx.js} +1 -1
  35. package/dist/web/assets/{dialog-DwtGlowE.js → dialog-B-l2ZxVm.js} +1 -1
  36. package/dist/web/assets/{diff-viewer-CZaDnR4w.js → diff-viewer-eaUBjLCH.js} +1 -1
  37. package/dist/web/assets/{docx-preview-DAD_vg59.js → docx-preview-DAdHPlhZ.js} +1 -1
  38. package/dist/web/assets/{edge-Cq1ZKZuE.js → edge-TzYh8OlN.js} +1 -1
  39. package/dist/web/assets/{edit-diff-preview-B_VE7ppQ.js → edit-diff-preview-DlwP3UIU.js} +1 -1
  40. package/dist/web/assets/{elixir-BM_JoJRk.js → elixir-Cy3RhKKH.js} +1 -1
  41. package/dist/web/assets/{elm-Dw7oO08Y.js → elm-BTBZdweK.js} +1 -1
  42. package/dist/web/assets/{erb-CfKOGAfk.js → erb-dv1mI0y4.js} +1 -1
  43. package/dist/web/assets/{erlang-DlDmGVeE.js → erlang-DjeiDrkl.js} +1 -1
  44. package/dist/web/assets/{esm-DGAP0GFh.js → esm-FRwvcesu.js} +1 -1
  45. package/dist/web/assets/explorer-body-DkCkSVrN.js +2 -0
  46. package/dist/web/assets/explorer-window-content-MsnTVngu.js +1 -0
  47. package/dist/web/assets/{extension-store-Cpfh2vMm.js → extension-store-DUaZINyC.js} +1 -1
  48. package/dist/web/assets/{extension-webview-B2OnjuCu.js → extension-webview-W0qRfaAU.js} +1 -1
  49. package/dist/web/assets/{file-store-aOERIEo-.js → file-store-yReVbR8q.js} +1 -1
  50. package/dist/web/assets/{fortran-fixed-form-XnAhQWxS.js → fortran-fixed-form-BCH9DAIJ.js} +1 -1
  51. package/dist/web/assets/{fsharp-CdNvy0PG.js → fsharp-C93NYKYD.js} +1 -1
  52. package/dist/web/assets/{gdresource-DxuG5i8i.js → gdresource-BcIEE2eX.js} +1 -1
  53. package/dist/web/assets/{git-commit-3lMonsur.js → git-commit-BVjlXEy8.js} +1 -1
  54. package/dist/web/assets/{git-log-panel-Co0PBPHC.js → git-log-panel-2_4HuP47.js} +1 -1
  55. package/dist/web/assets/{git-rebase-N8Z9kIMf.js → git-rebase-Bj_21B1V.js} +1 -1
  56. package/dist/web/assets/gitGraph-HDMCJU4V-B72vcb2r.js +1 -0
  57. package/dist/web/assets/glide-data-grid-B0IY6n_Q.js +138 -0
  58. package/dist/web/assets/{glimmer-js-Dp9OXiib.js → glimmer-js-C20yj4Zv.js} +1 -1
  59. package/dist/web/assets/{glimmer-ts-CDVKBcDj.js → glimmer-ts-ipbYC7kh.js} +1 -1
  60. package/dist/web/assets/{glsl-DPJxI4us.js → glsl-Dovazu3t.js} +1 -1
  61. package/dist/web/assets/{graphql-BrFhaQQl.js → graphql-DpMlM7hC.js} +1 -1
  62. package/dist/web/assets/{group-chat-tab-rOd8J8GC.js → group-chat-tab-DRLDHOp6.js} +1 -1
  63. package/dist/web/assets/{hack-BzXbDMlA.js → hack-gc7LCBuV.js} +1 -1
  64. package/dist/web/assets/{haml-CPpkX0s5.js → haml-vtlFm9gm.js} +1 -1
  65. package/dist/web/assets/{handlebars-BqrApy52.js → handlebars-DGKhpCji.js} +1 -1
  66. package/dist/web/assets/{html-DmjUl-OA.js → html-DvfhQbXb.js} +1 -1
  67. package/dist/web/assets/{html-derivative-Cnd6XFR5.js → html-derivative-C3oTSSCN.js} +1 -1
  68. package/dist/web/assets/{http-DMLWYun2.js → http-SG6zLTo7.js} +1 -1
  69. package/dist/web/assets/{hurl-CKkCVxbj.js → hurl-BWXsYlqW.js} +1 -1
  70. package/dist/web/assets/{hxml-CAx19TtQ.js → hxml-DUdMzaoh.js} +1 -1
  71. package/dist/web/assets/{image-preview-DHUoylQ1.js → image-preview-DxgFOV1T.js} +1 -1
  72. package/dist/web/assets/index-CBn4SOoT.js +52 -0
  73. package/dist/web/assets/index-DWpNR3nB.css +2 -0
  74. package/dist/web/assets/info-3K5VOQVL-3irPxRK_.js +1 -0
  75. package/dist/web/assets/{input-DcEk7mA3.js → input-DuAF-Stj.js} +1 -1
  76. package/dist/web/assets/{jinja-BmB9YN9l.js → jinja-955w9RKM.js} +1 -1
  77. package/dist/web/assets/{jison-BaVsKKpw.js → jison-WWfqPo50.js} +1 -1
  78. package/dist/web/assets/{julia-BgVBLveX.js → julia-BFrfnaNl.js} +1 -1
  79. package/dist/web/assets/{just-C2ENIbl9.js → just-BrZdyR_I.js} +1 -1
  80. package/dist/web/assets/{keybindings-store-BGIyqXHI.js → keybindings-store-0Wqfa7Qp.js} +1 -1
  81. package/dist/web/assets/keybindings-store-d54pv2NK.js +1 -0
  82. package/dist/web/assets/{latex-BiDIWxKL.js → latex-CwtPPASD.js} +1 -1
  83. package/dist/web/assets/{liquid-NxpapreE.js → liquid-CYZuvDDd.js} +1 -1
  84. package/dist/web/assets/{lua-DVepQvwH.js → lua-BV095ZyY.js} +1 -1
  85. package/dist/web/assets/markdown-renderer-BTS8ifdu.js +1 -0
  86. package/dist/web/assets/{markdown-renderer-DlcDhgrF.js → markdown-renderer-CnRcKK3d.js} +3 -3
  87. package/dist/web/assets/{marko-CJ2606Xl.js → marko-CNeljZ1C.js} +1 -1
  88. package/dist/web/assets/{mdc-D2bjqclE.js → mdc-JfGapShy.js} +1 -1
  89. package/dist/web/assets/{media-url-H17XJF-I.js → media-url-Bm4PsduE.js} +1 -1
  90. package/dist/web/assets/{mobile-bottom-sheet-g-r2hCFa.js → mobile-bottom-sheet-M5iZDX7y.js} +1 -1
  91. package/dist/web/assets/mobile-explorer-sheet-BqK2-WuN.js +1 -0
  92. package/dist/web/assets/{nextflow-BtJwUbfF.js → nextflow-DD5C8nqX.js} +1 -1
  93. package/dist/web/assets/{nginx-j4gyIhHE.js → nginx-Ca7B__x_.js} +1 -1
  94. package/dist/web/assets/{nim-ClH_gjP5.js → nim-B8FogsDw.js} +1 -1
  95. package/dist/web/assets/notification-store-Yvy1I8gd.js +1 -0
  96. package/dist/web/assets/{number-overlay-editor-C1EqJnWq.js → number-overlay-editor-DG9xJwEG.js} +1 -1
  97. package/dist/web/assets/{overview-panel-vTeeJYVZ.js → overview-panel-s53bnl0q.js} +1 -1
  98. package/dist/web/assets/packet-RMMSAZCW-Z5jWjFCV.js +1 -0
  99. package/dist/web/assets/{panel-store-BSnkjgHt.js → panel-store-B4rijFKN.js} +1 -1
  100. package/dist/web/assets/{pdf-preview-CqFGRY0Z.js → pdf-preview-DYt3aBzM.js} +1 -1
  101. package/dist/web/assets/{perl-C9H7X7CT.js → perl-BR78hS8R.js} +1 -1
  102. package/dist/web/assets/{php-Bx2U-cQ_.js → php-DXBOMC9z.js} +1 -1
  103. package/dist/web/assets/pie-UPGHQEXC-Bq7UMi8P.js +1 -0
  104. package/dist/web/assets/{postgres-viewer-DHwcQucn.js → postgres-viewer-BvoWSuoZ.js} +3 -3
  105. package/dist/web/assets/{process-table-BGRJNlpn.js → process-table-BYwKigiD.js} +1 -1
  106. package/dist/web/assets/{project-store--nvQiy75.js → project-store-BuY7rxn_.js} +1 -1
  107. package/dist/web/assets/{pug-Cw74sKsE.js → pug-CvTwVVKV.js} +1 -1
  108. package/dist/web/assets/{qml-BXD94Eqz.js → qml-CPSoZ1-B.js} +1 -1
  109. package/dist/web/assets/radar-KQ55EAFF-BLo4BOTD.js +1 -0
  110. package/dist/web/assets/{razor-DZ0-Ge0S.js → razor-BUA1YKtF.js} +1 -1
  111. package/dist/web/assets/{rst-Dtdh0QUj.js → rst-BJsq7ISz.js} +1 -1
  112. package/dist/web/assets/{ruby-BC51BW2Q.js → ruby-DSDMeYf5.js} +1 -1
  113. package/dist/web/assets/{run-in-terminal-Sd3KyjN4.js → run-in-terminal-C9xpskFn.js} +1 -1
  114. package/dist/web/assets/{sas-BN8i4qOU.js → sas-B1nJOjbN.js} +1 -1
  115. package/dist/web/assets/{scroll-area-0gljZ6lF.js → scroll-area-DBcG1fQo.js} +1 -1
  116. package/dist/web/assets/{scss-H-QtA7Rz.js → scss-BZFyRiQn.js} +1 -1
  117. package/dist/web/assets/{send-to-chat-u6m8l-rH.js → send-to-chat-BIg70MUZ.js} +1 -1
  118. package/dist/web/assets/{settings-store-CHY6Kzin.js → settings-store-GV5pkkke.js} +2 -2
  119. package/dist/web/assets/{settings-tab-IY6K1MiZ.js → settings-tab-BePvIcjd.js} +1 -1
  120. package/dist/web/assets/settings-tab-Br-lJSPa.js +1 -0
  121. package/dist/web/assets/{shaderlab-CalNsj_x.js → shaderlab-laINRXBo.js} +1 -1
  122. package/dist/web/assets/{shellsession-BFrcoR8x.js → shellsession-BpOOvWVR.js} +1 -1
  123. package/dist/web/assets/{soy-CNbku7vP.js → soy-BW4d91Sa.js} +1 -1
  124. package/dist/web/assets/{sparql-BN_orcVp.js → sparql-BsvvyoHn.js} +1 -1
  125. package/dist/web/assets/{sql-query-editor-C6pC3I8l.js → sql-query-editor-qQce5QJ6.js} +1 -1
  126. package/dist/web/assets/{sqlite-viewer-DTr5PzUb.js → sqlite-viewer-yhc0YNvu.js} +1 -1
  127. package/dist/web/assets/{stata-C6a5Ijzq.js → stata-K-dZInUt.js} +1 -1
  128. package/dist/web/assets/{surrealql-ClplI_HY.js → surrealql-CpNp2sgf.js} +1 -1
  129. package/dist/web/assets/{svelte-DNm-UNXB.js → svelte-BG6iBA8R.js} +1 -1
  130. package/dist/web/assets/{switch-DKvKya9y.js → switch-_NcrktLe.js} +1 -1
  131. package/dist/web/assets/system-monitor-body-D8Z5QXBB.js +2 -0
  132. package/dist/web/assets/system-monitor-tab-BclYXFTe.js +1 -0
  133. package/dist/web/assets/{system-monitor-window-content-BUqRsPK2.js → system-monitor-window-content-CaOhD0AU.js} +1 -1
  134. package/dist/web/assets/{tab-host-window-content-BnqGPu8a.js → tab-host-window-content-f_Rc5rJK.js} +1 -1
  135. package/dist/web/assets/{tab-store-CJuJRapl.js → tab-store-tFnyPmm4.js} +1 -1
  136. package/dist/web/assets/team-member-sheet-QDHoYCs0.js +2 -0
  137. package/dist/web/assets/{team-member-window-content-T4Q5JI-G.js → team-member-window-content-B1jkKkDi.js} +1 -1
  138. package/dist/web/assets/{templ-CSdqVobu.js → templ-gxNKXmt3.js} +1 -1
  139. package/dist/web/assets/{terminal-tab-Bb2rZegQ.js → terminal-tab-UvwM0sty.js} +3 -3
  140. package/dist/web/assets/{tex-DzSJ4kcZ.js → tex-C0ON27g5.js} +1 -1
  141. package/dist/web/assets/{tool-cards-lhqhrDTT.js → tool-cards-jB7GT-wj.js} +4 -4
  142. package/dist/web/assets/treemap-KZPCXAKY-dyrE6SW2.js +1 -0
  143. package/dist/web/assets/{ts-tags-C28w3bTg.js → ts-tags-BX_CTVgQ.js} +1 -1
  144. package/dist/web/assets/{twig-i5jY3QXB.js → twig-CwL7XnU0.js} +1 -1
  145. package/dist/web/assets/{use-blob-url-Dsq9OjTh.js → use-blob-url-DcRcjNTE.js} +1 -1
  146. package/dist/web/assets/use-coarse-long-press-BmI_GVW5.js +1 -0
  147. package/dist/web/assets/{use-monaco-theme-BZvlsoBv.js → use-monaco-theme--9tOOkDA.js} +1 -1
  148. package/dist/web/assets/{use-open-team-member-DkiEjFYE.js → use-open-team-member-1hRsHLKg.js} +1 -1
  149. package/dist/web/assets/{use-websocket-B8R50f7f.js → use-websocket-rxJLbFqy.js} +1 -1
  150. package/dist/web/assets/{vendor-mermaid-By4AVvJY.js → vendor-mermaid-CHTa6D69.js} +1 -1
  151. package/dist/web/assets/video-preview-DMhnf2Gi.js +1 -0
  152. package/dist/web/assets/{vue-Ceyet_lv.js → vue-Bykm6wSS.js} +1 -1
  153. package/dist/web/assets/{vue-html-GuU7g_hg.js → vue-html-CETdK_iV.js} +1 -1
  154. package/dist/web/assets/{vue-vine-CxXoaJr2.js → vue-vine-DiJb6fO5.js} +1 -1
  155. package/dist/web/assets/{window-store-CsEW6jiE.js → window-store-CQ1lghvv.js} +1 -1
  156. package/dist/web/assets/{xml-CbqOVhkP.js → xml-BNw8J5YW.js} +1 -1
  157. package/dist/web/assets/{xsl-KfAmCauy.js → xsl-CsG9L31b.js} +1 -1
  158. package/dist/web/index.html +46 -45
  159. package/dist/web/sw.js +1 -1
  160. package/docs/architecture/ai-chat-and-providers.md +309 -0
  161. package/docs/architecture/data-and-storage.md +356 -0
  162. package/docs/architecture/extensions.md +496 -0
  163. package/docs/architecture/integrations.md +214 -0
  164. package/docs/architecture/workspace-and-ui.md +391 -0
  165. package/docs/claude-agent-sdk-reference.md +1 -1
  166. package/docs/code-patterns.md +361 -0
  167. package/docs/code-standards.md +8 -358
  168. package/docs/codebase-subsystems.md +364 -0
  169. package/docs/codebase-summary.md +34 -379
  170. package/docs/deployment-guide.md +280 -490
  171. package/docs/design-guidelines.md +1 -1
  172. package/docs/lessons-learned.md +27 -10
  173. package/docs/project-changelog.md +18 -806
  174. package/docs/project-overview-pdr.md +117 -111
  175. package/docs/project-roadmap.md +89 -133
  176. package/docs/system-architecture.md +77 -1826
  177. package/package.json +2 -2
  178. package/src/cli/commands/autostart.ts +2 -2
  179. package/src/cli/commands/config-cmd.ts +12 -3
  180. package/src/cli/commands/status.ts +3 -2
  181. package/src/cli/commands/stop.ts +32 -4
  182. package/src/server/index.ts +17 -3
  183. package/src/server/routes/chat-unread.ts +36 -0
  184. package/src/server/routes/named-tunnel.ts +132 -0
  185. package/src/server/routes/tunnel.ts +13 -0
  186. package/src/server/ws/chat.ts +5 -2
  187. package/src/services/autostart-register.ts +47 -29
  188. package/src/services/cloud.service.ts +26 -1
  189. package/src/services/config-secret-keys.ts +48 -0
  190. package/src/services/config.service.ts +1 -1
  191. package/src/services/db.service.ts +62 -12
  192. package/src/services/extension-rpc-handlers.ts +9 -1
  193. package/src/services/file-watcher/watch-tree.ts +67 -33
  194. package/src/services/file-watcher.service.ts +28 -10
  195. package/src/services/fs-credential-path-guard.ts +103 -0
  196. package/src/services/fs-path-guard.service.ts +14 -66
  197. package/src/services/named-tunnel/cloudflare-dns-api.ts +40 -0
  198. package/src/services/named-tunnel/cloudflare-zone-api.ts +28 -0
  199. package/src/services/named-tunnel/cloudflared-cert.ts +95 -0
  200. package/src/services/named-tunnel/cloudflared-exec.ts +50 -0
  201. package/src/services/named-tunnel/cloudflared-login-helpers.ts +98 -0
  202. package/src/services/named-tunnel/cloudflared-login.service.ts +182 -0
  203. package/src/services/named-tunnel/hostname-rules.ts +58 -0
  204. package/src/services/named-tunnel/login-output-parser.ts +36 -0
  205. package/src/services/named-tunnel/named-tunnel-args.ts +110 -0
  206. package/src/services/named-tunnel/named-tunnel-config.ts +67 -0
  207. package/src/services/named-tunnel/named-tunnel-probe-state.ts +95 -0
  208. package/src/services/named-tunnel/named-tunnel-readiness.ts +59 -0
  209. package/src/services/named-tunnel/named-tunnel-runtime.ts +42 -0
  210. package/src/services/named-tunnel/named-tunnel-setup-confirm.ts +98 -0
  211. package/src/services/named-tunnel/named-tunnel-setup.service.ts +191 -0
  212. package/src/services/supervisor-state.ts +67 -2
  213. package/src/services/supervisor.ts +454 -157
  214. package/src/services/tunnel-registry-parse.ts +27 -0
  215. package/src/services/tunnel-registry.service.ts +2 -15
  216. package/src/services/tunnel.service.ts +12 -3
  217. package/src/types/config.ts +31 -0
  218. package/src/web/app.tsx +5 -0
  219. package/src/web/components/chat/chat-history-bar.tsx +95 -98
  220. package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +57 -0
  221. package/src/web/components/chat/session-debug-dialog.tsx +35 -27
  222. package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +111 -0
  223. package/src/web/components/layout/cloud-share-popover.tsx +56 -14
  224. package/src/web/components/shared/connection-lost-overlay.tsx +44 -5
  225. package/src/web/components/tunnels/named-tunnel/hostname-validation.ts +14 -0
  226. package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +96 -0
  227. package/src/web/components/tunnels/named-tunnel/named-tunnel-hostname-field.tsx +51 -0
  228. package/src/web/components/tunnels/named-tunnel/named-tunnel-login-step.tsx +105 -0
  229. package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +159 -0
  230. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +197 -0
  231. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +57 -0
  232. package/src/web/components/tunnels/named-tunnel/named-tunnel-step-reducer.ts +191 -0
  233. package/src/web/components/tunnels/named-tunnel/use-named-tunnel-setup.ts +212 -0
  234. package/src/web/components/tunnels/tunnel-manager-tab.tsx +4 -0
  235. package/src/web/hooks/use-global-events.ts +3 -1
  236. package/src/web/lib/api-named-tunnel.ts +54 -0
  237. package/src/web/lib/last-known-local-url.ts +23 -0
  238. package/src/web/stores/notification-store.ts +20 -1
  239. package/.spike/cdp-client.ts +0 -116
  240. package/.spike/cleanup-ppm-workspace.mjs +0 -44
  241. package/.spike/group-protected-probe.ts +0 -21
  242. package/.spike/pip-eval.ts +0 -17
  243. package/.spike/pip-page-helpers.js +0 -119
  244. package/.spike/pip-results-editor-glue.json +0 -105
  245. package/.spike/pip-results-editor.json +0 -158
  246. package/.spike/pip-results-input-isolation.json +0 -28
  247. package/.spike/pip-results-key-probe.json +0 -58
  248. package/.spike/pip-results-listener-survival.json +0 -98
  249. package/.spike/pip-results-listeners.json +0 -36
  250. package/.spike/pip-results-pagehide.json +0 -92
  251. package/.spike/pip-results-resize.json +0 -104
  252. package/.spike/pip-results-terminal-debug.json +0 -99
  253. package/.spike/pip-results-terminal-v2.json +0 -191
  254. package/.spike/pip-results-terminal.json +0 -220
  255. package/.spike/pip-results-xterm-trace.json +0 -73
  256. package/.spike/pip-spike-common.ts +0 -83
  257. package/.spike/pip-spike-editor-glue.ts +0 -82
  258. package/.spike/pip-spike-editor.ts +0 -129
  259. package/.spike/pip-spike-input-isolation.ts +0 -38
  260. package/.spike/pip-spike-key-probe.ts +0 -34
  261. package/.spike/pip-spike-listener-survival.ts +0 -54
  262. package/.spike/pip-spike-listeners.ts +0 -19
  263. package/.spike/pip-spike-pagehide.ts +0 -59
  264. package/.spike/pip-spike-resize.ts +0 -42
  265. package/.spike/pip-spike-setup.ts +0 -63
  266. package/.spike/pip-spike-terminal-debug.ts +0 -81
  267. package/.spike/pip-spike-terminal-v2.ts +0 -139
  268. package/.spike/pip-spike-terminal.ts +0 -169
  269. package/.spike/pip-spike-xterm-trace.ts +0 -36
  270. package/.spike/probe-drag-memo-error.mjs +0 -67
  271. package/.spike/read-dev-db.ts +0 -15
  272. package/.spike/s.err +0 -63
  273. package/.spike/scratch-editor-target.ts +0 -7
  274. package/.spike/smoke-unified-chrome-pip.mjs +0 -353
  275. package/.spike/tunnel.err +0 -63
  276. package/.spike/vite-restart.err +0 -663
  277. package/.spike/w.err +0 -571
  278. package/dist/web/assets/api-client-DTZEgjBQ.js +0 -1
  279. package/dist/web/assets/api-settings-kd1j4iR8.js +0 -1
  280. package/dist/web/assets/architecture-PBZL5I3N-8dCMT9r7.js +0 -1
  281. package/dist/web/assets/chat-tab-E3bf_V8X.js +0 -15
  282. package/dist/web/assets/code-editor-BUlM2gXk.js +0 -10
  283. package/dist/web/assets/explorer-body-9aBmyVpZ.js +0 -2
  284. package/dist/web/assets/explorer-window-content-DRtqoSPA.js +0 -1
  285. package/dist/web/assets/gitGraph-HDMCJU4V-2e_8dfbs.js +0 -1
  286. package/dist/web/assets/glide-data-grid-C4_zIneN.js +0 -138
  287. package/dist/web/assets/index-BImUaigO.js +0 -52
  288. package/dist/web/assets/index-CSfi6DSU.css +0 -2
  289. package/dist/web/assets/info-3K5VOQVL-BZi1Gha1.js +0 -1
  290. package/dist/web/assets/keybindings-store-CzV2sPls.js +0 -1
  291. package/dist/web/assets/markdown-renderer-CcbR33VG.js +0 -1
  292. package/dist/web/assets/mobile-explorer-sheet-SIwQXlwA.js +0 -1
  293. package/dist/web/assets/notification-store-DV5QtUTg.js +0 -1
  294. package/dist/web/assets/packet-RMMSAZCW-o5htEcin.js +0 -1
  295. package/dist/web/assets/pie-UPGHQEXC-BXAIFSAD.js +0 -1
  296. package/dist/web/assets/radar-KQ55EAFF-Dbt2Aebl.js +0 -1
  297. package/dist/web/assets/settings-tab-Dic6TKkU.js +0 -1
  298. package/dist/web/assets/system-monitor-body-iwGiCns9.js +0 -2
  299. package/dist/web/assets/system-monitor-tab-DdXQhEel.js +0 -1
  300. package/dist/web/assets/team-member-sheet-LkAFSCvb.js +0 -2
  301. package/dist/web/assets/treemap-KZPCXAKY-DUbnl9dz.js +0 -1
  302. package/dist/web/assets/video-preview-m0-3p7QZ.js +0 -1
  303. /package/dist/web/assets/{abap-C6nB04tn.js → abap-DGlrX_8G.js} +0 -0
  304. /package/dist/web/assets/{actionscript-3-Vx4rw2sC.js → actionscript-3-CUqRtUJE.js} +0 -0
  305. /package/dist/web/assets/{ada-Ccd8vM20.js → ada-CY3Spa33.js} +0 -0
  306. /package/dist/web/assets/{andromeeda-DnBX5xMg.js → andromeeda-Lxs2TJn7.js} +0 -0
  307. /package/dist/web/assets/{apache-B-9_sx0g.js → apache-DfxgGdgM.js} +0 -0
  308. /package/dist/web/assets/{apex-_wPVBYoL.js → apex-QVDF1dnI.js} +0 -0
  309. /package/dist/web/assets/{api-client-aQb5hHE5.js → api-client-oY1tC3tM.js} +0 -0
  310. /package/dist/web/assets/{applescript-CcvD-qr0.js → applescript-pwJ8QXh-.js} +0 -0
  311. /package/dist/web/assets/{apply-theme-BeLRfsSu.js → apply-theme-B_bMVL6a.js} +0 -0
  312. /package/dist/web/assets/{ara-C40Ztoms.js → ara-mPjeX5YX.js} +0 -0
  313. /package/dist/web/assets/{asciidoc-CybYkJV4.js → asciidoc-Bf7LsDkI.js} +0 -0
  314. /package/dist/web/assets/{asm-9eOKwzR0.js → asm-rRKC1OUx.js} +0 -0
  315. /package/dist/web/assets/{aurora-x-B5ZH4t7t.js → aurora-x-DwQr0DkG.js} +0 -0
  316. /package/dist/web/assets/{awk-Dqilob-2.js → awk-Bpt768fN.js} +0 -0
  317. /package/dist/web/assets/{ayu-dark-CPgRhf5r.js → ayu-dark-D9lwQHMs.js} +0 -0
  318. /package/dist/web/assets/{ayu-light-Do06Q52f.js → ayu-light-B4-ptrU5.js} +0 -0
  319. /package/dist/web/assets/{ayu-mirage-_BhxcrxY.js → ayu-mirage-DAyRzH5Q.js} +0 -0
  320. /package/dist/web/assets/{ballerina-DDwK54QW.js → ballerina-Cgdpj1HC.js} +0 -0
  321. /package/dist/web/assets/{bat-BGyGlzGk.js → bat-4FrN36S2.js} +0 -0
  322. /package/dist/web/assets/{beancount-CRWBdapI.js → beancount-DkcxQER3.js} +0 -0
  323. /package/dist/web/assets/{berry-DbSFn2gO.js → berry-Dnuut-Ml.js} +0 -0
  324. /package/dist/web/assets/{bibtex-QpsV9gm9.js → bibtex-CCDwmbuA.js} +0 -0
  325. /package/dist/web/assets/{bicep-CxS8CUve.js → bicep-BC0ryoGM.js} +0 -0
  326. /package/dist/web/assets/{bird2-CuZhQzYR.js → bird2-C50V_A-0.js} +0 -0
  327. /package/dist/web/assets/{c-9bnDqE3g.js → c-Ddorhq0U.js} +0 -0
  328. /package/dist/web/assets/{c3-JMZTrOhA.js → c3-DdIf5r9E.js} +0 -0
  329. /package/dist/web/assets/{cadence-DsDNayJS.js → cadence-s9pd1Wng.js} +0 -0
  330. /package/dist/web/assets/{can-open-in-ppm-BJfpynya.js → can-open-in-ppm-C6hZV1OP.js} +0 -0
  331. /package/dist/web/assets/{catppuccin-frappe-DYIKXXBe.js → catppuccin-frappe-CzJNTyu-.js} +0 -0
  332. /package/dist/web/assets/{catppuccin-latte-IYYOnUJ8.js → catppuccin-latte-BNpt-m7s.js} +0 -0
  333. /package/dist/web/assets/{catppuccin-macchiato-BrJ_7mfS.js → catppuccin-macchiato-FYGkfsJ5.js} +0 -0
  334. /package/dist/web/assets/{catppuccin-mocha-gzSu7v7-.js → catppuccin-mocha-it2g5D1q.js} +0 -0
  335. /package/dist/web/assets/{clarity-DLzsC0Hb.js → clarity-BVFBTjMe.js} +0 -0
  336. /package/dist/web/assets/{clipboard-7fw0Shic.js → clipboard-BWznymz7.js} +0 -0
  337. /package/dist/web/assets/{clojure-DS1BvoTt.js → clojure-BSYvXMI8.js} +0 -0
  338. /package/dist/web/assets/{cmake-CDvsJwYp.js → cmake-DGEqH-Np.js} +0 -0
  339. /package/dist/web/assets/{codeowners-BjsYiflJ.js → codeowners-D8FCOxWg.js} +0 -0
  340. /package/dist/web/assets/{codeql-CG-7ARat.js → codeql-COV0eluG.js} +0 -0
  341. /package/dist/web/assets/{common-lisp-DSO1Lbh9.js → common-lisp-xHnZUlgt.js} +0 -0
  342. /package/dist/web/assets/{coq-DYdh3oP_.js → coq-Cs_2i3Xg.js} +0 -0
  343. /package/dist/web/assets/{csharp-DxEBz5s0.js → csharp-B1ONB4PT.js} +0 -0
  344. /package/dist/web/assets/{css-dal3Q-8C.js → css-BgGQbvrZ.js} +0 -0
  345. /package/dist/web/assets/{csv-CpqjMGiA.js → csv-CNHmQBzs.js} +0 -0
  346. /package/dist/web/assets/{csv-parser-3umBA4NY.js → csv-parser-DWR24J17.js} +0 -0
  347. /package/dist/web/assets/{cue-DinoJ_5k.js → cue-ZXAKzwIy.js} +0 -0
  348. /package/dist/web/assets/{cypher-DzxqmkUW.js → cypher-4PL5bmT5.js} +0 -0
  349. /package/dist/web/assets/{d-BxNwJuEC.js → d-CEsV3RT2.js} +0 -0
  350. /package/dist/web/assets/{dark-plus-Clmv3V-0.js → dark-plus-NtFnYSDz.js} +0 -0
  351. /package/dist/web/assets/{dart-BWVtXD35.js → dart-CKHn4mDf.js} +0 -0
  352. /package/dist/web/assets/{data-grid-types-B4n51Fck.js → data-grid-types-CxU8oo-j.js} +0 -0
  353. /package/dist/web/assets/{dax-DsImuWgJ.js → dax-Cmkj1I_M.js} +0 -0
  354. /package/dist/web/assets/{desktop-B0jJuG2r.js → desktop-DJLalvPQ.js} +0 -0
  355. /package/dist/web/assets/{diff-CWqAAxoE.js → diff-BnS2wpj6.js} +0 -0
  356. /package/dist/web/assets/{dist-C0eNNfbt.js → dist-CuIdRyUB.js} +0 -0
  357. /package/dist/web/assets/{dist-B-EXdSYE.js → dist-uYjs3Wv6.js} +0 -0
  358. /package/dist/web/assets/{docker-CYFCJdIL.js → docker-CovNy7ml.js} +0 -0
  359. /package/dist/web/assets/{dotenv-CKDUjURg.js → dotenv-Gh4w3I6B.js} +0 -0
  360. /package/dist/web/assets/{dracula-CSoPspHE.js → dracula-NF0tAHXl.js} +0 -0
  361. /package/dist/web/assets/{dracula-soft-BuFjw5L1.js → dracula-soft-Cj_qBurK.js} +0 -0
  362. /package/dist/web/assets/{dream-maker-B6PdDRZu.js → dream-maker-CRuZPcl7.js} +0 -0
  363. /package/dist/web/assets/{emacs-lisp-CMcXvD0G.js → emacs-lisp-BACmC9qj.js} +0 -0
  364. /package/dist/web/assets/{everforest-dark-cU8-wYzi.js → everforest-dark-Dd9av4QG.js} +0 -0
  365. /package/dist/web/assets/{everforest-light-KhorllqK.js → everforest-light-C-jsss-B.js} +0 -0
  366. /package/dist/web/assets/{external-link-B8BynhvY.js → external-link-B6Hl0U4X.js} +0 -0
  367. /package/dist/web/assets/{fennel-BCELZK87.js → fennel-BJA9XnL8.js} +0 -0
  368. /package/dist/web/assets/{file-exclamation-point-CZ4DiR75.js → file-exclamation-point-JzhTU2TX.js} +0 -0
  369. /package/dist/web/assets/{fish-BQc0y_jy.js → fish-CKlhNSc2.js} +0 -0
  370. /package/dist/web/assets/{fluent-BTINnwF6.js → fluent-wfglRk5D.js} +0 -0
  371. /package/dist/web/assets/{folder-symlink-B8XrtvQK.js → folder-symlink-Dx1hOk8X.js} +0 -0
  372. /package/dist/web/assets/{format-bytes-WVcFxJuT.js → format-bytes-utwHMTry.js} +0 -0
  373. /package/dist/web/assets/{fortran-free-form-BQim9wDz.js → fortran-free-form-BlXCdid3.js} +0 -0
  374. /package/dist/web/assets/{gdscript-03w5u8un.js → gdscript-BwAVG6Et.js} +0 -0
  375. /package/dist/web/assets/{gdshader-Dp2daNzU.js → gdshader-DPc_T7ib.js} +0 -0
  376. /package/dist/web/assets/{genie-CoNcjPiD.js → genie-B-zZSLCX.js} +0 -0
  377. /package/dist/web/assets/{gherkin-NrPOSPQL.js → gherkin-CJ0ajpGs.js} +0 -0
  378. /package/dist/web/assets/{github-dark-z4RE9ZqA.js → github-dark-Dz8ZkzSP.js} +0 -0
  379. /package/dist/web/assets/{github-dark-default-DOKw-1cI.js → github-dark-default-CNUYo_kp.js} +0 -0
  380. /package/dist/web/assets/{github-dark-dimmed-DJRNMkEA.js → github-dark-dimmed-241z_Ycx.js} +0 -0
  381. /package/dist/web/assets/{github-dark-high-contrast-Bj7jJ_Gs.js → github-dark-high-contrast-7r6yZZYH.js} +0 -0
  382. /package/dist/web/assets/{github-light-B4k_yMFu.js → github-light-C8gmZn-D.js} +0 -0
  383. /package/dist/web/assets/{github-light-default-BHc-Uzhs.js → github-light-default-GAEgq1eA.js} +0 -0
  384. /package/dist/web/assets/{github-light-high-contrast-CHisIywL.js → github-light-high-contrast-3z91352E.js} +0 -0
  385. /package/dist/web/assets/{gleam-CfbypZ4q.js → gleam-C7vxW5zd.js} +0 -0
  386. /package/dist/web/assets/{gn-YoAjyhJa.js → gn-CyJIXwHP.js} +0 -0
  387. /package/dist/web/assets/{gnuplot-xVkc1f1c.js → gnuplot-CqLbGgPd.js} +0 -0
  388. /package/dist/web/assets/{go-GPCwP3Gu.js → go-DdDcK9aX.js} +0 -0
  389. /package/dist/web/assets/{groovy-Crh4Yww9.js → groovy-UYHggEqH.js} +0 -0
  390. /package/dist/web/assets/{gruvbox-dark-hard-BluUFuDS.js → gruvbox-dark-hard-B4ierkJn.js} +0 -0
  391. /package/dist/web/assets/{gruvbox-dark-medium-Cxk1FWQp.js → gruvbox-dark-medium-DYwkDSZ6.js} +0 -0
  392. /package/dist/web/assets/{gruvbox-dark-soft-CHXMiFmj.js → gruvbox-dark-soft-CVL4P-Lz.js} +0 -0
  393. /package/dist/web/assets/{gruvbox-light-hard-B6eKPjAD.js → gruvbox-light-hard-BJ0LewUZ.js} +0 -0
  394. /package/dist/web/assets/{gruvbox-light-medium-pDwMm1ut.js → gruvbox-light-medium-CaqqjeGJ.js} +0 -0
  395. /package/dist/web/assets/{gruvbox-light-soft-Cxu6kHqK.js → gruvbox-light-soft-ByKMoVNr.js} +0 -0
  396. /package/dist/web/assets/{haskell-C6JKHjbK.js → haskell-BilYRVPp.js} +0 -0
  397. /package/dist/web/assets/{haxe-BuBNdF0a.js → haxe-Brs9Bj1s.js} +0 -0
  398. /package/dist/web/assets/{hcl-DZpDdGj2.js → hcl-ClrZpol-.js} +0 -0
  399. /package/dist/web/assets/{hjson-CBkhYRuo.js → hjson-9PvHnYMX.js} +0 -0
  400. /package/dist/web/assets/{hlsl-C5nMxnp9.js → hlsl-BbBk4vqV.js} +0 -0
  401. /package/dist/web/assets/{horizon-VAFvA6R6.js → horizon-E5Py0cny.js} +0 -0
  402. /package/dist/web/assets/{horizon-bright-BC0xn7T3.js → horizon-bright-DVCsNGEk.js} +0 -0
  403. /package/dist/web/assets/{houston-BxrUivmz.js → houston-JdFEax9Y.js} +0 -0
  404. /package/dist/web/assets/{hy-DLtOXoaH.js → hy-W_W3tLKT.js} +0 -0
  405. /package/dist/web/assets/{image-gallery-Gnf7TdCR.js → image-gallery-5IURd6db.js} +0 -0
  406. /package/dist/web/assets/{imba-BdpFXM2W.js → imba-CfAqJz7T.js} +0 -0
  407. /package/dist/web/assets/{ini-BInJO_T0.js → ini-C_3gvKWs.js} +0 -0
  408. /package/dist/web/assets/{java-Dxuddnkb.js → java-CKqtXZ-j.js} +0 -0
  409. /package/dist/web/assets/{javascript-CVamJfLY.js → javascript-C7gSEfae.js} +0 -0
  410. /package/dist/web/assets/{json-BLZ0ozYk.js → json-BoN6e11T.js} +0 -0
  411. /package/dist/web/assets/{json5-BnXzmMKs.js → json5-CgE7C8HW.js} +0 -0
  412. /package/dist/web/assets/{jsonc-CSgkSga7.js → jsonc-DjyoattY.js} +0 -0
  413. /package/dist/web/assets/{jsonl-CY5W2nF2.js → jsonl-lI82wGSw.js} +0 -0
  414. /package/dist/web/assets/{jsonnet-CEJYH3sF.js → jsonnet-CszEI8va.js} +0 -0
  415. /package/dist/web/assets/{jssm-CsJc7Uhk.js → jssm-CZXDlszb.js} +0 -0
  416. /package/dist/web/assets/{jsx-jCiRaHU7.js → jsx-BeRz0eEz.js} +0 -0
  417. /package/dist/web/assets/{kanagawa-dragon-DfoA_GxX.js → kanagawa-dragon-BOmnUiyd.js} +0 -0
  418. /package/dist/web/assets/{kanagawa-lotus-BOLYJpWd.js → kanagawa-lotus-ffU_P5w-.js} +0 -0
  419. /package/dist/web/assets/{kanagawa-wave-DfKlbT1G.js → kanagawa-wave-DKTJZrMu.js} +0 -0
  420. /package/dist/web/assets/{kdl-CmssIFTi.js → kdl-BWECJveH.js} +0 -0
  421. /package/dist/web/assets/{kotlin-BRsNgp6x.js → kotlin-DpVwBCSt.js} +0 -0
  422. /package/dist/web/assets/{kusto-T8X9jUab.js → kusto-BgVqjUZA.js} +0 -0
  423. /package/dist/web/assets/{laserwave-DkJMVJ8Z.js → laserwave-CEVCi8em.js} +0 -0
  424. /package/dist/web/assets/{lean-C65KGVPq.js → lean-CGyfRhLJ.js} +0 -0
  425. /package/dist/web/assets/{less-exIPdDlf.js → less-B0_H10Ku.js} +0 -0
  426. /package/dist/web/assets/{lib-mC1NZfuw.js → lib-hrC3bruJ.js} +0 -0
  427. /package/dist/web/assets/{libesm-DSutUtl1.js → libesm-DVpFmwJu.js} +0 -0
  428. /package/dist/web/assets/{light-plus-DiHUXAZt.js → light-plus-DqzMqPID.js} +0 -0
  429. /package/dist/web/assets/{llvm-CJBnEzFM.js → llvm-9ucnfNiF.js} +0 -0
  430. /package/dist/web/assets/{loader-circle-gSPVxfvH.js → loader-circle-Dpqcv0eS.js} +0 -0
  431. /package/dist/web/assets/{lock-Did-87UV.js → lock-DldbT31x.js} +0 -0
  432. /package/dist/web/assets/{log-DxMyUMuP.js → log-m6A2dOSj.js} +0 -0
  433. /package/dist/web/assets/{logo-CC9NKzca.js → logo-ByPcsC9P.js} +0 -0
  434. /package/dist/web/assets/{luau-Bw10I6zf.js → luau-DFCo8nBn.js} +0 -0
  435. /package/dist/web/assets/{make-C_6M90m6.js → make-C90w3MeA.js} +0 -0
  436. /package/dist/web/assets/{markdown-bR9_R-LF.js → markdown-DT0uywZG.js} +0 -0
  437. /package/dist/web/assets/{material-theme-BUx2Qujn.js → material-theme-BVUO93tJ.js} +0 -0
  438. /package/dist/web/assets/{material-theme-darker-CRJrPgKm.js → material-theme-darker-xXgGDwnF.js} +0 -0
  439. /package/dist/web/assets/{material-theme-lighter-CUAYppPa.js → material-theme-lighter-BjStPzWB.js} +0 -0
  440. /package/dist/web/assets/{material-theme-ocean-DuINF1fg.js → material-theme-ocean-wFmSiKjy.js} +0 -0
  441. /package/dist/web/assets/{material-theme-palenight-W6_icGCj.js → material-theme-palenight-e-0CtRoe.js} +0 -0
  442. /package/dist/web/assets/{matlab-rfqn_b3z.js → matlab-BNaNQAUH.js} +0 -0
  443. /package/dist/web/assets/{mdx-Bh1B_YOJ.js → mdx-DfpVWAqO.js} +0 -0
  444. /package/dist/web/assets/{mermaid-Dxf6Ya2k.js → mermaid-Bpq7wFCP.js} +0 -0
  445. /package/dist/web/assets/{min-dark-CivZ2L0h.js → min-dark-CL2Y0WH6.js} +0 -0
  446. /package/dist/web/assets/{min-light-B1Ykqtma.js → min-light-DOgr_IdP.js} +0 -0
  447. /package/dist/web/assets/{mipsasm-DynHaM0d.js → mipsasm-C9ie2zlB.js} +0 -0
  448. /package/dist/web/assets/{mojo-Clw5PbGH.js → mojo-Md2A2sJy.js} +0 -0
  449. /package/dist/web/assets/{monitor-Dv8vn_6O.js → monitor-4vWfqzuN.js} +0 -0
  450. /package/dist/web/assets/{monokai-DFIooFZT.js → monokai-nbXIEySB.js} +0 -0
  451. /package/dist/web/assets/{moonbit-DnBSZWGM.js → moonbit-CJ-T-s4A.js} +0 -0
  452. /package/dist/web/assets/{move-CCcL2PfL.js → move-DwEehLIK.js} +0 -0
  453. /package/dist/web/assets/{narrat-BDarg5Lk.js → narrat-CuF4sIKr.js} +0 -0
  454. /package/dist/web/assets/{nextflow-groovy-DrZOeCNW.js → nextflow-groovy-1dYhfPfq.js} +0 -0
  455. /package/dist/web/assets/{night-owl-BnZZCK7v.js → night-owl-gZS5mfzY.js} +0 -0
  456. /package/dist/web/assets/{night-owl-light-CEwBsVHS.js → night-owl-light-DDAster5.js} +0 -0
  457. /package/dist/web/assets/{nix-amCzOPMR.js → nix-BlbEYs2c.js} +0 -0
  458. /package/dist/web/assets/{nord-BIs2BC6q.js → nord-BRiPb8Vy.js} +0 -0
  459. /package/dist/web/assets/{nushell-Y02fo4yw.js → nushell-DgWicB1i.js} +0 -0
  460. /package/dist/web/assets/{objective-c-7xOZtWW1.js → objective-c-D8mPZ42Y.js} +0 -0
  461. /package/dist/web/assets/{objective-cpp-eVtjUvVB.js → objective-cpp-B0pNXzuj.js} +0 -0
  462. /package/dist/web/assets/{ocaml-Bi6ZwqG4.js → ocaml-lQd7aK5d.js} +0 -0
  463. /package/dist/web/assets/{odin-8xf1Y0S9.js → odin-CxtIOBjm.js} +0 -0
  464. /package/dist/web/assets/{one-dark-pro-hVv-_y_b.js → one-dark-pro-T_UFnWfe.js} +0 -0
  465. /package/dist/web/assets/{one-light-CJJ3MtHt.js → one-light-LBVqwyV-.js} +0 -0
  466. /package/dist/web/assets/{openscad-B2HcywLk.js → openscad-C5dnS6J7.js} +0 -0
  467. /package/dist/web/assets/{pascal-C7fllV_7.js → pascal-CmWCWQML.js} +0 -0
  468. /package/dist/web/assets/{pkl-qvLC1IWP.js → pkl-BWWOtDQk.js} +0 -0
  469. /package/dist/web/assets/{plastic-BT1wHZv2.js → plastic-ekhupckF.js} +0 -0
  470. /package/dist/web/assets/{play-4MZi1Axp.js → play-CpCAoQRZ.js} +0 -0
  471. /package/dist/web/assets/{plsql-1MsmdmJD.js → plsql-BPsDHXx4.js} +0 -0
  472. /package/dist/web/assets/{plus-BhMZqFsN.js → plus-BR0qewJI.js} +0 -0
  473. /package/dist/web/assets/{po-BigskytD.js → po-BX2FiuW2.js} +0 -0
  474. /package/dist/web/assets/{poimandres-DuklniF7.js → poimandres-DzXOdZcN.js} +0 -0
  475. /package/dist/web/assets/{polar-e2pjN_sp.js → polar-DDRXgJzG.js} +0 -0
  476. /package/dist/web/assets/{portal-container-context-Cm5HipFr.js → portal-container-context-a399Hd9F.js} +0 -0
  477. /package/dist/web/assets/{postcss-DtAeYjWw.js → postcss-BHW6XBhx.js} +0 -0
  478. /package/dist/web/assets/{powerquery-Cr2PtehI.js → powerquery-B89c2NBb.js} +0 -0
  479. /package/dist/web/assets/{powershell-BxFTGLJ4.js → powershell-Dvxrd3Tu.js} +0 -0
  480. /package/dist/web/assets/{prisma-COWJiwdZ.js → prisma-lMK8EFLU.js} +0 -0
  481. /package/dist/web/assets/{prolog-DFvGKRx6.js → prolog-D0YrtMG4.js} +0 -0
  482. /package/dist/web/assets/{proto-CcK80lFt.js → proto-J0mM25aw.js} +0 -0
  483. /package/dist/web/assets/{puppet-BF60bZ4F.js → puppet-CUT0xkhh.js} +0 -0
  484. /package/dist/web/assets/{purescript-zL_69MzU.js → purescript-CoJWSGRp.js} +0 -0
  485. /package/dist/web/assets/{python-CIwKhfb_.js → python-BBrmuz6P.js} +0 -0
  486. /package/dist/web/assets/{qmldir-CXNe04Lo.js → qmldir-CUtzs4Q7.js} +0 -0
  487. /package/dist/web/assets/{qss-C8lAWe6G.js → qss-Dm1RZ8aL.js} +0 -0
  488. /package/dist/web/assets/{r-CL5ZVL3_.js → r-BGP7qZTe.js} +0 -0
  489. /package/dist/web/assets/{racket-BBfh0uh0.js → racket-K_6U1lqJ.js} +0 -0
  490. /package/dist/web/assets/{raku-o6E8R5Q3.js → raku-bNSiZeW_.js} +0 -0
  491. /package/dist/web/assets/{react-CBTnT4sY.js → react-X4jUntEf.js} +0 -0
  492. /package/dist/web/assets/{red-GomRF2Xp.js → red-uVeIEF0f.js} +0 -0
  493. /package/dist/web/assets/{refresh-cw-B06yaBrW.js → refresh-cw-B9iv7csb.js} +0 -0
  494. /package/dist/web/assets/{reg-_ffDIvx9.js → reg-DSm9GWjh.js} +0 -0
  495. /package/dist/web/assets/{regexp-Bl5sF65W.js → regexp-CljRm_j_.js} +0 -0
  496. /package/dist/web/assets/{rel-DgMdqDuj.js → rel-d3JcopZg.js} +0 -0
  497. /package/dist/web/assets/{resolve-theme-CRt_7wpd.js → resolve-theme-DLKmm-lE.js} +0 -0
  498. /package/dist/web/assets/{riscv-8b3-Ye4X.js → riscv-CJmaELjT.js} +0 -0
  499. /package/dist/web/assets/{ron-DrmU1KHP.js → ron-D0g9B1rW.js} +0 -0
  500. /package/dist/web/assets/{rose-pine-C_-E2tF1.js → rose-pine-DOrD2BSH.js} +0 -0
  501. /package/dist/web/assets/{rose-pine-dawn-DEfhNlFH.js → rose-pine-dawn-CzZQ-LCF.js} +0 -0
  502. /package/dist/web/assets/{rose-pine-moon-BdvX3gdn.js → rose-pine-moon-CdmsYp7C.js} +0 -0
  503. /package/dist/web/assets/{rosmsg-B6GhGpd5.js → rosmsg-CmDth6pO.js} +0 -0
  504. /package/dist/web/assets/{rotate-ccw-COXu_9oj.js → rotate-ccw-DnuPzJRE.js} +0 -0
  505. /package/dist/web/assets/{rust-DmC97M1-.js → rust-DGdP6jiR.js} +0 -0
  506. /package/dist/web/assets/{sass-B0tJOHLM.js → sass-Dkgt2FKZ.js} +0 -0
  507. /package/dist/web/assets/{save-CtIGOjmx.js → save-DxonD4y1.js} +0 -0
  508. /package/dist/web/assets/{scala-n8zaFOXv.js → scala-BQLTON6C.js} +0 -0
  509. /package/dist/web/assets/{scheme-BKD9ztBU.js → scheme-DKlxUGCi.js} +0 -0
  510. /package/dist/web/assets/{sdbl-D8gB5-rS.js → sdbl-C3iZJQeZ.js} +0 -0
  511. /package/dist/web/assets/{send-BlyNJAzy.js → send-B-t5Mz26.js} +0 -0
  512. /package/dist/web/assets/{shallow-DYo6goJ4.js → shallow-jwPzEunk.js} +0 -0
  513. /package/dist/web/assets/{shellscript-BfXlf_Ao.js → shellscript-BRu-ZQAx.js} +0 -0
  514. /package/dist/web/assets/{shield-check-B0iGUiOK.js → shield-check-CdTiK1j2.js} +0 -0
  515. /package/dist/web/assets/{shield-off-BNLWBhcq.js → shield-off-DuetkXKM.js} +0 -0
  516. /package/dist/web/assets/{slack-dark-CylEddse.js → slack-dark-qkm_u2zz.js} +0 -0
  517. /package/dist/web/assets/{slack-ochin-w8wg8vuC.js → slack-ochin-BP8_8e4m.js} +0 -0
  518. /package/dist/web/assets/{smalltalk-hiAXA64u.js → smalltalk-Bnz4gt07.js} +0 -0
  519. /package/dist/web/assets/{snazzy-light-BwlV3Xty.js → snazzy-light-fbPZg5io.js} +0 -0
  520. /package/dist/web/assets/{solarized-dark-vmNGdykz.js → solarized-dark-CM0vTRoi.js} +0 -0
  521. /package/dist/web/assets/{solarized-light-DGv_0JXq.js → solarized-light-C4_W9mvs.js} +0 -0
  522. /package/dist/web/assets/{solidity-Y7QSH0B1.js → solidity-Bz6v1PoD.js} +0 -0
  523. /package/dist/web/assets/{splunk-BtgpLjHi.js → splunk-DyNxu-0i.js} +0 -0
  524. /package/dist/web/assets/{sql-CRHYhOia.js → sql-DXRL1gw1.js} +0 -0
  525. /package/dist/web/assets/{ssh-config-DOqSs3au.js → ssh-config-2z1QHuOG.js} +0 -0
  526. /package/dist/web/assets/{stylus-crCAEaBT.js → stylus-D4I-VaeY.js} +0 -0
  527. /package/dist/web/assets/{swift-eE3rT7TC.js → swift-C_2G-tIc.js} +0 -0
  528. /package/dist/web/assets/{synthwave-84-BWy14LBX.js → synthwave-84-osBjChRP.js} +0 -0
  529. /package/dist/web/assets/{system-verilog-DC0-DZM4.js → system-verilog-zQP2qPNU.js} +0 -0
  530. /package/dist/web/assets/{systemd-to5p6N8I.js → systemd-UGfjRSBM.js} +0 -0
  531. /package/dist/web/assets/{table-Bbc783ko.js → table-FLU8ei8b.js} +0 -0
  532. /package/dist/web/assets/{talonscript-DoTcU8wm.js → talonscript-C1XrFPwo.js} +0 -0
  533. /package/dist/web/assets/{tasl-cNZvUs95.js → tasl-B5raVn43.js} +0 -0
  534. /package/dist/web/assets/{tcl-mZE8sZH8.js → tcl-3-vbeMIc.js} +0 -0
  535. /package/dist/web/assets/{terraform-CqHPpIfu.js → terraform-a8VXZDm9.js} +0 -0
  536. /package/dist/web/assets/{text-wrap-CBT4Gxtg.js → text-wrap-B05VGRa-.js} +0 -0
  537. /package/dist/web/assets/{tokyo-night-Tp2rTIZd.js → tokyo-night-4SRhf-Hz.js} +0 -0
  538. /package/dist/web/assets/{toml-CU_vscgn.js → toml-B4N0i8wT.js} +0 -0
  539. /package/dist/web/assets/{trash-2-Bk4yYlck.js → trash-2-CTXlTflF.js} +0 -0
  540. /package/dist/web/assets/{triangle-alert-B8EYecpe.js → triangle-alert-BRq0VAfd.js} +0 -0
  541. /package/dist/web/assets/{tsv-ik7iFB9D.js → tsv-DA5k9Lvw.js} +0 -0
  542. /package/dist/web/assets/{tsx-BMvvMKiv.js → tsx-D9SZ8owC.js} +0 -0
  543. /package/dist/web/assets/{turtle-DBqKCq9o.js → turtle-BTHTvyY_.js} +0 -0
  544. /package/dist/web/assets/{typescript-DXJDmMZZ.js → typescript-DYzV9p5L.js} +0 -0
  545. /package/dist/web/assets/{typespec-CBseCMtZ.js → typespec-BC15eh7F.js} +0 -0
  546. /package/dist/web/assets/{typst-4oY25U9y.js → typst-BJUqzA6D.js} +0 -0
  547. /package/dist/web/assets/{use-is-mobile-D1weanbj.js → use-is-mobile-DFWViA4S.js} +0 -0
  548. /package/dist/web/assets/{utils-BNRH507E.js → utils-C9OjCrou.js} +0 -0
  549. /package/dist/web/assets/{v-BXaZ_1oy.js → v-50Lps6oA.js} +0 -0
  550. /package/dist/web/assets/{vala-BImWJE7z.js → vala-8wiUvvrD.js} +0 -0
  551. /package/dist/web/assets/{vb-CLfj2_sy.js → vb-BlgPLt6B.js} +0 -0
  552. /package/dist/web/assets/{vendor-xterm-_yyu5n32.js → vendor-xterm-BZOrwF_F.js} +0 -0
  553. /package/dist/web/assets/{verilog-BWa8Ed2b.js → verilog-CD9pVW5p.js} +0 -0
  554. /package/dist/web/assets/{vesper-BGj1cg6m.js → vesper-BrivW4PT.js} +0 -0
  555. /package/dist/web/assets/{vhdl-mByK7mlx.js → vhdl-Bunxfa7N.js} +0 -0
  556. /package/dist/web/assets/{viml-CugmlW5g.js → viml-DndUb2qM.js} +0 -0
  557. /package/dist/web/assets/{vitesse-black-vPdpy9TL.js → vitesse-black-BurZSkxW.js} +0 -0
  558. /package/dist/web/assets/{vitesse-dark-BuQK3dUh.js → vitesse-dark-8UShspzC.js} +0 -0
  559. /package/dist/web/assets/{vitesse-light-B3nz1XL9.js → vitesse-light-DghCAZ90.js} +0 -0
  560. /package/dist/web/assets/{vyper-DH_GTIHG.js → vyper-b-Clr-8u.js} +0 -0
  561. /package/dist/web/assets/{wasm-DfVbVJlW.js → wasm-C5v2T06Y.js} +0 -0
  562. /package/dist/web/assets/{wasm-C-LF9GjX.js → wasm-CpcKStkw.js} +0 -0
  563. /package/dist/web/assets/{wenyan-CzQkHyHx.js → wenyan-Dz2srLZR.js} +0 -0
  564. /package/dist/web/assets/{wgsl-Du_M1DW9.js → wgsl-CeD1-dRb.js} +0 -0
  565. /package/dist/web/assets/{wikitext-BWN_w5S7.js → wikitext-CyeS-9FH.js} +0 -0
  566. /package/dist/web/assets/{wit-BR13v5HD.js → wit-Kr-q-qBQ.js} +0 -0
  567. /package/dist/web/assets/{wolfram-BoXxp_Xl.js → wolfram-BKm8bmln.js} +0 -0
  568. /package/dist/web/assets/{x-nhriOX9o.js → x-YDu4m2Iq.js} +0 -0
  569. /package/dist/web/assets/{yaml-DpR_EF-d.js → yaml-2XSxomjM.js} +0 -0
  570. /package/dist/web/assets/{zenscript-C-EdUtUd.js → zenscript-CKIS34vf.js} +0 -0
  571. /package/dist/web/assets/{zig-BD4eA5nU.js → zig-DdHGNllX.js} +0 -0
@@ -1,81 +0,0 @@
1
- // Debug stage: why does typing stop echoing after the PiP move, and does the DOM renderer survive?
2
- import { connectApp, saveResults, sleep } from "./pip-spike-common";
3
-
4
- const TAB = "terminal:1@panel-8281c2e3";
5
- const Q = `document.querySelector('[data-tab-pool-id="${TAB}"]')`;
6
- const W = `window.__spike.tw`;
7
- const T = `window.__spike.findTerminal(${W})`;
8
- const R: Record<string, unknown> = {};
9
- const h = await connectApp();
10
- const { ev, cdp, sid } = h;
11
-
12
- R.reset = await ev(`(() => { const S = window.__spike; const r = { hadPip: !!(S.pip && !S.pip.closed), twInPip: !!(S.tw && S.tw.ownerDocument !== document) };
13
- if (r.twInPip) S.moveBack(S.tw); if (r.hadPip) S.pip.close(); S.pip = null; S.results = {}; return r; })()`);
14
- await sleep(500);
15
- await h.openViaUrl("/project/ppm/terminal/1");
16
- await h.waitFor(`${Q} && ${Q}.style.display !== 'none' && ${Q}.querySelector('.xterm-helper-textarea')`, 15000, "terminal visible");
17
- await ev(`window.__spike.tw = ${Q}; 'held'`);
18
-
19
- // Instrument: xterm onData, WebSocket ref (fiber hook whose .current is a WebSocket), ws messages
20
- R.instrument = await ev(`(() => {
21
- const S = window.__spike; const w = ${W}; const t = ${T};
22
- S.dataLog = []; S.wsMsgs = 0; S.writes = 0;
23
- if (!S.instrumented) {
24
- t.onData(d => S.dataLog.push(d));
25
- const origWrite = t.write.bind(t); t.write = (d, cb) => { S.writes++; return origWrite(d, cb); };
26
- const container = w.querySelector('.xterm').parentElement; let f = S.fiberOf(container); let ws = null;
27
- for (let depth = 0; f && depth < 40 && !ws; depth++, f = f.return) {
28
- let hook = f.memoizedState;
29
- for (let i = 0; hook && i < 200; i++, hook = hook.next) { const c = hook.memoizedState && hook.memoizedState.current; if (c instanceof WebSocket) { ws = c; S.wsHook = hook.memoizedState; break; } }
30
- }
31
- if (ws) ws.addEventListener('message', () => S.wsMsgs++);
32
- S.instrumented = true;
33
- }
34
- const ws = S.wsHook && S.wsHook.current;
35
- return { wsFound: !!ws, wsState: ws && ws.readyState, wsUrl: ws && ws.url, rows: t.rows, cols: t.cols, textareaDoc: w.querySelector('.xterm-helper-textarea').ownerDocument === document };
36
- })()`);
37
-
38
- async function typeAndCheck(label: string, marker: string, targetSid: string, focusExpr: string) {
39
- await cdp.eval(targetSid, focusExpr);
40
- await ev(`window.__spike.dataLog = []; window.__spike.wsMsgs = 0; window.__spike.writes = 0; 'r'`);
41
- await cdp.typeText(targetSid, `echo ${marker}`);
42
- await cdp.pressKey(targetSid, "Enter", "Enter", 13, "\r");
43
- await sleep(1500);
44
- R[label] = await ev(`(() => { const S = window.__spike; const t = ${T}; const ws = S.wsHook && S.wsHook.current;
45
- return { dataSent: S.dataLog.join(''), wsMsgs: S.wsMsgs, writes: S.writes, wsState: ws && ws.readyState, echoed: S.termText(t, 80).includes(${JSON.stringify(marker)}), tail: S.termText(t, 4) }; })()`);
46
- }
47
-
48
- await typeAndCheck("mainBeforePip", "DBG-MAIN-1", sid, `window.__spike.tw.querySelector('.xterm-helper-textarea').focus(); 'f'`);
49
-
50
- R.move = await h.runGesture("pip-terminal-dbg", `async () => {
51
- const S = window.__spike; const w = ${W};
52
- const pip = await documentPictureInPicture.requestWindow({ width: 900, height: 600 });
53
- S.pip = pip; S.copyStyles(pip.document); const moved = S.moveToPip(pip, w);
54
- await new Promise(r => setTimeout(r, 400));
55
- const gl = [...w.querySelectorAll('canvas')].map(c => { const ctx = c.getContext('webgl2') || c.getContext('webgl'); return ctx ? { lost: ctx.isContextLost(), dbw: ctx.drawingBufferWidth, dbh: ctx.drawingBufferHeight } : { ctx2d: !!c.getContext('2d') }; });
56
- return { moved, gl, pipSize: [pip.innerWidth, pip.innerHeight], screenBg: pip.getComputedStyle(w.querySelector('.xterm-viewport')).backgroundColor };
57
- }`);
58
- const pipSid = await h.attachPip();
59
- R.pipAttached = !!pipSid;
60
- if (pipSid) {
61
- R.pipFocus = await cdp.eval(pipSid, `(() => { const ta = document.querySelector('.xterm-helper-textarea'); ta.focus(); return { active: document.activeElement === ta, hasFocus: document.hasFocus(), vis: document.visibilityState }; })()`);
62
- await typeAndCheck("pipTrusted", "DBG-PIP-1", pipSid, `document.querySelector('.xterm-helper-textarea').focus(); 'f'`);
63
- R.shotWebgl = await h.pipShot(pipSid, "spike-01c-terminal-pip-webgl-debug.png");
64
- // Force GL context loss → app's onContextLoss disposes the WebGL addon → DOM renderer
65
- R.forceLoss = await ev(`(async () => { const w = ${W}; const t = ${T}; const c = w.querySelector('canvas'); const gl = c && (c.getContext('webgl2') || c.getContext('webgl'));
66
- if (!gl) return 'no gl canvas'; const ext = gl.getExtension('WEBGL_lose_context'); if (!ext) return 'no lose_context ext'; ext.loseContext();
67
- await new Promise(r => setTimeout(r, 800)); t.refresh(0, t.rows - 1); await new Promise(r => setTimeout(r, 300));
68
- return { canvasesLeft: w.querySelectorAll('canvas').length, rowsDom: w.querySelectorAll('.xterm-rows > div').length, rowsText: [...w.querySelectorAll('.xterm-rows > div')].slice(0, 3).map(r => r.textContent.trim()).filter(Boolean) }; })()`);
69
- await sleep(500);
70
- R.shotDom = await h.pipShot(pipSid, "spike-01d-terminal-pip-dom-renderer.png");
71
- await typeAndCheck("pipTrustedAfterDomRenderer", "DBG-PIP-2", pipSid, `document.querySelector('.xterm-helper-textarea').focus(); 'f'`);
72
- // Resize check with DOM renderer
73
- R.resizeDom = await ev(`(async () => { const w = ${W}; const t = ${T}; const b = [t.rows, t.cols]; w.style.height = '50%'; await new Promise(r => setTimeout(r, 700)); const a = [t.rows, t.cols]; w.style.height = '100%'; await new Promise(r => setTimeout(r, 700)); return { before: b, after: a, restored: [t.rows, t.cols] }; })()`);
74
- }
75
- R.back = await ev(`(async () => { const S = window.__spike; const w = ${W}; const t = ${T}; const r = S.moveBack(w); await new Promise(res => setTimeout(res, 800)); return { ...r, rows: t.rows, cols: t.cols }; })()`);
76
- await ev(`window.__spike.pip.close(); 'c'`);
77
- await sleep(400);
78
- await typeAndCheck("mainAfterReturn", "DBG-MAIN-2", sid, `window.__spike.tw.querySelector('.xterm-helper-textarea').focus(); 'f'`);
79
- await cdp.screenshot(sid, "C:/Users/PC/ppm/plans/reports/screenshots/spike-03b-terminal-after-return-dom-renderer.png");
80
- await saveResults("pip-results-terminal-debug.json", R);
81
- cdp.close();
@@ -1,139 +0,0 @@
1
- // Stage 2 (clean re-run on a healthy terminal): full PASS/FAIL matrix for xterm in a Document PiP window.
2
- import { connectApp, saveResults, sleep } from "./pip-spike-common";
3
-
4
- const TAB = "terminal:2@panel-8281c2e3";
5
- const Q = `document.querySelector('[data-tab-pool-id="${TAB}"]')`;
6
- const W = `window.__spike.tw2`;
7
- const T = `window.__spike.t2`;
8
- const R: Record<string, unknown> = {};
9
- const h = await connectApp();
10
- const { ev, cdp, sid } = h;
11
- await cdp.send("Emulation.setFocusEmulationEnabled", { enabled: true }, sid);
12
-
13
- await ev(`(() => { const S = window.__spike; if (S.pip && !S.pip.closed) { if (S.tw2 && S.tw2.ownerDocument !== document) S.moveBack(S.tw2); S.pip.close(); } S.pip = null; S.results = {}; return 'reset'; })()`);
14
- await h.openViaUrl("/project/ppm/terminal/2");
15
- await h.waitFor(`${Q} && ${Q}.style.display !== 'none' && ${Q}.querySelector('.xterm-helper-textarea')`, 15000, "terminal 2 visible");
16
- await ev(`(() => { const S = window.__spike; S.tw2 = ${Q}; S.t2 = S.findTerminal(S.tw2); if (!S.t2Hooked) { S.dataLog2 = []; S.t2.onData(d => S.dataLog2.push(d)); S.t2Hooked = true; } return 'held'; })()`);
17
-
18
- async function typeMarker(targetSid: string, marker: string, focusExpr: string) {
19
- await cdp.eval(targetSid, focusExpr);
20
- await ev(`window.__spike.dataLog2 = []; 'r'`);
21
- await cdp.typeText(targetSid, `echo ${marker}`);
22
- await cdp.pressKey(targetSid, "Enter", "Enter", 13, "\r");
23
- await sleep(1300);
24
- return ev(`({ sent: window.__spike.dataLog2.join('').includes(${JSON.stringify(marker)}), echoed: window.__spike.termText(${T}, 60).includes(${JSON.stringify(marker)}) })`);
25
- }
26
- R.baselineTyping = await typeMarker(sid, "T2-BASE", `${W}.querySelector('.xterm-helper-textarea').focus(); 'f'`);
27
- R.baselineSize = await ev(`({ rows: ${T}.rows, cols: ${T}.cols, canvases: ${W}.querySelectorAll('canvas').length })`);
28
-
29
- R.move = await h.runGesture("pip-terminal-v2", `async () => {
30
- const S = window.__spike; const w = ${W}; const t = ${T};
31
- const pip = await documentPictureInPicture.requestWindow({ width: 900, height: 600 }); S.pip = pip;
32
- const styles = S.copyStyles(pip.document); const moved = S.moveToPip(pip, w); S.installClickProbes(pip, w);
33
- S.glEvents = []; for (const c of w.querySelectorAll('canvas')) { c.addEventListener('webglcontextlost', () => S.glEvents.push('lost')); c.addEventListener('webglcontextrestored', () => S.glEvents.push('restored')); }
34
- await new Promise(r => setTimeout(r, 600));
35
- const gl = [...w.querySelectorAll('canvas')].map(c => { const g = c.getContext('webgl2'); return g ? { webgl2: true, lost: g.isContextLost() } : { webgl2: false }; });
36
- return { styles, moved, pipSize: [pip.innerWidth, pip.innerHeight], rowsCols: [t.rows, t.cols], canvasesNow: w.querySelectorAll('canvas').length, gl, glEvents: S.glEvents, domRows: w.querySelectorAll('.xterm-rows > div').length,
37
- theme: { pipHtmlClass: pip.document.documentElement.className, statusBg: pip.getComputedStyle(w.querySelector('.bg-surface')).backgroundColor, mainSurfaceBg: getComputedStyle(document.querySelector('.bg-surface') || document.body).backgroundColor } };
38
- }`);
39
- const pipSid = await h.attachPip();
40
- R.pipAttached = !!pipSid;
41
- if (!pipSid) throw new Error("no pip target");
42
- await cdp.send("Emulation.setFocusEmulationEnabled", { enabled: true }, pipSid);
43
- await sleep(700);
44
- R.afterFocusEmu = await ev(`({ canvases: ${W}.querySelectorAll('canvas').length, domRows: ${W}.querySelectorAll('.xterm-rows > div').length, glEvents: window.__spike.glEvents, rowsCols: [${T}.rows, ${T}.cols], vis: window.__spike.pip.document.visibilityState })`);
45
- R.shotInPip = await h.pipShot(pipSid, "spike-01-terminal-in-pip.png");
46
-
47
- // (b) keyboard — trusted keys via the PiP target
48
- R.typingInPip = await typeMarker(pipSid, "T2-IN-PIP", `document.querySelector('.xterm-helper-textarea').focus(); 'f'`);
49
- R.shotTyped = await h.pipShot(pipSid, "spike-01b-terminal-in-pip-typed.png");
50
-
51
- // (c) drag selection — trusted mouse via PiP target, over the row that has the echoed text
52
- R.dragSelect = await (async () => {
53
- const geo = await cdp.eval<any>(pipSid, `(() => { const s = document.querySelector('.xterm-screen').getBoundingClientRect(); return { x: s.x, y: s.y, w: s.width, h: s.height }; })()`);
54
- const row = await ev<number>(`(() => { const t = ${T}; const b = t.buffer.active; for (let i = b.length - 1; i >= 0; i--) { if ((b.getLine(i)?.translateToString(true) ?? '').includes('T2-IN-PIP')) return i - b.viewportY; } return -1; })()`);
55
- const cell = await ev<any>(`(() => { const d = ${T}._core._renderService.dimensions.css.cell; return { w: d.width, h: d.height }; })()`);
56
- if (row < 0) return { error: "row not found" };
57
- const y = geo.y + row * cell.h + cell.h / 2;
58
- const x0 = geo.x + 2;
59
- await cdp.send("Input.dispatchMouseEvent", { type: "mouseMoved", x: x0, y }, pipSid);
60
- await cdp.send("Input.dispatchMouseEvent", { type: "mousePressed", x: x0, y, button: "left", clickCount: 1 }, pipSid);
61
- for (let i = 1; i <= 8; i++) await cdp.send("Input.dispatchMouseEvent", { type: "mouseMoved", x: x0 + i * cell.w * 2, y, button: "left", buttons: 1 }, pipSid);
62
- await cdp.send("Input.dispatchMouseEvent", { type: "mouseReleased", x: x0 + 16 * cell.w, y, button: "left", clickCount: 1 }, pipSid);
63
- await sleep(300);
64
- const sel = await ev<string>(`${T}.getSelection()`);
65
- await h.pipShot(pipSid, "spike-01c-terminal-in-pip-selection.png");
66
- await ev(`${T}.clearSelection(); 'c'`);
67
- return { row, cell, selection: sel, pass: sel.length > 0 };
68
- })();
69
-
70
- // (d) resize: style change on wrapper (ResizeObserver path) and window.resizeTo inside a trusted click in the PiP doc
71
- R.resizeViaStyle = await ev(`(async () => { const w = ${W}; const t = ${T}; const before = [t.rows, t.cols]; w.style.height = '50%'; w.style.width = '70%';
72
- await new Promise(r => setTimeout(r, 800)); const after = [t.rows, t.cols]; w.style.height = '100%'; w.style.width = '100%'; await new Promise(r => setTimeout(r, 800));
73
- return { before, after, restored: [t.rows, t.cols], refit: before[0] !== after[0] || before[1] !== after[1] }; })()`);
74
- R.resizeViaWindow = await (async () => {
75
- const pt = await cdp.eval<any>(pipSid, `(() => { const b = document.createElement('button'); b.id = 'rz'; b.textContent = 'rz'; b.style.cssText = 'position:fixed;right:4px;bottom:4px;z-index:99999'; b.onclick = () => { try { window.resizeTo(700, 450); window.__rz = 'ok'; } catch (e) { window.__rz = String(e); } }; document.body.append(b); const r = b.getBoundingClientRect(); return { x: r.x + r.width / 2, y: r.y + r.height / 2 }; })()`);
76
- const before = await ev<any>(`[${T}.rows, ${T}.cols, window.__spike.pip.innerWidth, window.__spike.pip.innerHeight]`);
77
- await cdp.click(pipSid, pt.x, pt.y);
78
- await sleep(1200);
79
- const after = await ev<any>(`[${T}.rows, ${T}.cols, window.__spike.pip.innerWidth, window.__spike.pip.innerHeight]`);
80
- const err = await cdp.eval(pipSid, `window.__rz`);
81
- await cdp.eval(pipSid, `document.getElementById('rz').remove(); 'x'`);
82
- return { before, after, resizeToResult: err, refit: before[0] !== after[0] || before[1] !== after[1] };
83
- })();
84
- R.shotResized = await h.pipShot(pipSid, "spike-01d-terminal-in-pip-resized.png");
85
-
86
- // (f) React onClick inside the moved wrapper: trusted click on "Chat" (would toast "Sent to chat" in main doc)
87
- R.reactClickInPip = await (async () => {
88
- const pt = await cdp.eval<any>(pipSid, `(() => { const r = document.querySelector('button[title="Send to Chat"]').getBoundingClientRect(); return { x: r.x + r.width / 2, y: r.y + r.height / 2 }; })()`);
89
- await ev(`window.__spike.probe = { mainDocClick: 0, pipDocClick: 0, wrapperClick: 0, reactRootClick: 0 }; 'r'`);
90
- await cdp.click(pipSid, pt.x, pt.y);
91
- await sleep(700);
92
- return ev(`({ probe: { ...window.__spike.probe }, toast: window.__spike.toastText(), reactHandlerFired: window.__spike.toastText().includes('Sent to chat') })`);
93
- })();
94
-
95
- // Pull-back probe: re-render ReparentingTab by switching active tab away and back via URL
96
- R.pullback = await (async () => {
97
- const inPip0 = await ev<boolean>(`${W}.ownerDocument !== document`);
98
- await h.openViaUrl("/project/ppm/editor/.spike/scratch-editor-target.ts");
99
- const afterAway = await ev<any>(`({ inPip: ${W}.ownerDocument !== document, display: ${W}.style.display, parentIsSlot: ${W}.parentElement && ${W}.parentElement.className.includes('absolute inset-0') })`);
100
- await h.openViaUrl("/project/ppm/terminal/2");
101
- const afterBack = await ev<any>(`({ inPip: ${W}.ownerDocument !== document, display: ${W}.style.display })`);
102
- return { inPipBefore: inPip0, afterSwitchAway: afterAway, afterSwitchBack: afterBack, note: "ReparentingTab layout effect re-appends wrapper into the panel slot on every re-render" };
103
- })();
104
- // Whatever state we are in now, ensure wrapper is in main, then test pagehide→moveBack survival with a second PiP
105
- R.ensureBack = await ev(`(() => { const S = window.__spike; const w = ${W}; const was = w.ownerDocument !== document; if (was) S.moveBack(w); return { wasInPip: was, inMain: w.ownerDocument === document }; })()`);
106
- await ev(`window.__spike.pip.close(); 'c'`);
107
- await sleep(600);
108
- R.afterReturnTyping = await typeMarker(sid, "T2-AFTER-RETURN", `${W}.querySelector('.xterm-helper-textarea').focus(); 'f'`);
109
- R.afterReturnState = await ev(`(async () => { const S = window.__spike; const w = ${W}; const t = ${T}; const txt = S.termText(t, 200);
110
- const btn = w.querySelector('button[title="Send to Chat"]'); btn.click(); await new Promise(r => setTimeout(r, 600));
111
- return { rows: t.rows, cols: t.cols, canvases: w.querySelectorAll('canvas').length, scrollback: { base: txt.includes('T2-BASE'), inPip: txt.includes('T2-IN-PIP'), after: txt.includes('T2-AFTER-RETURN') }, reactClickToast: S.toastText().includes('Sent to chat') }; })()`);
112
- await cdp.screenshot(sid, "C:/Users/PC/ppm/plans/reports/screenshots/spike-03-terminal-after-return.png");
113
-
114
- // pagehide → move back synchronously: do listeners survive the PiP window closing?
115
- R.pagehideGuard = await h.runGesture("pip-terminal-pagehide", `async () => {
116
- const S = window.__spike; const w = ${W};
117
- const pip = await documentPictureInPicture.requestWindow({ width: 800, height: 500 }); S.pip = pip; S.copyStyles(pip.document); S.moveToPip(pip, w);
118
- pip.addEventListener('pagehide', () => { S.moveBack(w); S.note('pagehide: moved back'); });
119
- await new Promise(r => setTimeout(r, 500));
120
- pip.close();
121
- await new Promise(r => setTimeout(r, 500));
122
- return { inMain: w.ownerDocument === document, closed: pip.closed };
123
- }`);
124
- R.afterPagehideTyping = await typeMarker(sid, "T2-AFTER-PAGEHIDE", `${W}.querySelector('.xterm-helper-textarea').focus(); 'f'`);
125
- // Control (destructive, last): close a PiP with the wrapper still inside, then let React pull it back — listeners stripped?
126
- R.closeWithWrapperInside = await h.runGesture("pip-terminal-destroy", `async () => {
127
- const S = window.__spike; const w = ${W};
128
- const pip = await documentPictureInPicture.requestWindow({ width: 800, height: 500 }); S.pip = pip; S.copyStyles(pip.document); S.moveToPip(pip, w);
129
- await new Promise(r => setTimeout(r, 500)); pip.close(); await new Promise(r => setTimeout(r, 500));
130
- const r = { ownerAfterClose: w.ownerDocument === document ? 'main' : 'dead-pip-doc', connected: w.isConnected };
131
- S.moveBack(w); // simulate React's layout effect re-adopting from the destroyed document
132
- return { ...r, inMainNow: w.ownerDocument === document };
133
- }`);
134
- await sleep(500);
135
- R.afterDestroyTyping = await typeMarker(sid, "T2-AFTER-DESTROY", `${W}.querySelector('.xterm-helper-textarea').focus(); 'f'`);
136
- R.afterDestroyInputApi = await ev(`(async () => { const S = window.__spike; S.dataLog2 = []; S.t2.input('echo T2-INPUT-API\\r', true); await new Promise(r => setTimeout(r, 1200)); return { sent: S.dataLog2.join('').includes('T2-INPUT-API'), echoed: S.termText(S.t2, 60).includes('T2-INPUT-API') }; })()`);
137
- R.log = await ev(`window.__spike.log.slice(-10)`);
138
- await saveResults("pip-results-terminal-v2.json", R);
139
- cdp.close();
@@ -1,169 +0,0 @@
1
- // Stage 2: move the live xterm tab wrapper into a Document PiP window and test it.
2
- import { connectApp, saveResults, sleep } from "./pip-spike-common";
3
-
4
- const TAB = "terminal:1@panel-8281c2e3";
5
- const Q = `document.querySelector('[data-tab-pool-id="${TAB}"]')`;
6
- const W = `window.__spike.tw`; // held reference: querySelector can't see it once adopted into the PiP doc
7
- const T = `window.__spike.findTerminal(${W})`;
8
- const R: Record<string, unknown> = {};
9
- const h = await connectApp();
10
- const { ev, cdp, sid } = h;
11
-
12
- // Reset leftovers from an aborted run (records whether the wrapper had been pulled back while idle)
13
- R.reset = await ev(`(() => { const S = window.__spike; const r = { hadPip: !!(S.pip && !S.pip.closed), twInPip: !!(S.tw && S.tw.ownerDocument !== document) };
14
- if (r.twInPip) S.moveBack(S.tw); if (r.hadPip) S.pip.close(); S.pip = null; S.results = {}; return r; })()`);
15
- await sleep(500);
16
- await h.openViaUrl("/project/ppm/terminal/1");
17
- await h.waitFor(`${Q} && ${Q}.style.display !== 'none' && ${Q}.querySelector('.xterm-helper-textarea')`, 15000, "terminal visible");
18
- await ev(`window.__spike.tw = ${Q}; 'held'`);
19
-
20
- // Baseline typing in the main document (trusted CDP keys)
21
- await ev(`${W}.querySelector('.xterm-helper-textarea').focus(); 'f'`);
22
- await cdp.typeText(sid, "echo SPIKE-BEFORE-PIP");
23
- await cdp.pressKey(sid, "Enter", "Enter", 13, "\r");
24
- await sleep(1500);
25
- R.baseline = await ev(`(() => { const t = ${T}; return { rows: t.rows, cols: t.cols, echoed: window.__spike.termText(t, 80).includes('SPIKE-BEFORE-PIP'), renderer: ${W}.querySelectorAll('canvas').length + ' canvas' }; })()`);
26
-
27
- // Trusted gesture: open PiP, copy styles, move wrapper
28
- R.move = await h.runGesture("pip-terminal", `async () => {
29
- const S = window.__spike; const w = ${W};
30
- const pip = await documentPictureInPicture.requestWindow({ width: 900, height: 600 });
31
- S.pip = pip;
32
- const styles = S.copyStyles(pip.document);
33
- const moved = S.moveToPip(pip, w);
34
- S.installClickProbes(pip, w);
35
- pip.addEventListener('pagehide', () => S.note('pip pagehide'));
36
- await new Promise(r => setTimeout(r, 400));
37
- const t = S.findTerminal(w);
38
- const xterm = w.querySelector('.xterm'); const rect = xterm.getBoundingClientRect();
39
- const canvases = [...w.querySelectorAll('canvas')].map(c => ({ w: c.width, h: c.height, ctx: c.getContext ? (c.__spikeCtx ?? 'n/a') : 'n/a' }));
40
- return { styles, moved, rowsCols: { rows: t.rows, cols: t.cols }, xtermRect: { w: rect.width, h: rect.height }, canvases,
41
- pipInner: { w: pip.innerWidth, h: pip.innerHeight }, mainHasFocus: document.hasFocus(), pipHasFocus: pip.document.hasFocus(),
42
- themeBg: pip.getComputedStyle(w.firstElementChild.firstElementChild).backgroundColor, mainThemeBg: getComputedStyle(document.body).backgroundColor,
43
- pipHtmlClass: pip.document.documentElement.className };
44
- }`);
45
- await sleep(800);
46
-
47
- // Did ReparentingTab's layout effect pull it back yet?
48
- R.stillInPipAfterIdle = await ev(`${W}.ownerDocument === window.__spike.pip.document`);
49
-
50
- // Is the PiP window a CDP target?
51
- R.newTargets = await h.newTargets();
52
- const pipSid = await h.attachPip();
53
- R.pipAttached = !!pipSid;
54
- if (pipSid) R.pipTargetInfo = await cdp.eval(pipSid, `({ url: location.href, w: innerWidth, h: innerHeight, hasWrapper: !!document.querySelector('[data-tab-pool-id]'), title: document.title })`);
55
- R.shot1 = { screen: await h.screenShot("spike-01-terminal-in-pip-screen.png"), pip: await h.pipShot(pipSid, "spike-01-terminal-in-pip.png") };
56
-
57
- // (b) keyboard: trusted via pip target if possible, else synthetic DOM events
58
- if (pipSid) {
59
- await cdp.eval(pipSid, `document.querySelector('.xterm-helper-textarea').focus(); document.activeElement.className`);
60
- await cdp.typeText(pipSid, "echo SPIKE-IN-PIP-TRUSTED");
61
- await cdp.pressKey(pipSid, "Enter", "Enter", 13, "\r");
62
- await sleep(1500);
63
- R.typingTrustedInPip = await ev(`window.__spike.termText(${T}, 80).includes('SPIKE-IN-PIP-TRUSTED')`);
64
- }
65
- R.typingSyntheticInPip = await ev(`(async () => {
66
- const w = ${W}; const ta = w.querySelector('.xterm-helper-textarea'); ta.focus();
67
- const type = (s) => { for (const ch of s) { ta.dispatchEvent(new InputEvent('input', { data: ch, inputType: 'insertText', bubbles: true })); } };
68
- type('echo SPIKE-IN-PIP-SYNTH');
69
- ta.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true }));
70
- await new Promise(r => setTimeout(r, 1500));
71
- return { echoed: window.__spike.termText(${T}, 80).includes('SPIKE-IN-PIP-SYNTH'), activeInPip: w.ownerDocument.activeElement === ta };
72
- })()`);
73
-
74
- // (c) mouse drag selection inside the PiP terminal
75
- const selExpr = `(() => { const t = ${T}; return t.getSelection(); })()`;
76
- if (pipSid) {
77
- const rect = await cdp.eval<any>(pipSid, `(() => { const r = document.querySelector('.xterm-screen').getBoundingClientRect(); return { x: r.x, y: r.y, w: r.width, h: r.height }; })()`);
78
- const y = rect.y + 8; // first row: prompt line
79
- await cdp.send("Input.dispatchMouseEvent", { type: "mousePressed", x: rect.x + 4, y, button: "left", clickCount: 1 }, pipSid);
80
- for (let i = 1; i <= 6; i++) await cdp.send("Input.dispatchMouseEvent", { type: "mouseMoved", x: rect.x + 4 + i * 40, y, button: "left", buttons: 1 }, pipSid);
81
- await cdp.send("Input.dispatchMouseEvent", { type: "mouseReleased", x: rect.x + 244, y, button: "left", clickCount: 1 }, pipSid);
82
- await sleep(300);
83
- R.dragSelectTrustedInPip = { selection: await ev(selExpr), rect };
84
- await ev(`${T}.clearSelection(); 'c'`);
85
- }
86
- R.dragSelectSyntheticInPip = await ev(`(async () => {
87
- const w = ${W}; const t = ${T}; const pipDoc = w.ownerDocument; const screen = w.querySelector('.xterm-screen'); const r = screen.getBoundingClientRect();
88
- const mk = (type, x, target, extra = {}) => target.dispatchEvent(new MouseEvent(type, { clientX: x, clientY: r.y + 8, button: 0, buttons: 1, bubbles: true, view: pipDoc.defaultView, ...extra }));
89
- mk('mousedown', r.x + 4, screen);
90
- for (let i = 1; i <= 6; i++) mk('mousemove', r.x + 4 + i * 40, pipDoc); // xterm listens on ownerDocument-at-open-time
91
- mk('mouseup', r.x + 244, pipDoc);
92
- await new Promise(res => setTimeout(res, 200));
93
- const viaPipDoc = t.getSelection(); t.clearSelection();
94
- mk('mousedown', r.x + 4, screen);
95
- for (let i = 1; i <= 6; i++) mk('mousemove', r.x + 4 + i * 40, document);
96
- mk('mouseup', r.x + 244, document);
97
- await new Promise(res => setTimeout(res, 200));
98
- const viaMainDoc = t.getSelection(); t.clearSelection();
99
- return { viaPipDoc, viaMainDoc };
100
- })()`);
101
-
102
- // (d) resize: shrink wrapper height in the PiP body → ResizeObserver/fit?
103
- R.resizeViaStyle = await ev(`(async () => {
104
- const w = ${W}; const t = ${T}; const before = { rows: t.rows, cols: t.cols };
105
- w.style.height = '50%'; w.style.width = '70%';
106
- await new Promise(r => setTimeout(r, 700));
107
- const after = { rows: t.rows, cols: t.cols };
108
- w.style.height = '100%'; w.style.width = '100%';
109
- await new Promise(r => setTimeout(r, 700));
110
- const restored = { rows: t.rows, cols: t.cols };
111
- return { before, after, restored, refit: before.rows !== after.rows || before.cols !== after.cols };
112
- })()`);
113
- R.resizeViaWindow = await ev(`(async () => {
114
- const pip = window.__spike.pip; const t = ${T}; const before = { rows: t.rows, cols: t.cols, w: pip.innerWidth, h: pip.innerHeight };
115
- let err = null; try { pip.resizeTo(1100, 750); } catch (e) { err = String(e); }
116
- await new Promise(r => setTimeout(r, 900));
117
- return { before, after: { rows: t.rows, cols: t.cols, w: pip.innerWidth, h: pip.innerHeight }, err };
118
- })()`);
119
-
120
- // (f) React onClick inside the moved wrapper: the status-bar "Chat" button (toast in main doc on success)
121
- R.reactClick = await ev(`(async () => {
122
- const S = window.__spike; const w = ${W}; const btn = w.querySelector('button[title="Send to Chat"]');
123
- const probeBefore = { ...S.probe }; btn.click();
124
- await new Promise(r => setTimeout(r, 600));
125
- return { probeBefore, probeAfter: { ...S.probe }, toast: S.toastText(), synthetic: true };
126
- })()`);
127
- if (pipSid) {
128
- const pt = await cdp.eval<any>(pipSid, `(() => { const r = document.querySelector('button[title="Send to Chat"]').getBoundingClientRect(); return { x: r.x + r.width / 2, y: r.y + r.height / 2 }; })()`);
129
- await cdp.click(pipSid, pt.x, pt.y);
130
- await sleep(600);
131
- R.reactClickTrusted = await ev(`({ probe: { ...window.__spike.probe }, toast: window.__spike.toastText() })`);
132
- }
133
- // Control: same button after moving back must fire (proves probe validity)
134
-
135
- // Does a main-window re-render pull the wrapper back? Click the "Terminal 1" tab header in main doc.
136
- R.pullbackProbe = await ev(`(async () => {
137
- const w = ${W}; const inPip0 = w.ownerDocument !== document;
138
- const tabBtn = [...document.querySelectorAll('[role="tab"], button, div')].find(e => e.textContent?.trim() === 'Terminal 1' && e.getBoundingClientRect().width > 0);
139
- tabBtn?.dispatchEvent(new MouseEvent('mousedown', { bubbles: true })); tabBtn?.click();
140
- await new Promise(r => setTimeout(r, 500));
141
- return { inPipBefore: inPip0, inPipAfterTabClick: w.ownerDocument !== document, found: !!tabBtn };
142
- })()`);
143
- R.shot2 = await h.pipShot(pipSid, "spike-01b-terminal-pip-after-resize.png");
144
-
145
- // Move back to the original slot, verify state + typing
146
- R.back = await ev(`(async () => {
147
- const S = window.__spike; const w = ${W}; const t = ${T};
148
- const wasInPip = w.ownerDocument !== document;
149
- const back = wasInPip ? S.moveBack(w) : { back: true, note: 'already pulled back' };
150
- await new Promise(r => setTimeout(r, 800));
151
- const txt = S.termText(t, 120);
152
- return { wasInPip, back, rows: t.rows, cols: t.cols, scrollbackKept: { before: txt.includes('SPIKE-BEFORE-PIP'), trusted: txt.includes('SPIKE-IN-PIP-TRUSTED'), synth: txt.includes('SPIKE-IN-PIP-SYNTH') } };
153
- })()`);
154
- await ev(`window.__spike.pip && window.__spike.pip.close(); 'closed'`);
155
- await sleep(500);
156
- await ev(`${W}.querySelector('.xterm-helper-textarea').focus(); 'f'`);
157
- await cdp.typeText(sid, "echo SPIKE-AFTER-RETURN");
158
- await cdp.pressKey(sid, "Enter", "Enter", 13, "\r");
159
- await sleep(1500);
160
- R.afterReturn = await ev(`(async () => {
161
- const S = window.__spike; const w = ${W}; const t = ${T};
162
- const btn = w.querySelector('button[title="Send to Chat"]'); const p0 = { ...S.probe }; btn.click();
163
- await new Promise(r => setTimeout(r, 600));
164
- return { echoed: S.termText(t, 80).includes('SPIKE-AFTER-RETURN'), rows: t.rows, cols: t.cols, reactClickControl: { probeBefore: p0, probeAfter: { ...S.probe }, toast: S.toastText() } };
165
- })()`);
166
- await cdp.screenshot(sid, "C:/Users/PC/ppm/plans/reports/screenshots/spike-03-terminal-after-return.png");
167
- R.log = await ev(`window.__spike.log`);
168
- await saveResults("pip-results-terminal.json", R);
169
- cdp.close();
@@ -1,36 +0,0 @@
1
- // Debug: trace xterm's internal key path on the round-tripped terminal vs the fresh one.
2
- import { connectApp, saveResults, sleep } from "./pip-spike-common";
3
-
4
- const R: Record<string, unknown> = {};
5
- const h = await connectApp();
6
- const { ev, cdp, sid } = h;
7
- await cdp.send("Emulation.setFocusEmulationEnabled", { enabled: true }, sid);
8
-
9
- const TRACE = `(t, name) => {
10
- const S = window.__spike; const core = t._core; S.trace = S.trace || {}; S.trace[name] = [];
11
- const log = (m) => S.trace[name].push(m);
12
- const wrap = (obj, key, label) => { if (!obj || typeof obj[key] !== 'function' || obj[key].__wrapped) return 'no:' + label; const o = obj[key];
13
- const w = function (...a) { let r; try { r = o.apply(this, a); } finally { log(label + ' -> ' + (r && typeof r === 'object' ? JSON.stringify(r) : String(r))); } return r; }; w.__wrapped = true; obj[key] = w; return 'ok:' + label; };
14
- const res = [
15
- wrap(core, '_keyDown', 'keyDown'), wrap(core, '_keyPress', 'keyPress'), wrap(core, '_inputEvent', 'inputEvent'), wrap(core, '_isThirdLevelShift', 'thirdLevel'),
16
- wrap(core._compositionHelper, 'keydown', 'composition.keydown'), wrap(core._keyboardService, 'evaluateKeyDown', 'evaluateKeyDown'), wrap(core.coreService, 'triggerDataEvent', 'triggerData'),
17
- ];
18
- return { wrapped: res, state: { unprocessedDeadKey: core._unprocessedDeadKey, keyDownHandled: core._keyDownHandled, keyPressHandled: core._keyPressHandled, isComposing: core._compositionHelper._isComposing, isSending: core._compositionHelper._isSendingComposition,
19
- useKitty: core._keyboardService.useKitty, useWin32: core._keyboardService.useWin32InputMode, customHandler: !!core._customKeyEventHandler, disableStdin: core.optionsService.rawOptions.disableStdin, screenReader: core.optionsService.rawOptions.screenReaderMode,
20
- textareaOwner: t.textarea.ownerDocument === document, browser: { isWindows: core.browser.isWindows, isMac: core.browser.isMac } } };
21
- }`;
22
-
23
- async function traceOne(label: string, tabPath: string, twExpr: string, tExpr: string) {
24
- await h.openViaUrl(tabPath);
25
- await sleep(500);
26
- R[label + "_setup"] = await ev(`(${TRACE})(${tExpr}, ${JSON.stringify(label)})`);
27
- await ev(`${twExpr}.querySelector('.xterm-helper-textarea').focus(); window.__spike.trace[${JSON.stringify(label)}] = []; 'f'`);
28
- await cdp.typeText(sid, "a");
29
- await cdp.pressKey(sid, "Enter", "Enter", 13, "\r");
30
- await sleep(400);
31
- R[label + "_trace"] = await ev(`window.__spike.trace[${JSON.stringify(label)}]`);
32
- }
33
- await traceOne("roundTripped", "/project/ppm/terminal/1", "window.__spike.tw", "window.__spike.findTerminal(window.__spike.tw)");
34
- await traceOne("fresh", "/project/ppm/terminal/2", "window.__spike.tw2", "window.__spike.t2");
35
- await saveResults("pip-results-xterm-trace.json", R);
36
- cdp.close();
@@ -1,67 +0,0 @@
1
- // Isolates the `useWindowDrag` memo console error: opens an explorer window and clicks a
2
- // caption button, with NO picture-in-picture involved at all.
3
- import { tmpdir, homedir } from "node:os";
4
- import { join } from "node:path";
5
- import { Database } from "bun:sqlite";
6
- import { Cdp, launchChrome, pageInitScript, sleep } from "../tests/e2e/tab-popout-pip-helpers.mjs";
7
-
8
- const WEB = "http://localhost:5199";
9
- const CDP_PORT = 9361;
10
- const CHROME = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
11
- const RUN = Date.now().toString(36);
12
- const PROFILE = join(tmpdir(), `ppm-probe-${RUN}`);
13
-
14
- const db = new Database(join(homedir(), ".ppm", "ppm.dev.db"), { readonly: true });
15
- const TOKEN = JSON.parse(db.query("SELECT value FROM config WHERE key='auth'").get().value).token;
16
- db.close();
17
-
18
- const WINDOWS = `(await import('/components/floating-window/window-store.ts')).useWindowStore`;
19
- const errors = [];
20
- let cdp, main, chrome;
21
-
22
- try {
23
- chrome = await launchChrome({ chromePath: CHROME, cdpPort: CDP_PORT, profileDir: PROFILE, url: "about:blank" });
24
- cdp = await Cdp.connect(CDP_PORT);
25
- let page = null;
26
- const end = Date.now() + 20000;
27
- while (Date.now() < end && !page) {
28
- page = (await cdp.targets()).find((t) => t.type === "page");
29
- if (!page) await sleep(300);
30
- }
31
- main = await cdp.attach(page.targetId);
32
- await cdp.send("Emulation.setFocusEmulationEnabled", { enabled: true }, main).catch(() => {});
33
- await cdp.send("Page.addScriptToEvaluateOnNewDocument", { source: pageInitScript(TOKEN) }, main);
34
- cdp.on((m) => {
35
- if (m.method === "Runtime.exceptionThrown") {
36
- errors.push(String(m.params?.exceptionDetails?.exception?.description ?? "").split("\n")[0]);
37
- }
38
- });
39
- await cdp.send("Page.navigate", { url: WEB }, main);
40
- await sleep(6000);
41
-
42
- const ev = (e) => cdp.evalJs(main, e);
43
- for (let i = 0; i < 3; i++) {
44
- await ev(`${WINDOWS}.getState().open('explorer')`);
45
- await sleep(1800);
46
- const json = await ev(`(() => {
47
- const el = document.querySelector('[aria-label="Close window"]');
48
- if (!el) return null;
49
- const r = el.getBoundingClientRect();
50
- return JSON.stringify({ x: r.x + r.width / 2, y: r.y + r.height / 2 });
51
- })()`);
52
- if (!json) throw new Error("no close button");
53
- const { x, y } = JSON.parse(json);
54
- await cdp.click(main, x, y);
55
- await sleep(1200);
56
- }
57
- console.log(`close-button-only clicks: ${errors.length} exception(s)`);
58
- for (const e of errors.slice(0, 3)) console.log(" " + e);
59
- } finally {
60
- try {
61
- await cdp?.send("Browser.close");
62
- } catch {}
63
- await sleep(1000);
64
- try {
65
- if (chrome?.pid) process.kill(chrome.pid);
66
- } catch {}
67
- }
@@ -1,15 +0,0 @@
1
- // Read auth token + projects from the dev DB (readonly). Spike helper only.
2
- import { Database } from "bun:sqlite";
3
- import { homedir } from "node:os";
4
- import { join } from "node:path";
5
-
6
- const db = new Database(join(homedir(), ".ppm", "ppm.dev.db"), { readonly: true });
7
- const auth = db.query("SELECT value FROM config WHERE key = 'auth'").get() as { value: string } | null;
8
- const tables = db.query("SELECT name FROM sqlite_master WHERE type='table'").all() as { name: string }[];
9
- let projects: unknown[] = [];
10
- try {
11
- projects = db.query("SELECT * FROM projects LIMIT 10").all();
12
- } catch (e) {
13
- projects = [String(e)];
14
- }
15
- console.log(JSON.stringify({ auth: auth ? JSON.parse(auth.value) : null, tables: tables.map((t) => t.name), projects }, null, 2));
package/.spike/s.err DELETED
@@ -1,63 +0,0 @@
1
- $ bun run --hot src/server/index.ts __serve__ 8081 0.0.0.0 dev
2
- [accounts] Refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
3
- [accounts] Refresh token rejected for developers@nxsys.tech — preserving token for recovery (not clearing)
4
- [accounts] Auto-refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: Token refresh failed for account f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
5
- [accounts] Refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
6
- [accounts] Refresh token rejected for developers@nxsys.tech — preserving token for recovery (not clearing)
7
- [accounts] Pre-flight refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: Token refresh failed for account f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
8
- [accounts] Refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
9
- [accounts] Refresh token rejected for developers@nxsys.tech — preserving token for recovery (not clearing)
10
- [accounts] Auto-refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: Token refresh failed for account f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
11
- [accounts] Refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
12
- [accounts] Refresh token rejected for developers@nxsys.tech — preserving token for recovery (not clearing)
13
- [accounts] Pre-flight refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: Token refresh failed for account f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
14
- [accounts] Refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
15
- [accounts] Refresh token rejected for developers@nxsys.tech — preserving token for recovery (not clearing)
16
- [accounts] Auto-refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: Token refresh failed for account f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
17
- [accounts] Refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
18
- [accounts] Refresh token rejected for developers@nxsys.tech — preserving token for recovery (not clearing)
19
- [accounts] Pre-flight refresh failed for f287efe4-0523-4d10-8afa-6b53150a3682: Token refresh failed for account f287efe4-0523-4d10-8afa-6b53150a3682: 400 {"error": "invalid_grant", "error_description": "Refresh token expired"}
20
- [serve] Port 8081 still releasing, waiting...
21
- [serve] Port 8081 still releasing, waiting...
22
- [serve] Port 8081 still releasing, waiting...
23
- [serve] Port 8081 still releasing, waiting...
24
- [serve] Port 8081 still releasing, waiting...
25
- [serve] Port 8081 still releasing, waiting...
26
- [serve] Port 8081 still releasing, waiting...
27
- [serve] Port 8081 still releasing, waiting...
28
- [serve] Port 8081 still releasing, waiting...
29
- [serve] Port 8081 still releasing, waiting...
30
- [serve] Port 8081 still releasing, waiting...
31
- [serve] Port 8081 still releasing, waiting...
32
- [serve] Port 8081 still releasing, waiting...
33
- [serve] Port 8081 still releasing, waiting...
34
- [serve] Port 8081 still releasing, waiting...
35
- [serve] Port 8081 still releasing, waiting...
36
- [serve] Port 8081 still releasing, waiting...
37
- [serve] Port 8081 still releasing, waiting...
38
- [serve] Port 8081 still releasing, waiting...
39
- [serve] Port 8081 still releasing, waiting...
40
- [serve] Port 8081 still releasing, waiting...
41
- [serve] Port 8081 still releasing, waiting...
42
- [serve] Port 8081 still releasing, waiting...
43
- [serve] Port 8081 still releasing, waiting...
44
- [serve] Port 8081 still releasing, waiting...
45
- [serve] Port 8081 still releasing, waiting...
46
- [serve] Port 8081 still releasing, waiting...
47
- [serve] Port 8081 still releasing, waiting...
48
- [serve] Port 8081 still releasing, waiting...
49
- [serve] Port 8081 still releasing, waiting...
50
- [serve] Port 8081 still releasing, waiting...
51
- [serve] Port 8081 still releasing, waiting...
52
- [serve] Port 8081 still releasing, waiting...
53
- [serve] Port 8081 still releasing, waiting...
54
- [serve] Port 8081 still releasing, waiting...
55
- [serve] Port 8081 still releasing, waiting...
56
- [serve] Port 8081 still releasing, waiting...
57
- [serve] Port 8081 still releasing, waiting...
58
-
59
- ✗ Port 8081 is still in use after waiting 10s.
60
- A stale process may be holding it. Run 'ppm stop', then start again.
61
- If it persists, run PowerShell as Admin: netsh int tcp reset (then restart).
62
-
63
- error: script "dev:server" exited with code 1
@@ -1,7 +0,0 @@
1
- MAIN1 MAIN1 // Scratch file for the Document PiP spike. Monaco autosaves edits here; safe to delete.
2
- export const spikeLine1 = "one";
3
- export const spikeLine2 = "two";
4
- export const spikeLine3 = "three";
5
- export function spikeFn(a: number, b: number): number {
6
- return a + b;
7
- }