@xingular/harness 2.0.0 → 2.0.1-unstable

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 (1095) hide show
  1. package/CHANGELOG.md +635 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +50 -0
  4. package/README.md +241 -90
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/browser-extension/README.md +32 -0
  7. package/browser-extension/background.js +612 -0
  8. package/browser-extension/manifest.json +16 -0
  9. package/browser-extension/overlay.js +97 -0
  10. package/browser-extension/popup.css +19 -0
  11. package/browser-extension/popup.html +30 -0
  12. package/browser-extension/popup.js +101 -0
  13. package/browser-extension/site-access.js +63 -0
  14. package/builtin/skills/plugin-authoring/SKILL.md +53 -0
  15. package/dist/cli.js +32851 -17155
  16. package/dist/sdk/accounts/accounts.d.ts +195 -0
  17. package/dist/sdk/accounts/accounts.js +821 -0
  18. package/dist/sdk/accounts/choices.d.ts +41 -0
  19. package/dist/sdk/accounts/choices.js +89 -0
  20. package/dist/sdk/accounts/env.d.ts +78 -0
  21. package/dist/sdk/accounts/env.js +294 -0
  22. package/dist/sdk/accounts/secrets.d.ts +28 -0
  23. package/dist/sdk/accounts/secrets.js +147 -0
  24. package/dist/sdk/accounts/store.d.ts +139 -0
  25. package/dist/sdk/accounts/store.js +255 -0
  26. package/dist/sdk/agents/builtin.d.ts +2 -0
  27. package/dist/sdk/agents/builtin.js +50 -0
  28. package/dist/sdk/agents/narrow.d.ts +13 -0
  29. package/dist/sdk/agents/narrow.js +29 -0
  30. package/dist/sdk/agents/planResearch.d.ts +27 -0
  31. package/dist/sdk/agents/planResearch.js +82 -0
  32. package/dist/sdk/agents/profiles.d.ts +93 -0
  33. package/dist/sdk/agents/profiles.js +289 -0
  34. package/dist/sdk/annotations/bridge.d.ts +44 -0
  35. package/dist/sdk/annotations/bridge.js +268 -0
  36. package/dist/sdk/annotations/capture.d.ts +158 -0
  37. package/dist/sdk/annotations/capture.js +409 -0
  38. package/dist/sdk/annotations/delivery.d.ts +79 -0
  39. package/dist/sdk/annotations/delivery.js +163 -0
  40. package/dist/sdk/annotations/inspect.d.ts +10 -0
  41. package/dist/sdk/annotations/inspect.js +34 -0
  42. package/dist/sdk/annotations/isolated.d.ts +6 -0
  43. package/dist/sdk/annotations/isolated.js +51 -0
  44. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  45. package/dist/sdk/annotations/pageScript.js +871 -0
  46. package/dist/sdk/annotations/part.d.ts +8 -0
  47. package/dist/sdk/annotations/part.js +126 -0
  48. package/dist/sdk/annotations/queue.d.ts +4 -0
  49. package/dist/sdk/annotations/queue.js +45 -0
  50. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  51. package/dist/sdk/annotations/serverMethods.js +66 -0
  52. package/dist/sdk/annotations/store.d.ts +159 -0
  53. package/dist/sdk/annotations/store.js +404 -0
  54. package/dist/sdk/browser/backend.d.ts +16 -0
  55. package/dist/sdk/browser/backend.js +17 -0
  56. package/dist/sdk/browser/config.d.ts +19 -0
  57. package/dist/sdk/browser/config.js +23 -0
  58. package/dist/sdk/browser/contracts.d.ts +19 -0
  59. package/dist/sdk/browser/contracts.js +116 -0
  60. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  61. package/dist/sdk/browser/diagnostics.js +38 -0
  62. package/dist/sdk/browser/extension/bridge.d.ts +55 -0
  63. package/dist/sdk/browser/extension/bridge.js +336 -0
  64. package/dist/sdk/browser/extension/session.d.ts +50 -0
  65. package/dist/sdk/browser/extension/session.js +321 -0
  66. package/dist/sdk/browser/index.d.ts +33 -0
  67. package/dist/sdk/browser/index.js +105 -0
  68. package/dist/sdk/browser/network.d.ts +10 -0
  69. package/dist/sdk/browser/network.js +59 -0
  70. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  71. package/dist/sdk/browser/serverMethods.js +10 -0
  72. package/dist/sdk/browser/session.d.ts +85 -0
  73. package/dist/sdk/browser/session.js +228 -0
  74. package/dist/sdk/browser/tools.d.ts +102 -0
  75. package/dist/sdk/browser/tools.js +257 -0
  76. package/dist/sdk/capabilities/api.d.ts +22 -0
  77. package/dist/sdk/capabilities/api.js +54 -0
  78. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  79. package/dist/sdk/capabilities/runSnapshot.js +53 -0
  80. package/dist/sdk/capabilities/types.d.ts +29 -0
  81. package/dist/sdk/capabilities/types.js +1 -0
  82. package/dist/sdk/cli.d.ts +2 -0
  83. package/dist/sdk/cli.js +172 -0
  84. package/dist/sdk/commands/extensionOwners.d.ts +4 -0
  85. package/dist/sdk/commands/extensionOwners.js +17 -0
  86. package/dist/sdk/commands/list.d.ts +3 -0
  87. package/dist/sdk/commands/list.js +90 -0
  88. package/dist/sdk/commands/promptLoader.d.ts +5 -0
  89. package/dist/sdk/commands/promptLoader.js +76 -0
  90. package/dist/sdk/commands/promptRoutes.d.ts +13 -0
  91. package/dist/sdk/commands/promptRoutes.js +46 -0
  92. package/dist/sdk/commands/registry.d.ts +299 -0
  93. package/dist/sdk/commands/registry.js +54 -0
  94. package/dist/sdk/commands/routes.d.ts +16 -0
  95. package/dist/sdk/commands/routes.js +33 -0
  96. package/dist/sdk/commands/runtimeRouter.d.ts +4 -0
  97. package/dist/sdk/commands/runtimeRouter.js +48 -0
  98. package/dist/sdk/computer/boundary.d.ts +40 -0
  99. package/dist/sdk/computer/boundary.js +79 -0
  100. package/dist/sdk/computer/contracts.d.ts +127 -0
  101. package/dist/sdk/computer/contracts.js +13 -0
  102. package/dist/sdk/computer/control.d.ts +34 -0
  103. package/dist/sdk/computer/control.js +112 -0
  104. package/dist/sdk/computer/screenshot.d.ts +32 -0
  105. package/dist/sdk/computer/screenshot.js +35 -0
  106. package/dist/sdk/computer/terminalCapture.d.ts +26 -0
  107. package/dist/sdk/computer/terminalCapture.js +64 -0
  108. package/dist/sdk/computer/volatileImages.d.ts +9 -0
  109. package/dist/sdk/computer/volatileImages.js +50 -0
  110. package/dist/sdk/context/attribution.d.ts +18 -0
  111. package/dist/sdk/context/attribution.js +295 -0
  112. package/dist/sdk/context/runDetails.d.ts +16 -0
  113. package/dist/sdk/context/runDetails.js +22 -0
  114. package/dist/sdk/context/types.d.ts +94 -0
  115. package/dist/sdk/context/types.js +10 -0
  116. package/dist/sdk/core/bus.d.ts +23 -0
  117. package/dist/sdk/core/bus.js +76 -0
  118. package/dist/sdk/core/caller.d.ts +22 -0
  119. package/dist/sdk/core/caller.js +16 -0
  120. package/dist/sdk/core/changes.d.ts +15 -0
  121. package/dist/sdk/core/changes.js +15 -0
  122. package/dist/sdk/core/commandBudget.d.ts +23 -0
  123. package/dist/sdk/core/commandBudget.js +62 -0
  124. package/dist/sdk/core/effort.d.ts +2 -0
  125. package/dist/sdk/core/effort.js +1 -0
  126. package/dist/sdk/core/env.d.ts +18 -0
  127. package/dist/sdk/core/env.js +8 -0
  128. package/dist/sdk/core/errors.d.ts +15 -0
  129. package/dist/sdk/core/errors.js +24 -0
  130. package/dist/sdk/core/frontmatter.d.ts +12 -0
  131. package/dist/sdk/core/frontmatter.js +50 -0
  132. package/dist/sdk/core/fs.d.ts +18 -0
  133. package/dist/sdk/core/fs.js +106 -0
  134. package/dist/sdk/core/index.d.ts +24 -0
  135. package/dist/sdk/core/index.js +203 -0
  136. package/dist/sdk/core/interactiveProfile.d.ts +46 -0
  137. package/dist/sdk/core/interactiveProfile.js +143 -0
  138. package/dist/sdk/core/links.d.ts +51 -0
  139. package/dist/sdk/core/links.js +155 -0
  140. package/dist/sdk/core/path.d.ts +7 -0
  141. package/dist/sdk/core/path.js +79 -0
  142. package/dist/sdk/core/projects.d.ts +18 -0
  143. package/dist/sdk/core/projects.js +67 -0
  144. package/dist/sdk/core/secrets.d.ts +2 -0
  145. package/dist/sdk/core/secrets.js +5 -0
  146. package/dist/sdk/core/shell.d.ts +20 -0
  147. package/dist/sdk/core/shell.js +73 -0
  148. package/dist/sdk/core/text.d.ts +7 -0
  149. package/dist/sdk/core/text.js +40 -0
  150. package/dist/sdk/core/workspace.d.ts +13 -0
  151. package/dist/sdk/core/workspace.js +88 -0
  152. package/dist/sdk/core/workspaceBashTool.d.ts +20 -0
  153. package/dist/sdk/core/workspaceBashTool.js +50 -0
  154. package/dist/sdk/core/workspaceSandbox.d.ts +41 -0
  155. package/dist/sdk/core/workspaceSandbox.js +360 -0
  156. package/dist/sdk/core/workspaceWriteOperations.d.ts +57 -0
  157. package/dist/sdk/core/workspaceWriteOperations.js +245 -0
  158. package/dist/sdk/doctor/checks.d.ts +5 -0
  159. package/dist/sdk/doctor/checks.js +270 -0
  160. package/dist/sdk/doctor/probe.d.ts +4 -0
  161. package/dist/sdk/doctor/probe.js +94 -0
  162. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  163. package/dist/sdk/doctor/serverMethods.js +8 -0
  164. package/dist/sdk/doctor/service.d.ts +23 -0
  165. package/dist/sdk/doctor/service.js +144 -0
  166. package/dist/sdk/doctor/types.d.ts +141 -0
  167. package/dist/sdk/doctor/types.js +29 -0
  168. package/dist/sdk/harness.d.ts +172 -0
  169. package/dist/sdk/harness.js +387 -0
  170. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  171. package/dist/sdk/history/lessonPrompt.js +15 -0
  172. package/dist/sdk/history/lessons.d.ts +52 -0
  173. package/dist/sdk/history/lessons.js +173 -0
  174. package/dist/sdk/history/recall.d.ts +68 -0
  175. package/dist/sdk/history/recall.js +199 -0
  176. package/dist/sdk/history/serverMethods.d.ts +3 -0
  177. package/dist/sdk/history/serverMethods.js +8 -0
  178. package/dist/sdk/history/trajectory.d.ts +7 -0
  179. package/dist/sdk/history/trajectory.js +218 -0
  180. package/dist/sdk/hub/catalog.json +123 -0
  181. package/dist/sdk/hub/cli.d.ts +7 -0
  182. package/dist/sdk/hub/cli.js +81 -0
  183. package/dist/sdk/hub/hub.d.ts +74 -0
  184. package/dist/sdk/hub/hub.js +476 -0
  185. package/dist/sdk/hub/schema.d.ts +280 -0
  186. package/dist/sdk/hub/schema.js +78 -0
  187. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  188. package/dist/sdk/hub/serverMethods.js +11 -0
  189. package/dist/sdk/index.d.ts +80 -0
  190. package/dist/sdk/index.js +60 -0
  191. package/dist/sdk/mcp/connections.d.ts +83 -0
  192. package/dist/sdk/mcp/connections.js +676 -0
  193. package/dist/sdk/mcp/manager.d.ts +26 -0
  194. package/dist/sdk/mcp/manager.js +124 -0
  195. package/dist/sdk/mcp/oauth.d.ts +35 -0
  196. package/dist/sdk/mcp/oauth.js +171 -0
  197. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  198. package/dist/sdk/mcp/scopeMigration.js +198 -0
  199. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  200. package/dist/sdk/mcp/serverMethods.js +22 -0
  201. package/dist/sdk/mcp/service.d.ts +160 -0
  202. package/dist/sdk/mcp/service.js +510 -0
  203. package/dist/sdk/mcp/types.d.ts +131 -0
  204. package/dist/sdk/mcp/types.js +49 -0
  205. package/dist/sdk/pi/retryPolicy.d.ts +19 -0
  206. package/dist/sdk/pi/retryPolicy.js +11 -0
  207. package/dist/sdk/pi/runtime.d.ts +14 -0
  208. package/dist/sdk/pi/runtime.js +31 -0
  209. package/dist/sdk/plugins/api.d.ts +66 -0
  210. package/dist/sdk/plugins/api.js +155 -0
  211. package/dist/sdk/plugins/attachments.d.ts +46 -0
  212. package/dist/sdk/plugins/attachments.js +111 -0
  213. package/dist/sdk/plugins/builtin.d.ts +7 -0
  214. package/dist/sdk/plugins/builtin.js +182 -0
  215. package/dist/sdk/plugins/builtinRegistry.d.ts +62 -0
  216. package/dist/sdk/plugins/builtinRegistry.js +77 -0
  217. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  218. package/dist/sdk/plugins/catalogue.js +197 -0
  219. package/dist/sdk/plugins/cli.d.ts +13 -0
  220. package/dist/sdk/plugins/cli.js +188 -0
  221. package/dist/sdk/plugins/commandPrefix.d.ts +8 -0
  222. package/dist/sdk/plugins/commandPrefix.js +21 -0
  223. package/dist/sdk/plugins/discover.d.ts +48 -0
  224. package/dist/sdk/plugins/discover.js +230 -0
  225. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  226. package/dist/sdk/plugins/firstParty.js +119 -0
  227. package/dist/sdk/plugins/hooks.d.ts +94 -0
  228. package/dist/sdk/plugins/hooks.js +162 -0
  229. package/dist/sdk/plugins/identity.d.ts +19 -0
  230. package/dist/sdk/plugins/identity.js +48 -0
  231. package/dist/sdk/plugins/install.d.ts +24 -0
  232. package/dist/sdk/plugins/install.js +160 -0
  233. package/dist/sdk/plugins/inventory.d.ts +22 -0
  234. package/dist/sdk/plugins/inventory.js +111 -0
  235. package/dist/sdk/plugins/manifest.d.ts +21 -0
  236. package/dist/sdk/plugins/manifest.js +94 -0
  237. package/dist/sdk/plugins/plugins.d.ts +106 -0
  238. package/dist/sdk/plugins/plugins.js +165 -0
  239. package/dist/sdk/plugins/proposals.d.ts +17 -0
  240. package/dist/sdk/plugins/proposals.js +147 -0
  241. package/dist/sdk/plugins/runtime.d.ts +9 -0
  242. package/dist/sdk/plugins/runtime.js +95 -0
  243. package/dist/sdk/plugins/surfaces.d.ts +5 -0
  244. package/dist/sdk/plugins/surfaces.js +11 -0
  245. package/dist/sdk/plugins/trust.d.ts +44 -0
  246. package/dist/sdk/plugins/trust.js +120 -0
  247. package/dist/sdk/plugins/types.d.ts +174 -0
  248. package/dist/sdk/plugins/types.js +7 -0
  249. package/dist/sdk/prompt/compile.d.ts +245 -0
  250. package/dist/sdk/prompt/compile.js +535 -0
  251. package/dist/sdk/prompt/reporting.d.ts +2 -0
  252. package/dist/sdk/prompt/reporting.js +94 -0
  253. package/dist/sdk/prompt/standard.d.ts +32 -0
  254. package/dist/sdk/prompt/standard.js +76 -0
  255. package/dist/sdk/refine/cli.d.ts +4 -0
  256. package/dist/sdk/refine/cli.js +186 -0
  257. package/dist/sdk/refine/demo.d.ts +21 -0
  258. package/dist/sdk/refine/demo.js +114 -0
  259. package/dist/sdk/refine/evidence.d.ts +55 -0
  260. package/dist/sdk/refine/evidence.js +330 -0
  261. package/dist/sdk/refine/host.d.ts +59 -0
  262. package/dist/sdk/refine/host.js +105 -0
  263. package/dist/sdk/refine/ledger.d.ts +48 -0
  264. package/dist/sdk/refine/ledger.js +76 -0
  265. package/dist/sdk/refine/library.d.ts +55 -0
  266. package/dist/sdk/refine/library.js +177 -0
  267. package/dist/sdk/refine/pi.d.ts +72 -0
  268. package/dist/sdk/refine/pi.js +248 -0
  269. package/dist/sdk/refine/prompts.d.ts +60 -0
  270. package/dist/sdk/refine/prompts.js +434 -0
  271. package/dist/sdk/refine/recursion.d.ts +113 -0
  272. package/dist/sdk/refine/recursion.js +258 -0
  273. package/dist/sdk/refine/runner.d.ts +83 -0
  274. package/dist/sdk/refine/runner.js +151 -0
  275. package/dist/sdk/refine/selection.d.ts +57 -0
  276. package/dist/sdk/refine/selection.js +251 -0
  277. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  278. package/dist/sdk/refine/serverMethods.js +23 -0
  279. package/dist/sdk/refine/service.d.ts +115 -0
  280. package/dist/sdk/refine/service.js +280 -0
  281. package/dist/sdk/refine/suite.d.ts +67 -0
  282. package/dist/sdk/refine/suite.js +174 -0
  283. package/dist/sdk/refine/trajectory.d.ts +9 -0
  284. package/dist/sdk/refine/trajectory.js +73 -0
  285. package/dist/sdk/refine/types.d.ts +93 -0
  286. package/dist/sdk/refine/types.js +10 -0
  287. package/dist/sdk/remote/addresses.d.ts +19 -0
  288. package/dist/sdk/remote/addresses.js +52 -0
  289. package/dist/sdk/remote/pairing.d.ts +59 -0
  290. package/dist/sdk/remote/pairing.js +160 -0
  291. package/dist/sdk/remote/seal.d.ts +28 -0
  292. package/dist/sdk/remote/seal.js +84 -0
  293. package/dist/sdk/remote/server.d.ts +28 -0
  294. package/dist/sdk/remote/server.js +158 -0
  295. package/dist/sdk/remote/service.d.ts +125 -0
  296. package/dist/sdk/remote/service.js +330 -0
  297. package/dist/sdk/remote/webClient.d.ts +4 -0
  298. package/dist/sdk/remote/webClient.js +452 -0
  299. package/dist/sdk/server/methods.d.ts +3 -0
  300. package/dist/sdk/server/methods.js +365 -0
  301. package/dist/sdk/server/params.d.ts +4 -0
  302. package/dist/sdk/server/params.js +11 -0
  303. package/dist/sdk/server/remote.d.ts +19 -0
  304. package/dist/sdk/server/remote.js +109 -0
  305. package/dist/sdk/server/rpc.d.ts +20 -0
  306. package/dist/sdk/server/rpc.js +102 -0
  307. package/dist/sdk/server/serve.d.ts +13 -0
  308. package/dist/sdk/server/serve.js +25 -0
  309. package/dist/sdk/server/socket.d.ts +28 -0
  310. package/dist/sdk/server/socket.js +122 -0
  311. package/dist/sdk/sessions/approvals.d.ts +47 -0
  312. package/dist/sdk/sessions/approvals.js +119 -0
  313. package/dist/sdk/sessions/checkpoint.d.ts +7 -0
  314. package/dist/sdk/sessions/checkpoint.js +41 -0
  315. package/dist/sdk/sessions/compactionCheckpoint.d.ts +18 -0
  316. package/dist/sdk/sessions/compactionCheckpoint.js +79 -0
  317. package/dist/sdk/sessions/completionCheck.d.ts +51 -0
  318. package/dist/sdk/sessions/completionCheck.js +161 -0
  319. package/dist/sdk/sessions/continuation.d.ts +53 -0
  320. package/dist/sdk/sessions/continuation.js +90 -0
  321. package/dist/sdk/sessions/contracts.d.ts +991 -0
  322. package/dist/sdk/sessions/contracts.js +545 -0
  323. package/dist/sdk/sessions/control.d.ts +72 -0
  324. package/dist/sdk/sessions/control.js +158 -0
  325. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  326. package/dist/sdk/sessions/extensionUi.js +64 -0
  327. package/dist/sdk/sessions/goal.d.ts +145 -0
  328. package/dist/sdk/sessions/goal.js +405 -0
  329. package/dist/sdk/sessions/goalLoop.d.ts +37 -0
  330. package/dist/sdk/sessions/goalLoop.js +125 -0
  331. package/dist/sdk/sessions/goalPrompts.d.ts +4 -0
  332. package/dist/sdk/sessions/goalPrompts.js +93 -0
  333. package/dist/sdk/sessions/goalStop.d.ts +27 -0
  334. package/dist/sdk/sessions/goalStop.js +41 -0
  335. package/dist/sdk/sessions/history.d.ts +16 -0
  336. package/dist/sdk/sessions/history.js +68 -0
  337. package/dist/sdk/sessions/initialBash.d.ts +7 -0
  338. package/dist/sdk/sessions/initialBash.js +7 -0
  339. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  340. package/dist/sdk/sessions/lineageJoin.js +61 -0
  341. package/dist/sdk/sessions/live.d.ts +101 -0
  342. package/dist/sdk/sessions/live.js +265 -0
  343. package/dist/sdk/sessions/planMode.d.ts +116 -0
  344. package/dist/sdk/sessions/planMode.js +281 -0
  345. package/dist/sdk/sessions/policy.d.ts +43 -0
  346. package/dist/sdk/sessions/policy.js +1 -0
  347. package/dist/sdk/sessions/pricing.d.ts +34 -0
  348. package/dist/sdk/sessions/pricing.js +40 -0
  349. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  350. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  351. package/dist/sdk/sessions/registry.d.ts +124 -0
  352. package/dist/sdk/sessions/registry.js +392 -0
  353. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  354. package/dist/sdk/sessions/runIndex.js +65 -0
  355. package/dist/sdk/sessions/runStore.d.ts +82 -0
  356. package/dist/sdk/sessions/runStore.js +393 -0
  357. package/dist/sdk/sessions/runner.d.ts +291 -0
  358. package/dist/sdk/sessions/runner.js +1040 -0
  359. package/dist/sdk/sessions/sessionState.d.ts +13 -0
  360. package/dist/sdk/sessions/sessionState.js +31 -0
  361. package/dist/sdk/sessions/sessions.d.ts +238 -0
  362. package/dist/sdk/sessions/sessions.js +923 -0
  363. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  364. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  365. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  366. package/dist/sdk/sessions/sideQuestions.js +290 -0
  367. package/dist/sdk/sessions/stallWatch.d.ts +35 -0
  368. package/dist/sdk/sessions/stallWatch.js +42 -0
  369. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  370. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  371. package/dist/sdk/sessions/subagentService.d.ts +88 -0
  372. package/dist/sdk/sessions/subagentService.js +546 -0
  373. package/dist/sdk/sessions/subagents.d.ts +98 -0
  374. package/dist/sdk/sessions/subagents.js +136 -0
  375. package/dist/sdk/sessions/workSlice.d.ts +167 -0
  376. package/dist/sdk/sessions/workSlice.js +266 -0
  377. package/dist/sdk/sessions/workspaceBoundary.d.ts +15 -0
  378. package/dist/sdk/sessions/workspaceBoundary.js +46 -0
  379. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  380. package/dist/sdk/terminal/accountsMenu.js +392 -0
  381. package/dist/sdk/terminal/browser.d.ts +62 -0
  382. package/dist/sdk/terminal/browser.js +41 -0
  383. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  384. package/dist/sdk/terminal/browserControl.js +187 -0
  385. package/dist/sdk/terminal/cli.d.ts +20 -0
  386. package/dist/sdk/terminal/cli.js +121 -0
  387. package/dist/sdk/terminal/client.d.ts +20 -0
  388. package/dist/sdk/terminal/client.js +148 -0
  389. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  390. package/dist/sdk/terminal/commandHelp.js +20 -0
  391. package/dist/sdk/terminal/control.d.ts +4 -0
  392. package/dist/sdk/terminal/control.js +25 -0
  393. package/dist/sdk/terminal/controller.d.ts +136 -0
  394. package/dist/sdk/terminal/controller.js +579 -0
  395. package/dist/sdk/terminal/credentialStore.d.ts +4 -0
  396. package/dist/sdk/terminal/credentialStore.js +33 -0
  397. package/dist/sdk/terminal/daemon.d.ts +44 -0
  398. package/dist/sdk/terminal/daemon.js +264 -0
  399. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  400. package/dist/sdk/terminal/hubMenu.js +34 -0
  401. package/dist/sdk/terminal/launch.d.ts +5 -0
  402. package/dist/sdk/terminal/launch.js +27 -0
  403. package/dist/sdk/terminal/liveTerminal.d.ts +96 -0
  404. package/dist/sdk/terminal/liveTerminal.js +436 -0
  405. package/dist/sdk/terminal/logs.d.ts +14 -0
  406. package/dist/sdk/terminal/logs.js +59 -0
  407. package/dist/sdk/terminal/opentui/ansi.d.ts +25 -0
  408. package/dist/sdk/terminal/opentui/ansi.js +192 -0
  409. package/dist/sdk/terminal/opentui/model.d.ts +163 -0
  410. package/dist/sdk/terminal/opentui/model.js +484 -0
  411. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  412. package/dist/sdk/terminal/opentui/subagentsWidget.js +54 -0
  413. package/dist/sdk/terminal/opentui/theme.d.ts +47 -0
  414. package/dist/sdk/terminal/opentui/theme.js +93 -0
  415. package/dist/sdk/terminal/piExtension.d.ts +12 -0
  416. package/dist/sdk/terminal/piExtension.js +847 -0
  417. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  418. package/dist/sdk/terminal/pluginMenu.js +101 -0
  419. package/dist/sdk/terminal/socket.d.ts +73 -0
  420. package/dist/sdk/terminal/socket.js +287 -0
  421. package/dist/sdk/terminal/standalone.d.ts +52 -0
  422. package/dist/sdk/terminal/standalone.js +329 -0
  423. package/dist/sdk/terminal/subagentMonitor.d.ts +62 -0
  424. package/dist/sdk/terminal/subagentMonitor.js +176 -0
  425. package/dist/sdk/terminal/terminals.d.ts +312 -0
  426. package/dist/sdk/terminal/terminals.js +1782 -0
  427. package/dist/sdk/terminal/toolName.d.ts +6 -0
  428. package/dist/sdk/terminal/toolName.js +12 -0
  429. package/dist/sdk/terminal/trajectory.d.ts +15 -0
  430. package/dist/sdk/terminal/trajectory.js +38 -0
  431. package/dist/sdk/terminal/tui/annotateCommand.d.ts +7 -0
  432. package/dist/sdk/terminal/tui/annotateCommand.js +36 -0
  433. package/dist/sdk/terminal/tui/annotateSend.d.ts +30 -0
  434. package/dist/sdk/terminal/tui/annotateSend.js +40 -0
  435. package/dist/sdk/terminal/tui/chrome.d.ts +68 -0
  436. package/dist/sdk/terminal/tui/chrome.js +182 -0
  437. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  438. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  439. package/dist/sdk/terminal/tui/commandPages.d.ts +16 -0
  440. package/dist/sdk/terminal/tui/commandPages.js +136 -0
  441. package/dist/sdk/terminal/tui/commands.d.ts +71 -0
  442. package/dist/sdk/terminal/tui/commands.js +496 -0
  443. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  444. package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
  445. package/dist/sdk/terminal/tui/dialogs.d.ts +81 -0
  446. package/dist/sdk/terminal/tui/dialogs.js +372 -0
  447. package/dist/sdk/terminal/tui/goalCommand.d.ts +19 -0
  448. package/dist/sdk/terminal/tui/goalCommand.js +83 -0
  449. package/dist/sdk/terminal/tui/harnessRuntime.d.ts +8 -0
  450. package/dist/sdk/terminal/tui/harnessRuntime.js +771 -0
  451. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  452. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  453. package/dist/sdk/terminal/tui/list.d.ts +86 -0
  454. package/dist/sdk/terminal/tui/list.js +278 -0
  455. package/dist/sdk/terminal/tui/markdown.d.ts +16 -0
  456. package/dist/sdk/terminal/tui/markdown.js +55 -0
  457. package/dist/sdk/terminal/tui/modeChoices.d.ts +61 -0
  458. package/dist/sdk/terminal/tui/modeChoices.js +95 -0
  459. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  460. package/dist/sdk/terminal/tui/modelPicker.js +150 -0
  461. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  462. package/dist/sdk/terminal/tui/mouse.js +3 -0
  463. package/dist/sdk/terminal/tui/mouseReport.d.ts +30 -0
  464. package/dist/sdk/terminal/tui/mouseReport.js +80 -0
  465. package/dist/sdk/terminal/tui/page.d.ts +17 -0
  466. package/dist/sdk/terminal/tui/page.js +1 -0
  467. package/dist/sdk/terminal/tui/pageOverlay.d.ts +30 -0
  468. package/dist/sdk/terminal/tui/pageOverlay.js +183 -0
  469. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
  470. package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
  471. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  472. package/dist/sdk/terminal/tui/pages/agentsPage.js +193 -0
  473. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +148 -0
  474. package/dist/sdk/terminal/tui/pages/annotatePage.js +576 -0
  475. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  476. package/dist/sdk/terminal/tui/pages/browserPage.js +739 -0
  477. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  478. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  479. package/dist/sdk/terminal/tui/pages/contextPage.d.ts +91 -0
  480. package/dist/sdk/terminal/tui/pages/contextPage.js +585 -0
  481. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
  482. package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
  483. package/dist/sdk/terminal/tui/pages/followUpQueuePage.d.ts +34 -0
  484. package/dist/sdk/terminal/tui/pages/followUpQueuePage.js +130 -0
  485. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +52 -0
  486. package/dist/sdk/terminal/tui/pages/hubPage.js +292 -0
  487. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  488. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  489. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  490. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  491. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +65 -0
  492. package/dist/sdk/terminal/tui/pages/pluginsPage.js +519 -0
  493. package/dist/sdk/terminal/tui/pages/remoteControlPage.d.ts +32 -0
  494. package/dist/sdk/terminal/tui/pages/remoteControlPage.js +170 -0
  495. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
  496. package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
  497. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +24 -0
  498. package/dist/sdk/terminal/tui/pages/subagentsPage.js +155 -0
  499. package/dist/sdk/terminal/tui/pages/textPage.d.ts +17 -0
  500. package/dist/sdk/terminal/tui/pages/textPage.js +52 -0
  501. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +66 -0
  502. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +490 -0
  503. package/dist/sdk/terminal/tui/pages/usagePage.d.ts +45 -0
  504. package/dist/sdk/terminal/tui/pages/usagePage.js +397 -0
  505. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  506. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  507. package/dist/sdk/terminal/tui/piAdapter.d.ts +17 -0
  508. package/dist/sdk/terminal/tui/piAdapter.js +46 -0
  509. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  510. package/dist/sdk/terminal/tui/planMode.js +2 -0
  511. package/dist/sdk/terminal/tui/pluginCommands.d.ts +16 -0
  512. package/dist/sdk/terminal/tui/pluginCommands.js +41 -0
  513. package/dist/sdk/terminal/tui/qr.d.ts +4 -0
  514. package/dist/sdk/terminal/tui/qr.js +35 -0
  515. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  516. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  517. package/dist/sdk/terminal/tui/questions.d.ts +21 -0
  518. package/dist/sdk/terminal/tui/questions.js +42 -0
  519. package/dist/sdk/terminal/tui/runtime.d.ts +117 -0
  520. package/dist/sdk/terminal/tui/runtime.js +544 -0
  521. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  522. package/dist/sdk/terminal/tui/search.js +61 -0
  523. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  524. package/dist/sdk/terminal/tui/selection.js +16 -0
  525. package/dist/sdk/terminal/tui/sessionPicker.d.ts +40 -0
  526. package/dist/sdk/terminal/tui/sessionPicker.js +141 -0
  527. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  528. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  529. package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
  530. package/dist/sdk/terminal/tui/settingsModel.js +195 -0
  531. package/dist/sdk/terminal/tui/sideQuestion.d.ts +57 -0
  532. package/dist/sdk/terminal/tui/sideQuestion.js +241 -0
  533. package/dist/sdk/terminal/tui/skillInvocation.d.ts +28 -0
  534. package/dist/sdk/terminal/tui/skillInvocation.js +63 -0
  535. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  536. package/dist/sdk/terminal/tui/status.js +67 -0
  537. package/dist/sdk/terminal/tui/theme.d.ts +54 -0
  538. package/dist/sdk/terminal/tui/theme.js +185 -0
  539. package/dist/sdk/terminal/tui/thinkingLevels.d.ts +11 -0
  540. package/dist/sdk/terminal/tui/thinkingLevels.js +31 -0
  541. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  542. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  543. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  544. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  545. package/dist/sdk/terminal/tui/ui.d.ts +49 -0
  546. package/dist/sdk/terminal/tui/ui.js +149 -0
  547. package/dist/sdk/terminal/tui/variantCommands.d.ts +32 -0
  548. package/dist/sdk/terminal/tui/variantCommands.js +359 -0
  549. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  550. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  551. package/dist/sdk/terminal/variantControl.d.ts +24 -0
  552. package/dist/sdk/terminal/variantControl.js +145 -0
  553. package/dist/sdk/tools/askUser.d.ts +6 -0
  554. package/dist/sdk/tools/askUser.js +92 -0
  555. package/dist/sdk/tools/defaultSkills.d.ts +23 -0
  556. package/dist/sdk/tools/defaultSkills.js +46 -0
  557. package/dist/sdk/tools/definitions.d.ts +32 -0
  558. package/dist/sdk/tools/definitions.js +133 -0
  559. package/dist/sdk/tools/dispatch.d.ts +16 -0
  560. package/dist/sdk/tools/dispatch.js +92 -0
  561. package/dist/sdk/tools/getCapabilities.d.ts +31 -0
  562. package/dist/sdk/tools/getCapabilities.js +34 -0
  563. package/dist/sdk/tools/harnessTools.d.ts +8 -0
  564. package/dist/sdk/tools/harnessTools.js +20 -0
  565. package/dist/sdk/tools/sessionName.d.ts +16 -0
  566. package/dist/sdk/tools/sessionName.js +78 -0
  567. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  568. package/dist/sdk/tools/spawnSubagent.js +63 -0
  569. package/dist/sdk/tools/todo.d.ts +15 -0
  570. package/dist/sdk/tools/todo.js +66 -0
  571. package/dist/sdk/tools/types.d.ts +48 -0
  572. package/dist/sdk/tools/types.js +1 -0
  573. package/dist/sdk/usage/analytics.d.ts +20 -0
  574. package/dist/sdk/usage/analytics.js +151 -0
  575. package/dist/sdk/usage/ledger.d.ts +38 -0
  576. package/dist/sdk/usage/ledger.js +142 -0
  577. package/dist/sdk/usage/limits/adapters.d.ts +11 -0
  578. package/dist/sdk/usage/limits/adapters.js +349 -0
  579. package/dist/sdk/usage/limits/capture.d.ts +8 -0
  580. package/dist/sdk/usage/limits/capture.js +47 -0
  581. package/dist/sdk/usage/limits/http.d.ts +12 -0
  582. package/dist/sdk/usage/limits/http.js +51 -0
  583. package/dist/sdk/usage/limits/normalize.d.ts +15 -0
  584. package/dist/sdk/usage/limits/normalize.js +211 -0
  585. package/dist/sdk/usage/limits/service.d.ts +30 -0
  586. package/dist/sdk/usage/limits/service.js +176 -0
  587. package/dist/sdk/usage/limits/types.d.ts +65 -0
  588. package/dist/sdk/usage/limits/types.js +1 -0
  589. package/dist/sdk/usage/serverMethods.d.ts +3 -0
  590. package/dist/sdk/usage/serverMethods.js +22 -0
  591. package/dist/sdk/usage/service.d.ts +32 -0
  592. package/dist/sdk/usage/service.js +66 -0
  593. package/dist/sdk/usage/settings.d.ts +7 -0
  594. package/dist/sdk/usage/settings.js +28 -0
  595. package/dist/sdk/usage/types.d.ts +60 -0
  596. package/dist/sdk/usage/types.js +4 -0
  597. package/dist/sdk/variant/components.d.ts +34 -0
  598. package/dist/sdk/variant/components.js +230 -0
  599. package/dist/sdk/variant/materialise.d.ts +66 -0
  600. package/dist/sdk/variant/materialise.js +81 -0
  601. package/dist/sdk/variant/migrate.d.ts +4 -0
  602. package/dist/sdk/variant/migrate.js +41 -0
  603. package/dist/sdk/variant/seed.d.ts +20 -0
  604. package/dist/sdk/variant/seed.js +116 -0
  605. package/dist/sdk/variant/store.d.ts +114 -0
  606. package/dist/sdk/variant/store.js +256 -0
  607. package/dist/sdk/variant/surface.d.ts +56 -0
  608. package/dist/sdk/variant/surface.js +81 -0
  609. package/dist/sdk/variant/trust.d.ts +27 -0
  610. package/dist/sdk/variant/trust.js +64 -0
  611. package/dist/sdk/variant/variant.d.ts +71 -0
  612. package/dist/sdk/variant/variant.js +331 -0
  613. package/dist/sdk/web/markdown.d.ts +10 -0
  614. package/dist/sdk/web/markdown.js +66 -0
  615. package/dist/sdk/web/part.d.ts +10 -0
  616. package/dist/sdk/web/part.js +6 -0
  617. package/dist/sdk/web/safeRequest.d.ts +34 -0
  618. package/dist/sdk/web/safeRequest.js +175 -0
  619. package/dist/sdk/web/search.d.ts +53 -0
  620. package/dist/sdk/web/search.js +168 -0
  621. package/dist/sdk/web/serverMethods.d.ts +3 -0
  622. package/dist/sdk/web/serverMethods.js +7 -0
  623. package/dist/sdk/web/text.d.ts +2 -0
  624. package/dist/sdk/web/text.js +7 -0
  625. package/dist/sdk/web/tools.d.ts +22 -0
  626. package/dist/sdk/web/tools.js +195 -0
  627. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  628. package/dist/sdk/wiki/notes.d.ts +68 -0
  629. package/dist/sdk/wiki/notes.js +297 -0
  630. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  631. package/dist/sdk/wiki/serverMethods.js +26 -0
  632. package/dist/sdk/worktrees/cli.d.ts +11 -0
  633. package/dist/sdk/worktrees/cli.js +146 -0
  634. package/dist/sdk/worktrees/copy.d.ts +9 -0
  635. package/dist/sdk/worktrees/copy.js +111 -0
  636. package/dist/sdk/worktrees/git.d.ts +18 -0
  637. package/dist/sdk/worktrees/git.js +89 -0
  638. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  639. package/dist/sdk/worktrees/serverMethods.js +30 -0
  640. package/dist/sdk/worktrees/service.d.ts +73 -0
  641. package/dist/sdk/worktrees/service.js +483 -0
  642. package/dist/sdk/worktrees/setup.d.ts +23 -0
  643. package/dist/sdk/worktrees/setup.js +65 -0
  644. package/dist/sdk/worktrees/snapshot.d.ts +16 -0
  645. package/dist/sdk/worktrees/snapshot.js +83 -0
  646. package/dist/sdk/worktrees/types.d.ts +91 -0
  647. package/dist/sdk/worktrees/types.js +1 -0
  648. package/dist/sdk/world/actions.d.ts +23 -0
  649. package/dist/sdk/world/actions.js +31 -0
  650. package/dist/sdk/world/cli.d.ts +12 -0
  651. package/dist/sdk/world/cli.js +166 -0
  652. package/dist/sdk/world/images.d.ts +20 -0
  653. package/dist/sdk/world/images.js +48 -0
  654. package/dist/sdk/world/untrusted.d.ts +12 -0
  655. package/dist/sdk/world/untrusted.js +20 -0
  656. package/dist/sdk/world/world.d.ts +75 -0
  657. package/dist/sdk/world/world.js +117 -0
  658. package/dist/terminal-opentui.js +30986 -0
  659. package/dist/terminal-pi.js +3008 -610
  660. package/docs/README.md +45 -1
  661. package/docs/architecture/00-overview.md +171 -0
  662. package/docs/architecture/01-extension-points.md +78 -0
  663. package/docs/architecture/02-sessions-and-runs.md +505 -0
  664. package/docs/architecture/03-variants.md +122 -0
  665. package/docs/architecture/04-prompt.md +277 -0
  666. package/docs/architecture/05-refinement.md +134 -0
  667. package/docs/architecture/06-plugins-and-capabilities.md +208 -0
  668. package/docs/architecture/07-tools-and-gate.md +245 -0
  669. package/docs/architecture/08-memory-and-history.md +100 -0
  670. package/docs/architecture/09-accounts-and-connectors.md +153 -0
  671. package/docs/architecture/10-server-protocol.md +403 -0
  672. package/docs/architecture/11-terminal.md +555 -0
  673. package/docs/architecture/12-storage.md +118 -0
  674. package/docs/architecture/13-world-tools.md +114 -0
  675. package/docs/architecture/14-surfaces-and-parity.md +151 -0
  676. package/docs/architecture/15-remote-control.md +120 -0
  677. package/docs/architecture/README.md +143 -0
  678. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  679. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  680. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  681. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  682. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  683. package/docs/architecture/proposals/PROP-0006-run-checklist.md +72 -0
  684. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  685. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  686. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  687. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  688. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  689. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  690. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  691. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  692. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  693. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  694. package/docs/architecture/proposals/PROP-0017-page-annotations.md +131 -0
  695. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +183 -0
  696. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  697. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  698. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  699. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  700. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  701. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  702. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  703. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +96 -0
  704. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  705. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  706. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  707. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  708. package/docs/architecture/proposals/PROP-0031-plugin-command-owner-namespaces.md +54 -0
  709. package/docs/architecture/proposals/PROP-0032-planning-quality.md +196 -0
  710. package/docs/architecture/proposals/PROP-0033-compaction-plan-checkpoints.md +75 -0
  711. package/docs/architecture/proposals/PROP-0034-conversation-fast-mode.md +120 -0
  712. package/docs/architecture/proposals/PROP-0035-retain-subagent-status.md +47 -0
  713. package/docs/architecture/proposals/PROP-0036-first-class-harness-commands.md +59 -0
  714. package/docs/architecture/proposals/PROP-0037-workspace-write-boundary.md +63 -0
  715. package/docs/architecture/proposals/PROP-0038-annotate-open-shadow-roots.md +73 -0
  716. package/docs/architecture/proposals/PROP-0039-workspace-boundary-hardening.md +139 -0
  717. package/docs/architecture/proposals/PROP-0040-one-launch-path.md +87 -0
  718. package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +260 -0
  719. package/docs/architecture/proposals/PROP-0042-usage-and-provider-limits.md +127 -0
  720. package/docs/architecture/proposals/PROP-0043-read-only-plan-bash.md +74 -0
  721. package/docs/architecture/proposals/PROP-0044-work-slice-defaults.md +93 -0
  722. package/docs/architecture/proposals/PROP-0045-rename-checklist-to-todo.md +132 -0
  723. package/docs/architecture/proposals/PROP-0046-progress-aware-stall-guards.md +82 -0
  724. package/docs/architecture/proposals/PROP-0047-plugins-hub-separation.md +122 -0
  725. package/docs/architecture/proposals/PROP-0048-simple-annotate.md +85 -0
  726. package/docs/architecture/proposals/PROP-0049-context-attribution.md +415 -0
  727. package/docs/architecture/proposals/PROP-0050-run-stop-codes-and-refusals.md +30 -0
  728. package/docs/architecture/proposals/PROP-0051-unfinished-run-handoff.md +110 -0
  729. package/docs/architecture/proposals/PROP-0052-terminal-refine-and-variant-switch.md +111 -0
  730. package/docs/architecture/proposals/README.md +123 -0
  731. package/docs/decisions/ADR-0001-owned-terminal.md +10 -3
  732. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +3 -1
  733. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +3 -2
  734. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  735. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  736. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +41 -0
  737. package/docs/decisions/ADR-0009-xharness-command.md +39 -0
  738. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  739. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  740. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  741. package/docs/decisions/ADR-0013-doctor.md +27 -0
  742. package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
  743. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  744. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  745. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  746. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  747. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  748. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  749. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  750. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  751. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  752. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  753. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  754. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  755. package/docs/decisions/ADR-0027-connected-sketch-display.md +62 -0
  756. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  757. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  758. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  759. package/docs/decisions/ADR-0031-plugin-command-owner-namespaces.md +37 -0
  760. package/docs/decisions/ADR-0032-compaction-run-checkpoints.md +35 -0
  761. package/docs/decisions/ADR-0033-plan-mode-research-delegation.md +47 -0
  762. package/docs/decisions/ADR-0034-first-class-harness-terminal-commands.md +25 -0
  763. package/docs/decisions/ADR-0035-one-launch-path.md +40 -0
  764. package/docs/decisions/ADR-0036-workspace-write-operation-boundary.md +54 -0
  765. package/docs/decisions/ADR-0037-usage-ledger-and-provider-limits.md +44 -0
  766. package/docs/decisions/ADR-0038-plan-bash-os-read-only.md +29 -0
  767. package/docs/decisions/ADR-0039-progress-aware-stall-guards.md +43 -0
  768. package/docs/decisions/ADR-0040-architecture-change-workflow.md +31 -0
  769. package/docs/decisions/ADR-0041-plugins-hub-separation.md +41 -0
  770. package/docs/decisions/ADR-0042-windows-shell-without-sandbox.md +40 -0
  771. package/docs/decisions/ADR-0043-parents-continue-stopped-subagents.md +49 -0
  772. package/docs/decisions/ADR-0044-annotations-pending-or-sent.md +24 -0
  773. package/docs/decisions/ADR-0045-default-plugin-authoring-skill.md +9 -0
  774. package/docs/decisions/ADR-0046-hash-bound-plugin-proposals.md +20 -0
  775. package/docs/decisions/ADR-0047-links-open-with-the-os-handler.md +47 -0
  776. package/docs/decisions/ADR-0048-required-skills-from-a-message.md +42 -0
  777. package/docs/decisions/ADR-0050-approved-window-screenshots.md +19 -0
  778. package/docs/decisions/ADR-0051-terminal-decision-wait.md +10 -0
  779. package/docs/decisions/ADR-0052-per-profile-subagent-budgets.md +25 -0
  780. package/docs/decisions/ADR-0053-no-repeated-work-guard.md +45 -0
  781. package/docs/decisions/ADR-0054-terminal-reply-heartbeat-and-stall.md +52 -0
  782. package/docs/decisions/ADR-0055-plan-output-repair.md +51 -0
  783. package/docs/decisions/ADR-0056-remote-control.md +53 -0
  784. package/docs/decisions/ADR-0057-structured-plan-outcomes.md +39 -0
  785. package/docs/decisions/ADR-0058-ask-user-only-plan-clarification.md +36 -0
  786. package/docs/decisions/ADR-0059-run-diagnostic-evidence.md +35 -0
  787. package/docs/decisions/ADR-0060-approvals-are-controls.md +40 -0
  788. package/docs/decisions/ADR-0061-strict-plugin-command-namespaces.md +41 -0
  789. package/docs/decisions/ADR-0062-shared-account-state.md +67 -0
  790. package/docs/decisions/ADR-0063-unfinished-work-handoffs.md +34 -0
  791. package/docs/decisions/ADR-0064-account-model-fallback-on-resume.md +79 -0
  792. package/docs/decisions/ADR-0065-variant-switch-at-turn-boundaries.md +31 -0
  793. package/docs/decisions/ADR-0066-guided-refinement-from-turn-snapshots.md +37 -0
  794. package/docs/decisions/ADR-0067-cache-stable-compaction-checkpoint.md +54 -0
  795. package/docs/decisions/ADR-0068-scope-and-completion-report.md +60 -0
  796. package/docs/decisions/ADR-0069-stop-gate-and-finish.md +136 -0
  797. package/docs/decisions/ADR-0070-terminal-slice-continuation.md +49 -0
  798. package/docs/decisions/ADR-0071-completion-check.md +104 -0
  799. package/docs/decisions/ADR-0072-codex-prompts-and-goal.md +108 -0
  800. package/docs/decisions/ADR-0073-large-reporting-prompt.md +89 -0
  801. package/docs/decisions/ADR-0074-report-content-not-report-blocks.md +90 -0
  802. package/docs/decisions/ADR-0075-no-todo-gate.md +84 -0
  803. package/docs/decisions/ADR-0076-codex-final-answer-verbatim.md +98 -0
  804. package/docs/decisions/ADR-0077-plan-runs-may-conclude-no-plan-needed.md +120 -0
  805. package/docs/decisions/ADR-0078-child-aware-stall-watch.md +46 -0
  806. package/docs/decisions/ADR-0079-phase-led-reporting-guidance.md +72 -0
  807. package/docs/decisions/ADR-0080-fixed-width-question-sketch-canvas.md +50 -0
  808. package/docs/decisions/ADR-0081-no-work-slice-budget-by-default.md +36 -0
  809. package/docs/decisions/ADR-0082-connected-brave-browser.md +72 -0
  810. package/docs/decisions/ADR-0083-one-live-session-runtime.md +256 -0
  811. package/docs/doctor.md +95 -0
  812. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  813. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  814. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  815. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  816. package/docs/experiments/EXP-0003-performance-audit/data/session-runtime-replication.json +420 -0
  817. package/docs/experiments/EXP-0003-performance-audit/data/session-runtime.json +420 -0
  818. package/docs/experiments/EXP-0003-performance-audit/data/terminal-compact.json +376 -0
  819. package/docs/experiments/EXP-0003-performance-audit/data/terminal-history.json +422 -0
  820. package/docs/experiments/EXP-0003-performance-audit/data/terminal-question.json +95 -0
  821. package/docs/experiments/EXP-0003-performance-audit/data/terminal-wide.json +1036 -0
  822. package/docs/experiments/EXP-0003-performance-audit/plan.md +109 -0
  823. package/docs/experiments/EXP-0003-performance-audit/results.md +151 -0
  824. package/docs/features/README.md +46 -0
  825. package/docs/features/automations/README.md +41 -0
  826. package/docs/features/cores/README.md +39 -0
  827. package/docs/features/google-harness2/README.md +52 -0
  828. package/docs/features/integrations/README.md +40 -0
  829. package/docs/features/interfaces/README.md +29 -0
  830. package/docs/features/memory/README.md +28 -0
  831. package/docs/future-work.md +48 -0
  832. package/docs/handoff-2026-10-25-app-parity-and-solo-tabs.md +202 -0
  833. package/docs/parity.md +158 -0
  834. package/docs/releases/1.0.0.md +40 -0
  835. package/docs/releases/1.1.1.md +28 -0
  836. package/docs/releases/1.2.0.md +49 -0
  837. package/docs/releases/1.3.0.md +21 -0
  838. package/docs/releases/1.3.1-unstable.1.md +8 -0
  839. package/docs/releases/1.3.1-unstable.2.md +11 -0
  840. package/docs/releases/1.3.1-unstable.3.md +54 -0
  841. package/docs/releases/1.3.1-unstable.4.md +56 -0
  842. package/docs/releases/1.3.1-unstable.5.md +53 -0
  843. package/docs/releases/1.3.1-unstable.6.md +31 -0
  844. package/docs/releases/1.3.1-unstable.7.md +17 -0
  845. package/docs/releases/1.3.1-unstable.8.md +19 -0
  846. package/docs/releases/1.3.1-unstable.9.md +54 -0
  847. package/docs/releases/1.4.0-unstable.md +25 -0
  848. package/docs/releases/1.5.0-unstable.md +32 -0
  849. package/docs/releases/1.5.1-unstable.md +24 -0
  850. package/docs/releases/1.6.0-unstable.md +59 -0
  851. package/docs/releases/2.0.1-unstable.md +63 -0
  852. package/docs/releases/4.0.0.md +47 -0
  853. package/docs/releases/README.md +49 -0
  854. package/docs/study/00-index.md +112 -0
  855. package/docs/study/STUDY-0003-long-horizon-runs.md +210 -0
  856. package/docs/study/STUDY-0004-turn-end-controls.md +130 -0
  857. package/docs/study/STUDY-0005-skill-installation-guidance.md +146 -0
  858. package/docs/study/STUDY-0006-reporting-prompts.md +119 -0
  859. package/docs/study/STUDY-0007-claude-code-prompt.md +162 -0
  860. package/docs/study/STUDY-0008-browser-control.md +281 -0
  861. package/docs/study/STUDY-0009-claude-code-reporting.md +205 -0
  862. package/docs/study/arms/00-matrix.md +20 -0
  863. package/docs/study/arms/01-system-prompt.md +211 -0
  864. package/docs/study/arms/02-tools.md +79 -0
  865. package/docs/study/arms/03-subagents.md +90 -0
  866. package/docs/study/arms/04-skills.md +81 -0
  867. package/docs/study/arms/05-context-management.md +90 -0
  868. package/docs/study/arms/06-memory.md +90 -0
  869. package/docs/study/arms/07-governance.md +71 -0
  870. package/docs/study/arms/08-execution.md +69 -0
  871. package/docs/study/arms/09-observability.md +60 -0
  872. package/docs/study/arms/10-refinement.md +110 -0
  873. package/docs/study/autonomous-engineering-sources.md +277 -0
  874. package/docs/study/autonomy-sources.md +147 -0
  875. package/docs/study/btw-comparison.md +37 -0
  876. package/docs/study/feature-gap-review.md +42 -0
  877. package/docs/study/insights.md +123 -0
  878. package/docs/study/proactive-autonomy.md +408 -0
  879. package/docs/study/roadmap.md +72 -0
  880. package/docs/study/sources/claude-code.md +56 -0
  881. package/docs/study/sources/deepseek-harness.md +102 -0
  882. package/docs/study/sources/harness2.md +50 -0
  883. package/docs/study/sources/kimi-cli.md +42 -0
  884. package/docs/study/sources/omp.md +93 -0
  885. package/docs/study/sources/opencode.md +43 -0
  886. package/docs/study/sources/openhands.md +46 -0
  887. package/docs/study/sources/smolagents.md +40 -0
  888. package/docs/study/sources/swe-agent.md +34 -0
  889. package/docs/study/tui-resource-browser.md +78 -0
  890. package/docs/system-prompt-design.md +196 -0
  891. package/docs/terminal-tui.md +887 -109
  892. package/package.json +46 -13
  893. package/src/accounts/accounts.test.ts +0 -419
  894. package/src/accounts/accounts.ts +0 -760
  895. package/src/accounts/env.test.ts +0 -95
  896. package/src/accounts/env.ts +0 -338
  897. package/src/accounts/secrets.ts +0 -50
  898. package/src/accounts/store.ts +0 -338
  899. package/src/capabilities/api.ts +0 -75
  900. package/src/capabilities/runSnapshot.ts +0 -59
  901. package/src/capabilities/types.ts +0 -34
  902. package/src/cli.ts +0 -118
  903. package/src/core/bus.test.ts +0 -22
  904. package/src/core/bus.ts +0 -49
  905. package/src/core/changes.ts +0 -33
  906. package/src/core/env.ts +0 -27
  907. package/src/core/errors.ts +0 -32
  908. package/src/core/frontmatter.ts +0 -47
  909. package/src/core/fs.test.ts +0 -38
  910. package/src/core/fs.ts +0 -92
  911. package/src/core/index.ts +0 -193
  912. package/src/core/path.test.ts +0 -14
  913. package/src/core/path.ts +0 -79
  914. package/src/core/projects.ts +0 -90
  915. package/src/core/text.ts +0 -39
  916. package/src/harness.ts +0 -322
  917. package/src/hub/catalog.json +0 -123
  918. package/src/hub/cli.ts +0 -59
  919. package/src/hub/hub.test.ts +0 -205
  920. package/src/hub/hub.ts +0 -256
  921. package/src/hub/schema.ts +0 -81
  922. package/src/index.ts +0 -80
  923. package/src/mcp/connections.ts +0 -641
  924. package/src/mcp/manager.ts +0 -130
  925. package/src/mcp/oauth.ts +0 -195
  926. package/src/mcp/scopeMigration.test.ts +0 -79
  927. package/src/mcp/scopeMigration.ts +0 -204
  928. package/src/mcp/service.test.ts +0 -422
  929. package/src/mcp/service.ts +0 -560
  930. package/src/mcp/types.ts +0 -118
  931. package/src/memory/api.test.ts +0 -82
  932. package/src/memory/api.ts +0 -303
  933. package/src/memory/blocks.test.ts +0 -78
  934. package/src/memory/blocks.ts +0 -408
  935. package/src/memory/caller.ts +0 -69
  936. package/src/memory/curation.test.ts +0 -206
  937. package/src/memory/curation.ts +0 -64
  938. package/src/memory/dispatch.ts +0 -64
  939. package/src/memory/facts.test.ts +0 -41
  940. package/src/memory/facts.ts +0 -248
  941. package/src/memory/graph.ts +0 -103
  942. package/src/memory/health.test.ts +0 -130
  943. package/src/memory/health.ts +0 -74
  944. package/src/memory/maintainer.ts +0 -272
  945. package/src/memory/maintenance.test.ts +0 -192
  946. package/src/memory/maintenance.ts +0 -679
  947. package/src/memory/migrate.ts +0 -79
  948. package/src/memory/operations.ts +0 -150
  949. package/src/memory/proposals.test.ts +0 -168
  950. package/src/memory/proposals.ts +0 -584
  951. package/src/memory/recall.test.ts +0 -115
  952. package/src/memory/recall.ts +0 -279
  953. package/src/memory/references.ts +0 -77
  954. package/src/memory/runContext.ts +0 -93
  955. package/src/memory/secrets.ts +0 -6
  956. package/src/memory/store.test.ts +0 -66
  957. package/src/memory/store.ts +0 -385
  958. package/src/memory/trajectory.test.ts +0 -178
  959. package/src/memory/trajectory.ts +0 -220
  960. package/src/memory/wiki.test.ts +0 -47
  961. package/src/memory/wiki.ts +0 -423
  962. package/src/memory/wikiIndex.test.ts +0 -88
  963. package/src/memory/wikiIndex.ts +0 -117
  964. package/src/plugins/api.ts +0 -181
  965. package/src/plugins/attachments.test.ts +0 -84
  966. package/src/plugins/attachments.ts +0 -141
  967. package/src/plugins/builtin.ts +0 -84
  968. package/src/plugins/catalogue.test.ts +0 -254
  969. package/src/plugins/catalogue.ts +0 -251
  970. package/src/plugins/cli.ts +0 -184
  971. package/src/plugins/discover.ts +0 -151
  972. package/src/plugins/firstParty.test.ts +0 -143
  973. package/src/plugins/firstParty.ts +0 -129
  974. package/src/plugins/hooks.test.ts +0 -250
  975. package/src/plugins/hooks.ts +0 -239
  976. package/src/plugins/identity.ts +0 -37
  977. package/src/plugins/install.test.ts +0 -107
  978. package/src/plugins/install.ts +0 -106
  979. package/src/plugins/inventory.ts +0 -123
  980. package/src/plugins/manifest.ts +0 -76
  981. package/src/plugins/plugins.test.ts +0 -205
  982. package/src/plugins/plugins.ts +0 -189
  983. package/src/plugins/proposal.ts +0 -121
  984. package/src/plugins/runtime.test.ts +0 -40
  985. package/src/plugins/runtime.ts +0 -82
  986. package/src/plugins/trust.ts +0 -142
  987. package/src/plugins/types.ts +0 -149
  988. package/src/prompt/compile.test.ts +0 -261
  989. package/src/prompt/compile.ts +0 -732
  990. package/src/server/methods.ts +0 -355
  991. package/src/server/remote.ts +0 -77
  992. package/src/server/rpc.ts +0 -116
  993. package/src/server/serve.ts +0 -28
  994. package/src/server/server.test.ts +0 -193
  995. package/src/sessions/approvals.test.ts +0 -49
  996. package/src/sessions/approvals.ts +0 -140
  997. package/src/sessions/contracts.ts +0 -336
  998. package/src/sessions/conversation.test.ts +0 -233
  999. package/src/sessions/extensionSession.test.ts +0 -74
  1000. package/src/sessions/extensionUi.test.ts +0 -65
  1001. package/src/sessions/extensionUi.ts +0 -102
  1002. package/src/sessions/history.ts +0 -51
  1003. package/src/sessions/lineageJoin.ts +0 -75
  1004. package/src/sessions/policy.ts +0 -36
  1005. package/src/sessions/pricing.ts +0 -60
  1006. package/src/sessions/questionBatches.test.ts +0 -110
  1007. package/src/sessions/reasoningSummaries.ts +0 -59
  1008. package/src/sessions/registry.ts +0 -412
  1009. package/src/sessions/runIndex.ts +0 -99
  1010. package/src/sessions/runStore.test.ts +0 -152
  1011. package/src/sessions/runStore.ts +0 -346
  1012. package/src/sessions/runner.ts +0 -610
  1013. package/src/sessions/runtimeResources.test.ts +0 -61
  1014. package/src/sessions/sessions.test.ts +0 -588
  1015. package/src/sessions/sessions.ts +0 -331
  1016. package/src/sessions/subagentService.test.ts +0 -159
  1017. package/src/sessions/subagentService.ts +0 -236
  1018. package/src/sessions/subagents.ts +0 -97
  1019. package/src/skills/registry.test.ts +0 -104
  1020. package/src/skills/registry.ts +0 -413
  1021. package/src/terminal/accountsMenu.test.ts +0 -225
  1022. package/src/terminal/accountsMenu.ts +0 -382
  1023. package/src/terminal/cli.ts +0 -149
  1024. package/src/terminal/client.ts +0 -74
  1025. package/src/terminal/control.test.ts +0 -23
  1026. package/src/terminal/control.ts +0 -23
  1027. package/src/terminal/controller.ts +0 -354
  1028. package/src/terminal/hubMenu.ts +0 -24
  1029. package/src/terminal/launch.test.ts +0 -25
  1030. package/src/terminal/launch.ts +0 -48
  1031. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  1032. package/src/terminal/piExtension.ts +0 -295
  1033. package/src/terminal/pluginControl.test.ts +0 -146
  1034. package/src/terminal/pluginMenu.ts +0 -112
  1035. package/src/terminal/socket.test.ts +0 -94
  1036. package/src/terminal/socket.ts +0 -256
  1037. package/src/terminal/standalone.test.ts +0 -167
  1038. package/src/terminal/standalone.ts +0 -165
  1039. package/src/terminal/terminal.test.ts +0 -534
  1040. package/src/terminal/terminals.ts +0 -661
  1041. package/src/terminal/trajectory.test.ts +0 -66
  1042. package/src/terminal/trajectory.ts +0 -44
  1043. package/src/terminal/tui/application.test.ts +0 -290
  1044. package/src/terminal/tui/application.ts +0 -653
  1045. package/src/terminal/tui/commands.test.ts +0 -278
  1046. package/src/terminal/tui/commands.ts +0 -443
  1047. package/src/terminal/tui/dialogs.ts +0 -301
  1048. package/src/terminal/tui/editor.test.ts +0 -113
  1049. package/src/terminal/tui/editor.ts +0 -109
  1050. package/src/terminal/tui/keybindings.test.ts +0 -30
  1051. package/src/terminal/tui/keybindings.ts +0 -59
  1052. package/src/terminal/tui/piAdapter.ts +0 -62
  1053. package/src/terminal/tui/planMode.test.ts +0 -10
  1054. package/src/terminal/tui/planMode.ts +0 -12
  1055. package/src/terminal/tui/presentation.test.ts +0 -79
  1056. package/src/terminal/tui/questions.test.ts +0 -41
  1057. package/src/terminal/tui/questions.ts +0 -47
  1058. package/src/terminal/tui/runtime.socket.test.ts +0 -178
  1059. package/src/terminal/tui/runtime.test.ts +0 -225
  1060. package/src/terminal/tui/runtime.ts +0 -403
  1061. package/src/terminal/tui/screen.test.ts +0 -143
  1062. package/src/terminal/tui/screen.ts +0 -121
  1063. package/src/terminal/tui/sessionUi.ts +0 -24
  1064. package/src/terminal/tui/settings.test.ts +0 -150
  1065. package/src/terminal/tui/settings.ts +0 -188
  1066. package/src/terminal/tui/skillInvocation.test.ts +0 -71
  1067. package/src/terminal/tui/skillInvocation.ts +0 -51
  1068. package/src/terminal/tui/status.test.ts +0 -48
  1069. package/src/terminal/tui/status.ts +0 -82
  1070. package/src/terminal/tui/theme.ts +0 -185
  1071. package/src/terminal/tui/tools.test.ts +0 -145
  1072. package/src/terminal/tui/tools.ts +0 -142
  1073. package/src/terminal/tui/trajectoryPanel.test.ts +0 -99
  1074. package/src/terminal/tui/trajectoryPanel.ts +0 -226
  1075. package/src/terminal/tui/transcript.test.ts +0 -39
  1076. package/src/terminal/tui/transcript.ts +0 -135
  1077. package/src/terminal/tui/ui.test.ts +0 -313
  1078. package/src/terminal/tui/ui.ts +0 -166
  1079. package/src/terminal/tui/welcome.ts +0 -102
  1080. package/src/terminal/tui/workingStatus.test.ts +0 -44
  1081. package/src/terminal/tui/workingStatus.ts +0 -238
  1082. package/src/tools/askUser.test.ts +0 -69
  1083. package/src/tools/askUser.ts +0 -59
  1084. package/src/tools/definitions.ts +0 -228
  1085. package/src/tools/maintenance.ts +0 -29
  1086. package/src/tools/memoryTools.ts +0 -22
  1087. package/src/tools/pluginPropose.ts +0 -41
  1088. package/src/tools/registryWrite.test.ts +0 -101
  1089. package/src/tools/registryWrite.ts +0 -182
  1090. package/src/tools/spawnSubagent.ts +0 -47
  1091. package/src/tools/types.ts +0 -41
  1092. package/src/web/safeRequest.ts +0 -171
  1093. package/src/web/text.ts +0 -53
  1094. package/src/web/tools.ts +0 -134
  1095. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,505 @@
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
+ | compaction checkpoint | `sessions/compactionCheckpoint.ts` | Restores the active request's bounded goal, todo list and plan instructions to model context after compaction. |
17
+ | `RunRegistry`, `ActiveRun` | `sessions/registry.ts` | Live runs: `emit`, `requestApproval`, `requestAnswer(s)`, `onInterrupt`, `onSteer`, `finish`; `listen` for observers. |
18
+ | run store functions | `sessions/runStore.ts` | `saveRun`, `updateRun`, `persistEvent`, `appendEvent`, `readEvents`, `markInterruptedRuns`, `runFamily`, `listRuns`. |
19
+ | `RunRecord`, `RunEvent`, schemas | `sessions/contracts.ts` | The one contract every session shares. |
20
+ | `Subagents` | `sessions/subagentService.ts` | `spawn`, `wait`, `results`, delivery receipts, recovery. |
21
+ | `SideQuestions` | `sessions/sideQuestions.ts` | Starts, reads and interrupts independent tool-free runs using bounded context from the main conversation (PROP-0019). |
22
+ | plan mode | `sessions/planMode.ts` | `planSection`, `planRefusal`, `PLAN_READ_ONLY_TOOLS`. |
23
+ | `Approvals` | `sessions/approvals.ts` | Standing approvals (page 07). |
24
+ | history selection | `sessions/history.ts` | `selectHistory`: which native history file a run continues. |
25
+ | `runIndex`, `pricing`, `reasoningSummaries`, `lineageJoin`, `extensionUi` | `sessions/` | Run listing, cost, provider summaries, parent/child joins, extension UI as run events. |
26
+
27
+ ## Runtime flow of `sessions.run`
28
+
29
+ 1. Validate the input (`run.id`, `sessionId`, `text`; an `initialBashCommand` only on a new
30
+ interactive user turn).
31
+ 2. Resolve a continuation when requested; reuse its pinned root or derive one from its recorded
32
+ working directory. For a new run, resolve and pin the root from the effective `cwd` (after
33
+ worktree selection). Select the native history (`selectHistory`) and resolve the account
34
+ (`accounts.resolve`).
35
+ 3. Resolve the caller's capabilities, intersect with any narrower requested set, and **freeze**
36
+ them for the run (`capabilities/runSnapshot.ts::freezeRun`).
37
+ 4. **Pin** the variant once (`variant/materialise.ts::materialise`).
38
+ 5. `saveRun` with status `queued`, the account, `harnessScope` and `harnessVersion`.
39
+ 6. Compile the prompt (`sessionLaunch`, page 04): a stable system prompt and an optional context
40
+ update.
41
+ 7. `runs.start` the live run; build the tool list (broker, Harness tools including read-only
42
+ `get_capabilities`, the plan-eligible `ask_user`, subagent tools, provider tools) and the gate.
43
+ 8. Open Pi through the `SessionFactory`, with resources loaded in order: disk extensions chosen by
44
+ the harness, variant extensions, inline extensions, and the gate last.
45
+ 9. Record `nativeSessionId`, register the run with `Subagents`, start `runTurn`, and return
46
+ `{ runId, nativeSessionId }`. The reply streams as run events.
47
+
48
+ A session that cannot open ends its run as `failed` and returns `nativeSessionId: null`.
49
+
50
+ ## Contracts
51
+
52
+ - **Run status:** `queued`, `running`, `waiting_for_approval`, `waiting_for_input`, `interrupted`,
53
+ `completed`, `failed`. The first four are active (`ACTIVE_STATUSES`).
54
+ - **Run events** (`runEventTypeSchema`): `started`, `context.snapshot`, `message.delta`,
55
+ `message.completed`, `message.steered`, `tool.started`, `tool.completed`, `tool.refused`, `retry.started`,
56
+ `retry.ended`, `compaction.started`, `compaction.ended`, `approval.requested`,
57
+ `approval.resolved`, `question.requested`, `question.answered`, `extension.notice`,
58
+ `reaction.added`, `agent.message`, `todo.updated`, `checkpoint`, `heartbeat`, `artifact.added`, `file.changed`, `usage.updated`,
59
+ `account.status`, `status.changed`, `failed`, `completed`. Each has a payload schema in
60
+ `runEventPayloadSchemas`.
61
+ - **Stop codes.** `terminalCode` is nullable for legacy records and identifies a recorded outcome independently of `terminalReason`. Structured sessions record `completed`, `user_abort`, `slice_budget`, `compaction_thrash`, `provider_error`, or `failed`; recovery can record `harness_restart`, `stalled` or `owner_gone`. Other shared codes include `terminal_attention`, `terminal_closed` and `parent_stopped`. Interrupted `status.changed` events may carry the code; failure codes map to a stop code. Legacy events without a code remain unknown.
62
+ - **Queued-message dispatch.** Both front ends retain Pi's normal delivery behavior after success. Only an explicit user stop may release messages still queued when a reply is interrupted: send the oldest unconsumed steer first, then the oldest follow-up. Retry events are not settlement boundaries; provider failure, a retry that ultimately fails, and non-user interruption leave queued messages parked. A settled interruption alone is not proof of user intent.
63
+ - **Compaction evidence.** Structured compaction starts include the latest known context tokens and window when available; ends include Pi’s `tokensBefore` when supplied. Tokens after compaction remain unknown unless reported.
64
+ - **Workspace root** (`RunRecord.workspaceRoot`) is the canonical root whose filesystem effects
65
+ native writes and default-scope Bash may modify: the nearest Git repository or worktree above its
66
+ effective working directory, otherwise that canonical directory. New runs pin it; continuations
67
+ reuse it. Older records may omit it, in which case a continuation derives it from the recorded
68
+ `workingDirectory`. The filesystem root itself cannot be selected as a workspace, because it
69
+ would collapse the write boundary. Native writes revalidate the target and atomically replace it
70
+ inside an OS write scope; Bash scans for external hard-link aliases and runs in the same pinned
71
+ boundary (page 07).
72
+ - **Workspace snapshot** (`RunRecord.workspaceSnapshot`, PROP-0052). Before the agent acts on a turn
73
+ a person typed (a structured session's own turn, or a terminal turn with text), the harness
74
+ records `{ kind: 'git-snapshot', repo, commit, omitted? }` when the working folder is in a git
75
+ repository: a commit of tracked edits, deletions and bounded untracked files (5 MB each, 100 MB,
76
+ 10,000 files; `omitted` counts the rest) made through a throwaway index. The working tree, the
77
+ real index, HEAD and refs are not touched. A snapshot that fails or takes longer than two seconds
78
+ records nothing. Refinement replays the turn from it (page 05).
79
+ - **Question sketches** (PROP-0025, ADR-0026; originally PROP-0024, ADR-0025). `question.requested` may include `uiSketch: true`
80
+ and `sketch` text on each choice. If enabled, every choice must have a sketch; otherwise no
81
+ choice may carry one. A sketch is 1–24 LF-separated lines, at most 80 printable ASCII characters
82
+ per line (1,943 bytes maximum), with at least one visible character. Tabs, CR, other controls,
83
+ escape sequences and non-ASCII text are rejected. Whitespace, including interior blank lines and
84
+ trailing spaces, is preserved literally in the persisted request event. Tool guidance requests
85
+ detailed contextual UI wireframes on a fixed 80-column canvas, with actual panel/table structure
86
+ and neighboring elements consistent across alternatives. The terminal pads shorter rows to this
87
+ canvas for display; the schema still permits sketches shorter than 80 columns, so generation
88
+ quality remains guidance rather than a validation guarantee. Old events remain valid without a data
89
+ rewrite; readers with the old bounds must update before accepting larger sketches.
90
+ `question.answered` and `QuestionAnswer` are unchanged.
91
+ - **Todo list** (PROP-0006, renamed by PROP-0045): `todo.updated` carries the whole list the model
92
+ last wrote with `todo_write`, `{ items: { text, status: pending | in_progress | completed }[] }`, at
93
+ most 50 items. The latest event replaces every earlier one; `todoOf(events)` reads it. The
94
+ pre-rename `checklist.updated` is still read so old runs keep their list, and is never written.
95
+ - **Run details observations.** Optional `loadedSkills` records successful Harness `skill_load` calls during the run, not skill availability or native file reads. Optional `activatedPlugins` records observed activated extension plugin identities only when the loader can account for them; omission means unknown, including historical runs and unsupported boundaries. Empty arrays mean the corresponding observation found none.
96
+ - **`RunRecord`** fields are listed in `sessions/contracts.ts`. `mode`, `harness`, `sessionType`,
97
+ `worktreeId`, `attachmentCount`, `exitCode`, `handoffId` and `trigger` belong to the
98
+ application: stored and returned, and only `mode` and `trigger` are read.
99
+ - **Triggers the harness reads:** `user` (may carry an initial Bash command), `probe` and
100
+ `improver` (refinement, page 05), `reflection` (lessons, page 08). Runs with the last three are
101
+ never asked about: the gate refuses what would need a person, and they receive no question tool.
102
+ Only attended plan runs may newly receive `ask_user`.
103
+ - **Side questions** (PROP-0019). `sideQuestions.start` creates a separate run with trigger and
104
+ relation `side-question`, a fresh native history, the selected account/model/effort, no variant,
105
+ and an empty frozen capability set. It combines the parent's persisted effective prompt and
106
+ public run events with the surface's visible transcript and selected references, after redaction
107
+ and fixed bounds. Hidden reasoning and attachment bytes are omitted. A supplied parent run must
108
+ belong to the supplied parent session. `sideQuestions.read` and `interrupt` require the side run's
109
+ session id. The run is not a subagent or continuation and never changes the parent.
110
+ - **Subagents.** `spawn_subagent` / `wait_subagents` for the model; `subagents.spawn`, `wait`,
111
+ `results` for the host (`sessions.spawnSubagent` is a compatibility alias). Child runs have
112
+ `relation: 'subagent'` and `parentRunId`. Nesting defaults to 1, at most 3 (`subagentDepth`).
113
+ A run also starts only a few children: by default at most four distinct child conversations, at
114
+ most two `worker`, three `explorer`, one of any other named profile and one with no profile. The
115
+ parent's `subagents` option overrides them (`maxChildren`, `maxByProfile`, `maxOther`,
116
+ `maxUnprofiled`), clamped to 0–50. The count covers this run and the runs it was continued from
117
+ (`resumedFromRunId`), so a work-slice continuation keeps the budget; it counts distinct
118
+ conversations, so continuing a stopped child uses no new slot, while a child whose startup
119
+ failed still counts. A concurrent spawn reserves its slot before it launches. A refused spawn is
120
+ an `invalid_request` whose message tells the model to do the work itself; no child run is
121
+ created.
122
+ The child's record carries `title`, the short name the parent gave it (PROP-0030).
123
+ `spawn_subagent { continue: <runId> }` (`subagents.spawn { continue }`) continues a child that
124
+ stopped before finishing as a new child run with `continueFrom`. It reopens the first link's
125
+ history folder and keeps the earlier child's session id, profile, title, account, variant version
126
+ and frozen capability set, which must still lie within the parent's; `agent` and `tools` are
127
+ refused with it, and the newest link of a chain is the one continued (ADR-0043). Children an
128
+ earlier reply left stopped are delivered before the next reply's first request, each with a
129
+ note that it can be continued; a stopped child that was continued is reported through its
130
+ continuation. Every run record carries the launch `model` and `effort`, superseded by the model
131
+ the session opened with.
132
+ - **Agent profiles** (PROP-0029). `agent` names a profile: built-in (`worker`, `explorer`),
133
+ `<data root>/agents/<name>.md`, `<project>/.xingular/agents/<name>.md`, or a c5 definition of
134
+ the parent's variant, later sources winning (`agents/profiles.ts`). A switched-on package's
135
+ profiles (page 06) then fill names nobody else took; the run resolves them once at start into
136
+ `packageProfiles`, and its children resolve their profiles from that list. A profile narrows the
137
+ child's tools and plugins (`agents/narrow.ts`), may choose its variant, model and effort, and
138
+ frames it with a "Your role" section. The child's record carries `profile`; the spawn result
139
+ carries `agent` and any `unavailableTools`. `main` is reserved for the main agent's row: no
140
+ profile file or variant definition may take it. A run that may spawn lists every profile in its
141
+ `subagents` section.
142
+ - **Plan mode** (`plan: true`). The stable system prompt is unchanged. An attended plan run may
143
+ include `ask_user` and `spawn_subagent` / `wait_subagents`, subject to the caller's frozen
144
+ capabilities. Delegation is limited to named profiles whose effective tool and plugin allowlists
145
+ qualify for read-only research; the child inherits plan mode and cannot write, run commands, ask
146
+ the user, use connectors or spawn children. The gate refuses unsafe calls before approvals and the
147
+ subagent service rechecks profile eligibility before launch. Other calls must be in
148
+ `PLAN_READ_ONLY_TOOLS` (including `get_capabilities` when frozen for the run), be provider tools
149
+ marked `readOnly`, or be explicitly classified by `planModeSafe`. Model-issued `bash` is allowed
150
+ and runs in the sandbox's read-only scope: no writes except a discarded temp folder, no network,
151
+ nothing that widens the scope; the gate refuses `outside` requests and `PLAN_BASH_DENIED` commands
152
+ (PROP-0043). The dynamic plan instruction asks the model to check whether the requested work
153
+ already exists before designing it, to name the evidence and stop when it does, and says that a
154
+ person's instruction not to plan outranks the mode's output shape. It also
155
+ requires an opening `Goal` or `Summary`, evidence-grounded findings when useful, and task-scaled
156
+ steps and verification. A small fix stays concise without omitting its
157
+ outcome or check; cross-cutting work uses ordered steps. It encourages questions about material
158
+ user-owned decisions and important assumptions after discovery, including when a default exists.
159
+ For unresolved substantive UI or TUI layout and interaction choices, it defaults to contextual
160
+ `uiSketch` questions with meaningful alternatives; routine, specified, delegated or nonvisual
161
+ decisions do not require sketches. Both the dynamic section and compaction checkpoint have room
162
+ for the complete bounded plan instruction.
163
+ **Outcome contract (ADR-0077, superseding the repair criterion of ADR-0055, ADR-0057 and
164
+ ADR-0058).** Classify a
165
+ new final reply as exactly one of `plan_ready`, `blocked`, `no_plan`, or `invalid`. `plan_ready`
166
+ uses one complete `<proposed_plan>` block and is the only outcome that offers a plan card and
167
+ Implement. When a required user decision cannot be obtained because `ask_user` is unavailable,
168
+ `blocked` uses one complete nonempty `<plan_blocked>` block to report the blocker without asking
169
+ a free-text question or inventing the decision; it
170
+ is not a plan and never offers Implement. `no_plan` is an ordinary reply with no outcome block: it
171
+ says there is nothing to design, because the work already exists, the person declined to plan, or
172
+ no decision is needed. It is a valid conclusion, not a formatting failure, and it offers no card,
173
+ notice or warning and no second request. New final replies must not use `<plan_clarification>`
174
+ or free-text questions as a clarification channel. A block the model started and left unbalanced,
175
+ empty, duplicated or in conflict is `invalid`, not a guessed plan; tags inside fenced or inline
176
+ code are text, not outcomes. When clarification is needed and `ask_user`
177
+ is available, it blocks the active run for the answer, then that same run continues research and
178
+ planning.
179
+
180
+ Server and terminal use the same outcome classification and one bounded, hidden repair turn
181
+ in the same eligible attended top-level plan run, only for `invalid`. The repair asks for the
182
+ declared block to be finished or for the statement that there is nothing to plan; it does not
183
+ invent decisions or change the substance, and it may call `ask_user` when
184
+ available, blocking the active run for the answer. It is not a new user request, does not bypass
185
+ the plan gate, and is never attempted for a
186
+ plan-research child, command, probe, improver, reflection, other unattended run, interruption,
187
+ error or work-slice termination. A second invalid result ends repair: retain the original reply,
188
+ complete the run with a warning and no Implement choice. Preserve the existing plan tag, card,
189
+ run events, tool permissions and cached prompt boundary; old transcripts, including legacy
190
+ clarification blocks and untagged replies, remain intact and visible, not silently promoted to
191
+ plans. Do not require clients to understand a new event type.
192
+ - **Compaction checkpoint** (PROP-0033, ADR-0032, ADR-0067). After a compaction that happens
193
+ during an active run, its model context receives a bounded, ephemeral checkpoint with the current
194
+ user request and the todo list or applicable plan instructions as they were at that compaction,
195
+ when either is available to restore. A run that starts from already-compacted history gets none:
196
+ its request, todo and plan are in live history. The checkpoint is built once per compaction and
197
+ re-added to each request at the same place, directly after the compaction summary, so each
198
+ request stays the previous one plus new items and provider caching keeps working. Later
199
+ `todo_write` calls in history supersede its list. Its state is cleared when the run settles or the
200
+ session branch changes. The message changes no
201
+ tools, permissions, run events or native history. An interrupted run still uses the durable
202
+ todo list and normal continuation path.
203
+ - **Continuation** (PROP-0007). `continuationOf(root, runId, sessionDir?)` (`runs.continuation`)
204
+ says whether a stopped run can be continued: `resumable`, a `reason` when not (`not_found`,
205
+ `active`, `completed`, `no_history`, `history_missing`), the exact native history to reopen,
206
+ the pinned account, variant version and capability set, the todo list, unanswered approvals and
207
+ questions, the last tool and whether it finished, and subagents that did not finish.
208
+ `SessionRunInput.continueFrom` starts a **new** run from it: it reopens that history, records
209
+ `resumedFromRunId`, pins the same account, variant version and capability set (anything different
210
+ fails with `continuation_mismatch`; a run that cannot be continued fails with
211
+ `continuation_unavailable`). If the earlier snapshot includes `ask_user`, an automatic or
212
+ refinement-triggered continuation fails with `continuation_mismatch` rather than narrowing it.
213
+ Empty text defaults to "Continue from where you stopped.", and the new run adds
214
+ a dynamic `continuation` section (order 26) saying where the earlier run stopped and that its
215
+ unfinished subagents can be continued with `spawn_subagent { continue }`. The next run
216
+ without `continueFrom` withdraws it. `Recovery.interruptedRunIds` lists the runs `open` marked
217
+ interrupted.
218
+ - **Worktrees** (PROP-0016). When `run.worktreeId` names a worktree in the Harness registry
219
+ (`worktrees/`), the run works in that worktree's folder (the given `cwd` is replaced), holds a
220
+ lease on it (holder: the session id, with `git worktree lock`) until the run completes, fails or
221
+ is interrupted, and records the id. An id the registry does not know is stored and returned as
222
+ the caller's own field, as before. A terminal session holds its worktree for its whole life.
223
+ - **Usage** (`usage.updated`). `inputTokens` is uncached input; `cacheReadTokens` and
224
+ `cacheWriteTokens` are separate; `outputTokens` includes `reasoningTokens`. Totals are
225
+ cumulative for the run, not the native session. `contextTokens` is the latest request's size.
226
+ The derived usage ledger (`usage_requests`, page 08) copies these requests for
227
+ `/usage:analysis`; run events remain the only source of truth.
228
+ - **Limit snapshots** (`account.status.limits`). A provider reading carries a window or balance,
229
+ its reset, and its source. It is produced by the usage limits service from provider response
230
+ headers or a documented provider endpoint (page 09), stored in the account's state, and never
231
+ inferred from a made-up cap.
232
+ - **Provider reasoning summaries.** For supported Responses API families, when reasoning is
233
+ enabled the runner requests a `detailed` summary and records only the provider's explicit summary
234
+ (bounded to 4,000 characters) in request-level usage. This does not change reasoning effort or
235
+ guarantee a provider will return a summary; raw reasoning is not used as a substitute.
236
+
237
+ ## Session controls and command runs (PROP-0040)
238
+
239
+ `commands/registry.ts` is the browser-safe core command catalogue, shared by front ends.
240
+ `commands.list` combines it with effective plugin, extension, prompt and skill routes (page 10).
241
+ A listed route is not proof that its surface passes acceptance.
242
+
243
+ `sessions/control.ts` owns saved-history operations: tree, navigation without a summary, fork,
244
+ clone, rename, last reply and JSONL export. A `SessionRef` names `sessionDir`, optional
245
+ `sessionFile` and optional `cwd`; the resolved JSONL must be inside that directory. Navigation
246
+ records a `xingular-navigation` entry; choosing a user message returns its text for editing and
247
+ moves before it. Fork and clone create history in an absolute `targetDir`.
248
+
249
+ `SessionRunInput.command` (also `TurnParams.command`) is one of:
250
+
251
+ - `{ name: 'compact', instructions? }`
252
+ - `{ name: 'navigate', entryId, summarize: boolean, instructions? }`
253
+ - `{ name: 'export', path }` (absolute `.html` path)
254
+
255
+ It replaces prompt submission and skips the normal context update. It requires saved history and
256
+ cannot combine with plan mode, continuation, automatic execution, initial Bash or images. It uses
257
+ normal account/variant/capability pins, events and cancellation. Front ends must fence history
258
+ mutations against active work; the current raw saved-history helpers do not themselves establish
259
+ that fence. Stable native entry IDs must connect host transcript projection to navigation/fork,
260
+ not positional message counts. A host can route `/history` to Harness `sessions.navigate` and
261
+ navigate the same saved session; it must not substitute a fork. Shared session catalog registration
262
+ is approved but remains in progress; no completed cross-surface catalog is implied (PAR-008).
263
+
264
+ ## Live sessions (ADR-0083)
265
+
266
+ A *live session* is a Pi session the harness keeps open between the runs of one conversation, so a
267
+ later run reuses it instead of opening and loading a new one. `sessions/live.ts::LiveSessions` holds
268
+ them, one per `run.sessionId`.
269
+
270
+ - **Opt in.** `SessionRunInput.live: true` keeps the session open after the run and reuses an open
271
+ one. It is refused (`invalid_request`) for an unattended, child, nested, probe, improver or
272
+ reflection run, and refused with `session_busy` while another run of the session is using it.
273
+ Without `live` a run opens and disposes its own session, as before.
274
+ - **Pins.** A live session serves a run only when everything the run pins equals what the session
275
+ was opened with: account and its config folder, variant scope and version, variant extensions and
276
+ skill paths, the frozen capability set, working folder, workspace root and history folder, plan
277
+ and plan-repair flags, the allowed, gated and bound tool names, the stable system prompt, model,
278
+ effort, the run-scoped extension names and whether provider tools are asked. A supplied history
279
+ file and native session id must be the session's own. Any difference closes the idle session at
280
+ the turn boundary and the run opens a fresh one on the same native history.
281
+ - **Rebinding.** `piSessionFactory` reads the run's gate, bound tools, extension host and
282
+ plan flag through a binding that `PiSessionLike.rebind` replaces at the start of each run. The
283
+ run-scoped inline extensions (lineage join, subagents, compaction checkpoint, work slice, goal,
284
+ first-party hooks) are loaded in slots: a rebind removes the last run's handlers (Pi's `on`
285
+ returns the remover) and runs the next run's factory against the same extension. A session whose
286
+ run-scoped extension registers anything but handlers is not reusable. Between runs an extension
287
+ dialog is refused with `run_not_active`.
288
+ - **One writer of the history.** A top-level run of the same session that is not live (a command
289
+ run, for example), and `sessions.navigate` or `sessions.rename` on its history folder, close an
290
+ idle live session first so nothing holds a stale copy of the file; while the live session is
291
+ replying they are refused with `session_busy`.
292
+ - **Settling.** `runTurn` calls `TurnParams.release` instead of disposing the session. An idle live
293
+ session closes after 30 minutes (`SessionsOptions.liveIdleMs`), on `sessions.close`, or when the
294
+ harness closes.
295
+ - **Follow-ups.** `sessions.followUp { sessionId, text }` starts the next run at once when the
296
+ session is idle, or queues the text (at most 20) for after the active run. The queue follows the
297
+ queued-message dispatch rule above: it is sent after a reply that completed or that the person
298
+ stopped, and parked after a failure or any other interruption; a work-slice continuation runs
299
+ first. A follow-up run repeats the last live run's input with its own text and no Bash, images,
300
+ command, continuation or goal. `runs.steer` steers the active run as before.
301
+ - **Other run inputs a live client uses.** `newHistory: true` starts a new native history in
302
+ `sessionDir` (refused with `resume`, `continueFrom` or `command`). `hiddenNotes` (at most 8, each a
303
+ lower-case type and up to 20,000 characters) are saved as hidden messages before the request, as
304
+ the context update is. `planTools: 'active'` makes a plan run's frozen tool set the plan's own
305
+ (`planModeTools`), so the request carries only those tools; the default `gate` keeps every tool in
306
+ the request and refuses at the gate. An initial Bash command is accepted on a live turn that
307
+ resumes its history.
308
+ - **Question dialogs.** `question.requested` may carry `dialog { kind: select | confirm | input |
309
+ editor, title, message?, placeholder?, prefill?, options? }` when a Pi extension's dialog asked it
310
+ (`sessions/extensionUi.ts`). A host may ignore it; the answer is the usual `QuestionAnswer`.
311
+ - **Methods.** `sessions.live {}` → `{ sessions: LiveSessionStatus[] }`; `sessions.close { sessionId }`
312
+ → `{ closed, afterRun }` (a busy session closes when its run settles);
313
+ `sessions.followUp { sessionId, text }` → `{ runId } | { queued }`;
314
+ `sessions.followUp.clear { sessionId }` → `{ removed }`.
315
+
316
+ ## Invariants
317
+
318
+ - **INV-RUN-1** A run pins one account, one variant version, one capability set and one canonical
319
+ `workspaceRoot` when it starts. None changes during the run. A continuation reuses the prior
320
+ root, deriving one from `workingDirectory` only for a legacy record without the field. A pinned
321
+ account that cannot be used fails the run; it is never swapped (`INV-ACC-2`). A side-question
322
+ run is the explicit exception for the variant: it pins no variant and uses the fixed Harness
323
+ instruction plus a redacted main-run context projection (PROP-0019).
324
+ - **INV-RUN-2** A run's capability set is written once (`freezeRun`). A resumed or duplicate launch
325
+ with a different set fails with `capabilities_frozen`. A child run's set is the intersection of
326
+ its parent's, its profile's tools and plugins, and what it asked for; it never widens.
327
+ - **INV-RUN-3** Every run event is validated against its schema, redacted, persisted, and only then
328
+ relayed to listeners, in order. An event that arrives after the run settled is kept as evidence
329
+ and never applied or relayed.
330
+ - **INV-RUN-4** A restarted harness never restarts model work. On `open`, runs left active are
331
+ marked `interrupted` unless another live process owns them (`owner.json`). Recovery of a
332
+ subagent needs the same account, caller, working folder and history branch; the history branch
333
+ (owner marker and native history id), not the host's session id, ties a parent to an earlier
334
+ one. A stopped subagent is continued only by its parent, through `spawn_subagent { continue }`. Continuing is always
335
+ a new run with `continueFrom`; it pins the earlier run's account, variant version and capability
336
+ set, and the earlier run's record is never reopened. The application asks for it, or the earlier
337
+ run's work-slice policy does when the reply stopped at its budget (PROP-0041); a run started
338
+ without a person (`automatic`), a plan, a subagent, a session command or a worktree never
339
+ continues itself.
340
+ - **INV-RUN-5** Unattended runs (`automatic: true`) load no extension found on disk, read no
341
+ context files, and never ask a person: anything that would need approval is refused. A variant's
342
+ own trusted plugins still load, except for side-question runs, which have no variant or plugin
343
+ code and use an empty capability set (PROP-0019).
344
+ - **INV-RUN-6** Only the harness writes `runs/<id>/`; an application reads it. `run.json`,
345
+ `events.jsonl`, `owner.json` and `subagents.json` are written only through
346
+ `sessions/runStore.ts`. Side files are written by their owning module: `context.json`
347
+ (`prompt/compile.ts`), `caller.json` (`sessions/sessions.ts`), `capabilities.json`
348
+ (`capabilities/runSnapshot.ts`), `mcp-context.json` (`mcp/service.ts`). Adding another writer
349
+ or side file needs a proposal. (See drift D-1.)
350
+ - **INV-RUN-7** Token accounting follows the usage contract above. Changing what a field means is
351
+ an architecture change.
352
+ - **INV-RUN-8** Plan mode keeps the stable system prompt but has mode-specific tools: an attended
353
+ plan may include `ask_user`, `spawn_subagent` and `wait_subagents`, subject to the frozen caller
354
+ capabilities; newly resolved normal, automatic, probe, improver and reflection runs omit
355
+ `ask_user`. Plan-mode spawning requires a named profile whose effective explicit tool and plugin
356
+ allowlists qualify for read-only research. The prompt lists only profiles whose intersection with
357
+ the parent's frozen tools and plugin contributions includes a research evidence tool. An omitted
358
+ `tools` override inherits that safe intersection; an explicit override can only narrow it. The
359
+ child inherits plan mode and is narrowed to the intersection of the parent's frozen capabilities,
360
+ the profile and the plan research set; it has no
361
+ connectors, user questions, writes, commands or nested subagents. The plan run itself may run
362
+ Bash only in the OS-enforced read-only scope (PROP-0043, ADR-0038); research children cannot run
363
+ commands. Generic browser actions and connected-app calls remain unavailable in plan mode. The
364
+ gate refuses unsafe calls before approvals, and the service rechecks before launch. The terminal activates plan-eligible
365
+ tools only for a plan request, then restores its normal set. Provider-cache effects of the tool-list
366
+ difference are not assumed (page 04, `INV-PRM-8`). Pi records a tool-set change only with the next
367
+ request, so the terminal brackets each plan request with `xingular-plan-tools` entries (`begin`
368
+ carries the normal set it replaced, then `end`). Whenever Pi rebuilds the active tools from the
369
+ transcript (a new runtime, resume, switch, fork or tree navigation), `normalToolsForBranch` returns
370
+ the bracketed normal set if the last recorded set is a plan's, so a plan never leaks into normal
371
+ mode.
372
+ - **INV-RUN-9** Subagent results reach the parent at native turn boundaries, at most once
373
+ automatically (typed receipts in native history). A parent joins outstanding children before it
374
+ completes.
375
+ - **INV-RUN-10** An initial Bash command is allowed only on a new interactive user turn (not
376
+ automatic, plan, resumed, continuing, relation, probe or improver runs), must match the leading `!`
377
+ command in the text, and passes the same gate as model-issued Bash. It is workspace-scoped by
378
+ default; the explicit terminal syntax `!outside <command>` requests the same human-only,
379
+ pre-execution outside-scope approval as the Bash tool and runs the command at most once.
380
+ - **INV-RUN-11** A side-question run is independent, tool-free and temporary. It receives only a
381
+ bounded, redacted projection of the main run's effective prompt and public events plus the
382
+ surface's visible transcript and selected references. It excludes hidden reasoning and attachment
383
+ bytes, never reads the main native history, and never changes or steers the parent. Its own run
384
+ record and events use the normal store contract (PROP-0019).
385
+ - **INV-RUN-13** A reply may be a bounded work slice (PROP-0041), but the foundation has no budget
386
+ (ADR-0081): the defaults are no tool-call limit, no time limit and no new-token limit (earlier
387
+ defaults: 320 calls and 60 minutes, PROP-0044). A caller that asks for one sets `workSlice` on a
388
+ run or `XINGULAR_WORK_SLICE` at launch; a token cap is counted on new input, cache writes and
389
+ output and never on the cached prefix. Everything below describes a reply that was given a limit,
390
+ and the three-compaction guard, which is not a budget, stays on. At the
391
+ limit the guard refuses the next tool call and asks the model to stop and report where it is; the
392
+ harness then writes the checkpoint itself from the reply's files, checks and todo list (the model
393
+ has no checkpoint tool since ADR-0069). A non-handoff tool call after the refusal ends the reply. A
394
+ budget-ended reply is `interrupted` with terminal reason `slice_complete` (ADR-0053), unless it
395
+ continues: a headless run as a new run (`continueSlice`), a terminal reply in place as its next
396
+ slice (ADR-0070), both up to `maxSlices` and never after a fruitless or blocked slice. The budget
397
+ covers the whole reply: Pi emits `agent_start` for every continuation (a slice continuation, delivered
398
+ subagent results, a plan repair), so the guard starts a new slice only on a person's message.
399
+ No call is refused for repeating: identical calls, a Bash check that keeps failing and repeated
400
+ `edit`/`write` results on one path are allowed as often as the work needs, because a distinct read
401
+ or another edit is not evidence of a loop. `todo_write` counts toward the tool-call budget and is
402
+ otherwise unconstrained. Third-compaction thrash detection remains: three context compactions in
403
+ one reply end it with the same handoff request. Plan-research children receive the configured bound
404
+ without a new capability and do not auto-continue. A new run
405
+ continues it only up to the policy's slice cap, only after a slice that changed a file, passed a
406
+ check or recorded a finished item, and never after a checkpoint that is `blocked`. A run may turn
407
+ the guard off with `workSlice.enabled: false`, and a launch may set `XINGULAR_WORK_SLICE=off` for
408
+ every run in that process; with it off a reply has no boundary — no checkpoint, no continuation —
409
+ and ends only when the model stops or a person interrupts. A reply the model ends on its own
410
+ settles as it ends (INV-RUN-15); in a goal, the goal loop (INV-RUN-16) continues it. A
411
+ continuation carries the todo it left (`continuation.ts`).
412
+ - **INV-RUN-15** A reply the model ends settles as it ends (ADR-0075): the harness never sends it
413
+ back and never overwrites its status from the todo list. The todo list is progress, not a gate.
414
+ Only three things settle a reply otherwise: a person's interrupt (`interrupted`), the work-slice
415
+ guard (INV-RUN-13), and a goal's stop (INV-RUN-16) — a goal that ends blocked settles
416
+ `needs_person`, and one that ends on a limit, a pause or a stall settles `unfinished`, each with a
417
+ harness-written checkpoint. **No model judges an ordinary reply** (ADR-0072 removed ADR-0071's
418
+ every-reply completion check); only a goal's completion claim is checked (INV-RUN-16). Carrying
419
+ the request to completion is the prompt's job (`04-prompt.md`). There is no stop gate, no nudge
420
+ and no `XINGULAR_STOP_GATE` switch.
421
+ - **INV-RUN-16** A goal is the person's opt-in long run (ADR-0072). Only a person's own top-level run
422
+ carries one (`sessions.run` `goal`, or `/goal` in the terminal); never a plan, command, unattended
423
+ or child run. While its status is `active`, a reply that would end continues in place (the goal
424
+ loop, `sessions/goalLoop.ts`) with the continuation prompt, counting a round. Statuses are
425
+ `active | paused | blocked | usage_limited | budget_limited | complete`; the person sets, edits,
426
+ pauses, resumes and clears, the system limits (`budget_limited` at 30 rounds or 8 hours by default;
427
+ `usage_limited` on a provider usage limit; `blocked` after three automatic rounds with no activity,
428
+ three with only failed commands, or a provider error), and the model may only claim `complete`,
429
+ report `blocked` after the same blocker on three consecutive goal turns, or `paused` at the person's
430
+ request. A `complete` is a claim: at the next settle the same model, at low effort and with a fresh
431
+ context, checks it against the objective and the transcript; `done` completes the goal, `continue`
432
+ keeps it active with the reason, and no model, an error or an unreadable answer accepts it. The
433
+ loop never stops a goal for a round without a tool call alone. A goal that ends `blocked` settles
434
+ the run `needs_person`; one that ends paused, limited or stalled settles it `unfinished`. The run
435
+ record keeps the goal as `goalMode`. `XINGULAR_COMPLETION_CHECK=off` accepts every claim unchecked.
436
+ - **INV-RUN-14** A run event stream carries `checkpoint` (the handoff the harness derives from the
437
+ run's own evidence; runs written before ADR-0069 may hold one the model wrote) and `heartbeat`
438
+ (steps, elapsed time, last tool, compactions, slice, the call budget, and the names and oldest age of
439
+ the tools running at that moment). Every live reply emits a
440
+ heartbeat every 30 seconds, terminal replies included. A heartbeat older than five minutes while
441
+ the owner process lives marks the run `interrupted` with reason `stalled`; a run that never emitted
442
+ one keeps the 30-minute silence rule. A heartbeat of a run with no work slice carries zero slice
443
+ counters. A reply whose heartbeat keeps arriving but which produces no
444
+ other event for fifteen minutes is a wedged turn, not a busy one: the harness ends it through the
445
+ native abort and records `interrupted` with reason `stalled`, and grants a reply whose oldest
446
+ running tool has run for thirty minutes the same ending. `runTurn` applies this to every run
447
+ (a structured session, a live session, the client terminal, an unattended run) with the same
448
+ windows (`sessions/stallWatch.ts`); the in-process terminal's controller applies it to its own
449
+ reply. A live session whose turn stalled is closed rather than reused, its queued follow-ups
450
+ parked for the next session, and closed under the turn after thirty seconds if the abort did not
451
+ unwind it (ADR-0083). A reply whose only running tools are
452
+ `wait_subagents` or `spawn_subagent` is judged by its children instead: each child has its own
453
+ clock (its last event other than a heartbeat; its running tools), and a child quiet for the same
454
+ windows is interrupted with reason `stalled`, so the wait returns and the parent carries on by
455
+ itself. The parent's own rule resumes if no child answers to its watch, or one ignored the stop for
456
+ five minutes (ADR-0078). An unanswered approval or question is never cut short. The watchdog never
457
+ restarts work (ADR-0054).
458
+ - **INV-RUN-12** A post-compaction checkpoint is a bounded context projection of the active request,
459
+ the validated todo list and applicable plan instructions as of a compaction that happened during
460
+ that run. It is compiled by `prompt/compile.ts` once per compaction and placed, unchanged, directly
461
+ after the compaction summary in each later model request of the active run, and never persists hidden
462
+ reasoning or changes permissions, stable prompt text, native history or run-event schemas. Its
463
+ in-memory state is cleared when the run settles or the active session branch changes
464
+ (PROP-0033, ADR-0032, ADR-0067).
465
+
466
+ ## Data
467
+
468
+ `<data root>/runs/<id>/`: `run.json` (including the optional, legacy-compatible `workspaceRoot` and
469
+ the optional `workspaceSnapshot`),
470
+ `events.jsonl`, `owner.json`, `subagents.json`, `context.json`, `caller.json`, `capabilities.json`,
471
+ `mcp-context.json`. Native history lives in
472
+ the session directory the caller passes (`sessionDir`), owned by Pi. Side-question native history
473
+ uses a one-use OS temporary directory, removed when the run settles; its tracked run and events
474
+ remain in the ordinary run store.
475
+
476
+ ## Source map
477
+
478
+ `src/sessions/*.ts`, `src/capabilities/runSnapshot.ts`, `src/core/workspaceBashTool.ts`,
479
+ `src/core/workspaceSandbox.ts`, `src/core/workspaceWriteOperations.ts`, `src/tools/spawnSubagent.ts`.
480
+ Decisions: [ADR-0002](../decisions/ADR-0002-native-subagent-lifecycle.md) (superseded),
481
+ [ADR-0003](../decisions/ADR-0003-shared-asynchronous-subagents.md),
482
+ [ADR-0022](../decisions/ADR-0022-plan-only-question-tools.md),
483
+ [ADR-0023](../decisions/ADR-0023-contextual-side-question-runs.md),
484
+ [ADR-0026](../decisions/ADR-0026-contextual-question-wireframes.md),
485
+ [ADR-0033](../decisions/ADR-0033-plan-mode-research-delegation.md),
486
+ [ADR-0039](../decisions/ADR-0039-progress-aware-stall-guards.md),
487
+ [ADR-0053](../decisions/ADR-0053-no-repeated-work-guard.md),
488
+ [ADR-0054](../decisions/ADR-0054-terminal-reply-heartbeat-and-stall.md).
489
+
490
+ ## Native session names (PROP-0010)
491
+
492
+ `session_name({ name: string })` adds or revises the current Pi session's name in embedded
493
+ and terminal execution. The agent normally calls it once before its first other tool call when a
494
+ request needs tools or changes state, and revises it only when the overall objective changes,
495
+ including a manual name. When a top-level attended session starts unnamed, the harness also
496
+ derives a provisional name from a substantive first request before the first model request;
497
+ greetings, thanks and short conversational replies stay unnamed. The model may revise the
498
+ provisional name. Agent-submitted names are imperative sentences
499
+ of at most six whitespace-separated words; whitespace is normalized, and empty names,
500
+ terminal escapes, non-whitespace controls and longer names fail without writing. Identical
501
+ names are a no-op. Pi's native session-info history is the only storage; continuation and
502
+ reopen preserve it. Each child names only itself. There is no additional model request or
503
+ run-event schema. The normal capability selection and host gate apply; a refused or failed
504
+ provisional name leaves the session unnamed and never fails the run. `harnessTools: false`
505
+ omits the tool. Plan mode permits it as session metadata maintenance.
@@ -0,0 +1,122 @@
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; instruction-only agent profiles, listed with the other profiles in `subagents` (64, PROP-0029) | 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
+ | `tag`, `untag`, `tags`, `resolveRef`, `revertComponents`, `selects` | `variant/store.ts` | Names for versions, references, and taking components back from an earlier version (PROP-0052). |
40
+ | `materialise`, `resolve`, `VariantChoice`, `Materialised` | `variant/materialise.ts` | Turns a version into prompt sections, skill paths and extension paths for one run. |
41
+ | `VariantTrust` | `variant/trust.ts` | Which plugin code a person trusted, by hash; which scopes let probes run improver code. |
42
+ | `seedVariant` | `variant/seed.ts` | A first variant for a scope. |
43
+ | component library | `variant/components.ts` | Reusable skills, prompts and rules under `registry/` and built-in folders. |
44
+
45
+ ## Contracts
46
+
47
+ - **`VariantChoice`**: `{ scope, version? }` (a scope's head or one version) or `{ dir, scope? }`
48
+ (a variant on disk, read and never written, such as a refinement candidate).
49
+ - **Version source** (`VersionSource`): `seed`, `edit`, `refinement`, `import`, `restore`.
50
+ - **Tuned for**: a version made by adopting a refinement records `tunedFor: { model }`, the model its
51
+ execution ran on. It is written once with the version and never changed.
52
+ - **Tags**: `name → fingerprint` per scope. A tag is a label that can move to another version; it
53
+ is not a version and never changes one. A tag cannot be `head` or look like a fingerprint.
54
+ - **Reference** (`resolveRef`): a fingerprint, a unique prefix of at least four characters, a tag,
55
+ or `head`.
56
+ - **Revert** (`revertComponents`): a new version made from the head with the selected components
57
+ replaced by an earlier version's. A selector is a component (`c1`–`c8` or its id) or one item by
58
+ path prefix (`skills/review`, `sub_agents/reader`, `scripts/check.py`, `plugins/guard.ts`). It is
59
+ committed with source `edit` and passes the validator like any edit.
60
+ - **Fingerprint**: first 16 hex characters of SHA-1 over sorted `path\0text\0` pairs.
61
+ - **Validation** (`validate`) refuses a variant when: always-on text (c1–c4) exceeds 24,000
62
+ characters; a file is off the surface; a skill lacks `description:` or its `name:` differs from
63
+ its folder; a skill is never named in the always-on text; a subagent lacks `description:`; a
64
+ script does not compile; a plugin has no default export; an always-on file or skill invokes a
65
+ script that is not in the variant.
66
+
67
+ ## Invariants
68
+
69
+ - **INV-FND-1** Only a variant mutates. No edit, improver session or adoption changes foundation
70
+ code, the surface, the validator or an invariant; those change by release, with a proposal.
71
+ - **INV-FND-2** A variant changes only by committing a new validated version (`commit` →
72
+ `validate`, `INV-VAR-2`), and a refinement moves a head only when a person adopts
73
+ (`INV-REF-6`). There is no other door.
74
+ - **INV-VAR-1** Variant instructions are versioned per scope. The application adds its own sections through `Launch` (page 01). The release-owned `plugin-authoring` skill is also available on demand in structured and terminal sessions, including existing variants; its body is not always-on. A variant skill with the same name takes precedence. It is shipped as a package resource and does not mutate pinned versions.
75
+ - **INV-VAR-2** Every saved version is validated (`commit` → `validate`). An invalid variant is
76
+ refused with every problem listed.
77
+ - **INV-VAR-3** A version is never edited. A change is a new version; `restore` moves the head
78
+ and appends to `restores.jsonl`.
79
+ - **INV-VAR-4** A run resolves its variant once and pins it; a child run uses the same files even if
80
+ the head moves. A child whose agent profile names another variant resolves and pins that one when
81
+ it starts (PROP-0029). A later turn of a conversation uses the conversation's selected version.
82
+ That changes only by the person's own action in that session (adopting, restoring, reverting or
83
+ choosing a version) and only at a turn boundary; a head moved elsewhere is never followed
84
+ (PROP-0052, ADR-0065).
85
+ - **INV-VAR-5** c8 plugin code loads only when its exact text is trusted (SHA-256 in
86
+ `variant-plugin-trust.json`). A changed file asks again. The one exception: a refinement probe may
87
+ run improver-written code for a scope whose person allowed it (`probeCode`), and adopting that
88
+ variant still requires the code trusted.
89
+ - **INV-VAR-6** The always-on cap exists because every always-on character costs every run.
90
+ Raising it is an architecture change.
91
+ - **INV-VAR-7** Variant code is synchronous (`INV-BND-4`).
92
+
93
+ ## Data
94
+
95
+ ```text
96
+ <data root>/variants/<scope>/
97
+ versions/<fingerprint>/variant/<rel>
98
+ versions/<fingerprint>/version.json
99
+ head.json
100
+ lineage.jsonl
101
+ restores.jsonl
102
+ tags.json name → fingerprint (PROP-0052)
103
+ <state dir>/variant-plugin-trust.json
104
+ <data root>/registry/{skills,prompts,rules}/ (component library)
105
+ ```
106
+
107
+ ## Source map
108
+
109
+ `src/variant/*.ts` (`migrate.ts` renames state written before PROP-0009 on `open`). Method origin: Harness² (`harness2/core/tree.py`, Apache-2.0).
110
+
111
+ ## Terminal inspection
112
+
113
+ `/variant` lists the scope's versions with their tags, source, and which one this conversation runs
114
+ and which is the head. On a version it offers: switch this conversation to it, restore it as the
115
+ head, compare it with the head, tag it, and take some components from it; `/variant
116
+ use|restore|tag|untag|diff|revert` are the typed forms. Restoring, reverting or adopting switches
117
+ this conversation at the next turn boundary (ADR-0065).
118
+
119
+ The resource browser retains the materialised preparation snapshot and labels it pinned. The
120
+ current scope head is separately labelled latest saved; browsing and comparison never rematerialise
121
+ the head as the running variant. Directory-backed variants remain browse-only. Library additions
122
+ use the existing validated commit door and affect future terminals.