惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Last Week in AI
Last Week in AI
腾讯CDC
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学
C
Cybersecurity and Infrastructure Security Agency CISA
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 司徒正美
爱范儿
爱范儿
雷峰网
雷峰网
The Hacker News
The Hacker News
S
SegmentFault 最新的问题
Cisco Talos Blog
Cisco Talos Blog
博客园 - 聂微东
T
Tor Project blog
I
Intezer
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Schneier on Security
Schneier on Security
T
Tenable Blog
Google Online Security Blog
Google Online Security Blog
S
Schneier on Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
AI
AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
Help Net Security
Help Net Security
O
OpenAI News
博客园 - 【当耐特】
博客园 - Franky
AWS News Blog
AWS News Blog
罗磊的独立博客
J
Java Code Geeks
Know Your Adversary
Know Your Adversary
A
Arctic Wolf
小众软件
小众软件
量子位
SecWiki News
SecWiki News
S
Security Affairs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
N
News and Events Feed by Topic
Apple Machine Learning Research
Apple Machine Learning Research
H
Heimdal Security Blog
Google DeepMind News
Google DeepMind News
IT之家
IT之家

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店 GitHub - EdoardoBambini/Agent-Armor-Iaga: AI agents are getting tool access — shell, file system, databases, APIs, secrets. But **nobody is governing what they actually do with it**. Frameworks like LangChain, CrewAI, AutoGen, and Claude Code give agents the power to execute. Agent Armor gives you the power to control, audit, and approve every single action before it happens. HN Vibes — Week 15, Apr 7–13 2026 GitHub - chojs23/ec: Easy terminal-native 3-way git mergetool vim-like workflow GitHub - SethPyle376/hiraeth: Local AWS emulator focused on fast integration testing, with SQS support, SQLite-backed state, and a debug-friendly web UI. GitHub - JakOb-dotcom/cloud-sandbox-security-analysis: Technical analysis and Proof of Concept (PoC) regarding environment variable exfiltration in containerized cloud sandboxes via side-channel data leaks. Springboards - Flint Alpha Show HN: A simpler coding agent harness GitHub - audiodude/sudomake-friends GitHub - 256thFission/mini-mythos: OSS clone of Anthropic’s Mythos harness to locate C/C++ memory vulnerabilities Show HN: OpenParallax: OS-level privilege separation for AI agent execution Hacker News Sorted - Chrome 应用商店 Show HN: How to Install Docker on Ubuntu 24.04 LTS: Complete 2026 Guide GitHub - himanshudongre/smriti GitHub - sverrirsig/claude-control: macOS desktop dashboard for monitoring and managing multiple Claude Code sessions GitHub - ory/dockertest: Write better integration tests! Dockertest helps you boot up ephermal docker images for your Go tests with minimal work. Chiral - Chrome 应用商店 Show HN: Two Claudes collaborating through shared memory on a $100 mini-PC GitHub - pmichaillat/latex-cv: Minimalist LaTeX template for academic CVs GitHub - oguzbilgic/posse: A web UI for Anthropic Managed Agents. GitHub - sshiraz/depsly: Dependency risk analysis tool for npm packages ABI Add safari/agent-harness — Safari browser automation via safari-mcp by achiya-automation · Pull Request #212 · HKUDS/CLI-Anything GitHub - Halfblood-Prince/trustcheck: Verify PyPI package attestations and improve Python supply-chain security GitHub - oguzbilgic/kern-ai: Agents that do the work and show it. GitHub - bruits/satteri: High-performance Markdown and MDX processing for the JavaScript ecosystem GitHub - tylergibbs1/feedstock: High-performance web crawler and scraper for TypeScript, powered by Bun and Playwright GitHub - Grimm67123/grimmbot: The self-improving sandboxed and open-source AI agent. With persistent memory and scheduling. GitHub - whitevanillaskies/whitebloom: Local whiteboard that blooms. GitHub - hwdsl2/docker-whisper: Docker image for a self-hosted Whisper speech-to-text server with speaker diarization and OpenAI-compatible transcription and translation APIs. Powered by faster-whisper. Supports all Whisper models, NVIDIA GPU (CUDA) acceleration, JSON/SRT/VTT output, SSE streaming, offline mode, and multi-arch (amd64, arm64). GitHub - yisding/reviewwiggum GitHub - MarwanAlsoltany/serrors: Structured errors for Go: sentinel hierarchies, typed data, custom formatting, and slog integration. GitHub - soatok/age-php GitHub - Luthiraa/markitme GitHub - stagas/rtdiff: realtime git diff gui and AI-assisted commits GitHub - tombedor/excalicharts GitHub - wh1le/excalidraw-edit: Open and edit .excalidraw files from the terminal. Offline, auto-saves to disk. MalExt Sentry - Malicious Extension Scanner - Chrome 应用商店 GitHub - syi0808/asciianimesvg: Generate animated ASCII art SVGs from text. CLI, Rust library, WASM, and web editor. GitHub - zaina-ml/ml_forge: A visual-based graph node editor for training computer vision models. GitHub - anakin87/llm-rl-environments-lil-course: 🌱 A little course on Reinforcement Learning Environments for evaluating and training Language Models GitHub - takaakit/superpowers-uml: Superpowers-UML modifies Superpowers to ensure a software development workflow in which AI agents design through UML modeling. AdriByte Studio - Sviluppo Web e Soluzioni Digitali GitHub - chouligi/angel-copilot: Your personalized Angel Investment Advisor Show HN: MoodSense AI (ML and FastAPI and Gradio, Deployed on Hugging Face) Moodsense Ai - a Hugging Face Space by aman179102 GitHub - agenteractai/lodmem: Level Of Detail Context Management for Agents GitHub - ostefani/subnetlens: A fast, concurrent network scanner with a TUI and plain-text CLI, built in Go. It discovers live hosts on your network, scans their open ports, resolves hostnames, and fingerprints operating systems—delivered. Cyber Pulse: Agentic Intel - Apps on Google Play Whisper API: Self-Hostable Speech to Text Transcription The Agent-Web Protocol Stack: A Research Thesis GitHub - msmarkgu/RelayFreeLLM: A restful API designed to route user prompts to various AI model providers. Show HN: Provepy – A Python decorator that proves your code using Lean and LLMs Show HN: Pardonned.com – A searchable database of US Pardons GitHub - patrickdappollonio/dux: Dux is a terminal UI that lets you run multiple AI coding agents side by side, each in its own git worktree, with full companion terminals, macros, commit generation, and a command palette that knows more tricks than you do. kMC Crystal Simulator Show HN: HyperFlow – A self-improving agent framework built on LangGraph GitHub - stef41/vibescore: 🎵 Grade your vibe-coded project. One command, instant letter grade across security, quality, dependencies, and testing. GitHub - stef41/lmscan: 🔍 Detect AI-generated text and fingerprint which LLM wrote it. Open-source GPTZero alternative. Zero dependencies, works offline. imgur.com GitHub - visionscaper/collabmem: Enabling long-term collaboration with Agentic AI - building up episodic and world model memory over time with in-context awareness 在 Steam 上购买 FriedrichAI: Offline AI 立省 10% GitHub - atripati/ark: AI Runtime Kernel — a context operating system for AI agents. Eliminates tool bloat, loads only what’s needed, and gives LLMs their reasoning space back. GitHub - nowork-studio/toprank: Open-source Claude Code skills for SEO, SEM, Google Ads GitHub - tacomanator/sash: Lightweight macOS menu bar app for reliably cycling through windows of the current application. Appents | Social Media Management for Product-First Teams GitHub - pnhoang/youtube-spam-blocker: Automatically detects and hides spam messages in YouTube Live chat. Set rate limits, keyword filters, and block repeat offenders. GitHub - decisionnode/DecisionNode: CLI + Local MCP - A shared structured memory store across Claude Code, Cursor, Windsurf, Antigravity, and every MCP client. Semantically queryable. GitHub - AvaCodeSolutions/django-email-learning: An open source Django app for creating email-based learning platforms with IMAP integration and React frontend components. The $100K Gap in Kubernetes Security Tooling Function Calling Harness: From 6.75% to 100%
GitHub - sathvikc/agent-chat-bridge: Turn any AI agent chat session into an async agent. Register a timer, shell command, or webhook — the bridge automatically resumes the session with your prompt when the trigger fires.
sathvikchinn · 2026-05-21 · via Hacker News: Show HN

Turn any AI agent chat session into an async agent. Register a timer, shell command, or webhook — the bridge automatically resumes the session with your prompt when the trigger fires.

Core flow: agent does work → POST /jobs (one call) → ends session normally → bridge fires prompt back to that session when the trigger fires. Poll GET /jobs/:id to read the agent's reply.

Supported IDEs: VS Code (GitHub Copilot Chat), Windsurf (Cascade)


Quick Start

# 1. Verify the bridge is running (after IDE reload)
curl --noproxy localhost http://localhost:9801/health

# 2. Register a 10-second timer (simplest test)
curl --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{"session_id":"YOUR_SESSION_ID","prompt":"Timer fired — I am back.","seconds":10}'
# → { "job_id": "uuid", ... }

# 3. Agent ends its turn. 10 seconds later the prompt appears in that session.

# 4. Poll for the agent's reply (optional — see "Reading the reply" below)
curl --noproxy localhost http://localhost:9801/jobs/JOB_ID
# → { "status": "responded", "response_text": "..." }

⚠️ Always use --noproxy localhost in IDE terminals if a corporate proxy is configured. Without it, curl routes through the proxy (a remote server) which cannot reach localhost on your machine — you get binary garbage or a proxy error instead of JSON. --noproxy localhost,127.0.0.1 tells curl to connect directly for loopback addresses.

⚠️ Default port is 9801. Double-check the port in your curl commands.


Installation

One VSIX works in all supported IDEs:

# VS Code
code --install-extension agent-chat-bridge-*.vsix --force

# Windsurf
windsurf --install-extension agent-chat-bridge-*.vsix --force

Reload the IDE after install (Cmd+Shift+PDeveloper: Reload Window).


Compatibility

IDE Minimum version Notes
VS Code 1.80.0 Session listing requires VS Code ≥ 1.96 (new chatSessions format)
Windsurf Latest stable Tested on macOS; CSRF token capture via language server spawn

Dashboard

Open the dashboard from the IDE command palette (Cmd+Shift+PAgent Chat Bridge: Open Dashboard), or click the ⚡ Bridge :PORT status bar item at the bottom-right of the IDE window.

You can also open it in any browser while the bridge is running:

open http://localhost:9801/ui

The browser version uses regular fetch against the bridge server; the webview version uses VS Code's postMessage bridge. Both show the same UI.

Agent Chat Bridge Dashboard

The status bar item shows the port the bridge is bound to and opens the dashboard on click:

Status bar item


Windsurf — macOS Permission Prompts

On macOS, the extension may occasionally show a Keychain password dialog:

"windsurf" wants to use your confidential information stored in "Windsurf Safe Storage" in your keychain.

This is a fallback — not the normal path. The extension primarily captures the API key from the Windsurf language server's stdin metadata when the language server spawns (no Keychain access needed). The captured key is saved to the extension's globalStorage and restored automatically on subsequent IDE restarts.

The Keychain is only accessed when:

  • The language server was already running before the bridge extension activated (e.g. first install without a full Windsurf restart), and
  • No key was previously saved in globalStorage.

After the first successful capture, the prompt should not reappear.

The key is never stored outside your local machine. On Windows, the equivalent (DPAPI via PowerShell) runs silently with no prompt. On Linux, safe storage is not supported — the spawn interceptor is the only source; a full Windsurf restart is required if the key is missing.

If you click "Deny": Cascade RPC calls fail for this session. Reload the window (Cmd+Shift+PDeveloper: Reload Window) to re-trigger the prompt, or do a full Windsurf restart to let the spawn interceptor capture the key without Keychain access.


API

The bridge listens on http://localhost:9801 (configurable in IDE Settings → "Agent Chat Bridge").

POST /jobs — register a job

curl --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{
    "session_id": "SESSION_ID",
    "prompt":     "The task finished. Continue.",
    "seconds":    30
  }'

Fields:

Field Type Required Description
prompt string Message submitted to the session when the trigger fires
session_id string Target chat session ID. Omit to open a new chat
workspace string Absolute path to workspace. Omit to use the current window's workspace
seconds number Fire after N seconds. Must be > 0 (use 1 to fire near-immediately)
command string Shell command (command or poll mode — fires on exit 0)
poll_interval number Combine with command: run every N seconds until exit 0
model string or object Model to use. String = family name (e.g. "gpt-4o"). Object = { family?, vendor?, id?, version? }
fallback "none" | "new_chat" What to do if the session can't be focused. Default: "new_chat"

Mode is auto-detected from the fields you provide:

Fields Mode Behaviour
seconds (> 0) timer Fires after N seconds
command + poll_interval poll Runs command every N seconds, fires on first exit 0
command (no interval) command Runs command once, fires on exit 0
none of the above webhook Waits for POST /jobs/:id/firefires nothing on its own

No trigger fields = webhook mode. The job sits idle until you call POST /jobs/:id/fire. Use this when an external system (CI, Teams bot) fires the callback itself.

Response:

{ "ok": true, "job_id": "uuid", "mode": "timer", "fires_in": "30s", "session_id": "...", "fallback": "new_chat", "model": null, "workspace": "/path/to/ws" }

For webhook mode the response includes fire_url instead:

{ "ok": true, "job_id": "uuid", "mode": "webhook", "fire_url": "/jobs/JOB_ID/fire", ... }

GET /jobs/:id — poll job status and read the reply

curl --noproxy localhost http://localhost:9801/jobs/JOB_ID

Poll this endpoint to follow a job through its lifecycle and read the agent's reply once it arrives.

Status progression:

Status Meaning
waiting Trigger hasn't fired yet
fired Message is being sent to the session
delivered Message confirmed delivered; bridge is watching for the agent's reply
responded Agent replied — response_text is populated
submitted VS Code best-effort delivery (no confirmation); no reply watching
failed Delivery failed
{
  "job_id":        "uuid",
  "session_id":    "aaaabbbb-...",
  "status":        "responded",
  "mode":          "timer",
  "prompt":        "Timer fired — I am back.",
  "response_text": "I've reviewed the output. The build passed and...",
  "model":         null,
  "fallback":      "new_chat",
  "started_at":    "2026-05-15T21:00:00.000Z",
  "running_for":   "47s",
  "instance":      "local"
}

response_text is null while the agent is still running (delivered status) and populated once the model finishes (responded). After responded the job moves to history where response_text is also preserved.

Typical polling loop:

while true; do
  RESP=$(curl -s --noproxy localhost http://localhost:9801/jobs/JOB_ID)
  STATUS=$(echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))")
  case "$STATUS" in
    waiting|fired|delivered) sleep 2 ;;
    responded) echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_text',''))"; break ;;
    *) echo "done: $STATUS"; break ;;
  esac
done

POST /jobs/:id/fire — manually trigger a job

curl --noproxy localhost -X POST http://localhost:9801/jobs/JOB_ID/fire

Immediately fires any job regardless of trigger type. Useful for testing and external webhooks (CI, GitHub Actions, Teams bots, deployment pipelines, etc.).


DELETE /jobs/:id — cancel a job

curl --noproxy localhost -X DELETE http://localhost:9801/jobs/JOB_ID

GET /jobs — list active jobs

curl --noproxy localhost http://localhost:9801/jobs

Returns both local (this bridge instance) and remote (other bridge instances) jobs:

{
  "jobs": [
    {
      "job_id": "uuid",
      "session_id": "...",
      "mode": "timer",
      "status": "waiting",
      "prompt": "...",
      "model": null,
      "fallback": "new_chat",
      "workspace": "/path/to/ws",
      "command": null,
      "poll_interval": null,
      "poll_attempts": null,
      "seconds": 30,
      "fires_at": "2026-05-15T21:00:00.000Z",
      "started_at": "2026-05-15T20:59:30.000Z",
      "running_for": "30s",
      "instance": "local"
    }
  ],
  "count": 1,
  "local": 1,
  "remote": 0
}

GET /sessions — list all known chat sessions

# All workspaces, most recent first
curl --noproxy localhost 'http://localhost:9801/sessions'

# Filter to a specific workspace
curl --noproxy localhost 'http://localhost:9801/sessions/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4'

# Single session detail
curl --noproxy localhost 'http://localhost:9801/sessions/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4/SESSION_ID'

# Paginate
curl --noproxy localhost 'http://localhost:9801/sessions?limit=10&offset=20'

Scans session storage across all workspaces and returns sessions sorted by last activity (most recent first). Sessions with no messages sent are excluded.

Response:

{
  "sessions": [
    {
      "session_id":     "aaaabbbb-cccc-dddd-eeee-ffffaaaabbbb",
      "workspace_hash": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
      "workspace_path": "/home/user/workspace/my-project",
      "last_modified":  "2026-05-08T12:34:56.000Z",
      "created_at":     "2026-05-08T10:00:00.000Z",
      "first_prompt":   "Help me build the async callback system",
      "title":          "Async callback system",
      "source":         "local"
    }
  ],
  "total": 47,
  "limit": 20,
  "offset": 0
}

Query params: ?limit=N (max 200, default 20), ?offset=N

Get the current window's workspace hash from GET /healthcurrent_workspace_hash.


GET /health

curl --noproxy localhost http://localhost:9801/health
# → { "status": "ok", "ide": "vscode", "port": 9801, "configured_port": 9801, "jobs": 0,
#     "current_workspace": "/path/to/workspace",
#     "current_workspace_hash": "a1b2c3d..." }

The ide field is "vscode" or "windsurf". Extra fields are IDE-specific:

  • VS Code: current_workspace_hash
  • Windsurf: token, api_key (redacted to "***"), cascade_port, model_uid

GET /registry — see all running bridge instances

curl --noproxy localhost http://localhost:9801/registry
# → {
#     "registry": {
#       "/path/to/workspace-a": { "port": 9801, "ide": "vscode" },
#       "/path/to/workspace-b": { "port": 9802, "ide": "windsurf" }
#     },
#     "current_workspace": "/path/to/workspace-a"
#   }

Shows all running bridge instances from the shared registry file. Each entry includes the port and the IDE that registered it. Cross-window job forwarding only targets bridges running the same IDE — a VS Code bridge will never forward to a Windsurf bridge even if they share the same workspace path.


GET /history — completed/cancelled/fired jobs

curl --noproxy localhost http://localhost:9801/history
# → { "history": [ { "job_id": "...", "status": "fired", "prompt": "...", ... } ], "count": 12 }

Persistent history of all jobs that have finished (fired, delivered, responded, cancelled, or failed). Trims to the last 500 entries on disk; in-memory cache serves the last 100. Includes response_text when the agent replied.


POST /session/identify — find sessions by message content

Fuzzy-match sessions that contain specific messages. Useful for agents that need to find the session a previous exchange happened in.

curl --noproxy localhost -X POST http://localhost:9801/session/identify \
  -H 'Content-Type: application/json' \
  -d '{
    "messages": [{ "text": "Help me build the async callback system" }],
    "workspace": "/path/to/project",
    "limit": 5
  }'

Fields:

Field Type Required Description
messages array Messages to search for. Each: { "text": "..." }
workspace string Filter to sessions in this workspace path
limit number Max results (default 10)

Response:

{
  "results": [
    {
      "session_id": "aaaabbbb-...",
      "workspace_hash": "a1b2c3d4",
      "workspace_path": "/path/to/project",
      "matched_messages": [{ "text": "Help me build the async callback system", "timestamp": null }],
      "context_messages": [
        { "role": "user", "text": "Help me build the async callback system", "timestamp": null }
      ],
      "last_modified": "2026-05-08T12:34:56.000Z",
      "created_at": "2026-05-08T10:00:00.000Z",
      "title": "Async callback system"
    }
  ]
}

VS Code only. Windsurf uses POST /session/identify backed by Cascade trajectory search via the RPC layer.


GET /events — SSE live updates

curl --noproxy localhost http://localhost:9801/events

Server-sent events stream for real-time updates. Emits jobs, history, and registry events whenever data changes. The dashboard UI subscribes to this to refresh tables without polling.


GET /ui — dashboard HTML

Serves the standalone dashboard (same UI used inside the IDE webview). Can be opened in any browser at http://localhost:9801/ui — no IDE needed. See the Dashboard section for screenshots and usage.


POST /config — update a setting

curl --noproxy localhost -X POST http://localhost:9801/config \
  -H 'Content-Type: application/json' \
  -d '{"key":"port","value":9802}'

Updates a setting (e.g. port) directly from the dashboard or an external script. Requires a window reload for the new value to take effect.


GET /models — list available models

Returns every chat model the current IDE window can see. Use the family value as the model string shorthand, or the full object for exact targeting.

curl --noproxy localhost http://localhost:9801/models
{
  "models": [
    {
      "id": "...",
      "name": "Claude Sonnet 4.5",
      "family": "claude-sonnet-4.5",
      "vendor": "copilot",
      "maxTokens": 128000,
      "source": "vscode_lm"
    }
  ],
  "total": 12
}

Note: Model availability depends on your subscription and IDE version. Always use GET /models for the current list.

Known models (GitHub Copilot, as of 2026-05-18)

Display name model string shorthand Full selector
Claude Opus 4.5 "claude-opus-4-5" { "family": "claude-opus-4-5", "vendor": "copilot" }
Claude Sonnet 4.5 "claude-sonnet-4-5" { "family": "claude-sonnet-4-5", "vendor": "copilot" }
Claude Haiku 3.5 "claude-haiku-3-5" { "family": "claude-haiku-3-5", "vendor": "copilot" }
GPT-4o "gpt-4o" { "family": "gpt-4o", "vendor": "copilot" }
GPT-4o mini "gpt-4o-mini" { "family": "gpt-4o-mini", "vendor": "copilot" }
GPT-4.1 "gpt-4.1" { "family": "gpt-4.1", "vendor": "copilot" }
GPT-4.1 mini "gpt-4.1-mini" { "family": "gpt-4.1-mini", "vendor": "copilot" }
o3 "o3" { "family": "o3", "vendor": "copilot" }
o4-mini "o4-mini" { "family": "o4-mini", "vendor": "copilot" }
Gemini 2.0 Flash "gemini-2.0-flash" { "family": "gemini-2.0-flash", "vendor": "copilot" }
Gemini 2.5 Pro "gemini-2.5-pro" { "family": "gemini-2.5-pro", "vendor": "copilot" }

These may not work — model IDs change when the IDE updates. If the IDE can't find a matching model, the prompt won't fire. Always verify with GET /models.


Getting Session ID

VS Code (GitHub Copilot): Inside a Copilot agent session, the session ID is available as VSCODE_TARGET_SESSION_LOG — a file path inside the debug-logs directory. The session ID is the UUID directory name. This is a template variable injected into the agent's system prompt, not a shell env var — echo $VSCODE_TARGET_SESSION_LOG in a terminal returns empty. The agent embeds the value literally into the curl command.

Windsurf (Cascade): Use GET /sessions to list sessions. The most recent session is typically the current one. Get the current workspace hash from GET /healthcurrent_workspace_hash.

If you don't need a specific session, omit session_id — the prompt opens in a new chat.


Examples

Timer — simplest test

curl --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{"session_id":"SESSION_ID","prompt":"Timer fired — I am back.","seconds":10}'

Webhook — fire on demand

# Register — creates a webhook job
RESULT=$(curl -s --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{"session_id":"SESSION_ID","prompt":"Fired on demand."}')
JOB_ID=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['job_id'])")

# Fire it when ready
curl --noproxy localhost -X POST "http://localhost:9801/jobs/$JOB_ID/fire"

Read the agent's reply

# Register a timer job
JOB_ID=$(curl -s --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{"session_id":"SESSION_ID","prompt":"Summarise what you just built.","seconds":2}' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['job_id'])")

# Poll until responded
while true; do
  RESP=$(curl -s --noproxy localhost "http://localhost:9801/jobs/$JOB_ID")
  STATUS=$(echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))")
  [ "$STATUS" = "responded" ] && echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin)['response_text'])" && break
  [ "$STATUS" = "waiting" ] || [ "$STATUS" = "fired" ] || [ "$STATUS" = "delivered" ] || break
  sleep 2
done

No session_id — opens a new chat

curl --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"Task done. Starting fresh.","seconds":5}'

Cross-workspace — fire into another workspace

curl --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{
    "workspace": "/home/user/workspace/my-api",
    "prompt":    "Deployment to prod finished. Check the logs.",
    "seconds":   1
  }'

Poll until a GitHub PR is merged

curl --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{
    "session_id": "SESSION_ID",
    "prompt": "PR #123 merged. Proceed with deployment.",
    "command": "gh pr view 123 --repo owner/repo --json merged -q .merged | grep -q true",
    "poll_interval": 30
  }'

Webhook from CI/CD

# 1. Register — get job_id
JOB_ID=$(curl -s --noproxy localhost -X POST http://localhost:9801/jobs \
  -H 'Content-Type: application/json' \
  -d '{"session_id":"SESSION_ID","prompt":"CI passed. Review and tag."}' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['job_id'])")

# 2. Fire from your pipeline or external system:
curl -X POST http://YOUR_TUNNEL_URL/jobs/$JOB_ID/fire

Configuration

Set in IDE Settings (Cmd+, → search "Agent Chat Bridge"):

Setting Default Description
agentChatBridge.port 9801 HTTP port (requires reload)
agentChatBridge.host "127.0.0.1" Interface the HTTP server binds to (requires reload)
agentChatBridge.commandTimeoutSeconds 86400 Max seconds before a poll/command job is auto-cancelled
agentChatBridge.fireExpiredOnRestore true Fire elapsed timer jobs immediately when IDE reopens
agentChatBridge.debug false Enable verbose logging in Output → "Agent Chat Bridge"

Edge Cases

seconds: 0 is rejected

seconds must be strictly > 0. Use seconds: 1 to fire near-immediately. To fire on demand, omit seconds (webhook mode) and call POST /jobs/:id/fire.

Timer expires while IDE is closed

The job persists in jobs.json in the platform state directory (macOS: ~/Library/Application Support/agent-chat-bridge/, Windows: %LOCALAPPDATA%\agent-chat-bridge\, Linux: ~/.local/state/agent-chat-bridge/). When the IDE reopens, remaining time is recalculated. If elapsed and fireExpiredOnRestore is true (default), the prompt fires immediately on startup.

Job targets a different workspace

When workspace doesn't match the current window, the bridge keeps the job in the shared jobs file, spawns the IDE with that workspace path, and fires the prompt when that window's extension restores the job.

Multiple IDE windows open

Each window auto-assigns its own port (9801, 9802 … 9810, first available). A shared registry file (~/.local/state/agent-chat-bridge/ports.json) maps each workspace to its port. When a job's workspace field targets a different window, the bridge looks up its port in the registry and forwards the request directly — no manual port config needed.

If you want a predictable port for a specific workspace (e.g. for CI pipelines), configure it:

{ "agentChatBridge.port": 9802 }

If that port is already taken, the bridge silently auto-assigns the next free one in the range 9801–9810 and logs the new port.


Job Persistence

Jobs survive IDE window reloads (Developer: Reload Window):

Mode Persistence behaviour
timer Resumes with adjusted remaining time; fires immediately if overdue
poll Resumes polling from current state
webhook Restored and continues waiting for /fire
command Not restored — the process is gone after reload

Jobs are stored in jobs.json in the platform state directory (shared across all IDE windows) and cleared when fired or cancelled. delivered and responded states are transient — they are not persisted and do not survive a window reload.


License

MIT — see LICENSE