pond

io.github.tenequm由 GitHub 账号 tenequm 发布v0.14.5更新于 Oct 24, 2026

Lossless archive and search for AI agent sessions across clients, exposed to agents over MCP.

概览

AI 生成的概览

把多个 AI 代理客户端的会话归档到自有存储并可搜索,通过 MCP 提供搜索、读取和只读 SQL。

可以做什么
Pond 将受支持的代理客户端会话导入到自有存储中的统一模式,并建立索引以支持全文检索(默认 BM25,可选向量检索)。通过 MCP 暴露 pond_search、pond_get_session、pond_get_message、pond_ingest 等操作,以及只读的 pond_sql 工具和 schema、stats 资源。会话还可以恢复到受支持的客户端,而不限于生成它的那个客户端。
适用场景
适合同时使用多个代理客户端或多台机器、希望把历史会话集中搜索的场景,也适合让代理回答“之前是怎么解决的”。它保留完整会话而非抽取的事实,因此更适合回溯与查证,而不是提炼式记忆。
运行要求
以本地进程方式通过 stdio 运行,可用 Homebrew、Scoop、Nix、发布二进制或 cargo(pond-db)安装。通过 pond init 和 pond sync 完成设置;存储默认在本地目录,也可指向 S3 兼容或其他对象存储,凭据通过 pond creds add 添加。清单中未声明环境变量或请求头。
安装前请注意
它会读取多个客户端的本地会话文件,导入的历史可能包含敏感提示、代码和工具输出。使用远程存储需要凭据(访问密钥与密钥),通过 pond creds add 添加;由于 pond 不做认证或授权,对象存储的 IAM 就是存储边界。项目处于 v1 之前,模式、接口形态和配置键可能变化。定时同步和索引维护会写入存储。

安装

在 SourceWeft 中

  1. 打开 控制台中的 pond,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[pond]

pond

[CI] [crates.io] [docs] [License]

"I know we discussed that before. Why can't I find that damn conversation?"

Pond makes every AI agent session you've ever run - Claude Code, Codex, any tool, any machine - searchable in one place.

Your agent history is already on your disk: thousands of sessions full of decisions, fixes, and dead ends - scattered across tools that can't search them. Pond ingests them all automatically and losslessly into storage you own (a local dir or your own S3 bucket), makes the whole corpus searchable and SQL-queryable, and hands that recall back to your agents over MCP - so "how did we fix this before?" is a query, not an archaeology dig. Sessions stop being locked to the tool that created them: any session can be restored into any supported client and continued there.

sh
brew install tenequm/tap/pond   # macOS / Linux
scoop bucket add tenequm https://github.com/tenequm/scoop-bucket   # Windowsscoop install tenequm/pond

Or prompt your agent: "Please install and set up pond (see github.com/tenequm/pond)" - the full, failure-proofed version of that prompt is in Connect your agents.

[A live pond corpus, then Claude Code answering a three-month-old debugging question from it]

A live 12k-session corpus, then a three-month-old fix found and verified against the current code (crisper MP4)

[Bar chart: tokens into context for one recall answer. pond_search returns a complete ranked answer in 1.5-3k tokens; grep plus reading one matching transcript costs 90-255k tokens, chosen from 23-3,270 unranked matching files]

Five real recall questions, one corpus, one machine - method, raw numbers, and a rerunnable script in docs/benchmarks

Status: pre-v1. Schemas, wire shapes, and config keys are subject to breaking change until v1. Full documentation lives at pond.locker; the contract is docs/spec.md.

Quickstart

Install, run guided setup, and ingest your local sessions:

sh
brew install tenequm/tap/pond   # macOS / Linux; Windows: Scoop or a release zip - see Install belowpond init   # guided setup: storage, adapters, MCP + agent skill, optional schedulepond sync   # ingest and index - every enabled adapter

pond init registers pond as an MCP server for Claude Code and installs the bundled pond skill; for Codex it prints the command to run instead - restart the client afterwards so the tools load. By hand: claude mcp add -s user pond -- pond mcp, codex mcp add pond -- pond mcp; skill: mkdir -p ~/.claude/skills/pond && pond skill > ~/.claude/skills/pond/SKILL.md (that whole line is POSIX-only - mkdir -p, &&, and > all break or corrupt in Windows PowerShell 5.1; use the PowerShell block in Connect your agents). Then ask your agent - real prompts from daily use:

check in pond how we solved this before, then apply the same fix here
where we left off yesterday - check pond, then continue
are you sure that won't break X? check in pond how we struggled with exactly this

Sessions are picked up automatically from Claude Code, the Claude desktop app (local agent mode), Codex CLI, opencode, pi-coding-agent, oh-my-pi, OpenClaw, NanoClaw, Hermes Agent, letta-code, grok-build, Antigravity CLI (agy, including its ACP server), and Devin CLI (devin). A Claude.ai data export imports with pond sync claude-ai-export --path <path> (manual download, so not auto-discovered).

Isn't this another memory tool?

No - it's the layer underneath one. Memory tools store what they decided you'd need - facts, summaries, filed chunks; the sessions themselves are gone. Pond keeps the sessions: every message, tool call, and result, value-complete, cross-client, in storage you own, never pruned - searchable over MCP and restorable into any client. Memory is a derived view you can always rebuild from an archive; an archive can never be rebuilt from memories.

Three kinds of tool get called "memory". Side by side:

pondSession search (ctx, deja-vu, cass)Memory layers (Mem0, Letta)
History from before installyesyesno
What is keptthe whole sessiona search index ¹extracted facts
Where it liveslocal dir or S3 bucketlocal indexthe tool's database
After the harness deletes the filestill theregone at next refresh ¹only the extract
Several machinesone shared bucketpulled into one machine ²shared server or cloud
Agent accessCLI, MCP, HTTP, SQLCLI, MCP ³HTTP, SDK, MCP

¹ cass also mirrors the raw files, so they outlive the source. ² deja-vu copies records between machines over ssh; cass pulls other hosts' session files over ssh/rsync into its local index; ctx is single-machine. ³ cass has no MCP server.

Pick session search for fast local recall. Pick a memory layer when the agent should carry distilled facts, not the record. Pick pond when you want the sessions themselves, in storage you own, from every machine you run.

Full comparison, with receipts per tool: pond.locker/compare. Every cell is a claim about a specific version of someone else's project. If one has gone stale, open an issue and it gets fixed the same day.

Background

Every agentic CLI ships its own session format and its own search surface. Switching tools means losing history. Replaying a Claude Code session in another provider's tooling means re-translating the wire shape by hand. Hosted multi-tenant deployments rebuild the same storage layer from scratch.

Pond is the storage and retrieval layer that sits underneath. Every adapter is a bidirectional codec between a client format and one canonical schema, so any session can be restored by any adapter - it need not return to the client that produced it. Storage, search (BM25 full-text by default, with optional semantic search, one arm per query), and provider-agnostic replay all sit on a single Lance-on-object-storage foundation.

The v1 surface includes: full CLI, HTTP+JSON and MCP transports, search over three Lance datasets, opt-in intfloat/multilingual-e5-small embeddings at FP16 weights (Metal on macOS, CUDA opt-in, CPU fallback), and local-FS / S3 / GCS / Azure backends through Lance's object_store integration.

Install

Linux, macOS, and Windows are supported.

macOS and Linux:

sh
brew install tenequm/tap/pond              # Homebrewnix profile add github:tenequm/pond#pond   # Nix

Windows (Scoop, the primary channel - it also ships pondw.exe, the windowless launcher that scheduled sync runs through):

powershell
scoop bucket add tenequm https://github.com/tenequm/scoop-bucketscoop install tenequm/pond

Buckets are git clones, so the first line needs git on PATH - if it fails with "Git is required for buckets", run scoop install git and retry.

No Scoop yet? Bootstrap it first, from a normal (non-admin) PowerShell (its installer refuses an elevated shell):

powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Forceirm get.scoop.sh | iex

Then open a new terminal - PATH changes reach only processes started after the install. See the Windows notes for Defender, long paths, scheduling, and WSL.

No package manager (any platform): every release attaches prebuilt binaries (pond-x86_64-pc-windows-msvc.zip on Windows, ~223 MB unpacked) - unpack one and add its directory to PATH (on Windows: Settings > System > About > Advanced system settings > Environment Variables, under your user variables), nothing else to install.

Via cargo (any platform, needs the Rust toolchain):

sh
cargo binstall pond-db   # downloads the prebuilt binary (needs cargo-binstall)cargo install pond-db    # builds from crates.io (installs the `pond` command)

Both install pond.exe only, so scheduled sync on Windows - which runs through pondw.exe - wants the Scoop or zip install instead (or --features windows-launcher on a source build). cargo install also needs the protoc and NASM prerequisites below.

Build from source:

sh
git clone https://github.com/tenequm/pond.gitcd pondcargo install --path packages/pond

On Windows that clone needs git config --global core.longpaths true first (test-fixture paths exceed 260 characters), and the build needs an explicit --target x86_64-pc-windows-msvc - without it cargo applies the repo's +crt-static flag to build scripts and proc-macros too, which then fail to load.

For CUDA acceleration on Linux:

sh
cargo install --path packages/pond --features cuda

On macOS the Metal backend is selected automatically; on other systems the CPU fallback runs without extra features. Building from source on Windows additionally needs protoc (winget install Google.Protobuf) and NASM (winget install NASM.NASM, then add C:\Program Files\NASM to PATH yourself - its installer doesn't) on PATH.

If any install path fails, the Troubleshooting guide covers the common stalls.

Usage

Sync and search

Set up storage, adapters, MCP registration, and an optional sync schedule in one pass (idempotent - re-run it any time to repair or update):

sh
pond init

Then import sessions from local adapters, update indexes, and search:

sh
pond syncpond search "how did we wire up the OCC retry loop"

Run a server

sh
pond serve                         # HTTP on 127.0.0.1:9797pond serve --transport stdio       # MCP over stdiopond mcp                           # alias for stdio MCP

Fetch and copy

Fetch a single session or message, or move a whole corpus:

sh
pond get-session <id>pond get-message <id>pond copy --from local --to snapshot.pondpond copy --from snapshot.pond --to local

Read-only SQL

Ask structured questions with read-only SQL (the same surface as the pond_sql MCP tool):

sh
pond sql "SELECT project, count(*) FROM messages GROUP BY project ORDER BY 2 DESC"

Maintenance

Run maintenance on demand (sync folds indexes on every run):

sh
pond optimize --only embed   # only when [embeddings].enabled = truepond optimize --only index

Scheduled sync

Keep pond current automatically (launchd on macOS, systemd user timers or cron on Linux, Task Scheduler on Windows - there, run it from a normal shell, not an elevated one, or the task ends up owned by Administrators):

sh
pond schedule start                # every 5m by default (--every 15m|1h|6h|1d)pond schedule statuspond schedule logs

Status and introspection

pond status prints a per-table storage table, then indexes (text readiness, plus the semantic half only when embeddings are enabled), stored (sessions + messages), agents (source agents in the store), and this host's view of it: per-adapter sessions pending sync, the last sync's outcome (including a surfaced failure from a scheduled run), and the next scheduled run. pond status --hosts breaks a shared store down by ingest host; --include-subagents counts each subagent as its own agent. pond sync --dry-run previews what the next sync would read. pond search --explain returns Lance's analyze_plan output for each retrieval arm.

Remote storage

By default pond stores data locally under ~/.local/share/pond (%LOCALAPPDATA%\pond\data on Windows). To use an object store, add credentials and switch the destination:

sh
pond creds add                                                    # interactive: name, access key, hidden secretpond storage use s3+https://nbg1.your-objectstorage.com/my-pond   # probe end-to-end, then flip [storage].pathpond storage check                                                # verify: parse, creds, conditional-put (OCC), write/read/delete

pond init --storage-path <url> configures a remote destination during setup and prompts for credentials inline when the destination is remote, so a bucket is one command. The s3+https://host/bucket form works for any S3-compatible store (Hetzner, R2, B2, MinIO); s3://, gs://, and az:// use the standard cloud SDK credential chain when no [creds.*] set matches. pond copy --from <local> --to <url> carries existing local data into the bucket - idempotent, never deletes the source, and on completion it rebuilds the destination indexes and verifies every row landed (exit 6 if any are missing or duplicated, so you never reconcile by hand). pond copy --verify-only --from <local> --to <url> runs that same check read-only, without copying. Full walkthrough: pond.locker.

Configuration

pond init walks through everything below interactively and enables the adapters it finds. pond sync only ingests already-enabled adapters - enabling one is an explicit step (pond adapters enable / pond adapters discover / pond init), never a side effect of sync. Config lives at ~/.config/pond/config.toml on macOS and Linux, %APPDATA%\pond\config.toml on Windows (pond config path prints it). Every [adapters.<name>] block needs enabled = true to be active; sections without it (or with enabled = false) are skipped. ~ in paths expands on every platform (%USERPROFILE% on Windows).

toml
[adapters.claude-code]enabled = truepath = "~/.claude/projects"
[adapters.codex-cli]enabled = false                    # kept in config, skipped on `pond sync`path = "~/.codex/sessions"

Search is BM25 full-text by default. Semantic search is opt-in and off unless you ask for it: with it off no pond process downloads or loads an embedding model, new messages get no vectors, and --mode vector is refused. Turn it on in config or with POND_EMBEDDINGS_ENABLED=true, then run pond optimize --only embed once to fill the backlog:

toml
[embeddings]enabled = true

Full detail, including what it costs and how mixed fleets behave, is in the configuration reference.

Supported harnesses

One adapter per harness, in pond adapters discovery order; Reads is the path pond init discovers and writes to [adapters.<name>].path - shown POSIX-style, with the same home-relative layout on Windows (~/.claude/projects is %USERPROFILE%\.claude\projects). Last verified is the most recent capture or refresh date of the adapter's committed fixture (packages/pond/tests/fixtures/adapter/), the corpus its mapping is tested against. Adapters are maintained best-effort, and format drift is safe by design: unknown record shapes still ingest losslessly, malformed input surfaces as a typed error naming the file. Adding a harness is routine work - see Contributing.

AdapterReadsLast verified
claude-codeClaude Code CLI, ~/.claude/projects2026-08-14
claude-desktop-appClaude Desktop / Cowork local agent sessions2026-05-13
claude-ai-exportclaude.ai data-export archive (manual --path)2026-06-04
codex-cliOpenAI Codex CLI, ~/.codex/sessions2026-09-01
opencodeopencode, ~/.local/share/opencode (opencode.db: the 1.x tables and the OpenCode 2 session_v2 store, plus the legacy JSON tree)2026-10-12
openclawopenclaw, ~/.openclaw2026-05-13
nanoclawnanoclaw, ~/nanoclaw (the install root holding data/v2-sessions)2026-05-14
hermesHermes Agent, ~/.hermes (state.db per profile)2026-07-23
pi-coding-agentpi, ~/.pi/agent/sessions2026-08-06
oh-my-pioh-my-pi, ~/.omp/agent/sessions (ingest-only)2026-08-14
letta-codeletta-code, ~/.letta/transcripts (a root relocated via LETTA_TRANSCRIPT_ROOT is configured as an explicit path)2026-08-24
grok-buildgrok-build (xAI grok CLI), ~/.grok/sessions (a relocated GROK_HOME is configured as an explicit path)2026-08-24
agyAntigravity CLI and its ACP server, ~/.gemini (both antigravity-cli/ and antigravity-acp/; a relocated GEMINI_HOME is configured as an explicit path; ingest-only)2026-09-10
devinDevin CLI (Cognition's devin), ~/.local/share/devin/cli (sessions.db; %APPDATA%\devin\cli on Windows; a relocated XDG_DATA_HOME is configured as an explicit path; ingest-only)2026-09-26

Verbosity

Root-level -v / -vv / -vvv raise the tracing level (info / debug / trace); -q / -qq lower it. The default surfaces warnings only. RUST_LOG overrides the CLI flag when set; POND_LOG is no longer honored.

Design

The full contract is in docs/spec.md. Key choices:

  • Lance direct, no wrapper. The lance-format/lance crates are the only storage and search engine. No lancedb, no parallel abstraction. Storage, indexing, OCC, schema evolution, blob columns, versioning, and time-travel are all Lance. The read-only pond sql surface is DataFusion planning over the same Lance datasets - a query escape hatch, not a second engine.
  • Canonical Session / Message / Part interlingua. Owned in pond, in the shape of Effect v4's Prompt-side Part union. This schema is pond's product; everything else is machinery around it.
  • Three Lance datasets (sessions, messages, parts). messages carries the nullable embedding (vector + embedding_model) alongside denormalized filter columns (source_agent / project / role / timestamp) for single-stage filter pushdown.
  • No-synthesis adapter seam. Adapters parse source records through extractor helpers that make "invent a value" a compile error - model-no-synthesis, model-schema-honesty, and adapter-provenance-required are structural, not review rules.
  • Index lifecycle decoupled from writes. Writes commit data (including embeddings, computed inline at ingest when embeddings are enabled) without folding the search indexes. pond sync runs index maintenance by default, and pond optimize --only index runs it on demand; Lance merges index results with a flat scan over unindexed fragments, so reads stay correct.
  • Single-arm retrieval. Each query runs one retriever - fts (BM25, the default) or vector (cosine, with a gentle recency tiebreaker, offered only when embeddings are enabled) - chosen per query; no server-side fusion. --sort-by recency returns newest-first. Results group to one summary per session, keyed on session_root.
  • Language-neutral full-text. Word-level simple tokenizer with English stemming (ascii-folding on); tokens the stemmer does not recognize pass through unchanged and stay exact-matchable, so pond indexes sessions in any language alike.
  • Two transports, one handler set. HTTP+JSON (axum) and MCP (rmcp) both dispatch into the same handlers. Wire ops: pond_search, pond_get_session, pond_get_message, pond_ingest. MCP additionally exposes the read-only pond_sql tool and the schema://pond, schema://pond-sql, and stats://pond resources.
  • Opaque-string multi-tenancy. Each tenant is a namespace string the integrator supplies; pond does not authenticate, authorize, or model identity. The object store's IAM is the storage boundary.
  • Encryption is operational. Bucket SSE plus filesystem encryption; pond holds no keys and adds no application-level crypto.

Roadmap

pond ships in small steps. This table lists the steps in order. Done steps stay in the table. The roadmap board holds the same items with their issues. React or comment on an issue to influence the order.

#StepStatus
1Lossless ingest from Claude Code and Codex into Lance, local or S3✅ v0.5
2Single-arm search: BM25 or vector, one arm per query✅ v0.10
3Remote sync in under a minute; warm search in under a second✅ v0.11-v0.12
4Tool-call columns and read-only SQL over the corpus✅ v0.13
5Crash-safe local stores that self-heal on open✅ v0.14.0
6Eleven harnesses, pond resume into any client, MCP registry, Windows✅ v0.14.11
7BM25 becomes the default arm. Embeddings become opt-in. #164✅ v0.15.0
8New adapters become routine: pond-add-adapter playbook + conformance harness #172, letta-code #170, grok CLI #171 - twelve harnesses✅ v0.15.1
9Lance 10, then 11: count pushdown, date-filter zonemaps, stemmer self-heal. #145✅ v0.16.0-v0.17.0
10pond erase: the one sanctioned deletion. #45⏭ Next
11Remote reads as fast as local reads. #165⏳ Later
12Namespaces: keep work and personal sessions apart. #166🔧 In progress (design)
13Redaction on copy, export, and resume. Never at ingest. #167⏳ Later
14herdr plugin: every session in one list, live or not, on any machine. Resume, fork, hand off. #219⏳ Later
The canonical model as a published contract: ATIF export and import, a /format page, a stability promise. Vote-gated, outside the numbered order. #180🔧 In progress
Community adapters: nine harnesses wanted, playbook-driven - Qwen Code, Crush, Cline, OpenHands, Copilot CLI, Cursor CLI, Droid, Kiro CLI, Roo/Zoo Code. adapter issues🙋 Wanted
A capture daemon. pond reads what your harness already writes.❌ Not planned
A hosted service that owns your bucket. Your storage stays yours.❌ Not planned
Summaries or pruning of stored sessions. pond keeps the sessions.❌ Not planned

Step 7 was based on data. Over 63 days, agents ran 1,126 searches against this archive. BM25 found the answer 61% of the time. Vector found it 37% of the time. Read the measurement.

This is a direction, not a contract. The order changes when the data changes.

References

The upstream schemas that shaped pond's canonical model are documented in docs/references/ (source URLs + why each matters; the vendored code itself is not redistributed). Real session captures live under packages/pond/tests/fixtures/adapter/.

SourceWhy it matters
Effect-TS/effectEffect v4 Prompt/Response Part unions. Pond's canonical types copy this shape.
sst/opencodeEffect Schema canonical Part union; SDK types; storage schema.
kilo-org/kilocodeOpenCode fork. Adds editorContext, plan-followup, kilocode-specific events.
badlogic/pi-monopi-coding-agent leaf-cursor branching and cross-provider conformance test matrix.
open-telemetry/semantic-conventions-genaiGenAI semantic conventions. Inspiration for shape overlap; pond does not derive from OTel.
packages/pond/tests/fixtures/adapter/Session samples for fifteen source harnesses (agy, claude_ai_export, claude_code, claude_desktop_app, claude_managed_agents, codex_cli, devin, grok-build, hermes, letta-code, nanoclaw, oh-my-pi, openclaw, opencode, pi-coding-agent; real captures except the synthetic hermes state.db and the generated oh-my-pi corpus). Drives adapter design and serves as adapter test fixtures.

Contributing

Issues and pull requests are welcome. The most useful contributions right now:

  • An adapter for a harness pond does not read yet. The playbook is the pond-add-adapter skill; the PR expectations are in CONTRIBUTING.md.
  • Spec feedback on docs/spec.md.
  • Pointers to additional reference schemas or session samples worth documenting under docs/references/.
  • Bug reports against the v1 surface (CLI verbs, wire ops, schema mismatches, OCC behavior, object-store backends).

For something bigger, the roadmap is the list. Comment on the issue before you start, so we agree on the scope. For other larger changes, open an issue first to discuss the direction. For security issues, see SECURITY.md.

Questions or feedback? Start a GitHub Discussion, or DM me on Telegram or X - I answer personally.

Links

License

Apache-2.0 (c) 2026 tenequm

来源:README.md,提交 d0d5e1e

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.14.5最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分