{"id":49889416,"url":"https://github.com/mumez/pharo-agentic-browser","last_synced_at":"2026-05-15T20:09:31.489Z","repository":{"id":353508520,"uuid":"1218988232","full_name":"mumez/pharo-agentic-browser","owner":"mumez","description":"Multiple AI agent session browser for Pharo Smalltalk","archived":false,"fork":false,"pushed_at":"2026-05-09T15:51:42.000Z","size":364,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2026-05-09T17:40:50.339Z","etag":null,"topics":["coding-agents","pharo-smalltalk"],"latest_commit_sha":null,"homepage":"","language":"Smalltalk","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mumez.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-23T12:19:00.000Z","updated_at":"2026-05-09T15:47:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mumez/pharo-agentic-browser","commit_stats":null,"previous_names":["mumez/pharo-agentic-browser"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mumez/pharo-agentic-browser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mumez%2Fpharo-agentic-browser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mumez%2Fpharo-agentic-browser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mumez%2Fpharo-agentic-browser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mumez%2Fpharo-agentic-browser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mumez","download_url":"https://codeload.github.com/mumez/pharo-agentic-browser/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mumez%2Fpharo-agentic-browser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33078201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T20:05:40.333Z","status":"ssl_error","status_checked_at":"2026-05-15T20:05:38.672Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coding-agents","pharo-smalltalk"],"created_at":"2026-05-15T20:09:30.810Z","updated_at":"2026-05-15T20:09:31.471Z","avatar_url":"https://github.com/mumez.png","language":"Smalltalk","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pharo-agentic-browser\n\nA Pharo-native GUI for managing multiple AI coding agent sessions — Claude Code, Gemini CLI, OpenCode, and others — in parallel from inside your Pharo image. Each session is called a **topic**: you type a request, the agent works autonomously on your code, and pauses only when it needs your approval.\n\n## Overview\n\n![Agentic Browser](docs/screenshots/agentic-browser.png)\n\n```\n+---------------------+-------------------------------------------+\n|   Topics            |  [Human] @QueryClass refactor this        |\n|                     |                                           |\n|                     +-------------------------------------------+\n|  ● DB Optimization  |  [AI] I'll refactor QueryClass. First,    |\n|  ⏸ UI Improvement   |       let me check the current code...    |\n|  ★ Fix Tests        |                                           |\n|                     |  [System] UserList-Core was modified;     |\n|  [+ New Topic]      |           .st files have been updated       |\n|                     |  ⏸ [AI] May I modify DBAdapter#connect?   |\n|                     |  [Human] yes                              |\n+---------------------+-------------------------------------------+\n```\n\nThe core workflow:\n1. Create a topic and select an ACP-compatible agent (Gemini CLI, Claude Code, OpenCode, etc.)\n2. Type a request in the chat pane — mention code context with `@ClassName` or `@ClassName\u003e\u003emethod`\n3. The AI starts working (task decomposition, code changes, tests)\n4. When the AI needs human judgment, it pauses and asks in the chat\n5. Respond in plain text — the AI resumes\n6. Topic status is always visible in the sidebar\n\n## Features\n\n- **Multi-topic management** — run multiple AI agent sessions in parallel\n- **Status tracking** — per-topic state machine (`initial → working → waitingForHuman → endTurn → goalAchieved`)\n- **Human-in-the-loop** — conversation-style approval flow (no modal dialogs)\n- **Agent-agnostic** — works with any ACP-compatible agent\n- **Goal setting** — set a completion condition; the AI works autonomously until the goal is achieved, then reports back\n- **Session persistence** — topic list and state are saved to `ab-topics.fuel` via Fuel and survive image restarts\n- **Code mentions** — type `@ClassName` or `@ClassName\u003e\u003emethodName` in chat to embed the Tonel source as ACP resources\n- **MCP server support** — configure MCP servers via `mcp.json`; built-in Smalltalk MCP servers can be auto-merged\n- **Working directory management** — per-topic working directory for better context; custom paths for existing projects\n- **Multiple package prefixes** — track multiple package families (e.g. `#('ACP-*' 'BaselineOfACP')`) per topic\n- **Image change watching** — `AbTopicRelatedPackagesWatcher` monitors image changes, inserts system messages into chat, and asks for confirmation before synching packages\n\n## Requirements\n\n- [Pharo](https://pharo.org/) 12+\n- [pharo-acp](https://github.com/mumez/pharo-acp)\n- [SState](https://github.com/mumez/SState)\n- [PharoSmalltalkInteropServer](https://github.com/mumez/PharoSmalltalkInteropServer)\n- At least one ACP-compatible agent installed (e.g. `claude-agent-acp`, `gemini --acp`)\n\n## Installation\n\nIn a Pharo 13 image, open a Playground and evaluate:\n\n```smalltalk\nMetacello new\n    baseline: 'AgenticBrowser';\n    repository: 'github://mumez/pharo-agentic-browser:main/src';\n    load.\n```\n\nTo also load the test suite:\n\n```smalltalk\nMetacello new\n    baseline: 'AgenticBrowser';\n    repository: 'github://mumez/pharo-agentic-browser:main/src';\n    load: 'Tests'.\n```\n\n## Usage\n\nOpen the browser window:\n\n```smalltalk\nAbBrowserPresenter open.\n```\n\n1. Click **+ New Topic**\n2. Enter a title and select an agent\n3. (Optional) Enter an existing project directory\n4. Click **Create** — the topic appears in the left sidebar\n5. Right-click the topic and choose **Set Target Packages...** to configure which packages to watch\n6. Type a request and press **Send** — status changes to `❇️` (working)\n7. When the AI requests permission, the Send button changes to **Confirm** and Cancel to **Deny**, and status shows `?`\n8. Click **Confirm** to approve or **Deny** to reject\n9. The AI resumes; when finished, status changes to `●` (endTurn)\n\nYou can also right-click a topic to **Rename...**, **Delete**, or **Set Goal...**.\n\n\u003e **Note:** The first message in each topic is automatically prefixed with `/st-buddy ` to activate the Smalltalk buddy agent mode.\n\n### Code Mentions\n\nIn the chat input, you can reference Pharo classes or methods by prefixing them with `@`:\n\n```\n@QueryClass @DBAdapter\u003e\u003econnect please refactor this\n```\n\nWhen you send the message, AgenticBrowser resolves each mention to its Tonel source and attaches it as an ACP text resource alongside the prompt. The AI agent receives the exact code without any copy-paste.\n\n### Goal Setting\n\nRight-click a topic and choose **Set Goal...** to enter a completion condition (e.g., `all tests pass`). AgenticBrowser sends a goal notification prompt to the AI:\n\n```\nGoal has been set: all tests pass. When the goal is achieved, summarize and\nreport in result-\u003ctopic-id\u003e.md. Keep retrying until the goal is achieved.\n```\n\nThe AI works autonomously. When it creates `result-\u003ctopic-id\u003e.md` in the working directory, AgenticBrowser reads it, stores the result, and transitions the topic to `✅` (`#goalAchieved`). From that state, the topic can only be reset to `initial` (effectively archived).\n\n### Session Persistence\n\nTopics are saved automatically to `ab-topics.fuel` in the AgenticBrowser root directory using Pharo's Fuel serializer. You can also save and restore manually:\n\n```smalltalk\nAbTopicManager default save.\nAbTopicManager default load.\n```\n\n### MCP Servers\n\nPlace a `mcp.json` file in your AgenticBrowser root directory (default: `\u003cimageDir\u003e/agentic-browser/mcp.json`) to configure MCP servers passed to the agent on session start:\n\n```json\n{\n  \"mcpServers\": {\n    \"my-server\": {\n      \"command\": \"uvx\",\n      \"args\": [\"my-server-package\"],\n      \"env\": {\"API_KEY\": \"value\"}\n    }\n  }\n}\n```\n\nWhen `AbSettings \u003e\u003e useDefaultMcpServers` is `true` (the default), the built-in `smalltalk-interop` and `smalltalk-validator` MCP servers are automatically merged with your `mcp.json` entries. User entries take precedence over the defaults. Set `useDefaultMcpServers` to `false` to use only your `mcp.json`.\n\n### Image Change Watching\n\nWatching starts automatically when a topic first connects (on the first **Send**).\n\n## Supported Agents\n\n| Agent | Arguments |\n|-------|-----------|\n| Claude Code | `claude-agent-acp` |\n| Gemini CLI | `gemini --acp` |\n| OpenCode | `opencode acp` |\n| GitHub Copilot CLI | `copilot --acp --stdio` |\n| Codex | `codex-acp` |\n\n\u003e **Recommended:** Install the [smalltalk-dev-plugin](https://github.com/mumez/smalltalk-dev-plugin) in your agent. It provides Smalltalk-aware skills and slash commands (e.g. `/st-buddy`, `/st-import`, `/st-test`) that agents can use to work directly with Pharo packages inside the session.\n\n## Package Structure\n\n| Package | Contents |\n|---------|----------|\n| `AgenticBrowser-Core` | Domain model: `AbTopic`, `AbTopicSession`, `AbTopicManager`, `AbTopicGoal`, `AbMessage`, `AbWorkingDirectory`, `AbMcpServersLoader`, `AbCodeMentionParser`, `AbCodeMentionEmbedder`, `AbTopicRelatedPackagesWatcher`, announcements |\n| `AgenticBrowser-Handler` | ACP callback bridge: `AbTopicHandler` |\n| `AgenticBrowser-UI` | Spec2 presenters: browser, topic list, chat, new-topic dialog |\n| `AgenticBrowser-Tests` | SUnit tests for Core |\n| `BaselineOfAgenticBrowser` | Metacello baseline |\n\n## Architecture\n\n### State Machine (SState)\n\nEach topic has an FSM with six states:\n\n```\n#initial ──promptSent──▶ #working ──permissionRequested──▶ #waitingForHuman\n                             ▲                                      │\n                             └──────────humanResponded──────────────┘\n                             │\n                          turnEnded\n                             ▼\n                          #endTurn ──promptSent──▶ #working\n                             │\n                          goalReached\n                             ▼\n                          #goalAchieved ──reset──▶ #initial\n```\n\n### Human-in-the-Loop Approval\n\nWhen the AI requests permission, `AbTopicHandler#requestPermission:` puts the UI into approval mode (Send button becomes **Confirm**, Cancel becomes **Deny**). When the user clicks a button, the UI returns to normal mode.\n\n### Goal Setting (`AbTopicGoal`)\n\n`AbTopicGoal` holds the goal description, result text (once achieved), and an optional callback block. It manages the result file path (`result-\u003ctopicId\u003e.md` in the working directory). After each `end_turn`, `AbTopic\u003e\u003echeckGoalAchievement` checks whether the file exists; if so, the topic transitions to `#goalAchieved` and fires an `AbTopicGoalAchieved` announcement.\n\n### Code Mentions (`AbCodeMentionParser` / `AbCodeMentionEmbedder`)\n\n`AbCodeMentionParser` scans raw chat input for `@Foo` and `@Foo\u003e\u003ebar` tokens and returns `AbCodeMention` value objects. `AbCodeMentionEmbedder` resolves each mention to its Tonel source using `TonelWriter` and produces URL→content associations. `AbChatPresenter` calls both before sending and passes the resolved resources to `AbTopic\u003e\u003esendPrompt:withResources:`.\n\n### MCP Servers (`AbMcpServersLoader`)\n\n`AbMcpServersLoader` reads `mcp.json` from `AbSettings\u003e\u003edefaultAgenticBrowserRootDirectory`, optionally merges built-in Smalltalk server definitions (controlled by `AbSettings\u003e\u003euseDefaultMcpServers`), and returns an `OrderedCollection of ACPMcpServer`. `AbTopicSession` calls it on every connect and passes the result to the ACP session params (`newSessionBy:`, `resumeSessionBy:`, `loadSessionBy:`).\n\n### Working Directory (`AbWorkingDirectory`)\n\nEach topic has a working directory at `\u003cimageDir\u003e/agentic-browser/\u003csafe-topic-name\u003e-\u003cuuid8\u003e/`. The UUID suffix ensures stability even if the topic title changes.\nYou can also set a custom working directory path when creating a topic from an existing project directory.\n\n### Package Change Watcher (`AbTopicRelatedPackagesWatcher`)\n\n`AbTopicRelatedPackagesWatcher` subscribes to `SystemAnnouncer` for `MethodAnnouncement` and `ClassAnnouncement`. When a method or class is saved:\n\n- If the package matches any of the topic's `packagePrefixes`, it inserts a system message into the chat (e.g. `\"AgenticBrowser-Core was modified; .st files have been updated\"`) and exports the package\n- If the package does **not** match, it shows a confirmation asking whether to add the package to tracked prefixes\n- Changes during import are suppressed to avoid re-export loops\n\n## Related Projects\n\n- [pharo-acp](https://github.com/mumez/pharo-acp) — ACP client library for Pharo\n- [SState](https://github.com/mumez/SState) — Simple state machine library for Pharo\n- [PharoSmalltalkInteropServer](https://github.com/mumez/PharoSmalltalkInteropServer) — HTTP API server for Pharo package import/export/test\n- [smalltalk-dev-plugin](https://github.com/mumez/smalltalk-dev-plugin) — AI agents plugin providing Smalltalk-aware skills and slash commands\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmumez%2Fpharo-agentic-browser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmumez%2Fpharo-agentic-browser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmumez%2Fpharo-agentic-browser/lists"}