@slycode/slycode 0.1.14 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/bridge/session-manager.js +1 -8
  2. package/dist/bridge/session-manager.js.map +1 -1
  3. package/dist/store/skills/context-priming/references/area-index.md +121 -68
  4. package/{templates/store/skills/context-priming/references → dist/store/skills/context-priming}/references/areas/feature-guide.md +44 -18
  5. package/dist/store/skills/context-priming/references/areas/messaging.md +108 -34
  6. package/dist/store/skills/context-priming/references/areas/scripts-deployment.md +61 -16
  7. package/dist/store/skills/context-priming/references/areas/skills.md +99 -38
  8. package/{templates/updates/skills/context-priming/references → dist/store/skills/context-priming}/references/areas/terminal-actions.md +1 -1
  9. package/dist/store/skills/context-priming/references/areas/terminal-bridge.md +74 -42
  10. package/dist/store/skills/context-priming/references/areas/web-frontend.md +259 -74
  11. package/dist/web/.next/BUILD_ID +1 -1
  12. package/dist/web/.next/build-manifest.json +2 -2
  13. package/dist/web/.next/server/app/_global-error.html +2 -2
  14. package/dist/web/.next/server/app/_global-error.rsc +1 -1
  15. package/dist/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/dist/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/dist/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/dist/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/dist/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/dist/web/.next/server/app/_not-found.html +1 -1
  21. package/dist/web/.next/server/app/_not-found.rsc +1 -1
  22. package/dist/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  23. package/dist/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/dist/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  25. package/dist/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/dist/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/dist/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  28. package/dist/web/.next/server/pages/404.html +1 -1
  29. package/dist/web/.next/server/pages/500.html +2 -2
  30. package/lib/cli/sync.d.ts +7 -0
  31. package/lib/cli/sync.d.ts.map +1 -1
  32. package/lib/cli/sync.js +32 -0
  33. package/lib/cli/sync.js.map +1 -1
  34. package/lib/cli/update.d.ts.map +1 -1
  35. package/lib/cli/update.js +9 -0
  36. package/lib/cli/update.js.map +1 -1
  37. package/package.json +1 -1
  38. package/templates/kanban-seed.json +1 -1
  39. package/templates/store/skills/context-priming/references/area-index.md +121 -68
  40. package/templates/{updates/skills/context-priming/references → store/skills/context-priming}/references/areas/feature-guide.md +44 -18
  41. package/templates/store/skills/context-priming/references/areas/messaging.md +108 -34
  42. package/templates/store/skills/context-priming/references/areas/scripts-deployment.md +61 -16
  43. package/templates/store/skills/context-priming/references/areas/skills.md +99 -38
  44. package/{dist/store/skills/context-priming/references → templates/store/skills/context-priming}/references/areas/terminal-actions.md +1 -1
  45. package/templates/store/skills/context-priming/references/areas/terminal-bridge.md +74 -42
  46. package/templates/store/skills/context-priming/references/areas/web-frontend.md +259 -74
  47. package/templates/updates/skills/context-priming/references/area-index.md +121 -68
  48. package/{dist/store/skills/context-priming/references → templates/updates/skills/context-priming}/references/areas/feature-guide.md +44 -18
  49. package/templates/updates/skills/context-priming/references/areas/messaging.md +108 -34
  50. package/templates/updates/skills/context-priming/references/areas/scripts-deployment.md +61 -16
  51. package/templates/updates/skills/context-priming/references/areas/skills.md +99 -38
  52. package/templates/{store/skills/context-priming/references → updates/skills/context-priming}/references/areas/terminal-actions.md +1 -1
  53. package/templates/updates/skills/context-priming/references/areas/terminal-bridge.md +74 -42
  54. package/templates/updates/skills/context-priming/references/areas/web-frontend.md +259 -74
  55. package/dist/store/skills/context-priming/references/areas/claude-actions.md +0 -120
  56. package/dist/store/skills/context-priming/references/references/area-index.md +0 -152
  57. package/dist/store/skills/context-priming/references/references/areas/messaging.md +0 -251
  58. package/dist/store/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
  59. package/dist/store/skills/context-priming/references/references/areas/skills.md +0 -196
  60. package/dist/store/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
  61. package/dist/store/skills/context-priming/references/references/areas/web-frontend.md +0 -437
  62. package/dist/store/skills/context-priming/references/references/maintenance.md +0 -128
  63. package/templates/store/skills/context-priming/references/areas/claude-actions.md +0 -120
  64. package/templates/store/skills/context-priming/references/references/area-index.md +0 -152
  65. package/templates/store/skills/context-priming/references/references/areas/messaging.md +0 -251
  66. package/templates/store/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
  67. package/templates/store/skills/context-priming/references/references/areas/skills.md +0 -196
  68. package/templates/store/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
  69. package/templates/store/skills/context-priming/references/references/areas/web-frontend.md +0 -437
  70. package/templates/store/skills/context-priming/references/references/maintenance.md +0 -128
  71. package/templates/updates/skills/context-priming/references/areas/claude-actions.md +0 -120
  72. package/templates/updates/skills/context-priming/references/references/area-index.md +0 -152
  73. package/templates/updates/skills/context-priming/references/references/areas/messaging.md +0 -251
  74. package/templates/updates/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
  75. package/templates/updates/skills/context-priming/references/references/areas/skills.md +0 -196
  76. package/templates/updates/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
  77. package/templates/updates/skills/context-priming/references/references/areas/web-frontend.md +0 -437
  78. package/templates/updates/skills/context-priming/references/references/maintenance.md +0 -128
  79. /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → 0m9O2FYuB-xI-Vb-Y4k-C}/_buildManifest.js +0 -0
  80. /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → 0m9O2FYuB-xI-Vb-Y4k-C}/_clientMiddlewareManifest.json +0 -0
  81. /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → 0m9O2FYuB-xI-Vb-Y4k-C}/_ssgManifest.js +0 -0
@@ -1,56 +1,63 @@
1
1
  # Terminal Bridge
2
2
 
3
- Updated: 2026-02-14
3
+ Updated: 2026-03-14
4
4
 
5
5
  ## Overview
6
6
 
7
- PTY bridge server manages AI coding sessions across multiple providers (Claude, Gemini, Codex). Express server spawns/manages PTY processes, streams output via SSE. Provider-agnostic command building via data-driven config (`providers.json`). Includes security hardening (command whitelist, CWD validation, localhost binding), activity tracking with transition logging for debugging, atomic state persistence, bulk session management, and graceful idle timeout handling. React components connect through Next.js API proxy.
7
+ PTY bridge server manages AI coding sessions across multiple providers (Claude, Gemini, Codex). Express server spawns/manages PTY processes, streams output via SSE. Provider-agnostic command building via data-driven config (`providers.json`). Includes security hardening (command whitelist, CWD validation, localhost binding), activity tracking with transition logging for debugging, atomic state persistence, bulk session management, graceful idle timeout handling, and image delivery to PTY sessions. React components connect through Next.js API proxy.
8
8
 
9
9
  ## Key Files
10
10
 
11
11
  ### Bridge Server (Node/Express)
12
12
  - `bridge/src/index.ts` - Express server entry, routes setup, localhost binding
13
- - `bridge/src/session-manager.ts` - Session lifecycle, PTY spawning, provider resolution, activity tracking, atomic state saving
14
- - `bridge/src/provider-utils.ts` - Provider config loading, command building, session detection helpers
15
- - `bridge/src/pty-handler.ts` - PTY process wrapper, output buffering
16
- - `bridge/src/api.ts` - REST endpoints for session CRUD, /stats, stop-all, activity-log
13
+ - `bridge/src/session-manager.ts` - Session lifecycle, PTY spawning, provider resolution, activity tracking, atomic state saving, deferred prompt delivery (Windows)
14
+ - `bridge/src/provider-utils.ts` - Provider config loading, command building, session detection helpers, instruction file check/create
15
+ - `bridge/src/pty-handler.ts` - PTY process wrapper, output buffering, Windows .cmd extension resolution
16
+ - `bridge/src/api.ts` - REST endpoints for session CRUD, /stats, stop-all, activity-log, image upload, instruction file check
17
+ - `bridge/src/screenshot-utils.ts` - Screenshot saving, retention (10-file cap), .gitignore management
17
18
  - `bridge/src/websocket.ts` - WebSocket upgrade handling (legacy, SSE preferred)
18
- - `bridge/src/claude-utils.ts` - Claude session ID detection from ~/.claude/projects/
19
- - `bridge/src/types.ts` - Session, BridgeConfig, BridgeStats, ActivityTransition, provider interfaces
19
+ - `bridge/src/claude-utils.ts` - Provider-agnostic session ID detection (Claude/Codex/Gemini) with unified dispatchers
20
+ - `bridge/src/types.ts` - Session (incl. pendingPrompt, pendingPromptTimer), BridgeConfig, BridgeStats, ActivityTransition, provider interfaces
20
21
 
21
22
  ### Configuration
22
23
  - `bridge/bridge-config.json` - Runtime config: allowedCommands (claude, codex, gemini, bash), CORS origins
23
24
  - `data/providers.json` - Provider registry: CLI commands, permission flags, resume types, prompt handling, stage defaults
24
25
  - `documentation/terminal-classes.json` - Terminal class definitions for command visibility
25
- - `data/commands.json` - Unified command configuration with visibility per class
26
-
27
26
  ### Web Components
28
- - `web/src/components/Terminal.tsx` - xterm.js terminal, SSE via ConnectionManager
29
- - `web/src/components/ClaudeTerminalPanel.tsx` - Terminal panel with startupCommands/activeCommands
27
+ - `web/src/components/Terminal.tsx` - xterm.js terminal, SSE via ConnectionManager, resize broadcast with echo-loop suppression, paste interception via `attachCustomKeyEventHandler`
28
+ - `web/src/components/ClaudeTerminalPanel.tsx` - Terminal panel with startupActions/activeActions
30
29
  - `web/src/components/GlobalClaudePanel.tsx` - Floating panel for project-wide session
31
30
  - `web/src/app/api/bridge/[...path]/route.ts` - Next.js proxy to bridge server
32
31
 
33
32
  ## Key Functions
34
33
 
35
- - `SessionManager.createSession()` - Resolves provider, builds command via `buildProviderCommand()`, validates CWD, spawns PTY
34
+ - `SessionManager.getSessionCwd()` - Returns CWD for a session (running or persisted), used by image upload endpoint
35
+ - `SessionManager.createSession()` - Resolves provider, builds command via `buildProviderCommand()`, validates CWD, spawns PTY. Uses `creating` placeholder as mutex to prevent concurrent creation (returns 202 for duplicate requests).
36
36
  - `SessionManager.resolveSessionName()` - Checks both new (with provider) and legacy session name formats
37
- - `SessionManager.stopSession()` - Graceful SIGINT, waits for exit
37
+ - `SessionManager.stopSession()` - Graceful SIGINT, waits for exit, removes session from in-memory map (frees slot; data preserved in persistedState for resume)
38
38
  - `SessionManager.stopAllSessions()` - Bulk stop all running/detached sessions, returns count
39
39
  - `SessionManager.getStats()` - Returns BridgeStats with activity info
40
+ - `SessionManager.getGroupStatus(group)` - Returns status of all sessions in a group
41
+ - `SessionManager.relinkSession(name)` - Re-detect session ID from most recent provider session file
40
42
  - `SessionManager.checkIdleSessions()` - Idle timeout with grace period after disconnect
41
43
  - `buildProviderCommand()` - Assembles { command, args } from provider config, handles flag vs subcommand resume
42
44
  - `getProvider()` - Loads provider config by ID from providers.json (30s cache)
43
- - `supportsSessionDetection()` - Check if provider supports GUID-based session detection
45
+ - `checkInstructionFile(providerId, cwd)` - Checks if provider's instruction file exists. Priority scan: primary file → alt file → sibling copy source → no action needed
46
+ - `ensureInstructionFile(providerId, cwd)` - Creates missing instruction file by copying from sibling (never throws, logs warnings)
47
+ - `supportsSessionDetection()` - Check if provider supports session detection (all three now do)
48
+ - `getProviderSessionDir()` - Provider-agnostic session directory resolver
49
+ - `listProviderSessionFiles()` - Provider-agnostic session file listing
50
+ - `detectNewProviderSessionId()` - Provider-agnostic new session detection dispatcher
51
+ - `getMostRecentProviderSessionId()` - Find most recent session file (used by relink)
44
52
  - `Terminal.connectSSE()` - Via ConnectionManager for auto-reconnection
45
53
 
46
54
  ## Data Models
47
55
 
48
56
  ```typescript
49
57
  SessionInfo {
50
- name, status (running|stopped|detached), pid, connectedClients,
51
- hasHistory, claudeSessionId, lastOutputAt,
52
- provider?, skipPermissions?,
53
- lastOutputSnippet?, lastOutputRawHex?, lastOutputDataLength?
58
+ name, group, status (running|stopped|detached|creating), pid, connectedClients,
59
+ hasHistory, resumed, lastActive, lastOutputAt?,
60
+ claudeSessionId?, provider?, skipPermissions?
54
61
  }
55
62
 
56
63
  BridgeStats {
@@ -61,20 +68,19 @@ BridgeStats {
61
68
  }
62
69
 
63
70
  SessionActivity {
64
- name, status, lastOutputAt, isActive
71
+ name, status, lastOutputAt, isActive,
72
+ activityStartedAt?, lastOutputSnippet?
65
73
  }
66
74
 
67
75
  ActivityTransition {
68
76
  timestamp: string;
69
- from: string; // Previous state
70
- to: string; // New state
77
+ became: 'active' | 'inactive';
71
78
  lastOutputAt: string;
72
- outputAge: number;
73
- trigger?: { // Debug info for phantom blips
74
- snippet: string;
75
- hex: string;
76
- dataLength: number;
77
- }
79
+ activityStartedAt: string;
80
+ outputAgeMs: number;
81
+ triggerSnippet: string;
82
+ triggerRawHex: string;
83
+ triggerDataLength: number;
78
84
  }
79
85
 
80
86
  BridgeConfig {
@@ -91,9 +97,11 @@ CreateSessionRequest {
91
97
  provider?: string; // Provider id from providers.json
92
98
  skipPermissions?: boolean; // Whether to add permission-skip flag
93
99
  command?: string; // Legacy: direct command (backward compat)
94
- cwd: string;
95
- prompt?: string;
100
+ cwd?: string;
96
101
  fresh?: boolean;
102
+ idleTimeout?: number;
103
+ prompt?: string;
104
+ createInstructionFile?: boolean; // Opt-in: copy sibling instruction file if missing
97
105
  }
98
106
 
99
107
  PersistedSession {
@@ -107,7 +115,9 @@ ProviderConfig {
107
115
  id, displayName, command, install,
108
116
  permissions: { flag, label, default },
109
117
  resume: { supported, type ('flag'|'subcommand'), flag?, subcommand?, lastFlag?, detectSession, sessionDir? },
110
- prompt: { type ('positional'|'flag'), interactive?, nonInteractive? }
118
+ prompt: { type ('positional'|'flag'), interactive?, nonInteractive? },
119
+ instructionFile?: string, // e.g. "CLAUDE.md" for Claude, "AGENTS.md" for Codex
120
+ altInstructionFile?: string // e.g. "CODEX.md" for Codex (provider-specific alt)
111
121
  }
112
122
 
113
123
  ProvidersData {
@@ -123,7 +133,7 @@ ProvidersData {
123
133
  ## Security Hardening
124
134
 
125
135
  - **Localhost binding**: HOST defaults to `localhost` (not `0.0.0.0`)
126
- - **Command whitelist**: Only commands in `bridge-config.json` allowedCommands can be spawned (claude, codex, gemini, bash)
136
+ - **Command whitelist**: Only commands in `bridge-config.json` allowedCommands can be spawned (claude, codex, gemini, bash — all four in both config and hardcoded defaults)
127
137
  - **Provider validation**: Provider ID must exist in providers.json; resolved command must be in allowedCommands
128
138
  - **CWD validation**: Requires absolute path, verifies exists and is accessible before spawning PTY
129
139
  - **CORS origins**: Configured in bridge-config.json, not wide-open
@@ -146,9 +156,12 @@ ProvidersData {
146
156
 
147
157
  ## Race Condition Handling
148
158
 
159
+ - **Creation mutex**: `creating` status placeholder prevents concurrent createSession() for same name. API returns 202 for idempotent duplicate requests. Placeholder cleaned up on failure.
160
+ - **GUID detection cancellation**: `guidDetectionCancelled` flag on Session prevents detection from overwriting state after session stops/exits.
149
161
  - **Disconnect grace period**: 5 seconds before session eligible for idle timeout
150
162
  - **Status transitions**: Protected against reconnect during disconnect
151
163
  - **SSE cleanup**: Proper client tracking on connection/disconnection
164
+ - **SSE heartbeat**: 15-second comment heartbeats (`: heartbeat\n\n`) keep connections alive through proxies (Tailscale, Next.js). Started per-client on SSE connect, cleared on disconnect.
152
165
 
153
166
  ## Terminal Classes
154
167
 
@@ -162,15 +175,15 @@ Controls which commands appear in each context:
162
175
 
163
176
  ### Supported Providers
164
177
  - **Claude Code** (`claude`) — Positional prompts, `--resume <GUID>` with auto-detection, `--dangerously-skip-permissions`
165
- - **Codex CLI** (`codex`) — Positional prompts, `codex resume --last` (subcommand-style), `--yolo`
166
- - **Gemini CLI** (`gemini`) — Flag-based prompts (`-i`/`-p`), `--resume` (no GUID), `--yolo`
178
+ - **Codex CLI** (`codex`) — Positional prompts, `codex resume --last [PROMPT]` (subcommand-style), `--yolo`, session detection via rollout files
179
+ - **Gemini CLI** (`gemini`) — Flag-based prompts (`-i`/`-p`), `--resume` (no GUID), `--yolo`, session detection via chat JSON files
167
180
 
168
181
  ### Command Building (`buildProviderCommand`)
169
182
  - Returns `{ command, args }` tuple (command can change for Codex resume: `codex resume`)
170
183
  - Permission flag added if `skipPermissions: true`
171
184
  - Resume: flag-type appends `--resume [GUID]`; subcommand-type prepends `resume [GUID|--last]`
172
185
  - Prompt: positional appends as final arg; flag-type uses `-i <prompt>` (interactive)
173
- - No prompt on resume (user types into running session instead)
186
+ - Prompt works alongside resume: Claude accepts positional after `--resume`, Codex accepts positional after `resume --last`
174
187
 
175
188
  ### Session Name Format
176
189
  - **New format**: `{projectId}:{provider}:card:{cardId}` or `{projectId}:{provider}:global`
@@ -178,11 +191,14 @@ Controls which commands appear in each context:
178
191
  - `resolveSessionName()` checks new format first, falls back to legacy via `toLegacySessionName()`
179
192
  - Old sessions without provider field default to `provider: "claude"`
180
193
 
181
- ### GUID Detection (Claude only)
182
- - `supportsSessionDetection()` checks `provider.resume.detectSession`
183
- - Watches `~/.claude/projects/` for new `.jsonl` files after spawn
194
+ ### Session Detection (All Providers)
195
+ - `supportsSessionDetection()` checks `provider.resume.detectSession` — all three providers have `detectSession: true`
196
+ - Provider-agnostic dispatchers route to provider-specific logic:
197
+ - **Claude**: Watches `~/.claude/projects/<cwd>/` for new `.jsonl` files, extracts GUID from filename
198
+ - **Codex**: Watches `~/.codex/sessions/YYYY/MM/DD/` for new rollout files, extracts UUID from filename
199
+ - **Gemini**: Watches `~/.gemini/tmp/<SHA256(cwd)>/chats/` for new session JSON files
184
200
  - `getClaimedGuids()` excludes GUIDs already used by other sessions
185
- - Gemini/Codex use `--resume --last` (no GUID tracking)
201
+ - Detection timeout: 60 seconds (Gemini CLI takes ~30s to create session files)
186
202
 
187
203
  ### Stage-Based Defaults
188
204
  - `providers.json` `defaults.stages` maps each kanban stage → `{ provider, skipPermissions }`
@@ -196,24 +212,37 @@ Controls which commands appear in each context:
196
212
  - Claude prompts passed as positional arg, NOT `-p` flag (that's print mode)
197
213
  - Resume behavior is provider-specific: flag vs subcommand, GUID vs latest
198
214
  - SSE streams through `/api/bridge/sessions/{name}/stream` proxy
199
- - Bridge runs on port 3456 (localhost), proxied through Next.js
215
+ - Bridge port from BRIDGE_PORT env var (default 7592 prod, 3004 dev), localhost binding, proxied through Next.js
216
+ - Stopped sessions removed from in-memory `sessions` map (frees slot); session data preserved in `persistedState` for future resume. `getSessionInfo()` falls back to persistedState when session not in map.
200
217
  - Idle timeout: 4 hours default, checked every 60 seconds
201
- - Atomic state saves prevent data corruption
218
+ - Atomic state saves with unique temp file names (`.tmp.${pid}.${Date.now()}`) prevent race conditions
202
219
  - Provider config cached 30s in provider-utils.ts
220
+ - Bracketed paste mode (`\x1b[200~...\x1b[201~`) for multi-line prompt input, 150ms delay before Enter
221
+ - lastActive timestamp preserved on resume (not overwritten with current time)
222
+ - Image delivery: saves to `screenshots/` in session CWD, timestamped filenames, 10-file retention, auto-.gitignore
223
+ - Screenshot reference injected as `[Screenshot: screenshots/<filename>]` text into PTY (not auto-submitted)
224
+ - Instruction file fallback: `checkInstructionFile()` scans for sibling instruction files (CLAUDE.md, AGENTS.md, CODEX.md, GEMINI.md) in priority order. `ensureInstructionFile()` copies when requested. Creation is opt-in only (`createInstructionFile: true` in CreateSessionRequest).
225
+ - Resize broadcast: PTY resize events broadcast via SSE to all connected tabs. Terminal.tsx guards resize POSTs (only visible tabs), uses `suppressResizePost` flag to prevent ResizeObserver echo loop when adapting to another tab's resize. Skips resize on reconnect.
226
+ - **Windows ConPTY support**: On Windows, CLI tools are installed as `.cmd` batch wrappers — `pty-handler.ts` auto-appends `.cmd` extension. cmd.exe mangles multi-line CLI args (newlines become command separators), so prompts are deferred: stripped from spawn args and delivered via bracketed paste after provider output settles (1.5s quiet, 30s max timeout). ConPTY silently truncates PTY writes >~4KB, so large prompts are chunked (1024-byte chunks with 500ms delay, surrogate-pair-safe boundaries). Session tracks `pendingPrompt` and `pendingPromptTimer` for debounced delivery.
203
227
 
204
228
  ## API Endpoints
205
229
 
206
230
  - `GET /sessions` - List all sessions
207
231
  - `GET /sessions/:name` - Get session info
208
- - `POST /sessions` - Create session (validates command + CWD)
232
+ - `POST /sessions` - Create session (validates command + CWD, returns 202 if already creating)
209
233
  - `DELETE /sessions/:name` - Stop or delete session
210
234
  - `POST /sessions/:name/input` - Send input to PTY
211
235
  - `POST /sessions/:name/resize` - Resize terminal
236
+ - `POST /sessions/:name/image` - Upload image to session's screenshots/ dir (multipart, 10MB limit), returns filename
237
+ - `POST /sessions/:name/action` - Structured actions: compact, clear, interrupt
238
+ - `POST /sessions/:name/relink` - Re-detect session ID from most recent provider session file
212
239
  - `POST /sessions/:name/stop` - Send Escape key to active session (soft stop)
213
240
  - `GET /sessions/:name/stream` - SSE output stream
241
+ - `GET /groups/:group/status` - Group-level session status aggregation
214
242
  - `POST /sessions/stop-all` - Bulk stop all running sessions
215
243
  - `GET /stats` - BridgeStats with activity info
216
244
  - `GET /activity-log/:name` - Activity transition history for debugging
245
+ - `GET /check-instruction-file?provider=X&cwd=Y` - Check if instruction file exists, returns { needed, targetFile?, copySource? }
217
246
 
218
247
  ## When to Expand
219
248
 
@@ -228,5 +257,8 @@ Controls which commands appear in each context:
228
257
  - Connection problems → api/bridge proxy, connection-manager.ts
229
258
  - Idle timeout issues → session-manager.ts checkIdleSessions()
230
259
  - Bulk operations → stopAllSessions(), /sessions/stop-all
260
+ - Image delivery → screenshot-utils.ts (saving/retention), api.ts (image endpoint), ClaudeTerminalPanel.tsx (paste handling)
231
261
  - State corruption → session-manager.ts loadState/saveState
232
262
  - Session name resolution → session-manager.ts resolveSessionName(), toLegacySessionName()
263
+ - Instruction file issues → provider-utils.ts checkInstructionFile/ensureInstructionFile, api.ts check-instruction-file endpoint
264
+ - Terminal resize sync → Terminal.tsx sendResize(), SSE resize event handling