@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
package/README.md CHANGED
@@ -1,22 +1,62 @@
1
1
  # Xingular Harness
2
2
 
3
- A Pi agent harness, as one TypeScript package (`@xingular/harness`). It is everything a model
4
- needs to work for someone over time, and nothing about any particular application:
5
-
6
- | Part | Folder | What it does |
3
+ A Pi agent harness built on **recursive harnessing** ([Harness²](https://arxiv.org/abs/2610.14224),
4
+ Apache-2.0, Google LLC), as one TypeScript package (`@xingular/harness`). It lets a running host
5
+ improve the harness itself, with model weights fixed. To say that precisely, the harness has two
6
+ halves:
7
+
8
+ - **The foundation is fixed.** Pi sessions, the prompt compiler, the run recorder, the tool gate,
9
+ accounts, plugin-code trust, the refinement method and the extension points. Only a release
10
+ changes it.
11
+ - **A Harness Variant (HV) mutates.** It is what a model is told and can load: eight components
12
+ (c1–c8) for one scope. Each scope has versioned, validated HVs; a run pins one version, and
13
+ refinement proposes a better HV that a person adopts.
14
+
15
+ *The foundation runs a variant, records how it went, and lets refinement propose a better
16
+ variant; only a person adopts one.* Refinement edits a copy of a variant and never the
17
+ foundation. See [Foundation and variants](docs/architecture/00-overview.md#foundation-and-variants).
18
+
19
+ Recursive refinement proposes HV improvements from run evidence. A person adopts candidates;
20
+ model weights and the foundation stay fixed. See the [Google Harness² feature guide](docs/features/google-harness2/README.md)
21
+ for the method and HV components.
22
+
23
+ | Area | Main features | Guide |
7
24
  |---|---|---|
8
- | Accounts | `src/accounts/` | Several isolated Pi accounts and pools, sign-in, model lists, health and limits. A session keeps the account it started with. |
9
- | Sessions | `src/sessions/` | Pi SDK turns, run records and `events.jsonl`, interrupt, approvals, questions, recovery after a crash. |
10
- | Prompt | `src/prompt/` | The system prompt compiled from sections with budgets and profiles; a stable prefix, and changing state delivered as updates in native history. |
11
- | Memory | `src/memory/` | The Wiki: pages, facts, memory blocks, revisions, proposals with an evidence gate, undo, an Inbox, recall over past runs, and sleep-time consolidation. |
12
- | Skills | `src/skills/` | Skills, prompts, and rules: a person's own in the data root, and built-in ones shipped with the harness or the application. |
13
- | Plugins | `src/plugins/` | What a Pi session loads, chosen by the harness and never by Pi's own discovery; trust for a working folder's code; the list of every plugin and what reaches one caller. |
14
- | Tools | `src/tools/` | Tool definitions, the memory tools, `ask_user`; a gate that asks the application's policy, then standing approvals, then the person. |
15
- | Connected apps | `src/mcp/` | MCP connections, OAuth, per-session grants, redaction, a trace of what each call returned. |
16
- | Terminal | `src/terminal/` | Interactive Pi sessions with isolated accounts, compiled instructions, a telemetry and tool extension, and the session socket with the `xagent-wiki` and `xagent-mcp` commands. |
17
- | Server | `src/server/` | The same API over newline-delimited JSON, for a host that is not a Node program. |
18
-
19
- It was split out of Xingular Agent, which is now an application built on it.
25
+ | Core runtime | Accounts, sessions and runs, prompt compilation, tool governance | [Cores](docs/features/cores/README.md) |
26
+ | Harness² | HVs, recursive refinement, answer-free selection, experience library | [Google Harness²](docs/features/google-harness2/README.md) |
27
+ | Automations | Subagents, recovery, optional run reflections, plugin hooks | [Automations](docs/features/automations/README.md) |
28
+ | Memory | Wiki notes, run recall, trajectory search and reads | [Memory](docs/features/memory/README.md) |
29
+ | Integrations | Application extension points, plugins, connected apps and Hub | [Integrations](docs/features/integrations/README.md) |
30
+ | Interfaces | Node embedding, standalone terminal and JSON-lines server | [Interfaces](docs/features/interfaces/README.md) |
31
+
32
+ The binding design of every part is the [architecture specification](docs/architecture/README.md).
33
+
34
+ Try refinement with no model and no credentials: `npm run build && node dist/cli.js refine demo --k 2`.
35
+ The [feature guide](docs/features/README.md) groups capabilities by area; the [documentation
36
+ index](docs/README.md) links the architecture and other project records.
37
+
38
+ ### Session options for applications
39
+
40
+ - Interactive sessions offer `spawn_subagent` and `wait_subagents` by default. `subagents: null` disables them; `{ maxDepth }` configures native nesting (default one, maximum three), independently of the host caller depth. Unattended sessions remain disabled unless the host explicitly supplies subagent options. A frozen capability set can narrow these tools further.
41
+ - `harness.subagents.spawn({ parentRunId, brief, tools?, wait? })` opens a fresh child of the same caller with no wider capabilities. It returns `{ runId, nativeSessionId }` once open; `wait: true` also waits for settlement. `harness.subagents.wait({ parentRunId, runIds? })` joins selected direct children, or the current children when omitted, and returns their outcomes. `results` reads the same bounded outcome records without waiting. RPC exposes `subagents.spawn`, `subagents.wait`, and `subagents.results`; `sessions.spawnSubagent` remains a compatibility alias.
42
+ - The model's `spawn_subagent` returns immediately by default; `wait: true` returns an inline result. `wait_subagents` joins selected children. The SDK and standalone terminal share this execution service. Terminal calls use its private control channel, including when connected apps are disabled.
43
+ - Parents receive results at native turn boundaries and join outstanding children before completing. Typed native-history receipts prevent duplicate automatic delivery; explicit waits can reread results. Ownership is recorded before startup so an explicit resume can recover even a lost spawn return. Startup reservations without a run become interrupted outcomes. A restarted Harness never restarts model work automatically. Recovery requires the same recorded account, caller, working folder, and selected history branch. Session IDs are opaque; consumers follow `parentRunId` and `relation`.
44
+ - `providers: false` runs a session with the harness's own tools only.
45
+ - `variant: { scope }` runs the session on that scope's head variant (or `{ scope, version }`, or `{ dir }` for a variant on disk). The version is pinned for the run and recorded on it.
46
+ - On the caller, `recallExcludeAgents` hides those agents' conversations from history and trajectory tools.
47
+ - `harnessTools: false` runs a session without the History, Wiki and skill tools (and without `ask_user` and `checklist_write`).
48
+ - Every session with harness tools gets `checklist_write`: the model sends its whole checklist (`pending`, `in_progress`, `completed`, at most 50 steps) and the run records it as a `checklist.updated` event. `checklistOf(events)` or the `runs.checklist` method reads the latest one. Plan mode allows it.
49
+ - `continueFrom: <run id>` continues a run that stopped before it finished (interrupted or failed) as a new run. `harness.recovery.interruptedRunIds` lists the runs `open` marked interrupted, and `continuationOf(root, runId, sessionDir)` (`runs.continuation`) says whether one can be continued and what it left: checklist, unanswered approvals and questions, the last tool and whether it finished, unfinished subagents. The new run reopens the same native history, records `resumedFromRunId`, keeps the account, variant version and capability set (`continuation_mismatch` otherwise), and the model is told where the earlier run stopped. The harness never continues a run by itself; which runs to continue, and when, is the application's choice.
50
+ - The first-party `lessons` plugin (off by default) reflects on a completed top-level run with enough tool calls and may keep one general lesson in the Wiki under `library/lessons/`, in refinement's cue/lesson shape. It uses the run's own account and model, read-only file tools, and is capped (`minToolCalls`, `maxLessons`, `maxChars`). See PROP-0008.
51
+
52
+ Every session also gets `trajectory_search` and `trajectory_read` from the built-in History plugin.
53
+ Search lists runs in the current data root, including active runs, with filters and a continuation
54
+ cursor. Read returns pages of the canonical execution events, including captured prompt/context,
55
+ tool, decision, retry, compaction, and usage evidence. Active runs show the latest events saved so
56
+ far; settled reads stop at the first outcome. Payloads are bounded and marked when truncated, and
57
+ the tools omit account identifiers, credential fields, attachment bytes, native adapter payloads,
58
+ and provider reasoning text or summaries.
59
+ They report recorded evidence without scoring runs, and do not backfill older records.
20
60
 
21
61
  ## Using it from Node
22
62
 
@@ -24,16 +64,19 @@ It was split out of Xingular Agent, which is now an application built on it.
24
64
  import { createHarness } from '@xingular/harness'
25
65
 
26
66
  const harness = createHarness({
27
- dataRoot: '/path/to/data', // knowledge and history: wiki/, registry/, runs/, index.sqlite
67
+ dataRoot: '/path/to/data', // variants/, library/, refine/, wiki/, registry/, runs/, index.sqlite
28
68
  stateDir: '/path/to/state', // device-local: accounts, approvals, connections, sockets
29
69
  productName: 'My App', // how the harness names itself to a model (default 'Xingular Harness')
30
70
  secrets, // SecretStore; defaults to an owner-only file in stateDir
31
71
  policy, // ToolPolicy: what a run may do, and what needs a person
32
72
  directory, // names for the ids the application uses
33
73
  builtins: ['/path/to/builtin'], // folders of built-in skills, prompts, and rules
34
- plugins: [myPlugin] // the application's own parts, described as plugins
74
+ plugins: [myPlugin], // the application's own parts, described as plugins
75
+ refineHost // where refinement executions work, as whom, with which tools
35
76
  })
36
77
 
78
+ harness.refine.start({ task: { id, scope: 'agent-1', prompt }, k: 1, mode: 'parallel' })
79
+
37
80
  harness.sessions.provide((session) => myTools(session)) // the application's own tools
38
81
  harness.runs.listen((event, run) => show(event)) // every run event, after it is saved
39
82
 
@@ -41,6 +84,7 @@ await harness.sessions.run({
41
84
  run: { id, sessionId },
42
85
  cwd, sessionDir, text,
43
86
  caller: { agentId, agentName, actor: 'Chat' },
87
+ variant: { scope: 'agent-1' },
44
88
  launch: { sections: [{ id: 'identity', title: 'Identity', body, budget: 2000, order: 10 }] },
45
89
  tools: { allow: ['read', 'bash', 'my_tool'], gated: ['bash'] }
46
90
  })
@@ -48,14 +92,14 @@ await harness.sessions.run({
48
92
 
49
93
  ## How an application extends it
50
94
 
51
- The harness knows a caller (an opaque id that owns memory), never an agent, a group, or a task.
52
- An application adds what it knows through six points:
95
+ The harness knows a caller and a harness scope (opaque ids), never an agent, a group, or a task.
96
+ An application adds what it knows through seven points:
53
97
 
54
98
  1. **Prompt sections** (`Launch.sections`, `Launch.toolGroups`, `Launch.references`). Each
55
- section has an `order` and may be `dynamic`. The harness adds its own (`blocks` 30, `rules` 40,
56
- `references` 50, `skills` 60, `knowledge` 80, `tools` 90), applies budgets and the caller's
57
- context profile, keeps stable sections in the system prompt, and sends dynamic ones as
58
- updates.
99
+ section has an `order` and may be `dynamic`. The harness adds its own (`system` 25,
100
+ `guardrails` 40, `memory` 45, `references` 50, `subagents` 64, `scripts` 66, `wiki` 80,
101
+ `tools` 90), applies budgets, keeps stable sections in the system prompt, and sends dynamic
102
+ ones as updates.
59
103
  2. **Tool providers** (`harness.sessions.provide`). A provider returns `ToolSpec`s for a session;
60
104
  only the names in the session's `allow` list are registered, in that order.
61
105
  A tool may return `attachments` as `{ id, name, mimeType }` references. The harness records
@@ -65,8 +109,10 @@ An application adds what it knows through six points:
65
109
  key read from the secret store) and `web_fetch` (checked reads of public pages). An application
66
110
  passes it to `harness.sessions.provide` and switches the names on for each agent.
67
111
  3. **`ToolPolicy`**. `scope` says whether a call is inside what the run may do (or needs one
68
- approval); `authorize` says whether the tool is still switched on; `approval` adds facts for
69
- standing approvals; `connections` narrows the connected apps a session reaches.
112
+ approval). A decision with `humanOnly` is for a person alone: the always-approve switch and
113
+ remembered answers do not apply to it. `authorize` says whether the tool is still switched on;
114
+ `approval` adds facts for standing approvals; `connections` narrows the connected apps a session
115
+ reaches.
70
116
  4. **`SecretStore`**. Where credentials live (a keychain, a vault). Keys are
71
117
  `<account id>/<name>`.
72
118
  5. **`Directory`**. Names for the application's ids, shown in what the harness writes.
@@ -74,6 +120,11 @@ An application adds what it knows through six points:
74
120
  the application and says which tools, prompt sections and tool groups it provides. It is data:
75
121
  it changes what `plugins.list` and `plugins.inventory` report, never what runs. `WEB_PLUGIN`
76
122
  describes the web tools. A host that is not a Node program sends them with `plugins.describe`.
123
+ 7. **`RefineHost`** (`HarnessOptions.refineHost`). Where a refinement execution works
124
+ (`prepareWorkspace`: an isolated folder, such as a git worktree), as whom and with which tools
125
+ (`session`), and what it produced (`deliverable`). Executions run as unattended runs with
126
+ trigger `probe`, so a `ToolPolicy` can refuse anything with effects outside that folder;
127
+ improver sessions run with trigger `improver`, file tools only, on a copy of the evidence.
77
128
 
78
129
  `apps.expose(...)` additionally offers the application's tools through the connected-apps
79
130
  broker (`mcp_list_tools`, `mcp_call_tool`), which is how a terminal session reaches them.
@@ -82,7 +133,7 @@ broker (`mcp_list_tools`, `mcp_call_tool`), which is how a terminal session reac
82
133
 
83
134
  A plugin is a bundle with a title, a description and contributions: instructions, skills,
84
135
  commands, tools, connections, code (a Pi extension) and themes. A Pi package is a plugin as it
85
- is; so are the harness's own parts (Memory, Wiki, History, Ask the user, Connected apps, Pi), the
136
+ is; so are the harness's own parts (Harness, Wiki, History, Subagents, Ask the user, Connected apps, Pi), the
86
137
  application's, a person's registry ("Yours"), the folder every account shares, and what a
87
138
  working folder brings.
88
139
 
@@ -111,14 +162,15 @@ working folder brings.
111
162
  does nothing. A tool an extension registered is offered to the model and asks before every
112
163
  call. A command it registered runs when a message starts with it.
113
164
  - **The gate runs last.** In an SDK session it is an inline extension, loaded after those on
114
- disk; in a terminal the harness's extension is the last `--extension`. A plugin that changes a
115
- tool call's input does so before the gate sees it.
165
+ disk. A terminal retains its final prepared `--extension` bridge argument; the owned frontend
166
+ loads that bridge as the final trusted inline factory. A plugin that changes a tool call's
167
+ input does so before the gate sees it. Every resource reload revalidates the parent's original
168
+ trusted selection; changed or revoked code requires review and a fresh terminal.
116
169
  - **A required part can be extended.** A package names the part it adds to and, optionally, a
117
- hooks file: `"harness": { "extends": ["memory"], "hooks": "./hooks.mjs" }`. The harness runs
118
- hooks itself (`src/plugins/hooks.ts`), in its own process, because most memory is written while
119
- no session is open. `export default function (harness) { harness.on('memory.saved', async
120
- (event, ctx) => …) }`; the events are `memory.saved`, `memory.block.changed`,
121
- `wiki.page.saved` and `history.run.ended`. A hook is told after the write and cannot stop it,
170
+ hooks file: `"harness": { "extends": ["wiki"], "hooks": "./hooks.mjs" }`. The harness runs
171
+ hooks itself (`src/plugins/hooks.ts`), in its own process, because notes are often written while
172
+ no session is open. `export default function (harness) { harness.on('wiki.page.saved', async
173
+ (event, ctx) => …) }`; the events are `wiki.page.saved` and `history.run.ended`. A hook is told after the write and cannot stop it,
122
174
  has 30 seconds, and what it throws is kept in `plugin-hooks.json` and shown on its plugin. It
123
175
  runs only while its plugin is switched on for everyone and trusted; what is loaded is checked
124
176
  against that before each delivery. `ctx.call(connection, tool, args)` reaches a connected app
@@ -138,14 +190,15 @@ working folder brings.
138
190
  - **A person can do the same from a terminal.** In a terminal session, `/plugins` lists what the
139
191
  session loads and switches a plugin, or one thing it brings, for the session's project or for
140
192
  everyone, and trusts code after showing its files. The session's shell can read the session
141
- token from its environment, so a change is taken only with a second key that the harness's
142
- extension claims once as it loads (`control.claim`) and keeps in its own memory; the socket's
193
+ token from its environment, so a change is taken only with a second key that the trusted
194
+ terminal process claims once (`control.claim`) and shares with its bridge in memory; the socket's
143
195
  `plugins.list` is open to the session, and `plugins.attach`, `plugins.detach`, `plugins.trust`
144
196
  and `plugins.untrust` refuse without that key. A change applies when the session restarts.
145
- Outside a session, `xingular-harness plugins list | show | install | remove | update | attach |
197
+ Outside a session, `xharness plugins list | show | install | remove | update | attach |
146
198
  detach | trust | untrust` acts directly, as the person who typed it; `trust` shows the files
147
199
  and wants a typed yes or `--yes`. It does not open the data root, so it settles no run.
148
- - **Unattended runs and memory maintenance load no extension**, as before.
200
+ - **Unattended runs load no extension found on disk.** A variant's own trusted plugins still
201
+ load, so a refinement probe runs the plugin it is testing.
149
202
  - **A person switches things on and off for a scope.** `plugins.attach` and `plugins.detach`
150
203
  take a plugin's or a contribution's `id` and a `scope` (`{}` for everywhere, `{ agentId }`, or
151
204
  `{ projectId }`). The narrowest scope that says something wins: an agent, then a project, then
@@ -162,9 +215,10 @@ working folder brings.
162
215
  one caller, each item attributed to a plugin, with `unattributed` naming any prompt section,
163
216
  tool group or tool no plugin accounts for.
164
217
 
165
- A terminal session's `pi` command has four extensions of its own (`builtin:mcp`, `codemode`,
166
- `tool-search`, `llama.cpp`). They are passed by name unless Pi's settings switch them off. An SDK
167
- session does not have them.
218
+ A terminal session can load Pi's four existing builtins (`builtin:mcp`, `codemode`,
219
+ `tool-search`, `llama.cpp`). The Harness resource selection passes enabled builtins by name,
220
+ and the pinned compatibility adapter supplies their implementations to the persistent SDK
221
+ runtime. The separate per-turn SDK execution path does not load these terminal builtins.
168
222
 
169
223
  ## Using it from another language
170
224
 
@@ -188,7 +242,8 @@ table. With the `--host-*` flags the harness calls the host for `secrets.get|set
188
242
  `policy.scope|authorize|approval|connections`, and `tools.call`; the host registers its tools
189
243
  with `tools.register` and its names with `directory.set`.
190
244
 
191
- `skills.import` accepts complete user-owned skill folders:
245
+ `variants.importComponents` adds complete skill folders, or single-file rules and prompts, to the
246
+ component library:
192
247
 
193
248
  ```ts
194
249
  { skills: [{ name, files: [{ path, content, encoding }] }] }
@@ -199,60 +254,127 @@ It validates bounded relative paths and file encodings, requires a root
199
254
  has no knowledge of the application feature that may call it.
200
255
 
201
256
  `npm run prove` starts that server on a throwaway data root, with no application present, and
202
- exercises accounts, memory, skills, the prompt, connected apps, and a recorded session.
257
+ exercises accounts, variants, the Wiki, the prompt, connected apps, a recorded session, a
258
+ plugin hook, and the refinement demo end to end.
203
259
 
204
- ## Run it as a standalone Pi terminal
260
+ ## Run it as a standalone Harness terminal
205
261
 
206
262
  After the CLI package is published to npm or your company's npm registry, install and launch it:
207
263
 
208
264
  ```sh
209
265
  npm install --global @xingular/harness
210
- xingular-harness
266
+ xharness
211
267
  ```
212
268
 
213
- The machine needs Node 22.19 or newer. On macOS and Linux, the `pi` command must be on `PATH`;
214
- on Windows, Harness runs the pinned Pi CLI package through the active Node runtime. On first
215
- launch, the harness creates a `Default` Pi account; Pi handles provider sign-in.
269
+ The machine needs Node 22.19 or newer and Bun 1.3.14 or newer. Harness runs its own OpenTUI
270
+ terminal frontend with Bun, using its pinned Pi SDK; no separate global `pi` installation is
271
+ required. On first launch, it creates a `Default` isolated account. Use `/accounts` to sign in.
272
+
273
+ Provider sign-in progress lives in the running Harness process. An embedding application can call
274
+ `accounts.loginStatus` after reconnecting to recover the current device code or prompt by account;
275
+ the status carries a revision so it can be safely merged with streamed login events. Progress is
276
+ never written to account files, and a completed or cancelled attempt no longer exposes its code.
216
277
 
217
- To build and run from a source checkout instead:
278
+ To build and run from a source checkout, use the development command:
218
279
 
219
280
  ```sh
220
281
  npm install
221
- npm run build
222
- node dist/cli.js
282
+ npm run dev
223
283
  ```
224
284
 
225
- This opens Pi's interactive terminal in the current working directory. The harness adds its
226
- compiled context, isolated account, approval gate, Wiki commands, and terminal extension while
227
- Pi provides the interface.
228
-
229
- The default data and device state directories are `~/.xingular-harness/data` and
230
- `~/.xingular-harness/state`. Override them with `--data <dir>` and `--state <dir>`. Session
231
- history is stored per working directory and can be reopened with Pi's `/resume` command. The
232
- explicit `terminal` command is an alias for the default launch. Use `--help` to see the commands;
233
- `serve` remains the host-facing RPC service for integrations such as Xingular Agent/App.
285
+ `npm run dev` rebuilds the CLI and opens the Harness terminal in the current working directory.
286
+ It uses separate development directories by default: `~/.xingular-harness-dev/data` and
287
+ `~/.xingular-harness-dev/state`. This keeps development harness data and device settings—including
288
+ accounts, Pi settings, approvals, and connections—separate from the installed command. Press
289
+ `/quit`, Ctrl+C or Ctrl+D to close it. Override either directory with `--data <dir>` or
290
+ `--state <dir>`; for example: `npm run dev -- --data <dir> --state <dir>`. An omitted option keeps
291
+ its development specific default.
292
+
293
+ The OpenTUI/Solid frontend is the only terminal. Install Bun 1.3.14 or newer and run
294
+ `npm run build:tui` (or `npm run build`); without Bun the build fails rather than producing a
295
+ terminal that cannot start. The harness runs `dist/terminal-opentui.js`, which uses the same
296
+ session runtime, accounts, command pages, approvals, questions, plugins and run records as the
297
+ embedded SDK. See [the terminal guide](docs/terminal-tui.md).
298
+
299
+ Building a checkout does not update an existing global `xharness` installation.
300
+ To replace that command with this checkout, run `npm pack`, then install the exact tarball
301
+ filename it prints with `npm install --global ./<tarball-filename>`. This is a local install;
302
+ it does not publish a release. Close an already-running terminal session and launch the command
303
+ again to load the new frontend. A package version alone cannot distinguish an unreleased local
304
+ build from an older installed build with the same version.
305
+
306
+ This opens the Harness-owned OpenTUI terminal in the current working directory. Its presentation
307
+ uses the Harness titanium palette and an OpenCode-inspired layout: the transcript above a
308
+ borderless composer with the working status above it and the model, context and token line below.
309
+ Harness owns screen composition, editing/input dispatch, scrolling, command routing and plugin UI;
310
+ Pi supplies the persistent execution runtime, native history and rich content components. The
311
+ existing isolated account, compiled context, approval gate, telemetry and Wiki/socket commands
312
+ remain behind the terminal. No Pi `InteractiveMode` is constructed.
313
+
314
+ `/resume` stays inside the prepared account history and working folder. Cancel an active response
315
+ before changing or reloading a session. Full OMP visual parity is not established by the current
316
+ verification. `/accounts`, `/permissions`, `/plugins`, `/hub`, `/components`, `/settings`, `/trajectory`
317
+ and `/log` each open their own centered page dialog with local tabs. `/permissions` reviews device-local Pi
318
+ terminal grants and the Full Permission switch; tool grants apply across terminal sessions sharing this
319
+ Harness state, and Full Permission requires confirmation. `/components` browses reusable skills,
320
+ prompts and rules; a confirmed skill or rule addition creates a variant version for future sessions while
321
+ the current terminal stays pinned. `/trajectory` opens recorded runs for the current native conversation,
322
+ with event navigation and a detail inspector. `/log` shows a static, redacted snapshot of Harness
323
+ diagnostics and run events for the current conversation; press Escape to close. See
324
+ [terminal architecture and evidence](docs/terminal-tui.md),
325
+ [the ownership decision](docs/decisions/ADR-0001-owned-terminal.md),
326
+ [the OpenTUI-only decision](docs/decisions/ADR-0006-opentui-only-terminal.md), and
327
+ [third-party notices](NOTICE.md).
328
+
329
+ ### `/accounts` in the terminal
330
+
331
+ `/accounts` manages the Pi accounts the same way the app's Accounts screen does: add, rename,
332
+ check, make default, sign in (browser or API key), sign out, remove a provider or an account,
333
+ manage pools, and read the activity log. Each change is made by the person at the terminal; a
334
+ command the model runs in the shell cannot make it.
335
+
336
+ A running session stays on the account it started with. To use another account for this
337
+ session, choose **Use for this session**: the terminal child restarts and the same conversation
338
+ resumes on that account. Removing an account that a running terminal is using is refused. Only
339
+ terminals in this process are counted, so an account used by another running `xharness` window can
340
+ still be removed; that session then asks for another account the next time it starts.
341
+
342
+ The installed standalone command defaults to `~/.xingular-harness/data` and
343
+ `~/.xingular-harness/state`; `npm run dev` instead defaults to the separate
344
+ `~/.xingular-harness-dev/data` and `~/.xingular-harness-dev/state`. Override either with
345
+ `--data <dir>` and `--state <dir>`. Session history is stored per working directory and can be
346
+ reopened with the terminal's `/resume` command. The explicit `terminal` command is an alias for
347
+ the default launch. Use `--help` to see the commands; `serve` remains the host-facing RPC service
348
+ for integrations such as Xingular Agent/App.
234
349
 
235
350
  ## Storage
236
351
 
237
352
  ```
238
353
  <data root>/
239
- wiki/ home.md, library/, projects/<slug>/, facts/, blocks/, revisions, inbox, log
240
- registry/ skills/, prompts/, rules/ (a person's own; never copied)
354
+ variants/<scope>/ versions/<fingerprint>/variant/, head.json, lineage.jsonl (the eight components)
355
+ refine/<id>/ summary.json, task.json, variants/<label>/, rollouts/, context/, selection/, reflection/, improver/
356
+ library/<scope>/<area>/ INDEX.md, variants/<task>/{variant/, EXPERIENCE.md} (the experience library)
357
+ wiki/ home.md, library/, projects/<slug>/ (project notes)
358
+ wiki-history/ earlier versions of notes
359
+ legacy/ what an earlier Wiki kept (memory blocks, facts, revisions, Inbox), moved once
360
+ registry/ skills/, prompts/, rules/ (the component library; the Hub installs here)
241
361
  plugins/<name>/ packages kept with a person's data; each is found as an installed plugin
242
- runs/<id>/ run.json, events.jsonl, context.json, caller.json
243
- config/ context profiles, what is switched on for whom (plugin-attachments.json),
362
+ runs/<id>/ run.json, events.jsonl, context.json, caller.json, subagents.json (reserved child IDs)
363
+ config/ what is switched on for whom (plugin-attachments.json),
244
364
  settings the harness reads
245
- index.sqlite a rebuildable index of Wiki entries and runs (FTS5)
365
+ index.sqlite a rebuildable index of runs for recall (FTS5)
246
366
  projects.json read only: the application owns it
247
367
 
248
368
  <state dir>/
249
369
  accounts/ registry, per-account Pi agent folders, audit log
250
370
  approvals.json standing approvals
251
371
  plugin-trust.json the code a person trusted, by hash, and whether earlier packages were taken over
372
+ variant-plugin-trust.json harness-variant plugin code a person trusted, and scopes whose probes may run improver code
252
373
  plugin-registered.json what each extension registered the last time a session loaded it
253
374
  plugin-hooks.json what each hooks file listens for and how its last run went
254
375
  connections.json connected apps (secrets are in the SecretStore)
255
376
  run/ the session socket and the terminal commands
377
+ harness.log diagnostics from the standalone terminal, kept off its screen
256
378
  ```
257
379
 
258
380
  The files are the source of truth; `index.sqlite` can be deleted and rebuilt
@@ -261,14 +383,86 @@ The files are the source of truth; `index.sqlite` can be deleted and rebuilt
261
383
  ## Commands
262
384
 
263
385
  ```sh
264
- npm run typecheck
265
- npm test # unit tests and the golden prompt/memory fixtures in tests/golden
266
- npm run build # dist/cli.js (the xingular-harness command) and dist/terminal-pi.js
267
- npm run prove # the standalone proof above
386
+ npm run ci # typecheck, unit/golden tests, and standalone proof; matches GitHub CI
387
+ npm run build # dist/cli.js, dist/terminal-pi.js, and the OpenTUI frontend
388
+ npm run build:tui # only the OpenTUI frontend
268
389
  ```
269
390
 
270
- Node 22.13 or newer (for `node:sqlite`).
391
+ Node 22.19 or newer and Bun 1.3.14 or newer.
271
392
 
272
393
  ## Images
273
394
 
274
- `SessionRunInput.requiresImageInput` optionally requires a vision-capable resolved Pi model before a prompt is delivered. The check includes direct `images` input, and the generic tool wrapper rejects image results on text-only models. Direct prompt images use Pi's `{ type: 'image', data, mimeType }` content shape. Applications own file formats, attachment selection, extraction and image preparation; the Harness only transports typed image content and validates model capability.
395
+ `SessionRunInput.requiresImageInput` optionally requires a vision-capable resolved Pi model before a prompt is delivered. The check includes direct `images` input, and the generic tool wrapper rejects image results on text-only models. Direct prompt images use Pi's `{ type: 'image', data, mimeType }` content shape. Applications own attachment selection, extraction and image preparation; the Harness transports typed image content and validates model capability. In the standalone terminal, pasting Finder-copied HEIC/HEIF files on macOS converts them to temporary PNGs so Pi can read their pixels. See [the terminal guide](docs/terminal-tui.md#clipboard-image-paste).
396
+
397
+ `SessionRunInput.initialBashCommand` is an opt-in for one new interactive user turn. It must match
398
+ the leading `!` command in `text`; Harness checks it through the same per-call gate as model-issued
399
+ Bash, executes it once in Pi's native session, records its bounded result, and asks the model to
400
+ inspect that result before replying. Automatic, plan, resumed, relation, probe, and improver runs
401
+ cannot carry it. See the [terminal guide](docs/terminal-tui.md#bash-command-mode).
402
+
403
+ ## Curated Hub
404
+
405
+ `xharness hub list [--refresh]`, `xharness hub show publisher/name@version`, and
406
+ `hub install publisher/name@version` browse and install exact catalog versions. `/hub` offers the
407
+ same review in the interactive terminal, using its private control key for installation. Both the
408
+ terminal and embedding applications use `hub.list`, `hub.get`, `hub.preview`, `hub.install`,
409
+ `hub.uninstall`, and `hub.readDocument`. `hub.get { id, version, preview: true }` verifies data
410
+ payload bytes without installing them. `hub.preview { id, version, offset }` returns bounded,
411
+ UTF-8-safe pages of up to 16 KiB from a verified payload.
412
+
413
+ Registry bundles import complete skills or single Markdown prompts/rules, disabled. Pi packages
414
+ reuse the existing installer and require an exact npm version or full GitHub commit. Documents
415
+ are saved as inert JSON for a compatible host to interpret; the harness does not apply them.
416
+ Installation grants no attachment, trust, credentials, or permission. Writes are serialized and
417
+ existing registry files are never overwritten. Receipts report whether their resources are intact;
418
+ uninstall removes only the exact receipt's resources, including local edits within those paths, and
419
+ revokes its attachment choices.
420
+
421
+ Installed documents and provenance live under `<data root>/hub/`; the catalog cache is
422
+ `<state dir>/hub/catalog.json`. An offline snapshot ships with the package. Explicit refresh keeps
423
+ the last valid catalog when the network or schema fails. The prepared public distribution repository
424
+ is `../Hub`; publication remains separate from local installation and testing. Run its build with
425
+ `--sync-harness` to regenerate this package's offline snapshot after reviewing catalog changes.
426
+
427
+ Standalone defaults stay separate from a host application's folders. Use explicit `--data` and
428
+ `--state` to target the same library. CLI hub commands construct the harness without opening the
429
+ data root, so they do not migrate the Wiki or settle another process's runs.
430
+
431
+
432
+ ## External curation
433
+
434
+ An embedding application may set `externalMaintenance: true`, supply trusted `CallerContext`
435
+ `vaultAccess` (`self` or `curator`), and register `maintenanceTools`/`MAINTENANCE_PLUGIN`.
436
+ Self callers directly edit only their own writable persona/notes; shared knowledge and text-resource
437
+ writes become persistent proposals. Curator tools read original evidence, compare captured target
438
+ revisions, read all host-assigned requests together, and apply reconciled Wiki proposals as one
439
+ undoable change set. Resource proposals keep their own receipts; executable proposals remain inert
440
+ until the user reviews/trusts them. Later user edits are never overwritten.
441
+ `maintenance.list`, `maintenance.review` and `maintenance.retry` let the host dispatch its own
442
+ recorded sessions. Curator runs do not recursively queue maintenance. Optional assigned IDs freeze
443
+ which requests a batch may claim. These fields are trusted host context, never model arguments.
444
+ `maintenance_read_batch` reads those assigned requests together; `maintenance_apply_batch` records
445
+ one decision for each and applies the evidence-checked Wiki set atomically. Standalone callers that
446
+ omit this option retain the existing lifecycle and direct-write contract.
447
+
448
+ ## Readiness diagnostics
449
+
450
+ Use `/doctor` in the terminal for local readiness checks and explicitly selected live probes. The same
451
+ structured jobs are available through `harness.doctor` and `doctor.*` server methods. See
452
+ [Doctor](docs/doctor.md) for coverage, consent, isolation, and provider callbacks.
453
+
454
+ ## Public 1.0.0 release candidate
455
+
456
+ The public package is ESM: import from `@xingular/harness` or supported subpaths such as
457
+ `@xingular/harness/variant/seed`. JavaScript and declarations are shipped in `dist/sdk`; a
458
+ TypeScript loader is not required. Node 22.19 or later is required. The interactive terminal
459
+ also requires Bun (release builds use 1.4.2); the CLI reports its version with `xharness --version`.
460
+ Original project code is Apache-2.0. See LICENSE, NOTICE.md and THIRD_PARTY_LICENSES.md.
461
+
462
+ A host providing its own browser tools sets `browser: false` on `createHarness` to disable the
463
+ generic backend and prevent tool-name collisions. The desktop App uses this for shared tabs.
464
+ The default standalone Harness keeps its isolated browser backend enabled.
465
+
466
+ This candidate intentionally resets development numbering to 1.0.0 while preserving old versions.
467
+ See [release notes](docs/releases/1.0.0.md) and [release procedure](docs/releases/README.md).
468
+ Publication requires registry verification, green CI and approval of the candidate/tag push.