@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.
- package/CHANGELOG.md +8 -0
- package/dist/mcp-server/kobo-tasks-server.js +27 -0
- package/dist/server/db/migrations.js +13 -0
- package/dist/server/db/schema.js +2 -1
- package/dist/server/services/agent/engines/claude-code/engine.js +29 -4
- package/dist/server/services/agent/engines/claude-code/options-builder.js +2 -1
- package/dist/server/services/agent/engines/codex/engine.js +2 -0
- package/dist/server/services/agent/engines/codex/options-builder.js +2 -1
- package/dist/server/services/agent/engines/types.js +1 -0
- package/dist/server/services/agent/orchestrator.js +80 -9
- package/dist/server/services/auto-loop-service.js +6 -0
- package/package.json +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-WBBk7DgE.js +8 -0
- package/src/client/dist/pwa/assets/ChangelogPage-Cr5cW9Wx.js +1 -0
- package/src/client/dist/pwa/assets/ChangelogPage-DGhfnkax.css +1 -0
- package/src/client/dist/pwa/assets/ClosePopup-2KSSXX6P.js +1 -0
- package/src/client/dist/pwa/assets/CreatePage-Bl1Vjr27.css +1 -0
- package/src/client/dist/pwa/assets/CreatePage-DQk8TrUP.js +2 -0
- package/src/client/dist/pwa/assets/DiffViewer-C9xV8dh-.js +8 -0
- package/src/client/dist/pwa/assets/DrawerToggleButton-CjM28eaw.js +1 -0
- package/src/client/dist/pwa/assets/HealthPage-BbLpLRjV.js +1 -0
- package/src/client/dist/pwa/assets/HealthPage-BqirO5le.css +1 -0
- package/src/client/dist/pwa/assets/MainLayout-BUril7SK.js +19 -0
- package/src/client/dist/pwa/assets/QBadge-DS9cpnyx.js +1 -0
- package/src/client/dist/pwa/assets/{QBanner-DedhGMcj.js → QBanner-tANb95XA.js} +1 -1
- package/src/client/dist/pwa/assets/QBtn-DJGkBel8.js +1 -0
- package/src/client/dist/pwa/assets/QBtnToggle-D-Hsqmcb.js +1 -0
- package/src/client/dist/pwa/assets/QChip-iLXQ5Khf.js +1 -0
- package/src/client/dist/pwa/assets/QItemSection-B-5iFRBZ.js +1 -0
- package/src/client/dist/pwa/assets/{QList-Be_FbTA3.js → QList-D-yd1vEv.js} +1 -1
- package/src/client/dist/pwa/assets/QSelect-TFRaHbzG.js +36 -0
- package/src/client/dist/pwa/assets/QSeparator-C_2BuEw9.js +1 -0
- package/src/client/dist/pwa/assets/{QSpace-D9UEvM99.js → QSpace-BuMMeXnK.js} +1 -1
- package/src/client/dist/pwa/assets/{QSpinnerDots-B4RmFJUj.js → QSpinnerDots-C-tv95pD.js} +1 -1
- package/src/client/dist/pwa/assets/SearchPage-CPM7L9_M.js +1 -0
- package/src/client/dist/pwa/assets/SearchPage-CngtAqls.css +1 -0
- package/src/client/dist/pwa/assets/SettingsPage-BRYycuYY.js +16 -0
- package/src/client/dist/pwa/assets/SettingsPage-D5BacmAr.css +1 -0
- package/src/client/dist/pwa/assets/TouchPan-79_u9-Fd.js +1 -0
- package/src/client/dist/pwa/assets/WorkspacePage-DB1n1bmg.js +4 -0
- package/src/client/dist/pwa/assets/{WorkspacePage-ChnyJ3xI.css → WorkspacePage-hxEpXqBA.css} +1 -1
- package/src/client/dist/pwa/assets/{cssMode-BsN8TWME.js → cssMode-DNEi2cLH.js} +1 -1
- package/src/client/dist/pwa/assets/documents-BMvE9Q_U.js +1 -0
- package/src/client/dist/pwa/assets/{editor.api-Dj6TIm_z.js → editor.api-_tFrtCR7.js} +1 -1
- package/src/client/dist/pwa/assets/engineFeatures-JkVb6hry.js +1 -0
- package/src/client/dist/pwa/assets/expand-template-Dl4wUjF8.js +1 -0
- package/src/client/dist/pwa/assets/{freemarker2-DC0xjWx5.js → freemarker2-kfVsFQjE.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-0Uz9nw5d.js → handlebars-EwBi9SHt.js} +1 -1
- package/src/client/dist/pwa/assets/{html-BYPeU1Vb.js → html-BOOCP_vn.js} +1 -1
- package/src/client/dist/pwa/assets/{htmlMode-B0UND_vz.js → htmlMode-IN9oEIXW.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-Dezgz2hU.js +1 -0
- package/src/client/dist/pwa/assets/index-B12jWMl8.js +82 -0
- package/src/client/dist/pwa/assets/{javascript-B8PZW8pe.js → javascript-CfV8qmeH.js} +1 -1
- package/src/client/dist/pwa/assets/{jsonMode-BixnmFse.js → jsonMode-C0b3m4VO.js} +1 -1
- package/src/client/dist/pwa/assets/{kobo-commands-CX8pforo.js → kobo-commands-DznaKlq6.js} +1 -1
- package/src/client/dist/pwa/assets/layout-me0gwmBV.js +1 -0
- package/src/client/dist/pwa/assets/{liquid-BH16_Zn1.js → liquid-D3YK93J-.js} +1 -1
- package/src/client/dist/pwa/assets/{lspLanguageFeatures-YMzTIuK0.js → lspLanguageFeatures-PklP2gEH.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-CrrWJ7fg.js → mdx-DjZcevPS.js} +1 -1
- package/src/client/dist/pwa/assets/{network-auth-NMnCVoaZ.js → network-auth-BMTuTKHx.js} +1 -1
- package/src/client/dist/pwa/assets/pending-diff-open-BG3IOnWw.js +1 -0
- package/src/client/dist/pwa/assets/{project-color-BJrCEQ0A.js → project-color-Cc9yKGk3.js} +1 -1
- package/src/client/dist/pwa/assets/{python-fk3K3s3o.js → python-BrgzhqrC.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-Dg1yHOal.js → razor-g8NeeeQc.js} +1 -1
- package/src/client/dist/pwa/assets/{render-chat-markdown-C00A6CfY.js → render-chat-markdown-CZyJL1-w.js} +1 -1
- package/src/client/dist/pwa/assets/{tsMode-qJ7nTArc.js → tsMode-DAopv4hH.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-DayfKox1.js → typescript-C2jZCVPF.js} +1 -1
- package/src/client/dist/pwa/assets/use-checkbox-D-9LXk-S.js +1 -0
- package/src/client/dist/pwa/assets/use-is-mobile-DX2Fiee-.js +1 -0
- package/src/client/dist/pwa/assets/use-onboarding-BNo8mb65.js +2 -0
- package/src/client/dist/pwa/assets/{vs-qnWnWXG9.js → vs-mk-rn9sP.js} +3 -3
- package/src/client/dist/pwa/assets/{workers-CvvtZekC.js → workers-CP5iY9Kz.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-CJ1QFxhD.js → xml-D3pYNERH.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-C3N49N5E.js → yaml-BTRPY5XP.js} +1 -1
- package/src/client/dist/pwa/index.html +4 -4
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/mcp-server/kobo-tasks-server.ts +27 -0
- package/src/client/dist/pwa/assets/ActivityFeed-DqDJDX2v.js +0 -8
- package/src/client/dist/pwa/assets/ChangelogPage-CQ33An2f.css +0 -1
- package/src/client/dist/pwa/assets/ChangelogPage-Dw2LbIK2.js +0 -1
- package/src/client/dist/pwa/assets/ClosePopup-eKuUr7CY.js +0 -1
- package/src/client/dist/pwa/assets/CreatePage--4KDhiYt.js +0 -2
- package/src/client/dist/pwa/assets/CreatePage-CV_RpAuV.css +0 -1
- package/src/client/dist/pwa/assets/DiffViewer-Bl9D1N1M.js +0 -8
- package/src/client/dist/pwa/assets/HealthPage-CaOdjuVx.js +0 -1
- package/src/client/dist/pwa/assets/MainLayout-DP9shoO1.js +0 -19
- package/src/client/dist/pwa/assets/QBadge-sMJZ_eZm.js +0 -1
- package/src/client/dist/pwa/assets/QBtnToggle-BwPZ0Smh.js +0 -1
- package/src/client/dist/pwa/assets/QChip-CY0_8v_e.js +0 -1
- package/src/client/dist/pwa/assets/QIcon--SvgE-nS.js +0 -1
- package/src/client/dist/pwa/assets/QPage-DuIsRmYu.js +0 -1
- package/src/client/dist/pwa/assets/QSelect-xHphd7hW.js +0 -36
- package/src/client/dist/pwa/assets/QSeparator-BdyRE-AM.js +0 -1
- package/src/client/dist/pwa/assets/QTooltip-DyS20jDT.js +0 -1
- package/src/client/dist/pwa/assets/SearchPage-B08_UXDs.css +0 -1
- package/src/client/dist/pwa/assets/SearchPage-CggXs3dH.js +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-8AWL_4DM.js +0 -16
- package/src/client/dist/pwa/assets/SettingsPage-BJZWZYPC.css +0 -1
- package/src/client/dist/pwa/assets/TouchPan-Cd9KTb6-.js +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-CJKSrSEC.js +0 -4
- package/src/client/dist/pwa/assets/_plugin-vue_export-helper-BDNMzG2s.js +0 -1
- package/src/client/dist/pwa/assets/documents-DJy1tgPd.js +0 -1
- package/src/client/dist/pwa/assets/expand-template-By-8Db7_.js +0 -1
- package/src/client/dist/pwa/assets/i18n-DPDR4mQI.js +0 -1
- package/src/client/dist/pwa/assets/index-CtK8ORpZ.js +0 -82
- package/src/client/dist/pwa/assets/layout-BAE6NR2A.js +0 -1
- package/src/client/dist/pwa/assets/pending-diff-open-DHlXLorX.js +0 -1
- package/src/client/dist/pwa/assets/use-checkbox-SrkgiJho.js +0 -1
- package/src/client/dist/pwa/assets/use-onboarding-CF_D2gbm.js +0 -2
- 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;
|
package/dist/server/db/schema.js
CHANGED
|
@@ -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
|
-
|
|
273
|
-
|
|
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
|
-
|
|
284
|
-
|
|
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.',
|
|
@@ -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.',
|
|
@@ -488,21 +488,77 @@ function reuseOrCreateFreshSession(workspaceId, existingSessionId, model, engine
|
|
|
488
488
|
return agentSessionId;
|
|
489
489
|
}
|
|
490
490
|
const taskProgressSnapshots = new Map();
|
|
491
|
-
function
|
|
492
|
-
|
|
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
|
|
543
|
+
const memorySnapshot = workspaceSnapshots?.get(agentSessionId);
|
|
502
544
|
workspaceSnapshots?.delete(agentSessionId);
|
|
503
545
|
if (workspaceSnapshots?.size === 0)
|
|
504
546
|
taskProgressSnapshots.delete(workspaceId);
|
|
505
|
-
|
|
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
|
-
//
|
|
592
|
-
//
|
|
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
|
-
|
|
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.
|
|
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)?`}/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};
|