@kenkaiiii/ggcoder 4.3.38 → 4.3.40

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 (40) hide show
  1. package/dist/cli.js +80 -65
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +21 -3
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +2 -0
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/compaction/compactor.d.ts.map +1 -1
  10. package/dist/core/compaction/compactor.js +4 -1
  11. package/dist/core/compaction/compactor.js.map +1 -1
  12. package/dist/core/compaction/token-estimator.d.ts.map +1 -1
  13. package/dist/core/compaction/token-estimator.js +14 -1
  14. package/dist/core/compaction/token-estimator.js.map +1 -1
  15. package/dist/core/model-registry.d.ts.map +1 -1
  16. package/dist/core/model-registry.js +27 -25
  17. package/dist/core/model-registry.js.map +1 -1
  18. package/dist/core/oauth/gemini.d.ts +4 -0
  19. package/dist/core/oauth/gemini.d.ts.map +1 -0
  20. package/dist/core/oauth/gemini.js +293 -0
  21. package/dist/core/oauth/gemini.js.map +1 -0
  22. package/dist/core/prompt-commands.d.ts.map +1 -1
  23. package/dist/core/prompt-commands.js +322 -1
  24. package/dist/core/prompt-commands.js.map +1 -1
  25. package/dist/tools/plan-mode.test.js +13 -1
  26. package/dist/tools/plan-mode.test.js.map +1 -1
  27. package/dist/tools/read.d.ts.map +1 -1
  28. package/dist/tools/read.js +32 -6
  29. package/dist/tools/read.js.map +1 -1
  30. package/dist/tools/read.test.js +23 -4
  31. package/dist/tools/read.test.js.map +1 -1
  32. package/dist/tools/write.test.js +13 -1
  33. package/dist/tools/write.test.js.map +1 -1
  34. package/dist/ui/login.js +4 -4
  35. package/dist/ui/login.js.map +1 -1
  36. package/dist/utils/image.d.ts +11 -0
  37. package/dist/utils/image.d.ts.map +1 -1
  38. package/dist/utils/image.js +41 -15
  39. package/dist/utils/image.js.map +1 -1
  40. package/package.json +3 -3
@@ -214,7 +214,13 @@ Create a concise tree structure showing key directories and files with brief des
214
214
 
215
215
  Create CLAUDE.md with: project description, project structure tree, organization rules (one file per component, single responsibility), and zero-tolerance code quality checks with the exact commands for this project.
216
216
 
217
- Keep total file under 100 lines. If updating, preserve any custom sections the user added.`,
217
+ Keep total file under 100 lines. If updating, preserve any custom sections the user added.
218
+
219
+ ## Step 6: Restart Notice
220
+
221
+ End your reply with this exact notice so the user doesn't miss it:
222
+
223
+ > ⚠️ CLAUDE.md was created/updated. ggcoder loads it at startup, so **exit and restart ggcoder** (\`/quit\` then run \`ggcoder\` again) before continuing. Without a restart, I won't see the new context.`,
218
224
  },
219
225
  {
220
226
  name: "setup-lint",
@@ -466,6 +472,321 @@ Replace all placeholders with the actual commands for the detected project type
466
472
  ## Step 3: Confirm
467
473
 
468
474
  Report that /update is now available with dependency updates, security audits, and deprecation fixes.`,
475
+ },
476
+ {
477
+ name: "eyes",
478
+ aliases: [],
479
+ description: "Build project-specific perception probes (screenshots, logs, APIs, etc.) and document them in CLAUDE.md",
480
+ prompt: `# Eyes: Give the Agent Project-Specific Perception
481
+
482
+ Build the set of "eyes" this project needs — scripts the agent can run to observe UI, logs, APIs, processes, state, builds, etc. — then document them in CLAUDE.md so any future agent (even with no context) can use them. Re-run this command later to add missing eyes or update existing ones.
483
+
484
+ ## Execution Discipline (read before starting)
485
+
486
+ This command is long because it has to cover any project type. To stay reliable, obey these rules:
487
+
488
+ 1. **Minimum viable set.** Build the SMALLEST useful subset of probes first — typically 3–8, never more than 10 in a single run. Mark the rest as \`deferred\` in the manifest. The user re-runs \`/eyes\` to expand coverage. Prefer 4 probes that all pass Phase 4 over 15 probes half-built.
489
+ 2. **Budget.** 3–8 probes per run is the target. If the mapper picks more, trim to the highest-value ones for THIS project and defer the rest. Capabilities marked "opt-in" (\`load\`, \`chaos\`, \`remote\`, \`apm\`) are deferred unless the user already configured them or explicitly asks.
490
+ 3. **Checkpoint after every phase.** At the end of each phase, write progress into \`.gg/eyes/manifest.json\` (add a \`phase_completed\` field: \`"research" | "design" | "build" | "verify" | "document"\`). On re-run, read this and resume from the next phase. Never redo completed phases unless the user passes \`refresh\` or the project materially changed.
491
+ 4. **Phase gates.** Do not start Phase N+1 until Phase N is complete AND its checkpoint is written. Do not announce completion until Phase 5 is written AND Phase 4 Pass B has succeeded.
492
+ 5. **Phase 4 Pass B is non-negotiable.** If probes build but the contextless-agent verification is skipped, the command has FAILED — regardless of how many probes work. Report failure and stop; do not paper over it.
493
+ 6. **Fail loud, recover small.** If a probe fails to build after one retry, mark it \`failed\` in the manifest with the error, continue with the rest, and report failures at the end. Do not silently drop probes. Do not let one failure abort the whole run.
494
+ 7. **Defer, don't fake.** If a capability requires scaffolding that's too invasive (e.g. adding a debug endpoint inside a game engine) and the user hasn't opted in, mark it deferred with a one-line note. Never stub a probe that doesn't actually work.
495
+
496
+ ## Hard Rules (Headless Contract)
497
+
498
+ These are non-negotiable. The user must never see pop-ups, browser windows, or images opened on their screen. Everything happens in the background.
499
+
500
+ - **Never** call \`open\`, \`xdg-open\`, \`start\`, \`code\`, Finder/Explorer reveals, or any command that launches a GUI window.
501
+ - **Never** pass \`--headed\`, \`--no-headless\`, \`--gui\`, or equivalent flags. Browsers, emulators, simulators, and engine editors must run headless / in batch mode.
502
+ - All artifacts (screenshots, recordings, DB dumps, log snapshots, HAR files, traces) go to \`.gg/eyes/out/\` which MUST be gitignored.
503
+ - Every probe script must have a timeout and exit non-zero on failure with a clear stderr message.
504
+ - Long-running processes (dev servers, tailers, capture sinks) are started in the background; their PIDs/ports go in \`.gg/eyes/state.json\`; they are stopped via \`.gg/eyes/down.sh\`.
505
+ - Never prompt the user. If a dep is missing, install it silently. If the dev server isn't up, start it.
506
+ - **Redaction**: before writing any artifact that may contain secrets (logs, HAR files, env dumps, screenshots of auth'd UIs), run it through a redaction pass (\`.gg/eyes/redact.sh\`) that strips JWTs, API keys, bearer tokens, and values of env vars matching \`*_KEY|*_SECRET|*_TOKEN|*_PASSWORD\`.
507
+ - **Remote / production eyes**: OFF by default. Only enabled if the user explicitly opts in via \`.gg/eyes/remote.json\` (gitignored). Remote probes must be read-only and refuse to run destructive operations.
508
+
509
+ ## Capability Vocabulary
510
+
511
+ Think in capabilities, not project types. Map the project to the subset it actually needs. Not every capability applies to every project — pick the relevant ones. Capabilities split into three tiers:
512
+
513
+ ### Core (observe)
514
+
515
+ - \`visual\` — screenshot a UI (web page, mobile screen, desktop window, game frame)
516
+ - \`runtime_logs\` — read recent stdout/stderr or log files from the running app
517
+ - \`http\` — hit HTTP endpoints and read responses (REST, GraphQL, health checks)
518
+ - \`state\` — inspect persistent state (DB rows, KV stores, files written by the app)
519
+ - \`process\` — check what's running, on what port, PID, uptime
520
+ - \`build\` — compile/typecheck and surface errors
521
+ - \`test\` — run a single test or subset and read output
522
+ - \`cli_io\` — invoke the CLI being built with args and capture stdout/stderr/exit
523
+ - \`native_ui\` — capture mobile/desktop native windows (simulator screencap, window capture)
524
+ - \`dom\` — DOM / accessibility tree snapshot of a headless browser page (often more useful than a screenshot for assertions)
525
+ - \`browser_console\` — browser-side console logs and uncaught errors via CDP
526
+ - \`network\` — network traffic (HAR export via CDP, or mitmproxy for non-browser traffic)
527
+ - \`storage\` — cookies, localStorage, sessionStorage, IndexedDB dumps
528
+ - \`sockets\` — open ports / listening sockets (\`lsof -i\`, \`ss\`)
529
+ - \`fs_watch\` — filesystem changes during a probe run (fswatch / inotify)
530
+ - \`env\` — env var diff, runtime versions, doctor report
531
+ - \`perf\` — performance metrics (Lighthouse for web, xctrace / simpleperf for mobile, FPS / frame-time for games, process sampling for servers, bundle size for frontends)
532
+ - \`metrics\` — scrape a metrics endpoint (Prometheus, /metrics)
533
+ - \`trace\` — pull a distributed trace by ID (OTEL collector)
534
+ - \`responsive\` — capture a viewport matrix (mobile / tablet / desktop) in one call
535
+ - \`a11y\` — accessibility audit (axe-core on a page, or platform a11y tree)
536
+ - \`headers\` — HTTP security-header audit (CSP, HSTS, X-Frame-Options, etc.)
537
+
538
+ ### Act (drive to a state)
539
+
540
+ These convert the agent from a passive camera into an actor. Without them, ~60% of real debugging still needs the user.
541
+
542
+ - \`act_web\` — drive a web UI: click, type, scroll, wait, nav. Playwright script accepts a sequence and returns post-state (screenshot + DOM).
543
+ - \`act_mobile\` — drive a mobile app via Appium / XCUITest / UIAutomator: tap, swipe, input.
544
+ - \`act_desktop\` — drive a desktop window via nut-js / AXUIElement / UIAutomation / AT-SPI.
545
+ - \`act_cli\` — pty-based expect scripts for interactive CLIs (prompts, TUIs). Also captures ANSI frames so Ink/bubbletea/textual output can be snapshotted.
546
+ - \`act_game\` — input simulation (keyboard / gamepad) into a running game, optionally recording + replaying deterministic seeds.
547
+ - \`auth\` — establish and reuse a logged-in session (Playwright \`storageState.json\`, API token capture) so protected flows are reachable without re-logging in.
548
+ - \`deeplink\` — jump directly to a screen by URL / URI scheme (mobile and web).
549
+
550
+ ### Capture (external side-effects)
551
+
552
+ Local sinks that intercept what the app sends outward, so the agent can verify side-effects without real external services.
553
+
554
+ - \`capture_email\` — local SMTP sink (Mailpit / MailHog) + \`.gg/eyes/mail.sh\` to list/read captured messages.
555
+ - \`capture_webhook\` — local webhook receiver that logs incoming POSTs + a probe to list them.
556
+ - \`capture_push\` — local push-notification sink (ntfy or APNS/FCM mock) + reader.
557
+ - \`capture_sms\` — SMS mock / sink if the project sends SMS.
558
+ - \`capture_stripe\` — \`stripe listen\` in the background capturing webhook events + reader.
559
+ - \`capture_events\` — analytics / tracking event sink (intercepts calls to Segment, PostHog, GA, etc.).
560
+ - \`capture_queue\` — peek messages in a queue without consuming (Kafka / Redis / RabbitMQ / SQS / BullMQ / Sidekiq / Celery).
561
+ - \`capture_ws\` — open a WebSocket / SSE, record frames, send test messages.
562
+ - \`capture_grpc\` — \`grpcurl\` with reflection, record responses.
563
+ - \`capture_errors\` — local Sentry-compatible error sink.
564
+ - \`capture_audio\` — record audio produced by the app via a virtual sink (ffmpeg + pulseaudio / BlackHole on macOS / WASAPI loopback on Windows). Saves \`.wav\` for playback-by-tooling or waveform inspection.
565
+ - \`capture_video\` — record a window or headless-browser video stream via ffmpeg (\`x11grab\` / \`avfoundation\` / \`gdigrab\`) or Playwright's built-in video recording. Saves \`.mp4\`.
566
+
567
+ ### Diff & Time (compare, replay)
568
+
569
+ - \`diff_visual\` — screenshot vs baseline under \`.gg/eyes/baselines/\` using pixelmatch / odiff; returns similarity score + diff PNG.
570
+ - \`diff_api\` — API response vs recorded baseline (golden files).
571
+ - \`diff_branch\` — visual diff between two git refs (checkout A, screenshot; checkout B, screenshot; diff). Use a git worktree so the working tree is undisturbed.
572
+ - \`record\` — rolling background recorder: tails logs + periodic screenshots + network events to a ring buffer under \`.gg/eyes/recordings/\`. \`replay.sh <timestamp>\` scrubs back.
573
+ - \`introspect\` — language-runtime / engine hooks: Node inspector, Python REPL eval, Jupyter \`nbconvert --execute\`, DataFrame head/describe, matplotlib intercept, game-engine RCON-style debug endpoint for entity/state queries.
574
+ - \`remote\` — opt-in prod/staging read-only eyes (k8s / fly / vercel / cloudflare / railway log + exec). Must refuse destructive ops. Gated behind \`.gg/eyes/remote.json\`.
575
+ - \`security\` — runtime secret-leak scan of artifacts, dependency audit, HTTP header audit.
576
+ - \`container\` — \`docker ps\` / \`docker logs\` / \`docker exec\` / \`compose\` wrappers for dockerized stacks.
577
+ - \`concurrency\` — multi-session harness: parallel isolated contexts (Playwright contexts, multiple CLI processes) with an action coordinator, for "user A acts, user B observes" tests.
578
+
579
+ ### Stress & Environment
580
+
581
+ - \`load\` — load / stress testing via k6 / vegeta / wrk / hey. Produces latency percentiles + throughput report. Opt-in (destructive against the target) — off unless the project has a clear perf target or the user enables it.
582
+ - \`chaos\` — failure injection: Toxiproxy for network fault (latency, drops, bandwidth), chaos-mesh for k8s, process kill / pause helpers for local procs. Opt-in and scoped (never touches remote unless remote profile explicitly allows).
583
+ - \`browser_matrix\` — extension of \`visual\` / \`act_web\`: run the same script across Chromium + Firefox + WebKit and return per-browser results. Use Playwright's multi-browser support; enable only if cross-browser matters for this project.
584
+ - \`devices\` — auto-detect physically connected real devices (\`adb devices\`, \`xcrun devicectl list devices\`, \`ideviceinfo\`, USB-serial via \`system_profiler\` / \`lsusb\`). Wires \`native_ui\` / \`act_mobile\` / \`runtime_logs\` to target the physical device when present, falls back to simulator otherwise.
585
+ - \`apm\` — read-only pulls from APM providers (Datadog, New Relic, Honeycomb, Grafana Cloud, Sentry) when creds are configured in \`.gg/eyes/remote.json\`. Only under \`remote\`.
586
+
587
+ ## Project-Type Recipes (reference, not exhaustive)
588
+
589
+ Use this as a starting point in the Capability Mapper. Add or drop based on what the project actually has.
590
+
591
+ - **Web app (Next.js / Vite / SvelteKit / Remix / Astro)**: visual, dom, browser_console, network, storage, auth, responsive, a11y, http, runtime_logs, build, test, act_web, diff_visual, capture_email, capture_webhook, perf (Lighthouse). Add \`browser_matrix\` if cross-browser matters; add \`capture_video\` for flow recordings.
592
+ - **Backend service / API**: http, runtime_logs, state (DB), process, sockets, build, test, metrics, trace, capture_ws, capture_grpc, capture_queue, capture_email, capture_webhook, capture_stripe, container. Add \`load\` if there's a perf target; \`chaos\` for resilience work.
593
+ - **CLI tool**: cli_io, act_cli (pty + ANSI snapshot), runtime_logs, build, test, fs_watch, env.
594
+ - **Mobile app (iOS)**: native_ui (\`xcrun simctl io booted screenshot\`), runtime_logs (\`xcrun simctl spawn booted log stream\`), act_mobile (XCUITest / Appium), build (xcodebuild), test, deeplink, perf (xctrace), devices (auto-target physical iPhone if connected).
595
+ - **Mobile app (Android)**: native_ui (\`adb shell screencap\`), runtime_logs (\`adb logcat\`), act_mobile (UIAutomator / Appium), build (gradle), test, deeplink, perf (simpleperf), devices.
596
+ - **Media app (audio / video / streaming)**: capture_audio, capture_video, perf, runtime_logs — plus whatever platform recipe applies (web / mobile / desktop).
597
+ - **Desktop app (Electron / Tauri)**: visual (headless window capture or WebDriver), runtime_logs, build, test, act_desktop, introspect (devtools / Tauri IPC), fs_watch.
598
+ - **Game (Unity / Unreal / Godot / custom engine)**: visual (engine batch-mode screenshot or off-screen render), runtime_logs, build (batch-mode build), introspect (REQUIRES a small in-engine debug endpoint the agent can query for entity state — scaffold it if missing), act_game (input injection + deterministic seeding + input recording/replay), perf (FPS / frame-time).
599
+ - **Browser extension**: visual + dom + browser_console via Playwright persistent context with \`--load-extension\`; act_web to drive target sites; introspect for background/service-worker state.
600
+ - **Python / data / ML**: introspect (nb-run, df-head, plot-capture intercepting \`plt.show\`), http (if FastAPI / Flask), state, build (typecheck via mypy), test, env (gpu status, python/cuda versions), perf.
601
+ - **Chrome/Firefox extension**: like web app + extension-specific loading.
602
+ - **Library / SDK**: build, test, cli_io (if it has a CLI demo), introspect (REPL eval).
603
+
604
+ Also consider adding across ANY project type when warranted: \`load\` (if perf-critical), \`chaos\` (if resilience-critical), \`capture_audio\` / \`capture_video\` (if the app produces media), \`devices\` (if real hardware matters), \`apm\` (if prod observability is configured).
605
+
606
+ ## Probe Naming Convention
607
+
608
+ Probe IDs use \`<verb>\` or \`<verb>-<object>\` lowercase-kebab: \`screenshot\`, \`logs\`, \`api\`, \`dom\`, \`act-web\`, \`diff-visual\`, \`capture-email\`, \`record\`. Scripts are \`.gg/eyes/<id>.sh\`. Self-tests are \`.gg/eyes/<id>.test.sh\`.
609
+
610
+ ## Phase 1: Research (Parallel Sub-Agents)
611
+
612
+ Use the subagent tool to spawn these agents IN PARALLEL (multiple calls in a single response). Each must return structured findings.
613
+
614
+ **Agent 1 — Project Classifier**: Read manifests (package.json, Cargo.toml, go.mod, pyproject.toml, Podfile, Info.plist, tauri.conf.json, docker-compose.yml, Makefile, etc.). Return: project kind(s) (web app / CLI / mobile / desktop / backend service / library / game / extension), languages, frameworks, runtimes.
615
+
616
+ **Agent 2 — Runtime Surveyor**: Find existing dev scripts, ports, log paths, DB locations, test runners, build outputs, env files. Report exact commands already defined.
617
+
618
+ **Agent 3 — Existing-Eyes Auditor**: Read current \`.gg/eyes/\` (if any), \`.gg/eyes/manifest.json\`, existing \`CLAUDE.md\`, and \`.gitignore\`. Report what's already installed so this run is a diff, not a rewrite. Never overwrite user-modified probe scripts without good reason.
619
+
620
+ **Agent 4 — Capability Mapper**: Given the above, pick the 3–8 HIGHEST-VALUE probes to build NOW, and list everything else as deferred. The minimum viable set should unlock the most common perception tasks for this project type (for a web app that's usually \`visual\` + \`dom\` + \`runtime_logs\` + \`http\` + \`act_web\`; for a backend: \`http\` + \`runtime_logs\` + \`state\` + \`capture_email\` or \`capture_webhook\`; for a CLI: \`cli_io\` + \`act_cli\` + \`runtime_logs\`). Opt-in capabilities (\`load\`, \`chaos\`, \`remote\`, \`apm\`) are ALWAYS deferred unless explicitly requested. For each chosen capability, pick the best concrete implementation for this stack (e.g. \`visual\` web → Playwright headless; \`visual\` Tauri → WebDriver or tauri-driver; \`visual\` iOS → \`xcrun simctl io booted screenshot\`; \`native_ui\` Android → \`adb shell screencap\`; \`capture_email\` → Mailpit on a free port; \`act_web\` → Playwright with reusable \`storageState.json\`; \`introspect\` game → defer unless the engine already exposes a debug endpoint).
621
+
622
+ Wait for all agents. Synthesize into a single plan listing \`build_now\` (3–8 probes) and \`deferred\` (everything else with a one-line reason).
623
+
624
+ **Checkpoint: write \`phase_completed: "research"\` to \`.gg/eyes/manifest.json\` before proceeding.**
625
+
626
+ ## Phase 2: Design
627
+
628
+ Write \`.gg/eyes/manifest.json\` with the probe list. Schema:
629
+
630
+ \`\`\`json
631
+ {
632
+ "version": 1,
633
+ "phase_completed": "design",
634
+ "project": { "kind": "...", "stack": "..." },
635
+ "probes": [
636
+ {
637
+ "id": "screenshot",
638
+ "capability": "visual",
639
+ "status": "pending",
640
+ "script": ".gg/eyes/screenshot.sh",
641
+ "impl": "playwright-headless",
642
+ "deps": ["playwright"],
643
+ "timeout_ms": 15000,
644
+ "usage": "<url-or-path> [viewport]",
645
+ "output": ".gg/eyes/out/screenshot-<timestamp>.png"
646
+ }
647
+ ],
648
+ "deferred": [
649
+ { "capability": "load", "reason": "opt-in; no perf target set" },
650
+ { "capability": "capture_audio", "reason": "project does not produce audio" }
651
+ ],
652
+ "lifecycle": { "up": ".gg/eyes/up.sh", "down": ".gg/eyes/down.sh" }
653
+ }
654
+ \`\`\`
655
+
656
+ Probe \`status\` transitions: \`pending\` → \`built\` (after Phase 3) → \`verified\` (after Phase 4 Pass A) → \`failed\` with an \`error\` field if anything goes wrong at any point. Update the manifest after each probe changes state.
657
+
658
+ If a manifest already exists, diff against it: keep \`verified\` probes as-is, rebuild \`failed\` ones, add missing ones, remove probes whose capability no longer applies (but never delete a user-edited script without asking). If \`phase_completed\` already indicates a later phase, resume from the next phase rather than restarting.
659
+
660
+ Also ensure \`.gitignore\` contains: \`.gg/eyes/out/\`, \`.gg/eyes/state.json\`, \`.gg/eyes/recordings/\`, \`.gg/eyes/remote.json\`, \`.gg/eyes/auth/\`.
661
+
662
+ **Checkpoint: manifest is now written with \`phase_completed: "design"\`. Proceed to Phase 3.**
663
+
664
+ ## Phase 3: Build (Parallel Sub-Agents)
665
+
666
+ For each probe that is new or changed, spawn a sub-agent via the subagent tool. Launch them IN PARALLEL (all in one response). Each sub-agent's task:
667
+
668
+ 1. Create \`.gg/eyes/<id>.sh\` (or \`.mjs\`/\`.py\` only if shell is unreasonable). Make it executable. It must:
669
+ - Be fully headless (re-read the Hard Rules above)
670
+ - Have a timeout
671
+ - Exit non-zero with a clear stderr message on failure
672
+ - Write artifacts only under \`.gg/eyes/out/\`
673
+ - Print the artifact path (or result) to stdout so the agent can consume it
674
+ - Self-recover where possible (start dev server if down, install missing dep, pick a free port)
675
+ 2. Install any required dependencies silently (locally to the project where possible; \`npx --yes\`, \`pnpm add -D --silent\`, \`pip install --quiet --user\`, etc.). For Playwright: also run the headless browser install (\`npx --yes playwright install chromium\`).
676
+ 3. Write \`.gg/eyes/<id>.test.sh\` — a self-test that proves the probe works end-to-end headlessly. It must produce a real artifact or real output, not a mock.
677
+ 4. Append a short usage block to \`.gg/eyes/README.md\`.
678
+ 5. Report success or failure back. On success, main agent updates that probe's \`status\` to \`built\`. On failure, main agent retries ONCE; if it still fails, sets \`status: "failed"\` with a one-line \`error\` and moves on — does NOT abort the whole run.
679
+
680
+ Also create (once, shared):
681
+ - \`.gg/eyes/up.sh\` — start the dev stack + any required capture sinks (Mailpit, webhook receiver, stripe listen) in the background, record PIDs/ports to \`.gg/eyes/state.json\`, idempotent.
682
+ - \`.gg/eyes/down.sh\` — stop everything started by \`up.sh\`.
683
+ - \`.gg/eyes/redact.sh\` — stdin-in / stdout-out redactor that strips tokens, API keys, bearer headers, and values of \`*_KEY|*_SECRET|*_TOKEN|*_PASSWORD\` env vars. All probes that produce text artifacts pipe through this before writing.
684
+ - \`.gg/eyes/doctor.sh\` — prints OS/arch, runtime versions, installed probe deps, port availability, sink status. One blob for troubleshooting.
685
+ - \`.gg/eyes/out/\`, \`.gg/eyes/baselines/\`, \`.gg/eyes/recordings/\`, \`.gg/eyes/auth/\` directories (create as needed).
686
+
687
+ **Checkpoint: after all parallel sub-agents report, update \`phase_completed: "build"\` in the manifest with each probe's final status. Proceed to Phase 4.**
688
+
689
+ ## Phase 4: Verify
690
+
691
+ Two verification passes. Both must pass before Phase 5.
692
+
693
+ **Pass A — Self-tests**: Run every \`.gg/eyes/<id>.test.sh\` for probes with \`status: "built"\`. On pass, set \`status: "verified"\`. On failure, retry ONCE; if it still fails, set \`status: "failed"\` with the error, and continue with remaining probes. It is fine to finish Phase 4 with some probes failed — they are recorded and the user can re-run \`/eyes\` to retry them. It is NOT fine to skip Pass B.
694
+
695
+ **Pass B — Contextless agent test**: Spawn ONE sub-agent via the subagent tool whose entire context is the updated CLAUDE.md \`## Eyes\` section only (paste it into the task). Give it a concrete task that exercises at least one *act* or *capture* probe if those were built, not just pure observation. Examples:
696
+ - web app: "Log in as the test user, navigate to Settings, capture the page, and report the value in the Email field."
697
+ - backend: "Trigger the password-reset endpoint for test@example.com, then read the captured email and report the reset link."
698
+ - CLI (interactive): "Run the init command, answer the prompts with defaults, and report the final confirmation line."
699
+ - mobile: "Deep-link to the profile screen and report the displayed username."
700
+ - game: "Spawn the player at (0,0), step forward three frames, and report the player's position."
701
+ - library / pure observation: fall back to a simple probe ("capture the home page and report the primary heading").
702
+
703
+ If the sub-agent can complete the task without asking clarifying questions, the docs work. If it gets stuck or guesses, fix the \`## Eyes\` section in CLAUDE.md and retry (up to 2 retries). This is the real test — not "does the script run" but "can a contextless agent use it from the docs alone."
704
+
705
+ **Pass B is MANDATORY.** If you skip it, this command has failed. Do not claim completion without it. If Pass B cannot be run (e.g. no verified probes at all), report that the command failed and stop.
706
+
707
+ **Pass C — Autonomy test (MANDATORY when triggers were written)**: Spawn a second contextless sub-agent with only the \`## Eyes\` section. Give it a task that IMPLIES perception but does NOT demand it — a task that looks like normal coding work. Examples:
708
+ - web app: "Add a disabled state to the login button when the form is invalid." (Should trigger the visual probe per the "after editing UI components" rule without being asked.)
709
+ - backend: "Add a new field \`phone\` to the user registration endpoint." (Should trigger the http/api probe per the "after adding/modifying a route" rule.)
710
+ - CLI: "Add a \`--verbose\` flag to the main command." (Should trigger the cli probe per the "after changing CLI args" rule.)
711
+ - mobile: "Change the profile screen header color to blue." (Should trigger a screenshot per the UI-edit rule.)
712
+
713
+ A pass means the sub-agent reached for the right probe on its own initiative, unprompted. A fail means it edited code and reported done without verifying, OR asked the user to verify. If Pass C fails, the "When to use" rules are too weak — rewrite them more actionably and retry (up to 2 retries). If the probe set is pure-observation (no UI/runtime changes apply) and no autonomy trigger makes sense, skip Pass C and note why.
714
+
715
+ **Checkpoint: update \`phase_completed: "verify"\` with Pass A, Pass B, and Pass C results. Proceed to Phase 5.**
716
+
717
+ ## Phase 5: Document
718
+
719
+ Insert or update a single \`## Eyes\` section in the project's CLAUDE.md (create CLAUDE.md if it doesn't exist, but do not clobber other sections). Keep it terse — the scripts are self-documenting; CLAUDE.md is the index.
720
+
721
+ The section MUST include four subsections, in order: intro → probe table → **when to use automatically** → **when NOT to use** → lifecycle.
722
+
723
+ Template:
724
+
725
+ \`\`\`markdown
726
+ ## Eyes
727
+
728
+ Perception probes live in \`.gg/eyes/\`. All headless. Artifacts go to \`.gg/eyes/out/\` (gitignored). Never open GUIs or prompt the user. Invoke probes yourself rather than asking the user — that's the whole point.
729
+
730
+ ### Available probes
731
+
732
+ | Need | Run | Then |
733
+ |---|---|---|
734
+ | <one-line need> | \`.gg/eyes/<id>.sh <args>\` | <how to consume output> |
735
+ | ... | ... | ... |
736
+
737
+ ### When to use these eyes (automatically, without being asked)
738
+
739
+ Reach for probes ON YOUR OWN INITIATIVE when any of these apply — do not ask the user to verify something you can verify yourself:
740
+
741
+ - <project-specific trigger 1: e.g. "After editing any file under \`src/ui/\` or \`src/components/\`, screenshot the affected page and visually verify the change landed.">
742
+ - <trigger 2: e.g. "After adding or modifying an HTTP route, hit it with \`.gg/eyes/api.sh\` and confirm the response shape.">
743
+ - <trigger 3: e.g. "After changing CLI argument parsing, run \`.gg/eyes/cli.sh --help\` and confirm the new flag appears.">
744
+ - <trigger 4: e.g. "Before claiming a UI bug is fixed, screenshot the before/after and diff.">
745
+ - <trigger 5: e.g. "After any change that touches email sending, trigger the flow and check \`.gg/eyes/mail.sh\` for the captured message.">
746
+ - If a probe fails or returns unexpected results, investigate the artifact/output directly before assuming the probe itself is broken.
747
+
748
+ ### When NOT to use these eyes
749
+
750
+ Do not run probes for:
751
+
752
+ - Docs-only changes (README, markdown, comments).
753
+ - Config-only changes that don't affect runtime behavior.
754
+ - Refactors that preserve behavior and are already covered by tests.
755
+ - Style/formatting-only changes.
756
+ - When a probe was already run this turn on the same artifact — reuse the output, don't re-run.
757
+ - When the dev server / simulator / sink isn't up AND the task doesn't require runtime verification — don't spin up infra just to be thorough.
758
+
759
+ ### Lifecycle
760
+
761
+ Start/stop dev stack + capture sinks: \`.gg/eyes/up.sh\` / \`.gg/eyes/down.sh\` (idempotent, background).
762
+ Refresh/expand this setup when the project changes: \`/eyes\`.
763
+ \`\`\`
764
+
765
+ For each probe: one row, one line need, exact invocation, one-line consumption hint (e.g. "read the printed PNG path", "parse JSON stdout", "grep stderr for ERROR"). Only include probes with \`status: "verified"\`. Do not document failed or deferred probes in the table — a short line below the lifecycle can list them if present ("Deferred: load, chaos. Failed: capture_audio (BlackHole not installed). Run \`/eyes\` again to retry.").
766
+
767
+ **The "when to use" and "when NOT to use" triggers are project-specific and mandatory.** Generate them based on the actual project layout and probes built. Rules of thumb:
768
+ - Tie triggers to file paths, file types, or task descriptions the future agent will recognize ("after editing \`src/routes/**\`…", "after modifying a \`.tsx\` component…", "before claiming an API change is done…").
769
+ - Every verified probe should have at least one trigger that names it, OR be explicitly listed in "When NOT to use" if it's expensive/opt-in (e.g. \`load\`, \`diff_branch\`).
770
+ - Match the trigger density to the project: a web app with many UI components warrants a strong visual trigger; a pure backend library does not.
771
+ - Triggers should be ACTIONABLE ("screenshot the page") not VAGUE ("verify UI looks right").
772
+
773
+ **Checkpoint: update \`phase_completed: "document"\`. Proceed to Phase 6.**
774
+
775
+ ## Phase 6: Report
776
+
777
+ Summarize in the chat:
778
+ - Project kind detected
779
+ - Probes built and verified (list with ✓)
780
+ - Probes failed (list with one-line error) — user can re-run \`/eyes\` to retry
781
+ - Capabilities deferred (one-line reason each) — user can re-run \`/eyes\` to expand coverage
782
+ - Contextless-agent verification result (Pass B) — explicitly state whether it passed
783
+ - One-line example the user can try next (e.g. "Try: ask me to screenshot the home page.")
784
+
785
+ **IMPORTANT — if CLAUDE.md was created or modified**, end the report with a clear notice:
786
+
787
+ > ⚠️ CLAUDE.md was updated with the new \`## Eyes\` section. ggcoder loads CLAUDE.md at startup, so **exit and restart ggcoder** (\`/quit\` then run \`ggcoder\` again) before asking me to use these probes. Without a restart, I won't see the new instructions in my context.
788
+
789
+ Make this notice the last thing in the report so the user doesn't miss it.`,
469
790
  },
470
791
  {
471
792
  name: "simplify",
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-commands.js","sourceRoot":"","sources":["../../src/core/prompt-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,2CAA2C;QACxD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uFAuC2E;KACpF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,6CAA6C;QAC1D,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8FAiDkF;KAC3F;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,yCAAyC;QACtD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA6DwC;KACjD;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,+CAA+C;QAC5D,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2FAwC+E;KACxF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,sDAAsD;QACnE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8EA8DkE;KAC3E;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,gDAAgD;QAC7D,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2FA2C+E;KACxF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,6CAA6C;QAC1D,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yFA4D6E;KACtF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,oDAAoD;QACjE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sGA8D0F;KACnG;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,EAAE;QACX,WAAW,EACT,mFAAmF;QACrF,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qFAgDyE;KAClF;IACD;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,EAAE;QACX,WAAW,EACT,wHAAwH;QAC1H,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mHA0EuG;KAChH;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,8DAA8D;QAC3E,MAAM,EAAE;;;;;;;;;;;;;;;iFAeqE;KAC9E;CACF,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"prompt-commands.js","sourceRoot":"","sources":["../../src/core/prompt-commands.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,19 @@ import { createBashTool } from "./bash.js";
10
10
  import { ProcessManager } from "../core/process-manager.js";
11
11
  import { buildSystemPrompt } from "../system-prompt.js";
12
12
  function resultToString(result) {
13
- return typeof result === "string" ? result : result.content;
13
+ if (typeof result === "string")
14
+ return result;
15
+ if (result && typeof result === "object" && "content" in result) {
16
+ const c = result.content;
17
+ if (typeof c === "string")
18
+ return c;
19
+ if (Array.isArray(c)) {
20
+ return c
21
+ .map((b) => b.type === "text" ? (b.text ?? "") : "[image]")
22
+ .join("\n");
23
+ }
24
+ }
25
+ return String(result);
14
26
  }
15
27
  const mockContext = {
16
28
  signal: new AbortController().signal,
@@ -1 +1 @@
1
- {"version":3,"file":"plan-mode.test.js","sourceRoot":"","sources":["../../src/tools/plan-mode.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan-mode.test.js","sourceRoot":"","sources":["../../src/tools/plan-mode.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,eAAO,MAAM,iBAAiB,aAqD5B,CAAC;AAEH,QAAA,MAAM,UAAU;;;;iBASd,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,GAAG,GAAE,cAAgC,GACpC,SAAS,CAAC,OAAO,UAAU,CAAC,CA+D9B"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGvE,eAAO,MAAM,iBAAiB,aA+C5B,CAAC;AAEH,QAAA,MAAM,UAAU;;;;iBASd,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,GAAG,GAAE,cAAgC,GACpC,SAAS,CAAC,OAAO,UAAU,CAAC,CA4F9B"}
@@ -1,17 +1,13 @@
1
+ import fs from "node:fs/promises";
1
2
  import path from "node:path";
2
3
  import { z } from "zod";
3
4
  import { resolvePath, rejectSymlink } from "./path-utils.js";
4
5
  import { truncateHead } from "./truncate.js";
5
6
  import { writeOverflow } from "./overflow.js";
6
7
  import { localOperations } from "./operations.js";
8
+ import { IMAGE_EXTENSIONS, IMAGE_MEDIA_TYPES, shrinkToFit } from "../utils/image.js";
7
9
  export const BINARY_EXTENSIONS = new Set([
8
- ".png",
9
- ".jpg",
10
- ".jpeg",
11
- ".gif",
12
- ".bmp",
13
10
  ".ico",
14
- ".webp",
15
11
  ".svg",
16
12
  ".mp3",
17
13
  ".mp4",
@@ -81,6 +77,36 @@ export function createReadTool(cwd, readFiles, ops = localOperations) {
81
77
  await rejectSymlink(resolved);
82
78
  readFiles?.add(resolved);
83
79
  const ext = path.extname(resolved).toLowerCase();
80
+ // Image: read as binary, shrink to fit provider limits, return as
81
+ // structured content so the model can actually see the pixels.
82
+ if (IMAGE_EXTENSIONS.has(ext)) {
83
+ try {
84
+ const rawBuffer = await fs.readFile(resolved);
85
+ const mediaType = IMAGE_MEDIA_TYPES[ext] ?? "image/png";
86
+ const { buffer, mediaType: finalMediaType } = await shrinkToFit(rawBuffer, mediaType);
87
+ const resizedNote = buffer.length < rawBuffer.length
88
+ ? ` (resized from ${rawBuffer.length} to ${buffer.length} bytes)`
89
+ : "";
90
+ return {
91
+ content: [
92
+ {
93
+ type: "text",
94
+ text: `Read image file ${resolved} [${finalMediaType}]${resizedNote}`,
95
+ },
96
+ { type: "image", mediaType: finalMediaType, data: buffer.toString("base64") },
97
+ ],
98
+ };
99
+ }
100
+ catch (err) {
101
+ const code = err.code;
102
+ if (code === "ENOENT")
103
+ return `File not found: ${resolved}`;
104
+ if (code === "EACCES")
105
+ return `Permission denied: ${resolved}`;
106
+ const reason = err instanceof Error ? err.message : String(err);
107
+ return `Could not read image ${resolved}: ${reason}`;
108
+ }
109
+ }
84
110
  if (BINARY_EXTENSIONS.has(ext)) {
85
111
  const stat = await ops.stat(resolved);
86
112
  return `Binary file: ${resolved} (${ext}, ${stat.size} bytes)`;
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
@@ -52,13 +52,28 @@ describe("createReadTool", () => {
52
52
  const result = await tool.execute({ file_path: filePath, offset: 2, limit: 2 }, ctx("test-5"));
53
53
  expect(result).toBe(" 2\tb\n 3\tc");
54
54
  });
55
- it("detects binary files and returns size notice", async () => {
56
- const filePath = path.join(tmpDir, "image.png");
55
+ it("returns an image content block for image files", async () => {
56
+ // Minimal valid 1×1 PNG — sharp needs a real decodable image to succeed.
57
+ const pngBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgAAIAAAUAAeImBZsAAAAASUVORK5CYII=";
58
+ const filePath = path.join(tmpDir, "pixel.png");
59
+ await fs.writeFile(filePath, Buffer.from(pngBase64, "base64"));
60
+ const tool = createReadTool(tmpDir);
61
+ const result = await tool.execute({ file_path: filePath }, ctx("test-img"));
62
+ expect(typeof result).not.toBe("string");
63
+ expect(result).toMatchObject({
64
+ content: [
65
+ { type: "text", text: expect.stringContaining("Read image file") },
66
+ { type: "image", mediaType: "image/png", data: expect.any(String) },
67
+ ],
68
+ });
69
+ });
70
+ it("detects non-image binary files and returns size notice", async () => {
71
+ const filePath = path.join(tmpDir, "archive.zip");
57
72
  const buf = Buffer.alloc(128, 0xff);
58
73
  await fs.writeFile(filePath, buf);
59
74
  const tool = createReadTool(tmpDir);
60
75
  const result = await tool.execute({ file_path: filePath }, ctx("test-6"));
61
- expect(result).toBe(`Binary file: ${filePath} (.png, 128 bytes)`);
76
+ expect(result).toBe(`Binary file: ${filePath} (.zip, 128 bytes)`);
62
77
  });
63
78
  it("adds resolved path to readFiles set", async () => {
64
79
  const filePath = path.join(tmpDir, "tracked.txt");
@@ -72,10 +87,14 @@ describe("createReadTool", () => {
72
87
  });
73
88
  describe("BINARY_EXTENSIONS", () => {
74
89
  it("contains expected entries", () => {
75
- expect(BINARY_EXTENSIONS.has(".png")).toBe(true);
76
90
  expect(BINARY_EXTENSIONS.has(".pdf")).toBe(true);
77
91
  expect(BINARY_EXTENSIONS.has(".exe")).toBe(true);
78
92
  expect(BINARY_EXTENSIONS.has(".wasm")).toBe(true);
79
93
  });
94
+ it("no longer contains image extensions (they are handled as image attachments)", () => {
95
+ expect(BINARY_EXTENSIONS.has(".png")).toBe(false);
96
+ expect(BINARY_EXTENSIONS.has(".jpg")).toBe(false);
97
+ expect(BINARY_EXTENSIONS.has(".webp")).toBe(false);
98
+ });
80
99
  });
81
100
  //# sourceMappingURL=read.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read.test.js","sourceRoot":"","sources":["../../src/tools/read.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.test.js","sourceRoot":"","sources":["../../src/tools/read.test.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,19 @@ import path from "node:path";
4
4
  import os from "node:os";
5
5
  import { createWriteTool } from "./write.js";
6
6
  function resultToString(result) {
7
- return typeof result === "string" ? result : result.content;
7
+ if (typeof result === "string")
8
+ return result;
9
+ if (result && typeof result === "object" && "content" in result) {
10
+ const c = result.content;
11
+ if (typeof c === "string")
12
+ return c;
13
+ if (Array.isArray(c)) {
14
+ return c
15
+ .map((b) => b.type === "text" ? (b.text ?? "") : "[image]")
16
+ .join("\n");
17
+ }
18
+ }
19
+ return String(result);
8
20
  }
9
21
  describe("createWriteTool", () => {
10
22
  let tmpDir;