@xingular/harness 0.1.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (683) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +187 -85
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +13701 -13498
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +808 -151
  373. package/docs/README.md +22 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  403. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  404. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  405. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  406. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  407. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  408. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  409. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  410. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  411. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  412. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  413. package/docs/decisions/ADR-0013-doctor.md +27 -0
  414. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  415. package/docs/doctor.md +74 -0
  416. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  418. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  420. package/docs/features/README.md +20 -0
  421. package/docs/features/automations/README.md +41 -0
  422. package/docs/features/cores/README.md +39 -0
  423. package/docs/features/google-harness2/README.md +52 -0
  424. package/docs/features/integrations/README.md +40 -0
  425. package/docs/features/interfaces/README.md +29 -0
  426. package/docs/features/memory/README.md +28 -0
  427. package/docs/releases/1.0.0.md +40 -0
  428. package/docs/releases/README.md +36 -0
  429. package/docs/study/00-index.md +78 -0
  430. package/docs/study/arms/00-matrix.md +20 -0
  431. package/docs/study/arms/01-system-prompt.md +211 -0
  432. package/docs/study/arms/02-tools.md +79 -0
  433. package/docs/study/arms/03-subagents.md +90 -0
  434. package/docs/study/arms/04-skills.md +75 -0
  435. package/docs/study/arms/05-context-management.md +90 -0
  436. package/docs/study/arms/06-memory.md +90 -0
  437. package/docs/study/arms/07-governance.md +71 -0
  438. package/docs/study/arms/08-execution.md +69 -0
  439. package/docs/study/arms/09-observability.md +60 -0
  440. package/docs/study/arms/10-refinement.md +110 -0
  441. package/docs/study/btw-comparison.md +37 -0
  442. package/docs/study/feature-gap-review.md +42 -0
  443. package/docs/study/insights.md +123 -0
  444. package/docs/study/roadmap.md +72 -0
  445. package/docs/study/sources/claude-code.md +44 -0
  446. package/docs/study/sources/deepseek-harness.md +102 -0
  447. package/docs/study/sources/harness2.md +50 -0
  448. package/docs/study/sources/kimi-cli.md +42 -0
  449. package/docs/study/sources/omp.md +93 -0
  450. package/docs/study/sources/opencode.md +43 -0
  451. package/docs/study/sources/openhands.md +46 -0
  452. package/docs/study/sources/smolagents.md +40 -0
  453. package/docs/study/sources/swe-agent.md +34 -0
  454. package/docs/system-prompt-design.md +196 -0
  455. package/docs/terminal-tui.md +473 -56
  456. package/package.json +43 -13
  457. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  458. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  459. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  460. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  461. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  462. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  463. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  464. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  465. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  466. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  467. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  468. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  469. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  470. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  471. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  472. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  473. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  474. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  475. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  476. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  477. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  478. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  479. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  480. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  481. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  482. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  483. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  484. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  485. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  486. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  487. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  488. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  489. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  490. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  491. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  492. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  493. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  494. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  495. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  496. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  497. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  498. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  499. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  500. package/src/accounts/accounts.test.ts +0 -333
  501. package/src/accounts/accounts.ts +0 -658
  502. package/src/accounts/env.test.ts +0 -95
  503. package/src/accounts/env.ts +0 -338
  504. package/src/accounts/secrets.ts +0 -50
  505. package/src/accounts/store.ts +0 -338
  506. package/src/capabilities/api.ts +0 -75
  507. package/src/capabilities/runSnapshot.ts +0 -59
  508. package/src/capabilities/types.ts +0 -34
  509. package/src/cli.ts +0 -118
  510. package/src/core/bus.ts +0 -34
  511. package/src/core/changes.ts +0 -33
  512. package/src/core/env.ts +0 -27
  513. package/src/core/errors.ts +0 -32
  514. package/src/core/frontmatter.ts +0 -47
  515. package/src/core/fs.test.ts +0 -38
  516. package/src/core/fs.ts +0 -92
  517. package/src/core/index.ts +0 -193
  518. package/src/core/path.test.ts +0 -14
  519. package/src/core/path.ts +0 -79
  520. package/src/core/projects.ts +0 -90
  521. package/src/core/text.ts +0 -39
  522. package/src/harness.ts +0 -312
  523. package/src/hub/catalog.json +0 -123
  524. package/src/hub/cli.ts +0 -59
  525. package/src/hub/hub.test.ts +0 -205
  526. package/src/hub/hub.ts +0 -256
  527. package/src/hub/schema.ts +0 -81
  528. package/src/index.ts +0 -75
  529. package/src/mcp/connections.ts +0 -614
  530. package/src/mcp/manager.ts +0 -130
  531. package/src/mcp/oauth.ts +0 -195
  532. package/src/mcp/scopeMigration.test.ts +0 -79
  533. package/src/mcp/scopeMigration.ts +0 -204
  534. package/src/mcp/service.test.ts +0 -376
  535. package/src/mcp/service.ts +0 -549
  536. package/src/mcp/types.ts +0 -108
  537. package/src/memory/api.test.ts +0 -82
  538. package/src/memory/api.ts +0 -303
  539. package/src/memory/blocks.test.ts +0 -78
  540. package/src/memory/blocks.ts +0 -408
  541. package/src/memory/caller.ts +0 -69
  542. package/src/memory/curation.test.ts +0 -163
  543. package/src/memory/curation.ts +0 -64
  544. package/src/memory/dispatch.ts +0 -59
  545. package/src/memory/facts.test.ts +0 -41
  546. package/src/memory/facts.ts +0 -248
  547. package/src/memory/graph.ts +0 -103
  548. package/src/memory/health.test.ts +0 -130
  549. package/src/memory/health.ts +0 -74
  550. package/src/memory/maintainer.ts +0 -272
  551. package/src/memory/maintenance.test.ts +0 -176
  552. package/src/memory/maintenance.ts +0 -518
  553. package/src/memory/migrate.ts +0 -79
  554. package/src/memory/operations.ts +0 -150
  555. package/src/memory/proposals.test.ts +0 -168
  556. package/src/memory/proposals.ts +0 -584
  557. package/src/memory/recall.test.ts +0 -115
  558. package/src/memory/recall.ts +0 -278
  559. package/src/memory/references.ts +0 -77
  560. package/src/memory/runContext.ts +0 -93
  561. package/src/memory/secrets.ts +0 -6
  562. package/src/memory/store.test.ts +0 -66
  563. package/src/memory/store.ts +0 -385
  564. package/src/memory/wiki.test.ts +0 -47
  565. package/src/memory/wiki.ts +0 -422
  566. package/src/memory/wikiIndex.test.ts +0 -88
  567. package/src/memory/wikiIndex.ts +0 -116
  568. package/src/plugins/api.ts +0 -181
  569. package/src/plugins/attachments.test.ts +0 -84
  570. package/src/plugins/attachments.ts +0 -141
  571. package/src/plugins/builtin.ts +0 -82
  572. package/src/plugins/catalogue.test.ts +0 -254
  573. package/src/plugins/catalogue.ts +0 -251
  574. package/src/plugins/cli.ts +0 -184
  575. package/src/plugins/discover.ts +0 -151
  576. package/src/plugins/firstParty.test.ts +0 -143
  577. package/src/plugins/firstParty.ts +0 -129
  578. package/src/plugins/hooks.test.ts +0 -250
  579. package/src/plugins/hooks.ts +0 -239
  580. package/src/plugins/identity.ts +0 -37
  581. package/src/plugins/install.test.ts +0 -107
  582. package/src/plugins/install.ts +0 -106
  583. package/src/plugins/inventory.ts +0 -123
  584. package/src/plugins/manifest.ts +0 -76
  585. package/src/plugins/plugins.test.ts +0 -205
  586. package/src/plugins/plugins.ts +0 -189
  587. package/src/plugins/proposal.ts +0 -121
  588. package/src/plugins/runtime.test.ts +0 -40
  589. package/src/plugins/runtime.ts +0 -82
  590. package/src/plugins/trust.ts +0 -142
  591. package/src/plugins/types.ts +0 -149
  592. package/src/prompt/compile.test.ts +0 -261
  593. package/src/prompt/compile.ts +0 -732
  594. package/src/server/methods.ts +0 -349
  595. package/src/server/remote.ts +0 -77
  596. package/src/server/rpc.ts +0 -116
  597. package/src/server/serve.ts +0 -28
  598. package/src/server/server.test.ts +0 -174
  599. package/src/sessions/approvals.ts +0 -118
  600. package/src/sessions/contracts.ts +0 -336
  601. package/src/sessions/conversation.test.ts +0 -177
  602. package/src/sessions/extensionSession.test.ts +0 -74
  603. package/src/sessions/extensionUi.test.ts +0 -65
  604. package/src/sessions/extensionUi.ts +0 -102
  605. package/src/sessions/history.ts +0 -51
  606. package/src/sessions/lineageJoin.ts +0 -75
  607. package/src/sessions/policy.ts +0 -36
  608. package/src/sessions/pricing.ts +0 -60
  609. package/src/sessions/questionBatches.test.ts +0 -110
  610. package/src/sessions/reasoningSummaries.ts +0 -59
  611. package/src/sessions/registry.ts +0 -381
  612. package/src/sessions/runIndex.ts +0 -99
  613. package/src/sessions/runStore.test.ts +0 -152
  614. package/src/sessions/runStore.ts +0 -332
  615. package/src/sessions/runner.ts +0 -604
  616. package/src/sessions/runtimeResources.test.ts +0 -61
  617. package/src/sessions/sessions.test.ts +0 -549
  618. package/src/sessions/sessions.ts +0 -339
  619. package/src/skills/registry.test.ts +0 -104
  620. package/src/skills/registry.ts +0 -413
  621. package/src/terminal/accountsMenu.test.ts +0 -225
  622. package/src/terminal/accountsMenu.ts +0 -382
  623. package/src/terminal/cli.ts +0 -149
  624. package/src/terminal/client.ts +0 -74
  625. package/src/terminal/control.test.ts +0 -23
  626. package/src/terminal/control.ts +0 -23
  627. package/src/terminal/controller.ts +0 -291
  628. package/src/terminal/hubMenu.ts +0 -24
  629. package/src/terminal/launch.test.ts +0 -25
  630. package/src/terminal/launch.ts +0 -48
  631. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  632. package/src/terminal/piExtension.ts +0 -259
  633. package/src/terminal/pluginControl.test.ts +0 -146
  634. package/src/terminal/pluginMenu.ts +0 -112
  635. package/src/terminal/socket.test.ts +0 -71
  636. package/src/terminal/socket.ts +0 -232
  637. package/src/terminal/standalone.test.ts +0 -167
  638. package/src/terminal/standalone.ts +0 -153
  639. package/src/terminal/terminal.test.ts +0 -399
  640. package/src/terminal/terminals.ts +0 -553
  641. package/src/terminal/tui/application.test.ts +0 -114
  642. package/src/terminal/tui/application.ts +0 -491
  643. package/src/terminal/tui/commands.test.ts +0 -218
  644. package/src/terminal/tui/commands.ts +0 -361
  645. package/src/terminal/tui/dialogs.ts +0 -301
  646. package/src/terminal/tui/editor.test.ts +0 -84
  647. package/src/terminal/tui/editor.ts +0 -79
  648. package/src/terminal/tui/keybindings.test.ts +0 -22
  649. package/src/terminal/tui/keybindings.ts +0 -50
  650. package/src/terminal/tui/piAdapter.ts +0 -62
  651. package/src/terminal/tui/presentation.test.ts +0 -79
  652. package/src/terminal/tui/questions.test.ts +0 -41
  653. package/src/terminal/tui/questions.ts +0 -47
  654. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  655. package/src/terminal/tui/runtime.test.ts +0 -215
  656. package/src/terminal/tui/runtime.ts +0 -388
  657. package/src/terminal/tui/sessionUi.ts +0 -24
  658. package/src/terminal/tui/settings.test.ts +0 -150
  659. package/src/terminal/tui/settings.ts +0 -188
  660. package/src/terminal/tui/status.test.ts +0 -70
  661. package/src/terminal/tui/status.ts +0 -109
  662. package/src/terminal/tui/theme.ts +0 -174
  663. package/src/terminal/tui/tools.test.ts +0 -145
  664. package/src/terminal/tui/tools.ts +0 -142
  665. package/src/terminal/tui/transcript.test.ts +0 -25
  666. package/src/terminal/tui/transcript.ts +0 -124
  667. package/src/terminal/tui/ui.test.ts +0 -313
  668. package/src/terminal/tui/ui.ts +0 -166
  669. package/src/terminal/tui/welcome.ts +0 -102
  670. package/src/tools/askUser.test.ts +0 -69
  671. package/src/tools/askUser.ts +0 -59
  672. package/src/tools/definitions.ts +0 -187
  673. package/src/tools/maintenance.ts +0 -24
  674. package/src/tools/memoryTools.ts +0 -22
  675. package/src/tools/pluginPropose.ts +0 -41
  676. package/src/tools/registryWrite.test.ts +0 -101
  677. package/src/tools/registryWrite.ts +0 -182
  678. package/src/tools/spawnSubagent.ts +0 -92
  679. package/src/tools/types.ts +0 -39
  680. package/src/web/safeRequest.ts +0 -171
  681. package/src/web/text.ts +0 -53
  682. package/src/web/tools.ts +0 -134
  683. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,70 @@
1
+ ---
2
+ id: ADR-0003
3
+ title: Shared asynchronous subagents with native-history delivery receipts
4
+ status: accepted
5
+ created: 2026-10-18
6
+ updated: 2026-10-18
7
+ supersedes: ADR-0002
8
+ ---
9
+ # ADR-0003 — Shared asynchronous subagents with native-history delivery receipts
10
+
11
+ ## Context and decision
12
+
13
+ The owner selected reliable delivery, asynchronous spawn/wait, and one SDK/terminal/App API after
14
+ studying OMP. They chose attached children joined before the parent finishes, async spawning by
15
+ default, availability for every interactive caller within its capability ceiling, and recovery
16
+ only when the user explicitly resumes. This supersedes the blocking tool contract in ADR-0002.
17
+
18
+ `harness.subagents` owns spawning, selective waits and results. SDK and terminal adapters register
19
+ live, frozen parent context with it; no model argument supplies caller, account or replacement
20
+ launch metadata. The terminal adapter uses its private control key. Children use normal Harness
21
+ sessions, isolated accounts, fresh history, existing gates and capability intersection. The old
22
+ `sessions.spawnSubagent` entry point forwards to the service for compatibility.
23
+
24
+ A parent reserves each child in `runs/<parent>/subagents.json` through the run store before startup.
25
+ A native branch owner marker is persisted before a real parent accepts spawns. Results are delivered
26
+ at turn boundaries or through explicit blocking tools. Native messages and tool results carry typed
27
+ receipts; only receipts on the selected branch acknowledge delivery. Constructing a delivery draft
28
+ never acknowledges it. Large batches acknowledge only the included children. The final settlement
29
+ hook joins children and injects remaining results; an adapter verification guard refuses successful
30
+ completion if persisted native history still lacks a result. The stable system prefix is unchanged.
31
+
32
+ On explicit resume, matching owner markers, caller/account/folder/native identity and run lineage
33
+ restore undelivered results. A startup reservation that never opened becomes an interrupted run.
34
+ Existing startup recovery interrupts orphaned active runs. Neither recovery path restarts model
35
+ work. Cancellation settles approvals and questions before waiting for SDK abort, preventing blocked
36
+ child interactions from deadlocking parent shutdown.
37
+
38
+ Interactive sessions enable the tools by default, `null` disables them, and explicit capability
39
+ sets can exclude them. Unattended callers remain off unless the host explicitly enables them.
40
+ Default nesting remains one, with a maximum of three. There is no new scheduler, reusable-worker
41
+ lifecycle, model routing, workspace isolation system, concurrency cap or family budget here.
42
+
43
+ ## Alternatives and consequences
44
+
45
+ A tool-owned launcher leaves terminal and SDK behavior divergent. An in-memory delivery flag loses
46
+ results across restart; searching prose for run IDs confuses mentions with delivery. Native-history
47
+ receipts identify persisted context without adding a second acknowledgement store. Run records
48
+ remain the outcome source of truth, while the parent file preserves startup reservations.
49
+
50
+ The App owns organization delegation and resolves native ancestry for thread routing, tools,
51
+ isolation and connections. Its existing work-budget accounting includes native descendants. Harness
52
+ learns no organizational role or application concept. Native completion records execution outcome;
53
+ it does not certify the child's findings or artifacts.
54
+
55
+ ## Evidence and limits
56
+
57
+ `subagentService.test.ts` covers selective waits, foreign handles, cancellation, bounded batches and
58
+ recovery windows. Real scripted Pi tests in `conversation.test.ts` cover async delivery, inline
59
+ receipts and interruption during a child question. `runtime.socket.test.ts` exercises the real
60
+ terminal socket, private controls, native execution and child decision routing. RPC and App host
61
+ regressions cover protocol shapes and ancestry. Tests use disposable storage without external
62
+ model requests. These changes shipped in `@xingular/harness` 2.0.0 (commit `44471bc`); release does not imply live-provider acceptance.
63
+
64
+ Verification on 2026-10-18: Harness typecheck, 455 tests (two skipped), unchanged golden fixtures,
65
+ build and standalone proof passed. App typecheck, layer/UI checks, sidecar build, 30 sidecar tests
66
+ and 217 Rust tests passed (one ignored). The renderer suite passed 491 tests and retained its
67
+ pre-existing `PendingRequestDock.test.ts` heading-text assertion failure. No live account or
68
+ user-data-root testing was performed.
69
+
70
+ Release verification on 2026-10-18: npm 10 clean install, typecheck, 515 tests (two skipped), build and standalone proof passed. GitHub CI passed on Ubuntu and macOS, and the npm publish workflow released version 2.0.0 with provenance. No live provider requests were made during release verification.
@@ -0,0 +1,50 @@
1
+ ---
2
+ id: ADR-0004
3
+ title: Fullscreen terminal layout with a fixed dock
4
+ status: superseded
5
+ created: 2026-10-18
6
+ updated: 2026-10-21
7
+ supersedes: none
8
+ superseded_by: ADR-0006
9
+ ---
10
+ # ADR-0004 — Fullscreen terminal layout with a fixed dock
11
+
12
+ ## Context and decision
13
+
14
+ The owned terminal drew its transcript and composer as one flowing list on the main screen. With a
15
+ short transcript the composer sat under the last line and moved down as the transcript grew. Harness
16
+ also kept its own scroll offset, mouse regions and paging, which duplicated the viewport Pi already
17
+ provides in fullscreen.
18
+
19
+ Harness now uses Pi's fullscreen renderer by default. The welcome and transcript form a scroll view
20
+ that fills the terminal; the dock (working line, queue and notices, widgets, editor and status band,
21
+ footer) sits fixed below it. Pi's `tuiMode`, `fullscreenScrollbar`, `fullscreenWheelScrollLines`,
22
+ `fullscreenCopyOnSelect` and `fullscreenExitOutput` settings are read from the account and honoured.
23
+ `tuiMode: "regular"` keeps the flowing layout on the main screen. When fullscreen ends with
24
+ `fullscreenExitOutput: "transcript"`, the rendered conversation is copied into the normal scrollback.
25
+
26
+ ## Consequences
27
+
28
+ - While fullscreen is running, the transcript is not in the terminal's scrollback. Mouse capture is
29
+ on, so terminal drag-selection gives way to the application's selection, which copies on release.
30
+ These are Pi's defaults and remain changeable in settings.
31
+ - Harness no longer owns scroll state, wheel handling or paging. Those come from Pi's viewport and its
32
+ `tui.altScreen.*` bindings, and the keyboard list shows the scroll keys only in fullscreen.
33
+ - Regular mode has no Harness-managed scroll position; scrolling there belongs to the terminal.
34
+ - When the screen is short, a long notice shows its first rows and scrolls for the rest. The prompt
35
+ and status are never clipped; the head of a notice stays readable, so the newest line of a long
36
+ list may need a scroll.
37
+ - Only `transcript` exit output is implemented. Other values write nothing on exit.
38
+
39
+ ## Alternatives considered
40
+
41
+ Padding the main-screen output to the terminal height also keeps the composer on the last rows for a
42
+ short transcript. It keeps native scrollback, but Harness would still own its scrolling and mouse
43
+ handling, and the composer would scroll away with the terminal's scrollback once the transcript
44
+ overflowed. That was rejected because it keeps the duplicated code this change removes.
45
+
46
+ ## Evidence
47
+
48
+ The layout is covered by `src/terminal/tui/screen.test.ts`: the dock stays on the last rows as the
49
+ transcript grows and scrolls, regular mode flows in order, and the exit copy is written with its styles
50
+ reset. The PTY verification of the built CLI is recorded in [the terminal reference](../terminal-tui.md).
@@ -0,0 +1,54 @@
1
+ ---
2
+ id: ADR-0005
3
+ title: Application-provided OAuth clients for connected apps
4
+ status: accepted
5
+ created: 2026-10-18
6
+ updated: 2026-10-18
7
+ supersedes: none
8
+ ---
9
+ # ADR-0005 — Application-provided OAuth clients for connected apps
10
+
11
+ ## Context and decision
12
+
13
+ Every remote connected app so far authenticated one of two ways: the server registers this app
14
+ dynamically (RFC 7591), or the person registers a client with the provider and pastes its ID and
15
+ secret into Connections. Google's Workspace MCP servers support neither in practice: they have no
16
+ dynamic registration, and requiring every person to create a Google Cloud project before connecting
17
+ Gmail is not a product.
18
+
19
+ A connection's `oauthClient` now has a third value, `app`: **the application supplies the client**.
20
+ The host does so through one extension point on the harness:
21
+
22
+ ```ts
23
+ export interface AppOAuthClients {
24
+ ids(): string[]
25
+ get(catalogId: string): Promise<{ clientId: string; clientSecret?: string } | null>
26
+ }
27
+ ```
28
+
29
+ `HarnessOptions.oauthClients` carries it. Only a connection whose `catalogId` appears in `ids()` can
30
+ use it — a hand-typed connection, a Hub connector recipe, and a plugin template cannot, because none
31
+ of them can name a client the application actually holds. `connections.appClients` reports the ids so
32
+ an application can offer only the connectors it can actually sign in for.
33
+
34
+ The client is resolved inside `Connections.oauthLoad` and placed in the OAuth state as
35
+ `staticClient`, exactly where a user-registered client goes. `oauthSave` already strips
36
+ `staticClient`, so the client is never written to `connections.json` or the secret store; it is
37
+ re-resolved on each load. Refresh tokens continue to be stored per connection.
38
+
39
+ ## Consequences
40
+
41
+ - The harness learns no product concept: it knows a catalog entry id, a client, and a sign-in. Which
42
+ entries an application can serve is entirely the host's answer.
43
+ - A build without a client is a first-class state, not an error: `ids()` is empty, `signIn` refuses
44
+ with "This connector has no app sign-in in this build", and the application hides those catalog
45
+ entries instead of offering a dead end.
46
+ - A client secret in a distributed desktop build is extractable, so it is treated as public. The real
47
+ controls stay Google's consent screen, the requested scopes, and the tool approval gate.
48
+ - One client can serve several catalog entries (five Google servers, one client). Each entry is still
49
+ its own connection with its own tokens, so signing in to one does not authorize another.
50
+ - The per-user path is untouched: `oauthClient: 'user'` still stores a person's own client in
51
+ Keychain, and it remains the only route for providers or accounts an application cannot pre-register
52
+ for.
53
+ - Google's Developer Preview terms, app verification and CASA assessment for restricted scopes are
54
+ outside this decision; they decide who can use the shipped client, not how it is delivered.
@@ -0,0 +1,47 @@
1
+ ---
2
+ id: ADR-0006
3
+ title: OpenTUI is the only terminal frontend
4
+ status: accepted
5
+ created: 2026-10-21
6
+ updated: 2026-10-21
7
+ supersedes: ADR-0004
8
+ ---
9
+ # ADR-0006 — OpenTUI is the only terminal frontend
10
+
11
+ ## Context and decision
12
+
13
+ Harness carried two terminal frontends: the owned Pi terminal and an OpenTUI/Solid frontend behind
14
+ `XINGULAR_HARNESS_TUI=opentui`. The split kept two launch paths, two input and rendering stacks, and
15
+ a fallback that let the terminal start without the OpenTUI build. The requested terminal is the
16
+ OpenTUI one, so the second frontend no longer earns its maintenance and test surface.
17
+
18
+ `Terminals.prepare()` now always returns Bun with `--conditions=browser` and
19
+ `dist/terminal-opentui.js`. The harness no longer reads `XINGULAR_HARNESS_TUI`, the CLI no longer
20
+ has the internal `terminal-frontend` command, and the legacy frontend modules are removed.
21
+ `TerminalAssets.openTui` is required. `XINGULAR_HARNESS_BUN` still selects the Bun executable.
22
+
23
+ Bun 1.3.14 or newer is required to build and run the terminal. `npm run build:tui` fails with a
24
+ clear error when Bun is unavailable instead of writing a placeholder or leaving the old frontend.
25
+ `HarnessOptions.piProgram` remains accepted for source compatibility but is ignored.
26
+
27
+ ## Consequences
28
+
29
+ - There is one launch path, one frontend test surface, and no silent fallback to a different UI.
30
+ - A machine that installs the package must have Bun; Node remains the runtime for the CLI, server,
31
+ accounts and Pi sessions.
32
+ - The OpenTUI page dialogs, composer, Bash mode and palette are the shipped presentation; the
33
+ fullscreen layout in ADR-0004 is history.
34
+ - Embedders that construct `TerminalAssets` themselves must provide `openTui`.
35
+
36
+ ## Alternatives considered
37
+
38
+ Keeping the legacy frontend as an unreachable fallback preserves dead code and two mental models
39
+ for input, rendering and exit behavior. Keeping OpenTUI opt-in preserves the split the change was
40
+ asked to remove. Both were rejected.
41
+
42
+ ## Evidence
43
+
44
+ Unit and integration tests construct launches and exercise the shared runtime without a real
45
+ provider request. A PTY probe of the standalone command with `XINGULAR_HARNESS_TUI` unset renders
46
+ the OpenTUI home and exits 0; the capture and build hashes are in
47
+ [the console evidence](../evidence/terminal-2026-10-20-console-tui/default-opentui-probe.json).
@@ -0,0 +1,33 @@
1
+ ---
2
+ id: ADR-0007
3
+ title: A fixed Reporting section shapes the final reply
4
+ status: superseded
5
+ created: 2026-10-21
6
+ updated: 2026-10-21
7
+ superseded_by: ADR-0008
8
+ ---
9
+ # ADR-0007 — A fixed Reporting section shapes the final reply
10
+
11
+ ## Context and decision
12
+
13
+ Nothing in the compiled prompt said how a run should end, so final replies buried the answer and
14
+ rarely listed files changed, blockers or unverified work. Other harnesses (opencode, omp, Claude
15
+ Code, Codex CLI, kimi-cli) keep final-answer rules in their fixed prompt text; the comparison is in
16
+ [PROP-0001](../architecture/proposals/PROP-0001-reporting-section.md).
17
+
18
+ The compiler now adds a harness-owned `reporting` section to every pack (`SECTION_ORDER.reporting`
19
+ 95, after `tools`; text `REPORTING_GUIDANCE` in `src/prompt/compile.ts`; budget 2,000, never cut,
20
+ never dynamic). It asks for the answer first, then only the parts with content — Files, Blocked,
21
+ Worth a look, Check by hand, Next steps — and Markdown tables where several items share fields. A
22
+ format the person, the application or the current mode asks for takes precedence.
23
+
24
+ ## Consequences
25
+
26
+ - Every session and every application gets the same reply shape without configuration.
27
+ - The stable prefix changes once; existing sessions miss the provider cache once after upgrade.
28
+ - The model writes the file list. A harness-built list from run events remains possible later.
29
+
30
+ ## Alternatives considered
31
+
32
+ Default tree text (old trees never get it, refinement could drop it); an application section
33
+ (every application repeats it, the terminal has none); doing nothing. All rejected.
@@ -0,0 +1,38 @@
1
+ ---
2
+ id: ADR-0008
3
+ title: Flexible reporting guidance with optional human inspection
4
+ status: accepted
5
+ created: 2026-10-21
6
+ updated: 2026-10-21
7
+ supersedes: ADR-0007
8
+ ---
9
+ # ADR-0008 — Flexible reporting guidance with optional human inspection
10
+
11
+ ## Context and decision
12
+
13
+ ADR-0007 added stable, harness-owned guidance for final replies, but its fixed heading list could
14
+ produce generic sections and did not clearly identify when a person must perform a check the agent
15
+ could not perform or observe. The user accepted [PROP-0004](../architecture/proposals/PROP-0004-flexible-reporting-guidance.md).
16
+
17
+ Keep the `reporting` section in the stable system prompt and lead with the outcome, but do not
18
+ require a fixed set of headings. Use only structure that helps explain the work. **Need human
19
+ inspection** is an optional heading for a concrete verification that requires a person because the
20
+ agent could not perform or observe it; state what remains unverified, why, and the specific check
21
+ to make. Do not use it for checks already performed or generic risks. Report only checks actually
22
+ run and their results.
23
+
24
+ ## Consequences
25
+
26
+ - Every session receives the same concise, flexible reporting guidance.
27
+ - The stable prefix changes once; existing sessions may miss the provider cache once after upgrade.
28
+ - No stored data or server protocol changes. Applications bundling the harness need a rebuild to
29
+ receive the updated prompt.
30
+ - Cache behavior is measured only with real application requests and the account owner's
31
+ permission, as required by INV-PRM-8.
32
+
33
+ ## Alternatives considered
34
+
35
+ - Keep the fixed headings: rejected because they can add generic structure and mislabel follow-up.
36
+ - Remove all guidance about unverified work: rejected because concrete human checks could be omitted.
37
+ - Make **Need human inspection** mandatory: rejected because most tasks do not require a person to
38
+ perform a check.
@@ -0,0 +1,38 @@
1
+ ---
2
+ id: ADR-0009
3
+ title: Publish the Harness CLI as xharness
4
+ status: accepted
5
+ created: 2026-10-22
6
+ updated: 2026-10-22
7
+ related: [PROP-0005]
8
+ supersedes: null
9
+ superseded_by: null
10
+ ---
11
+
12
+ # ADR-0009 — Publish the Harness CLI as xharness
13
+
14
+ ## Context and decision drivers
15
+
16
+ The published package used `xingular-harness` as its executable, while the desired short command is
17
+ `xharness`. The CLI already starts the Harness-owned OpenTUI terminal when invoked without a
18
+ subcommand, so the frontend and session runtime need no changes. The npm registry's latest release
19
+ is `3.0.0`; replacing the published executable is a breaking change.
20
+
21
+ ## Decision
22
+
23
+ Publish `@xingular/harness` `4.0.0` with one binary, `xharness`, mapped to `dist/cli.js`. Do not
24
+ ship `xingular-harness` as a compatibility alias. Keep the package name, `terminal` alias, host
25
+ subcommands, data/state directory names, and `XINGULAR_HARNESS_*` environment variables unchanged.
26
+
27
+ ## Consequences
28
+
29
+ - Users and scripts that invoke `xingular-harness` must migrate to `xharness`.
30
+ - Running `xharness` with no command opens the existing OpenTUI terminal.
31
+ - No account, data, or state migration is required.
32
+ - The release requires Node 22.19+ and Bun 1.3.14+ for the standalone terminal build/runtime.
33
+
34
+ ## Implementation and verification
35
+
36
+ - The `bin` mapping and CLI help are tested by [`src/cli.test.ts`](../../src/cli.test.ts).
37
+ - CI, the packed-tarball smoke test and the npm publication blocker are recorded in
38
+ [PROP-0005](../architecture/proposals/PROP-0005-xharness-cli-name.md).
@@ -0,0 +1,31 @@
1
+ ---
2
+ id: ADR-0010
3
+ title: Lessons from ordinary runs live in the Wiki, not in trees or the refinement library
4
+ status: accepted
5
+ created: 2026-10-22
6
+ updated: 2026-10-22
7
+ ---
8
+ # ADR-0010 — Lessons from ordinary runs live in the Wiki
9
+
10
+ ## Context and decision
11
+
12
+ [PROP-0008](../architecture/proposals/PROP-0008-lessons-from-runs.md) adds an opt-in reflection
13
+ after a finished run. The harness already has three places that hold what agents learn: the
14
+ harness tree (c3 memory, instructions), the refinement experience library (whole trees plus a
15
+ lesson, per scope and area), and the Wiki (reference notes).
16
+
17
+ Lessons from ordinary runs go to the Wiki, under `library/lessons/`, with refinement's lesson
18
+ shape (cue, lesson, evidence, confidence, or nothing).
19
+
20
+ - The tree changes only through refinement and a person's `adopt`. A lesson from one run is not
21
+ enough evidence to change instructions every later run receives.
22
+ - The refinement library stores whole trees keyed by task area; an ordinary run has neither.
23
+ - The Wiki is reference material by contract (INV-MEM-1): an agent reads a lesson when it searches,
24
+ and a person can read, edit or delete it like any note. A lesson that keeps proving itself is
25
+ evidence for a later refinement, which is where behaviour changes.
26
+
27
+ ## Consequences
28
+
29
+ - Lessons are visible and editable through every Wiki surface, versioned, and announced to hooks.
30
+ - They do not reach the stable prefix; only a count reaches the dynamic `wiki` pointer.
31
+ - The lesson shape is shared with refinement (`parseExperience`), so the two stay comparable.
@@ -0,0 +1,28 @@
1
+ ---
2
+ id: ADR-0011
3
+ title: The harness is a fixed foundation running a mutating variant
4
+ status: accepted
5
+ created: 2026-10-22
6
+ updated: 2026-10-22
7
+ ---
8
+ # ADR-0011 — The harness is a fixed foundation running a mutating variant
9
+
10
+ ## Context and decision
11
+
12
+ [PROP-0009](../architecture/proposals/PROP-0009-foundation-and-variants.md). The harness lets a
13
+ running host improve the harness itself, so two kinds of part must be told apart at all times: the
14
+ ones that never move during that improvement, and the ones that are meant to.
15
+
16
+ We call the first the **foundation** and the second a **variant**. A variant is one whole c1–c8
17
+ tree for one scope. The foundation decides what a variant may contain and how it runs; a variant
18
+ decides what the agent is told and may load. Refinement edits a copy of a variant, and only a
19
+ person's `adopt` makes it the head.
20
+
21
+ ## Consequences
22
+
23
+ - Specs, code, storage and the protocol use the two words (`variants/`, `variants.*`,
24
+ `VariantChoice`). `INV-FND-1` and `INV-FND-2` state the one-way rule.
25
+ - The same split names the prompt-level design in DESIGN-0001 (foundation text and the adapting
26
+ surface).
27
+ - Breaking release (5.0.0). Stored data is migrated on `open`.
28
+ - The improver prompts keep the Harness² paper's wording, so the method is unchanged.
@@ -0,0 +1,34 @@
1
+ ---
2
+ id: ADR-0012
3
+ title: Agents name their own native Pi sessions
4
+ status: accepted
5
+ created: 2026-10-22
6
+ updated: 2026-10-22
7
+ related: [PROP-0010]
8
+ ---
9
+
10
+ # ADR-0012: Agents name their own native Pi sessions
11
+
12
+ ## Context
13
+ The terminal already supports manual native Pi session names. The user requested agent
14
+ creation and revision, with a six-word limit and a name after the working metrics, in all
15
+ Harness execution paths. The user approved this implementation plan.
16
+
17
+ ## Decision
18
+ A shared foundation tool binds to the current native session and uses Pi session-info
19
+ history as the only writer and source of truth. The normal gate and capability selection
20
+ apply. Plan mode permits naming as session metadata maintenance. Fixed tool guidance asks
21
+ the agent to name work early and rename on objective changes; no changing name enters the
22
+ system prompt. The terminal refreshes through the existing native metadata event.
23
+
24
+ ## Alternatives
25
+ A separate model call adds latency and cost. Separate title storage duplicates native
26
+ metadata and requires synchronization. Manual-only names do not meet the requested behavior.
27
+
28
+ ## Consequences and evidence
29
+ No migration or new host RPC is needed. The agent chooses when to invoke the tool, so
30
+ actual naming frequency depends on model compliance. Manual names can be revised by the
31
+ agent. Tests in `src/tools/sessionName.test.ts`, `src/sessions/sessions.test.ts`, and the
32
+ terminal lifecycle, runtime, working-line and application tests cover the contract.
33
+ Implementation and verification status are tracked in
34
+ [PROP-0010](../architecture/proposals/PROP-0010-session-names.md).
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: ADR-0013
3
+ title: Evidence-based diagnostics with opt-in live probes
4
+ status: accepted
5
+ created: 2026-10-22
6
+ updated: 2026-10-22
7
+ ---
8
+
9
+ # ADR-0013 — Evidence-based diagnostics with opt-in live probes
10
+
11
+ ## Context and decision
12
+
13
+ [PROP-0011](../architecture/proposals/PROP-0011-doctor.md) records the user-approved plan.
14
+ A configured tool or locally available model is not evidence of a successful request.
15
+ `/doctor` therefore checks readiness offline and labels live verification separately.
16
+
17
+ The foundation owns bounded, cancellable diagnostic jobs and validated findings. Tool-provider
18
+ callbacks supply backend-specific evidence using the existing extension point. Live tool calls
19
+ use the production gate and current capabilities. One synthetic model request uses the selected
20
+ account's Pi runtime and records usage in a separate diagnostic run.
21
+
22
+ ## Consequences
23
+
24
+ Existing providers remain compatible. Unsupported checks are unverified, disabled capabilities
25
+ are disabled, and permission or isolation constraints are blocked. No diagnostic changes an
26
+ account, configuration or permission. Browser tests have a disposable profile and offline page;
27
+ computer input tests require a host-supplied disposable surface. No live tests run automatically.
@@ -0,0 +1,21 @@
1
+ ---
2
+ id: ADR-0014
3
+ title: A compiled public SDK and explicit 1.0.0 baseline
4
+ status: accepted
5
+ created: 2026-10-22
6
+ updated: 2026-10-22
7
+ ---
8
+
9
+ # ADR-0014 — A compiled public SDK and explicit 1.0.0 baseline
10
+
11
+ The user approved [PROP-0012](../architecture/proposals/PROP-0012-release-baseline.md) through the
12
+ release implementation plan. Keep @xingular/harness and xharness, use Apache-2.0 for original
13
+ code, publish compiled ESM/declarations, and preserve upstream notices and historical releases.
14
+
15
+ Generic isolated browser execution belongs in the foundation; App browser presentation, tab
16
+ sharing and OS/computer integration remain with the host. No application concept or object is
17
+ introduced into the Harness. Provider diagnostics continue through the existing tool surface.
18
+
19
+ The 1.0.0 baseline deliberately resets development numbering. The release pipeline publishes
20
+ one tested tarball with provenance and explicitly assigns latest. Registry and unrestricted CI
21
+ verification are mandatory; accepted design and local builds do not prove publication.
package/docs/doctor.md ADDED
@@ -0,0 +1,74 @@
1
+ # Doctor
2
+
3
+ Run `/doctor` in the Harness terminal. It opens a readiness report for the selected account/model,
4
+ enabled tools, MCP connections, plugins and skills, pinned variant, runtime and storage.
5
+
6
+ **Local is the default.** It inspects configuration, saved state and resource readability without
7
+ provider requests, token refreshes, browser launch, permission prompts or computer input. A local
8
+ pass does not establish live connectivity. Other accounts show their saved status and timestamp.
9
+ Providers without diagnostics report unverified. Disabled capabilities are not failures.
10
+
11
+ Press `l` to choose live checks, then review the account/model, destinations, possible charges and
12
+ isolation notice. The model check makes one synthetic request with at most 64 output tokens;
13
+ usage appears on a separate diagnostic run. Web checks fetch example.com and search for “example
14
+ domain”. MCP checks connect/list only. Browser checks use a disposable headless profile and an
15
+ offline synthetic page; configured CDP attachment is blocked. Computer input is blocked unless the
16
+ host supplies a disposable diagnostic surface; the current desktop host supplies readiness only.
17
+
18
+ `r` refreshes local readiness, `t` retries a selected local check, `c` cancels, and Escape closes
19
+ and cancels pending work. Completed findings survive cancellation. Every finding includes evidence
20
+ and, where useful, a next step. Doctor never signs in, switches accounts, installs, grants access,
21
+ or repairs settings. Findings and jobs are retained in memory until shutdown; live run records
22
+ and usage remain in normal Harness storage.
23
+
24
+ ## Embedding
25
+
26
+ ```ts
27
+ const job = harness.doctor.start({
28
+ context: { caller: {}, cwd, accountId, model: 'provider/model', tools: ['web_fetch'] }
29
+ })
30
+ const report = harness.doctor.read(job.id)
31
+ harness.doctor.cancel(job.id)
32
+ ```
33
+
34
+ Server hosts use `doctor.start`, `doctor.read`, and `doctor.cancel`. A host must obtain consent
35
+ before setting `mode: 'live'`, `checks`, and `confirmed: true`. Supply an exact variant version and
36
+ capability snapshot when reproducing a pinned run. Exported schemas validate reports.
37
+
38
+ Tool providers may attach `diagnostics(context)` returning `DoctorCheck[]`. Local callbacks must
39
+ be passive and network-free. Optional live callbacks declare a notice and receive an AbortSignal,
40
+ a separate real run, and a gated `call(tool, input)` helper. Honor cancellation; release owned
41
+ resources. Route all live tool execution through `call`. Each check has a stable unique ID and
42
+ lists the tools it covers. Existing providers need no changes and appear as unverified.
43
+
44
+ ## Working-tree verification — 2026-10-22
45
+
46
+ | Check | Result |
47
+ |---|---|
48
+ | Focused Harness service, protocol, control-key, gate, offline-account, browser-isolation and terminal tests | 69 passed across 7 files |
49
+ | App computer diagnostics and diagnostic report contract | 7 passed |
50
+ | Harness typecheck and build/standalone proof | Passed |
51
+ | App renderer typecheck and UI consistency | Passed; existing UI baseline remains |
52
+ | App Rust tests | 240 passed, 1 ignored |
53
+ | Full Harness suite | Could not complete successfully in this sandbox: terminal socket creation returns EPERM; other platform-dependent failures were also reported. The stalled full run was stopped after failures. |
54
+ | Full App renderer tests | 590 passed, 2 failed on existing Guide links/headings |
55
+ | Full App sidecar tests/typecheck | Blocked by older tree/HarnessChoice imports and contract expectations against the current variant API; diagnostic tests pass |
56
+ | App layer check | Rejects the in-progress Harness browser implementation, including backend diagnostic callbacks; ownership/specification drift is recorded as D-9 |
57
+
58
+ No live provider diagnostic or user browser/computer interaction was performed. Browser regression
59
+ tests use injected launchers. The proof uses isolated scripted fixtures. Changes remain uncommitted
60
+ alongside concurrent work; these results do not establish release readiness for the whole workspace.
61
+
62
+ ## Later 1.0.0 candidate preparation — 2026-10-22
63
+
64
+ The release preparation resolved the earlier App migration, Guide-link and browser-layer blockers:
65
+ the App's 592 renderer tests, 40 sidecar tests, typechecks and layer/UI checks pass. Rust has
66
+ 240 passing tests and one ignored test. A focused Harness run covering Doctor, browser diagnostics,
67
+ world tools, terminal command/page behavior and Hub has 100 passing tests. The compiled package's
68
+ SDK, TypeScript consumer, server and local Doctor smoke checks also pass using existing locked
69
+ dependencies. These later results supersede the earlier blocker descriptions for those checks.
70
+
71
+ Full Harness acceptance remains blocked locally by sandbox socket denial and HEIC encoder system
72
+ query denial; the complete suite is retained as a mandatory two-OS CI gate. Fresh network install,
73
+ registry availability and npm trusted-publisher configuration remain unverified. No tag or package
74
+ has been published during preparation. See the release procedure and external candidate report.
@@ -0,0 +1,81 @@
1
+ ---
2
+ id: EXP-0001
3
+ title: Harness terminal input latency
4
+ status: completed
5
+ created: 2026-10-20
6
+ updated: 2026-10-20
7
+ related: [ADR-0001]
8
+ ---
9
+
10
+ # EXP-0001 — Harness terminal input latency
11
+
12
+ ## Question and falsifiable hypothesis
13
+
14
+ Does replacing the serialized per-change draft queue with a single-flight latest-state publisher
15
+ reduce draft synchronization backlog while preserving the final dirty state, submit ordering, and
16
+ editor behavior?
17
+
18
+ The hypothesis is that, when draft replies are slower than incoming keys, the treatment will send
19
+ fewer than one control request per key and reduce queue drain time. Full TUI frame p95 should not
20
+ increase materially. The real local control socket is measured separately from the delayed stress
21
+ workload.
22
+
23
+ ## Baseline, treatment and controls
24
+
25
+ - **Baseline:** `TerminalApplication.syncDraft()` appends one socket request to a promise chain for
26
+ every editor change.
27
+ - **Treatment:** one in-flight request plus the latest pending dirty boolean. A pending value is
28
+ always sent after the in-flight request, including when it has the same boolean, because raw
29
+ terminal input can change controller state independently.
30
+ - **Fixed controls:** same working tree, Node/Vitest versions, 520-character input sequence, 4 ms
31
+ inter-key timer, synthetic 8 ms draft reply, 120 by 40 terminal dimensions, and test runtime.
32
+ The full-frame test calls `renderNow()` for each key and intercepts terminal writes.
33
+ - **Behavior controls:** focused application tests cover submit waiting for the empty-draft reply,
34
+ coalescing to the latest state, and existing editor callbacks; the controller test covers a
35
+ multiline raw-input/Ctrl+U correction and the send guard.
36
+
37
+ ## Data, sampling and protocol
38
+
39
+ Run `npm run profile:terminal-input`. It emits nearest-rank p50/p95 samples for editor input/render,
40
+ full TUI layout frames, and 120 real local draft-socket requests. Its application workload types
41
+ `abcdefghijklmnopqrstuvwxyz` 20 times, waits 4 ms between keys, and injects an 8 ms mock reply for
42
+ each draft update. `XINGULAR_PROFILE_TERMINAL_INPUT_RPC_DELAY_MS` changes that injected delay.
43
+ No model or provider request runs.
44
+
45
+ The full-frame profile measures Harness layout and diff computation up to `ProcessTerminal.write`;
46
+ the write itself is intercepted, and direct `renderNow()` bypasses the TUI's scheduled frame
47
+ throttle. It does not measure terminal-emulator paint or the user's slower computer.
48
+
49
+ ## Versions and environment
50
+
51
+ - Harness package: 3.0.0; Pi dependency: 1.2.0.
52
+ - Base commit: `24a9390` on `harness2`; profile and product changes were uncommitted in the shared
53
+ worktree during the runs.
54
+ - Runtime: Node v26.8.2, Vitest 4.1.11, macOS arm64, Apple M2, 8 CPU cores.
55
+ - No random seed is used; the input string and timing controls are fixed.
56
+ - Profile script SHA-256: `fdcc0d901aae87bbd3e72481471b22dd3d55d1d0d7685ffab4b0d5df0486b509`.
57
+
58
+ ## Metrics and success criteria
59
+
60
+ Primary metric: draft queue drain after the 520-key sequence. Secondary metrics: draft request
61
+ count, full-frame and combined input/frame p50/p95, and real local socket p50/p95. The change is
62
+ useful if it materially lowers queue drain and request count while keeping the final dirty state,
63
+ submit order and focused behavior tests passing. Frame p95 is checked for regressions, but one run
64
+ per variant is not enough to establish a statistically stable p95 difference.
65
+
66
+ ## Risks and stopping criteria
67
+
68
+ The injected reply delay is intentionally much slower than the measured local socket. The test can
69
+ show backlog behavior under slow replies, but it cannot establish that socket latency causes the
70
+ reported lag on a different computer. Stop optimization if the exact draft or send guard changes,
71
+ or if repeated slow-machine measurements show no meaningful queue or frame improvement.
72
+
73
+ ## Reproduction
74
+
75
+ From `Harness/`, run `npm run profile:terminal-input`. For the same synthetic stress profile on
76
+ another computer, use the same Node and dependency versions and leave the default delay unchanged.
77
+ Run the focused suite to verify behavior:
78
+
79
+ ```sh
80
+ npm test -- src/terminal/tui/application.test.ts src/terminal/tui/editor.test.ts src/terminal/terminal.test.ts
81
+ ```