@loicngr/kobo 1.9.6 → 1.10.0
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 +20 -0
- package/README.md +2 -2
- package/dist/mcp-server/kobo-tasks-server.js +1 -1
- package/dist/server/index.js +22 -13
- package/dist/server/routes/workspaces.js +4 -0
- package/dist/server/services/agent/engines/claude-code/engine.js +7 -23
- package/dist/server/services/agent/engines/claude-code/options-builder.js +5 -1
- package/dist/server/services/agent/engines/codex/client.js +3 -0
- package/dist/server/services/agent/engines/codex/engine.js +21 -4
- package/dist/server/services/agent/engines/codex/options-builder.js +1 -1
- package/dist/server/services/agent/engines/codex/server-requests.js +12 -1
- package/dist/server/services/agent/orchestrator.js +10 -3
- package/package.json +1 -1
- package/src/client/dist/spa/assets/{ActivityFeed-BMgs5z9z.js → ActivityFeed-CcUu5qpC.js} +1 -1
- package/src/client/dist/spa/assets/{ChangelogPage-jf_31RZp.js → ChangelogPage-BdxtrOnp.js} +1 -1
- package/src/client/dist/spa/assets/{ClosePopup-C1A60wce.js → ClosePopup-D0wmrKYA.js} +1 -1
- package/src/client/dist/spa/assets/{CreatePage-BBOwKtLV.js → CreatePage-PGgqwwa4.js} +1 -1
- package/src/client/dist/spa/assets/{DiffViewer-CVYtBqC8.js → DiffViewer-PD-4yZTi.js} +3 -3
- package/src/client/dist/spa/assets/{HealthPage-_2qS3z3n.js → HealthPage-DRqe033h.js} +1 -1
- package/src/client/dist/spa/assets/{MainLayout-Dk9ilieA.js → MainLayout-C-THtL4A.js} +3 -3
- package/src/client/dist/spa/assets/{QBtnToggle-CtKvYj1o.js → QBtnToggle-C0OuVppD.js} +1 -1
- package/src/client/dist/spa/assets/{QChip-CjN_RB2y.js → QChip-Bq-3SzSI.js} +1 -1
- package/src/client/dist/spa/assets/{QExpansionItem-Dka3X1IN.js → QExpansionItem-Sh9QNOLB.js} +1 -1
- package/src/client/dist/spa/assets/{QScrollArea-Mwe2ihwC.js → QScrollArea-CbA9gH0b.js} +1 -1
- package/src/client/dist/spa/assets/{QSelect-jjUTbbns.js → QSelect-Bi7mKFGZ.js} +1 -1
- package/src/client/dist/spa/assets/{QTooltip-B9mxxMEM.js → QTooltip-BYnhp9Wu.js} +1 -1
- package/src/client/dist/spa/assets/{SearchPage-De3lLcr6.js → SearchPage-BpJsyMPU.js} +1 -1
- package/src/client/dist/spa/assets/{SettingsPage-Dge9J6e_.js → SettingsPage-CzRvaRwA.js} +1 -1
- package/src/client/dist/spa/assets/{TouchPan-BGeQ1z7O.js → TouchPan-BL3ZAMdn.js} +1 -1
- package/src/client/dist/spa/assets/WorkspacePage-3jV0jpk0.js +4 -0
- package/src/client/dist/spa/assets/WorkspacePage-C71K0BRq.css +1 -0
- package/src/client/dist/spa/assets/{build-path-tree-CQkUkFK4.js → build-path-tree-BYsWR1Ae.js} +1 -1
- package/src/client/dist/spa/assets/{cssMode-CGcsO0OQ.js → cssMode-CB-UguH5.js} +1 -1
- package/src/client/dist/spa/assets/{documents-5sWEpISn.js → documents-D4iGKwK5.js} +1 -1
- package/src/client/dist/spa/assets/{editor.api2-DNjj3Vc0.js → editor.api2-CQZx6qEF.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-DpxxCkC7.js → editor.main-CgIzM5Af.js} +2 -2
- package/src/client/dist/spa/assets/{expand-template-Bq1mopti.js → expand-template-lWTPop0I.js} +1 -1
- package/src/client/dist/spa/assets/{formatters-VhgPXQNa.js → formatters-DczUaXQz.js} +1 -1
- package/src/client/dist/spa/assets/{freemarker2-BVvp9ac3.js → freemarker2-OeOcbnhX.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-CmulgLgY.js → handlebars-D9b92bp0.js} +1 -1
- package/src/client/dist/spa/assets/{html-kmOuarw4.js → html-DF7Tipz6.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-Drc_ueTa.js → htmlMode-BXnuNcvL.js} +1 -1
- package/src/client/dist/spa/assets/i18n-BNoynAbv.js +1 -0
- package/src/client/dist/spa/assets/{index-BKXtMMl8.js → index-Deinl-Hq.js} +7 -7
- package/src/client/dist/spa/assets/{javascript-BapMfe_r.js → javascript-ClzpphE4.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-CC4B535-.js → jsonMode-Bzqsvs2S.js} +1 -1
- package/src/client/dist/spa/assets/{kobo-commands-Bz-cjyHQ.js → kobo-commands-DX9Bimii.js} +1 -1
- package/src/client/dist/spa/assets/{layout-C4xmHWJM.js → layout-CXDh7cOk.js} +1 -1
- package/src/client/dist/spa/assets/{liquid-BDE8v2lj.js → liquid-CPVa7-G3.js} +1 -1
- package/src/client/dist/spa/assets/{lspLanguageFeatures-Cy9S4aKY.js → lspLanguageFeatures-D8wj-yjN.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-CyNdhKZN.js → mdx-wcb1Z0A_.js} +1 -1
- package/src/client/dist/spa/assets/{monaco.contribution-DbqInEyL.js → monaco.contribution-BozjOUwK.js} +2 -2
- package/src/client/dist/spa/assets/{network-auth-0eEgS22h.js → network-auth-BkwyxSIr.js} +1 -1
- package/src/client/dist/spa/assets/{project-color-DdAtoeU2.js → project-color-oMfwIMSg.js} +1 -1
- package/src/client/dist/spa/assets/{python-CKjYYxee.js → python-jVYLZZL1.js} +1 -1
- package/src/client/dist/spa/assets/{razor-CvTe87xk.js → razor-BHjeVPxE.js} +1 -1
- package/src/client/dist/spa/assets/{render-chat-markdown-BjVGm1Vi.js → render-chat-markdown-CaUfpvEV.js} +1 -1
- package/src/client/dist/spa/assets/{tsMode-CeJZQNU_.js → tsMode-BlnXnkR-.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-ReN8Og3R.js → typescript-XYkMCAOm.js} +1 -1
- package/src/client/dist/spa/assets/{use-onboarding-BnFTwLyx.js → use-onboarding-DkEHbMS-.js} +1 -1
- package/src/client/dist/spa/assets/{use-quasar-DzB1x4Fl.js → use-quasar-CGpMLh-Q.js} +1 -1
- package/src/client/dist/spa/assets/{workers-BUy4rUs5.js → workers-qP1P6pzp.js} +1 -1
- package/src/client/dist/spa/assets/{xml-DzIIIusY.js → xml-DzTCWoOI.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-2OnB0-yv.js → yaml-Osiizqat.js} +1 -1
- package/src/client/dist/spa/index.html +1 -1
- package/src/mcp-server/kobo-tasks-server.ts +1 -1
- package/src/client/dist/spa/assets/WorkspacePage-B8jyN4oW.js +0 -4
- package/src/client/dist/spa/assets/WorkspacePage-CVkUPM-N.css +0 -1
- package/src/client/dist/spa/assets/i18n-EIgL_1Id.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,26 @@ 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.10.0
|
|
8
|
+
|
|
9
|
+
- fix(agent): make Claude sessions recover cleanly from a stuck post-result
|
|
10
|
+
stream, prevent native wakeups from leaving orphaned questions, and keep
|
|
11
|
+
live sessions out of the `idle` state
|
|
12
|
+
- feat(chat): keep queued messages scoped to the selected workspace session,
|
|
13
|
+
restore them after a rejected send, and confirm delivery only after the
|
|
14
|
+
engine accepts it
|
|
15
|
+
- feat(chat): send a queued message immediately to an active Claude session
|
|
16
|
+
or steer an active Codex turn; serialise concurrent Codex steer requests
|
|
17
|
+
against the current turn id
|
|
18
|
+
- feat(questions): support inline free-form answers for **Other**, option
|
|
19
|
+
previews, structured Codex question ids, missing option arrays, secret
|
|
20
|
+
answers, and stale-question-panel recovery
|
|
21
|
+
- fix(codex): map `request_user_input` and its auto-resolution metadata to the
|
|
22
|
+
shared question UI, and document that structured Codex questions require
|
|
23
|
+
`plan` mode
|
|
24
|
+
- docs: document live steering, interactive-question limitations, and the
|
|
25
|
+
updated Q&A experience in README and CONFIGURATION
|
|
26
|
+
|
|
7
27
|
## 1.9.6
|
|
8
28
|
|
|
9
29
|
- feat(chat): inject a queued message into a running Claude session, with a
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Kōbō runs multiple coding agents in parallel, each isolated in its own git wor
|
|
|
17
17
|
|
|
18
18
|
- **Isolated worktrees**: each workspace is a dedicated git worktree on its own branch, so parallel sessions never collide.
|
|
19
19
|
- **Two agent engines**: Claude Code (via `@anthropic-ai/claude-agent-sdk`) and OpenAI Codex (via `codex app-server`), chosen per workspace.
|
|
20
|
-
- **Live chat**: streaming text, reasoning blocks, inline Edit/Write diffs, per-turn cards, a compaction-in-progress indicator, infinite scrollback. `/` autocompletes skills and commands, `@` fuzzy-autocompletes worktree file paths, and you can export any workspace's session events to CSV. Messages queued while an agent is busy stay scoped to their workspace and session
|
|
20
|
+
- **Live chat**: streaming text, reasoning blocks, inline Edit/Write diffs, per-turn cards, a compaction-in-progress indicator, infinite scrollback. `/` autocompletes skills and commands, `@` fuzzy-autocompletes worktree file paths, and you can export any workspace's session events to CSV. Messages queued while an agent is busy stay scoped to their workspace and session. **Send now** delivers a queued message to an active Claude Code stream or steers the active Codex turn; it remains queued until the engine confirms acceptance.
|
|
21
21
|
- **Full MCP toolset (`kobo-tasks`)**: a per-workspace MCP server the agent uses for far more than tasks — task/acceptance-criteria CRUD, starting/stopping the dev server and reading its logs, a unified `get_ticket` (Notion or Sentry), searching past conversations across every workspace, per-session token/cost usage, and a `.ai/thoughts` decision log. Native Claude Code Task tools complement it for lightweight sub-agent coordination. See [`AGENTS.md`](./AGENTS.md) for the full tool list.
|
|
22
22
|
|
|
23
23
|

|
|
@@ -26,7 +26,7 @@ Kōbō runs multiple coding agents in parallel, each isolated in its own git wor
|
|
|
26
26
|

|
|
27
27
|
- **Dev server panel**: start, stop, and tail logs for a workspace's dev server (Docker or npm) straight from the Tools panel — no need to leave the UI.
|
|
28
28
|
- **Attention indicators**: workspace cards surface CI failures, review-requested changes, and a conflict-aware **ready-to-merge** badge, plus a one-click **Fix CI** button that spawns a fix workspace automatically.
|
|
29
|
-
- **Interactive Q&A**: an agent can pause mid-session to ask a clarifying question through the UI; the workspace surfaces under "Needs Attention" until you answer.
|
|
29
|
+
- **Interactive Q&A**: an agent can pause mid-session to ask a clarifying question through the UI; the workspace surfaces under "Needs Attention" until you answer. Choosing **Other** opens an inline free-form field, and option previews are available on hover. Codex native interactive questions require its `plan` permission mode.
|
|
30
30
|
|
|
31
31
|

|
|
32
32
|
- **Auto-loop**: an opt-in mode that walks the task list, spawning a fresh session per task and stopping once there's nothing left to do, progress stalls, an error occurs, or the agent needs input from you. Optionally run the initial brainstorming session on a stronger model and every task after that on a cheaper one, without leaving the engine you picked.
|
|
@@ -276,7 +276,7 @@ const WORKSPACE_SCOPED_TOOLS = [
|
|
|
276
276
|
},
|
|
277
277
|
{
|
|
278
278
|
name: 'set_workspace_status',
|
|
279
|
-
description: 'CALL WHEN you believe the mission is done (`completed`)
|
|
279
|
+
description: 'CALL WHEN you believe the mission is done (`completed`) or blocked beyond recovery (`error`). Do NOT set `idle` while this agent session is active: ask the user with AskUserQuestion or end the turn instead. Transitions are validated by the backend — invalid or unsafe ones are rejected.',
|
|
280
280
|
inputSchema: {
|
|
281
281
|
type: 'object',
|
|
282
282
|
properties: {
|
package/dist/server/index.js
CHANGED
|
@@ -291,7 +291,7 @@ terminalWss.on('connection', (ws, workspaceId) => {
|
|
|
291
291
|
});
|
|
292
292
|
});
|
|
293
293
|
// Wire websocket-service message handler to the agent orchestrator
|
|
294
|
-
setMessageHandler((type, payload) => {
|
|
294
|
+
setMessageHandler(async (type, payload) => {
|
|
295
295
|
const p = payload;
|
|
296
296
|
if (type === 'chat:message' && p?.workspaceId && p?.content) {
|
|
297
297
|
// Auto-loop owns the agent's turns. A user message means the user wants
|
|
@@ -312,6 +312,8 @@ setMessageHandler((type, payload) => {
|
|
|
312
312
|
if (wsRow?.status === 'awaiting-user') {
|
|
313
313
|
emitEphemeral(p.workspaceId, 'chat:rejected', {
|
|
314
314
|
reason: 'awaiting-user',
|
|
315
|
+
sessionId: p.sessionId,
|
|
316
|
+
content: p.content,
|
|
315
317
|
message: 'Answer via the question panel — typing in chat would orphan the pending callback',
|
|
316
318
|
});
|
|
317
319
|
return;
|
|
@@ -321,16 +323,11 @@ setMessageHandler((type, payload) => {
|
|
|
321
323
|
// never steal the tagging.
|
|
322
324
|
const activeSession = getActiveSession(p.workspaceId);
|
|
323
325
|
const sessionTag = p.sessionId ?? activeSession?.id ?? undefined;
|
|
324
|
-
// Forced sends are persisted only once the active engine has accepted the
|
|
325
|
-
// input, so a stale session cannot make the client lose its queued text.
|
|
326
|
-
if (!p.force)
|
|
327
|
-
emit(p.workspaceId, 'user:message', { content: p.content, sender: 'user' }, sessionTag);
|
|
328
326
|
try {
|
|
329
|
-
sendMessage(p.workspaceId, p.content, p.sessionId);
|
|
330
|
-
|
|
331
|
-
|
|
327
|
+
await sendMessage(p.workspaceId, p.content, p.sessionId);
|
|
328
|
+
emit(p.workspaceId, 'user:message', { content: p.content, sender: 'user' }, sessionTag);
|
|
329
|
+
if (p.force)
|
|
332
330
|
emitEphemeral(p.workspaceId, 'chat:accepted', { sessionId: p.sessionId });
|
|
333
|
-
}
|
|
334
331
|
}
|
|
335
332
|
catch (err) {
|
|
336
333
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -338,8 +335,7 @@ setMessageHandler((type, payload) => {
|
|
|
338
335
|
// (stdin closed, process dead mid-write, etc.) should surface to the
|
|
339
336
|
// logs instead of silently respawning a fresh agent.
|
|
340
337
|
if (!msg.includes('No agent running')) {
|
|
341
|
-
|
|
342
|
-
emitEphemeral(p.workspaceId, 'chat:rejected', { sessionId: p.sessionId, message: msg });
|
|
338
|
+
emitEphemeral(p.workspaceId, 'chat:rejected', { sessionId: p.sessionId, content: p.content, message: msg });
|
|
343
339
|
console.error(`[ws] chat:message failed for workspace ${p.workspaceId}:`, err);
|
|
344
340
|
return;
|
|
345
341
|
}
|
|
@@ -353,12 +349,25 @@ setMessageHandler((type, payload) => {
|
|
|
353
349
|
// requires them (e.g. grooming), it sets the override to bypass the
|
|
354
350
|
// workspace default for this spawn only.
|
|
355
351
|
const effectiveMode = p.agentPermissionModeOverride ?? workspace.agentPermissionMode;
|
|
356
|
-
startAgent(p.workspaceId, worktreePath, p.content, workspace.model, true, effectiveMode, p.sessionId, workspace.reasoningEffort);
|
|
352
|
+
const started = startAgent(p.workspaceId, worktreePath, p.content, workspace.model, true, effectiveMode, p.sessionId, workspace.reasoningEffort);
|
|
357
353
|
updateWorkspaceStatus(p.workspaceId, 'executing');
|
|
354
|
+
const resumedSessionId = p.sessionId ?? started.agentSessionId;
|
|
355
|
+
emit(p.workspaceId, 'user:message', { content: p.content, sender: 'user' }, resumedSessionId);
|
|
356
|
+
if (p.force)
|
|
357
|
+
emitEphemeral(p.workspaceId, 'chat:accepted', { sessionId: resumedSessionId });
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
emitEphemeral(p.workspaceId, 'chat:rejected', {
|
|
361
|
+
sessionId: p.sessionId,
|
|
362
|
+
content: p.content,
|
|
363
|
+
message: `Workspace '${p.workspaceId}' not found`,
|
|
364
|
+
});
|
|
358
365
|
}
|
|
359
366
|
}
|
|
360
367
|
catch (restartErr) {
|
|
361
|
-
|
|
368
|
+
const message = restartErr instanceof Error ? restartErr.message : String(restartErr);
|
|
369
|
+
emitEphemeral(p.workspaceId, 'chat:rejected', { sessionId: p.sessionId, content: p.content, message });
|
|
370
|
+
console.error('[ws] Failed to resume agent:', message);
|
|
362
371
|
}
|
|
363
372
|
}
|
|
364
373
|
}
|
|
@@ -1230,6 +1230,7 @@ app.post('/:id/deferred-tool-use/answer', async (c) => {
|
|
|
1230
1230
|
}
|
|
1231
1231
|
await agentManager.answerPendingQuestion(id, body.answers, body.toolCallId, {
|
|
1232
1232
|
awaitingFreeForm: body.awaitingFreeForm === true,
|
|
1233
|
+
...(typeof body.response === 'string' ? { response: body.response } : {}),
|
|
1233
1234
|
});
|
|
1234
1235
|
return c.json({ ok: true });
|
|
1235
1236
|
}
|
|
@@ -1795,6 +1796,9 @@ app.patch('/:id', migrationGuard, async (c) => {
|
|
|
1795
1796
|
updated = workspaceService.updateAgentPermissionMode(id, body.agentPermissionMode);
|
|
1796
1797
|
}
|
|
1797
1798
|
if (body.status) {
|
|
1799
|
+
if (body.status === 'idle' && agentManager.hasController(id)) {
|
|
1800
|
+
return c.json({ error: 'Cannot mark an active agent workspace idle; end or stop the agent session first' }, 409);
|
|
1801
|
+
}
|
|
1798
1802
|
updated = workspaceService.updateWorkspaceStatus(id, body.status);
|
|
1799
1803
|
}
|
|
1800
1804
|
if (body.name !== undefined) {
|
|
@@ -233,29 +233,12 @@ export function createClaudeCodeEngine() {
|
|
|
233
233
|
console.warn(`[claude-engine] SDK generator still open ${RESULT_DRAIN_TIMEOUT_MS}ms after 'result' — forcing session:ended`);
|
|
234
234
|
const reason = userInterrupted ? 'killed' : mapperState.sawErrorResult ? 'error' : 'completed';
|
|
235
235
|
emitSessionEnded(reason, reason === 'completed' ? 0 : null);
|
|
236
|
-
//
|
|
237
|
-
//
|
|
238
|
-
//
|
|
239
|
-
//
|
|
240
|
-
//
|
|
241
|
-
|
|
242
|
-
// controller is removed, letting the wakeup fire later); the parked
|
|
243
|
-
// generator drains on its own once the background work finishes.
|
|
244
|
-
//
|
|
245
|
-
// The wakeup check is a dynamic import: a static `import` of
|
|
246
|
-
// wakeup-service here would form an engine → wakeup-service →
|
|
247
|
-
// orchestrator → engine cycle that breaks module init under the test
|
|
248
|
-
// SSR transform. Resolving it at call-time (once, 15s after result)
|
|
249
|
-
// sidesteps the cycle with no hot-path cost.
|
|
250
|
-
void (async () => {
|
|
251
|
-
const { isWakeupScheduled } = await import('../../../wakeup-service.js');
|
|
252
|
-
if (isWakeupScheduled(options.workspaceId)) {
|
|
253
|
-
console.warn(`[claude-engine] generator still open ${RESULT_DRAIN_TIMEOUT_MS}ms after 'result' but a wakeup is scheduled for ${options.workspaceId} — leaving background work alive (no abort)`);
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
abortController.abort();
|
|
257
|
-
}
|
|
258
|
-
})();
|
|
236
|
+
// A wakeup starts a new turn later; it cannot safely keep this SDK
|
|
237
|
+
// stream alive after Kōbō has emitted session:ended and detached its
|
|
238
|
+
// controller. Leaving it alive lets late hooks issue AskUserQuestion
|
|
239
|
+
// calls against a closed input stream, producing an unanswerable UI
|
|
240
|
+
// card followed by "Stream closed". Abort deterministically instead.
|
|
241
|
+
abortController.abort();
|
|
259
242
|
}, RESULT_DRAIN_TIMEOUT_MS);
|
|
260
243
|
resultDrainTimer.unref?.();
|
|
261
244
|
};
|
|
@@ -397,6 +380,7 @@ export function createClaudeCodeEngine() {
|
|
|
397
380
|
updatedInput: {
|
|
398
381
|
...(typeof questions !== 'undefined' ? { questions } : {}),
|
|
399
382
|
answers: response.answers,
|
|
383
|
+
...(response.response !== undefined ? { response: response.response } : {}),
|
|
400
384
|
},
|
|
401
385
|
});
|
|
402
386
|
return true;
|
|
@@ -10,7 +10,7 @@ const KOBO_MCP_BRIEF = [
|
|
|
10
10
|
'• `kobo__search_codebase` to recall prior chat history (conversations, not source — use Grep for source).',
|
|
11
11
|
'• `kobo__read_workspace_events_csv` to read paginated user/agent history from this workspace across sessions when prior context is useful. Use `limit` + `offset` (and optional `session_id`) instead of loading everything.',
|
|
12
12
|
'• `kobo__get_workspace_info` / `kobo__get_git_info` / `kobo__get_ticket` for context.',
|
|
13
|
-
'• `kobo__set_workspace_status` when the mission is done
|
|
13
|
+
'• `kobo__set_workspace_status` when the mission is done or irrecoverably blocked. Never set `idle` while this session is active; use AskUserQuestion for clarification, or end the turn.',
|
|
14
14
|
'• `kobo__schedule_wakeup` / `kobo__cancel_wakeup` to schedule (or cancel) a follow-up session — prefer these over the built-in `ScheduleWakeup` tool.',
|
|
15
15
|
'Each tool carries its own "WHEN to use" guidance in its description — follow it.',
|
|
16
16
|
].join('\n');
|
|
@@ -28,6 +28,10 @@ export function buildClaudeOptions(input) {
|
|
|
28
28
|
const options = {
|
|
29
29
|
cwd: input.workingDir,
|
|
30
30
|
systemPrompt: { type: 'preset', preset: 'claude_code', append: KOBO_SYSTEM_APPEND },
|
|
31
|
+
// Kōbō persists wakeups independently of the SDK and creates a fresh
|
|
32
|
+
// controller when they fire. The native wakeup is bound to one SDK stream,
|
|
33
|
+
// so it can outlive Kōbō's controller and produce unanswerable questions.
|
|
34
|
+
disallowedTools: ['ScheduleWakeup'],
|
|
31
35
|
// Leave `tools` undefined: the `claude_code` preset EXCLUDES MCP tools, so
|
|
32
36
|
// under bypassPermissions MCP tools surface as "haven't granted it yet"
|
|
33
37
|
// even when the user chose bypass. Undefined → full toolbox (built-ins +
|
|
@@ -26,6 +26,9 @@ export function createAppServerClient(opts) {
|
|
|
26
26
|
startTurn(params) {
|
|
27
27
|
return peer.request('turn/start', params);
|
|
28
28
|
},
|
|
29
|
+
steerTurn(params) {
|
|
30
|
+
return peer.request('turn/steer', params);
|
|
31
|
+
},
|
|
29
32
|
async interruptTurn(params) {
|
|
30
33
|
await peer.request('turn/interrupt', params);
|
|
31
34
|
},
|
|
@@ -32,6 +32,8 @@ export function createCodexEngine() {
|
|
|
32
32
|
let iteratorRunning = false;
|
|
33
33
|
let userInterrupted = false;
|
|
34
34
|
let discoveredSessionId = options.resumeFromEngineSessionId;
|
|
35
|
+
let activeTurnId;
|
|
36
|
+
let steerChain = Promise.resolve();
|
|
35
37
|
const safeEmit = (ev) => {
|
|
36
38
|
try {
|
|
37
39
|
onEvent(ev);
|
|
@@ -99,7 +101,8 @@ export function createCodexEngine() {
|
|
|
99
101
|
const n = params;
|
|
100
102
|
for (const ev of handleTurnCompleted(n, mapperState))
|
|
101
103
|
safeEmit(ev);
|
|
102
|
-
|
|
104
|
+
if (!activeTurnId || !n.turn?.id || n.turn.id === activeTurnId)
|
|
105
|
+
resolveTurnDone();
|
|
103
106
|
return;
|
|
104
107
|
}
|
|
105
108
|
if (method === 'thread/tokenUsage/updated') {
|
|
@@ -176,11 +179,12 @@ export function createCodexEngine() {
|
|
|
176
179
|
safeEmit(ev);
|
|
177
180
|
// collaborationMode is sticky server-side — always send it explicitly,
|
|
178
181
|
// never omit (would leave a Bypass turn stuck in a previous Plan mode).
|
|
179
|
-
await client.startTurn({
|
|
182
|
+
const initialTurn = await client.startTurn({
|
|
180
183
|
threadId: discoveredSessionId,
|
|
181
184
|
input,
|
|
182
185
|
collaborationMode,
|
|
183
186
|
});
|
|
187
|
+
activeTurnId = initialTurn.turnId;
|
|
184
188
|
await turnDonePromise;
|
|
185
189
|
const reason = mapperState.sawErrorResult
|
|
186
190
|
? 'error'
|
|
@@ -235,8 +239,21 @@ export function createCodexEngine() {
|
|
|
235
239
|
isAlive() {
|
|
236
240
|
return iteratorRunning;
|
|
237
241
|
},
|
|
238
|
-
sendMessage() {
|
|
239
|
-
|
|
242
|
+
sendMessage(text) {
|
|
243
|
+
const steer = async () => {
|
|
244
|
+
if (!discoveredSessionId || !activeTurnId) {
|
|
245
|
+
throw new Error('Codex session is not ready to receive a message');
|
|
246
|
+
}
|
|
247
|
+
const response = await client.steerTurn({
|
|
248
|
+
threadId: discoveredSessionId,
|
|
249
|
+
expectedTurnId: activeTurnId,
|
|
250
|
+
input: [{ type: 'text', text, text_elements: [] }],
|
|
251
|
+
});
|
|
252
|
+
activeTurnId = response.turnId;
|
|
253
|
+
};
|
|
254
|
+
const queued = steerChain.then(steer);
|
|
255
|
+
steerChain = queued.catch(() => { });
|
|
256
|
+
return queued;
|
|
240
257
|
},
|
|
241
258
|
interrupt() {
|
|
242
259
|
userInterrupted = true;
|
|
@@ -7,7 +7,7 @@ const CODEX_KOBO_MCP_BRIEF = [
|
|
|
7
7
|
'• `mcp__kobo-tasks__log_thought` to persist notable decisions to `.ai/thoughts/logs/<date>-<slug>.md`.',
|
|
8
8
|
'• `mcp__kobo-tasks__search_codebase` to recall prior chat history (conversations, not source — use shell tools for source).',
|
|
9
9
|
'• `mcp__kobo-tasks__get_workspace_info` / `mcp__kobo-tasks__get_git_info` / `mcp__kobo-tasks__get_ticket` for context.',
|
|
10
|
-
'• `mcp__kobo-tasks__set_workspace_status` when the mission is done
|
|
10
|
+
'• `mcp__kobo-tasks__set_workspace_status` when the mission is done or irrecoverably blocked. Never set `idle` while this session is active; ask the user or end the turn instead.',
|
|
11
11
|
'• `mcp__kobo-tasks__schedule_wakeup` / `mcp__kobo-tasks__cancel_wakeup` to schedule (or cancel) a follow-up session.',
|
|
12
12
|
'Each tool carries its own "WHEN to use" guidance in its description — follow it.',
|
|
13
13
|
].join('\n');
|
|
@@ -36,12 +36,23 @@ export function handleServerRequest(args) {
|
|
|
36
36
|
}
|
|
37
37
|
if (method === 'item/tool/requestUserInput') {
|
|
38
38
|
register(callId, { requestId, kind: 'user_input', payload: p });
|
|
39
|
+
// Codex allows a free-form question to omit `options` (or send null),
|
|
40
|
+
// while the shared question panel always renders an array. Keep Codex's
|
|
41
|
+
// `id` so the UI can return the protocol key instead of the display text.
|
|
42
|
+
const questions = Array.isArray(p.questions)
|
|
43
|
+
? p.questions.map((question) => {
|
|
44
|
+
if (!question || typeof question !== 'object')
|
|
45
|
+
return question;
|
|
46
|
+
const raw = question;
|
|
47
|
+
return { ...raw, options: Array.isArray(raw.options) ? raw.options : [] };
|
|
48
|
+
})
|
|
49
|
+
: [];
|
|
39
50
|
emit({
|
|
40
51
|
kind: 'session:user-input-requested',
|
|
41
52
|
requestKind: 'question',
|
|
42
53
|
toolCallId: callId,
|
|
43
54
|
toolName: 'AskUserQuestion',
|
|
44
|
-
payload: { questions: p.
|
|
55
|
+
payload: { questions, autoResolutionMs: p.autoResolutionMs },
|
|
45
56
|
});
|
|
46
57
|
return true;
|
|
47
58
|
}
|
|
@@ -845,7 +845,7 @@ export function sendMessage(workspaceId, content, expectedSessionId) {
|
|
|
845
845
|
throw new Error(`Session '${expectedSessionId}' is not active for workspace '${workspaceId}'`);
|
|
846
846
|
}
|
|
847
847
|
wakeupService.cancel(workspaceId, 'user-message');
|
|
848
|
-
ctrl.sendMessage(content);
|
|
848
|
+
return ctrl.sendMessage(content);
|
|
849
849
|
}
|
|
850
850
|
/**
|
|
851
851
|
* Render the user's answer to an AskUserQuestion as a markdown chat
|
|
@@ -859,10 +859,13 @@ function formatDeferredAnswerForChat(questions, answers) {
|
|
|
859
859
|
for (const q of questions) {
|
|
860
860
|
if (!q || typeof q !== 'object')
|
|
861
861
|
continue;
|
|
862
|
+
if (q.isSecret === true)
|
|
863
|
+
continue;
|
|
862
864
|
const questionText = typeof q.question === 'string' ? q.question : null;
|
|
863
865
|
if (!questionText)
|
|
864
866
|
continue;
|
|
865
|
-
const
|
|
867
|
+
const questionId = typeof q.id === 'string' ? q.id : questionText;
|
|
868
|
+
const answer = answers[questionId] ?? answers[questionText];
|
|
866
869
|
if (!answer)
|
|
867
870
|
continue;
|
|
868
871
|
lines.push(`- **${questionText}** → ${answer}`);
|
|
@@ -914,7 +917,11 @@ export async function answerPendingQuestion(workspaceId, answers, expectedToolCa
|
|
|
914
917
|
if (!engineProcess) {
|
|
915
918
|
throw new Error(`Agent for workspace '${workspaceId}' has no active engine process`);
|
|
916
919
|
}
|
|
917
|
-
const resolved = engineProcess.resolvePendingUserInput(head.toolCallId, {
|
|
920
|
+
const resolved = engineProcess.resolvePendingUserInput(head.toolCallId, {
|
|
921
|
+
kind: 'question',
|
|
922
|
+
answers,
|
|
923
|
+
...(opts?.response !== undefined ? { response: opts.response } : {}),
|
|
924
|
+
});
|
|
918
925
|
if (!resolved) {
|
|
919
926
|
throw new Error(`No pending callback for toolCallId '${head.toolCallId}'`);
|
|
920
927
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
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{$ as e,B as t,F as n,I as r,R as i,S as a,U as o,W as s,_ as c,at as l,b as u,c as d,ct as f,g as p,h as m,it as h,k as g,m as _,n as v,p as y,s as b,st as x,y as S}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{l as C,t as w}from"./QIcon-C6E-oEjI.js";import{B as T,C as E,N as D,S as O,d as k,p as A,x as j,z as ee}from"./index-
|
|
1
|
+
import{$ as e,B as t,F as n,I as r,R as i,S as a,U as o,W as s,_ as c,at as l,b as u,c as d,ct as f,g as p,h as m,it as h,k as g,m as _,n as v,p as y,s as b,st as x,y as S}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{l as C,t as w}from"./QIcon-C6E-oEjI.js";import{B as T,C as E,N as D,S as O,d as k,p as A,x as j,z as ee}from"./index-Deinl-Hq.js";import{t as te}from"./QSpinnerDots-DIV68-cV.js";import{t as M}from"./QTooltip-BYnhp9Wu.js";import{t as N}from"./QExpansionItem-Sh9QNOLB.js";import{t as ne}from"./QScrollArea-CbA9gH0b.js";import{t as re}from"./documents-D4iGKwK5.js";import{i as ie,n as ae,t as P}from"./render-chat-markdown-CaUfpvEV.js";import{t as F}from"./_plugin-vue_export-helper-BDNMzG2s.js";function oe(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:compacting`:case`session:brainstorm-complete`:case`session:user-input-requested`:case`message:raw`:case`skills:discovered`:case`usage`:case`rate_limit`:case`subagent:progress`:case`error`:break;default:}}let o=null;for(let e of r)e.type===`text`&&e.streaming&&(o&&(o.streaming=!1),o=e);return o&&!n&&(o.streaming=!1),r}function se(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),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 I=new Set([`setup`,`cleanup`,`archive`]);function L(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:I.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function ce(e){let t=[],n=null,r=null;for(let i of e){let e=L(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 R={class:`text-caption text-grey-6`},z=a({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,n=y(()=>{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)=>(i(),c(`span`,R,f(e.$t(n.value)),1))}});function le(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){ue(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 ue(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=B(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 B(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 V=[`innerHTML`],H=F(a({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,n=re(),r=k(),a=y(()=>{let e=r.selectedWorkspaceId;return e?n.documentsFor(e).map(e=>e.path):[]}),o=y(()=>ae(le(ie.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),a.value),{addAttr:[`data-document-path`]}));function s(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)=>(i(),c(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,V),e.item.streaming?(i(),m(C,{key:0,size:`xs`,class:`q-ml-xs`})):p(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]),de={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},U=[`innerHTML`],W={key:1,style:{"white-space":`pre-wrap`}},G=F(a({__name:`ThinkingItem`,props:{item:{}},setup(e){let t=e,n=y(()=>t.item.text.trim().slice(0,100)),r=y(()=>t.item.text.trim().length>0),a=y(()=>t.item.text.trim().length>100),o=y(()=>P(t.item.text));return(t,l)=>r.value?(i(),c(`div`,de,[a.value?(i(),m(N,{key:0,dense:``,"dense-toggle":``,label:n.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:s(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:o.value},null,8,U)]),_:1},8,[`label`])):(i(),c(`span`,W,f(e.item.text),1))])):p(``,!0)}}),[[`__scopeId`,`data-v-7f45ed94`]]);function K(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 fe(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 pe(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=fe(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{$ as e,B as t,F as n,R as r,S as i,W as a,_ as o,b as s,c,ct as l,g as u,h as d,it as f,m as p}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{N as m,gt as h,mt as g,s as _}from"./index-
|
|
1
|
+
import{$ as e,B as t,F as n,R as r,S as i,W as a,_ as o,b as s,c,ct as l,g as u,h as d,it as f,m as p}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{N as m,gt as h,mt as g,s as _}from"./index-Deinl-Hq.js";import{t as v}from"./render-chat-markdown-CaUfpvEV.js";import{t as y}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as b}from"./QSpace-ezNrZkuj.js";import{t as x}from"./QChip-Bq-3SzSI.js";import{t as S}from"./QPage-D3rjwA1l.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(i({__name:`ChangelogPage`,setup(i){let y=_(),N=e([]),P=e(``),F=e(!1),I=e(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 n(R),(e,n)=>(r(),d(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[p(`div`,C,[s(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:n[0]||=e=>f(y).back()}),p(`div`,w,l(e.$t(`changelog.title`)),1),s(b),s(m,{flat:``,dense:``,icon:`refresh`,loading:F.value,label:e.$t(`common.refresh`),onClick:R},null,8,[`loading`,`label`])]),F.value&&N.value.length===0?(r(),o(`div`,T,l(e.$t(`common.loading`)),1)):I.value?(r(),o(`div`,E,l(I.value),1)):N.value.length===0?(r(),o(`div`,D,l(e.$t(`changelog.empty`)),1)):(r(),o(`div`,O,[P.value?(r(),o(`div`,k,l(e.$t(`changelog.currentVersion`,{version:P.value})),1)):u(``,!0),(r(!0),o(c,null,t(N.value,t=>(r(),d(g,{key:t.version,dark:``,flat:``,bordered:``},{default:a(()=>[s(h,null,{default:a(()=>[p(`div`,A,[p(`div`,j,` v`+l(t.version),1),t.version===P.value?(r(),d(x,{key:0,dense:``,size:`sm`,color:`indigo-7`,"text-color":`grey-2`,label:e.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):u(``,!0)]),p(`div`,{class:`changelog-notes`,innerHTML:L(t.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-C6E-oEjI.js";import{nt as n,rt as r}from"./index-
|
|
1
|
+
import{P as e,b as t}from"./QIcon-C6E-oEjI.js";import{nt as n,rt as r}from"./index-Deinl-Hq.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=r(e);i!==void 0&&n(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};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{$ as e,B as t,F as n,I as r,O as i,R as a,S as ee,U as o,W as s,_ as c,at as te,b as l,c as ne,ct as u,g as d,h as f,it as p,k as re,m,n as ie,o as ae,ot as oe,p as h,s as g,w as se,y as _}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{t as v}from"./QIcon-C6E-oEjI.js";import{t as ce}from"./QSeparator-DWTCQxsa.js";import{t as le}from"./QInput-BF8x4RTv.js";import{E as ue,N as y,d as de,l as fe,s as pe,x as me,z as he}from"./index-BKXtMMl8.js";import{t as ge}from"./QSpinnerDots-DIV68-cV.js";import{n as b,r as x,t as _e}from"./use-quasar-DzB1x4Fl.js";import{l as S,t as C}from"./QSelect-jjUTbbns.js";import{t as w}from"./QTooltip-B9mxxMEM.js";import{t as ve}from"./QExpansionItem-Dka3X1IN.js";import{t as ye}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as be}from"./QSpace-ezNrZkuj.js";import{t as xe}from"./QBtnToggle-CtKvYj1o.js";import{i as Se}from"./project-color-DdAtoeU2.js";import{t as Ce}from"./QPage-D3rjwA1l.js";import{a as we,i as Te,n as Ee,r as De,t as Oe}from"./expand-template-Bq1mopti.js";import{i as ke,r as Ae,t as je}from"./permissionModes-6jhegAm-.js";var Me=`kobo:create-page-prefs`;function T(){try{let e=localStorage.getItem(Me);return e===null?void 0:JSON.parse(e)}catch{return}}function Ne(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Pe(){let e=T();if(!Ne(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),Ne(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 Fe(e){try{localStorage.setItem(Me,JSON.stringify(e))}catch{}}var Ie={class:`create-inner`},Le={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Re={class:`create-card rounded-borders`},ze={class:`card-top-bar row items-center q-px-md q-py-xs`},Be={class:`model-badge cursor-default row items-center q-gutter-xs`},Ve={class:`text-indigo-3 text-weight-medium text-caption`},He={key:0,class:`notion-url-wrap`},Ue={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},We={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},Ge={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ke={class:`text-caption text-grey-4 q-mb-sm`},qe={class:`row q-gutter-sm`},Je={class:`peek-card-text`},Ye={class:`peek-card-title`},Xe={class:`peek-card-desc`},Ze={class:`peek-card-text`},Qe={class:`peek-card-title`},$e={class:`peek-card-desc`},et={key:0,class:`sentry-url-wrap`},tt={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},nt={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},rt={class:`card-name-wrap`},it={class:`card-textarea-wrap`},at={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},ot={key:0,class:`row items-center text-caption text-amber-6`},st={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},ct={class:`q-pa-sm manual-section-body`},lt={class:`row items-center q-gutter-sm q-mb-sm`},ut={class:`col text-caption text-grey-4`},dt={class:`q-pa-sm manual-section-body`},ft={class:`row items-center q-gutter-sm q-mb-sm`},pt={class:`col text-caption text-grey-4`},mt={class:`card-bottom-bar`},ht={class:`row q-col-gutter-xs q-px-xs`},gt={key:0,class:`col-12 col-sm-6 col-md-3`},_t={class:`bottom-select-label row items-center no-wrap`},vt={class:`col-12 col-sm-6 col-md-3`},yt={class:`bottom-select-label row items-center no-wrap`},bt={key:0,class:`text-grey-5 q-mr-xs`},xt={class:`col-12 col-sm-6 col-md-3`},St={class:`bottom-select-label row items-center no-wrap`},Ct={class:`col-12 col-md-3`},wt={class:`bottom-select-label row items-center no-wrap`},Tt={class:`column q-pa-xs col-12 items-center`},Et={class:`row q-col-gutter-xs items-center justify-center`},Dt={class:`col-12 col-md-auto`},Ot={key:0,class:`col-12 row justify-center q-mt-xs`},kt={class:`auto-loop-session-panel row items-center no-wrap q-gutter-xs`},At={class:`auto-loop-session-label`},jt={key:0,class:`auto-loop-brainstorm-panel row items-center q-gutter-xs q-mt-xs`},Mt={class:`auto-loop-brainstorm-label`},Nt={class:`bottom-select-label row items-center no-wrap`},Pt={class:`text-grey-5 q-mr-xs`},Ft={class:`bottom-select-label row items-center no-wrap`},It={class:`text-grey-5 q-mr-xs`},Lt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},Rt={class:`col-12 col-md-auto`},zt={class:`col-12 col-md-auto`},Bt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Vt={class:`col-12 col-md-4`},Ht={key:0,class:`col-12 col-md-4`},Ut={class:`bottom-select-label row items-center no-wrap`},Wt={key:1,class:`col-12 col-md-4`},Gt={class:`bottom-select-label row items-center no-wrap`},Kt={class:`col-12 col-md-4`},qt={class:`bottom-select-label row items-center no-wrap`},Jt={class:`row justify-center q-px-sm q-py-sm`},Yt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Xt=6e4,E=ye(ee({__name:`CreatePage`,setup(ee){function ye(e){return e.disabled===!0}let Me=pe(),T=_e(),Ne=de(),E=me(),{t:D}=he(),Zt=e([]),Qt=e(``),O=e(``),$t=e(null),en=e(``),k=e(!1),A=e(!1),tn=e(null),nn=e(null),rn=e([]),an=e(null),j=e(``),M=e(!1),N=e(`claude-opus-4-8`),P=e(`claude-opus-4-8`),on=e(`auto`),F=e(`auto`),I=e({}),L=e(``),R=e(null),z=e(`feature`),B=e(!1),sn=h(()=>E.global.voiceEnabled),cn=e([]),V=e(`claude-code`),ln=h(()=>cn.value.find(e=>e.id===V.value)),un=h(()=>cn.value.map(e=>({value:e.id,label:e.displayName}))),dn=h(()=>E.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),fn=[`plan`,`bypass`,`strict`,`interactive`];function pn(e,t){let n=e?E.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&fn.includes(r))return r;let i=E.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&fn.includes(i)?i:n?.dangerouslySkipPermissions??E.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let H=e(pn(``,V.value)),mn=h(()=>{switch(H.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),hn=h(()=>(je[V.value]??fn).map(e=>({value:e,label:D(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),U=e([]),gn=e([]),_n=e(!1),vn=e(!1);function yn(e,t){t(()=>{gn.value=e?U.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):U.value})}let bn=ue();function xn(){return $t.value?.nativeEl??null}let{showSkills:Sn,selectedSkillIndex:Cn,groupedDropdown:wn,flatDropdown:W,fetchSkills:Tn,detectSlashFragment:En,replaceFragmentWith:Dn,closeDropdown:On}=Te(O,xn,{excludeKoboCommands:!0});Tn(),o(O,async()=>{await re(),await En()});function kn(e){if(e.type===`template`){let t=bn.templates.find(t=>t.slug===e.name);if(!t)return;Dn(Ee(t.content,Oe({workspace:null,gitStats:null,sessionName:null}))),On();return}Dn(`/${e.name} `),On()}function An(e){!Sn.value||W.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),Cn.value=(Cn.value+1)%W.value.length):e.key===`ArrowUp`?(e.preventDefault(),Cn.value=(Cn.value-1+W.value.length)%W.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),kn(W.value[Cn.value])):e.key===`Escape`&&(e.preventDefault(),On()))}async function jn(){if(!(!sn.value||k.value||A.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){T.notify({type:`warning`,message:D(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});nn.value=e,rn.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&&rn.value.push(e.data)},n.start(),tn.value=n,k.value=!0,an.value=setTimeout(()=>{G(),T.notify({type:`info`,message:D(`voice.maxDurationReached`),position:`top`,timeout:3500})},Xt)}catch{T.notify({type:`negative`,message:D(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function G(){if(!k.value)return;let e=tn.value;if(!e)return;k.value=!1,A.value=!0,an.value&&=(clearTimeout(an.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(rn.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`,E.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()&&(O.value=O.value?`${O.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;T.notify({type:`negative`,message:D({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{tn.value=null,rn.value=[],nn.value?.getTracks().forEach(e=>{e.stop()}),nn.value=null,A.value=!1}}function Mn(e){return sn.value?E.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function Nn(e){!Mn(e)||e.repeat||(e.preventDefault(),jn())}function Pn(e){Mn(e)&&(e.preventDefault(),G())}function Fn(){k.value&&G()}function In(){document.visibilityState!==`visible`&&k.value&&G()}let K=h(()=>(ke[V.value]??Ae).map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));o(V,()=>{let e=K.value.map(e=>e.value);if(e.length>0){let t=E.global.defaultModelByEngine?.[V.value];typeof t==`string`&&e.includes(t)?N.value=t:e.includes(N.value)||(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`);let t=je[V.value]??[];t.length>0&&!t.includes(H.value)&&(H.value=pn(L.value,V.value));let n=(De[V.value]??[]).map(e=>e.value);n.length>0&&!n.includes(F.value)&&(F.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function Ln(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Rn=h(()=>(De[V.value]??De[`claude-code`]).map(e=>({value:e.value,label:Ln(D(e.i18nLabelKey)),description:D(e.i18nDescriptionKey)})));o(N,e=>{let t=I.value[e];t&&Rn.value.some(e=>e.value===t)&&(F.value=t)}),o(F,e=>{I.value={...I.value,[N.value]:e},Fe({...Pe(),reasoningEffortByModel:I.value})});let q=h(()=>{let e=j.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),zn=h(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(j.value)),J=e(`panel`);function Bn(){let e=j.value.trim();return J.value===`parent`&&zn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let Vn=e([]),Hn=e([]),Un=e(``),Wn=e(``),Gn=h(()=>!M.value||!q.value);function Kn(){let e=Un.value.trim();e&&(Vn.value.push(e),Un.value=``)}function qn(e){Vn.value.splice(e,1)}function Jn(){let e=Wn.value.trim();e&&(Hn.value.push(e),Wn.value=``)}function Yn(e){Hn.value.splice(e,1)}function Xn(){M.value=!M.value,M.value||(j.value=``)}let Y=e(!1),X=e(!1),Zn=e(`per_task`);o(()=>X.value,e=>{e&&H.value!==`bypass`&&(H.value=`bypass`)});function Qn(){X.value=!X.value,X.value&&(P.value=N.value)}let Z=e(``),$n=h(()=>/\/issues\/\d+/.test(Z.value.trim()));function er(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=e(!1),$=e(null),tr=e([]),nr=e(!1);async function rr(){if(!L.value.trim()){tr.value=[];return}nr.value=!0;try{tr.value=await Ne.fetchOrphanWorktrees(L.value.trim())}catch{tr.value=[]}finally{nr.value=!1}}function ir(){Q.value=!Q.value,Q.value?(M.value=!1,j.value=``,Y.value=!1,Z.value=``,B.value=!0,rr()):$.value=null}o(L,()=>{$.value=null,Q.value&&rr()}),o($,e=>{if(!e)return;let t=tr.value.find(t=>t.path===e);t&&(R.value=t.suggestedSourceBranch),B.value=!0});async function ar(e){if(!e.trim()){U.value=[],R.value=null;return}_n.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();U.value=n.local??n.branches??[],U.value.length>0&&!R.value&&(R.value=U.value[0]??null)}catch{U.value=[],R.value=null}finally{_n.value=!1}}function or(e){let t=E.getProjectByPath(e);if(t){t.defaultSourceBranch&&(R.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(O.value===``||O.value===en.value)&&(O.value=e,en.value=e);let n=K.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))N.value=t.defaultModel;else{let e=E.global.defaultModelByEngine?.[V.value];typeof e==`string`&&n.includes(e)&&(N.value=e)}}H.value=pn(e,V.value)}let sr=null;o(L,e=>{sr&&clearTimeout(sr),sr=setTimeout(()=>{R.value=null,ar(e),or(e)},500)});function cr(e,t){let n=e.toLowerCase();t(()=>{Zt.value=E.projectPaths.filter(e=>e.toLowerCase().includes(n)||Se(e).toLowerCase().includes(n))})}function lr(e){L.value=E.projectPaths.find(t=>Se(t)===e)??e}n(async()=>{await E.fetchSettings();let e=E.global.branchPrefixes;e.length>0&&!e.includes(z.value)&&(z.value=e[0]);let t=Pe();I.value=t.reasoningEffortByModel??{},t.autoLoop===!0&&(X.value=!0),t.autoLoopSessionMode===`continuous`&&(Zn.value=`continuous`),t.autoLoop===!0&&t.brainstormModel&&(P.value=t.brainstormModel),t.projectPath&&E.projectPaths.includes(t.projectPath)&&(L.value=t.projectPath),H.value=pn(L.value,V.value);try{let e=await fetch(`/api/engines`);e.ok&&(cn.value=await e.json())}catch{}{let e=K.value.map(e=>e.value),t=E.global.defaultModelByEngine?.[V.value];typeof t==`string`&&e.includes(t)?N.value=t:e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let n=I.value[N.value];n&&Rn.value.some(e=>e.value===n)&&(F.value=n);{let e=K.value.map(e=>e.value);e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,Nn),window.addEventListener(`keyup`,Pn),window.addEventListener(`blur`,Fn),document.addEventListener(`visibilitychange`,In)}),r(()=>{sr&&clearTimeout(sr),window.removeEventListener(`keydown`,Nn),window.removeEventListener(`keyup`,Pn),window.removeEventListener(`blur`,Fn),document.removeEventListener(`visibilitychange`,In),an.value&&=(clearTimeout(an.value),null),k.value&&G()});function ur(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 dr(){return Qt.value.trim()?Qt.value.trim().substring(0,80):!M.value&&!Y.value&&O.value.trim()&&(O.value.trim().split(`
|
|
1
|
+
import{$ as e,B as t,F as n,I as r,O as i,R as a,S as ee,U as o,W as s,_ as c,at as te,b as l,c as ne,ct as u,g as d,h as f,it as p,k as re,m,n as ie,o as ae,ot as oe,p as h,s as g,w as se,y as _}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{t as v}from"./QIcon-C6E-oEjI.js";import{t as ce}from"./QSeparator-DWTCQxsa.js";import{t as le}from"./QInput-BF8x4RTv.js";import{E as ue,N as y,d as de,l as fe,s as pe,x as me,z as he}from"./index-Deinl-Hq.js";import{t as ge}from"./QSpinnerDots-DIV68-cV.js";import{n as b,r as x,t as _e}from"./use-quasar-CGpMLh-Q.js";import{l as S,t as C}from"./QSelect-Bi7mKFGZ.js";import{t as w}from"./QTooltip-BYnhp9Wu.js";import{t as ve}from"./QExpansionItem-Sh9QNOLB.js";import{t as ye}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as be}from"./QSpace-ezNrZkuj.js";import{t as xe}from"./QBtnToggle-C0OuVppD.js";import{i as Se}from"./project-color-oMfwIMSg.js";import{t as Ce}from"./QPage-D3rjwA1l.js";import{a as we,i as Te,n as Ee,r as De,t as Oe}from"./expand-template-lWTPop0I.js";import{i as ke,r as Ae,t as je}from"./permissionModes-6jhegAm-.js";var Me=`kobo:create-page-prefs`;function T(){try{let e=localStorage.getItem(Me);return e===null?void 0:JSON.parse(e)}catch{return}}function Ne(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Pe(){let e=T();if(!Ne(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),Ne(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 Fe(e){try{localStorage.setItem(Me,JSON.stringify(e))}catch{}}var Ie={class:`create-inner`},Le={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Re={class:`create-card rounded-borders`},ze={class:`card-top-bar row items-center q-px-md q-py-xs`},Be={class:`model-badge cursor-default row items-center q-gutter-xs`},Ve={class:`text-indigo-3 text-weight-medium text-caption`},He={key:0,class:`notion-url-wrap`},Ue={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},We={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},Ge={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ke={class:`text-caption text-grey-4 q-mb-sm`},qe={class:`row q-gutter-sm`},Je={class:`peek-card-text`},Ye={class:`peek-card-title`},Xe={class:`peek-card-desc`},Ze={class:`peek-card-text`},Qe={class:`peek-card-title`},$e={class:`peek-card-desc`},et={key:0,class:`sentry-url-wrap`},tt={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},nt={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},rt={class:`card-name-wrap`},it={class:`card-textarea-wrap`},at={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},ot={key:0,class:`row items-center text-caption text-amber-6`},st={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},ct={class:`q-pa-sm manual-section-body`},lt={class:`row items-center q-gutter-sm q-mb-sm`},ut={class:`col text-caption text-grey-4`},dt={class:`q-pa-sm manual-section-body`},ft={class:`row items-center q-gutter-sm q-mb-sm`},pt={class:`col text-caption text-grey-4`},mt={class:`card-bottom-bar`},ht={class:`row q-col-gutter-xs q-px-xs`},gt={key:0,class:`col-12 col-sm-6 col-md-3`},_t={class:`bottom-select-label row items-center no-wrap`},vt={class:`col-12 col-sm-6 col-md-3`},yt={class:`bottom-select-label row items-center no-wrap`},bt={key:0,class:`text-grey-5 q-mr-xs`},xt={class:`col-12 col-sm-6 col-md-3`},St={class:`bottom-select-label row items-center no-wrap`},Ct={class:`col-12 col-md-3`},wt={class:`bottom-select-label row items-center no-wrap`},Tt={class:`column q-pa-xs col-12 items-center`},Et={class:`row q-col-gutter-xs items-center justify-center`},Dt={class:`col-12 col-md-auto`},Ot={key:0,class:`col-12 row justify-center q-mt-xs`},kt={class:`auto-loop-session-panel row items-center no-wrap q-gutter-xs`},At={class:`auto-loop-session-label`},jt={key:0,class:`auto-loop-brainstorm-panel row items-center q-gutter-xs q-mt-xs`},Mt={class:`auto-loop-brainstorm-label`},Nt={class:`bottom-select-label row items-center no-wrap`},Pt={class:`text-grey-5 q-mr-xs`},Ft={class:`bottom-select-label row items-center no-wrap`},It={class:`text-grey-5 q-mr-xs`},Lt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},Rt={class:`col-12 col-md-auto`},zt={class:`col-12 col-md-auto`},Bt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Vt={class:`col-12 col-md-4`},Ht={key:0,class:`col-12 col-md-4`},Ut={class:`bottom-select-label row items-center no-wrap`},Wt={key:1,class:`col-12 col-md-4`},Gt={class:`bottom-select-label row items-center no-wrap`},Kt={class:`col-12 col-md-4`},qt={class:`bottom-select-label row items-center no-wrap`},Jt={class:`row justify-center q-px-sm q-py-sm`},Yt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Xt=6e4,E=ye(ee({__name:`CreatePage`,setup(ee){function ye(e){return e.disabled===!0}let Me=pe(),T=_e(),Ne=de(),E=me(),{t:D}=he(),Zt=e([]),Qt=e(``),O=e(``),$t=e(null),en=e(``),k=e(!1),A=e(!1),tn=e(null),nn=e(null),rn=e([]),an=e(null),j=e(``),M=e(!1),N=e(`claude-opus-4-8`),P=e(`claude-opus-4-8`),on=e(`auto`),F=e(`auto`),I=e({}),L=e(``),R=e(null),z=e(`feature`),B=e(!1),sn=h(()=>E.global.voiceEnabled),cn=e([]),V=e(`claude-code`),ln=h(()=>cn.value.find(e=>e.id===V.value)),un=h(()=>cn.value.map(e=>({value:e.id,label:e.displayName}))),dn=h(()=>E.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),fn=[`plan`,`bypass`,`strict`,`interactive`];function pn(e,t){let n=e?E.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&fn.includes(r))return r;let i=E.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&fn.includes(i)?i:n?.dangerouslySkipPermissions??E.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let H=e(pn(``,V.value)),mn=h(()=>{switch(H.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),hn=h(()=>(je[V.value]??fn).map(e=>({value:e,label:D(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),U=e([]),gn=e([]),_n=e(!1),vn=e(!1);function yn(e,t){t(()=>{gn.value=e?U.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):U.value})}let bn=ue();function xn(){return $t.value?.nativeEl??null}let{showSkills:Sn,selectedSkillIndex:Cn,groupedDropdown:wn,flatDropdown:W,fetchSkills:Tn,detectSlashFragment:En,replaceFragmentWith:Dn,closeDropdown:On}=Te(O,xn,{excludeKoboCommands:!0});Tn(),o(O,async()=>{await re(),await En()});function kn(e){if(e.type===`template`){let t=bn.templates.find(t=>t.slug===e.name);if(!t)return;Dn(Ee(t.content,Oe({workspace:null,gitStats:null,sessionName:null}))),On();return}Dn(`/${e.name} `),On()}function An(e){!Sn.value||W.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),Cn.value=(Cn.value+1)%W.value.length):e.key===`ArrowUp`?(e.preventDefault(),Cn.value=(Cn.value-1+W.value.length)%W.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),kn(W.value[Cn.value])):e.key===`Escape`&&(e.preventDefault(),On()))}async function jn(){if(!(!sn.value||k.value||A.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){T.notify({type:`warning`,message:D(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});nn.value=e,rn.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&&rn.value.push(e.data)},n.start(),tn.value=n,k.value=!0,an.value=setTimeout(()=>{G(),T.notify({type:`info`,message:D(`voice.maxDurationReached`),position:`top`,timeout:3500})},Xt)}catch{T.notify({type:`negative`,message:D(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function G(){if(!k.value)return;let e=tn.value;if(!e)return;k.value=!1,A.value=!0,an.value&&=(clearTimeout(an.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(rn.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`,E.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()&&(O.value=O.value?`${O.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;T.notify({type:`negative`,message:D({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{tn.value=null,rn.value=[],nn.value?.getTracks().forEach(e=>{e.stop()}),nn.value=null,A.value=!1}}function Mn(e){return sn.value?E.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function Nn(e){!Mn(e)||e.repeat||(e.preventDefault(),jn())}function Pn(e){Mn(e)&&(e.preventDefault(),G())}function Fn(){k.value&&G()}function In(){document.visibilityState!==`visible`&&k.value&&G()}let K=h(()=>(ke[V.value]??Ae).map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));o(V,()=>{let e=K.value.map(e=>e.value);if(e.length>0){let t=E.global.defaultModelByEngine?.[V.value];typeof t==`string`&&e.includes(t)?N.value=t:e.includes(N.value)||(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`);let t=je[V.value]??[];t.length>0&&!t.includes(H.value)&&(H.value=pn(L.value,V.value));let n=(De[V.value]??[]).map(e=>e.value);n.length>0&&!n.includes(F.value)&&(F.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function Ln(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Rn=h(()=>(De[V.value]??De[`claude-code`]).map(e=>({value:e.value,label:Ln(D(e.i18nLabelKey)),description:D(e.i18nDescriptionKey)})));o(N,e=>{let t=I.value[e];t&&Rn.value.some(e=>e.value===t)&&(F.value=t)}),o(F,e=>{I.value={...I.value,[N.value]:e},Fe({...Pe(),reasoningEffortByModel:I.value})});let q=h(()=>{let e=j.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),zn=h(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(j.value)),J=e(`panel`);function Bn(){let e=j.value.trim();return J.value===`parent`&&zn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let Vn=e([]),Hn=e([]),Un=e(``),Wn=e(``),Gn=h(()=>!M.value||!q.value);function Kn(){let e=Un.value.trim();e&&(Vn.value.push(e),Un.value=``)}function qn(e){Vn.value.splice(e,1)}function Jn(){let e=Wn.value.trim();e&&(Hn.value.push(e),Wn.value=``)}function Yn(e){Hn.value.splice(e,1)}function Xn(){M.value=!M.value,M.value||(j.value=``)}let Y=e(!1),X=e(!1),Zn=e(`per_task`);o(()=>X.value,e=>{e&&H.value!==`bypass`&&(H.value=`bypass`)});function Qn(){X.value=!X.value,X.value&&(P.value=N.value)}let Z=e(``),$n=h(()=>/\/issues\/\d+/.test(Z.value.trim()));function er(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=e(!1),$=e(null),tr=e([]),nr=e(!1);async function rr(){if(!L.value.trim()){tr.value=[];return}nr.value=!0;try{tr.value=await Ne.fetchOrphanWorktrees(L.value.trim())}catch{tr.value=[]}finally{nr.value=!1}}function ir(){Q.value=!Q.value,Q.value?(M.value=!1,j.value=``,Y.value=!1,Z.value=``,B.value=!0,rr()):$.value=null}o(L,()=>{$.value=null,Q.value&&rr()}),o($,e=>{if(!e)return;let t=tr.value.find(t=>t.path===e);t&&(R.value=t.suggestedSourceBranch),B.value=!0});async function ar(e){if(!e.trim()){U.value=[],R.value=null;return}_n.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();U.value=n.local??n.branches??[],U.value.length>0&&!R.value&&(R.value=U.value[0]??null)}catch{U.value=[],R.value=null}finally{_n.value=!1}}function or(e){let t=E.getProjectByPath(e);if(t){t.defaultSourceBranch&&(R.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(O.value===``||O.value===en.value)&&(O.value=e,en.value=e);let n=K.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))N.value=t.defaultModel;else{let e=E.global.defaultModelByEngine?.[V.value];typeof e==`string`&&n.includes(e)&&(N.value=e)}}H.value=pn(e,V.value)}let sr=null;o(L,e=>{sr&&clearTimeout(sr),sr=setTimeout(()=>{R.value=null,ar(e),or(e)},500)});function cr(e,t){let n=e.toLowerCase();t(()=>{Zt.value=E.projectPaths.filter(e=>e.toLowerCase().includes(n)||Se(e).toLowerCase().includes(n))})}function lr(e){L.value=E.projectPaths.find(t=>Se(t)===e)??e}n(async()=>{await E.fetchSettings();let e=E.global.branchPrefixes;e.length>0&&!e.includes(z.value)&&(z.value=e[0]);let t=Pe();I.value=t.reasoningEffortByModel??{},t.autoLoop===!0&&(X.value=!0),t.autoLoopSessionMode===`continuous`&&(Zn.value=`continuous`),t.autoLoop===!0&&t.brainstormModel&&(P.value=t.brainstormModel),t.projectPath&&E.projectPaths.includes(t.projectPath)&&(L.value=t.projectPath),H.value=pn(L.value,V.value);try{let e=await fetch(`/api/engines`);e.ok&&(cn.value=await e.json())}catch{}{let e=K.value.map(e=>e.value),t=E.global.defaultModelByEngine?.[V.value];typeof t==`string`&&e.includes(t)?N.value=t:e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let n=I.value[N.value];n&&Rn.value.some(e=>e.value===n)&&(F.value=n);{let e=K.value.map(e=>e.value);e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,Nn),window.addEventListener(`keyup`,Pn),window.addEventListener(`blur`,Fn),document.addEventListener(`visibilitychange`,In)}),r(()=>{sr&&clearTimeout(sr),window.removeEventListener(`keydown`,Nn),window.removeEventListener(`keyup`,Pn),window.removeEventListener(`blur`,Fn),document.removeEventListener(`visibilitychange`,In),an.value&&=(clearTimeout(an.value),null),k.value&&G()});function ur(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 dr(){return Qt.value.trim()?Qt.value.trim().substring(0,80):!M.value&&!Y.value&&O.value.trim()&&(O.value.trim().split(`
|
|
2
2
|
`)[0]??``).substring(0,80)||`workspace`}function fr(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()}`}function pr(){return M.value&&!q.value?D(`createPage.validationNotionUrl`):Y.value&&!$n.value?D(`createPage.sentryValidation`):!M.value&&!Y.value&&!O.value.trim()?D(`createPage.validationDescription`):!M.value&&!Y.value&&(!dr()||dr()===`workspace`)&&!Qt.value.trim()&&!O.value.trim()?D(`createPage.validationName`):L.value.trim()?R.value?null:D(`createPage.validationBranch`):D(`createPage.validationPath`)}async function mr(){let e=pr();if(e){T.notify({type:`negative`,message:e,position:`top`});return}if(Q.value&&!$.value){T.notify({type:`negative`,message:D(`createPage.pickWorktreeRequired`),position:`top`});return}vn.value=!0;try{let e=dr(),t;t=M.value&&q.value?fr(Bn()):e===`workspace`?`task-${Date.now()}`:ur(e);let n=`${z.value}/${t}`,r={name:e,projectPath:L.value.trim(),sourceBranch:R.value,...Q.value&&$.value?{worktreePath:$.value,skipSetupScript:!0}:{workingBranch:n},engine:V.value,model:N.value,reasoningEffort:F.value,...M.value&&q.value?{notionUrl:Bn()}:{},...Y.value&&$n.value?{sentryUrl:Z.value.trim()}:{},...Gn.value&&Vn.value.length>0?{tasks:Vn.value}:{},...Gn.value&&Hn.value.length>0?{acceptanceCriteria:Hn.value}:{},...B.value&&!Q.value?{skipSetupScript:!0}:{},...O.value.trim()?{description:O.value.trim()}:{},...X.value?{autoLoop:!0,autoLoopSessionMode:Zn.value,brainstormModel:P.value,brainstormReasoningEffort:on.value}:{},agentPermissionMode:X.value&&H.value===`plan`?`bypass`:H.value},i=await Ne.createWorkspace(r);i._branchAdjusted&&T.notify({type:`info`,message:D(`createPage.branchAdjusted`,{branch:i.workingBranch}),position:`top`,timeout:6e3}),i._sourceFallback&&T.notify({type:`warning`,message:D(`createPage.localSourceFallback`),position:`top`,timeout:6e3}),Fe({projectPath:L.value.trim(),autoLoop:X.value,autoLoopSessionMode:Zn.value,...X.value?{brainstormModel:P.value}:{},reasoningEffortByModel:{...I.value,[N.value]:F.value}}),fe().subscribe(i.id),Ne.selectWorkspace(i.id),Me.push({name:`workspace`,params:{id:i.id}})}catch{T.notify({type:`negative`,message:D(`createPage.errorCreating`),position:`top`})}finally{vn.value=!1}}return(e,n)=>(a(),f(Ce,{class:`create-page flex flex-center column`},{default:s(()=>[m(`div`,Ie,[m(`div`,Le,u(e.$t(`createPage.title`)),1),m(`div`,Re,[m(`div`,ze,[m(`span`,Be,[l(v,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),m(`span`,Ve,u(ln.value?.displayName??e.$t(`createPage.claudeCode`)),1)]),l(be),l(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:M.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,disable:Q.value,onClick:Xn},{default:s(()=>[l(v,{name:`description`,size:`14px`,class:`q-mr-xs`}),_(` `+u(M.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`,`disable`]),l(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:Y.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,disable:Q.value,onClick:er},{default:s(()=>[l(v,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),_(` `+u(Y.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`,`disable`])]),l(ce,{color:`grey-9`}),l(ie,{name:`slide`},{default:s(()=>[M.value?(a(),c(`div`,He,[l(le,{modelValue:j.value,"onUpdate:modelValue":n[0]||=e=>j.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:s(()=>[l(v,{name:`link`,size:`16px`,color:q.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),j.value.trim()&&!q.value?(a(),c(`div`,Ue,u(e.$t(`createPage.notionValidation`)),1)):d(``,!0),q.value?(a(),c(`div`,We,u(e.$t(`createPage.notionAutoExtract`)),1)):d(``,!0),q.value&&zn.value?(a(),c(`div`,Ge,[m(`div`,Ke,[l(v,{name:`info`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),_(` `+u(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),m(`div`,qe,[m(`button`,{type:`button`,class:te([`peek-card col`,{"peek-card--active":J.value===`panel`}]),onClick:n[1]||=e=>J.value=`panel`},[l(v,{name:`article`,size:`22px`,class:`peek-card-icon`}),m(`div`,Je,[m(`div`,Ye,u(e.$t(`createPage.notionPanelOption`)),1),m(`div`,Xe,u(e.$t(`createPage.notionPanelOptionDesc`)),1)]),J.value===`panel`?(a(),f(v,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):d(``,!0)],2),m(`button`,{type:`button`,class:te([`peek-card col`,{"peek-card--active":J.value===`parent`}]),onClick:n[2]||=e=>J.value=`parent`},[l(v,{name:`folder_open`,size:`22px`,class:`peek-card-icon`}),m(`div`,Ze,[m(`div`,Qe,u(e.$t(`createPage.notionParentOption`)),1),m(`div`,$e,u(e.$t(`createPage.notionParentOptionDesc`)),1)]),J.value===`parent`?(a(),f(v,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):d(``,!0)],2)])])):d(``,!0)])):d(``,!0)]),_:1}),M.value?(a(),f(ce,{key:0,color:`grey-9`})):d(``,!0),l(ie,{name:`slide`},{default:s(()=>[Y.value?(a(),c(`div`,et,[l(le,{modelValue:Z.value,"onUpdate:modelValue":n[3]||=e=>Z.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:s(()=>[l(v,{name:`link`,size:`16px`,color:$n.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!$n.value?(a(),c(`div`,tt,u(e.$t(`createPage.sentryValidation`)),1)):d(``,!0),$n.value?(a(),c(`div`,nt,u(e.$t(`createPage.sentryAutoExtract`)),1)):d(``,!0)])):d(``,!0)]),_:1}),Y.value?(a(),f(ce,{key:1,color:`grey-9`})):d(``,!0),m(`div`,rt,[l(le,{modelValue:Qt.value,"onUpdate:modelValue":n[4]||=e=>Qt.value=e,borderless:``,dense:``,placeholder:M.value&&q.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),l(ce,{color:`grey-9`}),m(`div`,it,[l(le,{ref_key:`descriptionRef`,ref:$t,modelValue:O.value,"onUpdate:modelValue":n[5]||=e=>O.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:M.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[An,ae(g(mr,[`ctrl`]),[`enter`]),ae(g(mr,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`]),m(`div`,at,[A.value?(a(),c(`div`,ot,[l(ge,{size:`14px`,color:`amber-6`,class:`q-mr-xs`}),m(`span`,null,u(e.$t(`voice.transcribing`)),1)])):d(``,!0),l(y,{flat:``,dense:``,size:`sm`,icon:A.value?`hourglass_top`:k.value?`mic`:`mic_none`,color:k.value?`red-5`:A.value?`amber-6`:`grey-6`,disable:!sn.value||A.value,class:te({"voice-btn--recording":k.value}),onMousedown:g(jn,[`prevent`]),onMouseup:g(G,[`prevent`]),onMouseleave:g(G,[`prevent`]),onTouchstart:g(jn,[`prevent`]),onTouchend:g(G,[`prevent`])},{default:s(()=>[l(w,null,{default:s(()=>[_(u(A.value?e.$t(`voice.transcribing`):k.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])]),p(Sn)&&p(W).length>0?(a(),f(we,{key:0,class:`create-slash-popup`,"grouped-dropdown":p(wn),"flat-dropdown":p(W),"selected-index":p(Cn),onSelect:kn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):d(``,!0)]),l(ce,{color:`grey-9`}),Gn.value?(a(),c(ne,{key:2},[m(`div`,st,u(e.$t(`createPage.manualHint`)),1),l(ve,{dark:``,dense:``,label:e.$t(`createPage.tasks`,{count:Vn.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:s(()=>[m(`div`,ct,[m(`div`,lt,[l(le,{modelValue:Un.value,"onUpdate:modelValue":n[6]||=e=>Un.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:ae(g(Kn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),l(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Un.value.trim(),onClick:Kn},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(a(!0),c(ne,null,t(Vn.value,(t,n)=>(a(),c(`div`,{key:`task-${n}`,class:`row items-center q-py-xs manual-item`},[m(`span`,ut,u(t),1),l(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>qn(n)},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),l(ve,{dark:``,dense:``,label:e.$t(`createPage.acceptanceCriteria`,{count:Hn.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:s(()=>[m(`div`,dt,[m(`div`,ft,[l(le,{modelValue:Wn.value,"onUpdate:modelValue":n[7]||=e=>Wn.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:ae(g(Jn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),l(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Wn.value.trim(),onClick:Jn},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(a(!0),c(ne,null,t(Hn.value,(t,n)=>(a(),c(`div`,{key:`crit-${n}`,class:`row items-center q-py-xs manual-item`},[m(`span`,pt,u(t),1),l(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>Yn(n)},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),l(ce,{color:`grey-9`})],64)):d(``,!0),m(`div`,mt,[m(`div`,ht,[un.value.length>0?(a(),c(`div`,gt,[l(C,{modelValue:V.value,"onUpdate:modelValue":n[8]||=e=>V.value=e,options:un.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,_t,[l(v,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(un.value.find(e=>e.value===V.value)?.label??V.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])):d(``,!0),m(`div`,vt,[l(C,{modelValue:N.value,"onUpdate:modelValue":n[9]||=e=>N.value=e,options:K.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,yt,[X.value?(a(),c(`span`,bt,u(e.$t(`autoLoop.executionModelPrefix`)),1)):d(``,!0),_(` `+u(K.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(({opt:e,itemProps:t})=>[l(x,i(t,{class:`model-option`}),{default:s(()=>[l(b,null,{default:s(()=>[l(S,{class:`text-white`},{default:s(()=>[_(u(e.label),1)]),_:2},1024),l(S,{caption:``,class:`text-grey-5`},{default:s(()=>[_(u(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(X.value?`autoLoop.executionModelTooltip`:`model.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])]),m(`div`,xt,[l(C,{modelValue:F.value,"onUpdate:modelValue":n[10]||=e=>F.value=e,options:Rn.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,St,[l(v,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(Rn.value.find(e=>e.value===F.value)?.label??F.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(({opt:e,itemProps:t})=>[l(x,oe(se(t)),{default:s(()=>[l(b,null,{default:s(()=>[l(S,{class:`text-white`},{default:s(()=>[_(u(e.label),1)]),_:2},1024),l(S,{caption:``,class:`text-grey-5`},{default:s(()=>[_(u(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`reasoning.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])]),m(`div`,Ct,[l(C,{modelValue:H.value,"onUpdate:modelValue":n[11]||=e=>H.value=e,options:hn.value,disable:X.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,"option-disable":ye},{selected:s(()=>[m(`span`,wt,[l(v,{name:mn.value,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),_(` `+u(hn.value.find(e=>e.value===H.value)?.label??H.value)+` `,1),X.value?d(``,!0):(a(),f(v,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:s(()=>[l(w,null,{default:s(()=>[_(u(X.value?e.$t(`agentPermissionMode.autoLoopLocked`):e.$t(`agentPermissionMode.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`])])]),m(`div`,Tt,[m(`div`,Et,[m(`div`,Dt,[l(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:X.value?`autorenew`:`sync_disabled`,color:X.value?`amber-4`:`grey-5`,label:e.$t(`autoLoop.startInMode`),class:`skip-setup-btn`,onClick:Qn},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),X.value?(a(),c(`div`,Ot,[m(`div`,kt,[m(`span`,At,u(e.$t(`autoLoop.sessionMode.label`)),1),l(xe,{modelValue:Zn.value,"onUpdate:modelValue":n[12]||=e=>Zn.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:e.$t(`autoLoop.sessionMode.perTask`),value:`per_task`,icon:`restart_alt`},{label:e.$t(`autoLoop.sessionMode.continuous`),value:`continuous`,icon:`link`}]},{default:s(()=>[l(w,null,{default:s(()=>[_(u(Zn.value===`continuous`?e.$t(`autoLoop.sessionMode.continuousTooltip`):e.$t(`autoLoop.sessionMode.perTaskTooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])])):d(``,!0)]),X.value?(a(),c(`div`,jt,[m(`span`,Mt,u(e.$t(`autoLoop.brainstormModelPrefix`)),1),l(C,{modelValue:P.value,"onUpdate:modelValue":n[13]||=e=>P.value=e,options:K.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,Nt,[l(v,{name:`tips_and_updates`,size:`12px`,color:`amber-6`,class:`q-mr-xs`}),m(`span`,Pt,u(e.$t(`autoLoop.brainstormModelPrefix`)),1),_(` `+u(K.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(({opt:e,itemProps:t})=>[l(x,i(t,{class:`model-option`}),{default:s(()=>[l(b,null,{default:s(()=>[l(S,{class:`text-white`},{default:s(()=>[_(u(e.label),1)]),_:2},1024),l(S,{caption:``,class:`text-grey-5`},{default:s(()=>[_(u(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`autoLoop.brainstormModelTooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`]),l(C,{modelValue:on.value,"onUpdate:modelValue":n[14]||=e=>on.value=e,options:Rn.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,Ft,[l(v,{name:`psychology`,size:`12px`,color:`amber-6`,class:`q-mr-xs`}),m(`span`,It,u(e.$t(`autoLoop.brainstormReasoningPrefix`)),1),_(` `+u(Rn.value.find(e=>e.value===on.value)?.label??on.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(({opt:e,itemProps:t})=>[l(x,oe(se(t)),{default:s(()=>[l(b,null,{default:s(()=>[l(S,{class:`text-white`},{default:s(()=>[_(u(e.label),1)]),_:2},1024),l(S,{caption:``,class:`text-grey-5`},{default:s(()=>[_(u(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`autoLoop.brainstormReasoningTooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])):d(``,!0)]),m(`div`,Lt,[m(`div`,Rt,[l(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:B.value?`play_disabled`:`play_circle`,color:B.value?`orange-4`:`grey-5`,label:e.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:n[15]||=e=>B.value=!B.value},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),m(`div`,zt,[l(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:`folder_open`,color:Q.value?`cyan-4`:`grey-5`,label:Q.value?e.$t(`createPage.attachWorktreeEnabled`):e.$t(`createPage.attachWorktreeToggle`),class:`skip-setup-btn`,onClick:ir},null,8,[`color`,`label`])])]),m(`div`,Bt,[m(`div`,Vt,[l(C,{modelValue:L.value,"onUpdate:modelValue":n[16]||=e=>L.value=e,options:Zt.value,dense:``,borderless:``,"use-input":``,"fill-input":``,"hide-selected":``,"input-debounce":`0`,"new-value-mode":`add`,class:`bottom-select rounded-borders repo-select`,"hide-dropdown-icon":``,"input-class":L.value?``:`repo-input-empty`,placeholder:e.$t(`createPage.projectPath`),behavior:p(E).projectPaths.length>0?`menu`:`dialog`,"option-label":e=>e?p(Se)(e):``,onFilter:cr,onInputValue:lr},{prepend:s(()=>[l(v,{name:`folder`,size:`14px`,color:`grey-5`})]),option:s(({opt:e,itemProps:t})=>[l(x,oe(se(t)),{default:s(()=>[l(b,null,{default:s(()=>[l(S,null,{default:s(()=>[_(u(p(Se)(e)),1)]),_:2},1024),l(S,{caption:``},{default:s(()=>[_(u(e),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":s(()=>[l(x,null,{default:s(()=>[l(b,{class:`text-grey-6 text-caption`},{default:s(()=>[_(u(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`,`option-label`])]),Q.value?d(``,!0):(a(),c(`div`,Ht,[l(C,{modelValue:z.value,"onUpdate:modelValue":n[17]||=e=>z.value=e,options:dn.value,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:s(()=>[m(`span`,Ut,[l(v,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(z.value)+`/ `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])),Q.value?(a(),c(`div`,Wt,[l(C,{modelValue:$.value,"onUpdate:modelValue":n[18]||=e=>$.value=e,options:tr.value,"option-label":`branch`,"option-value":`path`,"emit-value":``,"map-options":``,"use-input":``,dense:``,borderless:``,class:`bottom-select rounded-borders worktree-select`,"hide-dropdown-icon":``,loading:nr.value,disable:!L.value.trim()||nr.value},{selected:s(()=>[m(`span`,Gt,[l(v,{name:`folder_open`,size:`12px`,color:`cyan-5`,class:`q-mr-xs`}),_(` `+u($.value?tr.value.find(e=>e.path===$.value)?.branch??$.value:e.$t(`createPage.worktreePickerLabel`))+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(e=>[l(x,oe(se(e.itemProps)),{default:s(()=>[l(b,null,{default:s(()=>[l(S,null,{default:s(()=>[_(u(e.opt.branch),1)]),_:2},1024),l(S,{caption:``},{default:s(()=>[_(u(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":s(()=>[l(x,null,{default:s(()=>[l(b,{class:`text-grey-6 text-caption`},{default:s(()=>[_(u(L.value.trim()?e.$t(`createPage.noOrphanWorktrees`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])):d(``,!0),m(`div`,Kt,[l(C,{modelValue:R.value,"onUpdate:modelValue":n[19]||=e=>R.value=e,options:gn.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,"use-input":``,"input-debounce":`0`,loading:_n.value,disable:!L.value.trim()||_n.value,onFilter:yn},{selected:s(()=>[m(`span`,qt,[l(v,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(R.value??e.$t(`createPage.branch`))+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":s(()=>[l(x,null,{default:s(()=>[l(b,{class:`text-grey-6 text-caption`},{default:s(()=>[_(u(L.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])])]),m(`div`,Jt,[l(y,{label:e.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:vn.value,disable:vn.value||Q.value&&!$.value,onClick:mr},null,8,[`label`,`loading`,`disable`])])]),m(`div`,Yt,u(M.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-cf7b635e`]]);export{E as default};
|