@xingular/harness 0.1.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +60 -0
  4. package/README.md +265 -71
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +14842 -9445
  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/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +1170 -62
  373. package/docs/README.md +34 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0001-owned-terminal.md +87 -0
  403. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  404. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  405. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  406. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  407. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  408. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  409. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  410. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  411. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  412. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  413. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  414. package/docs/decisions/ADR-0013-doctor.md +27 -0
  415. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  416. package/docs/doctor.md +74 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  418. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  420. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  421. package/docs/features/README.md +20 -0
  422. package/docs/features/automations/README.md +41 -0
  423. package/docs/features/cores/README.md +39 -0
  424. package/docs/features/google-harness2/README.md +52 -0
  425. package/docs/features/integrations/README.md +40 -0
  426. package/docs/features/interfaces/README.md +29 -0
  427. package/docs/features/memory/README.md +28 -0
  428. package/docs/releases/1.0.0.md +40 -0
  429. package/docs/releases/README.md +36 -0
  430. package/docs/study/00-index.md +78 -0
  431. package/docs/study/arms/00-matrix.md +20 -0
  432. package/docs/study/arms/01-system-prompt.md +211 -0
  433. package/docs/study/arms/02-tools.md +79 -0
  434. package/docs/study/arms/03-subagents.md +90 -0
  435. package/docs/study/arms/04-skills.md +75 -0
  436. package/docs/study/arms/05-context-management.md +90 -0
  437. package/docs/study/arms/06-memory.md +90 -0
  438. package/docs/study/arms/07-governance.md +71 -0
  439. package/docs/study/arms/08-execution.md +69 -0
  440. package/docs/study/arms/09-observability.md +60 -0
  441. package/docs/study/arms/10-refinement.md +110 -0
  442. package/docs/study/btw-comparison.md +37 -0
  443. package/docs/study/feature-gap-review.md +42 -0
  444. package/docs/study/insights.md +123 -0
  445. package/docs/study/roadmap.md +72 -0
  446. package/docs/study/sources/claude-code.md +44 -0
  447. package/docs/study/sources/deepseek-harness.md +102 -0
  448. package/docs/study/sources/harness2.md +50 -0
  449. package/docs/study/sources/kimi-cli.md +42 -0
  450. package/docs/study/sources/omp.md +93 -0
  451. package/docs/study/sources/opencode.md +43 -0
  452. package/docs/study/sources/openhands.md +46 -0
  453. package/docs/study/sources/smolagents.md +40 -0
  454. package/docs/study/sources/swe-agent.md +34 -0
  455. package/docs/system-prompt-design.md +196 -0
  456. package/docs/terminal-tui.md +671 -0
  457. package/package.json +48 -12
  458. package/src/accounts/accounts.test.ts +0 -223
  459. package/src/accounts/accounts.ts +0 -522
  460. package/src/accounts/env.test.ts +0 -95
  461. package/src/accounts/env.ts +0 -338
  462. package/src/accounts/secrets.ts +0 -50
  463. package/src/accounts/store.ts +0 -338
  464. package/src/capabilities/api.ts +0 -75
  465. package/src/capabilities/runSnapshot.ts +0 -59
  466. package/src/capabilities/types.ts +0 -34
  467. package/src/cli.ts +0 -114
  468. package/src/core/bus.ts +0 -34
  469. package/src/core/changes.ts +0 -33
  470. package/src/core/env.ts +0 -27
  471. package/src/core/errors.ts +0 -32
  472. package/src/core/frontmatter.ts +0 -47
  473. package/src/core/fs.test.ts +0 -38
  474. package/src/core/fs.ts +0 -92
  475. package/src/core/index.ts +0 -193
  476. package/src/core/path.test.ts +0 -14
  477. package/src/core/path.ts +0 -79
  478. package/src/core/projects.ts +0 -90
  479. package/src/core/text.ts +0 -39
  480. package/src/harness.ts +0 -299
  481. package/src/index.ts +0 -70
  482. package/src/mcp/connections.ts +0 -614
  483. package/src/mcp/manager.ts +0 -130
  484. package/src/mcp/oauth.ts +0 -195
  485. package/src/mcp/scopeMigration.test.ts +0 -79
  486. package/src/mcp/scopeMigration.ts +0 -204
  487. package/src/mcp/service.test.ts +0 -376
  488. package/src/mcp/service.ts +0 -549
  489. package/src/mcp/types.ts +0 -108
  490. package/src/memory/api.test.ts +0 -82
  491. package/src/memory/api.ts +0 -289
  492. package/src/memory/blocks.test.ts +0 -78
  493. package/src/memory/blocks.ts +0 -406
  494. package/src/memory/caller.ts +0 -57
  495. package/src/memory/dispatch.ts +0 -59
  496. package/src/memory/facts.test.ts +0 -41
  497. package/src/memory/facts.ts +0 -248
  498. package/src/memory/graph.ts +0 -103
  499. package/src/memory/health.test.ts +0 -130
  500. package/src/memory/health.ts +0 -74
  501. package/src/memory/maintainer.ts +0 -272
  502. package/src/memory/maintenance.test.ts +0 -176
  503. package/src/memory/maintenance.ts +0 -330
  504. package/src/memory/migrate.ts +0 -79
  505. package/src/memory/operations.ts +0 -138
  506. package/src/memory/proposals.test.ts +0 -168
  507. package/src/memory/proposals.ts +0 -576
  508. package/src/memory/recall.test.ts +0 -104
  509. package/src/memory/recall.ts +0 -271
  510. package/src/memory/references.ts +0 -77
  511. package/src/memory/runContext.ts +0 -93
  512. package/src/memory/secrets.ts +0 -6
  513. package/src/memory/store.test.ts +0 -66
  514. package/src/memory/store.ts +0 -385
  515. package/src/memory/wiki.test.ts +0 -47
  516. package/src/memory/wiki.ts +0 -422
  517. package/src/memory/wikiIndex.test.ts +0 -88
  518. package/src/memory/wikiIndex.ts +0 -116
  519. package/src/plugins/api.ts +0 -181
  520. package/src/plugins/attachments.test.ts +0 -84
  521. package/src/plugins/attachments.ts +0 -141
  522. package/src/plugins/builtin.ts +0 -82
  523. package/src/plugins/catalogue.test.ts +0 -254
  524. package/src/plugins/catalogue.ts +0 -251
  525. package/src/plugins/cli.ts +0 -184
  526. package/src/plugins/discover.ts +0 -151
  527. package/src/plugins/firstParty.test.ts +0 -143
  528. package/src/plugins/firstParty.ts +0 -129
  529. package/src/plugins/hooks.test.ts +0 -250
  530. package/src/plugins/hooks.ts +0 -239
  531. package/src/plugins/identity.ts +0 -37
  532. package/src/plugins/install.test.ts +0 -107
  533. package/src/plugins/install.ts +0 -106
  534. package/src/plugins/inventory.ts +0 -123
  535. package/src/plugins/manifest.ts +0 -76
  536. package/src/plugins/plugins.test.ts +0 -205
  537. package/src/plugins/plugins.ts +0 -189
  538. package/src/plugins/proposal.ts +0 -121
  539. package/src/plugins/runtime.test.ts +0 -40
  540. package/src/plugins/runtime.ts +0 -82
  541. package/src/plugins/trust.ts +0 -142
  542. package/src/plugins/types.ts +0 -149
  543. package/src/prompt/compile.test.ts +0 -261
  544. package/src/prompt/compile.ts +0 -732
  545. package/src/server/methods.ts +0 -314
  546. package/src/server/remote.ts +0 -77
  547. package/src/server/rpc.ts +0 -116
  548. package/src/server/serve.ts +0 -28
  549. package/src/server/server.test.ts +0 -174
  550. package/src/sessions/approvals.ts +0 -118
  551. package/src/sessions/contracts.ts +0 -310
  552. package/src/sessions/conversation.test.ts +0 -150
  553. package/src/sessions/extensionSession.test.ts +0 -74
  554. package/src/sessions/extensionUi.test.ts +0 -65
  555. package/src/sessions/extensionUi.ts +0 -102
  556. package/src/sessions/history.ts +0 -51
  557. package/src/sessions/lineageJoin.ts +0 -75
  558. package/src/sessions/policy.ts +0 -32
  559. package/src/sessions/pricing.ts +0 -60
  560. package/src/sessions/reasoningSummaries.ts +0 -59
  561. package/src/sessions/registry.ts +0 -294
  562. package/src/sessions/runIndex.ts +0 -99
  563. package/src/sessions/runStore.test.ts +0 -152
  564. package/src/sessions/runStore.ts +0 -332
  565. package/src/sessions/runner.ts +0 -569
  566. package/src/sessions/runtimeResources.test.ts +0 -61
  567. package/src/sessions/sessions.test.ts +0 -455
  568. package/src/sessions/sessions.ts +0 -295
  569. package/src/skills/registry.test.ts +0 -104
  570. package/src/skills/registry.ts +0 -407
  571. package/src/terminal/cli.ts +0 -149
  572. package/src/terminal/client.ts +0 -74
  573. package/src/terminal/controller.ts +0 -227
  574. package/src/terminal/launch.test.ts +0 -34
  575. package/src/terminal/launch.ts +0 -88
  576. package/src/terminal/piExtension.ts +0 -210
  577. package/src/terminal/pluginControl.test.ts +0 -146
  578. package/src/terminal/pluginMenu.ts +0 -112
  579. package/src/terminal/socket.test.ts +0 -71
  580. package/src/terminal/socket.ts +0 -221
  581. package/src/terminal/standalone.test.ts +0 -130
  582. package/src/terminal/standalone.ts +0 -144
  583. package/src/terminal/terminal.test.ts +0 -330
  584. package/src/terminal/terminals.ts +0 -443
  585. package/src/tools/askUser.ts +0 -45
  586. package/src/tools/definitions.ts +0 -187
  587. package/src/tools/memoryTools.ts +0 -22
  588. package/src/tools/pluginPropose.ts +0 -41
  589. package/src/tools/types.ts +0 -39
  590. package/src/web/safeRequest.ts +0 -171
  591. package/src/web/text.ts +0 -53
  592. package/src/web/tools.ts +0 -134
  593. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,363 @@
1
+ import { Editor, Input, matchesKey, stripTerminalSequences, truncateToWidth, visibleWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { CENTER_DIALOG_PAD, CHROME_ROWS, blockFrame, centerDialogChromeRows, centerDialogContentWidth, centerDialogFrame, centerDialogVerticalPad, contentWidth, pageFrame, safeText, selectionText } from "./chrome.js";
3
+ import { centeredDialogHost, dialogFits, pageOverlayOptions, pageRows } from "./dialogGeometry.js";
4
+ import { FilterList } from "./list.js";
5
+ import { searchFieldRowsFor } from "./search.js";
6
+ export function selectTheme(theme) {
7
+ return {
8
+ selectedPrefix: text => selectionText(theme, text), selectedText: text => selectionText(theme, text.replace(/^→/, '❯')),
9
+ description: text => theme.fg('muted', text), scrollInfo: text => theme.fg('dim', text),
10
+ noMatch: text => theme.fg('warning', text.replace('commands', 'options'))
11
+ };
12
+ }
13
+ /** Input keeps the original value; only its rendered cells are masked. */
14
+ export class SecretInput extends Input {
15
+ render(width) {
16
+ const lines = super.render(width);
17
+ if (!this.getValue())
18
+ return lines;
19
+ const segments = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
20
+ return lines.map(line => line.split(/(\x1b(?:\[[0-9;?]*[ -/]*[@-~]|_[^\x07]*\x07))/g).map((part, index) => index % 2
21
+ ? part
22
+ : [...segments.segment(part)].map(item => '•'.repeat(visibleWidth(item.segment))).join('')).join(''));
23
+ }
24
+ }
25
+ const safe = safeText;
26
+ /** Choices as a `FilterList`, with the standard search field visible for every list. */
27
+ export class SearchableSelect {
28
+ tui;
29
+ select;
30
+ cancel;
31
+ list;
32
+ labels;
33
+ focusedValue = false;
34
+ constructor(options, tui, theme, select, cancel, search = 'always') {
35
+ this.tui = tui;
36
+ this.select = select;
37
+ this.cancel = cancel;
38
+ this.labels = options.map(safe);
39
+ this.list = new FilterList({
40
+ theme, search,
41
+ rows: this.labels.map((label, index) => ({ id: String(index), label, data: index })),
42
+ limit: () => this.windowRows(),
43
+ noun: ['option', 'options'],
44
+ onActivate: row => this.select(row.data ?? 0),
45
+ onCancel: cancel
46
+ });
47
+ }
48
+ get focused() { return this.focusedValue; }
49
+ set focused(value) { this.focusedValue = value; this.list.focused = value; }
50
+ get pinnedRows() { return this.list.pinnedRows; }
51
+ contentRows() {
52
+ const centered = centeredDialogHost(this.tui);
53
+ const maxRows = centered ? pageRows(this.tui) : Math.max(3, Math.floor(this.tui.terminal.rows * 0.8));
54
+ const chromeRows = centered ? centerDialogChromeRows(maxRows) : CHROME_ROWS;
55
+ return Math.max(1, maxRows - chromeRows);
56
+ }
57
+ searchRows() { return searchFieldRowsFor(this.contentRows()); }
58
+ windowRows() {
59
+ return Math.min(12, Math.max(1, this.contentRows() - this.searchRows()));
60
+ }
61
+ invalidate() { this.list.invalidate(); }
62
+ handleMouse(event) {
63
+ return this.list.handleMouse(event);
64
+ }
65
+ handleInput(data) {
66
+ if (matchesKey(data, 'ctrl+c')) {
67
+ this.cancel();
68
+ return;
69
+ }
70
+ if (!this.list.query && /^[1-9]$/.test(data)) {
71
+ const index = this.labels.findIndex(label => label.startsWith(`${data}. `));
72
+ if (index >= 0) {
73
+ this.select(index);
74
+ return;
75
+ }
76
+ }
77
+ if (this.list.handleInput(data))
78
+ return;
79
+ if (!this.list.query && this.list.pinnedRows === 0 && (data === 'j' || data === 'k'))
80
+ this.list.handleInput(data === 'j' ? '\x1b[B' : '\x1b[A');
81
+ }
82
+ render(width) {
83
+ return this.list.render(Math.max(4, width), this.windowRows() + this.searchRows()).map(line => truncateToWidth(line, width, ''));
84
+ }
85
+ }
86
+ /** An overlay owns focus; its input emits the cursor marker through this delegate. */
87
+ export class DialogPanel {
88
+ title;
89
+ content;
90
+ theme;
91
+ hint;
92
+ message;
93
+ variant;
94
+ deadline;
95
+ maxRows;
96
+ centered = false;
97
+ focusedValue = false;
98
+ detailOffset = 0;
99
+ detailRows = 0;
100
+ detailTotal = 0;
101
+ mouseBodyStart = 0;
102
+ mouseContentRows = [];
103
+ constructor(title, content, theme, hint, message, variant = 'block') {
104
+ this.title = title;
105
+ this.content = content;
106
+ this.theme = theme;
107
+ this.hint = hint;
108
+ this.message = message;
109
+ this.variant = variant;
110
+ }
111
+ get focused() { return this.focusedValue; }
112
+ set focused(value) {
113
+ this.focusedValue = value;
114
+ if ('focused' in this.content)
115
+ this.content.focused = value;
116
+ }
117
+ invalidate() { this.content.invalidate(); }
118
+ handleMouse(event) {
119
+ if (event.type === 'wheel') {
120
+ const key = event.wheelDelta !== undefined && event.wheelDelta < 0 ? '\x1b[5~' : '\x1b[6~';
121
+ this.handleInput(key);
122
+ return { handled: true, render: true };
123
+ }
124
+ if (event.type !== 'move' && event.type !== 'click')
125
+ return undefined;
126
+ if (event.type === 'click' && event.button !== 'left')
127
+ return undefined;
128
+ const row = this.mouseContentRows[event.y - this.mouseBodyStart];
129
+ if (row === undefined)
130
+ return undefined;
131
+ const mouseAware = this.content;
132
+ return mouseAware.handleMouse?.({ ...event, y: row });
133
+ }
134
+ handleInput(data) {
135
+ if (this.detailTotal > this.detailRows && (matchesKey(data, 'pageUp') || matchesKey(data, 'pageDown'))) {
136
+ const delta = matchesKey(data, 'pageUp') ? -1 : 1;
137
+ this.detailOffset = Math.max(0, Math.min(this.detailTotal - this.detailRows, this.detailOffset + delta * Math.max(1, this.detailRows)));
138
+ return;
139
+ }
140
+ this.content.handleInput?.(data);
141
+ }
142
+ render(width) {
143
+ if (width < 1)
144
+ return [];
145
+ const theme = this.theme();
146
+ const inner = this.centered ? centerDialogContentWidth(width) : contentWidth(width);
147
+ const details = this.message
148
+ ? wrapTextWithAnsi(stripTerminalSequences(this.message).replace(/[\x00-\x08\x0b-\x1f\x7f]/g, '').replace(/\t/g, ' '), inner)
149
+ : [];
150
+ const content = this.content.render(inner);
151
+ const frameRows = this.centered ? CENTER_DIALOG_PAD * 2 + 2 : CHROME_ROWS;
152
+ const maxHeight = this.maxRows ? Math.max(3, Math.floor(this.maxRows())) : details.length + content.length + frameRows;
153
+ const chromeRows = this.centered ? centerDialogChromeRows(maxHeight) : CHROME_ROWS;
154
+ const budget = Math.max(0, maxHeight - chromeRows);
155
+ // Keep choices mounted even when an approval contains a large command or path.
156
+ const minContent = Math.min(content.length, Math.min(2, budget));
157
+ const detailBudget = Math.min(details.length, Math.max(0, budget - Math.max(minContent, Math.min(content.length, budget))));
158
+ this.detailRows = detailBudget;
159
+ this.detailTotal = details.length;
160
+ this.detailOffset = Math.max(0, Math.min(this.detailOffset, details.length - detailBudget));
161
+ const body = details.slice(this.detailOffset, this.detailOffset + detailBudget).map(line => theme.fg('muted', line));
162
+ this.mouseContentRows = body.map(() => undefined);
163
+ const available = Math.max(0, budget - body.length);
164
+ // A search row stays on top when a tall list has to be cut.
165
+ const pinned = Math.min(Math.max(0, 'pinnedRows' in this.content ? Number(this.content.pinnedRows) || 0 : 0), content.length, available);
166
+ const scrolling = content.slice(pinned);
167
+ const room = available - pinned;
168
+ const cursor = scrolling.findIndex(line => line.includes('\x1b_pi:c\x07') || stripTerminalSequences(line).startsWith('❯'));
169
+ const first = scrolling.length <= room ? 0 : Math.max(0, Math.min(scrolling.length - room, cursor - Math.floor(room / 2)));
170
+ body.push(...content.slice(0, pinned), ...scrolling.slice(first, first + room));
171
+ this.mouseContentRows.push(...Array.from({ length: pinned }, (_, index) => index));
172
+ this.mouseContentRows.push(...Array.from({ length: Math.min(room, scrolling.length - first) }, (_, index) => pinned + first + index));
173
+ const height = this.centered ? body.length + centerDialogChromeRows(body.length + chromeRows) : maxHeight;
174
+ this.mouseBodyStart = this.centered ? centerDialogVerticalPad(height) + 2 : 2;
175
+ const seconds = this.deadline === undefined ? undefined : `${Math.max(0, Math.ceil((this.deadline - Date.now()) / 1000))}s`;
176
+ let footer = this.hint;
177
+ if (details.length > detailBudget) {
178
+ footer = `PgUp/PgDn details ${this.detailOffset + 1}-${this.detailOffset + detailBudget}/${details.length} · ${footer}`;
179
+ if (visibleWidth(footer) > inner)
180
+ footer = 'PgUp/PgDn details · Enter · Esc';
181
+ }
182
+ const frame = { title: this.title, meta: seconds, body, footer, width, theme };
183
+ if (this.centered)
184
+ return centerDialogFrame({ title: this.title, body, width, rows: height, theme });
185
+ return (this.variant === 'page' && this.maxRows ? pageFrame({ ...frame, rows: height }) : blockFrame(frame)).slice(0, height);
186
+ }
187
+ }
188
+ export class TerminalDialogs {
189
+ tui;
190
+ theme;
191
+ keybindings;
192
+ changed;
193
+ pending = new Set();
194
+ disposed = false;
195
+ constructor(tui, theme, keybindings, changed) {
196
+ this.tui = tui;
197
+ this.theme = theme;
198
+ this.keybindings = keybindings;
199
+ this.changed = changed;
200
+ }
201
+ show(build, options) {
202
+ if (this.disposed || options?.signal?.aborted)
203
+ return Promise.resolve(undefined);
204
+ return new Promise((resolve, reject) => {
205
+ let handle;
206
+ let timer;
207
+ let countdown;
208
+ let settled = false;
209
+ let panel;
210
+ const finish = (value, error) => {
211
+ if (settled)
212
+ return;
213
+ settled = true;
214
+ clearTimeout(timer);
215
+ clearInterval(countdown);
216
+ options?.signal?.removeEventListener('abort', cancel);
217
+ this.pending.delete(cancel);
218
+ handle?.hide();
219
+ const content = panel?.content;
220
+ try {
221
+ content?.dispose?.();
222
+ }
223
+ catch { /* The dialog must still release focus and settle. */ }
224
+ this.changed();
225
+ if (error !== undefined)
226
+ reject(error);
227
+ else
228
+ resolve(value);
229
+ };
230
+ const done = (value) => finish(value);
231
+ const cancel = () => done(undefined);
232
+ this.pending.add(cancel);
233
+ options?.signal?.addEventListener('abort', cancel, { once: true });
234
+ try {
235
+ panel = build(done);
236
+ const page = panel.variant === 'page';
237
+ const centered = centeredDialogHost(this.tui);
238
+ panel.centered = centered && (!page || dialogFits(this.tui.terminal.columns, this.tui.terminal.rows));
239
+ // A centered host caps every dialog at the rows its overlay shows, so a long list is not cut at the bottom.
240
+ panel.maxRows = () => centered ? pageRows(this.tui) : page ? Math.max(3, Math.floor(this.tui.terminal.rows)) : Math.max(3, Math.floor(this.tui.terminal.rows * 0.8));
241
+ if (options?.timeout !== undefined) {
242
+ panel.deadline = Date.now() + Math.max(0, options.timeout);
243
+ timer = setTimeout(cancel, Math.max(0, options.timeout));
244
+ countdown = setInterval(this.changed, 250);
245
+ countdown.unref?.();
246
+ }
247
+ // Every dialog on a centered host is the same flat panel on the scrim that the page commands use.
248
+ handle = this.tui.showOverlay(panel, centered
249
+ ? pageOverlayOptions()
250
+ : page
251
+ ? { anchor: 'top-left', width: '100%', maxHeight: '100%' }
252
+ : { anchor: 'bottom-center', width: '100%', maxHeight: '80%' });
253
+ if (settled)
254
+ handle.hide();
255
+ this.changed();
256
+ }
257
+ catch (error) {
258
+ finish(undefined, error);
259
+ }
260
+ });
261
+ }
262
+ select(title, options, opts) {
263
+ return this.show(done => {
264
+ const list = new SearchableSelect(options, this.tui, this.theme, index => done(options[index]), () => done(undefined));
265
+ return new DialogPanel(title, list, this.theme, '↑/↓ select · Enter confirm · Esc cancel', undefined, opts?.page ? 'page' : 'block');
266
+ }, opts);
267
+ }
268
+ async confirm(title, message, opts) {
269
+ return (await this.show(done => {
270
+ const list = new SearchableSelect(['Yes', 'No'], this.tui, this.theme, index => done(index === 0), () => done(undefined), 'never');
271
+ return new DialogPanel(title, list, this.theme, '↑/↓ select · Enter confirm · Esc cancel', message);
272
+ }, opts)) ?? false;
273
+ }
274
+ input(title, placeholder, opts, secret = false) {
275
+ return this.show(done => {
276
+ const InputType = secret ? SecretInput : Input;
277
+ const input = new InputType({ prompt: secret ? '' : '> ', placeholder, placeholderStyle: text => this.theme().fg('dim', text) });
278
+ input.onSubmit = done;
279
+ input.onEscape = () => done(undefined);
280
+ return new DialogPanel(title, input, this.theme, 'Enter submit · Esc cancel');
281
+ }, opts);
282
+ }
283
+ editor(title, prefill) {
284
+ return this.show(done => {
285
+ const editor = new Editor(this.tui, { borderColor: text => this.theme().fg('border', text), selectList: selectTheme(this.theme()) });
286
+ editor.setText(prefill ?? '');
287
+ editor.onSubmit = done;
288
+ const content = {
289
+ get focused() { return editor.focused; }, set focused(value) { editor.focused = value; },
290
+ invalidate: () => editor.invalidate(), render: width => editor.render(Math.max(4, width)).map(line => truncateToWidth(line, width, '')),
291
+ handleInput: data => {
292
+ if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c'))
293
+ done(undefined);
294
+ else
295
+ editor.handleInput(data);
296
+ }
297
+ };
298
+ return new DialogPanel(title, content, this.theme, 'Enter submit · Shift+Enter newline · Esc cancel');
299
+ });
300
+ }
301
+ custom(factory, options) {
302
+ if (this.disposed)
303
+ return Promise.resolve(undefined);
304
+ return new Promise((resolve, reject) => {
305
+ let handle;
306
+ let component;
307
+ let settled = false;
308
+ const done = (value) => {
309
+ if (settled)
310
+ return;
311
+ settled = true;
312
+ this.pending.delete(cancel);
313
+ handle?.hide();
314
+ try {
315
+ component?.dispose?.();
316
+ }
317
+ catch { /* Cleanup cannot prevent completion. */ }
318
+ this.changed();
319
+ resolve(value);
320
+ };
321
+ const cancel = () => done(undefined);
322
+ this.pending.add(cancel);
323
+ Promise.resolve().then(() => factory(this.tui, this.theme(), this.keybindings, done)).then(value => {
324
+ component = value;
325
+ if (settled) {
326
+ try {
327
+ component.dispose?.();
328
+ }
329
+ catch { /* It never mounted. */ }
330
+ return;
331
+ }
332
+ const defaults = { anchor: 'bottom-center', width: '100%', maxHeight: '90%' };
333
+ const source = options?.overlayOptions;
334
+ const overlayOptions = typeof source === 'function'
335
+ ? new Proxy(defaults, { get: (target, key) => source()[key] ?? target[key] })
336
+ : { ...defaults, ...source };
337
+ handle = this.tui.showOverlay(component, overlayOptions);
338
+ options?.onHandle?.(handle);
339
+ this.changed();
340
+ }).catch(error => {
341
+ if (!settled) {
342
+ settled = true;
343
+ this.pending.delete(cancel);
344
+ handle?.hide();
345
+ try {
346
+ component?.dispose?.();
347
+ }
348
+ catch { /* Cleanup cannot prevent completion. */ }
349
+ this.changed();
350
+ reject(error);
351
+ }
352
+ });
353
+ });
354
+ }
355
+ reset() {
356
+ for (const cancel of [...this.pending])
357
+ cancel();
358
+ }
359
+ dispose() {
360
+ this.disposed = true;
361
+ this.reset();
362
+ }
363
+ }
@@ -0,0 +1,11 @@
1
+ import type { KeybindingsManager as PiKeybindingsManager } from '@earendil-works/pi-coding-agent';
2
+ import { type KeybindingDefinitions } from '@earendil-works/pi-tui';
3
+ declare module '@earendil-works/pi-tui' {
4
+ interface Keybindings {
5
+ 'app.thinking.increase': true;
6
+ 'app.thinking.decrease': true;
7
+ 'app.message.steer': true;
8
+ }
9
+ }
10
+ export declare const HARNESS_KEYBINDINGS: KeybindingDefinitions;
11
+ export declare function terminalKeybindings(agentDir: string): PiKeybindingsManager;
@@ -0,0 +1,49 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { KeybindingsManager, TUI_KEYBINDINGS } from '@earendil-works/pi-tui';
4
+ // Harness owns application actions. Editing and selection retain Pi's reusable bindings.
5
+ const actions = {
6
+ 'app.commands': 'ctrl+k',
7
+ 'app.interrupt': 'escape', 'app.clear': 'ctrl+c', 'app.exit': 'ctrl+d',
8
+ 'app.suspend': process.platform === 'win32' ? [] : 'ctrl+z',
9
+ 'app.thinking.cycle': [], 'app.thinking.save': 'ctrl+s',
10
+ 'app.thinking.increase': 'shift+up', 'app.thinking.decrease': 'shift+down',
11
+ 'app.model.cycleForward': 'ctrl+p', 'app.model.cycleBackward': 'alt+p',
12
+ 'app.model.select': 'ctrl+l', 'app.tools.expand': 'ctrl+o', 'app.thinking.toggle': 'ctrl+t',
13
+ 'app.editor.external': 'ctrl+g', 'app.message.copy': 'ctrl+x',
14
+ 'app.message.steer': ['super+enter', 'alt+enter'], 'app.message.dequeue': 'alt+up',
15
+ 'app.clipboard.pasteImage': process.platform === 'darwin' ? ['ctrl+v', 'alt+v'] : 'ctrl+v',
16
+ 'app.session.toggleNamedFilter': 'ctrl+n', 'app.session.togglePath': 'ctrl+p',
17
+ 'app.session.toggleSort': 'ctrl+s', 'app.session.rename': 'ctrl+r',
18
+ 'app.session.delete': 'ctrl+d', 'app.session.deleteNoninvasive': 'ctrl+backspace',
19
+ 'app.tree.foldOrUp': ['alt+left', 'ctrl+left'], 'app.tree.unfoldOrDown': ['alt+right', 'ctrl+right'],
20
+ 'app.tree.editLabel': 'ctrl+e', 'app.tree.toggleLabelTimestamp': 'ctrl+y',
21
+ 'app.tree.filter.default': 'ctrl+d', 'app.tree.filter.noTools': 'ctrl+t',
22
+ 'app.tree.filter.userOnly': 'ctrl+u', 'app.tree.filter.labeledOnly': 'ctrl+l',
23
+ 'app.tree.filter.all': 'ctrl+a', 'app.tree.filter.cycleForward': 'ctrl+o',
24
+ 'app.tree.filter.cycleBackward': 'ctrl+shift+o', 'app.models.save': 'ctrl+s',
25
+ 'app.models.enableAll': 'ctrl+a', 'app.models.clearAll': 'ctrl+x',
26
+ 'app.models.toggleProvider': 'ctrl+p', 'app.models.reorderUp': 'alt+up', 'app.models.reorderDown': 'alt+down',
27
+ 'app.session.new': [], 'app.session.tree': [], 'app.session.fork': [], 'app.session.resume': []
28
+ };
29
+ export const HARNESS_KEYBINDINGS = {
30
+ ...TUI_KEYBINDINGS,
31
+ ...Object.fromEntries(Object.entries(actions).map(([name, keys]) => [name, { defaultKeys: keys, description: name.replace(/^app\./, '').replaceAll('.', ' ') }]))
32
+ };
33
+ function readBindings(agentDir) {
34
+ let bindings = {};
35
+ try {
36
+ const source = JSON.parse(readFileSync(join(agentDir, 'keybindings.json'), 'utf8'));
37
+ if (source && typeof source === 'object' && !Array.isArray(source)) {
38
+ bindings = Object.fromEntries(Object.entries(source).filter(([, value]) => typeof value === 'string' || Array.isArray(value) && value.every(key => typeof key === 'string')));
39
+ }
40
+ }
41
+ catch { /* A missing keybindings file uses the application defaults. */ }
42
+ return bindings;
43
+ }
44
+ export function terminalKeybindings(agentDir) {
45
+ const manager = new KeybindingsManager(HARNESS_KEYBINDINGS, readBindings(agentDir));
46
+ // CustomEditor and selector factories type their manager as Pi's private subclass.
47
+ // They consume the public base plus getEffectiveConfig; Harness owns the definitions.
48
+ return Object.assign(manager, { getEffectiveConfig: () => manager.getResolvedBindings(), reload() { manager.setUserBindings(readBindings(agentDir)); } });
49
+ }
@@ -0,0 +1,73 @@
1
+ import type { Theme } from '@earendil-works/pi-coding-agent';
2
+ import { type Component, type Focusable, type TuiMouseEventResult } from '@earendil-works/pi-tui';
3
+ import { type TerminalMouseInput } from "./mouse.js";
4
+ export type RowTone = 'success' | 'warning' | 'error' | 'muted' | 'dim' | 'accent';
5
+ export interface ListRow<T = unknown> {
6
+ id: string;
7
+ label: string;
8
+ /** Shown at the right edge, in `tone`. */
9
+ detail?: string;
10
+ tone?: RowTone;
11
+ /** Rows with the same consecutive group share a heading (not shown while searching). */
12
+ group?: string;
13
+ searchText?: string;
14
+ /** Shown dim, skipped by the arrow keys, never activated. */
15
+ disabled?: boolean;
16
+ data?: T;
17
+ }
18
+ export interface FilterListOptions<T> {
19
+ theme: () => Theme;
20
+ rows?: readonly ListRow<T>[];
21
+ /** Search is visible by default; use `never` only for a fixed, non-searchable choice list. */
22
+ search?: 'always' | 'never';
23
+ /** Rows the list may use; the search field is part of it. Defaults to what `render` is given. */
24
+ limit?: () => number;
25
+ empty?: string;
26
+ noun?: readonly [string, string];
27
+ /** Short context included in the search row while a query is active. */
28
+ searchContext?: (query: string) => string | undefined;
29
+ onActivate?: (row: ListRow<T>) => void;
30
+ /** Space, while the search is empty. */
31
+ onToggle?: (row: ListRow<T>) => void;
32
+ onCancel?: () => void;
33
+ }
34
+ export declare class FilterList<T = unknown> implements Component, Focusable {
35
+ private readonly options;
36
+ private rows;
37
+ private visible;
38
+ private selectedId;
39
+ private focusedValue;
40
+ private renderedSearchRows;
41
+ private renderedRows;
42
+ private readonly search;
43
+ constructor(options: FilterListOptions<T>);
44
+ get focused(): boolean;
45
+ set focused(value: boolean);
46
+ get query(): string;
47
+ get selected(): ListRow<T> | undefined;
48
+ get total(): number;
49
+ get shown(): number;
50
+ /** Rows the list would use if nothing cut it: the search field, headings and rows. */
51
+ get height(): number;
52
+ /** Rows at the top of `render` that a frame must keep when it has to cut the list. */
53
+ get pinnedRows(): number;
54
+ setRows(rows: readonly ListRow<T>[]): void;
55
+ /** Searches for `text` as if it had been typed. */
56
+ setQuery(text: string): void;
57
+ select(id: string): void;
58
+ /** Selects the row at a rendered line, and activates it on a primary click. */
59
+ handleMouse(event: TerminalMouseInput): TuiMouseEventResult | undefined;
60
+ invalidate(): void;
61
+ private limit;
62
+ private mode;
63
+ private canSearch;
64
+ private searchVisible;
65
+ private firstSelectable;
66
+ private refilter;
67
+ private move;
68
+ handleInput(data: string): boolean;
69
+ private entries;
70
+ private line;
71
+ /** `rows` is the most the list may use, the search row included. */
72
+ render(width: number, rows?: number): string[];
73
+ }