@xingular/harness 0.1.7 → 1.1.1

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 (819) hide show
  1. package/CHANGELOG.md +125 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +239 -86
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +17853 -13114
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/agents/builtin.d.ts +2 -0
  18. package/dist/sdk/agents/builtin.js +34 -0
  19. package/dist/sdk/agents/narrow.d.ts +13 -0
  20. package/dist/sdk/agents/narrow.js +29 -0
  21. package/dist/sdk/agents/profiles.d.ts +80 -0
  22. package/dist/sdk/agents/profiles.js +221 -0
  23. package/dist/sdk/annotations/bridge.d.ts +42 -0
  24. package/dist/sdk/annotations/bridge.js +264 -0
  25. package/dist/sdk/annotations/capture.d.ts +116 -0
  26. package/dist/sdk/annotations/capture.js +308 -0
  27. package/dist/sdk/annotations/delivery.d.ts +72 -0
  28. package/dist/sdk/annotations/delivery.js +130 -0
  29. package/dist/sdk/annotations/inspect.d.ts +10 -0
  30. package/dist/sdk/annotations/inspect.js +33 -0
  31. package/dist/sdk/annotations/isolated.d.ts +6 -0
  32. package/dist/sdk/annotations/isolated.js +51 -0
  33. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  34. package/dist/sdk/annotations/pageScript.js +570 -0
  35. package/dist/sdk/annotations/part.d.ts +10 -0
  36. package/dist/sdk/annotations/part.js +144 -0
  37. package/dist/sdk/annotations/queue.d.ts +4 -0
  38. package/dist/sdk/annotations/queue.js +40 -0
  39. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  40. package/dist/sdk/annotations/serverMethods.js +62 -0
  41. package/dist/sdk/annotations/store.d.ts +160 -0
  42. package/dist/sdk/annotations/store.js +386 -0
  43. package/dist/sdk/browser/config.d.ts +16 -0
  44. package/dist/sdk/browser/config.js +22 -0
  45. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  46. package/dist/sdk/browser/diagnostics.js +38 -0
  47. package/dist/sdk/browser/index.d.ts +28 -0
  48. package/dist/sdk/browser/index.js +72 -0
  49. package/dist/sdk/browser/network.d.ts +10 -0
  50. package/dist/sdk/browser/network.js +59 -0
  51. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  52. package/dist/sdk/browser/serverMethods.js +7 -0
  53. package/dist/sdk/browser/session.d.ts +85 -0
  54. package/dist/sdk/browser/session.js +228 -0
  55. package/dist/sdk/browser/tools.d.ts +8 -0
  56. package/dist/sdk/browser/tools.js +329 -0
  57. package/dist/sdk/capabilities/api.d.ts +22 -0
  58. package/dist/sdk/capabilities/api.js +54 -0
  59. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  60. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  61. package/dist/sdk/capabilities/types.d.ts +29 -0
  62. package/dist/sdk/capabilities/types.js +1 -0
  63. package/dist/sdk/cli.d.ts +2 -0
  64. package/dist/sdk/cli.js +150 -0
  65. package/dist/sdk/core/bus.d.ts +23 -0
  66. package/dist/sdk/core/bus.js +76 -0
  67. package/dist/sdk/core/caller.d.ts +22 -0
  68. package/dist/sdk/core/caller.js +16 -0
  69. package/dist/sdk/core/changes.d.ts +15 -0
  70. package/dist/sdk/core/changes.js +15 -0
  71. package/dist/sdk/core/effort.d.ts +2 -0
  72. package/dist/sdk/core/effort.js +1 -0
  73. package/dist/sdk/core/env.d.ts +18 -0
  74. package/dist/sdk/core/env.js +8 -0
  75. package/dist/sdk/core/errors.d.ts +15 -0
  76. package/dist/sdk/core/errors.js +24 -0
  77. package/dist/sdk/core/frontmatter.d.ts +12 -0
  78. package/dist/sdk/core/frontmatter.js +50 -0
  79. package/dist/sdk/core/fs.d.ts +18 -0
  80. package/dist/sdk/core/fs.js +106 -0
  81. package/dist/sdk/core/index.d.ts +24 -0
  82. package/dist/sdk/core/index.js +187 -0
  83. package/dist/sdk/core/path.d.ts +7 -0
  84. package/dist/sdk/core/path.js +79 -0
  85. package/dist/sdk/core/projects.d.ts +18 -0
  86. package/dist/sdk/core/projects.js +67 -0
  87. package/dist/sdk/core/secrets.d.ts +2 -0
  88. package/dist/sdk/core/secrets.js +5 -0
  89. package/dist/sdk/core/text.d.ts +7 -0
  90. package/dist/sdk/core/text.js +40 -0
  91. package/dist/sdk/doctor/checks.d.ts +5 -0
  92. package/dist/sdk/doctor/checks.js +208 -0
  93. package/dist/sdk/doctor/probe.d.ts +4 -0
  94. package/dist/sdk/doctor/probe.js +92 -0
  95. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  96. package/dist/sdk/doctor/serverMethods.js +8 -0
  97. package/dist/sdk/doctor/service.d.ts +23 -0
  98. package/dist/sdk/doctor/service.js +144 -0
  99. package/dist/sdk/doctor/types.d.ts +141 -0
  100. package/dist/sdk/doctor/types.js +29 -0
  101. package/dist/sdk/harness.d.ts +148 -0
  102. package/dist/sdk/harness.js +338 -0
  103. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  104. package/dist/sdk/history/lessonPrompt.js +15 -0
  105. package/dist/sdk/history/lessons.d.ts +52 -0
  106. package/dist/sdk/history/lessons.js +173 -0
  107. package/dist/sdk/history/recall.d.ts +68 -0
  108. package/dist/sdk/history/recall.js +199 -0
  109. package/dist/sdk/history/serverMethods.d.ts +3 -0
  110. package/dist/sdk/history/serverMethods.js +8 -0
  111. package/dist/sdk/history/trajectory.d.ts +7 -0
  112. package/dist/sdk/history/trajectory.js +216 -0
  113. package/dist/sdk/hub/catalog.json +123 -0
  114. package/dist/sdk/hub/cli.d.ts +7 -0
  115. package/dist/sdk/hub/cli.js +81 -0
  116. package/dist/sdk/hub/hub.d.ts +74 -0
  117. package/dist/sdk/hub/hub.js +474 -0
  118. package/dist/sdk/hub/schema.d.ts +280 -0
  119. package/dist/sdk/hub/schema.js +78 -0
  120. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  121. package/dist/sdk/hub/serverMethods.js +11 -0
  122. package/dist/sdk/index.d.ts +73 -0
  123. package/dist/sdk/index.js +55 -0
  124. package/dist/sdk/mcp/connections.d.ts +83 -0
  125. package/dist/sdk/mcp/connections.js +676 -0
  126. package/dist/sdk/mcp/manager.d.ts +26 -0
  127. package/dist/sdk/mcp/manager.js +124 -0
  128. package/dist/sdk/mcp/oauth.d.ts +35 -0
  129. package/dist/sdk/mcp/oauth.js +171 -0
  130. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  131. package/dist/sdk/mcp/scopeMigration.js +198 -0
  132. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  133. package/dist/sdk/mcp/serverMethods.js +22 -0
  134. package/dist/sdk/mcp/service.d.ts +160 -0
  135. package/dist/sdk/mcp/service.js +510 -0
  136. package/dist/sdk/mcp/types.d.ts +131 -0
  137. package/dist/sdk/mcp/types.js +49 -0
  138. package/dist/sdk/pi/runtime.d.ts +13 -0
  139. package/dist/sdk/pi/runtime.js +31 -0
  140. package/dist/sdk/plugins/api.d.ts +66 -0
  141. package/dist/sdk/plugins/api.js +155 -0
  142. package/dist/sdk/plugins/attachments.d.ts +46 -0
  143. package/dist/sdk/plugins/attachments.js +111 -0
  144. package/dist/sdk/plugins/builtin.d.ts +7 -0
  145. package/dist/sdk/plugins/builtin.js +163 -0
  146. package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
  147. package/dist/sdk/plugins/builtinRegistry.js +49 -0
  148. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  149. package/dist/sdk/plugins/catalogue.js +196 -0
  150. package/dist/sdk/plugins/cli.d.ts +13 -0
  151. package/dist/sdk/plugins/cli.js +188 -0
  152. package/dist/sdk/plugins/discover.d.ts +42 -0
  153. package/dist/sdk/plugins/discover.js +115 -0
  154. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  155. package/dist/sdk/plugins/firstParty.js +113 -0
  156. package/dist/sdk/plugins/hooks.d.ts +94 -0
  157. package/dist/sdk/plugins/hooks.js +162 -0
  158. package/dist/sdk/plugins/identity.d.ts +19 -0
  159. package/dist/sdk/plugins/identity.js +48 -0
  160. package/dist/sdk/plugins/install.d.ts +20 -0
  161. package/dist/sdk/plugins/install.js +110 -0
  162. package/dist/sdk/plugins/inventory.d.ts +22 -0
  163. package/dist/sdk/plugins/inventory.js +110 -0
  164. package/dist/sdk/plugins/manifest.d.ts +13 -0
  165. package/dist/sdk/plugins/manifest.js +56 -0
  166. package/dist/sdk/plugins/plugins.d.ts +104 -0
  167. package/dist/sdk/plugins/plugins.js +164 -0
  168. package/dist/sdk/plugins/runtime.d.ts +9 -0
  169. package/dist/sdk/plugins/runtime.js +95 -0
  170. package/dist/sdk/plugins/trust.d.ts +44 -0
  171. package/dist/sdk/plugins/trust.js +120 -0
  172. package/dist/sdk/plugins/types.d.ts +159 -0
  173. package/dist/sdk/plugins/types.js +7 -0
  174. package/dist/sdk/prompt/compile.d.ts +177 -0
  175. package/dist/sdk/prompt/compile.js +413 -0
  176. package/dist/sdk/refine/cli.d.ts +4 -0
  177. package/dist/sdk/refine/cli.js +186 -0
  178. package/dist/sdk/refine/demo.d.ts +21 -0
  179. package/dist/sdk/refine/demo.js +114 -0
  180. package/dist/sdk/refine/evidence.d.ts +55 -0
  181. package/dist/sdk/refine/evidence.js +330 -0
  182. package/dist/sdk/refine/host.d.ts +51 -0
  183. package/dist/sdk/refine/host.js +76 -0
  184. package/dist/sdk/refine/ledger.d.ts +48 -0
  185. package/dist/sdk/refine/ledger.js +76 -0
  186. package/dist/sdk/refine/library.d.ts +55 -0
  187. package/dist/sdk/refine/library.js +177 -0
  188. package/dist/sdk/refine/pi.d.ts +72 -0
  189. package/dist/sdk/refine/pi.js +248 -0
  190. package/dist/sdk/refine/prompts.d.ts +45 -0
  191. package/dist/sdk/refine/prompts.js +390 -0
  192. package/dist/sdk/refine/recursion.d.ts +113 -0
  193. package/dist/sdk/refine/recursion.js +258 -0
  194. package/dist/sdk/refine/runner.d.ts +81 -0
  195. package/dist/sdk/refine/runner.js +150 -0
  196. package/dist/sdk/refine/selection.d.ts +57 -0
  197. package/dist/sdk/refine/selection.js +251 -0
  198. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  199. package/dist/sdk/refine/serverMethods.js +20 -0
  200. package/dist/sdk/refine/service.d.ts +84 -0
  201. package/dist/sdk/refine/service.js +165 -0
  202. package/dist/sdk/refine/suite.d.ts +67 -0
  203. package/dist/sdk/refine/suite.js +174 -0
  204. package/dist/sdk/refine/trajectory.d.ts +9 -0
  205. package/dist/sdk/refine/trajectory.js +68 -0
  206. package/dist/sdk/refine/types.d.ts +77 -0
  207. package/dist/sdk/refine/types.js +10 -0
  208. package/dist/sdk/server/methods.d.ts +3 -0
  209. package/dist/sdk/server/methods.js +293 -0
  210. package/dist/sdk/server/params.d.ts +4 -0
  211. package/dist/sdk/server/params.js +11 -0
  212. package/dist/sdk/server/remote.d.ts +19 -0
  213. package/dist/sdk/server/remote.js +84 -0
  214. package/dist/sdk/server/rpc.d.ts +20 -0
  215. package/dist/sdk/server/rpc.js +102 -0
  216. package/dist/sdk/server/serve.d.ts +10 -0
  217. package/dist/sdk/server/serve.js +18 -0
  218. package/dist/sdk/sessions/approvals.d.ts +47 -0
  219. package/dist/sdk/sessions/approvals.js +119 -0
  220. package/dist/sdk/sessions/continuation.d.ts +48 -0
  221. package/dist/sdk/sessions/continuation.js +85 -0
  222. package/dist/sdk/sessions/contracts.d.ts +551 -0
  223. package/dist/sdk/sessions/contracts.js +338 -0
  224. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  225. package/dist/sdk/sessions/extensionUi.js +64 -0
  226. package/dist/sdk/sessions/history.d.ts +16 -0
  227. package/dist/sdk/sessions/history.js +68 -0
  228. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  229. package/dist/sdk/sessions/lineageJoin.js +61 -0
  230. package/dist/sdk/sessions/planMode.d.ts +39 -0
  231. package/dist/sdk/sessions/planMode.js +93 -0
  232. package/dist/sdk/sessions/policy.d.ts +43 -0
  233. package/dist/sdk/sessions/policy.js +1 -0
  234. package/dist/sdk/sessions/pricing.d.ts +34 -0
  235. package/dist/sdk/sessions/pricing.js +40 -0
  236. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  237. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  238. package/dist/sdk/sessions/registry.d.ts +103 -0
  239. package/dist/sdk/sessions/registry.js +386 -0
  240. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  241. package/dist/sdk/sessions/runIndex.js +65 -0
  242. package/dist/sdk/sessions/runStore.d.ts +66 -0
  243. package/dist/sdk/sessions/runStore.js +337 -0
  244. package/dist/sdk/sessions/runner.d.ts +213 -0
  245. package/dist/sdk/sessions/runner.js +589 -0
  246. package/dist/sdk/sessions/sessions.d.ts +152 -0
  247. package/dist/sdk/sessions/sessions.js +461 -0
  248. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  249. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  250. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  251. package/dist/sdk/sessions/sideQuestions.js +290 -0
  252. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  253. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  254. package/dist/sdk/sessions/subagentService.d.ts +52 -0
  255. package/dist/sdk/sessions/subagentService.js +265 -0
  256. package/dist/sdk/sessions/subagents.d.ts +58 -0
  257. package/dist/sdk/sessions/subagents.js +87 -0
  258. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  259. package/dist/sdk/terminal/accountsMenu.js +392 -0
  260. package/dist/sdk/terminal/browser.d.ts +62 -0
  261. package/dist/sdk/terminal/browser.js +41 -0
  262. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  263. package/dist/sdk/terminal/browserControl.js +186 -0
  264. package/dist/sdk/terminal/cli.d.ts +20 -0
  265. package/dist/sdk/terminal/cli.js +121 -0
  266. package/dist/sdk/terminal/client.d.ts +15 -0
  267. package/dist/sdk/terminal/client.js +126 -0
  268. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  269. package/dist/sdk/terminal/commandHelp.js +20 -0
  270. package/dist/sdk/terminal/control.d.ts +4 -0
  271. package/dist/sdk/terminal/control.js +25 -0
  272. package/dist/sdk/terminal/controller.d.ts +78 -0
  273. package/dist/sdk/terminal/controller.js +383 -0
  274. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  275. package/dist/sdk/terminal/hubMenu.js +34 -0
  276. package/dist/sdk/terminal/launch.d.ts +5 -0
  277. package/dist/sdk/terminal/launch.js +27 -0
  278. package/dist/sdk/terminal/logs.d.ts +14 -0
  279. package/dist/sdk/terminal/logs.js +59 -0
  280. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  281. package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
  282. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  283. package/dist/sdk/terminal/piExtension.js +377 -0
  284. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  285. package/dist/sdk/terminal/pluginMenu.js +101 -0
  286. package/dist/sdk/terminal/socket.d.ts +73 -0
  287. package/dist/sdk/terminal/socket.js +287 -0
  288. package/dist/sdk/terminal/standalone.d.ts +20 -0
  289. package/dist/sdk/terminal/standalone.js +186 -0
  290. package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
  291. package/dist/sdk/terminal/subagentMonitor.js +121 -0
  292. package/dist/sdk/terminal/terminals.d.ts +212 -0
  293. package/dist/sdk/terminal/terminals.js +1108 -0
  294. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  295. package/dist/sdk/terminal/trajectory.js +30 -0
  296. package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
  298. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  299. package/dist/sdk/terminal/tui/chrome.js +169 -0
  300. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  301. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  302. package/dist/sdk/terminal/tui/commandPages.d.ts +11 -0
  303. package/dist/sdk/terminal/tui/commandPages.js +111 -0
  304. package/dist/sdk/terminal/tui/commands.d.ts +46 -0
  305. package/dist/sdk/terminal/tui/commands.js +399 -0
  306. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  307. package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
  308. package/dist/sdk/terminal/tui/dialogs.d.ts +80 -0
  309. package/dist/sdk/terminal/tui/dialogs.js +370 -0
  310. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  311. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  312. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  313. package/dist/sdk/terminal/tui/list.js +196 -0
  314. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  315. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  316. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  317. package/dist/sdk/terminal/tui/modelPicker.js +150 -0
  318. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  319. package/dist/sdk/terminal/tui/mouse.js +3 -0
  320. package/dist/sdk/terminal/tui/page.d.ts +17 -0
  321. package/dist/sdk/terminal/tui/page.js +1 -0
  322. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  323. package/dist/sdk/terminal/tui/pageOverlay.js +156 -0
  324. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
  325. package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
  326. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  327. package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
  328. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
  329. package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
  330. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  331. package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
  332. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  333. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  334. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
  335. package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
  336. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  337. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  338. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  339. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  340. package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
  341. package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
  342. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  343. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  344. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  345. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  346. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
  347. package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
  348. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +23 -0
  349. package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
  350. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +65 -0
  351. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +450 -0
  352. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  353. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  354. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  355. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  356. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  357. package/dist/sdk/terminal/tui/planMode.js +2 -0
  358. package/dist/sdk/terminal/tui/pluginCommands.d.ts +14 -0
  359. package/dist/sdk/terminal/tui/pluginCommands.js +27 -0
  360. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  361. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  362. package/dist/sdk/terminal/tui/questions.d.ts +21 -0
  363. package/dist/sdk/terminal/tui/questions.js +42 -0
  364. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  365. package/dist/sdk/terminal/tui/runtime.js +443 -0
  366. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  367. package/dist/sdk/terminal/tui/search.js +60 -0
  368. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  369. package/dist/sdk/terminal/tui/selection.js +16 -0
  370. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  371. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  372. package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
  373. package/dist/sdk/terminal/tui/settingsModel.js +114 -0
  374. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  375. package/dist/sdk/terminal/tui/sideQuestion.js +230 -0
  376. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  377. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  378. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  379. package/dist/sdk/terminal/tui/status.js +67 -0
  380. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  381. package/dist/sdk/terminal/tui/theme.js +176 -0
  382. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  383. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  384. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  385. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  386. package/dist/sdk/terminal/tui/ui.d.ts +49 -0
  387. package/dist/sdk/terminal/tui/ui.js +149 -0
  388. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  389. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  390. package/dist/sdk/tools/askUser.d.ts +6 -0
  391. package/dist/sdk/tools/askUser.js +92 -0
  392. package/dist/sdk/tools/checklist.d.ts +9 -0
  393. package/dist/sdk/tools/checklist.js +54 -0
  394. package/dist/sdk/tools/definitions.d.ts +30 -0
  395. package/dist/sdk/tools/definitions.js +117 -0
  396. package/dist/sdk/tools/dispatch.d.ts +16 -0
  397. package/dist/sdk/tools/dispatch.js +67 -0
  398. package/dist/sdk/tools/harnessTools.d.ts +8 -0
  399. package/dist/sdk/tools/harnessTools.js +20 -0
  400. package/dist/sdk/tools/sessionName.d.ts +7 -0
  401. package/dist/sdk/tools/sessionName.js +31 -0
  402. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  403. package/dist/sdk/tools/spawnSubagent.js +58 -0
  404. package/dist/sdk/tools/types.d.ts +48 -0
  405. package/dist/sdk/tools/types.js +1 -0
  406. package/dist/sdk/variant/components.d.ts +34 -0
  407. package/dist/sdk/variant/components.js +230 -0
  408. package/dist/sdk/variant/materialise.d.ts +66 -0
  409. package/dist/sdk/variant/materialise.js +81 -0
  410. package/dist/sdk/variant/migrate.d.ts +4 -0
  411. package/dist/sdk/variant/migrate.js +41 -0
  412. package/dist/sdk/variant/seed.d.ts +20 -0
  413. package/dist/sdk/variant/seed.js +116 -0
  414. package/dist/sdk/variant/store.d.ts +82 -0
  415. package/dist/sdk/variant/store.js +151 -0
  416. package/dist/sdk/variant/surface.d.ts +56 -0
  417. package/dist/sdk/variant/surface.js +81 -0
  418. package/dist/sdk/variant/trust.d.ts +27 -0
  419. package/dist/sdk/variant/trust.js +64 -0
  420. package/dist/sdk/variant/variant.d.ts +71 -0
  421. package/dist/sdk/variant/variant.js +331 -0
  422. package/dist/sdk/web/markdown.d.ts +10 -0
  423. package/dist/sdk/web/markdown.js +66 -0
  424. package/dist/sdk/web/part.d.ts +10 -0
  425. package/dist/sdk/web/part.js +6 -0
  426. package/dist/sdk/web/safeRequest.d.ts +34 -0
  427. package/dist/sdk/web/safeRequest.js +175 -0
  428. package/dist/sdk/web/search.d.ts +53 -0
  429. package/dist/sdk/web/search.js +168 -0
  430. package/dist/sdk/web/serverMethods.d.ts +3 -0
  431. package/dist/sdk/web/serverMethods.js +7 -0
  432. package/dist/sdk/web/text.d.ts +2 -0
  433. package/dist/sdk/web/text.js +7 -0
  434. package/dist/sdk/web/tools.d.ts +22 -0
  435. package/dist/sdk/web/tools.js +195 -0
  436. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  437. package/dist/sdk/wiki/notes.d.ts +68 -0
  438. package/dist/sdk/wiki/notes.js +297 -0
  439. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  440. package/dist/sdk/wiki/serverMethods.js +26 -0
  441. package/dist/sdk/worktrees/cli.d.ts +11 -0
  442. package/dist/sdk/worktrees/cli.js +146 -0
  443. package/dist/sdk/worktrees/copy.d.ts +9 -0
  444. package/dist/sdk/worktrees/copy.js +111 -0
  445. package/dist/sdk/worktrees/git.d.ts +16 -0
  446. package/dist/sdk/worktrees/git.js +81 -0
  447. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  448. package/dist/sdk/worktrees/serverMethods.js +30 -0
  449. package/dist/sdk/worktrees/service.d.ts +73 -0
  450. package/dist/sdk/worktrees/service.js +483 -0
  451. package/dist/sdk/worktrees/setup.d.ts +23 -0
  452. package/dist/sdk/worktrees/setup.js +65 -0
  453. package/dist/sdk/worktrees/types.d.ts +91 -0
  454. package/dist/sdk/worktrees/types.js +1 -0
  455. package/dist/sdk/world/actions.d.ts +23 -0
  456. package/dist/sdk/world/actions.js +31 -0
  457. package/dist/sdk/world/cli.d.ts +12 -0
  458. package/dist/sdk/world/cli.js +166 -0
  459. package/dist/sdk/world/images.d.ts +20 -0
  460. package/dist/sdk/world/images.js +48 -0
  461. package/dist/sdk/world/untrusted.d.ts +12 -0
  462. package/dist/sdk/world/untrusted.js +20 -0
  463. package/dist/sdk/world/world.d.ts +67 -0
  464. package/dist/sdk/world/world.js +79 -0
  465. package/dist/terminal-opentui.js +20778 -0
  466. package/dist/terminal-pi.js +794 -518
  467. package/docs/README.md +42 -0
  468. package/docs/architecture/00-overview.md +171 -0
  469. package/docs/architecture/01-extension-points.md +78 -0
  470. package/docs/architecture/02-sessions-and-runs.md +203 -0
  471. package/docs/architecture/03-variants.md +103 -0
  472. package/docs/architecture/04-prompt.md +122 -0
  473. package/docs/architecture/05-refinement.md +107 -0
  474. package/docs/architecture/06-plugins-and-capabilities.md +129 -0
  475. package/docs/architecture/07-tools-and-gate.md +103 -0
  476. package/docs/architecture/08-memory-and-history.md +94 -0
  477. package/docs/architecture/09-accounts-and-connectors.md +98 -0
  478. package/docs/architecture/10-server-protocol.md +193 -0
  479. package/docs/architecture/11-terminal.md +261 -0
  480. package/docs/architecture/12-storage.md +75 -0
  481. package/docs/architecture/13-world-tools.md +45 -0
  482. package/docs/architecture/14-surfaces-and-parity.md +89 -0
  483. package/docs/architecture/README.md +125 -0
  484. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  485. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  486. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  487. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  488. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  489. package/docs/architecture/proposals/PROP-0006-run-checklist.md +70 -0
  490. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  491. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  492. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  493. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  494. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  495. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  496. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  497. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  498. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  499. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  500. package/docs/architecture/proposals/PROP-0017-page-annotations.md +127 -0
  501. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
  502. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  503. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  504. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  505. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  506. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  507. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  508. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  509. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
  510. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  511. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  512. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  513. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  514. package/docs/architecture/proposals/README.md +101 -0
  515. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  516. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  517. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  518. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  519. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  520. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  521. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  522. package/docs/decisions/ADR-0009-xharness-command.md +39 -0
  523. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  524. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  525. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  526. package/docs/decisions/ADR-0013-doctor.md +27 -0
  527. package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
  528. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  529. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  530. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  531. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  532. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  533. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  534. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  535. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  536. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  537. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  538. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  539. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  540. package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
  541. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  542. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  543. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  544. package/docs/doctor.md +80 -0
  545. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  546. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  547. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  548. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  549. package/docs/features/README.md +46 -0
  550. package/docs/features/automations/README.md +41 -0
  551. package/docs/features/cores/README.md +39 -0
  552. package/docs/features/google-harness2/README.md +52 -0
  553. package/docs/features/integrations/README.md +40 -0
  554. package/docs/features/interfaces/README.md +29 -0
  555. package/docs/features/memory/README.md +28 -0
  556. package/docs/future-work.md +48 -0
  557. package/docs/parity.md +78 -0
  558. package/docs/releases/1.0.0.md +40 -0
  559. package/docs/releases/4.0.0.md +46 -0
  560. package/docs/releases/README.md +41 -0
  561. package/docs/study/00-index.md +83 -0
  562. package/docs/study/arms/00-matrix.md +20 -0
  563. package/docs/study/arms/01-system-prompt.md +211 -0
  564. package/docs/study/arms/02-tools.md +79 -0
  565. package/docs/study/arms/03-subagents.md +90 -0
  566. package/docs/study/arms/04-skills.md +75 -0
  567. package/docs/study/arms/05-context-management.md +90 -0
  568. package/docs/study/arms/06-memory.md +90 -0
  569. package/docs/study/arms/07-governance.md +71 -0
  570. package/docs/study/arms/08-execution.md +69 -0
  571. package/docs/study/arms/09-observability.md +60 -0
  572. package/docs/study/arms/10-refinement.md +110 -0
  573. package/docs/study/autonomous-engineering-sources.md +277 -0
  574. package/docs/study/autonomy-sources.md +147 -0
  575. package/docs/study/btw-comparison.md +37 -0
  576. package/docs/study/feature-gap-review.md +42 -0
  577. package/docs/study/insights.md +123 -0
  578. package/docs/study/proactive-autonomy.md +408 -0
  579. package/docs/study/roadmap.md +72 -0
  580. package/docs/study/sources/claude-code.md +44 -0
  581. package/docs/study/sources/deepseek-harness.md +102 -0
  582. package/docs/study/sources/harness2.md +50 -0
  583. package/docs/study/sources/kimi-cli.md +42 -0
  584. package/docs/study/sources/omp.md +93 -0
  585. package/docs/study/sources/opencode.md +43 -0
  586. package/docs/study/sources/openhands.md +46 -0
  587. package/docs/study/sources/smolagents.md +40 -0
  588. package/docs/study/sources/swe-agent.md +34 -0
  589. package/docs/study/tui-resource-browser.md +78 -0
  590. package/docs/system-prompt-design.md +196 -0
  591. package/docs/terminal-tui.md +707 -58
  592. package/package.json +43 -13
  593. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  594. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  595. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  596. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  597. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  598. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  599. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  600. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  601. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  602. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  603. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  604. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  605. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  606. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  607. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  608. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  609. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  610. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  611. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  612. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  613. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  614. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  615. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  616. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  617. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  618. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  619. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  620. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  621. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  622. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  623. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  624. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  625. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  626. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  627. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  628. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  629. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  630. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  631. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  632. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  633. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  634. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  635. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  636. package/src/accounts/accounts.test.ts +0 -333
  637. package/src/accounts/accounts.ts +0 -658
  638. package/src/accounts/env.test.ts +0 -95
  639. package/src/accounts/env.ts +0 -338
  640. package/src/accounts/secrets.ts +0 -50
  641. package/src/accounts/store.ts +0 -338
  642. package/src/capabilities/api.ts +0 -75
  643. package/src/capabilities/runSnapshot.ts +0 -59
  644. package/src/capabilities/types.ts +0 -34
  645. package/src/cli.ts +0 -118
  646. package/src/core/bus.ts +0 -34
  647. package/src/core/changes.ts +0 -33
  648. package/src/core/env.ts +0 -27
  649. package/src/core/errors.ts +0 -32
  650. package/src/core/frontmatter.ts +0 -47
  651. package/src/core/fs.test.ts +0 -38
  652. package/src/core/fs.ts +0 -92
  653. package/src/core/index.ts +0 -193
  654. package/src/core/path.test.ts +0 -14
  655. package/src/core/path.ts +0 -79
  656. package/src/core/projects.ts +0 -90
  657. package/src/core/text.ts +0 -39
  658. package/src/harness.ts +0 -312
  659. package/src/hub/catalog.json +0 -123
  660. package/src/hub/cli.ts +0 -59
  661. package/src/hub/hub.test.ts +0 -205
  662. package/src/hub/hub.ts +0 -256
  663. package/src/hub/schema.ts +0 -81
  664. package/src/index.ts +0 -75
  665. package/src/mcp/connections.ts +0 -614
  666. package/src/mcp/manager.ts +0 -130
  667. package/src/mcp/oauth.ts +0 -195
  668. package/src/mcp/scopeMigration.test.ts +0 -79
  669. package/src/mcp/scopeMigration.ts +0 -204
  670. package/src/mcp/service.test.ts +0 -376
  671. package/src/mcp/service.ts +0 -549
  672. package/src/mcp/types.ts +0 -108
  673. package/src/memory/api.test.ts +0 -82
  674. package/src/memory/api.ts +0 -303
  675. package/src/memory/blocks.test.ts +0 -78
  676. package/src/memory/blocks.ts +0 -408
  677. package/src/memory/caller.ts +0 -69
  678. package/src/memory/curation.test.ts +0 -163
  679. package/src/memory/curation.ts +0 -64
  680. package/src/memory/dispatch.ts +0 -59
  681. package/src/memory/facts.test.ts +0 -41
  682. package/src/memory/facts.ts +0 -248
  683. package/src/memory/graph.ts +0 -103
  684. package/src/memory/health.test.ts +0 -130
  685. package/src/memory/health.ts +0 -74
  686. package/src/memory/maintainer.ts +0 -272
  687. package/src/memory/maintenance.test.ts +0 -176
  688. package/src/memory/maintenance.ts +0 -518
  689. package/src/memory/migrate.ts +0 -79
  690. package/src/memory/operations.ts +0 -150
  691. package/src/memory/proposals.test.ts +0 -168
  692. package/src/memory/proposals.ts +0 -584
  693. package/src/memory/recall.test.ts +0 -115
  694. package/src/memory/recall.ts +0 -278
  695. package/src/memory/references.ts +0 -77
  696. package/src/memory/runContext.ts +0 -93
  697. package/src/memory/secrets.ts +0 -6
  698. package/src/memory/store.test.ts +0 -66
  699. package/src/memory/store.ts +0 -385
  700. package/src/memory/wiki.test.ts +0 -47
  701. package/src/memory/wiki.ts +0 -422
  702. package/src/memory/wikiIndex.test.ts +0 -88
  703. package/src/memory/wikiIndex.ts +0 -116
  704. package/src/plugins/api.ts +0 -181
  705. package/src/plugins/attachments.test.ts +0 -84
  706. package/src/plugins/attachments.ts +0 -141
  707. package/src/plugins/builtin.ts +0 -82
  708. package/src/plugins/catalogue.test.ts +0 -254
  709. package/src/plugins/catalogue.ts +0 -251
  710. package/src/plugins/cli.ts +0 -184
  711. package/src/plugins/discover.ts +0 -151
  712. package/src/plugins/firstParty.test.ts +0 -143
  713. package/src/plugins/firstParty.ts +0 -129
  714. package/src/plugins/hooks.test.ts +0 -250
  715. package/src/plugins/hooks.ts +0 -239
  716. package/src/plugins/identity.ts +0 -37
  717. package/src/plugins/install.test.ts +0 -107
  718. package/src/plugins/install.ts +0 -106
  719. package/src/plugins/inventory.ts +0 -123
  720. package/src/plugins/manifest.ts +0 -76
  721. package/src/plugins/plugins.test.ts +0 -205
  722. package/src/plugins/plugins.ts +0 -189
  723. package/src/plugins/proposal.ts +0 -121
  724. package/src/plugins/runtime.test.ts +0 -40
  725. package/src/plugins/runtime.ts +0 -82
  726. package/src/plugins/trust.ts +0 -142
  727. package/src/plugins/types.ts +0 -149
  728. package/src/prompt/compile.test.ts +0 -261
  729. package/src/prompt/compile.ts +0 -732
  730. package/src/server/methods.ts +0 -349
  731. package/src/server/remote.ts +0 -77
  732. package/src/server/rpc.ts +0 -116
  733. package/src/server/serve.ts +0 -28
  734. package/src/server/server.test.ts +0 -174
  735. package/src/sessions/approvals.ts +0 -118
  736. package/src/sessions/contracts.ts +0 -336
  737. package/src/sessions/conversation.test.ts +0 -177
  738. package/src/sessions/extensionSession.test.ts +0 -74
  739. package/src/sessions/extensionUi.test.ts +0 -65
  740. package/src/sessions/extensionUi.ts +0 -102
  741. package/src/sessions/history.ts +0 -51
  742. package/src/sessions/lineageJoin.ts +0 -75
  743. package/src/sessions/policy.ts +0 -36
  744. package/src/sessions/pricing.ts +0 -60
  745. package/src/sessions/questionBatches.test.ts +0 -110
  746. package/src/sessions/reasoningSummaries.ts +0 -59
  747. package/src/sessions/registry.ts +0 -381
  748. package/src/sessions/runIndex.ts +0 -99
  749. package/src/sessions/runStore.test.ts +0 -152
  750. package/src/sessions/runStore.ts +0 -332
  751. package/src/sessions/runner.ts +0 -604
  752. package/src/sessions/runtimeResources.test.ts +0 -61
  753. package/src/sessions/sessions.test.ts +0 -549
  754. package/src/sessions/sessions.ts +0 -339
  755. package/src/skills/registry.test.ts +0 -104
  756. package/src/skills/registry.ts +0 -413
  757. package/src/terminal/accountsMenu.test.ts +0 -225
  758. package/src/terminal/accountsMenu.ts +0 -382
  759. package/src/terminal/cli.ts +0 -149
  760. package/src/terminal/client.ts +0 -74
  761. package/src/terminal/control.test.ts +0 -23
  762. package/src/terminal/control.ts +0 -23
  763. package/src/terminal/controller.ts +0 -291
  764. package/src/terminal/hubMenu.ts +0 -24
  765. package/src/terminal/launch.test.ts +0 -25
  766. package/src/terminal/launch.ts +0 -48
  767. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  768. package/src/terminal/piExtension.ts +0 -259
  769. package/src/terminal/pluginControl.test.ts +0 -146
  770. package/src/terminal/pluginMenu.ts +0 -112
  771. package/src/terminal/socket.test.ts +0 -71
  772. package/src/terminal/socket.ts +0 -232
  773. package/src/terminal/standalone.test.ts +0 -167
  774. package/src/terminal/standalone.ts +0 -153
  775. package/src/terminal/terminal.test.ts +0 -399
  776. package/src/terminal/terminals.ts +0 -553
  777. package/src/terminal/tui/application.test.ts +0 -114
  778. package/src/terminal/tui/application.ts +0 -491
  779. package/src/terminal/tui/commands.test.ts +0 -218
  780. package/src/terminal/tui/commands.ts +0 -361
  781. package/src/terminal/tui/dialogs.ts +0 -301
  782. package/src/terminal/tui/editor.test.ts +0 -84
  783. package/src/terminal/tui/editor.ts +0 -79
  784. package/src/terminal/tui/keybindings.test.ts +0 -22
  785. package/src/terminal/tui/keybindings.ts +0 -50
  786. package/src/terminal/tui/piAdapter.ts +0 -62
  787. package/src/terminal/tui/presentation.test.ts +0 -79
  788. package/src/terminal/tui/questions.test.ts +0 -41
  789. package/src/terminal/tui/questions.ts +0 -47
  790. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  791. package/src/terminal/tui/runtime.test.ts +0 -215
  792. package/src/terminal/tui/runtime.ts +0 -388
  793. package/src/terminal/tui/sessionUi.ts +0 -24
  794. package/src/terminal/tui/settings.test.ts +0 -150
  795. package/src/terminal/tui/settings.ts +0 -188
  796. package/src/terminal/tui/status.test.ts +0 -70
  797. package/src/terminal/tui/status.ts +0 -109
  798. package/src/terminal/tui/theme.ts +0 -174
  799. package/src/terminal/tui/tools.test.ts +0 -145
  800. package/src/terminal/tui/tools.ts +0 -142
  801. package/src/terminal/tui/transcript.test.ts +0 -25
  802. package/src/terminal/tui/transcript.ts +0 -124
  803. package/src/terminal/tui/ui.test.ts +0 -313
  804. package/src/terminal/tui/ui.ts +0 -166
  805. package/src/terminal/tui/welcome.ts +0 -102
  806. package/src/tools/askUser.test.ts +0 -69
  807. package/src/tools/askUser.ts +0 -59
  808. package/src/tools/definitions.ts +0 -187
  809. package/src/tools/maintenance.ts +0 -24
  810. package/src/tools/memoryTools.ts +0 -22
  811. package/src/tools/pluginPropose.ts +0 -41
  812. package/src/tools/registryWrite.test.ts +0 -101
  813. package/src/tools/registryWrite.ts +0 -182
  814. package/src/tools/spawnSubagent.ts +0 -92
  815. package/src/tools/types.ts +0 -39
  816. package/src/web/safeRequest.ts +0 -171
  817. package/src/web/text.ts +0 -53
  818. package/src/web/tools.ts +0 -134
  819. package/src/web/web.test.ts +0 -141
@@ -1,30 +1,159 @@
1
1
  # Harness terminal frontend
2
2
 
3
- Status: implemented in the working tree; publication is separate. Last updated: 2026-10-17.
4
- Decision: [ADR-0001](decisions/ADR-0001-owned-terminal.md).
3
+ Status: release candidate `@xingular/harness` 4.0.0; npm publication blocked by registry authorization. Last updated: 2026-10-24.
4
+ Decision: [ADR-0001](decisions/ADR-0001-owned-terminal.md),
5
+ [ADR-0006](decisions/ADR-0006-opentui-only-terminal.md),
6
+ [ADR-0009](decisions/ADR-0009-xharness-command.md),
7
+ [ADR-0021](decisions/ADR-0021-required-command-namespaces.md),
8
+ [ADR-0024](decisions/ADR-0024-xagent-command.md),
9
+ [ADR-0026](decisions/ADR-0026-contextual-question-wireframes.md),
10
+ [ADR-0027](decisions/ADR-0027-connected-sketch-display.md),
11
+ [ADR-0028](decisions/ADR-0028-xingular-agent-product-identity.md).
5
12
 
6
- ## Ownership and process boundary
13
+ ## OpenTUI terminal
14
+
15
+ OpenTUI/Solid, built from [`src/terminal/opentui/`](../src/terminal/opentui/), is the only terminal
16
+ frontend. It needs Bun 1.3.14 or newer for its build and runtime:
17
+
18
+ ```sh
19
+ npm run build:tui
20
+ node dist/cli.js terminal
21
+ ```
7
22
 
8
- Harness owns its interactive terminal application in [`src/terminal/tui/`](../src/terminal/tui/).
9
- [`TerminalApplication`](../src/terminal/tui/application.ts) owns terminal lifecycle, screen
10
- composition, focus, input dispatch, scrolling, editor mounting, dialogs and keyboard actions.
11
- It does not construct Pi's `InteractiveMode`. Pi 1.2.0 supplies the persistent agent session,
12
- model and auth runtime, native JSONL history, tool execution and rich content components.
23
+ `npm run build` builds `dist/terminal-opentui.js`; without Bun the build fails, because there is no
24
+ second frontend to fall back to. The harness passes `--conditions=browser` when it launches the
25
+ bundle so Solid resolves to its client build, not its server build. `XINGULAR_HARNESS_BUN`
26
+ overrides the Bun executable.
27
+
28
+ [`app.ts`](../src/terminal/opentui/app.ts) owns the terminal lifecycle and reuses the shared
29
+ `TerminalRuntime`, session replacement, commands, decisions, account pinning and run records. It
30
+ projects the runtime's snapshot and transcript into an OpenCode-inspired view, with a native
31
+ OpenTUI textarea for the prompt, `Ctrl+K` for the command palette, `Return` to send (or to queue behind a running reply),
32
+ `Cmd+Return` (or `Alt+Return`) to steer a running reply, and `Shift+Return` for a newline. With an
33
+ empty composer, unmodified Up recalls the latest non-empty user message from the active session.
34
+ After recall, unmodified Up/Down are available for normal editor movement and do not browse history
35
+ while the draft is non-empty. Ctrl+Up/Down remain explicit history shortcuts; Down past the newest
36
+ entry restores a blank draft. History comes from the active Pi session's saved messages, so `/new`
37
+ and `/session` (also `/resume`) switch to that session's history. Steering needs a terminal that reports Cmd with the
38
+ kitty keyboard protocol; elsewhere `Alt+Return` steers. In the composer, `Tab` opens up to eight matching filesystem entries for the path token at the cursor, or current-folder entries when the token is empty. The list has no heading or hint row. Up/Down select; Enter or Tab inserts the selection; Escape closes the list. Directories end in `/`, and Bash mode escapes shell-special characters. Use `/effort` or Shift+Up/Down to change effort. The command palette opens above the composer under a muted (`dim`) top rule, and has no other border. Its rows align slash commands and descriptions in two columns: the command column sizes to the widest visible name, bounded to preserve description space, and both columns wrap instead of truncating. The plan-choice rule, question block's top-only divider, and `/btw` block's top rule use the same muted color as the normal composer divider. The console has no background of its own: the renderer, root surface
39
+ and transcript are transparent, so the terminal's own background shows through, while panels,
40
+ dialogs and the scrim stay opaque. The composer has no panel background: it is bounded by a top and
41
+ a bottom rule, with the working status and spinner above it and a wrapping status bar below it. Its
42
+ fixed-width left gutter shows `❯` on the first input row and leaves continuation rows blank, including
43
+ explicit newlines and soft wraps; Bash mode shows `!` on the first row instead. In plan mode,
44
+ `plan mode` is right-aligned within the top rule, followed by exactly one divider character. The status bar shows the working folder's name and Git branch together as `<repo>:<branch>`, followed by the account, model and effort separated by spaces, and input (`↑`) and output (`↓`) token counts with each glyph adjacent to its count; `|` separates the groups. Token counts
45
+ below 1,000 show as whole numbers and larger counts use K/M/B suffixes. A leading `!`
46
+ enters Bash mode: the chevron becomes `!`, and the marker and both rules use the `bashMode` colour.
47
+ In plan mode, the marker and rules use the plan blue and `plan mode` is right-aligned within the
48
+ top rule with exactly one divider character after it; in the normal prompt, the marker matches the divider. The command body keeps the normal
49
+ text color. Every terminal animates the same star
50
+ glyphs (`·✢✳✶✻✽`) while working, with Ghostty's existing variant; there is no ASCII line fallback.
51
+ Extension dialogs, pages, custom editors, widgets, headers and footers keep using Pi's component
52
+ API through [`dialogHost.ts`](../src/terminal/opentui/dialogHost.ts): a small fake `TUI` renders
53
+ `Component.render(width)` ANSI into stacked overlays and forwards raw key sequences. Extensions
54
+ never receive an OpenTUI renderable or a second account. A theme an extension selects still colors
55
+ its own components, while the OpenTUI chrome keeps the fixed OpenCode-inspired palette. Component
56
+ UI is supported; an extension that draws only by writing raw ANSI through the TUI terminal is not.
57
+
58
+ Most pages become centered dialogs. The page commands `/permissions`, `/log`, the `/model` and
59
+ `/history` pickers, and
60
+ the `select`, `confirm`, `input` and `editor` dialogs (such as `/effort` and the Thinking setting),
61
+ take 80% of the terminal, capped at 100 columns by 30 rows, on a flat panel in the console's panel
62
+ colour. A full-screen scrim dims the console behind the panel so the transcript stays faintly
63
+ visible. Centered Harness dialogs fit their rendered content, capped by the available dialog
64
+ height, with four columns of horizontal padding and two rows of vertical padding to account for
65
+ the terminal's taller-than-wide cells. They use a plain title with a muted `Esc` hint and
66
+ omit divider rules and footer hints. Shortcut behavior remains available. Searchable lists share
67
+ the same glyph, placeholder, spacing, and muted result note, with search context included on that
68
+ row. A terminal too small for a 30-column by
69
+ 12-row dialog falls back to the full-screen page chrome. A plugin's full-screen surface stays full
70
+ screen. `/settings` fills the terminal with its category tabs, search, settings list and full-screen
71
+ page chrome. `/accounts` also fills the terminal with Accounts/Pools tabs and search. Wide terminals
72
+ show selected-account details beside the list; opening an account reveals grouped actions in that
73
+ inspector. On compact terminals, opening an account replaces the list with a full-page detail view
74
+ and its grouped actions. `Enter` opens the selected account; `Esc` returns to the list. Tab and
75
+ Shift+Tab move focus between tabs, the list and (when open) actions; Left/Right changes a focused
76
+ tab and Up/Down moves the focused list or action list. Search, section and account selection survive
77
+ returning and resizing.
78
+ Account actions are grouped by Session, Account, Sign-in and Remove; pool
79
+ actions are grouped by Manage and Remove. Existing confirmations and account-service calls remain
80
+ unchanged. The Harness resource browser and all its shortcuts use a full-screen page with persistent
81
+ resource-section tabs.
82
+
83
+ The frontend is verified with a real isolated PTY and a loopback provider. Run
84
+ `python3 scripts/verify-terminal.py --welcome-only --sizes 40x20,80x24,120x40` to check the empty
85
+ welcome, product label, accent colors and `/help` transition. Run
86
+ `python3 scripts/verify-terminal.py --composer-only` for recognized slash-command colors in the composer
87
+ and a user bubble, unknown-command and argument colors, explicit-newline and soft-wrap checks of both
88
+ prompt gutters, and normal/plan/Bash mode exclusivity. Run it with `--sizes 40x20,80x24,120x40` for
89
+ compact through wide layouts. Use `--file-completion-only` for filesystem completion and insertion,
90
+ `--history-only` for active-session history across `/new` and `/session`, `--help-only` for `/help` replacing the welcome screen with grouped two-column output that wraps without per-command gaps, `--questions-only` for recommended choices,
91
+ selected-row and Continue/Submit colors, `--jump-latest-only` for scroll-away badge visibility and click-to-latest (screen-level click assertions use optional `pyte`), and choice-backed “Something else” answers, or `--thinking-only` for `/thinking` visibility toggles. The full suite covers a complete turn, `read`, `bash` approval, `ask_user_question` approval and picker, plugin overlay/widget/status
92
+ disposal, a completed run record with usage and decision events, `/help`, `/permissions`,
93
+ `/settings`, `/model`, palette selection, confirm cancel, and Ctrl+D exit. `--questions-only` checks
94
+ recommended choices, bounded literal ASCII sketch previews, focus-driven preview changes and answer
95
+ colors; run it with `--sizes 40x20,80x24,120x40` for compact through wide layouts. At 80 columns and
96
+ above it also checks wrapped notes and free-text; the narrowest run keeps the sketch and answer
97
+ interaction compact. The normal turn omits question tools; plan-mode flows exercise `ask_user` batches
98
+ and `ask_user_question` cancellation. Live-provider behavior, exact OpenCode parity and concurrent
99
+ session tabs are not established.
100
+
101
+ ## Native subagents (2026-10-18)
102
+
103
+ Interactive terminal turns use the same `harness.subagents` service as SDK callers. The bridge
104
+ registers the current run's effective tools, resolved model, thinking level and pinned account
105
+ through its private control channel; a read-only terminal narrows child capabilities and broker
106
+ access. `spawn_subagent` returns immediately, `wait_subagents` joins selected children, and
107
+ `wait: true` on spawn returns an inline result. Native receipts deduplicate automatic delivery.
108
+ The terminal joins outstanding children before its final reply, projects child approvals/questions
109
+ with their original run IDs, and stops descendants when interrupted or disposed. Connected apps
110
+ need not be enabled. `TerminalPrepareInput.subagents: null` disables the capability.
111
+
112
+ The terminal also projects the active parent's subagent descendants into live rows under the
113
+ status line and a searchable `/subagents` page. The rows poll a private monitor route once per
114
+ second during a turn. They sit one blank row below the status line, with no heading, and each
115
+ reads: the status mark, the agent profile name in its colour (`subagent` for a copy of the
116
+ parent), the title the parent gave the child (PROP-0030), and `n of m tasks` from the child's own
117
+ checklist. At most three show, active first, then `+N more · /subagents`. The `/subagents` page
118
+ adds status, elapsed time and the latest tool name. The projection is read-only, flat across nested
119
+ descendants, and scoped to the current parent run; it keeps finished child rows until that parent
120
+ settles. It never includes tool arguments (beyond the title), output or
121
+ checklist item text.
122
+
123
+ `/agents` opens the Agents page (PROP-0029): built-in, global, project and variant profiles with
124
+ their tools, plugins, variant, model and instructions. Enter on a row edits a person's own profile
125
+ in `$VISUAL`/`$EDITOR`, copies one, or deletes one after confirmation; New profile writes a template
126
+ in the project or global folder and opens it.
127
+
128
+ Real scripted Pi execution over the actual terminal socket verifies result delivery, decision
129
+ routing, and the monitor's parent scoping and summary redaction. It does not establish live-provider
130
+ behavior. See
131
+ [ADR-0003](decisions/ADR-0003-shared-asynchronous-subagents.md) for recovery and lifecycle details.
13
132
 
14
- The parent process still calls `Terminals.prepare()`, spawns its returned specification in a
15
- PTY or inherited terminal, and eventually calls `dispose()`. Its default command is the active
16
- Node runtime followed by the existing Harness CLI and `terminal-frontend`; it requires no global
17
- `pi` command. `TerminalAssets` remains `{ node, cli, piExtension }`, and the existing
18
- `prepare`, `send`, `state`, `input` and `dispose` contracts remain in place. The `piExtension`
19
- path remains the final prepared extension argument. The owned runtime recognizes that bridge
20
- position and loads its trusted, bundled factory inline after the selected disk extensions.
133
+ ## Ownership and process boundary
134
+
135
+ Harness owns its interactive terminal application in
136
+ [`src/terminal/opentui/`](../src/terminal/opentui/). [`app.ts`](../src/terminal/opentui/app.ts)
137
+ owns terminal lifecycle, submission, commands, decisions and run records;
138
+ [`root.tsx`](../src/terminal/opentui/root.tsx) owns composition, the transcript, the composer,
139
+ palette and dialogs. It does not construct Pi's `InteractiveMode`. Pi 1.2.0 supplies the
140
+ persistent agent session, model and auth runtime, native JSONL history, tool execution and rich
141
+ content components.
142
+
143
+ The parent process calls `Terminals.prepare()`, spawns its returned specification in a PTY or
144
+ inherited terminal, and eventually calls `dispose()`. Its command is Bun with
145
+ `--conditions=browser` and the built `dist/terminal-opentui.js`; it requires no global `pi`
146
+ command. `TerminalAssets` is `{ node, cli, piExtension, openTui }`, and the existing `prepare`,
147
+ `send`, `state`, `input` and `dispose` contracts remain in place. The `piExtension` path remains
148
+ the final prepared extension argument. The runtime recognizes that bridge position and loads its
149
+ trusted, bundled factory inline after the selected disk extensions.
21
150
 
22
151
  ```text
23
152
  Harness parent: account + compiled context + trusted resources + run writer
24
153
  | launch specification / existing session socket
25
- Harness terminal child: TerminalApplication + persistent Pi AgentSessionRuntime
154
+ Harness terminal child: OpenTUI application + persistent Pi AgentSessionRuntime
26
155
  | typed native events / plugin UI callbacks
27
- Harness screen: welcome, transcript, status band, editor, dialogs and overlays
156
+ Harness screen: transcript above the composer, with centered page dialogs and blocks
28
157
  ```
29
158
 
30
159
  [`runtime.ts`](../src/terminal/tui/runtime.ts) builds a public `AgentSessionRuntime` around
@@ -41,6 +170,261 @@ prompts. Reusing `sessions.run` for each prompt would recreate and dispose a ses
41
170
  turn and overlap the terminal controller's run lifecycle. That API remains the embedding and
42
171
  unattended execution path.
43
172
 
173
+ ## Screen layout
174
+
175
+ [`root.tsx`](../src/terminal/opentui/root.tsx) draws the terminal on OpenTUI's alternate screen.
176
+ An empty conversation shows a centered welcome. The default `Xingular Agent` identity appears as
177
+ an orange block `X` and blue letter-spaced `A G E N T`, followed by `Welcome.`, the tagline
178
+ `One run, done well.`, and a blue `/help` hint. Explicit host product names use the same generic mark and
179
+ subline formatting. The current model and thinking level remain available in dim text. Once a message
180
+ exists, a scrollable transcript fills the space above the composer. Single-line notices can appear
181
+ with the welcome, while multiline notices such as `/help` switch to the transcript layout so their
182
+ output cannot overlap it. The composer is a single top and bottom rule, with the right-aligned `plan mode` label followed by one divider character in the top rule,
183
+ and the textarea in the middle.
184
+ The working status row shows the active verb with a soft, warm glint that feathers across it and
185
+ fades past its edges, followed by run duration and the latest completed assistant response's output
186
+ rate, formatted as `(time, tok/s)`; the spinner and metrics stay steady, and duration updates during a run.
187
+ Until response usage is available, the rate shows `— tok/s`. On settlement, the completion verb and
188
+ final run statistics stay in that row until the next run replaces them; they do not become a transcript
189
+ entry. Notifications, queue announcements and retry updates—including retries while summarizing
190
+ context or branches—are one-line transcript entries at the point they occur, so subsequent chat
191
+ moves them up rather than keeping them pinned at the bottom.
192
+
193
+ While context compaction runs, the working line shows `Compacting context` (or `Retrying
194
+ compaction`) with the same spinner, in place of the working verb. During a run it keeps the run's
195
+ clock; a `/compact` while idle shows the spinner with its own clock. Compaction does not start a new
196
+ session or hide earlier chat. After it, the transcript shows, in order: the whole conversation from
197
+ before the compaction (rebuilt from Pi's session history, kept messages included); a rule labelled
198
+ `Context compacted · <tokens> tokens`; the summary printed as a normal reply; an `End of summary`
199
+ rule; then the work that followed. The summary is shown by default. Clicking either rule hides or
200
+ shows it, and Ctrl+O shows every summary again. On a narrow screen the rule drops the click hint, then
201
+ the token count. Earlier compactions in the same session keep their own rules and summary in place.
202
+ Notices stay after the message they followed. The model still sees only the summary and the recent
203
+ messages; this is presentation only.
204
+ Transcript entry ids follow positions in the displayed message list, so when a rebuilt list moves a
205
+ different kind of entry onto an id, the renderer builds a new component for it instead of reusing the
206
+ old layout, and each entry draws inside its own error boundary. A run therefore keeps updating live
207
+ through a compaction; it does not need `/resume` to show its later output.
208
+ A successful copy shows a temporary, opaque toast anchored at the terminal's top-right. Interactive blocks and widgets remain docked above the composer. A wrapping status bar
209
+ below the composer shows `<repo>:<branch>`, account, model, effort and token totals, with `|` between groups. After
210
+ the input token count it shows cache hit rate as `R<percentage>%`, calculated from cache reads divided
211
+ by total input tokens. The footer shows status messages without a shortcut-hint row. Press `?` with an empty
212
+ composer to open the shortcut reference. Transcript entries include
213
+ messages, thinking, tools, notices and extension ANSI components. Image blocks returned by tools
214
+ appear as separate image-result entries immediately after their tool call, within the scrollable
215
+ transcript; they move up with newer chat. The `/settings` Show images option controls whether the
216
+ image data is rendered. Mouse-wheel scrolling and PgUp/PgDn
217
+ move the transcript without moving the composer; Ctrl+Home and Ctrl+End jump to its beginning and
218
+ end. A narrow `▕` thumb marks transcript position at the right edge; its mouse and keyboard scrolling remain native. The transcript has one blank row between each pair of entries, including assistant replies,
219
+ thinking, tools, image results, notices, summaries, custom messages, user messages, plan cards and
220
+ Bash entries. User, plan and Bash bubbles also have one blank row of internal padding above and below
221
+ their content; other entries have no internal vertical padding. Bubble padding is additional to the
222
+ inter-entry gap. Internal lines within an entry stay together. The transcript stays pinned to the
223
+ latest message until you scroll away. While scrolled away, a `↓ Jump to latest` badge overlays the
224
+ transcript's lower-right corner; clicking it returns to the newest message and hides the badge.
225
+ `Ctrl+End` remains an alternate way to jump to the end. A primary click in the transcript or empty
226
+ welcome area focuses the composer. Dragging to select text anywhere in the TUI—including the
227
+ composer, transcript, widgets, dialogs and pages—copies the selected plain text when selection ends;
228
+ a simple click does not copy. `/copy` and `Ctrl+X` continue to copy the latest assistant reply.
229
+
230
+ Mouse movement highlights the row under the pointer in the command palette, plan choices, question
231
+ dock, searchable dialogs and Harness page lists; the highlight uses the same selection style as
232
+ keyboard navigation. A primary click activates the row, and clicks on page tabs switch that page's
233
+ section. In `/accounts`, clicking an account opens its inspector or compact detail view, and clicking
234
+ an action runs the existing account flow. Question choices still stage their answer until the
235
+ question's action is clicked. Dialogs preserve their existing confirmation safeguards. OpenTUI enables terminal mouse-motion reporting for
236
+ hover; terminals or multiplexers that do not report motion retain keyboard navigation. ANSI-only
237
+ custom UI without a mouse handler remains keyboard-driven.
238
+
239
+ Page dialogs and blocks are absolute overlays, so the transcript stays behind them. The screen
240
+ restores the terminal's alternate-screen state when the application exits.
241
+
242
+ ### Markdown transcript
243
+
244
+ Assistant replies, plan-card bodies and Markdown image-result text share one style map. Heading
245
+ levels use the Harness palette; links are blue and underlined, and only their labels appear in the
246
+ transcript. Hovering a supported link changes the terminal pointer to a hand and shows a `Click to
247
+ open link` hint in the status bar. A primary click opens it with the system browser; only valid
248
+ HTTP and HTTPS destinations are accepted, and the launcher receives the URL as an argument without
249
+ a shell. OSC 8 metadata is emitted where available, but link activation does not depend on terminal
250
+ OSC 8 support. Inline and fenced code use a subtle panel fill with syntax colors. Emphasis, quotes,
251
+ list markers, tables, dividers and task-list markers use the existing titanium palette. Images
252
+ display their alt text and are not fetched or rendered as image files.
253
+
254
+ ## Checklist block
255
+
256
+ `checklist_write` is registered in terminal sessions (PAR-001). Each call renders in the
257
+ transcript as a checklist block: a status mark, `Checklist · n of m done`, then one line per item
258
+ with `✓` (done, success colour), `●` (in progress, warning yellow, bold) or `○` (pending, dim). A call whose
259
+ arguments are not a checklist, or that failed, stays an ordinary tool row. The prompt's Progress
260
+ group asks the model to keep the list current because the user follows work from it.
261
+
262
+ ## Blocks and pages
263
+
264
+ In Pi's own terminal UI, [`chrome.ts`](../src/terminal/tui/chrome.ts) gives terminal surfaces one
265
+ of two rule-based shapes, using the 2-cell composer gutter on each side and a dim hint row.
266
+
267
+ - A **block** docks at the bottom like the slash-command list above the composer. It has an amber
268
+ (`warning`) rule, a bold title row with an optional dim note at the right edge (a dialog's
269
+ countdown), the body, a hint row, and a neutral (`dim`) closing rule. It is as tall as its body.
270
+ Approvals, questions, and the `select`, `confirm`, `input` and `editor` dialogs use this shape
271
+ there. OpenTUI renders Harness-managed centered dialogs with the inset header treatment below.
272
+ - A **page** is a header row (title left, position or status right), a neutral rule, the body,
273
+ a neutral rule, and the hint row. `/settings`, `/log`, `/permissions`, and the `/accounts`,
274
+ `/plugins` and `/hub` menus are pages. Section labels inside a page are plain bold headings, never
275
+ text set into a rule. `/trajectory` is a full-screen page with searchable Runs and Events
276
+ tabs; its Events view keeps the event list beside the selected event's JSON on wide terminals.
277
+
278
+ `DialogPanel` takes a `variant` (`block` by default). `ui.select` accepts a harness-owned `page`
279
+ option, which Pi's own dialogs ignore, so the same extension code runs in either terminal. Selected
280
+ rows keep the full-width `selectedBg` highlight and `❯` marker the slash-command list uses. Both
281
+ frontends draw that field from the same muted-blue selection palette (`selection.ts`) and use
282
+ explicit high-contrast text on it instead of the accent colour, so a choice reads the same in every
283
+ list. Rules use the theme's `warning` and `dim` colors, so a custom theme restyles them.
284
+
285
+ The Harness resource browser (PROP-0013) unifies Overview, Foundation, Variant, Skills, Plugins,
286
+ Connections, Tools and Library. `/harness` opens Overview; `/skills`, `/plugins`, `/connections`
287
+ (`/mcp`) and `/tools` open sections. `/hub` selects Discover and `/components` selects Library.
288
+ The existing Accounts, Permissions, Settings, Trajectory and Log pages retain their own tabs.
289
+
290
+ `/settings` includes a Browser tab with the device-local **Private address access** setting. It is
291
+ off by default. Enabling it asks for confirmation and allows agent browsing and annotation capture
292
+ to reach localhost and private networks.
293
+
294
+ Resource sections share Installed/Discover and source filters. Installed includes locally present
295
+ resources; current-session availability comes only from the runtime loader and active tool registry.
296
+ Discover uses the existing Hub with All/Community/Official filtering and an explicit remote refresh.
297
+ No matching community entries is an empty result, never replaced with built-in resources.
298
+ The view preserves search across source switches and restores section selection on return.
299
+
300
+ The browser fills the terminal (PROP-0014), with Overview, Foundation, Variant, Skills, Plugins,
301
+ Connections, Tools and Library as persistent top tabs. The section dropdown and sidebar are removed.
302
+ When the strip cannot fit, it shows the active tab and its position with previous/next navigation.
303
+ At 88 content columns, inventory sits beside an inspector containing metadata, actions and readable
304
+ content. Enter focuses the inspector. Its action rows group related tasks under Use, Inspect, Manage,
305
+ Access and Remove. Compact terminals show details/content within the active tab; resizing preserves
306
+ the selected resource and content position, clamped to the available height.
307
+
308
+ Tab/Shift+Tab focuses tabs, source, filter, toolbar actions, list and (when available) inspector.
309
+ Left/Right changes the focused tab or control; Enter on the tab strip returns to the inventory.
310
+ Ctrl+F focuses search. Escape returns from content to actions, returns to the list, clears search,
311
+ then closes. Mouse clicks select tabs directly, activate resource actions and focus filters;
312
+ wheel scrolling targets the list or inspector under the pointer. Other command pages keep their
313
+ centered presentation; `/settings` and `/accounts` use full-screen page layouts. Closing the browser preserves
314
+ the composer draft and attachments.
315
+
316
+ Foundation explains fixed runtime ownership; it is read-only. Variant shows c1–c8 with the
317
+ prepared version and current head separately. It previews pinned files from the preparation
318
+ snapshot and compares their text with the latest saved version. No in-place editing or adoption
319
+ is added. Library skills and rules are added through `terminal.components.add`, which commits a
320
+ validated future version. Directory-backed variants stay read-only.
321
+
322
+ Skill browsing is independent of the Skill commands setting. Use inserts a leading `$name`
323
+ without submitting. Ctrl+K opens a separate command filter; choosing a browser section keeps
324
+ the existing draft text and attachment labels. Canceling the filter restores that draft. OpenTUI completes
325
+ loaded skills for a leading `$`; Enter or Tab inserts the selected skill rather than sending.
326
+ Plugin contributions, settings, attachment and code trust share one detail flow. Package install
327
+ and removal delegate to existing services; installing never trusts or activates code.
328
+
329
+ Connections supports local stdio and remote HTTP forms, masked credentials, explicit scope,
330
+ saved disabled defaults, explicit testing and OAuth sign-in. Browsing never starts an MCP process.
331
+ Saved test results show timestamps rather than claiming a live connection. A Hub connector document
332
+ is inert: a separate setup action validates supported remote-definition fields before opening the
333
+ normal connection form. Other document kinds stay inspectable data. Tools show their owner,
334
+ parameters, active state and saved approval; each call still passes the gate.
335
+
336
+ The typed model is `terminal/browser.ts`; the protected adapter is `terminal/browserControl.ts`.
337
+ The browser accepts resource IDs for bounded regular-file previews, not arbitrary paths. Local
338
+ skill import rejects symbolic links and limits bytes, files and traversal. See
339
+ [source study and wireframes](study/tui-resource-browser.md),
340
+ [PROP-0013](architecture/proposals/PROP-0013-resource-browser.md) and
341
+ [ADR-0015](decisions/ADR-0015-resource-browser.md).
342
+
343
+ ## Annotate pane (PROP-0018)
344
+
345
+ `/plugin:annotate` opens a full-screen page that works beside the window being inspected. That window is one of:
346
+ - the visible capture browser
347
+ - an app's own windows attached over its DevTools port (`--app`)
348
+ - app windows that loaded the page bridge script (`--bridge`)
349
+
350
+ The header shows the target and window and whether the inspector is on. The list has three groups: Queue, Sent and fixed, and Saved. While the inspector is on, the page polls for the next popover comment every 400 ms, shows the result as a notice, and refreshes the list.
351
+
352
+ | Key | Action |
353
+ |---|---|
354
+ | `i` | inspector on/off |
355
+ | `s` | send the queue |
356
+ | `x` | unqueue the selected note |
357
+ | `t` | choose a window |
358
+ | `Enter` | the note menu |
359
+
360
+ The page has no search row, so these letters are free for actions. `/plugin:notes` keeps the searchable list.
361
+
362
+ ## Plan mode and thinking keys
363
+
364
+ Use `/plan <brief>` for one read-only planning request. A plan waits outside Pi's native follow-up
365
+ queue until the active response settles, then runs by itself. Later messages remain behind it, even
366
+ when Pi's follow-up mode is `all`. During that run the session narrows to read-only inspection
367
+ (`read`, `grep`, `find`, `ls`), web search/page reading, questions (`ask_user`, `ask_user_question`)
368
+ and recall (history and Wiki reads, `memory_facts`). Normal mode omits both question tools from the
369
+ active set; the plan request enables registered questions temporarily and restores the normal set
370
+ when it settles, including on failure or interruption. Providers may mark individual calls as safe for
371
+ research; every other call is blocked before approval. Edits, writes, shell commands, memory writes,
372
+ subagents and connected-app tools remain unavailable. The plan instructions arrive as a
373
+ request-scoped prompt section, which the next ordinary request withdraws.
374
+
375
+ Each mode keeps its own model and effort for the account. Every selection the person makes (the model
376
+ picker, `/effort`, Shift+Up/Down, Ctrl+P) is saved against the mode it was made in, so Shift+Tab switches to that
377
+ mode's model and effort, and a new conversation starts on the normal mode's latest choice. A mode with no
378
+ choice of its own takes normal's, field by field. A resumed conversation keeps the model in its history,
379
+ and a saved model the account cannot use is skipped. The choices live in the account's `choices.json`,
380
+ and the App reads and writes them through `accounts.choices` and `accounts.choose`.
381
+
382
+ A bare `/plan` toggles plan mode, and Shift+Tab cycles between normal and plan mode. Normal, plan
383
+ and Bash are mutually exclusive composer modes. While plan mode is on, each submitted message is sent
384
+ as a plan request through that same queue, and the composer's top and bottom rules take the plan colour.
385
+ Commands still run as commands. Entering Bash with a leading `!` exits plan mode; Shift+Tab from Bash
386
+ switches to plan mode and keeps the draft text. Turning plan mode off returns to normal mode. The old
387
+ on/off/toggle forms are rejected; a bare `/plan` is the switch.
388
+
389
+ When a plan request ends with a complete `<proposed_plan>` block, the terminal shows it as a bordered
390
+ card at the end of the reply, with the text around the block left as ordinary assistant text. A choice
391
+ block then appears above the composer with `Plan ready`, a blank row, then `Implement "<title>"` or
392
+ `Edit the plan`, followed by a blank row and the hint. Up and Down choose, Enter confirms, and Escape
393
+ dismisses it; the block yields to the composer as soon as the draft has text.
394
+ Implement leaves plan mode, so the normal tools and the mode's own model and effort come back, and sends
395
+ `Implement the plan: <title>`; the plan itself is already in the conversation. Edit the plan stays in plan
396
+ mode and focuses the composer, so the next message revises the plan and offers a new choice. A plan run
397
+ that was interrupted, failed, or had work queued behind it is not offered.
398
+
399
+ A recognized leading slash command uses the selected theme's link color while typing and in its
400
+ user-message bubble. Only the command token is accented; arguments and unknown slash tokens keep the
401
+ normal text color. Recognition follows the active command registry, including built-in commands and
402
+ aliases, loaded extension and prompt commands, and enabled skill invocations written as
403
+ `/skill:name`.
404
+
405
+ SDK session runs receive plan instructions as a dynamic context update, leaving the stable system
406
+ prompt unchanged; their session gate refuses calls outside the read-only set. The standalone
407
+ terminal applies the same instructions and tool restrictions to each plan request. Shift+Up and
408
+ Shift+Down step the thinking level within the levels the model supports, and do not wrap. Use `/thinking` to toggle transcript thinking visibility, or `/thinking show` and `/thinking hide` to set it explicitly. This changes only whether thinking blocks appear in the transcript; it does not change model reasoning or effort, and it shares the Hide thinking setting with Ctrl+T and `/settings`.
409
+
410
+ ## Bash command mode
411
+
412
+ Typing or pasting `!` at the start of the composer enters Bash mode: the first-row prompt marker
413
+ changes from `❯` to `!`, and the `!` and the composer rules use the `bashMode` theme color while the
414
+ command body keeps the normal text color. Continuation rows keep their blank gutter. Entering Bash
415
+ exits plan mode; Shift+Tab from Bash switches to plan mode and preserves the draft. Plan mode colors
416
+ the marker and rules blue; in the normal prompt, the marker matches the divider color. Backspace on
417
+ an empty Bash body returns to the normal prompt. Submitting while a reply is active queues
418
+ the command as a standalone turn; it does not steer the current model request.
419
+
420
+ The terminal extension checks Bash policy and requests approval before using Pi's native
421
+ `executeBash`. Output streams into the transcript while the command runs, so browser-login URLs are
422
+ visible before the command finishes; the running item shows that Escape stops the command. The
423
+ native result is recorded in run activity and session history before the model is prompted to read
424
+ and explain it. This does not attach interactive stdin to the shell. SDK callers may opt into this
425
+ behavior with `SessionRunInput.initialBashCommand`; it is restricted to a new interactive user turn
426
+ and the session runner applies the same Bash gate.
427
+
44
428
  ## Reference and reproduced presentation
45
429
 
46
430
  The reference is **Oh My Pi 18.11.3**, identified from npm and GitHub on 2026-10-17; its release
@@ -55,33 +439,45 @@ not an arbitrary checkout of upstream main. The source repository is
55
439
  | Native `omp` artifact used for observation | `d518310d647d467a2c5c3f2d38e34489a761996d766395c03b37c61a2203d02b` |
56
440
 
57
441
  In the extracted `pi-tui` package, `src/theme/defaults/titanium.json` establishes the titanium
58
- palette and `src/prompt/welcome.ts` establishes the five-row Pi logo, exact diagonal RGB stops
59
- and indexed-color fallback, centered lockup and narrow-width behavior. Harness adapts these
60
- into [`theme.ts`](../src/terminal/tui/theme.ts) and [`welcome.ts`](../src/terminal/tui/welcome.ts),
61
- with its own product name, package version and existing-command tips. The status band and
62
- curved `╰─` input framing are implemented in [`status.ts`](../src/terminal/tui/status.ts) and
63
- [`editor.ts`](../src/terminal/tui/editor.ts). Startup selects the Harness titanium presentation
64
- without rewriting the user's saved theme settings. The shipped OMP light palette is also
65
- available as `light`; native rich components and the status band switch together. Missing
66
- Pi-specific color tokens use documented Harness fallbacks in `theme.ts`.
442
+ palette and its indexed-color fallbacks. Harness adapts these into
443
+ [`theme.ts`](../src/terminal/tui/theme.ts) and
444
+ [`opentui/theme.ts`](../src/terminal/opentui/theme.ts). The OpenTUI status bar shows the project name and
445
+ branch together as `<repo>:<branch>`, followed by account, model, context use and current-session input/output totals. Input totals add cache
446
+ reads and exclude cache writes; its `R<percentage>%` hit rate is cache reads divided by total input.
447
+ Token counts below 1,000 show as whole numbers; larger counts use floor-rounded K/M/B suffixes
448
+ without decimals.
449
+
450
+ The OpenTUI composer follows the observed composer of Claude Code 2.1.302, reproduced from its
451
+ visible values; no code is copied. The command palette follows the same borderless convention.
452
+ Startup selects the Harness titanium presentation without rewriting the user's saved theme
453
+ settings. The shipped OMP light palette is also available as `light`; native rich components and
454
+ the OpenTUI chrome switch together. Missing Pi-specific color tokens use documented Harness
455
+ fallbacks in `theme.ts`.
67
456
 
68
457
  The frontend exposes capabilities already present in Harness/Pi. It does not import OMP's
69
458
  agent runtime, tools, providers, MCP implementation, task system or other product features.
70
- Harness-owned composition reuses public Pi Markdown, message, tree/model selector and rich
71
- tool components. Tool diffs, expandable output, images and extension renderers therefore retain
72
- the existing Pi interpretation. This is an implementation of the requested terminal presentation;
73
- complete visual or behavioral parity with every OMP surface has not been established.
459
+ OpenTUI owns screen composition and transcript rendering. Dialogs and extensions continue to use
460
+ Pi's component API through `dialogHost.ts`. Image blocks returned by tools appear as separate
461
+ scrollable image-result entries, rendered inline when `/settings` Show images is on; Markdown
462
+ images continue to show alt text only. This is an implementation of the requested terminal
463
+ presentation; complete visual or behavioral parity with every OMP surface has not been established.
74
464
 
75
465
  Full upstream copyright and MIT permission notices are in [NOTICE.md](../NOTICE.md).
76
466
 
77
467
  ## Runtime compatibility adapter
78
468
 
79
469
  Most integration uses public Pi exports. [`piAdapter.ts`](../src/terminal/tui/piAdapter.ts)
80
- contains the remaining implementation dependencies and requires exactly Pi **1.2.0** before
81
- loading them:
470
+ contains the remaining presentation dependencies and requires exactly Pi **1.2.0** before
471
+ loading them. The shared [`runtime.ts`](../src/pi/runtime.ts) loader imports Pi first, then invokes
472
+ the same HTTP dispatcher hook as Pi's CLI before any Harness Pi runtime is used. This reapplies
473
+ the process `HTTP_PROXY`, `HTTPS_PROXY` and `NO_PROXY` settings after Pi's bundled Undici has
474
+ loaded. Account and model checks, sessions, maintenance, plugin discovery and installation,
475
+ pricing, and the standalone terminal all use this loader. It is process-wide and coalesces
476
+ concurrent initialization.
82
477
 
83
478
  | Internal dependency | Reason |
84
479
  |---|---|
480
+ | `dist/bundle/chunks/chunk-TJXZSVTD.js:configureHttpDispatcher` | Restore Pi's environment-aware HTTP proxy dispatcher after the SDK import |
85
481
  | `dist/extensions/index.js` builtin inventory | Preserve selected `llama.cpp`, `codemode`, `tool-search` and MCP builtins with the CLI's replacement semantics |
86
482
  | `dist/modes/interactive/theme/theme.js:setThemeInstance` | Keep public native rich components on the same active theme as the Harness screen |
87
483
  | `dist/core/tools/renderers/index.js:withBuiltInRenderers` | Preserve existing read/edit/bash/write formatting without replacing tool execution |
@@ -89,7 +485,46 @@ loading them:
89
485
 
90
486
  The adapter is initialized once; its global theme setter and renderer lookup are synchronous
91
487
  thereafter. A Pi dependency upgrade must update this adapter deliberately and rerun the
92
- terminal compatibility tests. These module imports do not instantiate `InteractiveMode`.
488
+ terminal compatibility tests. The dispatcher compatibility check also pins the private Pi bundle
489
+ chunk and fails with a clear error if that hook moves or disappears. A local proxy fixture test
490
+ checks that a Pi HTTP request reaches the configured proxy without contacting an external host.
491
+ These module imports do not instantiate `InteractiveMode`.
492
+
493
+ ## Attachments: images and large pastes
494
+
495
+ Images are sent to the model as image content in the same user message, not as file paths
496
+ (`TerminalRuntime.submit(text, followUp, images)` and `submitPlan(text, images)` pass Pi's
497
+ `PromptOptions.images`). [`attachments.ts`](../src/terminal/opentui/attachments.ts) holds the
498
+ draft's attachments; [`composerMarks.ts`](../src/terminal/opentui/composerMarks.ts) keeps one
499
+ virtual OpenTUI extmark on each label, so the label is drawn in the `attachment` colour and the
500
+ cursor, Backspace and Delete treat it as one unit.
501
+
502
+ - **Cmd+V, drag and drop.** The composer intercepts the terminal's bracketed paste. An empty paste
503
+ (what terminals send when the clipboard holds only an image) reads the clipboard; a paste made
504
+ only of existing image paths — escaped, quoted, `file://` or one unescaped path — attaches those
505
+ files. `Ctrl+V` (and `Alt+V`) on macOS, `Ctrl+V` elsewhere, read the clipboard directly, and a
506
+ `super+v` key from a terminal that forwards Cmd+V does the same.
507
+ - **Labels.** An image shows as `[Image #n]`. A paste of more than three lines or 800 characters
508
+ shows as `[Pasted text #n +L lines]` (or `… N chars]`). Numbering restarts after each send.
509
+ - **Deleting.** Backspace or Delete next to a label removes it whole. A word or line delete that
510
+ cuts into a label removes the rest of it, and the attachment goes with it.
511
+ - **Sending.** Pasted text is put back in place of its label; image labels stay in the text so the
512
+ model can refer to "Image #1", and the images follow in label order. Sent user messages colour
513
+ `[Image #n]` the same way. Images are resized with Pi's `resizeImage`; one that cannot be
514
+ shrunk and is over 5 MB is refused.
515
+ - **Refusals.** A model whose `input` lacks `image` refuses the attach with a notice naming the
516
+ model. Bash mode and plugin editors take no images. A slash command or Bash command sent with
517
+ images runs without them, with a warning. Alt+Up (dequeue) restores queued text and drops
518
+ queued images with a warning.
519
+
520
+ Finder-copied file paths are read before clipboard image pixels. On macOS, `.heic` and `.heif`
521
+ files are converted with `/usr/bin/sips` to private temporary PNGs, preserving the copied path
522
+ order and leaving the originals untouched; temporary files are removed when the terminal shuts
523
+ down. Clipboard image pixels go through Pi's native adapter, which reads PNG/TIFF on macOS and
524
+ normalizes TIFF to PNG. `python3 scripts/verify-terminal.py --attachments-only` checks a dropped
525
+ image path, label colour, collapsed pastes, whole-label Backspace and Alt+Backspace, and that the
526
+ loopback provider receives an image part and the expanded text. Whether a given emulator sends an
527
+ empty bracketed paste for an image-only clipboard has to be checked by hand in that emulator.
93
528
 
94
529
  ## Accounts, history and resource trust
95
530
 
@@ -98,7 +533,7 @@ personal Pi profile. Provider authentication and model catalogs use that account
98
533
  The selected account stays pinned. The existing `/accounts` command requests a parent-managed
99
534
  restart to use a different account while resuming the conversation.
100
535
 
101
- An initial `--session` or `/resume` target must resolve inside the prepared history directory,
536
+ An initial `--session` option or `/session` target (also accepted as `/resume`) must resolve inside the prepared history directory,
102
537
  including symlink targets, and its stored absolute working folder must match the terminal's
103
538
  canonical working folder. `/import` may copy an explicitly selected external native JSONL file
104
539
  only when its recorded working folder matches. A caller cannot override a foreign recorded
@@ -122,12 +557,22 @@ second key once with `control.claim`, before plugin code loads. [`control.ts`](.
122
557
  retains it in a process-local promise shared with the bridge; it is never written to disk or
123
558
  placed in the environment. It survives `/new`, resume, fork and reload.
124
559
 
125
- The private key is required for `terminal.pending`, `terminal.approve`, `terminal.answer`,
126
- `terminal.draft`, `terminal.interrupt` and `terminal.resources`, as well as existing account and
127
- plugin mutations. A model-spawned shell with only the environment token cannot answer its own
128
- pending questions or approvals. The application renders decisions obtained from the existing
560
+ The private key is required for `terminal.policy`, `terminal.approval`, `terminal.pending`,
561
+ `terminal.approve`, `terminal.answer`, `terminal.draft`, `terminal.interrupt` and
562
+ `terminal.resources`, as well as existing account and plugin mutations. A model-spawned shell with
563
+ only the environment token cannot submit policy or approval decisions, change permissions, or
564
+ answer its own pending questions. The application renders decisions obtained from the existing
129
565
  controller and returns the person's answer through these calls.
130
566
 
567
+ Approval prompts offer **Allow once**, **Always allow this tool everywhere** when the host policy
568
+ marks the decision rememberable, and **Deny**. A tool grant covers every call with that tool name
569
+ in Pi terminal sessions using this device's local Harness state directory; for example, Bash grants
570
+ cover every Bash command. `/permissions` lists those grants and lets the person revoke them. Its
571
+ Full Permission switch approves future eligible prompts across those terminal sessions, asks for
572
+ confirmation when enabled, and is off by default. Neither choice approves an already-pending
573
+ request. Hard denials and disabled tools remain enforced; human-only requests stay manual unless
574
+ the host explicitly permits Full Permission for them. Chat approvals keep their separate profile.
575
+
131
576
  The editor sends exact draft state to `terminal.draft`; host delivery waits for that state
132
577
  instead of overwriting a draft. Interruption resolves pending socket-backed questions and
133
578
  approvals in the run registry before awaiting Pi abort. Disposal uses that order too, avoiding
@@ -135,13 +580,76 @@ a tool waiting forever on a question after the screen has closed. Native `sessio
135
580
  clears controller readiness and stops that session's poller; the replacement's `session_start`
136
581
  restores readiness while retaining the same process control claim.
137
582
 
138
- The bridge exposes the shared `ask_user` batch tool alongside the existing single-question
139
- `ask_user_question` contract. Registry events project the actual batch IDs, order, summaries,
140
- choices and descriptions into the terminal inbox. The frontend stages answers locally and
141
- submits them together through protected `terminal.answers`; the registry validates the entire
142
- batch before resolving any question. Escape interrupts a pending question; cancelling optional
143
- text entry returns to the choices and preserves selections. Disappearing requests abort their
144
- open dialogs. Labels are numbered so a real choice cannot collide with a dialog action.
583
+ The bridge registers the shared `ask_user` batch tool alongside the single-question
584
+ `ask_user_question` contract; only plan requests activate them. Each question has a concise 1–2 word
585
+ label, at least one choice, and at least one recommended choice; recommendations remain visual and
586
+ never preselect. Choice-based questions also retain a free-text “Something else” answer. A pending
587
+ question appears in a flat block immediately above the composer, not in a modal. It has only a muted
588
+ top divider and separates its hint from the content by one blank line; below 60 terminal columns,
589
+ it uses a compact hint. The body is height-bounded and vertically scrollable, with tabs and
590
+ answer/action controls outside that region. While the dock is active, PageUp/PageDown scroll its
591
+ body and Ctrl+Home/End jump to its beginning/end instead of the transcript. Focused choices and
592
+ note fields are brought into view. A tab strip shows each
593
+ question label above the active question title, with one blank row below the tabs and below the title;
594
+ clicking a tab or using Left/Right changes questions without discarding staged answers. The header has
595
+ no pager controls, and the block cannot be collapsed. Choices and descriptions appear above the numbered free-text answer and Continue or Skip
596
+ action. Selected choices fill the whole row with subtle dark green; Continue and Submit uses a
597
+ green-filled button, while Skip remains neutral. While the block is active, the chat composer and
598
+ its lower status bar are hidden. Tab and Shift+Tab move through the available controls; `n` opens a
599
+ note for the focused selected choice. Its editor appears below that choice, aligned with the description
600
+ column, and begins with an accent-colored `Note:` label. Tab only visits note fields that are already
601
+ open. Notes are submitted by choice label and cleared when that choice is deselected. Notes and
602
+ free-text answers wrap across lines. Tab takes precedence over normal thinking and plan-mode shortcuts. Up
603
+ and Down navigate choices. Enter selects a choice, activates the focused action, or submits the
604
+ answer or note field. Escape cancels the pending question and interrupts the run.
605
+
606
+ Questions may set `uiSketch: true` to enable a choice sketch preview. Every choice must then include
607
+ an ASCII sketch of 1–24 LF-separated lines, no more than 80 printable ASCII characters per line
608
+ (1,943 bytes maximum), and at least one visible character. Tabs, CR, controls, escape sequences and
609
+ non-ASCII text are rejected. Without the flag, choice sketches are rejected. Tool guidance asks for
610
+ contextual UI wireframes with actual panel/table structure and neighboring elements, consistent
611
+ across alternatives, rather than isolated decorative diagrams; quality is not a schema guarantee.
612
+
613
+ The dock uses one shared measured layout for all choices: marker gutter, one-third label cell,
614
+ two-cell gap, and remaining description cell. Boundaries align across rows at every width, including
615
+ compact terminals; both cells wrap independently, missing descriptions keep their cell, and columns
616
+ never stack. Recommendation text becomes `(Rec.)` when the label column is fewer than 14 cells.
617
+
618
+ One shared border-only monospace preview below the choices follows the hovered choice, falling
619
+ back to keyboard focus. It has no visible caption or extra left rule. Under the approved
620
+ [PROP-0026](architecture/proposals/PROP-0026-connected-sketch-display.md) /
621
+ [ADR-0027](decisions/ADR-0027-connected-sketch-display.md) and
622
+ [PROP-0028](architecture/proposals/PROP-0028-normalize-question-wireframes.md) /
623
+ [ADR-0029](decisions/ADR-0029-normalized-question-wireframe-borders.md) amendments,
624
+ the terminal display uses a bounded structural projection in
625
+ `src/terminal/opentui/sketchPanel.ts`: recognized ASCII table-border rows—including title-bearing
626
+ top rules—and enclosed vertical table edges become connected box-drawing glyphs. Internal framed
627
+ tables keep their original widths and positions. Within a high-confidence frame, a missing side
628
+ edge may be filled or a displaced edge moved only through whitespace to matched corner columns;
629
+ interior text and ambiguous rows remain literal. Bare standalone hyphen divider rows expand to
630
+ `max(panel viewport width, original sketch widest line)` and attach to the outer single-line frame
631
+ with `├` and `┤`. Prose, content operators, ordinary pipes and unrecognized rows remain literal;
632
+ there is no global `+|-` substitution. The original validated ASCII source, including whitespace,
633
+ is persisted untouched; normalization and projected glyphs are display-only.
634
+
635
+ A bounded two-axis viewport exposes all overflow without wrapping, reflow, truncation or
636
+ Markdown/ANSI interpretation. Shift+arrows pan the sketch; ordinary arrows retain question/choice
637
+ navigation. Hosts may keep literal previews of that same source. The preview does not change the
638
+ selected answer, and sketch metadata is not included in the answer event. The 80×24 source bounds
639
+ and dock layout remain as specified by
640
+ [PROP-0025](architecture/proposals/PROP-0025-contextual-question-wireframes.md) and
641
+ [ADR-0026](decisions/ADR-0026-contextual-question-wireframes.md). Isolated production PTY evidence
642
+ for [PROP-0026](architecture/proposals/PROP-0026-connected-sketch-display.md) and
643
+ [PROP-0028](architecture/proposals/PROP-0028-normalize-question-wireframes.md) is retained under
644
+ `docs/evidence/terminal-wireframe-normalization/`; it does not claim every-emulator rendering or
645
+ live-model sketch quality.
646
+
647
+ Recommended choices appear first with a warning-colored marker, without changing their labels or
648
+ preselecting them; every question requires at least one recommendation. A single-choice question
649
+ allows at most one recommendation, while multi-select questions may recommend several. The frontend stages each answer locally and submits the complete
650
+ batch together through protected `terminal.answers`; a single question uses `terminal.answer`. The
651
+ registry validates answers before resolving the request. If a request disappears, its block and
652
+ staged answers are discarded.
145
653
 
146
654
  Plugin UI methods carry a generation guard, including methods a plugin retained before an
147
655
  `await`. Session replacement, reload and disposal revoke the old generation. Outgoing native
@@ -149,16 +657,105 @@ event subscriptions and custom transcript components detach before native invali
149
657
  Cleanup failures cannot prevent terminal restoration. Fatal asynchronous errors restore the
150
658
  terminal and exit with failure; startup failures and suspend/resume use the same lifecycle.
151
659
 
152
- The command registry supplies help and completion for every pinned Pi built-in command name,
153
- plus Harness commands supplied by the bridge. `/trust` opens the existing protected code-review
154
- workflow in `/plugins`; trust changes require a freshly prepared terminal. `/bug` opens a
155
- reviewable Harness issue draft after confirmation, without attaching history. `/changelog`
156
- reads bundled Harness change notes. `/reload` also applies the isolated account's edited
157
- keyboard bindings through the public TUI manager.
660
+ The command registry supplies help and slash completion for Harness commands, loaded extensions
661
+ and prompts. `/session` selects a saved session (`/resume` remains an alias), and `/history` navigates
662
+ branches in the current session (`/tree` remains an alias). `/btw <question>` asks a side question;
663
+ `/side` is its alias. Help and the slash-command palette show each pair once, as `/session (resume)`,
664
+ `/history (tree)` and `/btw (side)`; aliases still match palette searches.
665
+ The separate `$` palette completes enabled skill invocations; `/skills` always browses skills. `/help`
666
+ renders the command list as one transcript entry, grouped under Core, Run, Model, Session, Inspect,
667
+ Harness, Plugins and Prompts; command names and descriptions wrap in aligned columns, with no
668
+ blank rows between choices. `/plugins` opens the browser with protected code trust and plugin settings actions. Settings use
669
+ `plugins.configure`; on/off settings and bounded whole-number settings keep their existing ranges.
670
+ Saved settings are read when the plugin next uses them and do not require a restart. The standalone
671
+ terminal no longer has separate `/login`, `/trust`, `/bug`, `/changelog`, `/share`, `/scoped-mode` or
672
+ `/import` commands. `/btw <question>` (or `/side <question>`) starts a separate Harness run with the
673
+ main run's effective instructions, visible conversation and redacted public tool inputs/results.
674
+ Hidden reasoning and image bytes are excluded; the side run has no tools. Its block puts the
675
+ question after `/btw`, shows the normal animated spinner while answering, and separates the answer
676
+ and hint by one blank row; it has no status labels. PageUp/PageDown browse a long answer and Ctrl+X
677
+ copies the full answer. Escape or either command with no question dismisses the dock and interrupts
678
+ only that side run; the main reply continues. `/stop` interrupts the current main reply. The `/accounts` page handles sign-in
679
+ and sign-out. `/components` browses reusable skills, prompts and rules; a confirmed skill or rule addition
680
+ creates a variant version for future sessions while the current terminal keeps its pinned version. `/reload` applies trusted resource and keybinding changes.
681
+
682
+ `/trajectory` opens the newest recorded run for the current native conversation; `/trajectory <run-id>`
683
+ opens a selected run from that conversation. The full-screen page keeps searchable Runs and Events
684
+ tabs. In Events, the list sits beside the selected event's JSON on wide terminals and stacks above it
685
+ on compact terminals. Type to search run IDs, goals, event types, timestamps, summaries and payload
686
+ text; `[` and `]` change runs, up/down selects events, PageUp/PageDown scrolls event details, and
687
+ `Shift+C` copies the selected event JSON. Active runs refresh while the page is open. The protected
688
+ terminal socket scopes both the run list and event reads to the current terminal and native session file.
689
+
690
+ `/log` opens a centered page dialog with separate Harness diagnostics and current-conversation
691
+ run-event views. The diagnostic file is read at its captured size in bounded socket chunks. Tab/Shift+Tab
692
+ switches views; arrows, PageUp/PageDown, Home and End scroll; Escape closes. Fetch
693
+ diagnostics retain available error stacks and safe request metadata, while the viewer redacts secrets
694
+ and URL queries and omits response bodies, prompts and message contents. Embedded hosts without a
695
+ `harness.log` still show the conversation's recorded run events.
696
+
697
+ ## Slash command ownership
698
+
699
+ Core commands and commands owned by required built-in plugins stay unprefixed. The required
700
+ plugin commands are `/subagents`, `/agents`, `/trajectory`, `/doctor`, and `/worktree`. Optional built-in
701
+ plugin commands (currently `/plugin:notes` and `/plugin:annotate`) and Pi extension commands use
702
+ `/plugin:<command>`. A bare core command, alias, required built-in command, or loaded prompt owns its
703
+ name; a colliding prefixed command is omitted and rejected with a hint to use the bare command.
704
+ Duplicate extension names are rejected with the extension paths shown in the diagnostic. Old
705
+ `/plugin:` forms of required built-in commands are not aliases. Prompt templates and
706
+ `/skill:<name>` keep their existing forms.
707
+
708
+ ## Input performance profile
709
+
710
+ `npm run profile:terminal-latency` (`scripts/profile-terminal-latency.py`) types into the real
711
+ terminal in a PTY and times each key until it is visible on a virtual screen, while idle, after a
712
+ long tool history, while a reply streams, and with an approval or question waiting. It can run pure
713
+ Pi and opencode the same way for comparison; method and results are in
714
+ [EXP-0002](experiments/EXP-0002-opentui-typing-latency/results.md).
715
+ `npm run profile:terminal-input` still measures the local draft-control socket on its own.
716
+
717
+ How the frontend keeps typing fast:
718
+
719
+ - **Rendering on demand.** The renderer is not started in continuous mode, so a key is drawn as soon
720
+ as it arrives instead of waiting for the next fixed tick; `maxFps` is 120.
721
+ - **Fine-grained view.** `root.tsx` keeps the application view in a Solid store and reconciles each
722
+ update by item id, so a streamed delta updates one markdown block in place (`streaming` is passed
723
+ to `<markdown>`) and a keystroke does not redraw the transcript.
724
+ - **Coalesced background updates.** `change()` publishes runtime events at most once per frame,
725
+ 33 ms while a run is active. A person's input (keys, the composer, the question dock) publishes at
726
+ once and synchronously, in order with the composer's own events.
727
+ - **Draft read at key time.** The composer reports its text in a microtask, after all keys of one
728
+ input chunk; the root reads the composer before each key so Enter never sends a stale draft.
729
+ - **Cached derived data.** Finished messages keep their transcript items until their position or tool
730
+ results change; session statistics refresh at most every 250 ms during a run.
731
+ - **Kept connections.** Session-socket requests ask to `keep` their connection, so the two 100 ms
732
+ polls and per-key draft updates reuse a connection instead of opening one each.
733
+ - **No swallowed keys.** While a question is active, an unused printable character moves focus to
734
+ “Something else” and is typed there when free text is allowed; it never creates a hidden chat draft.
158
735
 
159
736
  ## Verification and remaining limits
160
737
 
161
- Harness typecheck, **419 passing tests / two platform skips**, build and standalone proof
738
+ Release-candidate verification, 2026-10-19: clean `npm ci` and `npm run ci` passed—541 tests
739
+ (two skipped), typecheck, build and standalone proof. In the sibling App, typecheck, layer check and
740
+ sidecar build passed; its renderer tests passed (561), but one sidecar screenshot assertion and two
741
+ Rust tests failed in the broader in-progress App worktree. Those failures do not touch the Harness
742
+ release files; the App changes were not included in this package.
743
+
744
+ OpenTUI verification, 2026-10-20: the OpenTUI unit tests cover the transcript model, palette,
745
+ Bash mode, dialog geometry, composer, theme and component host. Targeted PTY probes against the
746
+ production bundle cover centered page dialogs at 40×20, 80×24 and 120×40, palette ranking, and
747
+ Bash mode through its approval gate; see
748
+ [docs/evidence/terminal-2026-10-20-console-tui](evidence/terminal-2026-10-20-console-tui/README.md).
749
+ The full `scripts/verify-terminal.py` run under OpenTUI stops at `/settings` because the verifier
750
+ sends the command and Return in one burst; the targeted probes send them separately. Run
751
+ `python3 scripts/verify-terminal.py --sizes 80x24 --click-focus-only` to check composer focus from
752
+ the empty welcome area, transcript text and blank transcript space in an isolated PTY.
753
+
754
+ Earlier fullscreen-layout verification, 2026-10-18, covered the removed Pi frontend's dock,
755
+ notice clipping, regular flow and exit copy. It is retained as history in
756
+ [docs/evidence/terminal-2026-10-18-fullscreen](evidence/terminal-2026-10-18-fullscreen/verification.json).
757
+
758
+ Earlier verification, before the fullscreen layout: Harness typecheck, **419 passing tests / two platform skips**, build and standalone proof
162
759
  passed on 2026-10-17. A final cleanup-order adjustment was rechecked with all **91 frontend
163
760
  tests**, typecheck, build and standalone proof. Coverage includes the real isolated persistent SDK/socket boundary,
164
761
  exact history scope and symlink rejection, resource-trust refusal before new/reload, event and
@@ -191,7 +788,7 @@ Already-running sessions need to exit and relaunch to load the replacement.
191
788
  A direct REA comparison of the pinned OMP executable and Harness at 80×24 captures startup and
192
789
  settings without output truncation; both exit 0. The [readable comparison](evidence/terminal-2026-10-17-followup/reference-comparison.md)
193
790
  retains exact frame/evidence IDs. It established matching centered welcome/composer geometry,
194
- rounded settings framing and the need for flat settings rows at 80 columns; the latter was
791
+ rounded settings framing (since replaced by [pages](#blocks-and-pages)) and the need for flat settings rows at 80 columns; the latter was
195
792
  corrected using the shipped SettingsList's minimum editable-pane width. Product lockups, tips,
196
793
  capability tabs, setting names, paths and unavailable-model guidance differ deliberately.
197
794
  This is bounded visual review, not proof of equivalence for every OMP surface.
@@ -210,11 +807,12 @@ a successful response or tool execution. Harness persisted the failed run and re
210
807
  terminal; the source sign-in file was unchanged and the disposable credentials were deleted.
211
808
  The [live report and capture](evidence/terminal-2026-10-17-followup/live-codex/README.md) retain
212
809
  this quota failure explicitly. Successful live streaming/tool acceptance remains open until
213
- account capacity is available. GitHub gist publication, actual OS clipboard/image transfer,
214
- Windows behavior and every terminal emulator remain unverified. Rich image/diff rendering and clipboard adapters have
215
- focused compatibility tests; that does not establish OS interaction. These working-tree changes
216
- are not a published release and the complete plan's acceptance remains open while required
217
- integration/provider evidence is outstanding.
810
+ account capacity is available. GitHub gist publication, actual OS clipboard pixel transfer,
811
+ Windows behavior and every terminal emulator remain unverified. HEIC/HEIF file staging has focused
812
+ conversion tests; that does not establish Finder or Warp OS interaction. Rich image/diff rendering
813
+ and clipboard adapters have focused compatibility tests; that does not establish OS interaction. These changes shipped in
814
+ `@xingular/harness` 2.0.0 (commit `44471bc`), while the complete plan's acceptance remains
815
+ open pending the required integration and provider evidence.
218
816
 
219
817
  To reproduce the controlled scenario after building:
220
818
 
@@ -252,3 +850,54 @@ inherit that retained ledger.
252
850
  - The portable OMP/Harness runtime evidence IDs and selected frame numbers are recorded in
253
851
  the readable comparison and manifest linked above. An earlier OMP capture sent input before
254
852
  startup completed; it is retained as incomplete evidence and excluded from the comparison.
853
+
854
+ ## Agent-managed session names
855
+
856
+ Agents can use `session_name({ name: string })` to name meaningful work early and revise
857
+ its name when the objective changes. Names submitted by agents are short imperative
858
+ sentences with at most six words. The agent may revise a manual name; `/name` remains
859
+ available and manual names have no new word limit. Pi stores the name in native history,
860
+ so resuming the same conversation restores it without another model request.
861
+
862
+ The working line shows `Working (2m, 50 tok/s) – Add web browser integrations`; the name
863
+ also stays on the completion line. Unnamed sessions have no separator, and narrow terminals
864
+ truncate trailing text. Renaming refreshes the line through Pi's existing metadata event.
865
+
866
+ ## `/doctor`
867
+
868
+ Checks accounts/models, tools, MCP, plugins/skills, variant/prompt validity, runtime assets, storage
869
+ and startup recovery. The summary keeps mode, progress, account/model and status counts visible above
870
+ the findings. Wide layouts use aligned Status, Check, Category and Verification columns, with evidence
871
+ and any next step beneath each finding; narrow layouts stack those fields. Status colors follow the
872
+ active theme: pass is success, warning/blocked warning, fail error, disabled dim and unverified muted.
873
+
874
+ `r` refreshes, `t` retries one local finding, `l` selects live checks, `c` cancels, Up/Down scroll by
875
+ line, PgUp/PgDn or the mouse wheel by page, and Home/End jump to the first/last finding. Escape
876
+ closes/cancels. Live
877
+ checks show their costs and isolated resources before confirmation. Providers without diagnostic
878
+ callbacks are reported unverified. See [Doctor](doctor.md).
879
+
880
+ ## Resource browser verification (2026-10-22)
881
+
882
+ The [retained evidence](evidence/terminal-resource-browser/README.md) records three-size PTY
883
+ acceptance, pointer/filter and resize behavior, skill completion/insertion and preserved drafts,
884
+ with zero model requests. Isolated idle/history/stream input profiling reported no missed keys
885
+ and p95 14.81/14.27/17.32 ms. The manifest binds both the CLI and OpenTUI bundle to their digests.
886
+ Live external connector authentication and community package installation were not exercised.
887
+
888
+
889
+ ## Full-screen browser verification (2026-10-23)
890
+
891
+ [PROP-0014](architecture/proposals/PROP-0014-fullscreen-browser-tabs.md) and
892
+ [ADR-0016](decisions/ADR-0016-fullscreen-browser-tabs.md) replace the browser's centered layout
893
+ with full-screen section tabs and a responsive inventory/inspector. The
894
+ [retained PTY evidence](evidence/terminal-fullscreen-browser/README.md) covers 40×20, 80×24 and
895
+ 120×40, keyboard and pointer tab selection, filter interaction, resizing and draft preservation,
896
+ with zero model requests. The manifest binds the CLI, OpenTUI bundle and verification script.
897
+
898
+ Harness typecheck, full tests (893 passing, three platform skips), build and standalone proof
899
+ passed. The final focused browser/page/command run passed 75 tests. Agent app typecheck, layer
900
+ checks, frontend tests, all 40 sidecar tests and 240 Rust tests passed (one Rust test ignored).
901
+ Sidecar tests were rerun with two workers and a 30-second timeout after four five-second timeouts
902
+ under concurrent load. Socket-backed Harness and PTY checks required sandbox escalation;
903
+ verification used local fixtures and disposable session data.