@xingular/harness 0.1.7 → 1.1.1

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 (819) hide show
  1. package/CHANGELOG.md +125 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +239 -86
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +17853 -13114
  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/agents/builtin.d.ts +2 -0
  18. package/dist/sdk/agents/builtin.js +34 -0
  19. package/dist/sdk/agents/narrow.d.ts +13 -0
  20. package/dist/sdk/agents/narrow.js +29 -0
  21. package/dist/sdk/agents/profiles.d.ts +80 -0
  22. package/dist/sdk/agents/profiles.js +221 -0
  23. package/dist/sdk/annotations/bridge.d.ts +42 -0
  24. package/dist/sdk/annotations/bridge.js +264 -0
  25. package/dist/sdk/annotations/capture.d.ts +116 -0
  26. package/dist/sdk/annotations/capture.js +308 -0
  27. package/dist/sdk/annotations/delivery.d.ts +72 -0
  28. package/dist/sdk/annotations/delivery.js +130 -0
  29. package/dist/sdk/annotations/inspect.d.ts +10 -0
  30. package/dist/sdk/annotations/inspect.js +33 -0
  31. package/dist/sdk/annotations/isolated.d.ts +6 -0
  32. package/dist/sdk/annotations/isolated.js +51 -0
  33. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  34. package/dist/sdk/annotations/pageScript.js +570 -0
  35. package/dist/sdk/annotations/part.d.ts +10 -0
  36. package/dist/sdk/annotations/part.js +144 -0
  37. package/dist/sdk/annotations/queue.d.ts +4 -0
  38. package/dist/sdk/annotations/queue.js +40 -0
  39. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  40. package/dist/sdk/annotations/serverMethods.js +62 -0
  41. package/dist/sdk/annotations/store.d.ts +160 -0
  42. package/dist/sdk/annotations/store.js +386 -0
  43. package/dist/sdk/browser/config.d.ts +16 -0
  44. package/dist/sdk/browser/config.js +22 -0
  45. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  46. package/dist/sdk/browser/diagnostics.js +38 -0
  47. package/dist/sdk/browser/index.d.ts +28 -0
  48. package/dist/sdk/browser/index.js +72 -0
  49. package/dist/sdk/browser/network.d.ts +10 -0
  50. package/dist/sdk/browser/network.js +59 -0
  51. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  52. package/dist/sdk/browser/serverMethods.js +7 -0
  53. package/dist/sdk/browser/session.d.ts +85 -0
  54. package/dist/sdk/browser/session.js +228 -0
  55. package/dist/sdk/browser/tools.d.ts +8 -0
  56. package/dist/sdk/browser/tools.js +329 -0
  57. package/dist/sdk/capabilities/api.d.ts +22 -0
  58. package/dist/sdk/capabilities/api.js +54 -0
  59. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  60. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  61. package/dist/sdk/capabilities/types.d.ts +29 -0
  62. package/dist/sdk/capabilities/types.js +1 -0
  63. package/dist/sdk/cli.d.ts +2 -0
  64. package/dist/sdk/cli.js +150 -0
  65. package/dist/sdk/core/bus.d.ts +23 -0
  66. package/dist/sdk/core/bus.js +76 -0
  67. package/dist/sdk/core/caller.d.ts +22 -0
  68. package/dist/sdk/core/caller.js +16 -0
  69. package/dist/sdk/core/changes.d.ts +15 -0
  70. package/dist/sdk/core/changes.js +15 -0
  71. package/dist/sdk/core/effort.d.ts +2 -0
  72. package/dist/sdk/core/effort.js +1 -0
  73. package/dist/sdk/core/env.d.ts +18 -0
  74. package/dist/sdk/core/env.js +8 -0
  75. package/dist/sdk/core/errors.d.ts +15 -0
  76. package/dist/sdk/core/errors.js +24 -0
  77. package/dist/sdk/core/frontmatter.d.ts +12 -0
  78. package/dist/sdk/core/frontmatter.js +50 -0
  79. package/dist/sdk/core/fs.d.ts +18 -0
  80. package/dist/sdk/core/fs.js +106 -0
  81. package/dist/sdk/core/index.d.ts +24 -0
  82. package/dist/sdk/core/index.js +187 -0
  83. package/dist/sdk/core/path.d.ts +7 -0
  84. package/dist/sdk/core/path.js +79 -0
  85. package/dist/sdk/core/projects.d.ts +18 -0
  86. package/dist/sdk/core/projects.js +67 -0
  87. package/dist/sdk/core/secrets.d.ts +2 -0
  88. package/dist/sdk/core/secrets.js +5 -0
  89. package/dist/sdk/core/text.d.ts +7 -0
  90. package/dist/sdk/core/text.js +40 -0
  91. package/dist/sdk/doctor/checks.d.ts +5 -0
  92. package/dist/sdk/doctor/checks.js +208 -0
  93. package/dist/sdk/doctor/probe.d.ts +4 -0
  94. package/dist/sdk/doctor/probe.js +92 -0
  95. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  96. package/dist/sdk/doctor/serverMethods.js +8 -0
  97. package/dist/sdk/doctor/service.d.ts +23 -0
  98. package/dist/sdk/doctor/service.js +144 -0
  99. package/dist/sdk/doctor/types.d.ts +141 -0
  100. package/dist/sdk/doctor/types.js +29 -0
  101. package/dist/sdk/harness.d.ts +148 -0
  102. package/dist/sdk/harness.js +338 -0
  103. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  104. package/dist/sdk/history/lessonPrompt.js +15 -0
  105. package/dist/sdk/history/lessons.d.ts +52 -0
  106. package/dist/sdk/history/lessons.js +173 -0
  107. package/dist/sdk/history/recall.d.ts +68 -0
  108. package/dist/sdk/history/recall.js +199 -0
  109. package/dist/sdk/history/serverMethods.d.ts +3 -0
  110. package/dist/sdk/history/serverMethods.js +8 -0
  111. package/dist/sdk/history/trajectory.d.ts +7 -0
  112. package/dist/sdk/history/trajectory.js +216 -0
  113. package/dist/sdk/hub/catalog.json +123 -0
  114. package/dist/sdk/hub/cli.d.ts +7 -0
  115. package/dist/sdk/hub/cli.js +81 -0
  116. package/dist/sdk/hub/hub.d.ts +74 -0
  117. package/dist/sdk/hub/hub.js +474 -0
  118. package/dist/sdk/hub/schema.d.ts +280 -0
  119. package/dist/sdk/hub/schema.js +78 -0
  120. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  121. package/dist/sdk/hub/serverMethods.js +11 -0
  122. package/dist/sdk/index.d.ts +73 -0
  123. package/dist/sdk/index.js +55 -0
  124. package/dist/sdk/mcp/connections.d.ts +83 -0
  125. package/dist/sdk/mcp/connections.js +676 -0
  126. package/dist/sdk/mcp/manager.d.ts +26 -0
  127. package/dist/sdk/mcp/manager.js +124 -0
  128. package/dist/sdk/mcp/oauth.d.ts +35 -0
  129. package/dist/sdk/mcp/oauth.js +171 -0
  130. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  131. package/dist/sdk/mcp/scopeMigration.js +198 -0
  132. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  133. package/dist/sdk/mcp/serverMethods.js +22 -0
  134. package/dist/sdk/mcp/service.d.ts +160 -0
  135. package/dist/sdk/mcp/service.js +510 -0
  136. package/dist/sdk/mcp/types.d.ts +131 -0
  137. package/dist/sdk/mcp/types.js +49 -0
  138. package/dist/sdk/pi/runtime.d.ts +13 -0
  139. package/dist/sdk/pi/runtime.js +31 -0
  140. package/dist/sdk/plugins/api.d.ts +66 -0
  141. package/dist/sdk/plugins/api.js +155 -0
  142. package/dist/sdk/plugins/attachments.d.ts +46 -0
  143. package/dist/sdk/plugins/attachments.js +111 -0
  144. package/dist/sdk/plugins/builtin.d.ts +7 -0
  145. package/dist/sdk/plugins/builtin.js +163 -0
  146. package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
  147. package/dist/sdk/plugins/builtinRegistry.js +49 -0
  148. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  149. package/dist/sdk/plugins/catalogue.js +196 -0
  150. package/dist/sdk/plugins/cli.d.ts +13 -0
  151. package/dist/sdk/plugins/cli.js +188 -0
  152. package/dist/sdk/plugins/discover.d.ts +42 -0
  153. package/dist/sdk/plugins/discover.js +115 -0
  154. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  155. package/dist/sdk/plugins/firstParty.js +113 -0
  156. package/dist/sdk/plugins/hooks.d.ts +94 -0
  157. package/dist/sdk/plugins/hooks.js +162 -0
  158. package/dist/sdk/plugins/identity.d.ts +19 -0
  159. package/dist/sdk/plugins/identity.js +48 -0
  160. package/dist/sdk/plugins/install.d.ts +20 -0
  161. package/dist/sdk/plugins/install.js +110 -0
  162. package/dist/sdk/plugins/inventory.d.ts +22 -0
  163. package/dist/sdk/plugins/inventory.js +110 -0
  164. package/dist/sdk/plugins/manifest.d.ts +13 -0
  165. package/dist/sdk/plugins/manifest.js +56 -0
  166. package/dist/sdk/plugins/plugins.d.ts +104 -0
  167. package/dist/sdk/plugins/plugins.js +164 -0
  168. package/dist/sdk/plugins/runtime.d.ts +9 -0
  169. package/dist/sdk/plugins/runtime.js +95 -0
  170. package/dist/sdk/plugins/trust.d.ts +44 -0
  171. package/dist/sdk/plugins/trust.js +120 -0
  172. package/dist/sdk/plugins/types.d.ts +159 -0
  173. package/dist/sdk/plugins/types.js +7 -0
  174. package/dist/sdk/prompt/compile.d.ts +177 -0
  175. package/dist/sdk/prompt/compile.js +413 -0
  176. package/dist/sdk/refine/cli.d.ts +4 -0
  177. package/dist/sdk/refine/cli.js +186 -0
  178. package/dist/sdk/refine/demo.d.ts +21 -0
  179. package/dist/sdk/refine/demo.js +114 -0
  180. package/dist/sdk/refine/evidence.d.ts +55 -0
  181. package/dist/sdk/refine/evidence.js +330 -0
  182. package/dist/sdk/refine/host.d.ts +51 -0
  183. package/dist/sdk/refine/host.js +76 -0
  184. package/dist/sdk/refine/ledger.d.ts +48 -0
  185. package/dist/sdk/refine/ledger.js +76 -0
  186. package/dist/sdk/refine/library.d.ts +55 -0
  187. package/dist/sdk/refine/library.js +177 -0
  188. package/dist/sdk/refine/pi.d.ts +72 -0
  189. package/dist/sdk/refine/pi.js +248 -0
  190. package/dist/sdk/refine/prompts.d.ts +45 -0
  191. package/dist/sdk/refine/prompts.js +390 -0
  192. package/dist/sdk/refine/recursion.d.ts +113 -0
  193. package/dist/sdk/refine/recursion.js +258 -0
  194. package/dist/sdk/refine/runner.d.ts +81 -0
  195. package/dist/sdk/refine/runner.js +150 -0
  196. package/dist/sdk/refine/selection.d.ts +57 -0
  197. package/dist/sdk/refine/selection.js +251 -0
  198. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  199. package/dist/sdk/refine/serverMethods.js +20 -0
  200. package/dist/sdk/refine/service.d.ts +84 -0
  201. package/dist/sdk/refine/service.js +165 -0
  202. package/dist/sdk/refine/suite.d.ts +67 -0
  203. package/dist/sdk/refine/suite.js +174 -0
  204. package/dist/sdk/refine/trajectory.d.ts +9 -0
  205. package/dist/sdk/refine/trajectory.js +68 -0
  206. package/dist/sdk/refine/types.d.ts +77 -0
  207. package/dist/sdk/refine/types.js +10 -0
  208. package/dist/sdk/server/methods.d.ts +3 -0
  209. package/dist/sdk/server/methods.js +293 -0
  210. package/dist/sdk/server/params.d.ts +4 -0
  211. package/dist/sdk/server/params.js +11 -0
  212. package/dist/sdk/server/remote.d.ts +19 -0
  213. package/dist/sdk/server/remote.js +84 -0
  214. package/dist/sdk/server/rpc.d.ts +20 -0
  215. package/dist/sdk/server/rpc.js +102 -0
  216. package/dist/sdk/server/serve.d.ts +10 -0
  217. package/dist/sdk/server/serve.js +18 -0
  218. package/dist/sdk/sessions/approvals.d.ts +47 -0
  219. package/dist/sdk/sessions/approvals.js +119 -0
  220. package/dist/sdk/sessions/continuation.d.ts +48 -0
  221. package/dist/sdk/sessions/continuation.js +85 -0
  222. package/dist/sdk/sessions/contracts.d.ts +551 -0
  223. package/dist/sdk/sessions/contracts.js +338 -0
  224. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  225. package/dist/sdk/sessions/extensionUi.js +64 -0
  226. package/dist/sdk/sessions/history.d.ts +16 -0
  227. package/dist/sdk/sessions/history.js +68 -0
  228. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  229. package/dist/sdk/sessions/lineageJoin.js +61 -0
  230. package/dist/sdk/sessions/planMode.d.ts +39 -0
  231. package/dist/sdk/sessions/planMode.js +93 -0
  232. package/dist/sdk/sessions/policy.d.ts +43 -0
  233. package/dist/sdk/sessions/policy.js +1 -0
  234. package/dist/sdk/sessions/pricing.d.ts +34 -0
  235. package/dist/sdk/sessions/pricing.js +40 -0
  236. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  237. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  238. package/dist/sdk/sessions/registry.d.ts +103 -0
  239. package/dist/sdk/sessions/registry.js +386 -0
  240. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  241. package/dist/sdk/sessions/runIndex.js +65 -0
  242. package/dist/sdk/sessions/runStore.d.ts +66 -0
  243. package/dist/sdk/sessions/runStore.js +337 -0
  244. package/dist/sdk/sessions/runner.d.ts +213 -0
  245. package/dist/sdk/sessions/runner.js +589 -0
  246. package/dist/sdk/sessions/sessions.d.ts +152 -0
  247. package/dist/sdk/sessions/sessions.js +461 -0
  248. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  249. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  250. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  251. package/dist/sdk/sessions/sideQuestions.js +290 -0
  252. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  253. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  254. package/dist/sdk/sessions/subagentService.d.ts +52 -0
  255. package/dist/sdk/sessions/subagentService.js +265 -0
  256. package/dist/sdk/sessions/subagents.d.ts +58 -0
  257. package/dist/sdk/sessions/subagents.js +87 -0
  258. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  259. package/dist/sdk/terminal/accountsMenu.js +392 -0
  260. package/dist/sdk/terminal/browser.d.ts +62 -0
  261. package/dist/sdk/terminal/browser.js +41 -0
  262. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  263. package/dist/sdk/terminal/browserControl.js +186 -0
  264. package/dist/sdk/terminal/cli.d.ts +20 -0
  265. package/dist/sdk/terminal/cli.js +121 -0
  266. package/dist/sdk/terminal/client.d.ts +15 -0
  267. package/dist/sdk/terminal/client.js +126 -0
  268. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  269. package/dist/sdk/terminal/commandHelp.js +20 -0
  270. package/dist/sdk/terminal/control.d.ts +4 -0
  271. package/dist/sdk/terminal/control.js +25 -0
  272. package/dist/sdk/terminal/controller.d.ts +78 -0
  273. package/dist/sdk/terminal/controller.js +383 -0
  274. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  275. package/dist/sdk/terminal/hubMenu.js +34 -0
  276. package/dist/sdk/terminal/launch.d.ts +5 -0
  277. package/dist/sdk/terminal/launch.js +27 -0
  278. package/dist/sdk/terminal/logs.d.ts +14 -0
  279. package/dist/sdk/terminal/logs.js +59 -0
  280. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  281. package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
  282. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  283. package/dist/sdk/terminal/piExtension.js +377 -0
  284. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  285. package/dist/sdk/terminal/pluginMenu.js +101 -0
  286. package/dist/sdk/terminal/socket.d.ts +73 -0
  287. package/dist/sdk/terminal/socket.js +287 -0
  288. package/dist/sdk/terminal/standalone.d.ts +20 -0
  289. package/dist/sdk/terminal/standalone.js +186 -0
  290. package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
  291. package/dist/sdk/terminal/subagentMonitor.js +121 -0
  292. package/dist/sdk/terminal/terminals.d.ts +212 -0
  293. package/dist/sdk/terminal/terminals.js +1108 -0
  294. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  295. package/dist/sdk/terminal/trajectory.js +30 -0
  296. package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
  298. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  299. package/dist/sdk/terminal/tui/chrome.js +169 -0
  300. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  301. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  302. package/dist/sdk/terminal/tui/commandPages.d.ts +11 -0
  303. package/dist/sdk/terminal/tui/commandPages.js +111 -0
  304. package/dist/sdk/terminal/tui/commands.d.ts +46 -0
  305. package/dist/sdk/terminal/tui/commands.js +399 -0
  306. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  307. package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
  308. package/dist/sdk/terminal/tui/dialogs.d.ts +80 -0
  309. package/dist/sdk/terminal/tui/dialogs.js +370 -0
  310. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  311. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  312. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  313. package/dist/sdk/terminal/tui/list.js +196 -0
  314. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  315. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  316. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  317. package/dist/sdk/terminal/tui/modelPicker.js +150 -0
  318. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  319. package/dist/sdk/terminal/tui/mouse.js +3 -0
  320. package/dist/sdk/terminal/tui/page.d.ts +17 -0
  321. package/dist/sdk/terminal/tui/page.js +1 -0
  322. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  323. package/dist/sdk/terminal/tui/pageOverlay.js +156 -0
  324. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
  325. package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
  326. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  327. package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
  328. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
  329. package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
  330. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  331. package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
  332. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  333. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  334. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
  335. package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
  336. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  337. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  338. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  339. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  340. package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
  341. package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
  342. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  343. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  344. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  345. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  346. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
  347. package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
  348. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +23 -0
  349. package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
  350. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +65 -0
  351. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +450 -0
  352. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  353. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  354. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  355. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  356. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  357. package/dist/sdk/terminal/tui/planMode.js +2 -0
  358. package/dist/sdk/terminal/tui/pluginCommands.d.ts +14 -0
  359. package/dist/sdk/terminal/tui/pluginCommands.js +27 -0
  360. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  361. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  362. package/dist/sdk/terminal/tui/questions.d.ts +21 -0
  363. package/dist/sdk/terminal/tui/questions.js +42 -0
  364. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  365. package/dist/sdk/terminal/tui/runtime.js +443 -0
  366. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  367. package/dist/sdk/terminal/tui/search.js +60 -0
  368. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  369. package/dist/sdk/terminal/tui/selection.js +16 -0
  370. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  371. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  372. package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
  373. package/dist/sdk/terminal/tui/settingsModel.js +114 -0
  374. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  375. package/dist/sdk/terminal/tui/sideQuestion.js +230 -0
  376. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  377. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  378. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  379. package/dist/sdk/terminal/tui/status.js +67 -0
  380. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  381. package/dist/sdk/terminal/tui/theme.js +176 -0
  382. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  383. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  384. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  385. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  386. package/dist/sdk/terminal/tui/ui.d.ts +49 -0
  387. package/dist/sdk/terminal/tui/ui.js +149 -0
  388. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  389. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  390. package/dist/sdk/tools/askUser.d.ts +6 -0
  391. package/dist/sdk/tools/askUser.js +92 -0
  392. package/dist/sdk/tools/checklist.d.ts +9 -0
  393. package/dist/sdk/tools/checklist.js +54 -0
  394. package/dist/sdk/tools/definitions.d.ts +30 -0
  395. package/dist/sdk/tools/definitions.js +117 -0
  396. package/dist/sdk/tools/dispatch.d.ts +16 -0
  397. package/dist/sdk/tools/dispatch.js +67 -0
  398. package/dist/sdk/tools/harnessTools.d.ts +8 -0
  399. package/dist/sdk/tools/harnessTools.js +20 -0
  400. package/dist/sdk/tools/sessionName.d.ts +7 -0
  401. package/dist/sdk/tools/sessionName.js +31 -0
  402. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  403. package/dist/sdk/tools/spawnSubagent.js +58 -0
  404. package/dist/sdk/tools/types.d.ts +48 -0
  405. package/dist/sdk/tools/types.js +1 -0
  406. package/dist/sdk/variant/components.d.ts +34 -0
  407. package/dist/sdk/variant/components.js +230 -0
  408. package/dist/sdk/variant/materialise.d.ts +66 -0
  409. package/dist/sdk/variant/materialise.js +81 -0
  410. package/dist/sdk/variant/migrate.d.ts +4 -0
  411. package/dist/sdk/variant/migrate.js +41 -0
  412. package/dist/sdk/variant/seed.d.ts +20 -0
  413. package/dist/sdk/variant/seed.js +116 -0
  414. package/dist/sdk/variant/store.d.ts +82 -0
  415. package/dist/sdk/variant/store.js +151 -0
  416. package/dist/sdk/variant/surface.d.ts +56 -0
  417. package/dist/sdk/variant/surface.js +81 -0
  418. package/dist/sdk/variant/trust.d.ts +27 -0
  419. package/dist/sdk/variant/trust.js +64 -0
  420. package/dist/sdk/variant/variant.d.ts +71 -0
  421. package/dist/sdk/variant/variant.js +331 -0
  422. package/dist/sdk/web/markdown.d.ts +10 -0
  423. package/dist/sdk/web/markdown.js +66 -0
  424. package/dist/sdk/web/part.d.ts +10 -0
  425. package/dist/sdk/web/part.js +6 -0
  426. package/dist/sdk/web/safeRequest.d.ts +34 -0
  427. package/dist/sdk/web/safeRequest.js +175 -0
  428. package/dist/sdk/web/search.d.ts +53 -0
  429. package/dist/sdk/web/search.js +168 -0
  430. package/dist/sdk/web/serverMethods.d.ts +3 -0
  431. package/dist/sdk/web/serverMethods.js +7 -0
  432. package/dist/sdk/web/text.d.ts +2 -0
  433. package/dist/sdk/web/text.js +7 -0
  434. package/dist/sdk/web/tools.d.ts +22 -0
  435. package/dist/sdk/web/tools.js +195 -0
  436. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  437. package/dist/sdk/wiki/notes.d.ts +68 -0
  438. package/dist/sdk/wiki/notes.js +297 -0
  439. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  440. package/dist/sdk/wiki/serverMethods.js +26 -0
  441. package/dist/sdk/worktrees/cli.d.ts +11 -0
  442. package/dist/sdk/worktrees/cli.js +146 -0
  443. package/dist/sdk/worktrees/copy.d.ts +9 -0
  444. package/dist/sdk/worktrees/copy.js +111 -0
  445. package/dist/sdk/worktrees/git.d.ts +16 -0
  446. package/dist/sdk/worktrees/git.js +81 -0
  447. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  448. package/dist/sdk/worktrees/serverMethods.js +30 -0
  449. package/dist/sdk/worktrees/service.d.ts +73 -0
  450. package/dist/sdk/worktrees/service.js +483 -0
  451. package/dist/sdk/worktrees/setup.d.ts +23 -0
  452. package/dist/sdk/worktrees/setup.js +65 -0
  453. package/dist/sdk/worktrees/types.d.ts +91 -0
  454. package/dist/sdk/worktrees/types.js +1 -0
  455. package/dist/sdk/world/actions.d.ts +23 -0
  456. package/dist/sdk/world/actions.js +31 -0
  457. package/dist/sdk/world/cli.d.ts +12 -0
  458. package/dist/sdk/world/cli.js +166 -0
  459. package/dist/sdk/world/images.d.ts +20 -0
  460. package/dist/sdk/world/images.js +48 -0
  461. package/dist/sdk/world/untrusted.d.ts +12 -0
  462. package/dist/sdk/world/untrusted.js +20 -0
  463. package/dist/sdk/world/world.d.ts +67 -0
  464. package/dist/sdk/world/world.js +79 -0
  465. package/dist/terminal-opentui.js +20778 -0
  466. package/dist/terminal-pi.js +794 -518
  467. package/docs/README.md +42 -0
  468. package/docs/architecture/00-overview.md +171 -0
  469. package/docs/architecture/01-extension-points.md +78 -0
  470. package/docs/architecture/02-sessions-and-runs.md +203 -0
  471. package/docs/architecture/03-variants.md +103 -0
  472. package/docs/architecture/04-prompt.md +122 -0
  473. package/docs/architecture/05-refinement.md +107 -0
  474. package/docs/architecture/06-plugins-and-capabilities.md +129 -0
  475. package/docs/architecture/07-tools-and-gate.md +103 -0
  476. package/docs/architecture/08-memory-and-history.md +94 -0
  477. package/docs/architecture/09-accounts-and-connectors.md +98 -0
  478. package/docs/architecture/10-server-protocol.md +193 -0
  479. package/docs/architecture/11-terminal.md +261 -0
  480. package/docs/architecture/12-storage.md +75 -0
  481. package/docs/architecture/13-world-tools.md +45 -0
  482. package/docs/architecture/14-surfaces-and-parity.md +89 -0
  483. package/docs/architecture/README.md +125 -0
  484. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  485. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  486. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  487. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  488. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  489. package/docs/architecture/proposals/PROP-0006-run-checklist.md +70 -0
  490. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  491. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  492. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  493. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  494. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  495. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  496. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  497. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  498. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  499. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  500. package/docs/architecture/proposals/PROP-0017-page-annotations.md +127 -0
  501. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
  502. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  503. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  504. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  505. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  506. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  507. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  508. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  509. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
  510. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  511. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  512. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  513. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  514. package/docs/architecture/proposals/README.md +101 -0
  515. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  516. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  517. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  518. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  519. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  520. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  521. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  522. package/docs/decisions/ADR-0009-xharness-command.md +39 -0
  523. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  524. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  525. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  526. package/docs/decisions/ADR-0013-doctor.md +27 -0
  527. package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
  528. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  529. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  530. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  531. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  532. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  533. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  534. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  535. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  536. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  537. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  538. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  539. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  540. package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
  541. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  542. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  543. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  544. package/docs/doctor.md +80 -0
  545. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  546. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  547. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  548. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  549. package/docs/features/README.md +46 -0
  550. package/docs/features/automations/README.md +41 -0
  551. package/docs/features/cores/README.md +39 -0
  552. package/docs/features/google-harness2/README.md +52 -0
  553. package/docs/features/integrations/README.md +40 -0
  554. package/docs/features/interfaces/README.md +29 -0
  555. package/docs/features/memory/README.md +28 -0
  556. package/docs/future-work.md +48 -0
  557. package/docs/parity.md +78 -0
  558. package/docs/releases/1.0.0.md +40 -0
  559. package/docs/releases/4.0.0.md +46 -0
  560. package/docs/releases/README.md +41 -0
  561. package/docs/study/00-index.md +83 -0
  562. package/docs/study/arms/00-matrix.md +20 -0
  563. package/docs/study/arms/01-system-prompt.md +211 -0
  564. package/docs/study/arms/02-tools.md +79 -0
  565. package/docs/study/arms/03-subagents.md +90 -0
  566. package/docs/study/arms/04-skills.md +75 -0
  567. package/docs/study/arms/05-context-management.md +90 -0
  568. package/docs/study/arms/06-memory.md +90 -0
  569. package/docs/study/arms/07-governance.md +71 -0
  570. package/docs/study/arms/08-execution.md +69 -0
  571. package/docs/study/arms/09-observability.md +60 -0
  572. package/docs/study/arms/10-refinement.md +110 -0
  573. package/docs/study/autonomous-engineering-sources.md +277 -0
  574. package/docs/study/autonomy-sources.md +147 -0
  575. package/docs/study/btw-comparison.md +37 -0
  576. package/docs/study/feature-gap-review.md +42 -0
  577. package/docs/study/insights.md +123 -0
  578. package/docs/study/proactive-autonomy.md +408 -0
  579. package/docs/study/roadmap.md +72 -0
  580. package/docs/study/sources/claude-code.md +44 -0
  581. package/docs/study/sources/deepseek-harness.md +102 -0
  582. package/docs/study/sources/harness2.md +50 -0
  583. package/docs/study/sources/kimi-cli.md +42 -0
  584. package/docs/study/sources/omp.md +93 -0
  585. package/docs/study/sources/opencode.md +43 -0
  586. package/docs/study/sources/openhands.md +46 -0
  587. package/docs/study/sources/smolagents.md +40 -0
  588. package/docs/study/sources/swe-agent.md +34 -0
  589. package/docs/study/tui-resource-browser.md +78 -0
  590. package/docs/system-prompt-design.md +196 -0
  591. package/docs/terminal-tui.md +707 -58
  592. package/package.json +43 -13
  593. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  594. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  595. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  596. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  597. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  598. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  599. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  600. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  601. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  602. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  603. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  604. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  605. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  606. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  607. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  608. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  609. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  610. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  611. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  612. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  613. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  614. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  615. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  616. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  617. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  618. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  619. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  620. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  621. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  622. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  623. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  624. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  625. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  626. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  627. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  628. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  629. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  630. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  631. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  632. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  633. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  634. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  635. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  636. package/src/accounts/accounts.test.ts +0 -333
  637. package/src/accounts/accounts.ts +0 -658
  638. package/src/accounts/env.test.ts +0 -95
  639. package/src/accounts/env.ts +0 -338
  640. package/src/accounts/secrets.ts +0 -50
  641. package/src/accounts/store.ts +0 -338
  642. package/src/capabilities/api.ts +0 -75
  643. package/src/capabilities/runSnapshot.ts +0 -59
  644. package/src/capabilities/types.ts +0 -34
  645. package/src/cli.ts +0 -118
  646. package/src/core/bus.ts +0 -34
  647. package/src/core/changes.ts +0 -33
  648. package/src/core/env.ts +0 -27
  649. package/src/core/errors.ts +0 -32
  650. package/src/core/frontmatter.ts +0 -47
  651. package/src/core/fs.test.ts +0 -38
  652. package/src/core/fs.ts +0 -92
  653. package/src/core/index.ts +0 -193
  654. package/src/core/path.test.ts +0 -14
  655. package/src/core/path.ts +0 -79
  656. package/src/core/projects.ts +0 -90
  657. package/src/core/text.ts +0 -39
  658. package/src/harness.ts +0 -312
  659. package/src/hub/catalog.json +0 -123
  660. package/src/hub/cli.ts +0 -59
  661. package/src/hub/hub.test.ts +0 -205
  662. package/src/hub/hub.ts +0 -256
  663. package/src/hub/schema.ts +0 -81
  664. package/src/index.ts +0 -75
  665. package/src/mcp/connections.ts +0 -614
  666. package/src/mcp/manager.ts +0 -130
  667. package/src/mcp/oauth.ts +0 -195
  668. package/src/mcp/scopeMigration.test.ts +0 -79
  669. package/src/mcp/scopeMigration.ts +0 -204
  670. package/src/mcp/service.test.ts +0 -376
  671. package/src/mcp/service.ts +0 -549
  672. package/src/mcp/types.ts +0 -108
  673. package/src/memory/api.test.ts +0 -82
  674. package/src/memory/api.ts +0 -303
  675. package/src/memory/blocks.test.ts +0 -78
  676. package/src/memory/blocks.ts +0 -408
  677. package/src/memory/caller.ts +0 -69
  678. package/src/memory/curation.test.ts +0 -163
  679. package/src/memory/curation.ts +0 -64
  680. package/src/memory/dispatch.ts +0 -59
  681. package/src/memory/facts.test.ts +0 -41
  682. package/src/memory/facts.ts +0 -248
  683. package/src/memory/graph.ts +0 -103
  684. package/src/memory/health.test.ts +0 -130
  685. package/src/memory/health.ts +0 -74
  686. package/src/memory/maintainer.ts +0 -272
  687. package/src/memory/maintenance.test.ts +0 -176
  688. package/src/memory/maintenance.ts +0 -518
  689. package/src/memory/migrate.ts +0 -79
  690. package/src/memory/operations.ts +0 -150
  691. package/src/memory/proposals.test.ts +0 -168
  692. package/src/memory/proposals.ts +0 -584
  693. package/src/memory/recall.test.ts +0 -115
  694. package/src/memory/recall.ts +0 -278
  695. package/src/memory/references.ts +0 -77
  696. package/src/memory/runContext.ts +0 -93
  697. package/src/memory/secrets.ts +0 -6
  698. package/src/memory/store.test.ts +0 -66
  699. package/src/memory/store.ts +0 -385
  700. package/src/memory/wiki.test.ts +0 -47
  701. package/src/memory/wiki.ts +0 -422
  702. package/src/memory/wikiIndex.test.ts +0 -88
  703. package/src/memory/wikiIndex.ts +0 -116
  704. package/src/plugins/api.ts +0 -181
  705. package/src/plugins/attachments.test.ts +0 -84
  706. package/src/plugins/attachments.ts +0 -141
  707. package/src/plugins/builtin.ts +0 -82
  708. package/src/plugins/catalogue.test.ts +0 -254
  709. package/src/plugins/catalogue.ts +0 -251
  710. package/src/plugins/cli.ts +0 -184
  711. package/src/plugins/discover.ts +0 -151
  712. package/src/plugins/firstParty.test.ts +0 -143
  713. package/src/plugins/firstParty.ts +0 -129
  714. package/src/plugins/hooks.test.ts +0 -250
  715. package/src/plugins/hooks.ts +0 -239
  716. package/src/plugins/identity.ts +0 -37
  717. package/src/plugins/install.test.ts +0 -107
  718. package/src/plugins/install.ts +0 -106
  719. package/src/plugins/inventory.ts +0 -123
  720. package/src/plugins/manifest.ts +0 -76
  721. package/src/plugins/plugins.test.ts +0 -205
  722. package/src/plugins/plugins.ts +0 -189
  723. package/src/plugins/proposal.ts +0 -121
  724. package/src/plugins/runtime.test.ts +0 -40
  725. package/src/plugins/runtime.ts +0 -82
  726. package/src/plugins/trust.ts +0 -142
  727. package/src/plugins/types.ts +0 -149
  728. package/src/prompt/compile.test.ts +0 -261
  729. package/src/prompt/compile.ts +0 -732
  730. package/src/server/methods.ts +0 -349
  731. package/src/server/remote.ts +0 -77
  732. package/src/server/rpc.ts +0 -116
  733. package/src/server/serve.ts +0 -28
  734. package/src/server/server.test.ts +0 -174
  735. package/src/sessions/approvals.ts +0 -118
  736. package/src/sessions/contracts.ts +0 -336
  737. package/src/sessions/conversation.test.ts +0 -177
  738. package/src/sessions/extensionSession.test.ts +0 -74
  739. package/src/sessions/extensionUi.test.ts +0 -65
  740. package/src/sessions/extensionUi.ts +0 -102
  741. package/src/sessions/history.ts +0 -51
  742. package/src/sessions/lineageJoin.ts +0 -75
  743. package/src/sessions/policy.ts +0 -36
  744. package/src/sessions/pricing.ts +0 -60
  745. package/src/sessions/questionBatches.test.ts +0 -110
  746. package/src/sessions/reasoningSummaries.ts +0 -59
  747. package/src/sessions/registry.ts +0 -381
  748. package/src/sessions/runIndex.ts +0 -99
  749. package/src/sessions/runStore.test.ts +0 -152
  750. package/src/sessions/runStore.ts +0 -332
  751. package/src/sessions/runner.ts +0 -604
  752. package/src/sessions/runtimeResources.test.ts +0 -61
  753. package/src/sessions/sessions.test.ts +0 -549
  754. package/src/sessions/sessions.ts +0 -339
  755. package/src/skills/registry.test.ts +0 -104
  756. package/src/skills/registry.ts +0 -413
  757. package/src/terminal/accountsMenu.test.ts +0 -225
  758. package/src/terminal/accountsMenu.ts +0 -382
  759. package/src/terminal/cli.ts +0 -149
  760. package/src/terminal/client.ts +0 -74
  761. package/src/terminal/control.test.ts +0 -23
  762. package/src/terminal/control.ts +0 -23
  763. package/src/terminal/controller.ts +0 -291
  764. package/src/terminal/hubMenu.ts +0 -24
  765. package/src/terminal/launch.test.ts +0 -25
  766. package/src/terminal/launch.ts +0 -48
  767. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  768. package/src/terminal/piExtension.ts +0 -259
  769. package/src/terminal/pluginControl.test.ts +0 -146
  770. package/src/terminal/pluginMenu.ts +0 -112
  771. package/src/terminal/socket.test.ts +0 -71
  772. package/src/terminal/socket.ts +0 -232
  773. package/src/terminal/standalone.test.ts +0 -167
  774. package/src/terminal/standalone.ts +0 -153
  775. package/src/terminal/terminal.test.ts +0 -399
  776. package/src/terminal/terminals.ts +0 -553
  777. package/src/terminal/tui/application.test.ts +0 -114
  778. package/src/terminal/tui/application.ts +0 -491
  779. package/src/terminal/tui/commands.test.ts +0 -218
  780. package/src/terminal/tui/commands.ts +0 -361
  781. package/src/terminal/tui/dialogs.ts +0 -301
  782. package/src/terminal/tui/editor.test.ts +0 -84
  783. package/src/terminal/tui/editor.ts +0 -79
  784. package/src/terminal/tui/keybindings.test.ts +0 -22
  785. package/src/terminal/tui/keybindings.ts +0 -50
  786. package/src/terminal/tui/piAdapter.ts +0 -62
  787. package/src/terminal/tui/presentation.test.ts +0 -79
  788. package/src/terminal/tui/questions.test.ts +0 -41
  789. package/src/terminal/tui/questions.ts +0 -47
  790. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  791. package/src/terminal/tui/runtime.test.ts +0 -215
  792. package/src/terminal/tui/runtime.ts +0 -388
  793. package/src/terminal/tui/sessionUi.ts +0 -24
  794. package/src/terminal/tui/settings.test.ts +0 -150
  795. package/src/terminal/tui/settings.ts +0 -188
  796. package/src/terminal/tui/status.test.ts +0 -70
  797. package/src/terminal/tui/status.ts +0 -109
  798. package/src/terminal/tui/theme.ts +0 -174
  799. package/src/terminal/tui/tools.test.ts +0 -145
  800. package/src/terminal/tui/tools.ts +0 -142
  801. package/src/terminal/tui/transcript.test.ts +0 -25
  802. package/src/terminal/tui/transcript.ts +0 -124
  803. package/src/terminal/tui/ui.test.ts +0 -313
  804. package/src/terminal/tui/ui.ts +0 -166
  805. package/src/terminal/tui/welcome.ts +0 -102
  806. package/src/tools/askUser.test.ts +0 -69
  807. package/src/tools/askUser.ts +0 -59
  808. package/src/tools/definitions.ts +0 -187
  809. package/src/tools/maintenance.ts +0 -24
  810. package/src/tools/memoryTools.ts +0 -22
  811. package/src/tools/pluginPropose.ts +0 -41
  812. package/src/tools/registryWrite.test.ts +0 -101
  813. package/src/tools/registryWrite.ts +0 -182
  814. package/src/tools/spawnSubagent.ts +0 -92
  815. package/src/tools/types.ts +0 -39
  816. package/src/web/safeRequest.ts +0 -171
  817. package/src/web/text.ts +0 -53
  818. package/src/web/tools.ts +0 -134
  819. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,297 @@
1
+ // The Wiki: plain Markdown notes about projects, linked to each other. It is reference material
2
+ // a person and agents read and write; it is not what shapes an agent (that is the variant).
3
+ //
4
+ // <data>/wiki/home.md
5
+ // <data>/wiki/library/**.md notes that belong to no project
6
+ // <data>/wiki/projects/<slug>/**.md a project's notes
7
+ // <data>/wiki-history/<path>/<time>.md earlier versions, one file per save
8
+ //
9
+ // A note's path is its file path without `.md`. Links are `[[path]]`, `[[path|label]]`, or a
10
+ // Markdown link to a relative `.md` file.
11
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync } from 'node:fs';
12
+ import { dirname, join, relative, sep } from 'node:path';
13
+ import { noteChange } from "../core/changes.js";
14
+ import { HarnessError, invalid, notFound } from "../core/errors.js";
15
+ import * as frontmatter from "../core/frontmatter.js";
16
+ import { atomicWrite, now } from "../core/fs.js";
17
+ import { projectsOrNone } from "../core/projects.js";
18
+ import { looksSecret } from "../core/secrets.js";
19
+ /** Folders an earlier Wiki kept beside its pages. They are moved aside, never read as notes. */
20
+ export const LEGACY_FOLDERS = ['blocks', 'facts', 'raw', 'revisions', 'inbox', 'operations', 'trash'];
21
+ const MAX_NOTE = 400_000;
22
+ export function wikiDir(root) {
23
+ return join(root, 'wiki');
24
+ }
25
+ function historyDir(root) {
26
+ return join(root, 'wiki-history');
27
+ }
28
+ /** Accepts a note path such as `projects/app/decisions` or `library/glossary`. */
29
+ export function cleanPath(path) {
30
+ const clean = String(path ?? '').trim().replace(/\\/g, '/').replace(/^\/+|\/+$/g, '').replace(/\.md$/i, '');
31
+ const parts = clean.split('/');
32
+ if (!clean || parts.some((part) => !part || part === '.' || part === '..' || part.startsWith('.')))
33
+ throw invalid('A note path is a relative path such as projects/<slug>/<name>.');
34
+ if (parts.length === 1 && clean !== 'home')
35
+ throw invalid('A note lives under library/ or projects/<slug>/.');
36
+ if (parts.length > 1 && parts[0] !== 'library' && parts[0] !== 'projects')
37
+ throw invalid('A note lives under library/ or projects/<slug>/.');
38
+ if (parts[0] === 'projects' && parts.length < 3)
39
+ throw invalid('A project note is projects/<slug>/<name>.');
40
+ if (LEGACY_FOLDERS.includes(parts[0]))
41
+ throw invalid('That folder is not part of the Wiki.');
42
+ return clean;
43
+ }
44
+ function fileOf(root, path) {
45
+ return join(wikiDir(root), `${cleanPath(path)}.md`);
46
+ }
47
+ function projectOfPath(path) {
48
+ const parts = path.split('/');
49
+ return parts[0] === 'projects' ? parts[1] ?? null : null;
50
+ }
51
+ function titleOf(path, text) {
52
+ const parsed = safeParse(text);
53
+ const declared = parsed.front?.title;
54
+ if (typeof declared === 'string' && declared.trim())
55
+ return declared.trim();
56
+ const heading = /^#\s+(.+)$/m.exec(parsed.body)?.[1]?.trim();
57
+ return heading || path.split('/').pop().replace(/[-_]/g, ' ');
58
+ }
59
+ function safeParse(text) {
60
+ try {
61
+ const parsed = frontmatter.parse(text);
62
+ return parsed ? { front: parsed.front, body: parsed.body } : { front: null, body: text };
63
+ }
64
+ catch {
65
+ return { front: null, body: text };
66
+ }
67
+ }
68
+ function walk(dir, into) {
69
+ let names;
70
+ try {
71
+ names = readdirSync(dir);
72
+ }
73
+ catch {
74
+ return;
75
+ }
76
+ for (const name of names.sort()) {
77
+ if (name.startsWith('.'))
78
+ continue;
79
+ const path = join(dir, name);
80
+ let isDir = false;
81
+ try {
82
+ isDir = statSync(path).isDirectory();
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ if (isDir)
88
+ walk(path, into);
89
+ else if (name.endsWith('.md'))
90
+ into.push(path);
91
+ }
92
+ }
93
+ /** Every note path, Home first, then the Library, then projects. */
94
+ export function paths(root) {
95
+ const wiki = wikiDir(root);
96
+ const files = [];
97
+ if (existsSync(join(wiki, 'home.md')))
98
+ files.push(join(wiki, 'home.md'));
99
+ walk(join(wiki, 'library'), files);
100
+ walk(join(wiki, 'projects'), files);
101
+ return files.map((file) => relative(wiki, file).split(sep).join('/').replace(/\.md$/, ''));
102
+ }
103
+ function summary(root, path) {
104
+ const file = fileOf(root, path);
105
+ const text = readFileSync(file, 'utf8');
106
+ return { path, title: titleOf(path, text), project: projectOfPath(path), updatedAt: statSync(file).mtime.toISOString(), size: text.length };
107
+ }
108
+ export function list(root, options = {}) {
109
+ return paths(root)
110
+ .filter((path) => options.project === undefined || projectOfPath(path) === options.project)
111
+ .map((path) => summary(root, path));
112
+ }
113
+ const WIKI_LINK = /\[\[([^\]|#]+)(?:#[^\]|]*)?(?:\|[^\]]*)?\]\]/g;
114
+ const MD_LINK = /\[[^\]]*\]\(([^)\s]+\.md)(?:#[^)]*)?\)/g;
115
+ /** Resolves a link written in `from` to a note path, or null when it points nowhere known. */
116
+ export function resolveLink(target, from, known, titles) {
117
+ const raw = target.trim().replace(/\.md$/i, '');
118
+ if (!raw || /^[a-z]+:/i.test(raw))
119
+ return null;
120
+ const candidates = [raw.replace(/^\/+/, '')];
121
+ if (!raw.startsWith('/')) {
122
+ const base = from.split('/').slice(0, -1);
123
+ const parts = [...base];
124
+ for (const part of raw.split('/')) {
125
+ if (part === '..')
126
+ parts.pop();
127
+ else if (part && part !== '.')
128
+ parts.push(part);
129
+ }
130
+ candidates.unshift(parts.join('/'));
131
+ const project = projectOfPath(from);
132
+ if (project)
133
+ candidates.push(`projects/${project}/${raw}`);
134
+ candidates.push(`library/${raw}`);
135
+ }
136
+ for (const candidate of candidates)
137
+ if (known.has(candidate))
138
+ return candidate;
139
+ return titles.get(raw.toLowerCase()) ?? null;
140
+ }
141
+ function linksIn(body, from, known, titles) {
142
+ const out = new Set();
143
+ for (const match of body.matchAll(WIKI_LINK)) {
144
+ const found = resolveLink(match[1], from, known, titles);
145
+ if (found && found !== from)
146
+ out.add(found);
147
+ }
148
+ for (const match of body.matchAll(MD_LINK)) {
149
+ const found = resolveLink(match[1], from, known, titles);
150
+ if (found && found !== from)
151
+ out.add(found);
152
+ }
153
+ return [...out].sort();
154
+ }
155
+ /** Every note and every resolved link between notes. */
156
+ export function graph(root) {
157
+ const nodes = list(root);
158
+ const known = new Set(nodes.map((node) => node.path));
159
+ const titles = new Map(nodes.map((node) => [node.title.toLowerCase(), node.path]));
160
+ const edges = [];
161
+ for (const node of nodes) {
162
+ const body = readFileSync(fileOf(root, node.path), 'utf8');
163
+ for (const to of linksIn(body, node.path, known, titles))
164
+ edges.push({ from: node.path, to });
165
+ }
166
+ return { nodes, edges };
167
+ }
168
+ export function read(root, path) {
169
+ const clean = cleanPath(path);
170
+ const file = fileOf(root, clean);
171
+ if (!existsSync(file))
172
+ throw notFound(`The note ${clean}`);
173
+ const text = readFileSync(file, 'utf8');
174
+ const { nodes, edges } = graph(root);
175
+ const known = new Set(nodes.map((node) => node.path));
176
+ const titles = new Map(nodes.map((node) => [node.title.toLowerCase(), node.path]));
177
+ return {
178
+ ...summary(root, clean),
179
+ body: text,
180
+ links: linksIn(text, clean, known, titles),
181
+ backlinks: edges.filter((edge) => edge.to === clean).map((edge) => edge.from).sort()
182
+ };
183
+ }
184
+ /** Writes a note, keeping the earlier text as a version. Returns the note as saved. */
185
+ export function write(root, path, body, options = {}) {
186
+ const clean = cleanPath(path);
187
+ if (typeof body !== 'string')
188
+ throw invalid('A note needs text.');
189
+ if (body.length > MAX_NOTE)
190
+ throw invalid(`A note may hold at most ${MAX_NOTE.toLocaleString('en-US')} characters.`);
191
+ if (looksSecret(body))
192
+ throw new HarnessError('secret_refused', 'That text looks like it contains a credential, so it was not saved.');
193
+ const project = projectOfPath(clean);
194
+ if (project && !projectsOrNone(root).some((known) => known.slug === project))
195
+ throw invalid(`There is no project with the slug ${project}.`);
196
+ const file = fileOf(root, clean);
197
+ if (existsSync(file)) {
198
+ const current = statSync(file).mtime.toISOString();
199
+ if (options.expectedUpdatedAt && options.expectedUpdatedAt !== current)
200
+ throw new HarnessError('conflict', 'The note changed since it was opened. Reload it and try again.');
201
+ const previous = readFileSync(file, 'utf8');
202
+ if (previous === body)
203
+ return read(root, clean);
204
+ atomicWrite(join(historyDir(root), clean, `${now().replace(/[:.]/g, '-')}.md`), previous);
205
+ }
206
+ mkdirSync(dirname(file), { recursive: true });
207
+ atomicWrite(file, body);
208
+ noteChange({ wiki: wikiDir(root), id: clean, path: file, text: body, actor: options.actor ?? 'user', reason: options.reason ?? 'Saved' });
209
+ return read(root, clean);
210
+ }
211
+ /** Removes a note; its last text is kept as a version. */
212
+ export function remove(root, path) {
213
+ const clean = cleanPath(path);
214
+ const file = fileOf(root, clean);
215
+ if (!existsSync(file))
216
+ throw notFound(`The note ${clean}`);
217
+ atomicWrite(join(historyDir(root), clean, `${now().replace(/[:.]/g, '-')}.md`), readFileSync(file, 'utf8'));
218
+ rmSync(file);
219
+ }
220
+ export function versions(root, path) {
221
+ const dir = join(historyDir(root), cleanPath(path));
222
+ try {
223
+ return readdirSync(dir).filter((name) => name.endsWith('.md')).sort().reverse().map((name) => ({ id: name.replace(/\.md$/, ''), savedAt: statSync(join(dir, name)).mtime.toISOString() }));
224
+ }
225
+ catch {
226
+ return [];
227
+ }
228
+ }
229
+ export function version(root, path, id) {
230
+ if (!/^[0-9A-Za-z-]+$/.test(id))
231
+ throw invalid('Invalid version.');
232
+ const file = join(historyDir(root), cleanPath(path), `${id}.md`);
233
+ if (!existsSync(file))
234
+ throw notFound('That version');
235
+ return readFileSync(file, 'utf8');
236
+ }
237
+ /** Notes that contain the query's words, best first. The current project's notes rank higher. */
238
+ export function search(root, query, options = {}) {
239
+ const words = [...new Set(String(query ?? '').toLowerCase().split(/[^\p{L}\p{N}]+/u).filter((word) => word.length > 1))].slice(0, 16);
240
+ if (!words.length)
241
+ return [];
242
+ const hits = [];
243
+ for (const path of paths(root)) {
244
+ const text = readFileSync(fileOf(root, path), 'utf8');
245
+ const lower = text.toLowerCase();
246
+ const title = titleOf(path, text);
247
+ let score = 0;
248
+ for (const word of words) {
249
+ if (title.toLowerCase().includes(word))
250
+ score += 5;
251
+ if (path.toLowerCase().includes(word))
252
+ score += 2;
253
+ let at = lower.indexOf(word);
254
+ let count = 0;
255
+ while (at >= 0 && count < 20) {
256
+ count++;
257
+ at = lower.indexOf(word, at + word.length);
258
+ }
259
+ score += count;
260
+ }
261
+ if (!score)
262
+ continue;
263
+ const project = projectOfPath(path);
264
+ if (options.project && project === options.project)
265
+ score *= 1.5;
266
+ const first = Math.max(0, Math.min(...words.map((word) => lower.indexOf(word)).filter((at) => at >= 0)));
267
+ const excerpt = text.slice(Math.max(0, first - 80), first + 160).replace(/\s+/g, ' ').trim();
268
+ hits.push({ path, title, project, excerpt, score });
269
+ }
270
+ return hits.sort((a, b) => b.score - a.score || a.path.localeCompare(b.path)).slice(0, Math.min(Math.max(options.limit ?? 10, 1), 50));
271
+ }
272
+ /** Creates the Wiki's folders and Home note. Existing files are never replaced. */
273
+ export function ensureLayout(root, productName) {
274
+ const wiki = wikiDir(root);
275
+ mkdirSync(join(wiki, 'library'), { recursive: true });
276
+ mkdirSync(join(wiki, 'projects'), { recursive: true });
277
+ if (!existsSync(join(wiki, 'home.md')))
278
+ atomicWrite(join(wiki, 'home.md'), `# Home\n\nNotes about your projects for ${productName}. Link notes with [[library/name]] or [[projects/<slug>/name]].\n`);
279
+ for (const project of projectsOrNone(root))
280
+ mkdirSync(join(wiki, 'projects', project.slug), { recursive: true });
281
+ }
282
+ /**
283
+ * Moves what an earlier Wiki kept beside its notes (memory blocks, facts, sources, revisions,
284
+ * the Inbox) to `<data>/legacy/wiki-<time>/`, once. Nothing is deleted. Returns where it went.
285
+ */
286
+ export function moveLegacy(root) {
287
+ const wiki = wikiDir(root);
288
+ const found = LEGACY_FOLDERS.filter((name) => existsSync(join(wiki, name)));
289
+ const loose = ['index.md', 'log.md', 'schema.md'].filter((name) => existsSync(join(wiki, name)));
290
+ if (!found.length && !loose.length)
291
+ return null;
292
+ const dest = join(root, 'legacy', `wiki-${now().replace(/[:.]/g, '-')}`);
293
+ mkdirSync(dest, { recursive: true });
294
+ for (const name of [...found, ...loose])
295
+ renameSync(join(wiki, name), join(dest, name));
296
+ return dest;
297
+ }
@@ -0,0 +1,3 @@
1
+ import type { Harness } from "../harness.js";
2
+ import type { Handler } from "../server/rpc.js";
3
+ export declare function wikiServerMethods(harness: Harness): Record<string, Handler>;
@@ -0,0 +1,26 @@
1
+ import { optional, text } from "../server/params.js";
2
+ import * as notes from "./notes.js";
3
+ export function wikiServerMethods(harness) {
4
+ const root = () => harness.env.root;
5
+ return {
6
+ 'wiki.list': (params) => notes.list(root(), params.project === undefined ? {} : { project: optional(params, 'project') }),
7
+ 'wiki.read': (params) => notes.read(root(), text(params, 'path')),
8
+ 'wiki.write': (params) => {
9
+ const note = notes.write(root(), text(params, 'path'), typeof params.text === 'string' ? params.text : '', { expectedUpdatedAt: optional(params, 'expectedUpdatedAt') });
10
+ harness.bus.emit({ type: 'wiki.changed' });
11
+ return note;
12
+ },
13
+ 'wiki.remove': (params) => {
14
+ notes.remove(root(), text(params, 'path'));
15
+ harness.bus.emit({ type: 'wiki.changed' });
16
+ },
17
+ 'wiki.search': (params) => notes.search(root(), typeof params.query === 'string' ? params.query : '', { project: optional(params, 'project'), limit: typeof params.limit === 'number' ? params.limit : undefined }),
18
+ 'wiki.graph': () => notes.graph(root()),
19
+ 'wiki.versions': (params) => notes.versions(root(), text(params, 'path')),
20
+ 'wiki.version': (params) => notes.version(root(), text(params, 'path'), text(params, 'id')),
21
+ 'wiki.ensureProject': () => {
22
+ notes.ensureLayout(root(), harness.env.productName);
23
+ harness.bus.emit({ type: 'wiki.changed' });
24
+ }
25
+ };
26
+ }
@@ -0,0 +1,11 @@
1
+ import { Worktrees } from "./service.js";
2
+ import type { WorktreeRecord } from "./types.js";
3
+ export declare const WORKTREE_USAGE = "Usage: xagent worktree <command> [--state <dir>]\n\n list Worktrees of the repository you are in\n new [name] [--branch <b>] [--permanent] [--from <ref>] [--no-carry]\n Make a worktree (default: managed, detached, with your\n uncommitted changes carried over)\n status <name|id> Changes and commits since it started\n branch <name|id> <branch> Give a detached worktree a branch\n handoff <name|id> to-main|to-worktree [--copy]\n Move changes between it and your main checkout\n (--copy leaves the origin as it was)\n rm <name|id> [--force] Remove it; with --force, keep a snapshot of unsaved work\n restore <name|id> Bring back a removed worktree, with its snapshot\n prune [--keep <n>] Keep the most recent managed worktrees (default 15)\n adopt <path> Manage an existing linked worktree\n trust-setup Trust this repository's .xharness/worktree-setup as it is now\n path <name|id> Print its folder (cd \"$(xagent worktree path name)\")\n\nStart the terminal in a new managed worktree with: xagent --worktree [name]\n";
4
+ interface Dependencies {
5
+ home?: string;
6
+ cwd?: string;
7
+ write?: (text: string) => void;
8
+ }
9
+ export declare function findWorktree(worktrees: Worktrees, cwd: string, key: string, removed?: boolean): Promise<WorktreeRecord>;
10
+ export declare function runWorktreeCli(argv: string[], dependencies?: Dependencies): Promise<number>;
11
+ export {};
@@ -0,0 +1,146 @@
1
+ // `xagent worktree`: managed worktrees of the repository you are in, from a shell.
2
+ import { homedir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ import { Worktrees } from "./service.js";
5
+ export const WORKTREE_USAGE = `Usage: xagent worktree <command> [--state <dir>]
6
+
7
+ list Worktrees of the repository you are in
8
+ new [name] [--branch <b>] [--permanent] [--from <ref>] [--no-carry]
9
+ Make a worktree (default: managed, detached, with your
10
+ uncommitted changes carried over)
11
+ status <name|id> Changes and commits since it started
12
+ branch <name|id> <branch> Give a detached worktree a branch
13
+ handoff <name|id> to-main|to-worktree [--copy]
14
+ Move changes between it and your main checkout
15
+ (--copy leaves the origin as it was)
16
+ rm <name|id> [--force] Remove it; with --force, keep a snapshot of unsaved work
17
+ restore <name|id> Bring back a removed worktree, with its snapshot
18
+ prune [--keep <n>] Keep the most recent managed worktrees (default 15)
19
+ adopt <path> Manage an existing linked worktree
20
+ trust-setup Trust this repository's .xharness/worktree-setup as it is now
21
+ path <name|id> Print its folder (cd "$(xagent worktree path name)")
22
+
23
+ Start the terminal in a new managed worktree with: xagent --worktree [name]
24
+ `;
25
+ function describe(record) {
26
+ const state = record.branch ?? 'detached';
27
+ const lease = record.lease ? ' · in use' : '';
28
+ return `${record.name.padEnd(20)} ${record.kind.padEnd(9)} ${state.padEnd(24)} ${record.path}${lease}`;
29
+ }
30
+ export async function findWorktree(worktrees, cwd, key, removed = false) {
31
+ const repo = await worktrees.repositoryOf(cwd);
32
+ const pool = removed ? worktrees.removed(repo) : await worktrees.list(repo);
33
+ const match = pool.find((record) => record.id === key || record.name === key);
34
+ if (!match)
35
+ throw new Error(`No ${removed ? 'removed ' : ''}worktree named ${key} in this repository.`);
36
+ return match;
37
+ }
38
+ export async function runWorktreeCli(argv, dependencies = {}) {
39
+ const write = dependencies.write ?? ((text) => void process.stdout.write(text));
40
+ const cwd = resolve(dependencies.cwd ?? process.cwd());
41
+ const args = [];
42
+ let stateDir = join(dependencies.home ?? homedir(), '.xingular-harness', 'state');
43
+ for (let index = 0; index < argv.length; index += 1) {
44
+ if (argv[index] === '--state')
45
+ stateDir = resolve(argv[++index] ?? stateDir);
46
+ else
47
+ args.push(argv[index]);
48
+ }
49
+ const [command, ...rest] = args;
50
+ const flag = (name) => rest.includes(name);
51
+ const value = (name) => {
52
+ const index = rest.indexOf(name);
53
+ return index >= 0 ? rest[index + 1] : undefined;
54
+ };
55
+ const positional = rest.filter((item, index) => !item.startsWith('--') && !(index > 0 && ['--branch', '--from', '--keep'].includes(rest[index - 1])));
56
+ const worktrees = new Worktrees(stateDir);
57
+ switch (command) {
58
+ case 'list': {
59
+ const records = await worktrees.list(cwd);
60
+ write(records.length ? `${records.map(describe).join('\n')}\n` : 'No worktrees for this repository.\n');
61
+ return 0;
62
+ }
63
+ case 'new': {
64
+ const result = await worktrees.create({
65
+ repo: cwd,
66
+ ...(positional[0] ? { name: positional[0] } : {}),
67
+ ...(value('--branch') ? { branch: value('--branch') } : {}),
68
+ ...(value('--from') ? { baseRef: value('--from') } : {}),
69
+ kind: flag('--permanent') ? 'permanent' : 'managed',
70
+ ...(flag('--no-carry') ? { carryChanges: false } : {})
71
+ });
72
+ write(`${describe(result.worktree)}\n`);
73
+ if (result.carried.copied.length || result.carried.patched)
74
+ write(`Carried your uncommitted changes${result.carried.copied.length ? ` and ${result.carried.copied.length} untracked file(s)` : ''}.\n`);
75
+ if (result.included.copied.length)
76
+ write(`Copied ${result.included.copied.length} file(s) named in .worktreeinclude.\n`);
77
+ if (result.setup.state === 'untrusted')
78
+ write('The repository has a setup script you have not trusted. Read .xharness/worktree-setup, then run: xagent worktree trust-setup\n');
79
+ if (result.setup.state === 'failed')
80
+ write(`The setup script failed; see ${result.setup.log}.\n`);
81
+ return 0;
82
+ }
83
+ case 'status': {
84
+ const status = await worktrees.status((await findWorktree(worktrees, cwd, positional[0] ?? '')).id);
85
+ write(`${describe(status.record)}\n${status.changes} changed path(s), ${status.ahead} commit(s) since it started.\n`);
86
+ return 0;
87
+ }
88
+ case 'branch': {
89
+ const record = await worktrees.branch((await findWorktree(worktrees, cwd, positional[0] ?? '')).id, positional[1] ?? '');
90
+ write(`${describe(record)}\n`);
91
+ return 0;
92
+ }
93
+ case 'handoff': {
94
+ const direction = positional[1] === 'to-main' ? 'toSource' : positional[1] === 'to-worktree' ? 'toWorktree' : null;
95
+ if (!direction) {
96
+ write(WORKTREE_USAGE);
97
+ return 2;
98
+ }
99
+ const result = await worktrees.handoff((await findWorktree(worktrees, cwd, positional[0] ?? '')).id, direction, { move: !flag('--copy') });
100
+ write(result.patched || result.copied.length ? `Handed off${result.copied.length ? ` (and ${result.copied.length} untracked file(s))` : ''}.${result.stash ? ` The origin's copy is kept in git stash ${result.stash.slice(0, 12)}.` : ''}\n` : 'Nothing to hand off.\n');
101
+ return 0;
102
+ }
103
+ case 'rm': {
104
+ const { worktree, snapshot } = await worktrees.remove((await findWorktree(worktrees, cwd, positional[0] ?? '')).id, { force: flag('--force') });
105
+ write(`Removed ${worktree.name}.${snapshot ? ` Its unsaved work is kept; xagent worktree restore ${worktree.name} brings it back.` : ''}\n`);
106
+ return 0;
107
+ }
108
+ case 'restore': {
109
+ const record = await worktrees.restore((await findWorktree(worktrees, cwd, positional[0] ?? '', true)).id);
110
+ write(`${describe(record)}\n`);
111
+ return 0;
112
+ }
113
+ case 'prune': {
114
+ const keep = value('--keep') ? Number(value('--keep')) : undefined;
115
+ const result = await worktrees.prune({ repo: cwd, ...(keep !== undefined && Number.isFinite(keep) ? { keep } : {}) });
116
+ write(`Removed ${result.removed.length} worktree(s)${result.removed.some((entry) => entry.snapshot) ? ', keeping snapshots of unsaved work' : ''}.\n`);
117
+ for (const failure of result.failed)
118
+ write(`Could not remove ${failure.id}: ${failure.error}\n`);
119
+ return result.failed.length ? 1 : 0;
120
+ }
121
+ case 'adopt': {
122
+ const record = await worktrees.adopt(resolve(cwd, positional[0] ?? ''));
123
+ write(`${describe(record)}\n`);
124
+ return 0;
125
+ }
126
+ case 'trust-setup': {
127
+ const { setupScript } = await import("./setup.js");
128
+ const repo = await worktrees.repositoryOf(cwd);
129
+ const script = setupScript(repo);
130
+ if (!script) {
131
+ write('This repository has no .xharness/worktree-setup.\n');
132
+ return 1;
133
+ }
134
+ await worktrees.trustSetup(repo, script.hash);
135
+ write(`Trusted the setup script (sha256 ${script.hash.slice(0, 12)}…). A changed script asks again.\n`);
136
+ return 0;
137
+ }
138
+ case 'path': {
139
+ write(`${(await findWorktree(worktrees, cwd, positional[0] ?? '')).path}\n`);
140
+ return 0;
141
+ }
142
+ default:
143
+ write(WORKTREE_USAGE);
144
+ return command && command !== 'help' ? 2 : 0;
145
+ }
146
+ }
@@ -0,0 +1,9 @@
1
+ import type { CopyReport } from "./types.js";
2
+ export declare const INCLUDE_FILE = ".worktreeinclude";
3
+ export declare function copyFiles(from: string, to: string, paths: readonly string[]): CopyReport;
4
+ /** Untracked files that are not ignored: new work a person has not added yet. */
5
+ export declare function untrackedFiles(checkout: string): Promise<string[]>;
6
+ /** All ignored user files that must be bounded and captured before a worktree is removed. */
7
+ export declare function ignoredFiles(checkout: string): Promise<string[]>;
8
+ /** Ignored files that match `.worktreeinclude`, matched by git itself. */
9
+ export declare function includedFiles(checkout: string): Promise<string[]>;
@@ -0,0 +1,111 @@
1
+ // Copies files git does not track into a worktree: untracked work carried from the source, and the
2
+ // ignored files `.worktreeinclude` names (local settings, `.env`). A file is never overwritten, a
3
+ // symlink is never followed, and sizes are capped.
4
+ import { copyFileSync, existsSync, lstatSync, mkdirSync } from 'node:fs';
5
+ import { dirname, join } from 'node:path';
6
+ import { HarnessError } from "../core/errors.js";
7
+ import { safeRelative } from "../core/fs.js";
8
+ import { git, nulList } from "./git.js";
9
+ export const INCLUDE_FILE = '.worktreeinclude';
10
+ const FILE_CAP = 5 * 1024 * 1024;
11
+ const TOTAL_CAP = 100 * 1024 * 1024;
12
+ const IGNORED_FILE_COUNT_CAP = 10_000;
13
+ const IGNORED_PATH_BYTES_CAP = 1024 * 1024;
14
+ export function copyFiles(from, to, paths) {
15
+ const report = { copied: [], skipped: [] };
16
+ let total = 0;
17
+ for (const path of paths) {
18
+ let relative;
19
+ try {
20
+ relative = safeRelative(path);
21
+ }
22
+ catch {
23
+ continue;
24
+ }
25
+ const source = join(from, relative);
26
+ const target = join(to, relative);
27
+ if (existsSync(target)) {
28
+ report.skipped.push({ path: relative, reason: 'exists' });
29
+ continue;
30
+ }
31
+ let stat;
32
+ try {
33
+ stat = lstatSync(source);
34
+ }
35
+ catch {
36
+ continue;
37
+ }
38
+ if (stat.isSymbolicLink()) {
39
+ report.skipped.push({ path: relative, reason: 'symlink' });
40
+ continue;
41
+ }
42
+ if (!stat.isFile()) {
43
+ report.skipped.push({ path: relative, reason: 'not_file' });
44
+ continue;
45
+ }
46
+ if (stat.size > FILE_CAP) {
47
+ report.skipped.push({ path: relative, reason: 'too_large' });
48
+ continue;
49
+ }
50
+ if (total + stat.size > TOTAL_CAP) {
51
+ report.skipped.push({ path: relative, reason: 'over_total' });
52
+ continue;
53
+ }
54
+ mkdirSync(dirname(target), { recursive: true });
55
+ copyFileSync(source, target);
56
+ total += stat.size;
57
+ report.copied.push(relative);
58
+ }
59
+ return report;
60
+ }
61
+ /** Untracked files that are not ignored: new work a person has not added yet. */
62
+ export async function untrackedFiles(checkout) {
63
+ return nulList((await git(checkout, ['ls-files', '--others', '--exclude-standard', '-z'])).stdout);
64
+ }
65
+ /** All ignored user files that must be bounded and captured before a worktree is removed. */
66
+ export async function ignoredFiles(checkout) {
67
+ const paths = nulList((await git(checkout, ['ls-files', '--others', '--ignored', '--exclude-standard', '-z'])).stdout);
68
+ if (paths.length > IGNORED_FILE_COUNT_CAP)
69
+ throw ignoredFilesError(`there are more than ${IGNORED_FILE_COUNT_CAP} ignored files`);
70
+ let total = 0;
71
+ let pathBytes = 0;
72
+ return paths.map((path) => {
73
+ let relative;
74
+ try {
75
+ relative = safeRelative(path);
76
+ }
77
+ catch {
78
+ throw ignoredFilesError('an ignored path is unsafe');
79
+ }
80
+ pathBytes += Buffer.byteLength(relative) + 10;
81
+ if (pathBytes > IGNORED_PATH_BYTES_CAP)
82
+ throw ignoredFilesError('the ignored paths exceed the snapshot limit');
83
+ let stat;
84
+ try {
85
+ stat = lstatSync(join(checkout, relative));
86
+ }
87
+ catch {
88
+ throw ignoredFilesError(`could not inspect ${relative}`);
89
+ }
90
+ if (!stat.isFile() && !stat.isSymbolicLink())
91
+ throw ignoredFilesError(`${relative} is not a regular file or symlink`);
92
+ if (stat.size > FILE_CAP)
93
+ throw ignoredFilesError(`${relative} exceeds the ${FILE_CAP}-byte per-file limit`);
94
+ total += stat.size;
95
+ if (total > TOTAL_CAP)
96
+ throw ignoredFilesError(`ignored files exceed the ${TOTAL_CAP}-byte total limit`);
97
+ return relative;
98
+ });
99
+ }
100
+ function ignoredFilesError(reason) {
101
+ return new HarnessError('worktree_has_work', `Ignored files cannot be safely preserved: ${reason}.`, 'Move or remove those files, then try again.');
102
+ }
103
+ /** Ignored files that match `.worktreeinclude`, matched by git itself. */
104
+ export async function includedFiles(checkout) {
105
+ const patterns = join(checkout, INCLUDE_FILE);
106
+ if (!existsSync(patterns))
107
+ return [];
108
+ const ignored = new Set(nulList((await git(checkout, ['ls-files', '--others', '--ignored', '--exclude-standard', '-z'])).stdout));
109
+ const matching = nulList((await git(checkout, ['ls-files', '--others', '--ignored', `--exclude-from=${patterns}`, '-z'])).stdout);
110
+ return matching.filter((path) => ignored.has(path));
111
+ }
@@ -0,0 +1,16 @@
1
+ export interface GitResult {
2
+ code: number;
3
+ stdout: string;
4
+ stderr: string;
5
+ }
6
+ export interface GitOptions {
7
+ input?: string | Buffer;
8
+ env?: Record<string, string>;
9
+ /** Return a failed result instead of throwing. */
10
+ allowFail?: boolean;
11
+ }
12
+ export declare function git(cwd: string, args: readonly string[], options?: GitOptions): Promise<GitResult>;
13
+ /** The trimmed standard output of a git command that must succeed. */
14
+ export declare function gitText(cwd: string, args: readonly string[], options?: GitOptions): Promise<string>;
15
+ /** NUL-separated output as a list, without the empty last entry. */
16
+ export declare function nulList(text: string): string[];