@xingular/harness 0.1.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +60 -0
  4. package/README.md +265 -71
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +14842 -9445
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +1170 -62
  373. package/docs/README.md +34 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0001-owned-terminal.md +87 -0
  403. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  404. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  405. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  406. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  407. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  408. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  409. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  410. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  411. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  412. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  413. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  414. package/docs/decisions/ADR-0013-doctor.md +27 -0
  415. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  416. package/docs/doctor.md +74 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  418. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  420. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  421. package/docs/features/README.md +20 -0
  422. package/docs/features/automations/README.md +41 -0
  423. package/docs/features/cores/README.md +39 -0
  424. package/docs/features/google-harness2/README.md +52 -0
  425. package/docs/features/integrations/README.md +40 -0
  426. package/docs/features/interfaces/README.md +29 -0
  427. package/docs/features/memory/README.md +28 -0
  428. package/docs/releases/1.0.0.md +40 -0
  429. package/docs/releases/README.md +36 -0
  430. package/docs/study/00-index.md +78 -0
  431. package/docs/study/arms/00-matrix.md +20 -0
  432. package/docs/study/arms/01-system-prompt.md +211 -0
  433. package/docs/study/arms/02-tools.md +79 -0
  434. package/docs/study/arms/03-subagents.md +90 -0
  435. package/docs/study/arms/04-skills.md +75 -0
  436. package/docs/study/arms/05-context-management.md +90 -0
  437. package/docs/study/arms/06-memory.md +90 -0
  438. package/docs/study/arms/07-governance.md +71 -0
  439. package/docs/study/arms/08-execution.md +69 -0
  440. package/docs/study/arms/09-observability.md +60 -0
  441. package/docs/study/arms/10-refinement.md +110 -0
  442. package/docs/study/btw-comparison.md +37 -0
  443. package/docs/study/feature-gap-review.md +42 -0
  444. package/docs/study/insights.md +123 -0
  445. package/docs/study/roadmap.md +72 -0
  446. package/docs/study/sources/claude-code.md +44 -0
  447. package/docs/study/sources/deepseek-harness.md +102 -0
  448. package/docs/study/sources/harness2.md +50 -0
  449. package/docs/study/sources/kimi-cli.md +42 -0
  450. package/docs/study/sources/omp.md +93 -0
  451. package/docs/study/sources/opencode.md +43 -0
  452. package/docs/study/sources/openhands.md +46 -0
  453. package/docs/study/sources/smolagents.md +40 -0
  454. package/docs/study/sources/swe-agent.md +34 -0
  455. package/docs/system-prompt-design.md +196 -0
  456. package/docs/terminal-tui.md +671 -0
  457. package/package.json +48 -12
  458. package/src/accounts/accounts.test.ts +0 -223
  459. package/src/accounts/accounts.ts +0 -522
  460. package/src/accounts/env.test.ts +0 -95
  461. package/src/accounts/env.ts +0 -338
  462. package/src/accounts/secrets.ts +0 -50
  463. package/src/accounts/store.ts +0 -338
  464. package/src/capabilities/api.ts +0 -75
  465. package/src/capabilities/runSnapshot.ts +0 -59
  466. package/src/capabilities/types.ts +0 -34
  467. package/src/cli.ts +0 -114
  468. package/src/core/bus.ts +0 -34
  469. package/src/core/changes.ts +0 -33
  470. package/src/core/env.ts +0 -27
  471. package/src/core/errors.ts +0 -32
  472. package/src/core/frontmatter.ts +0 -47
  473. package/src/core/fs.test.ts +0 -38
  474. package/src/core/fs.ts +0 -92
  475. package/src/core/index.ts +0 -193
  476. package/src/core/path.test.ts +0 -14
  477. package/src/core/path.ts +0 -79
  478. package/src/core/projects.ts +0 -90
  479. package/src/core/text.ts +0 -39
  480. package/src/harness.ts +0 -299
  481. package/src/index.ts +0 -70
  482. package/src/mcp/connections.ts +0 -614
  483. package/src/mcp/manager.ts +0 -130
  484. package/src/mcp/oauth.ts +0 -195
  485. package/src/mcp/scopeMigration.test.ts +0 -79
  486. package/src/mcp/scopeMigration.ts +0 -204
  487. package/src/mcp/service.test.ts +0 -376
  488. package/src/mcp/service.ts +0 -549
  489. package/src/mcp/types.ts +0 -108
  490. package/src/memory/api.test.ts +0 -82
  491. package/src/memory/api.ts +0 -289
  492. package/src/memory/blocks.test.ts +0 -78
  493. package/src/memory/blocks.ts +0 -406
  494. package/src/memory/caller.ts +0 -57
  495. package/src/memory/dispatch.ts +0 -59
  496. package/src/memory/facts.test.ts +0 -41
  497. package/src/memory/facts.ts +0 -248
  498. package/src/memory/graph.ts +0 -103
  499. package/src/memory/health.test.ts +0 -130
  500. package/src/memory/health.ts +0 -74
  501. package/src/memory/maintainer.ts +0 -272
  502. package/src/memory/maintenance.test.ts +0 -176
  503. package/src/memory/maintenance.ts +0 -330
  504. package/src/memory/migrate.ts +0 -79
  505. package/src/memory/operations.ts +0 -138
  506. package/src/memory/proposals.test.ts +0 -168
  507. package/src/memory/proposals.ts +0 -576
  508. package/src/memory/recall.test.ts +0 -104
  509. package/src/memory/recall.ts +0 -271
  510. package/src/memory/references.ts +0 -77
  511. package/src/memory/runContext.ts +0 -93
  512. package/src/memory/secrets.ts +0 -6
  513. package/src/memory/store.test.ts +0 -66
  514. package/src/memory/store.ts +0 -385
  515. package/src/memory/wiki.test.ts +0 -47
  516. package/src/memory/wiki.ts +0 -422
  517. package/src/memory/wikiIndex.test.ts +0 -88
  518. package/src/memory/wikiIndex.ts +0 -116
  519. package/src/plugins/api.ts +0 -181
  520. package/src/plugins/attachments.test.ts +0 -84
  521. package/src/plugins/attachments.ts +0 -141
  522. package/src/plugins/builtin.ts +0 -82
  523. package/src/plugins/catalogue.test.ts +0 -254
  524. package/src/plugins/catalogue.ts +0 -251
  525. package/src/plugins/cli.ts +0 -184
  526. package/src/plugins/discover.ts +0 -151
  527. package/src/plugins/firstParty.test.ts +0 -143
  528. package/src/plugins/firstParty.ts +0 -129
  529. package/src/plugins/hooks.test.ts +0 -250
  530. package/src/plugins/hooks.ts +0 -239
  531. package/src/plugins/identity.ts +0 -37
  532. package/src/plugins/install.test.ts +0 -107
  533. package/src/plugins/install.ts +0 -106
  534. package/src/plugins/inventory.ts +0 -123
  535. package/src/plugins/manifest.ts +0 -76
  536. package/src/plugins/plugins.test.ts +0 -205
  537. package/src/plugins/plugins.ts +0 -189
  538. package/src/plugins/proposal.ts +0 -121
  539. package/src/plugins/runtime.test.ts +0 -40
  540. package/src/plugins/runtime.ts +0 -82
  541. package/src/plugins/trust.ts +0 -142
  542. package/src/plugins/types.ts +0 -149
  543. package/src/prompt/compile.test.ts +0 -261
  544. package/src/prompt/compile.ts +0 -732
  545. package/src/server/methods.ts +0 -314
  546. package/src/server/remote.ts +0 -77
  547. package/src/server/rpc.ts +0 -116
  548. package/src/server/serve.ts +0 -28
  549. package/src/server/server.test.ts +0 -174
  550. package/src/sessions/approvals.ts +0 -118
  551. package/src/sessions/contracts.ts +0 -310
  552. package/src/sessions/conversation.test.ts +0 -150
  553. package/src/sessions/extensionSession.test.ts +0 -74
  554. package/src/sessions/extensionUi.test.ts +0 -65
  555. package/src/sessions/extensionUi.ts +0 -102
  556. package/src/sessions/history.ts +0 -51
  557. package/src/sessions/lineageJoin.ts +0 -75
  558. package/src/sessions/policy.ts +0 -32
  559. package/src/sessions/pricing.ts +0 -60
  560. package/src/sessions/reasoningSummaries.ts +0 -59
  561. package/src/sessions/registry.ts +0 -294
  562. package/src/sessions/runIndex.ts +0 -99
  563. package/src/sessions/runStore.test.ts +0 -152
  564. package/src/sessions/runStore.ts +0 -332
  565. package/src/sessions/runner.ts +0 -569
  566. package/src/sessions/runtimeResources.test.ts +0 -61
  567. package/src/sessions/sessions.test.ts +0 -455
  568. package/src/sessions/sessions.ts +0 -295
  569. package/src/skills/registry.test.ts +0 -104
  570. package/src/skills/registry.ts +0 -407
  571. package/src/terminal/cli.ts +0 -149
  572. package/src/terminal/client.ts +0 -74
  573. package/src/terminal/controller.ts +0 -227
  574. package/src/terminal/launch.test.ts +0 -34
  575. package/src/terminal/launch.ts +0 -88
  576. package/src/terminal/piExtension.ts +0 -210
  577. package/src/terminal/pluginControl.test.ts +0 -146
  578. package/src/terminal/pluginMenu.ts +0 -112
  579. package/src/terminal/socket.test.ts +0 -71
  580. package/src/terminal/socket.ts +0 -221
  581. package/src/terminal/standalone.test.ts +0 -130
  582. package/src/terminal/standalone.ts +0 -144
  583. package/src/terminal/terminal.test.ts +0 -330
  584. package/src/terminal/terminals.ts +0 -443
  585. package/src/tools/askUser.ts +0 -45
  586. package/src/tools/definitions.ts +0 -187
  587. package/src/tools/memoryTools.ts +0 -22
  588. package/src/tools/pluginPropose.ts +0 -41
  589. package/src/tools/types.ts +0 -39
  590. package/src/web/safeRequest.ts +0 -171
  591. package/src/web/text.ts +0 -53
  592. package/src/web/tools.ts +0 -134
  593. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,40 @@
1
+ # Xingular Harness 1.0.0
2
+
3
+ This release establishes @xingular/harness@1.0.0 as the stable baseline and retains the xharness
4
+ command. It intentionally resets the earlier development numbering; historical tags and published
5
+ versions remain unchanged. This document describes the candidate until registry publication is
6
+ verified.
7
+
8
+ ## Included
9
+
10
+ - Pi execution with isolated accounts, pinned models/capabilities, gated tools and recorded usage.
11
+ - Foundation/variant architecture, validated c1–c8 variants, version history, continuation,
12
+ answer-free refinement and opt-in lessons.
13
+ - Wiki notes, history/trajectory tools, MCP connectors, plugins, Hub installation and terminal UI.
14
+ - Generic web search/fetch and isolated browser tools, plus account and backend diagnostics in
15
+ /doctor. Local inspection is the default; selected live probes require consent.
16
+ - Compiled Node ESM SDK and TypeScript declarations, including supported subpath imports.
17
+ - Apache-2.0 for original project code, with retained upstream attribution and license texts.
18
+
19
+ ## Installation and requirements
20
+
21
+ Use `npm install --global @xingular/harness@1.0.0`, then `xharness`. Node 22.19 or later is required.
22
+ The terminal additionally requires Bun; release CI uses Node 22.19.0 and Bun 1.4.2. Browser operation
23
+ requires an installed compatible browser or a deliberately configured endpoint. Model credentials
24
+ are configured inside an isolated Harness account.
25
+
26
+ ## Migration
27
+
28
+ - SDK tree symbols/paths become variant symbols/paths: VariantChoice, seedVariant, variant/*.
29
+ - Server harnesses.* methods become variants.*. Session/context inputs use variant; variant
30
+ snapshots use variant and materialisation returns files. Old method aliases are not provided.
31
+ - Existing stored data is migrated without overwriting; historical run records remain readable.
32
+ - Versions numerically above 1.0.0 will not receive this release through higher-major semver ranges.
33
+ Install the exact version or latest tag deliberately.
34
+
35
+ ## Diagnostics limitations
36
+
37
+ Local readiness is not live connectivity. Doctor never signs in, switches accounts or repairs
38
+ settings. Provider probes may incur charges. Computer input remains blocked when the embedding
39
+ host cannot provide an isolated diagnostic surface. Runtime execution and compiled artifacts are
40
+ validated independently from publication; see the release checklist for actual gate results.
@@ -0,0 +1,36 @@
1
+ # Release procedure
2
+
3
+ 1. Review and commit completed Harness changes on release/1.0.0. Review App compatibility changes
4
+ separately. Preserve old tags and exclude outputs, external references and caches.
5
+ 2. Run npm run ci and the required App checks on unrestricted macOS/Linux runners. Install Bun
6
+ 1.4.2 and use Node 22.19.0 for the release build. Do not waive failing checks.
7
+ 3. Run npm run release:pack. The unique output folder contains the candidate tarball, inventory,
8
+ SHA-256 checksum and npm integrity. Run npm run release:smoke -- <tarball> --terminal for a fresh
9
+ dependency installation and packaged SDK/server/terminal checks. --offline reuses the checkout's
10
+ installed dependency tree and is only a local smoke check, not fresh-install acceptance.
11
+ 4. Run npm run release:preflight. Verify npm scope ownership and trusted-publisher settings for
12
+ tanntnny/xingular-harness, workflow release.yml, direct publishing enabled. No login is started
13
+ automatically. Existing 1.0.0 or an unreachable registry blocks publication.
14
+ 5. Present the exact commit, candidate inventory/hash, notes and check results for approval. Pushing
15
+ v1.0.0 triggers publication; do not push the tag before this approval. Preserve historical tags.
16
+ 6. After approval, push the reviewed commits and tag. The workflow runs both OS checks, packages
17
+ and tests one candidate, then publishes that same tarball with OIDC provenance and --tag latest.
18
+ No local publishing token is needed. It verifies registry integrity/provenance and creates a
19
+ GitHub release. Inspect registry state before retrying any failed publication.
20
+
21
+ A published version cannot be replaced. Corrections require a later version. This package's
22
+ intentional 1.0.0 reset does not rewrite historical decisions or claim an ordering above older
23
+ 2.x–5.x development versions. Publication status and local evidence belong in the candidate report.
24
+
25
+ ## Current preparation evidence
26
+
27
+ Local package inspection and the offline-dependency consumer smoke check pass. App compatibility
28
+ checks pass (592 renderer tests, 40 sidecar tests, 240 Rust tests with one ignored, and type/layer/UI
29
+ checks). A focused Harness run has 100 passing tests and the standalone proof passes. The full
30
+ Harness run is blocked by sandbox IPC and native HEIC encoding restrictions. The public GitHub
31
+ repository and absence of a remote v1.0.0 tag were verified through the connected GitHub service.
32
+ The npm registry and trusted-publisher settings could not be verified from this environment.
33
+
34
+ The release branch must run unrestricted CI and a fresh-install smoke check before a release-tag
35
+ approval is requested. Branch upload itself is a separate approval because it shares the source
36
+ with GitHub and starts CI; it does not publish npm. No local test failure is waived by this note.
@@ -0,0 +1,78 @@
1
+ # Harness arm study — index
2
+
3
+ An audit of agent-harness designs, arm by arm: where each studied harness puts its
4
+ prompt assembly, tools, memory, subagents, skills, context management, refinement,
5
+ governance, execution and observability, and what to adopt into this harness.
6
+
7
+ Positioning: this is analysis, not checked source behavior. Living contract docs and
8
+ decisions stay in `docs/`; when a study produces an actual change here, an ADR is
9
+ written and the claim moves to checked behavior. Cite material as
10
+ `external/<name>/<path>:<line>` — never second-hand summaries.
11
+
12
+ ## Focused notes
13
+
14
+ - [`/btw` side-question comparison](btw-comparison.md) — this terminal, the App-owned
15
+ side question, and checked-out external implementations.
16
+ - [Harness feature-gap review](feature-gap-review.md) — task/goal management, long-running work,
17
+ memory, execution isolation, verification, and observability gaps against the studied peers.
18
+
19
+ ## Sources
20
+
21
+ Clones live in `external/` (this repo). Field notes in `sources/`.
22
+
23
+ | Source | Origin | Note | Stage |
24
+ |---|---|---|---|
25
+ | opencode | [sst/opencode](https://github.com/sst/opencode) — TypeScript, the tool this harness family runs sessions in | [opencode.md](sources/opencode.md) | arm-01 audited |
26
+ | pi / omp | [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi) — tuned fork of [pi-mono](https://github.com/badlogic/pi-mono), the session runtime underneath this harness | [omp.md](sources/omp.md) | arm-01 audited |
27
+ | deepseek-harness (`dsh`) | [deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness) — MIT, Cordis, "everything is a plugin" | [deepseek-harness.md](sources/deepseek-harness.md) | arm-01 audited |
28
+ | harness2 | [google-research/harness2](https://github.com/google-research/harness2) + paper *Harness²: Recursive Agent Harnessing for an Open World* (arXiv:2610.14224, PDF in the clone) | [harness2.md](sources/harness2.md) | arm-01 audited |
29
+ | swe-agent | [SWE-agent/SWE-agent](https://github.com/SWE-agent/SWE-agent) | [swe-agent.md](sources/swe-agent.md) | inventory |
30
+ | openhands | [All-Hands-AI/OpenHands](https://github.com/All-Hands-AI/OpenHands) (UI) + [OpenHands/software-agent-sdk](https://github.com/OpenHands/software-agent-sdk) (agent server runtime) | [openhands.md](sources/openhands.md) | inventory |
31
+ | kimi-cli | [MoonshotAI/Kimi-CLI](https://github.com/MoonshotAI/Kimi-CLI) | [kimi-cli.md](sources/kimi-cli.md) | inventory |
32
+ | smolagents | [huggingface/smolagents](https://github.com/huggingface/smolagents) — CodeAct | [smolagents.md](sources/smolagents.md) | inventory |
33
+ | claude-code | [Anthropic Claude Code](https://www.anthropic.com/claude-code) — not open source; audit npm bundle, published prompts, observed behavior | [claude-code.md](sources/claude-code.md) | no clone |
34
+
35
+ ## Arms
36
+
37
+ One doc per arm: *design space → per-source comparison → trade-offs → adoption
38
+ candidates*. Adoption candidates feed a two-tier roadmap: Tier 1 = patterns already
39
+ battle-tested in open harnesses (OpenCode / pi / dsh); Tier 2 = research-backed ideas
40
+ (harness² and the literature) attempted after Tier 1.
41
+
42
+ | # | Arm | Doc | Stage |
43
+ |---|---|---|---|
44
+ | 1 | System prompt / context assembly | [arms/01-system-prompt.md](arms/01-system-prompt.md) | core four audited (opencode, omp, dsh, harness²); 5 sources pending |
45
+ | 2 | Tools | [arms/02-tools.md](arms/02-tools.md) | core four audited (opencode, omp, dsh + harness²/swe-agent/smolagents in person); partial |
46
+ | 4 | Subagents | [arms/03-subagents.md](arms/03-subagents.md) | core four audited; openhands/claude-code pending |
47
+ | 5 | Skills & loading | [arms/04-skills.md](arms/04-skills.md) | three sources audited (dsh, opencode, harness²) + our tree; omp partial |
48
+ | 6 | Context management | [arms/05-context-management.md](arms/05-context-management.md) | core three audited; ours needs inventory |
49
+ | 3 | Memory | [arms/06-memory.md](arms/06-memory.md) | core four audited + our Wiki |
50
+ | 8 | Governance | [arms/07-governance.md](arms/07-governance.md) | core three audited; claude-code/openhands pending |
51
+ | 9 | Execution | [arms/08-execution.md](arms/08-execution.md) | core three audited; hands pending |
52
+ | 10 | Observability | [arms/09-observability.md](arms/09-observability.md) | core three audited; hands pending |
53
+ | 7 | Refinement / self-improvement | [arms/10-refinement.md](arms/10-refinement.md) | **done in person — port confirmed**; judge delta + drift sync open |
54
+
55
+ Wide comparison: [arms/00-matrix.md](arms/00-matrix.md). Standing conclusions:
56
+ [insights.md](insights.md). Roadmap: [roadmap.md](roadmap.md).
57
+
58
+ ## Work order
59
+
60
+ 1. `sources/` inventories (all nine), then arms 01–02 (prompt, tools)
61
+ 2. Arms 03–06 (subagents, skills, context management, memory)
62
+ 3. Arms 07–09 (governance, execution, observability)
63
+ 4. Arm 10 (refinement ⭐ — the merge study against harness²) + `roadmap.md`
64
+ 5. `arms/00-matrix.md` last, from the finished arm docs
65
+
66
+ ## Method rules
67
+
68
+ - **Ground truth first.** Read the code before forming a position; every claim in an
69
+ arm doc needs at least one `path:line` citation per source, or an explicit
70
+ "unverified".
71
+ - **Describe, then judge.** The comparison table states what each harness does; the
72
+ trade-off section says why; only `adoption candidates` mentions this harness.
73
+ - **Respect the boundary.** Nothing here changes `src/`; study docs name no product
74
+ concept that the harness would learn. Adoption goes through the extension-point
75
+ flow later.
76
+ - **The anchor arms are the seven surfaces.** Prompt sections, tool providers,
77
+ `ToolPolicy`, `SecretStore`, `Directory`, plugin descriptions, `RefineHost` — map
78
+ foreign mechanisms onto these without inventing application concepts.
@@ -0,0 +1,20 @@
1
+ # Wide comparison matrix
2
+
3
+ One row per source per arm; ≤12 words per cell, verbs first. Detail and
4
+ citations live in the arm docs; this page is an index, not the analysis.
5
+
6
+ | Arm | this harness | opencode | omp (pi fork) | dsh | harness² | swe-agent | openhands SDK | kimi-cli | smolagents | claude-code |
7
+ |---|---|---|---|---|---|---|---|---|---|---|
8
+ | 01 prompt | compile.ts only; stable prefix + hidden context updates | template + deltas appended to history | parallel compiler; two-block cache; static invariant | ordered per-step sections + user snapshot | tree IS prompt, capped always-on | yaml config templates | pending | pending | step-log replay | CLAUDE.md hierarchy (pending) |
9
+ | 02 tools | providers + per-call gate; `{product}` | Effect plugins, codemode, MCP names | 30 rich builtin tools, tiers | defineTool registry, PTC mode | editable c4 guidance | YAML string bundles | pending | kosong abstract layer (archived) | code actions, @tool | descriptions answer how (pending) |
10
+ | 03 subagents | fresh run children + delivery receipts | subagent tool, fresh sessions, description route | task tool, worktree isolation, speculative | spawn/fork service, continuable | c5 own-context text agents | runs only | per-container opens | pending | none in-source | agents files (pending) |
11
+ | 04 skills | c6 tree skills, trust-gated loader | depth-6 scan, skill lazy-load | manage_skill; memory writes skills | durable capped catalog + skill tool | trigger lines validated | procedures via bundles | microagents (pending) | klips dir | prompt templates | SKILL.md (pending) |
12
+ | 05 context | context message + budgets | compaction agent, fixed template, verbatim tail | method ladder, snapcompact deterministic | formula trigger, prune first, FTS5 query | replica-era limits, trim-to-pay | bounded single shots | condensers pending | pending | full replay memory | auto-compact (pending) |
13
+ | 06 memory | wiki notes on file writes; guarded refine lane | none visible | 5 backends, two-phase consolidation, MEMORY.md | durability only: spill/todo/deliverables | per-domain experience library | none | pending | pending | step log | memory files (pending) |
14
+ | 07 governance | gate last; standing + single-use | per-leaf asserts, always/deny/ask | tier×policy, fails closed | pre-execute pipeline + guard | substrate-dependent | curated blocklists | confirmation policy | archived | executor = gate | permission modes (pending) |
15
+ | 08 execution | account-isolated sessions; host PTY | shell tool + separate pty daemon | in-process rust unix env | sandbox classes + single executor | substrate workspace | container env | workspace containers | kaos (archived) | intercepted exec | desktop app (pending) |
16
+ | 09 observability | runStore-only validated events | bus + UsageRecorded | stats dashboard + ledgers | OTel transport only, FEEDBACK_ONLY | runmark + reports | trajectories + inspector | event stream | klips vis | monitor.py | sentry optional |
17
+ | 10 refinement | ported harness² core (arm 10) | none | autoresearch hillclimb loop | none found | editor→probe→compose + reflector | IC design lessons | none found | archived | none | plan mode only |
18
+
19
+ Fill rule for later passes: replace `pending` from each source note's audit;
20
+ mark archived designs and reference the note.
@@ -0,0 +1,211 @@
1
+ # Arm 01 — System prompt / context assembly
2
+
3
+ Status: **core four audited** (opencode, omp, dsh, harness²); swe-agent,
4
+ openhands, kimi-cli, smolagents, claude-code pending.
5
+ Sources audited by explorer agents with citations; my own spot-checks marked.
6
+
7
+ Shape: design space → per-source comparison → trade-offs → adoption candidates.
8
+
9
+ ## 1. Design space
10
+
11
+ Where the model's instructions come from when a session starts, and how they
12
+ evolve mid-session. Sub-decisions:
13
+
14
+ 1. **Assembly location** — one compiler, a grid-like assembler, or a template
15
+ engine? Who is *allowed* to contribute (core only, plugins, file discovery)?
16
+ 2. **Static vs dynamic** — what is identical across calls of a session (or across
17
+ sessions, for cross-session cache) vs what must be refreshed; and *where* each
18
+ is injected (system message at node 0, later system messages, user messages
19
+ after history, synthetic messages inside history).
20
+ 3. **Reach of instructions** — always-on prose vs skills vs hooks vs scripts;
21
+ caps and budget language.
22
+ 4. **Cache discipline** — prefix stability, cache breakpoints, proactive
23
+ warming, append-only updates.
24
+ 5. **Editability/versioning** — how the tree of instruction files is versioned
25
+ or validated (this harness: never edit, only supersede).
26
+
27
+ ## 2. Comparison
28
+
29
+ ### this harness (reference point)
30
+
31
+ - The prompt is assembled only in `src/prompt/compile.ts`; sessions launch with a
32
+ stable system prefix plus a hidden `xingular-context` message appended to
33
+ native history for changing state (repo rules; `AGENTS.md`). Tree sections
34
+ c1–c8 are versioned; c1–c4 always-on and capped/validated (`tree/tree.ts`);
35
+ a version is never edited, only superseded (`tree/store.ts`).
36
+
37
+ ### opencode — compiler + instruction deltas
38
+
39
+ - Small text template with a tool-guidance placeholder, rendered per tool list
40
+ (`external/opencode/packages/core/src/session/system-prompt.ts:9-27`; the
41
+ template is `session/runner/prompt/system.txt`).
42
+ - Per-step transcript: system = agent template **plus an instruction baseline as
43
+ a second system part**; messages = history (`.../session/model-request.ts:99-119`).
44
+ - Instruction sources composed in a fixed order (codemode catalog, MCP,
45
+ references, skills, AGENTS.md discovery, builtins, API entries) with a comment
46
+ stating the order keeps "a reusable prompt-cache prefix"
47
+ (`.../session/context.ts:137-166`, comment at 152-154).
48
+ - Dynamic updates are **appended as system messages after history, before the
49
+ new user prompt**: AGENTS.md changes render as a unidiff patch or a full
50
+ rewrite; date/env/codeMode changes likewise (`.../session/generate.ts:53-57`,
51
+ `.../session/instruction-discovery.ts:127-149`, `.../session/builtins.ts:30-52`).
52
+ - Discovery: global file, ancestor walk, configured globs/URLs, watcher-driven
53
+ reload; **no size caps found** in the discovered files (auditor: unverified
54
+ beyond those files) (`.../config/plugin/instruction.ts:51-62,143-225`).
55
+ - On-demand AGENTS.md: the `read` tool injects ancestors as synthetic history
56
+ messages deduped by metadata (`.../tool/plugin/read.ts:82-104` →
57
+ `.../session/instructions.ts:74-79`).
58
+ - Cache hygiene: stable `promptCacheKey` from session affinity
59
+ (`.../model-request.ts:294-295`), tool definitions kept on the final step to
60
+ preserve the prefix (`.../runner/llm.ts:237`), prefix-stable image elision
61
+ (`.../model-request.ts:199-207`).
62
+ - Plugins get a per-request hook over `system`, `messages`, `tools`, `options`,
63
+ with tool-identity matching to prevent hook-invented tools
64
+ (`.../model-request.ts:236-320`, `packages/plugin/src/effect/session.ts:25-36`).
65
+
66
+ ### omp (oh-my-pi) — parallel compiler with deadlines, two-block cache
67
+
68
+ - `buildSystemPrompt` fans out **timed, parallel** preparation (project context
69
+ files, skills, workspace tree, active-repo context, personality; each with a
70
+ deadline fallback) (`external/omp/packages/coding-agent/src/system-prompt.ts:630,723-848,954-1009`).
71
+ - All prompt text lives in `.md` Handlebars templates, imported `{type:"text"}` —
72
+ repo rule "Prompts never in code"
73
+ (`.../system-prompt.ts:24-31`, `.../prompts/system/system-prompt.md`).
74
+ - **Stable prefix is a separate entry**: the default body renders as block 0;
75
+ `<project-context>` is appended as a *second prompt entry* so the static
76
+ prefix is shared across directories — with the comment that the Anthropic head
77
+ cache breakpoint lands right before it (`.../system-prompt.ts:1026-1036`).
78
+ - **Volatile content (date/cwd) was deliberately moved out of the system
79
+ prompt** because it "invalidated the whole tool array"; now injected onto the
80
+ first user turn per request, append-only, with a synthetic developer turn when
81
+ no new user turn exists (`.../session/date-cwd-reminder.ts:1-11,50-129`;
82
+ wired at `.../sdk.ts:4333-4340`).
83
+ **Verified in person**: `.../date-cwd-reminder.ts:1-12` — header comment states
84
+ the reason (open-weight chat templates render tool schemas *after* system
85
+ content, so a volatile tail invalidates the whole tool array), and lines 44-48
86
+ guarantee append-only injection: changed values attach to a newly appended
87
+ user turn, leaving every earlier message byte-identical.
88
+ - Instructions arrive via a **capability API**, not hard-coding:
89
+ `contextFileCapability` (project AGENTS.md family with dedupe), `systemPromptCapability`
90
+ (SYSTEM.md override), `instructionCapability` — extensions add content through
91
+ named slots (`.../capability/context-file.ts:26-56`,
92
+ `.../capability/system-prompt.ts:31`).
93
+ - Cache: `CacheWarmer` replays requests at ~90% of cache lifetime when savings
94
+ clear a floor (`.../session/cache-warmer.ts:1-17`); per-component token
95
+ usage breakdown (`systemPromptTokens`, `skillsTokens`, …,
96
+ `.../session/agent-session-types.ts:529-535`); truncating MCP server
97
+ instructions invalidates the tools cache breakpoint (`.../sdk.ts:1374-1375`).
98
+ - `metaharness` is **not** runtime prompt machinery: it is their benchmark
99
+ manager (Harbor/SnapCompact experiments over one SQLite store; runner note at
100
+ `.../packages/metaharness/src/runner.ts:1257-1258`). Their word "harness" in
101
+ `metaharness` = a harness around the harness, for measurement.
102
+
103
+ ### deepseek-harness (dsh) — ordered sections, snapshot-as-user-message
104
+
105
+ - Own package `packages/core/system-prompt`; assembled **per step** via an
106
+ ordered "waterfall" of sections/context entries
107
+ (`external/deepseek-harness/packages/core/system-prompt/src/index.ts:429,677-680`,
108
+ `.../agent-loop/src/agent.ts:272,407`).
109
+ - **Plugin contribution contract**: `ctx.systemPrompt.section()`, `.context()`,
110
+ `.tools(provider)`, `.variable(name, provider)` — sections are sorted by
111
+ numeric `order` then name, duplicates throw, scoped entries shadow globals,
112
+ and a `complete: true` section replaces everything else
113
+ (`.../system-prompt/src/index.ts:53-76,131-179,478-570,653-686`; shadowing
114
+ tested in `.../system-prompt/tests/scoped.spec.ts:33`).
115
+ - Static = section text at node 0 (identity fixed in code, `index.ts:449-466`);
116
+ dynamic facts (cwd, sandbox policy, time, plan) are `PromptContext` entries,
117
+ re-resolved per request and appended as a **durable user-role message**
118
+ headed "Current runtime context. This snapshot supersedes earlier…"
119
+ (`.../index.ts:314-318,582-602`, `.../agent-loop/src/agent.ts:411,429-440`).
120
+ - Workspace instructions also inject into history as sourced `user/message`
121
+ events, not system text (`.../packages/context/agent-instructions/README.md:88-103,158-186`).
122
+ - Tool ordering is part of prompt assembly: providers' tools are `structuredClone`d
123
+ and ordered by configured `toolOrder` with an `<unlisted-tools>` rest marker
124
+ (`.../system-prompt/src/index.ts:208-240,633-651,674`).
125
+ - Token metering as a service with fixed-density estimates
126
+ (`.../packages/llm/token-meter/src/index.ts:4-35`, `estimate.ts:16-27`).
127
+
128
+ ### harness² — the tree is the prompt; caps and economics
129
+
130
+ - Their editable tree per substrate (here for opencode): `systemprompt.md` (c1),
131
+ always-on files with caps, skills loaded on demand, subagents in own context,
132
+ scripts, and a plugin acting inside the tool loop
133
+ (`external/harness2/harness2/core/prompts.py:424-453`).
134
+ - Always-on prose is framed as an **output-budget** cost: "ALWAYS-ON PROSE IS THE
135
+ EXPENSIVE OPTION… the most costly failure on this work is a run that reasons
136
+ until the budget is gone and produces nothing" (`.../prompts.py:129-146,455-458`).
137
+ - Validation discards a whole harness for: a skill without a trigger line naming
138
+ it in always-on text; template braces in always-on text (Jinja StrictUndefined);
139
+ a named script that is missing (`.../prompts.py:148-167`,
140
+ `.../core/tree.py:15-21` — caps, frontmatter rules per `SurfaceSpec`).
141
+ - Notably, their opencode-surface table labels components **c1–c8** — the same
142
+ eight-component numbering this harness uses (`.../prompts.py:424-431`). Both
143
+ projects have converged on the same tree taxonomy; treat as confirmation of
144
+ shape, not shared code.
145
+ - Instruction-bearing text is data, not branches: "Benchmark text arrives as
146
+ values, never as branches" (`.../prompts.py:15-20`) — prompt templates are
147
+ parameterized by a `BenchPrompts` value, and each new benchmark gets slots,
148
+ not edits. Answer-free framing is literally part of the prompt
149
+ (`ANSWER_FREE`, `.../prompts.py:38-44`).
150
+
151
+ ### claude-code (from public material, no clone) — pending
152
+
153
+ CLAUDE.md hierarchy + `@` imports + `#` quick-memory; tool descriptions as the
154
+ home of usage guidance. To be filled with dated citations.
155
+
156
+ ### swe-agent / openhands / kimi-cli / smolagents — pending
157
+
158
+ ## 3. Trade-offs
159
+
160
+ - **Stable prefix vs fresh state.** Everyone converges on stable static +
161
+ appended dynamic. Two designs for the dynamic: (a) appended *system* messages
162
+ rendering deltas (opencode), (b) appended *user-role* context snapshot whose
163
+ text supersedes earlier ones (dsh). (a) is precise (a unidiff names what
164
+ changed); (b) is simpler and carries whole state per turn, at the cost of
165
+ re-sending unchanged facts.
166
+ - **Where volatile values live.** omp's lesson is the strongest: even one line
167
+ of date/cwd inside the system prompt invalidates far more than itself (it
168
+ invalidated the whole tool-array cache). Moving it into the user turn costs a
169
+ message but saves the prefix. dsh's snapshot approach (user message) has the
170
+ same property w.r.t. the system node.
171
+ - **Who may contribute.** Ordered, deterministic contribution with declared
172
+ order + name ties (dsh) vs deployment-order composition with a cache comment
173
+ (opencode) vs capability slots with dedupe (omp). The deterministic-order end
174
+ is friendlier to caching and to reasoning about plugins; the discovery end is
175
+ friendlier to "just drop a file in the repo" workflows but needs watcher-driven
176
+ reload and dedupe, and risks unbounded size (opencode has no caps).
177
+ - **Economics of always-on text.** harness² puts the sharpest numbers-language on
178
+ it: always-on prose competes with output budget; prefer on-demand forms. This
179
+ matches this harness's capped c1–c4, with the difference that harness² enforces
180
+ the "cut to pay" rule by validation and this harness by editor review.
181
+ - **Templates in code vs files.** omp keeps every word of prompt text in `.md`
182
+ templates; harness² inlines exact prompts as Python constants but keeps
183
+ benchmark text as values; dsh fixes identity prose in the constructor. Pure
184
+ style until a person wants to review/audit prompt diffs — then files win
185
+ (reviewable without code knowledge).
186
+
187
+ ## 4. Adoption candidates (Tier 1 unless noted)
188
+
189
+ | # | Idea | From | Land as | Notes |
190
+ |---|---|---|---|---|
191
+ | A1 | Move volatile date/cwd out of the stable prefix into the first user turn (or the appended context message) | omp `date-cwd-reminder.ts` | prompt sections change in `src/prompt/compile.ts` | **verify our current placement first**; high cache value if our prefix carries date |
192
+ | A2 | Named, ordered prompt sections with deterministic order-name ties and duplicate-name rejection; scoped shadowing | dsh `system-prompt` contract | a rule inside plugin prompt sections (existing surface) | makes section ordering a contract instead of an implementation detail |
193
+ | A3 | Render instruction deltas as unidiff-style "what changed" text in the appended context message | opencode `instruction-state.ts` | the `xingular-context` hidden message mechanism | our channel exists; this is a rendering upgrade |
194
+ | A4 | Proactive cache warming near the provider's cache TTL | omp `cache-warmer.ts` | *not* a harness surface — host/app concern | Tier 2; needs measurement harness first (`probe-chat-cache-app.py` in the App) |
195
+ | A5 | Memory/prompts in reviewable template files rather than inline strings | omp rule | none now — style guidance for future prompt text | Tier 2, low cost, no behavior change |
196
+
197
+ Carry later: opencode's "no caps on discovered instructions" as an anti-pattern to
198
+ contrast with c1–c4 caps; harness²'s three discard rules (trigger line, no
199
+ template braces, shipped scripts) when tree validation is next touched (arm 04).
200
+ Also carry:
201
+ - **Model-conditioned policy as data.** omp forbids model-conditional branching in
202
+ code entirely — no `id.includes("claude")`; all model/provider policy lives in a
203
+ declarative KDL rule tree compiled to `rules.json`
204
+ (`external/omp/AGENTS.md` — "Model/Provider Policy Lives in KDL"). opencode
205
+ instead ships per-model prompt adjustments as *plugins*
206
+ (`external/opencode/packages/plugin/plugin/optimize.ts:16-86` — confirmed by
207
+ explorer audit). Same problem (per-model prompt/policy deltas), two answers:
208
+ data tables vs evaluated plugins.
209
+ - omp's **judge-questions convention** — per-feature JSON mapping question ids →
210
+ `{instructions, criteria?}` — is source material for arm 10 (refinement) and
211
+ its answer-free selector.
@@ -0,0 +1,79 @@
1
+ # Arm 02 — Tools
2
+
3
+ Status: **core four audited** (opencode, omp, dsh + harness²/tree, smolagents,
4
+ swe-agent in person); kimi-cli archived; claude-code openhands pending.
5
+
6
+ ## Design space
7
+
8
+ How tools are declared (interface & schema origin), described (who writes the
9
+ model-facing guidance), provided (core vs provider vs plugin vs MCP), named and
10
+ ordered (namespacing, `toolOrder`), gated (tier/policy/event pipeline), and
11
+ whether tools are JSON calls at all — or the model writes code that calls them
12
+ (codemode / PTC / CodeAct).
13
+
14
+ ## 1. Comparison
15
+
16
+ | Source | Declaration | Gating | Calls |
17
+ |---|---|---|---|
18
+ | this harness | provider extension points; `describeTool` fills `{product}`; definitions in `src/tools/definitions.ts`, dispatch in `src/tools/dispatch.ts` | per-call gate, last extension to see a call | JSON + limited code tool |
19
+ | opencode | internal Effect plugins registering via `ctx.tool.transform(editor.add)`; `Tool.Info{input,execute,output,options{namespace,permission,codemode,pinned}}` | per-leaf `Permission.assert` (`allow\|deny\|ask`, `findLast` wildcard match, default ask; agent rules∪session; missing agent denies) | JSON by default, `codemode:true` folds tools into a code catalog |
20
+ | omp | 30 builtins; rich `AgentTool` (approval tier read\|write\|exec, loadMode, docTopics, per-call concurrency, speculation) | tier × per-tool policy `allow\|deny\|prompt`, modes `always-ask\|write\|yolo`; **fails closed** | JSON; speculative pre-dispatch |
21
+ | dsh | `defineTool` into `ctx.tools`; ToolRuntime self-feeds the system prompt via `.tools(provider)` | fixed pipeline `pre-execute(allow/deny/ask) → ctx.tools.guard() → execute → post-execute → result` | `mode: native` (all schemas) vs `ptc` (model sees only `run_code` + SDK) |
22
+ | harness² | tools = part of the editable tree, c4 tool guidance prose | whatever the agent's substrate does | JSON (substrate tools) |
23
+ | swe-agent | YAML bundles: `signature`/`docstring`/arguments; string parsing; `state_command` for interface state | curated blocklists in bundles | text commands into a stateful shell |
24
+ | smolagents | `@tool` decorated functions, schema from type hints, validated at init | none in-source (executor sandbox is the gate) | **code actions**; MCP tools bridged into code |
25
+ | kimi-cli | kosong async tool-orchestration abstraction (archived) | — | JSON |
26
+
27
+ Citations: opencode `external/opencode/packages/core/src/tool/plugin/subagent.ts:100-107`,
28
+ `.../tool.ts:161-291,233,293-296`, `.../permission.ts:87-97,158-172`,
29
+ `.../tool/runtime.ts:276-281`, `.../tool/mcp.ts:20-21,52-75`;
30
+ omp `external/omp/packages/agent/src/types.ts:1129-1243`,
31
+ `.../tools/approval.ts:17-18,53-84,100`, `.../tools/builtin-names.ts:1-36`;
32
+ dsh `external/deepseek-harness/packages/core/tools/README.md:30-109`,
33
+ `.../core/tools/src/index.ts:608-612,857,1513-1527`,
34
+ `.../core/system-prompt/README.md:50-52`; swe-agent
35
+ `external/swe-agent/tools/windowed/config.yaml:1-40`; smolagents
36
+ `external/smolagents/src/smolagents/tools.py` (init validation),
37
+ `.../tool_validation.py`.
38
+
39
+ Instruction-bearing descriptions: opencode embeds whole prose instructions in
40
+ tool descriptions, e.g. the never-poll rule for subagents
41
+ (`.../tool/plugin/subagent.ts:44-47`) and todo's full-file description imported
42
+ verbatim (`.../tool/todowrite.txt`, `.../tool/plugin/todo.ts:12`) — matching
43
+ the claude-code school. omp instead renders descriptions from static `.md`
44
+ templates (`.../tools/read.ts:975-996`; "prompts never in code"). dsh's `ptc`
45
+ moves *all* tool knowledge out of schemas into a generated SDK plus
46
+ `executionInstructions` (`.../core/tools/README.md:68-81`).
47
+
48
+ ## 2. Trade-offs
49
+
50
+ - **Tool descriptions = prime instruction real estate.** Every source pushes how-to
51
+ into descriptions; the divergence is *where the text lives*: inline strings
52
+ (opencode), md templates (omp, self-documenting diffs), schema-erased SDKs (dsh
53
+ ptc). md templates are cheapest to audit; inline is cheapest to write.
54
+ - **Gate taxonomies.** omp's declared tier × policy is the most legible to users;
55
+ opencode's per-leaf asserts are the most composable (plugins wrap calls);
56
+ dsh's pipeline events generalize hooks at the cost of indirection. All three
57
+ (and ours) converge on `ask` as a first-class outcome that surfaces to a person.
58
+ - **`toolOrder`/namespacing.** dsh validates order config at assembly with a
59
+ reserved rest margin; opencode mints `server_tool` names with dotted→underscore
60
+ namespaces; omp caps length at 64. Namespacing rules should be one place; ours
61
+ has MCP namespaces via the harness's own MCP integration — worth a contract
62
+ test, not new machinery.
63
+ - **Code-as-action in three strengths.** Full CodeAct (smolagents), opt-out
64
+ codemode (opencode), mode-switched PTC with SDK (dsh). All reduce schema token
65
+ cost and multi-call latency, all concentrate risk into the executor. For this
66
+ harness the gate is per-call and synchronous — free-form code actions are a
67
+ deliberate non-goal, but `codemode`-style *internal* catalogs remain open
68
+ behind existing tool providers.
69
+
70
+ ## 3. Adoption candidates
71
+ | # | Idea | From | Land as | Tier |
72
+ |---|---|---|---|---|
73
+ | A1 | Per-tool **approval tier declaration** (read/write/exec) on the harness ToolSpec; gate consults it when policy is silent | omp `AgentTool.approval` | `ToolPolicy` surface + `src/tools/types.ts` | T1 |
74
+ | A2 | Tool **descriptions from template files** rendered per `{product}` (`.md` in repo, imported `type:"text"`) instead of inline string literals in tool definitions | omp | tool definitions (`src/tools/*`) | T1 |
75
+ | A3 | `toolOrder`-style validated ordering when a caller pins an explicit tool set (fail loudly on unknowns/missing rest-marker) | dsh | capability freezing at `sessions.run` | T2 |
76
+ | A4 | Restrict allow/deny masks scoped to a subexpression that intersect and lift on dispose | dsh `ctx.tools.restrict` | child-run capability narrowing (`capabilities.intersect` already does this — verify equivalence before adding) | T2 verify-first |
77
+
78
+ Anti-candidates: open-ended code-as-action for model-driven tools (gate model);
79
+ moving gating into per-tool hooks (gate stays the final authority layer).
@@ -0,0 +1,90 @@
1
+ # Arm 03 — Subagents
2
+
3
+ Status: **core four audited** (opencode, omp, dsh, plus our ADR-0003 lineage);
4
+ openhands/claude-code pending.
5
+
6
+ ## Design space
7
+
8
+ Spawn model (tool vs scheduler vs server), child context (fresh, forked, or
9
+ continuable), isolation primitives (separate session, separate history, own
10
+ worktree/capabilities), delivery (block vs background + receipts), routing
11
+ (manual naming vs description-based auto-selection), and depth/capacity limits.
12
+
13
+ ## Comparison
14
+
15
+ **this harness.** `spawn_subagent` + `wait_subagents` tools
16
+ (`src/tools/spawnSubagent.ts`): child is "a fresh child run for independent
17
+ work… no conversation history and no more capabilities than you"; spawn returns
18
+ the child run id immediately; results arrive **automatically before you finish**
19
+ (native-history delivery receipts per ADR-0003); 24k per-report cap
20
+ (`spawnSubagent.ts` `reported()`); depth limits live in
21
+ `src/sessions/subagents.ts` (exported constants). Architectural statement:
22
+ Architectural statement:
23
+ opaque-run children (runStore writes, opaque ids).
24
+
25
+ **opencode — subagent is a tool, not a scheduler.** Agents registry
26
+ (`mode: primary|subagent`) with selectability excluding subagents from direct
27
+ conversation (`.../core/src/agent.ts:74-75`). The `subagent` tool rejects
28
+ primaries/unknowns, enforces depth via config, asserts permission, then creates
29
+ a child session and prompts it "You are a subagent spawned by another session."
30
+ — **fresh context, nothing inherited** (`.../tool/plugin/subagent.ts:129-218`).
31
+ Foreground variant blocks and wraps the final text in
32
+ `<subagent sessionID=… state="completed">`; background replies immediately with
33
+ an explicit **never-poll instruction** and completion notification
34
+ (`.../subagent.ts:19-27,229-265`). **Routing is description-based**: a context
35
+ hook appends "Available subagents:" with each agent's own description to the
36
+ tool description (`.../subagent.ts:282-309`).
37
+
38
+ **omp — spawn machinery with isolation budgets.** The `task` tool; agent
39
+ definitions from bundled + `~/.omp/agent/agents/*.md` + `.omp/agents/*.md`
40
+ (`.../task/index.ts:4-10`). `SpawnRun` holds a semaphore permit and streams
41
+ progress; the owner adopts binding abort signal/sinks
42
+ (`.../task/spawn-run.ts:47-88`). **Speculative launch starts the child while
43
+ the `tasks[]` argument is still streaming** (`.../task/speculative-launch.ts`).
44
+ Isolation: pinned settings, advisor forced off, **mid-turn compaction forced on
45
+ (whole assignment is one turn)**, isolated runs get their own **worktree** and
46
+ may not expose roots outside it (`.../task/executor.ts:1132,4033-4055,4339`).
47
+ Structured children get `yield` to stream partial results
48
+ (`docs/task-agent-discovery.md:38`).
49
+
50
+ **dsh — services + backends, two child topologies.** `ctx.subagents` +
51
+ provider backends (local, ACP, Codex, Claude DSH-SDK) + a tool plugin
52
+ (`.../packages/subagent/README.md:27-35`). Spawn returns `started subagent
53
+ <childId>` immediately; a completion notice delivery later
54
+ (`.../tool-subagent/README.md:59`). `spawn` = fresh child; **`fork` = seeded
55
+ from the parent's completed history** (`.../subagent/README.md:28-29` — the one
56
+ source with tree-history in context children). Local children **continue
57
+ accepting messages** (cold-resume); external backends "execute once"
58
+ (`:12,61`). Defaults: 8 active, depth 1 (`.../subagent/README.md:53,49`).
59
+ The model names presets from an enum allowlist; **no description routing**
60
+ (`.../tool-subagent/README.md:52,68`).
61
+
62
+ **openhands (pending)** conversation-per-container REST server;
63
+ **claude-code (pending)** `.claude/agents/*.md` description routing.
64
+
65
+ ## Trade-offs
66
+
67
+ - **Receipts vs block.** Ours receipts-then-auto-deliver; opencode's
68
+ foreground blocks and the background variant needs a no-poll instruction to
69
+ stop wasted loops — our "results arrive automatically" tool description does
70
+ the same thing natively. block variants pay latency, buy simplicity.
71
+ - **What the child sees.** Everyone defaults fresh. dsh's `fork` (parent history
72
+ as seed) is the only in-history-inherited design — powerful for "continue in
73
+ the main context's condition", dangerous for either prosecution
74
+ side-venting or slow joins; ours rejects it by `"no more capabilities than
75
+ you"` + fresh-run rule.
76
+ - **Isolation granularity.** worktree (omp isolated runs) is the strongest
77
+ world-isolation; ours ties isolation to account and run records instead. The
78
+ `tools` CSV narrowing idea maps to our `capabilities.intersect` — same
79
+ primitive, different vocabulary.
80
+ - **Routing.** Description-based auto-pick (opencode, and claude-code's docs)
81
+ puts all selection power in the model's reading; ours requires named briefs
82
+ and a Directory when names exist, which matches the opaque-id
83
+ contract (no names in the harness; names arrive via Directory).
84
+
85
+ ## Adoption candidates
86
+
87
+ | # | Idea | From | Land as | Tier |
88
+ |---|---|---|---|---|
89
+ | S1 | Inject capability-set summaries (slots "Current subagents") into the tool description **when names exist via Directory**, instead of static description | opencode context hook | tool provider building the spawn tool's description | T2 (only if app supplies names) |
90
+ | S2 | Receipt text carries child tool limits next to the 24k cap (`reported()` already does this only implicitly; make the receipt self-describing) | ours (deficiency) | `spawnSubagent.ts` | T1 |
@@ -0,0 +1,75 @@
1
+ # Arm 04 — Skills & loading
2
+
3
+ Status: **three sources audited** (dsh, opencode, harness² + our tree);
4
+ omp's skill tool verified as builtin only (`manage_skill`); claude-code/openhands pending.
5
+
6
+ ## Design space
7
+
8
+ Skill format and discovery, what ships in context (name+description only vs
9
+ whole body), how bodies are fetched (tool call vs command), trust (does loading
10
+ run code?), and the ruling constraint here: the harness is the only loader, with
11
+ extension discovery switched off.
12
+
13
+ ## Comparison
14
+
15
+ **this harness.** Skills are part of the versioned tree (c6), loaded only when
16
+ their exact code is trusted (`src/tree/trust.ts`), surfaced via tree sections
17
+ and `Plugins.loading` (src/plugins/) — extension discovery is disabled; the
18
+ seed includes an `autotrigger` mechanism (`src/tree/tree.ts`, used by
19
+ `src/tree/seed.ts`) — skills may carry trigger conditions compiled into
20
+ always-on text.
21
+
22
+ **opencode.** `SKILL.md` files found by a depth-6 scan
23
+ (`.../core/src/config/plugin/skill-scan.ts:3,29`), also fetched from URL
24
+ indexes into a global dir (`.../skill/discovery.ts:112,194`); availability is
25
+ permission-gated (`.../skill.ts:33-34`). Progressive disclosure: instructions
26
+ list skills in system context; the `skill` tool lazily loads the body "when
27
+ the task at hand matches its description", including a sampled file list
28
+ (`.../tool/plugin/skill.ts:19-33`).
29
+
30
+ **omp.** `manage_skill` builtin (30 builtins list,
31
+ `.../tools/builtin-names.ts:24`); skills also **emitted as a product of memory
32
+ consolidation** (`docs/memory.md:78-88` — learned lessons land in `skills/` on
33
+ disk), an unusual write-back path. Trust/approval per separate ability loading
34
+ unverified.
35
+
36
+ **dsh.** The cleanest contract: before the first request the model receives a
37
+ **durable catalog** — "available skill names and capped descriptions"
38
+ (default cap 500 chars) — and loads body instructions through the `skill` tool;
39
+ `/name` invocation injects the same instructions the user named;
40
+ catalog changes append a **complete replacement** message, empty catalog retires
41
+ old names (`.../packages/skill/tool-skill/README.md:12,54-57`).
42
+
43
+ **harness² — the validation-first school.** Frontmatter requires `name:`
44
+ matching the directory and a `description:`; a malformed file is silently dropped
45
+ load if malformed (`.../core/prompts.py:113-115` in the tts pack: naming rules,
46
+ and `.../prompts.py:151-157`: "An unnamed skill is never opened anyway").
47
+ Its three discard rules (trigger line naming the skill in always-on text; no
48
+ template braces; shipped scripts travel with the skill,
49
+ `.../prompts.py:148-167`, `.../core/tree.py` validation) turn prompt-prose
50
+ conventions into machine-checks — the same philosophy as our `validate()`.
51
+
52
+ **claude-code / openhands (pending).** SKILL.md progressive disclosure spec and
53
+ SDK microagents respectively.
54
+
55
+ ## Trade-offs
56
+
57
+ - **Catalog hygiene.** dsh's "complete replacement + empty retires" keeps
58
+ staleness windows near-zero on a cheap message; opencode's rescan keeps
59
+ file-truth simplicity. The durable-catalog variant is the better fit for our
60
+ file truth. The durable-catalog variant is the better fit for our
61
+ stable-prefix diagnostics (context updates could carry skill deltas).
62
+ - **Validation turns conventions into gates.** harness² proves skill trigger
63
+ lines and shipped scripts can be enforced mechanically; ours additionally
64
+ require trust for *code* — the sharpest position (everything model-visible is
65
+ a plugin, c8 loads only trusted content).
66
+ - **Cost shape.** Everyone: bodies are free until invoked; naming is the true
67
+ gate. An unnamed skill is dead weight in all four.
68
+
69
+ ## Adoption candidates
70
+
71
+ | # | Idea | From | Land as | Tier |
72
+ |---|---|---|---|---|
73
+ | K1 | Emit a **skill catalog delta** (name + capped description) in the hidden `xingular-context` message instead of relying on static tree text alone, when trees change mid-run | dsh durable-catalog + our context-update channel | `src/prompt/compile.ts` context update contents | T2 |
74
+ | K2 | Adopt harness²'s three validation rules into `validate()` (trigger-line presence for skills; script existence paths already enforced, re-verify) | harness² | tree validation + tests | T1 verify-first |
75
+ | K3 | **Enforce skill trigger lines mechanically** (autotrigger already carries triggers; keep prose+code in sync) | both | `src/tree/tree.ts` validation | T1 verify-first |