@xingular/harness 0.1.7 → 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 (683) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +187 -85
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +13701 -13498
  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 +808 -151
  373. package/docs/README.md +22 -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-0002-native-subagent-lifecycle.md +49 -0
  403. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  404. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  405. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  406. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  407. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  408. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  409. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  410. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  411. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  412. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  413. package/docs/decisions/ADR-0013-doctor.md +27 -0
  414. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  415. package/docs/doctor.md +74 -0
  416. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  418. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  420. package/docs/features/README.md +20 -0
  421. package/docs/features/automations/README.md +41 -0
  422. package/docs/features/cores/README.md +39 -0
  423. package/docs/features/google-harness2/README.md +52 -0
  424. package/docs/features/integrations/README.md +40 -0
  425. package/docs/features/interfaces/README.md +29 -0
  426. package/docs/features/memory/README.md +28 -0
  427. package/docs/releases/1.0.0.md +40 -0
  428. package/docs/releases/README.md +36 -0
  429. package/docs/study/00-index.md +78 -0
  430. package/docs/study/arms/00-matrix.md +20 -0
  431. package/docs/study/arms/01-system-prompt.md +211 -0
  432. package/docs/study/arms/02-tools.md +79 -0
  433. package/docs/study/arms/03-subagents.md +90 -0
  434. package/docs/study/arms/04-skills.md +75 -0
  435. package/docs/study/arms/05-context-management.md +90 -0
  436. package/docs/study/arms/06-memory.md +90 -0
  437. package/docs/study/arms/07-governance.md +71 -0
  438. package/docs/study/arms/08-execution.md +69 -0
  439. package/docs/study/arms/09-observability.md +60 -0
  440. package/docs/study/arms/10-refinement.md +110 -0
  441. package/docs/study/btw-comparison.md +37 -0
  442. package/docs/study/feature-gap-review.md +42 -0
  443. package/docs/study/insights.md +123 -0
  444. package/docs/study/roadmap.md +72 -0
  445. package/docs/study/sources/claude-code.md +44 -0
  446. package/docs/study/sources/deepseek-harness.md +102 -0
  447. package/docs/study/sources/harness2.md +50 -0
  448. package/docs/study/sources/kimi-cli.md +42 -0
  449. package/docs/study/sources/omp.md +93 -0
  450. package/docs/study/sources/opencode.md +43 -0
  451. package/docs/study/sources/openhands.md +46 -0
  452. package/docs/study/sources/smolagents.md +40 -0
  453. package/docs/study/sources/swe-agent.md +34 -0
  454. package/docs/system-prompt-design.md +196 -0
  455. package/docs/terminal-tui.md +473 -56
  456. package/package.json +43 -13
  457. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  458. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  459. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  460. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  461. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  462. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  463. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  464. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  465. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  466. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  467. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  468. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  469. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  470. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  471. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  472. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  473. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  474. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  475. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  476. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  477. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  478. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  479. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  480. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  481. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  482. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  483. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  484. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  485. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  486. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  487. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  488. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  489. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  490. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  491. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  492. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  493. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  494. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  495. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  496. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  497. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  498. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  499. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  500. package/src/accounts/accounts.test.ts +0 -333
  501. package/src/accounts/accounts.ts +0 -658
  502. package/src/accounts/env.test.ts +0 -95
  503. package/src/accounts/env.ts +0 -338
  504. package/src/accounts/secrets.ts +0 -50
  505. package/src/accounts/store.ts +0 -338
  506. package/src/capabilities/api.ts +0 -75
  507. package/src/capabilities/runSnapshot.ts +0 -59
  508. package/src/capabilities/types.ts +0 -34
  509. package/src/cli.ts +0 -118
  510. package/src/core/bus.ts +0 -34
  511. package/src/core/changes.ts +0 -33
  512. package/src/core/env.ts +0 -27
  513. package/src/core/errors.ts +0 -32
  514. package/src/core/frontmatter.ts +0 -47
  515. package/src/core/fs.test.ts +0 -38
  516. package/src/core/fs.ts +0 -92
  517. package/src/core/index.ts +0 -193
  518. package/src/core/path.test.ts +0 -14
  519. package/src/core/path.ts +0 -79
  520. package/src/core/projects.ts +0 -90
  521. package/src/core/text.ts +0 -39
  522. package/src/harness.ts +0 -312
  523. package/src/hub/catalog.json +0 -123
  524. package/src/hub/cli.ts +0 -59
  525. package/src/hub/hub.test.ts +0 -205
  526. package/src/hub/hub.ts +0 -256
  527. package/src/hub/schema.ts +0 -81
  528. package/src/index.ts +0 -75
  529. package/src/mcp/connections.ts +0 -614
  530. package/src/mcp/manager.ts +0 -130
  531. package/src/mcp/oauth.ts +0 -195
  532. package/src/mcp/scopeMigration.test.ts +0 -79
  533. package/src/mcp/scopeMigration.ts +0 -204
  534. package/src/mcp/service.test.ts +0 -376
  535. package/src/mcp/service.ts +0 -549
  536. package/src/mcp/types.ts +0 -108
  537. package/src/memory/api.test.ts +0 -82
  538. package/src/memory/api.ts +0 -303
  539. package/src/memory/blocks.test.ts +0 -78
  540. package/src/memory/blocks.ts +0 -408
  541. package/src/memory/caller.ts +0 -69
  542. package/src/memory/curation.test.ts +0 -163
  543. package/src/memory/curation.ts +0 -64
  544. package/src/memory/dispatch.ts +0 -59
  545. package/src/memory/facts.test.ts +0 -41
  546. package/src/memory/facts.ts +0 -248
  547. package/src/memory/graph.ts +0 -103
  548. package/src/memory/health.test.ts +0 -130
  549. package/src/memory/health.ts +0 -74
  550. package/src/memory/maintainer.ts +0 -272
  551. package/src/memory/maintenance.test.ts +0 -176
  552. package/src/memory/maintenance.ts +0 -518
  553. package/src/memory/migrate.ts +0 -79
  554. package/src/memory/operations.ts +0 -150
  555. package/src/memory/proposals.test.ts +0 -168
  556. package/src/memory/proposals.ts +0 -584
  557. package/src/memory/recall.test.ts +0 -115
  558. package/src/memory/recall.ts +0 -278
  559. package/src/memory/references.ts +0 -77
  560. package/src/memory/runContext.ts +0 -93
  561. package/src/memory/secrets.ts +0 -6
  562. package/src/memory/store.test.ts +0 -66
  563. package/src/memory/store.ts +0 -385
  564. package/src/memory/wiki.test.ts +0 -47
  565. package/src/memory/wiki.ts +0 -422
  566. package/src/memory/wikiIndex.test.ts +0 -88
  567. package/src/memory/wikiIndex.ts +0 -116
  568. package/src/plugins/api.ts +0 -181
  569. package/src/plugins/attachments.test.ts +0 -84
  570. package/src/plugins/attachments.ts +0 -141
  571. package/src/plugins/builtin.ts +0 -82
  572. package/src/plugins/catalogue.test.ts +0 -254
  573. package/src/plugins/catalogue.ts +0 -251
  574. package/src/plugins/cli.ts +0 -184
  575. package/src/plugins/discover.ts +0 -151
  576. package/src/plugins/firstParty.test.ts +0 -143
  577. package/src/plugins/firstParty.ts +0 -129
  578. package/src/plugins/hooks.test.ts +0 -250
  579. package/src/plugins/hooks.ts +0 -239
  580. package/src/plugins/identity.ts +0 -37
  581. package/src/plugins/install.test.ts +0 -107
  582. package/src/plugins/install.ts +0 -106
  583. package/src/plugins/inventory.ts +0 -123
  584. package/src/plugins/manifest.ts +0 -76
  585. package/src/plugins/plugins.test.ts +0 -205
  586. package/src/plugins/plugins.ts +0 -189
  587. package/src/plugins/proposal.ts +0 -121
  588. package/src/plugins/runtime.test.ts +0 -40
  589. package/src/plugins/runtime.ts +0 -82
  590. package/src/plugins/trust.ts +0 -142
  591. package/src/plugins/types.ts +0 -149
  592. package/src/prompt/compile.test.ts +0 -261
  593. package/src/prompt/compile.ts +0 -732
  594. package/src/server/methods.ts +0 -349
  595. package/src/server/remote.ts +0 -77
  596. package/src/server/rpc.ts +0 -116
  597. package/src/server/serve.ts +0 -28
  598. package/src/server/server.test.ts +0 -174
  599. package/src/sessions/approvals.ts +0 -118
  600. package/src/sessions/contracts.ts +0 -336
  601. package/src/sessions/conversation.test.ts +0 -177
  602. package/src/sessions/extensionSession.test.ts +0 -74
  603. package/src/sessions/extensionUi.test.ts +0 -65
  604. package/src/sessions/extensionUi.ts +0 -102
  605. package/src/sessions/history.ts +0 -51
  606. package/src/sessions/lineageJoin.ts +0 -75
  607. package/src/sessions/policy.ts +0 -36
  608. package/src/sessions/pricing.ts +0 -60
  609. package/src/sessions/questionBatches.test.ts +0 -110
  610. package/src/sessions/reasoningSummaries.ts +0 -59
  611. package/src/sessions/registry.ts +0 -381
  612. package/src/sessions/runIndex.ts +0 -99
  613. package/src/sessions/runStore.test.ts +0 -152
  614. package/src/sessions/runStore.ts +0 -332
  615. package/src/sessions/runner.ts +0 -604
  616. package/src/sessions/runtimeResources.test.ts +0 -61
  617. package/src/sessions/sessions.test.ts +0 -549
  618. package/src/sessions/sessions.ts +0 -339
  619. package/src/skills/registry.test.ts +0 -104
  620. package/src/skills/registry.ts +0 -413
  621. package/src/terminal/accountsMenu.test.ts +0 -225
  622. package/src/terminal/accountsMenu.ts +0 -382
  623. package/src/terminal/cli.ts +0 -149
  624. package/src/terminal/client.ts +0 -74
  625. package/src/terminal/control.test.ts +0 -23
  626. package/src/terminal/control.ts +0 -23
  627. package/src/terminal/controller.ts +0 -291
  628. package/src/terminal/hubMenu.ts +0 -24
  629. package/src/terminal/launch.test.ts +0 -25
  630. package/src/terminal/launch.ts +0 -48
  631. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  632. package/src/terminal/piExtension.ts +0 -259
  633. package/src/terminal/pluginControl.test.ts +0 -146
  634. package/src/terminal/pluginMenu.ts +0 -112
  635. package/src/terminal/socket.test.ts +0 -71
  636. package/src/terminal/socket.ts +0 -232
  637. package/src/terminal/standalone.test.ts +0 -167
  638. package/src/terminal/standalone.ts +0 -153
  639. package/src/terminal/terminal.test.ts +0 -399
  640. package/src/terminal/terminals.ts +0 -553
  641. package/src/terminal/tui/application.test.ts +0 -114
  642. package/src/terminal/tui/application.ts +0 -491
  643. package/src/terminal/tui/commands.test.ts +0 -218
  644. package/src/terminal/tui/commands.ts +0 -361
  645. package/src/terminal/tui/dialogs.ts +0 -301
  646. package/src/terminal/tui/editor.test.ts +0 -84
  647. package/src/terminal/tui/editor.ts +0 -79
  648. package/src/terminal/tui/keybindings.test.ts +0 -22
  649. package/src/terminal/tui/keybindings.ts +0 -50
  650. package/src/terminal/tui/piAdapter.ts +0 -62
  651. package/src/terminal/tui/presentation.test.ts +0 -79
  652. package/src/terminal/tui/questions.test.ts +0 -41
  653. package/src/terminal/tui/questions.ts +0 -47
  654. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  655. package/src/terminal/tui/runtime.test.ts +0 -215
  656. package/src/terminal/tui/runtime.ts +0 -388
  657. package/src/terminal/tui/sessionUi.ts +0 -24
  658. package/src/terminal/tui/settings.test.ts +0 -150
  659. package/src/terminal/tui/settings.ts +0 -188
  660. package/src/terminal/tui/status.test.ts +0 -70
  661. package/src/terminal/tui/status.ts +0 -109
  662. package/src/terminal/tui/theme.ts +0 -174
  663. package/src/terminal/tui/tools.test.ts +0 -145
  664. package/src/terminal/tui/tools.ts +0 -142
  665. package/src/terminal/tui/transcript.test.ts +0 -25
  666. package/src/terminal/tui/transcript.ts +0 -124
  667. package/src/terminal/tui/ui.test.ts +0 -313
  668. package/src/terminal/tui/ui.ts +0 -166
  669. package/src/terminal/tui/welcome.ts +0 -102
  670. package/src/tools/askUser.test.ts +0 -69
  671. package/src/tools/askUser.ts +0 -59
  672. package/src/tools/definitions.ts +0 -187
  673. package/src/tools/maintenance.ts +0 -24
  674. package/src/tools/memoryTools.ts +0 -22
  675. package/src/tools/pluginPropose.ts +0 -41
  676. package/src/tools/registryWrite.test.ts +0 -101
  677. package/src/tools/registryWrite.ts +0 -182
  678. package/src/tools/spawnSubagent.ts +0 -92
  679. package/src/tools/types.ts +0 -39
  680. package/src/web/safeRequest.ts +0 -171
  681. package/src/web/text.ts +0 -53
  682. package/src/web/tools.ts +0 -134
  683. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,42 @@
1
+ import { createQuestionPicker } from "./questionPicker.js";
2
+ /** Answers stay local until the complete group can be submitted to the registry. */
3
+ export async function answerTerminalQuestion(ui, request, signal) {
4
+ const choices = request.options;
5
+ const progress = request.batchId ? `${request.batchIndex} of ${request.batchCount} · ` : '';
6
+ const title = `${progress}${request.summary ?? 'Question'}`;
7
+ const inputTitle = `${progress}${request.summary ? `${request.summary}: ` : ''}${request.question ?? 'Question'}`;
8
+ if (!Array.isArray(choices) || choices.length === 0)
9
+ throw new Error('Every question needs at least one choice.');
10
+ if (!choices.some(choice => choice.recommended))
11
+ throw new Error('Every question needs at least one recommended choice.');
12
+ let selected = [];
13
+ while (!signal.aborted) {
14
+ let cancelPicker = () => { };
15
+ const onAbort = () => cancelPicker();
16
+ signal.addEventListener('abort', onAbort, { once: true });
17
+ const picker = ui.custom((tui, theme, _keybindings, done) => {
18
+ cancelPicker = () => done({ type: 'cancel' });
19
+ if (signal.aborted)
20
+ cancelPicker();
21
+ return createQuestionPicker(tui, theme, title, request.question, choices, request.multiSelect === true, request.allowText !== false, selected, done);
22
+ });
23
+ let result;
24
+ try {
25
+ result = await picker;
26
+ }
27
+ finally {
28
+ signal.removeEventListener('abort', onAbort);
29
+ }
30
+ if (!result || result.type === 'cancel' || signal.aborted)
31
+ return undefined;
32
+ selected = result.selected;
33
+ if (result.type === 'answer')
34
+ return { selected };
35
+ const text = await ui.input(inputTitle, undefined, { signal });
36
+ if (signal.aborted)
37
+ return undefined;
38
+ if (text !== undefined)
39
+ return { selected, text };
40
+ }
41
+ return undefined;
42
+ }
@@ -0,0 +1,114 @@
1
+ import { type AgentSession, type AgentSessionEventListener, type AgentSessionRuntime, type AgentSessionServices, type ExtensionUIContext } from '@earendil-works/pi-coding-agent';
2
+ import type { SessionAccount } from "../accountsMenu.js";
3
+ import type { QuestionAnswer } from "../../sessions/registry.js";
4
+ import type { TerminalQuestion } from "./questions.js";
5
+ import { type ComposerMode } from "./modeChoices.js";
6
+ export interface TerminalArguments {
7
+ appendSystemPrompt: string[];
8
+ extensions: string[];
9
+ skills: string[];
10
+ prompts: string[];
11
+ themes: string[];
12
+ sessionDir: string;
13
+ session?: string;
14
+ model?: string;
15
+ }
16
+ /** The launch specification comes from Terminals.prepare(), never from Pi's own discovery. */
17
+ export declare function parseTerminalArguments(args: string[]): TerminalArguments;
18
+ export interface TerminalRuntimeHost {
19
+ ui: ExtensionUIContext;
20
+ shutdown(): void;
21
+ notify(message: string): void;
22
+ changed(): void;
23
+ resources?(services: AgentSessionServices): void;
24
+ }
25
+ type SessionChangeListener = (session: AgentSession) => void | Promise<void>;
26
+ type NewOptions = Parameters<AgentSessionRuntime['newSession']>[0];
27
+ type SwitchOptions = Parameters<AgentSessionRuntime['switchSession']>[1];
28
+ type ForkOptions = Parameters<AgentSessionRuntime['fork']>[1];
29
+ type TreeOptions = Parameters<AgentSession['navigateTree']>[1];
30
+ export interface TerminalSnapshot {
31
+ readonly sessionId: string;
32
+ readonly sessionFile?: string;
33
+ readonly name?: string;
34
+ readonly cwd: string;
35
+ readonly account: Readonly<SessionAccount> | null;
36
+ readonly model?: Readonly<{
37
+ id: string;
38
+ provider: string;
39
+ name: string;
40
+ reasoning: boolean;
41
+ contextWindow: number;
42
+ }>;
43
+ readonly thinkingLevel: AgentSession['thinkingLevel'];
44
+ readonly isStreaming: boolean;
45
+ readonly idle: boolean;
46
+ readonly hasUserMessages: boolean;
47
+ readonly hideThinking: boolean;
48
+ readonly context: Readonly<{
49
+ percent: number | null;
50
+ window: number;
51
+ }>;
52
+ readonly costUsd: number;
53
+ readonly subscription: boolean;
54
+ readonly queue: Readonly<{
55
+ steering: readonly string[];
56
+ followUp: readonly string[];
57
+ }>;
58
+ }
59
+ export interface TerminalDecision extends TerminalQuestion {
60
+ type: 'approval' | 'question';
61
+ target?: string;
62
+ action?: string;
63
+ rememberable?: boolean;
64
+ }
65
+ export interface TerminalPermissionState {
66
+ readonly full: boolean;
67
+ readonly globalTools: readonly string[];
68
+ }
69
+ /** An image the user attached to a prompt, as Pi sends it to the model. */
70
+ export interface TerminalImage {
71
+ type: 'image';
72
+ data: string;
73
+ mimeType: string;
74
+ }
75
+ export interface TerminalRuntime {
76
+ pending(): Promise<TerminalDecision[]>;
77
+ approve(requestId: string, decision: 'approved' | 'denied', alwaysAllowTool?: boolean): Promise<void>;
78
+ permissions(): Promise<TerminalPermissionState>;
79
+ setFullPermission(enabled: boolean): Promise<void>;
80
+ setGlobalTool(tool: string, allowed: boolean): Promise<void>;
81
+ answer(requestId: string, answer: QuestionAnswer): Promise<void>;
82
+ answerBatch(batchId: string, answers: Array<{
83
+ questionId: string;
84
+ answer: QuestionAnswer;
85
+ }>): Promise<void>;
86
+ snapshot(): TerminalSnapshot;
87
+ /** Images go to the model in the same user message as `text`. */
88
+ submit(text: string, followUp?: boolean, images?: TerminalImage[]): Promise<void>;
89
+ submitPlan(text: string, images?: TerminalImage[]): Promise<void>;
90
+ /** The composer's mode. Its saved model and effort apply now, or when a running turn settles. */
91
+ setMode(mode: ComposerMode): Promise<void>;
92
+ readonly session: AgentSession;
93
+ readonly services: AgentSessionServices;
94
+ readonly cwd: string;
95
+ readonly sessionDirectory: string;
96
+ subscribe(listener: AgentSessionEventListener): () => void;
97
+ onSessionChange(listener: SessionChangeListener): () => void;
98
+ onBeforeSessionChange(listener: () => void): () => void;
99
+ newSession(options?: NewOptions): ReturnType<AgentSessionRuntime['newSession']>;
100
+ switchSession(path: string, options?: SwitchOptions): ReturnType<AgentSessionRuntime['switchSession']>;
101
+ fork(entryId: string, options?: ForkOptions): ReturnType<AgentSessionRuntime['fork']>;
102
+ navigateTree(targetId: string, options?: TreeOptions): ReturnType<AgentSession['navigateTree']>;
103
+ importFromJsonl(path: string, cwdOverride?: string): ReturnType<AgentSessionRuntime['importFromJsonl']>;
104
+ installationDeviceId(): Promise<string>;
105
+ reload(): Promise<void>;
106
+ interrupt(): Promise<void>;
107
+ dispose(): Promise<void>;
108
+ }
109
+ /** Saved native history stays in the prepared project folder, including symlink targets. */
110
+ export declare function assertTerminalHistoryPath(path: string, sessionDirectory: string): void;
111
+ /** Inspect the header before any native switch/import can invalidate a session or copy a file. */
112
+ export declare function assertTerminalSessionScope(path: string, cwd: string, cwdOverride?: string): void;
113
+ export declare function createTerminalRuntime(args: string[], host: TerminalRuntimeHost): Promise<TerminalRuntime>;
114
+ export {};
@@ -0,0 +1,441 @@
1
+ import { createAgentSession, createAgentSessionRuntime, DefaultResourceLoader, ModelRuntime, resolveCliModel, SessionManager, SettingsManager } from '@earendil-works/pi-coding-agent';
2
+ import { closeSync, existsSync, openSync, readSync, realpathSync } from 'node:fs';
3
+ import { isAbsolute, join, relative, resolve, sep } from 'node:path';
4
+ import terminalExtension from "../piExtension.js";
5
+ import { planModeTools } from "./planMode.js";
6
+ import { claimTerminalControl, controlCall } from "../control.js";
7
+ import { loadPiAdapter } from "./piAdapter.js";
8
+ import { loadPi } from "../../pi/runtime.js";
9
+ import { sessionUiContext } from "./sessionUi.js";
10
+ import { ModeChoices } from "./modeChoices.js";
11
+ /** The launch specification comes from Terminals.prepare(), never from Pi's own discovery. */
12
+ export function parseTerminalArguments(args) {
13
+ const result = { appendSystemPrompt: [], extensions: [], skills: [], prompts: [], themes: [], sessionDir: '' };
14
+ const lists = {
15
+ '--append-system-prompt': result.appendSystemPrompt, '--extension': result.extensions,
16
+ '--skill': result.skills, '--prompt-template': result.prompts, '--theme': result.themes
17
+ };
18
+ const flags = new Set(['--no-extensions', '--no-skills', '--no-prompt-templates', '--no-themes']);
19
+ for (let index = 0; index < args.length; index++) {
20
+ const argument = args[index];
21
+ if (flags.has(argument))
22
+ continue;
23
+ if (!(argument in lists) && !['--session-dir', '--session', '--model'].includes(argument)) {
24
+ throw new Error(`Unsupported prepared terminal argument: ${argument}`);
25
+ }
26
+ const value = args[++index];
27
+ if (!value || value.startsWith('--'))
28
+ throw new Error(`${argument} needs a value.`);
29
+ if (argument in lists)
30
+ lists[argument].push(value);
31
+ else if (argument === '--session-dir')
32
+ result.sessionDir = value;
33
+ else if (argument === '--session')
34
+ result.session = value;
35
+ else
36
+ result.model = value;
37
+ }
38
+ if (!result.sessionDir)
39
+ throw new Error('The Harness terminal requires its prepared --session-dir.');
40
+ if (!result.extensions.length)
41
+ throw new Error('The Harness terminal requires its prepared bridge extension.');
42
+ return result;
43
+ }
44
+ /** Saved native history stays in the prepared project folder, including symlink targets. */
45
+ export function assertTerminalHistoryPath(path, sessionDirectory) {
46
+ const within = relative(realpathSync(sessionDirectory), realpathSync(path));
47
+ if (!within || within === '..' || within.startsWith(`..${sep}`) || isAbsolute(within)) {
48
+ throw new Error('Resume only from this terminal history folder. Use /import for another native session file in this working folder.');
49
+ }
50
+ }
51
+ /** Inspect the header before any native switch/import can invalidate a session or copy a file. */
52
+ export function assertTerminalSessionScope(path, cwd, cwdOverride) {
53
+ if (cwdOverride !== undefined && realpathSync(resolve(cwdOverride)) !== realpathSync(cwd)) {
54
+ throw new Error('Resume this conversation in a terminal opened for its own working folder.');
55
+ }
56
+ const descriptor = openSync(path, 'r');
57
+ let first;
58
+ try {
59
+ const buffer = Buffer.alloc(65_536);
60
+ const size = readSync(descriptor, buffer, 0, buffer.length, 0);
61
+ const text = buffer.subarray(0, size).toString('utf8').replace(/^\uFEFF/, '');
62
+ const newline = text.indexOf('\n');
63
+ if (newline === -1 && size === buffer.length)
64
+ throw new Error('The native session header is too large.');
65
+ first = newline === -1 ? text : text.slice(0, newline);
66
+ }
67
+ finally {
68
+ closeSync(descriptor);
69
+ }
70
+ let header;
71
+ try {
72
+ header = JSON.parse(first);
73
+ }
74
+ catch {
75
+ throw new Error('This file does not have a readable native session header.');
76
+ }
77
+ if (header.type !== 'session' || !header.cwd || !isAbsolute(header.cwd)) {
78
+ throw new Error('The native session must record its original absolute working folder.');
79
+ }
80
+ if (realpathSync(header.cwd) !== realpathSync(cwd)) {
81
+ throw new Error('This conversation belongs to another working folder. Open its terminal to keep project permissions and context isolated.');
82
+ }
83
+ }
84
+ export async function createTerminalRuntime(args, host) {
85
+ const prepared = parseTerminalArguments(args);
86
+ const cwd = realpathSync(process.cwd());
87
+ const agentDirValue = process.env.PI_CODING_AGENT_DIR;
88
+ if (!agentDirValue || !isAbsolute(agentDirValue))
89
+ throw new Error('The Harness terminal requires its isolated account directory.');
90
+ const agentDir = realpathSync(agentDirValue);
91
+ const sessionDirectory = realpathSync(resolve(cwd, prepared.sessionDir));
92
+ // Pi writes a session file only after its first message, so a restart before that has nothing to resume.
93
+ const resume = prepared.session && existsSync(resolve(cwd, prepared.session)) ? resolve(cwd, prepared.session) : null;
94
+ if (resume) {
95
+ assertTerminalHistoryPath(resume, sessionDirectory);
96
+ assertTerminalSessionScope(resume, cwd);
97
+ }
98
+ await loadPi();
99
+ // Claim before loading any plugin code and retain it in the trusted process across reloads.
100
+ await claimTerminalControl();
101
+ const identity = await controlCall('accounts.session').catch(() => null);
102
+ const account = identity && typeof identity.accountId === 'string' && typeof identity.label === 'string'
103
+ ? Object.freeze({ accountId: identity.accountId, label: identity.label }) : null;
104
+ const adapter = await loadPiAdapter();
105
+ const modelRuntime = await ModelRuntime.create({ authPath: join(agentDir, 'auth.json'), modelsPath: join(agentDir, 'models.json') });
106
+ const listeners = new Set();
107
+ const changes = new Set();
108
+ const beforeChanges = new Set();
109
+ let unsubscribe;
110
+ let changing = false;
111
+ let disposed = false;
112
+ let uiGeneration = 0;
113
+ let deviceIdPromise = null;
114
+ const installationDeviceId = () => {
115
+ if (!deviceIdPromise) {
116
+ deviceIdPromise = controlCall('accounts.deviceId').catch((error) => {
117
+ deviceIdPromise = null;
118
+ throw error;
119
+ });
120
+ }
121
+ return deviceIdPromise;
122
+ };
123
+ const currentUi = () => {
124
+ const generation = uiGeneration;
125
+ return sessionUiContext(host.ui, () => !disposed && generation === uiGeneration);
126
+ };
127
+ const planRun = { active: false, allowedTools: new Set() };
128
+ let currentMode = 'normal';
129
+ let pendingApply = false;
130
+ const choiceStore = {
131
+ read: () => controlCall('accounts.choices.get'),
132
+ write: (mode, patch) => controlCall('accounts.choices.set', { mode, ...patch })
133
+ };
134
+ const modeChoices = new ModeChoices(choiceStore);
135
+ // A selection is recorded against the mode it was made in; a one-shot plan run is always plan.
136
+ const recordingMode = () => (planRun.active ? 'plan' : currentMode);
137
+ const modelFor = (reference) => resolveCliModel({ cliModel: reference, modelRuntime }).model;
138
+ const applyMode = () => modeChoices.apply(native.session, currentMode, modelFor);
139
+ const restoreChoice = async (session, previous) => {
140
+ if (previous.model && (session.model?.provider !== previous.model.provider || session.model?.id !== previous.model.id)) {
141
+ await session.setModel(previous.model, { persist: false }).catch(() => undefined);
142
+ }
143
+ session.setThinkingLevel(previous.effort, { persist: false });
144
+ };
145
+ let native;
146
+ const factory = async ({ cwd: targetCwd, sessionManager, sessionStartEvent }) => {
147
+ if (realpathSync(targetCwd) !== cwd)
148
+ throw new Error('A native session cannot change this terminal working folder.');
149
+ const settingsManager = SettingsManager.create(cwd, agentDir);
150
+ const resourceLoader = new DefaultResourceLoader({
151
+ cwd, agentDir,
152
+ // The real settings still control models and tools; empty discovery settings prevent a
153
+ // second resource decision outside the Harness's trusted prepare() result.
154
+ settingsManager: SettingsManager.inMemory({}),
155
+ noExtensions: true, noSkills: true, noPromptTemplates: true, noThemes: true,
156
+ additionalExtensionPaths: prepared.extensions.slice(0, -1),
157
+ additionalSkillPaths: prepared.skills, additionalPromptTemplatePaths: prepared.prompts,
158
+ additionalThemePaths: prepared.themes,
159
+ extensionFactories: [
160
+ ...adapter.builtins,
161
+ { name: 'harness-terminal-bridge', factory: pi => terminalExtension(pi, planRun, () => native.session), hidden: true },
162
+ // A model picked in the terminal reaches Pi as this event. A restore is not a pick.
163
+ { name: 'harness-mode-choices', factory: pi => { pi.on('model_select', event => { if (event.source !== 'restore')
164
+ void modeChoices.record(recordingMode(), { model: `${event.model.provider}/${event.model.id}` }); }); }, hidden: true }
165
+ ],
166
+ appendSystemPromptOverride: (base) => [...base, ...prepared.appendSystemPrompt]
167
+ });
168
+ const reloadResources = resourceLoader.reload.bind(resourceLoader);
169
+ resourceLoader.reload = async (options) => {
170
+ // Recheck the host's exact package trust and attachment identities before every load,
171
+ // including the reload performed internally by AgentSession.reload().
172
+ await controlCall('terminal.resources', {}, 30_000);
173
+ await reloadResources(options);
174
+ };
175
+ await resourceLoader.reload();
176
+ const errors = resourceLoader.getExtensions().errors;
177
+ if (errors.length)
178
+ throw new Error(errors.map((error) => `${error.path}: ${error.error}`).join('\n'));
179
+ let selected;
180
+ if (prepared.model && sessionStartEvent?.reason === 'startup') {
181
+ selected = resolveCliModel({ cliModel: prepared.model, modelRuntime });
182
+ if (selected.error || !selected.model)
183
+ throw new Error(selected.error ?? `Model ${prepared.model} is unavailable.`);
184
+ }
185
+ // A fresh conversation starts on this account's latest normal-mode choice. A resumed one keeps its history,
186
+ // and an explicit --model wins. A saved model the account cannot use is skipped.
187
+ const fresh = !prepared.model && (sessionStartEvent?.reason === 'new' || (sessionStartEvent?.reason === 'startup' && !resume));
188
+ const saved = fresh ? modeChoices.resolve('normal') : {};
189
+ if (fresh && saved.model) {
190
+ const chosen = resolveCliModel({ cliModel: saved.model, modelRuntime });
191
+ if (chosen.model && !chosen.error && await modelRuntime.checkAuth(chosen.model.provider))
192
+ selected = chosen;
193
+ }
194
+ const thinkingLevel = selected?.thinkingLevel ?? (fresh ? saved.effort : undefined);
195
+ const created = await createAgentSession({
196
+ cwd, agentDir, modelRuntime, settingsManager, resourceLoader, sessionManager, sessionStartEvent,
197
+ ...(selected?.model ? { model: selected.model } : {}),
198
+ ...(thinkingLevel ? { thinkingLevel } : {})
199
+ });
200
+ const services = { cwd, agentDir, modelRuntime, settingsManager, resourceLoader, diagnostics: [] };
201
+ host.resources?.(services);
202
+ return { ...created, services, diagnostics: services.diagnostics };
203
+ };
204
+ await modeChoices.load();
205
+ native = await createAgentSessionRuntime(factory, {
206
+ cwd, agentDir,
207
+ sessionManager: resume ? SessionManager.open(resume, sessionDirectory) : SessionManager.create(cwd, sessionDirectory),
208
+ sessionStartEvent: { type: 'session_start', reason: 'startup' }
209
+ });
210
+ const before = () => {
211
+ uiGeneration += 1;
212
+ unsubscribe?.();
213
+ unsubscribe = undefined;
214
+ for (const listener of beforeChanges)
215
+ listener();
216
+ };
217
+ const announce = async () => {
218
+ for (const listener of changes)
219
+ await listener(native.session);
220
+ host.changed();
221
+ };
222
+ const exclusive = async (action) => {
223
+ if (disposed)
224
+ throw new Error('The terminal runtime has closed.');
225
+ if (changing)
226
+ throw new Error('A native session change is already in progress.');
227
+ if (!native.session.isIdle)
228
+ throw new Error('Stop the current response before changing or reloading this session.');
229
+ changing = true;
230
+ try {
231
+ await controlCall('terminal.resources', {}, 30_000);
232
+ // A model or effort a switch restores belongs to the session's history, not to a choice the person made.
233
+ return await modeChoices.quietly(action);
234
+ }
235
+ finally {
236
+ changing = false;
237
+ }
238
+ };
239
+ const decide = async (call, params) => {
240
+ if (disposed)
241
+ throw new Error('The terminal runtime has closed.');
242
+ await controlCall(call, params);
243
+ };
244
+ const runtime = {
245
+ async pending() {
246
+ if (disposed)
247
+ return [];
248
+ return (await controlCall('terminal.pending')).requests;
249
+ },
250
+ approve: (requestId, decision, alwaysAllowTool = false) => decide('terminal.approve', { requestId, decision, alwaysAllow: alwaysAllowTool }),
251
+ async permissions() {
252
+ if (disposed)
253
+ return { full: false, globalTools: [] };
254
+ return controlCall('terminal.permissions.get');
255
+ },
256
+ setFullPermission: async (enabled) => { await decide('terminal.permissions.setFull', { enabled }); },
257
+ setGlobalTool: async (tool, allowed) => { await decide('terminal.permissions.setTool', { tool, allowed }); },
258
+ answer: (requestId, answer) => decide('terminal.answer', { requestId, answer }),
259
+ answerBatch: (batchId, answers) => decide('terminal.answers', { batchId, answers }),
260
+ snapshot() {
261
+ const session = native.session;
262
+ const usage = session.getContextUsage();
263
+ const model = session.model?.id === 'unknown' ? undefined : session.model;
264
+ return Object.freeze({
265
+ sessionId: session.sessionId, sessionFile: session.sessionFile, name: session.sessionName,
266
+ cwd, account,
267
+ model: model ? Object.freeze({ id: model.id, provider: model.provider, name: model.name, reasoning: model.reasoning, contextWindow: model.contextWindow }) : undefined,
268
+ thinkingLevel: session.thinkingLevel, isStreaming: session.isStreaming, idle: session.isIdle,
269
+ hasUserMessages: session.state.messages.some(message => message.role === 'user'),
270
+ hideThinking: session.settingsManager.getHideThinkingBlock(),
271
+ context: Object.freeze({ percent: usage?.percent ?? null, window: usage?.contextWindow ?? model?.contextWindow ?? 0 }),
272
+ costUsd: session.getSessionStats().cost,
273
+ subscription: model ? session.modelRuntime.isUsingSubscription(model.provider) : false,
274
+ queue: Object.freeze({ steering: Object.freeze([...session.getSteeringMessages()]), followUp: Object.freeze([...session.getFollowUpMessages()]) })
275
+ });
276
+ },
277
+ async submit(text, followUp = false, images) {
278
+ if (disposed)
279
+ throw new Error('The terminal runtime has closed.');
280
+ if (changing)
281
+ throw new Error('Wait for the native session change to finish before submitting.');
282
+ const input = text.trimStart().startsWith('/') ? text.trimStart() : text;
283
+ await native.session.prompt(input, {
284
+ ...(native.session.isStreaming ? { streamingBehavior: followUp ? 'followUp' : 'steer' } : {}),
285
+ ...(images?.length ? { images } : {})
286
+ });
287
+ },
288
+ async submitPlan(text, images) {
289
+ if (disposed)
290
+ throw new Error('The terminal runtime has closed.');
291
+ if (changing)
292
+ throw new Error('Wait for the native session change to finish before submitting.');
293
+ if (!text.trim())
294
+ throw new Error('Use /plan <plan brief>.');
295
+ const session = native.session;
296
+ if (!session.isIdle)
297
+ throw new Error('A plan request must wait until the current response settles.');
298
+ const originalTools = session.getActiveToolNames();
299
+ const allowedTools = planModeTools(originalTools);
300
+ // The session's own model and effort come back once the plan is done.
301
+ const previous = { model: session.model, effort: session.thinkingLevel };
302
+ planRun.allowedTools = new Set(allowedTools);
303
+ planRun.active = true;
304
+ try {
305
+ session.setActiveToolsByName(allowedTools);
306
+ await modeChoices.apply(session, 'plan', modelFor);
307
+ await session.prompt(text, { expandPromptTemplates: false, ...(images?.length ? { images } : {}) });
308
+ }
309
+ finally {
310
+ planRun.active = false;
311
+ planRun.allowedTools = new Set();
312
+ if (!disposed && native.session === session) {
313
+ session.setActiveToolsByName(originalTools);
314
+ await modeChoices.quietly(() => restoreChoice(session, previous));
315
+ if (pendingApply) {
316
+ pendingApply = false;
317
+ await applyMode();
318
+ }
319
+ }
320
+ }
321
+ },
322
+ async setMode(mode) {
323
+ if (disposed)
324
+ throw new Error('The terminal runtime has closed.');
325
+ currentMode = mode;
326
+ // A switch during a running turn waits for it to settle, so the turn keeps the model it started with.
327
+ if (native.session.isIdle && !planRun.active)
328
+ await applyMode();
329
+ else
330
+ pendingApply = true;
331
+ },
332
+ get session() { return native.session; },
333
+ get services() { return native.services; },
334
+ cwd, sessionDirectory,
335
+ subscribe(listener) { listeners.add(listener); return () => { listeners.delete(listener); }; },
336
+ onSessionChange(listener) { changes.add(listener); return () => { changes.delete(listener); }; },
337
+ onBeforeSessionChange(listener) { beforeChanges.add(listener); return () => { beforeChanges.delete(listener); }; },
338
+ newSession: (options) => exclusive(async () => {
339
+ // Re-read the choices so a new conversation starts on what was chosen most recently.
340
+ await modeChoices.load();
341
+ return native.newSession(options);
342
+ }),
343
+ switchSession: (path, options) => exclusive(async () => {
344
+ const target = resolve(cwd, path);
345
+ assertTerminalHistoryPath(target, sessionDirectory);
346
+ assertTerminalSessionScope(target, cwd, options?.cwdOverride);
347
+ return native.switchSession(target, options);
348
+ }),
349
+ fork: (entryId, options) => exclusive(() => native.fork(entryId, options)),
350
+ navigateTree: (targetId, options) => exclusive(async () => {
351
+ const result = await native.session.navigateTree(targetId, options);
352
+ if (!result.cancelled)
353
+ await announce();
354
+ return result;
355
+ }),
356
+ importFromJsonl: (path, cwdOverride) => exclusive(async () => {
357
+ const target = resolve(cwd, path);
358
+ assertTerminalSessionScope(target, cwd, cwdOverride);
359
+ return native.importFromJsonl(target, cwdOverride);
360
+ }),
361
+ installationDeviceId,
362
+ reload: () => exclusive(async () => {
363
+ // Refuse a revoked or changed resource set before tearing down the currently usable UI.
364
+ await controlCall('terminal.resources', {}, 30_000);
365
+ await runtime.interrupt();
366
+ before();
367
+ await native.session.reload({ beforeSessionStart: async () => {
368
+ native.session.extensionRunner.setUIContext(currentUi(), 'tui');
369
+ observeSession();
370
+ await announce();
371
+ } });
372
+ host.changed();
373
+ }),
374
+ async interrupt() {
375
+ // Bash executions use their own abort controllers, outside Pi's agent tool loop.
376
+ native.session.abortBash();
377
+ // Socket-backed questions and approvals must settle before Pi can finish aborting tools.
378
+ await controlCall('terminal.interrupt', {}, 15_000).catch(() => { });
379
+ await native.session.abort();
380
+ },
381
+ async dispose() {
382
+ if (disposed)
383
+ return;
384
+ disposed = true;
385
+ try {
386
+ await runtime.interrupt();
387
+ await native.dispose();
388
+ }
389
+ finally {
390
+ unsubscribe?.();
391
+ listeners.clear();
392
+ changes.clear();
393
+ beforeChanges.clear();
394
+ }
395
+ }
396
+ };
397
+ const observeSession = () => {
398
+ unsubscribe?.();
399
+ unsubscribe = native.session.subscribe(event => {
400
+ if (event.type === 'thinking_level_changed')
401
+ void modeChoices.record(recordingMode(), { effort: event.level });
402
+ if (event.type === 'agent_settled' && pendingApply && !planRun.active) {
403
+ pendingApply = false;
404
+ void applyMode().catch(() => undefined);
405
+ }
406
+ for (const listener of listeners)
407
+ listener(event);
408
+ host.changed();
409
+ });
410
+ };
411
+ const bind = async () => {
412
+ const session = native.session;
413
+ observeSession();
414
+ await session.bindExtensions({
415
+ uiContext: currentUi(), mode: 'tui', shutdownHandler: () => host.shutdown(),
416
+ abortHandler: () => { void runtime.interrupt().catch((error) => host.notify(error instanceof Error ? error.message : String(error))); },
417
+ onError: (error) => host.notify(`${error.event}: ${error.error}`),
418
+ commandContextActions: {
419
+ waitForIdle: () => native.session.waitForIdle(),
420
+ newSession: (options) => runtime.newSession(options),
421
+ switchSession: (path, options) => runtime.switchSession(path, options),
422
+ fork: (entryId, options) => runtime.fork(entryId, options),
423
+ navigateTree: (targetId, options) => runtime.navigateTree(targetId, options),
424
+ reload: () => runtime.reload()
425
+ }
426
+ });
427
+ await announce();
428
+ if (native.modelFallbackMessage)
429
+ host.notify(native.modelFallbackMessage);
430
+ };
431
+ native.setBeforeSessionInvalidate(before);
432
+ native.setRebindSession(bind);
433
+ try {
434
+ await bind();
435
+ }
436
+ catch (error) {
437
+ await runtime.dispose();
438
+ throw error;
439
+ }
440
+ return runtime;
441
+ }
@@ -0,0 +1,22 @@
1
+ import type { Theme } from '@earendil-works/pi-coding-agent';
2
+ export declare const SEARCH_GLYPH = "\u2315";
3
+ export declare const SEARCH_PLACEHOLDER = "Type to search";
4
+ export declare const SEARCH_FIELD_ROWS = 5;
5
+ export declare function searchFieldRowsFor(availableRows: number): number;
6
+ export declare class SearchField {
7
+ private readonly theme;
8
+ private readonly input;
9
+ constructor(theme: () => Theme, placeholder?: string);
10
+ get value(): string;
11
+ set focused(value: boolean);
12
+ /** Presets the text, for a command that was given something to search for. */
13
+ setValue(text: string): void;
14
+ /** Empties the field; says whether there was anything to empty. */
15
+ clear(): boolean;
16
+ /** Takes typed text, paste, Backspace and Ctrl+U. Says whether the text changed. */
17
+ handleInput(data: string): boolean;
18
+ invalidate(): void;
19
+ /** One row, `width` cells: the glyph, the text or placeholder, and `note` at the right edge. */
20
+ render(width: number, note?: string): string;
21
+ renderLines(width: number, note?: string, rows?: number): string[];
22
+ }