@bastani/atomic 0.9.19-alpha.4 → 0.9.19-alpha.6

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 (119) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  3. package/dist/builtin/intercom/broker/client.ts +19 -1
  4. package/dist/builtin/intercom/index.bundle.mjs +8 -1
  5. package/dist/builtin/intercom/package.json +1 -1
  6. package/dist/builtin/mcp/package.json +1 -1
  7. package/dist/builtin/subagents/CHANGELOG.md +12 -0
  8. package/dist/builtin/subagents/README.md +6 -4
  9. package/dist/builtin/subagents/agents/codebase-online-researcher.md +7 -7
  10. package/dist/builtin/subagents/agents/debugger.md +2 -2
  11. package/dist/builtin/subagents/package.json +1 -1
  12. package/dist/builtin/subagents/skills/subagent/SKILL.md +16 -14
  13. package/dist/builtin/subagents/src/extension/index.bundle.mjs +2 -1
  14. package/dist/builtin/web-access/CHANGELOG.md +7 -0
  15. package/dist/builtin/web-access/README.md +31 -24
  16. package/dist/builtin/web-access/index.bundle.mjs +16099 -77
  17. package/dist/builtin/web-access/package.json +2 -1
  18. package/dist/builtin/workflows/CHANGELOG.md +13 -0
  19. package/dist/builtin/workflows/builtin/{chunk-9k3ywfgd.js → chunk-1nbq96fh.js} +18 -18
  20. package/dist/builtin/workflows/builtin/{chunk-ahbntmx2.js → chunk-vhmnzdj9.js} +36 -36
  21. package/dist/builtin/workflows/builtin/{chunk-62v3gg9f.js → chunk-yeee2jrc.js} +11 -11
  22. package/dist/builtin/workflows/builtin/goal.js +1 -1
  23. package/dist/builtin/workflows/builtin/index.js +3 -3
  24. package/dist/builtin/workflows/builtin/open-claude-design.js +1 -1
  25. package/dist/builtin/workflows/builtin/ralph.js +1 -1
  26. package/dist/builtin/workflows/package.json +1 -1
  27. package/dist/builtin/workflows/src/extension/index.bundle.mjs +96 -67
  28. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  29. package/dist/core/agent-session-tool-registry.js +10 -0
  30. package/dist/core/agent-session-tool-registry.js.map +1 -1
  31. package/dist/core/bash-executor.js.map +1 -1
  32. package/dist/core/tools/bash.d.ts +1 -1
  33. package/dist/core/tools/bash.d.ts.map +1 -1
  34. package/dist/core/tools/bash.js +3 -2
  35. package/dist/core/tools/bash.js.map +1 -1
  36. package/dist/core/tools/edit.d.ts +3 -0
  37. package/dist/core/tools/edit.d.ts.map +1 -1
  38. package/dist/core/tools/edit.js +91 -12
  39. package/dist/core/tools/edit.js.map +1 -1
  40. package/dist/core/tools/file-mutation-coordinator.d.ts +255 -0
  41. package/dist/core/tools/file-mutation-coordinator.d.ts.map +1 -0
  42. package/dist/core/tools/file-mutation-coordinator.js +300 -0
  43. package/dist/core/tools/file-mutation-coordinator.js.map +1 -0
  44. package/dist/core/tools/file-mutation-queue.d.ts +14 -1
  45. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  46. package/dist/core/tools/file-mutation-queue.js +15 -3
  47. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  48. package/dist/core/tools/hashline.d.ts +9 -0
  49. package/dist/core/tools/hashline.d.ts.map +1 -1
  50. package/dist/core/tools/hashline.js +12 -1
  51. package/dist/core/tools/hashline.js.map +1 -1
  52. package/dist/core/tools/index.d.ts +9 -1
  53. package/dist/core/tools/index.d.ts.map +1 -1
  54. package/dist/core/tools/index.js +67 -12
  55. package/dist/core/tools/index.js.map +1 -1
  56. package/dist/core/tools/non-minting-snapshot-store.d.ts +49 -0
  57. package/dist/core/tools/non-minting-snapshot-store.d.ts.map +1 -0
  58. package/dist/core/tools/non-minting-snapshot-store.js +64 -0
  59. package/dist/core/tools/non-minting-snapshot-store.js.map +1 -0
  60. package/dist/core/tools/powershell.d.ts +2 -2
  61. package/dist/core/tools/powershell.d.ts.map +1 -1
  62. package/dist/core/tools/powershell.js +2 -5
  63. package/dist/core/tools/powershell.js.map +1 -1
  64. package/dist/core/tools/read-document-extract.js.map +1 -1
  65. package/dist/core/tools/render-utils.js.map +1 -1
  66. package/dist/core/tools/write.d.ts +30 -1
  67. package/dist/core/tools/write.d.ts.map +1 -1
  68. package/dist/core/tools/write.js +97 -8
  69. package/dist/core/tools/write.js.map +1 -1
  70. package/dist/index.d.ts +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  74. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  75. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  76. package/dist/modes/interactive/interactive-mode-base.js +3 -1
  77. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  78. package/dist/modes/interactive/interactive-mode-surface.d.ts +1 -1
  79. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  80. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  81. package/dist/modes/interactive/interactive-render-chat.js +28 -4
  82. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  83. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  84. package/dist/modes/interactive/interactive-startup.js +3 -0
  85. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  86. package/dist/modes/interactive-engine/activity-watchdog.d.ts +2 -2
  87. package/dist/modes/interactive-engine/activity-watchdog.d.ts.map +1 -1
  88. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -1
  89. package/dist/modes/interactive-engine/engine-diagnostic-view.d.ts +3 -1
  90. package/dist/modes/interactive-engine/engine-diagnostic-view.d.ts.map +1 -1
  91. package/dist/modes/interactive-engine/engine-diagnostic-view.js +11 -0
  92. package/dist/modes/interactive-engine/engine-diagnostic-view.js.map +1 -1
  93. package/dist/modes/interactive-engine/isolated-runtime.js +2 -1
  94. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  95. package/dist/modes/rpc/rpc-client-process.d.ts +2 -0
  96. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  97. package/dist/modes/rpc/rpc-client-process.js +23 -1
  98. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  99. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  100. package/dist/modes/rpc/rpc-client.js +20 -3
  101. package/dist/modes/rpc/rpc-client.js.map +1 -1
  102. package/dist/utils/markit.d.ts +2 -0
  103. package/dist/utils/markit.d.ts.map +1 -1
  104. package/dist/utils/markit.js +65 -5
  105. package/dist/utils/markit.js.map +1 -1
  106. package/docs/background-tasks.md +14 -10
  107. package/docs/containerization.md +7 -5
  108. package/docs/development.md +11 -0
  109. package/docs/docs.json +1 -0
  110. package/docs/providers.md +1 -1
  111. package/docs/subagents.md +4 -2
  112. package/docs/tools.md +26 -0
  113. package/docs/web-access.md +38 -0
  114. package/docs/workflows/builtins.md +9 -6
  115. package/examples/extensions/gondolin/index.ts +116 -148
  116. package/examples/extensions/gondolin/package.json +1 -1
  117. package/examples/extensions/ssh.ts +56 -34
  118. package/npm-shrinkwrap.json +33 -33
  119. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -2,6 +2,39 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.19-alpha.6] - 2026-09-11
6
+
7
+ ### Breaking Changes
8
+
9
+ - `write` no longer silently overwrites a file this session has never seen. Replacing an existing file now requires the session to have already observed exactly the content being replaced, checked under the same per-file mutation queue as the write. A session with no version of its own is refused with `no_prior_observation`; one whose recorded version no longer matches the file on disk is refused with `changed_since_observation` and told which line diverged, what it assumed was there, and what the file holds instead. Both carry the same `FILE_MUTATION_CONFLICT` code and requester identity as an `edit` conflict. Creating a new file, and overwriting one this session read, wrote, or edited, are unaffected ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
10
+ - `WriteOperations` now requires a `readFile` member, and `writeFile` receives an optional third `WriteFileOptions` argument. `write` reads before every write to refuse generated files, to check that the session has observed what it is replacing, and to decide between creating and overwriting; routing that read through `WriteOperations` is what makes those checks see the filesystem a custom or remote implementation actually writes to, rather than local disk. `readFile` must report absence as `undefined` and reject for anything else, since a path that exists but cannot be read is not a free path. Existing `writeFile` implementations continue to typecheck and may ignore the new options argument, losing only exclusive-create semantics ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
11
+ - Bundled `code_search` now requires `repoName` in `owner/repo` format alongside `query` and uses DeepWiki MCP for public-repository questions instead of Exa. Add the repository to existing calls. There is no Exa fallback; `web_search` is unchanged, and `maxTokens` remains a best-effort local output bound.
12
+
13
+ ### Changed
14
+
15
+ - Shell guidance now favors the owner's normal observation budget over routine one-second yields and repeated short polls. Bash and PowerShell share this guidance; explicit budgets, background execution, and execution timeouts are unchanged.
16
+ - Bundled delegation guidance now favors keeping immediately blocking work local and overlapping independent tasks, while preserving specialist and explicitly requested delegation.
17
+
18
+ ### Fixed
19
+
20
+ - Fixed continuously noisy engines growing interactive diagnostic history without limit. Recent diagnostics retain their order and duplicates without removing normal chat or status messages.
21
+ - Fixed damaged-PDF reads corrupting the fullscreen terminal with MuPDF diagnostics. Bounded diagnostics now appear in the TUI when interactive and use `console.log` otherwise; conversion failures also retain their diagnostic suffix ([#2964](https://github.com/bastani-inc/atomic/issues/2964)).
22
+ - Routed RPC engine stderr through bounded, deferred status messages instead of synchronous filesystem writes or raw terminal output, preserving Unicode characters split across output chunks. Interactive MuPDF and engine diagnostic display neutralizes terminal controls without changing stored diagnostic text. RPC stdout remains JSON-only, and child diagnostics reach the interactive host without changing engine health ([#2964](https://github.com/bastani-inc/atomic/issues/2964)).
23
+ - A rejected `edit` no longer hands back a snapshot tag that authorizes the same edit on retry. Building the rejection recorded the file's current content in the session's snapshot store and reported that tag in the error, so re-sending the identical edit with the reported tag was accepted even though the model had never read the changed file, silently overwriting whatever the other writer had just put there. The rejection now reports the tag without recording it, so the retry is rejected again and the model must re-read first. Drift recovery for tags the session did record is unchanged ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
24
+ - An `edit` rejected because the file changed after the patch was prepared now reports which line diverged, what the edit assumed was there, what the file holds instead, and how large the target is, instead of a bare "content changed before write". A file deleted in that same window is reported as a missing target rather than a raw filesystem error, and no longer tells the model to re-read a file that is gone. A path that survives but stops being readable, because it was replaced by a directory, locked, or made inaccessible, is now reported as an unreadable target carrying the filesystem error code, instead of escaping as an untyped error. Rejections carry a stable `FILE_MUTATION_CONFLICT` code and the identity of the session, workflow stage, or subagent whose call was refused, so parallel workers editing one file are distinguishable ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
25
+ - A `write` or hashline `edit` cancelled after its bytes had already reached disk no longer left the change unrecorded, which made the session's own file look like another agent's work on the next overwrite ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
26
+ - `write` creating a file now claims the path exclusively (`O_EXCL`). A file that appears between `write` observing an absent path and its own write landing is reported as `target_exists`, describing what is there now, instead of being silently truncated ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
27
+ - Standalone write tools retain their implicit observation store across `local://` writes, so overwriting a file the same tool just created no longer incorrectly fails with `no_prior_observation`.
28
+ - Preserved typed `edit` conflicts when parent-directory permissions change after patch preparation. The rejection retains the original target identity and filesystem error code instead of escaping as a raw permission error ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
29
+ - Fixed the Gondolin example failing to load after removal of the legacy grep tool API. It now registers only its supported file and shell overrides; the search tool remains on the host, and guest-only content searches use the routed shell ([#2482](https://github.com/bastani-inc/atomic/pull/2482)).
30
+
31
+ ## [0.9.19-alpha.5] - 2026-09-11
32
+
33
+ ### Changed
34
+
35
+ - Open Claude Design now starts with Claude Fable 5.1 at medium effort, followed by Copilot Fable 5.1 and Astra at medium effort, with the same Fable-first order on OpenRouter.
36
+ - Tuned bundled debugger, Goal, and Ralph reasoning efforts: debugger uses Astra/Fable at medium and Sol at high; Goal and Ralph reviewers use Astra/Sol at high; orchestration, Ralph research, and design use Fable at medium and Sol at high in their fallbacks. Ralph prompt refinement and other bundled agents retain their existing configurations.
37
+
5
38
  ## [0.9.19-alpha.4] - 2026-09-10
6
39
 
7
40
  ### Breaking Changes
@@ -4,6 +4,12 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.19-alpha.6] - 2026-09-11
8
+
9
+ ### Fixed
10
+
11
+ - A broker refusal received by an already-registered client now rejects that client's outstanding requests with the broker's own reason instead of being discarded. Previously the refusal was delivered to a listener that `connect()` removes after registration, so pipelined work — notably the session-directory barrier behind workflow route updates — waited out its five-second timer and surfaced `List sessions timeout` or a generic disconnect. Reasons such as `Pending-stage route is not authorized` now reach callers as non-recoverable errors, and the `disconnected` event carries the same cause. Pre-registration rejection, transport-disconnect classification, and explicit shutdown are unchanged.
12
+
7
13
  ## [0.9.19-alpha.4] - 2026-09-10
8
14
 
9
15
  ### Fixed
@@ -415,7 +415,25 @@ export class IntercomClient extends EventEmitter {
415
415
  }
416
416
  case "registration_failed": {
417
417
  if (typeof brokerMessage.reason !== "string") throw new Error("Invalid registration_failed message");
418
- this.emit("_registration_failed", new Error(brokerMessage.reason));
418
+ const refusal = new Error(brokerMessage.reason);
419
+ if (this._sessionId === null) {
420
+ // Still registering: `connect()` owns the failure and its own cleanup.
421
+ this.emit("_registration_failed", refusal);
422
+ break;
423
+ }
424
+ // The broker reuses this frame to refuse an *established* client's request
425
+ // (for example a rejected pending-stage route update) and then ends the
426
+ // socket, deliberately dropping anything already pipelined behind it. By
427
+ // this point `connect()` has removed its `_registration_failed` listener,
428
+ // so emitting there would discard the refusal and leave every pipelined
429
+ // request — notably the `listSessions()` barrier — to expire on its own
430
+ // five-second timer with an unusable diagnostic. Record the refusal as the
431
+ // disconnect cause, settle outstanding work with it, and destroy the socket
432
+ // so no new work is accepted while we wait for the peer FIN. `onClose`
433
+ // still owns session/socket teardown and the `disconnected` emission.
434
+ this.disconnectError ??= refusal;
435
+ this.failPending(this.disconnectError);
436
+ this.socket?.destroy();
419
437
  break;
420
438
  }
421
439
  case "question_target": {
@@ -728,7 +728,14 @@ var init_client = __esm(() => {
728
728
  case "registration_failed": {
729
729
  if (typeof brokerMessage.reason !== "string")
730
730
  throw new Error("Invalid registration_failed message");
731
- this.emit("_registration_failed", new Error(brokerMessage.reason));
731
+ const refusal = new Error(brokerMessage.reason);
732
+ if (this._sessionId === null) {
733
+ this.emit("_registration_failed", refusal);
734
+ break;
735
+ }
736
+ this.disconnectError ??= refusal;
737
+ this.failPending(this.disconnectError);
738
+ this.socket?.destroy();
732
739
  break;
733
740
  }
734
741
  case "question_target": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.19-alpha.4",
3
+ "version": "0.9.19-alpha.6",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions. Fork of: https://github.com/nicobailon/pi-intercom",
6
6
  "contributors": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.9.19-alpha.4",
3
+ "version": "0.9.19-alpha.6",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
6
6
  "contributors": [
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.19-alpha.6] - 2026-09-11
6
+
7
+ ### Changed
8
+
9
+ - Delegation guidance now favors keeping immediately blocking work local unless specialist expertise, context isolation, or an explicit request warrants a child. Parents are guided to continue independent work and wait on dependencies rather than repeatedly polling. Background launch defaults and explicit foreground waits are unchanged.
10
+
11
+ ## [0.9.19-alpha.5] - 2026-09-11
12
+
13
+ ### Changed
14
+
15
+ - The bundled debugger now uses GPT-6 Astra at `medium`, with Astra/Fable 5.1/Fable 5 fallbacks at `medium` and Sol at `high`. Its complete fallback order, other model efforts, and all other bundled agent configurations remain unchanged.
16
+
5
17
  ## [0.9.19-alpha.4] - 2026-09-10
6
18
 
7
19
  ### Breaking Changes
@@ -125,7 +125,7 @@ There is no generic `reviewer` or `planner` agent; pick the specialist whose ang
125
125
 
126
126
  ## Changing a builtin agent's model
127
127
 
128
- Builtin agents inherit your current Pi default model by default. This keeps new installs from depending on a provider you may not have configured. If you want a role to use a specific model, set an override instead of copying the bundled agent file.
128
+ Builtin agents declare role-specific models and ordered fallbacks. The debugger starts with `openai-codex/gpt-6-astra:medium`, with Astra/Fable fallbacks at `medium` and Sol/Opus fallbacks at `high`. See the [bundled defaults](../coding-agent/docs/subagents.md#bundled-agents) for the other roles. If you want a role to use a specific model, set an override instead of copying the bundled agent file.
129
129
 
130
130
  For one run, pass `model` on the `subagent` call:
131
131
 
@@ -134,7 +134,7 @@ subagent({ agent: "codebase-analyzer", task: "Review this diff", model: "anthrop
134
134
  ```
135
135
 
136
136
 
137
- For a persistent override, edit settings. This example pins the codebase-analyzer everywhere, adds a backup model for provider failures, and keeps the other builtins on your normal default model:
137
+ For a persistent override, edit settings. This example pins the codebase-analyzer everywhere, adds a backup model for provider failures, and keeps the other builtins on their configured defaults:
138
138
 
139
139
  ```json
140
140
  {
@@ -176,10 +176,12 @@ Show me the current subagent status.
176
176
 
177
177
  The agent can choose a mode for each authorized call without asking you merely to select an execution mode:
178
178
 
179
+ Keep immediately blocking work local unless specialist expertise, context isolation, or an explicit delegation request makes a child worthwhile. Continue independent work after spawning without duplicating the child's task. Wait when its result becomes a dependency; otherwise rely on completion notices rather than repeated short waits or status polls.
180
+
179
181
  ```ts
180
182
  subagent({ agent: "codebase-analyzer", task: "Trace authentication.", wait: { kind: "background" } })
181
183
  subagent({ agent: "codebase-analyzer", task: "Trace authentication.", wait: { kind: "foreground", budgetMs: 30000 } })
182
- subagent({ action: "wait", id: taskId, budgetMs: 1000 })
184
+ subagent({ action: "wait", id: taskId })
183
185
  subagent({ action: "status", id: taskId })
184
186
  subagent({ action: "kill", id: taskId })
185
187
  ```
@@ -263,7 +265,7 @@ Agent locations, lowest to highest priority:
263
265
 
264
266
  Project discovery also reads legacy `.agents/**/*.md` and `.pi/agents/**/*.md` files. Nested subdirectories are discovered recursively. If primary Atomic and legacy paths define the same parsed runtime agent name, the primary `.atomic/agents/` definition wins. Use `agentScope: "user" | "project" | "both"` to control discovery; `both` is the default and project definitions win runtime-name collisions.
265
267
 
266
- Builtin agents load at the lowest priority, so a user or project agent with the same name overrides them. They do not pin a provider model; they inherit your current Atomic default model unless you set `subagents.agentOverrides.<name>.model`. `worker` is the implementation agent for normal tasks and approved orchestrator handoffs.
268
+ Builtin agents load at the lowest priority, so a user or project agent with the same name overrides them. Their declared models and fallback chains apply unless you set an override such as `subagents.agentOverrides.<name>.model`. `worker` is the implementation agent for normal tasks and approved orchestrator handoffs.
267
269
 
268
270
  The `codebase-online-researcher` builtin uses `web_search`, `fetch_content`, and `get_search_content`; those require [pi-web-access](https://github.com/nicobailon/pi-web-access):
269
271
 
@@ -28,7 +28,7 @@ You research current technical information from authoritative external sources:
28
28
 
29
29
  Check `research/web/` for a recent cached copy first; fetch only when it is missing or stale. Reuse repositories already under `/tmp/atomic-github-repos/`, and persist reusable high-value fetches to `research/web/`.
30
30
 
31
- For static pages, use the least expensive route that succeeds: `fetch_content <url>`; then the site's `/llms.txt`; then `bash` with `curl <url> -H "Accept: text/markdown"` (inspect `content-type: text/markdown` and `x-markdown-tokens`); then `playwright-cli`. Start with the authoritative source rather than broad search when it is known.
31
+ For static pages, use the least expensive route that succeeds: `fetch_content({ urls: ["https://example.com"] })`; then the site's `/llms.txt`; then `bash` with `curl <url> -H "Accept: text/markdown"` (inspect `content-type: text/markdown` and `x-markdown-tokens`); then `playwright-cli`. Start with the authoritative source rather than broad search when it is known.
32
32
 
33
33
  Batch independent calls in one turn to reduce round-trips. `fetch_content({ urls: [...] })` fetches three URLs concurrently; independent git/gh commands may use `&` plus `wait`. Tool calls otherwise execute sequentially.
34
34
 
@@ -44,7 +44,7 @@ Choose the route that matches the question:
44
44
  - **Technical solutions:** search exact errors and terms, official issues/discussions, Stack Overflow or technical forums, and comparable implementations.
45
45
  - **Comparisons:** use migration guides, benchmarks, performance evidence, and explicit decision criteria or matrices.
46
46
 
47
- For source repositories, prefer raw GitHub URLs over HTML when reading a known file. For version-specific questions, clone the tagged version with `fetch_content("https://github.com/<owner>/<repo>/tree/v1.0.0")`; resolve a tag SHA with `gh api repos/<owner>/<repo>/git/refs/tags/v1.0.0 --jq '.object.sha'` when needed.
47
+ For source repositories, prefer raw GitHub URLs over HTML when reading a known file. For version-specific questions, clone the tagged version with `fetch_content({ urls: ["https://github.com/<owner>/<repo>/tree/v1.0.0"] })`; resolve a tag SHA with `gh api repos/<owner>/<repo>/git/refs/tags/v1.0.0 --jq '.object.sha'` when needed.
48
48
 
49
49
  ## Video evidence
50
50
 
@@ -53,11 +53,11 @@ For source repositories, prefer raw GitHub URLs over HTML when reading a known f
53
53
  Examples of distinct calls:
54
54
 
55
55
  ```typescript
56
- fetch_content({ url: "https://youtube.com/watch?v=abc", prompt: "What libraries are imported?" })
57
- fetch_content({ url: "https://youtube.com/watch?v=abc", timestamp: "23:41" })
58
- fetch_content({ url: "https://youtube.com/watch?v=abc", timestamp: "23:41-25:00", frames: 3 })
59
- fetch_content({ url: "https://youtube.com/watch?v=abc", frames: 6 })
60
- fetch_content({ url: "/path/to/demo.mp4", prompt: "What error appears?" })
56
+ fetch_content({ urls: ["https://youtube.com/watch?v=abc"], prompt: "What libraries are imported?" })
57
+ fetch_content({ urls: ["https://youtube.com/watch?v=abc"], timestamp: "23:41" })
58
+ fetch_content({ urls: ["https://youtube.com/watch?v=abc"], timestamp: "23:41-25:00", frames: 3 })
59
+ fetch_content({ urls: ["https://youtube.com/watch?v=abc"], frames: 6 })
60
+ fetch_content({ urls: ["/path/to/demo.mp4"], prompt: "What error appears?" })
61
61
  fetch_content({ urls: ["https://youtube.com/watch?v=abc", "https://youtube.com/watch?v=def"], prompt: "What packages are installed?" })
62
62
  ```
63
63
 
@@ -2,8 +2,8 @@
2
2
  name: debugger
3
3
  description: Debug and fix errors, test failures, and unexpected behavior. Use PROACTIVELY when encountering issues, analyzing stack traces, or investigating system problems.
4
4
  tools: read, edit, write, search, find, ls, bash, web_search, fetch_content, get_search_content, intercom, contact_supervisor, todo
5
- model: openai-codex/gpt-6-astra:xhigh
6
- fallbackModels: github-copilot/gpt-6-astra:xhigh, openai/gpt-6-astra:xhigh, anthropic/claude-fable-5-1:high, github-copilot/claude-fable-5-1:high, anthropic/claude-opus-5:high, github-copilot/claude-opus-5:high, anthropic/claude-fable-5:high, github-copilot/claude-fable-5:high, openai-codex/gpt-5.6-sol:xhigh, github-copilot/gpt-5.6-sol:xhigh, openai/gpt-5.6-sol:xhigh, kimi-coding/k3:max, moonshotai/kimi-k3:max, moonshotai-cn/kimi-k3:max, openai-codex/gpt-5.5:xhigh, github-copilot/gpt-5.5:xhigh, openai/gpt-5.5:xhigh, anthropic/claude-opus-4-8:high, github-copilot/claude-opus-4.8:high, xai/grok-4.6:xhigh, github-copilot/grok-4.6:xhigh, zai/glm-5.3:high, zai-coding-cn/glm-5.3:high, zai/glm-5.3-flash:high, zai-coding-cn/glm-5.3-flash:high, baseten/zai-org/GLM-5.3:high, baseten/zai-org/GLM-5.3-Flash:high, openrouter/openai/gpt-6-astra:xhigh, openrouter/anthropic/claude-fable-5-1:high, openrouter/anthropic/claude-opus-5:high, openrouter/anthropic/claude-fable-5:high, openrouter/openai/gpt-5.6-sol:xhigh, openrouter/moonshotai/kimi-k3:max, openrouter/sakana/fugu-ultra:high, openrouter/openai/gpt-5.5:xhigh, openrouter/anthropic/claude-opus-4-8:high, openrouter/x-ai/grok-4.6:xhigh, openrouter/z-ai/glm-5.3:high, openrouter/z-ai/glm-5.3-flash:high
5
+ model: openai-codex/gpt-6-astra:medium
6
+ fallbackModels: github-copilot/gpt-6-astra:medium, openai/gpt-6-astra:medium, anthropic/claude-fable-5-1:medium, github-copilot/claude-fable-5-1:medium, anthropic/claude-opus-5:high, github-copilot/claude-opus-5:high, anthropic/claude-fable-5:medium, github-copilot/claude-fable-5:medium, openai-codex/gpt-5.6-sol:high, github-copilot/gpt-5.6-sol:high, openai/gpt-5.6-sol:high, kimi-coding/k3:max, moonshotai/kimi-k3:max, moonshotai-cn/kimi-k3:max, openai-codex/gpt-5.5:xhigh, github-copilot/gpt-5.5:xhigh, openai/gpt-5.5:xhigh, anthropic/claude-opus-4-8:high, github-copilot/claude-opus-4.8:high, xai/grok-4.6:xhigh, github-copilot/grok-4.6:xhigh, zai/glm-5.3:high, zai-coding-cn/glm-5.3:high, zai/glm-5.3-flash:high, zai-coding-cn/glm-5.3-flash:high, baseten/zai-org/GLM-5.3:high, baseten/zai-org/GLM-5.3-Flash:high, openrouter/openai/gpt-6-astra:medium, openrouter/anthropic/claude-fable-5-1:medium, openrouter/anthropic/claude-opus-5:high, openrouter/anthropic/claude-fable-5:medium, openrouter/openai/gpt-5.6-sol:high, openrouter/moonshotai/kimi-k3:max, openrouter/sakana/fugu-ultra:high, openrouter/openai/gpt-5.5:xhigh, openrouter/anthropic/claude-opus-4-8:high, openrouter/x-ai/grok-4.6:xhigh, openrouter/z-ai/glm-5.3:high, openrouter/z-ai/glm-5.3-flash:high
7
7
  skills: tdd, playwright-cli, tmux
8
8
  ---
9
9
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.9.19-alpha.4",
3
+ "version": "0.9.19-alpha.6",
4
4
  "private": true,
5
5
  "description": "Atomic extension for delegating tasks to subagents with parallel execution. Fork of: https://github.com/nicobailon/pi-subagents",
6
6
  "contributors": [
@@ -65,19 +65,19 @@ Use this after implementation when the user wants cleanup review or when a final
65
65
 
66
66
  Builtin agents load at the lowest priority. Project agents override user agents, and user/project agents override builtins with the same name.
67
67
 
68
- | Agent | Purpose | Default model | Thinking | Tools | Notes |
69
- | ---------------------------- | ----------------------------------------------------------------- | --------------------- | -------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
70
- | `codebase-locator` | Locate files, directories, tests, and configs relevant to a topic | `openai-codex/gpt-6-astra:low` | low | read, search, find, ls, bash | Read-only finder. Returns a categorized file map; no analysis. |
71
- | `codebase-analyzer` | Explain how specific code currently works | `openai-codex/gpt-6-astra:low` | low | read, search, find, ls, bash | Read-only. Traces flow with `file:line` references; does not critique. |
72
- | `codebase-pattern-finder` | Find similar implementations or conventions | `openai-codex/gpt-6-astra:low` | low | read, search, find, ls, bash | Read-only. Returns code snippets with `file:line` references. |
73
- | `codebase-research-locator` | Discover prior `research/` and `specs/` docs | `openai-codex/gpt-6-astra:low` | low | read, search, find, ls, bash | Read-only. Sorts by date, tiers by recency, flags supersession. |
74
- | `codebase-research-analyzer` | Extract decisions and constraints from prior docs | `openai-codex/gpt-6-astra:low` | low | read, search, find, ls, bash | Read-only. Filters aggressively for what still applies today. |
75
- | `codebase-online-researcher` | Web research with authoritative sources | `openai-codex/gpt-6-astra:low` | low | read, search, find, ls, bash, write, web_search, fetch_content, get_search_content | Has the `playwright-cli` skill. Persists keepers to `research/web/`. |
76
- | `code-simplifier` | Clean up recently changed code without changing behavior | `openai-codex/gpt-6-astra:low` | low | read, edit, write, search, find, ls, bash | **Writer.** Scopes to recently modified code by default; preserves all observable behavior. |
77
- | `debugger` | Reproduce, diagnose, and fix failing behavior | `openai-codex/gpt-6-astra:xhigh` | xhigh | read, edit, write, search, find, ls, bash, web_search, fetch_content, get_search_content, intercom, contact_supervisor, todo | **Writer.** Has the `tdd`, `playwright-cli`, and `tmux` skills. Can coordinate with the parent; inspect-only mode requires an explicit instruction. |
78
- | `worker` | Implement normal tasks and approved orchestrator handoffs | `openai-codex/gpt-6-astra:low` | low | read, edit, write, search, find, ls, bash, web_search, fetch_content, get_search_content, intercom, contact_supervisor, todo | **Writer.** Has the `tdd`, `playwright-cli`, and `tmux` skills. Defaults to forked context; escalates unapproved decisions instead of guessing. |
79
-
80
- Each builtin declares an explicit `model` and ordered `fallbackModels` sequence. Astra-led agents try GitHub Copilot Astra, OpenAI Astra, Anthropic Fable 5.1, then GitHub Copilot Fable 5.1 before older models. Ordinary agents use Astra/Fable 5.1 at `low`; debugger uses Astra at `xhigh` and Fable 5.1 at `high`. See each definition for its full provider-specific chain. The current user-selected model is automatically appended as the last fallback and de-duplicated. Override per run with inline config:
68
+ | Agent | Purpose | Tools | Notes |
69
+ | --- | --- | --- | --- |
70
+ | `codebase-locator` | Locate files, directories, tests, and configs relevant to a topic | read, search, find, ls, bash | Read-only finder. Returns a categorized file map; no analysis. |
71
+ | `codebase-analyzer` | Explain how specific code currently works | read, search, find, ls, bash | Read-only. Traces flow with `file:line` references; does not critique. |
72
+ | `codebase-pattern-finder` | Find similar implementations or conventions | read, search, find, ls, bash | Read-only. Returns code snippets with `file:line` references. |
73
+ | `codebase-research-locator` | Discover prior `research/` and `specs/` docs | read, search, find, ls, bash | Read-only. Sorts by date, tiers by recency, flags supersession. |
74
+ | `codebase-research-analyzer` | Extract decisions and constraints from prior docs | read, search, find, ls, bash | Read-only. Filters aggressively for what still applies today. |
75
+ | `codebase-online-researcher` | Web research with authoritative sources | read, search, find, ls, bash, write, web_search, fetch_content, get_search_content | Has the `playwright-cli` skill. Persists keepers to `research/web/`. |
76
+ | `code-simplifier` | Clean up recently changed code without changing behavior | read, edit, write, search, find, ls, bash | **Writer.** Scopes to recently modified code by default; preserves all observable behavior. |
77
+ | `debugger` | Reproduce, diagnose, and fix failing behavior | read, edit, write, search, find, ls, bash, web_search, fetch_content, get_search_content, intercom, contact_supervisor, todo | **Writer.** Has the `tdd`, `playwright-cli`, and `tmux` skills. Can coordinate with the parent; inspect-only mode requires an explicit instruction. |
78
+ | `worker` | Implement normal tasks and approved orchestrator handoffs | read, edit, write, search, find, ls, bash, web_search, fetch_content, get_search_content, intercom, contact_supervisor, todo | **Writer.** Has the `tdd`, `playwright-cli`, and `tmux` skills. Defaults to forked context; escalates unapproved decisions instead of guessing. |
79
+
80
+ Each builtin declares its model, reasoning level, and ordered fallback chain in its agent definition. Inspect the current configuration with `subagent({ action: "get", agent: "debugger" })` rather than relying on a fixed list of defaults. The current user-selected model is automatically appended as the last fallback and de-duplicated. Override per run with inline config:
81
81
 
82
82
  ```typescript
83
83
  subagent({ agent: "codebase-analyzer", task: "Trace the auth flow", model: "anthropic/claude-sonnet-4" })
@@ -209,9 +209,11 @@ Concurrent writers conflict. `code-simplifier` and `debugger` change files. Do n
209
209
 
210
210
  ### Foreground, background, and automatic yielding
211
211
 
212
+ Keep immediately blocking work local unless specialist expertise, context isolation, or an explicit user request justifies delegation. Prefer independent tasks you can overlap with useful parent work. Do not spawn a child merely to wait immediately, or duplicate its assigned work while it runs.
213
+
212
214
  Choose the observation mode for each authorized task. No extra user confirmation is needed merely to choose foreground or background. In owner-bound main and workflow-stage sessions, omitted `wait` or `wait: { kind: "background" }` returns after admission. Use `wait: { kind: "foreground", budgetMs: 30000 }` when the result is needed next. If the observation budget expires, the same child keeps running in the background; do not relaunch it. This applies to single and parallel calls.
213
215
 
214
- Use `subagent({ action: "wait", id: taskId, budgetMs: 1000 })` to observe an existing task, `status` to inspect its state, or `kill` to terminally stop it. A yielded receipt is not a terminal result. Background counts stay below the prompt; `/tasks` opens inspection only on command. A shaded completion notification reaches the owning chat without requiring a model reply. A later wait does not extend the owner's lifetime.
216
+ Use `subagent({ action: "wait", id: taskId })` to observe an existing task with the owner's budget, `status` to inspect its state, or `kill` to terminally stop it. Wait when the result becomes a dependency; otherwise rely on completion notices. Avoid repeated short waits or status polls; override the budget only for a concrete responsiveness need. A yielded receipt is not a terminal result. Background counts stay below the prompt; `/tasks` opens inspection only on command. A shaded completion notification reaches the owning chat without requiring a model reply. A later wait does not extend the owner's lifetime.
215
217
 
216
218
  Intercom `ask` cannot revive a completed, failed, interrupted, or cancelled noninteractive child, even if its retained registration says `idle`. New asks fail immediately, and termination fails an already-admitted ask that has not received a reply. Use a fresh child for follow-up work. Live interactive idle sessions and workflow post-mortem conversations remain separate reply-capable cases; `send` transport behavior is unchanged.
217
219
 
@@ -17148,9 +17148,10 @@ var DEFAULT_PROMPT_GUIDANCE = [
17148
17148
  - Explicit requests such as "quickly", "inline", "do this directly", or "don't use a workflow", and equivalent wording, override that default even for complex tasks. Treat "quickly" as an inline execution choice, not a request for a faster workflow. Do not create or launch a hidden/nested workflow or pressure the user to reapprove the choice. Preserve appropriate testing, review and evidence inline, and unrelated safety and authorization constraints. Apply the preference only to the specified task. Quoted examples and questions about inline code are not execution-mode instructions; neither are descriptions of software that should run quickly.
17149
17149
  - On a switch from an active workflow to inline, notify the controlling session to safely hold/stop the affected run, reconcile completed work and in-flight side effects, then continue inline without duplicate execution. Do not claim completed work was undone.
17150
17150
  - Use a single subagent for a focused specialty or parallel tasks for independent work. Keep substantial-overlap tasks together rather than duplicating investigation across agents.
17151
- - Delegate noisy or context-heavy command investigation when isolation helps, but run concise commands inline when that is simpler.
17151
+ - Keep immediately blocking work local unless specialist expertise, context isolation, or an explicit user request justifies delegation. Delegate independent work that can usefully overlap your own next steps; do not spawn a child merely to wait immediately. Delegate noisy or context-heavy command investigation when isolation helps, but run concise commands inline when that is simpler.
17152
17152
  - Background subagents are supported in owner-bound sessions: omitted wait or wait:{kind:"background"} yields after admission while the child continues. Use wait:{kind:"foreground",budgetMs:30000} for foreground-first observation. A yielded observation never means the task stopped. Do not duplicate delegated work; observe the existing task or await its completion notice. The UI shows compact status below the prompt, and /tasks opens inspection only when invoked.
17153
17153
  - Choose foreground-first or background observation for each authorized call based on whether the next action needs the result; do not ask the user merely to select a mode. Foreground observation automatically yields on budget expiry while the same task continues. Wait for terminal completion before starting dependent work. Execution mode does not bypass tool permissions, delegation boundaries, or owner lifetime.
17154
+ - Continue useful independent work after spawning without duplicating the child's task. Wait when its result becomes a dependency; otherwise rely on completion notices. Avoid repeated short waits or status polls. Omit the wait budget to use owner policy unless a concrete responsiveness need calls for an override.
17154
17155
  - Use the debugger subagent for actual failures that need reproduction, root-cause diagnosis, and a validated fix; additional debugger or research delegates are optional when they add a distinct useful angle.
17155
17156
  - Let each named agent use its declared model and fallback policy: omit the explicit model argument unless the user requests an exact model or a documented task requirement needs one, and record the reason for any override before launch. Do not choose an ad hoc model merely for diversity.
17156
17157
  - If an agent has no declared model or fallback policy, consult packages/coding-agent/docs/models/model-selection.md for the role's Pareto-efficient recommendations and packages/coding-agent/docs/models/evals.md for the measured per-evaluation scores by task type, then use workflow({ action: "models" }) when available to inspect the configured catalog. Pin only a returned fullId and only append a thinking level listed for that entry. If the catalog tool is unavailable, the catalog is empty, or no recommended model is present, leave the child unpinned and state the limitation rather than inventing a model. Do not inspect credentials or infer why a model is absent.
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.19-alpha.6] - 2026-09-11
8
+
9
+ ### Breaking Changes
10
+
11
+ - `fetch_content` now requires a nonempty `urls` array of nonempty strings for both single and batch requests. Replace `{ url: "..." }` with `{ urls: ["..."] }`. Invalid argument shapes and unrecognized fields are rejected before fetching; the `get_search_content` selectors are unchanged.
12
+ - `code_search` now requires a single `repoName` in `owner/repo` format alongside `query`. It asks DeepWiki about that public GitHub repository instead of searching Exa, with no Exa fallback. Update query-only calls to include the repository. No API key is required; `maxTokens` remains a best-effort local output bound. Unrelated `web_search` providers are unchanged.
13
+
7
14
  ## [0.9.14] - 2026-08-19
8
15
 
9
16
  Cumulative release of the `0.9.14-alpha.3` – `0.9.14-alpha.4` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
@@ -18,7 +18,7 @@ https://github.com/user-attachments/assets/cac6a17a-1eeb-4dde-9818-cdf85d8ea98f
18
18
 
19
19
  **Video Understanding** — Point it at a YouTube video or local screen recording and ask questions about what's on screen. Full transcripts, visual descriptions, and frame extraction at exact timestamps.
20
20
 
21
- **Smart Fallbacks** — Every capability has a fallback chain. Search tries Exa, then Perplexity, then Gemini API, then Gemini Web when browser cookies are enabled. YouTube tries Gemini Web when enabled, then API, then Perplexity. Blocked pages retry through Jina Reader and Gemini extraction. Something always works.
21
+ **Smart Fallbacks** — Web search tries Exa, then Perplexity, then Gemini API, then Gemini Web when browser cookies are enabled. YouTube tries Gemini Web when enabled, then API, then Perplexity. Blocked pages retry through Jina Reader and Gemini extraction. Repository-specific `code_search` uses DeepWiki only.
22
22
 
23
23
  **GitHub Cloning** — GitHub URLs are cloned locally instead of scraped. The agent gets real file contents and a local path to explore, not rendered HTML.
24
24
 
@@ -58,16 +58,16 @@ Requires Pi v0.37.3+.
58
58
  web_search({ query: "TypeScript best practices 2025" })
59
59
 
60
60
  // Fetch a page
61
- fetch_content({ url: "https://docs.example.com/guide" })
61
+ fetch_content({ urls: ["https://docs.example.com/guide"] })
62
62
 
63
63
  // Clone a GitHub repo
64
- fetch_content({ url: "https://github.com/owner/repo" })
64
+ fetch_content({ urls: ["https://github.com/owner/repo"] })
65
65
 
66
66
  // Understand a YouTube video
67
- fetch_content({ url: "https://youtube.com/watch?v=abc", prompt: "What libraries are shown?" })
67
+ fetch_content({ urls: ["https://youtube.com/watch?v=abc"], prompt: "What libraries are shown?" })
68
68
 
69
69
  // Analyze a screen recording
70
- fetch_content({ url: "/path/to/recording.mp4", prompt: "What error appears on screen?" })
70
+ fetch_content({ urls: ["/path/to/recording.mp4"], prompt: "What error appears on screen?" })
71
71
  ```
72
72
 
73
73
  ## Tools
@@ -100,34 +100,41 @@ web_search({ query: "...", includeContent: true })
100
100
 
101
101
  ### code_search
102
102
 
103
- Search for code examples, documentation, and API references via Exa MCP. No API key required. Uses Exa's code-context MCP tool when available and falls back to code-focused web search when that tool is unavailable.
103
+ Ask questions about code, architecture, and APIs in a public GitHub repository via DeepWiki MCP at `https://mcp.deepwiki.com/mcp`. No API key or local MCP configuration is required. DeepWiki availability and repository indexing determine which questions it can answer.
104
104
 
105
105
  ```typescript
106
- code_search({ query: "React useEffect cleanup pattern" })
107
- code_search({ query: "Express middleware error handling", maxTokens: 10000 })
106
+ code_search({ repoName: "facebook/react", query: "How does useEffect cleanup work?" })
107
+ code_search({ repoName: "expressjs/express", query: "How is middleware error handling implemented?", maxTokens: 10000 })
108
108
  ```
109
109
 
110
110
  | Parameter | Description |
111
111
  |-----------|-------------|
112
- | `query` | Programming question, API, library, or debugging topic |
113
- | `maxTokens` | Maximum tokens of context to return (default: 5000, max: 50000) |
112
+ | `repoName` | Required single public GitHub repository in `owner/repo` format, not a URL or list |
113
+ | `query` | Required nonempty question about that repository, sent verbatim |
114
+ | `maxTokens` | Optional best-effort output bound, approximately four characters per token, plus a truncation notice (default: 5000, range: 1000–50000) |
115
+
116
+ Migration: existing `code_search({ query: ... })` calls must now include `repoName`. The query is sent as DeepWiki's `ask_question` question. `maxTokens` limits the returned text locally, not DeepWiki's generation. Requests have a 60-second deadline and honor caller cancellation. Errors and empty responses are reported without falling back to Exa. Use `web_search` for broader discovery or when a repository is unavailable; its providers and settings are unchanged.
114
117
 
115
118
  ### fetch_content
116
119
 
117
120
  Fetch URL(s) and extract readable content as markdown. Automatically detects and handles GitHub repos, YouTube videos, PDFs, local video files, and regular web pages.
118
121
 
122
+ Use the lowercase `urls` field with a nonempty array of strings, even for one URL. Replace legacy `{ url: "..." }` calls with `{ urls: ["..."] }`. Missing targets, empty arrays, empty strings, object entries, and unrecognized fields are rejected before fetching. Atomic's standard argument normalization can convert a scalar `urls` string into a one-item array, but prompts and integrations should always send the documented array form.
123
+
124
+ See [Atomic's fetch argument guide](../coding-agent/docs/web-access.md) for examples and validation troubleshooting.
125
+
119
126
  ```typescript
120
- fetch_content({ url: "https://example.com/article" })
121
- fetch_content({ urls: ["url1", "url2", "url3"] })
122
- fetch_content({ url: "https://github.com/owner/repo" })
123
- fetch_content({ url: "https://youtube.com/watch?v=abc", prompt: "What libraries are shown?" })
124
- fetch_content({ url: "/path/to/recording.mp4", prompt: "What error appears on screen?" })
125
- fetch_content({ url: "https://youtube.com/watch?v=abc", timestamp: "23:41-25:00", frames: 4 })
127
+ fetch_content({ urls: ["https://example.com/article"] })
128
+ fetch_content({ urls: ["https://example.com/one", "https://example.com/two"] })
129
+ fetch_content({ urls: ["https://github.com/owner/repo"] })
130
+ fetch_content({ urls: ["https://youtube.com/watch?v=abc"], prompt: "What libraries are shown?" })
131
+ fetch_content({ urls: ["/path/to/recording.mp4"], prompt: "What error appears on screen?" })
132
+ fetch_content({ urls: ["https://youtube.com/watch?v=abc"], timestamp: "23:41-25:00", frames: 4 })
126
133
  ```
127
134
 
128
135
  | Parameter | Description |
129
136
  |-----------|-------------|
130
- | `url` / `urls` | Single URL/path or multiple URLs |
137
+ | `urls` | Required nonempty array of URL/path strings, including for a single target |
131
138
  | `prompt` | Question to ask about a YouTube video or local video file |
132
139
  | `timestamp` | Extract frame(s) — single (`"23:41"`), range (`"23:41-25:00"`), or seconds (`"85"`) |
133
140
  | `frames` | Number of frames to extract (max 12) |
@@ -168,11 +175,11 @@ Fallback: Gemini API (Files API upload) → Gemini Web when browser cookies are
168
175
  Use `timestamp` and/or `frames` on any YouTube URL or local video file to extract visual frames as images.
169
176
 
170
177
  ```typescript
171
- fetch_content({ url: "...", timestamp: "23:41" }) // single frame
172
- fetch_content({ url: "...", timestamp: "23:41-25:00" }) // range, 6 frames
173
- fetch_content({ url: "...", timestamp: "23:41-25:00", frames: 3 }) // range, custom count
174
- fetch_content({ url: "...", timestamp: "23:41", frames: 5 }) // 5 frames at 5s intervals
175
- fetch_content({ url: "...", frames: 6 }) // sample whole video
178
+ fetch_content({ urls: ["..."], timestamp: "23:41" }) // single frame
179
+ fetch_content({ urls: ["..."], timestamp: "23:41-25:00" }) // range, 6 frames
180
+ fetch_content({ urls: ["..."], timestamp: "23:41-25:00", frames: 3 }) // range, custom count
181
+ fetch_content({ urls: ["..."], timestamp: "23:41", frames: 5 }) // 5 frames at 5s intervals
182
+ fetch_content({ urls: ["..."], frames: 6 }) // sample whole video
176
183
  ```
177
184
 
178
185
  Requires `ffmpeg` (and `yt-dlp` for YouTube). Timestamps accept `H:MM:SS`, `MM:SS`, or bare seconds.
@@ -191,7 +198,7 @@ When Readability fails or returns only a cookie notice, the extension retries vi
191
198
  web_search(query)
192
199
  → Exa (direct API with key, MCP without) → Perplexity → Gemini API → Gemini Web (if browser cookies enabled)
193
200
 
194
- fetch_content(url)
201
+ fetch_content({ urls: [url] })
195
202
  → Video file? Gemini API (Files API) → Gemini Web (if browser cookies enabled)
196
203
  → GitHub URL? Clone repo, return file contents + local path
197
204
  → YouTube URL? Gemini Web (if browser cookies enabled) → Gemini API → Perplexity
@@ -324,7 +331,7 @@ Rate limits: Perplexity is capped at 10 requests/minute (client-side). Content f
324
331
  | `curator-server.ts` | Ephemeral HTTP server with SSE streaming and state machine |
325
332
  | `summary-review.ts` | Summary prompt construction, model-based draft generation, and deterministic fallback summary |
326
333
  | `exa.ts` | Exa.ai search provider — direct API and MCP proxy, budget tracking |
327
- | `code-search.ts` | Code/docs search via Exa MCP |
334
+ | `code-search.ts` | Repository questions via DeepWiki MCP |
328
335
  | `extract.ts` | URL/file path routing, HTTP extraction, fallback orchestration |
329
336
  | `gemini-search.ts` | Search routing across Exa, Perplexity, Gemini API, Gemini Web |
330
337
  | `gemini-url-context.ts` | Gemini URL Context + Web extraction fallbacks |