Skip to content

Telltale

Inventory

Early Development

Inventory 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.

Linux/macOS shell
SH
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.

Windows PowerShell
POWERSHELL
$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.