@dreb/coding-agent 2.40.1 → 2.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +20 -7
  2. package/dist/core/agent-session.d.ts +2 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +8 -4
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/context-trust.d.ts +44 -0
  7. package/dist/core/context-trust.d.ts.map +1 -0
  8. package/dist/core/context-trust.js +117 -0
  9. package/dist/core/context-trust.js.map +1 -0
  10. package/dist/core/nested-context.d.ts +4 -3
  11. package/dist/core/nested-context.d.ts.map +1 -1
  12. package/dist/core/nested-context.js +34 -9
  13. package/dist/core/nested-context.js.map +1 -1
  14. package/dist/core/resource-loader.d.ts +3 -1
  15. package/dist/core/resource-loader.d.ts.map +1 -1
  16. package/dist/core/resource-loader.js +29 -11
  17. package/dist/core/resource-loader.js.map +1 -1
  18. package/dist/core/settings-manager.d.ts +36 -2
  19. package/dist/core/settings-manager.d.ts.map +1 -1
  20. package/dist/core/settings-manager.js +157 -6
  21. package/dist/core/settings-manager.js.map +1 -1
  22. package/dist/core/tools/subagent.d.ts.map +1 -1
  23. package/dist/core/tools/subagent.js +3 -3
  24. package/dist/core/tools/subagent.js.map +1 -1
  25. package/dist/modes/index.d.ts +1 -1
  26. package/dist/modes/index.d.ts.map +1 -1
  27. package/dist/modes/index.js.map +1 -1
  28. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  29. package/dist/modes/interactive/components/settings-selector.js +2 -2
  30. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  31. package/dist/modes/rpc/index.d.ts +1 -1
  32. package/dist/modes/rpc/index.d.ts.map +1 -1
  33. package/dist/modes/rpc/index.js.map +1 -1
  34. package/dist/modes/rpc/rpc-client.d.ts +9 -1
  35. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  36. package/dist/modes/rpc/rpc-client.js +20 -0
  37. package/dist/modes/rpc/rpc-client.js.map +1 -1
  38. package/dist/modes/rpc/rpc-mode.d.ts +38 -5
  39. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  40. package/dist/modes/rpc/rpc-mode.js +266 -61
  41. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  42. package/dist/modes/rpc/rpc-types.d.ts +73 -2
  43. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  44. package/dist/modes/rpc/rpc-types.js.map +1 -1
  45. package/docs/dashboard.md +10 -2
  46. package/docs/rpc.md +159 -8
  47. package/docs/settings.md +32 -5
  48. package/package.json +1 -1
package/docs/rpc.md CHANGED
@@ -1219,16 +1219,17 @@ Note: with `summarize: true` the command is LLM-bound and can take a while. `Rpc
1219
1219
 
1220
1220
  ### Settings
1221
1221
 
1222
- Persistent default settings, backed by the settings file (see [settings.md](settings.md)). These are distinct from live session state:
1222
+ Persistent settings, backed by the settings file (see [settings.md](settings.md)). They are normally distinct from live session state, with one security-policy exception:
1223
1223
 
1224
- - **Persistent defaults** (`get_settings` / `set_settings`): the values stored in `settings.json` that seed fresh runtimes — default provider/model, default thinking level, queue modes, compaction/retry/image/context/skill/thinking-display/transport toggles, and per-agent model fallback lists. Writing them does **not** change the running session.
1224
+ - **Persistent defaults** (`get_settings` / `set_settings`): provider/model, thinking level, queue modes, compaction/retry/image/skill/thinking-display/transport toggles, and per-agent model fallback lists seed fresh runtimes. Writing these ordinary defaults does **not** change a running session.
1225
+ - **Global nested-context trust policy** (`autoLoadNestedContext`, `trustedContextFolders`, `effectiveTrustedContextRoots`, and the trust commands below): this is read from `~/.dreb/agent/settings.json` only, never project settings. Active main/subagent processes observe it for **future lazy nested/out-of-cwd loads**; it cannot remove content already injected into a conversation. It does not govern the separate initial upward context scan from the launch cwd.
1225
1226
  - **Runtime state** (`get_state` / `set_model` / `set_thinking_level` / `set_steering_mode` / `set_follow_up_mode` / `set_auto_compaction` / `set_auto_retry`): the state of the live session. Note that the runtime setters also persist their values as new defaults as a side effect.
1226
1227
 
1227
- A dashboard settings tab typically reads both: `get_state` for what's active now, `get_settings` for what the next startup will use.
1228
+ A dashboard settings tab typically reads `get_state` for what is active now and `get_settings` for persistent defaults plus the current global context-trust policy.
1228
1229
 
1229
1230
  #### get_settings
1230
1231
 
1231
- Get the persistent default settings (merged global + project view).
1232
+ Get persistent settings. Ordinary fields are the merged global + project view; the nested-context trust fields are always global-only.
1232
1233
 
1233
1234
  ```json
1234
1235
  {"type": "get_settings"}
@@ -1251,7 +1252,9 @@ Response:
1251
1252
  "imageAutoResize": true,
1252
1253
  "blockImages": false,
1253
1254
  "enableSkillCommands": true,
1254
- "autoLoadNestedContext": true,
1255
+ "autoLoadNestedContext": false,
1256
+ "trustedContextFolders": ["/home/user/src/my-company"],
1257
+ "effectiveTrustedContextRoots": ["/home/user/src/my-company"],
1255
1258
  "transport": "sse",
1256
1259
  "hideThinkingBlock": false,
1257
1260
  "agentModels": {
@@ -1263,6 +1266,8 @@ Response:
1263
1266
 
1264
1267
  `defaultProvider`, `defaultModel`, and `defaultThinkingLevel` are absent if never set. `agentModels` is the merged global + project view; project entries win per agent name.
1265
1268
 
1269
+ `trustedContextFolders` is the raw global configured list, including invalid legacy paths that are ignored fail-closed. `effectiveTrustedContextRoots` is the canonical, existing root set actually enforced after `~` expansion, native `realpath`, deduplication, and ancestor subsumption. `autoLoadNestedContext` defaults to `false`; when `true` it is global expert trust-all for every resolvable target, not a project override. Project `.dreb/settings.json` cannot affect any of these three fields.
1270
+
1266
1271
  #### set_settings
1267
1272
 
1268
1273
  Update persistent default settings. Takes a partial payload — only the supplied keys change. The whole payload is validated before anything is applied: on any invalid field, nothing changes and the response is an explicit error. Writes target the global settings file (same scope as every runtime setter).
@@ -1271,6 +1276,14 @@ Update persistent default settings. Takes a partial payload — only the supplie
1271
1276
  {"type": "set_settings", "settings": {"defaultThinkingLevel": "low", "retryEnabled": false}}
1272
1277
  ```
1273
1278
 
1279
+ Replace the global trusted-root list atomically (paths must be existing directories and are persisted as canonical roots):
1280
+
1281
+ ```json
1282
+ {"type": "set_settings", "settings": {"trustedContextFolders": ["/home/user/src/my-company"]}}
1283
+ ```
1284
+
1285
+ Set `autoLoadNestedContext: true` only as an expert global trust-all choice: it permits lazy context from any resolvable directory, including untrusted prompt-injection content. `set_settings` writes this policy globally even when the RPC session has project settings; project `.dreb/settings.json` cannot add, override, or enable it. Active processes use the result for later lazy loads, not to retract prior injections. The separate initial upward scan from the launch cwd is unaffected.
1286
+
1274
1287
  Setting the default model (both keys required together, validated against available models — the provider must have credentials configured, same rule as `set_model`):
1275
1288
 
1276
1289
  ```json
@@ -1311,7 +1324,9 @@ Response is the full settings snapshot after the write (same shape as `get_setti
1311
1324
  "imageAutoResize": true,
1312
1325
  "blockImages": false,
1313
1326
  "enableSkillCommands": true,
1314
- "autoLoadNestedContext": true,
1327
+ "autoLoadNestedContext": false,
1328
+ "trustedContextFolders": ["/home/user/src/my-company"],
1329
+ "effectiveTrustedContextRoots": ["/home/user/src/my-company"],
1315
1330
  "transport": "sse",
1316
1331
  "hideThinkingBlock": false,
1317
1332
  "agentModels": {}
@@ -1334,7 +1349,9 @@ Project-shadow warning example (the global write still lands, but the returned m
1334
1349
  "imageAutoResize": true,
1335
1350
  "blockImages": false,
1336
1351
  "enableSkillCommands": true,
1337
- "autoLoadNestedContext": true,
1352
+ "autoLoadNestedContext": false,
1353
+ "trustedContextFolders": [],
1354
+ "effectiveTrustedContextRoots": [],
1338
1355
  "transport": "sse",
1339
1356
  "hideThinkingBlock": false,
1340
1357
  "agentModels": {
@@ -1360,7 +1377,8 @@ Valid keys and values:
1360
1377
  | `imageAutoResize` | boolean |
1361
1378
  | `blockImages` | boolean |
1362
1379
  | `enableSkillCommands` | boolean |
1363
- | `autoLoadNestedContext` | boolean |
1380
+ | `autoLoadNestedContext` | boolean; global-only expert trust-all for lazy nested/out-of-cwd loading; defaults to `false` |
1381
+ | `trustedContextFolders` | Replaces the global list atomically. Array of non-empty paths that expand to absolute, existing directories; each is canonicalized with native `realpath`, then deduplicated/subsumed. Relative, missing, non-directory, and broken-symlink entries are rejected. |
1364
1382
  | `transport` | `"sse"`, `"websocket"`, `"auto"` |
1365
1383
  | `hideThinkingBlock` | boolean |
1366
1384
  | `agentModels` | Plain object mapping agent names to arrays of non-empty model id strings; empty arrays remove the global entry for that agent |
@@ -1374,6 +1392,7 @@ Errors are explicit `success: false` responses (nothing is applied on any of the
1374
1392
  - Non-boolean toggle: `Invalid retryEnabled: "yes". Must be a boolean`
1375
1393
  - Invalid `agentModels` object: `Invalid agentModels: must be a plain object mapping agent names to model fallback arrays`
1376
1394
  - Invalid `agentModels` entry (the offending agent key is named): `Invalid agentModels["Explore"]: expected an array of non-empty strings`
1395
+ - Invalid trusted-root list: `trustedContextFolders must be an array of non-empty path strings` or `Invalid trustedContextFolders[0]: path must be absolute after ~ expansion` / `path must be an existing directory`
1377
1396
  - Provider without model (or vice versa): `defaultProvider and defaultModel must be set together`
1378
1397
  - Unavailable model: `Model not found: provider/model-id`
1379
1398
  - Corrupt settings file: `Cannot write settings: the global settings file failed to load (fix or remove the corrupt settings.json first)` — without this guard the write would silently no-op
@@ -1381,6 +1400,138 @@ Errors are explicit `success: false` responses (nothing is applied on any of the
1381
1400
 
1382
1401
  Unlike `set_thinking_level` (which silently clamps to the current model's capabilities), `set_settings` rejects invalid values loudly — a dashboard needs the error, not a silent correction.
1383
1402
 
1403
+ #### evaluate_context_trust
1404
+
1405
+ Evaluate one directory against the current **global** lazy nested-context policy. This is useful for a Files view; it does not load context or change settings.
1406
+
1407
+ ```json
1408
+ {"type": "evaluate_context_trust", "path": "/home/user/src/my-company/package"}
1409
+ ```
1410
+
1411
+ Success response:
1412
+
1413
+ ```json
1414
+ {
1415
+ "type": "response",
1416
+ "command": "evaluate_context_trust",
1417
+ "success": true,
1418
+ "data": {
1419
+ "canonicalTarget": "/home/user/src/my-company/package",
1420
+ "state": "trusted-root",
1421
+ "grantingRoot": "/home/user/src/my-company"
1422
+ }
1423
+ }
1424
+ ```
1425
+
1426
+ `canonicalTarget` is the existing directory after strict native `realpath`. `state` is exactly one of:
1427
+
1428
+ - `"untrusted"` — no global root covers the target.
1429
+ - `"trusted-root"` — a configured canonical root covers it; `grantingRoot` is present, including for inherited descendant access.
1430
+ - `"unrestricted"` — global `autoLoadNestedContext` is true; `grantingRoot` is omitted because folder roots are not the grant.
1431
+
1432
+ Invalid paths return `success: false`: `path` must be a non-empty string, absolute after `~` expansion, and an existing directory. Error text is prefixed `Invalid context trust path: ` (for example, `Invalid context trust path: path must be an existing directory`). Symlinks are resolved before evaluation, so a lexical descendant that resolves outside a trusted root evaluates as untrusted.
1433
+
1434
+ #### trust_context_folder
1435
+
1436
+ Add a directory as a global trusted root, then durably flush the settings write. The request path has the same strict validation and canonicalization as `evaluate_context_trust`.
1437
+
1438
+ ```json
1439
+ {"type": "trust_context_folder", "path": "/home/user/src/my-company"}
1440
+ ```
1441
+
1442
+ Success response (the nested `settings` object is abbreviated here to its trust fields):
1443
+
1444
+ ```json
1445
+ {
1446
+ "type": "response",
1447
+ "command": "trust_context_folder",
1448
+ "success": true,
1449
+ "data": {
1450
+ "evaluation": {
1451
+ "canonicalTarget": "/home/user/src/my-company",
1452
+ "state": "trusted-root",
1453
+ "grantingRoot": "/home/user/src/my-company"
1454
+ },
1455
+ "addedRoot": "/home/user/src/my-company",
1456
+ "settings": {
1457
+ "autoLoadNestedContext": false,
1458
+ "trustedContextFolders": ["/home/user/src/my-company"],
1459
+ "effectiveTrustedContextRoots": ["/home/user/src/my-company"]
1460
+ }
1461
+ }
1462
+ }
1463
+ ```
1464
+
1465
+ `settings` is the complete `get_settings` snapshot after the durable global write. `addedRoot` is the canonical target when it is retained as a root; it is omitted when an existing ancestor already covers that target. Existing malformed legacy roots are discarded by this mutation; the resulting root list is canonical, deduplicated, and ancestor-subsumed. Invalid paths use the same `Invalid context trust path: ...` errors. A corrupt global settings file or failed durable write returns `success: false` with `Cannot write settings: ...` or `Failed to persist settings: ...`; no merely in-memory trust is reported as success.
1466
+
1467
+ #### untrust_context_folder
1468
+
1469
+ Remove the actual canonical root granting trust to a target, rather than only removing a selected descendant. This is the companion for an inherited Files-view trust badge.
1470
+
1471
+ ```json
1472
+ {"type": "untrust_context_folder", "path": "/home/user/src/my-company/package"}
1473
+ ```
1474
+
1475
+ If `/home/user/src/my-company` grants this descendant's access, a successful response is (with `settings` abbreviated to its trust fields):
1476
+
1477
+ ```json
1478
+ {
1479
+ "type": "response",
1480
+ "command": "untrust_context_folder",
1481
+ "success": true,
1482
+ "data": {
1483
+ "evaluation": {
1484
+ "canonicalTarget": "/home/user/src/my-company/package",
1485
+ "state": "untrusted"
1486
+ },
1487
+ "removedRoot": "/home/user/src/my-company",
1488
+ "settings": {
1489
+ "autoLoadNestedContext": false,
1490
+ "trustedContextFolders": [],
1491
+ "effectiveTrustedContextRoots": []
1492
+ }
1493
+ }
1494
+ }
1495
+ ```
1496
+
1497
+ `removedRoot` is the canonical root removed for the target and therefore revokes its descendants too. If the target was already `untrusted`, this is a successful no-op: `settings` and an `untrusted` evaluation are returned without `removedRoot`. If global expert trust-all is enabled, it fails rather than pretending a folder change can narrow it:
1498
+
1499
+ ```json
1500
+ {"type":"response","command":"untrust_context_folder","success":false,"error":"Cannot untrust a context folder while unrestricted nested context loading is enabled; disable autoLoadNestedContext first"}
1501
+ ```
1502
+
1503
+ Invalid paths and write failures have the same semantics as `trust_context_folder`.
1504
+
1505
+ #### remove_trusted_context_folder
1506
+
1507
+ Remove a configured global trusted-folder string by **exact** match, then durably flush the settings write. This is intentionally different from `untrust_context_folder`: the request path is treated as the configured string to delete and performs no directory/path resolution — no `~` expansion, absolute-path requirement, directory existence check, symlink resolution, canonicalization, or granting-root lookup.
1508
+
1509
+ ```json
1510
+ {"type": "remove_trusted_context_folder", "path": "/legacy/or/moved/path"}
1511
+ ```
1512
+
1513
+ Success response (the nested `settings` object is abbreviated here to its trust fields):
1514
+
1515
+ ```json
1516
+ {
1517
+ "type": "response",
1518
+ "command": "remove_trusted_context_folder",
1519
+ "success": true,
1520
+ "data": {
1521
+ "settings": {
1522
+ "autoLoadNestedContext": false,
1523
+ "trustedContextFolders": [],
1524
+ "effectiveTrustedContextRoots": []
1525
+ },
1526
+ "removedFolder": "/legacy/or/moved/path"
1527
+ }
1528
+ }
1529
+ ```
1530
+
1531
+ `settings` is the complete `get_settings` snapshot after the durable global write. `removedFolder` is the configured folder string requested for exact removal; the command is a successful no-op if the exact string was not present. Only a non-empty string `path` is required, so this command can revoke invalid, legacy, or stale configured entries that `untrust_context_folder` cannot validate or resolve. It is not gated by global expert trust-all (`autoLoadNestedContext: true`), because it edits the configured list directly rather than pretending to narrow unrestricted loading. A corrupt global settings file or failed durable write returns `success: false` with `Cannot write settings: ...` or `Failed to persist settings: ...`; no merely in-memory trust removal is reported as success.
1532
+
1533
+ All four context-trust commands concern only future lazy nested/out-of-cwd loads in active main/subagent processes; they never alter the separate initial upward scan or retract context already injected into a conversation.
1534
+
1384
1535
  ### Version
1385
1536
 
1386
1537
  #### get_version
package/docs/settings.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Settings
2
2
 
3
- dreb uses JSON settings files with project settings overriding global settings.
3
+ dreb uses JSON settings files with project settings overriding global settings, except where a setting is explicitly global-only (notably nested-context trust).
4
4
 
5
5
  | Location | Scope |
6
6
  |----------|-------|
@@ -113,13 +113,36 @@ After the configured number of tool calls, dreb fires a single background LLM ca
113
113
 
114
114
  ### Context
115
115
 
116
+ At startup, dreb always performs an **initial upward scan** from the launch cwd for `AGENTS.md`/`CLAUDE.md`. This is separate from lazy nested/out-of-cwd loading and is not enabled, disabled, or scoped by either context setting below. It is not a claim that the initial scan has a fixed boundary: it follows the startup upward-walk behavior for that cwd.
117
+
116
118
  | Setting | Type | Default | Description |
117
119
  |---------|------|---------|-------------|
118
- | `context.autoLoadNested` | boolean | `true` | Auto-load a directory's `AGENTS.md`/`CLAUDE.md` the first time a tool operates there |
120
+ | `context.trustedFolders` | string[] | `[]` | **Global-only.** Explicit existing directory roots whose canonical descendants may lazy-load context |
121
+ | `context.autoLoadNested` | boolean | `false` | **Global-only expert trust-all.** Allow lazy loading from every resolvable directory |
122
+
123
+ Both settings belong only in `~/.dreb/agent/settings.json`. Project `.dreb/settings.json` cannot enable, disable, or extend nested-context trust: it cannot enable unrestricted loading, add trusted roots, override global roots, or otherwise widen this trust boundary. A cloned repository therefore cannot grant itself trust.
124
+
125
+ #### `context.trustedFolders`
126
+
127
+ Use explicit roots for directories whose instructions you control:
128
+
129
+ ```json
130
+ {
131
+ "context": {
132
+ "trustedFolders": ["~/src/my-company", "/srv/controlled-repos"]
133
+ }
134
+ }
135
+ ```
136
+
137
+ Each root authorizes itself and its descendants for lazy loading. Paths are expanded (`~` is supported) and canonically resolved with native `realpath`; the target is independently canonicalized for every decision. Roots must be absolute after expansion, existing directories, and must not be broken symlinks. Invalid/missing legacy entries are ignored fail-closed; RPC/settings updates reject invalid entries atomically. Canonical duplicates are deduplicated, and a descendant root is subsumed by its trusted ancestor. This realpath matching prevents symlink escape: a path that is lexically below a trusted folder but resolves outside it is not trusted.
119
138
 
120
- When enabled, dreb loads nested context files that the startup upward-walk misses (e.g. a `CLAUDE.md` in a monorepo subpackage, or context in a different repo a subagent visits). The first tool to touch a directory triggers a walk up to a sensible ceiling the session cwd for in-tree targets, otherwise the outermost git repo root, otherwise the outermost directory containing a context file and the collected files are appended to that tool's result. Each file loads at most once per session. See [Context Files](../README.md#context-files).
139
+ For a trusted target, the first matching path-bearing tool (`read`, `edit`, `write`, `grep`, `find`, `ls`) or `bash` beginning with `cd <dir>` can append its context to the tool result. The walk is bounded by the trusted root (or the normal cwd/repository/context-file ceiling when expert trust-all is in effect). Main agents and subagents read the same global policy. Active processes re-read it for later lazy-load decisions, so a trust/untrust change affects **future** loads without a restart; text already injected into a conversation cannot be retracted.
121
140
 
122
- **Security caution:** when working across untrusted or third-party repositories, their `AGENTS.md`/`CLAUDE.md` files may be auto-injected into the agent's context, which is a prompt-injection consideration. Set `context.autoLoadNested` to `false` to disable this behavior. Auto-loaded content is secret-scrubbed before injection, but extension `tool_result` transforms do not see it because nested context is injected after those transforms for cache safety.
141
+ In the dashboard, the Files view is the primary grant flow: trust the displayed folder and descendants, or untrust the actual granting root. The Settings screen lists every configured trusted root for audit and revoke, and offers a simple add-by-path control. These controls change only lazy nested/out-of-cwd loading; they do not alter the separate initial upward scan described above.
142
+
143
+ #### `context.autoLoadNested`
144
+
145
+ **Expert setting — prompt-injection warning.** Set this to `true` only in global settings to allow lazy loading from **any** resolvable target directory:
123
146
 
124
147
  ```json
125
148
  {
@@ -129,6 +152,10 @@ When enabled, dreb loads nested context files that the startup upward-walk misse
129
152
  }
130
153
  ```
131
154
 
155
+ This includes untrusted or third-party repositories and can inject prompt-injection content. Prefer `trustedFolders`; leave this setting `false` unless you intentionally trust all such targets. A project settings file cannot enable it.
156
+
157
+ For either permitted lazy-load path, each context file is realpath-deduplicated and injected at most once per session; files already obtained during the initial upward scan are not repeated. If the triggering tool already returns a context file in full, it is marked loaded without a duplicate injection. Auto-loaded content is secret-scrubbed before injection and is appended after extension `tool_result` transforms, so those transforms intentionally do not see it. See [Context Files](../README.md#context-files).
158
+
132
159
  ### Compaction
133
160
 
134
161
  | Setting | Type | Default | Description |
@@ -357,7 +384,7 @@ See [packages.md](packages.md) for package management details.
357
384
 
358
385
  ## Project Overrides
359
386
 
360
- Project settings (`.dreb/settings.json`) override global settings. Nested objects are merged:
387
+ Project settings (`.dreb/settings.json`) override global settings. Nested objects are merged. **Exception:** `context.trustedFolders` and `context.autoLoadNested` are global-only security policy: project settings cannot add, replace, override, or enable either one. Nested context from the initial startup upward scan remains separate from this lazy-load policy.
361
388
 
362
389
  ```json
363
390
  // ~/.dreb/agent/settings.json (global)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreb/coding-agent",
3
- "version": "2.40.1",
3
+ "version": "2.41.0",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "drebConfig": {