@robota-sdk/agent-command 3.0.0-beta.100

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 (251) hide show
  1. package/CHANGELOG.md +1351 -0
  2. package/LICENSE +661 -0
  3. package/README.md +100 -0
  4. package/dist/node/index.cjs +121 -0
  5. package/dist/node/index.d.cts +1053 -0
  6. package/dist/node/index.d.cts.map +1 -0
  7. package/dist/node/index.d.ts +1053 -0
  8. package/dist/node/index.d.ts.map +1 -0
  9. package/dist/node/index.js +122 -0
  10. package/dist/node/index.js.map +1 -0
  11. package/package.json +83 -0
  12. package/src/advisor/advisor-command-module.ts +47 -0
  13. package/src/advisor/advisor-command.test.ts +102 -0
  14. package/src/advisor/advisor-command.ts +55 -0
  15. package/src/advisor/advisor-cost-functional.test.ts +92 -0
  16. package/src/advisor/index.ts +6 -0
  17. package/src/agent/__tests__/agent-command.test.ts +597 -0
  18. package/src/agent/agent-command-module.ts +89 -0
  19. package/src/agent/agent-command-parser.ts +180 -0
  20. package/src/agent/agent-command.ts +255 -0
  21. package/src/agent/index.ts +7 -0
  22. package/src/background/__tests__/background-command-module.test.ts +261 -0
  23. package/src/background/background-command-module.ts +52 -0
  24. package/src/background/background-command.ts +65 -0
  25. package/src/background/index.ts +6 -0
  26. package/src/command-module-utils.test.ts +37 -0
  27. package/src/command-module-utils.ts +35 -0
  28. package/src/compact/__tests__/compact-command-module.test.ts +181 -0
  29. package/src/compact/compact-command-module.ts +59 -0
  30. package/src/compact/compact-command.ts +33 -0
  31. package/src/compact/index.ts +6 -0
  32. package/src/context/__tests__/context-command-module.test.ts +502 -0
  33. package/src/context/auto-compact-format.ts +25 -0
  34. package/src/context/context-breakdown.ts +295 -0
  35. package/src/context/context-command-module.ts +82 -0
  36. package/src/context/context-command.ts +291 -0
  37. package/src/context/index.ts +6 -0
  38. package/src/default/__tests__/__snapshots__/model-exposure.test.ts.snap +121 -0
  39. package/src/default/__tests__/default-command-modules.test.ts +192 -0
  40. package/src/default/__tests__/model-exposure.test.ts +269 -0
  41. package/src/default/__tests__/org-policy-forwarding.test.ts +106 -0
  42. package/src/default/__tests__/provider-environment-forwarding.test.ts +98 -0
  43. package/src/default/default-command-modules.ts +247 -0
  44. package/src/default/index.ts +5 -0
  45. package/src/devices/__tests__/devices-command-module.test.ts +299 -0
  46. package/src/devices/devices-command-module.ts +308 -0
  47. package/src/devices/devices-command-port.ts +143 -0
  48. package/src/devices/index.ts +14 -0
  49. package/src/doctor/__tests__/doctor-command-module.test.ts +145 -0
  50. package/src/doctor/__tests__/doctor-display-vocabulary.test.ts +38 -0
  51. package/src/doctor/__tests__/doctor-fixture.ts +146 -0
  52. package/src/doctor/__tests__/doctor-redaction.test.ts +29 -0
  53. package/src/doctor/__tests__/doctor-runner.test.ts +484 -0
  54. package/src/doctor/doctor-command-module.ts +132 -0
  55. package/src/doctor/doctor-extensions-probe.ts +323 -0
  56. package/src/doctor/doctor-node-deps.ts +88 -0
  57. package/src/doctor/doctor-redaction.ts +99 -0
  58. package/src/doctor/doctor-render.ts +70 -0
  59. package/src/doctor/doctor-repair.ts +136 -0
  60. package/src/doctor/doctor-runner.ts +122 -0
  61. package/src/doctor/doctor-settings-probe.ts +239 -0
  62. package/src/doctor/doctor-storage-probe.ts +187 -0
  63. package/src/doctor/doctor-types.ts +109 -0
  64. package/src/doctor/index.ts +32 -0
  65. package/src/editor/__tests__/editor-command-functional.test.ts +124 -0
  66. package/src/editor/editor-command-module.ts +53 -0
  67. package/src/editor/editor-command.ts +58 -0
  68. package/src/editor/index.ts +7 -0
  69. package/src/editor/resolve-editor.ts +21 -0
  70. package/src/effort/effort-command-module.ts +51 -0
  71. package/src/effort/effort-command.test.ts +203 -0
  72. package/src/effort/effort-command.ts +136 -0
  73. package/src/effort/index.ts +6 -0
  74. package/src/events/__tests__/events-command.test.ts +73 -0
  75. package/src/events/events-command-module.ts +49 -0
  76. package/src/events/events-command.ts +69 -0
  77. package/src/events/index.ts +2 -0
  78. package/src/exit/__tests__/exit-command-module.test.ts +61 -0
  79. package/src/exit/exit-command-module.ts +47 -0
  80. package/src/exit/exit-command.ts +26 -0
  81. package/src/exit/index.ts +6 -0
  82. package/src/fork/__tests__/fork-command.test.ts +184 -0
  83. package/src/fork/fork-command-module.ts +61 -0
  84. package/src/fork/fork-command.ts +162 -0
  85. package/src/fork/index.ts +8 -0
  86. package/src/git/__tests__/fake-git-port.ts +35 -0
  87. package/src/git/__tests__/git-command-module.test.ts +111 -0
  88. package/src/git/__tests__/git-commit.test.ts +185 -0
  89. package/src/git/git-command-module.ts +138 -0
  90. package/src/git/git-commit.ts +254 -0
  91. package/src/git/index.ts +20 -0
  92. package/src/goal/__tests__/goal-command.test.ts +80 -0
  93. package/src/goal/goal-command-module.ts +49 -0
  94. package/src/goal/goal-command.ts +69 -0
  95. package/src/goal/index.ts +6 -0
  96. package/src/handoff/__tests__/handoff-command-module.test.ts +25 -0
  97. package/src/handoff/__tests__/handoff-command.test.ts +218 -0
  98. package/src/handoff/handoff-command-module.ts +49 -0
  99. package/src/handoff/handoff-command.ts +187 -0
  100. package/src/handoff/index.ts +6 -0
  101. package/src/help/__tests__/help-command-module.test.ts +134 -0
  102. package/src/help/__tests__/help-command.test.ts +130 -0
  103. package/src/help/help-command-module.ts +47 -0
  104. package/src/help/help-command.ts +11 -0
  105. package/src/help/index.ts +6 -0
  106. package/src/index.ts +163 -0
  107. package/src/keybindings/__tests__/keybindings-command-module.test.ts +57 -0
  108. package/src/keybindings/index.ts +6 -0
  109. package/src/keybindings/keybindings-command-module.ts +88 -0
  110. package/src/language/__tests__/language-command-module.test.ts +126 -0
  111. package/src/language/index.ts +6 -0
  112. package/src/language/language-command-module.ts +55 -0
  113. package/src/language/language-command.ts +52 -0
  114. package/src/mcp-activation/__tests__/mcp-activation-command.test.ts +895 -0
  115. package/src/mcp-activation/__tests__/mcp-model-view.test.ts +242 -0
  116. package/src/mcp-activation/__tests__/mcp-skill-command.test.ts +141 -0
  117. package/src/mcp-activation/index.ts +12 -0
  118. package/src/mcp-activation/mcp-activation-command-module.ts +123 -0
  119. package/src/mcp-activation/mcp-activation-command.ts +662 -0
  120. package/src/mcp-activation/mcp-model-notice.ts +99 -0
  121. package/src/mcp-activation/mcp-model-status.ts +104 -0
  122. package/src/memory/__tests__/memory-command-module.test.ts +476 -0
  123. package/src/memory/__tests__/memory-command-unavailable.test.ts +63 -0
  124. package/src/memory/index.ts +6 -0
  125. package/src/memory/memory-command-module.ts +77 -0
  126. package/src/memory/memory-command.ts +326 -0
  127. package/src/mode/__tests__/mode-command-module.test.ts +230 -0
  128. package/src/mode/index.ts +6 -0
  129. package/src/mode/mode-command-module.ts +55 -0
  130. package/src/mode/mode-command.ts +67 -0
  131. package/src/model/__tests__/model-command-module.test.ts +80 -0
  132. package/src/model/__tests__/model-command.test.ts +265 -0
  133. package/src/model/index.ts +6 -0
  134. package/src/model/model-command-module.ts +56 -0
  135. package/src/model/model-command.ts +249 -0
  136. package/src/output-style/__tests__/output-style-command.test.ts +96 -0
  137. package/src/output-style/index.ts +6 -0
  138. package/src/output-style/output-style-command-module.ts +143 -0
  139. package/src/peers/__tests__/peers-command-module.test.ts +24 -0
  140. package/src/peers/__tests__/peers-command.test.ts +399 -0
  141. package/src/peers/index.ts +9 -0
  142. package/src/peers/peers-command-module.ts +49 -0
  143. package/src/peers/peers-command.ts +220 -0
  144. package/src/permissions/__tests__/permissions-command-module.test.ts +276 -0
  145. package/src/permissions/index.ts +6 -0
  146. package/src/permissions/permissions-command-module.ts +55 -0
  147. package/src/permissions/permissions-command.ts +89 -0
  148. package/src/plan/__tests__/plan-command.test.ts +129 -0
  149. package/src/plan/index.ts +9 -0
  150. package/src/plan/plan-command-module.ts +49 -0
  151. package/src/plan/plan-command.ts +92 -0
  152. package/src/plugin/__tests__/plugin-active-turn.test.ts +100 -0
  153. package/src/plugin/__tests__/plugin-command-module.test.ts +300 -0
  154. package/src/plugin/__tests__/plugin-host-boundary.test.ts +11 -0
  155. package/src/plugin/index.ts +7 -0
  156. package/src/plugin/plugin-command-module.ts +85 -0
  157. package/src/plugin/plugin-command.ts +271 -0
  158. package/src/preset/__tests__/host-supplied-preset-registry.test.ts +98 -0
  159. package/src/preset/__tests__/preset-command-module.test.ts +220 -0
  160. package/src/preset/index.ts +6 -0
  161. package/src/preset/preset-command-module.ts +80 -0
  162. package/src/preset/preset-command.ts +148 -0
  163. package/src/provider/__tests__/optional-provider-credentials.test.ts +130 -0
  164. package/src/provider/__tests__/org-policy.test.ts +174 -0
  165. package/src/provider/__tests__/provider-command-module.test.ts +884 -0
  166. package/src/provider/__tests__/provider-connection-setup.test.ts +567 -0
  167. package/src/provider/__tests__/provider-reference-switch.test.ts +113 -0
  168. package/src/provider/__tests__/provider-setup-flow.test.ts +244 -0
  169. package/src/provider/__tests__/provider-startup-host-settings.test.ts +16 -0
  170. package/src/provider/__tests__/scripted-interaction.ts +40 -0
  171. package/src/provider/index.ts +32 -0
  172. package/src/provider/provider-command-execution.ts +235 -0
  173. package/src/provider/provider-command-module.ts +82 -0
  174. package/src/provider/provider-command-profile-lifecycle.ts +239 -0
  175. package/src/provider/provider-command-profile-operations.ts +218 -0
  176. package/src/provider/provider-command-profile.ts +116 -0
  177. package/src/provider/provider-command-setup.ts +79 -0
  178. package/src/provider/provider-connection-setup.ts +287 -0
  179. package/src/provider/provider-connection-validation.ts +38 -0
  180. package/src/provider/provider-onboarding.ts +73 -0
  181. package/src/provider/provider-prompt-interaction.ts +28 -0
  182. package/src/provider/provider-setup-ask.ts +67 -0
  183. package/src/provider/provider-setup-flow.ts +326 -0
  184. package/src/provider/provider-startup.ts +225 -0
  185. package/src/remote-control/__tests__/remote-control-command-module.test.ts +36 -0
  186. package/src/remote-control/__tests__/remote-control-command.test.ts +216 -0
  187. package/src/remote-control/index.ts +8 -0
  188. package/src/remote-control/remote-control-command-module.ts +61 -0
  189. package/src/remote-control/remote-control-command.ts +138 -0
  190. package/src/reset/__tests__/reset-command-module.test.ts +63 -0
  191. package/src/reset/index.ts +2 -0
  192. package/src/reset/reset-command-module.ts +47 -0
  193. package/src/reset/reset-command.ts +10 -0
  194. package/src/rewind/__tests__/rewind-command-module.test.ts +287 -0
  195. package/src/rewind/index.ts +2 -0
  196. package/src/rewind/rewind-command-module.ts +56 -0
  197. package/src/rewind/rewind-command.ts +279 -0
  198. package/src/sandbox/__tests__/sandbox-command.test.ts +80 -0
  199. package/src/sandbox/index.ts +2 -0
  200. package/src/sandbox/sandbox-command-module.ts +56 -0
  201. package/src/sandbox/sandbox-command.ts +94 -0
  202. package/src/schedule/__tests__/loop-command-functional.test.ts +399 -0
  203. package/src/schedule/__tests__/loop-command.test.ts +594 -0
  204. package/src/schedule/__tests__/loop-jitter.test.ts +25 -0
  205. package/src/schedule/__tests__/monitor-model-permission-functional.test.ts +126 -0
  206. package/src/schedule/__tests__/schedule-command.test.ts +247 -0
  207. package/src/schedule/__tests__/schedule-redos.test.ts +114 -0
  208. package/src/schedule/index.ts +12 -0
  209. package/src/schedule/loop-command.ts +427 -0
  210. package/src/schedule/loop-jitter.ts +41 -0
  211. package/src/schedule/schedule-command-module.ts +184 -0
  212. package/src/schedule/schedule-command.ts +161 -0
  213. package/src/schedule/schedule-spec-parser.ts +70 -0
  214. package/src/session/__tests__/model-pricing.test.ts +66 -0
  215. package/src/session/__tests__/rename-host-persistence.test.ts +72 -0
  216. package/src/session/__tests__/session-command-module.test.ts +589 -0
  217. package/src/session/index.ts +17 -0
  218. package/src/session/model-pricing.ts +26 -0
  219. package/src/session/session-command-module.ts +197 -0
  220. package/src/session/session-command.ts +272 -0
  221. package/src/settings/index.ts +7 -0
  222. package/src/settings/settings-command-module.ts +47 -0
  223. package/src/shell/__tests__/resolve-shell-host.test.ts +11 -0
  224. package/src/shell/__tests__/shell-command-functional.test.ts +118 -0
  225. package/src/shell/index.ts +8 -0
  226. package/src/shell/resolve-shell.ts +25 -0
  227. package/src/shell/shell-command-module.ts +53 -0
  228. package/src/shell/shell-command.ts +48 -0
  229. package/src/shell/spawn-inherited.ts +32 -0
  230. package/src/skills/__tests__/skill-read-command.test.ts +64 -0
  231. package/src/skills/__tests__/skills-command-module.test.ts +200 -0
  232. package/src/skills/index.ts +7 -0
  233. package/src/skills/skill-read-command.ts +60 -0
  234. package/src/skills/skills-command-module.ts +76 -0
  235. package/src/skills/skills-command.ts +108 -0
  236. package/src/statusline/__tests__/statusline-command-module.test.ts +96 -0
  237. package/src/statusline/index.ts +6 -0
  238. package/src/statusline/statusline-command-module.ts +55 -0
  239. package/src/statusline/statusline-command.ts +80 -0
  240. package/src/terminal-client/__tests__/terminal-client-commands.test.ts +216 -0
  241. package/src/terminal-client/index.ts +5 -0
  242. package/src/terminal-client/terminal-client-commands.ts +109 -0
  243. package/src/theme/__tests__/theme-command.test.ts +204 -0
  244. package/src/theme/index.ts +12 -0
  245. package/src/theme/theme-command-module.ts +221 -0
  246. package/src/user-local/__tests__/user-local-command.test.ts +180 -0
  247. package/src/user-local/index.ts +13 -0
  248. package/src/user-local/user-local-command-constants.ts +5 -0
  249. package/src/user-local/user-local-command-module.ts +65 -0
  250. package/src/user-local/user-local-command.ts +214 -0
  251. package/src/user-local/user-local-memory-command.ts +160 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,1351 @@
1
+ # @robota-sdk/agent-command
2
+
3
+ ## 3.0.0-beta.100
4
+ ### Patch Changes
5
+
6
+ - @robota-sdk/agent-core@3.0.0-beta.100
7
+ - @robota-sdk/agent-framework@3.0.0-beta.100
8
+ - @robota-sdk/agent-interface-command@3.0.0-beta.100
9
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.100
10
+ - @robota-sdk/agent-interface-session@3.0.0-beta.100
11
+ - @robota-sdk/agent-preset@3.0.0-beta.100
12
+
13
+ ## 3.0.0-beta.99
14
+ ### Patch Changes
15
+
16
+ - @robota-sdk/agent-core@3.0.0-beta.99
17
+ - @robota-sdk/agent-framework@3.0.0-beta.99
18
+ - @robota-sdk/agent-interface-command@3.0.0-beta.99
19
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.99
20
+ - @robota-sdk/agent-interface-session@3.0.0-beta.99
21
+ - @robota-sdk/agent-preset@3.0.0-beta.99
22
+
23
+ ## 3.0.0-beta.98
24
+ ### Patch Changes
25
+
26
+ - @robota-sdk/agent-core@3.0.0-beta.98
27
+ - @robota-sdk/agent-framework@3.0.0-beta.98
28
+ - @robota-sdk/agent-interface-command@3.0.0-beta.98
29
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.98
30
+ - @robota-sdk/agent-interface-session@3.0.0-beta.98
31
+ - @robota-sdk/agent-preset@3.0.0-beta.98
32
+
33
+ ## 3.0.0-beta.97
34
+ ### Patch Changes
35
+
36
+ - Align command test fixtures with the core run-loop state contract.
37
+ - Updated dependencies [c207a31]
38
+ - Updated dependencies [9b4f63b]
39
+ - Updated dependencies [7911a7d]
40
+ - Updated dependencies [23a30cd]
41
+ - @robota-sdk/agent-core@3.0.0-beta.97
42
+ - @robota-sdk/agent-interface-session@3.0.0-beta.97
43
+ - @robota-sdk/agent-framework@3.0.0-beta.97
44
+ - @robota-sdk/agent-interface-command@3.0.0-beta.97
45
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.97
46
+ - @robota-sdk/agent-preset@3.0.0-beta.97
47
+
48
+ ## 3.0.0-beta.96
49
+ ### Patch Changes
50
+
51
+ - @robota-sdk/agent-core@3.0.0-beta.96
52
+ - @robota-sdk/agent-framework@3.0.0-beta.96
53
+ - @robota-sdk/agent-interface-command@3.0.0-beta.96
54
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.96
55
+ - @robota-sdk/agent-interface-session@3.0.0-beta.96
56
+ - @robota-sdk/agent-preset@3.0.0-beta.96
57
+
58
+ ## 3.0.0-beta.95
59
+ ### Patch Changes
60
+
61
+ - 02053ec: Leave unregistered DeepSeek model costs unknown instead of applying unrelated legacy model prices.
62
+ - Updated dependencies [60f3965]
63
+ - Updated dependencies [115e104]
64
+ - Updated dependencies [04719a9]
65
+ - Updated dependencies [04a6de4]
66
+ - Updated dependencies [0ba247b]
67
+ - Updated dependencies [02053ec]
68
+ - @robota-sdk/agent-interface-session@3.0.0-beta.95
69
+ - @robota-sdk/agent-framework@3.0.0-beta.95
70
+ - @robota-sdk/agent-core@3.0.0-beta.95
71
+ - @robota-sdk/agent-preset@3.0.0-beta.95
72
+ - @robota-sdk/agent-interface-command@3.0.0-beta.95
73
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.95
74
+
75
+ ## 3.0.0-beta.94
76
+ ### Patch Changes
77
+
78
+ - Updated dependencies [e079992]
79
+ - Updated dependencies [e706b43]
80
+ - @robota-sdk/agent-framework@3.0.0-beta.94
81
+ - @robota-sdk/agent-preset@3.0.0-beta.94
82
+ - @robota-sdk/agent-interface-session@3.0.0-beta.94
83
+ - @robota-sdk/agent-core@3.0.0-beta.94
84
+ - @robota-sdk/agent-interface-command@3.0.0-beta.94
85
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.94
86
+
87
+ ## 3.0.0-beta.93
88
+ ### Patch Changes
89
+
90
+ - Release the integrated provider credential isolation and consumer runtime and interaction composition updates.
91
+ - Updated dependencies
92
+ - @robota-sdk/agent-core@3.0.0-beta.93
93
+ - @robota-sdk/agent-framework@3.0.0-beta.93
94
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.93
95
+ - @robota-sdk/agent-interface-command@3.0.0-beta.93
96
+ - @robota-sdk/agent-interface-session@3.0.0-beta.93
97
+ - @robota-sdk/agent-preset@3.0.0-beta.93
98
+
99
+ ## 3.0.0-beta.92
100
+ ### Patch Changes
101
+
102
+ - Local OpenAI-compatible servers can be set up without saving a placeholder API key. Explicit credentials and environment references remain effective for authenticated servers and connection tests. Optional credentials are managed through the user-only provider edit command.
103
+ - Updated dependencies
104
+ - @robota-sdk/agent-core@3.0.0-beta.92
105
+ - @robota-sdk/agent-framework@3.0.0-beta.92
106
+ - @robota-sdk/agent-interface-command@3.0.0-beta.92
107
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.92
108
+ - @robota-sdk/agent-interface-session@3.0.0-beta.92
109
+ - @robota-sdk/agent-preset@3.0.0-beta.92
110
+
111
+ ## 3.0.0-beta.91
112
+ ### Patch Changes
113
+
114
+ - Updated dependencies [bad976f]
115
+ - @robota-sdk/agent-framework@3.0.0-beta.91
116
+ - @robota-sdk/agent-preset@3.0.0-beta.91
117
+ - @robota-sdk/agent-core@3.0.0-beta.91
118
+ - @robota-sdk/agent-interface-command@3.0.0-beta.91
119
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.91
120
+ - @robota-sdk/agent-interface-session@3.0.0-beta.91
121
+
122
+ ## 3.0.0-beta.90
123
+ ### Minor Changes
124
+
125
+ - 5bb675a: Provider commands check a profile's `$ENV:` or default credential against the host's environment snapshot, so `/provider switch`, `/provider test`, `/provider add`, `/provider edit` and a cross-profile `/model` keep working while the runtime withholds its own credentials from `process.env`.
126
+
127
+ - `IProviderCommandModuleOptions` takes an optional `env`, and `createDefaultCommandModules` takes `providerEnvironment`. The CLI passes its startup snapshot.
128
+ - The git that isolated subagents run, and so the repository's hooks, now get the command environment instead of the full snapshot.
129
+
130
+ ### Patch Changes
131
+
132
+ - 7116367: Credentials the runtime holds for itself no longer reach the commands it runs.
133
+
134
+ - `agent-cli` — once a workspace's settings are admitted, every variable a provider profile or
135
+ definition names as its credential (`$ENV:` references, and defaults such as `OPENAI_API_KEY`)
136
+ leaves the process environment, so tools, hooks, background shells, a skill's `!` commands and
137
+ the environment an MCP header helper inherits no longer carry it, a hosted worker's broker token
138
+ included (a variable an MCP definition references explicitly still resolves); the provider keeps
139
+ authenticating from the startup snapshot. A user or managed settings layer can let
140
+ commands see one with `"commandEnvAllow": ["NAME"]`; project settings cannot. With the OS sandbox
141
+ on, confined commands can no longer read `settings.json`, `credentials/`, `mcp-credentials/` or
142
+ `remote-host-identity.json` under the user state directory. **Behavior change:** a command that
143
+ relied on inheriting a provider key now needs the opt-in, and a host embedding `startCli` finds
144
+ those variables gone from its own `process.env` afterwards — a later in-process call must pass them
145
+ in its `environment`.
146
+ - `agent-framework` — the settings schema gains `commandEnvAllow`; `checkSettingsDocument` and
147
+ `buildProviderProfilesSnapshot` take an optional environment map to resolve `$ENV:` references
148
+ against instead of the live process environment.
149
+ - `agent-command` — provider startup checks credentials against the host's environment snapshot.
150
+ - `agent-tools` — `OsSandboxClient` takes `hiddenPaths`, always hidden from confined commands and
151
+ not changeable by sandbox settings.
152
+ - `agent-subagent-runner` — a child-process subagent removes its provider credential variable from
153
+ its own environment once its provider is built, unless the start payload says the owner opted it in
154
+ (`keepProviderCredential`).
155
+ - `dag-node-instant-node` — prompt nodes accept an env resolver (`createPromptBackedNodeDefinition`'s
156
+ third argument, `rehydrateInstantNode`'s `resolveEnv`) for their `$ENV:` credential default.
157
+ - `agent-command-workflows` — `/workflows create` and `/workflows run` resolve prompt-node credentials
158
+ from the host's environment snapshot.
159
+ - Updated dependencies [7116367]
160
+ - Updated dependencies [5bb675a]
161
+ - @robota-sdk/agent-framework@3.0.0-beta.90
162
+ - @robota-sdk/agent-preset@3.0.0-beta.90
163
+ - @robota-sdk/agent-core@3.0.0-beta.90
164
+ - @robota-sdk/agent-interface-command@3.0.0-beta.90
165
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.90
166
+ - @robota-sdk/agent-interface-session@3.0.0-beta.90
167
+
168
+ ## 3.0.0-beta.89
169
+ ### Patch Changes
170
+
171
+ - @robota-sdk/agent-framework@3.0.0-beta.89
172
+ - @robota-sdk/agent-core@3.0.0-beta.89
173
+ - @robota-sdk/agent-interface-command@3.0.0-beta.89
174
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.89
175
+ - @robota-sdk/agent-interface-session@3.0.0-beta.89
176
+ - @robota-sdk/agent-preset@3.0.0-beta.89
177
+
178
+ ## 3.0.0-beta.88
179
+
180
+ ### Patch Changes
181
+
182
+ - @robota-sdk/agent-framework@3.0.0-beta.88
183
+ - @robota-sdk/agent-preset@3.0.0-beta.88
184
+ - @robota-sdk/agent-core@3.0.0-beta.88
185
+ - @robota-sdk/agent-interface-command@3.0.0-beta.88
186
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.88
187
+ - @robota-sdk/agent-interface-session@3.0.0-beta.88
188
+
189
+ ## 3.0.0-beta.87
190
+
191
+ ### Patch Changes
192
+
193
+ - Release the migrated Robota product with its public SDK namespace, robota command, compatible SDK exports, internal product configuration, and verified CLI startup and delivery corrections.
194
+ - 7d9cc66: Keep host-declared inline human controls reachable during active turns. Plugin disable and uninstall can withdraw future dispatch without changing model invocation or host command policy.
195
+ - 7d9cc66: Allow authenticated attached users to correct and forget project memory while preserving host remote-command policy and rejecting model curation.
196
+ - 7d9cc66: Add user-only project memory topic correction and forgetting, prevent automatic restoration after restart, refresh retained startup context, and reconcile semantic recall with current durable source content.
197
+ - 7d9cc66: Add explicit MCP Skills selection, bounded supervisor access and persistent host content consent.
198
+ Users can inspect verified instructions, approve the exact content fingerprint and withdraw consent;
199
+ models can discover metadata only. Consent stays separate from server admission and model-turn activation.
200
+ - 7d9cc66: Route discovered MCP Skills through the shared skill command runtime with lazy verified content, source-bound invocation names, current user consent and execution-owned activation cleanup. Keep remote shell expressions inert and defer queued user skill reads until their own turn executes.
201
+ - 7d9cc66: Expose verified skill supporting resources only within their owning turn or fork, using the current host consent and manifest.
202
+ - Updated dependencies
203
+ - Updated dependencies [66af868]
204
+ - Updated dependencies [7d9cc66]
205
+ - Updated dependencies [7d9cc66]
206
+ - Updated dependencies [7d9cc66]
207
+ - Updated dependencies [7d9cc66]
208
+ - Updated dependencies [7d9cc66]
209
+ - Updated dependencies [7d9cc66]
210
+ - Updated dependencies [7d9cc66]
211
+ - Updated dependencies [7d9cc66]
212
+ - Updated dependencies [7d9cc66]
213
+ - Updated dependencies [7d9cc66]
214
+ - Updated dependencies [7d9cc66]
215
+ - Updated dependencies [7d9cc66]
216
+ - Updated dependencies [7d9cc66]
217
+ - Updated dependencies [7d9cc66]
218
+ - Updated dependencies [7d9cc66]
219
+ - Updated dependencies [7d9cc66]
220
+ - Updated dependencies [7d9cc66]
221
+ - Updated dependencies [7d9cc66]
222
+ - Updated dependencies [7d9cc66]
223
+ - @robota-sdk/agent-core@3.0.0-beta.87
224
+ - @robota-sdk/agent-framework@3.0.0-beta.87
225
+ - @robota-sdk/agent-interface-command@3.0.0-beta.87
226
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.87
227
+ - @robota-sdk/agent-interface-session@3.0.0-beta.87
228
+ - @robota-sdk/agent-preset@3.0.0-beta.87
229
+
230
+ ## 3.0.0-beta.86
231
+
232
+ ### Patch Changes
233
+
234
+ - @robota-sdk/agent-core@3.0.0-beta.86
235
+ - @robota-sdk/agent-framework@3.0.0-beta.86
236
+ - @robota-sdk/agent-interface-command@3.0.0-beta.86
237
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.86
238
+ - @robota-sdk/agent-interface-session@3.0.0-beta.86
239
+ - @robota-sdk/agent-preset@3.0.0-beta.86
240
+
241
+ ## 3.0.0-beta.85
242
+
243
+ ### Patch Changes
244
+
245
+ - 3c1967f: Reloading plugins updates the live session's skill routing and model skill catalogue together
246
+ with command completion. Disabled plugins stop being executable after reload, and unreadable
247
+ settings clear the plugin skill snapshot. Hook changes require a new session.
248
+ - db35dcd: MCP approvals now outlive the process, and an approval takes effect at once. The `robota` CLI keeps
249
+ activation decisions in `$PRODUCT_USER_STATE_DIR/mcp-approvals.json` (owner-only) unless the host passes its own
250
+ `mcpApprovalStore`, so an approved server connects at later starts until its definition changes.
251
+ `/mcp approve <server>` now also connects the server in the running session, the way `/mcp reload`
252
+ does, instead of waiting for a restart. A remote server without OAuth therefore connects once
253
+ approved; stdio servers still need a host-supplied authority.
254
+ - 4cee6fb: Report unsupported MCP transports at startup and reload instead of silently skipping them,
255
+ and distinguish plugin MCP declaration inspection from a runtime connection.
256
+ - 043fd27: In `plan` mode the model can no longer save project memory with `/memory add`. The command is auto-approved, so it ran in plan mode while `Write` and `Edit` were denied there. Reading memory, and adding it by hand, still work in plan mode.
257
+ - 6ee8725: A user settings file that does not parse no longer reads as "no plugin is disabled". Plugin settings
258
+ now refuse to read it: no plugin loads (skills, commands, hooks and themes alike), a plugin command
259
+ such as `/plugin enable` fails instead of rewriting the whole settings file with the plugin keys
260
+ alone, and `robota doctor` reports the plugin check as failed while still inspecting each installed
261
+ plugin. The CLI already refuses to start with such a file; this covers a session started later in
262
+ the same process.
263
+ - Updated dependencies [4e11579]
264
+ - Updated dependencies [41cca13]
265
+ - Updated dependencies [193a0bc]
266
+ - Updated dependencies [54e2848]
267
+ - Updated dependencies [3c1967f]
268
+ - Updated dependencies [ada3841]
269
+ - Updated dependencies [5093a30]
270
+ - Updated dependencies [5684612]
271
+ - Updated dependencies [6ee8725]
272
+ - Updated dependencies [6072e9a]
273
+ - Updated dependencies [94b2c87]
274
+ - Updated dependencies [3ab2eca]
275
+ - Updated dependencies [2e07cad]
276
+ - @robota-sdk/agent-framework@3.0.0-beta.85
277
+ - @robota-sdk/agent-core@3.0.0-beta.85
278
+ - @robota-sdk/agent-interface-command@3.0.0-beta.85
279
+ - @robota-sdk/agent-preset@3.0.0-beta.85
280
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.85
281
+ - @robota-sdk/agent-interface-session@3.0.0-beta.85
282
+
283
+ ## 3.0.0-beta.84
284
+
285
+ ### Patch Changes
286
+
287
+ - e8d70ac: A first run finds a provider, instead of a dead end. `robota --serve` (and the daemon it starts) no
288
+ longer refuses when no provider is configured: it starts in setup mode, and the GUI's conversation area
289
+ shows a "Connect a model provider to start" panel with a "Set up provider" button in place of the
290
+ composer. Answering it configures and swaps in the first provider live, with no restart. A startup
291
+ failure now says why — `robota daemon start --json` and the desktop app's fatal screen report the
292
+ child's own reason instead of a generic "readiness channel closed", and the fatal screen gets a Try
293
+ again button. `trust status --json` and the desktop trust dialog list only sources whose state trust
294
+ would actually change, instead of naming one this platform could not determine; the dialog shows one
295
+ sentence and a collapsed Details section. `robota --serve --open` in an untrusted folder now asks at
296
+ the terminal (trust it, start Restricted, or quit) when someone is there to ask, instead of refusing
297
+ outright.
298
+ - Updated dependencies [9f46375]
299
+ - Updated dependencies [e8d70ac]
300
+ - Updated dependencies [9c6a8db]
301
+ - Updated dependencies [9c6a8db]
302
+ - Updated dependencies [9c6a8db]
303
+ - @robota-sdk/agent-core@3.0.0-beta.84
304
+ - @robota-sdk/agent-framework@3.0.0-beta.84
305
+ - @robota-sdk/agent-interface-session@3.0.0-beta.84
306
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.84
307
+ - @robota-sdk/agent-interface-command@3.0.0-beta.84
308
+ - @robota-sdk/agent-preset@3.0.0-beta.84
309
+
310
+ ## 3.0.0-beta.83
311
+
312
+ ### Minor Changes
313
+
314
+ - 724fabb: External-event grants are given at start, carried exactly to a background session, listed without their
315
+ principal, and revoked by the owner.
316
+
317
+ - `agent-framework` (breaking) — `openExternalEventSource` and `ExternalEventIngress.open` take only
318
+ `{ grant, audit? }`: the session builds each grant's verifier from `grant.verifier` with the
319
+ `externalEventVerifierFactory` its host passed when the session was built (without one, no grant opens), and an
320
+ open that supplies a verifier or a factory is refused. `IExternalEventSource.revoke()` stops the grant's queued and running turns,
321
+ refuses its later events as `grant-revoked`, and keeps the label from being opened again. A submission the
322
+ session refuses is `shutting-down` only while it shuts down, and `session-unavailable` otherwise. New command
323
+ host adapter `externalEvents` (`ICommandExternalEventsAdapter`).
324
+ - `agent-ui-terminal` — forwards `externalEventVerifierFactory` from the render options to the session.
325
+ - `agent-interface-transport` — `TExternalEventRefusal` gains `session-unavailable`.
326
+ - `agent-command` — `/events` lists the session's grants (label, principal kind, state, counts) and
327
+ `/events revoke <grant-id>` withdraws one. User-only.
328
+ - `agent-cli` — a grant file (`grantId`, `issuer`, `resource` ending in `/events/<grantId>`, exactly one of
329
+ `subject` or `client`, `scopes`, optional `algorithms` and `rate`) is validated before anything starts, with a
330
+ reason that names the grant and no configured value. `robota --external-event-grant <file>` (TUI) and
331
+ `robota session start --background --external-event-grant <file>` open every grant or fail the start; a
332
+ background session receives its grants through a private file, opens them before it reports ready, and the
333
+ launcher refuses a readiness that names other grants. `robota session events list <id> [--json]` and
334
+ `robota session events revoke <id> <grant-id>` work over the generation-bound control socket, and
335
+ `robota session list --format json` shows each grant's counts. The retired `--external-event-allow` now points
336
+ at `--external-event-grant`.
337
+
338
+ - 28fa8a7: `/devices add` and `/devices join` enrol a new device into your devices.
339
+
340
+ - On a device that holds the signing key, `/devices add` shows a one-time code on the terminal. It
341
+ works once, for five minutes.
342
+ - On the new device, `/devices join [name]` asks for the code on the terminal, creates the device's
343
+ keys, and meets the other device through the signaling relay in
344
+ `transports.webrtc.options.relayUrl`. Both devices need that setting.
345
+ - The new device proves the code over the WebRTC connection's DTLS fingerprints before anything else
346
+ crosses, so a relay in the middle cannot enrol anyone.
347
+ - Both devices then show the same six digits, and both operators compare them and confirm. Someone
348
+ who saw the code cannot choose the digits: the new device commits to its part before it sees the
349
+ existing device's.
350
+ - Only when both operators say yes does the existing device certify the new one and issue a new
351
+ roster. The new device keeps its identity only once the chain it receives verifies.
352
+ - A wrong, expired or already used code is refused. So is a code after a few failed attempts. When
353
+ either operator declines, nothing is issued or kept.
354
+ - The code appears only on the two terminals. It never reaches history, transcripts or the model. A
355
+ code typed as a command argument is refused. Both commands stay user-only and refuse remote
356
+ surfaces.
357
+ - `agent-remote-pairing`: enrollment codes, the enrollment proof, the signed request with its
358
+ commitment, the short authentication string and the frame decoder.
359
+ - `agent-transport-webrtc`: `dialEnrollment` and `listenForEnrollment` provide a data channel bound to
360
+ the negotiated fingerprints.
361
+
362
+ - 4f49d14: The device mesh can be turned on, and `/peers`, `/handoff` and `/devices` reach the user's other devices.
363
+
364
+ - New user setting `transports.mesh.enabled` (default `false`). When it is `true`, an interactive
365
+ session opens the device mesh at startup and closes it on exit. Only the user settings count; a
366
+ project's settings cannot turn it on. Print and serve runs never open it, and a device without an
367
+ identity is told to run `/devices init`. Only one session of a device opens it at a time; another
368
+ session on the same device says so in `/devices` and links nothing.
369
+ - By default a linked device may send messages, files and sessions. Each file and each session still
370
+ waits for the operator's yes on this machine's terminal; with no terminal the answer is no.
371
+ Delegating, observing and driving stay off unless `transports.mesh.options.capabilities` lists
372
+ them.
373
+ - A message from a linked device arrives like one from a session on this host: a peer turn with no
374
+ authority, attributed to the device the handshake proved, under the same rate limit and
375
+ conversation limits.
376
+ - `/peers` lists linked devices beside the sessions on this host; `/peers send` and
377
+ `/peers send-file` take a device id. `/handoff` lists linked devices and pushes the session to one.
378
+ Files arrive in the usual place aside, and sessions are saved without starting.
379
+ - `/devices` shows whether the mesh is on, how this device finds the others, and which are linked.
380
+ - The mesh uses the relay at `transports.webrtc.options.relayUrl` when one is set. Without one it
381
+ finds devices on the local network and over the public ways in `transports.mesh.options`.
382
+ - `/peers`, `/handoff` and `/devices` stay user-only. Their descriptions tell the model they cover
383
+ linked devices.
384
+ - `agent-framework`: the `/peers` port can list linked devices (`listDevices`, `ILinkedDeviceSummary`).
385
+ - `agent-command`: the `/devices` port can report the mesh (`meshStatus`, `IDevicesMeshStatus`).
386
+
387
+ - 7b72344: Every client can offer the session's commands and skills and show its status. The GUI uses them as a
388
+ desktop-style composer.
389
+
390
+ - `agent-interface-session` is **`major` because `IInteractiveSession` gains required members**:
391
+ `ISessionCommands.listSkills()` and a `statusRead` capability, `getStatusSnapshot()`. The snapshot
392
+ holds session, model, permission mode, effort, context and goal. An external implementation stops
393
+ compiling until it adds both.
394
+ - `agent-transport` is **`major` for the same reason on `IProtocolSession`**. It also gains the wire
395
+ messages `get-commands` → `commands` and `get-status` → `session_status`. Both are reads that the
396
+ observe role may send.
397
+ - `agent-interface-command` gains `ICommandSkillListEntry`, moved from `agent-framework`, which
398
+ re-exports it unchanged.
399
+ - `agent-ui-web` is **`major` because its state changes shape**:
400
+ - A command's outcome and a finished turn's tool calls are now conversation entries: `messages` is
401
+ `TConversationEntry[]`.
402
+ - The `uiIntentNotices` list, `dismissUiIntentNotice`, `applyUiIntentEvent`,
403
+ `removeUiIntentNotice` and `IUiIntentNotice` are removed. An intent now answers with an info
404
+ line in the conversation.
405
+ - Session notices keep only `session-error` and `protocol-error`.
406
+ - The state gains `commandCatalog` and `sessionStatus`.
407
+ - `agent-command` registers `/theme` and `/keybindings` even without a terminal. They then answer
408
+ that they belong to the Robota terminal, instead of being unknown.
409
+ - `agent-framework`:
410
+ - `InteractiveSession.getStatusSnapshot()`.
411
+ - The main-thread row previews the last chat message instead of the last record's type.
412
+ - `agent-cli` serves the full GUI web app, renamed from `agent-cli-web` to `agent-gui-web`, on
413
+ `robota --serve --open`.
414
+
415
+ - 9721162: The command catalog says who runs a command, and which surfaces can run it.
416
+
417
+ - **`agent-interface-command` (major).**
418
+ - Adds `TCommandRunner` (`'runtime' | 'client'`) and `TCommandSurface` (`'terminal' | 'gui'`).
419
+ - `ICommand` gains optional `runner` and `surfaces`.
420
+ - `ICommandListEntry` gains optional `surfaces` and a **required** `runner`. An implementation of `listCommands()`, or any code that constructs an `ICommandListEntry`, must now emit `runner`; a command that declares none gets `'runtime'`.
421
+ - **`agent-framework` (minor).**
422
+ - `ISystemCommand` gains optional `runner` and `surfaces`, and the command listing carries both.
423
+ - An undeclared runner resolves to `'runtime'`.
424
+ - `SessionTerminalHandoffGate` is exported for a terminal client that hands its own terminal to a command.
425
+ - **`agent-command` (minor).**
426
+ - `/shell`, `/editor`, `/theme` and `/keybindings` declare `runner: 'client'` and `surfaces: ['terminal']`.
427
+ - `createTerminalClientCommands()` builds the same four commands, from the same execute functions, for a terminal client to run itself. The set follows the preset's module selection.
428
+ - **`agent-ui-web` (minor).** The `/` menu marks a command that runs in the terminal with a "terminal" badge.
429
+
430
+ ### Patch Changes
431
+
432
+ - 4241fc5: Device mesh follow-ups.
433
+
434
+ - A device with no identity is pointed to `/devices add` on one of the user's devices and `/devices join`
435
+ here, as well as to `/devices init`. The message says that `init` is for the first device only,
436
+ because it creates a separate identity that can never link to the user's other devices. The `/devices`
437
+ description and the `init` subcommand say the same.
438
+ - An identity created mid-session (`/devices init`, or a successful `/devices join`) opens the mesh
439
+ without a restart when `transports.mesh.enabled` is on.
440
+ - If a session stalls for longer than the mesh lock's stale window (for example while the machine
441
+ sleeps), another session can take the mesh over. The stalled session now notices this on its next
442
+ lock refresh, closes its own mesh, and says why. Two sessions no longer run it together.
443
+ `holdExclusiveFileLock` has a new `onLost` option for this.
444
+ - `/peers` and `/handoff` still list and reach linked mesh devices when local same-host peer discovery
445
+ fails. `/peers` says why sessions on this host are not listed. `ICommandLocalPeersAdapter` has a new
446
+ optional `localDiscoveryOff` field for this.
447
+ - `agent-transport-webrtc`: when lists become newer on a node (reissued, revoked, or adopted from a
448
+ peer), the node sends them over every admitted connection instead of waiting for the next handshake.
449
+ Reissues, revocations and enrolments in the CLI take effect this way at once. A receiver adopts a
450
+ pushed list only if it is newer, issued by this user's signing key, and verifies. The push does not
451
+ depend on the peer's capabilities, and it never reaches the application's message handlers.
452
+
453
+ - 57280bf: Every published package now declares `"engines": { "node": ">=22.12.0" }`. Before, 27 of the 38
454
+ packages declared no floor (`agent-core`, `agent-tools` and every provider among them),
455
+ `agent-session` and `agent-file-authority` declared `>=20.19.0`, and the other nine declared
456
+ `>=22.0.0`, so a consumer on Node 20 saw at most a warning from a transitive dependency.
457
+
458
+ Why 22.12: `agent-cli` and `agent-ui-terminal` need Node 22 through `ink` 7, and the CommonJS entries
459
+ of `agent-tools` and its dependents, `agent-transport`/`node` and its dependents, and
460
+ `agent-ui-terminal` `require()` ESM-only dependencies (`p-limit`, `jose`, `chalk`), which Node 22
461
+ supports unflagged only from 22.12. `engines` is advisory unless the consumer enables `engine-strict`.
462
+
463
+ No code changes: `tsdown` now reads `node22.12.0` as its build target from the field.
464
+
465
+ - 18c0d5c: Every published package now exports `./package.json`, so `require('<package>/package.json')` and
466
+ `import('<package>/package.json', { with: { type: 'json' } })` work instead of failing with
467
+ `ERR_PACKAGE_PATH_NOT_EXPORTED`, and each tarball now ships the package's `CHANGELOG.md`.
468
+ - caaab20: `/rewind` works again. Every session the CLI builds for a trusted workspace captures edit
469
+ checkpoints; before, none did, and `/rewind` failed everywhere with "Edit checkpoints require
470
+ project authority."
471
+
472
+ - `agent-cli` (patch): a trusted workspace composes an edit checkpoint store for the terminal UI, a
473
+ print run, a served runtime and each session a daemon keeps live. Every session gets its own
474
+ store, pooled or switched to in the terminal UI, since two can run turns at the same time. On a host that cannot prove a project write
475
+ stays inside the project (every platform but Linux), none is composed: a checkpoint could be
476
+ neither saved nor restored there.
477
+ - `agent-command` (patch): where a session has no checkpoints, `/rewind` says why: a restricted
478
+ workspace is told to run `robota trust --yes` and restart Robota, and a host that cannot write
479
+ the project safely says so. `/rewind list` reports this as a failed command instead of throwing.
480
+ - `agent-framework` (minor): a checkpoint operation on a session without a store throws
481
+ `EditCheckpointsUnavailableError`, whose `reason` is `host-cannot-write-project`,
482
+ `restricted-workspace` or `no-checkpoint-store`. It is a `WorkspaceAuthorityRequiredError`, as
483
+ before, named `EditCheckpointsUnavailableError`. `HeadlessInteractionChannel` takes an
484
+ `editCheckpointStore` option.
485
+ - `agent-ui-terminal` (minor): `renderApp` takes `createEditCheckpointStore` in place of
486
+ `editCheckpointStore`, and builds each session its own store, since a session switch can build the
487
+ next session before the old one's turn ends. `TuiInteractionChannel` keeps `editCheckpointStore`:
488
+ a channel runs one session.
489
+
490
+ - Updated dependencies [3c81769]
491
+ - Updated dependencies [724fabb]
492
+ - Updated dependencies [997f2fb]
493
+ - Updated dependencies [bfe8ed5]
494
+ - Updated dependencies [e689c8e]
495
+ - Updated dependencies [4241fc5]
496
+ - Updated dependencies [4f49d14]
497
+ - Updated dependencies [7b72344]
498
+ - Updated dependencies [6ae3f28]
499
+ - Updated dependencies [9721162]
500
+ - Updated dependencies [be0e53c]
501
+ - Updated dependencies [57f57f5]
502
+ - Updated dependencies [ba822c1]
503
+ - Updated dependencies [9721162]
504
+ - Updated dependencies [6e6b06b]
505
+ - Updated dependencies [7d77ce4]
506
+ - Updated dependencies [8bd5fac]
507
+ - Updated dependencies [57280bf]
508
+ - Updated dependencies [5033dd9]
509
+ - Updated dependencies [18c0d5c]
510
+ - Updated dependencies [dbd888d]
511
+ - Updated dependencies [1887e54]
512
+ - Updated dependencies [caaab20]
513
+ - Updated dependencies [f01868f]
514
+ - Updated dependencies [e8779c9]
515
+ - Updated dependencies [5a0ee96]
516
+ - @robota-sdk/agent-framework@3.0.0-beta.83
517
+ - @robota-sdk/agent-core@3.0.0-beta.83
518
+ - @robota-sdk/agent-interface-session@3.0.0-beta.83
519
+ - @robota-sdk/agent-interface-command@3.0.0-beta.83
520
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.83
521
+ - @robota-sdk/agent-preset@3.0.0-beta.83
522
+
523
+ ## 3.0.0-beta.82
524
+
525
+ ### Minor Changes
526
+
527
+ - c7f9203: Connected sessions can send each other files.
528
+
529
+ - `/peers send-file <session-id> <path>` sends a copy of any file the operator can read to another
530
+ live session on this host.
531
+ - The model sends a file only through the `peer_send_file` tool. Every call asks the user, showing
532
+ the path, size, hash and destination; no permission mode, rule or remembered consent answers it.
533
+ The tool reaches only files inside the workspace whose path does not look like it holds secrets
534
+ (`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
535
+ - The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
536
+ under `$PRODUCT_USER_STATE_DIR/peer-files/<sender>/`. It is never run and never placed in the model's context.
537
+ The conversation is told only its name, size and sha256. A name that leaves that directory is
538
+ refused, a symbolic link is never written through, and nothing is overwritten.
539
+ - Transfers travel on a channel of their own (a separate connection on this host, a separate data
540
+ channel between devices), in chunks the receiver paces, up to 32 MiB, and are kept only when the
541
+ whole content matches the offered sha256. A transfer that ends early is discarded; there is no
542
+ resume.
543
+
544
+ **API**
545
+
546
+ - `agent-interface-session-mobility`: the `file` capability, which asks the operator for every
547
+ request; `ConnectionAuthority.authorizeFile`; `IFileOffer` and `IFileFrameChannel`.
548
+ - `agent-transport/node`: `sendFileOverChannel` and `receiveFileOverChannel`, the carrier over any
549
+ `IFileFrameChannel`; `DEFAULT_MAX_FILE_BYTES`.
550
+ - `agent-transport-webrtc`: `IDeviceMeshLink.openFileChannel` and `onFileChannel`.
551
+ - `agent-remote-pairing`: `file` joins `DEVICE_CAPABILITIES`. A device certificate that names it is
552
+ refused as malformed by an earlier version.
553
+ - `agent-core`: `IToolPermissionProfile.notInPeerTurn` withholds a tool from a turn a peer's message
554
+ started.
555
+ - `agent-framework`: `ICommandLocalPeersAdapter.prepareFile`.
556
+
557
+ - 004fe7f: `/handoff` moves a session over a real connection.
558
+
559
+ - `/handoff <session-id>` pushes this conversation to another Robota session on this machine. The
560
+ same carrier also runs between two of the user's devices over their mesh connection; no command
561
+ opens that connection yet.
562
+ - A hand-off is push-only: only the operator of the session that holds it starts one. A session or
563
+ device that asks another for its session is refused.
564
+ - The source signs a grant for that one transfer over that one channel with its device key, so a
565
+ hand-off needs the device identity from `/devices init`. The receiving side checks it against the
566
+ sender's certificate, then asks its own operator; without a yes nothing is sent.
567
+ - The session travels on the file-transfer carrier, is kept aside until it matches the manifest, and
568
+ is saved without being started. The operator there resumes it with `robota --resume <id>`.
569
+ - The source gives the session up, and ends, only once the receiving side confirms it saved it.
570
+ Every other outcome leaves the session where it was; if the confirmation is lost, `/handoff` to the
571
+ same session again resends the same transfer, which the receiver settles without saving it twice.
572
+ Peer attribution (`driverId`, `turnSource`)
573
+ travels with it.
574
+ - `/handoff` stays user-only. Its description tells the model to suggest the command to the user.
575
+ - `agent-transport-webrtc`: an admitted mesh link exposes the DTLS fingerprints it is bound to, and
576
+ `judgeHandoffGrant` is exported.
577
+ - `agent-interface-session-mobility`: a hand-off carrier may move the sealed payload whole
578
+ (`sendPayload`), the destination verifies it with `receivePayload`, and the source can report its
579
+ open transfer (`status`) and abandon it for any refusal the destination names.
580
+
581
+ ### Patch Changes
582
+
583
+ - e15e22b: Two of one user's devices can connect to each other over WebRTC, admitted by the device handshake.
584
+
585
+ - `agent-transport-webrtc` — `DeviceMeshNode` keeps one connection per device pair, in either role: the
586
+ device with the lower id offers and the other answers, so concurrent attempts resolve by rule. Both
587
+ roles bind the handshake to the certificate the DTLS layer verified and take one remote description
588
+ with exactly one fingerprint; before admission only handshake frames cross, and a connection counts
589
+ as admitted only once both sides admitted each other. Each connection gets its own DTLS certificate
590
+ (`createDtlsKeys`). A new attempt never displaces an admitted connection until it is admitted
591
+ itself, and attempts per pair are paced. Lists adopted in a handshake, or handed over through
592
+ `refresh`, apply at once, and a device they revoke loses its connection. Signaling runs through
593
+ `IMeshRelay`: `WsMeshRelayClient` for the self-hosted relay's `presence` / `message` frames
594
+ (topics capped per source and relay-wide), `createInMemoryMeshRelayHub` for tests.
595
+ - `agent-remote-pairing` — the pair's two relay inbox topics, one per direction, come from their
596
+ pairwise secret (`derivePairRendezvous(...).relayInbox()`).
597
+ - `agent-cli` — a device holding the signing key reissues its roster and revocation list before they
598
+ expire while an interactive session runs. The host can open this device's mesh endpoint from the
599
+ identity under `$PRODUCT_USER_STATE_DIR/devices`, saving newer lists a peer hands over; no command starts it yet.
600
+ - `agent-command` — `/devices add|join` still reports that enrolment is not available yet.
601
+
602
+ - Updated dependencies [c7f9203]
603
+ - @robota-sdk/agent-core@3.0.0-beta.82
604
+ - @robota-sdk/agent-framework@3.0.0-beta.82
605
+ - @robota-sdk/agent-interface-command@3.0.0-beta.82
606
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.82
607
+ - @robota-sdk/agent-interface-session@3.0.0-beta.82
608
+ - @robota-sdk/agent-preset@3.0.0-beta.82
609
+
610
+ ## 3.0.0-beta.81
611
+
612
+ ### Minor Changes
613
+
614
+ - 44fc732: Add `/devices` for this device's identity among the user's devices: `list`, `init` (creates the identity: a recovery phrase, the master-certified signing key, this device's keys and certificate, the first roster and revocation list), `revoke <device-id>` (signing key only, no phrase; confirmed at the terminal) and `recover` (rotates the signing key from the phrase and revokes the old ones). Enrolling another device (`add` / `join`) comes with the device connection.
615
+
616
+ The recovery phrase never enters the session: it is shown once and read with no echo on the controlling terminal (opened apart from the session's input), on the alternate screen that is cleared afterwards, and never reaches prompt history, conversation history, transcripts, traces or the model. Without an interactive terminal the phrase commands refuse. `/devices` is operator-only: never model-invocable and refused from remote surfaces. Private keys live in the host credential store; certificates, roster, revocation lists and sequence marks are kept in owner-only files under `$PRODUCT_USER_STATE_DIR/devices`.
617
+
618
+ `agent-remote-pairing` adds `isRecoveryPhraseWord`, so a phrase can be checked one word at a time.
619
+
620
+ - 18b52cc: Built-in commands are offered to the model deliberately, each described for the model, and never
621
+ with a trust, credential or permission-widening action.
622
+
623
+ - `agent-interface-command` — `ICommand` gains `modelDescription?` (what the model is told, beside the
624
+ short `/help` line), and `modelInvocable` on a subcommand entry now narrows what the model may run.
625
+ - `agent-framework` — `ISystemCommand` gains `modelDescription?` and `modelRequiresPermission?`.
626
+ Once any subcommand of a model-invocable command declares `modelInvocable`, the model may run only
627
+ the bare command and the subcommands declared `true`; everything else, including an alias or an
628
+ undeclared subcommand, is refused before the command runs. The model-facing descriptor lists only
629
+ that subset. A model-requested monitor's command is now decided by the shell tool's gate (its
630
+ Bash/Shell rules, the mode and the prompt) and a refusal rejects with the new
631
+ `MonitorCommandRefusedError`. The `scriptedSession` test harness accepts `permissions` patterns.
632
+ - `agent-session` — `Session.checkToolPermission(toolName, toolArgs)` decides an action that has a
633
+ tool's effect by another route: that tool's PreToolUse hooks, then the gate's rules, mode,
634
+ remembered consent and prompt — never the command sandbox's auto-approval, since the action does
635
+ not run inside the sandbox.
636
+ - `agent-framework` also: `ICommandMCPActivationAdapter.userActionSurface?` tells `/mcp` whether the
637
+ user can type a session command, so the model's status names the terminal sign-in otherwise.
638
+ - `agent-command` — `/context` (bare and `list`), `/cost` (the report, not `budget`) and `/mcp`
639
+ (`status` only, without a prompt) are now model-invocable; `/memory approve` and `/memory reject`
640
+ are now user-only; the model's `/monitor` is decided by the shell gate rather than by consent to
641
+ the command's name. Every model-invocable command carries a model-facing description. The model's
642
+ `/mcp status` shows only safe names, states and the command to suggest, and a caller that does not
643
+ identify itself gets that view. `/context list` accounts only for turns still in context. New
644
+ `mcpUserActionNotice`, `mcpUserActionCommand` and `mcpUnavailableServersNotice` build the fixed
645
+ notices.
646
+ - `agent-command-workflows` — `/workflows` carries a model-facing description.
647
+ - `agent-mcp` — `createDiscoveredTool` accepts `authFailureNotice`: a call the server refuses for
648
+ authentication returns that host text instead of the generic failure.
649
+ - `agent-cli` — an MCP server that did not start because the user must approve it, trust the
650
+ workspace or sign in is named to the model at the start of an interactive session with the
651
+ command to suggest, and a
652
+ signed-in OAuth server that refuses a call tells the model to suggest `/mcp login <server>` — or, in print and serve runs, the terminal
653
+ `robota mcp login <server>`.
654
+
655
+ A command whose bare form is a complete action declares `runsBare`, so choosing `/cost` or `/mcp`
656
+ from the autocomplete menu still runs it even though they now declare subcommands.
657
+
658
+ - 9843fe6: Sign in to a remote MCP server from inside a session, and use its tools without restarting.
659
+
660
+ - **`/mcp login <server> [--no-browser]`** runs the same per-server OAuth sign-in as
661
+ `robota mcp login` (discovery checks, PKCE, `state`, RFC 9207 `iss`, RFC 8707 resource, the
662
+ loopback listener, the lock-guarded store). It opens the browser through the argv opener; with
663
+ `--no-browser`, or when no browser can be opened, it shows the authorization URL and asks for the
664
+ redirect URL in the session's own prompt (masked), held to the same rules as a pasted redirect in
665
+ the terminal. A failed, refused, timed-out or cancelled sign-in changes nothing and is reported by
666
+ a fixed reason only. `/mcp login <server> --client-secret` is refused: a secret is never typed into
667
+ a session, and `robota mcp login <server> --client-secret` is named instead (also after a failed
668
+ token exchange for a pre-registered client). `/mcp` stays user-only (`modelInvocable: false`).
669
+ - **Connected in the same session:** after a sign-in, a server that could not connect for want of
670
+ one goes through the normal admission (approval, fingerprint, trust) and connects, and its tools
671
+ are offered from the next message; a server that was already connected is admitted again and
672
+ reconnects, and its authenticator drops what it held and reads the new credential. A tool left out
673
+ because the session already has its name is reported, and only tools actually added get
674
+ provenance. In browser mode the authorization URL is shown in the session prompt before the
675
+ browser opens, where the user can also choose to paste the redirect instead or cancel.
676
+ - **`runMCPOAuthLogin`** takes `readRedirectWhenBrowserFails`: when `openBrowser` rejects, the
677
+ loopback listener stops and the pasted redirect is read instead, for the same redirect URI. The
678
+ loopback listener's time limit now runs from its first `wait()` — once the authorization page is
679
+ handed over — so time spent at a prompt before the browser opens does not count against it.
680
+ - **`Session.addTools`** (and `ICommandSessionTools.addTools`) offers tools that became usable
681
+ mid-session, through the same permission gate and — via `ISessionOptions.wrapAddedTools`, which
682
+ `createSession` sets — the same edit-checkpoint and reversible-execution wraps as the assembled
683
+ tools. A name the session already has is left out, never replaced. Calls are serialized, and tools
684
+ added while a turn runs are applied when the next turn starts, so a turn's rounds all see one
685
+ tool list and the prompt cache misses once, at that boundary.
686
+ - **Breaking (`agent-framework`, major):** `addTools` is a new required member of the
687
+ `ICommandSessionTools` role port (and so of `ICommandSessionRuntime`). A host that implements the
688
+ port itself must add it; one that passes an `agent-session` `Session` already has it.
689
+ - **`ICommandMCPActivationAdapter.oauthLogin`** (`ICommandMCPOAuthLoginRequest`,
690
+ `ICommandMCPOAuthLoginResult`, `ICommandMCPOAuthRedirectPrompt`) is the port behind it.
691
+ - The sign-in notice and `/mcp status` now suggest `/mcp login <server>` in a session and
692
+ `robota mcp login <server>` in a terminal; the server's name is shown only when it is safe to paste
693
+ into any shell, otherwise `<server>`.
694
+
695
+ ### Patch Changes
696
+
697
+ - ec5e477: Add a credential store port (`ICredentialStore` in `agent-core`) and keep the CLI's secrets behind it: the OS keychain through the optional `@napi-rs/keyring` binding (macOS Keychain, Windows Credential Manager, Linux Secret Service), else an owner-only file under `$PRODUCT_USER_STATE_DIR/credentials`. The backend is chosen at first use, recorded, and named by `/remote-control status`; a recorded keychain that stops working fails closed instead of degrading to the file.
698
+
699
+ The remote-control host identity key moves into the store. The old `$PRODUCT_USER_STATE_DIR/remote-host-identity.json` may have been copied by backups or dotfile sync, so it is not carried over: on the first run after upgrading a new host key is generated, the old file is removed, and the operator is told once that trusted devices must pair again.
700
+
701
+ - 007fd90: Authority per connection: pairing stays with the local operator, and driving needs the operator's yes.
702
+
703
+ - `agent-interface-session-mobility` — `ConnectionAuthority` decides what one connection may do.
704
+ `presence` and `message` are allowed; `delegate` and `handoff` ask the receiving operator for every
705
+ request; `observe` and `drive` ask once per connection. With no `IOperatorApprover` the answer is
706
+ no. `authorizeDelegation` turns an approved task into a peer turn from where admission placed the
707
+ peer, ignoring anything else on the request, so the receiver's policy decides what it may do.
708
+ - `agent-transport-webrtc` — `connectionApproval` asks the operator before a connection reaches the
709
+ session, after every proof has run. Frames the peer sends meanwhile are held (bounded) and delivered
710
+ only after a yes. A channel that closes first withdraws the question (the approval context carries
711
+ an `AbortSignal`), and a later answer admits nothing. A first-pairing device is pinned for
712
+ reconnect only once it is admitted.
713
+ - `agent-command` — `/remote-control enable` and `revoke` from a connected surface are refused, and
714
+ `status` never shows a connected surface the pairing link.
715
+ - `agent-framework` — the `remote-control-enable` host action runs only for the operator's own
716
+ command, whichever command asked for it.
717
+ - `agent-cli` — every remote-control connection, a returning trusted device included, is put to the
718
+ operator on the host terminal; without an interactive terminal it is refused.
719
+
720
+ - Updated dependencies [3038eb7]
721
+ - Updated dependencies [02b7452]
722
+ - Updated dependencies [ec5e477]
723
+ - Updated dependencies [007fd90]
724
+ - Updated dependencies [18b52cc]
725
+ - Updated dependencies [9843fe6]
726
+ - @robota-sdk/agent-core@3.0.0-beta.81
727
+ - @robota-sdk/agent-interface-session@3.0.0-beta.81
728
+ - @robota-sdk/agent-framework@3.0.0-beta.81
729
+ - @robota-sdk/agent-interface-command@3.0.0-beta.81
730
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.81
731
+ - @robota-sdk/agent-preset@3.0.0-beta.81
732
+
733
+ ## 3.0.0-beta.80
734
+
735
+ ### Major Changes
736
+
737
+ - 64ba748: **BREAKING — ARCH-042: project filesystem access is now an explicit, host-issued authority instead of an ambient consequence of `cwd`.**
738
+
739
+ `@robota-sdk/agent-framework` adds `WorkspaceTrustService` and the opaque
740
+ `IWorkspaceProjectAuthority`, plus bounded reader, settings-writer, state-storage, and mutation
741
+ facets. Public session, settings, context, checkpoint, memory, contribution, query, and replay
742
+ contracts consume those facets. A caller that does not supply `projectAccess` is deliberately
743
+ restricted to user-owned host state and receives no project filesystem capability.
744
+
745
+ The framework removes or renames ambient Node/project exports. Migrate `checkSettingsFile` to
746
+ `checkNodeHostSettingsFile`, `readMergedProviderSettingsFromPaths` to
747
+ `readMergedProviderSettingsFromSources`, `resolveProviderSettingsWriteTargetPath` to
748
+ `resolveProviderSettingsWriteTarget`, `FileSystemMemoryStore` / `createFileSystemMemoryStore` to
749
+ `WorkspaceMemoryStore` / `createWorkspaceMemoryStore`, and `PluginSettingsStore` to
750
+ `NodeHostPluginSettingsStore`. Host-only git helpers now carry the `FromNodeHost` suffix.
751
+ `projectPaths`, `resolveSettingsPathForScope`, and `getProviderSettingsPaths` are removed; project
752
+ consumers must use the authority facets rather than recover absolute paths.
753
+
754
+ `@robota-sdk/agent-session` renames the Node filesystem implementation `SessionStore` to
755
+ `NodeSessionStore` and adds explicit session-log/external-payload source and sink ports. Session
756
+ replay no longer resolves external payload files from an ambient directory.
757
+
758
+ `@robota-sdk/agent-interface-transport` changes `ISkillExecutionPort.loadCommands(cwd, home?)` to
759
+ the authority-bound `loadCommands()` and removes the optional absolute-path leak
760
+ `IInteractiveSessionStore.getFilePath`. `@robota-sdk/agent-command` consequently replaces the
761
+ `cwd` option of `createSkillsCommandModule` with required `contributionSources`; default command
762
+ composition accepts explicit contribution sources and discovers no project skills when none are
763
+ provided.
764
+
765
+ `@robota-sdk/agent-cli`, `@robota-sdk/agent-transport`, and
766
+ `@robota-sdk/agent-transport-tui` thread the trusted-or-restricted project decision through every
767
+ session surface. Embedded callers that need project settings, state, context, skills, checkpoints,
768
+ or mutation must mint access through `WorkspaceTrustService` and pass the returned
769
+ `projectAccess` (and a separately approved mutation/settings facet where required). Omitting it is
770
+ still type-compatible but is behaviorally breaking: the surface now fails closed instead of
771
+ reading or writing the current directory.
772
+
773
+ ### Minor Changes
774
+
775
+ - 9c19c50: `/fork [name] [--same-dir]` copies the live conversation into a background session.
776
+
777
+ The session writes a copy of its own record under a fresh id — messages, system prompt, tool schemas
778
+ and full history, and deliberately not the sandbox snapshot, goal, plan or branch — then spawns a
779
+ background job carrying only `resumeSessionId`. The child restores that record itself, so no
780
+ conversation crosses the child-process boundary and the worker start payload's key set is unchanged.
781
+ The background panel gains an `attach` control that switches the terminal onto the forked session; it
782
+ is a view switch, never a merge, and a missing record or a terminal task is refused with the task's
783
+ own status.
784
+
785
+ **`@robota-sdk/agent-framework` is `major` for one reason: `ICommandHostSessionAccess` gains a
786
+ required member.** `forkSession({ name? })` is not optional, so an external implementation of that
787
+ role port stops compiling until it adds the method. Every other change in this set is additive:
788
+
789
+ - `agent-interface-execution` — `TExecutionControl` gains `'attach'`.
790
+ - `agent-interface-command` — `TCommandUiIntent` gains `{ type: 'switch-session'; sessionId }`.
791
+ - `agent-subagent-runner` — `ISubagentWorkerComposition` gains the optional `openSessionStore`, and
792
+ the worker resumes a record when the job names one. A composition that registers no store and
793
+ receives no `resumeSessionId` behaves exactly as before.
794
+ - `agent-framework` also gains the fork-record builder, `SessionTurnMemory`, and
795
+ `IAgentBackgroundTaskRequest.resumeSessionId?`; `loadSessionRecord` now returns
796
+ `restoredSystemPrompt`, which makes a record field that was written and never read take effect on
797
+ restore.
798
+ - `agent-executor`, `agent-command`, `agent-transport-tui`, `agent-cli` — the spawn input, the
799
+ `/fork` module and the attach control that carry it to the surface.
800
+
801
+ - 9368d00: Advisor escalation: the main model can consult a second model at the decision points it chooses.
802
+
803
+ With an advisor configured (`--advisor <profile>[:<model>]`, or the `advisorModel` setting that
804
+ `/advisor` saves; the flag wins), the session gets an `Advisor({ question? })` tool. The advisor reads
805
+ the whole conversation — system prompt, messages, tool calls and results — serialized into one prompt
806
+ and sent with `toolChoice: 'none'`, truncated from the front to fit its window with the system prompt
807
+ kept, and declines when even that does not fit. Its answer comes back framed as guidance to verify;
808
+ an empty or refusing answer reads as declined. Calls are limited to two per turn and a fixed number
809
+ per session, parallel calls in one round share those limits, and a repeated question in the same
810
+ turn returns the earlier answer. A request that was sent counts even when the provider failed (the
811
+ decline is reported by class, never by its text); only a call declined before sending gives its slot
812
+ back.
813
+
814
+ Advisor usage, including in-process subagents', is recorded where each turn's usage is recorded —
815
+ the persisted session history, under the advisor's own provider and model — so `/cost`, usage reports
816
+ and resumed sessions include it. `/cost` now totals that history and prices each part on its own
817
+ model, showing "mixed" when more than one model was priced.
818
+
819
+ `/advisor <model>` and `/advisor off` change only where calls go, never the tool list, so the main
820
+ model's prompt cache is not invalidated mid-session; the tool is added only when a session starts
821
+ with an advisor. Sending history to a destination (provider type and endpoint host) the main model
822
+ does not already use needs a one-time consent per destination, kept in the user settings file; a
823
+ refusal is remembered for the session. The organization's `allowedProviders` applies, and
824
+ `PRODUCT_DISABLE_ADVISOR=1` turns it off completely. In-process subagents inherit the advisor, bound
825
+ to their own conversation; child-process subagents do not get it.
826
+
827
+ **`@robota-sdk/agent-framework` is `major` for one reason: `ICommandHostSessionAccess` gains a
828
+ required member,** `getSessionUsage()`, the session's persisted usage records. An external
829
+ implementation of that role port stops compiling until it adds the method. The rest is additive.
830
+
831
+ - `agent-session` — `formatConversationEntries`, the one text rendering of a conversation, now used
832
+ by compaction too. It keeps tool calls and results, marks a user message a peer session sent
833
+ (`user [from "peer:<id>"]`), and JSON-encodes every message onto one line so no content can forge
834
+ another entry; compaction previously flattened all of this. `Session.getProvider()` returns the
835
+ provider the session currently uses.
836
+ - `agent-framework` — `AdvisorController`, `createAdvisorTool`, the advisor spec helpers, provider
837
+ destinations (`describeProviderDestination`, `rememberProviderDestination`), `getSessionUsage` and
838
+ `ISessionUsageRecord`, the `onUsageRecorded` session option, and the optional `advisor` command
839
+ host adapter. Session assembly binds a host-supplied Advisor tool to the session holding it.
840
+ - `agent-command` — the `/advisor` command module; `/cost` reads the session's persisted usage.
841
+ - `agent-cli` — the `--advisor` flag, `advisorModel` setting, per-destination consent store and kill
842
+ switch.
843
+ - `agent-ui-terminal` — a usage line from another source (the advisor, a background task) names that
844
+ source and leaves out the context window it does not have.
845
+ - `agent-session-analytics` — personal usage counts an advisor call's tokens and cost toward its
846
+ turn without counting it as a turn.
847
+
848
+ - d4189b9: The rest of the per-server MCP OAuth lifecycle: signing in to a server without a local browser,
849
+ signing out of it with token revocation, and each server's sign-in state in `/mcp`.
850
+
851
+ - **`robota mcp login <name> --no-browser`** prints the authorization URL and reads the redirect URL
852
+ the user pastes back (not echoed). `runMCPOAuthLogin` takes `readRedirect` for this; nothing
853
+ listens on the redirect URI then. The pasted URL is held to the loopback listener's rules through
854
+ `createPastedRedirectAcceptor`: it must be the registered redirect URI (same origin and path, no
855
+ user info), carry the sign-in's `state` (compared in constant time), and is accepted once; an
856
+ error redirect is `authorization-denied` without its `error_description`, and the RFC 9207 `iss`
857
+ check applies as before. `openBrowser` now also receives the redirect URI. `readRedirect` gets a
858
+ signal that aborts on cancel or at `callbackTimeoutMs` (5 minutes by default, as for the loopback
859
+ listener); a paste longer than the prompt accepts fails as `redirect-too-long`.
860
+ - **Signing out** (`runMCPOAuthLogout`; `robota mcp logout <name>`; `/mcp logout <serverId>`):
861
+ deletes the stored credential under the refresh lock, then revokes the refresh token and the
862
+ access token (RFC 7009) when the stored issuer advertises `revocation_endpoint`. Revocation is a
863
+ POST through the egress policy that never follows a redirect and is byte-bounded; it authenticates
864
+ the client by `revocation_endpoint_auth_methods_supported` when advertised, otherwise the way its
865
+ refresh does. The local delete always happens. Each token's outcome is reported in `tokens`, and
866
+ overall as `revoked`, `partial`, `unsupported`, `failed` or `not-attempted`, with fixed reasons
867
+ only (new: `revocation-failed`, and `token-type-not-revocable` for RFC 7009
868
+ `unsupported_token_type`). `/mcp logout` also makes the session's authenticator drop the token it
869
+ holds (`IMCPOAuthAuthenticator.forget`).
870
+ - **Sign-in state:** `readMCPOAuthCredentialState` answers `signed-in`, `expired-refreshable`,
871
+ `sign-in-required` or `signed-out` — never anything token-derived. `/mcp` shows it for every
872
+ OAuth server; a server this session was told needs a sign-in reads `sign-in-required`.
873
+ `ICommandMCPActivationAdapter` gains optional `oauthStatus` and `oauthLogout`
874
+ (`ICommandMCPOAuthStatus`, `ICommandMCPOAuthLogoutResult`).
875
+ - **No in-session sign-in:** signing in stays `robota mcp login <server>` in a terminal, since it
876
+ needs the terminal (browser, pasted redirect, hidden secret prompt) a running session owns. `/mcp`
877
+ names that command for a server that needs a sign-in, as does the session's sign-in notice; the
878
+ server name is shown there only when it is safe to paste into any shell — a plain token not
879
+ starting with `-` or `=` — and is otherwise replaced by `<server>` (`shellArgumentForDisplay` in
880
+ `agent-core`; nothing is quoted, since quoting rules differ between shells). Server names in OAuth
881
+ notices have control and format characters escaped.
882
+ - **Refresh hardening:** on `invalid_grant`, the store is read again under the lock; a refresh token
883
+ another holder rotated in meanwhile is kept (and used when still valid) instead of being deleted.
884
+ The expiry skew is capped at half the token's lifetime, so a short-lived token is not refreshed on
885
+ every request; credentials now record `issuedAt` for this.
886
+
887
+ - af2f2ad: `/cd <directory>` continues the conversation in another directory.
888
+
889
+ - **A move is a new session in the target directory.** In the TUI, Robota saves a copy of the
890
+ conversation where the target's session store will find it, ends the current run through its
891
+ normal end-of-life flow, and starts again in the target directory resuming that copy. The target's
892
+ settings, trust decision, tools, skills and `AGENTS.md` apply, exactly as if Robota had been
893
+ launched there. The process boundary makes the move atomic, so no tool call can straddle it.
894
+ - **The system prompt is kept as recorded**, so a provider's prompt cache survives. One appended
895
+ `<workspace-move>` message tells the model the new directory, and which project instructions now
896
+ apply.
897
+ - **Refused** while a turn is running or a background task is still running, for a missing directory
898
+ or the current one, and for a target a `Cd(...)` deny rule names.
899
+ - **Access never widens:** a restricted session stays restricted after a move, and a trusted session
900
+ takes the target's own trust decision.
901
+ - New contracts: the `workspace-move` host action, `ICommandWorkspaceAdapter` /
902
+ `IWorkspaceMoveRequest`, `InteractiveSession.moveWorkspace`, and the `workspaceMovedFrom` session
903
+ option. The CLI's `--moved-from` and `--restricted-workspace` flags are internal.
904
+
905
+ - 34e50f0: A new permission mode, `auto`, lets a model classifier approve or block what would otherwise prompt.
906
+
907
+ - **What it decides:**
908
+ - Reads and in-workspace edits run as in `acceptEdits`.
909
+ - Commands and other calls the mode leaves open go to the classifier, a side call to the
910
+ session's own model. It sees the call, the working directory and the git remotes, never the
911
+ conversation.
912
+ - A block reaches the model with its reason, so it can take another route.
913
+ - **What still reaches a person, or is refused:**
914
+ - Deny rules and background ceilings apply first.
915
+ - `ask` rules, critical removals and protected paths ask a person.
916
+ - After 3 refusals in a row (blocks, or no usable verdict), or 20 blocks in the session, the
917
+ mode asks a person until one approves.
918
+ With no one to ask, the call is denied.
919
+ - **Allow rules:** in `auto` mode, allow rules that approve any command are set aside while the
920
+ mode is on. Examples are `Bash(*)`, an interpreter (`Bash(python *)`), a package runner
921
+ (`Bash(npm run *)`, `Bash(pnpm exec *)`), `Agent`, `ExecuteCommand` or `Computer`. Narrow
922
+ rules still apply.
923
+ - **Retry:** `/permissions` lists classifier blocks. `/permissions retry <n>` lets that exact call
924
+ run once, unjudged, when the model tries it again.
925
+ - **Turning it on and off:**
926
+ - `--permission-mode auto`, `/mode auto` or `/permissions auto`.
927
+ - An organization turns it off with `disableAutoMode` in the org policy.
928
+ - **New contracts:**
929
+ - `TPermissionMode` gains `'auto'`.
930
+ - `allowRulesForAutoMode` and `isBroadExecutionAllowRule`.
931
+ - `IPermissionClassifier` and `AutoModeGate`.
932
+ - The `permissionClassifier` session option.
933
+ - `Session.retryPermissionDenial`, and `retryDenial` on the permission-mode adapter.
934
+ - The `'classifier'` denial reason.
935
+ - `createModelPermissionClassifier`.
936
+ - The `disableAutoMode` option on `createSession` and `IOrgPolicy`.
937
+
938
+ - 722e88a: Shell commands can run in an OS-level sandbox: bubblewrap on Linux and WSL2, Seatbelt on macOS.
939
+
940
+ - **Confinement:** covers the command and every process it starts.
941
+ - Writes are limited to the working directory, the temporary directories and
942
+ `sandbox.filesystem.allowWrite`.
943
+ - Agent, git-hook, MCP and shell configuration inside the workspace stays read-only.
944
+ - `sandbox.filesystem.denyRead` hides paths from the command.
945
+ - The network is on or off (`sandbox.network.enabled`).
946
+ - **Modes:** `/sandbox` switches between `auto-allow`, `regular` and `off` for the next command and
947
+ saves the choice.
948
+ - In `auto-allow` (`sandbox.autoAllowBashIfSandboxed`), a confined command runs without a prompt
949
+ in `default` and `acceptEdits`.
950
+ - Deny rules, ask rules, critical removals and plan mode still apply first.
951
+ - **Exclusions:** `sandbox.excludedCommands` run unconfined, through the ordinary permission path.
952
+ - **When the sandbox cannot run:** a missing or unusable backend is reported at startup, in
953
+ `robota doctor` and in `/sandbox`, and commands then run unconfined.
954
+ `sandbox.failIfUnavailable` refuses to start instead.
955
+ - **New contracts:**
956
+ - `OsSandboxClient`, `detectOsSandbox`, `bubblewrapArguments`, `seatbeltProfile`.
957
+ - `ISandboxClient.wrapCommand` and `autoApproves`.
958
+ - `IPermissionEvaluationContext.sandboxAutoApproved`.
959
+ - The `commandSandbox` session option.
960
+ - The `sandbox` settings key and the `sandbox` command host adapter.
961
+
962
+ - a5cc36e: `/permissions` shows the rules the session enforces and the calls it refused.
963
+
964
+ - **Rules by source:** each allow, deny and ask rule the gate reads is listed under the settings file
965
+ that declares it. Rules added by a CLI flag, a preset or a command are listed under "this session".
966
+ A rule a settings file declares but the session does not enforce is not shown.
967
+ - **Recent denials:** the latest refused calls, most recent first, with the reason: a rule or the
968
+ mode, the user declining, or no one available to approve.
969
+ - New contracts: `Session.getRecentPermissionDenials()`, `PermissionEnforcer.getRecentDenials()`,
970
+ `IPermissionDenial`, the `permissionRules` host adapter (`createSettingsPermissionRulesAdapter`),
971
+ and `getPermissionRules` / `listRecentDenials` on `ICommandPermissionModeAdapter`. Settings
972
+ provenance now covers `permissions.ask`.
973
+
974
+ - 4dd45cc: `/peers` shows how each other local session's workspace relates to this one's: `same worktree`,
975
+ `same repo`, `different repo`, or `workspace unknown`.
976
+
977
+ A session now publishes a workspace claim with its rendezvous entry — the root commits reachable
978
+ from HEAD, a SHA-256 of its normalized `origin` URL (never the URL itself), and the real path of its
979
+ worktree — and re-reads it as it runs, so a first commit or a checkout does not leave it stale. The
980
+ reader does not take the claim as written: it reads git at the claimed path itself, and a claim whose
981
+ contents disagree is shown as `workspace claim mismatched, not believed` and relates to nothing. Those
982
+ git reads are local-only and asynchronous, run only for the view that shows the relation (and for
983
+ the sender of an incoming peer message), and are cached per announcement. The relation also reaches
984
+ the peer-turn origin, computed by the receiver; a relation the sender put on the wire is discarded,
985
+ and the admission never carries it.
986
+
987
+ The relation is display and routing information only and is never an authorization input.
988
+
989
+ Additive: `agent-interface-session-mobility` exports `TWorkspaceRelation` and gains the optional
990
+ `IPeerOrigin.workspaceRelation`; `agent-framework`'s `ILocalPeerSummary` gains the optional
991
+ `workspaceRelation` and `workspaceClaim`, and `ICommandLocalPeersAdapter` the optional
992
+ `listWithWorkspace()`.
993
+
994
+ - 2d3b2c0: ARCH-024 replaces framework knowledge of command-owner ids with optional, owner-declared semantic
995
+ roles. `ISystemCommand` can declare `skillActivation`, `contextReduction`, or `subagentSpawn`;
996
+ `SystemCommandExecutor` exposes the selected role projection and rejects duplicate owners with the
997
+ typed `DuplicateSystemCommandSemanticRoleError`, atomically across construction, registration, and
998
+ replacement.
999
+
1000
+ This is a beta-line breaking contract correction: unannotated commands named `skills`, `compact`, or
1001
+ `agent` no longer receive special framework behavior. `@robota-sdk/agent-command` now declares the
1002
+ roles on its shipped skills, compact, and agent commands.
1003
+
1004
+ - 1e3f91a: CMD-004 Phase 2 Stage E (breaking, beta line): the legacy `TCommandEffect` union and
1005
+ `ICommandResult.effects` are DELETED. Commands emit the split contract directly —
1006
+ `hostActions` (session-executed via `ICommandHostAdapters`; works headless and remote) and
1007
+ `uiIntents` (requester-routed `ui_intent` session events with UI-neutral `show-*` names).
1008
+ Final carriers for the former notification effects: `session_renamed` and the new
1009
+ `history_cleared` are BROADCAST session events (forwarded to every WS surface, folded by the
1010
+ TUI transcript/title and the GUI reducer's new `sessionName`/transcript-reset state);
1011
+ `session-execution-started` rides `result.data.sessionExecution`; the plugin-registry refresh
1012
+ rides `result.data.pluginRegistryReloaded`. A mechanical grep floor
1013
+ (`command-effect-grep-floor.test.ts`) keeps `tui-requested`/`TCommandEffect`/`effects:` out of
1014
+ every `packages/*/src` production tree.
1015
+ - 44393be: Add the `/remote-control` enable path (REMOTE-008 Stage B4-2b) — turn on P2P remote control locally, get
1016
+ a QR + link, and a paired device co-drives the SAME live session over pairing-gated WebRTC. The command
1017
+ is a declarative trigger returning `remote-control-enable-requested`/`-stop-requested` effects (SSOT
1018
+ agent-interface-transport) and reads state via a new `ICommandHostAdapters.remoteControl.getStatus()`;
1019
+ the TUI dispatches the effects to injected callbacks; all transport construction lives at the agent-cli
1020
+ composition root (`WsSignalingClient` + pairing-gated `WebRtcTransport`, relay URL from
1021
+ `transports.webrtc.options.relayUrl`, QR/link rendered into history). Fail-closed: no relay configured ⇒
1022
+ does nothing; pairing mismatch/timeout ⇒ the session is never exposed. Consumes REMOTE-007 so a paired
1023
+ remote owner answers their own permission/ask prompts over the WebRTC channel.
1024
+ - cbee54e: Surface unmatched preset command-module names instead of silently dropping them (INFRA-032). A preset `enabledCommandModules`/`disabledCommandModules` entry that matches no built command module — a short form like `"editor"` instead of `agent-command-editor`, or a typo — is now reported as a non-fatal notice on both the startup `--preset` path (CLI terminal) and the in-session `/preset` path (command result). Detection lives once in agent-framework's new pure `findUnknownModuleNames`, and agent-command's duplicate module filter now delegates to the framework's `selectCommandModules`; `createDefaultCommandModules` returns `{ modules, unknownModuleNames }`.
1025
+
1026
+ ### Patch Changes
1027
+
1028
+ - b462ee7: Discriminate `IBackgroundTaskState` by kind, the same way `TBackgroundTaskRequest` and (as of the
1029
+ prior change) `TBackgroundTaskResult` already are. Fields only one runner ever produces now live
1030
+ only on that kind's member instead of being optional-and-cross-kind-reachable on every kind:
1031
+
1032
+ - `agent`-only: `agentType`, `isolation`, `resumeSessionId`, `promptPreview`, and the
1033
+ worktree-isolation fields (`worktreePath`, `branchName`, `worktreeStatus`, `worktreeNextAction`,
1034
+ `worktreeBaseRevision`, `parentWorktreeStatus`).
1035
+ - `scheduled`-only: `schedule`, `nextFireAt`.
1036
+ - Every kind except `agent`: `commandPreview` (a process command, an MCP tool-invocation summary, or
1037
+ a schedule's shell command / wake instruction).
1038
+ - `state.result` is now `IBackgroundTaskResult<K>` — correlated with `state.kind`, not the free
1039
+ full-result union.
1040
+
1041
+ `pid`, `logPath`, and `transcriptPath` stay on the shared base rather than becoming agent- or
1042
+ process-exclusive: the runner handle SPI already reports them for whichever runner's process
1043
+ happens to produce them, and a subagent run via the worktree/child-process runner carries a `pid`
1044
+ exactly as a `process`-kind task does. `timeoutReason` also stays base — session restore sets
1045
+ `'stale_worker'` on any non-terminal, non-rearmable task regardless of kind, not only agent ones.
1046
+
1047
+ `IBackgroundTaskState<K>` narrows to the kind-specific member; called with no type argument it is
1048
+ still the full union. The session-record decoder (`agent-session`) now rejects a persisted task
1049
+ state carrying a field outside its own kind as corrupt, reported at that field's own path, the same
1050
+ way it already rejects a `state.result` whose kind disagrees with `state.kind`.
1051
+
1052
+ **Breaking for `@robota-sdk/agent-interface-execution` and `@robota-sdk/agent-executor`**: code that
1053
+ read a kind-specific field (e.g. `state.agentType`, `state.schedule`, `state.commandPreview`) off an
1054
+ unnarrowed `IBackgroundTaskState` needs to narrow on `state.kind` first, since the fallback default
1055
+ no longer carries every field on every kind. `agent-session`, `agent-framework`, and `agent-command`
1056
+ land the corresponding narrowing at every read site the type change touched; no runtime behavior
1057
+ changes there beyond the state decoder's new corruption checks.
1058
+
1059
+ - 3a8876b: ARCH-029: decompose the command host into role ports
1060
+
1061
+ `ICommandHostContext`, `ICommandSessionRuntime` and `IAgentJobHostContext` are now empty `extends`
1062
+ aggregates over 26 named role ports, so a command declares only the capability it uses. A role port
1063
+ is a supertype of the aggregate, so narrowing a declared parameter still satisfies
1064
+ `ISystemCommand.execute` by contravariance.
1065
+
1066
+ All 79 members are preserved (46 + 18 + 15) with the declaration kind unchanged, so implementors and
1067
+ callers stay source-compatible.
1068
+
1069
+ **Breaking:** every role-port member is now required except the adapter bag, whose contents are
1070
+ genuinely variational. 38 members went from optional to required. A host that previously omitted a
1071
+ member must now provide one — including `validateCurrentSessionReplayLog`, which was an override
1072
+ with a framework-computed default and no implementor. `createTestCommandHost`,
1073
+ `createTestAgentJobHost` and `createTestSessionRuntime` are published from
1074
+ `@robota-sdk/agent-framework/testing` as conformant, cast-free doubles for exactly this.
1075
+
1076
+ Also removed: the `clearConversationHistory` fallback that reached past the host into
1077
+ `getSession().clearHistory()`. Those were never the same operation — the host path also broadcasts
1078
+ `history_cleared` to every attached surface, so a fallback clear left other surfaces still showing
1079
+ the transcript.
1080
+
1081
+ - 4f3c075: Assemble complete, verified package generations before switching build output; preserve the previous generation on build failure and pack only verified regular-file images. Include copied CLI web assets in affected-build ordering and artifact transfer. Preserve the CLI version in managed build paths. Public runtime contracts remain compatible (patch).
1082
+ - d6b9404: Remove polynomial-ReDoS backtracking (SEC-003, CodeQL `js/polynomial-redos`) from three parsers whose input is not repo-controlled.
1083
+
1084
+ `parseStructuredResponseText` (agent-core) parses raw model output; its fenced-code-block regex used `\s*\n`, and because `\s` also matches a newline the two overlapped, so an unterminated fence containing many blank lines was rejected in O(n^2) — 12.7s for a 400 KB string, now ~1ms. The whitespace run is now restricted to horizontal whitespace, which makes the newline split point unique.
1085
+
1086
+ `/schedule cron` and `/monitor` (agent-command) are declared `modelInvocable: true`, so their argument string is composed by the model. Both matched the trailing instruction with `\s+(.+)$`; since `.` also matches a space the split point was ambiguous and a non-matching argument cost O(n^2) — ~15s for a 200 KB argument, now <1ms. The instruction is now required to start with a non-space character, which pins the split point without changing which inputs are accepted.
1087
+
1088
+ No behaviour change: the set of accepted inputs and the parsed values are identical in every case.
1089
+
1090
+ - Updated dependencies [9c19c50]
1091
+ - Updated dependencies [7b6234c]
1092
+ - Updated dependencies [5307f8a]
1093
+ - Updated dependencies [b462ee7]
1094
+ - Updated dependencies [08a9bd6]
1095
+ - Updated dependencies [37b4bd7]
1096
+ - Updated dependencies [818f0c8]
1097
+ - Updated dependencies [4eea54b]
1098
+ - Updated dependencies [1698be4]
1099
+ - Updated dependencies [9368d00]
1100
+ - Updated dependencies [d4189b9]
1101
+ - Updated dependencies [9edae52]
1102
+ - Updated dependencies [4078a72]
1103
+ - Updated dependencies [4c73a0b]
1104
+ - Updated dependencies [af2f2ad]
1105
+ - Updated dependencies [267af5f]
1106
+ - Updated dependencies [196a900]
1107
+ - Updated dependencies [f336838]
1108
+ - Updated dependencies [34e50f0]
1109
+ - Updated dependencies [722e88a]
1110
+ - Updated dependencies [a5cc36e]
1111
+ - Updated dependencies [d23c848]
1112
+ - Updated dependencies [b70fa3d]
1113
+ - Updated dependencies [2711ec6]
1114
+ - Updated dependencies [4dd45cc]
1115
+ - Updated dependencies [378c585]
1116
+ - Updated dependencies [4c5148e]
1117
+ - Updated dependencies [37af5dc]
1118
+ - Updated dependencies [807d161]
1119
+ - Updated dependencies [fec722f]
1120
+ - Updated dependencies [e82215f]
1121
+ - Updated dependencies [52b7346]
1122
+ - Updated dependencies [2ebff01]
1123
+ - Updated dependencies [2ebff01]
1124
+ - Updated dependencies [2d3b2c0]
1125
+ - Updated dependencies [b078afa]
1126
+ - Updated dependencies [2d3b2c0]
1127
+ - Updated dependencies [baa6863]
1128
+ - Updated dependencies [2d3b2c0]
1129
+ - Updated dependencies [3a8876b]
1130
+ - Updated dependencies [4772067]
1131
+ - Updated dependencies [7b85767]
1132
+ - Updated dependencies [0f98419]
1133
+ - Updated dependencies [64ba748]
1134
+ - Updated dependencies [9fbab1b]
1135
+ - Updated dependencies [d312755]
1136
+ - Updated dependencies [a009f5b]
1137
+ - Updated dependencies [1e3f91a]
1138
+ - Updated dependencies [4f3c075]
1139
+ - Updated dependencies [475e085]
1140
+ - Updated dependencies [e477440]
1141
+ - Updated dependencies [9dcb5da]
1142
+ - Updated dependencies [a95ca85]
1143
+ - Updated dependencies [b6d14ce]
1144
+ - Updated dependencies [0382a51]
1145
+ - Updated dependencies [93d061d]
1146
+ - Updated dependencies [39554a1]
1147
+ - Updated dependencies [d28430a]
1148
+ - Updated dependencies [bed26ea]
1149
+ - Updated dependencies [fe48835]
1150
+ - Updated dependencies [1e40b5b]
1151
+ - Updated dependencies [4b76cfa]
1152
+ - Updated dependencies [d9bd9ec]
1153
+ - Updated dependencies [8865acf]
1154
+ - Updated dependencies [90e7a10]
1155
+ - Updated dependencies [fcb0da3]
1156
+ - Updated dependencies [07b627f]
1157
+ - Updated dependencies [d0de5b2]
1158
+ - Updated dependencies [9665c6e]
1159
+ - Updated dependencies [44393be]
1160
+ - Updated dependencies [c7fa299]
1161
+ - Updated dependencies [5134b3b]
1162
+ - Updated dependencies [dd444c1]
1163
+ - Updated dependencies [1f57e7f]
1164
+ - Updated dependencies [833afe1]
1165
+ - Updated dependencies [d6b9404]
1166
+ - Updated dependencies [7863b16]
1167
+ - Updated dependencies [fde558e]
1168
+ - Updated dependencies [db5c439]
1169
+ - Updated dependencies [4a01a87]
1170
+ - Updated dependencies [cbee54e]
1171
+ - Updated dependencies [9814afc]
1172
+ - Updated dependencies [242a644]
1173
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.80
1174
+ - @robota-sdk/agent-interface-command@3.0.0-beta.80
1175
+ - @robota-sdk/agent-framework@3.0.0-beta.80
1176
+ - @robota-sdk/agent-core@3.0.0-beta.80
1177
+ - @robota-sdk/agent-interface-session@3.0.0-beta.80
1178
+ - @robota-sdk/agent-preset@3.0.0-beta.80
1179
+
1180
+ ## 3.0.0-beta.79
1181
+
1182
+ ### Patch Changes
1183
+
1184
+ - @robota-sdk/agent-core@3.0.0-beta.79
1185
+ - @robota-sdk/agent-framework@3.0.0-beta.79
1186
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.79
1187
+ - @robota-sdk/agent-preset@3.0.0-beta.79
1188
+
1189
+ ## 3.0.0-beta.78
1190
+
1191
+ ### Patch Changes
1192
+
1193
+ - Updated dependencies [6f308d1]
1194
+ - @robota-sdk/agent-core@3.0.0-beta.78
1195
+ - @robota-sdk/agent-framework@3.0.0-beta.78
1196
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.78
1197
+ - @robota-sdk/agent-preset@3.0.0-beta.78
1198
+
1199
+ ## 3.0.0-beta.77
1200
+
1201
+ ### Patch Changes
1202
+
1203
+ - Updated dependencies
1204
+ - @robota-sdk/agent-core@3.0.0-beta.77
1205
+ - @robota-sdk/agent-framework@3.0.0-beta.77
1206
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.77
1207
+ - @robota-sdk/agent-preset@3.0.0-beta.77
1208
+
1209
+ ## 3.0.0-beta.76
1210
+
1211
+ ### Patch Changes
1212
+
1213
+ - DQ-AUDIT-002 — consolidate duplicated domain data onto single owners: one model-pricing SSOT in agent-core (`MODEL_PRICES`/`lookupModelPrice`/`calculateModelCost`/`estimateBlendedCostPer1000`) consumed by agent-command and agent-plugin (drops two embedded/stale price tables); the `len/4` token estimator replaced by core `CONTEXT_ESTIMATE_CHARS_PER_TOKEN`; TUI `TContextState` derived from core `IContextWindowState`; dead pass-through re-exports removed from agent-session.
1214
+ - 576af62: Fix `ConfigurationError: Agent must be fully initialized before changing model configuration` when running `/preset` (or any live model re-apply) on a fresh interactive session before the first message. The Robota agent initialized lazily on the first `run()`, but `setModel` requires full initialization. `Session.applyModelOptions` now awaits the new idempotent `Robota.ensureReady()` before `setModel`, and the preset live-switch path (`applyPresetToSession` → `executePresetCommand`) is async end-to-end. Adds a real cold-session regression test (no mocked Robota).
1215
+ - Updated dependencies
1216
+ - Updated dependencies [c0a6287]
1217
+ - Updated dependencies [9df3a88]
1218
+ - Updated dependencies
1219
+ - Updated dependencies
1220
+ - Updated dependencies [576af62]
1221
+ - @robota-sdk/agent-core@3.0.0-beta.76
1222
+ - @robota-sdk/agent-framework@3.0.0-beta.76
1223
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.76
1224
+ - @robota-sdk/agent-preset@3.0.0-beta.76
1225
+
1226
+ ## 3.0.0-beta.75
1227
+
1228
+ ### Patch Changes
1229
+
1230
+ - Agent preset system + live preset switching + context/history correctness fixes.
1231
+
1232
+ - **Preset system (PRESET-001~017):** new `@robota-sdk/agent-preset` package layering framework
1233
+ assembly options into named, selectable profiles (`default`, `autonomous-builder`, `careful-reviewer`,
1234
+ `neutral-executor`) plus user-authored external presets loaded from `$PRODUCT_USER_STATE_DIR/presets/*.json`.
1235
+ - **Live preset switching:** `/preset` command (list + active marker + switch) and a TUI active-preset
1236
+ display. Switching live re-applies permission posture, model/effort, persona, command-module
1237
+ selection, parallel-subagents gating, and a self-verification system-prompt section via the single
1238
+ `applyPresetToSession` engine.
1239
+ - **CTX-001:** the TUI Context display + session auto-compact now use the accurate provider-based token
1240
+ estimate (system prompt + tool schemas included) instead of a crude history-only char heuristic.
1241
+ - **HIST-001:** conversation history is now append-only — removed the silent 100-message count cap that
1242
+ could drop early context; context size is managed solely by size-based compaction.
1243
+
1244
+ - Updated dependencies
1245
+ - @robota-sdk/agent-preset@3.0.0-beta.75
1246
+ - @robota-sdk/agent-framework@3.0.0-beta.75
1247
+ - @robota-sdk/agent-core@3.0.0-beta.75
1248
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.75
1249
+
1250
+ ## 3.0.0-beta.74
1251
+
1252
+ ### Patch Changes
1253
+
1254
+ - Updated dependencies
1255
+ - @robota-sdk/agent-framework@3.0.0-beta.74
1256
+ - @robota-sdk/agent-core@3.0.0-beta.74
1257
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.74
1258
+
1259
+ ## 3.0.0-beta.73
1260
+
1261
+ ### Patch Changes
1262
+
1263
+ - @robota-sdk/agent-core@3.0.0-beta.73
1264
+ - @robota-sdk/agent-framework@3.0.0-beta.73
1265
+
1266
+ ## 3.0.0-beta.72
1267
+
1268
+ ### Patch Changes
1269
+
1270
+ - Updated dependencies
1271
+ - @robota-sdk/agent-framework@3.0.0-beta.72
1272
+ - @robota-sdk/agent-core@3.0.0-beta.72
1273
+
1274
+ ## 3.0.0-beta.71
1275
+
1276
+ ### Patch Changes
1277
+
1278
+ - fix(context): unify token estimation to single SSOT — status bar and /context list now use the same serialized JSON estimate
1279
+ - Updated dependencies
1280
+ - @robota-sdk/agent-core@3.0.0-beta.71
1281
+ - @robota-sdk/agent-framework@3.0.0-beta.71
1282
+
1283
+ ## 3.0.0-beta.70
1284
+
1285
+ ### Patch Changes
1286
+
1287
+ - CLI UX fixes: /context list full LLM context breakdown (CLI-B10), logo resize fix (CLI-B03), token estimates in context list (CLI-B04)
1288
+ - Updated dependencies
1289
+ - @robota-sdk/agent-framework@3.0.0-beta.70
1290
+ - @robota-sdk/agent-core@3.0.0-beta.70
1291
+
1292
+ ## 3.0.0-beta.69
1293
+
1294
+ ### Patch Changes
1295
+
1296
+ - Updated dependencies
1297
+ - @robota-sdk/agent-framework@3.0.0-beta.69
1298
+ - @robota-sdk/agent-core@3.0.0-beta.69
1299
+
1300
+ ## 3.0.0-beta.68
1301
+
1302
+ ### Patch Changes
1303
+
1304
+ - @robota-sdk/agent-core@3.0.0-beta.68
1305
+ - @robota-sdk/agent-framework@3.0.0-beta.68
1306
+
1307
+ ## 3.0.0-beta.67
1308
+
1309
+ ### Patch Changes
1310
+
1311
+ - Updated dependencies
1312
+ - @robota-sdk/agent-framework@3.0.0-beta.67
1313
+ - @robota-sdk/agent-core@3.0.0-beta.67
1314
+
1315
+ ## 3.0.0-beta.66
1316
+
1317
+ ### Patch Changes
1318
+
1319
+ - refactor: CLI-001/002 — agent-cli layer separation and monorepo-wide readability lint rules
1320
+ - CLI-001: Extract startup phases into focused modules; enforce agent-cli layer separation
1321
+ - CLI-002: Apply import/order, consistent-type-imports, explicit-function-return-type, prefer-const, object-shorthand across all packages
1322
+ - Fix stale child-process-subagent-worker entry in agent-cli tsdown.config.ts (build fix)
1323
+
1324
+ - Updated dependencies
1325
+ - @robota-sdk/agent-framework@3.0.0-beta.66
1326
+ - @robota-sdk/agent-core@3.0.0-beta.66
1327
+
1328
+ ## 3.0.0-beta.65
1329
+
1330
+ ### Patch Changes
1331
+
1332
+ - @robota-sdk/agent-core@3.0.0-beta.65
1333
+ - @robota-sdk/agent-framework@3.0.0-beta.65
1334
+
1335
+ ## 3.0.0-beta.64
1336
+
1337
+ ### Minor Changes
1338
+
1339
+ - feat: add displayName and requiresPermission to command interfaces
1340
+ - `ICommand`, `ISystemCommand`, `ICommandListEntry`: add optional `displayName` field for user-friendly labels
1341
+ - `ISystemCommand`: add optional `requiresPermission` field for per-command permission policy declaration
1342
+ - `SystemCommandExecutor`: add `resolveRequiresPermission()` — derives from `safety` when field is undefined
1343
+ - All 24 built-in commands declare explicit `displayName` and `requiresPermission`
1344
+ - TUI autocomplete renders `displayName ?? name`; Tab completion still inserts the technical command ID
1345
+ - `/help` output shows `Display Name (/command-id)` format
1346
+
1347
+ ### Patch Changes
1348
+
1349
+ - Updated dependencies
1350
+ - @robota-sdk/agent-framework@3.0.0-beta.64
1351
+ - @robota-sdk/agent-core@3.0.0-beta.64