@loicngr/kobo 2.1.10 → 2.1.12
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/AGENTS.md +30 -3
- package/CHANGELOG.md +8 -0
- package/CONFIGURATION.md +32 -3
- package/dist/server/services/agent/engines/claude-code/engine.js +184 -47
- package/dist/server/services/sentry-service.js +13 -3
- package/dist/server/services/settings-service.js +4 -0
- package/dist/server/services/workspace-template-service.js +37 -3
- package/dist/server/utils/mcp-client.js +33 -3
- package/package.json +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-BTRzc60o.js +2 -0
- package/src/client/dist/pwa/assets/{ChangelogPage-DkoB2IEa.js → ChangelogPage-DD90Nl6c.js} +1 -1
- package/src/client/dist/pwa/assets/ComparisonPanel-D_BQFWiT.js +2 -0
- package/src/client/dist/pwa/assets/{CreatePage-Com5PQPV.js → CreatePage-BZAoCukb.js} +2 -2
- package/src/client/dist/pwa/assets/CreatePage-CdCs8PRS.css +1 -0
- package/src/client/dist/pwa/assets/{DashboardPage-DOeZUleS.js → DashboardPage-DyvTdmBg.js} +1 -1
- package/src/client/dist/pwa/assets/{DiffViewer-Bke40k8T.js → DiffViewer-D0K2PlZD.js} +4 -4
- package/src/client/dist/pwa/assets/{DocumentsPanel-CO16-Q1X.js → DocumentsPanel-bm639sIu.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-fjWJjVF_.js → DrawerToggleButton-KfwSzjeY.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-C-Ejlc9_.js +3 -0
- package/src/client/dist/pwa/assets/{GitPanel-C3blk_Pd.css → GitPanel-CNFtj6k0.css} +1 -1
- package/src/client/dist/pwa/assets/HealthPage-37IHOIW-.js +1 -0
- package/src/client/dist/pwa/assets/HealthPage-Cnlhrn--.css +1 -0
- package/src/client/dist/pwa/assets/{MainLayout-DAcSwgUw.css → MainLayout-BQOOup9o.css} +1 -1
- package/src/client/dist/pwa/assets/MainLayout-DXQ1ouYl.js +2 -0
- package/src/client/dist/pwa/assets/{MemoryPanel-DKp9mn5X.js → MemoryPanel-CucZMhjy.js} +1 -1
- package/src/client/dist/pwa/assets/{MemoryProposalList-B3v7marz.js → MemoryProposalList-CUQybzVR.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnDropdown-a6q0PVGm.js → QBtnDropdown-x6qPyl_7.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-2fylQBjy.js → QExpansionItem-D33aoRoG.js} +1 -1
- package/src/client/dist/pwa/assets/{QScrollArea-I9pplcfM.js → QScrollArea-Di-D6t2u.js} +1 -1
- package/src/client/dist/pwa/assets/QSelect-MdPXvwm4.js +1 -0
- package/src/client/dist/pwa/assets/{QTooltip-fzzd3anS.js → QTooltip-BhwG7lp2.js} +1 -1
- package/src/client/dist/pwa/assets/SchedulePanel-AugvL_tp.css +1 -0
- package/src/client/dist/pwa/assets/SchedulePanel-qFi9Wxzh.js +1 -0
- package/src/client/dist/pwa/assets/{SearchPage-CGul0ui9.js → SearchPage-DA9nRmsA.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-C1dcMqCO.css → SettingsPage-BRvUAZ5r.css} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-DcV6apqE.js +9 -0
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-DxifLUAa.js → SplitWorkspacePage-Brw2XsYJ.js} +1 -1
- package/src/client/dist/pwa/assets/{TerminalPanel-CRo3ETg_.js → TerminalPanel-DVP18-nk.js} +9 -9
- package/src/client/dist/pwa/assets/{ToolCallItem-i60zEGsY.js → ToolCallItem-cSHh3p_F.js} +3 -3
- package/src/client/dist/pwa/assets/{TouchPan-DjFq7Kjf.js → TouchPan-C6LZZ3rw.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-DmEgJ_5R.js → TourReplayButton-Czlqo18H.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-B9LE8HtU.css +1 -0
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-BDYGq0pC.js +1 -0
- package/src/client/dist/pwa/assets/WorkspacePage-BwUkijpS.js +4 -0
- package/src/client/dist/pwa/assets/{WorkspacePage-Ba0jAHhn.css → WorkspacePage-Bwfv559o.css} +1 -1
- package/src/client/dist/pwa/assets/{browser-3unJ6AQX.js → browser-ifCwUGpE.js} +1 -1
- package/src/client/dist/pwa/assets/{build-path-tree-CPo0G1mj.js → build-path-tree-BBkGq3lN.js} +1 -1
- package/src/client/dist/pwa/assets/custom-sounds-CeSgjIY7.js +1 -0
- package/src/client/dist/pwa/assets/{de-B3oUHpbN.js → de-CHY2BAfL.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-CMBx0cvf.js → editor.api-CV_seGJR.js} +1 -1
- package/src/client/dist/pwa/assets/{efforts-Bjrcpo2R.js → efforts-ttw0bL63.js} +2 -2
- package/src/client/dist/pwa/assets/{es-X1ki-Z2w.js → es-DbcSKp38.js} +1 -1
- package/src/client/dist/pwa/assets/{expand-template-cR43uBa5.js → expand-template-C8biMRXo.js} +1 -1
- package/src/client/dist/pwa/assets/{format-B1k_qdxW.js → format-Cu95dbxt.js} +1 -1
- package/src/client/dist/pwa/assets/{formatters-gz0Rg7Rw.js → formatters-C25D1RSd.js} +1 -1
- package/src/client/dist/pwa/assets/{fr-nkT5LuOx.js → fr-CyyJ8S2c.js} +1 -1
- package/src/client/dist/pwa/assets/{freemarker2-C8DHgbX4.js → freemarker2-DJEFr74q.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-BmEGWkcn.js → handlebars-C_lzsMjX.js} +1 -1
- package/src/client/dist/pwa/assets/{html-giJc-yQc.js → html-CWmLFAmY.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-CobVQiTM.js +1 -0
- package/src/client/dist/pwa/assets/{index-BjqJ45nb.js → index-ImUH7Bbt.js} +3 -3
- package/src/client/dist/pwa/assets/{it-Bfp_J8p0.js → it-XQJW2Xkr.js} +1 -1
- package/src/client/dist/pwa/assets/{javascript-CwQBOtjT.js → javascript-tsuiEUe-.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-BPEVDB8V.js → liquid-BBr9BvUk.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-DAa4McnC.js → mdx-gjBH1cXG.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-Ct4RhitT.js → monaco-contributions-CvGcBIsb.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco.contribution-BKnd0ZwH.js → monaco.contribution-Uw-Lfb8Z.js} +2 -2
- package/src/client/dist/pwa/assets/network-auth-D0Vm6a09.js +1 -0
- package/src/client/dist/pwa/assets/notify-theme-PMSxqP6t.js +1 -0
- package/src/client/dist/pwa/assets/{project-color-LZ5CKuTW.js → project-color-BDQa2TgU.js} +1 -1
- package/src/client/dist/pwa/assets/{python-D8xYERv8.js → python-DlIgD1n6.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-BnFyr836.js → razor-AraFPlpM.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-DW45V56c.js → typescript-CB8UpXHM.js} +1 -1
- package/src/client/dist/pwa/assets/{use-search-index-status-DzlqDFPy.js → use-search-index-status-CSREHQM4.js} +1 -1
- package/src/client/dist/pwa/assets/{use-tours-CErX5nL7.js → use-tours-6yxNVmjH.js} +2 -2
- package/src/client/dist/pwa/assets/use-worktree-restore-BM3Giig1.js +1 -0
- package/src/client/dist/pwa/assets/{workspace-templates-CKduJ2zA.js → workspace-templates-BPMFvTnQ.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-gQTv5O31.js → xml-uRjL1P43.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-B4TEYUEa.js → yaml-C9CFR4qV.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-CkiYsNd5.js +0 -2
- package/src/client/dist/pwa/assets/ComparisonPanel-DH9Q0XNK.js +0 -2
- package/src/client/dist/pwa/assets/CreatePage-C7fLOpai.css +0 -1
- package/src/client/dist/pwa/assets/GitPanel-BAgnXzXP.js +0 -3
- package/src/client/dist/pwa/assets/HealthPage-DR-ywiB2.js +0 -1
- package/src/client/dist/pwa/assets/HealthPage-DT8FGrKA.css +0 -1
- package/src/client/dist/pwa/assets/MainLayout-B1suu_Nn.js +0 -2
- package/src/client/dist/pwa/assets/QSelect-CWXNtFAO.js +0 -1
- package/src/client/dist/pwa/assets/SchedulePanel-4KNBIQvY.js +0 -1
- package/src/client/dist/pwa/assets/SchedulePanel-CBM_GpS3.css +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-_h4xQlof.js +0 -9
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-C7MLWyKy.js +0 -1
- package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-DSw8Upcp.css +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-Bw7yTZ3h.js +0 -4
- package/src/client/dist/pwa/assets/custom-sounds-C5fGFFdT.js +0 -1
- package/src/client/dist/pwa/assets/i18n-PAAy4Hkn.js +0 -1
- package/src/client/dist/pwa/assets/network-auth-S-KP7qhA.js +0 -1
- package/src/client/dist/pwa/assets/notify-theme-DIqeoflM.js +0 -1
- package/src/client/dist/pwa/assets/use-worktree-restore-BpaEGfds.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { callMcpTool, initializeMcp, readClaudeMcpEntry, spawnMcpProcess, unwrapMcpResult, } from '../utils/mcp-client.js';
|
|
1
|
+
import { callMcpTool, initializeMcp, listMcpToolNames, readClaudeMcpEntry, spawnMcpProcess, unwrapMcpResult, } from '../utils/mcp-client.js';
|
|
2
2
|
import { stopMcpProcess } from '../utils/mcp-process.js';
|
|
3
3
|
import { getIntegrationConfig } from './integration-config-service.js';
|
|
4
4
|
import { getGlobalSettings } from './settings-service.js';
|
|
@@ -23,7 +23,9 @@ export async function testSentryConnection() {
|
|
|
23
23
|
const mcpProcess = spawnMcpProcess(config.command, config.args, config.env);
|
|
24
24
|
try {
|
|
25
25
|
await initializeMcp(mcpProcess);
|
|
26
|
-
|
|
26
|
+
// whoami is not exposed by all Sentry MCP servers. Organization discovery
|
|
27
|
+
// verifies authenticated read access without requiring an issue or mutating it.
|
|
28
|
+
await callMcpTool(mcpProcess, 'find_organizations', {});
|
|
27
29
|
return {
|
|
28
30
|
ok: true,
|
|
29
31
|
durationMs: Date.now() - startedAt,
|
|
@@ -205,7 +207,15 @@ export async function assignSentryIssueToSelf(issueUrl) {
|
|
|
205
207
|
});
|
|
206
208
|
});
|
|
207
209
|
await initializeMcp(mcpProcess);
|
|
208
|
-
const
|
|
210
|
+
const tools = await listMcpToolNames(mcpProcess);
|
|
211
|
+
if (!tools.includes('whoami') && !tools.includes('execute_sentry_tool')) {
|
|
212
|
+
return { assigned: false, reason: 'Sentry MCP does not expose a current-user lookup tool' };
|
|
213
|
+
}
|
|
214
|
+
// Current Sentry servers expose identity through the tool catalogue;
|
|
215
|
+
// older servers still provide whoami directly. Never retry the write.
|
|
216
|
+
const whoamiRaw = tools.includes('whoami')
|
|
217
|
+
? await callMcpTool(mcpProcess, 'whoami', {})
|
|
218
|
+
: await callMcpTool(mcpProcess, 'execute_sentry_tool', { name: 'whoami', arguments: {} });
|
|
209
219
|
const whoami = unwrapMcpResult(whoamiRaw);
|
|
210
220
|
const userId = extractSentryUserId(whoami);
|
|
211
221
|
if (!userId) {
|
|
@@ -15,6 +15,7 @@ import { LEGACY_AGNOSTIC_AUTO_LOOP_REVIEW_GATE, LEGACY_AGNOSTIC_REVIEW_TEMPLATE,
|
|
|
15
15
|
import { DEFAULT_REVIEW_PROMPT_TEMPLATE } from './review-template-service.js';
|
|
16
16
|
import { DEFAULT_CHANGE_SOURCE_BRANCH_SCRIPT, DEFAULT_MODEL_BY_ENGINE, FRESH_MODEL_BY_ENGINE, } from './settings-defaults.js';
|
|
17
17
|
import { AGNOSTIC_PROMPTS } from './skill-suite-prompts.js';
|
|
18
|
+
import { pruneWorkspaceTemplateTags } from './workspace-template-service.js';
|
|
18
19
|
export const STANDARD_GIT_CONVENTIONS = `Follow the repository's existing Git conventions and the user's instructions.
|
|
19
20
|
Work locally by default. Commit, push, publish comments or open pull requests only when explicitly authorized.
|
|
20
21
|
Inspect git status and all staged, unstaged and untracked changes before staging. Preserve unrelated work.
|
|
@@ -1408,6 +1409,7 @@ export function importConfigBundle(bundle) {
|
|
|
1408
1409
|
for (const key of SECRET_GLOBAL_KEYS) {
|
|
1409
1410
|
migrated.global[key] = current.global[key];
|
|
1410
1411
|
}
|
|
1412
|
+
pruneWorkspaceTemplateTags(migrated.global.tags);
|
|
1411
1413
|
writeSettings(migrated, { backup: true });
|
|
1412
1414
|
}
|
|
1413
1415
|
/** Return only the global settings section. */
|
|
@@ -1727,6 +1729,8 @@ export function updateGlobalSettings(input) {
|
|
|
1727
1729
|
filtered.worktreesPath = validateWorktreesPath(filtered.worktreesPath, { allowEmpty: false });
|
|
1728
1730
|
ensureGlobalWorktreesRootExists(filtered.worktreesPath);
|
|
1729
1731
|
}
|
|
1732
|
+
if (filtered.tags !== undefined)
|
|
1733
|
+
pruneWorkspaceTemplateTags(filtered.tags);
|
|
1730
1734
|
settings.global = { ...settings.global, ...filtered };
|
|
1731
1735
|
writeSettings(settings, { backup: true });
|
|
1732
1736
|
return settings.global;
|
|
@@ -3,6 +3,7 @@ import { nanoid } from 'nanoid';
|
|
|
3
3
|
import { getDb } from '../db/index.js';
|
|
4
4
|
import { writeJsonFileAtomically } from '../utils/atomic-json-file.js';
|
|
5
5
|
import { getWorkspaceTemplatesPath } from '../utils/paths.js';
|
|
6
|
+
import { getGlobalSettings } from './settings-service.js';
|
|
6
7
|
const FILE_VERSION = 1;
|
|
7
8
|
export const MAX_WORKSPACE_TEMPLATES = 100;
|
|
8
9
|
const MAX_NAME_LENGTH = 80;
|
|
@@ -44,6 +45,14 @@ export function sanitizePreset(input) {
|
|
|
44
45
|
if (Array.isArray(raw[key]))
|
|
45
46
|
preset[key] = raw[key].filter((v) => typeof v === 'string');
|
|
46
47
|
}
|
|
48
|
+
if (Array.isArray(raw.tags)) {
|
|
49
|
+
preset.tags = [
|
|
50
|
+
...new Set(raw.tags
|
|
51
|
+
.filter((tag) => typeof tag === 'string')
|
|
52
|
+
.map((tag) => tag.trim())
|
|
53
|
+
.filter((tag) => tag.length > 0 && tag.length <= 50)),
|
|
54
|
+
];
|
|
55
|
+
}
|
|
47
56
|
if (typeof raw.agentPermissionMode === 'string' &&
|
|
48
57
|
PERMISSION_MODES.includes(raw.agentPermissionMode)) {
|
|
49
58
|
preset.agentPermissionMode = raw.agentPermissionMode;
|
|
@@ -97,7 +106,32 @@ function writeFile(templates) {
|
|
|
97
106
|
writeJsonFileAtomically(getWorkspaceTemplatesPath(), file);
|
|
98
107
|
}
|
|
99
108
|
export function listWorkspaceTemplates() {
|
|
100
|
-
return readFile();
|
|
109
|
+
return readFile().map((template) => ({ ...template, preset: sanitizeTemplatePreset(template.preset) }));
|
|
110
|
+
}
|
|
111
|
+
/** Guard writes from stale clients as well as reads of hand-edited/older files. */
|
|
112
|
+
function sanitizeTemplatePreset(input) {
|
|
113
|
+
const preset = sanitizePreset(input);
|
|
114
|
+
if (preset.tags !== undefined) {
|
|
115
|
+
const allowed = new Set(getGlobalSettings().tags);
|
|
116
|
+
preset.tags = preset.tags.filter((tag) => allowed.has(tag));
|
|
117
|
+
}
|
|
118
|
+
return preset;
|
|
119
|
+
}
|
|
120
|
+
/** Called before persisting a changed catalogue; a corrupt file aborts deletion. */
|
|
121
|
+
export function pruneWorkspaceTemplateTags(allowedTags) {
|
|
122
|
+
const allowed = new Set(allowedTags);
|
|
123
|
+
let changed = false;
|
|
124
|
+
const templates = readFile().map((template) => {
|
|
125
|
+
if (template.preset.tags === undefined)
|
|
126
|
+
return template;
|
|
127
|
+
const tags = template.preset.tags.filter((tag) => allowed.has(tag));
|
|
128
|
+
if (tags.length === template.preset.tags.length)
|
|
129
|
+
return template;
|
|
130
|
+
changed = true;
|
|
131
|
+
return { ...template, preset: { ...template.preset, tags }, updatedAt: new Date().toISOString() };
|
|
132
|
+
});
|
|
133
|
+
if (changed)
|
|
134
|
+
writeFile(templates);
|
|
101
135
|
}
|
|
102
136
|
/** Throws `Invalid template name`, `already exists` or `Too many templates`. */
|
|
103
137
|
export function createWorkspaceTemplate(input) {
|
|
@@ -116,7 +150,7 @@ export function createWorkspaceTemplate(input) {
|
|
|
116
150
|
name,
|
|
117
151
|
createdAt: now,
|
|
118
152
|
updatedAt: now,
|
|
119
|
-
preset:
|
|
153
|
+
preset: sanitizeTemplatePreset(input.preset),
|
|
120
154
|
};
|
|
121
155
|
writeFile([...templates, template]);
|
|
122
156
|
return template;
|
|
@@ -139,7 +173,7 @@ export function updateWorkspaceTemplate(id, updates) {
|
|
|
139
173
|
const updated = {
|
|
140
174
|
...current,
|
|
141
175
|
name,
|
|
142
|
-
preset: updates.preset !== undefined ?
|
|
176
|
+
preset: sanitizeTemplatePreset(updates.preset !== undefined ? updates.preset : current.preset),
|
|
143
177
|
updatedAt: new Date().toISOString(),
|
|
144
178
|
};
|
|
145
179
|
templates[index] = updated;
|
|
@@ -147,12 +147,42 @@ export async function initializeMcp(mcpProcess) {
|
|
|
147
147
|
}
|
|
148
148
|
/** Send a JSON-RPC tools/call request and return the raw result (30s timeout). */
|
|
149
149
|
export async function callMcpTool(mcpProcess, toolName, args) {
|
|
150
|
+
return requestMcp(mcpProcess, 'tools/call', { name: toolName, arguments: args }, `callMcpTool('${toolName}')`);
|
|
151
|
+
}
|
|
152
|
+
/** Discover direct tools, including paginated servers, without executing them. */
|
|
153
|
+
export async function listMcpToolNames(mcpProcess) {
|
|
154
|
+
const names = [];
|
|
155
|
+
const cursors = new Set();
|
|
156
|
+
let cursor;
|
|
157
|
+
for (let page = 0; page < 100; page++) {
|
|
158
|
+
const raw = await requestMcp(mcpProcess, 'tools/list', cursor ? { cursor } : {}, 'listMcpToolNames');
|
|
159
|
+
if (!raw || typeof raw !== 'object' || !('tools' in raw) || !Array.isArray(raw.tools)) {
|
|
160
|
+
throw new Error('Invalid MCP tool catalogue');
|
|
161
|
+
}
|
|
162
|
+
for (const tool of raw.tools) {
|
|
163
|
+
if (!tool || typeof tool !== 'object' || typeof tool.name !== 'string') {
|
|
164
|
+
throw new Error('Invalid MCP tool catalogue');
|
|
165
|
+
}
|
|
166
|
+
names.push(tool.name);
|
|
167
|
+
}
|
|
168
|
+
const next = 'nextCursor' in raw ? raw.nextCursor : undefined;
|
|
169
|
+
if (next === undefined)
|
|
170
|
+
return names;
|
|
171
|
+
if (typeof next !== 'string' || !next || cursors.has(next)) {
|
|
172
|
+
throw new Error('Invalid MCP tool catalogue pagination');
|
|
173
|
+
}
|
|
174
|
+
cursors.add(next);
|
|
175
|
+
cursor = next;
|
|
176
|
+
}
|
|
177
|
+
throw new Error('MCP tool catalogue pagination limit exceeded');
|
|
178
|
+
}
|
|
179
|
+
async function requestMcp(mcpProcess, method, params, label) {
|
|
150
180
|
const id = nextRpcId();
|
|
151
181
|
const request = JSON.stringify({
|
|
152
182
|
jsonrpc: '2.0',
|
|
153
183
|
id,
|
|
154
|
-
method
|
|
155
|
-
params
|
|
184
|
+
method,
|
|
185
|
+
params,
|
|
156
186
|
});
|
|
157
187
|
return new Promise((resolve, reject) => {
|
|
158
188
|
if (!mcpProcess.stdin || !mcpProcess.stdout) {
|
|
@@ -164,7 +194,7 @@ export async function callMcpTool(mcpProcess, toolName, args) {
|
|
|
164
194
|
mcpProcess.stdout?.removeListener('data', onData);
|
|
165
195
|
mcpProcess.stdout?.removeListener('error', onError);
|
|
166
196
|
stopMcpProcess(mcpProcess);
|
|
167
|
-
reject(new Error(
|
|
197
|
+
reject(new Error(`${label} timed out after 30s`));
|
|
168
198
|
}, 30_000);
|
|
169
199
|
const onData = (chunk) => {
|
|
170
200
|
buffer += chunk.toString();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.12",
|
|
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",
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{M as e,S as t,dt as n,lt as r,p as i,pt as a,v as o}from"./reactivity.esm-bundler-DY1JkAEA.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 ee,k as b,l as x,p as S,r as C,u as w,y as T,z as te}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{$ as ne,K as re,M as E,f as ie,z as ae}from"./dom-BtYTvLeN.js";import{l as oe,t as D,u as se}from"./QBtn-BUSdPaf4.js";import{Bt as ce,O as le,Qt as ue,Ut as de,Yt as fe,an as O,at as pe,cn as k,ft as me,j as he,m as ge,mt as _e,ot as ve,pt as ye,v as be}from"./index-ImUH7Bbt.js";import{t as xe}from"./QSpinnerDots-xdWyaE1i.js";import{t as Se}from"./QList-Cx1UfaUm.js";import{t as Ce}from"./QMarkupTable-UhP7fVUp.js";import{c as A,l as j,s as M}from"./QSelect-MdPXvwm4.js";import{t as N}from"./QItemSection-MdJ1_ZK7.js";import{t as we}from"./QExpansionItem-D33aoRoG.js";import{a as P,c as Te,r as F,t as I}from"./ToolCallItem-cSHh3p_F.js";import{t as Ee}from"./QScrollArea-Di-D6t2u.js";import{a as L}from"./use-tours-6yxNVmjH.js";import{f as De,g as R,m as Oe,p as ke,u as Ae}from"./use-worktree-restore-BM3Giig1.js";import{t as z}from"./QTooltip-BhwG7lp2.js";import{n as B}from"./render-chat-markdown-CafzCcmu.js";import{n as V}from"./WorkspacePage-BwUkijpS.js";function je(e,t){return s(`div`,e,[s(`table`,{class:`q-table`},t)])}var Me={list:Se,table:Ce},H=[`list`,`table`,`__qtable`],Ne=ae({name:`QVirtualScroll`,props:{...j,type:{type:String,default:`list`,validator:e=>H.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:k},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}=A({virtualScrollLength:o,getVirtualScrollTarget:y,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,()=>{C(),S()});function v(){let e=a.value;return e===null?null:e.$el||e}function y(){return i}function S(){let t=v();t!==null&&(i=O(t,e.scrollTarget),i.addEventListener(`scroll`,m,E.passive))}function C(){i!==void 0&&(i.removeEventListener(`scroll`,m,E.passive),i=void 0)}function w(){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(()=>{S()}),b(()=>{S()}),d(()=>{C()}),ee(()=>{C()}),()=>{if(n.default===void 0){console.error(`QVirtualScroll: default scoped slot is required for rendering`);return}return e.type===`__qtable`?je({ref:a,class:`q-table__middle `+g.value,tabindex:0},w()):s(Me[e.type],{...r,ref:a,class:[r.class,g.value],..._.value},w)}}}),Pe=new Set([`setup`,`cleanup`,`archive`]);function Fe(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:Pe.has(e.sender)||le(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function Ie(e){let t=[],n=null,r=null;for(let i of e){let e=Fe(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 U(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 Le(e){let t=e.items[0];return`${e.speaker}:${t?U(t):`empty`}`}function Re(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 ze(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 Be={class:`agent-error-item`},Ve={class:`agent-error-item__body`},He={class:`agent-error-item__title`},W={class:`agent-error-item__message`},Ue=L(T({__name:`AgentErrorItem`,props:{item:{}},setup(e){let t=e,{te:n}=fe(),r=x(()=>{let e=`agent.error.${t.item.category}`;return n(e)?e:`agent.error.other`});return(t,n)=>(u(),S(`div`,Be,[g(oe,{name:`error_outline`,size:`16px`,class:`agent-error-item__icon`}),w(`div`,Ve,[w(`div`,He,a(t.$t(r.value)),1),w(`div`,W,a(e.item.message),1)])]))}}),[[`__scopeId`,`data-v-e98c3c02`]]),We={class:`text-caption text-kobo-3`},Ge=T({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,n=x(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return R(t.item.detail);case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(u(),S(`span`,We,a(e.$t(n.value)),1))}}),G=new Map;function K(){for(let e of G.values())e.controller.abort(),e.blobUrl&&URL.revokeObjectURL(e.blobUrl);G.clear()}typeof window<`u`&&(window.addEventListener(`kobo:auth-token-changed`,K),window.addEventListener(`storage`,e=>{(e.key===`kobo:network-token`||e.key===null)&&K()}));function q(e){if(!/^\/api\/workspaces\/[^/]+\/images\/file\?path=/.test(e))throw Error(`Invalid workspace image URL`);let t=G.get(e);if(!t){let n=new AbortController,r={references:0,controller:n,ready:Promise.resolve(``)};r.ready=ce(e,{signal:n.signal}).then(async e=>{if(!e.ok)throw await de(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,G.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),G.get(e)===r&&G.delete(e)))}}}function Ke(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 qe(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 Je=[`innerHTML`],Ye=[`innerHTML`],Xe=[`src`],J=L(T({__name:`UserMessageItem`,props:{item:{},workspaceId:{}},setup(t){let n=t,{t:r}=fe(),a=x(()=>n.item.sender===`system-prompt`),s=Ke(x(()=>{let e=qe(n.item.content,n.workspaceId);return B(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(),S(C,null,[a.value?(u(),_(we,{key:0,dense:``,"dense-toggle":``,label:t.$t(`chat.systemPrompt`),"header-class":`text-kobo-2 text-caption`},{default:h(()=>[w(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:e(s)},null,8,Je)]),_:1},8,[`label`])):(u(),S(`div`,{key:1,class:`markdown-message`,onClick:y},[w(`div`,{innerHTML:e(s)},null,8,Ye)])),g(ue,{modelValue:d.value,"onUpdate:modelValue":n[1]||=e=>d.value=e},{default:h(()=>[c.value?(u(),S(`img`,{key:0,src:c.value,alt:``,class:`image-lightbox-img`,onClick:n[0]||=e=>d.value=!1},null,8,Xe)):v(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-db2fc622`]]),Ze=[`data-event-ids`],Y={class:`turn-header`},Qe={key:0,class:`turn-time`},$e={class:`turn-time turn-time-updated`},X={key:2,class:`turn-actions`},et={class:`turn-body`},tt={class:`ellipsis`},nt={class:`q-px-sm q-pb-sm`},rt={key:0,class:`turn-scroll-top`},it=L(T({__name:`TurnCard`,props:{turn:{},workspaceId:{},highlighted:{type:Boolean}},emits:[`scrollTo`],setup(t,{emit:i}){let s=t,c=i,{t:l}=fe(),d=pe(),f=m(P),p=o(null);function ee(){let e=p.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=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:le(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 T(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 re=x(()=>T(s.turn.ts)),E=x(()=>s.turn.items.flatMap(e=>e.eventIds??[]).join(` `)),ie=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}),ae=x(()=>{let e=s.turn.ts,t=ie.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?``:T(t,r-n<6e4)}),se=x(()=>ae.value!==``);function ce(e){return Te(e.origin,Object.values(d.subagents[s.workspaceId]??{}),e.type===`tool`?e.toolCallId:void 0)}function ue(e){return e||l(`chat.subagentActivity`)}function de(e){return(e.type===`text`||e.type===`thinking`||e.type===`tool`)&&e.origin?.kind===`subagent`}let O=x(()=>{let e=[],t=new Map;for(let n of s.turn.items){if(!de(n)){e.push({type:`item`,key:U(n),item:n});continue}let r=ce(n),i=r?.toolUseId??n.origin?.toolCallId??n.origin?.threadId??U(n),a=t.get(i);if(a){a.items.push(n);continue}let o={type:`subagent`,key:`subagent:${U(n)}`,items:[n],subagentKey:i,subagentName:r?.description||null};t.set(i,o),e.push(o)}return e});function k(e){e.origin&&f?.({origin:e.origin})}let me=x(()=>s.turn.items.filter(e=>e.type===`tool`).length);return(i,o)=>(u(),S(`div`,{ref_key:`cardEl`,ref:p,class:r([`turn-card`,{"turn-card--user":t.turn.speaker===`user`,"turn-card--highlighted":t.highlighted}]),"data-event-ids":E.value,style:n({"--turn-accent":b.value.accent})},[w(`div`,Y,[w(`span`,{class:r([`turn-badge`,b.value.badgeClass])},a(b.value.label),3),re.value?(u(),S(`span`,Qe,a(re.value),1)):v(``,!0),se.value?(u(),S(C,{key:1},[g(oe,{name:`arrow_forward`,size:`10px`,color:`kobo-3`,class:`turn-time-arrow`}),w(`span`,$e,[y(a(ae.value)+` `,1),g(z,null,{default:h(()=>[y(a(e(l)(`chat.lastUpdatedAt`,{time:ae.value})),1)]),_:1})])],64)):v(``,!0),me.value>0?(u(),S(`span`,X,` · `+a(e(l)(`chat.nActions`,{n:me.value})),1)):v(``,!0)]),w(`div`,et,[(u(!0),S(C,null,te(O.value,n=>(u(),S(C,{key:n.key},[n.type===`subagent`?(u(),_(we,{key:0,class:`turn-subagent-activity`,dense:``,label:ue(n.subagentName),caption:e(l)(`chat.nActions`,{n:n.items.length}),"default-opened":t.highlighted&&n.items.some(e=>e.eventIds?.some(e=>E.value.includes(e)))},{header:h(()=>[g(N,null,{default:h(()=>[g(M,{class:`row items-center no-wrap`,title:n.subagentName??void 0},{default:h(()=>[g(oe,{name:`hub`,size:`16px`,class:`q-mr-xs`},{default:h(()=>[g(z,null,{default:h(()=>[y(a(e(l)(`chat.subagentActivity`)),1)]),_:1})]),_:1}),w(`span`,tt,a(ue(n.subagentName)),1)]),_:2},1032,[`title`]),g(M,{caption:``},{default:h(()=>[y(a(e(l)(`chat.nActions`,{n:n.items.length})),1)]),_:2},1024)]),_:2},1024),g(N,{side:``},{default:h(()=>[g(D,{flat:``,round:``,dense:``,size:`sm`,icon:`open_in_new`,"aria-label":e(l)(`chat.openSubagentActivity`),onClick:ne(e=>k(n.items[0]),[`stop`])},{default:h(()=>[g(z,null,{default:h(()=>[y(a(e(l)(`chat.openSubagentActivity`)),1)]),_:1})]),_:1},8,[`aria-label`,`onClick`])]),_:2},1024)]),default:h(()=>[w(`div`,nt,[(u(!0),S(C,null,te(n.items,t=>(u(),S(C,{key:e(U)(t)},[t.type===`text`?(u(),_(F,{key:0,item:t},null,8,[`item`])):t.type===`thinking`?(u(),_(V,{key:1,item:t},null,8,[`item`])):t.type===`tool`?(u(),_(I,{key:2,item:t},null,8,[`item`])):v(``,!0)],64))),128))])]),_:2},1032,[`label`,`caption`,`default-opened`])):(u(),S(C,{key:1},[n.item.type===`text`?(u(),_(F,{key:0,item:n.item},null,8,[`item`])):n.item.type===`thinking`?(u(),_(V,{key:1,item:n.item},null,8,[`item`])):n.item.type===`tool`?(u(),_(I,{key:2,item:n.item},null,8,[`item`])):n.item.type===`user`?(u(),_(J,{key:3,item:n.item,"workspace-id":t.workspaceId},null,8,[`item`,`workspace-id`])):n.item.type===`session`?(u(),_(Ge,{key:4,item:n.item},null,8,[`item`])):n.item.type===`error`?(u(),_(Ue,{key:5,item:n.item},null,8,[`item`])):v(``,!0)],64))],64))),128))]),t.turn.items.length>4?(u(),S(`div`,rt,[g(D,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`kobo-3`,class:`turn-scroll-top-btn`,onClick:ee},{default:h(()=>[g(z,null,{default:h(()=>[y(a(e(l)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):v(``,!0)],14,Ze))}}),[[`__scopeId`,`data-v-13bebb3d`]]),at={key:0,class:`activity-feed-switching`},ot={key:1,class:`activity-feed-wrap`,"data-tour":`ws-chat`},st={key:0,role:`alert`,class:`q-pa-sm text-negative`},ct={key:1,"data-testid":`history-load-error`,role:`alert`,class:`q-pa-sm text-negative`},lt=[`aria-label`],ut={key:0,class:`activity-feed-compacting`},dt={class:`text-caption text-kobo-2`},ft={key:0,class:`text-center q-py-sm text-caption text-kobo-3`},pt={key:1,class:`activity-feed-empty q-pa-md`},mt={class:`activity-feed-empty__title`},ht={class:`activity-feed-empty__hint`},gt={key:2,class:`q-px-md q-pb-md`},_t=[`title`],vt={class:`ellipsis`},yt={class:`activity-feed-nav-cluster`},bt=300,xt=60,St=200,Ct=180,wt=255,Tt=3,Et=60,Dt=L(T({__name:`ActivityFeed`,props:{workspaceId:{}},setup(t){let{t:n}=fe(),r=t,i=_e(),s=he(),d=pe(),m=ge(),ee=x(()=>m.isCompacting(r.workspaceId)),b=x(()=>d.selectedSessionId),T=x(()=>d.sessions.find(e=>e.id===b.value)?.engineSessionId??null),ne=x(()=>{let e=d.sessions;return e.length!==0&&b.value===e[e.length-1].id});function E(e){return b.value?e?e===b.value||e===T.value:ne.value:!0}let ie=x(()=>(d.activityFeeds[r.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&E(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,source:be(e.meta?.source),ts:e.timestamp,sessionId:e.sessionId,eventIds:[e.id]}))),ae=x(()=>{let e=d.workspaces.find(e=>e.id===r.workspaceId);return ve(e?.status)}),le=Ae(),ue=``,O=x(()=>{let e=i.eventsFor(r.workspaceId),t=i.timestampsFor(r.workspaceId),n=i.sessionIdsFor(r.workspaceId),a=i.eventIdsFor(r.workspaceId),o=[],c=[],l=[];for(let r=0;r<e.length;r++)E(n[r])&&(o.push(e[r]),c.push(t[r]),l.push(a[r]??null));let u=`${r.workspaceId}::${b.value??`*`}`;u!==ue&&(le=Ae(),ue=u);let d=De(le,o,c,ae.value,l);return Ie(Oe(d,ie.value).filter(e=>e.type===`thinking`?!1:e.type===`session`?e.kind===`ended`?s.showVerboseSystemMessages||!ke(e.detail):s.showVerboseSystemMessages:!0))}),k=x(()=>s.showVerboseSystemMessages?i.eventsFor(r.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),Se=x(()=>{for(let e=O.value.length-1;e>=0;e--){let t=O.value[e]?.items??[];for(let e=t.length-1;e>=0;e--){let r=t[e];if(r){if(r.type===`text`&&!r.streaming)return{key:`text:${r.messageId}`,text:r.text};if(r.type===`tool`)return r.result?{key:`tool:${r.toolCallId}:end`,text:r.result.isError?n(`activity.a11y.toolFailed`,{name:r.name}):n(`activity.a11y.toolFinished`,{name:r.name})}:{key:`tool:${r.toolCallId}:start`,text:n(`activity.a11y.toolStarted`,{name:r.name})}}}}return null}),Ce=o(``);l(Se,(e,t)=>{if(!e||e.key===t?.key)return;let r=e.key.startsWith(`text:`)?n(`activity.a11y.agentSaid`,{text:e.text.slice(0,bt)}):e.text;Ce.value=r});let A=o(null),j=o(!0),M=o(!1),N=o(``),P=me(),Te=me(),F=me(),I=o(null),L=!1,R=!0,z=null,B=o(new Set),V=new Map,je=x(()=>{if(O.value.length>0||k.value.length>0)return!1;let e=r.workspaceId,t=b.value;return!!d.loadingSessions[e]||m.isSyncPending(e)||t!==null&&B.value.has(U(e,t))}),Me=o(new Map),H=x(()=>O.value.length>0||k.value.length>0),Pe=x(()=>!!d.loadingSessions[r.workspaceId]||m.isSyncPending(r.workspaceId)||b.value!==null&&B.value.has(U(r.workspaceId,b.value)));function Fe(e){tt();let t=z;if(z=e.verticalSize,t!==null&&e.verticalSize>t&&j.value&&!M.value){K(0);return}let n=e.verticalSize-e.verticalPosition-e.verticalContainerSize;j.value=n<=xt,L&&e.verticalPosition<=St&&!M.value&&!N.value&&Be()&&Ue()}function U(e,t){return`${e}:${t}`}function Be(){let e=b.value;return e?Me.value.get(U(r.workspaceId,e))??!0:i.hasMoreOlderFor(r.workspaceId)}function Ve(e,t,n){Me.value.set(U(e,t),n)}function He(e){if(!b.value)return i.oldestIdFor(e);let t=i.eventIdsFor(e),n=i.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!E(n[e]))continue;let r=t[e];if(r)return r}}let W=null;function Ue(){if(W)return W;let e=G().finally(()=>{W===e&&(W=null)});return W=e,W}function We(){P.abort(),Te.abort(),F.abort(),M.value=!1,W=null;for(let e of B.value)Ft.delete(e);V.clear(),B.value.clear(),N.value=``}function Ge(){N.value=``,Nt.value===0&&b.value?It():Ue()}l(()=>[r.workspaceId,b.value],We,{flush:`sync`});async function G(){let e=r.workspaceId,t=b.value,n=He(e);if(!n)return;let a=P.begin();N.value=``,M.value=!0;try{let r=A.value;if(await f(),!P.isCurrent(a))return;let o=r?.getScroll().verticalSize??0,s=r?.getScroll().verticalPosition??0,c=new URLSearchParams({before:n,limit:`200`});t&&c.set(`session`,t);let l=await ce(`/api/workspaces/${e}/events?${c.toString()}`,{signal:a});if(!l.ok)throw await de(l);let u=await l.json();if(!P.isCurrent(a))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),ee=p.length>0?p[0].id:n;t&&Ve(e,t,u.hasMore),i.prepend(e,g,_,{oldestId:ee,hasMoreOlder:t?i.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:be(n.source)}})}if(await f(),r&&P.isCurrent(a)){let e=r.getScroll().verticalSize-o;if(e>0){let t=Math.max(s+e,250);r.setScrollPosition(`vertical`,t,0)}}}catch(e){if(ye(e)||!P.isCurrent(a))return;N.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to load older events:`,e)}finally{P.isCurrent(a)&&(M.value=!1)}}async function K(e=0){let t=$();if(await f(),t!==$())return;let n=A.value;if(!n)return;let r=n.getScroll();n.setScrollPosition(`vertical`,r.verticalSize,e)}let q=null,Ke=0;function qe(){if(q!=null)return;let e=performance.now()-Ke<Ct,t=$();q=requestAnimationFrame(()=>{q=null,t===$()&&(Ke=performance.now(),K(e?0:180))})}function Je(e){Q(),j.value=!1;let t=A.value;t&&t.setScrollPosition(`vertical`,Math.max(0,e),250)}function Ye(){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 Xe(e){let t=e.detail;if(t?.workspaceId!==r.workspaceId||!t.eventId)return;Q(),j.value=!1;let n=F.begin(),a=r.workspaceId;try{let e=new URLSearchParams({around:t.eventId,limit:`200`});t.sessionId&&e.set(`session`,t.sessionId);let o=await ce(`/api/workspaces/${a}/events?${e}`,{signal:n});if(!o.ok)throw await de(o);let s=await o.json();if(!F.isCurrent(n))return;let c=s.events??[],l=c.filter(e=>e.type===`agent:event`&&e.workspaceId===r.workspaceId),u=c.filter(e=>e.type===`user:message`&&e.workspaceId===r.workspaceId);i.reset(r.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(r.workspaceId,{id:e.id,type:`text`,content:t.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:t.sender??`user`,source:be(t.source)}})}if(await ze(je,e=>!e,5e3),await f(),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e()))),!F.isCurrent(n))return;let p=O.value.findIndex(e=>e.items.some(e=>e.eventIds?.includes(t.eventId)??!1));if(p<0)return;I.value=t.eventId,J.value?.scrollTo(p,`center`),Y.value=p,window.setTimeout(()=>{I.value===t.eventId&&(I.value=null)},1800)}catch(e){if(ye(e)||!F.isCurrent(n))return;N.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to focus history event:`,e)}}let J=o(null),Ze=o(null),Y=o(0),Qe=o(!1),$e=x(()=>{for(let e=O.value.length-1;e>=0;e--)if(O.value[e]?.speaker===`user`)return e;return-1}),X=null;function et(){let e=$e.value,t=A.value?.getScrollTarget(),n=t?.querySelector(`[data-turn-index="${e}"]`);if(!n||!t){Qe.value=!1;return}let r=t.getBoundingClientRect(),i=n.getBoundingClientRect();Qe.value=i.bottom>r.top&&i.top<r.bottom}function tt(){X===null&&(X=requestAnimationFrame(()=>{X=null,et()}))}function nt(e){return e.length<=wt?e:`${e.slice(0,252)}...`}let rt=x(()=>{let e=$e.value,t=O.value[e];if(!t||Y.value<=e||Qe.value)return null;let n=t.items.filter(e=>e.type===`user`).map(e=>e.content).join(`
|
|
2
|
+
`).trim();return n?{index:e,content:nt(n)}:null});function Dt(e){Y.value=e.index,tt()}function Ot(){let e=rt.value;e&&(Q(),j.value=!1,J.value?.scrollTo(e.index,`start`),Y.value=e.index)}let kt=o(!1);async function At(){if(kt.value)return;Q(),j.value=!1,kt.value=!0;let e=r.workspaceId;try{let t=Re(O.value,Y.value);if(t<0)for(let n=0;n<15;n++){if(e!==r.workspaceId)return;if(!Be())break;let n=O.value.length;if(await Ue(),await f(),e!==r.workspaceId)return;if(Y.value+=O.value.length-n,t=Re(O.value,Y.value),t>=0)break}t>=0&&e===r.workspaceId&&(J.value?.scrollTo(t,`start`),Y.value=t)}finally{kt.value=!1}}let Z=0;function jt(){return new Promise(e=>requestAnimationFrame(()=>e()))}async function Mt(){if(!R||!H.value||je.value)return;L=!1;let e=++Z;if(await f(),e!==Z||!R||(Ze.value=A.value?.getScrollTarget()??null,await f(),e!==Z||!R))return;O.value.length>0&&J.value?.scrollTo(O.value.length-1,`end-force`),await jt();let t=-1,n=0;for(let r=0;r<Et&&n<Tt;r++){if(e!==Z||!R)return;await K(0),await jt();let r=A.value?.getScroll().verticalSize??0;z=r,n=r===t?n+1:0,t=r}e===Z&&!Pe.value&&(L=!0,R=!1)}function Q(){R=!1,!L&&(Z++,L=!0)}let Nt=x(()=>{let e=i.sessionIdsFor(r.workspaceId);if(!b.value)return e.length;let t=0;for(let n of e)E(n)&&t++;return t});l(je,async e=>{!e&&H.value&&await Mt(),e||f(()=>{Ze.value=A.value?.getScrollTarget()??null,tt()})}),l(Pe,(e,t)=>{!e&&t&&R&&H.value&&Mt()}),p(()=>{window.addEventListener(`kobo:focus-history-event`,Xe),f(()=>{Ze.value=A.value?.getScrollTarget()??null,tt()}),H.value&&Mt(),b.value&&It();let e=new URLSearchParams(window.location.hash.split(`?`)[1]??``).get(`eventId`);e&&(Xe(new CustomEvent(`kobo:focus-history-event`,{detail:{workspaceId:r.workspaceId,sessionId:b.value,eventId:e}})),Ye())}),l([Nt,()=>ie.value.length,()=>k.value.length],async([e,t,n])=>{M.value||R&&e+t+n>0&&await Mt()}),l([$e,()=>O.value.length],()=>{f(tt)});let Pt=x(()=>i.liveAppendCountFor(r.workspaceId,E)),$=()=>`${r.workspaceId}\u0000${d.selectedSessionId??``}`;l([Pt,$],([e,t],[n,r])=>{t===r&&e>n&&j.value&&!M.value&&qe()}),c(()=>{Z++,R=!1,We(),window.removeEventListener(`kobo:focus-history-event`,Xe),q!=null&&(cancelAnimationFrame(q),q=null),X!==null&&cancelAnimationFrame(X)}),l([()=>r.workspaceId,()=>d.selectedSessionId],()=>{Z++,R=!0,z=null,j.value=!0,L=!1,It(),H.value&&Mt()});let Ft=new Set;async function It(){let e=r.workspaceId,t=b.value;if(!t||Nt.value>0)return;let n=U(e,t);if(Ft.has(n))return;Ft.add(n),B.value.add(n);let a=Te.begin();V.set(n,a),N.value=``;try{let n=await ce(`/api/workspaces/${e}/events?session=${encodeURIComponent(t)}&limit=500`,{signal:a});if(!n.ok)throw await de(n);let r=await n.json();if(!Te.isCurrent(a))return;let o=r.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);Ve(e,t,r.hasMore),l.length>0&&i.prepend(e,l,u,{oldestId:o[0].id,hasMoreOlder:i.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:be(n.source)}})}}catch(e){if(ye(e)||!Te.isCurrent(a)){(!V.has(n)||V.get(n)===a)&&Ft.delete(n);return}N.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),Ft.delete(n)}finally{V.get(n)===a&&(V.delete(n),B.value.delete(n))}}let Lt=x(()=>ie.value.filter(e=>e.sender===`user`).length),Rt=x(()=>(d.activityFeeds[r.workspaceId]??[]).filter(e=>e.meta?.sender===`user`&&e.meta.pending&&E(e.sessionId)).length);l([Lt,Rt,$],async([e,t,n],[r,i,a])=>{let o=t>i;n===a&&(o||e>r&&j.value&&!M.value&&!Pe.value)&&(j.value=!0,await K(o?180:0))});async function zt(){j.value=!0,await K(250)}return(t,n)=>je.value?(u(),S(`div`,at,[g(xe,{size:`40px`,color:`primary`})])):(u(),S(`div`,ot,[e(d).sessionsErrors[r.workspaceId]?(u(),S(`div`,st,[y(a(t.$t(`activity.sessionsError`,{message:e(d).sessionsErrors[r.workspaceId]}))+` `,1),g(D,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:n[0]||=t=>e(d).fetchSessions(r.workspaceId)},null,8,[`label`])])):v(``,!0),N.value?(u(),S(`div`,ct,[y(a(t.$t(`activity.historyError`,{message:N.value}))+` `,1),g(D,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:Ge},null,8,[`label`])])):v(``,!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`)},a(Ce.value),9,lt),g(re,{name:`fade`},{default:h(()=>[ee.value?(u(),S(`div`,ut,[g(xe,{size:`18px`,color:`primary`}),w(`span`,dt,a(t.$t(`activity.compacting`)),1)])):v(``,!0)]),_:1}),g(Ee,{ref_key:`scrollRef`,ref:A,class:`activity-feed-scroll`,onScroll:Fe,onWheelPassive:Q,onTouchstartPassive:Q,onKeydown:Q},{default:h(()=>[M.value?(u(),S(`div`,ft,[g(se,{size:`sm`}),y(` `+a(t.$t(`activity.loading_older`)),1)])):v(``,!0),g(Ne,{ref_key:`virtualScrollRef`,ref:J,class:`q-pa-md`,items:O.value,"scroll-target":Ze.value??void 0,"virtual-scroll-item-size":160,"virtual-scroll-slice-size":20,onVirtualScroll:Dt},{default:h(({item:t,index:n})=>[(u(),_(it,{key:e(Le)(t),turn:t,"workspace-id":r.workspaceId,"data-turn-index":n,highlighted:t.items.some(e=>e.eventIds?.includes(I.value??``)??!1),onScrollTo:Je},null,8,[`turn`,`workspace-id`,`data-turn-index`,`highlighted`]))]),_:1},8,[`items`,`scroll-target`]),O.value.length===0&&k.value.length===0&&!M.value?(u(),S(`div`,pt,[g(oe,{name:`forum`,size:`28px`}),w(`div`,mt,a(t.$t(`activity.empty`)),1),w(`div`,ht,a(t.$t(`activity.emptyHint`)),1)])):v(``,!0),k.value.length?(u(),S(`div`,gt,[g(we,{label:t.$t(`activity.raw_lines`,{n:k.value.length}),dense:``},{default:h(()=>[(u(!0),S(C,null,te(k.value,(e,t)=>(u(),S(`div`,{key:t,class:`text-caption text-kobo-3 q-pa-xs`},a(e),1))),128))]),_:1},8,[`label`])])):v(``,!0)]),_:1},512),rt.value?(u(),S(`button`,{key:2,type:`button`,class:`activity-feed-last-user`,"data-testid":`latest-user-message`,title:rt.value.content,onClick:Ot},[g(oe,{name:`person`,size:`16px`}),w(`span`,vt,a(rt.value.content),1)],8,_t)):v(``,!0),w(`div`,yt,[j.value?v(``,!0):(u(),_(D,{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:zt},null,8,[`title`,`aria-label`])),g(D,{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:kt.value,disable:kt.value,onClick:At},null,8,[`title`,`aria-label`,`loading`,`disable`])])]))}}),[[`__scopeId`,`data-v-58324159`]]);export{Dt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as e,pt as t,v as n}from"./reactivity.esm-bundler-DY1JkAEA.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-Bqg71Vll.js";import{t as m}from"./QBtn-BUSdPaf4.js";import{
|
|
1
|
+
import{M as e,pt as t,v as n}from"./reactivity.esm-bundler-DY1JkAEA.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-Bqg71Vll.js";import{t as m}from"./QBtn-BUSdPaf4.js";import{Bt as h,Ut as g,a as _,hn as v,pn as y}from"./index-ImUH7Bbt.js";import{a as b,i as x,n as S}from"./use-tours-6yxNVmjH.js";import{n as C}from"./render-chat-markdown-CafzCcmu.js";import{t as w}from"./QChip-Be16M4Ig.js";import{t as T}from"./QPage-CqkGHokx.js";import{t as E}from"./DrawerToggleButton-KfwSzjeY.js";import{t as D}from"./TourReplayButton-Czlqo18H.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=_(),{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 h(`/api/changelog`);if(!e.ok)throw await g(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(y,{key:e.version,dark:``,flat:``,bordered:``},{default:a(()=>[o(v,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,2 @@
|
|
|
1
|
+
import{lt as e,pt as t,v as n}from"./reactivity.esm-bundler-DY1JkAEA.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-Bqg71Vll.js";import{t as p}from"./QBtn-BUSdPaf4.js";import{Bt as m,Yt as h,a as ie,at as ae}from"./index-ImUH7Bbt.js";import{t as oe}from"./QMarkupTable-UhP7fVUp.js";import{a as g,i as _}from"./use-tours-6yxNVmjH.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
|
+
`)}`}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,t(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,t(n.$t(`comparison.hint`)),1),o(oe,{flat:``,dense:``,dark:``,class:`comparison-table`},{default:a(()=>[d(`thead`,null,[d(`tr`,null,[d(`th`,T,t(n.$t(`comparison.engine`)),1),d(`th`,E,t(n.$t(`comparison.status`)),1),d(`th`,D,t(n.$t(`comparison.tasks`)),1),d(`th`,O,t(n.$t(`comparison.commits`)),1),d(`th`,k,t(n.$t(`comparison.files`)),1),d(`th`,A,t(n.$t(`comparison.diff`)),1),d(`th`,j,t(n.$t(`comparison.messages`)),1),d(`th`,M,t(n.$t(`comparison.questions`)),1),d(`th`,N,t(n.$t(`comparison.tools`)),1),d(`th`,P,t(n.$t(`comparison.errors`)),1),d(`th`,F,t(n.$t(`comparison.tokens`)),1),d(`th`,I,t(n.$t(`comparison.sessions`)),1),d(`th`,L,t(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:e({"comparison-current":Q(r)})},[d(`td`,null,[d(`div`,null,t(xe(r.workspace.engine)),1),d(`div`,R,t(r.workspace.model),1)]),d(`td`,null,[c(t(Ce(r.workspace.status))+` `,1),r.workspace.archivedAt?(i(),u(`span`,z,` · `+t(n.$t(`comparison.archived`)),1)):s(``,!0)]),d(`td`,B,t(r.tasks.done)+`/`+t(r.tasks.total),1),d(`td`,V,t(r.gitStats?.commitCount??`-`),1),d(`td`,H,t(r.gitStats?.filesChanged??`-`),1),d(`td`,U,[r.gitStats?(i(),u(`span`,se,[d(`span`,W,`+`+t(r.gitStats.insertions),1),d(`span`,G,`-`+t(r.gitStats.deletions),1)])):(i(),u(`span`,K,`-`))]),d(`td`,ce,[d(`span`,{title:n.$t(`comparison.messagesTitle`)},t(r.activity.agentMessages)+` / `+t(r.activity.userMessages),9,le)]),d(`td`,ue,t(r.activity.questions),1),d(`td`,de,t(r.activity.toolCalls),1),d(`td`,{class:e([`text-right`,r.activity.errors>0?`text-kobo-danger`:``])},t(r.activity.errors),3),d(`td`,fe,[d(`span`,{title:n.$t(`comparison.tokensTitle`)},t(v(r.activity.inputTokens))+` / `+t(v(r.activity.outputTokens)),9,pe)]),d(`td`,me,t(r.activity.sessions),1),d(`td`,he,t(y(r.activity.durationMs)),1),d(`td`,ge,[Q(r)?(i(),u(`span`,_e,t(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,t(n.$t(`comparison.incomplete`)),1)):s(``,!0)])):s(``,!0)}}),[[`__scopeId`,`data-v-bda71e6d`]]);export{q as default};
|