brass-runtime 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +287 -23
- package/dist/agent/cli/main.cjs +38 -38
- package/dist/agent/cli/main.js +6 -6
- package/dist/agent/cli/main.mjs +6 -6
- package/dist/agent/index.cjs +7 -7
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +6 -6
- package/dist/agent/index.mjs +6 -6
- package/dist/chunk-2HQTDLHF.mjs +683 -0
- package/dist/chunk-36I3M4UC.mjs +370 -0
- package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
- package/dist/chunk-3LOYJFRR.cjs +300 -0
- package/dist/chunk-3Y2RIUMM.js +300 -0
- package/dist/{chunk-7XOPAB5Q.js → chunk-4P2HHGAX.mjs} +83 -5
- package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
- package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
- package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
- package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
- package/dist/chunk-5QC7LRZ3.js +229 -0
- package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
- package/dist/chunk-62AZW6UT.cjs +313 -0
- package/dist/chunk-6IXXWIUM.js +683 -0
- package/dist/chunk-6RY2FFN4.mjs +2024 -0
- package/dist/chunk-74ZTY6CP.js +2871 -0
- package/dist/chunk-7CMJS3QE.mjs +2871 -0
- package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
- package/dist/chunk-7X3K5RMS.js +2024 -0
- package/dist/chunk-7ZPEZ57L.cjs +2024 -0
- package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
- package/dist/chunk-AGR5B2BC.cjs +683 -0
- package/dist/chunk-B33ICAKP.js +313 -0
- package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
- package/dist/{chunk-F5EUMJL7.mjs → chunk-BKK77SBA.js} +83 -5
- package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
- package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
- package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
- package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
- package/dist/chunk-EOC4UHBS.mjs +229 -0
- package/dist/chunk-F6XWZQY4.cjs +777 -0
- package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
- package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
- package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
- package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
- package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
- package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
- package/dist/chunk-KN32XNTH.mjs +313 -0
- package/dist/chunk-KQLYONSE.cjs +2871 -0
- package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
- package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
- package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
- package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
- package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
- package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
- package/dist/chunk-MVGUEJ5Z.cjs +370 -0
- package/dist/chunk-PD4EJTQC.cjs +229 -0
- package/dist/chunk-PWC3RBQE.mjs +300 -0
- package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
- package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
- package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
- package/dist/chunk-SK7UZRNI.mjs +777 -0
- package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
- package/dist/chunk-UB4B6OFY.js +370 -0
- package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
- package/dist/chunk-VWIPB6I5.js +777 -0
- package/dist/{chunk-JNFRRJYH.cjs → chunk-WBGRHGBP.cjs} +270 -192
- package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
- package/dist/core/index.cjs +135 -9
- package/dist/core/index.d.ts +238 -33
- package/dist/core/index.js +155 -29
- package/dist/core/index.mjs +155 -29
- package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
- package/dist/effectRunner-CFLC32IK.cjs +8 -0
- package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
- package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
- package/dist/http/index.cjs +324 -2986
- package/dist/http/index.d.ts +54 -68
- package/dist/http/index.js +238 -2900
- package/dist/http/index.mjs +238 -2900
- package/dist/http/testing.cjs +14 -12
- package/dist/http/testing.d.ts +5 -4
- package/dist/http/testing.js +10 -8
- package/dist/http/testing.mjs +10 -8
- package/dist/index.cjs +423 -255
- package/dist/index.d.ts +87 -69
- package/dist/index.js +301 -133
- package/dist/index.mjs +301 -133
- package/dist/observability/index.cjs +18 -531
- package/dist/observability/index.d.ts +81 -8
- package/dist/observability/index.js +25 -538
- package/dist/observability/index.mjs +25 -538
- package/dist/perf/cli.cjs +401 -0
- package/dist/perf/cli.d.ts +1 -0
- package/dist/perf/cli.js +401 -0
- package/dist/perf/cli.mjs +401 -0
- package/dist/perf/index.cjs +141 -0
- package/dist/perf/index.d.ts +483 -0
- package/dist/perf/index.js +141 -0
- package/dist/perf/index.mjs +141 -0
- package/dist/schedule-CK3Ml_7p.d.ts +259 -0
- package/dist/schema/index.cjs +6 -2
- package/dist/schema/index.d.ts +3 -1
- package/dist/schema/index.js +5 -1
- package/dist/schema/index.mjs +5 -1
- package/dist/{server-C8hDXA74.d.ts → server-D6JZ15_e.d.ts} +16 -4
- package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
- package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
- package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
- package/docs/ARCHITECTURE.md +292 -0
- package/docs/README.md +65 -0
- package/docs/adr/0001-ai-context-pack.md +32 -0
- package/docs/agent-apply-mode.md +104 -0
- package/docs/agent-approvals.md +110 -0
- package/docs/agent-batch.md +185 -0
- package/docs/agent-boundaries.md +112 -0
- package/docs/agent-chat-sessions.md +160 -0
- package/docs/agent-ci.md +17 -0
- package/docs/agent-cli.md +405 -0
- package/docs/agent-config.md +480 -0
- package/docs/agent-context-discovery.md +159 -0
- package/docs/agent-copilot-like-dx.md +126 -0
- package/docs/agent-declarative-optimized-planning.md +138 -0
- package/docs/agent-dx.md +224 -0
- package/docs/agent-env-files.md +126 -0
- package/docs/agent-follow-up-context.md +43 -0
- package/docs/agent-global-usage.md +180 -0
- package/docs/agent-init.md +109 -0
- package/docs/agent-install-and-configure.md +516 -0
- package/docs/agent-language-workspace-ux.md +99 -0
- package/docs/agent-llm-adapters.md +123 -0
- package/docs/agent-local-install.md +190 -0
- package/docs/agent-local-tests.md +51 -0
- package/docs/agent-observability.md +155 -0
- package/docs/agent-patch-quality-loop.md +162 -0
- package/docs/agent-presets.md +22 -0
- package/docs/agent-project-commands.md +237 -0
- package/docs/agent-project-intelligence.md +156 -0
- package/docs/agent-redaction.md +18 -0
- package/docs/agent-release-readiness.md +76 -0
- package/docs/agent-rollback-safety.md +162 -0
- package/docs/agent-rollback.md +23 -0
- package/docs/agent-run-artifacts.md +16 -0
- package/docs/agent-vscode-auto-discovery.md +137 -0
- package/docs/agent-vscode-batch-runner.md +100 -0
- package/docs/agent-vscode-chat-layout.md +90 -0
- package/docs/agent-vscode-clean-install.md +147 -0
- package/docs/agent-vscode-code-actions.md +70 -0
- package/docs/agent-vscode-diff-preview.md +45 -0
- package/docs/agent-vscode-inline-assist.md +56 -0
- package/docs/agent-vscode-install.md +186 -0
- package/docs/agent-vscode-model-setup.md +97 -0
- package/docs/agent-vscode-patch-preview.md +92 -0
- package/docs/agent-vscode-problems.md +79 -0
- package/docs/agent-vscode-project-dashboard.md +106 -0
- package/docs/agent-vscode-run-history.md +92 -0
- package/docs/agent-vscode-ux.md +73 -0
- package/docs/ai/INVARIANTS.md +84 -0
- package/docs/ai/PROJECT_MAP.md +338 -0
- package/docs/ai/PUBLIC_API.md +339 -0
- package/docs/ai/VALIDATION_MATRIX.md +67 -0
- package/docs/api-polish.md +37 -0
- package/docs/cancellation.md +162 -0
- package/docs/coverage.md +46 -0
- package/docs/framework-integrations.md +38 -0
- package/docs/frameworks/angular.md +153 -0
- package/docs/frameworks/express.md +125 -0
- package/docs/frameworks/fastify.md +124 -0
- package/docs/frameworks/nestjs.md +282 -0
- package/docs/frameworks/nextjs.md +147 -0
- package/docs/frameworks/react.md +139 -0
- package/docs/frameworks/vanilla.md +224 -0
- package/docs/getting-started.md +159 -0
- package/docs/guides/README.md +40 -0
- package/docs/guides/circuit-breaker.md +89 -0
- package/docs/guides/error-handling.md +91 -0
- package/docs/guides/getting-started.md +107 -0
- package/docs/guides/layers.md +189 -0
- package/docs/guides/metrics.md +101 -0
- package/docs/guides/resource-management.md +141 -0
- package/docs/guides/retry.md +215 -0
- package/docs/guides/semaphore.md +66 -0
- package/docs/guides/streams.md +117 -0
- package/docs/guides/supervisors.md +98 -0
- package/docs/guides/testing.md +162 -0
- package/docs/guides/tracing.md +71 -0
- package/docs/http-recipes.md +399 -0
- package/docs/http.md +749 -0
- package/docs/modules.md +285 -0
- package/docs/nestjs.md +6 -0
- package/docs/observability-collector-smoke.md +31 -0
- package/docs/observability-framework-examples.md +110 -0
- package/docs/observability.md +649 -0
- package/docs/otel-collector-smoke.yaml +27 -0
- package/docs/performance-profiler.md +199 -0
- package/docs/production-readiness.md +73 -0
- package/docs/recipes/README.md +12 -0
- package/docs/recipes/http-server.md +45 -0
- package/docs/recipes/layers.md +44 -0
- package/docs/recipes/performance.md +47 -0
- package/docs/recipes/runtime.md +41 -0
- package/docs/recipes/testing.md +41 -0
- package/docs/release.md +53 -0
- package/docs/wasm-bounded-queues.md +44 -0
- package/docs/wasm-engine-observability-benchmarks.md +85 -0
- package/docs/wasm-fiber-engine.md +117 -0
- package/docs/wasm-scheduler-state-machine.md +122 -0
- package/docs/wasm-stream-chunks.md +54 -0
- package/package.json +22 -2
- package/dist/chunk-45F7OKGT.cjs +0 -104
- package/dist/chunk-7V4KY4RL.mjs +0 -104
- package/dist/chunk-DJQ7OMMB.cjs +0 -144
- package/dist/chunk-GOV47PPB.mjs +0 -552
- package/dist/chunk-JF4XXPZ5.cjs +0 -552
- package/dist/chunk-KCPT2D6G.js +0 -552
- package/dist/chunk-NOYZIMUJ.mjs +0 -144
- package/dist/chunk-PNVFW245.js +0 -144
- package/dist/chunk-ROJC3NBJ.js +0 -104
- package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
- 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
|
+
```
|
package/docs/agent-ci.md
ADDED
|
@@ -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.
|