@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,145 @@
1
+ import { matchesKey, stripTerminalSequences, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { doctorReportSchema } from "../../../doctor/types.js";
3
+ export class DoctorPage {
4
+ options;
5
+ focused = false;
6
+ report;
7
+ error;
8
+ timer;
9
+ disposed = false;
10
+ busy = false;
11
+ offset = 0;
12
+ constructor(options) {
13
+ this.options = options;
14
+ }
15
+ tabs() { return [{ id: 'doctor', title: 'Doctor' }]; }
16
+ activeTab() { return 'doctor'; }
17
+ hint() { return '↑/↓ scroll · r refresh · t retry finding · l live checks · c cancel · Esc close'; }
18
+ activate() { if (!this.report && !this.busy)
19
+ void this.start(); }
20
+ dispose() {
21
+ this.disposed = true;
22
+ clearTimeout(this.timer);
23
+ if (this.report?.state === 'running')
24
+ void this.options.call('terminal.doctor.cancel', { id: this.report.id }).catch(() => undefined);
25
+ }
26
+ async start(mode = 'local', checks = []) {
27
+ if (this.busy || this.disposed)
28
+ return;
29
+ this.busy = true;
30
+ this.error = undefined;
31
+ clearTimeout(this.timer);
32
+ try {
33
+ if (this.report?.state === 'running')
34
+ await this.options.call('terminal.doctor.cancel', { id: this.report.id });
35
+ const result = await this.options.call('terminal.doctor.start', { ...this.options.selection(), mode, checks, confirmed: mode === 'live' });
36
+ this.report = doctorReportSchema.parse(result);
37
+ this.offset = 0;
38
+ if (this.disposed) {
39
+ await this.options.call('terminal.doctor.cancel', { id: this.report.id });
40
+ return;
41
+ }
42
+ this.poll();
43
+ }
44
+ catch {
45
+ this.error = 'Diagnostics could not be started. Check the host connection.';
46
+ }
47
+ finally {
48
+ this.busy = false;
49
+ if (!this.disposed)
50
+ this.options.changed();
51
+ }
52
+ }
53
+ poll() {
54
+ if (this.disposed || this.report?.state !== 'running')
55
+ return;
56
+ const id = this.report.id;
57
+ this.timer = setTimeout(() => {
58
+ void this.options.call('terminal.doctor.read', { id }).then(result => {
59
+ if (this.disposed || this.report?.id !== id)
60
+ return;
61
+ this.report = doctorReportSchema.parse(result);
62
+ this.options.changed();
63
+ this.poll();
64
+ }).catch(() => { this.error = 'The diagnostic host connection was lost.'; this.options.changed(); });
65
+ }, 200);
66
+ }
67
+ async chooseLive() {
68
+ const report = this.report;
69
+ if (!report || this.busy || report.state === 'running')
70
+ return;
71
+ const selected = [];
72
+ const checks = report.liveChecks;
73
+ while (!this.disposed) {
74
+ const labels = checks.map(check => `${selected.includes(check.id) ? '[x]' : '[ ]'} ${check.title}`);
75
+ const run = 'Run selected checks';
76
+ const choice = await this.options.select('Select live checks', [...labels, run]);
77
+ if (!choice || this.disposed)
78
+ return;
79
+ if (choice === run)
80
+ break;
81
+ const check = checks[labels.indexOf(choice)];
82
+ if (check) {
83
+ const index = selected.indexOf(check.id);
84
+ if (index < 0)
85
+ selected.push(check.id);
86
+ else
87
+ selected.splice(index, 1);
88
+ }
89
+ }
90
+ if (!selected.length || this.disposed)
91
+ return;
92
+ const notice = [`Account: ${report.context.accountId ?? 'none'}`, `Model: ${report.context.model ?? 'none'}`, ...checks.filter(check => selected.includes(check.id)).map(check => `${check.title}: ${check.notice}`)].join('\n\n');
93
+ if (await this.options.confirm('Run these live diagnostics?', notice) && !this.disposed)
94
+ await this.start('live', selected);
95
+ }
96
+ async retry() {
97
+ const report = this.report;
98
+ if (!report || this.busy || report.state === 'running')
99
+ return;
100
+ const labels = report.findings.map(finding => `${finding.status}: ${finding.title}`);
101
+ const selected = await this.options.select('Retry local readiness check', labels);
102
+ const finding = selected ? report.findings[labels.indexOf(selected)] : undefined;
103
+ if (finding && !this.disposed)
104
+ await this.start('local', finding.id === 'doctor' ? [] : [finding.id]);
105
+ }
106
+ handleInput(data) {
107
+ if (matchesKey(data, 'up'))
108
+ this.offset = Math.max(0, this.offset - 1);
109
+ else if (matchesKey(data, 'down'))
110
+ this.offset++;
111
+ else if (data === 'r')
112
+ void this.start();
113
+ else if (data === 'l')
114
+ void this.chooseLive();
115
+ else if (data === 't')
116
+ void this.retry();
117
+ else if (data === 'c' && this.report?.state === 'running') {
118
+ void this.options.call('terminal.doctor.cancel', { id: this.report.id }).then(result => {
119
+ this.report = doctorReportSchema.parse(result);
120
+ clearTimeout(this.timer);
121
+ this.options.changed();
122
+ }).catch(() => { this.error = 'Could not cancel diagnostics.'; this.options.changed(); });
123
+ }
124
+ else
125
+ return false;
126
+ return true;
127
+ }
128
+ render(width, rows) {
129
+ if (width < 1 || rows < 1)
130
+ return [];
131
+ const report = this.report;
132
+ const counts = report?.findings.reduce((all, finding) => { all[finding.status] = (all[finding.status] ?? 0) + 1; return all; }, {}) ?? {};
133
+ const lines = [
134
+ this.error ?? (report ? `${report.mode} · ${report.state} · ${report.completed}/${report.total} checks` : 'Preparing diagnostics…'),
135
+ report ? `Account ${report.context.accountId ?? 'none'} · Model ${report.context.model ?? 'none'}` : '',
136
+ Object.entries(counts).map(([status, count]) => `${count} ${status}`).join(' · '),
137
+ ...report?.findings.flatMap(finding => [
138
+ '', `[${finding.status}] ${finding.category} · ${finding.title} (${finding.verification})`,
139
+ finding.evidence, ...(finding.remedy ? [`Action: ${finding.remedy}`] : [])
140
+ ]) ?? []
141
+ ].flatMap(line => stripTerminalSequences(line).replace(/[\x00-\x08\x0b-\x1f\x7f-\x9f]/g, ' ').split('\n').flatMap(part => wrapTextWithAnsi(part, width)));
142
+ this.offset = Math.max(0, Math.min(this.offset, lines.length - rows));
143
+ return lines.slice(this.offset, this.offset + rows).map(line => this.options.theme().fg('text', line));
144
+ }
145
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The Hub page: the reviewed catalog of skills, plugins and reusable documents. Installing asks first,
3
+ * installs exactly the listed version, and leaves code switched off and untrusted.
4
+ */
5
+ import type { Theme } from '@earendil-works/pi-coding-agent';
6
+ import type { MenuCall, MenuUi } from "../../pluginMenu.js";
7
+ import { type TabInfo } from "../chrome.js";
8
+ import type { TerminalPage } from "../page.js";
9
+ import type { TerminalMouseInput } from "../mouse.js";
10
+ export interface HubPageOptions {
11
+ theme: () => Theme;
12
+ call: MenuCall;
13
+ ui: MenuUi;
14
+ changed(): void;
15
+ }
16
+ export declare class HubPage implements TerminalPage {
17
+ private readonly options;
18
+ private catalog;
19
+ private section;
20
+ private error;
21
+ private busy;
22
+ private disposed;
23
+ private readonly list;
24
+ constructor(options: HubPageOptions);
25
+ get focused(): boolean;
26
+ set focused(value: boolean);
27
+ activate(): void;
28
+ dispose(): void;
29
+ tabs(): readonly TabInfo[];
30
+ activeTab(): string;
31
+ hint(): string;
32
+ private load;
33
+ private fill;
34
+ private rows;
35
+ private activateRow;
36
+ handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
37
+ handleInput(data: string): boolean;
38
+ render(width: number, rows: number): string[];
39
+ }
@@ -0,0 +1,128 @@
1
+ import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { installHubEntry } from "../../hubMenu.js";
3
+ import { safeText } from "../chrome.js";
4
+ import { FilterList } from "../list.js";
5
+ const SECTIONS = [
6
+ { id: 'catalog', title: 'Catalog' },
7
+ { id: 'installed', title: 'Installed' }
8
+ ];
9
+ const REFRESH = 'action:refresh';
10
+ export class HubPage {
11
+ options;
12
+ catalog;
13
+ section = 'catalog';
14
+ error;
15
+ busy = false;
16
+ disposed = false;
17
+ list;
18
+ constructor(options) {
19
+ this.options = options;
20
+ this.list = new FilterList({
21
+ theme: options.theme, search: 'always', noun: ['entry', 'entries'], empty: 'The catalog has no entries.',
22
+ onActivate: row => { void this.activateRow(row.id); }
23
+ });
24
+ }
25
+ get focused() { return this.list.focused; }
26
+ set focused(value) { this.list.focused = value; }
27
+ activate() { if (!this.catalog)
28
+ void this.load(false); }
29
+ dispose() { this.disposed = true; }
30
+ tabs() { return SECTIONS; }
31
+ activeTab() { return this.section; }
32
+ hint() {
33
+ return this.list.query ? 'Enter open · Esc clear' : this.section === 'catalog' ? 'Enter review and install · type to search' : 'Select an installed entry · type to search';
34
+ }
35
+ async load(refresh) {
36
+ try {
37
+ const catalog = await this.options.call('hub.list', refresh ? { refresh: true } : {});
38
+ this.catalog = catalog;
39
+ this.error = undefined;
40
+ if (refresh && catalog.error)
41
+ this.options.ui.notify(`${catalog.error} Using ${catalog.origin} content.`, 'warning');
42
+ }
43
+ catch (error) {
44
+ this.error = error instanceof Error ? error.message : String(error);
45
+ }
46
+ if (this.disposed)
47
+ return;
48
+ this.fill();
49
+ this.options.changed();
50
+ }
51
+ fill() {
52
+ this.list.setRows(this.rows());
53
+ }
54
+ rows() {
55
+ if (this.section === 'installed') {
56
+ return [
57
+ ...(this.catalog?.installed ?? []).map(receipt => ({
58
+ id: 'installed:' + receipt.entry.id + '@' + receipt.entry.version,
59
+ label: safeText(receipt.entry.title),
60
+ group: receipt.entry.category,
61
+ detail: (receipt.state ?? 'installed') + ' · ' + receipt.entry.version,
62
+ tone: receipt.state === 'installed' ? 'success' : 'warning',
63
+ searchText: receipt.entry.title + ' ' + receipt.entry.category + ' ' + receipt.entry.id + ' ' + receipt.entry.publisher + ' ' + (receipt.state ?? '')
64
+ }))
65
+ ];
66
+ }
67
+ const entries = [...(this.catalog?.entries ?? [])].sort((left, right) => left.category.localeCompare(right.category));
68
+ return [
69
+ ...entries.map(entry => ({
70
+ id: entry.id + '@' + entry.version, label: safeText(entry.title), group: safeText(entry.category),
71
+ detail: entry.version, tone: 'muted', searchText: entry.title + ' ' + entry.category + ' ' + entry.id + ' ' + entry.publisher
72
+ })),
73
+ { id: REFRESH, label: '⟳ Refresh catalog', group: 'Actions', tone: 'accent' }
74
+ ];
75
+ }
76
+ async activateRow(id) {
77
+ if (this.busy)
78
+ return;
79
+ this.busy = true;
80
+ try {
81
+ if (id === REFRESH) {
82
+ await this.load(true);
83
+ return;
84
+ }
85
+ if (id.startsWith('installed:'))
86
+ return;
87
+ const entry = this.catalog?.entries.find(candidate => candidate.id + '@' + candidate.version === id);
88
+ if (entry)
89
+ await installHubEntry(this.options.ui, this.options.call, entry);
90
+ }
91
+ finally {
92
+ this.busy = false;
93
+ }
94
+ }
95
+ handleMouse(event) {
96
+ return this.list.handleMouse(event);
97
+ }
98
+ handleInput(data) {
99
+ if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
100
+ if (!this.list.query) {
101
+ this.section = this.section === 'catalog' ? 'installed' : 'catalog';
102
+ this.fill();
103
+ }
104
+ return true;
105
+ }
106
+ return this.list.handleInput(data);
107
+ }
108
+ render(width, rows) {
109
+ const theme = this.options.theme();
110
+ if (width < 1 || rows < 1)
111
+ return [];
112
+ if (!this.catalog)
113
+ return [theme.fg(this.error ? 'error' : 'dim', this.error ? 'Could not read the catalog: ' + this.error : 'Reading the catalog…')];
114
+ const selectedId = this.list.selected?.id;
115
+ const installed = this.section === 'installed'
116
+ ? this.catalog.installed.find(receipt => 'installed:' + receipt.entry.id + '@' + receipt.entry.version === selectedId)
117
+ : undefined;
118
+ const entry = installed?.entry ?? this.catalog.entries.find(candidate => candidate.id + '@' + candidate.version === selectedId);
119
+ const detail = entry && rows >= 9
120
+ ? [...wrapTextWithAnsi(safeText(entry.description), width).slice(0, 3), entry.publisher + ' · ' + entry.license + ' · ' + entry.id,
121
+ ...(installed ? ['Installed ' + installed.installedAt + ' · ' + (installed.state ?? 'installed')] : [])]
122
+ : [];
123
+ const lines = this.list.render(width, Math.max(2, rows - (detail.length ? detail.length + 1 : 0)));
124
+ if (detail.length)
125
+ lines.push('', ...detail.map(line => theme.fg('muted', safeText(line))));
126
+ return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
127
+ }
128
+ }
@@ -0,0 +1,38 @@
1
+ import type { Theme } from '@earendil-works/pi-coding-agent';
2
+ import type { TerminalTrajectorySnapshot } from "../../trajectory.js";
3
+ import type { TabInfo } from "../chrome.js";
4
+ import type { TerminalPage } from "../page.js";
5
+ export interface LogSection {
6
+ title: string;
7
+ text: string;
8
+ }
9
+ export declare function formatRunEventLog(snapshots: TerminalTrajectorySnapshot[]): string;
10
+ export interface LogPageOptions {
11
+ theme: () => Theme;
12
+ /** The diagnostic sources, read when the page is first shown and not again while the overlay is open. */
13
+ load(): Promise<LogSection[]>;
14
+ changed(): void;
15
+ }
16
+ /** A static view of the diagnostic snapshot taken when the page was first shown. */
17
+ export declare class LogPage implements TerminalPage {
18
+ private readonly options;
19
+ focused: boolean;
20
+ private sections;
21
+ private error;
22
+ private source;
23
+ private offset;
24
+ private atEnd;
25
+ private maxOffset;
26
+ private rows;
27
+ private disposed;
28
+ constructor(options: LogPageOptions);
29
+ activate(): void;
30
+ dispose(): void;
31
+ tabs(): readonly TabInfo[];
32
+ activeTab(): string;
33
+ hint(): string;
34
+ private changeSource;
35
+ private currentOffset;
36
+ handleInput(data: string): boolean;
37
+ render(width: number, rows: number): string[];
38
+ }
@@ -0,0 +1,189 @@
1
+ import { matchesKey, stripTerminalSequences, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { redactLogText } from "../../../core/bus.js";
3
+ const payloadOf = (event) => event.payload && typeof event.payload === 'object' ? event.payload : {};
4
+ const stringOf = (value) => typeof value === 'string' ? value : undefined;
5
+ const numberOf = (value) => typeof value === 'number' && Number.isFinite(value) ? value : undefined;
6
+ function safe(text) {
7
+ return redactLogText(stripTerminalSequences(text)).replace(/[\x00-\x08\x0b-\x1f\x7f]/g, ' ').replace(/\t/g, ' ');
8
+ }
9
+ function timeOf(value) {
10
+ const parsed = Date.parse(value);
11
+ return Number.isFinite(parsed) ? new Date(parsed).toLocaleTimeString() : value;
12
+ }
13
+ function webError(output) {
14
+ try {
15
+ const value = JSON.parse(output);
16
+ if (typeof value.error !== 'string')
17
+ return undefined;
18
+ const status = numberOf(value.status);
19
+ return `${status === undefined ? '' : `HTTP ${status}: `}${value.error}`;
20
+ }
21
+ catch {
22
+ return /^(?:The page could not be read:|The search could not be completed:)/.test(output) ? output : undefined;
23
+ }
24
+ }
25
+ function eventDetail(event) {
26
+ const payload = payloadOf(event);
27
+ switch (event.type) {
28
+ case 'context.snapshot':
29
+ return ['prompt and tool definitions omitted'];
30
+ case 'message.delta':
31
+ case 'message.completed':
32
+ case 'message.steered':
33
+ return ['message content omitted'];
34
+ case 'tool.started':
35
+ return [`tool ${stringOf(payload.name) ?? 'unknown'} started; inputs omitted`];
36
+ case 'tool.completed': {
37
+ const name = stringOf(payload.name) ?? 'unknown';
38
+ const duration = numberOf(payload.durationMs);
39
+ const result = [`tool ${name} ${payload.ok === false ? 'failed' : 'completed'}${duration === undefined ? '' : ` · ${duration} ms`}`];
40
+ const output = stringOf(payload.output);
41
+ const webFailure = (name === 'web_fetch' || name === 'web_search') && output ? webError(output) : undefined;
42
+ if (webFailure)
43
+ result.push(` ${webFailure}`);
44
+ else if (payload.ok === false && output)
45
+ result.push(` ${output}`);
46
+ if (payload.outputTruncated === true)
47
+ result.push(' recorded output was truncated');
48
+ return result;
49
+ }
50
+ case 'retry.started':
51
+ case 'retry.ended':
52
+ return [`attempt ${numberOf(payload.attempt) ?? '?'}${numberOf(payload.maxAttempts) === undefined ? '' : ` of ${numberOf(payload.maxAttempts)}`}${numberOf(payload.delayMs) === undefined ? '' : ` · retry delay ${numberOf(payload.delayMs)} ms`}`, ...(stringOf(payload.error) ? [` ${payload.error}`] : [])];
53
+ case 'compaction.ended':
54
+ return [payload.aborted === true ? 'compaction aborted' : 'compaction completed', ...(stringOf(payload.error) ? [` ${payload.error}`] : [])];
55
+ case 'extension.notice':
56
+ return payload.kind === 'error' || payload.level === 'error' ? [stringOf(payload.text) ?? 'extension error'] : ['non-error extension notice omitted'];
57
+ case 'account.status': {
58
+ const message = stringOf(payload.message);
59
+ return [stringOf(payload.category) ?? 'account status', ...(message ? [message] : [])];
60
+ }
61
+ case 'status.changed': {
62
+ const reason = stringOf(payload.reason);
63
+ return [stringOf(payload.status) ?? 'status changed', ...(reason ? [reason] : [])];
64
+ }
65
+ case 'failed': {
66
+ const message = stringOf(payload.message);
67
+ return [stringOf(payload.code) ?? 'run failed', ...(message ? [message] : [])];
68
+ }
69
+ case 'usage.updated': {
70
+ const request = payload.request && typeof payload.request === 'object' ? payload.request : {};
71
+ return [`${stringOf(request.provider) ?? stringOf(payload.provider) ?? 'provider'}/${stringOf(request.model) ?? stringOf(payload.model) ?? 'model'} · request ${numberOf(request.index) ?? numberOf(payload.requests) ?? '?'}`];
72
+ }
73
+ case 'approval.requested':
74
+ case 'approval.resolved':
75
+ return [`tool ${stringOf(payload.target) ?? ''} · decision ${stringOf(payload.decision) ?? 'pending'}; action details omitted`];
76
+ case 'question.requested':
77
+ case 'question.answered':
78
+ return ['question content omitted'];
79
+ default:
80
+ return [];
81
+ }
82
+ }
83
+ export function formatRunEventLog(snapshots) {
84
+ if (!snapshots.length)
85
+ return 'No run events recorded for this conversation.';
86
+ const sections = [];
87
+ for (const snapshot of snapshots) {
88
+ sections.push(`Run ${snapshot.run.id} · ${snapshot.run.status} · ${snapshot.run.mode}`);
89
+ const events = snapshot.events.slice().sort((left, right) => left.sequence - right.sequence);
90
+ if (!events.length)
91
+ sections.push(' No recorded events');
92
+ for (const event of events) {
93
+ sections.push(`${timeOf(event.timestamp)} #${event.sequence} ${event.type}`);
94
+ sections.push(...eventDetail(event).map(detail => ` ${detail}`));
95
+ }
96
+ sections.push('');
97
+ }
98
+ return safe(sections.join('\n').trimEnd());
99
+ }
100
+ /** A static view of the diagnostic snapshot taken when the page was first shown. */
101
+ export class LogPage {
102
+ options;
103
+ focused = false;
104
+ sections;
105
+ error;
106
+ source = 0;
107
+ offset = 0;
108
+ atEnd = true;
109
+ maxOffset = 0;
110
+ rows = 1;
111
+ disposed = false;
112
+ constructor(options) {
113
+ this.options = options;
114
+ }
115
+ activate() {
116
+ if (this.sections || this.disposed)
117
+ return;
118
+ this.options.load().then(sections => { this.sections = sections; }, error => { this.error = error instanceof Error ? error.message : String(error); }).finally(() => { if (!this.disposed)
119
+ this.options.changed(); });
120
+ }
121
+ dispose() { this.disposed = true; }
122
+ tabs() {
123
+ return this.sections?.map((item, index) => ({ id: String(index), title: item.title })) ?? [
124
+ { id: '0', title: 'Diagnostics' }, { id: '1', title: 'Run Events' }
125
+ ];
126
+ }
127
+ activeTab() { return String(this.source); }
128
+ hint() { return '↑/↓ scroll · PgUp/PgDn page'; }
129
+ changeSource(direction) {
130
+ const count = this.sections?.length ?? 0;
131
+ if (!count)
132
+ return;
133
+ this.source = (this.source + direction + count) % count;
134
+ this.offset = 0;
135
+ this.atEnd = true;
136
+ }
137
+ currentOffset() { return this.atEnd ? this.maxOffset : this.offset; }
138
+ handleInput(data) {
139
+ const page = Math.max(1, this.rows - 1);
140
+ if (matchesKey(data, 'tab'))
141
+ this.changeSource(1);
142
+ else if (matchesKey(data, 'shift+tab'))
143
+ this.changeSource(-1);
144
+ else if (matchesKey(data, 'home')) {
145
+ this.offset = 0;
146
+ this.atEnd = false;
147
+ }
148
+ else if (matchesKey(data, 'end'))
149
+ this.atEnd = true;
150
+ else if (matchesKey(data, 'up')) {
151
+ this.offset = Math.max(0, this.currentOffset() - 1);
152
+ this.atEnd = false;
153
+ }
154
+ else if (matchesKey(data, 'down')) {
155
+ this.offset = this.currentOffset() + 1;
156
+ this.atEnd = false;
157
+ }
158
+ else if (matchesKey(data, 'pageUp')) {
159
+ this.offset = Math.max(0, this.currentOffset() - page);
160
+ this.atEnd = false;
161
+ }
162
+ else if (matchesKey(data, 'pageDown')) {
163
+ this.offset = this.currentOffset() + page;
164
+ this.atEnd = false;
165
+ }
166
+ else
167
+ return false;
168
+ return true;
169
+ }
170
+ render(width, rows) {
171
+ const theme = this.options.theme();
172
+ if (width < 1 || rows < 1)
173
+ return [];
174
+ if (!this.sections)
175
+ return [theme.fg(this.error ? 'error' : 'dim', this.error ? `Could not read logs: ${this.error}` : 'Reading logs…')];
176
+ const section = this.sections[this.source] ?? { title: 'Logs', text: 'No log sources are available.' };
177
+ const bodyRows = Math.max(0, rows - 2);
178
+ this.rows = Math.max(1, bodyRows);
179
+ const lines = safe(section.text).split('\n').flatMap(line => line ? wrapTextWithAnsi(line, width) : ['']);
180
+ this.maxOffset = Math.max(0, lines.length - bodyRows);
181
+ if (this.atEnd)
182
+ this.offset = this.maxOffset;
183
+ else
184
+ this.offset = Math.max(0, Math.min(this.maxOffset, this.offset));
185
+ const last = Math.min(lines.length, this.offset + bodyRows);
186
+ const position = theme.fg('dim', `lines ${lines.length ? this.offset + 1 : 0}-${last}/${lines.length}`);
187
+ return [position, ...lines.slice(this.offset, last)].slice(0, rows).map(line => truncateToWidth(line, width, ''));
188
+ }
189
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The Permissions page: Full Permission, then every tool with whether a call needs asking.
3
+ * The state lives in the local Harness state through the runtime's `permissions` calls.
4
+ */
5
+ import type { Theme } from '@earendil-works/pi-coding-agent';
6
+ import type { TabInfo } from "../chrome.js";
7
+ import type { TerminalPage } from "../page.js";
8
+ import type { TerminalMouseInput } from "../mouse.js";
9
+ import type { TerminalPermissionState } from "../runtime.js";
10
+ export interface PermissionsPageOptions {
11
+ theme: () => Theme;
12
+ permissions(): Promise<TerminalPermissionState>;
13
+ setFullPermission(enabled: boolean): Promise<void>;
14
+ setGlobalTool(tool: string, allowed: boolean): Promise<void>;
15
+ /** The tools this session has switched on. */
16
+ activeTools(): string[];
17
+ confirm(title: string, message: string): Promise<boolean>;
18
+ notify(message: string, type?: string): void;
19
+ changed(): void;
20
+ }
21
+ export declare class PermissionsPage implements TerminalPage {
22
+ private readonly options;
23
+ private state;
24
+ private section;
25
+ private error;
26
+ private busy;
27
+ private disposed;
28
+ private readonly list;
29
+ constructor(options: PermissionsPageOptions);
30
+ get focused(): boolean;
31
+ set focused(value: boolean);
32
+ activate(): void;
33
+ dispose(): void;
34
+ tabs(): readonly TabInfo[];
35
+ activeTab(): string;
36
+ hint(): string;
37
+ private reload;
38
+ private fill;
39
+ private rows;
40
+ private toggle;
41
+ handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
42
+ handleInput(data: string): boolean;
43
+ render(width: number, rows: number): string[];
44
+ }