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>/
| Path | Contents |
|---|---|
local_<uuid>.json | Session metadata |
agent/local_ditto_<uuid>[.json] | Dispatch or agent sessions (same shape) |
local_<uuid>/audit.jsonl | Audit log (see Cowork Audit Log) |
local_<uuid>/.audit-key | safeStorage-encrypted audit key |
local_<uuid>/.claude/projects/<mangled-cwd>/<cliSessionId>.jsonl | Embedded Claude Code transcript |
local_<uuid>/.claude/projects/<mangled-cwd>/<cliSessionId>/subagents/*.jsonl | Sub-agent transcripts |
local_<uuid>/.claude/tasks/<uuid>/<n>.json | Agent 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.json | Space-level metadata |
.project-cache/<projectUuid>/metadata.json (+ files/, docs/) | Cached project data |
cowork_settings.json, cowork-policy-limits-cache.json | Space settings and cached policy limits |
local-agent-mode-sessions/skills-plugin/**/SKILL.md | Installed 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.
| Field | Description |
|---|---|
session_id | The local_<uuid> identifier |
cli_session_id | The embedded Claude Code session ID, linking to the transcript file name |
session_type | Observed values include local-1p-cowork, local-1p-chat, local-1p-code, claude-ai-chat, terminal-cli, dispatch_child, scheduled |
title, initial_message | Session title and the first prompt |
model | Model identifier |
cwd | Working 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_at | Session timing |
is_archived, scheduled_task_id | Archive state; link to a scheduled task |
host_loop_mode | How 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_enabled | Feature flags |
account_name, email_address | Account identity (personal data) |
| system prompt | Present 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_foldersis the scope of data the agent could read and write. Compare it to files the transcript shows being touched. - Egress.
egress_allowed_domainsandweb_fetch_allowed_urlsbound where the agent could send data. A permissive list matters in an exfiltration question. - Remote MCP servers.
remote_mcp_serversnames third-party services the agent could call, with URLs. - Session type.
scheduledanddispatch_childsessions can run without the user watching. Checkscheduled_task_idand the space'sscheduled-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:
| Block | Meaning |
|---|---|
text | Plain text from the user or assistant |
thinking | Assistant reasoning |
tool_use | A tool call: ID, name, and input (for example a shell command) |
tool_result | The tool's output, matched by tool_use_id, with an error flag |
image | An 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.
| File | Contents |
|---|---|
spaces.json | Space definitions |
artifacts.json | Generated artifacts |
scheduled-tasks.json | Scheduled tasks: recurring agent work that can run unattended |
.project-cache/<projectUuid>/metadata.json | Cached project metadata; files/ and docs/ hold the project's files |
cowork_settings.json, cowork-policy-limits-cache.json | Settings and cached organization policy limits |
skills-plugin/**/SKILL.md | Installed 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:
| Path | Contents |
|---|---|
Claude/claude-code-sessions/<acct>/<org>/local_<uuid>.json | Session record: repository, working directory, branch |
Claude/claude-code-sessions/<acct>/<org>/scheduled-tasks.json | Scheduled Code tasks |
Claude/claude-code-sessions/<acct>/<org>/archived-sessions.idx | Archived-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
| Field | Format |
|---|---|
created_at, last_activity_at in session metadata | Source encoding not established by the research (macfor normalises to RFC 3339 UTC); check the raw value in the file before relying on it |
| Transcript entries | ISO 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.