@slycode/slycode 0.1.14 → 0.1.15
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.
- package/dist/bridge/session-manager.js +1 -8
- package/dist/bridge/session-manager.js.map +1 -1
- package/dist/store/skills/context-priming/references/area-index.md +121 -68
- package/{templates/store/skills/context-priming/references → dist/store/skills/context-priming}/references/areas/feature-guide.md +44 -18
- package/dist/store/skills/context-priming/references/areas/messaging.md +108 -34
- package/dist/store/skills/context-priming/references/areas/scripts-deployment.md +61 -16
- package/dist/store/skills/context-priming/references/areas/skills.md +99 -38
- package/{templates/updates/skills/context-priming/references → dist/store/skills/context-priming}/references/areas/terminal-actions.md +1 -1
- package/dist/store/skills/context-priming/references/areas/terminal-bridge.md +74 -42
- package/dist/store/skills/context-priming/references/areas/web-frontend.md +259 -74
- package/dist/web/.next/BUILD_ID +1 -1
- package/dist/web/.next/build-manifest.json +2 -2
- package/dist/web/.next/server/app/_global-error.html +2 -2
- package/dist/web/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/.next/server/app/_not-found.html +1 -1
- package/dist/web/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/.next/server/pages/404.html +1 -1
- package/dist/web/.next/server/pages/500.html +2 -2
- package/lib/cli/sync.d.ts +7 -0
- package/lib/cli/sync.d.ts.map +1 -1
- package/lib/cli/sync.js +32 -0
- package/lib/cli/sync.js.map +1 -1
- package/lib/cli/update.d.ts.map +1 -1
- package/lib/cli/update.js +9 -0
- package/lib/cli/update.js.map +1 -1
- package/package.json +1 -1
- package/templates/kanban-seed.json +1 -1
- package/templates/store/skills/context-priming/references/area-index.md +121 -68
- package/templates/{updates/skills/context-priming/references → store/skills/context-priming}/references/areas/feature-guide.md +44 -18
- package/templates/store/skills/context-priming/references/areas/messaging.md +108 -34
- package/templates/store/skills/context-priming/references/areas/scripts-deployment.md +61 -16
- package/templates/store/skills/context-priming/references/areas/skills.md +99 -38
- package/{dist/store/skills/context-priming/references → templates/store/skills/context-priming}/references/areas/terminal-actions.md +1 -1
- package/templates/store/skills/context-priming/references/areas/terminal-bridge.md +74 -42
- package/templates/store/skills/context-priming/references/areas/web-frontend.md +259 -74
- package/templates/updates/skills/context-priming/references/area-index.md +121 -68
- package/{dist/store/skills/context-priming/references → templates/updates/skills/context-priming}/references/areas/feature-guide.md +44 -18
- package/templates/updates/skills/context-priming/references/areas/messaging.md +108 -34
- package/templates/updates/skills/context-priming/references/areas/scripts-deployment.md +61 -16
- package/templates/updates/skills/context-priming/references/areas/skills.md +99 -38
- package/templates/{store/skills/context-priming/references → updates/skills/context-priming}/references/areas/terminal-actions.md +1 -1
- package/templates/updates/skills/context-priming/references/areas/terminal-bridge.md +74 -42
- package/templates/updates/skills/context-priming/references/areas/web-frontend.md +259 -74
- package/dist/store/skills/context-priming/references/areas/claude-actions.md +0 -120
- package/dist/store/skills/context-priming/references/references/area-index.md +0 -152
- package/dist/store/skills/context-priming/references/references/areas/messaging.md +0 -251
- package/dist/store/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
- package/dist/store/skills/context-priming/references/references/areas/skills.md +0 -196
- package/dist/store/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
- package/dist/store/skills/context-priming/references/references/areas/web-frontend.md +0 -437
- package/dist/store/skills/context-priming/references/references/maintenance.md +0 -128
- package/templates/store/skills/context-priming/references/areas/claude-actions.md +0 -120
- package/templates/store/skills/context-priming/references/references/area-index.md +0 -152
- package/templates/store/skills/context-priming/references/references/areas/messaging.md +0 -251
- package/templates/store/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
- package/templates/store/skills/context-priming/references/references/areas/skills.md +0 -196
- package/templates/store/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
- package/templates/store/skills/context-priming/references/references/areas/web-frontend.md +0 -437
- package/templates/store/skills/context-priming/references/references/maintenance.md +0 -128
- package/templates/updates/skills/context-priming/references/areas/claude-actions.md +0 -120
- package/templates/updates/skills/context-priming/references/references/area-index.md +0 -152
- package/templates/updates/skills/context-priming/references/references/areas/messaging.md +0 -251
- package/templates/updates/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
- package/templates/updates/skills/context-priming/references/references/areas/skills.md +0 -196
- package/templates/updates/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
- package/templates/updates/skills/context-priming/references/references/areas/web-frontend.md +0 -437
- package/templates/updates/skills/context-priming/references/references/maintenance.md +0 -128
- /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → sAL_sqPSOaOIrKiwdPzL2}/_buildManifest.js +0 -0
- /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → sAL_sqPSOaOIrKiwdPzL2}/_clientMiddlewareManifest.json +0 -0
- /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → sAL_sqPSOaOIrKiwdPzL2}/_ssgManifest.js +0 -0
|
@@ -1,56 +1,63 @@
|
|
|
1
1
|
# Terminal Bridge
|
|
2
2
|
|
|
3
|
-
Updated: 2026-
|
|
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,
|
|
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` -
|
|
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
|
|
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.
|
|
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
|
-
- `
|
|
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,
|
|
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
|
-
|
|
70
|
-
to: string; // New state
|
|
77
|
+
became: 'active' | 'inactive';
|
|
71
78
|
lastOutputAt: string;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
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
|
-
-
|
|
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
|
-
###
|
|
182
|
-
- `supportsSessionDetection()` checks `provider.resume.detectSession`
|
|
183
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|