commandmate 0.3.2 → 0.3.3
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/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +13 -13
- package/.next/app-path-routes-manifest.json +1 -1
- package/.next/build-manifest.json +4 -4
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/1.pack +0 -0
- package/.next/cache/webpack/client-production/2.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/ollama/models/route.js +1 -0
- package/.next/server/app/api/ollama/models/route.js.nft.json +1 -0
- package/.next/server/app/api/ollama/models.body +1 -0
- package/.next/server/app/api/ollama/models.meta +1 -0
- package/.next/server/app/api/repositories/route.js +3 -3
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +4 -4
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +7 -6
- package/.next/server/chunks/2314.js +1 -1
- package/.next/server/chunks/4559.js +1 -1
- package/.next/server/chunks/539.js +10 -10
- package/.next/server/chunks/5853.js +1 -1
- package/.next/server/chunks/6228.js +1 -1
- package/.next/server/chunks/7425.js +59 -39
- package/.next/server/chunks/7566.js +1 -1
- package/.next/server/chunks/8693.js +1 -1
- package/.next/server/chunks/9446.js +1 -0
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/8091-274bc0716106e7fc.js +1 -0
- package/.next/static/chunks/app/page-060057e02b841125.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-78580947c201d698.js +1 -0
- package/.next/static/chunks/{main-db79434ee4a6c931.js → main-2feda12a4d321111.js} +1 -1
- package/.next/static/css/{bd6065b03ddb3efd.css → e85de230ef5ddc40.css} +1 -1
- package/.next/trace +5 -5
- package/.next/types/app/api/ollama/models/route.ts +343 -0
- package/README.md +74 -76
- package/dist/server/src/config/schedule-config.js +7 -1
- package/dist/server/src/lib/auto-yes-manager.js +2 -2
- package/dist/server/src/lib/claude-executor.js +15 -4
- package/dist/server/src/lib/cli-patterns.js +73 -9
- package/dist/server/src/lib/cli-tools/gemini.js +81 -22
- package/dist/server/src/lib/cli-tools/manager.js +4 -2
- package/dist/server/src/lib/cli-tools/types.js +64 -2
- package/dist/server/src/lib/cli-tools/vibe-local.js +163 -0
- package/dist/server/src/lib/cmate-parser.js +25 -3
- package/dist/server/src/lib/db-migrations.js +50 -1
- package/dist/server/src/lib/db.js +51 -1
- package/dist/server/src/lib/prompt-detector.js +4 -3
- package/dist/server/src/lib/response-poller.js +22 -11
- package/dist/server/src/lib/schedule-manager.js +6 -2
- package/dist/server/src/lib/selected-agents-validator.js +99 -0
- package/dist/server/src/types/sidebar.js +9 -4
- package/package.json +1 -1
- package/.next/server/chunks/7536.js +0 -1
- package/.next/static/chunks/8091-925542bdfc843dce.js +0 -1
- package/.next/static/chunks/app/page-238b5a70d8c101e9.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-0c889ab3f30d5af7.js +0 -1
- /package/.next/static/{j8HFvzDZj7tHjAnhpXUno → O7EDFfAYQNe_HRbORxQAC}/_buildManifest.js +0 -0
- /package/.next/static/{j8HFvzDZj7tHjAnhpXUno → O7EDFfAYQNe_HRbORxQAC}/_ssgManifest.js +0 -0
|
@@ -32,6 +32,8 @@ exports.markPendingPromptsAsAnswered = markPendingPromptsAsAnswered;
|
|
|
32
32
|
exports.updateFavorite = updateFavorite;
|
|
33
33
|
exports.updateStatus = updateStatus;
|
|
34
34
|
exports.updateCliToolId = updateCliToolId;
|
|
35
|
+
exports.updateSelectedAgents = updateSelectedAgents;
|
|
36
|
+
exports.updateVibeLocalModel = updateVibeLocalModel;
|
|
35
37
|
exports.getMemosByWorktreeId = getMemosByWorktreeId;
|
|
36
38
|
exports.getMemoById = getMemoById;
|
|
37
39
|
exports.createMemo = createMemo;
|
|
@@ -44,6 +46,7 @@ exports.getWorktreeIdsByRepository = getWorktreeIdsByRepository;
|
|
|
44
46
|
exports.deleteRepositoryWorktrees = deleteRepositoryWorktrees;
|
|
45
47
|
exports.deleteWorktreesByIds = deleteWorktreesByIds;
|
|
46
48
|
const crypto_1 = require("crypto");
|
|
49
|
+
const selected_agents_validator_1 = require("../lib/selected-agents-validator");
|
|
47
50
|
function mapChatMessage(row) {
|
|
48
51
|
return {
|
|
49
52
|
id: row.id,
|
|
@@ -129,6 +132,16 @@ function initDatabase(db) {
|
|
|
129
132
|
* Get latest user message per CLI tool for multiple worktrees (batch query)
|
|
130
133
|
* Optimized to avoid N+1 query problem
|
|
131
134
|
*/
|
|
135
|
+
/**
|
|
136
|
+
* Get latest user message per CLI tool for multiple worktrees (batch query)
|
|
137
|
+
* Optimized to avoid N+1 query problem
|
|
138
|
+
*
|
|
139
|
+
* R4-001: SQL IN clause for cli_tool_id removed to eliminate SQLインジェクション risk.
|
|
140
|
+
* All cli_tool_id values are fetched; filtering happens at application layer.
|
|
141
|
+
* Tool count is at most 4-5, so the performance impact is negligible.
|
|
142
|
+
*
|
|
143
|
+
* R2-002: Return type changed to Partial<Record<CLIToolType, string>>
|
|
144
|
+
*/
|
|
132
145
|
function getLastMessagesByCliBatch(db, worktreeIds) {
|
|
133
146
|
if (worktreeIds.length === 0) {
|
|
134
147
|
return new Map();
|
|
@@ -149,7 +162,6 @@ function getLastMessagesByCliBatch(db, worktreeIds) {
|
|
|
149
162
|
FROM chat_messages
|
|
150
163
|
WHERE worktree_id IN (${placeholders})
|
|
151
164
|
AND role = 'user'
|
|
152
|
-
AND cli_tool_id IN ('claude', 'codex', 'gemini')
|
|
153
165
|
)
|
|
154
166
|
SELECT worktree_id, cli_tool_id, content
|
|
155
167
|
FROM ranked_messages
|
|
@@ -181,6 +193,7 @@ function getWorktrees(db, repositoryPath) {
|
|
|
181
193
|
w.id, w.name, w.path, w.repository_path, w.repository_name, w.description,
|
|
182
194
|
w.last_user_message, w.last_user_message_at, w.last_message_summary,
|
|
183
195
|
w.updated_at, w.favorite, w.status, w.link, w.cli_tool_id, w.last_viewed_at,
|
|
196
|
+
w.selected_agents, w.vibe_local_model,
|
|
184
197
|
(SELECT MAX(timestamp) FROM chat_messages
|
|
185
198
|
WHERE worktree_id = w.id AND role = 'assistant') as last_assistant_message_at
|
|
186
199
|
FROM worktrees w
|
|
@@ -216,6 +229,8 @@ function getWorktrees(db, repositoryPath) {
|
|
|
216
229
|
status: row.status || null,
|
|
217
230
|
link: row.link || undefined,
|
|
218
231
|
cliToolId: row.cli_tool_id ?? 'claude',
|
|
232
|
+
selectedAgents: (0, selected_agents_validator_1.parseSelectedAgents)(row.selected_agents),
|
|
233
|
+
vibeLocalModel: row.vibe_local_model ?? null,
|
|
219
234
|
};
|
|
220
235
|
});
|
|
221
236
|
}
|
|
@@ -250,6 +265,7 @@ function getWorktreeById(db, id) {
|
|
|
250
265
|
w.id, w.name, w.path, w.repository_path, w.repository_name, w.description,
|
|
251
266
|
w.last_user_message, w.last_user_message_at, w.last_message_summary,
|
|
252
267
|
w.updated_at, w.favorite, w.status, w.link, w.cli_tool_id, w.last_viewed_at,
|
|
268
|
+
w.selected_agents, w.vibe_local_model,
|
|
253
269
|
(SELECT MAX(timestamp) FROM chat_messages
|
|
254
270
|
WHERE worktree_id = w.id AND role = 'assistant') as last_assistant_message_at
|
|
255
271
|
FROM worktrees w
|
|
@@ -276,6 +292,8 @@ function getWorktreeById(db, id) {
|
|
|
276
292
|
status: row.status || null,
|
|
277
293
|
link: row.link || undefined,
|
|
278
294
|
cliToolId: row.cli_tool_id ?? 'claude',
|
|
295
|
+
selectedAgents: (0, selected_agents_validator_1.parseSelectedAgents)(row.selected_agents),
|
|
296
|
+
vibeLocalModel: row.vibe_local_model ?? null,
|
|
279
297
|
};
|
|
280
298
|
}
|
|
281
299
|
/**
|
|
@@ -678,6 +696,38 @@ function updateCliToolId(db, id, cliToolId) {
|
|
|
678
696
|
`);
|
|
679
697
|
stmt.run(cliToolId, id);
|
|
680
698
|
}
|
|
699
|
+
/**
|
|
700
|
+
* Update selected_agents for a worktree
|
|
701
|
+
* Issue #368: Persists the user's choice of 2 display agents
|
|
702
|
+
*
|
|
703
|
+
* @param db - Database instance
|
|
704
|
+
* @param id - Worktree ID
|
|
705
|
+
* @param selectedAgents - Tuple of 2 CLIToolType values
|
|
706
|
+
*/
|
|
707
|
+
function updateSelectedAgents(db, id, selectedAgents) {
|
|
708
|
+
const stmt = db.prepare(`
|
|
709
|
+
UPDATE worktrees
|
|
710
|
+
SET selected_agents = ?
|
|
711
|
+
WHERE id = ?
|
|
712
|
+
`);
|
|
713
|
+
stmt.run(JSON.stringify(selectedAgents), id);
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* Update vibe_local_model for a worktree
|
|
717
|
+
* Issue #368: Persists the user's Ollama model selection for vibe-local
|
|
718
|
+
*
|
|
719
|
+
* @param db - Database instance
|
|
720
|
+
* @param id - Worktree ID
|
|
721
|
+
* @param model - Model name or null for default
|
|
722
|
+
*/
|
|
723
|
+
function updateVibeLocalModel(db, id, model) {
|
|
724
|
+
const stmt = db.prepare(`
|
|
725
|
+
UPDATE worktrees
|
|
726
|
+
SET vibe_local_model = ?
|
|
727
|
+
WHERE id = ?
|
|
728
|
+
`);
|
|
729
|
+
stmt.run(model, id);
|
|
730
|
+
}
|
|
681
731
|
/**
|
|
682
732
|
* Map database row to WorktreeMemo model
|
|
683
733
|
*/
|
|
@@ -166,11 +166,12 @@ const TEXT_INPUT_PATTERNS = [
|
|
|
166
166
|
/differently/i,
|
|
167
167
|
];
|
|
168
168
|
/**
|
|
169
|
-
* Pattern for ❯ (U+276F) indicator lines used by
|
|
169
|
+
* Pattern for ❯ (U+276F) / ● (U+25CF) indicator lines used by CLI tools to mark the default selection.
|
|
170
|
+
* Claude CLI uses ❯, Gemini CLI uses ●.
|
|
170
171
|
* Used in Pass 1 (existence check) and Pass 2 (option collection) of the 2-pass detection.
|
|
171
172
|
* Anchored at both ends -- ReDoS safe (S4-001).
|
|
172
173
|
*/
|
|
173
|
-
const DEFAULT_OPTION_PATTERN = /^\s
|
|
174
|
+
const DEFAULT_OPTION_PATTERN = /^\s*[\u276F\u25CF]\s*(\d+)\.\s*(.+)$/;
|
|
174
175
|
/**
|
|
175
176
|
* Pattern for normal option lines (no ❯ indicator, just leading whitespace + number).
|
|
176
177
|
* Only applied in Pass 2 when ❯ indicator existence is confirmed by Pass 1.
|
|
@@ -567,7 +568,7 @@ function detectMultipleChoicePrompt(output, options) {
|
|
|
567
568
|
// user input prompt (e.g., "❯ 1", "❯ /command") or idle prompt ("❯").
|
|
568
569
|
// Anything above this line in the scrollback is historical conversation text,
|
|
569
570
|
// not an active prompt. Stop scanning to prevent false positives.
|
|
570
|
-
if (collectedOptions.length === 0 && line.startsWith('\u276F')) {
|
|
571
|
+
if (collectedOptions.length === 0 && (line.startsWith('\u276F') || line.startsWith('\u25CF'))) {
|
|
571
572
|
return noPromptResult(output);
|
|
572
573
|
}
|
|
573
574
|
// Non-option line handling
|
|
@@ -131,7 +131,7 @@ function getPollerKey(worktreeId, cliToolId) {
|
|
|
131
131
|
*/
|
|
132
132
|
function detectPromptWithOptions(output, cliToolId) {
|
|
133
133
|
const promptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
|
|
134
|
-
return (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripAnsi)(output), promptOptions);
|
|
134
|
+
return (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)((0, cli_patterns_1.stripAnsi)(output)), promptOptions);
|
|
135
135
|
}
|
|
136
136
|
/**
|
|
137
137
|
* Clean up Claude response by removing shell setup commands, environment exports, ANSI codes, and banner
|
|
@@ -372,11 +372,12 @@ function extractResponse(output, lastCapturedLine, cliToolId) {
|
|
|
372
372
|
const hasPrompt = promptPattern.test(cleanOutputToCheck);
|
|
373
373
|
const hasSeparator = separatorPattern.test(cleanOutputToCheck);
|
|
374
374
|
const isThinking = thinkingPattern.test(cleanOutputToCheck);
|
|
375
|
-
// Codex/Gemini completion logic: prompt detected and not thinking (separator optional)
|
|
375
|
+
// Codex/Gemini/Vibe-Local completion logic: prompt detected and not thinking (separator optional)
|
|
376
376
|
// - Codex: Interactive TUI, detects › prompt
|
|
377
|
-
// - Gemini:
|
|
377
|
+
// - Gemini: Interactive REPL, detects > / ❯ prompt
|
|
378
|
+
// - Vibe-Local: Interactive REPL, detects > prompt
|
|
378
379
|
// Claude: require both prompt and separator
|
|
379
|
-
const isCodexOrGeminiComplete = (cliToolId === 'codex' || cliToolId === 'gemini') && hasPrompt && !isThinking;
|
|
380
|
+
const isCodexOrGeminiComplete = (cliToolId === 'codex' || cliToolId === 'gemini' || cliToolId === 'vibe-local') && hasPrompt && !isThinking;
|
|
380
381
|
const isClaudeComplete = cliToolId === 'claude' && hasPrompt && hasSeparator && !isThinking;
|
|
381
382
|
if (isCodexOrGeminiComplete || isClaudeComplete) {
|
|
382
383
|
// CLI tool has completed response
|
|
@@ -667,10 +668,15 @@ function startPolling(worktreeId, cliToolId) {
|
|
|
667
668
|
stopPolling(worktreeId, cliToolId);
|
|
668
669
|
// Record start time
|
|
669
670
|
pollingStartTimes.set(pollerKey, Date.now());
|
|
670
|
-
// Start polling
|
|
671
|
-
|
|
672
|
-
|
|
671
|
+
// Start polling with setTimeout chain to prevent race conditions
|
|
672
|
+
scheduleNextResponsePoll(worktreeId, cliToolId);
|
|
673
|
+
}
|
|
674
|
+
/** Schedule next checkForResponse() after current one completes (setTimeout chain) */
|
|
675
|
+
function scheduleNextResponsePoll(worktreeId, cliToolId) {
|
|
676
|
+
const pollerKey = getPollerKey(worktreeId, cliToolId);
|
|
677
|
+
const timerId = setTimeout(async () => {
|
|
673
678
|
// Check if max duration exceeded
|
|
679
|
+
const startTime = pollingStartTimes.get(pollerKey);
|
|
674
680
|
if (startTime && Date.now() - startTime > MAX_POLLING_DURATION) {
|
|
675
681
|
stopPolling(worktreeId, cliToolId);
|
|
676
682
|
return;
|
|
@@ -682,8 +688,13 @@ function startPolling(worktreeId, cliToolId) {
|
|
|
682
688
|
catch (error) {
|
|
683
689
|
console.error(`[Poller] Error:`, error);
|
|
684
690
|
}
|
|
691
|
+
// Schedule next poll ONLY after current one completes
|
|
692
|
+
// Guard: only if poller is still active (not stopped during checkForResponse)
|
|
693
|
+
if (activePollers.has(pollerKey)) {
|
|
694
|
+
scheduleNextResponsePoll(worktreeId, cliToolId);
|
|
695
|
+
}
|
|
685
696
|
}, POLLING_INTERVAL);
|
|
686
|
-
activePollers.set(pollerKey,
|
|
697
|
+
activePollers.set(pollerKey, timerId);
|
|
687
698
|
}
|
|
688
699
|
/**
|
|
689
700
|
* Stop polling for a worktree and CLI tool combination
|
|
@@ -698,9 +709,9 @@ function startPolling(worktreeId, cliToolId) {
|
|
|
698
709
|
*/
|
|
699
710
|
function stopPolling(worktreeId, cliToolId) {
|
|
700
711
|
const pollerKey = getPollerKey(worktreeId, cliToolId);
|
|
701
|
-
const
|
|
702
|
-
if (
|
|
703
|
-
|
|
712
|
+
const timerId = activePollers.get(pollerKey);
|
|
713
|
+
if (timerId) {
|
|
714
|
+
clearTimeout(timerId);
|
|
704
715
|
activePollers.delete(pollerKey);
|
|
705
716
|
pollingStartTimes.delete(pollerKey);
|
|
706
717
|
}
|
|
@@ -220,12 +220,16 @@ async function executeSchedule(state) {
|
|
|
220
220
|
const logId = createExecutionLog(state.scheduleId, state.worktreeId, state.entry.message);
|
|
221
221
|
try {
|
|
222
222
|
const db = getLazyDbInstance();
|
|
223
|
-
const worktree = db.prepare('SELECT path FROM worktrees WHERE id = ?').get(state.worktreeId);
|
|
223
|
+
const worktree = db.prepare('SELECT path, vibe_local_model FROM worktrees WHERE id = ?').get(state.worktreeId);
|
|
224
224
|
if (!worktree) {
|
|
225
225
|
updateExecutionLog(logId, 'failed', 'Worktree not found', null);
|
|
226
226
|
return;
|
|
227
227
|
}
|
|
228
|
-
|
|
228
|
+
// Build options for vibe-local model
|
|
229
|
+
const options = state.entry.cliToolId === 'vibe-local' && worktree.vibe_local_model
|
|
230
|
+
? { model: worktree.vibe_local_model }
|
|
231
|
+
: undefined;
|
|
232
|
+
const result = await (0, claude_executor_1.executeClaudeCommand)(state.entry.message, worktree.path, state.entry.cliToolId, state.entry.permission, options);
|
|
229
233
|
updateExecutionLog(logId, result.status, result.output, result.exitCode);
|
|
230
234
|
updateScheduleLastExecuted(state.scheduleId);
|
|
231
235
|
console.log(`[schedule-manager] Executed ${state.entry.name}: ${result.status}`);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Selected Agents Validator
|
|
4
|
+
* Issue #368: Validation and parsing for worktree selected_agents field
|
|
5
|
+
*
|
|
6
|
+
* Provides:
|
|
7
|
+
* - validateAgentsPair(): Core validation logic (R1-001)
|
|
8
|
+
* - parseSelectedAgents(): DB read with fallback + console.warn (R4-005 log sanitization)
|
|
9
|
+
* - validateSelectedAgentsInput(): API input validation
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DEFAULT_SELECTED_AGENTS = void 0;
|
|
13
|
+
exports.validateAgentsPair = validateAgentsPair;
|
|
14
|
+
exports.parseSelectedAgents = parseSelectedAgents;
|
|
15
|
+
exports.validateSelectedAgentsInput = validateSelectedAgentsInput;
|
|
16
|
+
const types_1 = require("./cli-tools/types");
|
|
17
|
+
/**
|
|
18
|
+
* ANSI escape code pattern for log sanitization (R4-005)
|
|
19
|
+
* Duplicated from cli-patterns.ts to avoid importing server-side logger chain
|
|
20
|
+
*/
|
|
21
|
+
const ANSI_PATTERN = /\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;
|
|
22
|
+
/**
|
|
23
|
+
* Strip ANSI escape codes from a string
|
|
24
|
+
*/
|
|
25
|
+
function stripAnsi(str) {
|
|
26
|
+
return str.replace(ANSI_PATTERN, '');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Sanitize raw DB value for safe console.warn output (R4-005)
|
|
30
|
+
* Removes ANSI escapes, newlines, and truncates to 100 chars
|
|
31
|
+
*/
|
|
32
|
+
function sanitizeRawForLog(raw) {
|
|
33
|
+
return stripAnsi(raw).replace(/[\n\r]/g, ' ').substring(0, 100);
|
|
34
|
+
}
|
|
35
|
+
/** Default selected agents when DB value is missing or invalid */
|
|
36
|
+
exports.DEFAULT_SELECTED_AGENTS = ['claude', 'codex'];
|
|
37
|
+
/**
|
|
38
|
+
* Core validation function for a pair of CLI tool IDs (R1-001)
|
|
39
|
+
* Shared between parseSelectedAgents() and validateSelectedAgentsInput()
|
|
40
|
+
*
|
|
41
|
+
* @param input - Array of values to validate
|
|
42
|
+
* @returns Validation result with optional typed value or error message
|
|
43
|
+
*/
|
|
44
|
+
function validateAgentsPair(input) {
|
|
45
|
+
if (input.length !== 2) {
|
|
46
|
+
return { valid: false, error: 'Must be 2 elements' };
|
|
47
|
+
}
|
|
48
|
+
if (!input.every(id => typeof id === 'string' && types_1.CLI_TOOL_IDS.includes(id))) {
|
|
49
|
+
return { valid: false, error: 'Invalid CLI tool ID' };
|
|
50
|
+
}
|
|
51
|
+
if (input[0] === input[1]) {
|
|
52
|
+
return { valid: false, error: 'Duplicate tool IDs not allowed' };
|
|
53
|
+
}
|
|
54
|
+
return { valid: true, value: input };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse selected_agents JSON from DB with safe fallback
|
|
58
|
+
* Returns default value for any invalid input (never throws)
|
|
59
|
+
*
|
|
60
|
+
* Logs a warning when fallback is triggered to help detect DB data issues.
|
|
61
|
+
* Log output is sanitized (R4-005): ANSI stripped, newlines removed, truncated.
|
|
62
|
+
*
|
|
63
|
+
* @param raw - Raw JSON string from DB (or null)
|
|
64
|
+
* @returns Validated tuple of 2 CLIToolType values
|
|
65
|
+
*/
|
|
66
|
+
function parseSelectedAgents(raw) {
|
|
67
|
+
if (!raw)
|
|
68
|
+
return exports.DEFAULT_SELECTED_AGENTS;
|
|
69
|
+
try {
|
|
70
|
+
const parsed = JSON.parse(raw);
|
|
71
|
+
if (!Array.isArray(parsed)) {
|
|
72
|
+
console.warn(`[selected-agents] Invalid format in DB, falling back to default: ${sanitizeRawForLog(raw)}`);
|
|
73
|
+
return exports.DEFAULT_SELECTED_AGENTS;
|
|
74
|
+
}
|
|
75
|
+
const result = validateAgentsPair(parsed);
|
|
76
|
+
if (!result.valid) {
|
|
77
|
+
console.warn(`[selected-agents] Invalid data in DB (${result.error}), falling back to default: ${sanitizeRawForLog(raw)}`);
|
|
78
|
+
return exports.DEFAULT_SELECTED_AGENTS;
|
|
79
|
+
}
|
|
80
|
+
return result.value;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
console.warn(`[selected-agents] JSON parse error in DB, falling back to default: ${sanitizeRawForLog(raw)}`);
|
|
84
|
+
return exports.DEFAULT_SELECTED_AGENTS;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate selectedAgents input from API request body
|
|
89
|
+
* Returns structured error for API error responses (does not fallback)
|
|
90
|
+
*
|
|
91
|
+
* @param input - Raw input from request body (unknown type for safety)
|
|
92
|
+
* @returns Validation result with typed value or error string
|
|
93
|
+
*/
|
|
94
|
+
function validateSelectedAgentsInput(input) {
|
|
95
|
+
if (!Array.isArray(input) || input.length !== 2) {
|
|
96
|
+
return { valid: false, error: 'selected_agents must be an array of 2 elements' };
|
|
97
|
+
}
|
|
98
|
+
return validateAgentsPair(input);
|
|
99
|
+
}
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
exports.deriveCliStatus = deriveCliStatus;
|
|
9
9
|
exports.calculateHasUnread = calculateHasUnread;
|
|
10
10
|
exports.toBranchItem = toBranchItem;
|
|
11
|
+
const selected_agents_validator_1 = require("../lib/selected-agents-validator");
|
|
11
12
|
/**
|
|
12
13
|
* Derive BranchStatus from per-CLI tool session status flags.
|
|
13
14
|
* Shared by sidebar (toBranchItem) and WorktreeDetailRefactored tab dots.
|
|
@@ -58,6 +59,13 @@ function toBranchItem(worktree) {
|
|
|
58
59
|
const status = 'idle';
|
|
59
60
|
// Use new hasUnread logic based on lastAssistantMessageAt and lastViewedAt
|
|
60
61
|
const hasUnread = calculateHasUnread(worktree);
|
|
62
|
+
// Issue #368: Use selectedAgents to determine which tools to show status for
|
|
63
|
+
// Falls back to DEFAULT_SELECTED_AGENTS when selectedAgents is not set
|
|
64
|
+
const agents = worktree.selectedAgents ?? selected_agents_validator_1.DEFAULT_SELECTED_AGENTS;
|
|
65
|
+
const cliStatus = {};
|
|
66
|
+
for (const agent of agents) {
|
|
67
|
+
cliStatus[agent] = deriveCliStatus(worktree.sessionStatusByCli?.[agent]);
|
|
68
|
+
}
|
|
61
69
|
return {
|
|
62
70
|
id: worktree.id,
|
|
63
71
|
name: worktree.name,
|
|
@@ -66,9 +74,6 @@ function toBranchItem(worktree) {
|
|
|
66
74
|
hasUnread,
|
|
67
75
|
lastActivity: worktree.updatedAt,
|
|
68
76
|
description: worktree.description,
|
|
69
|
-
cliStatus
|
|
70
|
-
claude: deriveCliStatus(worktree.sessionStatusByCli?.claude),
|
|
71
|
-
codex: deriveCliStatus(worktree.sessionStatusByCli?.codex),
|
|
72
|
-
},
|
|
77
|
+
cliStatus,
|
|
73
78
|
};
|
|
74
79
|
}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=7536,exports.ids=[7536],exports.modules={89194:(e,t,s)=>{s.d(t,{Lg:()=>o,NA:()=>a});var n=s(10927),i=s(43839);let r=(0,s(43895).h)("cli-session");async function o(e,t){let s=i.g.getInstance().getTool(t).getSessionName(e);return await (0,n.Hk)(s)}async function a(e,t,s=1e3){let o=r.withContext({worktreeId:e,cliToolId:t});o.debug("captureSessionOutput:start",{requestedLines:s});let a=i.g.getInstance().getTool(t),l=a.getSessionName(e);if(!await (0,n.Hk)(l))throw o.debug("captureSessionOutput:sessionNotFound",{sessionName:l}),Error(`${a.name} session ${l} does not exist`);try{let e=await (0,n.xq)(l,{startLine:-s}),t=e.split("\n").length;return o.debug("captureSessionOutput:success",{actualLines:t,lastFewLines:e.split("\n").slice(-3).join(" | ")}),e}catch(t){let e=t instanceof Error?t.message:String(t);throw o.error("captureSessionOutput:failed",{error:e}),Error(`Failed to capture ${a.name} output: ${e}`)}}},43839:(e,t,s)=>{s.d(t,{g:()=>y});var n=s(61282),i=s(21764);let r=/^[a-zA-Z0-9_-]+$/;var o=s(10927);let a=(0,i.promisify)(n.exec);class l{async isInstalled(){try{return await a(`which ${this.command}`,{timeout:5e3}),!0}catch{return!1}}getSessionName(e){let t=`mcbd-${this.id}-${e}`;return function(e){if(!r.test(e))throw Error(`Invalid session name format: ${e}`)}(t),t}async interrupt(e){let t=this.getSessionName(e);await (0,o.ZV)(t,"Escape")}}var u=s(62648);class c extends l{async isInstalled(){return await (0,u.Uv)()}async isRunning(e){return await (0,u.YI)(e)}async startSession(e,t){await (0,u.ym)({worktreeId:e,worktreePath:t})}async sendMessage(e,t){await (0,u.xd)(e,t)}async killSession(e){await (0,u._f)(e)}constructor(...e){super(...e),this.id="claude",this.name="Claude Code",this.command="claude"}}var m=s(92900);let p=(0,i.promisify)(n.exec);function d(e){return e instanceof Error?e.message:String(e)}class f extends l{async isRunning(e){let t=this.getSessionName(e);return await (0,o.Hk)(t)}async startSession(e,t){if(!await this.isInstalled())throw Error("Codex CLI is not installed or not in PATH");let s=this.getSessionName(e);if(await (0,o.Hk)(s)){console.log(`Codex session ${s} already exists`);return}try{await (0,o.ed)({sessionName:s,workingDirectory:t,historyLimit:5e4}),await new Promise(e=>setTimeout(e,100)),await (0,o.Is)(s,"codex",!0),await new Promise(e=>setTimeout(e,3e3)),await (0,o.Is)(s,"2",!0),await new Promise(e=>setTimeout(e,200)),await p(`tmux send-keys -t "${s}" Down`),await new Promise(e=>setTimeout(e,200)),await p(`tmux send-keys -t "${s}" Enter`),await new Promise(e=>setTimeout(e,200)),console.log(`✓ Started Codex session: ${s}`)}catch(t){let e=d(t);throw Error(`Failed to start Codex session: ${e}`)}}async sendMessage(e,t){let s=this.getSessionName(e);if(!await (0,o.Hk)(s))throw Error(`Codex session ${s} does not exist. Start the session first.`);try{await (0,o.Is)(s,t,!1),await new Promise(e=>setTimeout(e,100)),await p(`tmux send-keys -t "${s}" C-m`),await new Promise(e=>setTimeout(e,200)),t.includes("\n")&&await (0,m.N)(s),console.log(`✓ Sent message to Codex session: ${s}`)}catch(t){let e=d(t);throw Error(`Failed to send message to Codex: ${e}`)}}async killSession(e){let t=this.getSessionName(e);try{await (0,o.Hk)(t)&&(await p(`tmux send-keys -t "${t}" C-d`),await new Promise(e=>setTimeout(e,500))),await (0,o.AJ)(t)&&console.log(`✓ Stopped Codex session: ${t}`)}catch(t){let e=d(t);throw console.error(`Error stopping Codex session: ${e}`),t}}constructor(...e){super(...e),this.id="codex",this.name="Codex CLI",this.command="codex"}}let g=(0,i.promisify)(n.exec);class h extends l{async isRunning(e){let t=this.getSessionName(e);return await (0,o.Hk)(t)}async startSession(e,t){if(!await this.isInstalled())throw Error("Gemini CLI is not installed or not in PATH");let s=this.getSessionName(e);if(await (0,o.Hk)(s)){console.log(`Gemini session ${s} already exists`);return}try{await (0,o.ed)({sessionName:s,workingDirectory:t,historyLimit:5e4}),console.log(`✓ Started Gemini session: ${s}`)}catch(t){let e=t instanceof Error?t.message:String(t);throw Error(`Failed to start Gemini session: ${e}`)}}async sendMessage(e,t){let s=this.getSessionName(e);if(!await (0,o.Hk)(s))throw Error(`Gemini session ${s} does not exist. Start the session first.`);try{let e=t.replace(/'/g,"'\\''");await (0,o.Is)(s,`echo '${e}' | gemini`,!0),console.log(`✓ Sent message to Gemini session: ${s}`)}catch(t){let e=t instanceof Error?t.message:String(t);throw Error(`Failed to send message to Gemini: ${e}`)}}async killSession(e){let t=this.getSessionName(e);try{await (0,o.Hk)(t)&&(await g(`tmux send-keys -t "${t}" C-d`),await new Promise(e=>setTimeout(e,500))),await (0,o.AJ)(t)&&console.log(`✓ Stopped Gemini session: ${t}`)}catch(t){let e=t instanceof Error?t.message:String(t);throw console.error(`Error stopping Gemini session: ${e}`),t}}constructor(...e){super(...e),this.id="gemini",this.name="Gemini CLI",this.command="gemini"}}var w=s(59991);class y{constructor(){this.tools=new Map,this.tools.set("claude",new c),this.tools.set("codex",new f),this.tools.set("gemini",new h)}static getInstance(){return y.instance||(y.instance=new y),y.instance}getTool(e){let t=this.tools.get(e);if(!t)throw Error(`CLI tool '${e}' not found`);return t}getAllTools(){return Array.from(this.tools.values())}async getToolInfo(e){let t=this.getTool(e),s=await t.isInstalled();return{id:t.id,name:t.name,command:t.command,installed:s}}async getAllToolsInfo(){return Promise.all(this.getAllTools().map(async e=>{let t=await e.isInstalled();return{id:e.id,name:e.name,command:e.command,installed:t}}))}async getInstalledTools(){return(await this.getAllToolsInfo()).filter(e=>e.installed)}stopPollers(e,t){(0,w.FN)(e,t)}}},63661:(e,t,s)=>{s.d(t,{F:()=>o,J:()=>f});let n=(0,s(43895).h)("prompt-detector"),i=[{regex:/^(.+)\s+\(y\/n\)\s*$/m},{regex:/^(.+)\s+\[y\/N\]\s*$/m,defaultOption:"no"},{regex:/^(.+)\s+\[Y\/n\]\s*$/m,defaultOption:"yes"},{regex:/^(.+)\s+\(yes\/no\)\s*$/m}];function r(e,t,s,n){return{isPrompt:!0,promptData:{type:"yes_no",question:e,options:["yes","no"],status:"pending",...void 0!==n&&{defaultOption:n},instructionText:s},cleanContent:t,rawContent:s}}function o(e,t){n.debug("detectPrompt:start",{outputLength:e.length});let s=e.split("\n").slice(-20).join("\n"),o=function(e,t){let s=t?.requireDefaultIndicator??!0,n=e.split("\n"),i=n.length;for(;i>0&&""===n[i-1].trim();)i--;let r=Math.max(0,i-50);if(s){let t=!1;for(let e=r;e<i;e++){let s=n[e].trim();if(l.test(s)){t=!0;break}}if(!t)return m(e)}let o=[],p=-1;for(let t=i-1;t>=r;t--){let s=n[t].trim(),i=s.match(l);if(i){let e=parseInt(i[1],10),t=i[2].trim();o.unshift({number:e,label:t,isDefault:!0});continue}let r=s.match(u);if(r){let e=parseInt(r[1],10),t=r[2].trim();o.unshift({number:e,label:t,isDefault:!1});continue}if(0===o.length&&s.startsWith("❯"))return m(e);if(o.length>0&&s&&!c.test(s)){if(d(s)){p=t;break}if(function(e,t){let s=t.endsWith("?")||t.endsWith("?");return!!(!s&&/^\s{2,}[^\d]/.test(e)&&!/^\s*\d+\./.test(e)||t.length<5&&!s||/^[\/~]/.test(t)||t.length>=2&&/^[a-zA-Z0-9_-]+$/.test(t))}(n[t],s))continue;p=t;break}}if(!function(e){if(0===e.length||1!==e[0])return!1;for(let t=1;t<e.length;t++)if(e[t]!==e[t-1]+1)return!1;return!0}(o.map(e=>e.number)))return m(e);let f=o.some(e=>e.isDefault);if(o.length<2||s&&!f||!s&&(-1===p||!d(n[p]?.trim()??"")&&!function(e,t,s,n){let i=Math.max(n,t-3);for(let s=t-1;s>=i;s--){let t=e[s]?.trim()??"";if(!(!t||c.test(t))&&d(t))return!0}return!1}(n,p,0,r)))return m(e);let g=function(e,t){if(t<0)return"Please select an option:";let s=[];for(let n=Math.max(0,t-5);n<=t;n++){let t=e[n].trim();t&&!c.test(t)&&s.push(t)}return s.join(" ")}(n,p),h=function(e,t,s){if(t<0)return;let n=e.slice(Math.max(0,t-19),s).map(e=>e.trimEnd()).join("\n").trim();return n.length>0?n:void 0}(n,p,i);return{isPrompt:!0,promptData:{type:"multiple_choice",question:g.trim(),options:o.map(e=>{let t=a.some(t=>t.test(e.label));return{number:e.number,label:e.label,isDefault:e.isDefault,requiresTextInput:t}}),status:"pending",instructionText:h},cleanContent:g.trim(),rawContent:function(e){let t=e.split("\n"),s=(t.length>200?t.slice(-200):t).join("\n");return s.length>5e3&&(s=s.slice(-5e3)),s}(e.trim())}}(e,t);if(o.isPrompt)return n.info("detectPrompt:multipleChoice",{isPrompt:!0,question:o.promptData?.question,optionsCount:o.promptData?.options?.length}),o;let p=s.trim();for(let e of i){let t=s.match(e.regex);if(t){let s=t[1].trim();return r(s,s,p,e.defaultOption)}}let f=s.match(/^(.*?)Approve\?\s*$/m);if(f){let e=f[1].trim();return r(e?`${e} Approve?`:"Approve?",e||"Approve?",p)}return n.debug("detectPrompt:complete",{isPrompt:!1}),{isPrompt:!1,cleanContent:e.trim()}}let a=[/type\s+here/i,/tell\s+(me|claude)/i,/enter\s+/i,/custom/i,/differently/i],l=/^\s*\u276F\s*(\d+)\.\s*(.+)$/,u=/^\s*(\d+)\.\s*(.+)$/,c=/^[-─]+$/;function m(e){return{isPrompt:!1,cleanContent:e.trim()}}let p=/(?:select|choose|pick|which|what|how|where|enter|type|specify|confirm|approve|accept|reject|decide|preference|option)/i;function d(e){return 0!==e.length&&!!(e.includes("?")||e.includes("?")||p.test(e))}function f(e,t="yes_no"){let s=e.toLowerCase().trim();if("multiple_choice"===t){if(/^\d+$/.test(s))return s;throw Error("Invalid answer for multiple choice prompt. Expected a number.")}if("yes"===s||"y"===s)return"y";if("no"===s||"n"===s)return"n";throw Error("Invalid answer for yes/no prompt. Expected 'yes', 'no', 'y', or 'n'.")}},59991:(e,t,s)=>{s.d(t,{FN:()=>S,RJ:()=>y,ci:()=>w,cn:()=>C});var n=s(89194),i=s(97425),r=s(75748),o=s(68507),a=s(63661),l=s(76966),u=s(89287),c=s(19377);let m=["Waiting for auth","⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function p(e){return{response:"",isComplete:!1,lineCount:e}}function d(e,t,s,n,i,r){let o=$(t,s,n,i,r),a=e.slice(o);return{response:(0,c.vp)(a.join("\n")),isComplete:!0,lineCount:s}}let f=new Map,g=new Map;function h(e,t){let s=(0,c.Sg)(t);return(0,a.F)((0,c.vp)(e),s)}function w(e){let t=(0,c.vp)(e).split("\n"),s=-1;for(let e=t.length-1;e>=0;e--)if(/^❯\s+\S/.test(t[e])){s=e;break}let n=s>=0?s+1:0,i=t.slice(n),r=[/CLAUDE_HOOKS_/,/\/bin\/claude/,/^claude\s*$/,/@.*\s+%\s*$/,/^[^⏺]*curl.*POST/,/^[^⏺]*Content-Type/,/^[^⏺]*export\s+CLAUDE_/,/^\s*$/,/^[╭╮╰╯│─\s]+$/,/^[│╭╮╰╯].*[│╭╮╰╯]$/,/Claude Code v[\d.]+/,/^Tips for getting started/,/^Welcome back/,/Run \/init to create/,/^Recent activity/,/^No recent activity/,/▐▛███▜▌|▝▜█████▛▘|▘▘ ▝▝/,/^\s*Opus \d+\.\d+\s*·\s*Claude Max/,/\.com's Organization/,/\?\s*for shortcuts\s*$/,/^─{10,}$/,/^❯\s*$/,c.d8],o=[];for(let e of i)!r.some(t=>t.test(e))&&e.trim()&&o.push(e);return o.join("\n").trim()}function y(e){let t=e.split("\n"),s=[],n=[/^maenokota@.*%/,/^zsh:/,/^feature-issue-\d+/,/^\s*$/],i=!1,r=[];for(let e of t){if(e.includes("✦")){i=!0;let t=e.indexOf("✦"),s=e.substring(t+1).trim();s&&r.push(s);continue}if(i){if(n.some(t=>t.test(e)))continue;r.push(e)}}if(r.length>0)return r.join("\n").trim();for(let e of t)n.some(t=>t.test(e))||s.push(e);return s.join("\n").trim()}function $(e,t,s,n,i){if((e=Math.max(0,e))>=t||s){let e=i(40);return e>=0?e+1:0}if("codex"===n)return Math.max(0,e);if(e>=t-5){let e=i(50);return e>=0?e+1:Math.max(0,t-40)}return Math.max(0,e)}async function x(e,t){let s=(0,i.getDbInstance)();try{if(!(0,r.gU)(s,e))return console.error(`Worktree ${e} not found, stopping poller`),S(e,t),!1;if(!await (0,n.Lg)(e,t))return S(e,t),!1;let i=(0,r.zl)(s,e,t),a=i?.lastCapturedLine||0,f=await (0,n.NA)(e,t,1e4),g=function(e,t,s){let n=e.split("\n"),i=n.length;for(;i>0&&""===n[i-1].trim();)i--;let r=n.slice(0,i),o=r.length,a=o>0&&t>25&&o+25<t,l=o>0&&t>50&&o<50,u=a||l;if(!u&&o<t-5)return null;let f=Math.max(0,o-20),g=r.slice(f).join("\n"),{promptPattern:w,separatorPattern:y,thinkingPattern:x,skipPatterns:C}=(0,c.bs)(s),S=(e=60)=>{let t="codex"===s?/^›\s+(?!Implement|Find and fix|Type|Summarize)/:/^[>❯]\s+\S/;for(let s=o-1;s>=Math.max(0,o-e);s--){let e=(0,c.vp)(r[s]);if(t.test(e))return s}return -1};if("claude"===s&&h(r.join("\n"),s).isPrompt)return d(r,t,o,u,s,S);let I=(0,c.vp)(g),k=w.test(I),v=y.test(I),P=x.test(I),E=("codex"===s||"gemini"===s)&&k&&!P,T="claude"===s&&k&&v&&!P;if(E||T){let e=[],n=$(t,o,u,s,S),i=o;for(let t=n;t<o;t++){let n=r[t],o=(0,c.vp)(n);if("codex"===s&&/^›\s+/.test(o)||"gemini"===s&&/^(%|\$|.*@.*[%$#])\s*$/.test(o)){i=t;break}C.some(e=>e.test(o))||e.push(n)}let a=e.join("\n").trim(),l=a.split("\n").slice(-5).join("\n");if(x.test(l))return p(o);if("claude"===s){let e=(0,c.vp)(a),t=/[╭╮╰╯│]/.test(e)||/░{3,}/.test(e)||/▓{3,}/.test(e),s=/Claude Code|claude\/|v\d+\.\d+/.test(e),n=/Tip:|for shortcuts|\?\s*for help/.test(e),i=/^\s*\/Users\/.*$/m.test(e)&&e.split("\n").length<30,r=e.match(/^[>❯]\s+(\S.*)$/m);if(r){let t=e.indexOf(r[0]);if(0===e.substring(t+r[0].length).trim().split("\n").filter(e=>{let t=e.trim();return t&&!C.some(e=>e.test(t))&&!/^─+$/.test(t)}).length)return p(o)}else if((t||s||n||i)&&a.length<2e3)return p(o)}return"gemini"===s&&((a.match(/[░███]/g)||[]).length>.3*a.length||m.some(e=>a.includes(e))||!a.includes("✦")&&a.length<10)?p(o):{response:a,isComplete:!0,lineCount:i}}if(h(r.join("\n"),s).isPrompt)return d(r,t,o,u,s,S);let b=[],M=u||t>=o-5,N=M?S(80):-1,D=M?N>=0?N+1:Math.max(0,o-80):Math.max(0,t);for(let e=D;e<o;e++){let t=r[e],s=(0,c.vp)(t);C.some(e=>e.test(s))||b.push(t)}let A=b.join("\n").trim();return A?{response:A,isComplete:!1,lineCount:o}:p(o)}(f,a,t);if(!g||!g.isComplete){let{thinkingPattern:n}=(0,c.bs)(t),i=(0,c.vp)(f).split("\n").slice(-5).join("\n");if(n.test(i)){let n=(0,r.GP)(s,e,t);n>0&&console.log(`Marked ${n} pending prompt(s) as answered (thinking detected) for ${e}`)}return!1}if(g.lineCount===a&&!i?.inProgressMessageId)return!1;if(g.lineCount<=a)return console.log(`[checkForResponse] Already saved up to line ${a}, skipping (result: ${g.lineCount})`),!1;let x=h(g.response,t);if(x.isPrompt){(0,r.Mf)(s,e,t);let n=(0,r.tn)(s,{worktreeId:e,role:"assistant",content:x.rawContent||x.cleanContent,messageType:"prompt",promptData:x.promptData,timestamp:new Date,cliToolId:t});return(0,r.IH)(s,e,t,g.lineCount),(0,o.ps)("message",{worktreeId:e,message:n}),S(e,t),!0}if(!g.response||""===g.response.trim())return(0,r.IH)(s,e,t,g.lineCount),!1;let C="claude"===t?(0,u.Z)(g.response):void 0,I=g.response;if("gemini"===t?I=y(g.response):"claude"===t&&(I=w(g.response)),!I||""===I.trim()||"[No content]"===I)return(0,r.IH)(s,e,t,g.lineCount),(0,r.Mf)(s,e,t),!1;I&&await (0,l.o)(s,e,I,t);let k=(0,r.GP)(s,e,t);k>0&&console.log(`Marked ${k} pending prompt(s) as answered for ${e}`);let v=(0,r.zl)(s,e,t);if(v&&g.lineCount<=v.lastCapturedLine)return console.log(`[checkForResponse] Race condition detected, skipping save (result: ${g.lineCount}, current: ${v.lastCapturedLine})`),!1;let P=(0,r.tn)(s,{worktreeId:e,role:"assistant",content:I,messageType:"normal",timestamp:new Date,cliToolId:t,summary:C?.summary,logFileName:C?.logFileName,requestId:C?.requestId});return(0,o.ps)("message",{worktreeId:e,message:P}),(0,r.IH)(s,e,t,g.lineCount),!0}catch(t){return console.error(`Error checking for response (${e}):`,t instanceof Error?t.message:String(t)),!1}}function C(e,t){let s=`${e}:${t}`;S(e,t),g.set(s,Date.now());let n=setInterval(async()=>{let n=g.get(s);if(n&&Date.now()-n>18e5){S(e,t);return}try{await x(e,t)}catch(e){console.error("[Poller] Error:",e)}},2e3);f.set(s,n)}function S(e,t){let s=`${e}:${t}`,n=f.get(s);n&&(clearInterval(n),f.delete(s),g.delete(s))}}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8091],{20318:function(e,t,n){n.d(t,{Ix:function(){return x},pm:function(){return m}});var r=n(57437),a=n(2265),s=n(41671),l=n(99388),o=n(33245),i=n(32489),c=n(3468);function d(e){let{type:t,iconColor:n}=e,a="h-5 w-5 ".concat(n);switch(t){case"success":return(0,r.jsx)(s.Z,{className:a,"data-testid":"toast-icon-success"});case"error":return(0,r.jsx)(l.Z,{className:a,"data-testid":"toast-icon-error"});default:return(0,r.jsx)(o.Z,{className:a,"data-testid":"toast-icon-info"})}}function u(e){let{id:t,message:n,type:s,onClose:l,duration:o=3e3}=e,c=(0,a.useRef)(null),u=function(e){switch(e){case"success":return{bgColor:"bg-green-50",borderColor:"border-green-200",textColor:"text-green-800",iconColor:"text-green-500"};case"error":return{bgColor:"bg-red-50",borderColor:"border-red-200",textColor:"text-red-800",iconColor:"text-red-500"};default:return{bgColor:"bg-blue-50",borderColor:"border-blue-200",textColor:"text-blue-800",iconColor:"text-blue-500"}}}(s);(0,a.useEffect)(()=>(o>0&&(c.current=setTimeout(()=>{l(t)},o)),()=>{c.current&&clearTimeout(c.current)}),[t,o,l]);let x=(0,a.useCallback)(()=>{c.current&&clearTimeout(c.current),l(t)},[t,l]);return(0,r.jsxs)("div",{"data-testid":"toast-".concat(t),role:"alert",className:"\n ".concat(u.bgColor,"\n ").concat(u.borderColor,"\n ").concat(u.textColor,"\n border rounded-lg shadow-lg p-4 min-w-[300px] max-w-[400px]\n flex items-start gap-3\n animate-slide-in\n "),children:[(0,r.jsx)(d,{type:s,iconColor:u.iconColor}),(0,r.jsx)("p",{className:"flex-1 text-sm font-medium",children:n}),(0,r.jsx)("button",{"data-testid":"toast-close-button",onClick:x,"aria-label":"Close notification",className:"\n ".concat(u.textColor,"\n hover:opacity-70\n focus:outline-none focus:ring-2 focus:ring-offset-2\n transition-opacity\n "),children:(0,r.jsx)(i.Z,{className:"h-4 w-4"})})]})}function x(e){let{toasts:t,onClose:n}=e;return(0,r.jsx)("div",{"data-testid":"toast-container","aria-live":"polite",className:"fixed bottom-4 right-4 flex flex-col gap-2",style:{zIndex:c.k.TOAST},children:t.map(e=>(0,r.jsx)(u,{id:e.id,message:e.message,type:e.type,onClose:n,duration:e.duration},e.id))})}function m(){let[e,t]=(0,a.useState)([]),n=(0,a.useRef)(0);return{toasts:e,showToast:(0,a.useCallback)(function(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3e3,s="toast-".concat(++n.current,"-").concat(Date.now()),l={id:s,message:e,type:r,duration:a};return t(e=>[...e,l]),s},[]),removeToast:(0,a.useCallback)(e=>{t(t=>t.filter(t=>t.id!==e))},[]),clearToasts:(0,a.useCallback)(()=>{t([])},[])}}},8820:function(e,t,n){n.d(t,{Vw:function(){return z}});var r=n(57437),a=n(2265);n(27648);var s=n(43241),l=n(58819),o=n(99376),i=n(34021),c=n(8672);function d(e){let{status:t,label:n}=e,a=c.F4[t],s="".concat(n,": ").concat(a.label);return"spinner"===a.type?(0,r.jsx)("span",{className:"w-2 h-2 rounded-full flex-shrink-0 border-2 border-t-transparent animate-spin ".concat(a.className),title:s,"aria-label":s}):(0,r.jsx)("span",{className:"w-2 h-2 rounded-full flex-shrink-0 ".concat(a.className),title:s,"aria-label":s})}let u=(0,a.memo)(function(e){let{branch:t,isSelected:n,onClick:a}=e;return(0,r.jsxs)("button",{"data-testid":"branch-list-item",onClick:a,"aria-current":n?"true":void 0,className:"\n w-full px-4 py-3 flex flex-col gap-1\n hover:bg-gray-800 transition-colors\n focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500\n ".concat(n?"bg-gray-700 border-l-2 border-blue-500":"border-l-2 border-transparent","\n "),children:[(0,r.jsxs)("div",{className:"flex items-center gap-3 w-full",children:[t.cliStatus&&(0,r.jsxs)("div",{className:"flex items-center gap-1 flex-shrink-0","aria-label":"CLI tool status",children:[(0,r.jsx)(d,{status:t.cliStatus.claude,label:"Claude"}),(0,r.jsx)(d,{status:t.cliStatus.codex,label:"Codex"})]}),(0,r.jsxs)("div",{className:"flex-1 min-w-0 text-left",children:[(0,r.jsx)("p",{className:"text-sm font-medium text-white truncate",children:t.name}),(0,r.jsx)("p",{className:"text-xs text-gray-400 truncate",children:t.repositoryName})]}),t.hasUnread&&(0,r.jsx)("span",{"data-testid":"unread-indicator",className:"w-2 h-2 rounded-full bg-blue-500 flex-shrink-0","aria-label":"Has unread messages"})]}),t.description&&(0,r.jsx)("div",{"data-testid":"branch-description",className:"pl-6 pr-2 mt-1 text-left",children:(0,r.jsx)("p",{className:"text-xs text-gray-400 line-clamp-2",children:t.description})})]})}),x=[{key:"updatedAt",label:"Updated"},{key:"repositoryName",label:"Repository"},{key:"branchName",label:"Branch"},{key:"status",label:"Status"}],m=(0,a.memo)(function(){var e;let{sortKey:t,sortDirection:n,setSortKey:l,setSortDirection:o}=(0,s.Sz)(),[i,c]=(0,a.useState)(!1),d=(0,a.useRef)(null);(0,a.useEffect)(()=>{function e(e){d.current&&!d.current.contains(e.target)&&c(!1)}if(i)return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[i]),(0,a.useEffect)(()=>{function e(e){"Escape"===e.key&&c(!1)}if(i)return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[i]);let u=(0,a.useCallback)(()=>{c(e=>!e)},[]),m=(0,a.useCallback)(e=>{e===t?o("asc"===n?"desc":"asc"):(l(e),o("updatedAt"===e?"desc":"asc")),c(!1)},[t,n,l,o]),p=(0,a.useCallback)(()=>{o("asc"===n?"desc":"asc")},[n,o]),b=(null===(e=x.find(e=>e.key===t))||void 0===e?void 0:e.label)||"Sort";return(0,r.jsxs)("div",{ref:d,className:"relative","data-testid":"sort-selector",children:[(0,r.jsxs)("div",{className:"flex items-center gap-1",children:[(0,r.jsxs)("button",{type:"button",onClick:u,"aria-expanded":i,"aria-haspopup":"listbox","aria-label":"Sort by ".concat(b),className:" flex items-center gap-1 px-2 py-1 rounded text-xs text-gray-300 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ",children:[(0,r.jsx)(h,{className:"w-3 h-3"}),(0,r.jsx)("span",{className:"hidden sm:inline",children:b})]}),(0,r.jsx)("button",{type:"button",onClick:p,"aria-label":"asc"===n?"Sort ascending":"Sort descending",className:" p-1 rounded text-gray-300 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ",children:"asc"===n?(0,r.jsx)(f,{className:"w-3 h-3"}):(0,r.jsx)(g,{className:"w-3 h-3"})})]}),i&&(0,r.jsx)("div",{role:"listbox","aria-label":"Sort options",className:" absolute right-0 top-full mt-1 z-50 min-w-[140px] py-1 rounded-md shadow-lg bg-gray-800 border border-gray-600 ",children:x.map(e=>(0,r.jsxs)("button",{type:"button",role:"option","aria-selected":t===e.key,onClick:()=>m(e.key),className:"\n w-full px-3 py-2 text-left text-sm\n flex items-center justify-between\n hover:bg-gray-700 transition-colors\n ".concat(t===e.key?"text-blue-400":"text-gray-300","\n "),children:[(0,r.jsx)("span",{children:e.label}),t===e.key&&(0,r.jsx)("span",{className:"text-xs",children:"asc"===n?"ASC":"DESC"})]},e.key))})]})});function h(e){let{className:t}=e;return(0,r.jsx)("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12"})})}function f(e){let{className:t}=e;return(0,r.jsx)("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 15l7-7 7 7"})})}function g(e){let{className:t}=e;return(0,r.jsx)("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})}var p=n(69234);let b=["en","ja"],y={en:"English",ja:"日本語"};function v(){let{currentLocale:e,switchLocale:t}={currentLocale:(0,p.bU)(),switchLocale:e=>{b.includes(e)&&(!function(e){let t="https:"===window.location.protocol;document.cookie="".concat("locale","=").concat(e,";path=/;max-age=").concat(31536e3,";SameSite=Lax").concat(t?";Secure":"")}(e),localStorage.setItem("locale",e),window.location.reload())}};return(0,r.jsx)("select",{value:e,onChange:e=>t(e.target.value),"aria-label":"Language",className:" w-full px-3 py-2 rounded-md bg-gray-800 text-white border border-gray-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent text-sm ",children:b.map(e=>(0,r.jsx)("option",{value:e,children:y[e]},e))})}var w=n(38706),j=n(14362);function N(){let e=(0,w.T)("auth"),t=(0,j.m)(),[n,s]=(0,a.useState)(!1);if(!t)return null;async function l(){s(!0);try{await fetch("/api/auth/logout",{method:"POST"}),window.location.href="/login"}catch(e){window.location.href="/login"}}return(0,r.jsx)("button",{type:"button",onClick:l,disabled:n,"data-testid":"logout-button",className:" w-full px-3 py-2 text-sm text-left rounded-md text-gray-300 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:opacity-50 transition-colors ",children:n?"...":e("logout.button")})}var k=n(47712);let C={waiting:0,ready:1,running:2,generating:3,idle:4},S=(0,a.memo)(function(){let e=(0,o.useRouter)(),{worktrees:t,selectedWorktreeId:n,selectWorktree:l}=(0,i.Mu)(),{closeMobileDrawer:c,sortKey:d,sortDirection:x}=(0,s.Sz)(),[h,f]=(0,a.useState)(""),g=(0,a.useMemo)(()=>{let e=t.map(k.I_),n=e;if(h.trim()){let t=h.toLowerCase();n=e.filter(e=>e.name.toLowerCase().includes(t)||e.repositoryName.toLowerCase().includes(t))}return function(e,t,n){let r=[...e];return r.sort((e,r)=>{let a=0;switch(t){case"updatedAt":{let t=e=>e?e instanceof Date?e.getTime():new Date(e).getTime():0,n=t(e.lastActivity);a=t(r.lastActivity)-n;break}case"repositoryName":{let t=e.repositoryName.toLowerCase(),n=r.repositoryName.toLowerCase();a=t.localeCompare(n);break}case"branchName":{let t=e.name.toLowerCase(),n=r.name.toLowerCase();a=t.localeCompare(n);break}case"status":a=C[e.status]-C[r.status]}return("updatedAt"===t?"desc"===n:"asc"===n)?a:-a}),r}(n,d,x)},[t,h,d,x]),p=t=>{l(t),e.push("/worktrees/".concat(t)),c()};return(0,r.jsxs)("nav",{"data-testid":"sidebar","aria-label":"Branch navigation",className:"h-full flex flex-col bg-gray-900 text-white",role:"navigation",children:[(0,r.jsx)("div",{"data-testid":"sidebar-header",className:"flex-shrink-0 px-4 py-4 border-b border-gray-700",children:(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold text-white",children:"Branches"}),(0,r.jsx)(m,{})]})}),(0,r.jsx)("div",{className:"flex-shrink-0 px-4 py-3 border-b border-gray-700",children:(0,r.jsx)("input",{type:"text",placeholder:"Search branches...",value:h,onChange:e=>f(e.target.value),className:" w-full px-3 py-2 rounded-md bg-gray-800 text-white placeholder-gray-400 border border-gray-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent "})}),(0,r.jsx)("div",{"data-testid":"branch-list",className:"flex-1 overflow-y-auto",children:0===g.length?(0,r.jsx)("div",{className:"px-4 py-8 text-center text-gray-400",children:h?"No branches found":"No branches available"}):g.map(e=>(0,r.jsx)(u,{branch:e,isSelected:e.id===n,onClick:()=>p(e.id)},e.id))}),(0,r.jsxs)("div",{className:"flex-shrink-0 px-4 py-3 border-t border-gray-700 space-y-2",children:[(0,r.jsx)(v,{}),(0,r.jsx)(N,{})]})]})});var L=n(3468);let E="transform transition-transform duration-300 ease-out",z=(0,a.memo)(function(e){let{children:t}=e,{isOpen:n,isMobileDrawerOpen:a,closeMobileDrawer:o}=(0,s.Sz)();return(0,l.d)()?(0,r.jsxs)("div",{"data-testid":"app-shell",className:"h-screen flex flex-col",children:[a&&(0,r.jsx)("div",{"data-testid":"drawer-overlay",className:"fixed inset-0 bg-black/50 z-40",onClick:o,"aria-hidden":"true"}),(0,r.jsx)("aside",{"data-testid":"sidebar-container",className:"\n fixed left-0 top-0 h-full w-72 z-50\n ".concat(E,"\n ").concat(a?"translate-x-0":"-translate-x-full","\n "),role:"complementary",children:(0,r.jsx)(S,{})}),(0,r.jsx)("main",{className:"flex-1 min-h-0 overflow-hidden",role:"main",children:t})]}):(0,r.jsxs)("div",{"data-testid":"app-shell",className:"h-screen flex",children:[(0,r.jsx)("aside",{"data-testid":"sidebar-container",className:"\n fixed left-0 top-0 h-full w-72\n ".concat(E,"\n ").concat(n?"translate-x-0":"-translate-x-full","\n "),style:{zIndex:L.k.SIDEBAR},role:"complementary","aria-hidden":!n,children:(0,r.jsx)(S,{})}),(0,r.jsx)("main",{className:"\n flex-1 min-w-0 h-full overflow-hidden\n transition-[padding] duration-300 ease-out\n ".concat(n?"md:pl-72":"md:pl-0","\n "),role:"main",children:t})]})})},98702:function(e,t,n){n.d(t,{u:function(){return o}});var r=n(57437),a=n(2265),s=n(54887),l=n(3468);function o(e){let{isOpen:t,onClose:n,title:o,children:i,size:c="lg",showCloseButton:d=!0,disableClose:u=!1}=e,x=(0,a.useRef)(null);return((0,a.useEffect)(()=>{if(u)return;let e=e=>{"Escape"===e.key&&t&&n()};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[t,n,u]),(0,a.useEffect)(()=>(t?document.body.style.overflow="hidden":document.body.style.overflow="unset",()=>{document.body.style.overflow="unset"}),[t]),t)?(0,s.createPortal)((0,r.jsxs)("div",{className:"fixed inset-0 overflow-y-auto",style:{zIndex:l.k.MODAL},children:[(0,r.jsx)("div",{className:"fixed inset-0 bg-black bg-opacity-50 transition-opacity",onClick:u?void 0:n}),(0,r.jsx)("div",{className:"relative flex min-h-full items-center justify-center p-2 sm:p-4",children:(0,r.jsxs)("div",{ref:x,className:"relative w-full ".concat({sm:"max-w-[calc(100vw-2rem)] sm:max-w-md",md:"max-w-[calc(100vw-2rem)] sm:max-w-2xl",lg:"max-w-[calc(100vw-2rem)] sm:max-w-4xl",xl:"max-w-[calc(100vw-2rem)] sm:max-w-6xl",full:"max-w-[calc(100vw-2rem)] sm:max-w-[95vw]"}[c]," max-h-[calc(100vh-1rem)] sm:max-h-[calc(100vh-2rem)] flex flex-col bg-white rounded-lg shadow-xl transform transition-all"),children:[(o||d)&&(0,r.jsxs)("div",{className:"flex items-center justify-between px-4 sm:px-6 py-3 sm:py-4 border-b border-gray-200 flex-shrink-0",children:[(0,r.jsx)("h3",{className:"text-base sm:text-lg font-semibold text-gray-900 truncate pr-2",children:o}),d&&(0,r.jsx)("button",{onClick:n,className:"text-gray-400 hover:text-gray-600 transition-colors flex-shrink-0",children:(0,r.jsx)("svg",{className:"w-5 h-5 sm:w-6 sm:h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),(0,r.jsx)("div",{className:"px-4 sm:px-6 py-3 sm:py-4 overflow-y-auto flex-1 min-h-0",children:i})]})})]}),document.body):null}},10789:function(e,t,n){n.d(t,{Ct:function(){return c},zx:function(){return a},Zb:function(){return s},aY:function(){return i},Ol:function(){return l},ll:function(){return o},u_:function(){return d.u}});var r=n(57437);function a(e){let{variant:t="primary",size:n="md",fullWidth:a=!1,loading:s=!1,disabled:l,className:o="",children:i,...c}=e,d=["btn",{primary:"btn-primary",secondary:"btn-secondary",danger:"btn-danger",ghost:"bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-500"}[t],{sm:"btn-sm",md:"",lg:"btn-lg"}[n],a?"w-full":"",l||s?"opacity-50 cursor-not-allowed":"",o].filter(Boolean).join(" ");return(0,r.jsxs)("button",{className:d,disabled:l||s,...c,children:[s&&(0,r.jsxs)("svg",{className:"animate-spin -ml-1 mr-2 h-4 w-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[(0,r.jsx)("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),(0,r.jsx)("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),i]})}function s(e){let{hover:t=!1,padding:n="md",className:a="",children:s,...l}=e,o=["card",t?"card-hover":"",{none:"",sm:"p-3",md:"p-4",lg:"p-6"}[n],a].filter(Boolean).join(" ");return(0,r.jsx)("div",{className:o,...l,children:s})}function l(e){let{className:t="",children:n,...a}=e;return(0,r.jsx)("div",{className:"mb-3 ".concat(t),...a,children:n})}function o(e){let{className:t="",children:n,...a}=e;return(0,r.jsx)("h3",{className:"text-lg font-semibold text-gray-900 ".concat(t),...a,children:n})}function i(e){let{className:t="",children:n,...a}=e;return(0,r.jsx)("div",{className:t,...a,children:n})}function c(e){let{variant:t="gray",dot:n=!1,className:a="",children:s,...l}=e,o=["badge",{success:"badge-success",warning:"badge-warning",error:"badge-error",info:"badge-info",gray:"badge-gray"}[t],a].filter(Boolean).join(" ");return(0,r.jsxs)("span",{className:o,...l,children:[n&&(0,r.jsx)("span",{className:"mr-1.5 inline-block h-2 w-2 rounded-full ".concat({success:"bg-green-600",warning:"bg-yellow-600",error:"bg-red-600",info:"bg-blue-600",gray:"bg-gray-600"}[t]),"aria-hidden":"true"}),s]})}n(2265);var d=n(98702)},43616:function(e,t,n){n.d(t,{n:function(){return d}});var r=n(57437),a=n(2265),s=n(10789),l=n(20318),o=n(3227),i=n(32636),c=n(93448);function d(e){let{worktreeId:t}=e,[n,d]=(0,a.useState)([]),[u,x]=(0,a.useState)(null),[m,h]=(0,a.useState)(null),[f,g]=(0,a.useState)(!0),[p,b]=(0,a.useState)(null),[y,v]=(0,a.useState)(""),[w,j]=(0,a.useState)(0),[N,k]=(0,a.useState)("all"),[C,S]=(0,a.useState)(!1),{toasts:L,showToast:E,removeToast:z}=(0,l.pm)();(0,a.useEffect)(()=>{(async()=>{try{g(!0),b(null);let e=await o.Iv.getLogs(t);d(e)}catch(e){b((0,o.zG)(e))}finally{g(!1)}})()},[t]);let M=(0,a.useMemo)(()=>"all"===N?n:n.filter(e=>e.toLowerCase().includes(N)),[n,N]),T=async e=>{try{g(!0),b(null);let n=await o.Iv.getLogFile(t,e);h(n.content),x(e),v(""),j(0)}catch(e){b((0,o.zG)(e))}finally{g(!1)}},I=(0,a.useCallback)(async()=>{if(u)try{S(!0);let e=await o.Iv.getLogFile(t,u,{sanitize:!0});await (0,i.v)(e.content),E("Log copied to clipboard (sanitized)","success")}catch(e){E("Failed to export log: ".concat((0,o.zG)(e)),"error")}finally{S(!1)}},[t,u,E]),A=(0,a.useMemo)(()=>{let e;if(!y||!m)return[];let t=RegExp((0,c.hr)(y),"gi"),n=[];for(;null!==(e=t.exec(m));)n.push({index:e.index,length:e[0].length});return n},[y,m]);(0,a.useEffect)(()=>{j(0)},[y]);let D=()=>{A.length>0&&j(e=>(e+1)%A.length)},B=()=>{A.length>0&&j(e=>(e-1+A.length)%A.length)},R=(0,a.useMemo)(()=>{if(!m||!y||0===A.length)return m;let e="",t=0;return A.forEach((n,r)=>{e+=(0,c.Xv)(m.substring(t,n.index));let a=m.substring(n.index,n.index+n.length),s=r===w;e+='<mark class="'.concat(s?"bg-yellow-400 text-black":"bg-yellow-200 text-black",'" data-match-index="').concat(r,'">').concat((0,c.Xv)(a),"</mark>"),t=n.index+n.length}),e+=(0,c.Xv)(m.substring(t))},[m,y,A,w]);return(0,a.useEffect)(()=>{A.length>0&&w>=0&&setTimeout(()=>{let e=document.querySelector('mark[data-match-index="'.concat(w,'"]'));e&&e.scrollIntoView({behavior:"smooth",block:"center"})},100)},[w,A.length]),(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsxs)(s.Zb,{padding:"md",children:[(0,r.jsx)(s.Ol,{children:(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)(s.ll,{children:"Log Files"}),(0,r.jsx)(s.Ct,{variant:"gray",children:M.length})]}),(0,r.jsxs)("div",{className:"flex gap-2 flex-wrap",children:[(0,r.jsxs)(s.zx,{variant:"all"===N?"primary":"ghost",size:"sm",onClick:()=>k("all"),children:["All (",n.length,")"]}),(0,r.jsxs)(s.zx,{variant:"claude"===N?"primary":"ghost",size:"sm",onClick:()=>k("claude"),children:["Claude (",n.filter(e=>e.toLowerCase().includes("claude")).length,")"]}),(0,r.jsxs)(s.zx,{variant:"codex"===N?"primary":"ghost",size:"sm",onClick:()=>k("codex"),children:["Codex (",n.filter(e=>e.toLowerCase().includes("codex")).length,")"]}),(0,r.jsxs)(s.zx,{variant:"gemini"===N?"primary":"ghost",size:"sm",onClick:()=>k("gemini"),children:["Gemini (",n.filter(e=>e.toLowerCase().includes("gemini")).length,")"]})]})]})}),(0,r.jsxs)(s.aY,{children:[f&&0===n.length&&(0,r.jsx)("div",{className:"text-center py-4",children:(0,r.jsx)("div",{className:"inline-block animate-spin rounded-full h-6 w-6 border-4 border-gray-300 border-t-blue-600"})}),p&&(0,r.jsx)("div",{className:"p-3 bg-red-50 border border-red-200 rounded text-sm text-red-800",children:p}),!f&&0===M.length&&!p&&(0,r.jsx)("p",{className:"text-sm text-gray-600 text-center py-4",children:"all"===N?"No log files found":"No ".concat(N," log files found")}),M.length>0&&(0,r.jsx)("div",{className:"space-y-2",children:M.map(e=>(0,r.jsx)("button",{onClick:()=>T(e),className:"w-full text-left px-3 py-2 rounded text-sm font-mono transition-colors ".concat(u===e?"bg-blue-50 text-blue-700 border border-blue-200":"hover:bg-gray-50 border border-transparent"),children:e},e))})]})]}),u&&(0,r.jsxs)(s.Zb,{padding:"md",children:[(0,r.jsx)(s.Ol,{children:(0,r.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)(s.ll,{className:"font-mono text-base",children:u}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(s.zx,{variant:"ghost",size:"sm",onClick:I,disabled:!u||C,title:"Copy sanitized log to clipboard",children:C?"Exporting...":"Export"}),(0,r.jsx)(s.zx,{variant:"ghost",size:"sm",onClick:()=>{x(null),h(null),v(""),j(0)},children:"Close"})]})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsxs)("div",{className:"relative flex-1",children:[(0,r.jsx)("input",{type:"text",value:y,onChange:e=>v(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),e.shiftKey?B():D())},placeholder:"Search in log file...",className:"input w-full pr-20"}),A.length>0&&(0,r.jsxs)("div",{className:"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-500",children:[w+1," / ",A.length]})]}),A.length>0&&(0,r.jsxs)("div",{className:"flex gap-1",children:[(0,r.jsx)(s.zx,{variant:"ghost",size:"sm",onClick:B,disabled:0===A.length,title:"Previous match (Shift+Enter)",children:"↑"}),(0,r.jsx)(s.zx,{variant:"ghost",size:"sm",onClick:D,disabled:0===A.length,title:"Next match (Enter)",children:"↓"})]})]})]})}),(0,r.jsxs)(s.aY,{children:[f&&(0,r.jsx)("div",{className:"text-center py-8",children:(0,r.jsx)("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-gray-300 border-t-blue-600"})}),!f&&m&&(0,r.jsx)("div",{className:"bg-gray-900 text-gray-100 rounded p-4 overflow-x-auto max-h-[500px] scrollbar-thin",children:y&&A.length>0?(0,r.jsx)("pre",{className:"text-xs font-mono whitespace-pre-wrap",dangerouslySetInnerHTML:{__html:R||""}}):(0,r.jsx)("pre",{className:"text-xs font-mono whitespace-pre-wrap",children:m})}),!f&&y&&0===A.length&&m&&(0,r.jsxs)("div",{className:"text-center py-4 text-sm text-gray-500",children:['No matches found for "',y,'"']})]})]}),(0,r.jsx)(l.Ix,{toasts:L,onClose:z})]})}},6940:function(e,t,n){n.d(t,{R:function(){return x}});var r=n(57437),a=n(2265),s=n(3227);function l(e,t){if(!t.trim())return e;let n=t.toLowerCase();return e.map(e=>({...e,commands:e.commands.filter(e=>{let t=e.name.toLowerCase().includes(n),r=e.description.toLowerCase().includes(n);return t||r})})).filter(e=>e.commands.length>0)}function o(e){let{groups:t,onSelect:n,highlightedIndex:a=-1,className:s=""}=e,l=0;return 0===t.length?(0,r.jsx)("div",{className:"text-sm text-gray-500 p-4 text-center ".concat(s),children:"No commands available"}):(0,r.jsx)("div",{className:"overflow-y-auto ".concat(s),children:t.map(e=>(0,r.jsxs)("div",{className:"mb-2",children:[(0,r.jsx)("div",{className:"px-3 py-1.5 text-xs font-semibold text-gray-500 uppercase tracking-wider bg-gray-50",children:e.label}),(0,r.jsx)("div",{children:e.commands.map(e=>{let t=l;l++;let s=t===a;return(0,r.jsxs)("button",{type:"button","data-command-item":!0,"data-highlighted":s,onClick:()=>n(e),className:"w-full px-3 py-2 text-left flex items-start gap-2 hover:bg-blue-50 transition-colors ".concat(s?"bg-blue-100":""),children:[(0,r.jsxs)("span",{className:"text-blue-600 font-mono text-sm flex-shrink-0",children:["/",e.name]}),(0,r.jsx)("span",{className:"text-gray-600 text-sm truncate",children:e.description})]},e.name)})})]},e.category))})}function i(e){let{isOpen:t,groups:n,onSelect:s,onClose:i,isMobile:c=!1,position:d,onFreeInput:u}=e,[x,m]=(0,a.useState)(""),[h,f]=(0,a.useState)(0),g=(0,a.useRef)(null),p=(0,a.useMemo)(()=>l(n,x),[n,x]),b=(0,a.useMemo)(()=>p.flatMap(e=>e.commands),[p]);(0,a.useEffect)(()=>{t&&(m(""),f(0),setTimeout(()=>{var e;null===(e=g.current)||void 0===e||e.focus()},50))},[t]);let y=(0,a.useCallback)(e=>{s(e),i()},[s,i]),v=(0,a.useCallback)(e=>{if(t)switch(e.key){case"Escape":e.preventDefault(),i();break;case"ArrowDown":e.preventDefault(),f(e=>Math.min(e+1,b.length-1));break;case"ArrowUp":e.preventDefault(),f(e=>Math.max(e-1,0));break;case"Enter":e.preventDefault(),b[h]&&y(b[h])}},[t,b,h,i,y]);return((0,a.useEffect)(()=>{if(t)return document.addEventListener("keydown",v),()=>{document.removeEventListener("keydown",v)}},[t,v]),t)?c?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"fixed inset-0 bg-black/50 z-40",onClick:i,"aria-hidden":"true"}),(0,r.jsxs)("div",{"data-testid":"slash-command-bottom-sheet",className:"fixed bottom-0 left-0 right-0 bg-white rounded-t-xl z-50 max-h-[70vh] flex flex-col shadow-xl",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-gray-200",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:"Commands"}),(0,r.jsx)("button",{type:"button",onClick:i,"aria-label":"Close",className:"p-2 rounded-full hover:bg-gray-100",children:(0,r.jsx)("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),(0,r.jsx)("div",{className:"px-4 py-2 border-b border-gray-100",children:(0,r.jsx)("input",{ref:g,type:"text",value:x,onChange:e=>m(e.target.value),placeholder:"Search commands...",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"})}),u&&(0,r.jsxs)("button",{type:"button","data-testid":"free-input-button",onClick:()=>u(x),className:"w-full px-4 py-3 text-left border-b border-gray-100 flex items-center gap-2 hover:bg-blue-50 transition-colors",children:[(0,r.jsx)("span",{className:"text-blue-600",children:(0,r.jsx)("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"})})}),(0,r.jsx)("span",{className:"text-gray-600",children:"Enter custom command..."})]}),(0,r.jsx)(o,{groups:p,onSelect:y,highlightedIndex:h,className:"flex-1 overflow-y-auto pb-20"})]})]}):(0,r.jsxs)("div",{role:"listbox",className:"absolute bg-white border border-gray-200 rounded-lg shadow-lg z-50 w-80 max-h-96 flex flex-col",style:d?{top:d.top,left:d.left}:{bottom:"100%",left:0,marginBottom:"4px"},children:[(0,r.jsx)("div",{className:"px-3 py-2 border-b border-gray-100",children:(0,r.jsx)("input",{ref:g,type:"text",value:x,onChange:e=>m(e.target.value),placeholder:"Search commands...",className:"w-full px-3 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-blue-500"})}),u&&(0,r.jsxs)("button",{type:"button","data-testid":"free-input-button",onClick:()=>u(x),className:"w-full px-3 py-2 text-left border-b border-gray-100 flex items-center gap-2 hover:bg-blue-50 transition-colors text-sm",children:[(0,r.jsx)("span",{className:"text-blue-600",children:(0,r.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"})})}),(0,r.jsx)("span",{className:"text-gray-600",children:"Enter custom command..."})]}),(0,r.jsx)(o,{groups:p,onSelect:y,highlightedIndex:h,className:"flex-1 overflow-y-auto"}),(0,r.jsxs)("div",{className:"px-3 py-1.5 border-t border-gray-100 text-xs text-gray-400 flex gap-3",children:[(0,r.jsxs)("span",{children:[(0,r.jsx)("kbd",{className:"px-1 py-0.5 bg-gray-100 rounded",children:"Enter"})," select"]}),(0,r.jsxs)("span",{children:[(0,r.jsx)("kbd",{className:"px-1 py-0.5 bg-gray-100 rounded",children:"Esc"})," close"]})]})]}):null}function c(e){let{worktreeId:t,cliToolId:n,disabled:s=!1,onInterrupt:l}=e,[o,i]=(0,a.useState)(!1),c=(0,a.useRef)(0),u=(0,a.useCallback)(async()=>{let e=Date.now();if(!(e-c.current<1e3)){c.current=e,i(!0);try{let e=await fetch("/api/worktrees/".concat(t,"/interrupt"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cliToolId:n})});if(e.ok)null==l||l();else{let t=await e.json().catch(()=>({}));console.error("[InterruptButton] Failed to send interrupt:",t.error||e.statusText)}}catch(e){console.error("[InterruptButton] Error sending interrupt:",e)}finally{i(!1)}}},[t,n,l]);return(0,r.jsx)("button",{type:"button",onClick:u,disabled:s||o,className:"flex-shrink-0 p-2 text-orange-600 hover:bg-orange-50 rounded-full transition-colors disabled:text-gray-300 disabled:hover:bg-transparent","aria-label":"Stop processing","data-testid":"interrupt-button",children:o?(0,r.jsxs)("svg",{className:"animate-spin h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[(0,r.jsx)("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),(0,r.jsx)("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}):(0,r.jsx)(d,{})})}function d(){return(0,r.jsx)("svg",{className:"h-5 w-5",fill:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("rect",{x:"6",y:"6",width:"12",height:"12",rx:"2"})})}var u=n(58819);function x(e){let{worktreeId:t,onMessageSent:n,cliToolId:o,isSessionRunning:d=!1}=e,[x,m]=(0,a.useState)(""),[h,f]=(0,a.useState)(!1),[g,p]=(0,a.useState)(null),[b,y]=(0,a.useState)(!1),[v,w]=(0,a.useState)(!1),[j,N]=(0,a.useState)(!1),k=(0,a.useRef)(null),C=(0,a.useRef)(null),S=(0,a.useRef)(!1),L=(0,a.useRef)(null),E=(0,u.d)(),{groups:z}=function(e,t){let[n,r]=(0,a.useState)([]),[o,i]=(0,a.useState)(!0),[c,d]=(0,a.useState)(null),[u,x]=(0,a.useState)(""),[m,h]=(0,a.useState)(t||"claude"),f=(0,a.useCallback)(async()=>{try{i(!0),d(null);let n=e?"/api/worktrees/".concat(e,"/slash-commands"):"/api/slash-commands";t&&(n+="?cliTool=".concat(t));let a=await fetch(n);if(!a.ok)throw Error("HTTP error ".concat(a.status));let s=await a.json();r(s.groups),h(s.cliTool||t||"claude")}catch(e){d((0,s.zG)(e)),r([])}finally{i(!1)}},[e,t]);(0,a.useEffect)(()=>{f()},[f]);let g=(0,a.useMemo)(()=>n.flatMap(e=>e.commands),[n]),p=(0,a.useMemo)(()=>l(n,u),[n,u]);return{groups:n,filteredGroups:p,allCommands:g,loading:o,error:c,filter:u,setFilter:x,refresh:(0,a.useCallback)(()=>{f()},[f]),cliTool:m}}(t,o);(0,a.useEffect)(()=>{let e=k.current;e&&(x?(e.style.height="auto",e.style.height="".concat(Math.min(e.scrollHeight,160),"px")):e.style.height="24px")},[x]);let M=async()=>{if(!b&&x.trim()&&!h)try{f(!0),p(null);let e=o||"claude";await s.Iv.sendMessage(t,x.trim(),e),m(""),N(!1),null==n||n(e)}catch(e){p((0,s.zG)(e))}finally{f(!1)}},T=async e=>{e.preventDefault(),await M()},I=()=>{var e;w(!1),N(!1),null===(e=k.current)||void 0===e||e.focus()};return(0,r.jsxs)("div",{ref:L,className:"space-y-2 relative",children:[g&&(0,r.jsx)("div",{className:"p-2 bg-red-50 border border-red-200 rounded text-sm text-red-800",children:g}),(0,r.jsxs)("form",{onSubmit:T,className:"flex items-end gap-2 bg-white border border-gray-300 rounded-lg px-4 py-2 focus-within:border-blue-500 focus-within:ring-1 focus-within:ring-blue-500",children:[E&&(0,r.jsx)("button",{type:"button",onClick:()=>{j&&N(!1),w(!0)},className:"flex-shrink-0 p-2 text-gray-500 hover:text-blue-600 hover:bg-blue-50 rounded-full transition-colors","aria-label":"Show slash commands","data-testid":"mobile-command-button",children:(0,r.jsx)("svg",{className:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M7 20l4-16m2 16l4-16M6 9h14M4 15h14"})})}),(0,r.jsx)("textarea",{ref:k,value:x,onChange:e=>{let t=e.target.value;if(m(t),""===t){N(!1),w(!1);return}j||("/"===t||t.startsWith("/")&&!t.includes(" ")?w(!0):w(!1))},onKeyDown:e=>{let{keyCode:t}=e.nativeEvent;if(229!==t){if("Escape"===e.key&&v){e.preventDefault(),I();return}if(S.current&&"Enter"===e.key){S.current=!1;return}if("Enter"===e.key&&!b&&(!v||j)){if(E)return;e.shiftKey||(e.preventDefault(),M())}}},onCompositionStart:()=>{y(!0),S.current=!1,C.current&&clearTimeout(C.current)},onCompositionEnd:()=>{y(!1),S.current=!0,C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{S.current=!1},300)},placeholder:E?"Type your message...":"Type your message... (/ for commands, Shift+Enter for line break)",disabled:h,rows:1,className:"flex-1 outline-none bg-transparent resize-none py-1 overflow-y-auto scrollbar-thin",style:{minHeight:"24px",maxHeight:"160px"}}),(0,r.jsx)(c,{worktreeId:t,cliToolId:o||"claude",disabled:!d}),(0,r.jsx)("button",{type:"submit",disabled:!x.trim()||h,className:"flex-shrink-0 p-2 text-blue-600 hover:bg-blue-50 rounded-full transition-colors disabled:text-gray-300 disabled:hover:bg-transparent","aria-label":"Send message",children:h?(0,r.jsxs)("svg",{className:"animate-spin h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[(0,r.jsx)("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),(0,r.jsx)("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}):(0,r.jsx)("svg",{className:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 19l9 2-9-18-9 18 9-2zm0 0v-8"})})})]}),(0,r.jsx)(i,{isOpen:v,groups:z,onSelect:e=>{var t;m("/".concat(e.name," ")),w(!1),null===(t=k.current)||void 0===t||t.focus()},onClose:I,isMobile:E,onFreeInput:e=>{w(!1),N(!0),m(e?"/".concat(e):"/"),setTimeout(()=>{var e;null===(e=k.current)||void 0===e||e.focus()},50)}})]})}},8672:function(e,t,n){n.d(t,{F4:function(){return i},Ie:function(){return d},xh:function(){return c}});let r="bg-gray-500",a="bg-green-500",s="border-blue-500",l="bg-yellow-500",o="bg-red-500",i={idle:{className:r,label:"Idle",type:"dot"},ready:{className:a,label:"Ready",type:"dot"},running:{className:s,label:"Running",type:"spinner"},waiting:{className:l,label:"Waiting for response",type:"dot"},generating:{className:s,label:"Generating",type:"spinner"}},c={idle:{className:r,label:"Idle",type:"dot"},ready:{className:a,label:"Ready",type:"dot"},running:{className:s,label:"Running",type:"spinner"},waiting:{className:l,label:"Waiting for response",type:"dot"},error:{className:o,label:"Error",type:"dot"}},d={idle:{className:r,label:"Idle - No active session",type:"dot"},ready:{className:a,label:"Ready - Waiting for input",type:"dot"},running:{className:s,label:"Running - Processing",type:"spinner"},waiting:{className:l,label:"Waiting - User input required",type:"dot"},error:{className:o,label:"Error",type:"dot"}}},3468:function(e,t,n){n.d(t,{k:function(){return r}});let r={DROPDOWN:10,SIDEBAR:30,MODAL:50,MAXIMIZED_EDITOR:55,TOAST:60,CONTEXT_MENU:70}},58819:function(e,t,n){n.d(t,{G:function(){return a},d:function(){return s}});var r=n(2265);let a=768;function s(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{breakpoint:t=a}=e,[n,s]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let e=()=>window.innerWidth<t;s(e());let n=()=>{s(e())};return window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[t]),n}},32636:function(e,t,n){n.d(t,{v:function(){return a}});let r=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;async function a(e){if(!e||0===e.trim().length)return;let t=e.replace(r,"");await navigator.clipboard.writeText(t)}},98408:function(e,t,n){n.d(t,{G:function(){return l}});var r=n(69073),a=n(8854);let s={en:a._,ja:r.ja};function l(e){var t;return null!==(t=s[e])&&void 0!==t?t:a._}},93448:function(e,t,n){function r(e,t){let n=null;return function(){for(var r=arguments.length,a=Array(r),s=0;s<r;s++)a[s]=arguments[s];n&&clearTimeout(n),n=setTimeout(()=>{e(...a),n=null},t)}}function a(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function s(e){let t=new Set;for(let n of e){t.add(n);let e=n.split("/"),r="";for(let n=0;n<e.length-1;n++)r=r?"".concat(r,"/").concat(e[n]):e[n],t.add(r)}return t}function l(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:30;return e.length<=t?e:"".concat(e.substring(0,t-3),"...")}function o(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{Ds:function(){return r},Ps:function(){return s},Xv:function(){return o},aS:function(){return l},hr:function(){return a}})},47712:function(e,t,n){function r(e){return e?e.isWaitingForResponse?"waiting":e.isProcessing?"running":e.isRunning?"ready":"idle":"idle"}function a(e){var t,n;let a=!!e.lastAssistantMessageAt&&(!e.lastViewedAt||new Date(e.lastAssistantMessageAt)>new Date(e.lastViewedAt));return{id:e.id,name:e.name,repositoryName:e.repositoryName,status:"idle",hasUnread:a,lastActivity:e.updatedAt,description:e.description,cliStatus:{claude:r(null===(t=e.sessionStatusByCli)||void 0===t?void 0:t.claude),codex:r(null===(n=e.sessionStatusByCli)||void 0===n?void 0:n.codex)}}}n.d(t,{He:function(){return r},I_:function(){return a}})}}]);
|