brass-runtime 1.16.0 → 1.16.1

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 (210) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +283 -18
  3. package/dist/agent/cli/main.cjs +38 -38
  4. package/dist/agent/cli/main.js +6 -6
  5. package/dist/agent/cli/main.mjs +6 -6
  6. package/dist/agent/index.cjs +7 -7
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +6 -6
  9. package/dist/agent/index.mjs +6 -6
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3Y2RIUMM.js +300 -0
  15. package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
  16. package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
  17. package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
  18. package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
  19. package/dist/chunk-5QC7LRZ3.js +229 -0
  20. package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
  21. package/dist/chunk-62AZW6UT.cjs +313 -0
  22. package/dist/chunk-6IXXWIUM.js +683 -0
  23. package/dist/chunk-74ZTY6CP.js +2871 -0
  24. package/dist/chunk-76YMRMH2.cjs +777 -0
  25. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  26. package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
  27. package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
  28. package/dist/chunk-AGR5B2BC.cjs +683 -0
  29. package/dist/chunk-AVNQLJ5V.js +777 -0
  30. package/dist/chunk-B33ICAKP.js +313 -0
  31. package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
  32. package/dist/chunk-BABBZK4Y.js +2024 -0
  33. package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
  34. package/dist/{chunk-F5EUMJL7.mjs → chunk-CIZFIMK5.js} +55 -5
  35. package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
  36. package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
  37. package/dist/chunk-DNFO2EIZ.mjs +777 -0
  38. package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
  39. package/dist/{chunk-JNFRRJYH.cjs → chunk-ENKODRU3.cjs} +242 -192
  40. package/dist/chunk-EOC4UHBS.mjs +229 -0
  41. package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
  42. package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
  43. package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
  44. package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
  45. package/dist/chunk-HLWLMW2F.mjs +2024 -0
  46. package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
  47. package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
  48. package/dist/chunk-KN32XNTH.mjs +313 -0
  49. package/dist/chunk-KQLYONSE.cjs +2871 -0
  50. package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
  51. package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
  52. package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
  53. package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
  54. package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
  55. package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
  56. package/dist/{chunk-7XOPAB5Q.js → chunk-MT3OWDPC.mjs} +55 -5
  57. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  58. package/dist/chunk-PD4EJTQC.cjs +229 -0
  59. package/dist/chunk-PWC3RBQE.mjs +300 -0
  60. package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
  61. package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
  62. package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
  63. package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
  64. package/dist/chunk-UB4B6OFY.js +370 -0
  65. package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
  66. package/dist/chunk-VN44DYYT.cjs +2024 -0
  67. package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
  68. package/dist/core/index.cjs +135 -9
  69. package/dist/core/index.d.ts +238 -33
  70. package/dist/core/index.js +155 -29
  71. package/dist/core/index.mjs +155 -29
  72. package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
  73. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  74. package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
  75. package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
  76. package/dist/http/index.cjs +324 -2986
  77. package/dist/http/index.d.ts +54 -68
  78. package/dist/http/index.js +238 -2900
  79. package/dist/http/index.mjs +238 -2900
  80. package/dist/http/testing.cjs +14 -12
  81. package/dist/http/testing.d.ts +5 -4
  82. package/dist/http/testing.js +10 -8
  83. package/dist/http/testing.mjs +10 -8
  84. package/dist/index.cjs +423 -255
  85. package/dist/index.d.ts +87 -69
  86. package/dist/index.js +301 -133
  87. package/dist/index.mjs +301 -133
  88. package/dist/observability/index.cjs +16 -531
  89. package/dist/observability/index.d.ts +81 -8
  90. package/dist/observability/index.js +23 -538
  91. package/dist/observability/index.mjs +23 -538
  92. package/dist/perf/cli.cjs +401 -0
  93. package/dist/perf/cli.d.ts +1 -0
  94. package/dist/perf/cli.js +401 -0
  95. package/dist/perf/cli.mjs +401 -0
  96. package/dist/perf/index.cjs +141 -0
  97. package/dist/perf/index.d.ts +483 -0
  98. package/dist/perf/index.js +141 -0
  99. package/dist/perf/index.mjs +141 -0
  100. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  101. package/dist/schema/index.cjs +6 -2
  102. package/dist/schema/index.d.ts +3 -1
  103. package/dist/schema/index.js +5 -1
  104. package/dist/schema/index.mjs +5 -1
  105. package/dist/{server-C8hDXA74.d.ts → server-GJPg8ZSG.d.ts} +4 -3
  106. package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  107. package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
  108. package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
  109. package/docs/ARCHITECTURE.md +292 -0
  110. package/docs/README.md +63 -0
  111. package/docs/adr/0001-ai-context-pack.md +32 -0
  112. package/docs/agent-apply-mode.md +104 -0
  113. package/docs/agent-approvals.md +110 -0
  114. package/docs/agent-batch.md +185 -0
  115. package/docs/agent-boundaries.md +112 -0
  116. package/docs/agent-chat-sessions.md +160 -0
  117. package/docs/agent-ci.md +17 -0
  118. package/docs/agent-cli.md +405 -0
  119. package/docs/agent-config.md +480 -0
  120. package/docs/agent-context-discovery.md +159 -0
  121. package/docs/agent-copilot-like-dx.md +126 -0
  122. package/docs/agent-declarative-optimized-planning.md +138 -0
  123. package/docs/agent-dx.md +224 -0
  124. package/docs/agent-env-files.md +126 -0
  125. package/docs/agent-follow-up-context.md +43 -0
  126. package/docs/agent-global-usage.md +180 -0
  127. package/docs/agent-init.md +109 -0
  128. package/docs/agent-install-and-configure.md +516 -0
  129. package/docs/agent-language-workspace-ux.md +99 -0
  130. package/docs/agent-llm-adapters.md +123 -0
  131. package/docs/agent-local-install.md +190 -0
  132. package/docs/agent-local-tests.md +51 -0
  133. package/docs/agent-observability.md +155 -0
  134. package/docs/agent-patch-quality-loop.md +162 -0
  135. package/docs/agent-presets.md +22 -0
  136. package/docs/agent-project-commands.md +237 -0
  137. package/docs/agent-project-intelligence.md +156 -0
  138. package/docs/agent-redaction.md +18 -0
  139. package/docs/agent-release-readiness.md +76 -0
  140. package/docs/agent-rollback-safety.md +162 -0
  141. package/docs/agent-rollback.md +23 -0
  142. package/docs/agent-run-artifacts.md +16 -0
  143. package/docs/agent-vscode-auto-discovery.md +137 -0
  144. package/docs/agent-vscode-batch-runner.md +100 -0
  145. package/docs/agent-vscode-chat-layout.md +90 -0
  146. package/docs/agent-vscode-clean-install.md +147 -0
  147. package/docs/agent-vscode-code-actions.md +70 -0
  148. package/docs/agent-vscode-diff-preview.md +45 -0
  149. package/docs/agent-vscode-inline-assist.md +56 -0
  150. package/docs/agent-vscode-install.md +186 -0
  151. package/docs/agent-vscode-model-setup.md +97 -0
  152. package/docs/agent-vscode-patch-preview.md +92 -0
  153. package/docs/agent-vscode-problems.md +79 -0
  154. package/docs/agent-vscode-project-dashboard.md +106 -0
  155. package/docs/agent-vscode-run-history.md +92 -0
  156. package/docs/agent-vscode-ux.md +73 -0
  157. package/docs/ai/INVARIANTS.md +84 -0
  158. package/docs/ai/PROJECT_MAP.md +338 -0
  159. package/docs/ai/PUBLIC_API.md +336 -0
  160. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  161. package/docs/api-polish.md +37 -0
  162. package/docs/cancellation.md +162 -0
  163. package/docs/coverage.md +46 -0
  164. package/docs/getting-started.md +159 -0
  165. package/docs/guides/README.md +40 -0
  166. package/docs/guides/circuit-breaker.md +89 -0
  167. package/docs/guides/error-handling.md +91 -0
  168. package/docs/guides/getting-started.md +107 -0
  169. package/docs/guides/layers.md +189 -0
  170. package/docs/guides/metrics.md +101 -0
  171. package/docs/guides/resource-management.md +141 -0
  172. package/docs/guides/retry.md +215 -0
  173. package/docs/guides/semaphore.md +66 -0
  174. package/docs/guides/streams.md +117 -0
  175. package/docs/guides/supervisors.md +98 -0
  176. package/docs/guides/testing.md +162 -0
  177. package/docs/guides/tracing.md +71 -0
  178. package/docs/http-recipes.md +399 -0
  179. package/docs/http.md +749 -0
  180. package/docs/modules.md +285 -0
  181. package/docs/observability-collector-smoke.md +31 -0
  182. package/docs/observability-framework-examples.md +98 -0
  183. package/docs/observability.md +542 -0
  184. package/docs/otel-collector-smoke.yaml +27 -0
  185. package/docs/performance-profiler.md +199 -0
  186. package/docs/production-readiness.md +73 -0
  187. package/docs/recipes/README.md +12 -0
  188. package/docs/recipes/http-server.md +45 -0
  189. package/docs/recipes/layers.md +44 -0
  190. package/docs/recipes/performance.md +47 -0
  191. package/docs/recipes/runtime.md +41 -0
  192. package/docs/recipes/testing.md +41 -0
  193. package/docs/release.md +53 -0
  194. package/docs/wasm-bounded-queues.md +44 -0
  195. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  196. package/docs/wasm-fiber-engine.md +117 -0
  197. package/docs/wasm-scheduler-state-machine.md +122 -0
  198. package/docs/wasm-stream-chunks.md +54 -0
  199. package/package.json +22 -2
  200. package/dist/chunk-45F7OKGT.cjs +0 -104
  201. package/dist/chunk-7V4KY4RL.mjs +0 -104
  202. package/dist/chunk-DJQ7OMMB.cjs +0 -144
  203. package/dist/chunk-GOV47PPB.mjs +0 -552
  204. package/dist/chunk-JF4XXPZ5.cjs +0 -552
  205. package/dist/chunk-KCPT2D6G.js +0 -552
  206. package/dist/chunk-NOYZIMUJ.mjs +0 -144
  207. package/dist/chunk-PNVFW245.js +0 -144
  208. package/dist/chunk-ROJC3NBJ.js +0 -104
  209. package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
  210. package/dist/schedule-Fque9Abz.d.ts +0 -70
@@ -0,0 +1,185 @@
1
+ # Agent batch runs
2
+
3
+ P21 adds sequential batch execution to `brass-agent`.
4
+
5
+ The goal is to make common DX/CI workflows composable without introducing a new
6
+ scheduler or breaking the existing boundary:
7
+
8
+ ```txt
9
+ src/core
10
+
11
+ src/agent runAgent(...)
12
+
13
+ brass-agent CLI batch runner
14
+ ```
15
+
16
+ A batch run is just multiple normal agent runs executed one after another. Each
17
+ run still goes through the same pipeline:
18
+
19
+ ```txt
20
+ AgentAction
21
+ -> PermissionService
22
+ -> ApprovalService when ask
23
+ -> ToolPolicy timeout/retry
24
+ -> Async tool effect
25
+ -> Observation
26
+ ```
27
+
28
+ Batch mode does not bypass policy, approvals, redaction, rollback safety, CI exit
29
+ codes, or artifact export.
30
+
31
+ ## CLI
32
+
33
+ Run a batch from a file:
34
+
35
+ ```bash
36
+ brass-agent --batch-file ./brass-agent.batch.json
37
+ ```
38
+
39
+ In CI:
40
+
41
+ ```bash
42
+ brass-agent --batch-file ./brass-agent.batch.json --ci --batch-stop-on-failure
43
+ ```
44
+
45
+ `--batch-stop-on-failure` stops after the first run whose CI status is non-zero.
46
+ `--batch-continue-on-failure` forces the opposite.
47
+
48
+ When neither flag is provided, the default is:
49
+
50
+ ```txt
51
+ --ci -> stop on failure
52
+ not --ci -> continue
53
+ ```
54
+
55
+ ## Batch file formats
56
+
57
+ ### JSON array
58
+
59
+ ```json
60
+ [
61
+ "inspect this workspace",
62
+ { "preset": "typecheck" },
63
+ { "preset": "lint" },
64
+ { "preset": "fix-tests", "mode": "propose" }
65
+ ]
66
+ ```
67
+
68
+ ### JSON object
69
+
70
+ ```json
71
+ {
72
+ "goals": [
73
+ { "preset": "inspect" },
74
+ { "goal": "explain the failing tests", "mode": "read-only" },
75
+ { "goal": "fix the failing tests", "mode": "propose" }
76
+ ]
77
+ }
78
+ ```
79
+
80
+ ### Plain text
81
+
82
+ If the file is not valid JSON, `brass-agent` treats it as a line-based goal file.
83
+ Blank lines and `#` comments are ignored.
84
+
85
+ ```txt
86
+ # brass-agent.batch.txt
87
+ inspect this workspace
88
+ run typecheck discovery and explain failures
89
+ fix the failing tests
90
+ ```
91
+
92
+ ## Per-goal fields
93
+
94
+ JSON batch items support:
95
+
96
+ ```ts
97
+ {
98
+ goal?: string;
99
+ preset?: "fix-tests" | "inspect" | "typecheck" | "lint";
100
+ mode?: "read-only" | "propose" | "write" | "autonomous";
101
+ cwd?: string;
102
+ patchFile?: string;
103
+ patchFileMode?: "apply" | "rollback";
104
+ saveRunDir?: string;
105
+ }
106
+ ```
107
+
108
+ `preset` fills in a standard goal. `goal` wins when both are present.
109
+
110
+ `cwd` lets one batch file target multiple workspaces, but the same loaded config
111
+ and CLI environment are reused for the full batch. Use separate invocations when
112
+ different workspaces need different config files.
113
+
114
+ ## Config default batch
115
+
116
+ A project can define a default batch:
117
+
118
+ ```json
119
+ {
120
+ "batch": {
121
+ "stopOnFailure": true,
122
+ "goals": [
123
+ { "preset": "inspect" },
124
+ { "preset": "typecheck" },
125
+ { "preset": "lint" }
126
+ ]
127
+ }
128
+ }
129
+ ```
130
+
131
+ Then run:
132
+
133
+ ```bash
134
+ brass-agent --ci
135
+ ```
136
+
137
+ The config batch is used only when the CLI does not receive an explicit goal,
138
+ `--preset`, `--patch-file`, or `--batch-file`.
139
+
140
+ ## Outputs
141
+
142
+ Human output prints each normal run and then a final batch summary:
143
+
144
+ ```txt
145
+ batch summary:
146
+ completed: 3/3
147
+ failed: 0
148
+ exit code: 0
149
+ ```
150
+
151
+ `--json` prints a batch object:
152
+
153
+ ```json
154
+ {
155
+ "type": "batch",
156
+ "summary": {
157
+ "total": 3,
158
+ "completed": 3,
159
+ "failed": 0,
160
+ "exitCode": 0,
161
+ "stoppedEarly": false
162
+ },
163
+ "results": []
164
+ }
165
+ ```
166
+
167
+ `--protocol-json` emits normal event messages and a `final-state` message per
168
+ run, followed by a `batch-summary` message.
169
+
170
+ ## Exit codes
171
+
172
+ In `--ci` mode, batch exit code is aggregated from individual runs:
173
+
174
+ ```txt
175
+ 1 if any run failed or latest validation failed
176
+ 2 if no run failed but at least one run proposed an unapplied patch with --fail-on-patch-proposed
177
+ 0 otherwise
178
+ ```
179
+
180
+ ## VS Code
181
+
182
+ P22 adds a VS Code command, `Brass Agent: Run Batch File`, which invokes the CLI
183
+ with `--protocol-json --batch-file`. The extension stores the batch as a parent
184
+ history entry and each CLI `final-state` message as a child run. See
185
+ [VS Code batch runner](./agent-vscode-batch-runner.md).
@@ -0,0 +1,112 @@
1
+ # Agent Module Boundaries
2
+
3
+ These rules keep the experimental agent layer useful without letting it leak into the runtime core.
4
+
5
+ ## Dependency direction
6
+
7
+ ```txt
8
+ core runtime
9
+
10
+ agent module
11
+
12
+ cli / UX
13
+ ```
14
+
15
+ Rules:
16
+
17
+ 1. `src/core` must not know that `src/agent` exists.
18
+ 2. `src/agent` may depend on `src/core` runtime primitives.
19
+ 3. Agent-specific shortcuts must not be added to `Runtime`, `Fiber`, `Scope`, or the scheduler.
20
+ 4. If the agent reveals a missing semantic in the core, fix the core as a runtime invariant first.
21
+ 5. Keep the agent as an experimental consumer of the runtime until the shape is stable.
22
+
23
+ ## Agent execution model
24
+
25
+ The agent does not perform side effects directly.
26
+
27
+ It must follow this pipeline:
28
+
29
+ ```txt
30
+ Goal
31
+ -> decideNextAction
32
+ -> PermissionService
33
+ -> ApprovalService when permission decision is ask
34
+ -> ToolPolicy
35
+ -> AgentAction interpreted as Async
36
+ -> Observation
37
+ -> reducer
38
+ -> next AgentState
39
+ ```
40
+
41
+ Rules:
42
+
43
+ 1. The planner produces `AgentAction` values.
44
+ 2. Every `AgentAction` is interpreted into `Async<AgentEnv, AgentError, Observation>`.
45
+ 3. All external work goes through capabilities in `AgentEnv`.
46
+ 4. All tool execution goes through permissions first.
47
+ 5. Approval-required actions must be approved before tool execution.
48
+ 6. All tool execution goes through timeout/retry policy.
49
+ 7. No detached background work by default.
50
+ 8. Every async tool that touches external work must be cancellable.
51
+ 9. Any patch-application path must validate that every target path stays inside the workspace.
52
+
53
+
54
+ ## Configuration boundary
55
+
56
+ Project policy may be loaded from `.brass-agent.json`, but config is still an
57
+ agent-layer concern:
58
+
59
+ ```txt
60
+ src/core
61
+
62
+ src/agent policy/config
63
+
64
+ src/agent/cli Node config loader
65
+ ```
66
+
67
+ Rules:
68
+
69
+ 1. Config loading must not move into `src/core`.
70
+ 2. Config is resolved before constructing `AgentEnv`.
71
+ 3. Config may tune permissions, approvals, LLM provider/model, and tool policies.
72
+ 4. Config must not store secrets; adapters should read API keys from environment variables.
73
+ 5. Config must not bypass the `AgentAction -> PermissionService -> ApprovalService -> ToolPolicy -> Async -> Observation` pipeline.
74
+
75
+ ## Runtime invariants the agent relies on
76
+
77
+ The agent assumes these runtime semantics:
78
+
79
+ 1. `Scope.close()` interrupts child fibers.
80
+ 2. `Scope.closeAsync(...)` can be awaited.
81
+ 3. Closing a parent scope propagates to subscopes.
82
+ 4. Interrupted fibers run their finalizers exactly once.
83
+ 5. `Async` work that registers external IO returns a canceler.
84
+ 6. Race-like operators close their internal scopes and cancel losing branches.
85
+ 7. If a tool cannot be cancelled, it is a bug in the tool adapter.
86
+
87
+ ## Safety defaults
88
+
89
+ Initial agent modes should be conservative:
90
+
91
+ 1. `read-only`: read/search/model only.
92
+ 2. `propose`: read/search/model plus whitelisted read-only commands and patch proposals.
93
+ 3. `write`: may apply patches only after approval.
94
+ 4. `autonomous`: reserved for later; sensitive actions still require approval.
95
+
96
+ The initial CLI should default to `propose`.
97
+
98
+ ## Extraction rule
99
+
100
+ Keep the agent in `src/agent` while validating the vertical slice.
101
+ Extract to packages only after the design stabilizes:
102
+
103
+ ```txt
104
+ packages/
105
+ brass-runtime/
106
+ brass-agent/
107
+ brass-node/
108
+ brass-llm/
109
+ brass-cli/
110
+ ```
111
+
112
+ Until then, `src/agent` is allowed to be experimental, but `src/core` is not.
@@ -0,0 +1,160 @@
1
+ # Brass Agent chat sessions
2
+
3
+ P30 turns the VS Code Chat view from a one-shot launcher into a lightweight
4
+ conversation surface.
5
+
6
+ The CLI remains the canonical execution boundary. The VS Code extension still
7
+ calls:
8
+
9
+ ```bash
10
+ brass-agent --protocol-json --protocol-full-patches --cwd <workspace> <goal>
11
+ ```
12
+
13
+ The new session behavior lives entirely in the extension.
14
+
15
+ ## What is stored
16
+
17
+ The VS Code extension stores a compact chat session in `workspaceState`:
18
+
19
+ ```txt
20
+ messages
21
+ last run summary
22
+ last validation output
23
+ last patch stats
24
+ last patch body, only when brassAgent.storePatchesInHistory is true
25
+ ```
26
+
27
+ This is editor-local state. It is not written to the repository and it is not
28
+ owned by `src/core` or `src/agent`.
29
+
30
+ The message history length is controlled by:
31
+
32
+ ```json
33
+ {
34
+ "brassAgent.chatHistoryLimit": 80
35
+ }
36
+ ```
37
+
38
+ Disable patch persistence with:
39
+
40
+ ```json
41
+ {
42
+ "brassAgent.storePatchesInHistory": false
43
+ }
44
+ ```
45
+
46
+ ## Follow-up context
47
+
48
+ After a run, follow-up messages can use the previous run as context.
49
+
50
+ For example:
51
+
52
+ ```txt
53
+ fix the failing tests
54
+ why did that fail?
55
+ try again but do not change the public API
56
+ explain the patch
57
+ ```
58
+
59
+ The extension composes the next agent goal with a compact context block that may
60
+ include:
61
+
62
+ ```txt
63
+ previous goal
64
+ previous status
65
+ previous summary/error
66
+ latest validation command output
67
+ last patch stats
68
+ last patch diff, only for explicit explain-last style requests
69
+ ```
70
+
71
+ The agent is instructed to ignore previous context if the new request is
72
+ unrelated.
73
+
74
+ ## Slash commands
75
+
76
+ The chat supports slash commands to avoid menus and flags:
77
+
78
+ ```txt
79
+ /inspect
80
+ /fix-tests
81
+ /typecheck
82
+ /lint
83
+ /ask <question>
84
+ /propose <task>
85
+ /apply <task>
86
+ /explain-last
87
+ /apply-last
88
+ /rollback-last
89
+ /doctor
90
+ /output
91
+ /clear
92
+ /help
93
+ ```
94
+
95
+ ### Safety behavior
96
+
97
+ `/apply <task>` still uses the safe apply-preview flow:
98
+
99
+ ```txt
100
+ chat request
101
+ -> propose run
102
+ -> patch preview
103
+ -> user approval
104
+ -> brass-agent --apply-patch-file <exact diff>
105
+ ```
106
+
107
+ `/apply-last` reopens the last patch preview. It does not silently write.
108
+
109
+ `/rollback-last` calls the CLI rollback path:
110
+
111
+ ```bash
112
+ brass-agent --rollback-patch-file <temp.diff> --yes ...
113
+ ```
114
+
115
+ It asks for VS Code confirmation first, and the CLI still goes through the normal
116
+ patch rollback service.
117
+
118
+ ## Quick actions
119
+
120
+ Assistant messages can include buttons such as:
121
+
122
+ ```txt
123
+ Open patch preview
124
+ Explain last
125
+ Rollback last
126
+ Show output
127
+ ```
128
+
129
+ These buttons send slash commands back through the same chat handler.
130
+
131
+ ## Boundary
132
+
133
+ The boundary remains unchanged:
134
+
135
+ ```txt
136
+ src/core
137
+
138
+ src/agent
139
+
140
+ brass-agent CLI protocol
141
+
142
+ VS Code chat session UI
143
+ ```
144
+
145
+ The extension owns conversation memory and UX. The agent owns execution,
146
+ permissions, validation, redaction, patch application, rollback, and protocol
147
+ semantics.
148
+
149
+ ## Explain last behavior
150
+
151
+ `/explain-last` is intentionally local and deterministic. It summarizes the last
152
+ stored run from VS Code workspace state instead of launching a new agent run.
153
+
154
+ That keeps the button useful even when the previous run stopped before the LLM
155
+ step, for example because a context file disappeared or a tool returned `FsError`.
156
+ For an AI follow-up using the same context, use:
157
+
158
+ ```txt
159
+ /ask why did that fail?
160
+ ```
@@ -0,0 +1,17 @@
1
+ # Brass Agent CI mode
2
+
3
+ P19 adds explicit CI-oriented exit codes.
4
+
5
+ ```bash
6
+ brass-agent --ci --json "fix the failing tests"
7
+ ```
8
+
9
+ Exit codes:
10
+
11
+ ```txt
12
+ 0 run completed and latest validation command passed
13
+ 1 agent error or latest validation command failed
14
+ 2 patch was proposed but not applied, when --fail-on-patch-proposed is set
15
+ ```
16
+
17
+ `--ci` does not force an output format. Combine it with `--json`, `--events-json`, or `--protocol-json` depending on the consumer.