@loicngr/kobo 2.1.4 → 2.1.5
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 +4 -0
- package/CONFIGURATION.md +11 -3
- package/dist/server/index.js +24 -91
- package/dist/server/routes/git.js +6 -7
- package/dist/server/routes/settings.js +21 -11
- package/dist/server/routes/workspaces.js +43 -41
- package/dist/server/services/agent/integration-mcp.js +4 -3
- package/dist/server/services/agent/orchestrator.js +1 -1
- package/dist/server/services/engine-handoff-service.js +120 -24
- package/dist/server/services/pr-checkout-service.js +90 -53
- package/dist/server/services/pr-watcher-service.js +13 -7
- package/dist/server/services/retention/worker.js +40 -0
- package/dist/server/services/review-service.js +8 -4
- package/dist/server/services/session-event-metrics.js +43 -0
- package/dist/server/services/session-handoff-service.js +6 -4
- package/dist/server/services/templates-service.js +67 -49
- package/dist/server/services/terminal-service.js +45 -14
- package/dist/server/services/terminal-websocket-service.js +143 -0
- package/dist/server/services/wakeup-service.js +23 -21
- package/dist/server/services/workspace-service.js +3 -44
- package/dist/server/services/workspace-template-service.js +16 -18
- package/dist/server/services/worktree-purge-service.js +1 -4
- package/dist/server/services/ws-events-retention-service.js +197 -104
- package/dist/server/services/ws-events-retention-worker-service.js +112 -0
- package/dist/server/utils/atomic-json-file.js +23 -0
- package/dist/server/utils/git-ops.js +262 -60
- package/dist/shared/codex-models.js +20 -3
- package/dist/shared/models.js +12 -0
- package/package.json +1 -1
- package/src/client/dist/pwa/assets/{ActivityFeed-DCmiJP-z.css → ActivityFeed-B4lTKMVE.css} +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-DXWXioW9.js +8 -0
- package/src/client/dist/pwa/assets/ChangelogPage-BL5Jh8-v.js +1 -0
- package/src/client/dist/pwa/assets/ChangelogPage-DVyx9ZjV.css +1 -0
- package/src/client/dist/pwa/assets/ComparisonPanel-Bv2SZrVZ.js +2 -0
- package/src/client/dist/pwa/assets/ComparisonPanel-ByVbqYCs.css +1 -0
- package/src/client/dist/pwa/assets/CreatePage-CMyl2j8Z.css +1 -0
- package/src/client/dist/pwa/assets/CreatePage-d43ITOC1.js +2 -0
- package/src/client/dist/pwa/assets/DashboardPage-BEXXRguE.js +1 -0
- package/src/client/dist/pwa/assets/DashboardPage-CtaHaVdf.css +1 -0
- package/src/client/dist/pwa/assets/DiffViewer-B92w_jd7.js +8 -0
- package/src/client/dist/pwa/assets/DocumentsPanel-C9JXyqHg.js +1 -0
- package/src/client/dist/pwa/assets/{DrawerToggleButton-Bh4FXdtJ.js → DrawerToggleButton-Btx8QwHo.js} +1 -1
- package/src/client/dist/pwa/assets/{GitPanel-C4wOcZV2.css → GitPanel-C3blk_Pd.css} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-Cgz9crLN.js +3 -0
- package/src/client/dist/pwa/assets/HealthPage-CDhgJQkL.js +1 -0
- package/src/client/dist/pwa/assets/HealthPage-DT8FGrKA.css +1 -0
- package/src/client/dist/pwa/assets/MainLayout-DTTtj9sq.js +2 -0
- package/src/client/dist/pwa/assets/{MainLayout-CNmwCnDD.css → MainLayout-knNNtkre.css} +1 -1
- package/src/client/dist/pwa/assets/QBanner-7EWRdc4U.js +1 -0
- package/src/client/dist/pwa/assets/{QBtnDropdown-DVbxGTNb.js → QBtnDropdown-vjat4GZl.js} +1 -1
- package/src/client/dist/pwa/assets/QChip-CG1kWhFm.js +1 -0
- package/src/client/dist/pwa/assets/QExpansionItem-BQuy89vv.js +1 -0
- package/src/client/dist/pwa/assets/QItemSection-BrVklYfM.js +1 -0
- package/src/client/dist/pwa/assets/QList-BVX-b8nc.js +1 -0
- package/src/client/dist/pwa/assets/QMarkupTable-B8_FKLvo.js +1 -0
- package/src/client/dist/pwa/assets/QSelect-DBW_TZri.js +1 -0
- package/src/client/dist/pwa/assets/{QTooltip-BLhkNT4s.js → QTooltip-DzYbguTR.js} +1 -1
- package/src/client/dist/pwa/assets/SchedulePanel-BX6iKh6S.js +1 -0
- package/src/client/dist/pwa/assets/SchedulePanel-CBM_GpS3.css +1 -0
- package/src/client/dist/pwa/assets/SearchPage-_In2gH2P.js +1 -0
- package/src/client/dist/pwa/assets/SettingsPage-BqkNYzC5.js +9 -0
- package/src/client/dist/pwa/assets/{SettingsPage-BYdLXJEJ.css → SettingsPage-CpykRKq2.css} +1 -1
- package/src/client/dist/pwa/assets/SplitWorkspacePage-DRoXbSRP.js +1 -0
- package/src/client/dist/pwa/assets/{TerminalPanel-D2j5AA8S.js → TerminalPanel-CfqiuSuk.js} +2 -2
- package/src/client/dist/pwa/assets/{TerminalPanel-DbVZk0vD.css → TerminalPanel-Dz9EE-Ph.css} +1 -1
- package/src/client/dist/pwa/assets/{TouchPan-C0EqFcrr.js → TouchPan-DcOCRf7x.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-DlMvPblb.js → TourReplayButton-gp7m6tSV.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-DSw8Upcp.css +1 -0
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-IcoMGkJh.js +1 -0
- package/src/client/dist/pwa/assets/{WorkspacePage--5HsnMQ1.css → WorkspacePage-BnW-gp3u.css} +1 -1
- package/src/client/dist/pwa/assets/WorkspacePage-CR2xAzW_.js +4 -0
- package/src/client/dist/pwa/assets/{browser-DNEbLF-4.js → browser-BveHkbe-.js} +1 -1
- package/src/client/dist/pwa/assets/build-path-tree-Dtp7rlxS.js +1 -0
- package/src/client/dist/pwa/assets/custom-sounds-CBoWzJ85.js +1 -0
- package/src/client/dist/pwa/assets/{de-DgZ9jKq_.js → de-BJsWkZro.js} +2 -2
- package/src/client/dist/pwa/assets/defineProperty-BbfpZ9Tg.js +1 -0
- package/src/client/dist/pwa/assets/documents-sb2sQ4JC.js +1 -0
- package/src/client/dist/pwa/assets/{editor.api-PENN0io6.js → editor.api-CbkPxoJf.js} +1 -1
- package/src/client/dist/pwa/assets/efforts-BCli1Unj.js +9 -0
- package/src/client/dist/pwa/assets/{es-zvlgzw9H.js → es-tNYw7itB.js} +2 -2
- package/src/client/dist/pwa/assets/expand-template-CfaEhb2f.js +1 -0
- package/src/client/dist/pwa/assets/{format-CVI7mr7G.js → format-BRl2DUlm.js} +7 -7
- package/src/client/dist/pwa/assets/formatters-C5TjPSR_.js +1 -0
- package/src/client/dist/pwa/assets/{fr-BICzq59I.js → fr-B5sFski4.js} +2 -2
- package/src/client/dist/pwa/assets/{freemarker2-BxN_Aq6C.js → freemarker2-CDmvOQyn.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-C9UHXtO1.js → handlebars-Bx_w8mx1.js} +1 -1
- package/src/client/dist/pwa/assets/{html-CTH9wSJr.js → html-DVRfiRkS.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-Bm-L4nW3.js +1 -0
- package/src/client/dist/pwa/assets/i18n-D21JKsVt.js +19 -0
- package/src/client/dist/pwa/assets/index-C7vFf6p2.js +2 -0
- package/src/client/dist/pwa/assets/{it-BIGArQrS.js → it-Bc2FncM9.js} +2 -2
- package/src/client/dist/pwa/assets/{javascript-WT4BS8p4.js → javascript-CPvttU5J.js} +1 -1
- package/src/client/dist/pwa/assets/latest-request-CN4-B22z.js +1 -0
- package/src/client/dist/pwa/assets/{liquid-D6dfe-gU.js → liquid-CI0gQddb.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-B8pNXNeC.js → mdx-BveBwYJH.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-COLfslyi.js → monaco-contributions-CHXFh4P2.js} +1 -1
- package/src/client/dist/pwa/assets/monaco.contribution-DOK8t_9B.js +2 -0
- package/src/client/dist/pwa/assets/network-auth-CItnNZDh.js +1 -0
- package/src/client/dist/pwa/assets/{notify-theme-7MsG-MyN.js → notify-theme-BO6r1Rd7.js} +1 -1
- package/src/client/dist/pwa/assets/pending-diff-open-DpS4iyDM.js +1 -0
- package/src/client/dist/pwa/assets/{permissionModes-B-ciuUbz.js → permissionModes-Cc5VaOdC.js} +1 -1
- package/src/client/dist/pwa/assets/preload-helper-BZ1Pz5am.js +1 -0
- package/src/client/dist/pwa/assets/{project-color-Bo6iEcqN.js → project-color-Bnv02P9D.js} +1 -1
- package/src/client/dist/pwa/assets/{python-D2gb6Jjz.js → python-BesLCxpi.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-dksrCQF2.js → razor-Dv1PMxuY.js} +1 -1
- package/src/client/dist/pwa/assets/{render-chat-markdown-px_6WDIX.js → render-chat-markdown-CafzCcmu.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-DTPyRTrW.js → typescript-26L2Xsu9.js} +1 -1
- package/src/client/dist/pwa/assets/use-checkbox-BLeif5-t.js +1 -0
- package/src/client/dist/pwa/assets/use-search-index-status-Mv3pIO6p.js +1 -0
- package/src/client/dist/pwa/assets/{use-tours-b00RruX_.js → use-tours-B5uIqxRS.js} +2 -2
- package/src/client/dist/pwa/assets/use-worktree-restore-BBChALUM.js +1 -0
- package/src/client/dist/pwa/assets/workspace-templates-CDY-MiH2.js +1 -0
- package/src/client/dist/pwa/assets/{xml-mxUZCM4r.js → xml-CkRojTcc.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-BuN8sUWC.js → yaml-DKkQHwew.js} +1 -1
- package/src/client/dist/pwa/index.html +6 -3
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-DdGARu8o.js +0 -8
- package/src/client/dist/pwa/assets/ChangelogPage-CGenjiI5.js +0 -1
- package/src/client/dist/pwa/assets/ChangelogPage-DKJkFiU_.css +0 -1
- package/src/client/dist/pwa/assets/ComparisonPanel-CRRaDs2D.css +0 -1
- package/src/client/dist/pwa/assets/ComparisonPanel-aXgjEulK.js +0 -2
- package/src/client/dist/pwa/assets/CreatePage-B9C9J9Pw.css +0 -1
- package/src/client/dist/pwa/assets/CreatePage-BaB_30xJ.js +0 -2
- package/src/client/dist/pwa/assets/DashboardPage-DsbwmO2W.js +0 -1
- package/src/client/dist/pwa/assets/DashboardPage-XiCj24i2.css +0 -1
- package/src/client/dist/pwa/assets/DiffViewer--dUMf7b3.js +0 -8
- package/src/client/dist/pwa/assets/DocumentsPanel-DTjEUYUd.js +0 -1
- package/src/client/dist/pwa/assets/GitPanel-PUPLj0M8.js +0 -3
- package/src/client/dist/pwa/assets/HealthPage-BHgucifz.js +0 -1
- package/src/client/dist/pwa/assets/HealthPage-CFZ-tdKK.css +0 -1
- package/src/client/dist/pwa/assets/MainLayout-CQVLnTX3.js +0 -2
- package/src/client/dist/pwa/assets/QBanner-XE0EMe9L.js +0 -1
- package/src/client/dist/pwa/assets/QChip-Bt_JvnHb.js +0 -1
- package/src/client/dist/pwa/assets/QExpansionItem-CxEBY3jY.js +0 -1
- package/src/client/dist/pwa/assets/QItemSection-Cf6OZEH4.js +0 -1
- package/src/client/dist/pwa/assets/QList-Z90BspT4.js +0 -1
- package/src/client/dist/pwa/assets/QMarkupTable-Bwjknbmw.js +0 -1
- package/src/client/dist/pwa/assets/QSelect-CMzJDhi-.js +0 -1
- package/src/client/dist/pwa/assets/SchedulePanel-BYKSFoFj.css +0 -1
- package/src/client/dist/pwa/assets/SchedulePanel-DTVwe7sX.js +0 -1
- package/src/client/dist/pwa/assets/SearchPage-CtrR7dNr.js +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-Bl_RNTGi.js +0 -9
- package/src/client/dist/pwa/assets/SplitWorkspacePage-Bac_Pzmm.js +0 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-BAk5l4Ik.js +0 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-CrLP_I5S.css +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-FScR5YAD.js +0 -4
- package/src/client/dist/pwa/assets/build-path-tree-C0b61nxI.js +0 -1
- package/src/client/dist/pwa/assets/custom-sounds-DE4JLdGG.js +0 -1
- package/src/client/dist/pwa/assets/documents-CALwmao-.js +0 -1
- package/src/client/dist/pwa/assets/efforts-Detdm-FH.js +0 -9
- package/src/client/dist/pwa/assets/expand-template-ZIVLPdW2.js +0 -1
- package/src/client/dist/pwa/assets/formatters-C_zcfJBt.js +0 -1
- package/src/client/dist/pwa/assets/i18n-DG_vChZ3.js +0 -1
- package/src/client/dist/pwa/assets/index-fuLr-ZVa.js +0 -20
- package/src/client/dist/pwa/assets/monaco.contribution-CDhuQbzi.js +0 -2
- package/src/client/dist/pwa/assets/network-auth-QouPCx6A.js +0 -1
- package/src/client/dist/pwa/assets/pending-diff-open-CX24u9gW.js +0 -1
- package/src/client/dist/pwa/assets/pinia-BdFjQEqa.js +0 -1
- package/src/client/dist/pwa/assets/use-checkbox-Bh9EQhkV.js +0 -1
- package/src/client/dist/pwa/assets/use-search-index-status-_nCyACc7.js +0 -1
- package/src/client/dist/pwa/assets/use-worktree-restore-BDOZc9fk.js +0 -1
- package/src/client/dist/pwa/assets/workspace-templates-DV9Njz0T.js +0 -1
|
@@ -67,7 +67,7 @@ async function gitAsync(repoPath, args, timeout = READ_ONLY_GIT_TIMEOUT_MS) {
|
|
|
67
67
|
cwd: repoPath,
|
|
68
68
|
encoding: 'utf-8',
|
|
69
69
|
timeout,
|
|
70
|
-
maxBuffer:
|
|
70
|
+
maxBuffer: GIT_MAX_BUFFER_BYTES,
|
|
71
71
|
});
|
|
72
72
|
return stdout.trimEnd();
|
|
73
73
|
}
|
|
@@ -231,6 +231,26 @@ export function deleteRemoteBranch(repoPath, branchName, remote = 'origin') {
|
|
|
231
231
|
throw new Error(`Failed to delete remote branch '${remote}/${branchName}': ${message}`);
|
|
232
232
|
}
|
|
233
233
|
}
|
|
234
|
+
/** Non-blocking local deletion with the synchronous helper's error contract. */
|
|
235
|
+
export async function deleteLocalBranchAsync(repoPath, branchName) {
|
|
236
|
+
try {
|
|
237
|
+
await gitNetworkAsync(repoPath, ['branch', '-D', branchName]);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
241
|
+
throw new Error(`Failed to delete local branch '${branchName}': ${message}`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** Non-blocking remote deletion; keeps credential prompts disabled and the network deadline. */
|
|
245
|
+
export async function deleteRemoteBranchAsync(repoPath, branchName, remote = 'origin') {
|
|
246
|
+
try {
|
|
247
|
+
await gitNetworkAsync(repoPath, ['push', remote, '--delete', branchName]);
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
251
|
+
throw new Error(`Failed to delete remote branch '${remote}/${branchName}': ${message}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
234
254
|
/**
|
|
235
255
|
* Push a branch to the remote with upstream tracking (`git push -u`).
|
|
236
256
|
* When `options.force` is true, adds `--force-with-lease` (safer than `--force`:
|
|
@@ -341,18 +361,21 @@ export function getConflictedFiles(repoPath) {
|
|
|
341
361
|
return [];
|
|
342
362
|
}
|
|
343
363
|
}
|
|
364
|
+
function classifyOngoingGitOperation(dir) {
|
|
365
|
+
if (existsSync(join(dir, 'MERGE_HEAD')))
|
|
366
|
+
return 'merge';
|
|
367
|
+
if (existsSync(join(dir, 'rebase-merge')) || existsSync(join(dir, 'rebase-apply')))
|
|
368
|
+
return 'rebase';
|
|
369
|
+
if (existsSync(join(dir, 'CHERRY_PICK_HEAD')) || existsSync(join(dir, 'sequencer')))
|
|
370
|
+
return 'cherry-pick';
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
344
373
|
/** Detect whether a merge, rebase or cherry-pick is currently in progress in the worktree. */
|
|
345
374
|
export function getOngoingGitOperation(repoPath) {
|
|
346
375
|
try {
|
|
347
376
|
const gitDir = git(repoPath, ['rev-parse', '--git-dir']);
|
|
348
377
|
const dir = gitDir.startsWith('/') ? gitDir : join(repoPath, gitDir);
|
|
349
|
-
|
|
350
|
-
return 'merge';
|
|
351
|
-
if (existsSync(join(dir, 'rebase-merge')) || existsSync(join(dir, 'rebase-apply')))
|
|
352
|
-
return 'rebase';
|
|
353
|
-
if (existsSync(join(dir, 'CHERRY_PICK_HEAD')) || existsSync(join(dir, 'sequencer')))
|
|
354
|
-
return 'cherry-pick';
|
|
355
|
-
return null;
|
|
378
|
+
return classifyOngoingGitOperation(dir);
|
|
356
379
|
}
|
|
357
380
|
catch {
|
|
358
381
|
return null;
|
|
@@ -781,6 +804,19 @@ export function getCommitsBetween(repoPath, base, head) {
|
|
|
781
804
|
return '';
|
|
782
805
|
}
|
|
783
806
|
}
|
|
807
|
+
const COMMIT_LOG_FORMAT = '--pretty=format:%H%x00%h%x00%s%x00%an%x00%aI';
|
|
808
|
+
function parseCommitLog(raw) {
|
|
809
|
+
const commits = [];
|
|
810
|
+
for (const line of raw.split('\n')) {
|
|
811
|
+
if (!line)
|
|
812
|
+
continue;
|
|
813
|
+
const [sha, shortSha, subject, author, date] = line.split('\x00');
|
|
814
|
+
if (!sha)
|
|
815
|
+
continue;
|
|
816
|
+
commits.push({ sha, shortSha: shortSha ?? '', subject: subject ?? '', author: author ?? '', date: date ?? '' });
|
|
817
|
+
}
|
|
818
|
+
return commits;
|
|
819
|
+
}
|
|
784
820
|
/**
|
|
785
821
|
* List commits between the source branch and HEAD, each flagged with whether
|
|
786
822
|
* it's already present on `origin/<workingBranch>`. Used by the Git panel
|
|
@@ -791,10 +827,9 @@ export function listBranchCommits(repoPath, sourceBranch, workingBranch, limit =
|
|
|
791
827
|
const sourceRef = resolveBase(repoPath, sourceBranch);
|
|
792
828
|
const remoteRef = `${remote}/${workingBranch}`;
|
|
793
829
|
// NUL-delimited format: sha \0 shortSha \0 subject \0 author \0 iso date \n
|
|
794
|
-
const FORMAT = '--pretty=format:%H%x00%h%x00%s%x00%an%x00%aI';
|
|
795
830
|
let raw;
|
|
796
831
|
try {
|
|
797
|
-
raw = git(repoPath, ['log', `${sourceRef}..HEAD`, `--max-count=${limit}`,
|
|
832
|
+
raw = git(repoPath, ['log', `${sourceRef}..HEAD`, `--max-count=${limit}`, COMMIT_LOG_FORMAT]);
|
|
798
833
|
}
|
|
799
834
|
catch {
|
|
800
835
|
return [];
|
|
@@ -815,23 +850,7 @@ export function listBranchCommits(repoPath, sourceBranch, workingBranch, limit =
|
|
|
815
850
|
catch {
|
|
816
851
|
// remote ref unknown → leave pushedShas empty
|
|
817
852
|
}
|
|
818
|
-
|
|
819
|
-
for (const line of raw.split('\n')) {
|
|
820
|
-
if (!line)
|
|
821
|
-
continue;
|
|
822
|
-
const [sha, shortSha, subject, author, date] = line.split('\x00');
|
|
823
|
-
if (!sha)
|
|
824
|
-
continue;
|
|
825
|
-
commits.push({
|
|
826
|
-
sha,
|
|
827
|
-
shortSha: shortSha ?? '',
|
|
828
|
-
subject: subject ?? '',
|
|
829
|
-
author: author ?? '',
|
|
830
|
-
date: date ?? '',
|
|
831
|
-
isPushed: pushedShas.has(sha),
|
|
832
|
-
});
|
|
833
|
-
}
|
|
834
|
-
return commits;
|
|
853
|
+
return parseCommitLog(raw).map((commit) => ({ ...commit, isPushed: pushedShas.has(commit.sha) }));
|
|
835
854
|
}
|
|
836
855
|
/**
|
|
837
856
|
* List commits on `sourceBranch` that are NOT yet on `workingBranch` —
|
|
@@ -840,32 +859,16 @@ export function listBranchCommits(repoPath, sourceBranch, workingBranch, limit =
|
|
|
840
859
|
*/
|
|
841
860
|
export function listCommitsBehind(repoPath, sourceBranch, workingBranch, limit = 50) {
|
|
842
861
|
const sourceRef = resolveBase(repoPath, sourceBranch);
|
|
843
|
-
const FORMAT = '--pretty=format:%H%x00%h%x00%s%x00%an%x00%aI';
|
|
844
862
|
let raw;
|
|
845
863
|
try {
|
|
846
|
-
raw = git(repoPath, ['log', `${workingBranch}..${sourceRef}`, `--max-count=${limit}`,
|
|
864
|
+
raw = git(repoPath, ['log', `${workingBranch}..${sourceRef}`, `--max-count=${limit}`, COMMIT_LOG_FORMAT]);
|
|
847
865
|
}
|
|
848
866
|
catch {
|
|
849
867
|
return [];
|
|
850
868
|
}
|
|
851
869
|
if (!raw)
|
|
852
870
|
return [];
|
|
853
|
-
|
|
854
|
-
for (const line of raw.split('\n')) {
|
|
855
|
-
if (!line)
|
|
856
|
-
continue;
|
|
857
|
-
const [sha, shortSha, subject, author, date] = line.split('\x00');
|
|
858
|
-
if (!sha)
|
|
859
|
-
continue;
|
|
860
|
-
commits.push({
|
|
861
|
-
sha,
|
|
862
|
-
shortSha: shortSha ?? '',
|
|
863
|
-
subject: subject ?? '',
|
|
864
|
-
author: author ?? '',
|
|
865
|
-
date: date ?? '',
|
|
866
|
-
});
|
|
867
|
-
}
|
|
868
|
-
return commits;
|
|
871
|
+
return parseCommitLog(raw);
|
|
869
872
|
}
|
|
870
873
|
/**
|
|
871
874
|
* Rename a branch in-place (`git branch -m <old> <new>`). Must be run inside
|
|
@@ -960,6 +963,12 @@ function parseNameStatus(output) {
|
|
|
960
963
|
return files;
|
|
961
964
|
}
|
|
962
965
|
/** List files changed between base and HEAD (committed), plus working tree changes. */
|
|
966
|
+
function parseWorktreeFilenames(out, limit) {
|
|
967
|
+
if (!out)
|
|
968
|
+
return [];
|
|
969
|
+
const files = out.split('\0').filter((line) => line.length > 0);
|
|
970
|
+
return files.length > limit ? files.slice(0, limit) : files;
|
|
971
|
+
}
|
|
963
972
|
/**
|
|
964
973
|
* List the worktree's files — tracked plus untracked-but-not-git-ignored.
|
|
965
974
|
* Excludes `.git`, `node_modules`, and anything covered by `.gitignore`.
|
|
@@ -969,10 +978,7 @@ function parseNameStatus(output) {
|
|
|
969
978
|
export function listWorktreeFiles(worktreePath, limit = 5000) {
|
|
970
979
|
try {
|
|
971
980
|
const out = git(worktreePath, ['ls-files', '-z', '--cached', '--others', '--exclude-standard']);
|
|
972
|
-
|
|
973
|
-
return [];
|
|
974
|
-
const files = out.split('\0').filter((line) => line.length > 0);
|
|
975
|
-
return files.length > limit ? files.slice(0, limit) : files;
|
|
981
|
+
return parseWorktreeFilenames(out, limit);
|
|
976
982
|
}
|
|
977
983
|
catch {
|
|
978
984
|
return [];
|
|
@@ -1196,6 +1202,19 @@ function parseWorkingTreeStatus(output) {
|
|
|
1196
1202
|
}
|
|
1197
1203
|
return { staged, modified, untracked };
|
|
1198
1204
|
}
|
|
1205
|
+
function parseWorkingTreeFiles(output) {
|
|
1206
|
+
const files = [];
|
|
1207
|
+
for (const { path: filePath, x, y } of parsePorcelain(output)) {
|
|
1208
|
+
const untracked = x === '?' && y === '?';
|
|
1209
|
+
files.push({
|
|
1210
|
+
path: filePath,
|
|
1211
|
+
staged: !untracked && x !== ' ' && x !== '?',
|
|
1212
|
+
modified: !untracked && y !== ' ' && y !== '?',
|
|
1213
|
+
untracked,
|
|
1214
|
+
});
|
|
1215
|
+
}
|
|
1216
|
+
return files;
|
|
1217
|
+
}
|
|
1199
1218
|
/**
|
|
1200
1219
|
* List uncommitted working-tree files with their status, parsed from
|
|
1201
1220
|
* `git status --porcelain`. Same classification rule as getWorkingTreeStatus.
|
|
@@ -1204,17 +1223,7 @@ function parseWorkingTreeStatus(output) {
|
|
|
1204
1223
|
export function getWorkingTreeFiles(repoPath) {
|
|
1205
1224
|
try {
|
|
1206
1225
|
const output = git(repoPath, ['status', '--porcelain', '-z']);
|
|
1207
|
-
|
|
1208
|
-
for (const { path: filePath, x, y } of parsePorcelain(output)) {
|
|
1209
|
-
const untracked = x === '?' && y === '?';
|
|
1210
|
-
files.push({
|
|
1211
|
-
path: filePath,
|
|
1212
|
-
staged: !untracked && x !== ' ' && x !== '?',
|
|
1213
|
-
modified: !untracked && y !== ' ' && y !== '?',
|
|
1214
|
-
untracked,
|
|
1215
|
-
});
|
|
1216
|
-
}
|
|
1217
|
-
return files;
|
|
1226
|
+
return parseWorkingTreeFiles(output);
|
|
1218
1227
|
}
|
|
1219
1228
|
catch {
|
|
1220
1229
|
return [];
|
|
@@ -1348,6 +1357,121 @@ async function resolveBaseAsync(repoPath, base) {
|
|
|
1348
1357
|
return base;
|
|
1349
1358
|
}
|
|
1350
1359
|
}
|
|
1360
|
+
/** Non-blocking branch and file discovery for forms, autocomplete and PR diagnosis. */
|
|
1361
|
+
export async function listBranchesAsync(repoPath) {
|
|
1362
|
+
return (await gitAsync(repoPath, ['branch', '--format=%(refname:short)']))
|
|
1363
|
+
.split('\n')
|
|
1364
|
+
.map((branch) => branch.trim())
|
|
1365
|
+
.filter(Boolean);
|
|
1366
|
+
}
|
|
1367
|
+
export async function listRemoteBranchesAsync(repoPath) {
|
|
1368
|
+
try {
|
|
1369
|
+
return (await gitAsync(repoPath, ['branch', '-r', '--format=%(refname:short)']))
|
|
1370
|
+
.split('\n')
|
|
1371
|
+
.map((branch) => branch.trim())
|
|
1372
|
+
.filter(Boolean);
|
|
1373
|
+
}
|
|
1374
|
+
catch {
|
|
1375
|
+
return [];
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1378
|
+
export async function localBranchExistsAsync(repoPath, name) {
|
|
1379
|
+
try {
|
|
1380
|
+
await gitAsync(repoPath, ['rev-parse', '--verify', '--quiet', `refs/heads/${name}`]);
|
|
1381
|
+
return true;
|
|
1382
|
+
}
|
|
1383
|
+
catch {
|
|
1384
|
+
return false;
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
export async function getIndexLockPathAsync(repoPath) {
|
|
1388
|
+
try {
|
|
1389
|
+
const directory = await gitAsync(repoPath, ['rev-parse', '--absolute-git-dir']);
|
|
1390
|
+
const lockPath = join(directory, 'index.lock');
|
|
1391
|
+
return existsSync(lockPath) ? lockPath : null;
|
|
1392
|
+
}
|
|
1393
|
+
catch {
|
|
1394
|
+
return null;
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
export async function getOngoingGitOperationAsync(repoPath) {
|
|
1398
|
+
try {
|
|
1399
|
+
const gitDirectory = await gitAsync(repoPath, ['rev-parse', '--git-dir']);
|
|
1400
|
+
return classifyOngoingGitOperation(gitDirectory.startsWith('/') ? gitDirectory : join(repoPath, gitDirectory));
|
|
1401
|
+
}
|
|
1402
|
+
catch {
|
|
1403
|
+
return null;
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
export async function listWorktreeFilesAsync(worktreePath, limit = 5_000) {
|
|
1407
|
+
try {
|
|
1408
|
+
return parseWorktreeFilenames(await gitAsync(worktreePath, ['ls-files', '-z', '--cached', '--others', '--exclude-standard']), limit);
|
|
1409
|
+
}
|
|
1410
|
+
catch {
|
|
1411
|
+
return [];
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
/** Non-blocking review-template commit list, preferring the remote base. */
|
|
1415
|
+
export async function getCommitsBetweenAsync(repoPath, base, head) {
|
|
1416
|
+
try {
|
|
1417
|
+
const ref = await resolveBaseAsync(repoPath, base);
|
|
1418
|
+
return await gitAsync(repoPath, ['log', `${ref}..${head}`, '--pretty=format:- %s (%h)', '--no-merges']);
|
|
1419
|
+
}
|
|
1420
|
+
catch {
|
|
1421
|
+
return '';
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
/** Keep the existing raw three-dot ref semantics of the shortstat helper. */
|
|
1425
|
+
export async function getDiffStatsBetweenAsync(repoPath, base, head) {
|
|
1426
|
+
try {
|
|
1427
|
+
return await gitAsync(repoPath, ['diff', '--shortstat', `${base}...${head}`]);
|
|
1428
|
+
}
|
|
1429
|
+
catch {
|
|
1430
|
+
return '';
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
export async function listBranchCommitsAsync(repoPath, sourceBranch, workingBranch, limit = 50, remote = 'origin') {
|
|
1434
|
+
const sourceRef = await resolveBaseAsync(repoPath, sourceBranch);
|
|
1435
|
+
const remoteRef = `${remote}/${workingBranch}`;
|
|
1436
|
+
let raw;
|
|
1437
|
+
try {
|
|
1438
|
+
raw = await gitAsync(repoPath, ['log', `${sourceRef}..HEAD`, `--max-count=${limit}`, COMMIT_LOG_FORMAT]);
|
|
1439
|
+
}
|
|
1440
|
+
catch {
|
|
1441
|
+
return [];
|
|
1442
|
+
}
|
|
1443
|
+
if (!raw)
|
|
1444
|
+
return [];
|
|
1445
|
+
const pushedShas = new Set();
|
|
1446
|
+
try {
|
|
1447
|
+
await gitAsync(repoPath, ['rev-parse', '--verify', remoteRef]);
|
|
1448
|
+
const pushed = await gitAsync(repoPath, ['log', `${sourceRef}..${remoteRef}`, '--pretty=format:%H']);
|
|
1449
|
+
for (const sha of pushed.split('\n'))
|
|
1450
|
+
if (sha)
|
|
1451
|
+
pushedShas.add(sha.trim());
|
|
1452
|
+
}
|
|
1453
|
+
catch {
|
|
1454
|
+
// A branch that has never been pushed has no remote ref.
|
|
1455
|
+
}
|
|
1456
|
+
return parseCommitLog(raw).map((commit) => ({ ...commit, isPushed: pushedShas.has(commit.sha) }));
|
|
1457
|
+
}
|
|
1458
|
+
export async function listCommitsBehindAsync(repoPath, sourceBranch, workingBranch, limit = 50) {
|
|
1459
|
+
try {
|
|
1460
|
+
const sourceRef = await resolveBaseAsync(repoPath, sourceBranch);
|
|
1461
|
+
return parseCommitLog(await gitAsync(repoPath, ['log', `${workingBranch}..${sourceRef}`, `--max-count=${limit}`, COMMIT_LOG_FORMAT]));
|
|
1462
|
+
}
|
|
1463
|
+
catch {
|
|
1464
|
+
return [];
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
export async function getWorkingTreeFilesAsync(repoPath) {
|
|
1468
|
+
try {
|
|
1469
|
+
return parseWorkingTreeFiles(await gitAsync(repoPath, ['status', '--porcelain', '-z']));
|
|
1470
|
+
}
|
|
1471
|
+
catch {
|
|
1472
|
+
return [];
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1351
1475
|
/** Non-blocking commit count for request and polling hot paths. */
|
|
1352
1476
|
export async function getCommitCountAsync(repoPath, base, head) {
|
|
1353
1477
|
try {
|
|
@@ -1390,6 +1514,84 @@ export async function getWorkingTreeStatusAsync(repoPath) {
|
|
|
1390
1514
|
return { staged: 0, modified: 0, untracked: 0 };
|
|
1391
1515
|
}
|
|
1392
1516
|
}
|
|
1517
|
+
/** Raw handoff state. Failures must not be presented as a clean checkout. */
|
|
1518
|
+
export function getWorkingTreePorcelainAsync(repoPath) {
|
|
1519
|
+
return gitAsync(repoPath, ['status', '--short']);
|
|
1520
|
+
}
|
|
1521
|
+
export function getWorkingTreeDiffStatsAsync(repoPath) {
|
|
1522
|
+
return gitAsync(repoPath, ['diff', '--stat', 'HEAD']);
|
|
1523
|
+
}
|
|
1524
|
+
export async function commitExistsAsync(repoPath, ref) {
|
|
1525
|
+
try {
|
|
1526
|
+
await gitAsync(repoPath, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`]);
|
|
1527
|
+
return true;
|
|
1528
|
+
}
|
|
1529
|
+
catch {
|
|
1530
|
+
return false;
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
export async function getFileAtRefAsync(repoPath, ref, filePath) {
|
|
1534
|
+
const resolvedRef = await resolveBaseAsync(repoPath, ref);
|
|
1535
|
+
try {
|
|
1536
|
+
// File contents must retain their leading/trailing whitespace verbatim.
|
|
1537
|
+
const { stdout } = await execFileAsync('git', ['show', `${resolvedRef}:${filePath}`], {
|
|
1538
|
+
cwd: repoPath,
|
|
1539
|
+
encoding: 'utf-8',
|
|
1540
|
+
timeout: READ_ONLY_GIT_TIMEOUT_MS,
|
|
1541
|
+
maxBuffer: GIT_MAX_BUFFER_BYTES,
|
|
1542
|
+
env: NON_INTERACTIVE_GIT_ENV,
|
|
1543
|
+
});
|
|
1544
|
+
return stdout;
|
|
1545
|
+
}
|
|
1546
|
+
catch {
|
|
1547
|
+
return null;
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
export async function getChangedFilesBetweenAsync(repoPath, fromRef, toRef) {
|
|
1551
|
+
try {
|
|
1552
|
+
return parseNameStatus(await gitAsync(repoPath, ['diff', '--name-status', '-z', `${fromRef}..${toRef}`]));
|
|
1553
|
+
}
|
|
1554
|
+
catch {
|
|
1555
|
+
return [];
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
export async function getUnpushedChangedFilesAsync(repoPath, branchName, remote = 'origin') {
|
|
1559
|
+
const ref = `${remote}/${branchName}`;
|
|
1560
|
+
try {
|
|
1561
|
+
await gitAsync(repoPath, ['rev-parse', '--verify', ref]);
|
|
1562
|
+
return parseNameStatus(await gitAsync(repoPath, ['diff', '--name-status', '-z', `${ref}..HEAD`]));
|
|
1563
|
+
}
|
|
1564
|
+
catch {
|
|
1565
|
+
return [];
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
export async function getChangedFilesAsync(repoPath, base, includeUntracked = false) {
|
|
1569
|
+
const ref = await resolveBaseAsync(repoPath, base);
|
|
1570
|
+
const [committed, working] = await Promise.allSettled([
|
|
1571
|
+
gitAsync(repoPath, ['diff', '--name-status', '-z', `${ref}...HEAD`]),
|
|
1572
|
+
gitAsync(repoPath, ['status', '--porcelain', '-z', includeUntracked ? '-uall' : '-uno']),
|
|
1573
|
+
]);
|
|
1574
|
+
const files = committed.status === 'fulfilled' ? parseNameStatus(committed.value) : [];
|
|
1575
|
+
const seen = new Set(files.map((file) => file.path));
|
|
1576
|
+
if (working.status === 'fulfilled') {
|
|
1577
|
+
for (const { path: filePath, x, y } of parsePorcelain(working.value)) {
|
|
1578
|
+
if (seen.has(filePath))
|
|
1579
|
+
continue;
|
|
1580
|
+
const status = x === '?' && y === '?'
|
|
1581
|
+
? 'untracked'
|
|
1582
|
+
: x === 'R' || y === 'R'
|
|
1583
|
+
? 'renamed'
|
|
1584
|
+
: x === 'A' || y === 'A'
|
|
1585
|
+
? 'added'
|
|
1586
|
+
: x === 'D' || y === 'D'
|
|
1587
|
+
? 'deleted'
|
|
1588
|
+
: 'modified';
|
|
1589
|
+
files.push({ path: filePath, status });
|
|
1590
|
+
seen.add(filePath);
|
|
1591
|
+
}
|
|
1592
|
+
}
|
|
1593
|
+
return files;
|
|
1594
|
+
}
|
|
1393
1595
|
/**
|
|
1394
1596
|
* Async version of `getUnpushedCount`. Same `origin/<workingBranch>` semantic:
|
|
1395
1597
|
* returns `-1` when the remote ref does not exist (never pushed), `0` when
|
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
* editing the workspace `model` field directly. This list reflects the
|
|
6
6
|
* recommended set surfaced in the create-workspace selector.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* (Plus/Pro/Team/Enterprise). API-key auth is limited to `gpt-5.4` and below.
|
|
8
|
+
* Availability can vary by account and authentication method. The CLI owns
|
|
9
|
+
* the actual model resolution; the catalogue only offers named choices.
|
|
11
10
|
*/
|
|
12
11
|
export const CODEX_MODELS = [
|
|
13
12
|
{
|
|
@@ -16,12 +15,30 @@ export const CODEX_MODELS = [
|
|
|
16
15
|
i18nLabelKey: 'model.auto',
|
|
17
16
|
i18nDescriptionKey: 'model.autoDescription',
|
|
18
17
|
},
|
|
18
|
+
{
|
|
19
|
+
id: 'gpt-6.1-sol',
|
|
20
|
+
label: 'GPT-6.1 Sol',
|
|
21
|
+
i18nLabelKey: 'model.gpt61sol',
|
|
22
|
+
i18nDescriptionKey: 'model.gpt61solDescription',
|
|
23
|
+
},
|
|
19
24
|
{
|
|
20
25
|
id: 'gpt-6-astra',
|
|
21
26
|
label: 'GPT-6 Astra',
|
|
22
27
|
i18nLabelKey: 'model.gpt6astra',
|
|
23
28
|
i18nDescriptionKey: 'model.gpt6astraDescription',
|
|
24
29
|
},
|
|
30
|
+
{
|
|
31
|
+
id: 'gpt-6-sol',
|
|
32
|
+
label: 'GPT-6 Sol',
|
|
33
|
+
i18nLabelKey: 'model.gpt6sol',
|
|
34
|
+
i18nDescriptionKey: 'model.gpt6solDescription',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'gpt-6-luna',
|
|
38
|
+
label: 'GPT-6 Luna',
|
|
39
|
+
i18nLabelKey: 'model.gpt6luna',
|
|
40
|
+
i18nDescriptionKey: 'model.gpt6lunaDescription',
|
|
41
|
+
},
|
|
25
42
|
{
|
|
26
43
|
id: 'gpt-5.6-sol',
|
|
27
44
|
label: 'GPT-5.6 Sol',
|
package/dist/shared/models.js
CHANGED
|
@@ -17,6 +17,12 @@ export const CLAUDE_MODELS = [
|
|
|
17
17
|
i18nLabelKey: 'model.mythos5',
|
|
18
18
|
i18nDescriptionKey: 'model.mythos5Description',
|
|
19
19
|
},
|
|
20
|
+
{
|
|
21
|
+
id: 'claude-opus-5-5',
|
|
22
|
+
label: 'Opus 5.5',
|
|
23
|
+
i18nLabelKey: 'model.opus55',
|
|
24
|
+
i18nDescriptionKey: 'model.opus55Description',
|
|
25
|
+
},
|
|
20
26
|
{
|
|
21
27
|
id: 'claude-opus-5',
|
|
22
28
|
label: 'Opus 5',
|
|
@@ -53,6 +59,12 @@ export const CLAUDE_MODELS = [
|
|
|
53
59
|
i18nLabelKey: 'model.opus1m',
|
|
54
60
|
i18nDescriptionKey: 'model.opus1mDescription',
|
|
55
61
|
},
|
|
62
|
+
{
|
|
63
|
+
id: 'claude-sonnet-5-5',
|
|
64
|
+
label: 'Sonnet 5.5',
|
|
65
|
+
i18nLabelKey: 'model.sonnet55',
|
|
66
|
+
i18nDescriptionKey: 'model.sonnet55Description',
|
|
67
|
+
},
|
|
56
68
|
{
|
|
57
69
|
id: 'claude-sonnet-5',
|
|
58
70
|
label: 'Sonnet 5',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.5",
|
|
4
4
|
"description": "Kōbō — local multi-workspace orchestrator for Claude Code and OpenAI Codex, with isolated Git worktrees, live review and optional automation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.agent-error-item[data-v-e98c3c02]{gap:var(--kobo-space-sm);padding:var(--kobo-space-sm) var(--kobo-space-md);border-left:2px solid var(--kobo-danger);background:var(--kobo-surface-2);border-radius:var(--kobo-radius-sm);align-items:flex-start;display:flex}.agent-error-item__icon[data-v-e98c3c02]{color:var(--kobo-danger);flex:none;margin-top:2px}.agent-error-item__body[data-v-e98c3c02]{min-width:0}.agent-error-item__title[data-v-e98c3c02]{color:var(--kobo-text);font-weight:600}.agent-error-item__message[data-v-e98c3c02]{color:var(--kobo-text-2);font-family:var(--kobo-font-mono);white-space:pre-wrap;word-break:break-word;font-size:12px}.markdown-message[data-v-99371035]{color:var(--kobo-text-2);word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-99371035] *{max-width:100%}.markdown-message[data-v-99371035] p{margin:0 0 .5em}.markdown-message[data-v-99371035] p:last-child{margin-bottom:0}.markdown-message[data-v-99371035] pre{background:#00000059;border-radius:4px;margin:.5em 0;padding:.5em .75em;overflow-x:auto}.markdown-message[data-v-99371035] code{word-break:break-all;background:#0000004d;border-radius:3px;padding:.1em .3em;font-size:.9em}.markdown-message[data-v-99371035] pre code{background:0 0;padding:0}.markdown-message[data-v-99371035] ul,.markdown-message[data-v-99371035] ol{margin:.25em 0 .5em;padding-left:1.5em}.markdown-message[data-v-99371035] li{margin:.15em 0}.markdown-message[data-v-99371035] a{color:var(--kobo-text-2);text-decoration:underline}.markdown-message[data-v-99371035] .document-link{color:var(--kobo-text-2);cursor:pointer;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-message[data-v-99371035] .document-link:hover{color:var(--kobo-text);-webkit-text-decoration:underline;text-decoration:underline}.markdown-message[data-v-99371035] h1,.markdown-message[data-v-99371035] h2,.markdown-message[data-v-99371035] h3,.markdown-message[data-v-99371035] h4,.markdown-message[data-v-99371035] h5,.markdown-message[data-v-99371035] h6{margin:.5em 0 .3em;font-weight:600;line-height:1.3}.markdown-message[data-v-99371035] h1{font-size:1.25em}.markdown-message[data-v-99371035] h2{font-size:1.15em}.markdown-message[data-v-99371035] h3{font-size:1.08em}.markdown-message[data-v-99371035] h4,.markdown-message[data-v-99371035] h5,.markdown-message[data-v-99371035] h6{font-size:1em}.markdown-message[data-v-99371035] blockquote{color:#ffffffb3;border-left:3px solid #fff3;margin:.5em 0;padding-left:.75em}.markdown-message[data-v-99371035] table{border-collapse:collapse;margin:.5em 0}.markdown-message[data-v-99371035] th,.markdown-message[data-v-99371035] td{border:1px solid #ffffff26;padding:.25em .5em}.tool-row[data-v-2482adfe]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-2482adfe]{color:var(--kobo-text-2);cursor:default;align-items:center;gap:10px;min-width:0;padding:5px 10px;display:flex}.tool-row:not(.tool-row-generic) .tool-header[data-v-2482adfe],.tool-row--toggleable .tool-header[data-v-2482adfe]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-2482adfe]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-2482adfe]:hover,.tool-row--toggleable .tool-header[data-v-2482adfe]:hover{background:#ffffff08}.tool-icon[data-v-2482adfe]{color:var(--kobo-text-2);flex-shrink:0}.tool-name[data-v-2482adfe]{color:var(--kobo-text-2);flex-shrink:0;font-weight:600}.tool-arg[data-v-2482adfe],.tool-path[data-v-2482adfe]{color:var(--kobo-text-3);text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;font-family:var(--kobo-font-mono);font-size:11.5px;overflow:hidden}.tool-open-diff[data-v-2482adfe]{flex-shrink:0}.tool-path[data-v-2482adfe],.tool-arg[data-v-2482adfe]{flex:1}.tool-stat-add[data-v-2482adfe]{color:var(--kobo-success);flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-2482adfe]{color:var(--kobo-danger);flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-2482adfe]{max-height:400px;font-family:var(--kobo-font-mono);background:#0003;border-radius:4px;margin-top:4px;padding:8px 0;font-size:11px;line-height:1.5;overflow:auto}.diff-line[data-v-2482adfe]{white-space:pre;color:var(--kobo-text-2);padding:0 12px}.diff-sign[data-v-2482adfe]{width:14px;color:var(--kobo-text-disabled);-webkit-user-select:none;user-select:none;display:inline-block}.diff-add[data-v-2482adfe]{color:var(--kobo-success);background:#66bb6a1a}.diff-add .diff-sign[data-v-2482adfe]{color:var(--kobo-success)}.diff-del[data-v-2482adfe]{color:var(--kobo-danger);background:#ef53501a}.diff-del .diff-sign[data-v-2482adfe]{color:var(--kobo-danger)}.tool-output[data-v-2482adfe]{color:var(--kobo-text-2);font-family:var(--kobo-font-mono);white-space:pre-wrap;background:#00000026;border-radius:4px;max-height:8em;margin-top:4px;padding:6px 10px;font-size:11px;overflow:auto}.markdown-message[data-v-db2fc622]{color:var(--kobo-text-2);word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-db2fc622] *{max-width:100%}.markdown-message[data-v-db2fc622] img{-o-object-fit:contain;object-fit:contain;cursor:zoom-in;background:#0003;border-radius:4px;max-width:180px;max-height:100px;margin:.3em 0;display:block}.markdown-message[data-v-db2fc622] code{word-break:break-all}.markdown-message[data-v-db2fc622] p{margin:0 0 .4em}.markdown-message[data-v-db2fc622] p:last-child{margin-bottom:0}.markdown-message[data-v-db2fc622] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-db2fc622] h1,.markdown-message[data-v-db2fc622] h2,.markdown-message[data-v-db2fc622] h3,.markdown-message[data-v-db2fc622] h4,.markdown-message[data-v-db2fc622] h5,.markdown-message[data-v-db2fc622] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-db2fc622] h1{font-size:1.25em}.markdown-message[data-v-db2fc622] h2{font-size:1.15em}.markdown-message[data-v-db2fc622] h3{font-size:1.08em}.markdown-message[data-v-db2fc622] h4,.markdown-message[data-v-db2fc622] h5,.markdown-message[data-v-db2fc622] h6{font-size:1em}.markdown-user-prompt[data-v-db2fc622]{color:var(--kobo-text-2);font-size:12px;font-style:italic}.markdown-user-prompt[data-v-db2fc622] p{margin:0 0 .4em}.markdown-user-prompt[data-v-db2fc622] code{background:#ffffff14;border-radius:3px;padding:.1em .3em;font-style:normal}.image-lightbox-img{-o-object-fit:contain;object-fit:contain;cursor:zoom-out;background:#0000004d;border-radius:4px;max-width:92vw;max-height:92vh;display:block}.turn-card[data-v-c0e24cbd]{border:1px solid #ffffff14;border-left:3px solid var(--turn-accent);background:#ffffff05;border-radius:6px;min-width:0;max-width:100%;margin:14px 0;overflow:hidden}.turn-card--highlighted[data-v-c0e24cbd]{animation:1.8s ease-out search-highlight-c0e24cbd}@keyframes search-highlight-c0e24cbd{0%,45%{box-shadow:0 0 0 2px #818cf8f2,0 0 22px #818cf873}to{box-shadow:none}}.turn-header[data-v-c0e24cbd]{color:var(--kobo-text-3);background:#ffffff08;border-bottom:1px solid #ffffff0d;align-items:center;gap:8px;padding:8px 14px;font-size:11px;display:flex}.turn-badge[data-v-c0e24cbd]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-c0e24cbd]{color:var(--kobo-turn-user);background:#ce93d826}.turn-badge-agent[data-v-c0e24cbd]{color:var(--kobo-turn-agent);background:#7986cb26}.turn-badge-system[data-v-c0e24cbd]{color:var(--kobo-text-2);background:#75757533;font-style:italic}.turn-badge-session[data-v-c0e24cbd]{color:var(--kobo-text-3);background:#61616133}.turn-badge-script[data-v-c0e24cbd]{color:var(--kobo-success);background:#4db6ac26}.turn-time[data-v-c0e24cbd]{color:var(--kobo-text-disabled);font-family:var(--kobo-font-mono);font-size:11px}.turn-time-arrow[data-v-c0e24cbd]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-c0e24cbd]{color:var(--kobo-text-3)}.turn-actions[data-v-c0e24cbd]{color:var(--kobo-text-3);font-size:11px}.turn-body[data-v-c0e24cbd]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-c0e24cbd]>*{min-width:0;max-width:100%}.turn-body[data-v-c0e24cbd] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-c0e24cbd]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-c0e24cbd]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-c0e24cbd]:hover{opacity:1}.activity-feed-wrap[data-v-028e8af5]{width:100%;height:100%;position:relative}.activity-feed-scroll[data-v-028e8af5]{width:100%;height:100%}.activity-feed-nav-cluster[data-v-028e8af5]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-compacting[data-v-028e8af5]{z-index:3;background:var(--kobo-surface);border:1px solid var(--kobo-border);border-radius:6px;align-items:center;gap:8px;padding:6px 14px;display:flex;position:absolute;top:12px;left:50%;transform:translate(-50%);box-shadow:0 4px 16px #00000059}.fade-enter-active[data-v-028e8af5],.fade-leave-active[data-v-028e8af5]{transition:opacity .16s}.fade-enter-from[data-v-028e8af5],.fade-leave-to[data-v-028e8af5]{opacity:0}.activity-feed-nav-btn[data-v-028e8af5]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-028e8af5]:hover{opacity:1}.activity-feed-scroll[data-v-028e8af5] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-028e8af5]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.activity-feed-empty[data-v-028e8af5]{align-items:center;gap:var(--kobo-space-sm);padding:var(--kobo-space-4xl) var(--kobo-space-xl);color:var(--kobo-text-3);text-align:center;flex-direction:column;display:flex}.activity-feed-empty__title[data-v-028e8af5]{font-family:var(--kobo-font-sans);color:var(--kobo-text-2);font-size:14px;font-weight:500}.activity-feed-empty__hint[data-v-028e8af5]{font-family:var(--kobo-font-sans);color:var(--kobo-text-3);max-width:380px;font-size:13px}
|
|
1
|
+
.agent-error-item[data-v-e98c3c02]{gap:var(--kobo-space-sm);padding:var(--kobo-space-sm) var(--kobo-space-md);border-left:2px solid var(--kobo-danger);background:var(--kobo-surface-2);border-radius:var(--kobo-radius-sm);align-items:flex-start;display:flex}.agent-error-item__icon[data-v-e98c3c02]{color:var(--kobo-danger);flex:none;margin-top:2px}.agent-error-item__body[data-v-e98c3c02]{min-width:0}.agent-error-item__title[data-v-e98c3c02]{color:var(--kobo-text);font-weight:600}.agent-error-item__message[data-v-e98c3c02]{color:var(--kobo-text-2);font-family:var(--kobo-font-mono);white-space:pre-wrap;word-break:break-word;font-size:12px}.markdown-message[data-v-99371035]{color:var(--kobo-text-2);word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-99371035] *{max-width:100%}.markdown-message[data-v-99371035] p{margin:0 0 .5em}.markdown-message[data-v-99371035] p:last-child{margin-bottom:0}.markdown-message[data-v-99371035] pre{background:#00000059;border-radius:4px;margin:.5em 0;padding:.5em .75em;overflow-x:auto}.markdown-message[data-v-99371035] code{word-break:break-all;background:#0000004d;border-radius:3px;padding:.1em .3em;font-size:.9em}.markdown-message[data-v-99371035] pre code{background:0 0;padding:0}.markdown-message[data-v-99371035] ul,.markdown-message[data-v-99371035] ol{margin:.25em 0 .5em;padding-left:1.5em}.markdown-message[data-v-99371035] li{margin:.15em 0}.markdown-message[data-v-99371035] a{color:var(--kobo-text-2);text-decoration:underline}.markdown-message[data-v-99371035] .document-link{color:var(--kobo-text-2);cursor:pointer;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-message[data-v-99371035] .document-link:hover{color:var(--kobo-text);-webkit-text-decoration:underline;text-decoration:underline}.markdown-message[data-v-99371035] h1,.markdown-message[data-v-99371035] h2,.markdown-message[data-v-99371035] h3,.markdown-message[data-v-99371035] h4,.markdown-message[data-v-99371035] h5,.markdown-message[data-v-99371035] h6{margin:.5em 0 .3em;font-weight:600;line-height:1.3}.markdown-message[data-v-99371035] h1{font-size:1.25em}.markdown-message[data-v-99371035] h2{font-size:1.15em}.markdown-message[data-v-99371035] h3{font-size:1.08em}.markdown-message[data-v-99371035] h4,.markdown-message[data-v-99371035] h5,.markdown-message[data-v-99371035] h6{font-size:1em}.markdown-message[data-v-99371035] blockquote{color:#ffffffb3;border-left:3px solid #fff3;margin:.5em 0;padding-left:.75em}.markdown-message[data-v-99371035] table{border-collapse:collapse;margin:.5em 0}.markdown-message[data-v-99371035] th,.markdown-message[data-v-99371035] td{border:1px solid #ffffff26;padding:.25em .5em}.tool-row[data-v-2482adfe]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-2482adfe]{color:var(--kobo-text-2);cursor:default;align-items:center;gap:10px;min-width:0;padding:5px 10px;display:flex}.tool-row:not(.tool-row-generic) .tool-header[data-v-2482adfe],.tool-row--toggleable .tool-header[data-v-2482adfe]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-2482adfe]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-2482adfe]:hover,.tool-row--toggleable .tool-header[data-v-2482adfe]:hover{background:#ffffff08}.tool-icon[data-v-2482adfe]{color:var(--kobo-text-2);flex-shrink:0}.tool-name[data-v-2482adfe]{color:var(--kobo-text-2);flex-shrink:0;font-weight:600}.tool-arg[data-v-2482adfe],.tool-path[data-v-2482adfe]{color:var(--kobo-text-3);text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;font-family:var(--kobo-font-mono);font-size:11.5px;overflow:hidden}.tool-open-diff[data-v-2482adfe]{flex-shrink:0}.tool-path[data-v-2482adfe],.tool-arg[data-v-2482adfe]{flex:1}.tool-stat-add[data-v-2482adfe]{color:var(--kobo-success);flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-2482adfe]{color:var(--kobo-danger);flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-2482adfe]{max-height:400px;font-family:var(--kobo-font-mono);background:#0003;border-radius:4px;margin-top:4px;padding:8px 0;font-size:11px;line-height:1.5;overflow:auto}.diff-line[data-v-2482adfe]{white-space:pre;color:var(--kobo-text-2);padding:0 12px}.diff-sign[data-v-2482adfe]{width:14px;color:var(--kobo-text-disabled);-webkit-user-select:none;user-select:none;display:inline-block}.diff-add[data-v-2482adfe]{color:var(--kobo-success);background:#66bb6a1a}.diff-add .diff-sign[data-v-2482adfe]{color:var(--kobo-success)}.diff-del[data-v-2482adfe]{color:var(--kobo-danger);background:#ef53501a}.diff-del .diff-sign[data-v-2482adfe]{color:var(--kobo-danger)}.tool-output[data-v-2482adfe]{color:var(--kobo-text-2);font-family:var(--kobo-font-mono);white-space:pre-wrap;background:#00000026;border-radius:4px;max-height:8em;margin-top:4px;padding:6px 10px;font-size:11px;overflow:auto}.markdown-message[data-v-db2fc622]{color:var(--kobo-text-2);word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-db2fc622] *{max-width:100%}.markdown-message[data-v-db2fc622] img{-o-object-fit:contain;object-fit:contain;cursor:zoom-in;background:#0003;border-radius:4px;max-width:180px;max-height:100px;margin:.3em 0;display:block}.markdown-message[data-v-db2fc622] code{word-break:break-all}.markdown-message[data-v-db2fc622] p{margin:0 0 .4em}.markdown-message[data-v-db2fc622] p:last-child{margin-bottom:0}.markdown-message[data-v-db2fc622] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-db2fc622] h1,.markdown-message[data-v-db2fc622] h2,.markdown-message[data-v-db2fc622] h3,.markdown-message[data-v-db2fc622] h4,.markdown-message[data-v-db2fc622] h5,.markdown-message[data-v-db2fc622] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-db2fc622] h1{font-size:1.25em}.markdown-message[data-v-db2fc622] h2{font-size:1.15em}.markdown-message[data-v-db2fc622] h3{font-size:1.08em}.markdown-message[data-v-db2fc622] h4,.markdown-message[data-v-db2fc622] h5,.markdown-message[data-v-db2fc622] h6{font-size:1em}.markdown-user-prompt[data-v-db2fc622]{color:var(--kobo-text-2);font-size:12px;font-style:italic}.markdown-user-prompt[data-v-db2fc622] p{margin:0 0 .4em}.markdown-user-prompt[data-v-db2fc622] code{background:#ffffff14;border-radius:3px;padding:.1em .3em;font-style:normal}.image-lightbox-img{-o-object-fit:contain;object-fit:contain;cursor:zoom-out;background:#0000004d;border-radius:4px;max-width:92vw;max-height:92vh;display:block}.turn-card[data-v-c0e24cbd]{border:1px solid #ffffff14;border-left:3px solid var(--turn-accent);background:#ffffff05;border-radius:6px;min-width:0;max-width:100%;margin:14px 0;overflow:hidden}.turn-card--highlighted[data-v-c0e24cbd]{animation:1.8s ease-out search-highlight-c0e24cbd}@keyframes search-highlight-c0e24cbd{0%,45%{box-shadow:0 0 0 2px #818cf8f2,0 0 22px #818cf873}to{box-shadow:none}}.turn-header[data-v-c0e24cbd]{color:var(--kobo-text-3);background:#ffffff08;border-bottom:1px solid #ffffff0d;align-items:center;gap:8px;padding:8px 14px;font-size:11px;display:flex}.turn-badge[data-v-c0e24cbd]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-c0e24cbd]{color:var(--kobo-turn-user);background:#ce93d826}.turn-badge-agent[data-v-c0e24cbd]{color:var(--kobo-turn-agent);background:#7986cb26}.turn-badge-system[data-v-c0e24cbd]{color:var(--kobo-text-2);background:#75757533;font-style:italic}.turn-badge-session[data-v-c0e24cbd]{color:var(--kobo-text-3);background:#61616133}.turn-badge-script[data-v-c0e24cbd]{color:var(--kobo-success);background:#4db6ac26}.turn-time[data-v-c0e24cbd]{color:var(--kobo-text-disabled);font-family:var(--kobo-font-mono);font-size:11px}.turn-time-arrow[data-v-c0e24cbd]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-c0e24cbd]{color:var(--kobo-text-3)}.turn-actions[data-v-c0e24cbd]{color:var(--kobo-text-3);font-size:11px}.turn-body[data-v-c0e24cbd]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-c0e24cbd]>*{min-width:0;max-width:100%}.turn-body[data-v-c0e24cbd] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-c0e24cbd]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-c0e24cbd]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-c0e24cbd]:hover{opacity:1}.activity-feed-wrap[data-v-f3878c46]{flex-direction:column;width:100%;height:100%;display:flex;position:relative}.activity-feed-scroll[data-v-f3878c46]{flex:1;width:100%;height:100%;min-height:0}.activity-feed-nav-cluster[data-v-f3878c46]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-compacting[data-v-f3878c46]{z-index:3;background:var(--kobo-surface);border:1px solid var(--kobo-border);border-radius:6px;align-items:center;gap:8px;padding:6px 14px;display:flex;position:absolute;top:12px;left:50%;transform:translate(-50%);box-shadow:0 4px 16px #00000059}.fade-enter-active[data-v-f3878c46],.fade-leave-active[data-v-f3878c46]{transition:opacity .16s}.fade-enter-from[data-v-f3878c46],.fade-leave-to[data-v-f3878c46]{opacity:0}.activity-feed-nav-btn[data-v-f3878c46]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-f3878c46]:hover{opacity:1}.activity-feed-scroll[data-v-f3878c46] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-f3878c46]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.activity-feed-empty[data-v-f3878c46]{align-items:center;gap:var(--kobo-space-sm);padding:var(--kobo-space-4xl) var(--kobo-space-xl);color:var(--kobo-text-3);text-align:center;flex-direction:column;display:flex}.activity-feed-empty__title[data-v-f3878c46]{font-family:var(--kobo-font-sans);color:var(--kobo-text-2);font-size:14px;font-weight:500}.activity-feed-empty__hint[data-v-f3878c46]{font-family:var(--kobo-font-sans);color:var(--kobo-text-3);max-width:380px;font-size:13px}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{M as e,S as t,dt as n,lt as r,p as i,st as a,v as o}from"./reactivity.esm-bundler-tuEvQ47f.js";import{C as s,F as c,J as l,L as u,N as d,O as f,P as p,Y as m,_ as h,d as g,f as _,g as v,j as y,k as b,l as x,p as S,r as C,u as w,y as T,z as ee}from"./runtime-core.esm-bundler-DOiZcasU.js";import{T as te,Y as E,b as ne,l as D,lt as O,mt as k,nt as A,t as re,x as ie}from"./QBtn-b_baQtAt.js";import{l as ae,n as oe,o as se,t as ce}from"./latest-request-CN4-B22z.js";import{a as j}from"./i18n-D21JKsVt.js";import{O as le,Rt as ue,T as de,Vt as M,ct as fe,g as pe,j as N,jt as me,nt as he,p as ge,rt as _e}from"./index-C7vFf6p2.js";import{t as ve}from"./QSpinnerDots-BsKmccpX.js";import{t as ye}from"./QList-BVX-b8nc.js";import{t as P}from"./QMarkupTable-B8_FKLvo.js";import{c as F,l as I}from"./QSelect-DBW_TZri.js";import{t as be}from"./QExpansionItem-BQuy89vv.js";import{t as L}from"./documents-sb2sQ4JC.js";import{r as xe,t as R}from"./pending-diff-open-DpS4iyDM.js";import{a as z}from"./use-tours-B5uIqxRS.js";import{t as B}from"./QTooltip-DzYbguTR.js";import{i as Se,n as V,o as H,r as Ce,t as U}from"./render-chat-markdown-CafzCcmu.js";import{a as we,i as Te,n as W,o as Ee,r as De,s as Oe}from"./WorkspacePage-CR2xAzW_.js";function ke(e,t){return s(`div`,e,[s(`table`,{class:`q-table`},t)])}var G={list:ye,table:P},Ae=[`list`,`table`,`__qtable`],je=A({name:`QVirtualScroll`,props:{...I,type:{type:String,default:`list`,validator:e=>Ae.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:M},setup(e,{slots:n,attrs:r}){let i,a=t(null),o=x(()=>e.itemsSize>=0&&e.itemsFn!==void 0?Number.parseInt(e.itemsSize,10):Array.isArray(e.items)?e.items.length:0),{virtualScrollSliceRange:c,localResetVirtualScroll:u,padVirtualScroll:f,onVirtualScrollEvt:m}=F({virtualScrollLength:o,getVirtualScrollTarget:S,getVirtualScrollEl:v}),h=x(()=>{if(o.value===0)return[];let t=(e,t)=>({index:c.value.from+t,item:e});return e.itemsFn===void 0?e.items.slice(c.value.from,c.value.to).map(t):e.itemsFn(c.value.from,c.value.to-c.value.from).map(t)}),g=x(()=>`q-virtual-scroll q-virtual-scroll`+(e.virtualScrollHorizontal?`--horizontal`:`--vertical`)+(e.scrollTarget===void 0?` scroll`:``)),_=x(()=>e.scrollTarget===void 0?{tabindex:0}:{});l(o,()=>{u()}),l(()=>e.scrollTarget,()=>{w(),C()});function v(){let e=a.value;return e===null?null:e.$el||e}function S(){return i}function C(){let t=v();t!==null&&(i=ue(t,e.scrollTarget),i.addEventListener(`scroll`,m,E.passive))}function w(){i!==void 0&&(i.removeEventListener(`scroll`,m,E.passive),i=void 0)}function T(){let t=f(e.type===`list`?`div`:`tbody`,h.value.map(n.default));return n.before!==void 0&&(t=n.before().concat(t)),ie(n.after,t)}return u(),p(()=>{C()}),b(()=>{C()}),d(()=>{w()}),y(()=>{w()}),()=>{if(n.default===void 0){console.error(`QVirtualScroll: default scoped slot is required for rendering`);return}return e.type===`__qtable`?ke({ref:a,class:`q-table__middle `+g.value,tabindex:0},T()):s(G[e.type],{...r,ref:a,class:[r.class,g.value],..._.value},T)}}}),Me=new Set([`setup`,`cleanup`,`archive`]);function K(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:Me.has(e.sender)||de(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function Ne(e){let t=[],n=null,r=null;for(let i of e){let e=K(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e===`user`&&i.type===`user`&&i.source?JSON.stringify([`mcp`,i.source.transport,i.source.clientName]):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}function Pe(e){switch(e.type){case`text`:return`text:${e.messageId}`;case`thinking`:return`thinking:${e.messageId}:${e.eventIds?.[0]??e.ts??``}`;case`tool`:return`tool:${e.toolCallId}`;case`session`:return`session:${e.kind}:${e.eventIds?.[0]??e.ts??``}`;case`user`:return`user:${e.eventIds?.[0]??`${e.sender}:${e.ts??``}`}`;case`error`:return`error:${e.eventIds?.[0]??`${e.category}:${e.ts??``}`}`}}function Fe(e){let t=e.items[0];return`${e.speaker}:${t?Pe(t):`empty`}`}function Ie(e,t){let n=Math.min(t,e.length)-1;for(let t=n;t>=0;t--)if(e[t]?.speaker===`user`)return t;return-1}function Le(e,t,n){return new Promise(r=>{let i=!1,a=null,o=null,s=e=>{i||(i=!0,a!==null&&clearTimeout(a),a=null,o?.(),r(e))};if(o=l(e,e=>{t(e)&&s(!0)},{immediate:!0}),i){o();return}a=setTimeout(()=>s(!1),n)})}var Re={class:`agent-error-item`},ze={class:`agent-error-item__body`},q={class:`agent-error-item__title`},Be={class:`agent-error-item__message`},Ve=z(T({__name:`AgentErrorItem`,props:{item:{}},setup(e){let t=e,{te:r}=j(),i=x(()=>{let e=`agent.error.${t.item.category}`;return r(e)?e:`agent.error.other`});return(t,r)=>(u(),S(`div`,Re,[h(D,{name:`error_outline`,size:`16px`,class:`agent-error-item__icon`}),w(`div`,ze,[w(`div`,q,n(t.$t(i.value)),1),w(`div`,Be,n(e.item.message),1)])]))}}),[[`__scopeId`,`data-v-e98c3c02`]]),He={class:`text-caption text-kobo-3`},Ue=T({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,r=x(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return Oe(t.item.detail);case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(u(),S(`span`,He,n(e.$t(r.value)),1))}});function We(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){J(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 J(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=Ge(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 Ge(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 Ke=[`innerHTML`],qe=z(T({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,n=L(),r=he(),i=ne(),{t:a}=j(),o=x(()=>{let e=r.selectedWorkspaceId;return e?n.documentsFor(e).map(e=>e.path):[]}),s=x(()=>{let e=t.item;if(e.streaming)return U(e.text);let n=o.value;return Ce(`${e.messageId}|${n.join(`,`)}`,e.text,e=>{let t=We(H.parse(e,{async:!1,breaks:!0,gfm:!0}),n);return Se(t,{addAttr:[`data-document-path`]})})});function c(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let o=t.getAttribute(`data-document-path`),s=r.selectedWorkspaceId;o&&s&&n.openDocumentByPath(s,o).catch(e=>{console.error(`[TextMessageItem] openDocumentByPath failed:`,e),i.notify({type:`negative`,message:a(`documents.loadFailed`),position:`top`})})}return(t,n)=>(u(),S(`div`,{class:`markdown-message`,onClick:c},[w(`div`,{innerHTML:s.value},null,8,Ke),e.item.streaming?(u(),g(te,{key:0,size:`xs`,class:`q-ml-xs`})):_(``,!0)]))}}),[[`__scopeId`,`data-v-99371035`]]);function Je(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i++;let a=n.length,o=r.length;for(;a>i&&o>i&&n[a-1]===r[o-1];)a--,o--;let s=n.slice(0,i).map(e=>({type:`context`,content:e})),c=n.slice(a).map(e=>({type:`context`,content:e})),l=n.slice(i,a),u=r.slice(i,o);return l.length>800||u.length>800?[...s,...l.map(e=>({type:`del`,content:e})),...u.map(e=>({type:`add`,content:e})),...c]:[...s,...Ye(l,u),...c]}function Ye(e,t){let n=e.length,r=t.length;if(n===0&&r===0)return[];if(n===0)return t.map(e=>({type:`add`,content:e}));if(r===0)return e.map(e=>({type:`del`,content:e}));let i=r+1,a=new Int32Array((n+1)*i);for(let o=n-1;o>=0;o--)for(let n=r-1;n>=0;n--)a[o*i+n]=e[o]===t[n]?a[(o+1)*i+(n+1)]+1:Math.max(a[(o+1)*i+n],a[o*i+(n+1)]);let o=[],s=0,c=0;for(;s<n&&c<r;)e[s]===t[c]?(o.push({type:`context`,content:e[s]}),s++,c++):a[(s+1)*i+c]>=a[s*i+(c+1)]?(o.push({type:`del`,content:e[s]}),s++):(o.push({type:`add`,content:t[c]}),c++);for(;s<n;)o.push({type:`del`,content:e[s++]});for(;c<r;)o.push({type:`add`,content:t[c++]});return o}function Xe(e){let t=e.split(`
|
|
4
|
+
`),n=[],r=!1;for(let e of t){if(e.startsWith(`@@`)){r=!0;continue}(r||!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 Ze(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=Xe(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=Qe(e,n);if(t!==e)return t}let r=Qe(e,`${t.projectPath}/${N}/${t.workingBranch}`);return r===e?Qe(e,t.projectPath):r}function Qe(e,t){if(!t)return e;let n=$e(t);return n?e.replace(RegExp(`${n}[\\\\/]+`,`g`),``).replace(RegExp(`${n}(?=\\s|$|["'\`])`,`g`),`.`):e}function $e(e){let t=e.replace(/[\\/]+$/,``);return t?`${/^[\\/]+/.test(t)?`[\\\\/]+`:``}${t.split(/[\\/]+/).filter(Boolean).map(et).join(`[\\\\/]+`)}`:``}function et(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}var X={class:`tool-name`},tt=[`title`],nt={key:0,class:`tool-stat-add`},Z={key:1,class:`tool-stat-del`},rt={class:`diff-sign`},it={class:`tool-name`},Q=[`title`],at=z(T({__name:`ToolCallItem`,props:{item:{}},setup(t){let r=t,i=o(!1),s=he(),{t:c}=j(),d=x(()=>Ze(r.item.name,r.item.input)),f=x(()=>d.value?Y(d.value.filePath,s.selectedWorkspace):``),p={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`},y=x(()=>p[r.item.name]??`build`),b=x(()=>{if(d.value)return``;let e=r.item.input,t=T(e);return t?Y(t,s.selectedWorkspace):``});function T(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 te=x(()=>{let e=d.value;return e?e.diffLines?e.diffLines:e.toolName===`Edit`&&e.oldString!==void 0&&e.newString!==void 0?Je(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}),E=x(()=>{let e=r.item.result;if(!e)return``;if(typeof e.output==`string`)return e.output;try{return JSON.stringify(e.output)}catch{return String(e.output)}}),ne=new Set([`Read`]),O=x(()=>!!(r.item.result&&E.value)&&(!ne.has(r.item.name)||r.item.result?.isError===!0));function A(){i.value=!i.value}function ie(){let e=d.value?.filePath,t=s.selectedWorkspace,n=t?.id,r=e?Y(e,t):``;r&&!/^(?:[A-Za-z]:)?[\\/]/.test(r)&&n&&(R(n,r),window.dispatchEvent(new CustomEvent(`kobo:open-diff`,{detail:{workspaceId:n,path:r}})))}return l(()=>r.item.result?.isError===!0,e=>{e&&(i.value=!0)},{immediate:!0}),(r,o)=>d.value?(u(),S(`div`,{key:0,class:a([`tool-row`,{"tool-row-expanded":i.value}])},[w(`div`,{class:`tool-header`,onClick:A},[h(D,{name:y.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),w(`span`,X,n(d.value.toolName===`Bash:rm`?`Bash`:d.value.toolName),1),w(`span`,{class:`tool-path`,title:d.value.filePath},n(f.value),9,tt),h(re,{flat:``,dense:``,round:``,size:`xs`,icon:`open_in_new`,class:`tool-open-diff`,onClick:k(ie,[`stop`])},{default:m(()=>[h(B,null,{default:m(()=>[v(n(e(c)(`chat.openInGitDiff`)),1)]),_:1})]),_:1}),d.value.additions>0?(u(),S(`span`,nt,`+`+n(d.value.additions),1)):_(``,!0),d.value.deletions>0?(u(),S(`span`,Z,`-`+n(d.value.deletions),1)):_(``,!0),t.item.result?.isError?(u(),g(D,{key:2,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-xs`})):t.item.result?(u(),g(D,{key:3,name:`check`,color:`positive`,size:`xs`,class:`q-ml-xs`})):_(``,!0),h(D,{name:i.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-auto text-kobo-3`},null,8,[`name`])]),i.value&&te.value?(u(),S(`div`,{key:0,class:`tool-diff`,onClick:o[0]||=k(()=>{},[`stop`])},[(u(!0),S(C,null,ee(te.value,(e,t)=>(u(),S(`div`,{key:t,class:a([`diff-line`,{"diff-del":e.type===`del`,"diff-add":e.type===`add`,"diff-context":e.type===`context`}])},[w(`span`,rt,n(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),v(n(e.content),1)],2))),128))])):_(``,!0)],2)):(u(),S(`div`,{key:1,class:a([`tool-row tool-row-generic`,{"tool-row-expanded":i.value,"tool-row--toggleable":O.value}])},[w(`div`,{class:`tool-header`,onClick:o[1]||=e=>O.value&&A()},[h(D,{name:y.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),w(`span`,it,n(t.item.name),1),b.value?(u(),S(`span`,{key:0,class:`tool-arg`,title:T(t.item.input)||b.value},n(b.value),9,Q)):_(``,!0),t.item.result?.isError?(u(),g(D,{key:1,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-auto`})):t.item.result?(u(),g(D,{key:2,name:`check`,color:`positive`,size:`xs`,class:`q-ml-auto`})):_(``,!0),O.value?(u(),g(D,{key:3,name:i.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-xs text-kobo-3`},null,8,[`name`])):_(``,!0)]),i.value&&O.value?(u(),S(`div`,{key:0,class:`tool-output`,onClick:o[2]||=k(()=>{},[`stop`])},n(E.value),1)):_(``,!0)],2))}}),[[`__scopeId`,`data-v-2482adfe`]]),$=new Map;function ot(){for(let e of $.values())e.controller.abort(),e.blobUrl&&URL.revokeObjectURL(e.blobUrl);$.clear()}typeof window<`u`&&(window.addEventListener(`kobo:auth-token-changed`,ot),window.addEventListener(`storage`,e=>{(e.key===`kobo:network-token`||e.key===null)&&ot()}));function st(e){if(!/^\/api\/workspaces\/[^/]+\/images\/file\?path=/.test(e))throw Error(`Invalid workspace image URL`);let t=$.get(e);if(!t){let n=new AbortController,r={references:0,controller:n,ready:Promise.resolve(``)};r.ready=se(e,{signal:n.signal}).then(async e=>{if(!e.ok)throw await ae(e);let t=await e.blob();if(n.signal.aborted)throw new DOMException(`Aborted`,`AbortError`);return r.blobUrl=URL.createObjectURL(t),r.blobUrl}),t=r,$.set(e,t)}t.references++;let n=!1,r=t;return{ready:r.ready,release(){n||(n=!0,!(--r.references>0)&&(r.controller.abort(),r.blobUrl&&URL.revokeObjectURL(r.blobUrl),$.get(e)===r&&$.delete(e)))}}}function ct(e,t){let n=o(``),r=o(0),a=()=>{r.value++},s=e=>{(e.key===`kobo:network-token`||e.key===null)&&a()};return window.addEventListener(`kobo:auth-token-changed`,a),window.addEventListener(`storage`,s),i(()=>{window.removeEventListener(`kobo:auth-token-changed`,a),window.removeEventListener(`storage`,s)}),l([e,r],([e],r,i)=>{let a=!0,o=[],s=document.createElement(`template`);s.innerHTML=e;for(let e of s.content.querySelectorAll(`img`)){let r=e.getAttribute(`src`)??``;if(e.removeAttribute(`data-kobo-image-url`),!/^\/api\/workspaces\/[^/]+\/images\/file\?path=/.test(r))continue;e.removeAttribute(`src`);let i=st(r);o.push(i),i.ready.then(t=>{a&&(e.setAttribute(`src`,t),e.setAttribute(`data-kobo-image-url`,r),n.value=s.innerHTML)}).catch(()=>{a&&(e.setAttribute(`title`,t()),n.value=s.innerHTML)})}n.value=s.innerHTML,i(()=>{a=!1;for(let e of o)e.release()})},{immediate:!0}),n}function lt(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 ut=[`innerHTML`],dt=[`innerHTML`],ft=[`src`],pt=z(T({__name:`UserMessageItem`,props:{item:{},workspaceId:{}},setup(t){let n=t,{t:r}=j(),a=x(()=>n.item.sender===`system-prompt`),s=ct(x(()=>{let e=lt(n.item.content,n.workspaceId);return V(e)}),()=>r(`network.login.unreachable`)),c=o(null),d=o(!1),f;function p(){d.value=!1,c.value=null,f?.release(),f=void 0}l(d,e=>{e||p()}),l(()=>n.workspaceId,p);let v=e=>{(e.key===`kobo:network-token`||e.key===null)&&p()};window.addEventListener(`storage`,v),window.addEventListener(`kobo:auth-token-changed`,p),i(()=>{p(),window.removeEventListener(`kobo:auth-token-changed`,p),window.removeEventListener(`storage`,v)});function y(e){let t=e.target;if(t?.tagName!==`IMG`)return;let n=t;n.src&&(p(),n.dataset.koboImageUrl&&(f=st(n.dataset.koboImageUrl),f.ready.catch(p)),c.value=n.src,d.value=!0)}return(t,n)=>(u(),S(C,null,[a.value?(u(),g(be,{key:0,dense:``,"dense-toggle":``,label:t.$t(`chat.systemPrompt`),"header-class":`text-kobo-2 text-caption`},{default:m(()=>[w(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:e(s)},null,8,ut)]),_:1},8,[`label`])):(u(),S(`div`,{key:1,class:`markdown-message`,onClick:y},[w(`div`,{innerHTML:e(s)},null,8,dt)])),h(me,{modelValue:d.value,"onUpdate:modelValue":n[1]||=e=>d.value=e},{default:m(()=>[c.value?(u(),S(`img`,{key:0,src:c.value,alt:``,class:`image-lightbox-img`,onClick:n[0]||=e=>d.value=!1},null,8,ft)):_(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-db2fc622`]]),mt=[`data-event-ids`],ht={class:`turn-header`},gt={key:0,class:`turn-time`},_t={class:`turn-time turn-time-updated`},vt={key:2,class:`turn-actions`},yt={class:`turn-body`},bt={key:0,class:`turn-scroll-top`},xt=z(T({__name:`TurnCard`,props:{turn:{},workspaceId:{},highlighted:{type:Boolean}},emits:[`scrollTo`],setup(t,{emit:i}){let s=t,c=i,{t:l}=j(),d=o(null);function f(){let e=d.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;c(`scrollTo`,Math.max(0,n-8))}let p=x(()=>{switch(s.turn.speaker){case`user`:{let e=s.turn.items[0],t=e?.type===`user`?e.source:void 0;return{label:t?l(`chat.externalLlm`,{name:t.clientName}):l(`chat.you`),accent:`var(--kobo-turn-user)`,badgeClass:`turn-badge-user`}}case`agent`:return{label:l(`chat.agent`),accent:`var(--kobo-turn-agent)`,badgeClass:`turn-badge-agent`};case`system-prompt`:return{label:l(`chat.systemPrompt`),accent:`var(--kobo-text-3)`,badgeClass:`turn-badge-system`};case`session`:return{label:l(`chat.session`),accent:`var(--kobo-text-3)`,badgeClass:`turn-badge-session`};case`script`:{let e=s.turn.items[0],t=e?.type===`user`?e.sender:``;return{label:de(t)?l(`chat.hookScript`,{event:t.slice(5)}):l(t===`archive`?`chat.archiveScript`:t===`setup`?`chat.setupScript`:`chat.cleanupScript`),accent:`var(--kobo-success)`,badgeClass:`turn-badge-script`}}}});function y(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 b=x(()=>y(s.turn.ts)),T=x(()=>s.turn.items.flatMap(e=>e.eventIds??[]).join(` `)),te=x(()=>{let e=s.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}),E=x(()=>{let e=s.turn.ts,t=te.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?``:y(t,r-n<6e4)}),ne=x(()=>E.value!==``),O=x(()=>s.turn.items.filter(e=>e.type===`tool`).length);return(i,o)=>(u(),S(`div`,{ref_key:`cardEl`,ref:d,class:a([`turn-card`,{"turn-card--user":t.turn.speaker===`user`,"turn-card--highlighted":t.highlighted}]),"data-event-ids":T.value,style:r({"--turn-accent":p.value.accent})},[w(`div`,ht,[w(`span`,{class:a([`turn-badge`,p.value.badgeClass])},n(p.value.label),3),b.value?(u(),S(`span`,gt,n(b.value),1)):_(``,!0),ne.value?(u(),S(C,{key:1},[h(D,{name:`arrow_forward`,size:`10px`,color:`kobo-3`,class:`turn-time-arrow`}),w(`span`,_t,[v(n(E.value)+` `,1),h(B,null,{default:m(()=>[v(n(e(l)(`chat.lastUpdatedAt`,{time:E.value})),1)]),_:1})])],64)):_(``,!0),O.value>0?(u(),S(`span`,vt,` · `+n(e(l)(`chat.nActions`,{n:O.value})),1)):_(``,!0)]),w(`div`,yt,[(u(!0),S(C,null,ee(t.turn.items,n=>(u(),S(C,{key:e(Pe)(n)},[n.type===`text`?(u(),g(qe,{key:0,item:n},null,8,[`item`])):n.type===`thinking`?(u(),g(W,{key:1,item:n},null,8,[`item`])):n.type===`tool`?(u(),g(at,{key:2,item:n},null,8,[`item`])):n.type===`user`?(u(),g(pt,{key:3,item:n,"workspace-id":t.workspaceId},null,8,[`item`,`workspace-id`])):n.type===`session`?(u(),g(Ue,{key:4,item:n},null,8,[`item`])):n.type===`error`?(u(),g(Ve,{key:5,item:n},null,8,[`item`])):_(``,!0)],64))),128))]),t.turn.items.length>4?(u(),S(`div`,bt,[h(re,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`kobo-3`,class:`turn-scroll-top-btn`,onClick:f},{default:m(()=>[h(B,null,{default:m(()=>[v(n(e(l)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):_(``,!0)],14,mt))}}),[[`__scopeId`,`data-v-c0e24cbd`]]),St={key:0,class:`activity-feed-switching`},Ct={key:1,class:`activity-feed-wrap`,"data-tour":`ws-chat`},wt={key:0,role:`alert`,class:`q-pa-sm text-negative`},Tt={key:1,"data-testid":`history-load-error`,role:`alert`,class:`q-pa-sm text-negative`},Et=[`aria-label`],Dt={key:0,class:`activity-feed-compacting`},Ot={class:`text-caption text-kobo-2`},kt={key:0,class:`text-center q-py-sm text-caption text-kobo-3`},At={key:1,class:`activity-feed-empty q-pa-md`},jt={class:`activity-feed-empty__title`},Mt={class:`activity-feed-empty__hint`},Nt={key:2,class:`q-px-md q-pb-md`},Pt={class:`activity-feed-nav-cluster`},Ft=300,It=60,Lt=200,Rt=180,zt=3,Bt=60,Vt=z(T({__name:`ActivityFeed`,props:{workspaceId:{}},setup(t){let{t:r}=j(),i=t,a=fe(),s=le(),d=he(),y=ge(),b=x(()=>y.isCompacting(i.workspaceId)),T=x(()=>d.selectedSessionId),E=x(()=>d.sessions.find(e=>e.id===T.value)?.engineSessionId??null),ne=x(()=>{let e=d.sessions;return e.length!==0&&T.value===e[e.length-1].id});function k(e){return T.value?e?e===T.value||e===E.value:ne.value:!0}let A=x(()=>(d.activityFeeds[i.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&k(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,source:pe(e.meta?.source),ts:e.timestamp,sessionId:e.sessionId,eventIds:[e.id]}))),ie=x(()=>{let e=d.workspaces.find(e=>e.id===i.workspaceId);return _e(e?.status)}),ue=De(),de=``,M=x(()=>{let e=a.eventsFor(i.workspaceId),t=a.timestampsFor(i.workspaceId),n=a.sessionIdsFor(i.workspaceId),r=a.eventIdsFor(i.workspaceId),o=[],c=[],l=[];for(let i=0;i<e.length;i++)k(n[i])&&(o.push(e[i]),c.push(t[i]),l.push(r[i]??null));let u=`${i.workspaceId}::${T.value??`*`}`;u!==de&&(ue=De(),de=u);let d=Te(ue,o,c,ie.value,l);return Ne(Ee(d,A.value).filter(e=>e.type===`thinking`?!1:e.type===`session`?e.kind===`ended`?s.showVerboseSystemMessages||!we(e.detail):s.showVerboseSystemMessages:!0))}),N=x(()=>s.showVerboseSystemMessages?a.eventsFor(i.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),me=x(()=>{for(let e=M.value.length-1;e>=0;e--){let t=M.value[e]?.items??[];for(let e=t.length-1;e>=0;e--){let n=t[e];if(n){if(n.type===`text`&&!n.streaming)return{key:`text:${n.messageId}`,text:n.text};if(n.type===`tool`)return n.result?{key:`tool:${n.toolCallId}:end`,text:n.result.isError?r(`activity.a11y.toolFailed`,{name:n.name}):r(`activity.a11y.toolFinished`,{name:n.name})}:{key:`tool:${n.toolCallId}:start`,text:r(`activity.a11y.toolStarted`,{name:n.name})}}}}return null}),ye=o(``);l(me,(e,t)=>{if(!e||e.key===t?.key)return;let n=e.key.startsWith(`text:`)?r(`activity.a11y.agentSaid`,{text:e.text.slice(0,Ft)}):e.text;ye.value=n});let P=o(null),F=o(!0),I=o(!1),L=o(``),R=ce(),z=ce(),B=ce(),Se=o(null),V=!1,H=!0,Ce=null,U=o(new Set),W=new Map,Oe=x(()=>{if(M.value.length>0||N.value.length>0)return!1;let e=i.workspaceId,t=T.value;return!!d.loadingSessions[e]||y.isSyncPending(e)||t!==null&&U.value.has(K(e,t))}),ke=o(new Map),G=x(()=>M.value.length>0||N.value.length>0),Ae=x(()=>!!d.loadingSessions[i.workspaceId]||y.isSyncPending(i.workspaceId)||T.value!==null&&U.value.has(K(i.workspaceId,T.value)));function Me(e){let t=Ce;if(Ce=e.verticalSize,t!==null&&e.verticalSize>t&&F.value&&!I.value){We(0);return}let n=e.verticalSize-e.verticalPosition-e.verticalContainerSize;F.value=n<=It,V&&e.verticalPosition<=Lt&&!I.value&&!L.value&&Pe()&&Be()}function K(e,t){return`${e}:${t}`}function Pe(){let e=T.value;return e?ke.value.get(K(i.workspaceId,e))??!0:a.hasMoreOlderFor(i.workspaceId)}function Re(e,t,n){ke.value.set(K(e,t),n)}function ze(e){if(!T.value)return a.oldestIdFor(e);let t=a.eventIdsFor(e),n=a.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!k(n[e]))continue;let r=t[e];if(r)return r}}let q=null;function Be(){if(q)return q;let e=Ue().finally(()=>{q===e&&(q=null)});return q=e,q}function Ve(){R.abort(),z.abort(),B.abort(),I.value=!1,q=null;for(let e of U.value)at.delete(e);W.clear(),U.value.clear(),L.value=``}function He(){L.value=``,rt.value===0&&T.value?$():Be()}l(()=>[i.workspaceId,T.value],Ve,{flush:`sync`});async function Ue(){let e=i.workspaceId,t=T.value,n=ze(e);if(!n)return;let r=R.begin();L.value=``,I.value=!0;try{let i=P.value;if(await f(),!R.isCurrent(r))return;let o=i?.getScroll().verticalSize??0,s=i?.getScroll().verticalPosition??0,c=new URLSearchParams({before:n,limit:`200`});t&&c.set(`session`,t);let l=await se(`/api/workspaces/${e}/events?${c.toString()}`,{signal:r});if(!l.ok)throw await ae(l);let u=await l.json();if(!R.isCurrent(r))return;let p=u.events??[],m=p.filter(t=>t.type===`agent:event`&&t.workspaceId===e),h=p.filter(t=>t.type===`user:message`&&t.workspaceId===e),g=m.map(e=>e.payload),_=m.map(e=>e.createdAt),v=m.map(e=>e.sessionId??null),y=m.map(e=>e.id),b=p.length>0?p[0].id:n;t&&Re(e,t,u.hasMore),a.prepend(e,g,_,{oldestId:b,hasMoreOlder:t?a.hasMoreOlderFor(e):u.hasMore,sessionIds:v,eventIds:y});for(let t of h){let n=t.payload;typeof n.content==`string`&&d.addActivityItem(e,{id:t.id,type:`text`,content:n.content,timestamp:t.createdAt,sessionId:t.sessionId??void 0,meta:{sender:n.sender??`user`,source:pe(n.source)}})}if(await f(),i&&R.isCurrent(r)){let e=i.getScroll().verticalSize-o;if(e>0){let t=Math.max(s+e,250);i.setScrollPosition(`vertical`,t,0)}}}catch(e){if(oe(e)||!R.isCurrent(r))return;L.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to load older events:`,e)}finally{R.isCurrent(r)&&(I.value=!1)}}async function We(e=0){let t=Q();if(await f(),t!==Q())return;let n=P.value;if(!n)return;let r=n.getScroll();n.setScrollPosition(`vertical`,r.verticalSize,e)}let J=null,Ge=0;function Ke(){if(J!=null)return;let e=performance.now()-Ge<Rt,t=Q();J=requestAnimationFrame(()=>{J=null,t===Q()&&(Ge=performance.now(),We(e?0:180))})}function qe(e){Z(),F.value=!1;let t=P.value;t&&t.setScrollPosition(`vertical`,Math.max(0,e),250)}function Je(){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 Ye(e){let t=e.detail;if(t?.workspaceId!==i.workspaceId||!t.eventId)return;Z(),F.value=!1;let n=B.begin(),r=i.workspaceId;try{let e=new URLSearchParams({around:t.eventId,limit:`200`});t.sessionId&&e.set(`session`,t.sessionId);let o=await se(`/api/workspaces/${r}/events?${e}`,{signal:n});if(!o.ok)throw await ae(o);let s=await o.json();if(!B.isCurrent(n))return;let c=s.events??[],l=c.filter(e=>e.type===`agent:event`&&e.workspaceId===i.workspaceId),u=c.filter(e=>e.type===`user:message`&&e.workspaceId===i.workspaceId);a.reset(i.workspaceId,l.map(e=>e.payload),l.map(e=>e.createdAt),{oldestId:c[0]?.id,hasMoreOlder:s.hasMore??!1,sessionIds:l.map(e=>e.sessionId),eventIds:l.map(e=>e.id)});for(let e of u){let t=e.payload;typeof t.content==`string`&&d.addActivityItem(i.workspaceId,{id:e.id,type:`text`,content:t.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:t.sender??`user`,source:pe(t.source)}})}if(await Le(Oe,e=>!e,5e3),await f(),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e()))),!B.isCurrent(n))return;let p=M.value.findIndex(e=>e.items.some(e=>e.eventIds?.includes(t.eventId)??!1));if(p<0)return;Se.value=t.eventId,Xe.value?.scrollTo(p,`center`),Y.value=p,window.setTimeout(()=>{Se.value===t.eventId&&(Se.value=null)},1800)}catch(e){if(oe(e)||!B.isCurrent(n))return;L.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to focus history event:`,e)}}let Xe=o(null),Ze=o(null),Y=o(0);function Qe(e){Y.value=e.index}let $e=o(!1);async function et(){if($e.value)return;Z(),F.value=!1,$e.value=!0;let e=i.workspaceId;try{let t=Ie(M.value,Y.value);if(t<0)for(let n=0;n<15;n++){if(e!==i.workspaceId)return;if(!Pe())break;let n=M.value.length;if(await Be(),await f(),e!==i.workspaceId)return;if(Y.value+=M.value.length-n,t=Ie(M.value,Y.value),t>=0)break}t>=0&&e===i.workspaceId&&(Xe.value?.scrollTo(t,`start`),Y.value=t)}finally{$e.value=!1}}let X=0;function tt(){return new Promise(e=>requestAnimationFrame(()=>e()))}async function nt(){if(!H||!G.value||Oe.value)return;V=!1;let e=++X;if(await f(),e!==X||!H||(Ze.value=P.value?.getScrollTarget()??null,await f(),e!==X||!H))return;M.value.length>0&&Xe.value?.scrollTo(M.value.length-1,`end-force`),await tt();let t=-1,n=0;for(let r=0;r<Bt&&n<zt;r++){if(e!==X||!H)return;await We(0),await tt();let r=P.value?.getScroll().verticalSize??0;Ce=r,n=r===t?n+1:0,t=r}e===X&&!Ae.value&&(V=!0,H=!1)}function Z(){H=!1,!V&&(X++,V=!0)}let rt=x(()=>{let e=a.sessionIdsFor(i.workspaceId);if(!T.value)return e.length;let t=0;for(let n of e)k(n)&&t++;return t});l(Oe,async e=>{!e&&G.value&&await nt(),e||f(()=>{Ze.value=P.value?.getScrollTarget()??null})}),l(Ae,(e,t)=>{!e&&t&&H&&G.value&&nt()}),p(()=>{window.addEventListener(`kobo:focus-history-event`,Ye),f(()=>{Ze.value=P.value?.getScrollTarget()??null}),G.value&&nt(),T.value&&$();let e=new URLSearchParams(window.location.hash.split(`?`)[1]??``).get(`eventId`);e&&(Ye(new CustomEvent(`kobo:focus-history-event`,{detail:{workspaceId:i.workspaceId,sessionId:T.value,eventId:e}})),Je())}),l([rt,()=>A.value.length,()=>N.value.length],async([e,t,n])=>{I.value||H&&e+t+n>0&&await nt()});let it=x(()=>a.liveAppendCountFor(i.workspaceId,k)),Q=()=>`${i.workspaceId}\u0000${d.selectedSessionId??``}`;l([it,Q],([e,t],[n,r])=>{t===r&&e>n&&F.value&&!I.value&&Ke()}),c(()=>{X++,H=!1,Ve(),window.removeEventListener(`kobo:focus-history-event`,Ye),J!=null&&(cancelAnimationFrame(J),J=null)}),l([()=>i.workspaceId,()=>d.selectedSessionId],()=>{X++,H=!0,Ce=null,F.value=!0,V=!1,$(),G.value&&nt()});let at=new Set;async function $(){let e=i.workspaceId,t=T.value;if(!t||rt.value>0)return;let n=K(e,t);if(at.has(n))return;at.add(n),U.value.add(n);let r=z.begin();W.set(n,r),L.value=``;try{let n=await se(`/api/workspaces/${e}/events?session=${encodeURIComponent(t)}&limit=500`,{signal:r});if(!n.ok)throw await ae(n);let i=await n.json();if(!z.isCurrent(r))return;let o=i.events??[];if(o.length===0)return;let s=o.filter(t=>t.type===`agent:event`&&t.workspaceId===e),c=o.filter(t=>t.type===`user:message`&&t.workspaceId===e),l=s.map(e=>e.payload),u=s.map(e=>e.createdAt),f=s.map(e=>e.sessionId??null),p=s.map(e=>e.id);Re(e,t,i.hasMore),l.length>0&&a.prepend(e,l,u,{oldestId:o[0].id,hasMoreOlder:a.hasMoreOlderFor(e),sessionIds:f,eventIds:p});for(let t of c){let n=t.payload;typeof n.content==`string`&&d.addActivityItem(e,{id:t.id,type:`text`,content:n.content,timestamp:t.createdAt,sessionId:t.sessionId??void 0,meta:{sender:n.sender??`user`,source:pe(n.source)}})}}catch(e){if(oe(e)||!z.isCurrent(r)){(!W.has(n)||W.get(n)===r)&&at.delete(n);return}L.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),at.delete(n)}finally{W.get(n)===r&&(W.delete(n),U.value.delete(n))}}let ot=x(()=>A.value.filter(e=>e.sender===`user`).length),st=x(()=>(d.activityFeeds[i.workspaceId]??[]).filter(e=>e.meta?.sender===`user`&&e.meta.pending&&k(e.sessionId)).length);l([ot,st,Q],async([e,t,n],[r,i,a])=>{let o=t>i;n===a&&(o||e>r&&F.value&&!I.value&&!Ae.value)&&(F.value=!0,await We(o?180:0))});async function ct(){F.value=!0,await We(250)}return(t,r)=>Oe.value?(u(),S(`div`,St,[h(ve,{size:`40px`,color:`primary`})])):(u(),S(`div`,Ct,[e(d).sessionsErrors[i.workspaceId]?(u(),S(`div`,wt,[v(n(t.$t(`activity.sessionsError`,{message:e(d).sessionsErrors[i.workspaceId]}))+` `,1),h(re,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:r[0]||=t=>e(d).fetchSessions(i.workspaceId)},null,8,[`label`])])):_(``,!0),L.value?(u(),S(`div`,Tt,[v(n(t.$t(`activity.historyError`,{message:L.value}))+` `,1),h(re,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:He},null,8,[`label`])])):_(``,!0),w(`div`,{"data-testid":`activity-live-region`,class:`sr-only`,role:`log`,"aria-live":`polite`,"aria-atomic":`true`,"aria-label":t.$t(`activity.a11y.region`)},n(ye.value),9,Et),h(O,{name:`fade`},{default:m(()=>[b.value?(u(),S(`div`,Dt,[h(ve,{size:`18px`,color:`primary`}),w(`span`,Ot,n(t.$t(`activity.compacting`)),1)])):_(``,!0)]),_:1}),h(xe,{ref_key:`scrollRef`,ref:P,class:`activity-feed-scroll`,onScroll:Me,onWheelPassive:Z,onTouchstartPassive:Z,onKeydown:Z},{default:m(()=>[I.value?(u(),S(`div`,kt,[h(te,{size:`sm`}),v(` `+n(t.$t(`activity.loading_older`)),1)])):_(``,!0),h(je,{ref_key:`virtualScrollRef`,ref:Xe,class:`q-pa-md`,items:M.value,"scroll-target":Ze.value??void 0,"virtual-scroll-item-size":160,"virtual-scroll-slice-size":20,onVirtualScroll:Qe},{default:m(({item:t,index:n})=>[(u(),g(xt,{key:e(Fe)(t),turn:t,"workspace-id":i.workspaceId,"data-turn-index":n,highlighted:t.items.some(e=>e.eventIds?.includes(Se.value??``)??!1),onScrollTo:qe},null,8,[`turn`,`workspace-id`,`data-turn-index`,`highlighted`]))]),_:1},8,[`items`,`scroll-target`]),M.value.length===0&&N.value.length===0&&!I.value?(u(),S(`div`,At,[h(D,{name:`forum`,size:`28px`}),w(`div`,jt,n(t.$t(`activity.empty`)),1),w(`div`,Mt,n(t.$t(`activity.emptyHint`)),1)])):_(``,!0),N.value.length?(u(),S(`div`,Nt,[h(be,{label:t.$t(`activity.raw_lines`,{n:N.value.length}),dense:``},{default:m(()=>[(u(!0),S(C,null,ee(N.value,(e,t)=>(u(),S(`div`,{key:t,class:`text-caption text-kobo-3 q-pa-xs`},n(e),1))),128))]),_:1},8,[`label`])])):_(``,!0)]),_:1},512),w(`div`,Pt,[F.value?_(``,!0):(u(),g(re,{key:0,round:``,dense:``,unelevated:``,color:`kobo-surface-2`,"text-color":`kobo-1`,icon:`arrow_downward`,size:`sm`,class:`activity-feed-nav-btn`,title:t.$t(`activity.scroll_to_bottom`),"aria-label":t.$t(`activity.scroll_to_bottom`),onClick:ct},null,8,[`title`,`aria-label`])),h(re,{round:``,dense:``,unelevated:``,color:`kobo-surface-2`,"text-color":`kobo-1`,icon:`arrow_upward`,size:`sm`,class:`activity-feed-nav-btn`,title:t.$t(`activity.prev_user_message`),"aria-label":t.$t(`activity.prev_user_message`),loading:$e.value,disable:$e.value,onClick:et},null,8,[`title`,`aria-label`,`loading`,`disable`])])]))}}),[[`__scopeId`,`data-v-f3878c46`]]);export{Vt as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{M as e,dt as t,v as n}from"./reactivity.esm-bundler-tuEvQ47f.js";import{L as r,P as i,Y as a,_ as o,d as s,f as c,p as l,r as u,u as d,y as f,z as p}from"./runtime-core.esm-bundler-DOiZcasU.js";import{t as m}from"./QBtn-b_baQtAt.js";import{l as h,o as g}from"./latest-request-CN4-B22z.js";import{Jt as _,Kt as v,i as y}from"./index-C7vFf6p2.js";import{a as b,i as x,n as S}from"./use-tours-B5uIqxRS.js";import{n as C}from"./render-chat-markdown-CafzCcmu.js";import{t as w}from"./QChip-CG1kWhFm.js";import{t as T}from"./QPage-BCDXjfVj.js";import{t as E}from"./DrawerToggleButton-Btx8QwHo.js";import{t as D}from"./TourReplayButton-gp7m6tSV.js";var O={class:`row items-center q-mb-md`},k={class:`text-h6 q-ml-sm`},A={key:0,class:`text-kobo-3 text-center q-pa-lg`},j={key:1,class:`text-negative text-center q-pa-lg`},M={key:2,class:`text-kobo-3 text-center q-pa-lg`},N={key:3,class:`column q-gutter-md`,"data-tour":`changelog-list`},P={key:0,class:`text-caption text-kobo-3`},F={class:`row items-center q-mb-sm`},I={class:`text-subtitle1 text-kobo-2`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},L=[`innerHTML`],R=b(f({__name:`ChangelogPage`,setup(f){let b=y(),{scheduleAutoRun:R}=S(),z=n([]),B=n(``),V=n(!1),H=n(null);function U(e){return C(e)}async function W(){V.value=!0,H.value=null;try{let e=await g(`/api/changelog`);if(!e.ok)throw await h(e);let t=await e.json();B.value=t.currentVersion??``,z.value=t.versions??[]}catch(e){H.value=e instanceof Error?e.message:String(e)}finally{V.value=!1}}return i(()=>{W(),R(`changelog`)}),(n,i)=>(r(),s(T,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[d(`div`,O,[o(E,{class:`q-mr-xs`}),o(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:i[0]||=t=>e(b).back()}),d(`div`,k,t(n.$t(`changelog.title`)),1),o(x),o(m,{flat:``,dense:``,icon:`refresh`,loading:V.value,label:n.$t(`common.refresh`),onClick:W},null,8,[`loading`,`label`]),o(D,{"tour-id":`changelog`,class:`q-ml-xs`})]),V.value&&z.value.length===0?(r(),l(`div`,A,t(n.$t(`common.loading`)),1)):H.value?(r(),l(`div`,j,t(H.value),1)):z.value.length===0?(r(),l(`div`,M,t(n.$t(`changelog.empty`)),1)):(r(),l(`div`,N,[B.value?(r(),l(`div`,P,t(n.$t(`changelog.currentVersion`,{version:B.value})),1)):c(``,!0),(r(!0),l(u,null,p(z.value,e=>(r(),s(v,{key:e.version,dark:``,flat:``,bordered:``},{default:a(()=>[o(_,null,{default:a(()=>[d(`div`,F,[d(`div`,I,` v`+t(e.version),1),e.version===B.value?(r(),s(w,{key:0,dense:``,size:`sm`,color:`primary`,"text-color":`kobo-1`,label:n.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):c(``,!0)]),d(`div`,{class:`changelog-notes`,innerHTML:U(e.notes)},null,8,L)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-4032778f`]]);export{R as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.changelog-notes[data-v-4032778f]{color:var(--kobo-text-2);font-size:13px;line-height:1.55}.changelog-notes[data-v-4032778f] h3{color:var(--kobo-text);margin:.8em 0 .3em;font-size:14px;font-weight:600}.changelog-notes[data-v-4032778f] ul{margin:0;padding-left:1.2em}.changelog-notes[data-v-4032778f] li{margin:.2em 0}.changelog-notes[data-v-4032778f] code{background:#00000040;border-radius:3px;padding:.1em .3em;font-size:12px}.changelog-notes[data-v-4032778f] a{color:var(--kobo-text-2)}
|