@loicngr/kobo 1.11.14 → 1.11.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/mcp-server/kobo-tasks-server.js +27 -0
  3. package/dist/server/db/migrations.js +13 -0
  4. package/dist/server/db/schema.js +2 -1
  5. package/dist/server/services/agent/engines/claude-code/engine.js +29 -4
  6. package/dist/server/services/agent/engines/claude-code/options-builder.js +2 -1
  7. package/dist/server/services/agent/engines/codex/engine.js +2 -0
  8. package/dist/server/services/agent/engines/codex/options-builder.js +2 -1
  9. package/dist/server/services/agent/engines/types.js +1 -0
  10. package/dist/server/services/agent/orchestrator.js +80 -9
  11. package/dist/server/services/auto-loop-service.js +6 -0
  12. package/package.json +1 -1
  13. package/src/client/dist/pwa/assets/ActivityFeed-WBBk7DgE.js +8 -0
  14. package/src/client/dist/pwa/assets/ChangelogPage-Cr5cW9Wx.js +1 -0
  15. package/src/client/dist/pwa/assets/ChangelogPage-DGhfnkax.css +1 -0
  16. package/src/client/dist/pwa/assets/ClosePopup-2KSSXX6P.js +1 -0
  17. package/src/client/dist/pwa/assets/CreatePage-Bl1Vjr27.css +1 -0
  18. package/src/client/dist/pwa/assets/CreatePage-DQk8TrUP.js +2 -0
  19. package/src/client/dist/pwa/assets/DiffViewer-C9xV8dh-.js +8 -0
  20. package/src/client/dist/pwa/assets/DrawerToggleButton-CjM28eaw.js +1 -0
  21. package/src/client/dist/pwa/assets/HealthPage-BbLpLRjV.js +1 -0
  22. package/src/client/dist/pwa/assets/HealthPage-BqirO5le.css +1 -0
  23. package/src/client/dist/pwa/assets/MainLayout-BUril7SK.js +19 -0
  24. package/src/client/dist/pwa/assets/QBadge-DS9cpnyx.js +1 -0
  25. package/src/client/dist/pwa/assets/{QBanner-DedhGMcj.js → QBanner-tANb95XA.js} +1 -1
  26. package/src/client/dist/pwa/assets/QBtn-DJGkBel8.js +1 -0
  27. package/src/client/dist/pwa/assets/QBtnToggle-D-Hsqmcb.js +1 -0
  28. package/src/client/dist/pwa/assets/QChip-iLXQ5Khf.js +1 -0
  29. package/src/client/dist/pwa/assets/QItemSection-B-5iFRBZ.js +1 -0
  30. package/src/client/dist/pwa/assets/{QList-Be_FbTA3.js → QList-D-yd1vEv.js} +1 -1
  31. package/src/client/dist/pwa/assets/QSelect-TFRaHbzG.js +36 -0
  32. package/src/client/dist/pwa/assets/QSeparator-C_2BuEw9.js +1 -0
  33. package/src/client/dist/pwa/assets/{QSpace-D9UEvM99.js → QSpace-BuMMeXnK.js} +1 -1
  34. package/src/client/dist/pwa/assets/{QSpinnerDots-B4RmFJUj.js → QSpinnerDots-C-tv95pD.js} +1 -1
  35. package/src/client/dist/pwa/assets/SearchPage-CPM7L9_M.js +1 -0
  36. package/src/client/dist/pwa/assets/SearchPage-CngtAqls.css +1 -0
  37. package/src/client/dist/pwa/assets/SettingsPage-BRYycuYY.js +16 -0
  38. package/src/client/dist/pwa/assets/SettingsPage-D5BacmAr.css +1 -0
  39. package/src/client/dist/pwa/assets/TouchPan-79_u9-Fd.js +1 -0
  40. package/src/client/dist/pwa/assets/WorkspacePage-DB1n1bmg.js +4 -0
  41. package/src/client/dist/pwa/assets/{WorkspacePage-ChnyJ3xI.css → WorkspacePage-hxEpXqBA.css} +1 -1
  42. package/src/client/dist/pwa/assets/{cssMode-BsN8TWME.js → cssMode-DNEi2cLH.js} +1 -1
  43. package/src/client/dist/pwa/assets/documents-BMvE9Q_U.js +1 -0
  44. package/src/client/dist/pwa/assets/{editor.api-Dj6TIm_z.js → editor.api-_tFrtCR7.js} +1 -1
  45. package/src/client/dist/pwa/assets/engineFeatures-JkVb6hry.js +1 -0
  46. package/src/client/dist/pwa/assets/expand-template-Dl4wUjF8.js +1 -0
  47. package/src/client/dist/pwa/assets/{freemarker2-DC0xjWx5.js → freemarker2-kfVsFQjE.js} +1 -1
  48. package/src/client/dist/pwa/assets/{handlebars-0Uz9nw5d.js → handlebars-EwBi9SHt.js} +1 -1
  49. package/src/client/dist/pwa/assets/{html-BYPeU1Vb.js → html-BOOCP_vn.js} +1 -1
  50. package/src/client/dist/pwa/assets/{htmlMode-B0UND_vz.js → htmlMode-IN9oEIXW.js} +1 -1
  51. package/src/client/dist/pwa/assets/i18n-Dezgz2hU.js +1 -0
  52. package/src/client/dist/pwa/assets/index-B12jWMl8.js +82 -0
  53. package/src/client/dist/pwa/assets/{javascript-B8PZW8pe.js → javascript-CfV8qmeH.js} +1 -1
  54. package/src/client/dist/pwa/assets/{jsonMode-BixnmFse.js → jsonMode-C0b3m4VO.js} +1 -1
  55. package/src/client/dist/pwa/assets/{kobo-commands-CX8pforo.js → kobo-commands-DznaKlq6.js} +1 -1
  56. package/src/client/dist/pwa/assets/layout-me0gwmBV.js +1 -0
  57. package/src/client/dist/pwa/assets/{liquid-BH16_Zn1.js → liquid-D3YK93J-.js} +1 -1
  58. package/src/client/dist/pwa/assets/{lspLanguageFeatures-YMzTIuK0.js → lspLanguageFeatures-PklP2gEH.js} +1 -1
  59. package/src/client/dist/pwa/assets/{mdx-CrrWJ7fg.js → mdx-DjZcevPS.js} +1 -1
  60. package/src/client/dist/pwa/assets/{network-auth-NMnCVoaZ.js → network-auth-BMTuTKHx.js} +1 -1
  61. package/src/client/dist/pwa/assets/pending-diff-open-BG3IOnWw.js +1 -0
  62. package/src/client/dist/pwa/assets/{project-color-BJrCEQ0A.js → project-color-Cc9yKGk3.js} +1 -1
  63. package/src/client/dist/pwa/assets/{python-fk3K3s3o.js → python-BrgzhqrC.js} +1 -1
  64. package/src/client/dist/pwa/assets/{razor-Dg1yHOal.js → razor-g8NeeeQc.js} +1 -1
  65. package/src/client/dist/pwa/assets/{render-chat-markdown-C00A6CfY.js → render-chat-markdown-CZyJL1-w.js} +1 -1
  66. package/src/client/dist/pwa/assets/{tsMode-qJ7nTArc.js → tsMode-DAopv4hH.js} +1 -1
  67. package/src/client/dist/pwa/assets/{typescript-DayfKox1.js → typescript-C2jZCVPF.js} +1 -1
  68. package/src/client/dist/pwa/assets/use-checkbox-D-9LXk-S.js +1 -0
  69. package/src/client/dist/pwa/assets/use-is-mobile-DX2Fiee-.js +1 -0
  70. package/src/client/dist/pwa/assets/use-onboarding-BNo8mb65.js +2 -0
  71. package/src/client/dist/pwa/assets/{vs-qnWnWXG9.js → vs-mk-rn9sP.js} +3 -3
  72. package/src/client/dist/pwa/assets/{workers-CvvtZekC.js → workers-CP5iY9Kz.js} +1 -1
  73. package/src/client/dist/pwa/assets/{xml-CJ1QFxhD.js → xml-D3pYNERH.js} +1 -1
  74. package/src/client/dist/pwa/assets/{yaml-C3N49N5E.js → yaml-BTRPY5XP.js} +1 -1
  75. package/src/client/dist/pwa/index.html +4 -4
  76. package/src/client/dist/pwa/sw.js +1 -1
  77. package/src/mcp-server/kobo-tasks-server.ts +27 -0
  78. package/src/client/dist/pwa/assets/ActivityFeed-DqDJDX2v.js +0 -8
  79. package/src/client/dist/pwa/assets/ChangelogPage-CQ33An2f.css +0 -1
  80. package/src/client/dist/pwa/assets/ChangelogPage-Dw2LbIK2.js +0 -1
  81. package/src/client/dist/pwa/assets/ClosePopup-eKuUr7CY.js +0 -1
  82. package/src/client/dist/pwa/assets/CreatePage--4KDhiYt.js +0 -2
  83. package/src/client/dist/pwa/assets/CreatePage-CV_RpAuV.css +0 -1
  84. package/src/client/dist/pwa/assets/DiffViewer-Bl9D1N1M.js +0 -8
  85. package/src/client/dist/pwa/assets/HealthPage-CaOdjuVx.js +0 -1
  86. package/src/client/dist/pwa/assets/MainLayout-DP9shoO1.js +0 -19
  87. package/src/client/dist/pwa/assets/QBadge-sMJZ_eZm.js +0 -1
  88. package/src/client/dist/pwa/assets/QBtnToggle-BwPZ0Smh.js +0 -1
  89. package/src/client/dist/pwa/assets/QChip-CY0_8v_e.js +0 -1
  90. package/src/client/dist/pwa/assets/QIcon--SvgE-nS.js +0 -1
  91. package/src/client/dist/pwa/assets/QPage-DuIsRmYu.js +0 -1
  92. package/src/client/dist/pwa/assets/QSelect-xHphd7hW.js +0 -36
  93. package/src/client/dist/pwa/assets/QSeparator-BdyRE-AM.js +0 -1
  94. package/src/client/dist/pwa/assets/QTooltip-DyS20jDT.js +0 -1
  95. package/src/client/dist/pwa/assets/SearchPage-B08_UXDs.css +0 -1
  96. package/src/client/dist/pwa/assets/SearchPage-CggXs3dH.js +0 -1
  97. package/src/client/dist/pwa/assets/SettingsPage-8AWL_4DM.js +0 -16
  98. package/src/client/dist/pwa/assets/SettingsPage-BJZWZYPC.css +0 -1
  99. package/src/client/dist/pwa/assets/TouchPan-Cd9KTb6-.js +0 -1
  100. package/src/client/dist/pwa/assets/WorkspacePage-CJKSrSEC.js +0 -4
  101. package/src/client/dist/pwa/assets/_plugin-vue_export-helper-BDNMzG2s.js +0 -1
  102. package/src/client/dist/pwa/assets/documents-DJy1tgPd.js +0 -1
  103. package/src/client/dist/pwa/assets/expand-template-By-8Db7_.js +0 -1
  104. package/src/client/dist/pwa/assets/i18n-DPDR4mQI.js +0 -1
  105. package/src/client/dist/pwa/assets/index-CtK8ORpZ.js +0 -82
  106. package/src/client/dist/pwa/assets/layout-BAE6NR2A.js +0 -1
  107. package/src/client/dist/pwa/assets/pending-diff-open-DHlXLorX.js +0 -1
  108. package/src/client/dist/pwa/assets/use-checkbox-SrkgiJho.js +0 -1
  109. package/src/client/dist/pwa/assets/use-onboarding-CF_D2gbm.js +0 -2
  110. package/src/client/dist/pwa/assets/use-quasar-C3oo6nVn.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.16
8
+
9
+ - feat(client): responsive mobile layout for drawer, settings nav and workspace toolbar (#28)
10
+
11
+ ## 1.11.15
12
+
13
+ - feat(agent): harden autonomous session lifecycle
14
+
7
15
  ## 1.11.14
8
16
 
9
17
  - ⬆️ develop - refactor(deps): Bump SDKs + refactor shutdown + hardening sécurité
@@ -188,6 +188,21 @@ const WORKSPACE_SCOPED_TOOLS = [
188
188
  inputSchema: { type: 'object', properties: {}, required: [] },
189
189
  annotations: { readOnlyHint: true, openWorldHint: false },
190
190
  },
191
+ {
192
+ name: 'set_auto_loop',
193
+ description: 'Enable or disable auto-loop for THIS workspace. Read get_workspace_info first. Enable it only when the user explicitly asks for autonomous continuation and pending tasks remain; disable it only when the user explicitly asks. Kōbō resumes the next iteration automatically after a session ends while it is enabled.',
194
+ inputSchema: {
195
+ type: 'object',
196
+ properties: {
197
+ enabled: {
198
+ type: 'boolean',
199
+ description: 'True to enable auto-loop; false to disable it.',
200
+ },
201
+ },
202
+ required: ['enabled'],
203
+ },
204
+ annotations: { destructiveHint: false, openWorldHint: false },
205
+ },
191
206
  {
192
207
  name: 'set_workspace_agent_description',
193
208
  description: "Set or clear the workspace's agent-side description (≤ 200 chars). Pass an empty string to clear. The user sees this string under the workspace title in the sidebar (it takes precedence over the user-controlled `description` field). Plain text only. The current value is available via get_workspace_info as agentDescription. NOTE: there is a separate user-controlled `description` field — do NOT try to write it; it has no MCP tool.",
@@ -641,6 +656,18 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
641
656
  if (name === 'get_workspace_info') {
642
657
  return ok(getWorkspaceInfoHandler(db, workspaceId));
643
658
  }
659
+ if (name === 'set_auto_loop') {
660
+ if (typeof a.enabled !== 'boolean')
661
+ return fail('enabled parameter is required and must be boolean');
662
+ try {
663
+ const method = a.enabled ? 'POST' : 'DELETE';
664
+ const result = await backendRequest(method, `/api/workspaces/${workspaceId}/auto-loop`);
665
+ return ok(result);
666
+ }
667
+ catch (err) {
668
+ return fail(err instanceof Error ? err.message : String(err));
669
+ }
670
+ }
644
671
  if (name === 'set_workspace_agent_description') {
645
672
  const description = a.description;
646
673
  if (typeof description !== 'string')
@@ -591,6 +591,19 @@ export const migrations = [
591
591
  `);
592
592
  },
593
593
  },
594
+ {
595
+ version: 35,
596
+ name: 'add-agent-session-task-progress-baseline',
597
+ migrate: (db) => {
598
+ const table = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'agent_sessions'").get();
599
+ if (!table)
600
+ return;
601
+ const columns = db.prepare('PRAGMA table_info(agent_sessions)').all();
602
+ if (!columns.some((column) => column.name === 'task_progress_baseline')) {
603
+ db.exec('ALTER TABLE agent_sessions ADD COLUMN task_progress_baseline TEXT');
604
+ }
605
+ },
606
+ },
594
607
  ];
595
608
  /** Current schema version — always equals the highest migration version. */
596
609
  export const SCHEMA_VERSION = migrations.length > 0 ? migrations[migrations.length - 1].version : 1;
@@ -62,7 +62,8 @@ export function initSchema(db) {
62
62
  model TEXT,
63
63
  started_at TEXT NOT NULL,
64
64
  ended_at TEXT,
65
- name TEXT
65
+ name TEXT,
66
+ task_progress_baseline TEXT
66
67
  );
67
68
 
68
69
  CREATE TABLE IF NOT EXISTS ws_events (
@@ -234,6 +234,22 @@ export function createClaudeCodeEngine() {
234
234
  let iteratorRunning = false;
235
235
  let userInterrupted = false;
236
236
  let completedResponses = 0;
237
+ let turnCompletedEmittedForResponse = 0;
238
+ // `result` is the Claude Agent SDK's per-turn completion signal. Keep
239
+ // it distinct from iterator completion: the SDK may still drain
240
+ // informational events afterwards, while Kōbō must retain the session
241
+ // for orchestration and auto-loop until `session:ended`.
242
+ const emitTurnCompletedIfSettled = () => {
243
+ if (completedResponses === 0 ||
244
+ completedResponses === turnCompletedEmittedForResponse ||
245
+ activeSubagentTaskIds.size > 0 ||
246
+ pendingResolvers.size > 0 ||
247
+ inputStream.hasUnansweredInput(completedResponses)) {
248
+ return;
249
+ }
250
+ turnCompletedEmittedForResponse = completedResponses;
251
+ safeEmit({ kind: 'turn:completed' });
252
+ };
237
253
  // Guard so the post-result drain watchdog and the natural loop exit (or
238
254
  // catch block) never both emit `session:ended` for the same run.
239
255
  let sessionEndedEmitted = false;
@@ -269,8 +285,12 @@ export function createClaudeCodeEngine() {
269
285
  return;
270
286
  }
271
287
  console.warn(`[claude-engine] SDK stream inactive ${TEXT_IDLE_TIMEOUT_MS}ms after a text-only response — forcing session:ended`);
272
- const reason = userInterrupted ? 'killed' : mapperState.sawErrorResult ? 'error' : 'completed';
273
- emitSessionEnded(reason, reason === 'completed' ? 0 : null);
288
+ if (userInterrupted)
289
+ emitSessionEnded('killed', null);
290
+ else if (mapperState.sawErrorResult)
291
+ emitSessionEnded('error', null);
292
+ else
293
+ emitSessionEnded('watchdog', null);
274
294
  abortController.abort();
275
295
  }, TEXT_IDLE_TIMEOUT_MS);
276
296
  textIdleTimer.unref?.();
@@ -280,8 +300,12 @@ export function createClaudeCodeEngine() {
280
300
  return;
281
301
  resultDrainTimer = setTimeout(() => {
282
302
  console.warn(`[claude-engine] SDK generator still open ${RESULT_DRAIN_TIMEOUT_MS}ms after 'result' — forcing session:ended`);
283
- const reason = userInterrupted ? 'killed' : mapperState.sawErrorResult ? 'error' : 'completed';
284
- emitSessionEnded(reason, reason === 'completed' ? 0 : null);
303
+ if (userInterrupted)
304
+ emitSessionEnded('killed', null);
305
+ else if (mapperState.sawErrorResult)
306
+ emitSessionEnded('error', null);
307
+ else
308
+ emitSessionEnded('watchdog', null);
285
309
  abortController.abort();
286
310
  }, RESULT_DRAIN_TIMEOUT_MS);
287
311
  resultDrainTimer.unref?.();
@@ -360,6 +384,7 @@ export function createClaudeCodeEngine() {
360
384
  if (msg.type === 'result') {
361
385
  clearTextIdleWatchdog();
362
386
  completedResponses++;
387
+ emitTurnCompletedIfSettled();
363
388
  // A queued forced message starts the next response on this same SDK stream.
364
389
  if (!inputStream.hasUnansweredInput(completedResponses)) {
365
390
  if (activeSubagentTaskIds.size === 0) {
@@ -2,7 +2,7 @@ const KOBO_MCP_BRIEF = [
2
2
  '[Kōbō MCP] This workspace exposes a dedicated MCP server with tools prefixed `kobo__`.',
3
3
  'Non-interactive mode: this session runs via the Claude Agent SDK in single-shot mode. To ask the user a question, call the `AskUserQuestion` tool — Kōbō will pause the session, collect the answer asynchronously, and resume.',
4
4
  '⚠️ HARD RULE — emit AT MOST ONE `AskUserQuestion` tool call per turn, and emit it ALONE (no other tool calls in the same response). The Claude Agent SDK rejects parallel defers: a second `AskUserQuestion` in the same turn breaks the pause mechanism, makes both calls fail with "AskUserQuestion fails", and the user sees the panel arrive only at the end of the turn (if at all). If you have N questions, group them as a multi-question array inside ONE call: `AskUserQuestion({ questions: [{ question: "Q1", options: [...] }, { question: "Q2", options: [...] }] })`. After invoking it, STOP — do not emit any other tool call. Wait for the resume.',
5
- 'Plan mode: when running with `permissionMode: plan`, the read-only restriction applies to MCP tools too. For Kōbō: `kobo__list_*`, `kobo__read_document`, `kobo__search_codebase`, `kobo__get_*` are fine; `kobo__mark_task_done`, `kobo__log_thought`, `kobo__set_workspace_status` are mutations and must wait until the plan is approved.',
5
+ 'Plan mode: when running with `permissionMode: plan`, the read-only restriction applies to MCP tools too. For Kōbō: `kobo__list_*`, `kobo__read_document`, `kobo__search_codebase`, `kobo__get_*` are fine; `kobo__mark_task_done`, `kobo__log_thought`, `kobo__set_workspace_status`, `kobo__set_auto_loop` are mutations and must wait until the plan is approved.',
6
6
  'Conventions — read these BEFORE starting work, not as a fallback:',
7
7
  '• `kobo__list_tasks` first on any non-trivial turn, then `kobo__mark_task_done` as each item completes.',
8
8
  '• `kobo__list_documents` / `kobo__read_document` to discover existing plans and specs under docs/ and .ai/thoughts/ before writing new ones.',
@@ -10,6 +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
+ '• If `kobo__get_workspace_info` reports `autoLoop: false`, call `kobo__set_auto_loop({ enabled: true })` only when the user explicitly asks for autonomous continuation; never disable it unless explicitly asked.',
13
14
  '• `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
15
  '• `kobo__schedule_wakeup` / `kobo__cancel_wakeup` to schedule (or cancel) a follow-up session — prefer these over the built-in `ScheduleWakeup` tool.',
15
16
  'Each tool carries its own "WHEN to use" guidance in its description — follow it.',
@@ -268,6 +268,8 @@ export function createCodexEngine() {
268
268
  armSubagentStallWatchdog();
269
269
  }
270
270
  else {
271
+ if (n.turn?.status === 'completed')
272
+ safeEmit({ kind: 'turn:completed' });
271
273
  resolveTurnDone();
272
274
  }
273
275
  }
@@ -1,12 +1,13 @@
1
1
  const CODEX_KOBO_MCP_BRIEF = [
2
2
  '[Kōbō MCP] This workspace exposes a dedicated MCP server named `kobo-tasks`. The Codex CLI surfaces its tools under the literal name `mcp__kobo-tasks__<tool>` — always use that full form when invoking them.',
3
- 'Plan mode: when running with a read-only sandbox, the read-only restriction applies to MCP tools too. Reads (`mcp__kobo-tasks__list_*`, `mcp__kobo-tasks__read_document`, `mcp__kobo-tasks__search_codebase`, `mcp__kobo-tasks__get_*`) are fine; mutations (`mcp__kobo-tasks__mark_task_done`, `mcp__kobo-tasks__log_thought`, `mcp__kobo-tasks__set_workspace_status`) must wait until the plan is approved.',
3
+ 'Plan mode: when running with a read-only sandbox, the read-only restriction applies to MCP tools too. Reads (`mcp__kobo-tasks__list_*`, `mcp__kobo-tasks__read_document`, `mcp__kobo-tasks__search_codebase`, `mcp__kobo-tasks__get_*`) are fine; mutations (`mcp__kobo-tasks__mark_task_done`, `mcp__kobo-tasks__log_thought`, `mcp__kobo-tasks__set_workspace_status`, `mcp__kobo-tasks__set_auto_loop`) must wait until the plan is approved.',
4
4
  'Conventions — read these BEFORE starting work, not as a fallback:',
5
5
  '• `mcp__kobo-tasks__list_tasks` first on any non-trivial turn, then `mcp__kobo-tasks__mark_task_done` as each item completes.',
6
6
  '• `mcp__kobo-tasks__list_documents` / `mcp__kobo-tasks__read_document` to discover existing plans and specs under docs/ and .ai/thoughts/ before writing new ones.',
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
+ '• If `mcp__kobo-tasks__get_workspace_info` reports `autoLoop: false`, call `mcp__kobo-tasks__set_auto_loop({ enabled: true })` only when the user explicitly asks for autonomous continuation; never disable it unless explicitly asked.',
10
11
  '• `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
12
  '• `mcp__kobo-tasks__schedule_wakeup` / `mcp__kobo-tasks__cancel_wakeup` to schedule (or cancel) a follow-up session.',
12
13
  'Each tool carries its own "WHEN to use" guidance in its description — follow it.',
@@ -2,6 +2,7 @@
2
2
  export const ALL_AGENT_EVENT_KINDS = [
3
3
  'session:started',
4
4
  'session:ended',
5
+ 'turn:completed',
5
6
  'session:user-input-requested',
6
7
  'session:compacted',
7
8
  'session:compacting',
@@ -488,21 +488,77 @@ function reuseOrCreateFreshSession(workspaceId, existingSessionId, model, engine
488
488
  return agentSessionId;
489
489
  }
490
490
  const taskProgressSnapshots = new Map();
491
- function rememberTaskProgressSnapshot(workspaceId, agentSessionId) {
492
- const workspaceSnapshots = taskProgressSnapshots.get(workspaceId) ?? new Map();
493
- workspaceSnapshots.set(agentSessionId, {
491
+ function createTaskProgressSnapshot(workspaceId) {
492
+ return {
494
493
  doneCount: getDoneTaskCount(workspaceId),
495
494
  stateSignature: getTaskStateSignature(workspaceId),
496
- });
495
+ };
496
+ }
497
+ function rememberTaskProgressSnapshot(workspaceId, agentSessionId, snapshot = createTaskProgressSnapshot(workspaceId)) {
498
+ const workspaceSnapshots = taskProgressSnapshots.get(workspaceId) ?? new Map();
499
+ workspaceSnapshots.set(agentSessionId, snapshot);
497
500
  taskProgressSnapshots.set(workspaceId, workspaceSnapshots);
498
501
  }
502
+ function parseTaskProgressSnapshot(value) {
503
+ if (!value)
504
+ return undefined;
505
+ try {
506
+ const parsed = JSON.parse(value);
507
+ if (typeof parsed.doneCount !== 'number' || typeof parsed.stateSignature !== 'string')
508
+ return undefined;
509
+ return { doneCount: parsed.doneCount, stateSignature: parsed.stateSignature };
510
+ }
511
+ catch {
512
+ return undefined;
513
+ }
514
+ }
515
+ function captureTaskProgressBaseline(workspaceId, agentSessionId) {
516
+ const snapshot = createTaskProgressSnapshot(workspaceId);
517
+ rememberTaskProgressSnapshot(workspaceId, agentSessionId, snapshot);
518
+ try {
519
+ getDb()
520
+ .prepare('UPDATE agent_sessions SET task_progress_baseline = ? WHERE id = ?')
521
+ .run(JSON.stringify(snapshot), agentSessionId);
522
+ }
523
+ catch (err) {
524
+ console.warn('[orchestrator] Failed to persist task progress baseline:', err);
525
+ }
526
+ }
527
+ function ensureTaskProgressBaseline(workspaceId, agentSessionId) {
528
+ if (taskProgressSnapshots.get(workspaceId)?.has(agentSessionId))
529
+ return;
530
+ try {
531
+ const row = getDb().prepare('SELECT task_progress_baseline FROM agent_sessions WHERE id = ?').get(agentSessionId);
532
+ if (row?.task_progress_baseline)
533
+ return;
534
+ }
535
+ catch {
536
+ // The in-memory fallback below is still useful in narrow unit-test and
537
+ // bootstrap windows where the persisted session row is unavailable.
538
+ }
539
+ captureTaskProgressBaseline(workspaceId, agentSessionId);
540
+ }
499
541
  function consumeTaskProgressSnapshot(workspaceId, agentSessionId) {
500
542
  const workspaceSnapshots = taskProgressSnapshots.get(workspaceId);
501
- const snapshot = workspaceSnapshots?.get(agentSessionId);
543
+ const memorySnapshot = workspaceSnapshots?.get(agentSessionId);
502
544
  workspaceSnapshots?.delete(agentSessionId);
503
545
  if (workspaceSnapshots?.size === 0)
504
546
  taskProgressSnapshots.delete(workspaceId);
505
- return snapshot;
547
+ try {
548
+ const db = getDb();
549
+ const readAndClear = db.transaction((id) => {
550
+ const row = db.prepare('SELECT task_progress_baseline FROM agent_sessions WHERE id = ?').get(id);
551
+ db.prepare('UPDATE agent_sessions SET task_progress_baseline = NULL WHERE id = ?').run(id);
552
+ return row?.task_progress_baseline ?? null;
553
+ });
554
+ const persistedSnapshot = parseTaskProgressSnapshot(readAndClear(agentSessionId));
555
+ if (persistedSnapshot)
556
+ return persistedSnapshot;
557
+ }
558
+ catch (err) {
559
+ console.warn('[orchestrator] Failed to consume task progress baseline:', err);
560
+ }
561
+ return memorySnapshot;
506
562
  }
507
563
  function rememberResumeFailed(workspaceId, agentSessionId) {
508
564
  const workspaceSessions = resumeFailedSessions.get(workspaceId) ?? new Set();
@@ -588,10 +644,11 @@ function handleEvent(workspaceId, agentSessionId, sourceController, ev) {
588
644
  if (ev.kind === 'rate_limit') {
589
645
  latestRateLimitInfo.set(workspaceId, ev.info);
590
646
  }
591
- // Snapshot the done-count at session start so the session:ended hook below
592
- // can compute a delta for auto-loop stall detection.
647
+ // The normal start path captures this synchronously before engine.start.
648
+ // Keep an idempotent fallback for engines/tests that emit session:started
649
+ // without first going through startAgent.
593
650
  if (ev.kind === 'session:started') {
594
- rememberTaskProgressSnapshot(workspaceId, agentSessionId);
651
+ ensureTaskProgressBaseline(workspaceId, agentSessionId);
595
652
  }
596
653
  // Legacy fallback: the built-in `ScheduleWakeup` tool (CLI tradition) isn't
597
654
  // declared by the SDK, so we intercept the tool:call event and apply the
@@ -700,12 +757,23 @@ function handleEvent(workspaceId, agentSessionId, sourceController, ev) {
700
757
  // its persisted prompts too, otherwise a reconnect resurrects a panel
701
758
  // whose backend callback has already been discarded.
702
759
  purgeAllPersistedUserInputRequests(workspaceId, agentSessionId);
760
+ // A watchdog end means Kōbō forced the stream closed after the engine
761
+ // failed to drain. It is neither a clean completion nor evidence of an
762
+ // agent stall. Move auto-loop work onto the existing persisted, bounded
763
+ // transient-retry path before lifecycle cleanup observes the status.
764
+ const watchdogRecovery = ev.reason === 'watchdog' && getWs(workspaceId)?.autoLoop === true;
765
+ if (watchdogRecovery) {
766
+ console.warn(`[auto-loop] watchdog recovery scheduled for workspace '${workspaceId}'`);
767
+ void handleTransientAutoLoopFailure(workspaceId);
768
+ }
703
769
  // Must run BEFORE autoLoopService.onSessionEnded → spawnNextIteration →
704
770
  // startAgent, otherwise startAgent throws "Agent already running" because
705
771
  // the just-ended controller is still in the map.
706
772
  const ownsWorkspaceLifecycle = onSessionEnded(workspaceId, agentSessionId, sourceController, ev.exitCode, ev.reason, isResumeFailed);
707
773
  if (!ownsWorkspaceLifecycle)
708
774
  return;
775
+ if (watchdogRecovery)
776
+ return;
709
777
  // resume_failed exits with an error but the workspace is fine (stale id
710
778
  // cleared, next iteration will start fresh) — report 'completed' to
711
779
  // auto-loop so it continues.
@@ -905,6 +973,9 @@ export function startAgent(workspaceId, workingDir, prompt, model, resume = fals
905
973
  else {
906
974
  agentSessionId = reuseOrCreateFreshSession(workspaceId, existingSessionId, model, engineId);
907
975
  }
976
+ // Persist before the asynchronous engine can emit its first event. This
977
+ // survives a Kōbō restart and does not depend on SDK system:init delivery.
978
+ captureTaskProgressBaseline(workspaceId, agentSessionId);
908
979
  const settings = ws ? readEffectiveSettingsSafe(ws.projectPath) : readEffectiveSettingsSafe(workingDir);
909
980
  const options = {
910
981
  workspaceId,
@@ -123,6 +123,12 @@ export function onSessionEnded(workspaceId, reason, taskProgressDelta) {
123
123
  // will resume the deferred turn explicitly.
124
124
  if (row.status === 'awaiting-user')
125
125
  return;
126
+ // A watchdog denotes Kōbō's own forced recovery from a stuck engine stream.
127
+ // The orchestrator owns its bounded backoff/retry path; counting it as a
128
+ // normal no-progress iteration would falsely disable an otherwise healthy
129
+ // loop after three SDK teardown timeouts.
130
+ if (reason === 'watchdog')
131
+ return;
126
132
  if (reason === 'error') {
127
133
  disable(workspaceId, 'error');
128
134
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.11.14",
3
+ "version": "1.11.16",
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",
@@ -0,0 +1,8 @@
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{J as w,d as T,t as ee}from"./QBtn-DJGkBel8.js";import{K as E,P as D,d as O,f as k,v as A,y as j}from"./index-B12jWMl8.js";import{t as M}from"./QSpinnerDots-C-tv95pD.js";import{f as te}from"./QSelect-TFRaHbzG.js";import{r as N,t as P}from"./pending-diff-open-BG3IOnWw.js";import{t as F}from"./documents-BMvE9Q_U.js";import{i as I,r as L}from"./layout-me0gwmBV.js";import{i as R,n as z,t as B}from"./render-chat-markdown-CZyJL1-w.js";import{n as V}from"./WorkspacePage-DB1n1bmg.js";function ne(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 re(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 H=new Set([`setup`,`cleanup`,`archive`]);function U(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:H.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function ie(e){let t=[],n=null,r=null;for(let i of e){let e=U(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 W={class:`text-caption text-grey-6`},ae=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`,W,i(e.$t(n.value)),1))}});function oe(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){G(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 G(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=se(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 se(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 K=[`innerHTML`],ce=L(o({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,n=F(),r=O(),i=c(()=>{let e=r.selectedWorkspaceId;return e?n.documentsFor(e).map(e=>e.path):[]}),a=c(()=>{let e=oe(R.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),i.value);return z(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,K),e.item.streaming?(f(),l(w,{key:0,size:`xs`,class:`q-ml-xs`})):m(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]);function le(e,t){let n=e.split(`
2
+ `),r=t.split(`
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 q(e){let t=e.split(`
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 J(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=q(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(`
5
+ `).length:0,deletions:t?t.split(`
6
+ `).length:0}}if(e===`Write`){let e=n.file_path;if(!e)return null;let t=n.content??``;return{toolName:`Write`,filePath:e,content:t,additions:t?t.split(`
7
+ `).length:0,deletions:0}}if(e===`Bash`){let e=(n.command??``).match(/^\s*rm\s+(?:-[a-zA-Z]*\s+)*(.+)/);if(e)return{toolName:`Bash:rm`,filePath:e[1].trim().replace(/["']/g,``),additions:0,deletions:1}}return null}function Y(e,t){if(!e||!t?.projectPath)return e;let n=t.worktreePath;if(n){let t=X(e,n);if(t!==e)return t}let r=X(e,`${t.projectPath}/${j}/${t.workingBranch}`);return r===e?X(e,t.projectPath):r}function X(e,t){if(!t)return e;let n=ue(t);return n?e.replace(RegExp(`${n}[\\\\/]+`,`g`),``).replace(RegExp(`${n}(?=\\s|$|["'\`])`,`g`),`.`):e}function ue(e){let t=e.replace(/[\\/]+$/,``);return t?`${/^[\\/]+/.test(t)?`[\\\\/]+`:``}${t.split(/[\\/]+/).filter(Boolean).map(de).join(`[\\\\/]+`)}`:``}function de(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}var fe={class:`tool-name`},pe=[`title`],Z={key:0,class:`tool-stat-add`},me={key:1,class:`tool-stat-del`},he={class:`diff-sign`},ge={class:`tool-name`},Q=[`title`],$=L(o({__name:`ToolCallItem`,props:{item:{}},setup(r){let o=r,u=n(!1),d=O(),{t:p}=e(),S=c(()=>J(o.item.name,o.item.input)),w=c(()=>S.value?Y(S.value.filePath,d.selectedWorkspace):``),E={Bash:`terminal`,Read:`description`,Edit:`edit`,Write:`edit_note`,MultiEdit:`edit`,Glob:`folder_open`,Grep:`manage_search`,LS:`list`,Skill:`auto_awesome`,Task:`hub`,Agent:`hub`,TodoWrite:`checklist`,TodoRead:`checklist`,TaskCreate:`add_task`,TaskUpdate:`checklist`,TaskGet:`checklist`,TaskList:`checklist`,ToolSearch:`search`,WebFetch:`public`,WebSearch:`travel_explore`,NotebookRead:`book`,NotebookEdit:`edit_note`,SendMessage:`send`,ExitPlanMode:`check_circle_outline`,KillShell:`stop_circle`,BashOutput:`terminal`},D=c(()=>E[o.item.name]??`build`),k=c(()=>{if(S.value)return``;let e=o.item.input,t=A(e);return t?Y(t,d.selectedWorkspace):``});function A(e){if(!e||typeof e!=`object`)return typeof e==`string`?e:``;let t=e;for(let e of[`file_path`,`path`,`command`,`pattern`,`query`,`url`,`skill`,`description`,`subject`,`prompt`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}for(let e of Object.values(t))if(typeof e==`string`&&e.length>0)return e;return``}let j=c(()=>{let e=S.value;return e?e.diffLines?e.diffLines:e.toolName===`Edit`&&e.oldString!==void 0&&e.newString!==void 0?le(e.oldString,e.newString):e.toolName===`Write`&&e.content!==void 0?e.content.split(`
8
+ `).map(e=>({type:`add`,content:e})):e.toolName===`Bash:rm`?[{type:`del`,content:`File deleted`}]:null:null}),M=c(()=>{let e=o.item.result;if(!e)return``;if(typeof e.output==`string`)return e.output;try{return JSON.stringify(e.output)}catch{return String(e.output)}}),te=new Set([`Read`]),N=c(()=>!!(o.item.result&&M.value)&&(!te.has(o.item.name)||o.item.result?.isError===!0));function F(){u.value=!u.value}function L(){let e=S.value?.filePath,t=d.selectedWorkspace,n=t?.id,r=e?Y(e,t):``;!r||/^(?:[A-Za-z]:)?[\\/]/.test(r)||!n||(P(n,r),window.dispatchEvent(new CustomEvent(`kobo:open-diff`,{detail:{workspaceId:n,path:r}})))}return x(()=>o.item.result?.isError===!0,e=>{e&&(u.value=!0)},{immediate:!0}),(e,n)=>S.value?(f(),g(`div`,{key:0,class:a([`tool-row`,{"tool-row-expanded":u.value}])},[h(`div`,{class:`tool-header`,onClick:F},[y(T,{name:D.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),h(`span`,fe,i(S.value.toolName===`Bash:rm`?`Bash`:S.value.toolName),1),h(`span`,{class:`tool-path`,title:S.value.filePath},i(w.value),9,pe),y(ee,{flat:``,dense:``,round:``,size:`xs`,icon:`open_in_new`,class:`tool-open-diff`,onClick:C(L,[`stop`])},{default:b(()=>[y(I,null,{default:b(()=>[v(i(t(p)(`chat.openInGitDiff`)),1)]),_:1})]),_:1}),S.value.additions>0?(f(),g(`span`,Z,`+`+i(S.value.additions),1)):m(``,!0),S.value.deletions>0?(f(),g(`span`,me,`-`+i(S.value.deletions),1)):m(``,!0),r.item.result?.isError?(f(),l(T,{key:2,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-xs`})):r.item.result?(f(),l(T,{key:3,name:`check`,color:`positive`,size:`xs`,class:`q-ml-xs`})):m(``,!0),y(T,{name:u.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-auto text-grey-6`},null,8,[`name`])]),u.value&&j.value?(f(),g(`div`,{key:0,class:`tool-diff`,onClick:n[0]||=C(()=>{},[`stop`])},[(f(!0),g(s,null,_(j.value,(e,t)=>(f(),g(`div`,{key:t,class:a([`diff-line`,{"diff-del":e.type===`del`,"diff-add":e.type===`add`,"diff-context":e.type===`context`}])},[h(`span`,he,i(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),v(i(e.content),1)],2))),128))])):m(``,!0)],2)):(f(),g(`div`,{key:1,class:a([`tool-row tool-row-generic`,{"tool-row-expanded":u.value,"tool-row--toggleable":N.value}])},[h(`div`,{class:`tool-header`,onClick:n[1]||=e=>N.value&&F()},[y(T,{name:D.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),h(`span`,ge,i(r.item.name),1),k.value?(f(),g(`span`,{key:0,class:`tool-arg`,title:A(r.item.input)||k.value},i(k.value),9,Q)):m(``,!0),r.item.result?.isError?(f(),l(T,{key:1,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-auto`})):r.item.result?(f(),l(T,{key:2,name:`check`,color:`positive`,size:`xs`,class:`q-ml-auto`})):m(``,!0),N.value?(f(),l(T,{key:3,name:u.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-xs text-grey-6`},null,8,[`name`])):m(``,!0)]),u.value&&N.value?(f(),g(`div`,{key:0,class:`tool-output`,onClick:n[2]||=C(()=>{},[`stop`])},i(M.value),1)):m(``,!0)],2))}}),[[`__scopeId`,`data-v-fc912366`]]);function _e(e,t){return t?e.replace(/\[image:\s+([^\]]+)\]/g,(e,n)=>{let r=String(n).trim();return/^(\.ai\/images\/|images\/)/.test(r)?`![${r}](${`/api/workspaces/${encodeURIComponent(t)}/images/file?path=${encodeURIComponent(r)}`})`:e}):e}var ve=[`innerHTML`],ye=[`innerHTML`],be=[`src`],xe=L(o({__name:`UserMessageItem`,props:{item:{}},setup(e){let t=e,r=O(),i=c(()=>t.item.sender===`system-prompt`),a=c(()=>{let e=_e(t.item.content,r.selectedWorkspaceId??``);return B(e)}),o=n(null),u=n(!1);function d(e){let t=e.target;if(t?.tagName!==`IMG`)return;let n=t;n.src&&(o.value=n.src,u.value=!0)}return(e,t)=>(f(),g(s,null,[i.value?(f(),l(te,{key:0,dense:``,"dense-toggle":``,label:e.$t(`chat.systemPrompt`),"header-class":`text-grey-5 text-caption`},{default:b(()=>[h(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:a.value},null,8,ve)]),_:1},8,[`label`])):(f(),g(`div`,{key:1,class:`markdown-message`,onClick:d},[h(`div`,{innerHTML:a.value},null,8,ye)])),y(E,{modelValue:u.value,"onUpdate:modelValue":t[1]||=e=>u.value=e},{default:b(()=>[o.value?(f(),g(`img`,{key:0,src:o.value,alt:``,class:`image-lightbox-img`,onClick:t[0]||=e=>u.value=!1},null,8,be)):m(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-f34be4c5`]]),Se=[`data-event-ids`],Ce={class:`turn-header`},we={key:0,class:`turn-time`},Te={class:`turn-time turn-time-updated`},Ee={key:2,class:`turn-actions`},De={class:`turn-body`},Oe={key:0,class:`turn-scroll-top`},ke=L(o({__name:`TurnCard`,props:{turn:{},highlighted:{type:Boolean}},emits:[`scrollTo`],setup(o,{emit:u}){let d=o,p=u,{t:x}=e(),S=n(null);function C(){let e=S.value;if(!e)return;let t=e.closest(`.q-scrollarea`)?.querySelector(`.q-scrollarea__content`);if(!t){e.scrollIntoView({behavior:`smooth`,block:`start`});return}let n=e.getBoundingClientRect().top-t.getBoundingClientRect().top;p(`scrollTo`,Math.max(0,n-8))}let w=c(()=>{switch(d.turn.speaker){case`user`:return{label:x(`chat.you`),accent:`#ce93d8`,badgeClass:`turn-badge-user`};case`agent`:return{label:x(`chat.agent`),accent:`#7986cb`,badgeClass:`turn-badge-agent`};case`system-prompt`:return{label:x(`chat.systemPrompt`),accent:`#757575`,badgeClass:`turn-badge-system`};case`session`:return{label:x(`chat.session`),accent:`#616161`,badgeClass:`turn-badge-session`};case`script`:{let e=d.turn.items[0],t=e?.type===`user`?e.sender:``;return{label:x(t===`archive`?`chat.archiveScript`:t===`setup`?`chat.setupScript`:`chat.cleanupScript`),accent:`#4db6ac`,badgeClass:`turn-badge-script`}}}});function E(e,t=!1){if(!e)return``;let n=new Date(e);return Number.isNaN(n.getTime())?``:n.toLocaleTimeString(void 0,t?{hour:`2-digit`,minute:`2-digit`,second:`2-digit`}:{hour:`2-digit`,minute:`2-digit`})}let D=c(()=>E(d.turn.ts)),O=c(()=>d.turn.items.flatMap(e=>e.eventIds??[]).join(` `)),k=c(()=>{let e=d.turn.items;if(e.length===0)return null;for(let t=e.length-1;t>=0;t--){let n=e[t].ts;if(n)return n}return null}),A=c(()=>{let e=d.turn.ts,t=k.value;if(!t||!e||t===e)return``;let n=new Date(e).getTime(),r=new Date(t).getTime();return Number.isNaN(n)||Number.isNaN(r)||r<=n?``:E(t,r-n<6e4)}),j=c(()=>A.value!==``),M=c(()=>d.turn.items.filter(e=>e.type===`tool`).length);return(e,n)=>(f(),g(`div`,{ref_key:`cardEl`,ref:S,class:a([`turn-card`,{"turn-card--user":o.turn.speaker===`user`,"turn-card--highlighted":o.highlighted}]),"data-event-ids":O.value,style:r({"--turn-accent":w.value.accent})},[h(`div`,Ce,[h(`span`,{class:a([`turn-badge`,w.value.badgeClass])},i(w.value.label),3),D.value?(f(),g(`span`,we,i(D.value),1)):m(``,!0),j.value?(f(),g(s,{key:1},[y(T,{name:`arrow_forward`,size:`10px`,color:`grey-7`,class:`turn-time-arrow`}),h(`span`,Te,[v(i(A.value)+` `,1),y(I,null,{default:b(()=>[v(i(t(x)(`chat.lastUpdatedAt`,{time:A.value})),1)]),_:1})])],64)):m(``,!0),M.value>0?(f(),g(`span`,Ee,` · `+i(t(x)(`chat.nActions`,{n:M.value})),1)):m(``,!0)]),h(`div`,De,[(f(!0),g(s,null,_(o.turn.items,(e,t)=>(f(),g(s,{key:t},[e.type===`text`?(f(),l(ce,{key:0,item:e},null,8,[`item`])):e.type===`thinking`?(f(),l(V,{key:1,item:e},null,8,[`item`])):e.type===`tool`?(f(),l($,{key:2,item:e},null,8,[`item`])):e.type===`user`?(f(),l(xe,{key:3,item:e},null,8,[`item`])):e.type===`session`?(f(),l(ae,{key:4,item:e},null,8,[`item`])):m(``,!0)],64))),128))]),o.turn.items.length>4?(f(),g(`div`,Oe,[y(ee,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`grey-6`,class:`turn-scroll-top-btn`,onClick:C},{default:b(()=>[y(I,null,{default:b(()=>[v(i(t(x)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):m(``,!0)],14,Se))}}),[[`__scopeId`,`data-v-6b8d8e3e`]]),Ae={key:0,class:`activity-feed-switching`},je={key:1,class:`activity-feed-wrap`},Me={key:0,class:`activity-feed-compacting`},Ne={class:`text-caption text-grey-4`},Pe={key:0,class:`text-center q-py-sm text-caption text-grey-6`},Fe={class:`q-pa-md`},Ie={key:1,class:`q-px-md q-pb-md`},Le={class:`activity-feed-nav-cluster`},Re=60,ze=200,Be=200,Ve=400,He=200,Ue=180,We=L(o({__name:`ActivityFeed`,props:{workspaceId:{}},setup(e){let t=e,r=D(),a=A(),o=O(),C=c(()=>r.isCompacting(t.workspaceId)),T=c(()=>o.selectedSessionId),E=c(()=>o.sessions.find(e=>e.id===T.value)?.engineSessionId??null),j=c(()=>{let e=o.sessions;return e.length!==0&&T.value===e[e.length-1].id});function P(e){return T.value?e?e===T.value||e===E.value:j.value:!0}let F=c(()=>(o.activityFeeds[t.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&P(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,ts:e.timestamp,sessionId:e.sessionId,eventIds:[e.id]}))),I=c(()=>{let e=o.workspaces.find(e=>e.id===t.workspaceId);return k(e?.status)}),L=c(()=>{let e=r.eventsFor(t.workspaceId),n=r.timestampsFor(t.workspaceId),i=r.sessionIdsFor(t.workspaceId),o=r.eventIdsFor(t.workspaceId),s=[],c=[],l=[];for(let t=0;t<e.length;t++)P(i[t])&&(s.push(e[t]),c.push(n[t]),l.push(o[t]??null));return ie(re(ne(s,c,I.value,l),F.value).filter(e=>e.type!==`thinking`&&(a.showVerboseSystemMessages||e.type!==`session`)))}),R=c(()=>a.showVerboseSystemMessages?r.eventsFor(t.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),z=n(null),B=n(!0),V=n(!1),H=n(null),U=!1,W=n(!0),ae=n(new Map);function oe(e){let t=e.verticalSize-e.verticalPosition-e.verticalContainerSize;B.value=t<=Re,U&&e.verticalPosition<=ze&&!V.value&&se()&&le()}function G(e,t){return`${e}:${t}`}function se(){let e=T.value;return e?ae.value.get(G(t.workspaceId,e))??!0:r.hasMoreOlderFor(t.workspaceId)}function K(e,t,n){ae.value.set(G(e,t),n)}function ce(e){if(!T.value)return r.oldestIdFor(e);let t=r.eventIdsFor(e),n=r.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!P(n[e]))continue;let r=t[e];if(r)return r}}async function le(){let e=t.workspaceId,n=T.value,i=ce(e);if(!i)return;V.value=!0;let a=Date.now();try{let t=z.value;await p();let a=t?.getScroll().verticalSize??0,s=t?.getScroll().verticalPosition??0,c=new URLSearchParams({before:i,limit:`200`});n&&c.set(`session`,n);let l=fetch(`/api/workspaces/${e}/events?${c.toString()}`),u=new Promise(e=>setTimeout(e,Be)),[d]=await Promise.all([l,u]);if(!d.ok){n?K(e,n,!1):r.prepend(e,[],[],{oldestId:i,hasMoreOlder:!1});return}let f=await d.json(),m=f.events??[],h=m.filter(t=>t.type===`agent:event`&&t.workspaceId===e),g=m.filter(t=>t.type===`user:message`&&t.workspaceId===e),_=h.map(e=>e.payload),v=h.map(e=>e.createdAt),y=h.map(e=>e.sessionId??null),b=h.map(e=>e.id),x=m.length>0?m[0].id:i;n&&K(e,n,f.hasMore),r.prepend(e,_,v,{oldestId:x,hasMoreOlder:n?r.hasMoreOlderFor(e):f.hasMore,sessionIds:y,eventIds:b});for(let t of g){let n=t.payload;typeof n.content==`string`&&o.addActivityItem(e,{id:t.id,type:`text`,content:n.content,timestamp:t.createdAt,sessionId:t.sessionId??void 0,meta:{sender:n.sender??`user`}})}if(await p(),t){let e=t.getScroll().verticalSize-a;if(e>0){let n=Math.max(s+e,250);t.setScrollPosition(`vertical`,n,0)}}}catch(e){console.error(`[ActivityFeed] failed to load older events:`,e)}finally{let e=Date.now()-a,t=Math.max(0,Be-e);await new Promise(e=>setTimeout(e,t+Ve)),V.value=!1}}async function q(e=0){await p();let t=z.value;if(!t)return;let n=t.getScroll();t.setScrollPosition(`vertical`,n.verticalSize,e)}let J=null,Y=0;function X(){if(J!=null)return;let e=performance.now()-Y<Ue;J=requestAnimationFrame(()=>{J=null,Y=performance.now(),q(e?0:180)})}function ue(e){let t=z.value;t&&t.setScrollPosition(`vertical`,Math.max(0,e),250)}function de(){let e=window.location.hash,t=e.indexOf(`?`);if(t===-1||!new URLSearchParams(e.slice(t+1)).has(`eventId`))return;let n=e.slice(0,t);window.history.replaceState(window.history.state,``,`${window.location.pathname}${window.location.search}${n}`)}async function fe(e){let n=e.detail;if(!(n?.workspaceId!==t.workspaceId||!n.eventId))try{let e=new URLSearchParams({around:n.eventId,limit:`200`});n.sessionId&&e.set(`session`,n.sessionId);let i=await fetch(`/api/workspaces/${t.workspaceId}/events?${e}`);if(!i.ok)return;let a=await i.json(),s=a.events??[],c=s.filter(e=>e.type===`agent:event`&&e.workspaceId===t.workspaceId),l=s.filter(e=>e.type===`user:message`&&e.workspaceId===t.workspaceId);r.reset(t.workspaceId,c.map(e=>e.payload),c.map(e=>e.createdAt),{oldestId:s[0]?.id,hasMoreOlder:a.hasMore??!1,sessionIds:c.map(e=>e.sessionId),eventIds:c.map(e=>e.id)});for(let e of l){let n=e.payload;typeof n.content==`string`&&o.addActivityItem(t.workspaceId,{id:e.id,type:`text`,content:n.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:n.sender??`user`}})}let u=Date.now()+5e3;for(;W.value&&Date.now()<u;)await new Promise(e=>window.setTimeout(e,20));await p(),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e())));let d=L.value.findIndex(e=>e.items.some(e=>e.eventIds?.includes(n.eventId)??!1)),f=pe.value[d]?.$el,m=z.value,h=Z.value;if(!f||!m||!h)return;let g=f.getBoundingClientRect().top-h.getBoundingClientRect().top;H.value=n.eventId,m.setScrollPosition(`vertical`,Math.max(0,g-16),250),window.setTimeout(()=>{H.value===n.eventId&&(H.value=null)},1800)}catch(e){console.error(`[ActivityFeed] failed to focus history event:`,e)}}let pe=n([]),Z=n(null);function me(){let e=L.value,t=pe.value,n=[];if(t.length===e.length){for(let r=0;r<e.length;r++){if(e[r].speaker!==`user`)continue;let i=t[r]?.$el;i&&n.push(i)}if(n.length>0)return n}let r=Z.value?.parentElement;if(r){let e=r.querySelectorAll(`.turn-card--user`);for(let t of e)n.push(t)}return n}function he(){let e=z.value;if(!e)return null;let t=Z.value;if(!t)return null;let n=e.getScroll().verticalPosition,r=t.getBoundingClientRect().top,i=null;for(let e of me()){let t=e.getBoundingClientRect().top-r;if(t<n-40)i=t;else break}return i}async function ge(){let e=z.value;if(!e)return;let t=he();if(t===null)for(let e=0;e<15&&se();e++){for(;V.value;)await new Promise(e=>setTimeout(e,50));if(await le(),await p(),t=he(),t!==null)break}t!==null&&e.setScrollPosition(`vertical`,Math.max(0,t-12),250)}async function Q(){U=!1,await p(),await q(0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{U=!0})})}let $=c(()=>{let e=r.sessionIdsFor(t.workspaceId);if(!T.value)return e.length;let n=0;for(let t of e)P(t)&&n++;return n}),_e=c(()=>r.eventsFor(t.workspaceId).length);async function ve(){W.value=!0;let e=Date.now();await new Promise(e=>setTimeout(e,He));let t=e+5e3;for(;_e.value===0&&Date.now()<t;)await new Promise(e=>setTimeout(e,50));W.value=!1}x(W,async e=>{!e&&$.value>0&&await Q(),!e&&$.value===0&&T.value&&xe()}),d(()=>{window.addEventListener(`kobo:focus-history-event`,fe),ve(),$.value>0&&Q(),T.value&&xe();let e=new URLSearchParams(window.location.hash.split(`?`)[1]??``).get(`eventId`);e&&(fe(new CustomEvent(`kobo:focus-history-event`,{detail:{workspaceId:t.workspaceId,sessionId:T.value,eventId:e}})),de())});let ye=$.value>0;x($,async(e,t)=>{if(!V.value){if(!ye&&e>0){ye=!0,await Q();return}e>t&&B.value&&!V.value&&X()}}),u(()=>{window.removeEventListener(`kobo:focus-history-event`,fe),J!=null&&(cancelAnimationFrame(J),J=null)}),x(()=>t.workspaceId,()=>{B.value=!0,ye=$.value>0,U=!1,ve(),$.value>0&&Q()}),x(()=>o.selectedSessionId,async()=>{B.value=!0,U=!1,await Q(),xe()});let be=new Set;async function xe(){let e=T.value;if(!e||$.value>0)return;let n=G(t.workspaceId,e);if(!be.has(n)){be.add(n);try{let n=await fetch(`/api/workspaces/${t.workspaceId}/events?session=${encodeURIComponent(e)}&limit=500`);if(!n.ok)return;let i=await n.json(),a=i.events??[];if(a.length===0)return;let s=a.filter(e=>e.type===`agent:event`&&e.workspaceId===t.workspaceId),c=a.filter(e=>e.type===`user:message`&&e.workspaceId===t.workspaceId),l=s.map(e=>e.payload),u=s.map(e=>e.createdAt),d=s.map(e=>e.sessionId??null),f=s.map(e=>e.id);K(t.workspaceId,e,i.hasMore),l.length>0&&r.prepend(t.workspaceId,l,u,{oldestId:a[0].id,hasMoreOlder:r.hasMoreOlderFor(t.workspaceId),sessionIds:d,eventIds:f});for(let e of c){let n=e.payload;typeof n.content==`string`&&o.addActivityItem(t.workspaceId,{id:e.id,type:`text`,content:n.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:n.sender??`user`}})}await p(),await q(0)}catch(e){console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),be.delete(n)}}}let Se=c(()=>F.value.filter(e=>e.sender!==`system-prompt`).length);x(Se,async(e,t)=>{e>t&&(B.value=!0,await q(180))});async function Ce(){B.value=!0,await q(250)}return(e,t)=>W.value?(f(),g(`div`,Ae,[y(M,{size:`40px`,color:`indigo-4`})])):(f(),g(`div`,je,[y(S,{name:`fade`},{default:b(()=>[C.value?(f(),g(`div`,Me,[y(M,{size:`18px`,color:`indigo-4`}),h(`span`,Ne,i(e.$t(`activity.compacting`)),1)])):m(``,!0)]),_:1}),y(N,{ref_key:`scrollRef`,ref:z,class:`activity-feed-scroll`,onScroll:oe},{default:b(()=>[h(`div`,{ref_key:`contentOriginRef`,ref:Z,class:`content-origin-marker`},null,512),V.value?(f(),g(`div`,Pe,[y(w,{size:`sm`}),v(` `+i(e.$t(`activity.loading_older`)),1)])):m(``,!0),h(`div`,Fe,[(f(!0),g(s,null,_(L.value,(e,t)=>(f(),l(ke,{key:t,ref_for:!0,ref_key:`turnRefs`,ref:pe,turn:e,highlighted:e.items.some(e=>e.eventIds?.includes(H.value??``)??!1),onScrollTo:ue},null,8,[`turn`,`highlighted`]))),128))]),R.value.length?(f(),g(`div`,Ie,[y(te,{label:e.$t(`activity.raw_lines`,{n:R.value.length}),dense:``},{default:b(()=>[(f(!0),g(s,null,_(R.value,(e,t)=>(f(),g(`div`,{key:t,class:`text-caption text-grey q-pa-xs`},i(e),1))),128))]),_:1},8,[`label`])])):m(``,!0)]),_:1},512),h(`div`,Le,[B.value?m(``,!0):(f(),l(ee,{key:0,round:``,dense:``,unelevated:``,color:`grey-9`,"text-color":`grey-3`,icon:`arrow_downward`,size:`sm`,class:`activity-feed-nav-btn`,title:e.$t(`activity.scroll_to_bottom`),onClick:Ce},null,8,[`title`])),y(ee,{round:``,dense:``,unelevated:``,color:`grey-9`,"text-color":`grey-3`,icon:`arrow_upward`,size:`sm`,class:`activity-feed-nav-btn`,title:e.$t(`activity.prev_user_message`),onClick:ge},null,8,[`title`])])]))}}),[[`__scopeId`,`data-v-0fba0dc4`]]);export{We as default};
@@ -0,0 +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{t as m}from"./QBtn-DJGkBel8.js";import{Q as h,et as g,s as _}from"./index-B12jWMl8.js";import{r as v}from"./layout-me0gwmBV.js";import{t as y}from"./render-chat-markdown-CZyJL1-w.js";import{t as b}from"./QSpace-BuMMeXnK.js";import{t as x}from"./QChip-iLXQ5Khf.js";import{n as S}from"./use-is-mobile-DX2Fiee-.js";import{t as C}from"./DrawerToggleButton-CjM28eaw.js";var w={class:`row items-center q-mb-md`},T={class:`text-h6 q-ml-sm`},E={key:0,class:`text-grey-6 text-center q-pa-lg`},D={key:1,class:`text-negative text-center q-pa-lg`},O={key:2,class:`text-grey-6 text-center q-pa-lg`},k={key:3,class:`column q-gutter-md`},A={key:0,class:`text-caption text-grey-6`},j={class:`row items-center q-mb-sm`},M={class:`text-subtitle1 text-indigo-3`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},N=[`innerHTML`],P=v(r({__name:`ChangelogPage`,setup(r){let v=_(),P=t([]),F=t(``),I=t(!1),L=t(null);function R(e){return y(e)}async function z(){I.value=!0,L.value=null;try{let e=await fetch(`/api/changelog`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();F.value=t.currentVersion??``,P.value=t.versions??[]}catch(e){L.value=e instanceof Error?e.message:String(e)}finally{I.value=!1}}return o(z),(t,r)=>(s(),a(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:p(()=>[l(`div`,w,[f(C,{class:`q-mr-xs`}),f(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:r[0]||=t=>e(v).back()}),l(`div`,T,n(t.$t(`changelog.title`)),1),f(b),f(m,{flat:``,dense:``,icon:`refresh`,loading:I.value,label:t.$t(`common.refresh`),onClick:z},null,8,[`loading`,`label`])]),I.value&&P.value.length===0?(s(),u(`div`,E,n(t.$t(`common.loading`)),1)):L.value?(s(),u(`div`,D,n(L.value),1)):P.value.length===0?(s(),u(`div`,O,n(t.$t(`changelog.empty`)),1)):(s(),u(`div`,k,[F.value?(s(),u(`div`,A,n(t.$t(`changelog.currentVersion`,{version:F.value})),1)):c(``,!0),(s(!0),u(i,null,d(P.value,e=>(s(),a(h,{key:e.version,dark:``,flat:``,bordered:``},{default:p(()=>[f(g,null,{default:p(()=>[l(`div`,j,[l(`div`,M,` v`+n(e.version),1),e.version===F.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:R(e.notes)},null,8,N)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-e9812cdf`]]);export{P as default};
@@ -0,0 +1 @@
1
+ .changelog-notes[data-v-e9812cdf]{color:#cfcfe0;font-size:13px;line-height:1.55}.changelog-notes[data-v-e9812cdf] h3{color:#d8d8e8;margin:.8em 0 .3em;font-size:14px;font-weight:600}.changelog-notes[data-v-e9812cdf] ul{margin:0;padding-left:1.2em}.changelog-notes[data-v-e9812cdf] li{margin:.2em 0}.changelog-notes[data-v-e9812cdf] code{background:#00000040;border-radius:3px;padding:.1em .3em;font-size:12px}.changelog-notes[data-v-e9812cdf] a{color:#8a93ff}
@@ -0,0 +1 @@
1
+ import{A as e,St as t,ct as n,j as r}from"./QBtn-DJGkBel8.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=t({name:`close-popup`,beforeMount(t,{value:i}){let a={depth:l(i),handler(n){a.depth!==0&&setTimeout(()=>{let i=r(t);i!==void 0&&e(i,n,a.depth)},0)},handlerKey(e){n(e,13)&&a.handler(e)}};t.__qclosepopup=a,t.addEventListener(`click`,a.handler),t.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 @@
1
+ .create-page[data-v-34e5a1f3]{background:#1a1a2e;min-height:100%;padding:48px 24px 80px;position:relative}.create-page__drawer-toggle[data-v-34e5a1f3]{top:var(--kobo-space-md);left:var(--kobo-space-md);z-index:1;position:absolute}.create-inner[data-v-34e5a1f3]{width:100%;max-width:960px}.create-title[data-v-34e5a1f3]{letter-spacing:-.02em;font-size:30px;line-height:1.2}.create-sections[data-v-34e5a1f3]{gap:24px}.responsive-fields[data-v-34e5a1f3]{row-gap:16px}.responsive-fields--sm[data-v-34e5a1f3]{row-gap:8px}.create-section-card[data-v-34e5a1f3],.create-actions-card[data-v-34e5a1f3]{background:#22223f;border-color:#ffffff1f}.card-textarea-wrap[data-v-34e5a1f3]{position:relative}.create-textarea[data-v-34e5a1f3] .q-field__control{min-height:220px}.create-textarea[data-v-34e5a1f3] textarea{resize:vertical;line-height:1.6;min-height:180px!important}.create-slash-popup[data-v-34e5a1f3]{z-index:20;position:absolute;top:calc(100% + 4px);left:12px;right:12px}.source-panel[data-v-34e5a1f3]{background:#1e1e38;border:1px solid #ffffff1a}.peek-card[data-v-34e5a1f3]{color:#ddd;background:#ffffff06;border-color:#ffffff1a;transition:background .15s,border-color .15s,transform .1s}.peek-card[data-v-34e5a1f3]:hover{background:#ffffff0f;border-color:#818cf880}.peek-card[data-v-34e5a1f3]:active{transform:scale(.99)}.peek-card--active[data-v-34e5a1f3]{background:#6366f124;border-color:#818cf8;box-shadow:inset 0 0 0 1px #818cf859}.peek-card--active .peek-card-icon[data-v-34e5a1f3]{color:#a5b4fc}.peek-card-icon[data-v-34e5a1f3]{color:#888;flex-shrink:0}.manual-expansion[data-v-34e5a1f3],.advanced-options[data-v-34e5a1f3]{background:#1e1e38;border:1px solid #ffffff1a;overflow:hidden}.manual-expansion[data-v-34e5a1f3] .q-expansion-item__content,.advanced-options[data-v-34e5a1f3] .q-expansion-item__content{background:#19192f}.manual-expansion[data-v-34e5a1f3] .q-chip{max-width:100%;height:auto;min-height:32px}.manual-expansion[data-v-34e5a1f3] .q-chip__content{white-space:normal;overflow-wrap:anywhere}.auto-loop-panel[data-v-34e5a1f3]{background:#f59e0b0f;border-top:1px solid #f59e0b38;gap:16px}.auto-loop-session-toggle[data-v-34e5a1f3] .q-btn{min-height:32px;padding-top:4px;padding-bottom:4px}[data-v-34e5a1f3] .agent-config-header{min-height:56px;padding-top:6px;padding-bottom:8px}.agent-summary[data-v-34e5a1f3]{row-gap:4px}.agent-summary[data-v-34e5a1f3] .q-chip{margin:0}.create-actions-card[data-v-34e5a1f3]{z-index:10;position:sticky;bottom:16px;box-shadow:0 10px 36px #00000061}.voice-btn--recording[data-v-34e5a1f3]{animation:1.1s ease-in-out infinite voice-pulse-34e5a1f3}@keyframes voice-pulse-34e5a1f3{0%,to{opacity:1;transform:scale(1)}50%{opacity:.86;transform:scale(1.06)}}.slide-enter-active[data-v-34e5a1f3],.slide-leave-active[data-v-34e5a1f3]{transition:max-height .2s,opacity .2s;overflow:hidden}.slide-enter-from[data-v-34e5a1f3],.slide-leave-to[data-v-34e5a1f3]{opacity:0;max-height:0}.slide-enter-to[data-v-34e5a1f3],.slide-leave-from[data-v-34e5a1f3]{opacity:1;max-height:900px}@media (max-width:599px){.create-page[data-v-34e5a1f3]{padding:28px 12px 56px}.create-title[data-v-34e5a1f3]{font-size:26px}.create-actions-card[data-v-34e5a1f3]{bottom:8px}.create-actions-card[data-v-34e5a1f3] .q-card__section{align-items:stretch}.create-actions[data-v-34e5a1f3]{width:100%}.create-actions .q-btn[data-v-34e5a1f3]:last-child{flex:1}}
@@ -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{d as g,t as _}from"./QBtn-DJGkBel8.js";import{t as ue}from"./QSeparator-C_2BuEw9.js";import{o as de}from"./use-checkbox-D-9LXk-S.js";import{L as fe,Q as pe,R as me,d as he,et as v,g as ge,l as _e,n as ve,s as ye,v as be}from"./index-B12jWMl8.js";import{t as xe}from"./QSpinnerDots-C-tv95pD.js";import{n as y,t as b}from"./QItemSection-B-5iFRBZ.js";import{f as Se,m as x,n as Ce,t as S}from"./QSelect-TFRaHbzG.js";import{i as we,n as Te,r as Ee}from"./layout-me0gwmBV.js";import{t as De}from"./QChip-iLXQ5Khf.js";import{t as Oe}from"./QBtnToggle-D-Hsqmcb.js";import{i as ke}from"./project-color-Cc9yKGk3.js";import{n as Ae}from"./use-is-mobile-DX2Fiee-.js";import{t as je}from"./DrawerToggleButton-CjM28eaw.js";import{a as Me,i as Ne,n as Pe,r as Fe,t as Ie}from"./expand-template-Dl4wUjF8.js";import{i as Le,r as Re,t as ze}from"./permissionModes-6jhegAm-.js";var Be=`kobo:create-page-prefs`;function C(){try{let e=localStorage.getItem(Be);return e===null?void 0:JSON.parse(e)}catch{return}}function Ve(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function He(){let e=C();if(!Ve(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),Ve(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 Ue(e){try{localStorage.setItem(Be,JSON.stringify(e))}catch{}}var We={class:`create-inner q-mx-auto`},Ge={class:`q-mb-lg`},Ke={class:`create-title text-weight-bold text-grey-2`},qe={class:`text-body1 text-grey-5 q-mt-xs`},Je={class:`create-sections column`},Ye={class:`text-subtitle1 text-weight-medium text-grey-2`},Xe={class:`text-body2 text-grey-6`},Ze={class:`card-textarea-wrap`},Qe={class:`column items-center self-end q-pb-xs`},$e={key:0,class:`column q-gutter-y-sm`},et={class:`text-caption text-weight-medium text-grey-5`},tt={class:`row q-gutter-sm`},nt={key:0,class:`source-panel column q-gutter-y-sm q-pa-md rounded-borders`},rt={key:0},it={class:`text-body2 text-grey-4 q-mb-sm`},at={class:`responsive-fields responsive-fields--sm row q-col-gutter-x-sm`},ot={class:`col-12 col-sm-6`},st={class:`col`},ct={class:`text-body2 text-weight-medium`},lt={class:`text-caption text-grey-6`},ut={class:`col-12 col-sm-6`},dt={class:`col`},ft={class:`text-body2 text-weight-medium`},pt={class:`text-caption text-grey-6`},mt={key:0,class:`source-panel q-pa-md rounded-borders`},ht={key:1,class:`responsive-fields row q-col-gutter-x-md`},gt={class:`col-12 col-md-6`},_t={class:`q-pa-md column q-gutter-y-sm`},vt={key:0,class:`row q-gutter-xs`},yt={class:`col-12 col-md-6`},bt={class:`q-pa-md column q-gutter-y-sm`},xt={key:0,class:`row q-gutter-xs`},St={class:`text-subtitle1 text-weight-medium text-grey-2`},Ct={class:`text-body2 text-grey-6`},wt={class:`text-caption text-weight-medium text-grey-5 q-mb-sm`},Tt={class:`responsive-fields row q-col-gutter-x-md`},Et={class:`col-12 col-md-6`},Dt={class:`col-12 col-md-6`},Ot={key:0,class:`responsive-fields row q-col-gutter-x-md`},kt={class:`col-12 col-md-4`},At={class:`col-12 col-md-8`},jt={class:`self-center full-width no-outline text-grey-4 ellipsis`,tabindex:`0`},Mt={class:`col`},Nt={class:`text-subtitle1 text-weight-medium text-grey-2`},Pt={class:`text-body2 text-grey-6`},Ft={key:0,class:`col-12 col-sm-6`},It={class:`col-12 col-sm-6`},Lt={class:`col-12 col-sm-6`},Rt={class:`col-12 col-sm-6`},zt={class:`text-subtitle2 text-amber-3`},Bt={class:`responsive-fields row q-col-gutter-x-md`},Vt={class:`col-12 col-sm-6`},Ht={class:`col-12 col-sm-6`},Ut={class:`text-caption text-grey-6`},Wt={class:`row q-gutter-sm create-actions`},Gt=6e4,w=Ee(te({__name:`CreatePage`,setup(te){function Ee(e){return e.disabled===!0}let Be=ye(),C=Te(),Ve=he(),w=be(),{t:T}=e(),Kt=n([]),qt=n(``),E=n(``),Jt=n(null),Yt=n(``),D=n(!1),O=n(!1),Xt=n(null),Zt=n(null),Qt=n([]),$t=n(null),k=n(``),A=n(!1),j=n(`claude-opus-4-8`),M=n(`claude-opus-4-8`),en=n(`auto`),N=n(`auto`),P=n({}),F=n(``),I=n(null),L=n(`feature`),tn=n(!1),nn=a(()=>w.global.voiceEnabled),rn=n([]),R=n(`claude-code`),an=a(()=>rn.value.find(e=>e.id===R.value)),on=a(()=>rn.value.map(e=>({value:e.id,label:e.displayName}))),sn=a(()=>w.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),cn=[`plan`,`bypass`,`strict`,`interactive`];function ln(e,t){let n=e?w.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&cn.includes(r))return r;let i=w.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&cn.includes(i)?i:n?.dangerouslySkipPermissions??w.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let z=n(ln(``,R.value)),un=a(()=>{switch(z.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),dn=a(()=>(ze[R.value]??cn).map(e=>({value:e,label:T(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),B=n([]),fn=n([]),pn=n(!1),mn=n(!1);function hn(e,t){t(()=>{fn.value=e?B.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):B.value})}let gn=me();function _n(){return Jt.value?.nativeEl??null}let{showSkills:vn,selectedSkillIndex:V,groupedDropdown:yn,flatDropdown:H,fetchSkills:bn,detectSlashFragment:xn,replaceFragmentWith:Sn,closeDropdown:Cn}=Ne(E,_n,{excludeKoboCommands:!0});bn(),m(E,async()=>{await oe(),await xn()});function wn(e){if(e.type===`template`){let t=gn.templates.find(t=>t.slug===e.name);if(!t)return;let n=Pe(t.content,Ie({workspace:null,gitStats:null,sessionName:null}));Sn(n),Cn();return}Sn(`/${e.name} `),Cn()}function Tn(e){!vn.value||H.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),V.value=(V.value+1)%H.value.length):e.key===`ArrowUp`?(e.preventDefault(),V.value=(V.value-1+H.value.length)%H.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),wn(H.value[V.value])):e.key===`Escape`&&(e.preventDefault(),Cn()))}async function En(){if(!(!nn.value||D.value||O.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){C.notify({type:`warning`,message:T(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Zt.value=e,Qt.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&&Qt.value.push(e.data)},n.start(),Xt.value=n,D.value=!0,$t.value=setTimeout(()=>{U(),C.notify({type:`info`,message:T(`voice.maxDurationReached`),position:`top`,timeout:3500})},Gt)}catch{C.notify({type:`negative`,message:T(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function U(){if(!D.value)return;let e=Xt.value;if(!e)return;D.value=!1,O.value=!0,$t.value&&=(clearTimeout($t.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Qt.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`,w.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()&&(E.value=E.value?`${E.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;C.notify({type:`negative`,message:T({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{Xt.value=null,Qt.value=[],Zt.value?.getTracks().forEach(e=>{e.stop()}),Zt.value=null,O.value=!1}}function Dn(e){return nn.value?w.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function On(e){!Dn(e)||e.repeat||(e.preventDefault(),En())}function kn(e){Dn(e)&&(e.preventDefault(),U())}function An(){D.value&&U()}function jn(){document.visibilityState!==`visible`&&D.value&&U()}let W=a(()=>(Le[R.value]??Re).map(e=>({label:T(e.i18nLabelKey),value:e.value,description:T(e.i18nDescriptionKey)})));m(R,()=>{let e=W.value.map(e=>e.value);if(e.length>0){let t=w.global.defaultModelByEngine?.[R.value];typeof t==`string`&&e.includes(t)?j.value=t:e.includes(j.value)||(j.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}e.length>0&&!e.includes(M.value)&&(M.value=e.includes(`auto`)?`auto`:e[0]??`auto`);let t=ze[R.value]??[];t.length>0&&!t.includes(z.value)&&(z.value=ln(F.value,R.value));let n=(Fe[R.value]??[]).map(e=>e.value);n.length>0&&!n.includes(N.value)&&(N.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function Mn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Nn=a(()=>(Fe[R.value]??Fe[`claude-code`]).map(e=>({value:e.value,label:Mn(T(e.i18nLabelKey)),description:T(e.i18nDescriptionKey)})));m(j,e=>{let t=P.value[e];t&&Nn.value.some(e=>e.value===t)&&(N.value=t)}),m(N,e=>{P.value={...P.value,[j.value]:e},Ue({...He(),reasoningEffortByModel:P.value})});let G=a(()=>{let e=k.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),Pn=a(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(k.value)),K=n(`panel`);function Fn(){let e=k.value.trim();return K.value===`parent`&&Pn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=n([]),J=n([]),In=n(``),Ln=n(``),Rn=a(()=>!A.value||!G.value);function zn(){let e=In.value.trim();e&&(q.value.push(e),In.value=``)}function Bn(e){q.value.splice(e,1)}function Vn(){let e=Ln.value.trim();e&&(J.value.push(e),Ln.value=``)}function Hn(e){J.value.splice(e,1)}function Un(){A.value=!A.value,A.value||(k.value=``)}let Y=n(!1),X=n(!1),Wn=n(`per_task`);m(()=>X.value,e=>{e&&z.value!==`bypass`&&(z.value=`bypass`)});function Gn(){X.value=!X.value,X.value&&(M.value=j.value)}let Z=n(``),Kn=a(()=>/\/issues\/\d+/.test(Z.value.trim()));function qn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=n(!1),$=n(null),Jn=n([]),Yn=n(!1);async function Xn(){if(!F.value.trim()){Jn.value=[];return}Yn.value=!0;try{Jn.value=await Ve.fetchOrphanWorktrees(F.value.trim())}catch{Jn.value=[]}finally{Yn.value=!1}}function Zn(){Q.value=!Q.value,Q.value?(A.value=!1,k.value=``,Y.value=!1,Z.value=``,tn.value=!0,Xn()):$.value=null}function Qn(e){e===`existing`!==Q.value&&Zn()}m(F,()=>{$.value=null,Q.value&&Xn()}),m($,e=>{if(!e)return;let t=Jn.value.find(t=>t.path===e);t&&(I.value=t.suggestedSourceBranch),tn.value=!0});async function $n(e){if(!e.trim()){B.value=[],I.value=null;return}pn.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();B.value=n.local??n.branches??[],B.value.length>0&&!I.value&&(I.value=B.value[0]??null)}catch{B.value=[],I.value=null}finally{pn.value=!1}}function er(e){let t=w.getProjectByPath(e);if(t){t.defaultSourceBranch&&(I.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(E.value===``||E.value===Yt.value)&&(E.value=e,Yt.value=e);let n=W.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))j.value=t.defaultModel;else{let e=w.global.defaultModelByEngine?.[R.value];typeof e==`string`&&n.includes(e)&&(j.value=e)}}z.value=ln(e,R.value)}let tr=null;m(F,e=>{tr&&clearTimeout(tr),tr=setTimeout(()=>{I.value=null,$n(e),er(e)},500)});function nr(e,t){let n=e.toLowerCase();t(()=>{Kt.value=w.projectPaths.filter(e=>e.toLowerCase().includes(n)||ke(e).toLowerCase().includes(n))})}function rr(e){let t=w.projectPaths.find(t=>ke(t)===e);F.value=t??e}ae(async()=>{await w.fetchSettings();let e=w.global.branchPrefixes;e.length>0&&!e.includes(L.value)&&(L.value=e[0]);let t=He();P.value=t.reasoningEffortByModel??{},t.autoLoop===!0&&(X.value=!0),t.autoLoopSessionMode===`continuous`&&(Wn.value=`continuous`),t.autoLoop===!0&&t.brainstormModel&&(M.value=t.brainstormModel),t.projectPath&&w.projectPaths.includes(t.projectPath)&&(F.value=t.projectPath),z.value=ln(F.value,R.value);try{let e=await fetch(`/api/engines`);e.ok&&(rn.value=await e.json())}catch{}{let e=W.value.map(e=>e.value),t=w.global.defaultModelByEngine?.[R.value];typeof t==`string`&&e.includes(t)?j.value=t:e.length>0&&!e.includes(j.value)&&(j.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let n=P.value[j.value];n&&Nn.value.some(e=>e.value===n)&&(N.value=n);{let e=W.value.map(e=>e.value);e.length>0&&!e.includes(M.value)&&(M.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,On),window.addEventListener(`keyup`,kn),window.addEventListener(`blur`,An),document.addEventListener(`visibilitychange`,jn)}),ie(()=>{tr&&clearTimeout(tr),window.removeEventListener(`keydown`,On),window.removeEventListener(`keyup`,kn),window.removeEventListener(`blur`,An),document.removeEventListener(`visibilitychange`,jn),$t.value&&=(clearTimeout($t.value),null),D.value&&U()});function ir(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 ar(){return qt.value.trim()?qt.value.trim().substring(0,80):!A.value&&!Y.value&&E.value.trim()&&(E.value.trim().split(`
2
+ `)[0]??``).substring(0,80)||`workspace`}function or(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 sr=a(()=>{if(A.value&&G.value)return`${L.value}/${or(Fn())}`;let e=ar(),t=e===`workspace`?T(`createPage.branchNamePending`):ir(e);return`${L.value}/${t}`});function cr(){return A.value&&!G.value?T(`createPage.validationNotionUrl`):Y.value&&!Kn.value?T(`createPage.sentryValidation`):!A.value&&!Y.value&&!E.value.trim()?T(`createPage.validationDescription`):!A.value&&!Y.value&&(!ar()||ar()===`workspace`)&&!qt.value.trim()&&!E.value.trim()?T(`createPage.validationName`):F.value.trim()?I.value?null:T(`createPage.validationBranch`):T(`createPage.validationPath`)}async function lr(){if(mn.value)return;let e=cr();if(e){C.notify({type:`negative`,message:e,position:`top`});return}if(Q.value&&!$.value){C.notify({type:`negative`,message:T(`createPage.pickWorktreeRequired`),position:`top`});return}mn.value=!0;try{let e=ar(),t;t=A.value&&G.value?or(Fn()):e===`workspace`?`task-${Date.now()}`:ir(e);let n=`${L.value}/${t}`,r={name:e,projectPath:F.value.trim(),sourceBranch:I.value,...Q.value&&$.value?{worktreePath:$.value,skipSetupScript:!0,workingBranch:n}:{workingBranch:n},engine:R.value,model:j.value,reasoningEffort:N.value,...A.value&&G.value?{notionUrl:Fn()}:{},...Y.value&&Kn.value?{sentryUrl:Z.value.trim()}:{},...Rn.value&&q.value.length>0?{tasks:q.value}:{},...Rn.value&&J.value.length>0?{acceptanceCriteria:J.value}:{},...tn.value&&!Q.value?{skipSetupScript:!0}:{},...E.value.trim()?{description:E.value.trim()}:{},...X.value?{autoLoop:!0,autoLoopSessionMode:Wn.value,brainstormModel:M.value,brainstormReasoningEffort:en.value}:{},agentPermissionMode:X.value&&z.value===`plan`?`bypass`:z.value},i=await Ve.createWorkspace(r);w.global.audioWorkspaceCreatedNotifications&&ge(w.global.audioWorkspaceCreatedSound,w.global.audioWorkspaceCreatedVolume),i._branchAdjusted&&C.notify({type:`info`,message:T(`createPage.branchAdjusted`,{branch:i.workingBranch}),position:`top`,timeout:6e3}),i._sourceFallback&&C.notify({type:`warning`,message:T(`createPage.localSourceFallback`),position:`top`,timeout:6e3}),Ue({projectPath:F.value.trim(),autoLoop:X.value,autoLoopSessionMode:Wn.value,...X.value?{brainstormModel:M.value}:{},reasoningEffortByModel:{...P.value,[j.value]:N.value}}),_e().subscribe(i.id),Ve.selectWorkspace(i.id),Be.push({name:`workspace`,params:{id:i.id}})}catch(e){C.notify({type:`negative`,message:e instanceof Error&&e.message?e.message:T(`createPage.errorCreating`),position:`top`})}finally{mn.value=!1}}return(e,n)=>(s(),o(Ae,{class:`create-page`},{default:p(()=>[f(je,{class:`create-page__drawer-toggle`}),l(`div`,We,[l(`header`,Ge,[l(`div`,Ke,r(e.$t(`createPage.title`)),1),l(`div`,qe,r(e.$t(`createPage.subtitle`)),1)]),l(`div`,Je,[f(pe,{flat:``,bordered:``,class:`create-section-card`},{default:p(()=>[f(v,{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`,Ye,r(e.$t(`createPage.sectionMission`)),1),l(`div`,Xe,r(e.$t(`createPage.sectionMissionHint`)),1)])]),_:1}),f(ue,{dark:``}),f(v,{class:`column q-gutter-y-md`},{default:p(()=>[f(de,{modelValue:qt.value,"onUpdate:modelValue":n[0]||=e=>qt.value=e,dark:``,dense:``,outlined:``,"stack-label":``,label:e.$t(`createPage.workspaceNameLabel`),placeholder:A.value&&G.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`)},null,8,[`modelValue`,`label`,`placeholder`]),l(`div`,Ze,[f(de,{ref_key:`descriptionRef`,ref:Jt,modelValue:E.value,"onUpdate:modelValue":n[1]||=e=>E.value=e,dark:``,dense:``,outlined:``,"stack-label":``,type:`textarea`,autogrow:``,rows:6,label:e.$t(`createPage.descriptionLabel`),placeholder:A.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,onKeydown:[Tn,re(h(lr,[`ctrl`]),[`enter`]),re(h(lr,[`meta`]),[`enter`])]},{append:p(()=>[l(`div`,Qe,[O.value?(s(),o(xe,{key:0,size:`18px`,color:`amber-6`})):c(``,!0),f(_,{flat:``,dense:``,round:``,size:`sm`,icon:O.value?`hourglass_top`:D.value?`mic`:`mic_none`,color:D.value?`red-5`:O.value?`amber-6`:`grey-6`,disable:!nn.value||O.value,class:ee({"voice-btn--recording":D.value}),onMousedown:h(En,[`prevent`]),onMouseup:h(U,[`prevent`]),onMouseleave:h(U,[`prevent`]),onTouchstart:h(En,[`prevent`]),onTouchend:h(U,[`prevent`])},{default:p(()=>[f(we,null,{default:p(()=>[d(r(O.value?e.$t(`voice.transcribing`):D.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])])]),_:1},8,[`modelValue`,`label`,`placeholder`,`onKeydown`]),t(vn)&&t(H).length>0?(s(),o(Me,{key:0,class:`create-slash-popup`,"grouped-dropdown":t(yn),"flat-dropdown":t(H),"selected-index":t(V),onSelect:wn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):c(``,!0)]),t(w).global.notionEnabled||t(w).global.sentryEnabled?(s(),u(`div`,$e,[l(`div`,et,r(e.$t(`createPage.sources`)),1),l(`div`,tt,[t(w).global.notionEnabled?(s(),o(_,{key:0,dense:``,outline:``,"no-caps":``,icon:`description`,color:A.value?`green-4`:`grey-5`,label:A.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`),disable:Q.value,onClick:Un},null,8,[`color`,`label`,`disable`])):c(``,!0),t(w).global.sentryEnabled?(s(),o(_,{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:qn},null,8,[`color`,`label`,`disable`])):c(``,!0)])])):c(``,!0),f(le,{name:`slide`},{default:p(()=>[A.value?(s(),u(`div`,nt,[f(de,{modelValue:k.value,"onUpdate:modelValue":n[2]||=e=>k.value=e,dark:``,outlined:``,dense:``,"stack-label":``,label:e.$t(`createPage.importNotion`),placeholder:e.$t(`createPage.notionPlaceholder`),error:!!k.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&&Pn.value?(s(),u(`div`,rt,[l(`div`,it,[f(g,{name:`info`,color:`indigo-4`,class:`q-mr-xs`}),d(` `+r(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),l(`div`,at,[l(`div`,ot,[f(pe,{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(v,{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`,st,[l(`div`,ct,r(e.$t(`createPage.notionPanelOption`)),1),l(`div`,lt,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`,ut,[f(pe,{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(v,{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`,dt,[l(`div`,ft,r(e.$t(`createPage.notionParentOption`)),1),l(`div`,pt,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`,mt,[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()&&!Kn.value,"error-message":e.$t(`createPage.sentryValidation`),hint:Kn.value?e.$t(`createPage.sentryAutoExtract`):void 0},{prepend:p(()=>[f(g,{name:`link`,color:Kn.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`label`,`placeholder`,`error`,`error-message`,`hint`])])):c(``,!0)]),_:1}),Rn.value?(s(),u(`div`,ht,[l(`div`,gt,[f(Se,{dark:``,dense:``,"expand-separator":``,icon:`checklist`,label:e.$t(`createPage.tasks`,{count:q.value.length}),class:`manual-expansion rounded-borders`},{default:p(()=>[l(`div`,_t,[f(de,{modelValue:In.value,"onUpdate:modelValue":n[6]||=e=>In.value=e,dark:``,dense:``,outlined:``,placeholder:e.$t(`createPage.addTask`),onKeydown:re(h(zn,[`prevent`]),[`enter`])},{append:p(()=>[f(_,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!In.value.trim(),onClick:zn},{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`,vt,[(s(!0),u(ne,null,se(q.value,(e,t)=>(s(),o(De,{key:`task-${t}`,dark:``,dense:``,removable:``,color:`grey-9`,"text-color":`grey-3`,onRemove:e=>Bn(t)},{default:p(()=>[d(r(e),1)]),_:2},1032,[`onRemove`]))),128))])):c(``,!0)])]),_:1},8,[`label`])]),l(`div`,yt,[f(Se,{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`,bt,[f(de,{modelValue:Ln.value,"onUpdate:modelValue":n[7]||=e=>Ln.value=e,dark:``,dense:``,outlined:``,placeholder:e.$t(`createPage.addCriterion`),onKeydown:re(h(Vn,[`prevent`]),[`enter`])},{append:p(()=>[f(_,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Ln.value.trim(),onClick:Vn},{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`,xt,[(s(!0),u(ne,null,se(J.value,(e,t)=>(s(),o(De,{key:`criterion-${t}`,dark:``,dense:``,removable:``,color:`grey-9`,"text-color":`grey-3`,onRemove:e=>Hn(t)},{default:p(()=>[d(r(e),1)]),_:2},1032,[`onRemove`]))),128))])):c(``,!0)])]),_:1},8,[`label`])])])):c(``,!0)]),_:1})]),_:1}),f(pe,{flat:``,bordered:``,class:`create-section-card`},{default:p(()=>[f(v,{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`,St,r(e.$t(`createPage.sectionGit`)),1),l(`div`,Ct,r(e.$t(`createPage.sectionGitHint`)),1)])]),_:1}),f(ue,{dark:``}),f(v,{class:`column q-gutter-y-md`},{default:p(()=>[l(`div`,null,[l(`div`,wt,r(e.$t(`createPage.worktreeMode`)),1),f(Oe,{"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":Qn},null,8,[`model-value`,`options`])]),l(`div`,Tt,[l(`div`,Et,[f(S,{modelValue:F.value,"onUpdate:modelValue":n[8]||=e=>F.value=e,options:Kt.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(w).projectPaths.length>0?`menu`:`dialog`,"option-label":e=>e?t(ke)(e):``,onFilter:nr,onInputValue:rr},{prepend:p(()=>[f(g,{name:`folder`})]),option:p(({opt:e,itemProps:n})=>[f(y,i(ce(n)),{default:p(()=>[f(b,null,{default:p(()=>[f(x,null,{default:p(()=>[d(r(t(ke)(e)),1)]),_:2},1024),f(x,{caption:``},{default:p(()=>[d(r(e),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":p(()=>[f(y,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`,Dt,[f(S,{modelValue:I.value,"onUpdate:modelValue":n[9]||=e=>I.value=e,options:fn.value,dark:``,dense:``,outlined:``,"stack-label":``,"use-input":``,"input-debounce":`0`,label:e.$t(`createPage.sourceBranch`),loading:pn.value,disable:!F.value.trim()||pn.value,onFilter:hn},{prepend:p(()=>[f(g,{name:`call_split`})]),"no-option":p(()=>[f(y,null,{default:p(()=>[f(b,{class:`text-grey-6`},{default:p(()=>[d(r(F.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`,Ot,[l(`div`,kt,[f(S,{modelValue:L.value,"onUpdate:modelValue":n[10]||=e=>L.value=e,options:sn.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`,At,[f(Ce,{dark:``,dense:``,outlined:``,"stack-label":``,readonly:``,label:e.$t(`createPage.workingBranchPreview`)},{control:p(()=>[l(`div`,jt,r(sr.value),1)]),prepend:p(()=>[f(g,{name:`fork_right`})]),_:1},8,[`label`])])])),Q.value?(s(),o(S,{key:1,modelValue:$.value,"onUpdate:modelValue":n[11]||=e=>$.value=e,options:Jn.value,dark:``,dense:``,outlined:``,"stack-label":``,"option-label":`branch`,"option-value":`path`,"emit-value":``,"map-options":``,"use-input":``,label:e.$t(`createPage.worktreePickerLabel`),loading:Yn.value,disable:!F.value.trim()||Yn.value},{prepend:p(()=>[f(g,{name:`folder_open`,color:`cyan-5`})]),option:p(e=>[f(y,i(ce(e.itemProps)),{default:p(()=>[f(b,null,{default:p(()=>[f(x,null,{default:p(()=>[d(r(e.opt.branch),1)]),_:2},1024),f(x,{caption:``},{default:p(()=>[d(r(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":p(()=>[f(y,null,{default:p(()=>[f(b,{class:`text-grey-6`},{default:p(()=>[d(r(F.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(pe,{flat:``,bordered:``,class:`create-section-card`},{default:p(()=>[f(v,{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`,Mt,[l(`div`,Nt,r(e.$t(`createPage.sectionAgent`)),1),l(`div`,Pt,r(e.$t(`createPage.sectionAgentHint`)),1)]),f(ve,{"model-value":X.value,dense:``,color:`amber-6`,icon:`autorenew`,label:e.$t(`autoLoop.toggle`),"left-label":``,"onUpdate:modelValue":Gn},null,8,[`model-value`,`label`])]),_:1}),f(ue,{dark:``}),f(Se,{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(x,null,{default:p(()=>[d(r(e.$t(`createPage.configureAgent`)),1)]),_:1}),f(x,{caption:``,class:`agent-summary row q-gutter-x-xs q-mt-xs`},{default:p(()=>[f(De,{dense:``,color:`grey-9`,"text-color":`grey-3`,icon:`hub`},{default:p(()=>[d(r(an.value?.displayName??R.value),1)]),_:1}),f(De,{dense:``,color:`grey-9`,"text-color":`grey-3`},{default:p(()=>[d(r(W.value.find(e=>e.value===j.value)?.label??j.value),1)]),_:1}),f(De,{dense:``,color:`grey-9`,"text-color":`grey-3`,icon:`psychology`},{default:p(()=>[d(r(Nn.value.find(e=>e.value===N.value)?.label??N.value),1)]),_:1}),f(De,{dense:``,color:`grey-9`,"text-color":`grey-3`,icon:un.value},{default:p(()=>[d(r(dn.value.find(e=>e.value===z.value)?.label??z.value),1)]),_:1},8,[`icon`])]),_:1})]),_:1})]),default:p(()=>[f(v,{class:`responsive-fields row q-col-gutter-x-md q-pt-md`},{default:p(()=>[on.value.length>0?(s(),u(`div`,Ft,[f(S,{modelValue:R.value,"onUpdate:modelValue":n[12]||=e=>R.value=e,options:on.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`,It,[f(S,{modelValue:j.value,"onUpdate:modelValue":n[13]||=e=>j.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(y,i(ce(t)),{default:p(()=>[f(b,null,{default:p(()=>[f(x,null,{default:p(()=>[d(r(e.label),1)]),_:2},1024),f(x,{caption:``},{default:p(()=>[d(r(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`,`label`])]),l(`div`,Lt,[f(S,{modelValue:N.value,"onUpdate:modelValue":n[14]||=e=>N.value=e,options:Nn.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(y,i(ce(t)),{default:p(()=>[f(b,null,{default:p(()=>[f(x,null,{default:p(()=>[d(r(e.label),1)]),_:2},1024),f(x,{caption:``},{default:p(()=>[d(r(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`,`label`])]),l(`div`,Rt,[f(S,{modelValue:z.value,"onUpdate:modelValue":n[15]||=e=>z.value=e,options:dn.value,dark:``,dense:``,outlined:``,"stack-label":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,"option-disable":Ee,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(v,{key:0,class:`auto-loop-panel column`},{default:p(()=>[l(`div`,zt,r(e.$t(`autoLoop.startInMode`)),1),f(Oe,{modelValue:Wn.value,"onUpdate:modelValue":n[16]||=e=>Wn.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`,Bt,[l(`div`,Vt,[f(S,{modelValue:M.value,"onUpdate:modelValue":n[17]||=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(`autoLoop.brainstormModelPrefix`)},null,8,[`modelValue`,`options`,`label`])]),l(`div`,Ht,[f(S,{modelValue:en.value,"onUpdate:modelValue":n[18]||=e=>en.value=e,options:Nn.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(Se,{dark:``,dense:``,"expand-separator":``,icon:`settings`,label:e.$t(`createPage.advancedOptions`),class:`advanced-options rounded-borders`},{default:p(()=>[f(v,null,{default:p(()=>[f(ve,{modelValue:tn.value,"onUpdate:modelValue":n[19]||=e=>tn.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(pe,{flat:``,bordered:``,class:`create-actions-card`},{default:p(()=>[f(v,{class:`row items-center justify-between q-gutter-md`},{default:p(()=>[l(`div`,Ut,r(A.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.keyboardHint`)),1),l(`div`,Wt,[f(_,{flat:``,dense:``,"no-caps":``,color:`grey-5`,label:e.$t(`common.cancel`),onClick:n[20]||=e=>t(Be).back()},null,8,[`label`]),f(_,{unelevated:``,dense:``,"no-caps":``,color:`indigo-6`,"icon-right":`arrow_forward`,label:e.$t(`createPage.createWorkspace`),loading:mn.value,disable:mn.value||Q.value&&!$.value,onClick:lr},null,8,[`label`,`loading`,`disable`])])]),_:1})]),_:1})])])]),_:1}))}}),[[`__scopeId`,`data-v-34e5a1f3`]]);export{w as default};