AI Assistants

Claude Desktop Cowork Sessions

Overview

Cowork is Claude Desktop's local agent mode. A session runs an agent that can use tools on the user's machine: shell commands, file reads and writes, web fetches, and connected MCP tools. Each session leaves a directory of evidence that records what the agent was asked, which folders it could reach, what it did, and what it produced.

Cowork evidence is the strongest local record of agent activity in the app. The companion page Cowork Audit Log covers the tamper-evident event log. This page covers everything else in the session tree.

File Locations

Root: ~/Library/Application Support/Claude/local-agent-mode-sessions/<accountUuid>/<orgUuid>/

PathContents
local_<uuid>.jsonSession metadata
agent/local_ditto_<uuid>[.json]Dispatch or agent sessions (same shape)
local_<uuid>/audit.jsonlAudit log (see Cowork Audit Log)
local_<uuid>/.audit-keysafeStorage-encrypted audit key
local_<uuid>/.claude/projects/<mangled-cwd>/<cliSessionId>.jsonlEmbedded Claude Code transcript
local_<uuid>/.claude/projects/<mangled-cwd>/<cliSessionId>/subagents/*.jsonlSub-agent transcripts
local_<uuid>/.claude/tasks/<uuid>/<n>.jsonAgent task lists
local_<uuid>/.claude/.claude.json, settings.json, backups/Embedded Claude Code configuration
local_<uuid>/outputs/Files the agent produced for the user
local_<uuid>/uploads/Files the user supplied
spaces.json, artifacts.json, scheduled-tasks.jsonSpace-level metadata
.project-cache/<projectUuid>/metadata.json (+ files/, docs/)Cached project data
cowork_settings.json, cowork-policy-limits-cache.jsonSpace settings and cached policy limits
local-agent-mode-sessions/skills-plugin/**/SKILL.mdInstalled skills (shared across accounts)

The account and organization UUIDs in the path are the same identifiers that appear in the conversation store and config.json, so they link a session to an account.

Session Metadata

local_<uuid>.json is a single JSON object per session.

FieldDescription
session_idThe local_<uuid> identifier
cli_session_idThe embedded Claude Code session ID, linking to the transcript file name
session_typeObserved values include local-1p-cowork, local-1p-chat, local-1p-code, claude-ai-chat, terminal-cli, dispatch_child, scheduled
title, initial_messageSession title and the first prompt
modelModel identifier
cwdWorking directory
user_selected_folders[], folder_mount_names{}Folders the user granted to the session and the names they are mounted under
created_at, last_activity_atSession timing
is_archived, scheduled_task_idArchive state; link to a scheduled task
host_loop_modeHow the agent loop runs
web_fetch_allowed_urls[], egress_allowed_domains[]Network allowlists in force
enabled_mcp_tools[], remote_mcp_servers[]Connected tools and remote MCP servers (UUID, name, URL, tool names)
memory_enabled, skills_enabled, plugins_enabledFeature flags
account_name, email_addressAccount identity (personal data)
system promptPresent in the session; collectors may record only a hash

Field names above were observed on the reference build, and the set changes between versions. Unknown fields should be preserved, not discarded.

What to Look For

  • Granted folders. user_selected_folders is the scope of data the agent could read and write. Compare it to files the transcript shows being touched.
  • Egress. egress_allowed_domains and web_fetch_allowed_urls bound where the agent could send data. A permissive list matters in an exfiltration question.
  • Remote MCP servers. remote_mcp_servers names third-party services the agent could call, with URLs.
  • Session type. scheduled and dispatch_child sessions can run without the user watching. Check scheduled_task_id and the space's scheduled-tasks.json.

Output and Upload Files

outputs/ holds what the agent wrote for the user and uploads/ holds what the user attached. For each file record the relative path, size, SHA-256, and the file system modified and birth times. These are original files, so their contents and their metadata both matter. A file in outputs/ was created by the agent, which is evidence of what it produced, and the file times are the best available timing of when.

Embedded Claude Code Transcripts

Cowork runs an embedded Claude Code agent. Its working state lives in local_<uuid>/.claude/, which mirrors the layout of ~/.claude/ for the standalone CLI.

Transcript JSONL

.claude/projects/<mangled-cwd>/<cliSessionId>.jsonl holds one JSON object per line. The directory name is a mangled form of the working directory (separators replaced; the exact scheme is inferred, so match on the session ID instead), and the file name is the CLI session ID from the session metadata. Entries are user and assistant messages with typed content blocks:

BlockMeaning
textPlain text from the user or assistant
thinkingAssistant reasoning
tool_useA tool call: ID, name, and input (for example a shell command)
tool_resultThe tool's output, matched by tool_use_id, with an error flag
imageAn image block

Sub-agent work appears in separate subagents/*.jsonl files under the session directory. .claude/tasks/ holds the agent's task lists, which show how it planned the work.

The transcript overlaps with the audit log. Use the transcript for the conversational flow and the audit log for ordering, permission decisions, and tamper evidence. Entries that appear in one and not the other deserve explanation.

Spaces

A space groups sessions, projects, and scheduled work for an account and organization.

FileContents
spaces.jsonSpace definitions
artifacts.jsonGenerated artifacts
scheduled-tasks.jsonScheduled tasks: recurring agent work that can run unattended
.project-cache/<projectUuid>/metadata.jsonCached project metadata; files/ and docs/ hold the project's files
cowork_settings.json, cowork-policy-limits-cache.jsonSettings and cached organization policy limits
skills-plugin/**/SKILL.mdInstalled skills: Markdown instructions the agent follows

Scheduled tasks and installed skills are both execution and persistence surfaces: one makes the agent act on a timer, the other changes how it behaves.

Claude Code Sessions in the Desktop App

When the desktop app launches Claude Code sessions, it keeps a registry separate from Cowork:

PathContents
Claude/claude-code-sessions/<acct>/<org>/local_<uuid>.jsonSession record: repository, working directory, branch
Claude/claude-code-sessions/<acct>/<org>/scheduled-tasks.jsonScheduled Code tasks
Claude/claude-code-sessions/<acct>/<org>/archived-sessions.idxArchived-session index
Claude/git-worktrees.json (+ .corrupt-<ms> copies)Registry of git worktrees the app created

These records only link to the session. The full transcripts for those sessions are under ~/.claude/projects/, outside this profile. A .corrupt-<ms> copy means the app set aside an unreadable registry and started a new one, which can preserve older entries.

Virtual Machine Bundle

Cowork runs tools in a Linux virtual machine whose files live in Claude/vm_bundles/claudevm.bundle/: a root file system image (rootfs.img), a session data image (sessiondata.img), kernel and initrd files, efivars.fd, machineIdentifier, gvisorMacAddress, and vmIP. These are very large. macfor hashes and records them by default and copies them only on request. The images were not parsed during the research, so what the guest file systems contain is not documented here. The machineIdentifier, MAC address, and IP show the guest's identity and may appear in network logs.

Timestamps

FieldFormat
created_at, last_activity_at in session metadataSource encoding not established by the research (macfor normalises to RFC 3339 UTC); check the raw value in the file before relying on it
Transcript entriesISO 8601 timestamps (inferred from the Claude Code transcript format; confirm on the build under examination)
File system times on outputs/ and uploads/HFS+/APFS file times

What macfor Collects

The ai.claudedesktop plugin emits claude_cowork_session, claude_cowork_file, agent_transcript_entry, agent_task, claude_space, claude_artifact, claude_scheduled_task, claude_project_cache, claude_skill, claude_code_session, claude_git_worktree, and claude_vm_file records. Transcripts and output and upload files are copied byte-for-byte, unless skip_content or skip_cowork_files is set.

{
  "type": "claude_cowork_session",
  "session_id": "local_00000000-0000-4000-8000-000000000002",
  "session_type": "local-1p-cowork",
  "title": "Example session",
  "model": "example-model",
  "cwd": "/Users/jdoe/Documents/example",
  "user_selected_folders": ["/Users/jdoe/Documents/example"],
  "egress_allowed_domains": ["example.com"],
  "created_at": "2026-07-14T09:00:00Z"
}

All values above are illustrative.

References