@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,106 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { closeSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeSync } from 'node:fs';
3
+ import { basename, dirname, isAbsolute, join, normalize, sep } from 'node:path';
4
+ import { HarnessError, invalid } from "./errors.js";
5
+ /** Writes through a temporary sibling file and renames it into place so readers never see a partial file. */
6
+ export function atomicWrite(path, contents) {
7
+ const parent = dirname(path);
8
+ mkdirSync(parent, { recursive: true });
9
+ const temporary = join(parent, `.${basename(path)}.${randomUUID()}.tmp`);
10
+ const file = openSync(temporary, 'w');
11
+ try {
12
+ writeSync(file, contents);
13
+ fsyncSync(file);
14
+ }
15
+ finally {
16
+ closeSync(file);
17
+ }
18
+ try {
19
+ renameSync(temporary, path);
20
+ }
21
+ catch (error) {
22
+ rmSync(temporary, { force: true });
23
+ throw error;
24
+ }
25
+ }
26
+ export function writeJson(path, value) {
27
+ atomicWrite(path, `${JSON.stringify(value, null, 2)}\n`);
28
+ }
29
+ /** `null` when the file does not exist; a file that exists but does not parse is an error. */
30
+ export function readJson(path) {
31
+ let text;
32
+ try {
33
+ text = readFileSync(path, 'utf8');
34
+ }
35
+ catch (error) {
36
+ if (error.code === 'ENOENT')
37
+ return null;
38
+ throw error;
39
+ }
40
+ try {
41
+ return JSON.parse(text);
42
+ }
43
+ catch (error) {
44
+ throw new HarnessError('invalid_data', `Stored data could not be read: ${error instanceof Error ? error.message : String(error)}`);
45
+ }
46
+ }
47
+ /** `readJson` for callers that treat an unreadable file like a missing one. */
48
+ export function readJsonOr(path, fallback) {
49
+ try {
50
+ return readJson(path) ?? fallback;
51
+ }
52
+ catch {
53
+ return fallback;
54
+ }
55
+ }
56
+ export function readText(path) {
57
+ try {
58
+ return readFileSync(path, 'utf8');
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ export function appendLine(path, line) {
65
+ let next = readText(path) ?? '';
66
+ if (next && !next.endsWith('\n'))
67
+ next += '\n';
68
+ atomicWrite(path, `${next}${line}\n`);
69
+ }
70
+ /** Accepts only IDs that are safe as a single path segment. */
71
+ export function safeId(id) {
72
+ if (id.length > 0 && id.length <= 128 && /^[A-Za-z0-9_-]+$/.test(id))
73
+ return id;
74
+ throw invalid('Invalid identifier.');
75
+ }
76
+ /** Accepts a relative path that stays inside its base directory. */
77
+ export function safeRelative(path) {
78
+ const parts = path.split(/[\\/]/);
79
+ if (!path || isAbsolute(path) || parts.some((part) => part === '' || part === '.' || part === '..')) {
80
+ throw invalid('Path must stay inside the working directory.');
81
+ }
82
+ return normalize(path).split(sep).join('/');
83
+ }
84
+ /** Millisecond UTC timestamp, the format every record uses. */
85
+ export function now() {
86
+ return new Date().toISOString();
87
+ }
88
+ export function newId() {
89
+ return randomUUID();
90
+ }
91
+ export function isDir(path) {
92
+ try {
93
+ return statSync(path).isDirectory();
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ export function isFile(path) {
100
+ try {
101
+ return statSync(path).isFile();
102
+ }
103
+ catch {
104
+ return false;
105
+ }
106
+ }
@@ -0,0 +1,24 @@
1
+ import { DatabaseSync, type SQLInputValue } from 'node:sqlite';
2
+ /** Ordered, append-only migrations. Each runs in one transaction; the file is backed up first. */
3
+ export declare const MIGRATIONS: readonly string[];
4
+ export declare function dbPath(root: string): string;
5
+ /** Runs `work` inside one transaction, rolling back if it throws. */
6
+ export declare function transaction<T>(database: DatabaseSync, work: () => T): T;
7
+ /**
8
+ * Applies pending migrations. The database file is copied first; if any migration fails, the
9
+ * copy is restored and the error is reported.
10
+ */
11
+ export declare function migrate(path: string, migrations: readonly string[]): DatabaseSync;
12
+ /** Runs `work` with the shared connection for this data root, opening and migrating it on first use. */
13
+ export declare function withIndex<T>(root: string, work: (database: DatabaseSync) => T): T;
14
+ /** Closes this data root's connection, if one is open. */
15
+ export declare function closeIndex(root: string): void;
16
+ /** Closes the connection and removes the index files; the next use rebuilds the schema. */
17
+ export declare function deleteIndex(root: string): void;
18
+ export type Param = SQLInputValue;
19
+ export declare function all<T>(database: DatabaseSync, sql: string, ...params: Param[]): T[];
20
+ export declare function run(database: DatabaseSync, sql: string, ...params: Param[]): void;
21
+ /** Folder names under `<data root>/runs`. */
22
+ export declare function runFolders(root: string): string[];
23
+ /** Turns free text into an FTS5 query: each word becomes a quoted prefix term. */
24
+ export declare function ftsQuery(query: string): string | null;
@@ -0,0 +1,187 @@
1
+ // Derived SQLite index at `<data root>/index.sqlite`: full-text search over every Wiki entry
2
+ // (pages, facts, blocks, registry skills/prompts/rules), links, sources, revisions, run
3
+ // metadata, and recall passages. Markdown, raw sources, revision manifests, registry files, and
4
+ // run files stay canonical; the index can always be deleted and rebuilt from them.
5
+ import { copyFileSync, existsSync, readdirSync, rmSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { DatabaseSync } from 'node:sqlite';
8
+ import { HarnessError } from "./errors.js";
9
+ /** Index migration 4: recall, the searchable record of conversations and runs. */
10
+ const RECALL_SCHEMA = `CREATE TABLE recall_runs (run_id TEXT PRIMARY KEY, passages INTEGER NOT NULL, status TEXT NOT NULL);
11
+ CREATE VIRTUAL TABLE recall_fts USING fts5(run_id UNINDEXED, seq UNINDEXED, role UNINDEXED, at UNINDEXED,
12
+ mode UNINDEXED, session_id UNINDEXED, project_id UNINDEXED, text, tokenize = 'unicode61 remove_diacritics 2');`;
13
+ /** Ordered, append-only migrations. Each runs in one transaction; the file is backed up first. */
14
+ export const MIGRATIONS = [
15
+ // 1: initial schema
16
+ `CREATE TABLE pages (scope TEXT NOT NULL, id TEXT NOT NULL, title TEXT NOT NULL, type TEXT NOT NULL,
17
+ updated_at TEXT, path TEXT NOT NULL, source_ids TEXT NOT NULL, PRIMARY KEY (scope, id));
18
+ CREATE VIRTUAL TABLE pages_fts USING fts5(scope UNINDEXED, id UNINDEXED, title, body, links, sources,
19
+ tokenize = 'unicode61 remove_diacritics 2');
20
+ CREATE TABLE links (scope TEXT NOT NULL, from_id TEXT NOT NULL, to_id TEXT NOT NULL, type TEXT NOT NULL);
21
+ CREATE INDEX links_to ON links (scope, to_id);
22
+ CREATE TABLE sources (scope TEXT NOT NULL, id TEXT NOT NULL, name TEXT NOT NULL, imported_at TEXT, version INTEGER,
23
+ PRIMARY KEY (scope, id));
24
+ CREATE TABLE revisions (scope TEXT NOT NULL, page_id TEXT NOT NULL, id TEXT NOT NULL, created_at TEXT, actor TEXT,
25
+ PRIMARY KEY (scope, id));
26
+ CREATE TABLE runs (id TEXT PRIMARY KEY, project_id TEXT, mode TEXT, harness TEXT, session_type TEXT,
27
+ session_id TEXT, status TEXT, started_at TEXT, ended_at TEXT);
28
+ CREATE INDEX runs_session ON runs (session_id, started_at);`,
29
+ // 2: accounts and token usage per run
30
+ `ALTER TABLE runs ADD COLUMN account_id TEXT;
31
+ CREATE INDEX runs_account ON runs (account_id, started_at);
32
+ CREATE TABLE usage (run_id TEXT PRIMARY KEY, account_id TEXT, harness TEXT, model TEXT, day TEXT NOT NULL,
33
+ input_tokens INTEGER NOT NULL DEFAULT 0, output_tokens INTEGER NOT NULL DEFAULT 0);
34
+ CREATE INDEX usage_account ON usage (account_id, day);`,
35
+ // 3: one global Wiki; entries replace per-scope pages and include facts and registry items
36
+ `DROP TABLE IF EXISTS pages_fts; DROP TABLE IF EXISTS pages; DROP TABLE IF EXISTS links;
37
+ DROP TABLE IF EXISTS sources; DROP TABLE IF EXISTS revisions;
38
+ CREATE TABLE entries (id TEXT PRIMARY KEY, kind TEXT NOT NULL, title TEXT NOT NULL, type TEXT, path TEXT NOT NULL,
39
+ namespace TEXT NOT NULL, file TEXT NOT NULL, updated_at TEXT, source_ids TEXT NOT NULL);
40
+ CREATE VIRTUAL TABLE entries_fts USING fts5(id UNINDEXED, kind UNINDEXED, namespace UNINDEXED, title, body, links, sources,
41
+ tokenize = 'unicode61 remove_diacritics 2');
42
+ CREATE TABLE links (from_id TEXT NOT NULL, to_id TEXT NOT NULL, type TEXT NOT NULL);
43
+ CREATE INDEX links_to ON links (to_id);
44
+ CREATE TABLE sources (id TEXT PRIMARY KEY, name TEXT NOT NULL, imported_at TEXT, version INTEGER);
45
+ CREATE TABLE revisions (entry_id TEXT NOT NULL, id TEXT PRIMARY KEY, created_at TEXT, actor TEXT);
46
+ CREATE INDEX revisions_entry ON revisions (entry_id, created_at);`,
47
+ RECALL_SCHEMA,
48
+ // 5: a per-run summary cache for the embedding application's analytics
49
+ `CREATE TABLE run_stats (run_id TEXT PRIMARY KEY, session_id TEXT NOT NULL, version INTEGER NOT NULL, stats TEXT NOT NULL);
50
+ CREATE INDEX run_stats_session ON run_stats (session_id, version);`,
51
+ // 6: the agent that replied, so one agent's runs can be read across its sessions
52
+ `ALTER TABLE runs ADD COLUMN agent_id TEXT;
53
+ CREATE INDEX runs_agent ON runs (agent_id, started_at);
54
+ CREATE INDEX runs_started ON runs (started_at);`,
55
+ // 7: the per-account usage table goes
56
+ 'DROP TABLE IF EXISTS usage;'
57
+ ];
58
+ const connections = new Map();
59
+ export function dbPath(root) {
60
+ return join(root, 'index.sqlite');
61
+ }
62
+ function sqlError(error) {
63
+ return new HarnessError('index_error', error instanceof Error ? error.message : String(error), 'Settings → Projects and Storage → Repair index.');
64
+ }
65
+ function schemaVersion(database) {
66
+ database.exec('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);');
67
+ const row = database.prepare("SELECT value FROM meta WHERE key = 'schema_version'").get();
68
+ const version = Number.parseInt(row?.value ?? '', 10);
69
+ return Number.isInteger(version) && version >= 0 ? version : 0;
70
+ }
71
+ /** Runs `work` inside one transaction, rolling back if it throws. */
72
+ export function transaction(database, work) {
73
+ database.exec('BEGIN');
74
+ try {
75
+ const result = work();
76
+ database.exec('COMMIT');
77
+ return result;
78
+ }
79
+ catch (error) {
80
+ try {
81
+ database.exec('ROLLBACK');
82
+ }
83
+ catch {
84
+ // The transaction is already gone.
85
+ }
86
+ throw error;
87
+ }
88
+ }
89
+ /**
90
+ * Applies pending migrations. The database file is copied first; if any migration fails, the
91
+ * copy is restored and the error is reported.
92
+ */
93
+ export function migrate(path, migrations) {
94
+ let database;
95
+ let current;
96
+ try {
97
+ database = new DatabaseSync(path);
98
+ current = schemaVersion(database);
99
+ }
100
+ catch (error) {
101
+ throw sqlError(error);
102
+ }
103
+ if (current >= migrations.length)
104
+ return database;
105
+ const backup = `${path.replace(/\.sqlite$/, '')}.sqlite.bak-v${current}`;
106
+ const hadFile = existsSync(path) && current > 0;
107
+ if (hadFile) {
108
+ try {
109
+ database.exec('PRAGMA wal_checkpoint(TRUNCATE);');
110
+ }
111
+ catch {
112
+ // A checkpoint that cannot run leaves the copy slightly behind, which a rebuild repairs.
113
+ }
114
+ copyFileSync(path, backup);
115
+ }
116
+ for (let index = current; index < migrations.length; index += 1) {
117
+ try {
118
+ transaction(database, () => {
119
+ database.exec(migrations[index]);
120
+ database.prepare("INSERT INTO meta (key, value) VALUES ('schema_version', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(String(index + 1));
121
+ });
122
+ }
123
+ catch (error) {
124
+ database.close();
125
+ if (hadFile)
126
+ copyFileSync(backup, path);
127
+ else
128
+ rmSync(path, { force: true });
129
+ throw new HarnessError('migration_failed', `Index migration ${index + 1} failed and the previous index was restored: ${error instanceof Error ? error.message : String(error)}`);
130
+ }
131
+ }
132
+ return database;
133
+ }
134
+ /** Runs `work` with the shared connection for this data root, opening and migrating it on first use. */
135
+ export function withIndex(root, work) {
136
+ const path = dbPath(root);
137
+ let database = connections.get(path);
138
+ if (!database) {
139
+ database = migrate(path, MIGRATIONS);
140
+ try {
141
+ database.exec('PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000;');
142
+ }
143
+ catch (error) {
144
+ database.close();
145
+ throw sqlError(error);
146
+ }
147
+ connections.set(path, database);
148
+ }
149
+ try {
150
+ return work(database);
151
+ }
152
+ catch (error) {
153
+ throw error instanceof HarnessError ? error : sqlError(error);
154
+ }
155
+ }
156
+ /** Closes this data root's connection, if one is open. */
157
+ export function closeIndex(root) {
158
+ const path = dbPath(root);
159
+ connections.get(path)?.close();
160
+ connections.delete(path);
161
+ }
162
+ /** Closes the connection and removes the index files; the next use rebuilds the schema. */
163
+ export function deleteIndex(root) {
164
+ closeIndex(root);
165
+ for (const suffix of ['', '-wal', '-shm'])
166
+ rmSync(`${dbPath(root)}${suffix}`, { force: true });
167
+ }
168
+ export function all(database, sql, ...params) {
169
+ return database.prepare(sql).all(...params);
170
+ }
171
+ export function run(database, sql, ...params) {
172
+ database.prepare(sql).run(...params);
173
+ }
174
+ /** Folder names under `<data root>/runs`. */
175
+ export function runFolders(root) {
176
+ try {
177
+ return readdirSync(join(root, 'runs'));
178
+ }
179
+ catch {
180
+ return [];
181
+ }
182
+ }
183
+ /** Turns free text into an FTS5 query: each word becomes a quoted prefix term. */
184
+ export function ftsQuery(query) {
185
+ const terms = query.split(/[^\p{Alphabetic}\p{N}]+/u).filter(Boolean).map((term) => `"${term.replaceAll('"', '')}"*`);
186
+ return terms.length ? terms.join(' ') : null;
187
+ }
@@ -0,0 +1,7 @@
1
+ export declare function searchPath(): string;
2
+ /** The inherited PATH key, preserving Windows' existing capitalization. */
3
+ export declare function pathVariableName(environment: NodeJS.ProcessEnv): string;
4
+ /** A child environment with a directory prepended using the selected platform's PATH rules. */
5
+ export declare function prependSearchPath(directory: string, existing: string, environment?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): Record<string, string>;
6
+ /** The executable `name` resolves to: itself when absolute, else the first match on the search path. */
7
+ export declare function findBinary(name: string): string | null;
@@ -0,0 +1,79 @@
1
+ // Where executables are found. POSIX desktop apps may start with a minimal PATH, so the login
2
+ // shell's PATH is resolved once. Windows keeps the inherited PATH and its native separator.
3
+ import { execFileSync } from 'node:child_process';
4
+ import { accessSync, constants, statSync } from 'node:fs';
5
+ import { homedir } from 'node:os';
6
+ import { delimiter, extname, isAbsolute, join } from 'node:path';
7
+ let resolved = null;
8
+ export function searchPath() {
9
+ const platform = process.platform;
10
+ const pathKey = pathVariableName(process.env);
11
+ const inherited = process.env[pathKey] ?? '';
12
+ if (resolved?.platform === platform && resolved.inherited === inherited)
13
+ return resolved.path;
14
+ const separator = pathSeparator(platform);
15
+ const entries = [];
16
+ if (platform !== 'win32') {
17
+ try {
18
+ const output = execFileSync(process.env.SHELL || '/bin/zsh', ['-ilc', 'printf %s "$PATH"'], { encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'] });
19
+ // Interactive shells may print banners; the PATH is the last line.
20
+ entries.push(...(output.split('\n').filter(Boolean).at(-1) ?? '').split(separator));
21
+ }
22
+ catch {
23
+ // The inherited PATH and the usual folders still apply.
24
+ }
25
+ }
26
+ entries.push(...inherited.split(separator));
27
+ if (platform !== 'win32') {
28
+ const home = homedir();
29
+ if (home)
30
+ entries.push(...['.local/bin', '.bun/bin', '.npm-global/bin', '.cargo/bin'].map((folder) => join(home, folder)));
31
+ entries.push('/opt/homebrew/bin', '/usr/local/bin', '/usr/bin', '/bin');
32
+ }
33
+ const path = [...new Set(entries.filter(Boolean))].join(separator);
34
+ resolved = { platform, inherited, path };
35
+ return path;
36
+ }
37
+ /** The inherited PATH key, preserving Windows' existing capitalization. */
38
+ export function pathVariableName(environment) {
39
+ return Object.keys(environment).find((name) => name.toLowerCase() === 'path') ?? 'PATH';
40
+ }
41
+ /** A child environment with a directory prepended using the selected platform's PATH rules. */
42
+ export function prependSearchPath(directory, existing, environment = process.env, platform = process.platform) {
43
+ const values = [directory, existing].filter(Boolean);
44
+ return { [pathVariableName(environment)]: values.join(pathSeparator(platform)) };
45
+ }
46
+ function pathSeparator(platform) {
47
+ return platform === 'win32' ? ';' : delimiter;
48
+ }
49
+ function isExecutable(path) {
50
+ try {
51
+ accessSync(path, process.platform === 'win32' ? constants.F_OK : constants.X_OK);
52
+ return statSync(path).isFile();
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /** The executable `name` resolves to: itself when absolute, else the first match on the search path. */
59
+ export function findBinary(name) {
60
+ const platform = process.platform;
61
+ const suffixes = platform === 'win32' && !extname(name)
62
+ ? (process.env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean)
63
+ : [];
64
+ const names = [name, ...suffixes.map((suffix) => `${name}${suffix}`)];
65
+ if (isAbsolute(name)) {
66
+ for (const candidate of names)
67
+ if (isExecutable(candidate))
68
+ return candidate;
69
+ return null;
70
+ }
71
+ for (const directory of searchPath().split(pathSeparator(platform))) {
72
+ for (const candidateName of names) {
73
+ const candidate = join(directory, candidateName);
74
+ if (isExecutable(candidate))
75
+ return candidate;
76
+ }
77
+ }
78
+ return null;
79
+ }
@@ -0,0 +1,18 @@
1
+ export interface Project {
2
+ id: string;
3
+ name: string;
4
+ rootPath: string;
5
+ isGitRepository: boolean;
6
+ autoMaintenance: boolean;
7
+ createdAt: string;
8
+ slug: string;
9
+ /** `/projects/<slug>`: where this project's pages live in the Wiki. */
10
+ wikiNamespace: string;
11
+ }
12
+ /** Same rule as the Wiki's page slugs, kept here so `core` does not depend on `memory`. */
13
+ export declare function slugify(text: string): string;
14
+ export declare function uniqueSlug(name: string, taken: readonly string[]): string;
15
+ export declare function listProjects(root: string): Project[];
16
+ /** `listProjects` for callers that treat an unreadable registry like an empty one. */
17
+ export declare function projectsOrNone(root: string): Project[];
18
+ export declare function findProject(root: string, projectId: string): Project;
@@ -0,0 +1,67 @@
1
+ // Projects: named working folders, each with a Wiki namespace (`/projects/<slug>`). The harness
2
+ // reads `<data root>/projects.json`; the embedding application adds, renames, and removes them.
3
+ import { existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { notFound } from "./errors.js";
6
+ import { readJson } from "./fs.js";
7
+ import { newId } from "./fs.js";
8
+ /** Same rule as the Wiki's page slugs, kept here so `core` does not depend on `memory`. */
9
+ export function slugify(text) {
10
+ let value = '';
11
+ for (const character of text.toLowerCase()) {
12
+ if (/^[a-z0-9]$/.test(character))
13
+ value += character;
14
+ else if (value && !value.endsWith('-'))
15
+ value += '-';
16
+ }
17
+ value = value.replace(/^-+|-+$/g, '').slice(0, 60);
18
+ return value || `page-${newId().slice(0, 8)}`;
19
+ }
20
+ export function uniqueSlug(name, taken) {
21
+ const slug = slugify(name);
22
+ const base = slug.startsWith('page-') ? 'project' : slug;
23
+ let candidate = base;
24
+ for (let counter = 2; taken.includes(candidate); counter += 1)
25
+ candidate = `${base}-${counter}`;
26
+ return candidate;
27
+ }
28
+ function load(root) {
29
+ const records = readJson(join(root, 'projects.json')) ?? [];
30
+ // Records without a slug get a unique one derived from the name, in list order, so the result
31
+ // is the same on every read until the application persists it.
32
+ const taken = records.map((record) => record.slug ?? '').filter(Boolean);
33
+ for (const record of records) {
34
+ if (record.slug)
35
+ continue;
36
+ record.slug = uniqueSlug(record.name, taken);
37
+ taken.push(record.slug);
38
+ }
39
+ return records;
40
+ }
41
+ export function listProjects(root) {
42
+ return load(root).map((record) => ({
43
+ id: record.id,
44
+ name: record.name,
45
+ rootPath: record.rootPath,
46
+ isGitRepository: existsSync(join(record.rootPath, '.git')),
47
+ autoMaintenance: record.autoMaintenance,
48
+ createdAt: record.createdAt,
49
+ slug: record.slug,
50
+ wikiNamespace: `/projects/${record.slug}`
51
+ }));
52
+ }
53
+ /** `listProjects` for callers that treat an unreadable registry like an empty one. */
54
+ export function projectsOrNone(root) {
55
+ try {
56
+ return listProjects(root);
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ }
62
+ export function findProject(root, projectId) {
63
+ const project = listProjects(root).find((entry) => entry.id === projectId);
64
+ if (!project)
65
+ throw notFound('Project');
66
+ return project;
67
+ }
@@ -0,0 +1,2 @@
1
+ /** Text that carries a credential marker is never written to the Wiki. */
2
+ export declare function looksSecret(text: string): boolean;
@@ -0,0 +1,5 @@
1
+ const SECRET_MARKERS = ['-----BEGIN', 'sk-ant-', 'sk-proj-', 'ghp_', 'github_pat_', 'AKIA', 'xoxb-'];
2
+ /** Text that carries a credential marker is never written to the Wiki. */
3
+ export function looksSecret(text) {
4
+ return SECRET_MARKERS.some((marker) => text.includes(marker));
5
+ }
@@ -0,0 +1,7 @@
1
+ export declare function charCount(text: string): number;
2
+ export declare function takeChars(text: string, count: number): string;
3
+ /** Lines without their terminators; a final newline does not add an empty last line. */
4
+ export declare function lines(text: string): string[];
5
+ /** Orders file paths segment by segment, so a folder sorts before a sibling whose name extends it. */
6
+ export declare function comparePaths(left: string, right: string): number;
7
+ export declare const compareText: (left: string, right: string) => number;
@@ -0,0 +1,40 @@
1
+ // Text helpers that count Unicode characters, not UTF-16 units, so budgets and cuts agree across languages.
2
+ export function charCount(text) {
3
+ let count = 0;
4
+ for (const _ of text)
5
+ count += 1;
6
+ return count;
7
+ }
8
+ export function takeChars(text, count) {
9
+ if (text.length <= count)
10
+ return text;
11
+ let taken = 0;
12
+ let end = 0;
13
+ for (const character of text) {
14
+ if (taken >= count)
15
+ break;
16
+ taken += 1;
17
+ end += character.length;
18
+ }
19
+ return text.slice(0, end);
20
+ }
21
+ /** Lines without their terminators; a final newline does not add an empty last line. */
22
+ export function lines(text) {
23
+ if (!text)
24
+ return [];
25
+ const parts = text.split('\n');
26
+ if (parts[parts.length - 1] === '')
27
+ parts.pop();
28
+ return parts.map((line) => (line.endsWith('\r') ? line.slice(0, -1) : line));
29
+ }
30
+ /** Orders file paths segment by segment, so a folder sorts before a sibling whose name extends it. */
31
+ export function comparePaths(left, right) {
32
+ const a = left.split('/');
33
+ const b = right.split('/');
34
+ for (let index = 0; index < Math.min(a.length, b.length); index += 1) {
35
+ if (a[index] !== b[index])
36
+ return a[index] < b[index] ? -1 : 1;
37
+ }
38
+ return a.length - b.length;
39
+ }
40
+ export const compareText = (left, right) => (left < right ? -1 : left > right ? 1 : 0);
@@ -0,0 +1,5 @@
1
+ import type { Harness } from "../harness.js";
2
+ import { type TerminalAssets } from "../terminal/terminals.js";
3
+ import type { SecretStore } from "../accounts/secrets.js";
4
+ import type { DoctorCheck, DoctorContext } from "./types.js";
5
+ export declare function builtinChecks(harness: Harness, context: DoctorContext, secrets: SecretStore, assets?: TerminalAssets): Promise<DoctorCheck[]>;