@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
@@ -1,188 +0,0 @@
1
- /**
2
- * Settings chrome adapted from Oh My Pi 18.11.3 settings-selector.ts and
3
- * settings-list.ts (MIT; see NOTICE-oh-my-pi). Values and actions belong to the host.
4
- */
5
- import type { Theme } from '@earendil-works/pi-coding-agent'
6
- import { Input, fuzzyFilter, matchesKey, stripTerminalSequences, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component, type Focusable, type TUI } from '@earendil-works/pi-tui'
7
-
8
- export interface TerminalSettingItem {
9
- id: string
10
- tab: string
11
- group: string
12
- label: string
13
- value: string
14
- description?: string
15
- }
16
- const categories = ['appearance', 'model', 'interaction', 'context'] as const
17
- const categoryIcon: Record<string, string> = { appearance: '🎨', model: '🤖', interaction: '⌨', context: '📋' }
18
- const categoryName = (value: string) => value.charAt(0).toUpperCase() + value.slice(1)
19
- const plain = (value: string) => stripTerminalSequences(value).replace(/[\x00-\x1f\x7f]/g, ' ')
20
- const tabOf = (item: TerminalSettingItem) => item.tab.toLowerCase()
21
-
22
- /** A full terminal settings view. It describes existing host settings without owning them. */
23
- export class SettingsPanel implements Component, Focusable {
24
- private search = new Input({ prompt: '' })
25
- private query = ''
26
- private currentTab = ''
27
- private selected: string | undefined
28
- private groupFocus = false
29
- private focusedValue = false
30
- private remembered = new Map<string, string>()
31
- private readonly items: TerminalSettingItem[]
32
- private readonly tabs: string[]
33
- constructor(private readonly tui: TUI, private readonly theme: () => Theme, items: TerminalSettingItem[], private readonly done: (id: string | undefined) => void, initialId?: string) {
34
- this.items = items.filter(item => categories.includes(tabOf(item) as typeof categories[number]))
35
- this.tabs = categories.filter(tab => this.items.some(item => tabOf(item) === tab))
36
- const initial = this.items.find(item => item.id === initialId)
37
- this.currentTab = initial ? tabOf(initial) : this.tabs[0] ?? ''
38
- this.selected = initial?.id ?? this.visibleItems()[0]?.id
39
- }
40
- get selectedId(): string | undefined { return this.selected }
41
- get focused(): boolean { return this.focusedValue }
42
- set focused(value: boolean) { this.focusedValue = value; this.search.focused = value && this.query.length > 0 }
43
- invalidate(): void { this.search.invalidate() }
44
- private visibleItems(): TerminalSettingItem[] {
45
- return this.query
46
- ? fuzzyFilter(this.items, this.query, item => `${item.label} ${item.id} ${item.value} ${item.description ?? ''} ${item.group} ${item.tab}`)
47
- : this.items.filter(item => tabOf(item) === this.currentTab)
48
- }
49
- private select(item: TerminalSettingItem | undefined): void {
50
- this.selected = item?.id
51
- if (item) { this.currentTab = tabOf(item); this.remembered.set(this.currentTab, item.id) }
52
- }
53
- private switchTab(direction: number): void {
54
- const tabs = this.query ? this.tabs.filter(tab => this.visibleItems().some(item => tabOf(item) === tab)) : this.tabs
55
- if (!tabs.length) return
56
- const at = Math.max(0, tabs.indexOf(this.currentTab))
57
- this.currentTab = tabs[(at + direction + tabs.length) % tabs.length]
58
- const items = this.visibleItems().filter(item => tabOf(item) === this.currentTab)
59
- this.select(items.find(item => item.id === this.remembered.get(this.currentTab)) ?? items[0])
60
- this.groupFocus = false
61
- }
62
- private jumpGroup(direction: number): void {
63
- const items = this.visibleItems()
64
- const groups = [...new Set(items.map(item => item.group))]
65
- const current = items.find(item => item.id === this.selected)?.group
66
- const index = Math.max(0, groups.indexOf(current ?? ''))
67
- const group = groups[(index + direction + groups.length) % groups.length]
68
- this.select(items.find(item => item.group === group))
69
- }
70
- handleInput(data: string): void {
71
- if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c')) { this.done(undefined); return }
72
- if (matchesKey(data, 'left') || matchesKey(data, 'right')) { this.switchTab(matchesKey(data, 'left') ? -1 : 1); return }
73
- if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
74
- if (this.query) this.switchTab(matchesKey(data, 'shift+tab') ? -1 : 1)
75
- else if (new Set(this.visibleItems().map(item => item.group)).size > 1) this.groupFocus = !this.groupFocus
76
- else this.switchTab(matchesKey(data, 'shift+tab') ? -1 : 1)
77
- return
78
- }
79
- if (matchesKey(data, 'up') || matchesKey(data, 'down') || matchesKey(data, 'pageUp') || matchesKey(data, 'pageDown')) {
80
- const direction = matchesKey(data, 'up') || matchesKey(data, 'pageUp') ? -1 : 1
81
- if (this.groupFocus || matchesKey(data, 'pageUp') || matchesKey(data, 'pageDown')) this.jumpGroup(direction)
82
- else {
83
- const items = this.visibleItems()
84
- const at = Math.max(0, items.findIndex(item => item.id === this.selected))
85
- this.select(items[Math.max(0, Math.min(items.length - 1, at + direction))])
86
- }
87
- return
88
- }
89
- if (matchesKey(data, 'enter') || data === ' ') {
90
- if (this.groupFocus) this.groupFocus = false
91
- else if (this.selected) this.done(this.selected)
92
- return
93
- }
94
- this.search.handleInput(data)
95
- if (this.search.getValue() !== this.query) {
96
- this.query = this.search.getValue()
97
- this.groupFocus = false
98
- this.search.focused = this.focusedValue && !!this.query
99
- const items = this.visibleItems()
100
- this.select(items.find(item => item.id === this.selected) ?? items[0])
101
- }
102
- }
103
-
104
- render(width: number): string[] {
105
- const height = Math.max(0, Math.trunc(this.tui.terminal.rows))
106
- width = Math.max(0, Math.trunc(width))
107
- if (!width || !height) return []
108
- const theme = this.theme()
109
- const inner = Math.max(0, width - 4)
110
- const clip = (value: string, columns = width) => truncateToWidth(value, columns, '')
111
- const pad = (value: string, columns: number) => clip(value, columns) + ' '.repeat(Math.max(0, columns - Math.min(columns, visibleWidth(value))))
112
- const border = (value: string) => theme.fg('border', value)
113
- const row = (value: string) => clip(border('│') + ' ' + pad(value, inner) + ' ' + border('│'))
114
- const rule = () => clip(border('├' + '─'.repeat(Math.max(0, width - 2)) + '┤'))
115
- const title = clip(' Settings ', Math.max(0, width - 4))
116
- const top = clip(border('╭─') + theme.bold(theme.fg('accent', title)) + border('─'.repeat(Math.max(0, width - visibleWidth(title) - 3)) + '╮'))
117
- const bottom = clip(border('╰' + '─'.repeat(Math.max(0, width - 2)) + '╯'))
118
- const tabRow = (compact: boolean) => this.tabs.map(tab => {
119
- const label = ` ${categoryIcon[tab]}${compact ? '' : ` ${categoryName(tab)}`} `
120
- return tab === this.currentTab ? theme.bg('selectedBg', theme.fg('accent', label)) : theme.fg('muted', label)
121
- }).join(' ')
122
- let tabs = tabRow(false)
123
- if (visibleWidth(tabs) > inner) tabs = tabRow(true)
124
- if (visibleWidth(tabs) > inner) tabs = theme.fg('accent', `‹ ${categoryIcon[this.currentTab] ?? ''} ${categoryName(this.currentTab)} ›`)
125
- const lines = [top, row(tabs), rule()]
126
- const items = this.visibleItems()
127
- const current = items.find(item => item.id === this.selected)
128
- if (this.query) {
129
- const count = `${items.length} ${items.length === 1 ? 'match' : 'matches'}`
130
- const prefix = theme.fg('accent', '🔍 ')
131
- const queryWidth = Math.max(2, inner - visibleWidth(prefix) - count.length - 1)
132
- lines.push(row(prefix + (this.search.render(queryWidth)[0] ?? '') + ' ' + theme.fg('dim', count)))
133
- }
134
- const contentRows = Math.max(0, height - lines.length - 3)
135
- const descriptionRows = Math.min(3, Math.max(0, contentRows - 2))
136
- const listRows = Math.max(0, contentRows - descriptionRows - (descriptionRows ? 1 : 0))
137
- const groups = [...new Set(items.map(item => item.group))]
138
- // The shipped SettingsList keeps at least 60 columns for editable rows.
139
- const sidebar = !this.query && groups.length > 1 && inner - 28 >= 60 ? 26 : 0
140
- const paneWidth = Math.max(0, inner - (sidebar ? sidebar + 2 : 0))
141
- const entries: { item?: TerminalSettingItem; heading?: string }[] = []
142
- let lastGroup: string | undefined
143
- for (const item of items) {
144
- const group = this.query ? `${categoryName(tabOf(item))} / ${item.group}` : item.group
145
- if (group !== lastGroup) { entries.push({ heading: group }); lastGroup = group }
146
- entries.push({ item })
147
- }
148
- const selectedRow = entries.findIndex(entry => entry.item?.id === this.selected)
149
- const start = Math.max(0, Math.min(Math.max(0, entries.length - listRows), selectedRow - Math.floor(listRows / 2)))
150
- const maxLabel = Math.min(30, Math.max(0, ...items.map(item => visibleWidth(plain(item.label)))))
151
- const labelWidth = Math.min(maxLabel, Math.max(0, Math.floor((paneWidth - 4) * 0.6)))
152
- for (let index = 0; index < listRows; index++) {
153
- const entry = entries[start + index]
154
- let right = ''
155
- if (entry?.heading) right = theme.fg(entry.heading.includes(current?.group ?? '\u0000') ? 'accent' : 'dim', plain(entry.heading))
156
- if (entry?.item) {
157
- const item = entry.item
158
- const selected = item.id === this.selected && !this.groupFocus
159
- const active = this.query || item.group === current?.group
160
- const prefix = selected ? '❯ ' : ' '
161
- const labelText = prefix + pad(plain(item.label), labelWidth)
162
- const text = labelText + ' ' + clip(plain(item.value), Math.max(0, paneWidth - visibleWidth(labelText) - 2))
163
- right = selected
164
- ? theme.bg('selectedBg', theme.fg('accent', pad(text, paneWidth)))
165
- : theme.fg(active ? 'text' : 'dim', text)
166
- }
167
- if (!entries.length && index === 0) right = theme.fg('warning', this.query ? 'No matching settings' : 'No settings')
168
- if (sidebar) {
169
- const name = groups[index]
170
- const active = name === current?.group
171
- const left = name ? (active && this.groupFocus ? '❯ ' : ' ') + plain(name) : ''
172
- const styled = active && this.groupFocus
173
- ? theme.bg('selectedBg', theme.fg('accent', pad(left, sidebar)))
174
- : theme.fg(active ? 'accent' : 'dim', pad(left, sidebar))
175
- lines.push(row(styled + theme.fg('dim', '│ ') + right))
176
- } else lines.push(row(right))
177
- }
178
- if (descriptionRows) lines.push(row(''))
179
- const description = current?.description && inner > 1 ? wrapTextWithAnsi(plain(current.description), inner) : []
180
- for (let index = 0; index < descriptionRows; index++) lines.push(row(theme.fg('muted', description[index] ?? '')))
181
- const footer = this.groupFocus
182
- ? '↑/↓ jump sections · Tab/Enter to settings · ←/→ switch tabs · Esc close'
183
- : this.query ? 'Enter/Space change · Tab jump tabs · Esc close'
184
- : `Enter/Space change · ${groups.length > 1 ? 'Tab jump sections · ←/→ switch tabs' : 'Tab/←/→ switch tabs'} · Type to search · Esc close`
185
- lines.push(rule(), row(theme.fg('dim', footer)), bottom)
186
- return lines.slice(0, height).map(value => clip(value))
187
- }
188
- }
@@ -1,70 +0,0 @@
1
- import { initTheme, Theme } from '@earendil-works/pi-coding-agent'
2
- import { stripTerminalSequences, visibleWidth } from '@earendil-works/pi-tui'
3
- import { describe, expect, it } from 'vitest'
4
-
5
- import { contextGauge, displayPath, renderStatusBand, type BandState } from './status'
6
- import { createHarnessTheme } from './theme'
7
-
8
- initTheme('dark', false)
9
- const theme = createHarnessTheme({ getColorMode: () => 'truecolor' } as Theme)
10
- const state: BandState = {
11
- cwd: '/work/project', model: { name: 'Claude Sonnet 4.6', reasoning: true, contextWindow: 200_000 },
12
- thinkingLevel: 'high', branch: 'main', contextPercent: 25, contextWindow: 200_000,
13
- costUsd: 0.15, subscription: false, running: false, elapsedMs: 0
14
- }
15
-
16
- describe('Oh My Pi status band', () => {
17
- it('renders the actual model, effort, branch, cost, and embedded context gauge', () => {
18
- const line = renderStatusBand(state, 120, theme)
19
- const plain = stripTerminalSequences(line)
20
- expect(plain).toContain('π > ◒ Sonnet 4.6 > 📁 /work/project > ⑂ main > $0.15 ▶')
21
- expect(plain).toContain('25%')
22
- expect(plain).toMatch(/200K─$/)
23
- expect(visibleWidth(line)).toBe(120)
24
- expect(line).toContain('48;2;15;18;22')
25
- expect(line).toContain('38;2;0;180;255')
26
- })
27
-
28
- it('stays within every narrow and wide terminal with wide, colored, and untrusted metadata', () => {
29
- for (let width = 1; width <= 180; width++) {
30
- const line = renderStatusBand({ ...state,
31
- cwd: '/work/日本語/long-project-name/with-many-parts',
32
- branch: '\x1b]2;malicious title\x07main\nother',
33
- model: { ...state.model!, name: '非常に長い名前'.repeat(20) }
34
- }, width, theme)
35
- expect(visibleWidth(line), `width ${width}`).toBeLessThanOrEqual(width)
36
- expect(line).not.toContain('malicious title')
37
- expect(line).not.toContain('\n')
38
- }
39
- })
40
-
41
- it('never invents model, quota, usage, or git data while startup context is unknown', () => {
42
- const plain = stripTerminalSequences(renderStatusBand({ ...state,
43
- model: undefined, branch: null, contextWindow: 0, contextPercent: null, costUsd: 0
44
- }, 80, theme))
45
- expect(plain).toContain('⬢ no-model')
46
- expect(plain).not.toMatch(/0%|200K|main|\$|quota|plan|collab/i)
47
- })
48
-
49
- it('clamps gauge values and omits an unknown percentage while retaining the window', () => {
50
- for (const percent of [null, -20, 0, 50, 100, 120, NaN]) {
51
- for (const width of [0, 1, 5, 16, 60]) {
52
- const gauge = contextGauge(width, percent, 200_000, theme)
53
- expect(visibleWidth(gauge)).toBe(width)
54
- expect(stripTerminalSequences(gauge)).not.toContain('NaN')
55
- }
56
- }
57
- expect(stripTerminalSequences(contextGauge(20, null, 200_000, theme))).not.toContain('%')
58
- })
59
-
60
- it('keeps sibling directories outside home and shows existing subscription and overflow states', () => {
61
- expect(displayPath('/home/test/project', '/home/test')).toBe('~/project')
62
- expect(displayPath('/home/test-other/project', '/home/test')).toBe('/home/test-other/project')
63
- const line = stripTerminalSequences(renderStatusBand({ ...state,
64
- subscription: true, costUsd: 0, running: true, elapsedMs: 65_000, hiddenAbove: 4
65
- }, 160, theme))
66
- expect(line).toContain('1m 5s')
67
- expect(line).toContain('$0.00 (sub)')
68
- expect(line).toContain('↑ 4 more')
69
- })
70
- })
@@ -1,109 +0,0 @@
1
- // Presentation adapted from Oh My Pi 18.11.3's band composer and status line.
2
- // Upstream MIT license and evidence are recorded in NOTICE.md and docs/terminal-tui.md.
3
- import { homedir } from 'node:os'
4
- import { isAbsolute, relative, sep } from 'node:path'
5
- import type { Theme } from '@earendil-works/pi-coding-agent'
6
- import { parseColor, stripTerminalSequences, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'
7
-
8
- import { TITANIUM } from './theme'
9
-
10
- export interface BandState {
11
- cwd: string
12
- model?: { name: string; reasoning: boolean; contextWindow: number }
13
- thinkingLevel: string
14
- branch: string | null
15
- account?: string
16
- contextPercent: number | null
17
- contextWindow: number
18
- costUsd: number
19
- subscription: boolean
20
- running: boolean
21
- elapsedMs: number
22
- hiddenAbove?: number
23
- hiddenBelow?: number
24
- }
25
-
26
- // OMP's shipped light theme supplies status colors separately from transcript colors.
27
- const LIGHT_STATUS = {
28
- ...TITANIUM, darkTitanium: '#e0e0e0', electricBlue: '#875f87', subtleGray: '#808080',
29
- brightAluminum: '#005f87', readoutGreen: '#005f00', titaniumGold: '#005f5f'
30
- }
31
- const palette = (theme: Theme) => theme.appearance === 'light' ? LIGHT_STATUS : TITANIUM
32
-
33
- const EFFORT: Record<string, string> = { off: '⦸', minimal: '○', low: '◔', medium: '◑', high: '◒', xhigh: '◕', max: '◉' }
34
- const SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
35
-
36
- export function singleLine(text: string): string {
37
- return stripTerminalSequences(text).replace(/[\x00-\x1f\x7f-\x9f]/g, ' ').replace(/ +/g, ' ').trim()
38
- }
39
-
40
- export function displayPath(cwd: string, home = homedir()): string {
41
- const inside = relative(home, cwd)
42
- if (inside === '') return '~'
43
- return inside !== '..' && !inside.startsWith(`..${sep}`) && !isAbsolute(inside) ? `~${sep}${inside}` : cwd
44
- }
45
-
46
- export function formatContextWindow(tokens: number): string {
47
- if (tokens >= 1_000_000) return `${Number((tokens / 1_000_000).toFixed(1))}M`
48
- if (tokens >= 1000) return `${Number((tokens / 1000).toFixed(1))}K`
49
- return String(Math.max(0, Math.round(tokens)))
50
- }
51
-
52
- function elapsed(milliseconds: number): string {
53
- const seconds = Math.max(0, Math.floor(milliseconds / 1000))
54
- return seconds >= 60 ? `${Math.floor(seconds / 60)}m ${seconds % 60}s` : `${seconds}s`
55
- }
56
-
57
- function color(theme: Theme, hex: string, text: string): string {
58
- return theme.style(text, { fg: parseColor(hex) })
59
- }
60
-
61
- export function contextGauge(width: number, percent: number | null, window: number, theme: Theme): string {
62
- const colors = palette(theme)
63
- const size = Math.max(0, Math.floor(width))
64
- if (!size) return ''
65
- const bounded = percent === null || !Number.isFinite(percent) ? null : Math.max(0, Math.min(100, percent))
66
- const used = window > 0 ? Math.min(size, Math.max(1, Math.round((bounded ?? 0) / 100 * size))) : 0
67
- const cells = Array.from({ length: size }, () => '─')
68
- const percentLabel = bounded === null ? '' : `${Math.round(bounded)}%`
69
- const windowLabel = window > 0 ? formatContextWindow(window) : ''
70
- const end = size - windowLabel.length - 1
71
- const start = Math.min(used, Math.max(1, end - percentLabel.length - 1))
72
- if (percentLabel && start + percentLabel.length < end) cells.splice(start, percentLabel.length, ...percentLabel)
73
- if (windowLabel && end > percentLabel.length + 2) cells.splice(end, windowLabel.length, ...windowLabel)
74
- return cells.map((cell, index) => color(theme, index < used ? colors.electricBlue : colors.subtleGray, cell)).join('')
75
- }
76
-
77
- export function renderStatusBand(state: BandState, width: number, theme: Theme): string {
78
- const colors = palette(theme)
79
- const size = Math.max(0, Math.floor(width))
80
- if (!size) return ''
81
- const model = state.model
82
- const effort = model?.reasoning ? EFFORT[state.thinkingLevel] ?? '○' : '⬢'
83
- const name = model ? singleLine(model.name).replace(/^Claude /, '') : 'no-model'
84
- const modelText = color(theme, colors.electricBlue, `${effort} ${name}`)
85
- const brand = color(theme, state.running ? colors.electricBlue : '#6b7280', state.running
86
- ? `${SPINNER[Math.floor(state.elapsedMs / 80) % SPINNER.length]} ${elapsed(state.elapsedMs)}` : 'π')
87
- const path = singleLine(displayPath(state.cwd))
88
- const separator = ` ${color(theme, colors.subtleGray, '>')} `
89
- const account = state.account ? color(theme, colors.brightAluminum, singleLine(state.account)) : null
90
- const branch = state.branch ? color(theme, colors.readoutGreen, `⑂ ${singleLine(state.branch)}`) : null
91
- const cost = state.costUsd > 0 || state.subscription
92
- ? color(theme, colors.titaniumGold, `$${state.costUsd.toFixed(2)}${state.subscription ? ' (sub)' : ''}`) : null
93
- const overflow = [state.hiddenAbove ? `↑ ${state.hiddenAbove} more` : '', state.hiddenBelow ? `↓ ${state.hiddenBelow} more` : ''].filter(Boolean).join(' ')
94
- const extra = overflow ? color(theme, '#6b7280', overflow) : null
95
- let pathWidth = Math.min(40, visibleWidth(path))
96
- let parts = [brand, modelText, color(theme, colors.brightAluminum, `📁 ${truncateToWidth(path, pathWidth)}`), account, branch, cost, extra].filter((part): part is string => part !== null)
97
- const minimumGauge = state.contextWindow > 0 ? Math.min(12, Math.floor(size / 3)) : 1
98
- const groupSize = () => visibleWidth(parts.join(separator)) + 3
99
- while (groupSize() + minimumGauge > size && pathWidth > 8) {
100
- pathWidth -= 1
101
- parts[2] = color(theme, colors.brightAluminum, `📁 ${truncateToWidth(path, pathWidth)}`)
102
- }
103
- while (groupSize() + minimumGauge > size && parts.length > 2) parts.pop()
104
- if (groupSize() + minimumGauge > size) parts = [modelText]
105
- const group = truncateToWidth(` ${parts.join(separator)} `, Math.max(0, size - 1), '', false)
106
- const cap = color(theme, colors.darkTitanium, '▶')
107
- const gauge = contextGauge(Math.max(0, size - visibleWidth(group) - 1), state.contextPercent, state.contextWindow, theme)
108
- return theme.style(group, { bg: parseColor(colors.darkTitanium) }) + cap + gauge
109
- }
@@ -1,174 +0,0 @@
1
- /*!
2
- * Adapted from @oh-my-pi/pi-tui 18.11.3 (https://github.com/can1357/oh-my-pi).
3
- *
4
- * MIT License
5
- *
6
- * Copyright (c) 2025 Mario Zechner
7
- * Copyright (c) 2025-2026 Can Bölük
8
- * Copyright (c) 2026 Stencil Labs, Inc.
9
- *
10
- * Permission is hereby granted, free of charge, to any person obtaining a copy
11
- * of this software and associated documentation files (the "Software"), to deal
12
- * in the Software without restriction, including without limitation the rights
13
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- * copies of the Software, and to permit persons to whom the Software is
15
- * furnished to do so, subject to the following conditions:
16
- *
17
- * The above copyright notice and this permission notice shall be included in all
18
- * copies or substantial portions of the Software.
19
- *
20
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- * SOFTWARE.
27
- */
28
- import { Theme, type ThemeBg, type ThemeColor } from '@earendil-works/pi-coding-agent'
29
-
30
- export const TITANIUM = {
31
- brushedTitanium: '#151820',
32
- darkTitanium: '#0f1216',
33
- electricBlue: '#00b4ff',
34
- deepBlue: '#0082b3',
35
- titaniumGold: '#d4c090',
36
- brightAluminum: '#e8ecf4',
37
- dimAluminum: '#9ca3b0',
38
- warningAmber: '#ffb347',
39
- readoutGreen: '#00ff88',
40
- alertRed: '#ff4757',
41
- subtleGray: '#2a3038'
42
- } as const
43
-
44
- const foreground = {
45
- accent: '#00b4ff',
46
- border: '#2a3038',
47
- borderAccent: '#00b4ff',
48
- borderMuted: '#1f252d',
49
- success: '#00ff88',
50
- error: '#ff4757',
51
- warning: '#ffb347',
52
- muted: '#9ca3b0',
53
- dim: '#6b7280',
54
- text: '',
55
- thinkingText: '#9ca3b0',
56
- userMessageText: '',
57
- customMessageText: '',
58
- customMessageLabel: '#d4c090',
59
- toolTitle: '',
60
- toolOutput: '#9ca3b0',
61
- mdHeading: '#00b4ff',
62
- mdLink: '#00b4ff',
63
- mdLinkUrl: '#0082b3',
64
- mdCode: '#00ff88',
65
- mdCodeBlock: '#9ca3b0',
66
- mdCodeBlockBorder: '#2a3038',
67
- mdQuote: '#9ca3b0',
68
- mdQuoteBorder: '#2a3038',
69
- mdHr: '#2a3038',
70
- mdListBullet: '#00b4ff',
71
- toolDiffAdded: '#00ff88',
72
- toolDiffRemoved: '#ff4757',
73
- toolDiffContext: '#9ca3b0',
74
- syntaxComment: '#6b7280',
75
- syntaxKeyword: '#00b4ff',
76
- syntaxFunction: '#00ff88',
77
- syntaxVariable: '#e8ecf4',
78
- syntaxString: '#d4c090',
79
- syntaxNumber: '#ffb347',
80
- syntaxType: '#00b4ff',
81
- syntaxOperator: '#00b4ff',
82
- syntaxPunctuation: '#9ca3b0',
83
- thinkingOff: '#4a5058',
84
- thinkingMinimal: '#5a6068',
85
- thinkingLow: '#6a7078',
86
- thinkingMedium: '#9ca3b0',
87
- thinkingHigh: '#00b4ff',
88
- thinkingXhigh: '#d4c090',
89
- bashMode: '#00ff88',
90
- scrollbarTrack: '#2a3038',
91
- scrollbarThumb: '#9ca3b0',
92
- searchMatchText: '#e8ecf4',
93
- thinkingMax: '#d4c090'
94
- } satisfies Record<ThemeColor, string>
95
-
96
- const background = {
97
- selectedBg: '#0082b3',
98
- searchMatchBg: '#0082b3',
99
- userMessageBg: '#0f1216',
100
- customMessageBg: '#2a3038',
101
- toolPendingBg: '#0f1216',
102
- toolSuccessBg: '#0f1216',
103
- toolErrorBg: '#1a0f10'
104
- } satisfies Record<ThemeBg, string>
105
-
106
- export function createHarnessTheme(base: Theme): Theme {
107
- return new Theme(foreground, background, base.getColorMode(), { name: 'harness-titanium', appearance: 'dark' })
108
- }
109
-
110
- const lightForeground = {
111
- accent: '#5a8080',
112
- border: '#547da7',
113
- borderAccent: '#5a8080',
114
- borderMuted: '#b0b0b0',
115
- success: '#588458',
116
- error: '#aa5555',
117
- warning: '#9a7326',
118
- muted: '#6c6c6c',
119
- dim: '#767676',
120
- text: '',
121
- thinkingText: '#6c6c6c',
122
- userMessageText: '',
123
- customMessageText: '',
124
- customMessageLabel: '#7e57c2',
125
- toolTitle: '',
126
- toolOutput: '#6c6c6c',
127
- mdHeading: '#9a7326',
128
- mdLink: '#547da7',
129
- mdLinkUrl: '#767676',
130
- mdCode: '#5a8080',
131
- mdCodeBlock: '#588458',
132
- mdCodeBlockBorder: '#6c6c6c',
133
- mdQuote: '#6c6c6c',
134
- mdQuoteBorder: '#6c6c6c',
135
- mdHr: '#6c6c6c',
136
- mdListBullet: '#588458',
137
- toolDiffAdded: '#588458',
138
- toolDiffRemoved: '#aa5555',
139
- toolDiffContext: '#6c6c6c',
140
- syntaxComment: '#008000',
141
- syntaxKeyword: '#0000FF',
142
- syntaxFunction: '#795E26',
143
- syntaxVariable: '#001080',
144
- syntaxString: '#A31515',
145
- syntaxNumber: '#098658',
146
- syntaxType: '#267F99',
147
- syntaxOperator: '#000000',
148
- syntaxPunctuation: '#000000',
149
- thinkingOff: '#b0b0b0',
150
- thinkingMinimal: '#767676',
151
- thinkingLow: '#547da7',
152
- thinkingMedium: '#5a8080',
153
- thinkingHigh: '#875f87',
154
- thinkingXhigh: '#8b008b',
155
- bashMode: '#588458',
156
- scrollbarTrack: '#b0b0b0',
157
- scrollbarThumb: '#6c6c6c',
158
- searchMatchText: '#3b3b3b',
159
- thinkingMax: '#8b008b'
160
- } satisfies Record<ThemeColor, string>
161
-
162
- const lightBackground = {
163
- selectedBg: '#d0d0e0',
164
- searchMatchBg: '#d0d0e0',
165
- userMessageBg: '#e8e8e8',
166
- customMessageBg: '#ede7f6',
167
- toolPendingBg: '#e8e8f0',
168
- toolSuccessBg: '#e8f0e8',
169
- toolErrorBg: '#f0e8e8'
170
- } satisfies Record<ThemeBg, string>
171
-
172
- export function createHarnessLightTheme(base: Theme): Theme {
173
- return new Theme(lightForeground, lightBackground, base.getColorMode(), { name: 'light', appearance: 'light' })
174
- }