@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,313 +0,0 @@
1
- import { type KeybindingsManager, Theme } from '@earendil-works/pi-coding-agent'
2
- import { Input, KeybindingsManager as TuiKeybindingsManager, TuiMainScreen, TUI_KEYBINDINGS, stripTerminalSequences, visibleWidth, type AutocompleteProvider, type Component, type Terminal } from '@earendil-works/pi-tui'
3
- import { afterEach, describe, expect, it, vi } from 'vitest'
4
-
5
- import { DialogPanel, SecretInput } from './dialogs'
6
- import { createHarnessTheme } from './theme'
7
- import { createTerminalUi, type TerminalUi } from './ui'
8
-
9
- const open: TerminalUi[] = []
10
- afterEach(() => { for (const ui of open.splice(0)) ui.dispose(); vi.useRealTimers() })
11
- const theme = createHarnessTheme({ getColorMode: () => 'truecolor' } as Theme)
12
- function setup() {
13
- const terminal = { columns: 80, rows: 30, kittyProtocolActive: false, write: vi.fn(), hideCursor: vi.fn(), setTitle: vi.fn(), start: vi.fn(), stop: vi.fn() } as unknown as Terminal
14
- const tui = new TuiMainScreen(terminal)
15
- vi.spyOn(tui, 'requestRender').mockImplementation(() => {})
16
- const originalInput = new Input()
17
- const original = Object.assign(originalInput, { getText: () => originalInput.getValue(), setText: (value: string) => originalInput.setValue(value) })
18
- tui.addChild(original)
19
- tui.setFocus(original)
20
- const callbacks = {
21
- changed: vi.fn(), notify: vi.fn(), setEditor: vi.fn(), getEditorText: vi.fn(() => 'draft'), setEditorText: vi.fn(),
22
- setStatus: vi.fn(), setWidget: vi.fn(), setHeader: vi.fn(), setFooter: vi.fn(), themeChanged: vi.fn(), setToolsExpanded: vi.fn()
23
- }
24
- const host = createTerminalUi({ tui, theme, keybindings: new TuiKeybindingsManager(TUI_KEYBINDINGS) as KeybindingsManager, ...callbacks, getEditor: () => original })
25
- open.push(host)
26
- return { host, tui, terminal, original, callbacks }
27
- }
28
- function key(tui: TuiMainScreen, data: string): void { tui.getFocusedComponent()?.handleInput?.(data) }
29
-
30
- function plain(component: Component, width = 80): string[] { return component.render(width).map(stripTerminalSequences) }
31
-
32
- describe('the complete terminal extension UI host', () => {
33
- it('selects original option values and restores the actual TUI focus', async () => {
34
- const { host, tui, original } = setup()
35
- const promise = host.select('Choose account', ['First', 'Second\noriginal'])
36
- expect(tui.hasOverlay()).toBe(true)
37
- key(tui, '\x1b[B')
38
- key(tui, '\r')
39
- expect(await promise).toBe('Second\noriginal')
40
- expect(tui.getFocusedComponent()).toBe(original)
41
- expect(tui.hasOverlay()).toBe(false)
42
- })
43
-
44
- it('resolves confirmation cancellation false, supports input and multiline editor values', async () => {
45
- const { host, tui } = setup()
46
- const confirmation = host.confirm('Delete credential?', 'Remove only this account')
47
- key(tui, '\x1b')
48
- expect(await confirmation).toBe(false)
49
- const input = host.input('Account label', 'Personal')
50
- key(tui, 'Work')
51
- key(tui, '\r')
52
- expect(await input).toBe('Work')
53
- const editor = host.editor('Edit prompt', 'Line 1')
54
- key(tui, '\n')
55
- key(tui, 'Line 2')
56
- key(tui, '\r')
57
- expect(await editor).toBe('Line 1\nLine 2')
58
- })
59
-
60
- it('dismisses aborted and timed dialogs, shows countdowns and removes every timer', async () => {
61
- vi.useFakeTimers()
62
- const { host, tui, original } = setup()
63
- const controller = new AbortController()
64
- controller.abort()
65
- expect(await host.input('Already cancelled', undefined, { signal: controller.signal })).toBeUndefined()
66
- expect(tui.hasOverlay()).toBe(false)
67
- const active = new AbortController()
68
- const cancelled = host.select('Choice', ['One'], { signal: active.signal })
69
- active.abort()
70
- expect(await cancelled).toBeUndefined()
71
- expect(tui.getFocusedComponent()).toBe(original)
72
- const timed = host.input('Expires', undefined, { timeout: 1000 })
73
- expect(plain(tui.getFocusedComponent()!).join('\n')).toContain('1s')
74
- await vi.advanceTimersByTimeAsync(1000)
75
- expect(await timed).toBeUndefined()
76
- expect(tui.getFocusedComponent()).toBe(original)
77
- expect(vi.getTimerCount()).toBe(0)
78
- })
79
-
80
- it('masks credentials while retaining exact pasted and edited values', async () => {
81
- const { host, tui } = setup()
82
- const result = host.secretInput('API key')
83
- key(tui, '\x1b[200~secret_日本語_credential\x1b[201~')
84
- const component = tui.getFocusedComponent()!
85
- expect(plain(component).join('\n')).not.toContain('secret')
86
- expect(plain(component).join('\n')).not.toContain('credential')
87
- expect(plain(component).join('\n')).toContain('•')
88
- key(tui, '\r')
89
- expect(await result).toBe('secret_日本語_credential')
90
- const direct = new SecretInput({ prompt: '' })
91
- direct.setValue('private 🧠 secret')
92
- direct.focused = true
93
- for (let width = 1; width < 40; width++) {
94
- for (const row of direct.render(width)) {
95
- expect(row).not.toContain('private')
96
- expect(row).not.toContain('secret')
97
- expect(visibleWidth(row)).toBeLessThanOrEqual(width)
98
- }
99
- }
100
- })
101
-
102
- it('mounts trusted custom overlays and disposes them exactly once after done', async () => {
103
- const { host, tui, original, terminal } = setup()
104
- let finish: (value: string) => void = () => {}
105
- const custom = { render: () => ['Custom component'], invalidate() {}, dispose: vi.fn() }
106
- const onHandle = vi.fn()
107
- const factory = vi.fn((_tui, _theme, _keys, done) => { finish = done; return custom })
108
- const result = host.custom<string>(factory, { overlay: true, overlayOptions: () => ({ width: '50%', anchor: 'center' }), onHandle })
109
- await vi.waitFor(() => expect(onHandle).toHaveBeenCalledOnce())
110
- expect(factory.mock.calls[0][0]).toBe(tui)
111
- expect(factory.mock.calls[0][1]).toBe(theme)
112
- expect(tui.getFocusedComponent()).toBe(custom)
113
- finish('selected')
114
- finish('duplicate')
115
- expect(await result).toBe('selected')
116
- expect(custom.dispose).toHaveBeenCalledOnce()
117
- expect(tui.getFocusedComponent()).toBe(original)
118
- expect(terminal.start).not.toHaveBeenCalled()
119
- expect(terminal.stop).not.toHaveBeenCalled()
120
- })
121
-
122
- it('handles synchronous completion and async rejection without leaked focus or mounts', async () => {
123
- const { host, tui, original } = setup()
124
- const custom = { render: () => ['Custom'], invalidate() {}, dispose: vi.fn() }
125
- expect(await host.custom<string>((_tui, _theme, _keys, done) => { done('early'); return custom })).toBe('early')
126
- await Promise.resolve()
127
- expect(custom.dispose).toHaveBeenCalledOnce()
128
- await expect(host.custom(async () => { throw new Error('extension failed') })).rejects.toThrow('extension failed')
129
- expect(tui.getFocusedComponent()).toBe(original)
130
- expect(tui.hasOverlay()).toBe(false)
131
- })
132
-
133
- it('preserves trusted factories and forwards widgets, statuses, notifications and editor operations', () => {
134
- const { host, callbacks, original, terminal } = setup()
135
- const factory = vi.fn(() => original)
136
- host.setWidget('stats', factory, { placement: 'belowEditor' })
137
- host.setHeader(factory)
138
- host.setFooter(factory)
139
- host.setStatus('custom', 'Ready')
140
- host.notify('Loaded', 'info')
141
- host.pasteToEditor('inserted')
142
- host.setEditorText('replacement')
143
- host.setEditorComponent(factory)
144
- expect(host.getEditorComponent()).toBe(factory)
145
- expect(callbacks.setWidget).toHaveBeenCalledWith('stats', factory, 'belowEditor')
146
- expect(callbacks.setHeader).toHaveBeenCalledWith(factory)
147
- expect(callbacks.setFooter).toHaveBeenCalledWith(factory)
148
- expect(callbacks.setEditor).toHaveBeenCalledWith(factory)
149
- expect(callbacks.setStatus).toHaveBeenCalledWith('custom', 'Ready')
150
- expect(callbacks.notify).toHaveBeenCalledWith('Loaded', 'info')
151
- expect(original.getValue()).toBe('inserted')
152
- expect(callbacks.setEditorText).toHaveBeenCalledWith('replacement')
153
- expect(host.getEditorText()).toBe('draft')
154
- host.setTitle('Session\x1b]2;bad\x07\nname')
155
- expect(terminal.setTitle).toHaveBeenCalledWith('Session name')
156
- })
157
-
158
- it('retains theme, working indicator and output expansion state with actual callbacks', () => {
159
- const { host, callbacks } = setup()
160
- host.setWorkingMessage('Inspecting')
161
- host.setWorkingVisible(false)
162
- host.setWorkingIndicator({ frames: ['●'], intervalMs: 500 })
163
- host.setHiddenThinkingLabel('Reasoning')
164
- host.setToolsExpanded(true)
165
- expect(host.state).toMatchObject({ workingMessage: 'Inspecting', workingVisible: false, workingIndicator: { frames: ['●'], intervalMs: 500 }, hiddenThinkingLabel: 'Reasoning' })
166
- expect(host.getToolsExpanded()).toBe(true)
167
- expect(callbacks.setToolsExpanded).toHaveBeenCalledWith(true)
168
- expect(host.getAllThemes()).toEqual([{ name: 'harness-titanium', path: undefined }])
169
- expect(host.getTheme('harness-titanium')).toBe(theme)
170
- expect(host.setTheme('missing').success).toBe(false)
171
- expect(host.setTheme(theme)).toEqual({ success: true })
172
- expect(callbacks.themeChanged).toHaveBeenCalledWith(theme)
173
- expect(host.theme).toBe(theme)
174
- })
175
-
176
- it('stacks autocomplete wrappers over the original provider and preserves input listener cleanup', () => {
177
- const { host, tui } = setup()
178
- const provider: AutocompleteProvider = { getSuggestions: async () => null, applyCompletion: (lines, cursorLine, cursorCol) => ({ lines, cursorLine, cursorCol }) }
179
- const first = vi.fn((base: AutocompleteProvider) => ({ ...base, triggerCharacters: ['@'] }))
180
- const second = vi.fn((base: AutocompleteProvider) => ({ ...base, triggerCharacters: [...base.triggerCharacters!, '#'] }))
181
- host.addAutocompleteProvider(first)
182
- host.addAutocompleteProvider(second)
183
- expect(host.wrapAutocomplete(provider).triggerCharacters).toEqual(['@', '#'])
184
- const remove = vi.fn()
185
- vi.spyOn(tui, 'addInputListener').mockReturnValue(remove)
186
- const unsubscribe = host.onTerminalInput(() => ({ consume: true }))
187
- unsubscribe()
188
- unsubscribe()
189
- host.dispose()
190
- expect(remove).toHaveBeenCalledOnce()
191
- })
192
-
193
- it('resets session UI contributions and listeners while retaining a reusable UI object', async () => {
194
- const { host, tui, callbacks } = setup()
195
- const remove = vi.fn()
196
- vi.spyOn(tui, 'addInputListener').mockReturnValue(remove)
197
- host.onTerminalInput(() => undefined)
198
- host.setStatus('session-status', 'Busy')
199
- host.setWidget('session-widget', ['Temporary'])
200
- host.setWorkingMessage('Old session')
201
- host.setWorkingVisible(false)
202
- host.setWorkingIndicator({ frames: ['●'] })
203
- host.setHiddenThinkingLabel('Hidden')
204
- host.setToolsExpanded(true)
205
- host.addAutocompleteProvider(provider => provider)
206
- const pending = host.input('Old session question')
207
- host.reset()
208
- expect(await pending).toBeUndefined()
209
- expect(remove).toHaveBeenCalledOnce()
210
- expect(callbacks.setStatus).toHaveBeenLastCalledWith('session-status', undefined)
211
- expect(callbacks.setWidget).toHaveBeenLastCalledWith('session-widget', undefined)
212
- expect(callbacks.setHeader).toHaveBeenLastCalledWith(undefined)
213
- expect(callbacks.setFooter).toHaveBeenLastCalledWith(undefined)
214
- expect(callbacks.setEditor).toHaveBeenLastCalledWith(undefined)
215
- expect(host.state).toMatchObject({ workingVisible: true, toolsExpanded: false, autocompleteFactories: [] })
216
- expect(host.state.workingMessage).toBeUndefined()
217
- expect(host.state.workingIndicator).toBeUndefined()
218
- expect(host.state.hiddenThinkingLabel).toBeUndefined()
219
- const next = host.input('New session question')
220
- key(tui, 'new session')
221
- key(tui, '\r')
222
- expect(await next).toBe('new session')
223
- })
224
-
225
- it('refreshes loaded theme identities without retaining removed resource themes', () => {
226
- const { host } = setup()
227
- const loaded = Object.create(theme) as Theme
228
- Object.defineProperty(loaded, 'name', { value: 'plugin-theme' })
229
- Object.defineProperty(loaded, 'sourcePath', { value: '/trusted/theme.json' })
230
- host.setThemes([loaded])
231
- expect(host.getAllThemes()).toContainEqual({ name: 'plugin-theme', path: '/trusted/theme.json' })
232
- expect(host.getTheme('plugin-theme')).toBe(loaded)
233
- host.setThemes([])
234
- expect(host.getTheme('plugin-theme')).toBeUndefined()
235
- expect(host.getTheme('harness-titanium')).toBe(theme)
236
- })
237
-
238
- it('filters long selectors by their labels and preserves real selection across terminal resizes', async () => {
239
- const { host, tui, terminal } = setup()
240
- const options = Array.from({ length: 30 }, (_, index) => `Provider model ${index}`)
241
- options.push('Distinct 中文 model')
242
- const selected = host.select('Models', options)
243
- const panel = tui.getFocusedComponent()!
244
- expect(plain(panel).join('\n')).toContain('Type to search')
245
- key(tui, 'Distinct')
246
- expect(plain(panel).join('\n')).toContain('Distinct 中文 model')
247
- expect(plain(panel).join('\n')).not.toContain('Provider model')
248
- Object.defineProperty(terminal, 'rows', { value: 8 })
249
- for (let width = 0; width < 40; width++) {
250
- for (const row of panel.render(width)) expect(visibleWidth(row)).toBeLessThanOrEqual(width)
251
- }
252
- key(tui, '\r')
253
- expect(await selected).toBe('Distinct 中文 model')
254
- })
255
-
256
- it('keeps CJK multiline editors responsive even in one-column overlays', async () => {
257
- const { host, tui } = setup()
258
- const editing = host.editor('中文', '日本語 🧠\nSecond line')
259
- const panel = tui.getFocusedComponent()!
260
- for (const width of [0, 1, 2, 3, 4, 5, 10, 80]) {
261
- for (const row of panel.render(width)) expect(visibleWidth(row), `width ${width}`).toBeLessThanOrEqual(width)
262
- }
263
- key(tui, '\r')
264
- expect(await editing).toBe('日本語 🧠\nSecond line')
265
- })
266
-
267
- it('keeps approval choices and controls visible while every long action detail remains scrollable', async () => {
268
- const { host, tui, terminal } = setup()
269
- Object.defineProperty(terminal, 'rows', { value: 20 })
270
- const message = Array.from({ length: 50 }, (_, index) => `Action detail ${index}: /important/path/file-${index}.txt`).join('\n')
271
- const confirmation = host.confirm('Allow this action?', message)
272
- const panel = tui.getFocusedComponent()!
273
- const observed: string[] = []
274
- for (let page = 0; page < 20; page++) {
275
- const rows = plain(panel, 40)
276
- expect(rows.length).toBeLessThanOrEqual(16)
277
- expect(rows.join('\n')).toContain('❯ Yes')
278
- expect(rows.join('\n')).toContain('No')
279
- expect(rows.some(row => row.includes('PgUp/PgDn details') && row.includes('Enter'))).toBe(true)
280
- observed.push(...rows)
281
- key(tui, '\x1b[6~')
282
- }
283
- expect(observed.join('\n')).toContain('file-0.txt')
284
- expect(observed.join('\n')).toContain('file-49.txt')
285
- key(tui, '\r')
286
- expect(await confirmation).toBe(true)
287
- })
288
-
289
- it('keeps the write-answer choice visible when a long question menu scrolls at 40 by 20', async () => {
290
- const { host, tui, terminal } = setup()
291
- Object.defineProperty(terminal, 'rows', { value: 20 })
292
- const choices = [...Array.from({ length: 20 }, (_, index) => `Choice ${index}: description ${'long '.repeat(20)}`), 'Write an answer']
293
- const selected = host.select('A question with long context', choices)
294
- for (let index = 1; index < choices.length; index++) key(tui, '\x1b[B')
295
- const rows = plain(tui.getFocusedComponent()!, 40)
296
- expect(rows.length).toBeLessThanOrEqual(16)
297
- expect(rows.join('\n')).toContain('❯ Write an answer')
298
- key(tui, '\r')
299
- expect(await selected).toBe('Write an answer')
300
- })
301
-
302
- it('cancels all pending dialogs on shutdown and keeps every dialog row within the terminal width', async () => {
303
- const { host, tui } = setup()
304
- const input = host.input('中文title', 'Placeholder')
305
- const panel = tui.getFocusedComponent() as DialogPanel
306
- for (let width = 0; width < 100; width++) {
307
- for (const row of panel.render(width)) expect(visibleWidth(row), `width ${width}`).toBeLessThanOrEqual(width)
308
- }
309
- host.dispose()
310
- expect(await input).toBeUndefined()
311
- expect(tui.hasOverlay()).toBe(false)
312
- })
313
- })
@@ -1,166 +0,0 @@
1
- import { Theme, type AutocompleteProviderFactory, type ExtensionUIContext, type KeybindingsManager, type WorkingIndicatorOptions } from '@earendil-works/pi-coding-agent'
2
- import { stripTerminalSequences, type AutocompleteProvider, type EditorComponent, type TuiMainScreen } from '@earendil-works/pi-tui'
3
-
4
- import { TerminalDialogs } from './dialogs'
5
-
6
- type EditorFactory = Parameters<ExtensionUIContext['setEditorComponent']>[0]
7
- type HeaderFactory = Parameters<ExtensionUIContext['setHeader']>[0]
8
- type FooterFactory = Parameters<ExtensionUIContext['setFooter']>[0]
9
- type WidgetContent = string[] | ((...args: Parameters<NonNullable<HeaderFactory>>) => ReturnType<NonNullable<HeaderFactory>>) | undefined
10
-
11
- export interface TerminalUiState {
12
- theme: Theme
13
- workingMessage?: string
14
- workingVisible: boolean
15
- workingIndicator?: WorkingIndicatorOptions
16
- hiddenThinkingLabel?: string
17
- toolsExpanded: boolean
18
- autocompleteFactories: AutocompleteProviderFactory[]
19
- }
20
- export interface TerminalUiOptions {
21
- tui: TuiMainScreen
22
- theme: Theme
23
- keybindings: KeybindingsManager
24
- changed(): void
25
- notify(message: string, type?: string): void
26
- setEditor(factory: EditorFactory): void
27
- getEditorText(): string
28
- setEditorText(value: string): void
29
- setStatus(key: string, value: string | undefined): void
30
- setWidget(key: string, content: WidgetContent, placement?: string): void
31
- setHeader(factory: HeaderFactory): void
32
- setFooter(factory: FooterFactory): void
33
- getEditor?(): EditorComponent
34
- getAutocompleteProvider?(): AutocompleteProvider
35
- setAutocompleteProvider?(provider: AutocompleteProvider): void
36
- themes?: Theme[]
37
- themeChanged?(theme: Theme): void
38
- getToolsExpanded?(): boolean
39
- setToolsExpanded?(expanded: boolean): void
40
- }
41
- export interface TerminalUi extends ExtensionUIContext {
42
- readonly state: TerminalUiState
43
- secretInput: ExtensionUIContext['input']
44
- wrapAutocomplete(provider: AutocompleteProvider): AutocompleteProvider
45
- reset(): void
46
- setThemes(themes: Theme[]): void
47
- dispose(): void
48
- }
49
-
50
- /** UI adaptation only: the Application owns component mounting and terminal lifecycle. */
51
- export function createTerminalUi(options: TerminalUiOptions): TerminalUi {
52
- const state: TerminalUiState = {
53
- theme: options.theme, workingVisible: true, toolsExpanded: false, autocompleteFactories: []
54
- }
55
- const dialogs = new TerminalDialogs(options.tui, () => state.theme, options.keybindings, options.changed)
56
- const inputSubscriptions = new Set<() => void>()
57
- const builtInThemes = options.themes ?? []
58
- const themes = new Map(builtInThemes.filter(theme => theme.name).map(theme => [theme.name!, theme]))
59
- if (options.theme.name) themes.set(options.theme.name, options.theme)
60
- const statusKeys = new Set<string>()
61
- const widgetKeys = new Set<string>()
62
- let editorFactory: EditorFactory
63
- let disposed = false
64
- const changed = () => { if (!disposed) options.changed() }
65
- const wrapAutocomplete = (provider: AutocompleteProvider) => state.autocompleteFactories.reduce((current, factory) => factory(current), provider)
66
- return {
67
- state,
68
- select: (title, items, opts) => dialogs.select(title, items, opts),
69
- confirm: (title, message, opts) => dialogs.confirm(title, message, opts),
70
- input: (title, placeholder, opts) => dialogs.input(title, placeholder, opts),
71
- secretInput: (title, placeholder, opts) => dialogs.input(title, placeholder, opts, true),
72
- editor: (title, prefill) => dialogs.editor(title, prefill),
73
- custom: (factory, opts) => dialogs.custom(factory, opts),
74
- notify: (message, type) => options.notify(message, type),
75
- onTerminalInput(handler) {
76
- if (disposed) return () => {}
77
- const remove = options.tui.addInputListener(handler)
78
- const unsubscribe = () => { if (inputSubscriptions.delete(unsubscribe)) remove() }
79
- inputSubscriptions.add(unsubscribe)
80
- return unsubscribe
81
- },
82
- setStatus(key, value) { if (value === undefined) statusKeys.delete(key); else statusKeys.add(key); options.setStatus(key, value); changed() },
83
- setWorkingMessage(message) { state.workingMessage = message; changed() },
84
- setWorkingVisible(visible) { state.workingVisible = visible; changed() },
85
- setWorkingIndicator(indicator) {
86
- state.workingIndicator = indicator ? { ...indicator, frames: indicator.frames?.slice() } : undefined
87
- changed()
88
- },
89
- setHiddenThinkingLabel(label) { state.hiddenThinkingLabel = label; changed() },
90
- setWidget(key, content, placement) { if (content === undefined) widgetKeys.delete(key); else widgetKeys.add(key); options.setWidget(key, content, placement?.placement); changed() },
91
- setHeader(factory) { options.setHeader(factory); changed() },
92
- setFooter(factory) { options.setFooter(factory); changed() },
93
- setTitle(title) { options.tui.terminal.setTitle(stripTerminalSequences(title).replace(/[\x00-\x1f\x7f]/g, ' ')) },
94
- pasteToEditor(text) {
95
- const editor = options.getEditor?.()
96
- if (editor) editor.handleInput(`\x1b[200~${text}\x1b[201~`)
97
- else options.setEditorText(options.getEditorText() + text)
98
- changed()
99
- },
100
- setEditorText(text) { options.setEditorText(text); changed() },
101
- getEditorText: options.getEditorText,
102
- addAutocompleteProvider(factory) {
103
- state.autocompleteFactories.push(factory)
104
- const base = options.getAutocompleteProvider?.()
105
- if (base) options.setAutocompleteProvider?.(wrapAutocomplete(base))
106
- changed()
107
- },
108
- wrapAutocomplete,
109
- setEditorComponent(factory) { editorFactory = factory; options.setEditor(factory); changed() },
110
- getEditorComponent: () => editorFactory,
111
- get theme() { return state.theme },
112
- getAllThemes: () => [...themes].map(([name, theme]) => ({ name, path: theme.sourcePath })),
113
- getTheme: name => themes.get(name),
114
- setTheme(themeOrName) {
115
- const theme = typeof themeOrName === 'string' ? themes.get(themeOrName) : themeOrName
116
- if (!(theme instanceof Theme)) return { success: false, error: `Unknown theme: ${String(themeOrName)}` }
117
- state.theme = theme
118
- if (theme.name) themes.set(theme.name, theme)
119
- options.themeChanged?.(theme)
120
- options.tui.invalidate()
121
- changed()
122
- return { success: true }
123
- },
124
- getToolsExpanded: () => options.getToolsExpanded?.() ?? state.toolsExpanded,
125
- setToolsExpanded(expanded) { state.toolsExpanded = expanded; options.setToolsExpanded?.(expanded); changed() },
126
- setThemes(loaded) {
127
- themes.clear()
128
- for (const theme of builtInThemes) if (theme.name) themes.set(theme.name, theme)
129
- for (const theme of loaded) if (theme.name) themes.set(theme.name, theme)
130
- if (options.theme.name && !themes.has(options.theme.name)) themes.set(options.theme.name, options.theme)
131
- if (state.theme.name && !themes.has(state.theme.name)) themes.set(state.theme.name, state.theme)
132
- changed()
133
- },
134
- reset() {
135
- if (disposed) return
136
- dialogs.reset()
137
- for (const unsubscribe of [...inputSubscriptions]) unsubscribe()
138
- inputSubscriptions.clear()
139
- for (const key of statusKeys) options.setStatus(key, undefined)
140
- for (const key of widgetKeys) options.setWidget(key, undefined)
141
- statusKeys.clear()
142
- widgetKeys.clear()
143
- state.autocompleteFactories = []
144
- state.workingMessage = undefined
145
- state.workingVisible = true
146
- state.workingIndicator = undefined
147
- state.hiddenThinkingLabel = undefined
148
- state.toolsExpanded = false
149
- editorFactory = undefined
150
- options.setHeader(undefined)
151
- options.setFooter(undefined)
152
- options.setEditor(undefined)
153
- options.setToolsExpanded?.(false)
154
- const base = options.getAutocompleteProvider?.()
155
- if (base) options.setAutocompleteProvider?.(base)
156
- changed()
157
- },
158
- dispose() {
159
- if (disposed) return
160
- disposed = true
161
- dialogs.dispose()
162
- for (const unsubscribe of [...inputSubscriptions]) unsubscribe()
163
- inputSubscriptions.clear()
164
- }
165
- }
166
- }
@@ -1,102 +0,0 @@
1
- /*!
2
- * Adapted from @oh-my-pi/pi-tui 18.11.3 (https://github.com/can1357/oh-my-pi).
3
- *
4
- * MIT License
5
- *
6
- * Copyright (c) 2025 Mario Zechner
7
- * Copyright (c) 2025-2026 Can Bölük
8
- * Copyright (c) 2026 Stencil Labs, Inc.
9
- *
10
- * Permission is hereby granted, free of charge, to any person obtaining a copy
11
- * of this software and associated documentation files (the "Software"), to deal
12
- * in the Software without restriction, including without limitation the rights
13
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- * copies of the Software, and to permit persons to whom the Software is
15
- * furnished to do so, subject to the following conditions:
16
- *
17
- * The above copyright notice and this permission notice shall be included in all
18
- * copies or substantial portions of the Software.
19
- *
20
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- * SOFTWARE.
27
- */
28
- import type { Theme } from '@earendil-works/pi-coding-agent'
29
- import { type Component, type TerminalColorMode, visibleWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui'
30
-
31
- import manifest from '../../../package.json'
32
-
33
- export const PI_LOGO = ['████████████', ' ██ ██ ', ' ██ ██ ', ' ▒▒ ██ ', ' ██ '] as const
34
-
35
- const GRADIENT_STOPS = [[248, 79, 204], [147, 98, 244], [0, 219, 228]] as const
36
- const GRADIENT_RAMP_256 = [206, 170, 134, 99, 69, 74, 44] as const
37
- const LOGO_WIDTH = 12
38
- const LOCKUP_GAP = 4
39
- const TIP_MEASURE = 72
40
- const TIP_MIN_COLUMNS = 50
41
- const DEFAULT_TIP = 'Use /accounts to manage sign-ins, /plugins to manage extensions, and /hub to browse reusable skills.'
42
-
43
- /** The upstream resting diagonal gradient, including its exact indexed-color fallback. */
44
- export function gradientLogo(lines: readonly string[], mode: TerminalColorMode): string[] {
45
- const xSpan = Math.max(1, ...lines.map((line) => line.length - 1))
46
- const ySpan = Math.max(1, lines.length - 1)
47
- return lines.map((line, y) => [...line].map((glyph, x) => {
48
- if (glyph === ' ') return glyph
49
- const t = (x / xSpan + y / ySpan) / 2
50
- let color: string
51
- if (mode === 'truecolor') {
52
- const segment = t * (GRADIENT_STOPS.length - 1)
53
- const index = Math.min(GRADIENT_STOPS.length - 2, Math.floor(segment))
54
- const fraction = segment - index
55
- const from = GRADIENT_STOPS[index]
56
- const to = GRADIENT_STOPS[index + 1]
57
- const [r, g, b] = from.map((value, channel) => Math.round(value + (to[channel] - value) * fraction))
58
- color = `\x1b[38;2;${r};${g};${b}m`
59
- } else {
60
- const index = Math.min(GRADIENT_RAMP_256.length - 1, Math.max(0, Math.floor(t * (GRADIENT_RAMP_256.length - 1) + 0.5)))
61
- color = `\x1b[38;5;${GRADIENT_RAMP_256[index]}m`
62
- }
63
- return color + glyph + '\x1b[0m'
64
- }).join(''))
65
- }
66
-
67
- function centerBlock(lines: readonly string[], width: number): string[] {
68
- const widest = Math.max(0, ...lines.map((line) => visibleWidth(line)))
69
- const indent = ' '.repeat(Math.max(0, Math.floor((width - widest) / 2)))
70
- return lines.map((line) => indent + line)
71
- }
72
-
73
- export class HarnessWelcome implements Component {
74
- constructor(
75
- private readonly theme: Theme,
76
- private readonly productName = 'Xingular Harness',
77
- private readonly version = manifest.version,
78
- private readonly tip = DEFAULT_TIP
79
- ) {}
80
-
81
- invalidate(): void {}
82
-
83
- render(width: number): string[] {
84
- const room = width - 2
85
- if (room < LOGO_WIDTH) return []
86
- const logo = gradientLogo(PI_LOGO, this.theme.getColorMode())
87
- const name = this.productName.replace(/[\x00-\x1f\x7f-\x9f]/g, '')
88
- const version = this.version.replace(/[\x00-\x1f\x7f-\x9f]/g, '')
89
- const labelWidth = Math.max(visibleWidth(name), visibleWidth(`v${version}`))
90
- const lockupWidth = LOGO_WIDTH + LOCKUP_GAP + labelWidth
91
- const beside = ['', this.theme.bold(this.theme.fg('text', name)), '', '', this.theme.fg('dim', `v${version}`)]
92
- const art = room >= lockupWidth ? logo.map((line, index) => line + ' '.repeat(LOCKUP_GAP) + beside[index]) : logo
93
- const lines = centerBlock(art, width)
94
- if (width < TIP_MIN_COLUMNS || !this.tip) return lines
95
- const label = 'Tip: '
96
- const wrapped = wrapTextWithAnsi(label + this.tip, Math.min(room, TIP_MEASURE)).map((line) => line.trimEnd())
97
- const tips = wrapped.map((line, index) => this.theme.italic(index === 0 && line.startsWith(label)
98
- ? this.theme.fg('customMessageLabel', label) + this.theme.fg('muted', line.slice(label.length))
99
- : this.theme.fg('muted', line)))
100
- return [...lines, '', ...tips.flatMap((line) => centerBlock([line], width))]
101
- }
102
- }
@@ -1,69 +0,0 @@
1
- import { expect, test } from 'vitest'
2
-
3
- import type { ActiveRun, QuestionInput } from '../sessions/registry'
4
- import { askUserTool, describeAnswer } from './askUser'
5
-
6
- test('ask_user requests one to five summarized questions and returns answers in order', async () => {
7
- let requested: QuestionInput[] = []
8
- const tool = askUserTool({
9
- requestAnswers: async (questions: QuestionInput[]) => {
10
- requested = questions
11
- return [
12
- { selected: ['Keyboard'], notes: { Keyboard: 'Keep it accessible.' } },
13
- { selected: [], text: 'Next week' }
14
- ]
15
- }
16
- } as unknown as ActiveRun)
17
-
18
- const response = await tool.execute({ questions: [
19
- { summary: 'Navigation style', question: 'Which navigation?', options: [{ label: 'Keyboard', description: 'Move through controls with keys.' }, { label: 'Pointer', description: 'Select controls with a mouse or trackpad.' }], multiSelect: true },
20
- { summary: 'Delivery timing', question: 'When?', options: [{ label: 'Today', description: 'Start immediately.' }, { label: 'Next week', description: 'Start after the current week.' }], allowText: true }
21
- ] })
22
-
23
- expect(requested).toMatchObject([
24
- { summary: 'Navigation style', question: 'Which navigation?', multiSelect: true, allowText: true },
25
- { summary: 'Delivery timing', question: 'When?', multiSelect: false, allowText: true }
26
- ])
27
- expect(response).toContain('Navigation style: The user chose: Keyboard. Their note for Keyboard: Keep it accessible.')
28
- expect(response).toContain('Delivery timing: The user answered: Next week')
29
- })
30
-
31
- test('ask_user rejects empty questions and summaries', async () => {
32
- const tool = askUserTool({ requestAnswers: async () => [] } as unknown as ActiveRun)
33
- await expect(tool.execute({ questions: [] })).resolves.toBe('Ask between one and five questions.')
34
- await expect(tool.execute({ questions: [{ summary: '', question: 'Pick one' }] })).resolves.toBe('Each question needs a short summary of no more than 100 characters.')
35
- })
36
-
37
- test('ask_user requires a description for every choice', async () => {
38
- let requested = false
39
- const tool = askUserTool({ requestAnswers: async () => { requested = true; return [] } } as unknown as ActiveRun)
40
- await expect(tool.execute({ questions: [{ summary: 'Plan choice', question: 'Which plan?', options: [{ label: 'Plan A' }] }] }))
41
- .resolves.toBe('Every choice needs a short description. Aim for 25 words or fewer.')
42
- expect(requested).toBe(false)
43
- })
44
-
45
- test('ask_user treats 25 words as guidance for questions and choice descriptions', async () => {
46
- let requested: QuestionInput[] = []
47
- const tool = askUserTool({
48
- requestAnswers: async (questions: QuestionInput[]) => {
49
- requested = questions
50
- return [{ selected: ['Detailed'], notes: {} }]
51
- }
52
- } as unknown as ActiveRun)
53
- const longQuestion = 'Which option should we choose after we consider the current project goals, delivery timing, team capacity, risks, dependencies, expected maintenance, and the needs of the people who will use the result every day?'
54
- const longDescription = 'Choose this when the team wants a complete explanation with context, tradeoffs, implementation notes, assumptions, risks, and enough detail to share the decision with other reviewers.'
55
- const response = await tool.execute({ questions: [{
56
- summary: 'Reply detail',
57
- question: longQuestion,
58
- options: [{ label: 'Detailed', description: longDescription }]
59
- }] })
60
-
61
- expect(requested[0]).toMatchObject({ question: longQuestion, options: [{ label: 'Detailed', description: longDescription }] })
62
- expect(response).toContain('Reply detail: The user chose: Detailed.')
63
- expect(tool.description).toContain('aim to keep each question to 25 words or fewer')
64
- expect(tool.description).toContain('every option must include a helpful description of 25 words or fewer')
65
- })
66
-
67
- test('describeAnswer includes choice-specific notes', () => {
68
- expect(describeAnswer({ selected: ['A'], notes: { A: 'Keep this requirement.' } })).toBe('The user chose: A. Their note for A: Keep this requirement.')
69
- })