Telltale
Inventory
Early DevelopmentInventory answers a different question than session-store discovery: what agent tooling appears installed here? Today this page focuses on agent inventory. Over time, this same area can expand to MCP inventory, skills inventory, plugin inventory, and other agentic surfaces.
What inventory should collect
Start with low-risk metadata. Installed-agent inventory should confirm tools without reading transcripts, session stores, API keys, settings values, or private logs.
- CLI evidence: executable names on PATH and safe symlink/package-directory resolution.
- Package evidence: known global package roots such as npm, pnpm, bun, Homebrew, WinGet, Scoop, Chocolatey, or native installers.
- Editor evidence: VS Code-style extension IDs and extension directories for local, remote, Cursor, Windsurf, and compatible editors.
- Secondary evidence: globalStorage/config directories, treated as partial because they can remain after uninstall.
- Output evidence: presence, confidence, signal type, and path hashes rather than raw paths when telemetry is emitted.
Agent signals to check
Current agent inventory scope
Codex
Executable: codex. Package evidence: @openai/codex. Common installs include standalone installer, npm global, Homebrew cask, or release binary.
Claude Code
Executable: claude. Package evidence: @anthropic-ai/claude-code. Native installs commonly place versioned files under a per-user Claude directory; package managers may use Homebrew, WinGet, apt, dnf, apk, or npm.
Gemini CLI
Executable: gemini. Package evidence: @google/gemini-cli. Common installs include npm global, Homebrew, MacPorts, or no-install package execution.
OpenCode
Executable: opencode. Package evidence: opencode-ai. Common installs include the OpenCode installer, npm/pnpm/bun, Homebrew, Scoop, Chocolatey, Arch/AUR, mise, or nix.
Qwen CLI
Executable: qwen. Package evidence: @qwen-code/qwen-code. Common installs include standalone installer, npm, or Homebrew.
OpenClaw
Executable: openclaw. Package evidence: openclaw. Treat install evidence separately from the lower-confidence session-store path.
RooCode
Extension ID: rooveterinaryinc.roo-cline. Check VS Code-compatible extension roots; globalStorage is partial evidence only.
KiloCode
Extension ID: kilocode.kilo-code. CLI executables: kilo and kilocode. Package evidence: @kilocode/cli.
GitHub Copilot
Extension IDs: github.copilot and github.copilot-chat. Config-only traces, such as a Copilot config directory, are partial or stale evidence unless the extension is installed.
Quick local enumeration
These one-liners are metadata-only starting points. They list command locations and common extension directories. They do not read transcript, database, session, or credential contents.
for c in codex claude gemini openclaw qwen opencode kilo kilocode; do command -v "$c" >/dev/null && printf '%s %s
' "$c" "$(command -v "$c")" || printf '%s missing
' "$c"; done; for d in "$HOME/.vscode/extensions" "$HOME/.vscode-server/extensions" "$HOME/.cursor/extensions" "$HOME/.windsurf/extensions"; do [ -d "$d" ] && ls -1 "$d" | grep -Ei '^(github.copilot|github.copilot-chat|rooveterinaryinc.roo-cline|kilocode.kilo-code)-' | sed "s#^#$d/#"; done Use this as a quick operator check. Telltale telemetry hashes paths before emitting inventory evidence.
$cmds='codex','claude','gemini','openclaw','qwen','opencode','kilo','kilocode'; $cmds|%{ $p=(Get-Command $_ -ErrorAction SilentlyContinue).Source; if($p){"$_ $p"}else{"$_ missing"}}; $roots="$env:USERPROFILE.vscodeextensions","$env:USERPROFILE.vscode-serverextensions","$env:USERPROFILE.cursorextensions","$env:USERPROFILE.windsurfextensions"; $ids='github.copilot','github.copilot-chat','rooveterinaryinc.roo-cline','kilocode.kilo-code'; $roots|?{Test-Path $_}|%{$r=$_; Get-ChildItem $r -Directory|?{$n=$_.Name.ToLower(); $ids|?{$n.StartsWith("$($_)-")}}|%{"extension $($_.FullName)"}} PowerShell output is local metadata. Review before sharing because paths can reveal usernames or workstation layout.
How Telltale uses inventory
Telltale keeps inventory separate from session-source discovery. A session source says where activity can be parsed; installed-agent inventory says what tooling appears present. The current scanner emits an install_inventory activity at most once every 24 hours by default, with a configurable interval and an opt-out flag.
- Default cadence: 24 hours.
- Tune with --install-inventory-interval-seconds or ADR_INSTALL_INVENTORY_INTERVAL_SECONDS.
- Use 0 to collect every scan during testing.
- Use --install-inventory-disabled to suppress inventory for a run.
- Client-filtered scans stay scoped to session clients and do not emit the global install inventory event.
Inventory module boundary
Install inventory is already metadata-only and its definitions now live in per-agent source modules collected by a static registry. The parser refactor plan keeps that boundary while separately moving semantic parsing to explicit per-source registrations.
Future inventory surfaces
Agent inventory is the first inventory layer. The same public pattern should eventually cover MCP server inventory, skills and plugin inventory, model/provider routing inventory, and editor/workspace integration inventory. Each layer should state confidence, source, and privacy boundary explicitly.