@michael-joseph-miller/ant-bot 0.1.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 (60) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/LICENSE +21 -0
  3. package/README.md +267 -0
  4. package/dist/browser-OHRD7YI3.js +524 -0
  5. package/dist/browser-OHRD7YI3.js.map +7 -0
  6. package/dist/bundled-46DUK5PG.js +133 -0
  7. package/dist/bundled-46DUK5PG.js.map +7 -0
  8. package/dist/chunk-7BOHBPB2.js +287 -0
  9. package/dist/chunk-7BOHBPB2.js.map +7 -0
  10. package/dist/chunk-AHAON6J7.js +24 -0
  11. package/dist/chunk-AHAON6J7.js.map +7 -0
  12. package/dist/chunk-DYIJTUMY.js +321 -0
  13. package/dist/chunk-DYIJTUMY.js.map +7 -0
  14. package/dist/chunk-KSQOVWP5.js +310 -0
  15. package/dist/chunk-KSQOVWP5.js.map +7 -0
  16. package/dist/chunk-Z2YT2PZN.js +64 -0
  17. package/dist/chunk-Z2YT2PZN.js.map +7 -0
  18. package/dist/index.js +1562 -0
  19. package/dist/index.js.map +7 -0
  20. package/dist/install-IY2M3OUQ.js +36 -0
  21. package/dist/install-IY2M3OUQ.js.map +7 -0
  22. package/dist/plugin-POMHVGD4.js +53 -0
  23. package/dist/plugin-POMHVGD4.js.map +7 -0
  24. package/dist/scheduler-Q7OHNGP6.js +274 -0
  25. package/dist/scheduler-Q7OHNGP6.js.map +7 -0
  26. package/dist/server.js +3016 -0
  27. package/dist/server.js.map +7 -0
  28. package/dist/skills-66WRX64H.js +17 -0
  29. package/dist/skills-66WRX64H.js.map +7 -0
  30. package/dist/skills-spec.js +172 -0
  31. package/dist/skills-spec.js.map +7 -0
  32. package/dist/tools-P5537ASX.js +148 -0
  33. package/dist/tools-P5537ASX.js.map +7 -0
  34. package/package.json +51 -0
  35. package/skills/README.md +69 -0
  36. package/skills/SPEC.md +274 -0
  37. package/skills/bug-repro/SKILL.md +53 -0
  38. package/skills/deep-research/SKILL.md +451 -0
  39. package/skills/deep-research/references/V6_1_improvements.md +112 -0
  40. package/skills/deep-research/references/completeness_review_checklist.md +25 -0
  41. package/skills/deep-research/references/counter_review_team_guide.md +181 -0
  42. package/skills/deep-research/references/enterprise_analysis_frameworks.md +135 -0
  43. package/skills/deep-research/references/enterprise_mode.md +99 -0
  44. package/skills/deep-research/references/enterprise_quality_checklist.md +160 -0
  45. package/skills/deep-research/references/enterprise_research_methodology.md +164 -0
  46. package/skills/deep-research/references/formatting_rules.md +31 -0
  47. package/skills/deep-research/references/quality_gates.md +77 -0
  48. package/skills/deep-research/references/report_template_v6.md +82 -0
  49. package/skills/deep-research/references/research_notes_format.md +147 -0
  50. package/skills/deep-research/references/research_plan_checklist.md +26 -0
  51. package/skills/deep-research/references/research_report_template.md +49 -0
  52. package/skills/deep-research/references/source_accessibility_policy.md +179 -0
  53. package/skills/deep-research/references/source_quality_rubric.md +28 -0
  54. package/skills/deep-research/references/subagent_prompt.md +116 -0
  55. package/skills/inbox-digest/SKILL.md +51 -0
  56. package/skills/skill-author/SKILL.md +92 -0
  57. package/skills/weekly-report/SKILL.md +49 -0
  58. package/web/dist/assets/index-BLQ8rPiN.js +130 -0
  59. package/web/dist/assets/index-IEIkG_jd.css +2 -0
  60. package/web/dist/index.html +13 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,40 @@
1
+ # Changelog
2
+
3
+ All notable changes to ant-bot are recorded here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow
5
+ [semantic versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ### Added
10
+
11
+ - **Database migration runner.** `db/migrations.ts` applies an ordered, transactional migration
12
+ list on every open and records what ran in a `schema_version` table. Databases created before
13
+ the runner existed are adopted at the baseline version rather than mistaken for empty ones, and
14
+ a `VACUUM INTO` snapshot is written to `backups/` before any migration touches existing data.
15
+ - **Packaging.** `pnpm build:package` assembles the single publishable npm package into
16
+ `dist-npm/`: the CLI, daemon and shared schemas bundled with esbuild, the built web UI and the
17
+ bundled skills copied in beside them, and a generated manifest checked for everything npm
18
+ otherwise only complains about at publish time.
19
+ - **`antbot update`**, and a once-a-day cached registry check surfaced in `antbot status` and
20
+ `antbot doctor`. Notification only — ant-bot never updates itself in the background.
21
+ - MIT `LICENSE` and this changelog.
22
+
23
+ ### Changed
24
+
25
+ - Shipped-asset lookups (the built web UI, the bundled skills directory, the daemon's package
26
+ root) now walk up to the nearest `package.json` instead of counting `..` segments from
27
+ `import.meta.url`. The old form assumed both the repo layout and the compiler's output depth,
28
+ and failed silently from an installed package.
29
+ - `antbot --version` and `GET /api/health` read the version from `package.json` instead of a
30
+ hardcoded constant, so a release bump cannot leave them disagreeing.
31
+
32
+ ### Notes
33
+
34
+ - Published as **`@michael-joseph-miller/ant-bot`**, not `ant-bot`. npm's name-similarity guard
35
+ refuses the unscoped name as too close to `antbot`, a security holding package from 2022 that
36
+ cannot be claimed. Scoped names are exempt from that check. The binary is still `antbot`.
37
+
38
+ ## [0.1.0]
39
+
40
+ Initial version: the ant-bot daemon, web UI and CLI.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Michael Miller
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,267 @@
1
+ # ant-bot
2
+
3
+ ant-bot is a locally-running daemon and web UI that hosts a roster of persistent, named Claude
4
+ teammates ("Bots"). Each Bot has a job description, its own conversation thread, durable memory,
5
+ enabled skills, and scheduled routines, and all Bots share one "agent computer": the local
6
+ machine, with a shared workspace directory, a persistent browser profile, and a terminal. It is
7
+ built on the [Claude Agent SDK](https://docs.claude.com/en/api/agent-sdk/overview), which spawns
8
+ the `claude` CLI under the hood — so a Bot's usage draws on your existing Claude Pro/Max
9
+ subscription login rather than a metered `ANTHROPIC_API_KEY`.
10
+
11
+ ## What it does
12
+
13
+ - **Bots** — persistent, named agents with a title, a standing job description, their own thread,
14
+ and a memory directory that survives daemon restarts.
15
+ - **A shared computer** — one workspace directory, one persistent browser profile, one terminal;
16
+ every Bot can reach what every other Bot can reach.
17
+ - **Approvals** — every tool call a Bot proposes passes a Permission Gateway: deterministic rules,
18
+ optional Haiku auto-review, or a human approval card in the thread.
19
+ - **Skills** — standard Claude skills (`SKILL.md`), installed with `antbot skill add <source>` from
20
+ a GitHub repo, git URL, local path, or direct link. Loaded into each Bot's session as a local
21
+ plugin, so Bots get the SDK's native `Skill` tool. Skills can also live in this repo's `skills/`
22
+ directory and are installed on every start. A Bot can install and remove skills itself, behind an
23
+ approval that spells out whether the source is one skill or a whole repository.
24
+ - **Routines** — cron-scheduled recurring turns per Bot, with run history and a real-work test run.
25
+ - **Multi-bot handoff** — Bots can hand a task to another Bot (`send_to_bot`) and talk in group
26
+ chats; a hop limit stops runaway ping-pong.
27
+ - **Browser use** — Playwright drives a persistent, shared browser profile per Bot, with a live
28
+ screencast and a "take over" flow for logins, 2FA, and CAPTCHAs.
29
+
30
+ ## Documentation
31
+
32
+ | Document | What it covers |
33
+ | --- | --- |
34
+ | **[`docs/USER-GUIDE.md`](docs/USER-GUIDE.md)** | **Complete user manual** — every screen, setting, and workflow, with step-by-step instructions |
35
+ | [`docs/SECURITY.md`](docs/SECURITY.md) | The trust model and what the permission system does and does not guarantee |
36
+ | [`docs/SKILLS.md`](docs/SKILLS.md) | Authoring skill files |
37
+ | [`docs/API-CONTRACT.md`](docs/API-CONTRACT.md) | HTTP and WebSocket API reference |
38
+
39
+ ## Requirements
40
+
41
+ - Node.js **>= 24**
42
+ - [pnpm](https://pnpm.io/) (this repo pins `pnpm@11.17.0` via `packageManager`)
43
+ - The `claude` CLI installed and logged in to a Claude Pro/Max subscription
44
+ (`npm i -g @anthropic-ai/claude-code`, then run `claude` once to log in)
45
+ - Optional: Chromium for browser use (`npx playwright install chromium`) — the daemon still runs
46
+ without it, just without browser-use tools
47
+
48
+ Run `./antbot doctor` (see [Quickstart](#quickstart)) to check all of the above at once.
49
+
50
+ ## Quickstart
51
+
52
+ Two ways in. Install the package if you want to *use* ant-bot; clone the repo if you want to
53
+ change it.
54
+
55
+ ### Install it (npm)
56
+
57
+ ```bash
58
+ npm i -g @michael-joseph-miller/ant-bot # or: pnpm add -g @michael-joseph-miller/ant-bot
59
+ antbot doctor # check Node, the claude CLI + login, data dir, port, native deps
60
+ antbot open # start the daemon and open the UI
61
+ ```
62
+
63
+ One package: the daemon, the CLI, the built web UI and the bundled skills. It needs Node 24+ and
64
+ a logged-in `claude` CLI, and nothing else — no pnpm, no TypeScript toolchain, no build step.
65
+ `antbot update` upgrades it later; `antbot status` and `antbot doctor` mention a new version when
66
+ one exists, but nothing ever updates itself in the background.
67
+
68
+ ### Work on it (clone)
69
+
70
+ ```bash
71
+ git clone <this repo> && cd ant-bot
72
+ pnpm install # installs dependencies and builds every package
73
+ ./antbot doctor
74
+ ./antbot open
75
+ ```
76
+
77
+ `./antbot` is a launcher in the repo root — it rebuilds when sources change, so there's nothing
78
+ to reinstall after a `git pull`. `pnpm build:package` assembles the publishable package into
79
+ `dist-npm/` if you want to see what ships.
80
+
81
+ Either way the UI is at **http://127.0.0.1:4780**, served by the daemon itself from the built
82
+ web assets. There's no separate frontend server to run.
83
+
84
+ ### The commands you'll actually use
85
+
86
+ | Command | What it does |
87
+ | --- | --- |
88
+ | `antbot open` | Open the web UI, starting the daemon first if it isn't running |
89
+ | `antbot start` | Start the daemon in the background (`--open` to open the UI too) |
90
+ | `antbot stop` | Stop the daemon |
91
+ | `antbot restart` | Stop and start again |
92
+ | `antbot status` | Whether it's running, on what port, with how many bots |
93
+ | `antbot doctor` | Diagnose the environment; every failure prints its fix |
94
+ | `antbot update` | Update to the latest published version (`--check` to look without installing) |
95
+
96
+ Run `antbot --help` for the full list, or `antbot <command> --help` for one command.
97
+
98
+ ### Putting `antbot` on your PATH
99
+
100
+ `./antbot` works from the repo root without any install step. To type plain `antbot` from
101
+ anywhere, symlink it into a directory already on your `PATH`:
102
+
103
+ ```bash
104
+ ln -s "$PWD/antbot" ~/.local/bin/antbot # or /usr/local/bin, or anywhere on your PATH
105
+ ```
106
+
107
+ The launcher resolves symlinks, so it still finds the repo and rebuilds when sources change.
108
+ From the repo root you can also skip the `./` with `pnpm antbot status`.
109
+
110
+ ### Data directory
111
+
112
+ Data lives under `~/.ant-bot` by default (database, workspace, skills, attachments, browser
113
+ profile, logs, backups). Set **`ANTBOT_HOME`** to point the daemon and CLI at a different data
114
+ directory, e.g. for a second profile or a test instance:
115
+
116
+ ```bash
117
+ ANTBOT_HOME=/path/to/alt-home ./antbot start --port 4791
118
+ ```
119
+
120
+ ## First bot in 5 minutes
121
+
122
+ 1. Open http://127.0.0.1:4780 and create a new Bot (sidebar → New). Give it a **name**, a
123
+ **title**, and a real **job description** — not "General Helper." The description is durable:
124
+ it becomes standing rules the Bot follows on every turn (e.g. "Never send external messages
125
+ without approval. Always cite sources.").
126
+ 2. Drop a file into the shared workspace so the Bot has something real to read:
127
+ ```bash
128
+ echo "Q3 numbers: revenue up 12%, churn down 2pts." > ~/.ant-bot/workspace/notes.txt
129
+ ```
130
+ 3. Message the Bot in its thread: *"Read `notes.txt` in the workspace and summarize it in two
131
+ sentences."* You'll see the reply stream in as text, with a tool-activity card showing the
132
+ `Read` call.
133
+ 4. Ask it to do something that needs approval, e.g. *"Run `git log` in the workspace"* (allowed by
134
+ default) vs. *"Install a package"* or *"curl an external API with POST data"* — those trip a
135
+ built-in `require` rule and produce an **approval card** inline in the thread: tool name,
136
+ human-readable summary, the exact raw input (collapsible), and Allow once / Deny / Always
137
+ allow buttons. Nothing runs until you decide.
138
+ 5. Restart the daemon (`antbot stop && antbot start`, or just `kill` and `start` again) — the
139
+ conversation, the Bot's session, and its memory survive.
140
+
141
+ ## Architecture
142
+
143
+ ```
144
+ ┌──────────────────────────────── Web UI (React, localhost:4780) ───────────────────────────────┐
145
+ │ Sidebar (roster, attention states) │ Thread view (messages, tool/approval cards, composer) │
146
+ │ Computer view (screencast + takeover) │ Settings, Rules, Routines, Skills, Usage, Workspace │
147
+ └───────────────▲───────────────────────────────────────────────▲───────────────────────────────┘
148
+ │ REST (CRUD) │ WebSocket (/api/events, deltas,
149
+ │ │ approvals, screencast frames)
150
+ ┌───────────────┴───────────────────────────────────────────────┴───────────────────────────────┐
151
+ │ ant-bot daemon (Node, Fastify) │
152
+ │ │
153
+ │ ┌────────────┐ ┌──────────────┐ ┌────────────────┐ ┌───────────┐ ┌────────────────────┐ │
154
+ │ │ API layer │ │ Bot Manager │ │ Permission │ │ Scheduler │ │ Event Bus (in-proc) │ │
155
+ │ │ (Fastify │ │ (FIFO queue, │ │ Gateway │ │ (node-cron│ │ → WS fanout, seq- │ │
156
+ │ │ routes) │ │ one turn │ │ (rules.ts → │ │ per │ │ ordered │ │
157
+ │ │ │ │ per bot at │ │ optional Haiku│ │ routine, │ │ │ │
158
+ │ │ │ │ a time) │ │ review → │ │ run │ │ │ │
159
+ │ │ │ │ │ │ approval card)│ │ history) │ │ │ │
160
+ │ └────────────┘ └──────┬───────┘ └───────▲────────┘ └─────┬─────┘ └─────────────────────┘ │
161
+ │ │ spawns │ canUseTool │ enqueues routine turns │
162
+ │ ┌──────▼─────────────────┴──────────────────────┐ │
163
+ │ │ Agent Session (Claude Agent SDK per turn) │ │
164
+ │ │ system prompt = persona + job description + │ │
165
+ │ │ memory + skills + roster; tools: fs/bash, │ │
166
+ │ │ send_to_bot, remember, request_secret, │ │
167
+ │ │ browser_* (via computer service) │ │
168
+ │ └──────┬──────────────────────────────────────────┘ │
169
+ │ │ │
170
+ │ ┌──────────────────────▼───────────────┐ ┌──────────────────────────────────────────────┐ │
171
+ │ │ Computer service (packages/server/ │ │ Storage: SQLite (better-sqlite3, WAL) — │ │
172
+ │ │ src/computer): Playwright persistent │ │ bots, threads, messages, approvals, rules, │ │
173
+ │ │ profile, per-bot screen lock, │ │ skills, routines, mailbox, usage, settings + │ │
174
+ │ │ screencast, takeover │ │ ~/.ant-bot/workspace + attachments on disk │ │
175
+ │ └────────────────────────────────────────┘ └──────────────────────────────────────────────┘ │
176
+ └─────────────────────────────────────────────────────────────────────────────────────────────────┘
177
+ │ subscription auth: Claude Code CLI login (~/.claude), spawned per turn by the Agent SDK
178
+ ```
179
+
180
+ Every tool call inside an Agent SDK turn is routed through `canUseTool`, which calls into the
181
+ Permission Gateway before the tool is allowed to run — this is true for the built-in tools
182
+ (`Bash`, `Read`, `Write`, `Edit`, `WebFetch`, ...), the custom `send_to_bot` / `remember` /
183
+ `request_secret` tools, and the `browser_*` tools alike.
184
+
185
+ ## CLI commands
186
+
187
+ All commands are implemented in `packages/cli`. Run them as `./antbot <command>` from the repo
188
+ root, or as plain `antbot <command>` once it is [on your `PATH`](#putting-antbot-on-your-path).
189
+
190
+ | Command | Description |
191
+ |---|---|
192
+ | `start [--port N] [--open] [--foreground]` | Start the daemon (detached by default; `--open` opens the UI once healthy; `--foreground` keeps it attached to the current terminal) |
193
+ | `stop` | Stop the running daemon (only if it was started by the CLI and has a pidfile) |
194
+ | `restart [--port N]` | Stop the daemon and start it again |
195
+ | `status` | Show whether the daemon is running, its URL, version, data dir, and bot count |
196
+ | `doctor` | Diagnose the local environment: Node version, `claude` CLI + login, `ANTHROPIC_API_KEY`, data-dir permissions, port availability, `better-sqlite3` native module, Playwright Chromium |
197
+ | `open` | Open the UI in the default browser, starting the daemon first if it isn't running |
198
+ | `skill <add\|list\|remove>` | Manage the skills your bots can use |
199
+ | `backup [--out PATH]` | Write a `.tar.gz` of the database, `config.toml`, skills, and every bot's memory directory (excludes the browser profile and attachments) |
200
+ | `restore <path> [--yes]` | Restore a backup archive over `~/.ant-bot` (prompts for confirmation unless `--yes`) |
201
+ | `-h, --help` / `-v, --version` | Global help / CLI version |
202
+
203
+ Every command takes `--help`, e.g. `antbot start --help`.
204
+
205
+ ## Project layout
206
+
207
+ | Path | What it is |
208
+ |---|---|
209
+ | `packages/shared` | Zod schemas + TypeScript types for every entity and API request/response, `LIMITS` constants, the WS event union — imported by both server and web |
210
+ | `packages/server` | The daemon: Fastify API + WS (`src/api`), Bot lifecycle and queue (`src/bots`), Agent SDK wrapper (`src/agent`), Permission Gateway + rules + secrets (`src/permissions`), scheduler/cron (`src/scheduler`), skills store (`src/skills`), browser/computer service (`src/computer`), SQLite layer (`src/db`), config + paths (`src/config`) |
211
+ | `packages/web` | React 19 + Vite UI: sidebar, thread view, approval cards, rules/settings/routines/usage screens, workspace browser, command palette |
212
+ | `packages/cli` | The `antbot` CLI: start/stop/restart/status/doctor/open/skill/backup/restore |
213
+ | `skills/` | The skills that ship with ant-bot — `bug-repro`, `deep-research`, `inbox-digest`, `skill-author`, `weekly-report` — plus `SPEC.md`, the Agent Skills spec they all conform to. Installed into `~/.ant-bot/skills` on every start and refreshed on upgrade unless you have edited or deleted your copy |
214
+ | `computer/` | Placeholder for an optional containerized "computer" image — **not implemented** (see Status below) |
215
+ | `docs/` | This plan, the design-doctrine outline it's translated from, and the frozen API contract |
216
+
217
+ ## Testing
218
+
219
+ Each package uses Vitest. Run all of them from the repo root with `pnpm test`, or per package:
220
+
221
+ ```bash
222
+ pnpm --filter @antbot/shared test
223
+ pnpm --filter @antbot/server test
224
+ pnpm --filter @antbot/web test
225
+ pnpm --filter @antbot/cli test
226
+ ```
227
+
228
+ Current totals, as run against this checkout:
229
+
230
+ | Package | Test files | Tests |
231
+ |---|---|---|
232
+ | `@antbot/shared` | 1 | 19 |
233
+ | `@antbot/server` | 19 | 450 |
234
+ | `@antbot/web` | 7 | 49 |
235
+ | `@antbot/cli` | 7 | 114 |
236
+ | **Total** | **34** | **632** |
237
+
238
+ ## Status / not built
239
+
240
+ Honestly, as of this checkout:
241
+
242
+ - **Container computer mode** — `computer.mode` is a valid `"host" | "container"` setting in the
243
+ schema and shows up in Settings, but only `host` mode has an implementation; the `computer/`
244
+ directory in the repo is an empty placeholder. There is no container image, and selecting
245
+ `container` does not change daemon behavior.
246
+ - **Teach-by-demonstration** — not implemented. There is no trace recording, no draft-skill-from-
247
+ recording flow, and no "Teach a task" UI affordance anywhere in the codebase.
248
+ - **Event-trigger webhooks** — not implemented. Routines only fire on a cron schedule
249
+ (`node-cron`, timezone-aware) or via a manual test run; there is no `/api/hooks/:routineKey`
250
+ route, no HMAC verification, and no file-watch trigger in the server source.
251
+ - **OS notification wiring** — the `Settings.notificationsEnabled` flag and a per-bot
252
+ `notifications` toggle exist and are persisted, and the scheduler publishes a `notify` event
253
+ over the bus (e.g. the away-guard "still away?" prompt) for the UI to render, but there is no
254
+ OS-level notification integration (no `node-notifier` or platform notification call anywhere in
255
+ the server source) — attention state is currently in-app only.
256
+ - **Mobile / iOS** — no native app; the web UI is responsive but there is no dedicated mobile
257
+ client or push delivery path.
258
+ - **Multi-user / teams** — single local user only; there is no authentication, no accounts, and no
259
+ team administration. See `docs/SECURITY.md` for what that implies.
260
+
261
+ The `Settings.localExecution` field (`ask | always | never`) maps the Grok Bot "cloud computer vs.
262
+ your machine" split onto a path boundary, since ant-bot has only one physical machine: the
263
+ workspace is the Bots' computer, and a tool call reaching outside it is denied (`never`), forced
264
+ to a human approval (`ask`, the default), or left to normal rule evaluation (`always`). The check
265
+ runs ahead of `allow` rules, so a broad rule can't unlock it. Bash reach detection is a
266
+ conservative heuristic, not a sandbox — see `docs/SECURITY.md` for what it does and does not
267
+ catch.