-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpackage.json
More file actions
217 lines (217 loc) · 12 KB
/
Copy pathpackage.json
File metadata and controls
217 lines (217 loc) · 12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
{
"name": "agent-deck",
"displayName": "Agent Deck — Watch Your Agents Work.",
"version": "0.8.1",
"publisher": "nvitlam",
"description": "Live observability for coding-agent swarms — Claude Code, OpenCode and Codex, side by side in VS Code. Read-only, zero egress.",
"license": "MIT",
"keywords": [
"claude code",
"observability",
"agents",
"monitor",
"subagents",
"opencode",
"codex"
],
"repository": {
"type": "git",
"url": "https://github.com/NVitlam/agent-deck.git"
},
"categories": [
"Visualization",
"Other"
],
"type": "module",
"main": "./dist/extension.cjs",
"engines": {
"node": ">=22.22.2",
"vscode": "^1.134.0"
},
"devEngines": {
"runtime": {
"name": "node",
"version": "24.18.1",
"onFail": "warn"
}
},
"activationEvents": [
"onStartupFinished"
],
"contributes": {
"commands": [
{
"command": "agentDeck.open",
"title": "Open Session Deck",
"category": "Agent Deck"
},
{
"command": "agentDeck.openStats",
"title": "Open Statistics",
"category": "Agent Deck"
},
{
"command": "agentDeck.showDiagnostics",
"title": "Show Diagnostics",
"category": "Agent Deck"
},
{
"command": "agentDeck.openSettings",
"title": "Settings",
"category": "Agent Deck"
},
{
"command": "agentDeck.stats.clearHistory",
"title": "Clear Stats History",
"category": "Agent Deck"
}
],
"configuration": {
"title": "Agent Deck",
"properties": {
"agentDeck.port": {
"type": "integer",
"default": 47821,
"minimum": 1,
"maximum": 65535,
"description": "Loopback port the hook listener binds on 127.0.0.1. Must match the port in the hook block you pasted into your settings. A collision is reported as an error; Agent Deck never picks a different port for you."
},
"agentDeck.livenessThresholdMs": {
"type": "integer",
"default": 120000,
"minimum": 1000,
"maximum": 86400000,
"description": "How long a session may go without activity before it stops counting as live, in milliseconds. Below about 60000 a single long tool call makes a healthy session flap between live and idle."
},
"agentDeck.previewBytes": {
"type": "integer",
"default": 8192,
"minimum": 0,
"maximum": 1048576,
"description": "Maximum bytes of tool payload kept per node for previews. This is the single ceiling: the redaction layer is given the same number (never below its own 8 KB default, because the stub that points at an offloaded tool-results file is about 2 KB and cutting it shorter loses the pointer), so raising this genuinely raises the kept payload. Truncated payloads carry a marker stating the kept bytes and the ORIGINAL size in bytes; the marker sits on top of the budget, so a preview is slightly longer than this value. Nothing is ever sent off the machine. Measured on the committed CC 2.1.234 capture, whose largest payload is 63,774 bytes: at 8192 it keeps 8,192 bytes and reports 63,774; at 16384 it keeps 16,384; at 65536 it is kept whole. No payload in that capture exceeds 65,536 bytes, so larger values are unexercised by it."
},
"agentDeck.codex.maxTranscriptBytes": {
"type": "integer",
"default": 67108864,
"minimum": 1048576,
"maximum": 1073741824,
"description": "Largest Codex transcript Agent Deck will open, in bytes. Default 67108864 (64 MiB). A rollout file bigger than this is measured from its directory entry and never read: it is reported on the Agent Deck output channel as oversize with its size and this limit, and it contributes no session. Codex stores tool output whole and inline with no offload path, so one long-running session can reach hundreds of megabytes, and reading such a file into the extension host is what this limit exists to prevent. Raising it costs memory in proportion to the file. A session already being followed keeps being followed when it grows past the limit -- the limit gates the first read of a file, never a tail already in progress."
},
"agentDeck.stats.enabled": {
"type": "boolean",
"default": true,
"description": "Keep a local history of derived session statistics under the extension global storage directory. Append-only JSON Lines, one file per ISO week, pruned by agentDeck.stats.retentionDays. Nothing is ever sent off the machine and nothing is written under Claude Code, Codex or OpenCode directories. Turn this off and Agent Deck writes no file at all and creates no directory; records already written stay until you run the Agent Deck: Clear Stats History command, which works whether or not this is on."
},
"agentDeck.stats.retentionDays": {
"type": "integer",
"default": 90,
"minimum": 1,
"maximum": 3650,
"description": "How many days of stats history to keep, in days. Files are pruned when a record is written, and a weekly file is removed once the whole week it covers is older than this. Measured on this repository's own captured corpora, ninety days of history is about 2 MiB at the median session and under 31 MiB if every session for ninety days were as heavy as the heaviest session ever captured. The floor is one day rather than zero: to keep nothing, set agentDeck.stats.enabled to false."
},
"agentDeck.stats.idleFlushMs": {
"type": "integer",
"default": 3600000,
"minimum": 60000,
"maximum": 604800000,
"description": "How long a session may go without a change before its record is written anyway, in milliseconds. A record is normally written when the session ends; this covers the session that never does, because the window closed or the machine slept. If the session produces more work afterwards it is recomputed in full and written again as a second record, and reads keep the newest per session. Nothing already on disk is ever rewritten. This timer belongs to the statistics layer alone and never changes whether a session counts as live."
},
"agentDeck.pricing": {
"type": "object",
"default": {},
"description": "Your own prices per model id, in USD per million tokens, used to state a cost for sessions whose engine reports none. Each key is a model id exactly as the transcript writes it, and each value is an object with prompt, cacheRead, cacheWrite and output, all non-negative numbers. Example: {\"claude-sonnet-4-5\": {\"prompt\": 3, \"cacheRead\": 0.3, \"cacheWrite\": 3.75, \"output\": 15}}. Agent Deck ships no price table and never guesses one: a model with no entry here gets no cost figure, and an entry that does not match this shape is ignored and named on the Agent Deck output channel. Costs computed this way are labelled as estimated from your prices."
},
"agentDeck.canvas.autoFit": {
"type": "boolean",
"default": true,
"description": "Re-fit the session canvas to its content on every event that changes its geometry: a node selected (the drawer opens), the drawer expanded, collapsed or resized, an agent grafted, removed or parked, the panel or editor group resized, a session switch, an engine chip toggled, a switch back to the canvas, a label re-wrap that changes a node width. A manual pan or zoom persists only until the next such event. Token counters, liveness colour and the theme never re-fit. Turn this off and the canvas fits once on entry and never again on its own; Reset view and double-click on the empty field still fit on request. Changes take effect without a reload."
},
"agentDeck.telemetry.enabled": {
"type": "boolean",
"default": false,
"scope": "machine",
"description": "Accept Claude Code's own OpenTelemetry export (OTLP over HTTP, JSON only) on the hook listener: POST /v1/metrics, /v1/logs and /v1/traces on 127.0.0.1, at agentDeck.port. Off, those paths answer 403 and no body is parsed. Claude Code sends there only if its OpenTelemetry environment variables name that address, and Agent Deck never writes Claude Code's settings. Kept: a cost figure Claude Code estimates, and tool durations where the session states none, joined to sessions this window already shows. Identity attributes and prompt or response text are dropped where the body is parsed. Machine-scoped: every window on this machine reads the same value."
},
"agentDeck.followNewSessions": {
"type": "boolean",
"default": false,
"scope": "window",
"description": "Select a session that appears while the deck is open, so the deck moves to it. Off, the new session is added in its sort position and the current selection is left alone. This changes what the deck shows and never what is observed: a session is discovered, tailed and counted the same way either way. This setting also appears in the Tweaks tab of the Agent Deck sidebar, which reads and writes this same value."
},
"agentDeck.openDrawerOnEnter": {
"type": "boolean",
"default": false,
"scope": "window",
"description": "Open a session's tool-call drawer when the session is entered from the deck. Off, the drawer opens when a tool call is selected. The drawer holds the same calls either way. This setting also appears in the Tweaks tab of the Agent Deck sidebar, which reads and writes this same value."
},
"agentDeck.drawerExpandedByDefault": {
"type": "boolean",
"default": false,
"scope": "window",
"description": "Open the tool-call drawer at its expanded height rather than its collapsed one. The drawer can be expanded and collapsed in the panel at either value; this is the height it opens at. This setting also appears in the Tweaks tab of the Agent Deck sidebar, which reads and writes this same value."
},
"agentDeck.defaultOrdering": {
"type": "string",
"default": "live",
"scope": "window",
"enum": [
"live",
"recent",
"engine"
],
"description": "The order deck cards are placed in when the deck opens. live puts live sessions first, then idle, degraded, unsupported and ended. recent puts the most recently active first. engine groups the cards by the engine that produced them. An order chosen on the deck itself applies to that deck and leaves this value alone. This setting also appears in the Tweaks tab of the Agent Deck sidebar, which reads and writes this same value."
}
}
},
"viewsContainers": {
"activitybar": [
{
"id": "agentDeck",
"title": "Agent Deck",
"icon": "media/activity-icon.svg"
}
]
},
"views": {
"agentDeck": [
{
"type": "webview",
"id": "agentDeck.sidebar",
"name": "Agent Deck"
}
]
}
},
"scripts": {
"build": "node esbuild.config.mjs",
"capture:states": "node scripts/capture-states.mjs",
"lint": "eslint . && node scripts/forbidden-words.mjs",
"package": "vsce package --no-dependencies --out dist/agent-deck.vsix",
"test": "vitest run",
"theater": "node esbuild.config.mjs --theater",
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.webview.json",
"vscode:prepublish": "node esbuild.config.mjs --production"
},
"devDependencies": {
"@eslint/js": "^9.0.0",
"@types/node": "^24.0.0",
"@types/vscode": "^1.75.0",
"@vscode/vsce": "3.9.2",
"esbuild": "^0.25.0",
"esbuild-svelte": "^0.9.5",
"eslint": "^9.0.0",
"jsdom": "^30.0.1",
"svelte": "^5.56.9",
"typescript": "^5.6.0",
"typescript-eslint": "^8.0.0",
"vitest": "^3.0.0"
},
"dependencies": {
"chokidar": "^5.0.0"
},
"icon": "media/icon.png",
"galleryBanner": {
"color": "#13131f",
"theme": "dark"
}
}