@loicngr/kobo 1.11.11 → 1.11.13
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/CHANGELOG.md +8 -0
- package/dist/server/services/agent/engines/claude-code/engine.js +89 -9
- package/dist/server/services/agent/engines/claude-code/event-mapper.js +6 -4
- package/dist/server/services/agent/engines/codex/engine.js +121 -8
- package/dist/server/services/agent/engines/codex/event-mapper.js +3 -1
- package/package.json +1 -1
- package/src/client/dist/pwa/assets/{ActivityFeed-BNDQPIiW.js → ActivityFeed-Ds8cAMNc.js} +1 -1
- package/src/client/dist/pwa/assets/{ChangelogPage-DWeiMCL1.js → ChangelogPage-DO6DNO4Q.js} +1 -1
- package/src/client/dist/pwa/assets/{ClosePopup-Bl8KdN_j.js → ClosePopup-DuAqn8Pb.js} +1 -1
- package/src/client/dist/pwa/assets/CreatePage-BnMSo_79.js +2 -0
- package/src/client/dist/pwa/assets/CreatePage-CV_RpAuV.css +1 -0
- package/src/client/dist/pwa/assets/{DiffViewer-BwfYKTny.js → DiffViewer-CMnFGReI.js} +3 -3
- package/src/client/dist/pwa/assets/{HealthPage-zm1qy4bo.js → HealthPage-BRAxQKSP.js} +1 -1
- package/src/client/dist/pwa/assets/{MainLayout-BDVUkruC.js → MainLayout-BN1ug95K.js} +2 -2
- package/src/client/dist/pwa/assets/{QBtnToggle-BKZW3k57.js → QBtnToggle-DsCDNQzX.js} +1 -1
- package/src/client/dist/pwa/assets/{QChip-CMB-IbQd.js → QChip-DWGDTZnX.js} +1 -1
- package/src/client/dist/pwa/assets/{QSelect-DCm1FiOk.js → QSelect-8Ip46vhk.js} +1 -1
- package/src/client/dist/pwa/assets/{QTooltip-8fQLc_4N.js → QTooltip-Bz4g3bmr.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-B-prQgu3.js → SearchPage-BD53VJEr.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-CbasGyLP.js → SettingsPage-3rYdJZga.js} +1 -1
- package/src/client/dist/pwa/assets/{TouchPan-CmmS3gg6.js → TouchPan-BKu8V4eN.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspacePage-B9I2mQJE.js → WorkspacePage-CbC_t5Rx.js} +3 -3
- package/src/client/dist/pwa/assets/{cssMode-B4oUyX4f.js → cssMode-vaMVESGy.js} +1 -1
- package/src/client/dist/pwa/assets/{documents-UdlveYUp.js → documents-CyKQ9lT6.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-ByJzr33G.js → editor.api-CH3dhpKq.js} +1 -1
- package/src/client/dist/pwa/assets/{expand-template-zfuUsWH3.js → expand-template-DQQQftsk.js} +1 -1
- package/src/client/dist/pwa/assets/{freemarker2-DurjKE7N.js → freemarker2-deLpERsj.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-gwHbbDT2.js → handlebars-DdjS05Tc.js} +1 -1
- package/src/client/dist/pwa/assets/{html-DDNV7Gkm.js → html-pK1ZEFvP.js} +1 -1
- package/src/client/dist/pwa/assets/{htmlMode-BxdPTVhK.js → htmlMode-DJFDI9Ru.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-CK38o-IF.js +1 -0
- package/src/client/dist/pwa/assets/{index-M0ntkdkQ.js → index-B_OmZ65F.js} +2 -2
- package/src/client/dist/pwa/assets/{javascript-Dp0eAm2m.js → javascript-DbuFfxco.js} +1 -1
- package/src/client/dist/pwa/assets/{jsonMode-DLllFEMT.js → jsonMode-B0Fu8Dcc.js} +1 -1
- package/src/client/dist/pwa/assets/{kobo-commands-So0Do2g1.js → kobo-commands-rb43ZeWG.js} +1 -1
- package/src/client/dist/pwa/assets/{layout-CfEpJmm_.js → layout-tAFrvQ5V.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-BVwIeblL.js → liquid-DqDIKOCy.js} +1 -1
- package/src/client/dist/pwa/assets/{lspLanguageFeatures-CExl7Xgb.js → lspLanguageFeatures-CVcEibfJ.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-ydpr14Ec.js → mdx-Bs4CovhI.js} +1 -1
- package/src/client/dist/pwa/assets/{network-auth-CxxR2FZL.js → network-auth-DYrrh7Zr.js} +1 -1
- package/src/client/dist/pwa/assets/{pending-diff-open-BqHyeaCb.js → pending-diff-open-D1IYH8Pd.js} +1 -1
- package/src/client/dist/pwa/assets/{project-color-Dl2gXBlN.js → project-color-DO6uj29M.js} +1 -1
- package/src/client/dist/pwa/assets/{python-BParijRW.js → python-BJoP0uN-.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-DmywR0-y.js → razor-cwD-YBcr.js} +1 -1
- package/src/client/dist/pwa/assets/{render-chat-markdown-BQBEE7Bn.js → render-chat-markdown-DZnIueUV.js} +1 -1
- package/src/client/dist/pwa/assets/{tsMode-C51hBxK8.js → tsMode-of3oS9sU.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-C9LzA9s6.js → typescript-BTWMoUxn.js} +1 -1
- package/src/client/dist/pwa/assets/{use-onboarding--VIOMbMd.js → use-onboarding-BTFkRBjE.js} +1 -1
- package/src/client/dist/pwa/assets/{use-quasar-B6Aitpct.js → use-quasar-C1RCDSb6.js} +1 -1
- package/src/client/dist/pwa/assets/{vs-BJBy3q9a.js → vs-DDeaNKsH.js} +3 -3
- package/src/client/dist/pwa/assets/{workers-B89GKCYK.js → workers-DQnKuGcq.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-C2D1fXDa.js → xml-RglGWD_3.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-8QFrUEL6.js → yaml-CSqGQpai.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/CreatePage-QwtfYunr.css +0 -1
- package/src/client/dist/pwa/assets/CreatePage-qCRXIoz-.js +0 -2
- package/src/client/dist/pwa/assets/i18n-Z1bkxUCG.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@ All notable changes to Kōbō are documented here. The format is based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/). Each release is an `## <version>`
|
|
5
5
|
section — the in-app "What's new" dialog reads this file.
|
|
6
6
|
|
|
7
|
+
## 1.11.13
|
|
8
|
+
|
|
9
|
+
- fix(engines): unstick agent sessions that never emit session:ended
|
|
10
|
+
|
|
11
|
+
## 1.11.12
|
|
12
|
+
|
|
13
|
+
- ✨ develop - feat(engines): Garder les sessions ouvertes pour les subagents en arrière-plan
|
|
14
|
+
|
|
7
15
|
## 1.11.11
|
|
8
16
|
|
|
9
17
|
- feat(settings): add ECC as a skill suite option (#27)
|
|
@@ -20,6 +20,12 @@ const RESULT_DRAIN_TIMEOUT_MS = 15_000;
|
|
|
20
20
|
// without producing a result message. Keep a separate, conservative guard for
|
|
21
21
|
// that shape; active tool/message traffic always cancels and re-arms it.
|
|
22
22
|
const TEXT_IDLE_TIMEOUT_MS = 120_000;
|
|
23
|
+
// Safety net for a subagent whose terminal `task_notification` carries a
|
|
24
|
+
// status outside the mapper's known-terminal set (SDK schema drift) — it
|
|
25
|
+
// never clears `activeSubagentToolCallIds`, which otherwise blocks
|
|
26
|
+
// `inputStream.close()`/the result-drain watchdog forever. Generous window:
|
|
27
|
+
// legitimate subagents can run for several minutes.
|
|
28
|
+
const SUBAGENT_STALL_TIMEOUT_MS = 10 * 60_000;
|
|
23
29
|
const MAX_PENDING_USER_MESSAGES = 20;
|
|
24
30
|
function toMcpServersMap(specs) {
|
|
25
31
|
if (!specs || specs.length === 0)
|
|
@@ -91,6 +97,7 @@ export function createClaudeCodeEngine() {
|
|
|
91
97
|
async start(options, onEvent) {
|
|
92
98
|
const abortController = new AbortController();
|
|
93
99
|
const mapperState = createMapperState();
|
|
100
|
+
const activeSubagentToolCallIds = new Set();
|
|
94
101
|
// Pending canUseTool callbacks, keyed by SDK ctx.toolUseID.
|
|
95
102
|
const pendingResolvers = new Map();
|
|
96
103
|
const isInteractive = options.agentPermissionMode === 'interactive';
|
|
@@ -239,8 +246,11 @@ export function createClaudeCodeEngine() {
|
|
|
239
246
|
// near-instantly. If it stays parked (a hung subagent task or stuck
|
|
240
247
|
// teardown), the `for await` below would wait forever — `session:ended`
|
|
241
248
|
// would never fire, freezing the orchestrator and the auto-loop. Once a
|
|
242
|
-
// `result` is observed
|
|
243
|
-
// with the result's own outcome,
|
|
249
|
+
// `result` is observed with no background subagent still running, we arm
|
|
250
|
+
// a timer that force-emits `session:ended` with the result's own outcome,
|
|
251
|
+
// then aborts the generator best-effort. A result emitted while a
|
|
252
|
+
// background subagent is active is not terminal: the SDK can still emit
|
|
253
|
+
// its task notification and an automatic continuation turn.
|
|
244
254
|
let resultDrainTimer;
|
|
245
255
|
let textIdleTimer;
|
|
246
256
|
const clearTextIdleWatchdog = () => {
|
|
@@ -270,20 +280,69 @@ export function createClaudeCodeEngine() {
|
|
|
270
280
|
console.warn(`[claude-engine] SDK generator still open ${RESULT_DRAIN_TIMEOUT_MS}ms after 'result' — forcing session:ended`);
|
|
271
281
|
const reason = userInterrupted ? 'killed' : mapperState.sawErrorResult ? 'error' : 'completed';
|
|
272
282
|
emitSessionEnded(reason, reason === 'completed' ? 0 : null);
|
|
273
|
-
// A wakeup starts a new turn later; it cannot safely keep this SDK
|
|
274
|
-
// stream alive after Kōbō has emitted session:ended and detached its
|
|
275
|
-
// controller. Leaving it alive lets late hooks issue AskUserQuestion
|
|
276
|
-
// calls against a closed input stream, producing an unanswerable UI
|
|
277
|
-
// card followed by "Stream closed". Abort deterministically instead.
|
|
278
283
|
abortController.abort();
|
|
279
284
|
}, RESULT_DRAIN_TIMEOUT_MS);
|
|
280
285
|
resultDrainTimer.unref?.();
|
|
281
286
|
};
|
|
287
|
+
// Safety net for the "waiting on a background subagent" branch below:
|
|
288
|
+
// if `activeSubagentToolCallIds` never empties (a missed/unrecognised
|
|
289
|
+
// terminal notification), the workspace would otherwise stay `executing`
|
|
290
|
+
// forever. Force the drain through once this fires.
|
|
291
|
+
let subagentStallTimer;
|
|
292
|
+
const clearSubagentStallWatchdog = () => {
|
|
293
|
+
if (!subagentStallTimer)
|
|
294
|
+
return;
|
|
295
|
+
clearTimeout(subagentStallTimer);
|
|
296
|
+
subagentStallTimer = undefined;
|
|
297
|
+
};
|
|
298
|
+
// Re-armed (not merely armed-once) on every qualifying `result` so the
|
|
299
|
+
// deadline tracks the last observed activity, matching the warning
|
|
300
|
+
// message below — a long chain of legitimate subagent-backed turns
|
|
301
|
+
// must not be cut off just because 10 minutes have passed in total.
|
|
302
|
+
const armSubagentStallWatchdog = () => {
|
|
303
|
+
clearSubagentStallWatchdog();
|
|
304
|
+
subagentStallTimer = setTimeout(() => {
|
|
305
|
+
subagentStallTimer = undefined;
|
|
306
|
+
// A message queued between arming and firing means a new turn is
|
|
307
|
+
// about to start on this same stream — don't discard the subagent
|
|
308
|
+
// tracking or force-close under it; the next 'result' re-evaluates.
|
|
309
|
+
if (inputStream.hasUnansweredInput(completedResponses))
|
|
310
|
+
return;
|
|
311
|
+
console.warn(`[claude-engine] Subagent(s) still tracked active ${SUBAGENT_STALL_TIMEOUT_MS}ms after the last turn ended — forcing session drain.`);
|
|
312
|
+
activeSubagentToolCallIds.clear();
|
|
313
|
+
// This is a forced, unclean termination (the subagent may still be
|
|
314
|
+
// alive server-side) — never report it as a normal completion, so
|
|
315
|
+
// auto-loop doesn't treat an orphaned run as forward progress.
|
|
316
|
+
mapperState.sawErrorResult = true;
|
|
317
|
+
inputStream.close();
|
|
318
|
+
armResultDrainWatchdog();
|
|
319
|
+
}, SUBAGENT_STALL_TIMEOUT_MS);
|
|
320
|
+
subagentStallTimer.unref?.();
|
|
321
|
+
};
|
|
282
322
|
const iteratorPromise = (async () => {
|
|
283
323
|
iteratorRunning = true;
|
|
284
324
|
try {
|
|
285
325
|
for await (const msg of q) {
|
|
286
326
|
const events = mapSdkMessage(msg, mapperState);
|
|
327
|
+
for (const ev of events) {
|
|
328
|
+
if (ev.kind !== 'subagent:progress')
|
|
329
|
+
continue;
|
|
330
|
+
if (ev.status === 'running')
|
|
331
|
+
activeSubagentToolCallIds.add(ev.toolCallId);
|
|
332
|
+
else
|
|
333
|
+
activeSubagentToolCallIds.delete(ev.toolCallId);
|
|
334
|
+
}
|
|
335
|
+
// The stall watchdog is only armed while we're waiting purely on
|
|
336
|
+
// background subagents (no further SDK turn expected unless one
|
|
337
|
+
// reports done). React the moment the last one clears instead of
|
|
338
|
+
// waiting for a 'result' message that may never come.
|
|
339
|
+
if (subagentStallTimer &&
|
|
340
|
+
activeSubagentToolCallIds.size === 0 &&
|
|
341
|
+
!inputStream.hasUnansweredInput(completedResponses)) {
|
|
342
|
+
clearSubagentStallWatchdog();
|
|
343
|
+
inputStream.close();
|
|
344
|
+
armResultDrainWatchdog();
|
|
345
|
+
}
|
|
287
346
|
for (const ev of events) {
|
|
288
347
|
if (ev.kind === 'session:started')
|
|
289
348
|
discoveredSessionId = ev.engineSessionId;
|
|
@@ -301,8 +360,14 @@ export function createClaudeCodeEngine() {
|
|
|
301
360
|
completedResponses++;
|
|
302
361
|
// A queued forced message starts the next response on this same SDK stream.
|
|
303
362
|
if (!inputStream.hasUnansweredInput(completedResponses)) {
|
|
304
|
-
|
|
305
|
-
|
|
363
|
+
if (activeSubagentToolCallIds.size === 0) {
|
|
364
|
+
clearSubagentStallWatchdog();
|
|
365
|
+
inputStream.close();
|
|
366
|
+
armResultDrainWatchdog();
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
armSubagentStallWatchdog();
|
|
370
|
+
}
|
|
306
371
|
}
|
|
307
372
|
}
|
|
308
373
|
}
|
|
@@ -347,6 +412,7 @@ export function createClaudeCodeEngine() {
|
|
|
347
412
|
resultDrainTimer = undefined;
|
|
348
413
|
}
|
|
349
414
|
clearTextIdleWatchdog();
|
|
415
|
+
clearSubagentStallWatchdog();
|
|
350
416
|
// Drain any callback still pending (SDK terminated while awaiting an
|
|
351
417
|
// answer). canUseTool's abort path covers signalled stops; this
|
|
352
418
|
// covers natural iterator completion.
|
|
@@ -384,6 +450,20 @@ export function createClaudeCodeEngine() {
|
|
|
384
450
|
// subtype `error_during_execution` through the normal iterator —
|
|
385
451
|
// the mapper needs this flag to treat it as a clean stop.
|
|
386
452
|
mapperState.userInterrupted = true;
|
|
453
|
+
// The soft interrupt below only ends the foreground turn — a
|
|
454
|
+
// background subagent task keeps running unless told to stop via
|
|
455
|
+
// its own API, which would otherwise leave the Stop button
|
|
456
|
+
// appearing to do nothing for up to SUBAGENT_STALL_TIMEOUT_MS.
|
|
457
|
+
for (const taskId of activeSubagentToolCallIds) {
|
|
458
|
+
try {
|
|
459
|
+
void q.stopTask(taskId).catch(() => {
|
|
460
|
+
/* best-effort */
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
/* best-effort */
|
|
465
|
+
}
|
|
466
|
+
}
|
|
387
467
|
const qq = q;
|
|
388
468
|
if (typeof qq.interrupt === 'function') {
|
|
389
469
|
try {
|
|
@@ -195,10 +195,12 @@ export function mapSdkMessage(msg, state) {
|
|
|
195
195
|
const toolCallId = typeof parsed.tool_use_id === 'string' ? parsed.tool_use_id : undefined;
|
|
196
196
|
if (toolCallId) {
|
|
197
197
|
const usage = parsed.usage;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
198
|
+
// Unlike task_started/task_progress (in-flight signals), task_notification
|
|
199
|
+
// is only ever emitted once a task settles — its `status` value is a
|
|
200
|
+
// reason, not a liveness signal. Treat every task_notification as
|
|
201
|
+
// terminal instead of matching against a status whitelist, so an SDK
|
|
202
|
+
// status value added later doesn't leave the subagent stuck 'running'.
|
|
203
|
+
const isDone = subtype === 'task_notification';
|
|
202
204
|
events.push({
|
|
203
205
|
kind: 'subagent:progress',
|
|
204
206
|
toolCallId,
|
|
@@ -11,6 +11,13 @@ import { createTurnLiveness } from './turn-liveness.js';
|
|
|
11
11
|
/** Long enough for normal tool work, short enough to recover a lost turn event. */
|
|
12
12
|
export const CODEX_TURN_IDLE_TIMEOUT_MS = 120_000;
|
|
13
13
|
export const CODEX_GRACEFUL_INTERRUPT_TIMEOUT_MS = 3_000;
|
|
14
|
+
// Safety net while `turnLiveness` is paused for background subagents: that
|
|
15
|
+
// pause is deliberately unbounded (a legitimate subagent can run long), but
|
|
16
|
+
// if a thread never reports a terminal status (dropped notification, or the
|
|
17
|
+
// sub-thread's own process hanging), nothing else would ever resume it or
|
|
18
|
+
// resolve `turnDonePromise` — the session would hang forever. Generous
|
|
19
|
+
// window, refreshed on every observed subagent-thread status change.
|
|
20
|
+
export const CODEX_SUBAGENT_STALL_TIMEOUT_MS = 10 * 60_000;
|
|
14
21
|
function wait(ms) {
|
|
15
22
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
16
23
|
}
|
|
@@ -102,10 +109,60 @@ export function createCodexEngine() {
|
|
|
102
109
|
}
|
|
103
110
|
let resolveTurnDone;
|
|
104
111
|
let rejectTurnDone;
|
|
112
|
+
const activeSubagentThreads = new Map();
|
|
113
|
+
let waitingForBackgroundSubagents = false;
|
|
105
114
|
const turnDonePromise = new Promise((resolve, reject) => {
|
|
106
115
|
resolveTurnDone = resolve;
|
|
107
116
|
rejectTurnDone = reject;
|
|
108
117
|
});
|
|
118
|
+
let subagentStallTimer;
|
|
119
|
+
const clearSubagentStallWatchdog = () => {
|
|
120
|
+
if (!subagentStallTimer)
|
|
121
|
+
return;
|
|
122
|
+
clearTimeout(subagentStallTimer);
|
|
123
|
+
subagentStallTimer = undefined;
|
|
124
|
+
};
|
|
125
|
+
// Re-armed on every observed subagent-thread status change so the
|
|
126
|
+
// deadline tracks the last activity, not the start of the wait.
|
|
127
|
+
const armSubagentStallWatchdog = () => {
|
|
128
|
+
clearSubagentStallWatchdog();
|
|
129
|
+
subagentStallTimer = setTimeout(() => {
|
|
130
|
+
subagentStallTimer = undefined;
|
|
131
|
+
console.warn(`[codex-engine] Background subagent thread(s) still tracked active ${CODEX_SUBAGENT_STALL_TIMEOUT_MS}ms after the turn completed — forcing session drain.`);
|
|
132
|
+
activeSubagentThreads.clear();
|
|
133
|
+
// Forced, unclean termination (a thread may still be alive
|
|
134
|
+
// server-side) — never report it as a normal completion, so
|
|
135
|
+
// auto-loop doesn't treat an orphaned run as forward progress.
|
|
136
|
+
mapperState.sawErrorResult = true;
|
|
137
|
+
if (waitingForBackgroundSubagents)
|
|
138
|
+
resolveTurnDone();
|
|
139
|
+
}, CODEX_SUBAGENT_STALL_TIMEOUT_MS);
|
|
140
|
+
subagentStallTimer.unref?.();
|
|
141
|
+
};
|
|
142
|
+
const finishBackgroundSubagent = (threadId, alreadyEmittedToolCallId) => {
|
|
143
|
+
const tracked = activeSubagentThreads.get(threadId);
|
|
144
|
+
if (!tracked)
|
|
145
|
+
return;
|
|
146
|
+
activeSubagentThreads.delete(threadId);
|
|
147
|
+
if (tracked.toolCallId !== alreadyEmittedToolCallId) {
|
|
148
|
+
safeEmit({
|
|
149
|
+
kind: 'subagent:progress',
|
|
150
|
+
toolCallId: tracked.toolCallId,
|
|
151
|
+
status: 'done',
|
|
152
|
+
description: tracked.description,
|
|
153
|
+
taskType: tracked.taskType,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (waitingForBackgroundSubagents) {
|
|
157
|
+
if (activeSubagentThreads.size === 0) {
|
|
158
|
+
clearSubagentStallWatchdog();
|
|
159
|
+
resolveTurnDone();
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
armSubagentStallWatchdog();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
109
166
|
const turnLiveness = createTurnLiveness({
|
|
110
167
|
timeoutMs: CODEX_TURN_IDLE_TIMEOUT_MS,
|
|
111
168
|
onTimeout() {
|
|
@@ -141,22 +198,57 @@ export function createCodexEngine() {
|
|
|
141
198
|
safeEmit({ kind: 'mcp:status', serverName, status: normalized, message });
|
|
142
199
|
return;
|
|
143
200
|
}
|
|
144
|
-
if (method === 'thread/
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
201
|
+
if (method === 'thread/status/changed') {
|
|
202
|
+
const notification = params;
|
|
203
|
+
if (notification.threadId && notification.status?.type !== 'active') {
|
|
204
|
+
finishBackgroundSubagent(notification.threadId);
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (method === 'thread/started' || method === 'remoteControl/status/changed' || method === 'turn/started') {
|
|
148
209
|
return;
|
|
149
210
|
}
|
|
150
211
|
if (method === 'item/started') {
|
|
151
212
|
const n = params;
|
|
152
|
-
|
|
213
|
+
const events = handleItemStarted(n.item, mapperState);
|
|
214
|
+
for (const ev of events)
|
|
153
215
|
safeEmit(ev);
|
|
216
|
+
if (n.item.type === 'collabAgentToolCall' && n.item.tool === 'spawnAgent') {
|
|
217
|
+
const progress = events.find((event) => event.kind === 'subagent:progress');
|
|
218
|
+
if (progress) {
|
|
219
|
+
for (const threadId of n.item.receiverThreadIds) {
|
|
220
|
+
activeSubagentThreads.set(threadId, {
|
|
221
|
+
toolCallId: progress.toolCallId,
|
|
222
|
+
description: progress.description,
|
|
223
|
+
taskType: progress.taskType,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
154
228
|
return;
|
|
155
229
|
}
|
|
156
230
|
if (method === 'item/completed') {
|
|
157
231
|
const n = params;
|
|
158
|
-
|
|
232
|
+
const events = handleItemCompleted(n.item, mapperState);
|
|
233
|
+
for (const ev of events)
|
|
159
234
|
safeEmit(ev);
|
|
235
|
+
if (n.item.type === 'collabAgentToolCall') {
|
|
236
|
+
const progress = events.find((event) => event.kind === 'subagent:progress');
|
|
237
|
+
for (const [threadId, agentState] of Object.entries(n.item.agentsStates)) {
|
|
238
|
+
if (agentState.status === 'pendingInit' || agentState.status === 'running') {
|
|
239
|
+
if (progress) {
|
|
240
|
+
activeSubagentThreads.set(threadId, {
|
|
241
|
+
toolCallId: progress.toolCallId,
|
|
242
|
+
description: progress.description,
|
|
243
|
+
taskType: progress.taskType,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
finishBackgroundSubagent(threadId, progress?.status === 'done' ? progress.toolCallId : undefined);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
160
252
|
return;
|
|
161
253
|
}
|
|
162
254
|
if (method === 'item/agentMessage/delta') {
|
|
@@ -169,8 +261,16 @@ export function createCodexEngine() {
|
|
|
169
261
|
const n = params;
|
|
170
262
|
for (const ev of handleTurnCompleted(n, mapperState))
|
|
171
263
|
safeEmit(ev);
|
|
172
|
-
if (!activeTurnId || !n.turn?.id || n.turn.id === activeTurnId)
|
|
173
|
-
|
|
264
|
+
if (!activeTurnId || !n.turn?.id || n.turn.id === activeTurnId) {
|
|
265
|
+
if (n.turn?.status === 'completed' && activeSubagentThreads.size > 0) {
|
|
266
|
+
waitingForBackgroundSubagents = true;
|
|
267
|
+
turnLiveness.pause();
|
|
268
|
+
armSubagentStallWatchdog();
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
resolveTurnDone();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
174
274
|
return;
|
|
175
275
|
}
|
|
176
276
|
if (method === 'thread/tokenUsage/updated') {
|
|
@@ -303,8 +403,21 @@ export function createCodexEngine() {
|
|
|
303
403
|
}
|
|
304
404
|
finally {
|
|
305
405
|
turnLiveness.stop();
|
|
406
|
+
clearSubagentStallWatchdog();
|
|
306
407
|
streamingBatcher.close();
|
|
307
408
|
iteratorRunning = false;
|
|
409
|
+
// Drain any outstanding approval/elicitation request (SDK terminated
|
|
410
|
+
// while awaiting a human decision) — without a response, Codex's own
|
|
411
|
+
// process would otherwise wait forever for a reply that never comes.
|
|
412
|
+
for (const pending of pendingByCallId.values()) {
|
|
413
|
+
try {
|
|
414
|
+
client.peer.respondError(pending.requestId, -32000, 'session ended');
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
// best-effort
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
pendingByCallId.clear();
|
|
308
421
|
client.close();
|
|
309
422
|
try {
|
|
310
423
|
child.kill('SIGTERM');
|
|
@@ -252,6 +252,8 @@ export function handleItemCompleted(item, state) {
|
|
|
252
252
|
}
|
|
253
253
|
if (item.type === 'collabAgentToolCall') {
|
|
254
254
|
const toolCallId = scopedId(state, item.id);
|
|
255
|
+
const hasActiveAgent = item.status === 'completed' &&
|
|
256
|
+
Object.values(item.agentsStates).some((agentState) => agentState.status === 'pendingInit' || agentState.status === 'running');
|
|
255
257
|
events.push({
|
|
256
258
|
kind: 'tool:result',
|
|
257
259
|
toolCallId,
|
|
@@ -265,7 +267,7 @@ export function handleItemCompleted(item, state) {
|
|
|
265
267
|
events.push({
|
|
266
268
|
kind: 'subagent:progress',
|
|
267
269
|
toolCallId,
|
|
268
|
-
status: 'done',
|
|
270
|
+
status: hasActiveAgent ? 'running' : 'done',
|
|
269
271
|
description: item.prompt ?? item.tool,
|
|
270
272
|
taskType: item.tool,
|
|
271
273
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.13",
|
|
4
4
|
"description": "Kōbō — multi-workspace agent manager for Claude Code. Orchestrates isolated git worktrees with dev servers, Notion integration, and MCP tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./vue-i18n-C3W5i7h6.js";import{B as t,C as n,St as r,wt as i,yt as a}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as o,A as s,B as c,H as l,It as u,Mt as d,Rt as f,Tt as p,U as m,V as h,W as g,Wt as _,X as v,Z as y,_n as b,fn as x,t as S,w as C}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{l as w,t as T}from"./QIcon--SvgE-nS.js";import{G as E,P as D,Q as O,d as k,f as A,v as j,y as M}from"./index-
|
|
1
|
+
import{n as e}from"./vue-i18n-C3W5i7h6.js";import{B as t,C as n,St as r,wt as i,yt as a}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as o,A as s,B as c,H as l,It as u,Mt as d,Rt as f,Tt as p,U as m,V as h,W as g,Wt as _,X as v,Z as y,_n as b,fn as x,t as S,w as C}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{l as w,t as T}from"./QIcon--SvgE-nS.js";import{G as E,P as D,Q as O,d as k,f as A,v as j,y as M}from"./index-B_OmZ65F.js";import{t as N}from"./QSpinnerDots-B4RmFJUj.js";import{u as ee}from"./QSelect-8Ip46vhk.js";import{t as P}from"./QTooltip-Bz4g3bmr.js";import{r as F,t as te}from"./pending-diff-open-D1IYH8Pd.js";import{t as I}from"./documents-CyKQ9lT6.js";import{i as L,n as ne,t as R}from"./render-chat-markdown-DZnIueUV.js";import{t as z}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as B}from"./WorkspacePage-CbC_t5Rx.js";function re(e,t,n=!0,r){let i=[],a=new Map,o=new Map;for(let n=0;n<e.length;n++){let s=e[n],c=t?.[n],l=r?.[n]??void 0;switch(s.kind){case`message:text`:{let e=a.get(s.messageId);if(e)e.text+=s.text,e.streaming=s.streaming,l&&e.eventIds?.push(l);else{let e={type:`text`,messageId:s.messageId,text:s.text,streaming:s.streaming,ts:c,eventIds:l?[l]:void 0};a.set(s.messageId,e),i.push(e)}break}case`message:end`:{let e=a.get(s.messageId);e&&(e.streaming=!1);break}case`message:thinking`:i.push({type:`thinking`,messageId:s.messageId,text:s.text,ts:c,eventIds:l?[l]:void 0});break;case`tool:call`:{let e={type:`tool`,toolCallId:s.toolCallId,name:s.name,input:s.input,ts:c,eventIds:l?[l]:void 0};o.set(s.toolCallId,e),i.push(e);break}case`tool:result`:{let e=o.get(s.toolCallId);e&&(e.result={output:s.output,isError:s.isError},l&&e.eventIds?.push(l));break}case`session:started`:i.push({type:`session`,kind:`started`,detail:{engineSessionId:s.engineSessionId,model:s.model},ts:c,eventIds:l?[l]:void 0});break;case`session:ended`:i.push({type:`session`,kind:`ended`,detail:{reason:s.reason,exitCode:s.exitCode},ts:c,eventIds:l?[l]:void 0});break;case`session:compacted`:i.push({type:`session`,kind:`compacted`,ts:c,eventIds:l?[l]:void 0})}}let s=null;for(let e of i)e.type===`text`&&e.streaming&&(s&&(s.streaming=!1),s=e);return s&&!n&&(s.streaming=!1),i}function ie(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts,eventIds:e.eventIds})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}var V=new Set([`setup`,`cleanup`,`archive`]);function H(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:V.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function ae(e){let t=[],n=null,r=null;for(let i of e){let e=H(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e;!n||r!==o||a?(n={speaker:e,ts:i.ts,items:[i]},r=o,t.push(n),a&&(n=null)):n.items.push(i)}return t}var U={class:`text-caption text-grey-6`},oe=o({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,n=c(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(f(),g(`span`,U,i(e.$t(n.value)),1))}});function se(e,t){if(t.length===0||e.length===0)return e;let n=[...t].sort((e,t)=>t.length-e.length),r=new DOMParser().parseFromString(`<div>${e}</div>`,`text/html`),i=r.body.firstChild;if(!i)return e;function a(e){if(e.nodeType===Node.TEXT_NODE){ce(e,n,r);return}if(e.nodeName===`A`)return;let t=Array.from(e.childNodes);for(let e of t)a(e)}return a(i),i.innerHTML}function ce(e,t,n){let r=e.textContent??``;if(!t.some(e=>r.includes(e)))return;let i=n.createDocumentFragment(),a=0;for(;a<r.length;){let e=le(r,a,t);if(!e){i.appendChild(n.createTextNode(r.slice(a)));break}e.index>a&&i.appendChild(n.createTextNode(r.slice(a,e.index)));let o=n.createElement(`a`);o.className=`document-link`,o.setAttribute(`data-document-path`,e.path),o.setAttribute(`href`,`#`),o.textContent=e.path,i.appendChild(o),a=e.index+e.path.length}e.parentNode?.replaceChild(i,e)}function le(e,t,n){let r=null;for(let i of n){let n=e.indexOf(i,t);n<0||(!r||n<r.index||n===r.index&&i.length>r.path.length)&&(r={index:n,path:i})}return r}var W=[`innerHTML`],ue=z(o({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,n=I(),r=k(),i=c(()=>{let e=r.selectedWorkspaceId;return e?n.documentsFor(e).map(e=>e.path):[]}),a=c(()=>{let e=se(L.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),i.value);return ne(e,{addAttr:[`data-document-path`]})});function o(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let i=t.getAttribute(`data-document-path`),a=r.selectedWorkspaceId;!i||!a||n.openDocumentByPath(a,i)}return(t,n)=>(f(),g(`div`,{class:`markdown-message`,onClick:o},[h(`div`,{innerHTML:a.value},null,8,W),e.item.streaming?(f(),l(w,{key:0,size:`xs`,class:`q-ml-xs`})):m(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]);function de(e,t){let n=e.split(`
|
|
2
2
|
`),r=t.split(`
|
|
3
3
|
`),i=n.length,a=r.length,o=Array.from({length:i+1},()=>Array(a+1).fill(0));for(let e=i-1;e>=0;e--)for(let t=a-1;t>=0;t--)n[e]===r[t]?o[e][t]=o[e+1][t+1]+1:o[e][t]=Math.max(o[e+1][t],o[e][t+1]);let s=[],c=0,l=0;for(;c<i&&l<a;)n[c]===r[l]?(s.push({type:`context`,content:n[c]}),c++,l++):o[c+1][l]>=o[c][l+1]?(s.push({type:`del`,content:n[c]}),c++):(s.push({type:`add`,content:r[l]}),l++);for(;c<i;)s.push({type:`del`,content:n[c++]});for(;l<a;)s.push({type:`add`,content:r[l++]});return s}function G(e){let t=e.split(`
|
|
4
4
|
`),n=[];for(let e of t)e.startsWith(`@@`)||e.startsWith(`+++`)||e.startsWith(`---`)||(e.startsWith(`+`)?n.push({type:`add`,content:e.slice(1)}):e.startsWith(`-`)?n.push({type:`del`,content:e.slice(1)}):e.startsWith(` `)?n.push({type:`context`,content:e.slice(1)}):e.length>0&&n.push({type:`context`,content:e}));return n}function K(e,t){if(!t||typeof t!=`object`)return null;let n=t;if(e===`Edit`){let e=n.file_path;if(!e)return null;let t=n.old_string??``,r=n.new_string??``,i=typeof n.diff==`string`?n.diff:``;if(!t&&!r&&i.length>0){let t=G(i);return{toolName:`Edit`,filePath:e,additions:t.filter(e=>e.type===`add`).length,deletions:t.filter(e=>e.type===`del`).length,diffLines:t}}return{toolName:`Edit`,filePath:e,oldString:t,newString:r,replaceAll:n.replace_all??!1,additions:r?r.split(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as e,C as t,wt as n}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as r,A as i,H as a,Mt as o,Rt as s,U as c,V as l,W as u,Wt as d,Z as f,_n as p}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{Dt as m,G as h,kt as g,s as _}from"./index-
|
|
1
|
+
import{B as e,C as t,wt as n}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as r,A as i,H as a,Mt as o,Rt as s,U as c,V as l,W as u,Wt as d,Z as f,_n as p}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{Dt as m,G as h,kt as g,s as _}from"./index-B_OmZ65F.js";import{t as v}from"./render-chat-markdown-DZnIueUV.js";import{t as y}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as b}from"./QSpace-D9UEvM99.js";import{t as x}from"./QChip-DWGDTZnX.js";import{t as S}from"./QPage-DuIsRmYu.js";var C={class:`row items-center q-mb-md`},w={class:`text-h6 q-ml-sm`},T={key:0,class:`text-grey-6 text-center q-pa-lg`},E={key:1,class:`text-negative text-center q-pa-lg`},D={key:2,class:`text-grey-6 text-center q-pa-lg`},O={key:3,class:`column q-gutter-md`},k={key:0,class:`text-caption text-grey-6`},A={class:`row items-center q-mb-sm`},j={class:`text-subtitle1 text-indigo-3`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},M=[`innerHTML`],N=y(r({__name:`ChangelogPage`,setup(r){let y=_(),N=t([]),P=t(``),F=t(!1),I=t(null);function L(e){return v(e)}async function R(){F.value=!0,I.value=null;try{let e=await fetch(`/api/changelog`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();P.value=t.currentVersion??``,N.value=t.versions??[]}catch(e){I.value=e instanceof Error?e.message:String(e)}finally{F.value=!1}}return o(R),(t,r)=>(s(),a(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:p(()=>[l(`div`,C,[f(h,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:r[0]||=t=>e(y).back()}),l(`div`,w,n(t.$t(`changelog.title`)),1),f(b),f(h,{flat:``,dense:``,icon:`refresh`,loading:F.value,label:t.$t(`common.refresh`),onClick:R},null,8,[`loading`,`label`])]),F.value&&N.value.length===0?(s(),u(`div`,T,n(t.$t(`common.loading`)),1)):I.value?(s(),u(`div`,E,n(I.value),1)):N.value.length===0?(s(),u(`div`,D,n(t.$t(`changelog.empty`)),1)):(s(),u(`div`,O,[P.value?(s(),u(`div`,k,n(t.$t(`changelog.currentVersion`,{version:P.value})),1)):c(``,!0),(s(!0),u(i,null,d(N.value,e=>(s(),a(m,{key:e.version,dark:``,flat:``,bordered:``},{default:p(()=>[f(g,null,{default:p(()=>[l(`div`,A,[l(`div`,j,` v`+n(e.version),1),e.version===P.value?(s(),a(x,{key:0,dense:``,size:`sm`,color:`indigo-7`,"text-color":`grey-2`,label:t.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):c(``,!0)]),l(`div`,{class:`changelog-notes`,innerHTML:L(e.notes)},null,8,M)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-ed73d661`]]);export{N as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e,b as t}from"./QIcon--SvgE-nS.js";import{gt as n,ht as r}from"./index-
|
|
1
|
+
import{P as e,b as t}from"./QIcon--SvgE-nS.js";import{gt as n,ht as r}from"./index-B_OmZ65F.js";var i={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},a=Object.keys(i);i.all=!0;function o(e){let t={};for(let n of a)e[n]&&(t[n]=!0);return Object.keys(t).length===0?i:(t.horizontal?t.left=t.right=!0:t.left&&t.right&&(t.horizontal=!0),t.vertical?t.up=t.down=!0:t.up&&t.down&&(t.vertical=!0),t.horizontal&&t.vertical&&(t.all=!0),t)}var s=[`INPUT`,`TEXTAREA`];function c(e,t){return t.event===void 0&&e.target!==void 0&&!e.target.draggable&&typeof t.handler==`function`&&!s.includes(e.target.nodeName.toUpperCase())&&(e.qClonedBy===void 0||!e.qClonedBy.includes(t.uid))}function l(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}var u=e({name:`close-popup`,beforeMount(e,{value:i}){let a={depth:l(i),handler(t){a.depth!==0&&setTimeout(()=>{let i=n(e);i!==void 0&&r(i,t,a.depth)},0)},handlerKey(e){t(e,13)&&a.handler(e)}};e.__qclosepopup=a,e.addEventListener(`click`,a.handler),e.addEventListener(`keyup`,a.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=l(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{o as n,c as r,u as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./vue-i18n-C3W5i7h6.js";import{B as t,C as n,wt as r,xt as i,yt as ee}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as te,A as ne,B as a,C as re,H as o,It as ie,Mt as ae,Rt as s,Tt as oe,U as c,V as l,W as u,Wt as se,X as d,Z as f,_n as p,fn as m,lt as ce,t as le,w as h}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{t as g}from"./QIcon--SvgE-nS.js";import{t as ue}from"./QSeparator-BdyRE-AM.js";import{o as de}from"./use-checkbox-SrkgiJho.js";import{Dt as _,G as v,L as fe,R as pe,d as me,g as he,kt as y,l as ge,n as _e,s as ve,v as ye}from"./index-B_OmZ65F.js";import{t as be}from"./QSpinnerDots-B4RmFJUj.js";import{n as b,r as x,t as xe}from"./use-quasar-C1RCDSb6.js";import{d as S,n as Se,t as C,u as Ce}from"./QSelect-8Ip46vhk.js";import{t as we}from"./QTooltip-Bz4g3bmr.js";import{t as Te}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as Ee}from"./QChip-DWGDTZnX.js";import{t as De}from"./QBtnToggle-DsCDNQzX.js";import{i as Oe}from"./project-color-DO6uj29M.js";import{t as ke}from"./QPage-DuIsRmYu.js";import{a as Ae,i as je,n as Me,r as Ne,t as Pe}from"./expand-template-DQQQftsk.js";import{i as Fe,r as Ie,t as Le}from"./permissionModes-6jhegAm-.js";var Re=`kobo:create-page-prefs`;function w(){try{let e=localStorage.getItem(Re);return e===null?void 0:JSON.parse(e)}catch{return}}function ze(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Be(){let e=w();if(!ze(e))return{};let t={};if(typeof e.projectPath==`string`&&e.projectPath.length>0&&(t.projectPath=e.projectPath),typeof e.autoLoop==`boolean`&&(t.autoLoop=e.autoLoop),(e.autoLoopSessionMode===`per_task`||e.autoLoopSessionMode===`continuous`)&&(t.autoLoopSessionMode=e.autoLoopSessionMode),typeof e.brainstormModel==`string`&&e.brainstormModel.length>0&&(t.brainstormModel=e.brainstormModel),ze(e.reasoningEffortByModel)){let n=Object.entries(e.reasoningEffortByModel).filter(([e,t])=>e.length>0&&typeof t==`string`&&t.length>0);t.reasoningEffortByModel=Object.fromEntries(n)}return t}function Ve(e){try{localStorage.setItem(Re,JSON.stringify(e))}catch{}}var He={class:`create-inner q-mx-auto`},Ue={class:`q-mb-lg`},We={class:`create-title text-weight-bold text-grey-2`},Ge={class:`text-body1 text-grey-5 q-mt-xs`},Ke={class:`create-sections column`},qe={class:`text-subtitle1 text-weight-medium text-grey-2`},Je={class:`text-body2 text-grey-6`},Ye={class:`card-textarea-wrap`},Xe={class:`column items-center self-end q-pb-xs`},Ze={key:0,class:`column q-gutter-y-sm`},Qe={class:`text-caption text-weight-medium text-grey-5`},$e={class:`row q-gutter-sm`},et={key:0,class:`source-panel column q-gutter-y-sm q-pa-md rounded-borders`},tt={key:0},nt={class:`text-body2 text-grey-4 q-mb-sm`},rt={class:`responsive-fields responsive-fields--sm row q-col-gutter-x-sm`},it={class:`col-12 col-sm-6`},at={class:`col`},ot={class:`text-body2 text-weight-medium`},st={class:`text-caption text-grey-6`},ct={class:`col-12 col-sm-6`},lt={class:`col`},ut={class:`text-body2 text-weight-medium`},dt={class:`text-caption text-grey-6`},ft={key:0,class:`source-panel q-pa-md rounded-borders`},pt={key:1,class:`responsive-fields row q-col-gutter-x-md`},mt={class:`col-12 col-md-6`},ht={class:`q-pa-md column q-gutter-y-sm`},gt={key:0,class:`row q-gutter-xs`},_t={class:`col-12 col-md-6`},vt={class:`q-pa-md column q-gutter-y-sm`},yt={key:0,class:`row q-gutter-xs`},bt={class:`text-subtitle1 text-weight-medium text-grey-2`},xt={class:`text-body2 text-grey-6`},St={class:`text-caption text-weight-medium text-grey-5 q-mb-sm`},Ct={class:`responsive-fields row q-col-gutter-x-md`},wt={class:`col-12 col-md-6`},Tt={class:`col-12 col-md-6`},Et={key:0,class:`responsive-fields row q-col-gutter-x-md`},Dt={class:`col-12 col-md-4`},Ot={class:`col-12 col-md-8`},kt={class:`self-center full-width no-outline text-grey-4 ellipsis`,tabindex:`0`},At={class:`col`},jt={class:`text-subtitle1 text-weight-medium text-grey-2`},Mt={class:`text-body2 text-grey-6`},Nt={key:0,class:`col-12 col-sm-6`},Pt={class:`col-12 col-sm-6`},Ft={class:`col-12 col-sm-6`},It={class:`col-12 col-sm-6`},Lt={class:`text-subtitle2 text-amber-3`},Rt={class:`responsive-fields row q-col-gutter-x-md`},zt={class:`col-12 col-sm-6`},Bt={class:`col-12 col-sm-6`},Vt={class:`text-caption text-grey-6`},Ht={class:`row q-gutter-sm create-actions`},Ut=6e4,T=Te(te({__name:`CreatePage`,setup(te){function Te(e){return e.disabled===!0}let Re=ve(),w=xe(),ze=me(),T=ye(),{t:E}=e(),Wt=n([]),Gt=n(``),D=n(``),Kt=n(null),qt=n(``),O=n(!1),k=n(!1),Jt=n(null),Yt=n(null),Xt=n([]),Zt=n(null),A=n(``),j=n(!1),M=n(`claude-opus-4-8`),N=n(`claude-opus-4-8`),Qt=n(`auto`),P=n(`auto`),F=n({}),I=n(``),L=n(null),R=n(`feature`),$t=n(!1),en=a(()=>T.global.voiceEnabled),tn=n([]),z=n(`claude-code`),nn=a(()=>tn.value.find(e=>e.id===z.value)),rn=a(()=>tn.value.map(e=>({value:e.id,label:e.displayName}))),an=a(()=>T.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),on=[`plan`,`bypass`,`strict`,`interactive`];function sn(e,t){let n=e?T.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&on.includes(r))return r;let i=T.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&on.includes(i)?i:n?.dangerouslySkipPermissions??T.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let B=n(sn(``,z.value)),cn=a(()=>{switch(B.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),ln=a(()=>(Le[z.value]??on).map(e=>({value:e,label:E(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),V=n([]),un=n([]),dn=n(!1),fn=n(!1);function pn(e,t){t(()=>{un.value=e?V.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):V.value})}let mn=pe();function hn(){return Kt.value?.nativeEl??null}let{showSkills:gn,selectedSkillIndex:_n,groupedDropdown:vn,flatDropdown:H,fetchSkills:yn,detectSlashFragment:bn,replaceFragmentWith:xn,closeDropdown:Sn}=je(D,hn,{excludeKoboCommands:!0});yn(),m(D,async()=>{await oe(),await bn()});function Cn(e){if(e.type===`template`){let t=mn.templates.find(t=>t.slug===e.name);if(!t)return;let n=Me(t.content,Pe({workspace:null,gitStats:null,sessionName:null}));xn(n),Sn();return}xn(`/${e.name} `),Sn()}function wn(e){!gn.value||H.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),_n.value=(_n.value+1)%H.value.length):e.key===`ArrowUp`?(e.preventDefault(),_n.value=(_n.value-1+H.value.length)%H.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),Cn(H.value[_n.value])):e.key===`Escape`&&(e.preventDefault(),Sn()))}async function Tn(){if(!(!en.value||O.value||k.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){w.notify({type:`warning`,message:E(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Yt.value=e,Xt.value=[];let t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:``,n=t?new MediaRecorder(e,{mimeType:t}):new MediaRecorder(e);n.ondataavailable=e=>{e.data&&e.data.size>0&&Xt.value.push(e.data)},n.start(),Jt.value=n,O.value=!0,Zt.value=setTimeout(()=>{U(),w.notify({type:`info`,message:E(`voice.maxDurationReached`),position:`top`,timeout:3500})},Ut)}catch{w.notify({type:`negative`,message:E(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function U(){if(!O.value)return;let e=Jt.value;if(!e)return;O.value=!1,k.value=!0,Zt.value&&=(clearTimeout(Zt.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Xt.value,{type:`audio/webm`})),e.stop()});try{if(t.size===0)throw Error(`MIC_AUDIO_INVALID`);let e=new FormData;e.append(`audio`,t,`voice.webm`),e.append(`language`,T.global.voiceLanguage||`auto`);let n=await fetch(`/api/voice/transcribe`,{method:`POST`,body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(String(e.code??e.error??`HTTP_${n.status}`))}let r=await n.json();r.text?.trim()&&(D.value=D.value?`${D.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;w.notify({type:`negative`,message:E({VOICE_DISABLED:`voice.errorDisabled`,MODEL_NOT_CONFIGURED:`voice.errorModelMissing`,MODEL_NOT_INSTALLED:`voice.errorModelNotInstalled`,VOICE_RUNTIME_MISSING:`voice.errorRuntimeMissing`,MIC_AUDIO_INVALID:`voice.errorAudioInvalid`,LANGUAGE_INVALID:`voice.errorLanguageInvalid`,TRANSCRIPTION_TIMEOUT:`voice.errorTranscription`}[t]??`voice.errorTranscription`),position:`top`,timeout:5e3})}finally{Jt.value=null,Xt.value=[],Yt.value?.getTracks().forEach(e=>{e.stop()}),Yt.value=null,k.value=!1}}function En(e){return en.value?T.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function Dn(e){!En(e)||e.repeat||(e.preventDefault(),Tn())}function On(e){En(e)&&(e.preventDefault(),U())}function kn(){O.value&&U()}function An(){document.visibilityState!==`visible`&&O.value&&U()}let W=a(()=>(Fe[z.value]??Ie).map(e=>({label:E(e.i18nLabelKey),value:e.value,description:E(e.i18nDescriptionKey)})));m(z,()=>{let e=W.value.map(e=>e.value);if(e.length>0){let t=T.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?M.value=t:e.includes(M.value)||(M.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`);let t=Le[z.value]??[];t.length>0&&!t.includes(B.value)&&(B.value=sn(I.value,z.value));let n=(Ne[z.value]??[]).map(e=>e.value);n.length>0&&!n.includes(P.value)&&(P.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function jn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Mn=a(()=>(Ne[z.value]??Ne[`claude-code`]).map(e=>({value:e.value,label:jn(E(e.i18nLabelKey)),description:E(e.i18nDescriptionKey)})));m(M,e=>{let t=F.value[e];t&&Mn.value.some(e=>e.value===t)&&(P.value=t)}),m(P,e=>{F.value={...F.value,[M.value]:e},Ve({...Be(),reasoningEffortByModel:F.value})});let G=a(()=>{let e=A.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),Nn=a(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(A.value)),K=n(`panel`);function Pn(){let e=A.value.trim();return K.value===`parent`&&Nn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=n([]),J=n([]),Fn=n(``),In=n(``),Ln=a(()=>!j.value||!G.value);function Rn(){let e=Fn.value.trim();e&&(q.value.push(e),Fn.value=``)}function zn(e){q.value.splice(e,1)}function Bn(){let e=In.value.trim();e&&(J.value.push(e),In.value=``)}function Vn(e){J.value.splice(e,1)}function Hn(){j.value=!j.value,j.value||(A.value=``)}let Y=n(!1),X=n(!1),Un=n(`per_task`);m(()=>X.value,e=>{e&&B.value!==`bypass`&&(B.value=`bypass`)});function Wn(){X.value=!X.value,X.value&&(N.value=M.value)}let Z=n(``),Gn=a(()=>/\/issues\/\d+/.test(Z.value.trim()));function Kn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=n(!1),$=n(null),qn=n([]),Jn=n(!1);async function Yn(){if(!I.value.trim()){qn.value=[];return}Jn.value=!0;try{qn.value=await ze.fetchOrphanWorktrees(I.value.trim())}catch{qn.value=[]}finally{Jn.value=!1}}function Xn(){Q.value=!Q.value,Q.value?(j.value=!1,A.value=``,Y.value=!1,Z.value=``,$t.value=!0,Yn()):$.value=null}function Zn(e){e===`existing`!==Q.value&&Xn()}m(I,()=>{$.value=null,Q.value&&Yn()}),m($,e=>{if(!e)return;let t=qn.value.find(t=>t.path===e);t&&(L.value=t.suggestedSourceBranch),$t.value=!0});async function Qn(e){if(!e.trim()){V.value=[],L.value=null;return}dn.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();V.value=n.local??n.branches??[],V.value.length>0&&!L.value&&(L.value=V.value[0]??null)}catch{V.value=[],L.value=null}finally{dn.value=!1}}function $n(e){let t=T.getProjectByPath(e);if(t){t.defaultSourceBranch&&(L.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(D.value===``||D.value===qt.value)&&(D.value=e,qt.value=e);let n=W.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))M.value=t.defaultModel;else{let e=T.global.defaultModelByEngine?.[z.value];typeof e==`string`&&n.includes(e)&&(M.value=e)}}B.value=sn(e,z.value)}let er=null;m(I,e=>{er&&clearTimeout(er),er=setTimeout(()=>{L.value=null,Qn(e),$n(e)},500)});function tr(e,t){let n=e.toLowerCase();t(()=>{Wt.value=T.projectPaths.filter(e=>e.toLowerCase().includes(n)||Oe(e).toLowerCase().includes(n))})}function nr(e){let t=T.projectPaths.find(t=>Oe(t)===e);I.value=t??e}ae(async()=>{await T.fetchSettings();let e=T.global.branchPrefixes;e.length>0&&!e.includes(R.value)&&(R.value=e[0]);let t=Be();F.value=t.reasoningEffortByModel??{},t.autoLoop===!0&&(X.value=!0),t.autoLoopSessionMode===`continuous`&&(Un.value=`continuous`),t.autoLoop===!0&&t.brainstormModel&&(N.value=t.brainstormModel),t.projectPath&&T.projectPaths.includes(t.projectPath)&&(I.value=t.projectPath),B.value=sn(I.value,z.value);try{let e=await fetch(`/api/engines`);e.ok&&(tn.value=await e.json())}catch{}{let e=W.value.map(e=>e.value),t=T.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?M.value=t:e.length>0&&!e.includes(M.value)&&(M.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let n=F.value[M.value];n&&Mn.value.some(e=>e.value===n)&&(P.value=n);{let e=W.value.map(e=>e.value);e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,Dn),window.addEventListener(`keyup`,On),window.addEventListener(`blur`,kn),document.addEventListener(`visibilitychange`,An)}),ie(()=>{er&&clearTimeout(er),window.removeEventListener(`keydown`,Dn),window.removeEventListener(`keyup`,On),window.removeEventListener(`blur`,kn),document.removeEventListener(`visibilitychange`,An),Zt.value&&=(clearTimeout(Zt.value),null),O.value&&U()});function rr(e){return e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`).substring(0,50)}function ir(){return Gt.value.trim()?Gt.value.trim().substring(0,80):!j.value&&!Y.value&&D.value.trim()&&(D.value.trim().split(`
|
|
2
|
+
`)[0]??``).substring(0,80)||`workspace`}function ar(e){let t=(e.split(`/`).pop()??``).split(`-`);t.length>1&&/^[0-9a-f]{12,}$/i.test(t[t.length-1])&&t.pop();let n=t.join(`-`).toLowerCase(),r=n.match(/tk-(\d+)/);if(r){let e=`TK-${r[1]}`,t=n.replace(/tk-\d+/i,``).replace(/-+/g,`-`).replace(/^-|-$/g,``).substring(0,40);return t?`${e}--${t}`:e}return n.substring(0,50)||`task-${Date.now()}`}let or=a(()=>{if(j.value&&G.value)return`${R.value}/${ar(Pn())}`;let e=ir(),t=e===`workspace`?E(`createPage.branchNamePending`):rr(e);return`${R.value}/${t}`});function sr(){return j.value&&!G.value?E(`createPage.validationNotionUrl`):Y.value&&!Gn.value?E(`createPage.sentryValidation`):!j.value&&!Y.value&&!D.value.trim()?E(`createPage.validationDescription`):!j.value&&!Y.value&&(!ir()||ir()===`workspace`)&&!Gt.value.trim()&&!D.value.trim()?E(`createPage.validationName`):I.value.trim()?L.value?null:E(`createPage.validationBranch`):E(`createPage.validationPath`)}async function cr(){if(fn.value)return;let e=sr();if(e){w.notify({type:`negative`,message:e,position:`top`});return}if(Q.value&&!$.value){w.notify({type:`negative`,message:E(`createPage.pickWorktreeRequired`),position:`top`});return}fn.value=!0;try{let e=ir(),t;t=j.value&&G.value?ar(Pn()):e===`workspace`?`task-${Date.now()}`:rr(e);let n=`${R.value}/${t}`,r={name:e,projectPath:I.value.trim(),sourceBranch:L.value,...Q.value&&$.value?{worktreePath:$.value,skipSetupScript:!0,workingBranch:n}:{workingBranch:n},engine:z.value,model:M.value,reasoningEffort:P.value,...j.value&&G.value?{notionUrl:Pn()}:{},...Y.value&&Gn.value?{sentryUrl:Z.value.trim()}:{},...Ln.value&&q.value.length>0?{tasks:q.value}:{},...Ln.value&&J.value.length>0?{acceptanceCriteria:J.value}:{},...$t.value&&!Q.value?{skipSetupScript:!0}:{},...D.value.trim()?{description:D.value.trim()}:{},...X.value?{autoLoop:!0,autoLoopSessionMode:Un.value,brainstormModel:N.value,brainstormReasoningEffort:Qt.value}:{},agentPermissionMode:X.value&&B.value===`plan`?`bypass`:B.value},i=await ze.createWorkspace(r);T.global.audioWorkspaceCreatedNotifications&&he(T.global.audioWorkspaceCreatedSound,T.global.audioWorkspaceCreatedVolume),i._branchAdjusted&&w.notify({type:`info`,message:E(`createPage.branchAdjusted`,{branch:i.workingBranch}),position:`top`,timeout:6e3}),i._sourceFallback&&w.notify({type:`warning`,message:E(`createPage.localSourceFallback`),position:`top`,timeout:6e3}),Ve({projectPath:I.value.trim(),autoLoop:X.value,autoLoopSessionMode:Un.value,...X.value?{brainstormModel:N.value}:{},reasoningEffortByModel:{...F.value,[M.value]:P.value}}),ge().subscribe(i.id),ze.selectWorkspace(i.id),Re.push({name:`workspace`,params:{id:i.id}})}catch(e){w.notify({type:`negative`,message:e instanceof Error&&e.message?e.message:E(`createPage.errorCreating`),position:`top`})}finally{fn.value=!1}}return(e,n)=>(s(),o(ke,{class:`create-page`},{default:p(()=>[l(`div`,He,[l(`header`,Ue,[l(`div`,We,r(e.$t(`createPage.title`)),1),l(`div`,Ge,r(e.$t(`createPage.subtitle`)),1)]),l(`div`,Ke,[f(_,{flat:``,bordered:``,class:`create-section-card`},{default:p(()=>[f(y,{class:`row items-start no-wrap q-gutter-md`},{default:p(()=>[f(fe,{color:`indigo-9`,"text-color":`indigo-2`,icon:`assignment`,size:`42px`}),l(`div`,null,[l(`div`,qe,r(e.$t(`createPage.sectionMission`)),1),l(`div`,Je,r(e.$t(`createPage.sectionMissionHint`)),1)])]),_:1}),f(ue,{dark:``}),f(y,{class:`column q-gutter-y-md`},{default:p(()=>[f(de,{modelValue:Gt.value,"onUpdate:modelValue":n[0]||=e=>Gt.value=e,dark:``,dense:``,outlined:``,"stack-label":``,label:e.$t(`createPage.workspaceNameLabel`),placeholder:j.value&&G.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`)},null,8,[`modelValue`,`label`,`placeholder`]),l(`div`,Ye,[f(de,{ref_key:`descriptionRef`,ref:Kt,modelValue:D.value,"onUpdate:modelValue":n[1]||=e=>D.value=e,dark:``,dense:``,outlined:``,"stack-label":``,type:`textarea`,autogrow:``,rows:6,label:e.$t(`createPage.descriptionLabel`),placeholder:j.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,onKeydown:[wn,re(h(cr,[`ctrl`]),[`enter`]),re(h(cr,[`meta`]),[`enter`])]},{append:p(()=>[l(`div`,Xe,[k.value?(s(),o(be,{key:0,size:`18px`,color:`amber-6`})):c(``,!0),f(v,{flat:``,dense:``,round:``,size:`sm`,icon:k.value?`hourglass_top`:O.value?`mic`:`mic_none`,color:O.value?`red-5`:k.value?`amber-6`:`grey-6`,disable:!en.value||k.value,class:ee({"voice-btn--recording":O.value}),onMousedown:h(Tn,[`prevent`]),onMouseup:h(U,[`prevent`]),onMouseleave:h(U,[`prevent`]),onTouchstart:h(Tn,[`prevent`]),onTouchend:h(U,[`prevent`])},{default:p(()=>[f(we,null,{default:p(()=>[d(r(k.value?e.$t(`voice.transcribing`):O.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])])]),_:1},8,[`modelValue`,`label`,`placeholder`,`onKeydown`]),t(gn)&&t(H).length>0?(s(),o(Ae,{key:0,class:`create-slash-popup`,"grouped-dropdown":t(vn),"flat-dropdown":t(H),"selected-index":t(_n),onSelect:Cn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):c(``,!0)]),t(T).global.notionEnabled||t(T).global.sentryEnabled?(s(),u(`div`,Ze,[l(`div`,Qe,r(e.$t(`createPage.sources`)),1),l(`div`,$e,[t(T).global.notionEnabled?(s(),o(v,{key:0,dense:``,outline:``,"no-caps":``,icon:`description`,color:j.value?`green-4`:`grey-5`,label:j.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`),disable:Q.value,onClick:Hn},null,8,[`color`,`label`,`disable`])):c(``,!0),t(T).global.sentryEnabled?(s(),o(v,{key:1,dense:``,outline:``,"no-caps":``,icon:`bug_report`,color:Y.value?`red-4`:`grey-5`,label:Y.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`),disable:Q.value,onClick:Kn},null,8,[`color`,`label`,`disable`])):c(``,!0)])])):c(``,!0),f(le,{name:`slide`},{default:p(()=>[j.value?(s(),u(`div`,et,[f(de,{modelValue:A.value,"onUpdate:modelValue":n[2]||=e=>A.value=e,dark:``,outlined:``,dense:``,"stack-label":``,label:e.$t(`createPage.importNotion`),placeholder:e.$t(`createPage.notionPlaceholder`),error:!!A.value.trim()&&!G.value,"error-message":e.$t(`createPage.notionValidation`),hint:G.value?e.$t(`createPage.notionAutoExtract`):void 0},{prepend:p(()=>[f(g,{name:`link`,color:G.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`label`,`placeholder`,`error`,`error-message`,`hint`]),G.value&&Nn.value?(s(),u(`div`,tt,[l(`div`,nt,[f(g,{name:`info`,color:`indigo-4`,class:`q-mr-xs`}),d(` `+r(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),l(`div`,rt,[l(`div`,it,[f(_,{flat:``,bordered:``,class:ee([`peek-card full-height cursor-pointer`,{"peek-card--active":K.value===`panel`}]),onClick:n[3]||=e=>K.value=`panel`},{default:p(()=>[f(y,{class:`row items-center no-wrap q-gutter-sm q-pa-sm`},{default:p(()=>[f(g,{name:`article`,size:`24px`,class:`peek-card-icon`}),l(`div`,at,[l(`div`,ot,r(e.$t(`createPage.notionPanelOption`)),1),l(`div`,st,r(e.$t(`createPage.notionPanelOptionDesc`)),1)]),K.value===`panel`?(s(),o(g,{key:0,name:`check_circle`,color:`indigo-4`})):c(``,!0)]),_:1})]),_:1},8,[`class`])]),l(`div`,ct,[f(_,{flat:``,bordered:``,class:ee([`peek-card full-height cursor-pointer`,{"peek-card--active":K.value===`parent`}]),onClick:n[4]||=e=>K.value=`parent`},{default:p(()=>[f(y,{class:`row items-center no-wrap q-gutter-sm q-pa-sm`},{default:p(()=>[f(g,{name:`folder_open`,size:`24px`,class:`peek-card-icon`}),l(`div`,lt,[l(`div`,ut,r(e.$t(`createPage.notionParentOption`)),1),l(`div`,dt,r(e.$t(`createPage.notionParentOptionDesc`)),1)]),K.value===`parent`?(s(),o(g,{key:0,name:`check_circle`,color:`indigo-4`})):c(``,!0)]),_:1})]),_:1},8,[`class`])])])])):c(``,!0)])):c(``,!0)]),_:1}),f(le,{name:`slide`},{default:p(()=>[Y.value?(s(),u(`div`,ft,[f(de,{modelValue:Z.value,"onUpdate:modelValue":n[5]||=e=>Z.value=e,dark:``,outlined:``,dense:``,"stack-label":``,label:e.$t(`createPage.importSentry`),placeholder:e.$t(`createPage.sentryPlaceholder`),error:!!Z.value.trim()&&!Gn.value,"error-message":e.$t(`createPage.sentryValidation`),hint:Gn.value?e.$t(`createPage.sentryAutoExtract`):void 0},{prepend:p(()=>[f(g,{name:`link`,color:Gn.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`label`,`placeholder`,`error`,`error-message`,`hint`])])):c(``,!0)]),_:1}),Ln.value?(s(),u(`div`,pt,[l(`div`,mt,[f(Ce,{dark:``,dense:``,"expand-separator":``,icon:`checklist`,label:e.$t(`createPage.tasks`,{count:q.value.length}),class:`manual-expansion rounded-borders`},{default:p(()=>[l(`div`,ht,[f(de,{modelValue:Fn.value,"onUpdate:modelValue":n[6]||=e=>Fn.value=e,dark:``,dense:``,outlined:``,placeholder:e.$t(`createPage.addTask`),onKeydown:re(h(Rn,[`prevent`]),[`enter`])},{append:p(()=>[f(v,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Fn.value.trim(),onClick:Rn},{default:p(()=>[f(we,null,{default:p(()=>[d(r(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),_:1},8,[`modelValue`,`placeholder`,`onKeydown`]),q.value.length?(s(),u(`div`,gt,[(s(!0),u(ne,null,se(q.value,(e,t)=>(s(),o(Ee,{key:`task-${t}`,dark:``,dense:``,removable:``,color:`grey-9`,"text-color":`grey-3`,onRemove:e=>zn(t)},{default:p(()=>[d(r(e),1)]),_:2},1032,[`onRemove`]))),128))])):c(``,!0)])]),_:1},8,[`label`])]),l(`div`,_t,[f(Ce,{dark:``,dense:``,"expand-separator":``,icon:`fact_check`,label:e.$t(`createPage.acceptanceCriteria`,{count:J.value.length}),class:`manual-expansion rounded-borders`},{default:p(()=>[l(`div`,vt,[f(de,{modelValue:In.value,"onUpdate:modelValue":n[7]||=e=>In.value=e,dark:``,dense:``,outlined:``,placeholder:e.$t(`createPage.addCriterion`),onKeydown:re(h(Bn,[`prevent`]),[`enter`])},{append:p(()=>[f(v,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!In.value.trim(),onClick:Bn},{default:p(()=>[f(we,null,{default:p(()=>[d(r(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),_:1},8,[`modelValue`,`placeholder`,`onKeydown`]),J.value.length?(s(),u(`div`,yt,[(s(!0),u(ne,null,se(J.value,(e,t)=>(s(),o(Ee,{key:`criterion-${t}`,dark:``,dense:``,removable:``,color:`grey-9`,"text-color":`grey-3`,onRemove:e=>Vn(t)},{default:p(()=>[d(r(e),1)]),_:2},1032,[`onRemove`]))),128))])):c(``,!0)])]),_:1},8,[`label`])])])):c(``,!0)]),_:1})]),_:1}),f(_,{flat:``,bordered:``,class:`create-section-card`},{default:p(()=>[f(y,{class:`row items-start no-wrap q-gutter-md`},{default:p(()=>[f(fe,{color:`blue-grey-9`,"text-color":`blue-grey-2`,icon:`account_tree`,size:`42px`}),l(`div`,null,[l(`div`,bt,r(e.$t(`createPage.sectionGit`)),1),l(`div`,xt,r(e.$t(`createPage.sectionGitHint`)),1)])]),_:1}),f(ue,{dark:``}),f(y,{class:`column q-gutter-y-md`},{default:p(()=>[l(`div`,null,[l(`div`,St,r(e.$t(`createPage.worktreeMode`)),1),f(De,{"model-value":Q.value?`existing`:`new`,dense:``,spread:``,"no-caps":``,unelevated:``,"toggle-color":`indigo-7`,color:`grey-9`,"text-color":`grey-4`,options:[{label:e.$t(`createPage.worktreeNew`),value:`new`,icon:`add_box`},{label:e.$t(`createPage.worktreeExisting`),value:`existing`,icon:`folder_open`}],"onUpdate:modelValue":Zn},null,8,[`model-value`,`options`])]),l(`div`,Ct,[l(`div`,wt,[f(C,{modelValue:I.value,"onUpdate:modelValue":n[8]||=e=>I.value=e,options:Wt.value,dark:``,dense:``,outlined:``,"stack-label":``,"use-input":``,"fill-input":``,"hide-selected":``,"input-debounce":`0`,"new-value-mode":`add`,label:e.$t(`createPage.projectLabel`),placeholder:e.$t(`createPage.projectPath`),behavior:t(T).projectPaths.length>0?`menu`:`dialog`,"option-label":e=>e?t(Oe)(e):``,onFilter:tr,onInputValue:nr},{prepend:p(()=>[f(g,{name:`folder`})]),option:p(({opt:e,itemProps:n})=>[f(x,i(ce(n)),{default:p(()=>[f(b,null,{default:p(()=>[f(S,null,{default:p(()=>[d(r(t(Oe)(e)),1)]),_:2},1024),f(S,{caption:``},{default:p(()=>[d(r(e),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":p(()=>[f(x,null,{default:p(()=>[f(b,{class:`text-grey-6`},{default:p(()=>[d(r(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`label`,`placeholder`,`behavior`,`option-label`])]),l(`div`,Tt,[f(C,{modelValue:L.value,"onUpdate:modelValue":n[9]||=e=>L.value=e,options:un.value,dark:``,dense:``,outlined:``,"stack-label":``,"use-input":``,"input-debounce":`0`,label:e.$t(`createPage.sourceBranch`),loading:dn.value,disable:!I.value.trim()||dn.value,onFilter:pn},{prepend:p(()=>[f(g,{name:`call_split`})]),"no-option":p(()=>[f(x,null,{default:p(()=>[f(b,{class:`text-grey-6`},{default:p(()=>[d(r(I.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`label`,`loading`,`disable`])])]),Q.value?c(``,!0):(s(),u(`div`,Et,[l(`div`,Dt,[f(C,{modelValue:R.value,"onUpdate:modelValue":n[10]||=e=>R.value=e,options:an.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,label:e.$t(`createPage.branchType`)},{prepend:p(()=>[f(g,{name:`account_tree`})]),_:1},8,[`modelValue`,`options`,`label`])]),l(`div`,Ot,[f(Se,{dark:``,dense:``,outlined:``,"stack-label":``,readonly:``,label:e.$t(`createPage.workingBranchPreview`)},{control:p(()=>[l(`div`,kt,r(or.value),1)]),prepend:p(()=>[f(g,{name:`fork_right`})]),_:1},8,[`label`])])])),Q.value?(s(),o(C,{key:1,modelValue:$.value,"onUpdate:modelValue":n[11]||=e=>$.value=e,options:qn.value,dark:``,dense:``,outlined:``,"stack-label":``,"option-label":`branch`,"option-value":`path`,"emit-value":``,"map-options":``,"use-input":``,label:e.$t(`createPage.worktreePickerLabel`),loading:Jn.value,disable:!I.value.trim()||Jn.value},{prepend:p(()=>[f(g,{name:`folder_open`,color:`cyan-5`})]),option:p(e=>[f(x,i(ce(e.itemProps)),{default:p(()=>[f(b,null,{default:p(()=>[f(S,null,{default:p(()=>[d(r(e.opt.branch),1)]),_:2},1024),f(S,{caption:``},{default:p(()=>[d(r(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":p(()=>[f(x,null,{default:p(()=>[f(b,{class:`text-grey-6`},{default:p(()=>[d(r(I.value.trim()?e.$t(`createPage.noOrphanWorktrees`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`label`,`loading`,`disable`])):c(``,!0)]),_:1})]),_:1}),f(_,{flat:``,bordered:``,class:`create-section-card`},{default:p(()=>[f(y,{class:`row items-start no-wrap q-gutter-md`},{default:p(()=>[f(fe,{color:`deep-purple-9`,"text-color":`deep-purple-2`,icon:`smart_toy`,size:`42px`}),l(`div`,At,[l(`div`,jt,r(e.$t(`createPage.sectionAgent`)),1),l(`div`,Mt,r(e.$t(`createPage.sectionAgentHint`)),1)]),f(_e,{"model-value":X.value,dense:``,color:`amber-6`,icon:`autorenew`,label:e.$t(`autoLoop.toggle`),"left-label":``,"onUpdate:modelValue":Wn},null,8,[`model-value`,`label`])]),_:1}),f(ue,{dark:``}),f(Ce,{dark:``,dense:``,"expand-separator":``,icon:`tune`,label:e.$t(`createPage.configureAgent`),"header-class":`agent-config-header`},{header:p(()=>[f(b,{avatar:``},{default:p(()=>[f(g,{name:`tune`,color:`indigo-3`})]),_:1}),f(b,null,{default:p(()=>[f(S,null,{default:p(()=>[d(r(e.$t(`createPage.configureAgent`)),1)]),_:1}),f(S,{caption:``,class:`agent-summary row q-gutter-x-xs q-mt-xs`},{default:p(()=>[f(Ee,{dense:``,color:`grey-9`,"text-color":`grey-3`,icon:`hub`},{default:p(()=>[d(r(nn.value?.displayName??z.value),1)]),_:1}),f(Ee,{dense:``,color:`grey-9`,"text-color":`grey-3`},{default:p(()=>[d(r(W.value.find(e=>e.value===M.value)?.label??M.value),1)]),_:1}),f(Ee,{dense:``,color:`grey-9`,"text-color":`grey-3`,icon:`psychology`},{default:p(()=>[d(r(Mn.value.find(e=>e.value===P.value)?.label??P.value),1)]),_:1}),f(Ee,{dense:``,color:`grey-9`,"text-color":`grey-3`,icon:cn.value},{default:p(()=>[d(r(ln.value.find(e=>e.value===B.value)?.label??B.value),1)]),_:1},8,[`icon`])]),_:1})]),_:1})]),default:p(()=>[f(y,{class:`responsive-fields row q-col-gutter-x-md q-pt-md`},{default:p(()=>[rn.value.length>0?(s(),u(`div`,Nt,[f(C,{modelValue:z.value,"onUpdate:modelValue":n[12]||=e=>z.value=e,options:rn.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,label:e.$t(`engine.select`)},null,8,[`modelValue`,`options`,`label`])])):c(``,!0),l(`div`,Pt,[f(C,{modelValue:M.value,"onUpdate:modelValue":n[13]||=e=>M.value=e,options:W.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,label:e.$t(`engine.model`)},{option:p(({opt:e,itemProps:t})=>[f(x,i(ce(t)),{default:p(()=>[f(b,null,{default:p(()=>[f(S,null,{default:p(()=>[d(r(e.label),1)]),_:2},1024),f(S,{caption:``},{default:p(()=>[d(r(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`,`label`])]),l(`div`,Ft,[f(C,{modelValue:P.value,"onUpdate:modelValue":n[14]||=e=>P.value=e,options:Mn.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,label:e.$t(`engine.effort`)},{option:p(({opt:e,itemProps:t})=>[f(x,i(ce(t)),{default:p(()=>[f(b,null,{default:p(()=>[f(S,null,{default:p(()=>[d(r(e.label),1)]),_:2},1024),f(S,{caption:``},{default:p(()=>[d(r(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`,`label`])]),l(`div`,It,[f(C,{modelValue:B.value,"onUpdate:modelValue":n[15]||=e=>B.value=e,options:ln.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,"option-disable":Te,disable:X.value,label:e.$t(`agentPermissionMode.label`),hint:X.value?e.$t(`agentPermissionMode.autoLoopLocked`):void 0},null,8,[`modelValue`,`options`,`disable`,`label`,`hint`])])]),_:1})]),_:1},8,[`label`]),f(le,{name:`slide`},{default:p(()=>[X.value?(s(),o(y,{key:0,class:`auto-loop-panel column`},{default:p(()=>[l(`div`,Lt,r(e.$t(`autoLoop.startInMode`)),1),f(De,{modelValue:Un.value,"onUpdate:modelValue":n[16]||=e=>Un.value=e,dense:``,size:`sm`,spread:``,"no-caps":``,unelevated:``,class:`auto-loop-session-toggle`,"toggle-color":`indigo-7`,color:`grey-9`,"text-color":`grey-4`,options:[{label:e.$t(`autoLoop.sessionMode.perTask`),value:`per_task`,icon:`restart_alt`},{label:e.$t(`autoLoop.sessionMode.continuous`),value:`continuous`,icon:`link`}]},null,8,[`modelValue`,`options`]),l(`div`,Rt,[l(`div`,zt,[f(C,{modelValue:N.value,"onUpdate:modelValue":n[17]||=e=>N.value=e,options:W.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,label:e.$t(`autoLoop.brainstormModelPrefix`)},null,8,[`modelValue`,`options`,`label`])]),l(`div`,Bt,[f(C,{modelValue:Qt.value,"onUpdate:modelValue":n[18]||=e=>Qt.value=e,options:Mn.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,label:e.$t(`autoLoop.brainstormReasoningPrefix`)},null,8,[`modelValue`,`options`,`label`])])])]),_:1})):c(``,!0)]),_:1})]),_:1}),f(Ce,{dark:``,dense:``,"expand-separator":``,icon:`settings`,label:e.$t(`createPage.advancedOptions`),class:`advanced-options rounded-borders`},{default:p(()=>[f(y,null,{default:p(()=>[f(_e,{modelValue:$t.value,"onUpdate:modelValue":n[19]||=e=>$t.value=e,dense:``,color:`orange-5`,icon:`play_disabled`,label:e.$t(`createPage.skipSetupScript`),disable:Q.value},null,8,[`modelValue`,`label`,`disable`])]),_:1})]),_:1},8,[`label`]),f(_,{flat:``,bordered:``,class:`create-actions-card`},{default:p(()=>[f(y,{class:`row items-center justify-between q-gutter-md`},{default:p(()=>[l(`div`,Vt,r(j.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.keyboardHint`)),1),l(`div`,Ht,[f(v,{flat:``,dense:``,"no-caps":``,color:`grey-5`,label:e.$t(`common.cancel`),onClick:n[20]||=e=>t(Re).back()},null,8,[`label`]),f(v,{unelevated:``,dense:``,"no-caps":``,color:`indigo-6`,"icon-right":`arrow_forward`,label:e.$t(`createPage.createWorkspace`),loading:fn.value,disable:fn.value||Q.value&&!$.value,onClick:cr},null,8,[`label`,`loading`,`disable`])])]),_:1})]),_:1})])])]),_:1}))}}),[[`__scopeId`,`data-v-f498d337`]]);export{T as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.create-page[data-v-f498d337]{background:#1a1a2e;min-height:100%;padding:48px 24px 80px}.create-inner[data-v-f498d337]{width:100%;max-width:960px}.create-title[data-v-f498d337]{letter-spacing:-.02em;font-size:30px;line-height:1.2}.create-sections[data-v-f498d337]{gap:24px}.responsive-fields[data-v-f498d337]{row-gap:16px}.responsive-fields--sm[data-v-f498d337]{row-gap:8px}.create-section-card[data-v-f498d337],.create-actions-card[data-v-f498d337]{background:#22223f;border-color:#ffffff1f}.card-textarea-wrap[data-v-f498d337]{position:relative}.create-textarea[data-v-f498d337] .q-field__control{min-height:220px}.create-textarea[data-v-f498d337] textarea{resize:vertical;line-height:1.6;min-height:180px!important}.create-slash-popup[data-v-f498d337]{z-index:20;position:absolute;top:calc(100% + 4px);left:12px;right:12px}.source-panel[data-v-f498d337]{background:#1e1e38;border:1px solid #ffffff1a}.peek-card[data-v-f498d337]{color:#ddd;background:#ffffff06;border-color:#ffffff1a;transition:background .15s,border-color .15s,transform .1s}.peek-card[data-v-f498d337]:hover{background:#ffffff0f;border-color:#818cf880}.peek-card[data-v-f498d337]:active{transform:scale(.99)}.peek-card--active[data-v-f498d337]{background:#6366f124;border-color:#818cf8;box-shadow:inset 0 0 0 1px #818cf859}.peek-card--active .peek-card-icon[data-v-f498d337]{color:#a5b4fc}.peek-card-icon[data-v-f498d337]{color:#888;flex-shrink:0}.manual-expansion[data-v-f498d337],.advanced-options[data-v-f498d337]{background:#1e1e38;border:1px solid #ffffff1a;overflow:hidden}.manual-expansion[data-v-f498d337] .q-expansion-item__content,.advanced-options[data-v-f498d337] .q-expansion-item__content{background:#19192f}.manual-expansion[data-v-f498d337] .q-chip{max-width:100%;height:auto;min-height:32px}.manual-expansion[data-v-f498d337] .q-chip__content{white-space:normal;overflow-wrap:anywhere}.auto-loop-panel[data-v-f498d337]{background:#f59e0b0f;border-top:1px solid #f59e0b38;gap:16px}.auto-loop-session-toggle[data-v-f498d337] .q-btn{min-height:32px;padding-top:4px;padding-bottom:4px}[data-v-f498d337] .agent-config-header{min-height:56px;padding-top:6px;padding-bottom:8px}.agent-summary[data-v-f498d337]{row-gap:4px}.agent-summary[data-v-f498d337] .q-chip{margin:0}.create-actions-card[data-v-f498d337]{z-index:10;position:sticky;bottom:16px;box-shadow:0 10px 36px #00000061}.voice-btn--recording[data-v-f498d337]{animation:1.1s ease-in-out infinite voice-pulse-f498d337}@keyframes voice-pulse-f498d337{0%,to{opacity:1;transform:scale(1)}50%{opacity:.86;transform:scale(1.06)}}.slide-enter-active[data-v-f498d337],.slide-leave-active[data-v-f498d337]{transition:max-height .2s,opacity .2s;overflow:hidden}.slide-enter-from[data-v-f498d337],.slide-leave-to[data-v-f498d337]{opacity:0;max-height:0}.slide-enter-to[data-v-f498d337],.slide-leave-from[data-v-f498d337]{opacity:1;max-height:900px}@media (max-width:599px){.create-page[data-v-f498d337]{padding:28px 12px 56px}.create-title[data-v-f498d337]{font-size:26px}.create-actions-card[data-v-f498d337]{bottom:8px}.create-actions-card[data-v-f498d337] .q-card__section{align-items:stretch}.create-actions[data-v-f498d337]{width:100%}.create-actions .q-btn[data-v-f498d337]:last-child{flex:1}}
|