@xingular/harness 0.1.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +60 -0
  4. package/README.md +265 -71
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +14842 -9445
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +1170 -62
  373. package/docs/README.md +34 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0001-owned-terminal.md +87 -0
  403. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  404. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  405. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  406. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  407. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  408. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  409. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  410. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  411. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  412. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  413. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  414. package/docs/decisions/ADR-0013-doctor.md +27 -0
  415. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  416. package/docs/doctor.md +74 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  418. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  420. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  421. package/docs/features/README.md +20 -0
  422. package/docs/features/automations/README.md +41 -0
  423. package/docs/features/cores/README.md +39 -0
  424. package/docs/features/google-harness2/README.md +52 -0
  425. package/docs/features/integrations/README.md +40 -0
  426. package/docs/features/interfaces/README.md +29 -0
  427. package/docs/features/memory/README.md +28 -0
  428. package/docs/releases/1.0.0.md +40 -0
  429. package/docs/releases/README.md +36 -0
  430. package/docs/study/00-index.md +78 -0
  431. package/docs/study/arms/00-matrix.md +20 -0
  432. package/docs/study/arms/01-system-prompt.md +211 -0
  433. package/docs/study/arms/02-tools.md +79 -0
  434. package/docs/study/arms/03-subagents.md +90 -0
  435. package/docs/study/arms/04-skills.md +75 -0
  436. package/docs/study/arms/05-context-management.md +90 -0
  437. package/docs/study/arms/06-memory.md +90 -0
  438. package/docs/study/arms/07-governance.md +71 -0
  439. package/docs/study/arms/08-execution.md +69 -0
  440. package/docs/study/arms/09-observability.md +60 -0
  441. package/docs/study/arms/10-refinement.md +110 -0
  442. package/docs/study/btw-comparison.md +37 -0
  443. package/docs/study/feature-gap-review.md +42 -0
  444. package/docs/study/insights.md +123 -0
  445. package/docs/study/roadmap.md +72 -0
  446. package/docs/study/sources/claude-code.md +44 -0
  447. package/docs/study/sources/deepseek-harness.md +102 -0
  448. package/docs/study/sources/harness2.md +50 -0
  449. package/docs/study/sources/kimi-cli.md +42 -0
  450. package/docs/study/sources/omp.md +93 -0
  451. package/docs/study/sources/opencode.md +43 -0
  452. package/docs/study/sources/openhands.md +46 -0
  453. package/docs/study/sources/smolagents.md +40 -0
  454. package/docs/study/sources/swe-agent.md +34 -0
  455. package/docs/system-prompt-design.md +196 -0
  456. package/docs/terminal-tui.md +671 -0
  457. package/package.json +48 -12
  458. package/src/accounts/accounts.test.ts +0 -223
  459. package/src/accounts/accounts.ts +0 -522
  460. package/src/accounts/env.test.ts +0 -95
  461. package/src/accounts/env.ts +0 -338
  462. package/src/accounts/secrets.ts +0 -50
  463. package/src/accounts/store.ts +0 -338
  464. package/src/capabilities/api.ts +0 -75
  465. package/src/capabilities/runSnapshot.ts +0 -59
  466. package/src/capabilities/types.ts +0 -34
  467. package/src/cli.ts +0 -114
  468. package/src/core/bus.ts +0 -34
  469. package/src/core/changes.ts +0 -33
  470. package/src/core/env.ts +0 -27
  471. package/src/core/errors.ts +0 -32
  472. package/src/core/frontmatter.ts +0 -47
  473. package/src/core/fs.test.ts +0 -38
  474. package/src/core/fs.ts +0 -92
  475. package/src/core/index.ts +0 -193
  476. package/src/core/path.test.ts +0 -14
  477. package/src/core/path.ts +0 -79
  478. package/src/core/projects.ts +0 -90
  479. package/src/core/text.ts +0 -39
  480. package/src/harness.ts +0 -299
  481. package/src/index.ts +0 -70
  482. package/src/mcp/connections.ts +0 -614
  483. package/src/mcp/manager.ts +0 -130
  484. package/src/mcp/oauth.ts +0 -195
  485. package/src/mcp/scopeMigration.test.ts +0 -79
  486. package/src/mcp/scopeMigration.ts +0 -204
  487. package/src/mcp/service.test.ts +0 -376
  488. package/src/mcp/service.ts +0 -549
  489. package/src/mcp/types.ts +0 -108
  490. package/src/memory/api.test.ts +0 -82
  491. package/src/memory/api.ts +0 -289
  492. package/src/memory/blocks.test.ts +0 -78
  493. package/src/memory/blocks.ts +0 -406
  494. package/src/memory/caller.ts +0 -57
  495. package/src/memory/dispatch.ts +0 -59
  496. package/src/memory/facts.test.ts +0 -41
  497. package/src/memory/facts.ts +0 -248
  498. package/src/memory/graph.ts +0 -103
  499. package/src/memory/health.test.ts +0 -130
  500. package/src/memory/health.ts +0 -74
  501. package/src/memory/maintainer.ts +0 -272
  502. package/src/memory/maintenance.test.ts +0 -176
  503. package/src/memory/maintenance.ts +0 -330
  504. package/src/memory/migrate.ts +0 -79
  505. package/src/memory/operations.ts +0 -138
  506. package/src/memory/proposals.test.ts +0 -168
  507. package/src/memory/proposals.ts +0 -576
  508. package/src/memory/recall.test.ts +0 -104
  509. package/src/memory/recall.ts +0 -271
  510. package/src/memory/references.ts +0 -77
  511. package/src/memory/runContext.ts +0 -93
  512. package/src/memory/secrets.ts +0 -6
  513. package/src/memory/store.test.ts +0 -66
  514. package/src/memory/store.ts +0 -385
  515. package/src/memory/wiki.test.ts +0 -47
  516. package/src/memory/wiki.ts +0 -422
  517. package/src/memory/wikiIndex.test.ts +0 -88
  518. package/src/memory/wikiIndex.ts +0 -116
  519. package/src/plugins/api.ts +0 -181
  520. package/src/plugins/attachments.test.ts +0 -84
  521. package/src/plugins/attachments.ts +0 -141
  522. package/src/plugins/builtin.ts +0 -82
  523. package/src/plugins/catalogue.test.ts +0 -254
  524. package/src/plugins/catalogue.ts +0 -251
  525. package/src/plugins/cli.ts +0 -184
  526. package/src/plugins/discover.ts +0 -151
  527. package/src/plugins/firstParty.test.ts +0 -143
  528. package/src/plugins/firstParty.ts +0 -129
  529. package/src/plugins/hooks.test.ts +0 -250
  530. package/src/plugins/hooks.ts +0 -239
  531. package/src/plugins/identity.ts +0 -37
  532. package/src/plugins/install.test.ts +0 -107
  533. package/src/plugins/install.ts +0 -106
  534. package/src/plugins/inventory.ts +0 -123
  535. package/src/plugins/manifest.ts +0 -76
  536. package/src/plugins/plugins.test.ts +0 -205
  537. package/src/plugins/plugins.ts +0 -189
  538. package/src/plugins/proposal.ts +0 -121
  539. package/src/plugins/runtime.test.ts +0 -40
  540. package/src/plugins/runtime.ts +0 -82
  541. package/src/plugins/trust.ts +0 -142
  542. package/src/plugins/types.ts +0 -149
  543. package/src/prompt/compile.test.ts +0 -261
  544. package/src/prompt/compile.ts +0 -732
  545. package/src/server/methods.ts +0 -314
  546. package/src/server/remote.ts +0 -77
  547. package/src/server/rpc.ts +0 -116
  548. package/src/server/serve.ts +0 -28
  549. package/src/server/server.test.ts +0 -174
  550. package/src/sessions/approvals.ts +0 -118
  551. package/src/sessions/contracts.ts +0 -310
  552. package/src/sessions/conversation.test.ts +0 -150
  553. package/src/sessions/extensionSession.test.ts +0 -74
  554. package/src/sessions/extensionUi.test.ts +0 -65
  555. package/src/sessions/extensionUi.ts +0 -102
  556. package/src/sessions/history.ts +0 -51
  557. package/src/sessions/lineageJoin.ts +0 -75
  558. package/src/sessions/policy.ts +0 -32
  559. package/src/sessions/pricing.ts +0 -60
  560. package/src/sessions/reasoningSummaries.ts +0 -59
  561. package/src/sessions/registry.ts +0 -294
  562. package/src/sessions/runIndex.ts +0 -99
  563. package/src/sessions/runStore.test.ts +0 -152
  564. package/src/sessions/runStore.ts +0 -332
  565. package/src/sessions/runner.ts +0 -569
  566. package/src/sessions/runtimeResources.test.ts +0 -61
  567. package/src/sessions/sessions.test.ts +0 -455
  568. package/src/sessions/sessions.ts +0 -295
  569. package/src/skills/registry.test.ts +0 -104
  570. package/src/skills/registry.ts +0 -407
  571. package/src/terminal/cli.ts +0 -149
  572. package/src/terminal/client.ts +0 -74
  573. package/src/terminal/controller.ts +0 -227
  574. package/src/terminal/launch.test.ts +0 -34
  575. package/src/terminal/launch.ts +0 -88
  576. package/src/terminal/piExtension.ts +0 -210
  577. package/src/terminal/pluginControl.test.ts +0 -146
  578. package/src/terminal/pluginMenu.ts +0 -112
  579. package/src/terminal/socket.test.ts +0 -71
  580. package/src/terminal/socket.ts +0 -221
  581. package/src/terminal/standalone.test.ts +0 -130
  582. package/src/terminal/standalone.ts +0 -144
  583. package/src/terminal/terminal.test.ts +0 -330
  584. package/src/terminal/terminals.ts +0 -443
  585. package/src/tools/askUser.ts +0 -45
  586. package/src/tools/definitions.ts +0 -187
  587. package/src/tools/memoryTools.ts +0 -22
  588. package/src/tools/pluginPropose.ts +0 -41
  589. package/src/tools/types.ts +0 -39
  590. package/src/web/safeRequest.ts +0 -171
  591. package/src/web/text.ts +0 -53
  592. package/src/web/tools.ts +0 -134
  593. package/src/web/web.test.ts +0 -141
package/docs/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # Harness documentation
2
+
3
+ **Binding specification:** [Architecture](architecture/README.md). Code must follow it; a change
4
+ to it starts as a [proposal](architecture/proposals/README.md) the user reviews.
5
+
6
+ **Feature guide:** [Harness features](features/README.md) organizes current capabilities by area;
7
+ its pages are descriptive, while the architecture specification remains binding.
8
+
9
+ Current implementation: [Harness terminal frontend](terminal-tui.md). The package-level
10
+ [README](../README.md) describes the embedding API, accounts, plugins, memory and storage.
11
+
12
+ | ID | Record | Type | Status | Related |
13
+ |---|---|---|---|---|
14
+ | ADR-0014 | [Public release baseline](decisions/ADR-0014-public-release-baseline.md) | Decision | Accepted; candidate preparation | [Release procedure](releases/README.md), [PROP-0012](architecture/proposals/PROP-0012-release-baseline.md) |
15
+ | ADR-0013 | [Evidence-based diagnostics with opt-in live probes](decisions/ADR-0013-doctor.md) | Decision | Accepted; working tree implementation | [PROP-0011](architecture/proposals/PROP-0011-doctor.md), [Doctor guide](doctor.md) |
16
+ | SPEC | [Harness architecture specification](architecture/README.md) | Specification | Binding; as of 2026-10-21 | [Proposals](architecture/proposals/README.md), [Known drift](architecture/README.md#known-drift) |
17
+ | STUDY-0001 | [Agent-harness arm study](study/00-index.md) | Study | Arms 01–10 audited (core sources); matrix + roadmap done; remaining-source fills pending | [insights.md](study/insights.md), [roadmap.md](study/roadmap.md), [`/btw` comparison](study/btw-comparison.md) |
18
+ | DESIGN-0001 | [System-prompt design: fixed foundation + adapting harness](system-prompt-design.md) | Design | Draft — not yet accepted; refs current `compile.ts`/tree contracts | STUDY-0001 (arms 01, 10), [roadmap.md](study/roadmap.md) T1-1/9 |
19
+ | EXP-0001 | [Terminal input latency profile](experiments/EXP-0001-terminal-input-latency/plan.md) | Experiment | Completed on one local machine; slow-machine validation pending | ADR-0001, [Profile instructions](terminal-tui.md#input-performance-profile) |
20
+ | ADR-0012 | [Agents name their own native Pi sessions](decisions/ADR-0012-native-session-names.md) | Decision | Accepted; working tree implementation verified | [PROP-0010](architecture/proposals/PROP-0010-session-names.md) |
21
+ | ADR-0011 | [The harness is a fixed foundation running a mutating variant](decisions/ADR-0011-foundation-and-variants.md) | Decision | Accepted; implemented in 5.0.0 | [PROP-0009](architecture/proposals/PROP-0009-foundation-and-variants.md), [Foundation and variants](architecture/00-overview.md#foundation-and-variants) |
22
+ | ADR-0010 | [Lessons from ordinary runs live in the Wiki](decisions/ADR-0010-lessons-in-the-wiki.md) | Decision | Accepted; working tree implementation | [PROP-0008](architecture/proposals/PROP-0008-lessons-from-runs.md), [08 Memory and history](architecture/08-memory-and-history.md), [feature-gap review](study/feature-gap-review.md) |
23
+ | ADR-0009 | [Publish the Harness CLI as xharness](decisions/ADR-0009-xharness-command.md) | Decision | Accepted; implementation verified, npm publication pending authorization | [PROP-0005](architecture/proposals/PROP-0005-xharness-cli-name.md), [11 Terminal](architecture/11-terminal.md) |
24
+ | ADR-0007 | [A fixed Reporting section shapes the final reply](decisions/ADR-0007-reporting-section.md) | Decision | Accepted; working tree implementation | [PROP-0001](architecture/proposals/PROP-0001-reporting-section.md), [04 Prompt](architecture/04-prompt.md) |
25
+ | EXP-0002 | [OpenTUI typing latency against Pi and opencode](experiments/EXP-0002-opentui-typing-latency/plan.md) | Experiment | Completed on one local machine (Apple M2) | ADR-0006, EXP-0001, [Profile instructions](terminal-tui.md#input-performance-profile) |
26
+ | ADR-0006 | [OpenTUI is the only terminal frontend](decisions/ADR-0006-opentui-only-terminal.md) | Decision | Accepted; working tree implementation | ADR-0001, [Terminal architecture and evidence](terminal-tui.md) |
27
+ | ADR-0004 | [Fullscreen terminal layout with a fixed dock](decisions/ADR-0004-fullscreen-terminal-layout.md) | Decision | Superseded by ADR-0006 | ADR-0001, [Terminal architecture and evidence](terminal-tui.md) |
28
+ | ADR-0003 | [Shared asynchronous subagents with native-history delivery receipts](decisions/ADR-0003-shared-asynchronous-subagents.md) | Decision | Accepted; working tree implementation | ADR-0002, [Embedding API](../README.md) |
29
+ | ADR-0002 | [Native subagent lifecycle in Harness sessions](decisions/ADR-0002-native-subagent-lifecycle.md) | Decision | Superseded by ADR-0003 | [Embedding API](../README.md) |
30
+ | ADR-0001 | [Own the terminal frontend and keep Pi as the session runtime](decisions/ADR-0001-owned-terminal.md) | Decision | Accepted; working tree implementation | [Terminal architecture and evidence](terminal-tui.md) |
31
+
32
+ Living reference pages describe checked source behavior. Accepted decisions record the choice;
33
+ they do not establish publication or release. Evidence references on the terminal page identify
34
+ the inspected upstream artifacts and bound the verification claims.
@@ -0,0 +1,159 @@
1
+ # 00 Overview
2
+
3
+ ## Purpose
4
+
5
+ `@xingular/harness` runs one agent run well, on Pi, for any application that embeds it. It owns
6
+ what a model is told (the variant and the compiled prompt), what it can do (tools, the gate,
7
+ connected apps), what it remembers (Wiki notes, run history), how a run is recorded, and how a variant
8
+ of the harness is improved from evidence (refinement). It knows a *caller*, a *session* and a
9
+ *run*. It does not know what an application is or what its objects mean.
10
+
11
+ ## Layers
12
+
13
+ ```text
14
+ Application (for example the App repo) agents, groups, tasks, projects, worktrees, UI, PTY, keychain
15
+ │ seven extension points (01) and the server protocol (10)
16
+ Harness (this package) variants, prompt, sessions, runs, gate, Wiki, history, plugins, MCP, refinement, terminal
17
+ │ Pi SDK: createAgentSession, ModelRuntime, SessionManager, DefaultResourceLoader
18
+ Pi model calls, native JSONL history, tool execution, extensions
19
+ ```
20
+
21
+ - **Pi** supplies the model runtime, native history, tool execution and the extension API.
22
+ - **The harness** decides everything Pi is given: the account folder, the prompt, the tools, the
23
+ extensions, skills and prompts it may load, and the gate in front of each tool call. It records
24
+ every run.
25
+ - **The application** supplies what only it knows, through the extension points, and reads what
26
+ the harness records.
27
+
28
+ **Belongs in the harness:** Pi sessions and accounts, variants and refinement
29
+ (Propose–Probe–Compose, selection, the experience library), the prompt compiler and its delivery,
30
+ project notes (the Wiki), recall, the tool gate and standing approvals, connectors (MCP), terminal
31
+ sessions and their owned standalone frontend, generic web/isolated-browser tools, and the server protocol.
32
+
33
+ **Stays in the application:** agents, groups, conversations, tasks and coordination, projects and
34
+ worktrees, App browser UI and tab sharing, computer use, windows, the PTY, the keychain, and application UI.
35
+
36
+ This package is consumed as source by the App's sidecar and is meant to be embedded by other
37
+ applications, so a change here changes every application built on it.
38
+
39
+ The application side of the boundary is described in
40
+ [`App/docs/architecture/overview.md`](../../../App/docs/architecture/overview.md).
41
+
42
+ ## Foundation and variants
43
+
44
+ The harness has two halves, and every page uses these two words for them.
45
+
46
+ - The **foundation** is the part that is fixed. Code and release change it; nothing running
47
+ through it can. It is the Pi hookup, the prompt compiler and its budgets, sessions, runs and the
48
+ run recorder, the tool gate and standing approvals, accounts and their isolation, plugin-code
49
+ trust, the variant surface with its validator and always-on cap, the refinement method (its
50
+ budget identity and answer-free rule), the seven extension points and the server protocol.
51
+ - A **variant** is the part that mutates: one tree of eight components (c1–c8) for one scope,
52
+ stored as immutable, validated versions (page 03). A scope's *head* is the variant it runs now;
53
+ a *version* is a recorded variant; a *candidate* is a variant refinement proposed.
54
+
55
+ "The harness" means the foundation together with the variant it is running.
56
+
57
+ ```text
58
+ foundation ──runs──► variant (pinned head) ──► run record, events, trajectories
59
+ ▲ │
60
+ │ person adopts ▼
61
+ └────────── candidate variants ◄── refinement (improvers edit a copy)
62
+ ```
63
+
64
+ 1. The foundation runs a session on a pinned variant and records everything the run did.
65
+ 2. Refinement reads those records, lets improver sessions edit a *copy* of the variant, probes
66
+ each candidate and picks one final output without seeing a score (page 05).
67
+ 3. A person adopts a candidate. Only then does it become the head, and only with its plugin code
68
+ trusted. The next run pins the new head.
69
+
70
+ The rule between the halves is one-way. A variant decides what the agent is told and which
71
+ skills, scripts, subagents and plugins it may load. It cannot alter the compiler, the gate, the
72
+ recorder, accounts or trust: variant plugins run inside the tool loop, but the gate is always the
73
+ last extension loaded (`INV-GATE-2`). Refinement never edits the foundation (`INV-FND-1`) and has
74
+ one door into a variant (`INV-FND-2`).
75
+
76
+ When a rule is unclear, ask which half the thing belongs to. If an agent or an improver could
77
+ legitimately change it, it is a variant concern. If changing it would need a release, it is the
78
+ foundation. Page 04 and DESIGN-0001 draw the same line inside the prompt: foundation text is
79
+ contract prose about mechanics, variant text is work guidance.
80
+
81
+ The improver prompts in `refine/prompts.ts` and the evidence folder's `harness/` names keep the
82
+ Harness² paper's own vocabulary, where "the harness" is what the improver edits. They are method
83
+ text, and changing them would change the method (`INV-REF-3`).
84
+
85
+ ## Components
86
+
87
+ `Harness` (`src/harness.ts`) is the composition root. `createHarness(options)` builds one and
88
+ opens the data root.
89
+
90
+ | Member | Type | Module | Page |
91
+ |---|---|---|---|
92
+ | `env` | `HarnessEnv` (`root`, `directory`, `productName`) | `core/env.ts` | 01 |
93
+ | `accounts` | `Accounts` | `accounts/` | 09 |
94
+ | `sessions` | `Sessions` | `sessions/sessions.ts` | 02 |
95
+ | `runs` | `RunRegistry` | `sessions/registry.ts` | 02 |
96
+ | `subagents` | `Subagents` | `sessions/subagentService.ts` | 02 |
97
+ | `approvals` | `Approvals` | `sessions/approvals.ts` | 07 |
98
+ | `trust` | `VariantTrust` | `variant/trust.ts` | 03 |
99
+ | `refine` | `Refinements` | `refine/service.ts` | 05 |
100
+ | `plugins` | `Plugins` | `plugins/plugins.ts` | 06 |
101
+ | `hooks` | `Hooks` | `plugins/hooks.ts` | 06 |
102
+ | `apps` | `ConnectedApps` | `mcp/service.ts` | 09 |
103
+ | `hub` | `Hub` | `hub/hub.ts` | 09 |
104
+ | `terminals` | `Terminals` | `terminal/terminals.ts` | 11 |
105
+ | `bus` | `Bus` (state-changed notices) | `core/bus.ts` | 10 |
106
+
107
+ Modules with no member of their own: `variant/` (functions over the variant store), `prompt/compile.ts`,
108
+ `wiki/notes.ts`, `history/`, `tools/`, `capabilities/`, `server/`.
109
+
110
+ ### Lifecycle
111
+
112
+ 1. **Construct.** `isolateProcess` removes inherited credentials and points Pi's fallback folder
113
+ away from `~/.pi` before anything else. Stores and services are created.
114
+ 2. **Open a data root** (`open(dataRoot)`). Lays out folders, moves an earlier Wiki aside once,
115
+ migrates connection scopes, marks runs that never settled as interrupted (unless another live
116
+ process owns them), and syncs the recall index. Returns a `Recovery`, which lists the
117
+ interrupted runs; the application may continue one as a new run (`continueFrom`, page 02).
118
+ 3. **Serve.** Sessions, refinements, terminals and RPC calls run. Every run event is persisted,
119
+ then relayed to listeners; finished runs are indexed for recall and announced to hooks.
120
+ 4. **Close** (`close()`). Stops the hub, refinements, terminals and live runs, settles hooks,
121
+ closes connected apps and the index.
122
+
123
+ ## ETCLOVG: the harness's share
124
+
125
+ | Letter | The harness owns |
126
+ |---|---|
127
+ | **E** Execution | Isolated account folders, the Pi session, the terminal launch spec |
128
+ | **T** Tools | History, trajectory, Wiki notes, skill loading, `ask_user`, the run checklist, the connected-apps broker, the tool gate |
129
+ | **C** Context | The compiler, stable prefix and updates, the versioned variant (c1–c8), skills, on-demand Wiki notes |
130
+ | **L** Lifecycle | Run state, interrupt, recovery, approvals and questions, subagents, refinement |
131
+ | **O** Observability | Validated run events saved per run; usage counters |
132
+ | **V** Verification | Isolated refinement probes and answer-free selection |
133
+ | **G** Governance | The per-call gate, standing approvals, account pinning, redaction |
134
+
135
+ The application's column (PTY, worktrees, roles, tasks, review, schedules, UI) is in the parent
136
+ `AGENTS.md` and the App's architecture pages.
137
+
138
+ ## Invariants
139
+
140
+ - **INV-BND-1** The harness imports nothing from an application. Application data reaches it only
141
+ through the extension points (page 01) or the server protocol (page 10).
142
+ - **INV-BND-2** The harness names no application and no application concept (agent role, group,
143
+ task, pane, worktree, handoff, App browser workspace, computer use) in code paths it reads or text a model or
144
+ person sees. Text names the product through `env.productName` (default `Xingular Harness`;
145
+ `{product}` in a tool description). Ids such as `agentId`, `projectId` and a variant `scope` are
146
+ opaque; names come from `Directory` or `CallerContext.agentName`.
147
+ - **INV-BND-3** A new need of one application is met by a generic extension point or option,
148
+ never by a branch on an application's name or concept.
149
+ - **INV-BND-4** Variants, the prompt compiler and Wiki notes are synchronous (`variant/`, `prompt/`,
150
+ `wiki/`). A synchronous function is the critical section; do not make them async. Accounts, Pi,
151
+ MCP and refinement are async.
152
+ - **INV-BND-5** The process never launches against `~/.pi`, `~/.codex` or `~/.claude`, and never
153
+ inherits a credential variable (`isolateProcess`, page 09).
154
+ - **INV-BND-6** Tests never make a model request; they use a fake `SessionFactory`.
155
+
156
+ ## Source map
157
+
158
+ `src/harness.ts`, `src/index.ts` (public exports), `src/core/` (env, caller, bus, errors, fs,
159
+ text, index), `src/cli.ts` (command line).
@@ -0,0 +1,78 @@
1
+ # 01 Extension points
2
+
3
+ ## Purpose
4
+
5
+ An application adds what it knows to the harness through exactly seven surfaces. They are the
6
+ whole interface in the application-to-harness direction; anything else an application needs is
7
+ added as a new generic surface, by proposal.
8
+
9
+ ## Components
10
+
11
+ Each surface is an option of `createHarness` (`HarnessOptions`) or a per-run input, and has a
12
+ server-protocol equivalent for a host that is not a Node program (page 10).
13
+
14
+ | # | Surface | Declared in | How it is supplied | Over the protocol |
15
+ |---|---|---|---|---|
16
+ | 1 | Prompt sections | `Launch` in `prompt/compile.ts` (`sections: HostSection[]`, `toolGroups: HostToolGroup[]`, `references: Reference[]`) | `SessionRunInput.launch` per run | `sessions.run` params |
17
+ | 2 | Tool providers | `ToolProvider`, `ToolSpec`, `ToolSession` in `tools/types.ts` | `harness.sessions.provide(provider)` | `tools.register` + host call `tools.call` (`--host-tools`) |
18
+ | 3 | `ToolPolicy` | `sessions/policy.ts` (`scope`, `authorize`, `approval`, `connections`) | `HarnessOptions.policy` | host calls `policy.*` (`--host-policy`) |
19
+ | 4 | `SecretStore` | `accounts/secrets.ts` (`get`, `set`, `delete`) | `HarnessOptions.secrets` (default: owner-only file in the state dir) | host calls `secrets.*` (`--host-secrets`) |
20
+ | 5 | `Directory` | `core/env.ts` (`agentName`, `sessionAgent`) | `HarnessOptions.directory` | `directory.set` (`--host-directory`) |
21
+ | 6 | Plugin descriptions | `PluginDescriptor` in `plugins/types.ts` | `HarnessOptions.plugins`, `harness.describe()` | `plugins.describe` |
22
+ | 7 | `RefineHost` | `refine/host.ts` (`prepareWorkspace`, `session`, `deliverable?`) | `HarnessOptions.refineHost` (default: temp copy of the source, Pi file and shell tools) | — (Node only today) |
23
+
24
+ The caller is not an extension point but the frame every call carries: `CallerContext`
25
+ (`core/caller.ts`) holds opaque `agentId`, `projectId`, `sessionId`, `runId`, `agentName`,
26
+ `actor` (`Chat` or `Code`), `surface`, `recallExcludeAgents` and an opaque `policyContext` that the
27
+ harness forwards to the policy and never reads.
28
+
29
+ ## Contracts
30
+
31
+ 1. **Prompt sections.** A `HostSection` has `id`, `title`, `body` (`null` declares a withdrawn
32
+ slot), `budget`, `order`, optional `dynamic` and `pinned`. The harness places it among its own
33
+ sections by `order` (page 04).
34
+ 2. **Tool providers.** Providers are asked in the order they were added, for each session. Only
35
+ names in the run's frozen capability set are registered. A `ToolResult` may carry
36
+ `attachments` as `{ id, name, mimeType }` references; bytes stay with the provider.
37
+ 3. **`ToolPolicy`.** `scope(call)` → `ScopeDecision { allowed, requiresApproval?, automatic?,
38
+ humanOnly?, allowGlobalApproval?, reason? }`; `authorize(call)` throws to block and is asked
39
+ again after an approval; `approval(...)` returns `ApprovalFacts { unattended?, readOnly?,
40
+ inScope? }`; `connections(...)` narrows the connected apps. With no policy, every enabled tool
41
+ may run and gated tools ask the person.
42
+ 4. **`SecretStore`.** Keys are `<account id>/<name>` (`secretKey`).
43
+ 5. **`Directory`.** Every lookup may answer `null`.
44
+ 6. **Plugin descriptions** are data. They change what `plugins.list` and `plugins.inventory`
45
+ report, never what runs. A descriptor with a harness plugin's id is ignored.
46
+ 7. **`RefineHost`.** `prepareWorkspace` returns an isolated folder (never one a person works in)
47
+ and an optional `cleanup`; `session` returns a `RolloutSession` (caller, tools, launch, model,
48
+ account); `deliverable` maps file names to readable text.
49
+
50
+ ## Invariants
51
+
52
+ - **INV-EXT-1** There are seven extension points. Adding, removing or changing the shape of one is
53
+ an architecture change (proposal required).
54
+ - **INV-EXT-2** Every extension point is optional. The harness runs with none of them supplied.
55
+ - **INV-EXT-3** An extension point carries data or decisions the application owns. It never
56
+ carries an application's name or a branch for one application (`INV-BND-3`).
57
+ - **INV-EXT-4** Each Node extension point has a protocol equivalent, or the page says it is
58
+ Node-only (today only `RefineHost`).
59
+ - **INV-EXT-5** `CallerContext` fields are trusted host context, never model arguments. A tool may
60
+ not let the model set them.
61
+
62
+ ## Data
63
+
64
+ None of its own. Secrets go to the `SecretStore`; everything else is passed per call.
65
+
66
+ ## Source map
67
+
68
+ `src/core/caller.ts`, `src/core/env.ts`, `src/prompt/compile.ts` (`Launch`), `src/tools/types.ts`,
69
+ `src/sessions/policy.ts`, `src/accounts/secrets.ts`, `src/plugins/types.ts`
70
+ (`PluginDescriptor`), `src/refine/host.ts`, `src/server/remote.ts` (protocol equivalents).
71
+
72
+ ## Provider diagnostics
73
+
74
+ Tool providers optionally carry `diagnostics(context)` metadata (PROP-0011). Checks expose local
75
+ readiness callbacks and declared live probes. Existing callable provider functions remain valid.
76
+ This extends surface 2; the number of extension points remains seven. `WorldPart` forwards the
77
+ same callback. Remote `tools.register` accepts diagnostic descriptors; `tools.diagnose` returns
78
+ local readiness data. Optional remote single-tool probe recipes go through the normal gate.
@@ -0,0 +1,146 @@
1
+ # 02 Sessions and runs
2
+
3
+ ## Purpose
4
+
5
+ A *session* is a native Pi conversation. A *run* is one tracked execution interval of a session:
6
+ one turn from a request to an outcome. The harness opens Pi for each run with a pinned account,
7
+ a pinned variant, a frozen capability set, a compiled prompt and a gated tool list, then
8
+ records everything the run does as validated events.
9
+
10
+ ## Components
11
+
12
+ | Type | Module | Role |
13
+ |---|---|---|
14
+ | `Sessions` | `sessions/sessions.ts` | Starts a turn: `run(input: SessionRunInput)`, `provide(provider)`. Builds the gate. |
15
+ | `runTurn`, `piSessionFactory`, `loadResources` | `sessions/runner.ts` | Opens the Pi session, loads resources in a fixed order, streams events, settles the run. |
16
+ | `RunRegistry`, `ActiveRun` | `sessions/registry.ts` | Live runs: `emit`, `requestApproval`, `requestAnswer(s)`, `onInterrupt`, `onSteer`, `finish`; `listen` for observers. |
17
+ | run store functions | `sessions/runStore.ts` | `saveRun`, `updateRun`, `persistEvent`, `appendEvent`, `readEvents`, `markInterruptedRuns`, `runFamily`, `listRuns`. |
18
+ | `RunRecord`, `RunEvent`, schemas | `sessions/contracts.ts` | The one contract every session shares. |
19
+ | `Subagents` | `sessions/subagentService.ts` | `spawn`, `wait`, `results`, delivery receipts, recovery. |
20
+ | plan mode | `sessions/planMode.ts` | `planSection`, `planRefusal`, `PLAN_READ_ONLY_TOOLS`. |
21
+ | `Approvals` | `sessions/approvals.ts` | Standing approvals (page 07). |
22
+ | history selection | `sessions/history.ts` | `selectHistory`: which native history file a run continues. |
23
+ | `runIndex`, `pricing`, `reasoningSummaries`, `lineageJoin`, `extensionUi` | `sessions/` | Run listing, cost, provider summaries, parent/child joins, extension UI as run events. |
24
+
25
+ ## Runtime flow of `sessions.run`
26
+
27
+ 1. Validate the input (`run.id`, `sessionId`, `text`; an `initialBashCommand` only on a new
28
+ interactive user turn).
29
+ 2. Select the native history (`selectHistory`) and resolve the account (`accounts.resolve`).
30
+ 3. Resolve the caller's capabilities, intersect with any narrower requested set, and **freeze**
31
+ them for the run (`capabilities/runSnapshot.ts::freezeRun`).
32
+ 4. **Pin** the variant once (`variant/materialise.ts::materialise`).
33
+ 5. `saveRun` with status `queued`, the account, `harnessScope` and `harnessVersion`.
34
+ 6. Compile the prompt (`sessionLaunch`, page 04): a stable system prompt and an optional context
35
+ update.
36
+ 7. `runs.start` the live run; build the tool list (broker, harness tools, `ask_user`, subagent
37
+ tools, provider tools) and the gate.
38
+ 8. Open Pi through the `SessionFactory`, with resources loaded in order: disk extensions chosen by
39
+ the harness, variant extensions, inline extensions, and the gate last.
40
+ 9. Record `nativeSessionId`, register the run with `Subagents`, start `runTurn`, and return
41
+ `{ runId, nativeSessionId }`. The reply streams as run events.
42
+
43
+ A session that cannot open ends its run as `failed` and returns `nativeSessionId: null`.
44
+
45
+ ## Contracts
46
+
47
+ - **Run status:** `queued`, `running`, `waiting_for_approval`, `waiting_for_input`, `interrupted`,
48
+ `completed`, `failed`. The first four are active (`ACTIVE_STATUSES`).
49
+ - **Run events** (`runEventTypeSchema`): `started`, `context.snapshot`, `message.delta`,
50
+ `message.completed`, `message.steered`, `tool.started`, `tool.completed`, `retry.started`,
51
+ `retry.ended`, `compaction.started`, `compaction.ended`, `approval.requested`,
52
+ `approval.resolved`, `question.requested`, `question.answered`, `extension.notice`,
53
+ `reaction.added`, `agent.message`, `checklist.updated`, `artifact.added`, `file.changed`, `usage.updated`,
54
+ `account.status`, `status.changed`, `failed`, `completed`. Each has a payload schema in
55
+ `runEventPayloadSchemas`.
56
+ - **Checklist** (PROP-0006): `checklist.updated` carries the whole list the model last wrote with
57
+ `checklist_write`, `{ items: { text, status: pending | in_progress | completed }[] }`, at most 50
58
+ items. The latest event replaces every earlier one; `checklistOf(events)` reads it.
59
+ - **`RunRecord`** fields are listed in `sessions/contracts.ts`. `mode`, `harness`, `sessionType`,
60
+ `worktreeId`, `attachmentCount`, `exitCode`, `handoffId` and `trigger` belong to the
61
+ application: stored and returned, and only `mode` and `trigger` are read.
62
+ - **Triggers the harness reads:** `user` (may carry an initial Bash command), `probe` and
63
+ `improver` (refinement, page 05), `reflection` (lessons, page 08). Runs with the last three are
64
+ never asked about: the gate refuses what would need a person.
65
+ - **Subagents.** `spawn_subagent` / `wait_subagents` for the model; `subagents.spawn`, `wait`,
66
+ `results` for the host (`sessions.spawnSubagent` is a compatibility alias). Child runs have
67
+ `relation: 'subagent'` and `parentRunId`. Nesting defaults to 1, at most 3 (`subagentDepth`).
68
+ - **Plan mode** (`plan: true`). The tool list is unchanged; the gate refuses everything outside
69
+ `PLAN_READ_ONLY_TOOLS`, provider tools marked `readOnly`, and calls a provider marks
70
+ `planModeSafe`. The plan instruction arrives as a dynamic section; the reply ends with one
71
+ `<proposed_plan>` block.
72
+ - **Continuation** (PROP-0007). `continuationOf(root, runId, sessionDir?)` (`runs.continuation`)
73
+ says whether a stopped run can be continued: `resumable`, a `reason` when not (`not_found`,
74
+ `active`, `completed`, `no_history`, `history_missing`), the exact native history to reopen,
75
+ the pinned account, variant version and capability set, the checklist, unanswered approvals and
76
+ questions, the last tool and whether it finished, and subagents that did not finish.
77
+ `SessionRunInput.continueFrom` starts a **new** run from it: it reopens that history, records
78
+ `resumedFromRunId`, pins the same account, variant version and capability set (anything different
79
+ fails with `continuation_mismatch`; a run that cannot be continued fails with
80
+ `continuation_unavailable`), defaults empty text to "Continue from where you stopped.", and adds
81
+ a dynamic `continuation` section (order 26) saying where the earlier run stopped. The next run
82
+ without `continueFrom` withdraws it. `Recovery.interruptedRunIds` lists the runs `open` marked
83
+ interrupted.
84
+ - **Usage** (`usage.updated`). `inputTokens` is uncached input; `cacheReadTokens` and
85
+ `cacheWriteTokens` are separate; `outputTokens` includes `reasoningTokens`. Totals are
86
+ cumulative for the run, not the native session. `contextTokens` is the latest request's size.
87
+
88
+ ## Invariants
89
+
90
+ - **INV-RUN-1** A run pins one account, one variant version and one capability set when it
91
+ starts. None of them changes during the run. A pinned account that cannot be used fails the
92
+ run; it is never swapped (`INV-ACC-2`).
93
+ - **INV-RUN-2** A run's capability set is written once (`freezeRun`). A resumed or duplicate launch
94
+ with a different set fails with `capabilities_frozen`. A child run's set is the intersection of
95
+ its parent's and what it asked for; it never widens.
96
+ - **INV-RUN-3** Every run event is validated against its schema, redacted, persisted, and only then
97
+ relayed to listeners, in order. An event that arrives after the run settled is kept as evidence
98
+ and never applied or relayed.
99
+ - **INV-RUN-4** A restarted harness never restarts model work. On `open`, runs left active are
100
+ marked `interrupted` unless another live process owns them (`owner.json`). Recovery of a
101
+ subagent needs the same account, caller, working folder and history branch. Continuing is always
102
+ a new run the application asks for with `continueFrom`; it pins the earlier run's account, variant
103
+ version and capability set, and the earlier run's record is never reopened.
104
+ - **INV-RUN-5** Unattended runs (`automatic: true`) load no extension found on disk, read no
105
+ context files, and never ask a person: anything that would need approval is refused. A variant's
106
+ own trusted plugins still load.
107
+ - **INV-RUN-6** Only the harness writes `runs/<id>/`; an application reads it. `run.json`,
108
+ `events.jsonl`, `owner.json` and `subagents.json` are written only through
109
+ `sessions/runStore.ts`. Side files are written by their owning module: `context.json`
110
+ (`prompt/compile.ts`), `caller.json` (`sessions/sessions.ts`), `capabilities.json`
111
+ (`capabilities/runSnapshot.ts`), `mcp-context.json` (`mcp/service.ts`). Adding another writer
112
+ or side file needs a proposal. (See drift D-1.)
113
+ - **INV-RUN-7** Token accounting follows the usage contract above. Changing what a field means is
114
+ an architecture change.
115
+ - **INV-RUN-8** Plan mode never changes the tool list or the system prompt, so switching it keeps
116
+ the cached prefix. Its refusals happen before approvals and no approval can lift them.
117
+ - **INV-RUN-9** Subagent results reach the parent at native turn boundaries, at most once
118
+ automatically (typed receipts in native history). A parent joins outstanding children before it
119
+ completes.
120
+ - **INV-RUN-10** An initial Bash command is allowed only on a new interactive user turn (not
121
+ automatic, plan, resumed, continuing, relation, probe or improver runs), must match the leading `!` command
122
+ in the text, and passes the same gate as model-issued Bash.
123
+
124
+ ## Data
125
+
126
+ `<data root>/runs/<id>/`: `run.json`, `events.jsonl`, `owner.json`, `subagents.json`,
127
+ `context.json`, `caller.json`, `capabilities.json`, `mcp-context.json`. Native history lives in
128
+ the session directory the caller passes (`sessionDir`), owned by Pi.
129
+
130
+ ## Source map
131
+
132
+ `src/sessions/*.ts`, `src/capabilities/runSnapshot.ts`, `src/tools/spawnSubagent.ts`.
133
+ Decisions: [ADR-0002](../decisions/ADR-0002-native-subagent-lifecycle.md) (superseded),
134
+ [ADR-0003](../decisions/ADR-0003-shared-asynchronous-subagents.md).
135
+
136
+ ## Native session names (PROP-0010)
137
+
138
+ `session_name({ name: string })` adds or revises the current Pi session's name in embedded
139
+ and terminal execution. The agent names meaningful work early and revises it when the overall
140
+ objective changes, including a manual name. Agent-submitted names are imperative sentences
141
+ of at most six whitespace-separated words; whitespace is normalized, and empty names,
142
+ terminal escapes, non-whitespace controls and longer names fail without writing. Identical
143
+ names are a no-op. Pi's native session-info history is the only storage; continuation and
144
+ reopen preserve it. Each child names only itself. There is no additional model request or
145
+ run-event schema. The normal capability selection and host gate apply; `harnessTools: false`
146
+ omits the tool. Plan mode permits it as session metadata maintenance.
@@ -0,0 +1,95 @@
1
+ # 03 Variants
2
+
3
+ ## Purpose
4
+
5
+ A **variant** is the part of the harness that is allowed to change: everything that shapes an
6
+ agent's behaviour apart from the model, the application's own sections and the foundation
7
+ (page 00). It is eight components (c1–c8, after Harness²). Each caller scope has
8
+ content-addressed, validated, immutable versions of its variant and a head, the variant it runs
9
+ now. A run pins one version. Refinement (page 05) proposes new variants; a person adopts them.
10
+
11
+ What a variant may contain is fixed by the foundation: the surface (`PI_SURFACE`), the validator
12
+ and the always-on cap. A variant can change what the agent is told and which skills, scripts,
13
+ subagents and plugins it may load. It cannot change the prompt compiler, the gate, the run
14
+ recorder, accounts or trust.
15
+
16
+ Earlier documents called this the "harness tree" and its invariants `INV-TREE-n`; those are now
17
+ `INV-VAR-n`.
18
+
19
+ ## Components
20
+
21
+ The surface is `PI_SURFACE` (`variant/surface.ts`), the one surface this harness runs.
22
+
23
+ | c | Component | Path in the variant | Reaches a run | Group |
24
+ |---|---|---|---|---|
25
+ | c1 | System prompt | `systemprompt.md` | always (prompt section `system`, order 25) | context |
26
+ | c2 | Guardrails | `guardrails.md` | always (`guardrails`, 40) | context |
27
+ | c3 | Memory | `memory.md` | always (`memory`, 45) | context |
28
+ | c4 | Tool guidance | `tool_guidance.md` | always (appended to the `tools` section) | tool interface |
29
+ | c5 | Subagents | `sub_agents/<name>/AGENT.md` | own context, listed in `subagents` (64) | orchestration |
30
+ | c6 | Skills | `skills/<name>/SKILL.md` (+ `scripts/`) | on demand, loaded by Pi as skills | context |
31
+ | c7 | Scripts | `scripts/<name>.py` or `.mjs` | on demand, listed in `scripts` (66) | tool interface |
32
+ | c8 | Plugins | `plugins/<name>.ts` | inside the tool loop, as Pi extensions | middleware |
33
+
34
+ | Type / function | Module | Role |
35
+ |---|---|---|
36
+ | `Variant` (path → text), `SurfaceSpec`, `ComponentInfo` | `variant/surface.ts` | The editable surface and its patterns. |
37
+ | `validate`, `readVariant`, `writeVariant`, `diffSummary`, `applyEdit`, `autotrigger` | `variant/variant.ts` | Validation and editing. |
38
+ | `commit`, `seed`, `restore`, `head`, `lineage`, `fingerprint` | `variant/store.ts` | Versions and the head. |
39
+ | `materialise`, `resolve`, `VariantChoice`, `Materialised` | `variant/materialise.ts` | Turns a version into prompt sections, skill paths and extension paths for one run. |
40
+ | `VariantTrust` | `variant/trust.ts` | Which plugin code a person trusted, by hash; which scopes let probes run improver code. |
41
+ | `seedVariant` | `variant/seed.ts` | A first variant for a scope. |
42
+ | component library | `variant/components.ts` | Reusable skills, prompts and rules under `registry/` and built-in folders. |
43
+
44
+ ## Contracts
45
+
46
+ - **`VariantChoice`**: `{ scope, version? }` (a scope's head or one version) or `{ dir, scope? }`
47
+ (a variant on disk, read and never written, such as a refinement candidate).
48
+ - **Version source** (`VersionSource`): `seed`, `edit`, `refinement`, `import`, `restore`.
49
+ - **Fingerprint**: first 16 hex characters of SHA-1 over sorted `path\0text\0` pairs.
50
+ - **Validation** (`validate`) refuses a variant when: always-on text (c1–c4) exceeds 24,000
51
+ characters; a file is off the surface; a skill lacks `description:` or its `name:` differs from
52
+ its folder; a skill is never named in the always-on text; a subagent lacks `description:`; a
53
+ script does not compile; a plugin has no default export; an always-on file or skill invokes a
54
+ script that is not in the variant.
55
+
56
+ ## Invariants
57
+
58
+ - **INV-FND-1** Only a variant mutates. No edit, improver session or adoption changes foundation
59
+ code, the surface, the validator or an invariant; those change by release, with a proposal.
60
+ - **INV-FND-2** A variant changes only by committing a new validated version (`commit` →
61
+ `validate`, `INV-VAR-2`), and a refinement moves a head only when a person adopts
62
+ (`INV-REF-6`). There is no other door.
63
+ - **INV-VAR-1** A variant is the only thing in the harness that shapes an agent's
64
+ instructions. The application adds its own sections through `Launch` (page 01); no other
65
+ harness code adds instruction text.
66
+ - **INV-VAR-2** Every saved version is validated (`commit` → `validate`). An invalid variant is
67
+ refused with every problem listed.
68
+ - **INV-VAR-3** A version is never edited. A change is a new version; `restore` moves the head
69
+ and appends to `restores.jsonl`.
70
+ - **INV-VAR-4** A run resolves its variant once and pins it; a child run or later turn uses the same
71
+ files even if the head moves.
72
+ - **INV-VAR-5** c8 plugin code loads only when its exact text is trusted (SHA-256 in
73
+ `variant-plugin-trust.json`). A changed file asks again. The one exception: a refinement probe may
74
+ run improver-written code for a scope whose person allowed it (`probeCode`), and adopting that
75
+ variant still requires the code trusted.
76
+ - **INV-VAR-6** The always-on cap exists because every always-on character costs every run.
77
+ Raising it is an architecture change.
78
+ - **INV-VAR-7** Variant code is synchronous (`INV-BND-4`).
79
+
80
+ ## Data
81
+
82
+ ```text
83
+ <data root>/variants/<scope>/
84
+ versions/<fingerprint>/variant/<rel>
85
+ versions/<fingerprint>/version.json
86
+ head.json
87
+ lineage.jsonl
88
+ restores.jsonl
89
+ <state dir>/variant-plugin-trust.json
90
+ <data root>/registry/{skills,prompts,rules}/ (component library)
91
+ ```
92
+
93
+ ## Source map
94
+
95
+ `src/variant/*.ts` (`migrate.ts` renames state written before PROP-0009 on `open`). Method origin: Harness² (`harness2/core/tree.py`, Apache-2.0).
@@ -0,0 +1,102 @@
1
+ # 04 Prompt
2
+
3
+ ## Purpose
4
+
5
+ One compiler builds every model instruction the harness gives. It merges the pinned variant's
6
+ sections, the harness's own sections and the application's sections into an ordered,
7
+ budgeted pack, then splits the pack into a **stable system prompt** (cached by the provider) and
8
+ a **context update** (changing state appended to native history). Keeping the two apart is what
9
+ keeps provider caching effective across turns.
10
+
11
+ ## Components
12
+
13
+ | Type / function | Role |
14
+ |---|---|
15
+ | `compile(env, caller, launch, variant)` → `ContextPack` | Builds the ordered, budgeted sections. |
16
+ | `render(env, pack)` → `string` | One string for a session that takes a single prompt. |
17
+ | `sessionLaunch(env, caller, launch, historyFile, variant)` → `{ system, update, pack }` | SDK sessions: stable prefix plus an update with only the dynamic sections that changed since the last delivered snapshot. |
18
+ | `deliveredSnapshot(sessionFile)` | Reads the last delivered snapshot on the active history branch; a compaction forces a fresh one. |
19
+ | `saveForSession`, `copyToRun` | Terminal sessions keep the pack they started with and copy it to each run. |
20
+ | `record`, `load`, `packPath` | The pack each run was given, at `runs/<id>/context.json`. |
21
+ | `toolGroups`, `fit`, `clip` | The tool manifest by group; cutting text to a budget at a paragraph boundary. |
22
+
23
+ All in `prompt/compile.ts`. A `ContextPack` holds `sections: Section[]` (each with `id`, `title`,
24
+ `body`, `sources`, `budget`, `size`, `cut`), `toolGroups`, `harness` (scope and fingerprint),
25
+ `profile`, `compiledAt` and `delivery` (`systemSectionIds`, `updatedSectionIds`).
26
+
27
+ ## Section order
28
+
29
+ `SECTION_ORDER`: `system` 25, `guardrails` 40, `memory` 45, `references` 50, `subagents` 64,
30
+ `scripts` 66, `wiki` 80, `tools` 90, `reporting` 95. Application sections sit among them by their `order`; plan
31
+ mode uses `plan` at 25. Ties keep insertion order.
32
+
33
+ Budgets (characters): variant sections 30,000 each (already capped at save, so never cut here);
34
+ references 12,000; Wiki pointer 2,500; tools 8,000; reporting 2,000; application sections their
35
+ own `budget`.
36
+
37
+ ## Reporting
38
+
39
+ Every pack ends with the harness's `reporting` section ("Reporting your work",
40
+ `REPORTING_GUIDANCE` in `prompt/compile.ts`). It is fixed text that shapes the final reply: lead
41
+ with the answer or outcome, then use only headings or structure that help explain it; no fixed list
42
+ of report headings is required. When a concrete verification requires a person because the agent
43
+ could not perform or observe it, the optional **Need human inspection** heading says what remains
44
+ unverified, why, and the specific check the person should make. Report only checks actually run,
45
+ with their results. Markdown tables are used where they help compare options or present repeated
46
+ fields or check results; any format the person, application or current mode asks for takes
47
+ precedence. The section names no application, is never dynamic, and is never cut. See
48
+ [PROP-0001](proposals/PROP-0001-reporting-section.md),
49
+ [PROP-0004](proposals/PROP-0004-flexible-reporting-guidance.md), and
50
+ [ADR-0008](../decisions/ADR-0008-flexible-reporting-guidance.md).
51
+
52
+ ## Delivery
53
+
54
+ ```text
55
+ compile ──► pack ──► stable sections ──► system prompt (+ "Context updates" guidance)
56
+ └──► dynamic sections ──► compare with delivered snapshot ──► custom message
57
+ type xingular-context
58
+ ```
59
+
60
+ - Dynamic sections are the built-in `references` and `wiki`, plus every application section with
61
+ `dynamic: true`.
62
+ - An update lists only the dynamic sections that changed, and announces a withdrawn one.
63
+ `references` is always resent when present, because it belongs to the current request.
64
+ - The session appends the update as a hidden custom message and saves its snapshot in the
65
+ message details (`xingularContext`); recording a pack does not mark it delivered.
66
+ - Terminal sessions use `compile` + `render` once, pass it as `--append-system-prompt`, and keep
67
+ that pack for the life of the session.
68
+
69
+ ## Invariants
70
+
71
+ - **INV-PRM-1** The prompt is assembled only in `src/prompt/compile.ts`. Nothing else builds model
72
+ instructions. SDK sessions use `sessionLaunch`; terminal sessions use `compile` + `render`.
73
+ - **INV-PRM-2** The system prompt holds only stable text: identity, role, the variant's sections, the
74
+ harness's reporting guidance, tool guidance and the tool manifest. Changing state never enters it.
75
+ - **INV-PRM-3** `references`, `wiki`, and every section the application marks `dynamic` are
76
+ delivered as context updates in native history, never in the system prompt.
77
+ - **INV-PRM-4** An update carries only changed dynamic sections, so an unchanged turn appends
78
+ nothing. A compaction on the active branch forces the full snapshot again.
79
+ - **INV-PRM-5** The pack only describes tools the caller can call (the frozen capability set).
80
+ - **INV-PRM-6** Each run's pack is recorded beside the run. Failing to record it never fails the
81
+ session.
82
+ - **INV-PRM-7** The compiler is synchronous (`INV-BND-4`).
83
+ - **INV-PRM-8** Whether a prompt change keeps the provider's cache is measured with real requests
84
+ from the application, only with the account owner's permission. Tests do not stand in for it.
85
+
86
+ ## Relation to DESIGN-0001
87
+
88
+ [`../system-prompt-design.md`](../system-prompt-design.md) is a draft design (not accepted). Only
89
+ what this page states is binding. Adopting parts of that draft is an architecture change.
90
+
91
+ ## Source map
92
+
93
+ `src/prompt/compile.ts`, `src/sessions/sessions.ts` (calls `sessionLaunch`),
94
+ `src/terminal/terminals.ts` (calls `compile` + `render`), `src/variant/materialise.ts` (variant
95
+ sections), `src/sessions/planMode.ts` (`plan` section).
96
+
97
+ ## Session naming guidance (PROP-0010)
98
+
99
+ The Session tool group describes `session_name` when available: name meaningful work early
100
+ with an imperative sentence of at most six words, and revise when the objective changes.
101
+ This is fixed foundation guidance. The current name stays in native session metadata and
102
+ the terminal snapshot; it is never interpolated into the stable system prompt.