@loicngr/kobo 2.1.5 → 2.1.6
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/dist/server/routes/workspaces.js +41 -33
- package/dist/server/services/agent/engines/claude-code/event-mapper.js +33 -0
- package/dist/server/services/agent/engines/codex/engine.js +10 -1
- package/dist/server/services/agent/engines/codex/event-mapper.js +2 -0
- package/dist/server/services/agent/streaming-batcher.js +14 -3
- package/package.json +6 -6
- package/src/client/dist/pwa/assets/ActivityFeed-BO1mKMJ0.js +1 -0
- package/src/client/dist/pwa/assets/ActivityFeed-ZTxXVmNM.css +1 -0
- package/src/client/dist/pwa/assets/{ChangelogPage-BL5Jh8-v.js → ChangelogPage-BXNz7PGb.js} +1 -1
- package/src/client/dist/pwa/assets/{ComparisonPanel-Bv2SZrVZ.js → ComparisonPanel-CfmJHeH_.js} +1 -1
- package/src/client/dist/pwa/assets/{CreatePage-d43ITOC1.js → CreatePage-6_AP5zso.js} +1 -1
- package/src/client/dist/pwa/assets/{DashboardPage-BEXXRguE.js → DashboardPage-BKCrV6u0.js} +1 -1
- package/src/client/dist/pwa/assets/{DiffViewer-B92w_jd7.js → DiffViewer-BMzrb9fB.js} +3 -3
- package/src/client/dist/pwa/assets/DocumentsPanel-CqGg38Oi.js +1 -0
- package/src/client/dist/pwa/assets/{DrawerToggleButton-Btx8QwHo.js → DrawerToggleButton-DKytIBlk.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-DRzhrs_V.js +3 -0
- package/src/client/dist/pwa/assets/{HealthPage-CDhgJQkL.js → HealthPage-DWotmfkh.js} +1 -1
- package/src/client/dist/pwa/assets/MainLayout-DkSavoiV.css +1 -0
- package/src/client/dist/pwa/assets/MainLayout-fRVZ01LN.js +2 -0
- package/src/client/dist/pwa/assets/{QBanner-7EWRdc4U.js → QBanner-mzrnn82R.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnDropdown-vjat4GZl.js → QBtnDropdown-BGGvQIvH.js} +1 -1
- package/src/client/dist/pwa/assets/{QChip-CG1kWhFm.js → QChip-Chu7r6RZ.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-BQuy89vv.js → QExpansionItem-C2XXHOHk.js} +1 -1
- package/src/client/dist/pwa/assets/{QItemSection-BrVklYfM.js → QItemSection-CR3Kfibl.js} +1 -1
- package/src/client/dist/pwa/assets/{QList-BVX-b8nc.js → QList-DnezW6gW.js} +1 -1
- package/src/client/dist/pwa/assets/{QMarkupTable-B8_FKLvo.js → QMarkupTable-wuDf50Oh.js} +1 -1
- package/src/client/dist/pwa/assets/QScrollArea-BnmQ9US7.js +1 -0
- package/src/client/dist/pwa/assets/{QSelect-DBW_TZri.js → QSelect-BskTzVCM.js} +1 -1
- package/src/client/dist/pwa/assets/{QTooltip-DzYbguTR.js → QTooltip-CO84H0cq.js} +1 -1
- package/src/client/dist/pwa/assets/{SchedulePanel-BX6iKh6S.js → SchedulePanel-CPirTYw5.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-_In2gH2P.js → SearchPage-CnT0-Hpe.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-BqkNYzC5.js → SettingsPage-DCMZL7GO.js} +1 -1
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-DRoXbSRP.js → SplitWorkspacePage-DwWsD7f5.js} +1 -1
- package/src/client/dist/pwa/assets/{TerminalPanel-CfqiuSuk.js → TerminalPanel-C4dYabx6.js} +1 -1
- package/src/client/dist/pwa/assets/ToolCallItem-CjXWiKJc.js +8 -0
- package/src/client/dist/pwa/assets/ToolCallItem-DhjdG8vp.css +1 -0
- package/src/client/dist/pwa/assets/{TouchPan-DcOCRf7x.js → TouchPan-6fI8xFPq.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-gp7m6tSV.js → TourReplayButton-DhbNI6O5.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-IcoMGkJh.js → WorkspaceAttentionLabels-CZxW7QSq.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspacePage-B0wCQdev.js +4 -0
- package/src/client/dist/pwa/assets/{browser-BveHkbe-.js → browser-CTkGHrN5.js} +1 -1
- package/src/client/dist/pwa/assets/{build-path-tree-Dtp7rlxS.js → build-path-tree-Bd50EZMW.js} +1 -1
- package/src/client/dist/pwa/assets/{custom-sounds-CBoWzJ85.js → custom-sounds-DoPDmcY5.js} +1 -1
- package/src/client/dist/pwa/assets/{de-BJsWkZro.js → de-BPtzBQu0.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-CbkPxoJf.js → editor.api-CKcTKXcM.js} +1 -1
- package/src/client/dist/pwa/assets/{efforts-BCli1Unj.js → efforts-CDsBbk8o.js} +1 -1
- package/src/client/dist/pwa/assets/{es-tNYw7itB.js → es-BoNOfG0w.js} +1 -1
- package/src/client/dist/pwa/assets/{expand-template-CfaEhb2f.js → expand-template-D6zFPzzB.js} +1 -1
- package/src/client/dist/pwa/assets/{format-BRl2DUlm.js → format-MtzcnR3z.js} +1 -1
- package/src/client/dist/pwa/assets/{formatters-C5TjPSR_.js → formatters-DCjBZ47F.js} +1 -1
- package/src/client/dist/pwa/assets/{fr-B5sFski4.js → fr-Bu92fK5U.js} +1 -1
- package/src/client/dist/pwa/assets/{freemarker2-CDmvOQyn.js → freemarker2-JGUTjYvR.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-Bx_w8mx1.js → handlebars-BWStl2Hc.js} +1 -1
- package/src/client/dist/pwa/assets/{html-DVRfiRkS.js → html-CjGCxUEe.js} +1 -1
- package/src/client/dist/pwa/assets/{i18n-D21JKsVt.js → i18n-DKj-umtn.js} +3 -3
- package/src/client/dist/pwa/assets/i18n-DtmbeJu8.js +1 -0
- package/src/client/dist/pwa/assets/{index-C7vFf6p2.js → index-BPmUmc6D.js} +2 -2
- package/src/client/dist/pwa/assets/{it-Bc2FncM9.js → it-CrA4Q7oc.js} +1 -1
- package/src/client/dist/pwa/assets/{javascript-CPvttU5J.js → javascript-C_jd0j2i.js} +1 -1
- package/src/client/dist/pwa/assets/{latest-request-CN4-B22z.js → latest-request-CBPb8UWQ.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-CI0gQddb.js → liquid-DMyQVGkp.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-BveBwYJH.js → mdx-DeW5qzOU.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-CHXFh4P2.js → monaco-contributions-Be_o6s3m.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco.contribution-DOK8t_9B.js → monaco.contribution-VUGNbVME.js} +2 -2
- package/src/client/dist/pwa/assets/{network-auth-CItnNZDh.js → network-auth-CSx0jS5X.js} +1 -1
- package/src/client/dist/pwa/assets/{notify-theme-BO6r1Rd7.js → notify-theme-uhSG2r09.js} +1 -1
- package/src/client/dist/pwa/assets/preload-helper-DjzSQ1t3.js +1 -0
- package/src/client/dist/pwa/assets/{project-color-Bnv02P9D.js → project-color-BQbOnYBN.js} +1 -1
- package/src/client/dist/pwa/assets/{python-BesLCxpi.js → python-C1v3VovI.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-Dv1PMxuY.js → razor-DMEmKSdO.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-26L2Xsu9.js → typescript-rKyiSQID.js} +1 -1
- package/src/client/dist/pwa/assets/{use-checkbox-BLeif5-t.js → use-checkbox-BqDMQ6x7.js} +1 -1
- package/src/client/dist/pwa/assets/{use-search-index-status-Mv3pIO6p.js → use-search-index-status-BL3cb04x.js} +1 -1
- package/src/client/dist/pwa/assets/{use-tours-B5uIqxRS.js → use-tours-Dum-bOyQ.js} +1 -1
- package/src/client/dist/pwa/assets/use-worktree-restore-BQyoz3Qa.js +1 -0
- package/src/client/dist/pwa/assets/{workspace-templates-CDY-MiH2.js → workspace-templates-YRwFjkUh.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-CkRojTcc.js → xml-U_pDcywM.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-DKkQHwew.js → yaml-CRCd_ET9.js} +1 -1
- package/src/client/dist/pwa/index.html +5 -5
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-B4lTKMVE.css +0 -1
- package/src/client/dist/pwa/assets/ActivityFeed-DXWXioW9.js +0 -8
- package/src/client/dist/pwa/assets/DocumentsPanel-C9JXyqHg.js +0 -1
- package/src/client/dist/pwa/assets/GitPanel-Cgz9crLN.js +0 -3
- package/src/client/dist/pwa/assets/MainLayout-DTTtj9sq.js +0 -2
- package/src/client/dist/pwa/assets/MainLayout-knNNtkre.css +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-CR2xAzW_.js +0 -4
- package/src/client/dist/pwa/assets/documents-sb2sQ4JC.js +0 -1
- package/src/client/dist/pwa/assets/i18n-Bm-L4nW3.js +0 -1
- package/src/client/dist/pwa/assets/pending-diff-open-DpS4iyDM.js +0 -1
- package/src/client/dist/pwa/assets/preload-helper-BZ1Pz5am.js +0 -1
- package/src/client/dist/pwa/assets/use-worktree-restore-BBChALUM.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@ All notable changes to Kōbō are documented here. The format is based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/). Each release is an `## <version>`
|
|
5
5
|
section — the in-app "What's new" dialog reads this file.
|
|
6
6
|
|
|
7
|
+
## 2.1.6
|
|
8
|
+
|
|
9
|
+
- feat(subagents): add focused activity views
|
|
10
|
+
|
|
7
11
|
## 2.1.5
|
|
8
12
|
|
|
9
13
|
- fix(workspace): improve reliability and git controls
|
|
@@ -2418,8 +2418,34 @@ app.get('/:id/events', (c) => {
|
|
|
2418
2418
|
// optional: scope to a session view. Session views also include
|
|
2419
2419
|
// workspace-level rows where session_id IS NULL (legacy/pre-session items).
|
|
2420
2420
|
const session = c.req.query('session');
|
|
2421
|
+
// Optional, narrow history to one child. Nested tool calls keep their
|
|
2422
|
+
// parent origin, so match both that origin and their own toolCallId.
|
|
2423
|
+
const subagentToolCallId = c.req.query('subagentToolCallId');
|
|
2424
|
+
const subagentThreadIds = (c.req.query('subagentThreadIds') ?? '')
|
|
2425
|
+
.split(',')
|
|
2426
|
+
.map((threadId) => threadId.trim())
|
|
2427
|
+
.filter(Boolean)
|
|
2428
|
+
.slice(0, 50);
|
|
2421
2429
|
const parsedLimit = parseInt(c.req.query('limit') ?? '100', 10);
|
|
2422
2430
|
const limit = Math.max(1, Math.min(Number.isFinite(parsedLimit) ? parsedLimit : 100, 500));
|
|
2431
|
+
const sessionClause = session ? ' AND (session_id = ? OR session_id IS NULL)' : '';
|
|
2432
|
+
const sessionParams = session ? [session] : [];
|
|
2433
|
+
const originPayload = "CASE WHEN json_valid(payload) THEN payload ELSE '{}' END";
|
|
2434
|
+
const originClauses = [];
|
|
2435
|
+
const originParams = [];
|
|
2436
|
+
if (subagentToolCallId) {
|
|
2437
|
+
originClauses.push(`(json_extract(${originPayload}, '$.origin.toolCallId') = ? OR json_extract(${originPayload}, '$.toolCallId') = ?)`);
|
|
2438
|
+
originParams.push(subagentToolCallId, subagentToolCallId);
|
|
2439
|
+
}
|
|
2440
|
+
if (subagentThreadIds.length > 0) {
|
|
2441
|
+
originClauses.push(`json_extract(${originPayload}, '$.origin.threadId') IN (${subagentThreadIds.map(() => '?').join(', ')})`);
|
|
2442
|
+
originParams.push(...subagentThreadIds);
|
|
2443
|
+
}
|
|
2444
|
+
const originClause = originClauses.length
|
|
2445
|
+
? ` AND type = 'agent:event' AND json_extract(${originPayload}, '$.origin.kind') = 'subagent' AND (${originClauses.join(' OR ')})`
|
|
2446
|
+
: '';
|
|
2447
|
+
const scopedClause = `${sessionClause}${originClause}`;
|
|
2448
|
+
const scopedParams = [...sessionParams, ...originParams];
|
|
2423
2449
|
const db = getDb();
|
|
2424
2450
|
let rows;
|
|
2425
2451
|
if (around) {
|
|
@@ -2427,13 +2453,9 @@ app.get('/:id/events', (c) => {
|
|
|
2427
2453
|
if (!targetRow)
|
|
2428
2454
|
return c.json({ events: [], hasMore: false });
|
|
2429
2455
|
const halfWindow = Math.floor(limit / 2);
|
|
2430
|
-
rows =
|
|
2431
|
-
?
|
|
2432
|
-
|
|
2433
|
-
.all(id, session, targetRow.rowid - halfWindow, targetRow.rowid + halfWindow)
|
|
2434
|
-
: db
|
|
2435
|
-
.prepare('SELECT * FROM ws_events WHERE workspace_id = ? AND rowid BETWEEN ? AND ? ORDER BY rowid ASC')
|
|
2436
|
-
.all(id, targetRow.rowid - halfWindow, targetRow.rowid + halfWindow);
|
|
2456
|
+
rows = db
|
|
2457
|
+
.prepare(`SELECT * FROM ws_events WHERE workspace_id = ?${scopedClause} AND rowid BETWEEN ? AND ? ORDER BY rowid ASC`)
|
|
2458
|
+
.all(id, ...scopedParams, targetRow.rowid - halfWindow, targetRow.rowid + halfWindow);
|
|
2437
2459
|
}
|
|
2438
2460
|
else if (before) {
|
|
2439
2461
|
// Get the rowid of the cursor event
|
|
@@ -2441,25 +2463,17 @@ app.get('/:id/events', (c) => {
|
|
|
2441
2463
|
if (!cursorRow) {
|
|
2442
2464
|
return c.json({ events: [], hasMore: false });
|
|
2443
2465
|
}
|
|
2444
|
-
rows =
|
|
2445
|
-
?
|
|
2446
|
-
|
|
2447
|
-
.all(id, session, cursorRow.rowid, limit)
|
|
2448
|
-
: db
|
|
2449
|
-
.prepare('SELECT * FROM ws_events WHERE workspace_id = ? AND rowid < ? ORDER BY rowid DESC LIMIT ?')
|
|
2450
|
-
.all(id, cursorRow.rowid, limit);
|
|
2466
|
+
rows = db
|
|
2467
|
+
.prepare(`SELECT * FROM ws_events WHERE workspace_id = ?${scopedClause} AND rowid < ? ORDER BY rowid DESC LIMIT ?`)
|
|
2468
|
+
.all(id, ...scopedParams, cursorRow.rowid, limit);
|
|
2451
2469
|
}
|
|
2452
2470
|
else {
|
|
2453
2471
|
// No cursor — return events. When filtering by session, we want the
|
|
2454
2472
|
// MOST RECENT events of that session first (so the feed renders from
|
|
2455
2473
|
// the end), reversed to chronological order below.
|
|
2456
|
-
rows =
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
.all(id, session, limit)
|
|
2460
|
-
: db
|
|
2461
|
-
.prepare('SELECT * FROM ws_events WHERE workspace_id = ? ORDER BY rowid DESC LIMIT ?')
|
|
2462
|
-
.all(id, limit);
|
|
2474
|
+
rows = db
|
|
2475
|
+
.prepare(`SELECT * FROM ws_events WHERE workspace_id = ?${scopedClause} ORDER BY rowid DESC LIMIT ?`)
|
|
2476
|
+
.all(id, ...scopedParams, limit);
|
|
2463
2477
|
}
|
|
2464
2478
|
// Reverse to chronological order (we queried DESC for "before" pagination,
|
|
2465
2479
|
// or for the "session + no cursor" case where we fetched the newest first).
|
|
@@ -2488,13 +2502,9 @@ app.get('/:id/events', (c) => {
|
|
|
2488
2502
|
if (before || around) {
|
|
2489
2503
|
const firstRow = db.prepare('SELECT rowid FROM ws_events WHERE id = ?').get(rows[0].id);
|
|
2490
2504
|
if (firstRow) {
|
|
2491
|
-
const older =
|
|
2492
|
-
?
|
|
2493
|
-
|
|
2494
|
-
.get(id, session, firstRow.rowid)
|
|
2495
|
-
: db
|
|
2496
|
-
.prepare('SELECT 1 as c FROM ws_events WHERE workspace_id = ? AND rowid < ? LIMIT 1')
|
|
2497
|
-
.get(id, firstRow.rowid);
|
|
2505
|
+
const older = db
|
|
2506
|
+
.prepare(`SELECT 1 as c FROM ws_events WHERE workspace_id = ?${scopedClause} AND rowid < ? LIMIT 1`)
|
|
2507
|
+
.get(id, ...scopedParams, firstRow.rowid);
|
|
2498
2508
|
hasMore = older !== undefined;
|
|
2499
2509
|
}
|
|
2500
2510
|
}
|
|
@@ -2502,11 +2512,9 @@ app.get('/:id/events', (c) => {
|
|
|
2502
2512
|
// `LIMIT 1 OFFSET <page size>` answers "is there anything past this
|
|
2503
2513
|
// page?" by reading one row, where COUNT(*) walked every event the
|
|
2504
2514
|
// workspace ever produced — on each page, synchronously.
|
|
2505
|
-
const beyond =
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
.get(id, session, rows.length)
|
|
2509
|
-
: db.prepare('SELECT 1 as c FROM ws_events WHERE workspace_id = ? LIMIT 1 OFFSET ?').get(id, rows.length);
|
|
2515
|
+
const beyond = db
|
|
2516
|
+
.prepare(`SELECT 1 as c FROM ws_events WHERE workspace_id = ?${scopedClause} LIMIT 1 OFFSET ?`)
|
|
2517
|
+
.get(id, ...scopedParams, rows.length);
|
|
2510
2518
|
hasMore = beyond !== undefined;
|
|
2511
2519
|
}
|
|
2512
2520
|
}
|
|
@@ -94,6 +94,8 @@ const TASK_UPDATED_TERMINAL_STATUS = {
|
|
|
94
94
|
};
|
|
95
95
|
export function createMapperState() {
|
|
96
96
|
return {
|
|
97
|
+
childMessageOrigins: new Map(),
|
|
98
|
+
childToolOrigins: new Map(),
|
|
97
99
|
sessionStartedEmitted: false,
|
|
98
100
|
openMessages: new Map(),
|
|
99
101
|
sawErrorResult: false,
|
|
@@ -147,6 +149,37 @@ function tryEmitQuotaError(state, events, message) {
|
|
|
147
149
|
* `state` as needed.
|
|
148
150
|
*/
|
|
149
151
|
export function mapSdkMessage(msg, state) {
|
|
152
|
+
const parsed = msg;
|
|
153
|
+
const parentId = typeof parsed.parent_tool_use_id === 'string' ? parsed.parent_tool_use_id : undefined;
|
|
154
|
+
const origin = parentId ? { kind: 'subagent', toolCallId: parentId } : undefined;
|
|
155
|
+
const streamed = parsed.event;
|
|
156
|
+
if (origin && streamed?.type === 'message_start' && streamed.message?.id) {
|
|
157
|
+
state.childMessageOrigins.set(streamed.message.id, origin);
|
|
158
|
+
}
|
|
159
|
+
const events = mapSdkMessagePayload(msg, state);
|
|
160
|
+
return events.map((event) => {
|
|
161
|
+
if (event.kind === 'message:text' || event.kind === 'message:thinking' || event.kind === 'message:end') {
|
|
162
|
+
const eventOrigin = origin ?? state.childMessageOrigins.get(event.messageId);
|
|
163
|
+
if (origin)
|
|
164
|
+
state.childMessageOrigins.set(event.messageId, origin);
|
|
165
|
+
if (event.kind === 'message:end')
|
|
166
|
+
state.childMessageOrigins.delete(event.messageId);
|
|
167
|
+
return eventOrigin ? { ...event, origin: eventOrigin } : event;
|
|
168
|
+
}
|
|
169
|
+
if (event.kind === 'tool:call') {
|
|
170
|
+
if (origin)
|
|
171
|
+
state.childToolOrigins.set(event.toolCallId, origin);
|
|
172
|
+
return origin ? { ...event, origin } : event;
|
|
173
|
+
}
|
|
174
|
+
if (event.kind === 'tool:result') {
|
|
175
|
+
const eventOrigin = origin ?? state.childToolOrigins.get(event.toolCallId);
|
|
176
|
+
state.childToolOrigins.delete(event.toolCallId);
|
|
177
|
+
return eventOrigin ? { ...event, origin: eventOrigin } : event;
|
|
178
|
+
}
|
|
179
|
+
return event;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
function mapSdkMessagePayload(msg, state) {
|
|
150
183
|
// Treat as a generic record — the SDK discriminated union is too broad to
|
|
151
184
|
// narrow per branch here.
|
|
152
185
|
const parsed = msg;
|
|
@@ -276,7 +276,16 @@ export function createCodexEngine() {
|
|
|
276
276
|
}
|
|
277
277
|
// Child output remains visible, but its failures/compaction/markers
|
|
278
278
|
// cannot control the parent session or its auto-loop lifecycle.
|
|
279
|
-
return map(state)
|
|
279
|
+
return map(state)
|
|
280
|
+
.filter((event) => event.kind !== 'error' && !event.kind.startsWith('session:'))
|
|
281
|
+
.map((event) => {
|
|
282
|
+
const origin = { kind: 'subagent', threadId: notification.threadId };
|
|
283
|
+
if (event.kind === 'message:text' || event.kind === 'message:thinking' || event.kind === 'message:end')
|
|
284
|
+
return { ...event, origin };
|
|
285
|
+
if (event.kind === 'tool:call' || event.kind === 'tool:result')
|
|
286
|
+
return { ...event, origin };
|
|
287
|
+
return event;
|
|
288
|
+
});
|
|
280
289
|
};
|
|
281
290
|
const itemKey = (threadId, turnId, itemId) => JSON.stringify([threadId, turnId, itemId]);
|
|
282
291
|
const client = createAppServerClient({
|
|
@@ -134,6 +134,7 @@ export function handleItemStarted(item, state) {
|
|
|
134
134
|
events.push({
|
|
135
135
|
kind: 'subagent:progress',
|
|
136
136
|
toolCallId,
|
|
137
|
+
threadIds: item.receiverThreadIds,
|
|
137
138
|
status: 'running',
|
|
138
139
|
description: item.prompt ?? item.tool,
|
|
139
140
|
taskType: item.tool,
|
|
@@ -271,6 +272,7 @@ export function handleItemCompleted(item, state) {
|
|
|
271
272
|
events.push({
|
|
272
273
|
kind: 'subagent:progress',
|
|
273
274
|
toolCallId,
|
|
275
|
+
threadIds: item.receiverThreadIds,
|
|
274
276
|
status: hasActiveAgent ? 'running' : 'done',
|
|
275
277
|
description: item.prompt ?? item.tool,
|
|
276
278
|
taskType: item.tool,
|
|
@@ -8,19 +8,30 @@ export function createStreamingBatcher(emit, options = {}) {
|
|
|
8
8
|
return;
|
|
9
9
|
clearTimeout(entry.timer);
|
|
10
10
|
pending.delete(messageId);
|
|
11
|
-
emit({
|
|
11
|
+
emit({
|
|
12
|
+
kind: 'message:text',
|
|
13
|
+
messageId,
|
|
14
|
+
text: entry.text,
|
|
15
|
+
streaming: true,
|
|
16
|
+
...(entry.origin ? { origin: entry.origin } : {}),
|
|
17
|
+
});
|
|
12
18
|
};
|
|
13
19
|
return {
|
|
14
20
|
push(event) {
|
|
15
21
|
if (event.kind === 'message:text' && event.streaming) {
|
|
16
|
-
|
|
22
|
+
let entry = pending.get(event.messageId);
|
|
23
|
+
if (entry &&
|
|
24
|
+
(entry.origin?.toolCallId !== event.origin?.toolCallId || entry.origin?.threadId !== event.origin?.threadId)) {
|
|
25
|
+
flush(event.messageId);
|
|
26
|
+
entry = undefined;
|
|
27
|
+
}
|
|
17
28
|
if (entry) {
|
|
18
29
|
entry.text += event.text;
|
|
19
30
|
return;
|
|
20
31
|
}
|
|
21
32
|
const timer = setTimeout(() => flush(event.messageId), windowMs);
|
|
22
33
|
timer.unref?.();
|
|
23
|
-
pending.set(event.messageId, { text: event.text, timer });
|
|
34
|
+
pending.set(event.messageId, { text: event.text, origin: event.origin, timer });
|
|
24
35
|
return;
|
|
25
36
|
}
|
|
26
37
|
if (event.kind === 'message:end')
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
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",
|
|
@@ -81,12 +81,12 @@
|
|
|
81
81
|
"security:scan": "node scripts/scan-secrets.mjs"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"@anthropic-ai/claude-agent-sdk": "^0.3.
|
|
84
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.287",
|
|
85
85
|
"@emnapi/core": "^1.11.3",
|
|
86
86
|
"@emnapi/runtime": "^1.11.3",
|
|
87
87
|
"@hono/node-server": "^2.1.3",
|
|
88
88
|
"@modelcontextprotocol/sdk": "^1.31.0",
|
|
89
|
-
"@openai/codex": "^0.159.
|
|
89
|
+
"@openai/codex": "^0.159.3",
|
|
90
90
|
"better-sqlite3": "^13.0.3",
|
|
91
91
|
"cron-parser": "^5.10.1",
|
|
92
92
|
"hono": "^4.13.12",
|
|
@@ -97,16 +97,16 @@
|
|
|
97
97
|
"devDependencies": {
|
|
98
98
|
"@biomejs/biome": "2.5.14",
|
|
99
99
|
"@types/better-sqlite3": "^9.6.0",
|
|
100
|
-
"@types/node": "^26.6.
|
|
100
|
+
"@types/node": "^26.6.4",
|
|
101
101
|
"@types/ws": "^8.18.2",
|
|
102
102
|
"@vitest/runner": "^4.1.11",
|
|
103
103
|
"concurrently": "^10.0.5",
|
|
104
104
|
"tsx": "^4.23.15",
|
|
105
105
|
"typescript": "^7.0.2",
|
|
106
|
-
"vitest": "^5.0.
|
|
106
|
+
"vitest": "^5.0.3"
|
|
107
107
|
},
|
|
108
108
|
"overrides": {
|
|
109
109
|
"@hono/node-server": "^2.1.3",
|
|
110
|
-
"shell-quote": "^1.
|
|
110
|
+
"shell-quote": "^1.11.0"
|
|
111
111
|
}
|
|
112
112
|
}
|
|
@@ -0,0 +1 @@
|
|
|
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,T as m,Y as h,_ as g,d as _,f as v,g as y,j as b,k as x,l as S,p as C,r as w,u as T,y as E,z as ee}from"./runtime-core.esm-bundler-DOiZcasU.js";import{T as te,Y as ne,l as re,lt as ie,mt as D,nt as ae,t as O,x as oe}from"./QBtn-b_baQtAt.js";import{l as se,n as ce,o as le,t as ue}from"./latest-request-CBPb8UWQ.js";import{a as de}from"./i18n-DKj-umtn.js";import{O as fe,Rt as pe,T as me,Vt as k,ct as he,g as ge,jt as A,nt as _e,p as ve,rt as ye}from"./index-BPmUmc6D.js";import{t as be}from"./QSpinnerDots-BsKmccpX.js";import{t as xe}from"./QList-DnezW6gW.js";import{t as Se}from"./QMarkupTable-wuDf50Oh.js";import{c as j,l as M,s as N}from"./QSelect-BskTzVCM.js";import{t as P}from"./QItemSection-CR3Kfibl.js";import{t as Ce}from"./QExpansionItem-C2XXHOHk.js";import{a as F,r as I,t as L}from"./ToolCallItem-CjXWiKJc.js";import{t as we}from"./QScrollArea-BnmQ9US7.js";import{a as R}from"./use-tours-Dum-bOyQ.js";import{f as Te,g as z,m as Ee,p as De,u as Oe}from"./use-worktree-restore-BQyoz3Qa.js";import{t as B}from"./QTooltip-CO84H0cq.js";import{n as ke}from"./render-chat-markdown-CafzCcmu.js";import{n as V}from"./WorkspacePage-B0wCQdev.js";function H(e,t){return s(`div`,e,[s(`table`,{class:`q-table`},t)])}var Ae={list:xe,table:Se},je=[`list`,`table`,`__qtable`],Me=ae({name:`QVirtualScroll`,props:{...M,type:{type:String,default:`list`,validator:e=>je.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:k},setup(e,{slots:n,attrs:r}){let i,a=t(null),o=S(()=>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}=j({virtualScrollLength:o,getVirtualScrollTarget:y,getVirtualScrollEl:v}),h=S(()=>{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=S(()=>`q-virtual-scroll q-virtual-scroll`+(e.virtualScrollHorizontal?`--horizontal`:`--vertical`)+(e.scrollTarget===void 0?` scroll`:``)),_=S(()=>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 y(){return i}function C(){let t=v();t!==null&&(i=pe(t,e.scrollTarget),i.addEventListener(`scroll`,m,ne.passive))}function w(){i!==void 0&&(i.removeEventListener(`scroll`,m,ne.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)),oe(n.after,t)}return u(),p(()=>{C()}),x(()=>{C()}),d(()=>{w()}),b(()=>{w()}),()=>{if(n.default===void 0){console.error(`QVirtualScroll: default scoped slot is required for rendering`);return}return e.type===`__qtable`?H({ref:a,class:`q-table__middle `+g.value,tabindex:0},T()):s(Ae[e.type],{...r,ref:a,class:[r.class,g.value],..._.value},T)}}}),U=new Set([`setup`,`cleanup`,`archive`]);function Ne(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:U.has(e.sender)||me(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function Pe(e){let t=[],n=null,r=null;for(let i of e){let e=Ne(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 Fe(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 Ie(e){let t=e.items[0];return`${e.speaker}:${t?Fe(t):`empty`}`}function Le(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 Re(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 W={class:`agent-error-item`},ze={class:`agent-error-item__body`},Be={class:`agent-error-item__title`},Ve={class:`agent-error-item__message`},G=R(E({__name:`AgentErrorItem`,props:{item:{}},setup(e){let t=e,{te:r}=de(),i=S(()=>{let e=`agent.error.${t.item.category}`;return r(e)?e:`agent.error.other`});return(t,r)=>(u(),C(`div`,W,[g(re,{name:`error_outline`,size:`16px`,class:`agent-error-item__icon`}),T(`div`,ze,[T(`div`,Be,n(t.$t(i.value)),1),T(`div`,Ve,n(e.item.message),1)])]))}}),[[`__scopeId`,`data-v-e98c3c02`]]),He={class:`text-caption text-kobo-3`},Ue=E({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,r=S(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return z(t.item.detail);case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(u(),C(`span`,He,n(e.$t(r.value)),1))}}),K=new Map;function We(){for(let e of K.values())e.controller.abort(),e.blobUrl&&URL.revokeObjectURL(e.blobUrl);K.clear()}typeof window<`u`&&(window.addEventListener(`kobo:auth-token-changed`,We),window.addEventListener(`storage`,e=>{(e.key===`kobo:network-token`||e.key===null)&&We()}));function q(e){if(!/^\/api\/workspaces\/[^/]+\/images\/file\?path=/.test(e))throw Error(`Invalid workspace image URL`);let t=K.get(e);if(!t){let n=new AbortController,r={references:0,controller:n,ready:Promise.resolve(``)};r.ready=le(e,{signal:n.signal}).then(async e=>{if(!e.ok)throw await se(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,K.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),K.get(e)===r&&K.delete(e)))}}}function J(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=q(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 Ge(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 Ke=[`innerHTML`],qe=[`innerHTML`],Je=[`src`],Ye=R(E({__name:`UserMessageItem`,props:{item:{},workspaceId:{}},setup(t){let n=t,{t:r}=de(),a=S(()=>n.item.sender===`system-prompt`),s=J(S(()=>{let e=Ge(n.item.content,n.workspaceId);return ke(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 m=e=>{(e.key===`kobo:network-token`||e.key===null)&&p()};window.addEventListener(`storage`,m),window.addEventListener(`kobo:auth-token-changed`,p),i(()=>{p(),window.removeEventListener(`kobo:auth-token-changed`,p),window.removeEventListener(`storage`,m)});function y(e){let t=e.target;if(t?.tagName!==`IMG`)return;let n=t;n.src&&(p(),n.dataset.koboImageUrl&&(f=q(n.dataset.koboImageUrl),f.ready.catch(p)),c.value=n.src,d.value=!0)}return(t,n)=>(u(),C(w,null,[a.value?(u(),_(Ce,{key:0,dense:``,"dense-toggle":``,label:t.$t(`chat.systemPrompt`),"header-class":`text-kobo-2 text-caption`},{default:h(()=>[T(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:e(s)},null,8,Ke)]),_:1},8,[`label`])):(u(),C(`div`,{key:1,class:`markdown-message`,onClick:y},[T(`div`,{innerHTML:e(s)},null,8,qe)])),g(A,{modelValue:d.value,"onUpdate:modelValue":n[1]||=e=>d.value=e},{default:h(()=>[c.value?(u(),C(`img`,{key:0,src:c.value,alt:``,class:`image-lightbox-img`,onClick:n[0]||=e=>d.value=!1},null,8,Je)):v(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-db2fc622`]]),Xe=[`data-event-ids`],Ze={class:`turn-header`},Y={key:0,class:`turn-time`},Qe={class:`turn-time turn-time-updated`},X={key:2,class:`turn-actions`},$e={class:`turn-body`},Z={class:`q-px-sm q-pb-sm`},et={key:0,class:`turn-scroll-top`},tt=R(E({__name:`TurnCard`,props:{turn:{},workspaceId:{},highlighted:{type:Boolean}},emits:[`scrollTo`],setup(t,{emit:i}){let s=t,c=i,{t:l}=de(),d=m(F),f=o(null);function p(){let e=f.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 b=S(()=>{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:me(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 x(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 E=S(()=>x(s.turn.ts)),te=S(()=>s.turn.items.flatMap(e=>e.eventIds??[]).join(` `)),ne=S(()=>{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}),ie=S(()=>{let e=s.turn.ts,t=ne.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?``:x(t,r-n<6e4)}),ae=S(()=>ie.value!==``),oe=S(()=>{let e=[];for(let t of s.turn.items){let n=(t.type===`text`||t.type===`thinking`||t.type===`tool`)&&t.origin?.kind===`subagent`,r=e.at(-1);if(n&&r?.type===`subagent`){r.items.push(t);continue}if(n){e.push({type:`subagent`,key:`subagent:${Fe(t)}`,items:[t]});continue}e.push({type:`item`,key:Fe(t),item:t})}return e});function se(e){e.origin&&d?.({origin:e.origin})}let ce=S(()=>s.turn.items.filter(e=>e.type===`tool`).length);return(i,o)=>(u(),C(`div`,{ref_key:`cardEl`,ref:f,class:a([`turn-card`,{"turn-card--user":t.turn.speaker===`user`,"turn-card--highlighted":t.highlighted}]),"data-event-ids":te.value,style:r({"--turn-accent":b.value.accent})},[T(`div`,Ze,[T(`span`,{class:a([`turn-badge`,b.value.badgeClass])},n(b.value.label),3),E.value?(u(),C(`span`,Y,n(E.value),1)):v(``,!0),ae.value?(u(),C(w,{key:1},[g(re,{name:`arrow_forward`,size:`10px`,color:`kobo-3`,class:`turn-time-arrow`}),T(`span`,Qe,[y(n(ie.value)+` `,1),g(B,null,{default:h(()=>[y(n(e(l)(`chat.lastUpdatedAt`,{time:ie.value})),1)]),_:1})])],64)):v(``,!0),ce.value>0?(u(),C(`span`,X,` · `+n(e(l)(`chat.nActions`,{n:ce.value})),1)):v(``,!0)]),T(`div`,$e,[(u(!0),C(w,null,ee(oe.value,r=>(u(),C(w,{key:r.key},[r.type===`subagent`?(u(),_(Ce,{key:0,class:`turn-subagent-activity`,dense:``,label:e(l)(`chat.subagentActivity`),caption:e(l)(`chat.nActions`,{n:r.items.length}),"default-opened":t.highlighted&&r.items.some(e=>e.eventIds?.some(e=>te.value.includes(e)))},{header:h(()=>[g(P,null,{default:h(()=>[g(N,null,{default:h(()=>[y(n(e(l)(`chat.subagentActivity`)),1)]),_:1}),g(N,{caption:``},{default:h(()=>[y(n(e(l)(`chat.nActions`,{n:r.items.length})),1)]),_:2},1024)]),_:2},1024),g(P,{side:``},{default:h(()=>[g(O,{flat:``,round:``,dense:``,size:`sm`,icon:`open_in_new`,"aria-label":e(l)(`chat.openSubagentActivity`),onClick:D(e=>se(r.items[0]),[`stop`])},{default:h(()=>[g(B,null,{default:h(()=>[y(n(e(l)(`chat.openSubagentActivity`)),1)]),_:1})]),_:1},8,[`aria-label`,`onClick`])]),_:2},1024)]),default:h(()=>[T(`div`,Z,[(u(!0),C(w,null,ee(r.items,t=>(u(),C(w,{key:e(Fe)(t)},[t.type===`text`?(u(),_(I,{key:0,item:t},null,8,[`item`])):t.type===`thinking`?(u(),_(V,{key:1,item:t},null,8,[`item`])):t.type===`tool`?(u(),_(L,{key:2,item:t},null,8,[`item`])):v(``,!0)],64))),128))])]),_:2},1032,[`label`,`caption`,`default-opened`])):(u(),C(w,{key:1},[r.item.type===`text`?(u(),_(I,{key:0,item:r.item},null,8,[`item`])):r.item.type===`thinking`?(u(),_(V,{key:1,item:r.item},null,8,[`item`])):r.item.type===`tool`?(u(),_(L,{key:2,item:r.item},null,8,[`item`])):r.item.type===`user`?(u(),_(Ye,{key:3,item:r.item,"workspace-id":t.workspaceId},null,8,[`item`,`workspace-id`])):r.item.type===`session`?(u(),_(Ue,{key:4,item:r.item},null,8,[`item`])):r.item.type===`error`?(u(),_(G,{key:5,item:r.item},null,8,[`item`])):v(``,!0)],64))],64))),128))]),t.turn.items.length>4?(u(),C(`div`,et,[g(O,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`kobo-3`,class:`turn-scroll-top-btn`,onClick:p},{default:h(()=>[g(B,null,{default:h(()=>[y(n(e(l)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):v(``,!0)],14,Xe))}}),[[`__scopeId`,`data-v-a8a6fa27`]]),nt={key:0,class:`activity-feed-switching`},rt={key:1,class:`activity-feed-wrap`,"data-tour":`ws-chat`},it={key:0,role:`alert`,class:`q-pa-sm text-negative`},at={key:1,"data-testid":`history-load-error`,role:`alert`,class:`q-pa-sm text-negative`},ot=[`aria-label`],st={key:0,class:`activity-feed-compacting`},ct={class:`text-caption text-kobo-2`},lt={key:0,class:`text-center q-py-sm text-caption text-kobo-3`},ut={key:1,class:`activity-feed-empty q-pa-md`},dt={class:`activity-feed-empty__title`},ft={class:`activity-feed-empty__hint`},pt={key:2,class:`q-px-md q-pb-md`},mt={class:`activity-feed-nav-cluster`},ht=300,gt=60,_t=200,vt=180,yt=3,bt=60,Q=R(E({__name:`ActivityFeed`,props:{workspaceId:{}},setup(t){let{t:r}=de(),i=t,a=he(),s=fe(),d=_e(),m=ve(),b=S(()=>m.isCompacting(i.workspaceId)),x=S(()=>d.selectedSessionId),E=S(()=>d.sessions.find(e=>e.id===x.value)?.engineSessionId??null),ne=S(()=>{let e=d.sessions;return e.length!==0&&x.value===e[e.length-1].id});function D(e){return x.value?e?e===x.value||e===E.value:ne.value:!0}let ae=S(()=>(d.activityFeeds[i.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&D(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,source:ge(e.meta?.source),ts:e.timestamp,sessionId:e.sessionId,eventIds:[e.id]}))),oe=S(()=>{let e=d.workspaces.find(e=>e.id===i.workspaceId);return ye(e?.status)}),pe=Oe(),me=``,k=S(()=>{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++)D(n[i])&&(o.push(e[i]),c.push(t[i]),l.push(r[i]??null));let u=`${i.workspaceId}::${x.value??`*`}`;u!==me&&(pe=Oe(),me=u);let d=Te(pe,o,c,oe.value,l);return Pe(Ee(d,ae.value).filter(e=>e.type===`thinking`?!1:e.type===`session`?e.kind===`ended`?s.showVerboseSystemMessages||!De(e.detail):s.showVerboseSystemMessages:!0))}),A=S(()=>s.showVerboseSystemMessages?a.eventsFor(i.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),xe=S(()=>{for(let e=k.value.length-1;e>=0;e--){let t=k.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}),Se=o(``);l(xe,(e,t)=>{if(!e||e.key===t?.key)return;let n=e.key.startsWith(`text:`)?r(`activity.a11y.agentSaid`,{text:e.text.slice(0,ht)}):e.text;Se.value=n});let j=o(null),M=o(!0),N=o(!1),P=o(``),F=ue(),I=ue(),L=ue(),R=o(null),z=!1,B=!0,ke=null,V=o(new Set),H=new Map,Ae=S(()=>{if(k.value.length>0||A.value.length>0)return!1;let e=i.workspaceId,t=x.value;return!!d.loadingSessions[e]||m.isSyncPending(e)||t!==null&&V.value.has(W(e,t))}),je=o(new Map),U=S(()=>k.value.length>0||A.value.length>0),Ne=S(()=>!!d.loadingSessions[i.workspaceId]||m.isSyncPending(i.workspaceId)||x.value!==null&&V.value.has(W(i.workspaceId,x.value)));function Fe(e){let t=ke;if(ke=e.verticalSize,t!==null&&e.verticalSize>t&&M.value&&!N.value){q(0);return}let n=e.verticalSize-e.verticalPosition-e.verticalContainerSize;M.value=n<=gt,z&&e.verticalPosition<=_t&&!N.value&&!P.value&&ze()&&He()}function W(e,t){return`${e}:${t}`}function ze(){let e=x.value;return e?je.value.get(W(i.workspaceId,e))??!0:a.hasMoreOlderFor(i.workspaceId)}function Be(e,t,n){je.value.set(W(e,t),n)}function Ve(e){if(!x.value)return a.oldestIdFor(e);let t=a.eventIdsFor(e),n=a.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!D(n[e]))continue;let r=t[e];if(r)return r}}let G=null;function He(){if(G)return G;let e=We().finally(()=>{G===e&&(G=null)});return G=e,G}function Ue(){F.abort(),I.abort(),L.abort(),N.value=!1,G=null;for(let e of V.value)wt.delete(e);H.clear(),V.value.clear(),P.value=``}function K(){P.value=``,xt.value===0&&x.value?Tt():He()}l(()=>[i.workspaceId,x.value],Ue,{flush:`sync`});async function We(){let e=i.workspaceId,t=x.value,n=Ve(e);if(!n)return;let r=F.begin();P.value=``,N.value=!0;try{let i=j.value;if(await f(),!F.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 le(`/api/workspaces/${e}/events?${c.toString()}`,{signal:r});if(!l.ok)throw await se(l);let u=await l.json();if(!F.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&&Be(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:ge(n.source)}})}if(await f(),i&&F.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(ce(e)||!F.isCurrent(r))return;P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to load older events:`,e)}finally{F.isCurrent(r)&&(N.value=!1)}}async function q(e=0){let t=Ct();if(await f(),t!==Ct())return;let n=j.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<vt,t=Ct();J=requestAnimationFrame(()=>{J=null,t===Ct()&&(Ge=performance.now(),q(e?0:180))})}function qe(e){$(),M.value=!1;let t=j.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;$(),M.value=!1;let n=L.begin(),r=i.workspaceId;try{let e=new URLSearchParams({around:t.eventId,limit:`200`});t.sessionId&&e.set(`session`,t.sessionId);let o=await le(`/api/workspaces/${r}/events?${e}`,{signal:n});if(!o.ok)throw await se(o);let s=await o.json();if(!L.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:ge(t.source)}})}if(await Re(Ae,e=>!e,5e3),await f(),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e()))),!L.isCurrent(n))return;let p=k.value.findIndex(e=>e.items.some(e=>e.eventIds?.includes(t.eventId)??!1));if(p<0)return;R.value=t.eventId,Xe.value?.scrollTo(p,`center`),Y.value=p,window.setTimeout(()=>{R.value===t.eventId&&(R.value=null)},1800)}catch(e){if(ce(e)||!L.isCurrent(n))return;P.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 X=o(!1);async function $e(){if(X.value)return;$(),M.value=!1,X.value=!0;let e=i.workspaceId;try{let t=Le(k.value,Y.value);if(t<0)for(let n=0;n<15;n++){if(e!==i.workspaceId)return;if(!ze())break;let n=k.value.length;if(await He(),await f(),e!==i.workspaceId)return;if(Y.value+=k.value.length-n,t=Le(k.value,Y.value),t>=0)break}t>=0&&e===i.workspaceId&&(Xe.value?.scrollTo(t,`start`),Y.value=t)}finally{X.value=!1}}let Z=0;function et(){return new Promise(e=>requestAnimationFrame(()=>e()))}async function Q(){if(!B||!U.value||Ae.value)return;z=!1;let e=++Z;if(await f(),e!==Z||!B||(Ze.value=j.value?.getScrollTarget()??null,await f(),e!==Z||!B))return;k.value.length>0&&Xe.value?.scrollTo(k.value.length-1,`end-force`),await et();let t=-1,n=0;for(let r=0;r<bt&&n<yt;r++){if(e!==Z||!B)return;await q(0),await et();let r=j.value?.getScroll().verticalSize??0;ke=r,n=r===t?n+1:0,t=r}e===Z&&!Ne.value&&(z=!0,B=!1)}function $(){B=!1,!z&&(Z++,z=!0)}let xt=S(()=>{let e=a.sessionIdsFor(i.workspaceId);if(!x.value)return e.length;let t=0;for(let n of e)D(n)&&t++;return t});l(Ae,async e=>{!e&&U.value&&await Q(),e||f(()=>{Ze.value=j.value?.getScrollTarget()??null})}),l(Ne,(e,t)=>{!e&&t&&B&&U.value&&Q()}),p(()=>{window.addEventListener(`kobo:focus-history-event`,Ye),f(()=>{Ze.value=j.value?.getScrollTarget()??null}),U.value&&Q(),x.value&&Tt();let e=new URLSearchParams(window.location.hash.split(`?`)[1]??``).get(`eventId`);e&&(Ye(new CustomEvent(`kobo:focus-history-event`,{detail:{workspaceId:i.workspaceId,sessionId:x.value,eventId:e}})),Je())}),l([xt,()=>ae.value.length,()=>A.value.length],async([e,t,n])=>{N.value||B&&e+t+n>0&&await Q()});let St=S(()=>a.liveAppendCountFor(i.workspaceId,D)),Ct=()=>`${i.workspaceId}\u0000${d.selectedSessionId??``}`;l([St,Ct],([e,t],[n,r])=>{t===r&&e>n&&M.value&&!N.value&&Ke()}),c(()=>{Z++,B=!1,Ue(),window.removeEventListener(`kobo:focus-history-event`,Ye),J!=null&&(cancelAnimationFrame(J),J=null)}),l([()=>i.workspaceId,()=>d.selectedSessionId],()=>{Z++,B=!0,ke=null,M.value=!0,z=!1,Tt(),U.value&&Q()});let wt=new Set;async function Tt(){let e=i.workspaceId,t=x.value;if(!t||xt.value>0)return;let n=W(e,t);if(wt.has(n))return;wt.add(n),V.value.add(n);let r=I.begin();H.set(n,r),P.value=``;try{let n=await le(`/api/workspaces/${e}/events?session=${encodeURIComponent(t)}&limit=500`,{signal:r});if(!n.ok)throw await se(n);let i=await n.json();if(!I.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);Be(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:ge(n.source)}})}}catch(e){if(ce(e)||!I.isCurrent(r)){(!H.has(n)||H.get(n)===r)&&wt.delete(n);return}P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),wt.delete(n)}finally{H.get(n)===r&&(H.delete(n),V.value.delete(n))}}let Et=S(()=>ae.value.filter(e=>e.sender===`user`).length),Dt=S(()=>(d.activityFeeds[i.workspaceId]??[]).filter(e=>e.meta?.sender===`user`&&e.meta.pending&&D(e.sessionId)).length);l([Et,Dt,Ct],async([e,t,n],[r,i,a])=>{let o=t>i;n===a&&(o||e>r&&M.value&&!N.value&&!Ne.value)&&(M.value=!0,await q(o?180:0))});async function Ot(){M.value=!0,await q(250)}return(t,r)=>Ae.value?(u(),C(`div`,nt,[g(be,{size:`40px`,color:`primary`})])):(u(),C(`div`,rt,[e(d).sessionsErrors[i.workspaceId]?(u(),C(`div`,it,[y(n(t.$t(`activity.sessionsError`,{message:e(d).sessionsErrors[i.workspaceId]}))+` `,1),g(O,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:r[0]||=t=>e(d).fetchSessions(i.workspaceId)},null,8,[`label`])])):v(``,!0),P.value?(u(),C(`div`,at,[y(n(t.$t(`activity.historyError`,{message:P.value}))+` `,1),g(O,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:K},null,8,[`label`])])):v(``,!0),T(`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(Se.value),9,ot),g(ie,{name:`fade`},{default:h(()=>[b.value?(u(),C(`div`,st,[g(be,{size:`18px`,color:`primary`}),T(`span`,ct,n(t.$t(`activity.compacting`)),1)])):v(``,!0)]),_:1}),g(we,{ref_key:`scrollRef`,ref:j,class:`activity-feed-scroll`,onScroll:Fe,onWheelPassive:$,onTouchstartPassive:$,onKeydown:$},{default:h(()=>[N.value?(u(),C(`div`,lt,[g(te,{size:`sm`}),y(` `+n(t.$t(`activity.loading_older`)),1)])):v(``,!0),g(Me,{ref_key:`virtualScrollRef`,ref:Xe,class:`q-pa-md`,items:k.value,"scroll-target":Ze.value??void 0,"virtual-scroll-item-size":160,"virtual-scroll-slice-size":20,onVirtualScroll:Qe},{default:h(({item:t,index:n})=>[(u(),_(tt,{key:e(Ie)(t),turn:t,"workspace-id":i.workspaceId,"data-turn-index":n,highlighted:t.items.some(e=>e.eventIds?.includes(R.value??``)??!1),onScrollTo:qe},null,8,[`turn`,`workspace-id`,`data-turn-index`,`highlighted`]))]),_:1},8,[`items`,`scroll-target`]),k.value.length===0&&A.value.length===0&&!N.value?(u(),C(`div`,ut,[g(re,{name:`forum`,size:`28px`}),T(`div`,dt,n(t.$t(`activity.empty`)),1),T(`div`,ft,n(t.$t(`activity.emptyHint`)),1)])):v(``,!0),A.value.length?(u(),C(`div`,pt,[g(Ce,{label:t.$t(`activity.raw_lines`,{n:A.value.length}),dense:``},{default:h(()=>[(u(!0),C(w,null,ee(A.value,(e,t)=>(u(),C(`div`,{key:t,class:`text-caption text-kobo-3 q-pa-xs`},n(e),1))),128))]),_:1},8,[`label`])])):v(``,!0)]),_:1},512),T(`div`,mt,[M.value?v(``,!0):(u(),_(O,{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:Ot},null,8,[`title`,`aria-label`])),g(O,{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:X.value,disable:X.value,onClick:$e},null,8,[`title`,`aria-label`,`loading`,`disable`])])]))}}),[[`__scopeId`,`data-v-f3878c46`]]);export{Q as default};
|
|
@@ -0,0 +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-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-a8a6fa27]{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-a8a6fa27]{animation:1.8s ease-out search-highlight-a8a6fa27}@keyframes search-highlight-a8a6fa27{0%,45%{box-shadow:0 0 0 2px #818cf8f2,0 0 22px #818cf873}to{box-shadow:none}}.turn-header[data-v-a8a6fa27]{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-a8a6fa27]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-a8a6fa27]{color:var(--kobo-turn-user);background:#ce93d826}.turn-badge-agent[data-v-a8a6fa27]{color:var(--kobo-turn-agent);background:#7986cb26}.turn-badge-system[data-v-a8a6fa27]{color:var(--kobo-text-2);background:#75757533;font-style:italic}.turn-badge-session[data-v-a8a6fa27]{color:var(--kobo-text-3);background:#61616133}.turn-badge-script[data-v-a8a6fa27]{color:var(--kobo-success);background:#4db6ac26}.turn-time[data-v-a8a6fa27]{color:var(--kobo-text-disabled);font-family:var(--kobo-font-mono);font-size:11px}.turn-time-arrow[data-v-a8a6fa27]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-a8a6fa27]{color:var(--kobo-text-3)}.turn-actions[data-v-a8a6fa27]{color:var(--kobo-text-3);font-size:11px}.turn-body[data-v-a8a6fa27]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-a8a6fa27]>*{min-width:0;max-width:100%}.turn-body[data-v-a8a6fa27] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-a8a6fa27]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-a8a6fa27]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-a8a6fa27]: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}
|
|
@@ -1 +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-
|
|
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-CBPb8UWQ.js";import{Jt as _,Kt as v,i as y}from"./index-BPmUmc6D.js";import{a as b,i as x,n as S}from"./use-tours-Dum-bOyQ.js";import{n as C}from"./render-chat-markdown-CafzCcmu.js";import{t as w}from"./QChip-Chu7r6RZ.js";import{t as T}from"./QPage-BCDXjfVj.js";import{t as E}from"./DrawerToggleButton-DKytIBlk.js";import{t as D}from"./TourReplayButton-DhbNI6O5.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};
|
package/src/client/dist/pwa/assets/{ComparisonPanel-Bv2SZrVZ.js → ComparisonPanel-CfmJHeH_.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{dt as e,st as t,v as n}from"./reactivity.esm-bundler-tuEvQ47f.js";import{J as r,L as i,P as ee,Y as a,_ as o,d as te,f as s,g as c,l,p as u,r as ne,u as d,y as f,z as re}from"./runtime-core.esm-bundler-DOiZcasU.js";import{t as p}from"./QBtn-b_baQtAt.js";import{o as m}from"./latest-request-
|
|
1
|
+
import{dt as e,st as t,v as n}from"./reactivity.esm-bundler-tuEvQ47f.js";import{J as r,L as i,P as ee,Y as a,_ as o,d as te,f as s,g as c,l,p as u,r as ne,u as d,y as f,z as re}from"./runtime-core.esm-bundler-DOiZcasU.js";import{t as p}from"./QBtn-b_baQtAt.js";import{o as m}from"./latest-request-CBPb8UWQ.js";import{a as h}from"./i18n-DKj-umtn.js";import{i as ie,nt as ae}from"./index-BPmUmc6D.js";import{t as oe}from"./QMarkupTable-wuDf50Oh.js";import{a as g,i as _}from"./use-tours-Dum-bOyQ.js";var v=[`workspace`,`engine`,`model`,`status`,`branch`,`tasks_done`,`tasks_total`,`commits`,`files_changed`,`insertions`,`deletions`,`agent_messages`,`user_messages`,`injected_prompts`,`questions`,`tool_calls`,`errors`,`input_tokens`,`output_tokens`,`sessions`,`duration_seconds`];function y(e){if(e==null)return``;let t=String(e);return/[",\r\n]/.test(t)?`"${t.replace(/"/g,`""`)}"`:t}function b(e){let t=e.map(e=>{let t=e.gitStats,n=e.activity;return[e.workspace.name,e.workspace.engine,e.workspace.model,e.workspace.status,e.workspace.workingBranch,e.tasks.done,e.tasks.total,t?.commitCount??null,t?.filesChanged??null,t?.insertions??null,t?.deletions??null,n.agentMessages,n.userMessages,n.injectedPrompts,n.questions,n.toolCalls,n.errors,n.inputTokens,n.outputTokens,n.sessions,Math.round(n.durationMs/1e3)].map(y).join(`,`)});return`${[v.join(`,`),...t].join(`\r
|
|
2
2
|
`)}`}var x={key:0,class:`comparison-panel q-pa-md`},S={class:`row items-center q-mb-sm`},C={class:`text-subtitle2`},w={class:`text-caption text-kobo-3 q-mb-sm`},T={class:`text-left`},E={class:`text-left`},D={class:`text-right`},O={class:`text-right`},k={class:`text-right`},A={class:`text-right`},j={class:`text-right`},M={class:`text-right`},N={class:`text-right`},P={class:`text-right`},F={class:`text-right`},I={class:`text-right`},L={class:`text-right`},R={class:`text-caption text-kobo-3 comparison-mono`},z={key:0,class:`text-caption text-kobo-3`},B={class:`text-right comparison-mono`},V={class:`text-right`},H={class:`text-right`},U={class:`text-right`},se={key:0,class:`comparison-mono`},W={class:`text-kobo-success`},G={class:`text-kobo-danger q-ml-xs`},K={key:1,class:`text-kobo-3`},ce={class:`text-right comparison-mono`},le=[`title`],ue={class:`text-right`},de={class:`text-right`},fe={class:`text-right comparison-mono`},pe=[`title`],me={class:`text-right`},he={class:`text-right comparison-mono`},ge={class:`text-right`},_e={key:1,class:`text-caption text-kobo-3`},ve={key:0,class:`text-caption text-kobo-warning q-mt-sm`},q=g(f({__name:`ComparisonPanel`,props:{workspaceId:{}},setup(f){let g=f;function v(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function y(e){if(e<=0)return`-`;let t=Math.round(e/1e3);if(t<60)return J(`reliability.durationSeconds`,{s:t});let n=Math.floor(t/60);return n<60?J(`reliability.durationMinutes`,{m:n,s:t%60}):J(`reliability.durationHours`,{h:Math.floor(n/60),m:n%60})}let q=ie(),ye=ae(),{t:J}=h(),Y=n([]),X=n(!1),be={created:`workspaceStatus.created`,extracting:`workspaceStatus.extracting`,brainstorming:`workspaceStatus.brainstorming`,executing:`workspaceStatus.executing`,compacting:`workspaceStatus.compacting`,"awaiting-user":`workspaceStatus.awaitingUser`,completed:`workspaceStatus.completed`,idle:`workspaceStatus.idle`,error:`workspaceStatus.error`,quota:`workspaceStatus.quota`,retrying:`workspaceStatus.retrying`},Z=n({});function xe(e){return Z.value[e]??e}async function Se(){try{let e=await m(`/api/engines`);if(!e.ok)return;let t=await e.json();Z.value=Object.fromEntries(t.map(e=>[e.id,e.displayName]))}catch{}}function Ce(e){let t=be[e];return t?J(t):e}let we=l(()=>g.workspaceId);function Q(e){return e.workspace.id===we.value}function Te(e){ye.selectWorkspace(e),q.push({name:`workspace`,params:{id:e}})}function Ee(){let e=b(Y.value),t=new Blob([e],{type:`text/csv;charset=utf-8`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`kobo-comparison-${Y.value[0]?.workspace.comparisonId??`comparison`}.csv`,r.click(),URL.revokeObjectURL(n)}async function $(){X.value=!0;try{let e=await m(`/api/workspaces/${g.workspaceId}/comparison`);if(!e.ok){Y.value=[];return}let t=await e.json();Y.value=t.members??[]}catch{Y.value=[]}finally{X.value=!1}}return ee(()=>{Se(),$()}),r(()=>g.workspaceId,$),(n,r)=>Y.value.length>0?(i(),u(`div`,x,[d(`div`,S,[d(`div`,C,e(n.$t(`comparison.title`)),1),o(_),o(p,{flat:``,dense:``,round:``,size:`sm`,icon:`download`,title:n.$t(`comparison.exportCsv`),onClick:Ee},null,8,[`title`]),o(p,{flat:``,dense:``,round:``,size:`sm`,icon:`refresh`,loading:X.value,onClick:$},null,8,[`loading`])]),d(`div`,w,e(n.$t(`comparison.hint`)),1),o(oe,{flat:``,dense:``,dark:``,class:`comparison-table`},{default:a(()=>[d(`thead`,null,[d(`tr`,null,[d(`th`,T,e(n.$t(`comparison.engine`)),1),d(`th`,E,e(n.$t(`comparison.status`)),1),d(`th`,D,e(n.$t(`comparison.tasks`)),1),d(`th`,O,e(n.$t(`comparison.commits`)),1),d(`th`,k,e(n.$t(`comparison.files`)),1),d(`th`,A,e(n.$t(`comparison.diff`)),1),d(`th`,j,e(n.$t(`comparison.messages`)),1),d(`th`,M,e(n.$t(`comparison.questions`)),1),d(`th`,N,e(n.$t(`comparison.tools`)),1),d(`th`,P,e(n.$t(`comparison.errors`)),1),d(`th`,F,e(n.$t(`comparison.tokens`)),1),d(`th`,I,e(n.$t(`comparison.sessions`)),1),d(`th`,L,e(n.$t(`comparison.duration`)),1),r[0]||=d(`th`,null,null,-1)])]),d(`tbody`,null,[(i(!0),u(ne,null,re(Y.value,r=>(i(),u(`tr`,{key:r.workspace.id,class:t({"comparison-current":Q(r)})},[d(`td`,null,[d(`div`,null,e(xe(r.workspace.engine)),1),d(`div`,R,e(r.workspace.model),1)]),d(`td`,null,[c(e(Ce(r.workspace.status))+` `,1),r.workspace.archivedAt?(i(),u(`span`,z,` · `+e(n.$t(`comparison.archived`)),1)):s(``,!0)]),d(`td`,B,e(r.tasks.done)+`/`+e(r.tasks.total),1),d(`td`,V,e(r.gitStats?.commitCount??`-`),1),d(`td`,H,e(r.gitStats?.filesChanged??`-`),1),d(`td`,U,[r.gitStats?(i(),u(`span`,se,[d(`span`,W,`+`+e(r.gitStats.insertions),1),d(`span`,G,`-`+e(r.gitStats.deletions),1)])):(i(),u(`span`,K,`-`))]),d(`td`,ce,[d(`span`,{title:n.$t(`comparison.messagesTitle`)},e(r.activity.agentMessages)+` / `+e(r.activity.userMessages),9,le)]),d(`td`,ue,e(r.activity.questions),1),d(`td`,de,e(r.activity.toolCalls),1),d(`td`,{class:t([`text-right`,r.activity.errors>0?`text-kobo-danger`:``])},e(r.activity.errors),3),d(`td`,fe,[d(`span`,{title:n.$t(`comparison.tokensTitle`)},e(v(r.activity.inputTokens))+` / `+e(v(r.activity.outputTokens)),9,pe)]),d(`td`,me,e(r.activity.sessions),1),d(`td`,he,e(y(r.activity.durationMs)),1),d(`td`,ge,[Q(r)?(i(),u(`span`,_e,e(n.$t(`comparison.current`)),1)):(i(),te(p,{key:0,flat:``,dense:``,"no-caps":``,size:`sm`,label:n.$t(`comparison.open`),onClick:e=>Te(r.workspace.id)},null,8,[`label`,`onClick`]))])],2))),128))])]),_:1}),Y.value.length<2?(i(),u(`div`,ve,e(n.$t(`comparison.incomplete`)),1)):s(``,!0)])):s(``,!0)}}),[[`__scopeId`,`data-v-bda71e6d`]]);export{q as default};
|