@loicngr/kobo 1.6.8 → 1.6.10
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 +4 -1
- package/README.md +4 -1
- package/dist/mcp-server/kobo-tasks-handlers.js +19 -1
- package/dist/mcp-server/kobo-tasks-server.js +27 -1
- package/dist/server/db/migrations.js +22 -0
- package/dist/server/db/schema.js +4 -0
- package/dist/server/index.js +2 -0
- package/dist/server/routes/images.js +59 -0
- package/dist/server/routes/workspaces.js +211 -21
- package/dist/server/services/agent/engines/claude-code/args-builder.js +6 -0
- package/dist/server/services/agent/engines/claude-code/engine.js +6 -0
- package/dist/server/services/agent/engines/claude-code/stream-parser.js +162 -0
- package/dist/server/services/agent/orchestrator.js +171 -18
- package/dist/server/services/auto-loop-service.js +311 -0
- package/dist/server/services/workspace-service.js +47 -0
- package/dist/server/utils/git-ops.js +13 -4
- package/dist/shared/auto-loop-prompts.js +28 -0
- package/package.json +1 -1
- package/src/client/dist/spa/assets/{ActivityFeed-ZLFD0ABF.css → ActivityFeed-DtM6pJvz.css} +1 -1
- package/src/client/dist/spa/assets/ActivityFeed-jxfDBgtk.js +7 -0
- package/src/client/dist/spa/assets/{ClosePopup-DTgXzcoa.js → ClosePopup-DkLittac.js} +1 -1
- package/src/client/dist/spa/assets/CreatePage-Bk5v8_20.css +1 -0
- package/src/client/dist/spa/assets/CreatePage-uBHjVyx5.js +2 -0
- package/src/client/dist/spa/assets/DiffViewer-B5spOKjh.js +2 -0
- package/src/client/dist/spa/assets/{HealthPage-BNv_dnMz.js → HealthPage-DnUDXD7f.js} +1 -1
- package/src/client/dist/spa/assets/MainLayout-CDR4Le5c.css +1 -0
- package/src/client/dist/spa/assets/{MainLayout-NzuypipH.js → MainLayout-Cu2p6Yzp.js} +17 -17
- package/src/client/dist/spa/assets/QChip-bl3YRhax.js +1 -0
- package/src/client/dist/spa/assets/{QExpansionItem-HLBjHx-0.js → QExpansionItem-CWw6ZujM.js} +1 -1
- package/src/client/dist/spa/assets/{QItemSection-BzWLL-V-.js → QItemSection-CiY_LK5Y.js} +1 -1
- package/src/client/dist/spa/assets/{QScrollArea-CBW6shMb.js → QScrollArea-DpCqRRE0.js} +1 -1
- package/src/client/dist/spa/assets/QTabPanels-C4bZGqml.js +1 -0
- package/src/client/dist/spa/assets/{QTooltip-DbEBexRN.js → QTooltip-BIDjo2hJ.js} +1 -1
- package/src/client/dist/spa/assets/{SearchPage-B3m_OWli.js → SearchPage-BL03e4yO.js} +1 -1
- package/src/client/dist/spa/assets/SettingsPage-DODqugln.js +1 -0
- package/src/client/dist/spa/assets/{TouchPan-Y_Bxzun2.js → TouchPan-vsl78kxF.js} +1 -1
- package/src/client/dist/spa/assets/{WorkspacePage-CM676R3B.css → WorkspacePage-CI1BxN04.css} +1 -1
- package/src/client/dist/spa/assets/WorkspacePage-CvR1wkIu.js +4 -0
- package/src/client/dist/spa/assets/{build-path-tree-DOPXkGhj.js → build-path-tree-BOfvTwdg.js} +1 -1
- package/src/client/dist/spa/assets/{cssMode-BPObkLMQ.js → cssMode-CoOgcS9Q.js} +1 -1
- package/src/client/dist/spa/assets/{documents-DMvdjtPf.js → documents-Capxg1Is.js} +1 -1
- package/src/client/dist/spa/assets/{editor.api-BpCtstKS.js → editor.api-BXQZAhGS.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-C2h6FfOt.js → editor.main-DFavPtYi.js} +3 -3
- package/src/client/dist/spa/assets/{formatters-D7eTm7uK.js → formatters-CX2gvLFv.js} +1 -1
- package/src/client/dist/spa/assets/{freemarker2-DUmHGv4C.js → freemarker2-CxnHsTrj.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-BU6pjzPg.js → handlebars-MdkEOy37.js} +1 -1
- package/src/client/dist/spa/assets/{html-A5-15bWl.js → html-BWqDGW4J.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-C3KkomG3.js → htmlMode-CO3tFPX5.js} +1 -1
- package/src/client/dist/spa/assets/i18n-BshFP-3_.js +1 -0
- package/src/client/dist/spa/assets/index-ljurK0Xv.js +2 -0
- package/src/client/dist/spa/assets/is-DUKatk8N.js +1 -0
- package/src/client/dist/spa/assets/{javascript-ggaOKiy5.js → javascript-I8UtlP5w.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-Bk-QMPGJ.js → jsonMode-Z4_dv7Ex.js} +1 -1
- package/src/client/dist/spa/assets/{liquid-CJdzn-JB.js → liquid-MmYIYsxN.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-D5wRO-st.js → mdx-05Yi5ibq.js} +1 -1
- package/src/client/dist/spa/assets/models-BWwzb9Qz.js +1 -0
- package/src/client/dist/spa/assets/{monaco.contribution-CPqJifAu.js → monaco.contribution-BcmbPJhi.js} +2 -2
- package/src/client/dist/spa/assets/{python-DHI9rQDm.js → python-DApFIC6r.js} +1 -1
- package/src/client/dist/spa/assets/rate-limit-labels-BeAbIcPH.js +10 -0
- package/src/client/dist/spa/assets/{razor-CzQWNzhW.js → razor-IqeohLNL.js} +1 -1
- package/src/client/dist/spa/assets/{scroll-C-Vz5BD9.js → scroll-CYWyxBdv.js} +1 -1
- package/src/client/dist/spa/assets/settings-CAILUJXO.js +1 -0
- package/src/client/dist/spa/assets/{tsMode-DPkpdkNr.js → tsMode-B6nLj3Ks.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-Dgm0x_-O.js → typescript-DHsUK_D5.js} +1 -1
- package/src/client/dist/spa/assets/{use-checkbox-BduGd8xg.js → use-checkbox-B_o-iLG2.js} +1 -1
- package/src/client/dist/spa/assets/{xml-BeXyffrj.js → xml-B_o_LoiA.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-D4UE_1wU.js → yaml-mPCNKMRE.js} +1 -1
- package/src/client/dist/spa/index.html +9 -8
- package/src/mcp-server/kobo-tasks-handlers.ts +24 -1
- package/src/mcp-server/kobo-tasks-server.ts +29 -0
- package/src/client/dist/spa/assets/ActivityFeed-Bn9tpyLw.js +0 -7
- package/src/client/dist/spa/assets/CreatePage-CYtKx6Ji.css +0 -1
- package/src/client/dist/spa/assets/CreatePage-DDPmb3I-.js +0 -2
- package/src/client/dist/spa/assets/DiffViewer-CM3g7W7U.js +0 -2
- package/src/client/dist/spa/assets/MainLayout-BeKCjOA2.css +0 -1
- package/src/client/dist/spa/assets/QChip-1nQ_KMFF.js +0 -1
- package/src/client/dist/spa/assets/QDialog-G448EJG4.js +0 -1
- package/src/client/dist/spa/assets/QTabPanels-Cw4nnIbR.js +0 -1
- package/src/client/dist/spa/assets/SettingsPage-CpQm15XA.js +0 -1
- package/src/client/dist/spa/assets/WorkspacePage-BQzk5qfr.js +0 -4
- package/src/client/dist/spa/assets/i18n-CIduhxS0.js +0 -1
- package/src/client/dist/spa/assets/index-QcUb2Iwh.js +0 -2
- package/src/client/dist/spa/assets/models-CwWSex3X.js +0 -1
- package/src/client/dist/spa/assets/rate-limit-labels-Su-L56A2.js +0 -6
- /package/src/client/dist/spa/assets/{QBadge-Di02fu2H.js → QBadge-DqtcDv8D.js} +0 -0
- /package/src/client/dist/spa/assets/{QBtn-CyzfM9-_.js → QBtn-DHwAb18J.js} +0 -0
- /package/src/client/dist/spa/assets/{QItemLabel-Czw5g0px.js → QItemLabel-Codqjisk.js} +0 -0
- /package/src/client/dist/spa/assets/{QList-D2GuTeLl.js → QList-Bl9824vi.js} +0 -0
- /package/src/client/dist/spa/assets/{QPage-BTzNQlb1.js → QPage-Dn4E3GHB.js} +0 -0
- /package/src/client/dist/spa/assets/{QSlideTransition-s6ZkYsLs.js → QSlideTransition-BQxI8l5r.js} +0 -0
- /package/src/client/dist/spa/assets/{QSpace-0zdF1m5x.js → QSpace-BNr0AftG.js} +0 -0
- /package/src/client/dist/spa/assets/{QSpinnerDots-By20ptst.js → QSpinnerDots-DEiRooBD.js} +0 -0
- /package/src/client/dist/spa/assets/{_plugin-vue_export-helper-Cj6tcsj6.js → _plugin-vue_export-helper-r4mAJOHR.js} +0 -0
- /package/src/client/dist/spa/assets/{abap-DiwvWnMr.js → abap-Bgec7Keq.js} +0 -0
- /package/src/client/dist/spa/assets/{apex-CmtZjKlf.js → apex-VBlPwEoQ.js} +0 -0
- /package/src/client/dist/spa/assets/{azcli-DL2My_i-.js → azcli-DKqrEFBx.js} +0 -0
- /package/src/client/dist/spa/assets/{bat-B-nC98wG.js → bat-DdgQWy_0.js} +0 -0
- /package/src/client/dist/spa/assets/{bicep-Ju5MwOgh.js → bicep-CRMM43EB.js} +0 -0
- /package/src/client/dist/spa/assets/{cameligo-8Eu1TyBr.js → cameligo-UatALtML.js} +0 -0
- /package/src/client/dist/spa/assets/{clojure-u-RpMkH3.js → clojure-D8JU08RA.js} +0 -0
- /package/src/client/dist/spa/assets/{coffee-CdA7bbTe.js → coffee-C56wu358.js} +0 -0
- /package/src/client/dist/spa/assets/{cpp-CzNFP8ks.js → cpp-CyZLvhJG.js} +0 -0
- /package/src/client/dist/spa/assets/{csharp-j1LThmcE.js → csharp-BJl3ixva.js} +0 -0
- /package/src/client/dist/spa/assets/{csp-CLRC61y6.js → csp-CxEKxmO-.js} +0 -0
- /package/src/client/dist/spa/assets/{css-r6rC_7P2.js → css-B0t_muXd.js} +0 -0
- /package/src/client/dist/spa/assets/{cypher-CW08XVUh.js → cypher-D1hqiMFD.js} +0 -0
- /package/src/client/dist/spa/assets/{dart-Cs9aL5T_.js → dart-Bz550Pyv.js} +0 -0
- /package/src/client/dist/spa/assets/{dockerfile-BWM0M184.js → dockerfile-CIXgVAuA.js} +0 -0
- /package/src/client/dist/spa/assets/{ecl-MJJuer5P.js → ecl-D9qbvZoA.js} +0 -0
- /package/src/client/dist/spa/assets/{elixir-D2AIuXqn.js → elixir-b2M38fAy.js} +0 -0
- /package/src/client/dist/spa/assets/{flow9-B2H24giC.js → flow9-Dq1UYMkt.js} +0 -0
- /package/src/client/dist/spa/assets/{fsharp-CMk2OIJN.js → fsharp-CFNadkg7.js} +0 -0
- /package/src/client/dist/spa/assets/{go-BrMkuJg0.js → go-dSur1iB2.js} +0 -0
- /package/src/client/dist/spa/assets/{graphql-PSR1UKGv.js → graphql-qyhAo11d.js} +0 -0
- /package/src/client/dist/spa/assets/{hcl-DAQrbDOW.js → hcl-DFzjMyzm.js} +0 -0
- /package/src/client/dist/spa/assets/{ini-0TG5BxW0.js → ini-TdzA8TIl.js} +0 -0
- /package/src/client/dist/spa/assets/{java-rgorz17v.js → java-CSGA9pkE.js} +0 -0
- /package/src/client/dist/spa/assets/{julia-C8VMdHm8.js → julia-9izz5OsY.js} +0 -0
- /package/src/client/dist/spa/assets/{kotlin-CllWo3gX.js → kotlin-DuPK7AtF.js} +0 -0
- /package/src/client/dist/spa/assets/{less-Cgca25AP.js → less-B8d93iCg.js} +0 -0
- /package/src/client/dist/spa/assets/{lexon-D0GHdBaw.js → lexon-DWtEIyu7.js} +0 -0
- /package/src/client/dist/spa/assets/{lua-DmRsNG-P.js → lua-Ciq0OGgt.js} +0 -0
- /package/src/client/dist/spa/assets/{m3-BgL5dNKT.js → m3-Cki6JWj_.js} +0 -0
- /package/src/client/dist/spa/assets/{markdown-BuJfycGS.js → markdown-Cu47xwU0.js} +0 -0
- /package/src/client/dist/spa/assets/{mips-C9m_93PR.js → mips-BM8ui995.js} +0 -0
- /package/src/client/dist/spa/assets/{msdax-CpFHC9OI.js → msdax-DqLio0_c.js} +0 -0
- /package/src/client/dist/spa/assets/{mysql-qFvltsqN.js → mysql-v1wbjJOq.js} +0 -0
- /package/src/client/dist/spa/assets/{objective-c-Bnmr858J.js → objective-c-CQl3PGSB.js} +0 -0
- /package/src/client/dist/spa/assets/{pascal-WP0_D5AO.js → pascal-D4iW0ZtD.js} +0 -0
- /package/src/client/dist/spa/assets/{pascaligo-Blom4Rij.js → pascaligo-BdC9CZdj.js} +0 -0
- /package/src/client/dist/spa/assets/{perl-B-vk8g64.js → perl-BL10m4XD.js} +0 -0
- /package/src/client/dist/spa/assets/{pgsql-Cgvz6v67.js → pgsql-Be_oqVo3.js} +0 -0
- /package/src/client/dist/spa/assets/{php-8a3Lrw9m.js → php-BtvXSFRI.js} +0 -0
- /package/src/client/dist/spa/assets/{pla-DuFqEZ8V.js → pla-B2vUy15C.js} +0 -0
- /package/src/client/dist/spa/assets/{postiats-DkLtSgkp.js → postiats-CbmTTfXr.js} +0 -0
- /package/src/client/dist/spa/assets/{powerquery-BJ1aNepW.js → powerquery-DszLhJGx.js} +0 -0
- /package/src/client/dist/spa/assets/{powershell-rE98k687.js → powershell-B0dYktF6.js} +0 -0
- /package/src/client/dist/spa/assets/{private.use-form-C5G_3nU5.js → private.use-form-Dlb0iQZh.js} +0 -0
- /package/src/client/dist/spa/assets/{protobuf-CUheFacr.js → protobuf-CZvaj1VX.js} +0 -0
- /package/src/client/dist/spa/assets/{pug-LDcAMD8w.js → pug-CPDx1B3S.js} +0 -0
- /package/src/client/dist/spa/assets/{qsharp-DUKSQoR1.js → qsharp-CDP9TFLl.js} +0 -0
- /package/src/client/dist/spa/assets/{r-D-QApv87.js → r-8DbbFX2l.js} +0 -0
- /package/src/client/dist/spa/assets/{redis-SXdDyWR9.js → redis-DRWj9MtJ.js} +0 -0
- /package/src/client/dist/spa/assets/{redshift-Y6lsCryn.js → redshift-C6cElE_5.js} +0 -0
- /package/src/client/dist/spa/assets/{restructuredtext-edObr9a8.js → restructuredtext-W9pS9n3m.js} +0 -0
- /package/src/client/dist/spa/assets/{ruby-CNnUfF-8.js → ruby-BKnzWnk-.js} +0 -0
- /package/src/client/dist/spa/assets/{rust-IHUZWzBr.js → rust-YPCclWwe.js} +0 -0
- /package/src/client/dist/spa/assets/{sb-DrUvY44N.js → sb-BgM4DTFb.js} +0 -0
- /package/src/client/dist/spa/assets/{scala-B4hbXGLM.js → scala-fz1OPLMl.js} +0 -0
- /package/src/client/dist/spa/assets/{scheme-BGrd12j3.js → scheme-8Uz1RIbu.js} +0 -0
- /package/src/client/dist/spa/assets/{scss-x5G1ES4U.js → scss-Djo3IYXr.js} +0 -0
- /package/src/client/dist/spa/assets/{shell-DOehe2Y8.js → shell-CINF5Tx_.js} +0 -0
- /package/src/client/dist/spa/assets/{solidity-BeRvcwWV.js → solidity-GgiNEuUm.js} +0 -0
- /package/src/client/dist/spa/assets/{sophia-DZbkUNjy.js → sophia-Culj97P9.js} +0 -0
- /package/src/client/dist/spa/assets/{sparql-B7_oi5-h.js → sparql-C2ZlpxOY.js} +0 -0
- /package/src/client/dist/spa/assets/{sql-CTlsFWVE.js → sql-BEf5Pg7Y.js} +0 -0
- /package/src/client/dist/spa/assets/{st-DJVEJdPE.js → st-CT6UUoeH.js} +0 -0
- /package/src/client/dist/spa/assets/{swift-CwhT3fYa.js → swift-B5g0xTG3.js} +0 -0
- /package/src/client/dist/spa/assets/{systemverilog-BQN63pkN.js → systemverilog-CEgQz9DR.js} +0 -0
- /package/src/client/dist/spa/assets/{tcl-DqwfpskA.js → tcl-D0qL2L0I.js} +0 -0
- /package/src/client/dist/spa/assets/{touch-B2uuAH_y.js → touch-Bj_Fr4kC.js} +0 -0
- /package/src/client/dist/spa/assets/{twig-BiyenUgc.js → twig-BFUAVf1E.js} +0 -0
- /package/src/client/dist/spa/assets/{typespec-CWOJribt.js → typespec-CjVVcNKm.js} +0 -0
- /package/src/client/dist/spa/assets/{use-id-BmXMngYX.js → use-id-C93QQwrt.js} +0 -0
- /package/src/client/dist/spa/assets/{use-quasar-BBrzedjR.js → use-quasar-Cc4smfg5.js} +0 -0
- /package/src/client/dist/spa/assets/{vb-Cq5F87m3.js → vb-CZJr-DQz.js} +0 -0
- /package/src/client/dist/spa/assets/{vue-i18n-eUDnMrPl.js → vue-i18n-BJlZEYnA.js} +0 -0
- /package/src/client/dist/spa/assets/{wgsl-BAvW2lVr.js → wgsl-ivoXUo2e.js} +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { getDb } from '../db/index.js';
|
|
4
|
+
import * as orchestrator from './agent/orchestrator.js';
|
|
5
|
+
import { emit, emitEphemeral } from './websocket-service.js';
|
|
6
|
+
import { listTasks } from './workspace-service.js';
|
|
7
|
+
const NO_PROGRESS_STALL_THRESHOLD = 3;
|
|
8
|
+
function getRow(workspaceId) {
|
|
9
|
+
const db = getDb();
|
|
10
|
+
const row = db
|
|
11
|
+
.prepare(`SELECT id, project_path, working_branch, model, permission_mode, reasoning_effort,
|
|
12
|
+
status, auto_loop, auto_loop_ready, no_progress_streak, archived_at
|
|
13
|
+
FROM workspaces WHERE id = ?`)
|
|
14
|
+
.get(workspaceId);
|
|
15
|
+
return row ?? null;
|
|
16
|
+
}
|
|
17
|
+
function countPendingTasks(workspaceId) {
|
|
18
|
+
const db = getDb();
|
|
19
|
+
const row = db
|
|
20
|
+
.prepare('SELECT COUNT(*) AS c FROM tasks WHERE workspace_id = ? AND status != ?')
|
|
21
|
+
.get(workspaceId, 'done');
|
|
22
|
+
return row.c;
|
|
23
|
+
}
|
|
24
|
+
function countDoneTasks(workspaceId) {
|
|
25
|
+
const db = getDb();
|
|
26
|
+
const row = db
|
|
27
|
+
.prepare('SELECT COUNT(*) AS c FROM tasks WHERE workspace_id = ? AND status = ?')
|
|
28
|
+
.get(workspaceId, 'done');
|
|
29
|
+
return row.c;
|
|
30
|
+
}
|
|
31
|
+
export function getStatus(workspaceId) {
|
|
32
|
+
const row = getRow(workspaceId);
|
|
33
|
+
if (!row)
|
|
34
|
+
return { auto_loop: false, auto_loop_ready: false, no_progress_streak: 0 };
|
|
35
|
+
return {
|
|
36
|
+
auto_loop: row.auto_loop === 1,
|
|
37
|
+
auto_loop_ready: row.auto_loop_ready === 1,
|
|
38
|
+
no_progress_streak: row.no_progress_streak,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Enable auto-loop for the workspace. Spawns immediately if idle + pending
|
|
43
|
+
* tasks. If the initial spawn fails (e.g. worktree missing, engine misconfig),
|
|
44
|
+
* re-throws so the HTTP caller gets a 4xx instead of a silent 200 — the
|
|
45
|
+
* workspace will already have been auto-disabled by `spawnNextIteration`.
|
|
46
|
+
*/
|
|
47
|
+
export function enable(workspaceId) {
|
|
48
|
+
const row = getRow(workspaceId);
|
|
49
|
+
if (!row)
|
|
50
|
+
throw new Error(`Workspace '${workspaceId}' not found`);
|
|
51
|
+
if (row.auto_loop_ready !== 1) {
|
|
52
|
+
throw new Error(`Workspace '${workspaceId}' is not ready for auto-loop (run grooming first)`);
|
|
53
|
+
}
|
|
54
|
+
const db = getDb();
|
|
55
|
+
db.prepare('UPDATE workspaces SET auto_loop = 1, no_progress_streak = 0 WHERE id = ?').run(workspaceId);
|
|
56
|
+
emitEphemeral(workspaceId, 'autoloop:enabled', {});
|
|
57
|
+
const pending = countPendingTasks(workspaceId);
|
|
58
|
+
if (pending === 0)
|
|
59
|
+
return;
|
|
60
|
+
if (orchestrator.hasController(workspaceId))
|
|
61
|
+
return;
|
|
62
|
+
// spawnNextIteration throws on initial spawn failure (see flag).
|
|
63
|
+
spawnNextIteration(workspaceId, { throwOnStartAgentError: true });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Disable auto-loop. Idempotent: if the flag is already 0, returns without
|
|
67
|
+
* emitting a duplicate `autoloop:disabled` event.
|
|
68
|
+
*/
|
|
69
|
+
export function disable(workspaceId, reason) {
|
|
70
|
+
const row = getRow(workspaceId);
|
|
71
|
+
if (!row || row.auto_loop !== 1)
|
|
72
|
+
return;
|
|
73
|
+
const db = getDb();
|
|
74
|
+
db.prepare('UPDATE workspaces SET auto_loop = 0 WHERE id = ?').run(workspaceId);
|
|
75
|
+
emitEphemeral(workspaceId, 'autoloop:disabled', { reason });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Route a `session:ended` event into the auto-loop state machine.
|
|
79
|
+
*
|
|
80
|
+
* Called by orchestrator.handleEvent. The delta is the number of tasks that
|
|
81
|
+
* transitioned to `done` during this session (computed from a snapshot taken
|
|
82
|
+
* at `session:started`).
|
|
83
|
+
*
|
|
84
|
+
* When status is `quota` we skip spawning: the orchestrator's handleQuota
|
|
85
|
+
* already scheduled a backoff timer and will call `onQuotaBackoffExpired` once
|
|
86
|
+
* the window closes — that function owns the next spawn in that case.
|
|
87
|
+
*/
|
|
88
|
+
export function onSessionEnded(workspaceId, reason, tasksDoneDelta) {
|
|
89
|
+
const row = getRow(workspaceId);
|
|
90
|
+
if (!row)
|
|
91
|
+
return;
|
|
92
|
+
if (row.auto_loop !== 1)
|
|
93
|
+
return;
|
|
94
|
+
// When a quota backoff is in flight (orchestrator.handleQuota scheduled a
|
|
95
|
+
// timer), let that timer own the next spawn so the backoff delay is respected.
|
|
96
|
+
if (row.status === 'quota')
|
|
97
|
+
return;
|
|
98
|
+
if (reason === 'error' || reason === 'killed') {
|
|
99
|
+
disable(workspaceId, 'error');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// When grooming hasn't run yet (auto_loop_ready=false), the loop is "armed"
|
|
103
|
+
// but waiting for tasks to be created. Skip streak tracking and task checks —
|
|
104
|
+
// onAutoLoopReadySet() will trigger the first spawn once grooming completes.
|
|
105
|
+
if (row.auto_loop_ready !== 1)
|
|
106
|
+
return;
|
|
107
|
+
const db = getDb();
|
|
108
|
+
let streak;
|
|
109
|
+
if (tasksDoneDelta > 0) {
|
|
110
|
+
db.prepare('UPDATE workspaces SET no_progress_streak = 0 WHERE id = ?').run(workspaceId);
|
|
111
|
+
streak = 0;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
db.prepare('UPDATE workspaces SET no_progress_streak = no_progress_streak + 1 WHERE id = ?').run(workspaceId);
|
|
115
|
+
streak = row.no_progress_streak + 1;
|
|
116
|
+
}
|
|
117
|
+
if (streak >= NO_PROGRESS_STALL_THRESHOLD) {
|
|
118
|
+
disable(workspaceId, 'stall');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (countPendingTasks(workspaceId) === 0) {
|
|
122
|
+
disable(workspaceId, 'completed');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
spawnNextIteration(workspaceId);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Re-register auto-loop timers at server boot. For every non-archived workspace
|
|
129
|
+
* with `auto_loop=true` and no active controller, either spawn the next
|
|
130
|
+
* iteration (if pending tasks exist) or disable with reason=completed.
|
|
131
|
+
*/
|
|
132
|
+
export function rehydrate() {
|
|
133
|
+
try {
|
|
134
|
+
const db = getDb();
|
|
135
|
+
const rows = db.prepare('SELECT id FROM workspaces WHERE auto_loop = 1 AND archived_at IS NULL').all();
|
|
136
|
+
for (const { id } of rows) {
|
|
137
|
+
try {
|
|
138
|
+
if (orchestrator.hasController(id))
|
|
139
|
+
continue;
|
|
140
|
+
if (countPendingTasks(id) === 0) {
|
|
141
|
+
disable(id, 'completed');
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
spawnNextIteration(id);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
console.error(`[auto-loop-service] rehydrate failed for workspace ${id}:`, err);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
console.error('[auto-loop-service] rehydrate failed:', err);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Clear in-memory state on workspace delete. Placeholder — nothing cached today. */
|
|
156
|
+
export function forgetAutoLoopState(workspaceId) {
|
|
157
|
+
void workspaceId;
|
|
158
|
+
}
|
|
159
|
+
// ── Internal ──────────────────────────────────────────────────────────────────
|
|
160
|
+
const PROMPT_TEMPLATE = `[Kōbō auto-loop — iteration #{n}]
|
|
161
|
+
|
|
162
|
+
Current pending task (highest priority, non-acceptance-criterion first):
|
|
163
|
+
- Task ID: {taskId}
|
|
164
|
+
- Title: {taskTitle}
|
|
165
|
+
- Is acceptance criterion: {isAcceptanceCriterion}
|
|
166
|
+
|
|
167
|
+
Your job this iteration:
|
|
168
|
+
1. Read \`kobo__list_tasks\` to see all tasks and the big picture.
|
|
169
|
+
2. Implement the SINGLE task above and nothing else. Do not pick a different task.
|
|
170
|
+
3. Run the project's quality checks (lint, typecheck, tests). Check \`.ai/.git-conventions.md\` for the exact commands if unclear.
|
|
171
|
+
4. If checks fail, fix until they pass. If blocked, leave the task unchanged and explain in chat.
|
|
172
|
+
5. Commit with a conventional message (\`feat: [short description]\` or similar per repo conventions).
|
|
173
|
+
6. Code review gate — BEFORE marking the task done, dispatch an independent code-reviewer subagent via the Task tool with \`subagent_type: "code-reviewer"\` (or \`"superpowers:code-reviewer"\` / \`"pr-review-toolkit:code-reviewer"\` — use whichever exists in this environment; fall back to \`superpowers:requesting-code-review\` skill if none is available). Brief the reviewer with: what you just implemented, the task title, and the commit SHA (via \`git rev-parse HEAD\`). Ask specifically whether the change matches the task scope, whether edge cases are handled, and whether the commit is clean.
|
|
174
|
+
7. Act on the review:
|
|
175
|
+
- If Critical/Important issues: fix them, amend or add a fix-up commit, re-run checks from step 3. Do NOT mark_task_done.
|
|
176
|
+
- If only Minor issues: fix them if trivial (< 2 min), otherwise note them in the chat and proceed.
|
|
177
|
+
- If approved with no issues: proceed.
|
|
178
|
+
8. Only if the review cleared (or only minor notes remain), call \`kobo__mark_task_done(taskId="{taskId}")\`.
|
|
179
|
+
|
|
180
|
+
Do NOT modify other tasks' state. Do NOT create a PR. Do NOT skip the checks.
|
|
181
|
+
Do NOT run \`kill\`, \`pkill\`, \`killall\`, \`pgrep -k\`, or any process-killing command — you may tear down the Kōbō server itself or sibling dev servers. If a dev server needs restarting, let the user do it.
|
|
182
|
+
When you're done (success or blocked), end your turn cleanly.`;
|
|
183
|
+
function pickNextTask(workspaceId) {
|
|
184
|
+
const pending = listTasks(workspaceId).filter((t) => t.status !== 'done');
|
|
185
|
+
if (pending.length === 0)
|
|
186
|
+
return null;
|
|
187
|
+
// Rule D: non-acceptance first, each group in sort_order (listTasks orders).
|
|
188
|
+
const nonCriteria = pending.filter((t) => !t.isAcceptanceCriterion);
|
|
189
|
+
const criteria = pending.filter((t) => t.isAcceptanceCriterion);
|
|
190
|
+
return [...nonCriteria, ...criteria][0] ?? null;
|
|
191
|
+
}
|
|
192
|
+
function computeIterationNumber(workspaceId) {
|
|
193
|
+
const done = countDoneTasks(workspaceId);
|
|
194
|
+
const status = getStatus(workspaceId);
|
|
195
|
+
return done + status.no_progress_streak + 1;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Pick the next task, build the prompt, call `orchestrator.startAgent`.
|
|
199
|
+
*
|
|
200
|
+
* When called by `onSessionEnded` / `rehydrate`, `startAgent` throws are
|
|
201
|
+
* swallowed and the loop auto-disables (`reason: 'error'`). When called from
|
|
202
|
+
* `enable` (initial user-driven spawn), we want the HTTP endpoint to surface
|
|
203
|
+
* the failure instead of lying with 200, so the caller passes
|
|
204
|
+
* `throwOnStartAgentError: true` and we re-throw after disabling.
|
|
205
|
+
*
|
|
206
|
+
* Worktree-missing edge: if the worktree directory has been deleted on disk,
|
|
207
|
+
* `orchestrator.startAgent` throws during engine.start — caught below.
|
|
208
|
+
*/
|
|
209
|
+
function spawnNextIteration(workspaceId, opts = {}) {
|
|
210
|
+
const row = getRow(workspaceId);
|
|
211
|
+
if (!row)
|
|
212
|
+
return;
|
|
213
|
+
const task = pickNextTask(workspaceId);
|
|
214
|
+
if (!task) {
|
|
215
|
+
disable(workspaceId, 'completed');
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const iterationNumber = computeIterationNumber(workspaceId);
|
|
219
|
+
const prompt = PROMPT_TEMPLATE.replaceAll('{n}', String(iterationNumber))
|
|
220
|
+
.replaceAll('{taskId}', task.id)
|
|
221
|
+
.replaceAll('{taskTitle}', task.title)
|
|
222
|
+
.replaceAll('{isAcceptanceCriterion}', String(task.isAcceptanceCriterion));
|
|
223
|
+
const worktreePath = path.join(row.project_path, '.worktrees', row.working_branch);
|
|
224
|
+
// Auto-loop iterations always run in auto-accept mode. Plan mode blocks MCP
|
|
225
|
+
// tools (kobo__mark_task_done, etc.) and Edit/Write/Bash — everything the
|
|
226
|
+
// iteration needs — so honoring a 'plan' setting here would deadlock the loop.
|
|
227
|
+
const permissionMode = 'auto-accept';
|
|
228
|
+
// Pre-check: if the worktree directory is gone (user `rm -rf`-ed it),
|
|
229
|
+
// fail loudly rather than letting startAgent throw a deep engine error.
|
|
230
|
+
if (!fs.existsSync(worktreePath)) {
|
|
231
|
+
const msg = `Worktree directory missing: ${worktreePath}`;
|
|
232
|
+
console.error('[auto-loop-service]', msg);
|
|
233
|
+
disable(workspaceId, 'error');
|
|
234
|
+
if (opts.throwOnStartAgentError)
|
|
235
|
+
throw new Error(msg);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
let agentSessionId;
|
|
239
|
+
try {
|
|
240
|
+
const agent = orchestrator.startAgent(workspaceId, worktreePath, prompt, row.model, false, // resume=false — fresh context for each iteration
|
|
241
|
+
permissionMode, undefined, row.reasoning_effort);
|
|
242
|
+
agentSessionId = agent.agentSessionId;
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.error('[auto-loop-service] startAgent failed:', err);
|
|
246
|
+
disable(workspaceId, 'error');
|
|
247
|
+
if (opts.throwOnStartAgentError)
|
|
248
|
+
throw err;
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
// Persist the iteration prompt as a system-prompt message so the user can
|
|
252
|
+
// see exactly what was sent to Claude when they switch to this auto-loop
|
|
253
|
+
// session in the UI. Tagged with the new agentSessionId so the per-session
|
|
254
|
+
// filter picks it up only on its own session.
|
|
255
|
+
emit(workspaceId, 'user:message', { content: prompt, sender: 'system-prompt' }, agentSessionId);
|
|
256
|
+
const tasksPending = countPendingTasks(workspaceId);
|
|
257
|
+
const tasksDone = countDoneTasks(workspaceId);
|
|
258
|
+
emitEphemeral(workspaceId, 'autoloop:iteration-started', {
|
|
259
|
+
iterationNumber,
|
|
260
|
+
taskId: task.id,
|
|
261
|
+
taskTitle: task.title,
|
|
262
|
+
tasksPending,
|
|
263
|
+
tasksDone,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Called by orchestrator.handleQuota's backoff timer when auto-loop is enabled.
|
|
268
|
+
* Spawns the next auto-loop iteration if the workspace is still in quota status
|
|
269
|
+
* with auto_loop active; no-ops otherwise (race-safe).
|
|
270
|
+
*/
|
|
271
|
+
export function onQuotaBackoffExpired(workspaceId) {
|
|
272
|
+
const row = getRow(workspaceId);
|
|
273
|
+
if (!row)
|
|
274
|
+
return;
|
|
275
|
+
if (row.auto_loop !== 1)
|
|
276
|
+
return;
|
|
277
|
+
if (row.status !== 'quota')
|
|
278
|
+
return;
|
|
279
|
+
spawnNextIteration(workspaceId);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Called when a workspace transitions to auto_loop_ready=true (grooming done).
|
|
283
|
+
* If the loop is armed (auto_loop=1) and tasks exist, spawns the first iteration.
|
|
284
|
+
* This handles the creation-time autoLoop flag: the brainstorming session ends
|
|
285
|
+
* without triggering a spawn (auto_loop_ready was false), so this function
|
|
286
|
+
* starts the loop once the user completes grooming.
|
|
287
|
+
*/
|
|
288
|
+
export function onAutoLoopReadySet(workspaceId) {
|
|
289
|
+
const row = getRow(workspaceId);
|
|
290
|
+
if (!row)
|
|
291
|
+
return;
|
|
292
|
+
if (row.auto_loop !== 1)
|
|
293
|
+
return;
|
|
294
|
+
if (row.archived_at !== null)
|
|
295
|
+
return;
|
|
296
|
+
if (orchestrator.hasController(workspaceId))
|
|
297
|
+
return;
|
|
298
|
+
if (countPendingTasks(workspaceId) === 0)
|
|
299
|
+
return;
|
|
300
|
+
spawnNextIteration(workspaceId);
|
|
301
|
+
}
|
|
302
|
+
// ── Test-only ─────────────────────────────────────────────────────────────────
|
|
303
|
+
/** @internal */
|
|
304
|
+
export function _test_setAutoLoopReady(workspaceId, ready) {
|
|
305
|
+
const db = getDb();
|
|
306
|
+
db.prepare('UPDATE workspaces SET auto_loop_ready = ? WHERE id = ?').run(ready ? 1 : 0, workspaceId);
|
|
307
|
+
}
|
|
308
|
+
/** @internal */
|
|
309
|
+
export function _test_pickNextTask(workspaceId) {
|
|
310
|
+
return pickNextTask(workspaceId);
|
|
311
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { nanoid } from 'nanoid';
|
|
2
2
|
import { getDb } from '../db/index.js';
|
|
3
|
+
import * as orchestrator from './agent/orchestrator.js';
|
|
4
|
+
import * as autoLoopService from './auto-loop-service.js';
|
|
3
5
|
import * as wakeupService from './wakeup-service.js';
|
|
4
6
|
/** Allowed status transitions per current status. Enforced by updateWorkspaceStatus. */
|
|
5
7
|
const VALID_TRANSITIONS = {
|
|
@@ -36,6 +38,10 @@ function mapWorkspace(row) {
|
|
|
36
38
|
favoritedAt: row.favorited_at,
|
|
37
39
|
tags: parseTags(row.tags),
|
|
38
40
|
engine: row.engine ?? 'claude-code',
|
|
41
|
+
autoLoop: row.auto_loop === 1,
|
|
42
|
+
autoLoopReady: row.auto_loop_ready === 1,
|
|
43
|
+
noProgressStreak: row.no_progress_streak ?? 0,
|
|
44
|
+
permissionProfile: (row.permission_profile ?? 'bypass'),
|
|
39
45
|
createdAt: row.created_at,
|
|
40
46
|
updatedAt: row.updated_at,
|
|
41
47
|
};
|
|
@@ -213,6 +219,11 @@ export function deleteWorkspace(id) {
|
|
|
213
219
|
// The DB row is removed via ON DELETE CASCADE, but the timer would
|
|
214
220
|
// otherwise fire and hit an empty workspace.
|
|
215
221
|
wakeupService.cancel(id, 'deleted');
|
|
222
|
+
// Drop the cached rate_limit.info so memory doesn't leak on workspace
|
|
223
|
+
// churn. The Map has no FK to clean up for it automatically.
|
|
224
|
+
orchestrator.forgetRateLimitInfo(id);
|
|
225
|
+
orchestrator.forgetTasksDoneSnapshot(id);
|
|
226
|
+
autoLoopService.forgetAutoLoopState(id);
|
|
216
227
|
const db = getDb();
|
|
217
228
|
db.prepare('DELETE FROM workspaces WHERE id = ?').run(id);
|
|
218
229
|
}
|
|
@@ -296,6 +307,9 @@ export function archiveWorkspace(id) {
|
|
|
296
307
|
}
|
|
297
308
|
// Cancel any pending wakeup — archived workspaces should not wake up.
|
|
298
309
|
wakeupService.cancel(id, 'archived');
|
|
310
|
+
// Disable auto-loop — archived workspaces should not keep looping.
|
|
311
|
+
// Idempotent: no-op if auto_loop was already 0.
|
|
312
|
+
autoLoopService.disable(id, 'user-action');
|
|
299
313
|
const now = new Date().toISOString();
|
|
300
314
|
db.prepare('UPDATE workspaces SET archived_at = ?, updated_at = ? WHERE id = ?').run(now, now, id);
|
|
301
315
|
return getWorkspace(id);
|
|
@@ -324,6 +338,39 @@ export function setFavorite(id) {
|
|
|
324
338
|
}
|
|
325
339
|
return getWorkspace(id);
|
|
326
340
|
}
|
|
341
|
+
/** Flip the `auto_loop_ready` flag for a workspace. Used by the grooming MCP tool + the "Force ready" override. */
|
|
342
|
+
export function setAutoLoopReady(id, ready) {
|
|
343
|
+
const workspace = getWorkspace(id);
|
|
344
|
+
if (!workspace)
|
|
345
|
+
throw new Error(`Workspace '${id}' not found`);
|
|
346
|
+
const db = getDb();
|
|
347
|
+
db.prepare('UPDATE workspaces SET auto_loop_ready = ? WHERE id = ?').run(ready ? 1 : 0, id);
|
|
348
|
+
return getWorkspace(id);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Set the permission profile for a workspace.
|
|
352
|
+
*
|
|
353
|
+
* - `bypass` (default): Kōbō passes `--dangerously-skip-permissions` — no
|
|
354
|
+
* prompts, but the CLI hard-denies writes under `.claude/**` and
|
|
355
|
+
* `.github/workflows/**` regardless of the project's settings.json.
|
|
356
|
+
* - `strict`: Kōbō passes `--permission-mode acceptEdits` — the CLI respects
|
|
357
|
+
* the project's `.claude/settings.json` allow/deny lists. Enables writes
|
|
358
|
+
* under `.claude/**` / `.github/workflows/**` when the user has explicitly
|
|
359
|
+
* allowed them, at the cost of potential prompts on un-allow-listed Bash
|
|
360
|
+
* or MCP calls.
|
|
361
|
+
*
|
|
362
|
+
* Takes effect on the next session spawn — running sessions keep whichever
|
|
363
|
+
* flag they were started with.
|
|
364
|
+
*/
|
|
365
|
+
export function setPermissionProfile(id, profile) {
|
|
366
|
+
const workspace = getWorkspace(id);
|
|
367
|
+
if (!workspace)
|
|
368
|
+
throw new Error(`Workspace '${id}' not found`);
|
|
369
|
+
const db = getDb();
|
|
370
|
+
const now = new Date().toISOString();
|
|
371
|
+
db.prepare('UPDATE workspaces SET permission_profile = ?, updated_at = ? WHERE id = ?').run(profile, now, id);
|
|
372
|
+
return getWorkspace(id);
|
|
373
|
+
}
|
|
327
374
|
/** Remove a workspace from favorites. Idempotent: safe to call on a non-favorite, though `updated_at` still refreshes. */
|
|
328
375
|
export function unsetFavorite(id) {
|
|
329
376
|
const db = getDb();
|
|
@@ -99,10 +99,19 @@ export function deleteRemoteBranch(repoPath, branchName, remote = 'origin') {
|
|
|
99
99
|
throw new Error(`Failed to delete remote branch '${remote}/${branchName}': ${message}`);
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
/**
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Push a branch to the remote with upstream tracking (`git push -u`).
|
|
104
|
+
* When `options.force` is true, adds `--force-with-lease` (safer than `--force`:
|
|
105
|
+
* the push is rejected if the remote has commits the local copy hasn't seen).
|
|
106
|
+
*/
|
|
107
|
+
export function pushBranch(repoPath, branchName, options = {}) {
|
|
108
|
+
const remote = options.remote ?? 'origin';
|
|
109
|
+
const args = ['push', '-u'];
|
|
110
|
+
if (options.force)
|
|
111
|
+
args.push('--force-with-lease');
|
|
112
|
+
args.push(remote, branchName);
|
|
113
|
+
try {
|
|
114
|
+
git(repoPath, args);
|
|
106
115
|
}
|
|
107
116
|
catch (err) {
|
|
108
117
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for the auto-loop grooming instructions.
|
|
3
|
+
*
|
|
4
|
+
* Imported BOTH by the client (PREP_AUTOLOOP_PROMPT sent by the "Prepare
|
|
5
|
+
* for auto-loop" button) and by the server (extended brainstorm prompt
|
|
6
|
+
* injected at workspace creation when autoLoop=true). Keeping these two
|
|
7
|
+
* paths aligned was a copy-paste hazard — this file eliminates that.
|
|
8
|
+
*
|
|
9
|
+
* `AUTO_LOOP_GROOMING_STEPS` is the numbered workflow, ready to be spliced
|
|
10
|
+
* into a larger prompt with a one-line intro.
|
|
11
|
+
*
|
|
12
|
+
* `AUTO_LOOP_HARD_RULES` is the trailing hard-rules block, same for both.
|
|
13
|
+
*/
|
|
14
|
+
export const AUTO_LOOP_GROOMING_STEPS = `1. Call \`kobo__list_tasks\` FIRST to inspect any pre-existing tasks (they may have been seeded from Notion, a template, or the CreatePage form).
|
|
15
|
+
2. If tasks already exist: DO NOT delete or recreate them from scratch. Read each one, judge whether it is atomic and implementable in one session with clear completion criteria. Improve them in place:
|
|
16
|
+
- Use \`kobo__update_task\` to rename unclear titles, add completion criteria, or flip \`is_acceptance_criterion\` when needed.
|
|
17
|
+
- Use \`kobo__create_task\` to SPLIT a task that is too large into smaller atomic pieces (keep the original only if it still makes sense, otherwise update it to one of the split pieces and create the rest).
|
|
18
|
+
- Use \`kobo__create_task\` to ADD missing acceptance criteria or missing implementation steps the plan requires.
|
|
19
|
+
3. If no tasks exist:
|
|
20
|
+
- If a plan file exists in \`docs/superpowers/plans/\` or similar, read it and derive the task list from it.
|
|
21
|
+
- If no plan exists, ask the user what the workspace goal is and propose tasks accordingly.
|
|
22
|
+
- Create the tasks via \`kobo__create_task\`. For each task, decide \`is_acceptance_criterion\` appropriately.
|
|
23
|
+
4. Call \`kobo__mark_auto_loop_ready\`. This will automatically start the auto-loop, which will pick up the tasks one by one in fresh sessions.`;
|
|
24
|
+
export const AUTO_LOOP_HARD_RULES = `Hard rules:
|
|
25
|
+
- Do NOT touch any source file. No Edit, no Write, no Bash that changes the repo.
|
|
26
|
+
- Do NOT run \`kill\`, \`pkill\`, \`killall\`, \`pgrep -k\`, or any process-killing command — you may tear down the Kōbō server itself or sibling dev servers.
|
|
27
|
+
- Do NOT start implementation even if a plan is ready — auto-loop will drive that afterwards, one task per iteration.
|
|
28
|
+
- If the user asks for changes, re-apply via MCP and re-check. Do NOT mark ready until they approve.`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.10",
|
|
4
4
|
"description": "Kōbō — multi-workspace agent manager for Claude Code. Orchestrates isolated git worktrees with dev servers, Notion integration, and MCP tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.markdown-message[data-v-0ac5a3e4]{color:#e0e0e0;word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-0ac5a3e4] *{max-width:100%}.markdown-message[data-v-0ac5a3e4] p{margin:0 0 .5em}.markdown-message[data-v-0ac5a3e4] p:last-child{margin-bottom:0}.markdown-message[data-v-0ac5a3e4] pre{background:#00000059;border-radius:4px;margin:.5em 0;padding:.5em .75em;overflow-x:auto}.markdown-message[data-v-0ac5a3e4] code{word-break:break-all;background:#0000004d;border-radius:3px;padding:.1em .3em;font-size:.9em}.markdown-message[data-v-0ac5a3e4] pre code{background:0 0;padding:0}.markdown-message[data-v-0ac5a3e4] ul,.markdown-message[data-v-0ac5a3e4] ol{margin:.25em 0 .5em;padding-left:1.5em}.markdown-message[data-v-0ac5a3e4] li{margin:.15em 0}.markdown-message[data-v-0ac5a3e4] a{color:#7986cb;text-decoration:underline}.markdown-message[data-v-0ac5a3e4] .document-link{color:#9fa8da;cursor:pointer;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-message[data-v-0ac5a3e4] .document-link:hover{color:#c5cae9;-webkit-text-decoration:underline;text-decoration:underline}.markdown-message[data-v-0ac5a3e4] h1,.markdown-message[data-v-0ac5a3e4] h2,.markdown-message[data-v-0ac5a3e4] h3,.markdown-message[data-v-0ac5a3e4] h4,.markdown-message[data-v-0ac5a3e4] h5,.markdown-message[data-v-0ac5a3e4] h6{margin:.5em 0 .3em;font-weight:600;line-height:1.3}.markdown-message[data-v-0ac5a3e4] h1{font-size:1.25em}.markdown-message[data-v-0ac5a3e4] h2{font-size:1.15em}.markdown-message[data-v-0ac5a3e4] h3{font-size:1.08em}.markdown-message[data-v-0ac5a3e4] h4,.markdown-message[data-v-0ac5a3e4] h5,.markdown-message[data-v-0ac5a3e4] h6{font-size:1em}.markdown-message[data-v-0ac5a3e4] blockquote{color:#ffffffb3;border-left:3px solid #fff3;margin:.5em 0;padding-left:.75em}.markdown-message[data-v-0ac5a3e4] table{border-collapse:collapse;margin:.5em 0}.markdown-message[data-v-0ac5a3e4] th,.markdown-message[data-v-0ac5a3e4] td{border:1px solid #ffffff26;padding:.25em .5em}.markdown-thinking[data-v-e9fb9f90] p{margin:0 0 .4em}.markdown-thinking[data-v-e9fb9f90] p:last-child{margin-bottom:0}.markdown-thinking[data-v-e9fb9f90] code{background:#ffffff14;border-radius:3px;padding:.1em .3em}.tool-row[data-v-b1ed78cb]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-b1ed78cb]{color:#bbb;cursor:default;align-items:center;gap:10px;min-width:0;padding:5px 10px;display:flex}.tool-row:not(.tool-row-generic) .tool-header[data-v-b1ed78cb],.tool-row--toggleable .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-b1ed78cb]:hover,.tool-row--toggleable .tool-header[data-v-b1ed78cb]:hover{background:#ffffff08}.tool-icon[data-v-b1ed78cb]{color:#9fbce0;flex-shrink:0}.tool-name[data-v-b1ed78cb]{color:#d0d0d0;flex-shrink:0;font-weight:600}.tool-arg[data-v-b1ed78cb],.tool-path[data-v-b1ed78cb]{color:#999;text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11.5px;overflow:hidden}.tool-path[data-v-b1ed78cb],.tool-arg[data-v-b1ed78cb]{flex:1}.tool-stat-add[data-v-b1ed78cb]{color:#66bb6a;flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-b1ed78cb]{color:#ef5350;flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-b1ed78cb]{background:#0003;border-radius:4px;max-height:400px;margin-top:4px;padding:8px 0;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;overflow:auto}.diff-line[data-v-b1ed78cb]{white-space:pre;color:#bbb;padding:0 12px}.diff-sign[data-v-b1ed78cb]{color:#555;-webkit-user-select:none;user-select:none;width:14px;display:inline-block}.diff-add[data-v-b1ed78cb]{color:#c8e6c9;background:#66bb6a1a}.diff-add .diff-sign[data-v-b1ed78cb]{color:#66bb6a}.diff-del[data-v-b1ed78cb]{color:#ffcdd2;background:#ef53501a}.diff-del .diff-sign[data-v-b1ed78cb]{color:#ef5350}.tool-output[data-v-b1ed78cb]{color:#aaa;white-space:pre-wrap;background:#00000026;border-radius:4px;max-height:8em;margin-top:4px;padding:6px 10px;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px;overflow:auto}.markdown-message[data-v-
|
|
1
|
+
.markdown-message[data-v-0ac5a3e4]{color:#e0e0e0;word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-0ac5a3e4] *{max-width:100%}.markdown-message[data-v-0ac5a3e4] p{margin:0 0 .5em}.markdown-message[data-v-0ac5a3e4] p:last-child{margin-bottom:0}.markdown-message[data-v-0ac5a3e4] pre{background:#00000059;border-radius:4px;margin:.5em 0;padding:.5em .75em;overflow-x:auto}.markdown-message[data-v-0ac5a3e4] code{word-break:break-all;background:#0000004d;border-radius:3px;padding:.1em .3em;font-size:.9em}.markdown-message[data-v-0ac5a3e4] pre code{background:0 0;padding:0}.markdown-message[data-v-0ac5a3e4] ul,.markdown-message[data-v-0ac5a3e4] ol{margin:.25em 0 .5em;padding-left:1.5em}.markdown-message[data-v-0ac5a3e4] li{margin:.15em 0}.markdown-message[data-v-0ac5a3e4] a{color:#7986cb;text-decoration:underline}.markdown-message[data-v-0ac5a3e4] .document-link{color:#9fa8da;cursor:pointer;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-message[data-v-0ac5a3e4] .document-link:hover{color:#c5cae9;-webkit-text-decoration:underline;text-decoration:underline}.markdown-message[data-v-0ac5a3e4] h1,.markdown-message[data-v-0ac5a3e4] h2,.markdown-message[data-v-0ac5a3e4] h3,.markdown-message[data-v-0ac5a3e4] h4,.markdown-message[data-v-0ac5a3e4] h5,.markdown-message[data-v-0ac5a3e4] h6{margin:.5em 0 .3em;font-weight:600;line-height:1.3}.markdown-message[data-v-0ac5a3e4] h1{font-size:1.25em}.markdown-message[data-v-0ac5a3e4] h2{font-size:1.15em}.markdown-message[data-v-0ac5a3e4] h3{font-size:1.08em}.markdown-message[data-v-0ac5a3e4] h4,.markdown-message[data-v-0ac5a3e4] h5,.markdown-message[data-v-0ac5a3e4] h6{font-size:1em}.markdown-message[data-v-0ac5a3e4] blockquote{color:#ffffffb3;border-left:3px solid #fff3;margin:.5em 0;padding-left:.75em}.markdown-message[data-v-0ac5a3e4] table{border-collapse:collapse;margin:.5em 0}.markdown-message[data-v-0ac5a3e4] th,.markdown-message[data-v-0ac5a3e4] td{border:1px solid #ffffff26;padding:.25em .5em}.markdown-thinking[data-v-e9fb9f90] p{margin:0 0 .4em}.markdown-thinking[data-v-e9fb9f90] p:last-child{margin-bottom:0}.markdown-thinking[data-v-e9fb9f90] code{background:#ffffff14;border-radius:3px;padding:.1em .3em}.tool-row[data-v-b1ed78cb]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-b1ed78cb]{color:#bbb;cursor:default;align-items:center;gap:10px;min-width:0;padding:5px 10px;display:flex}.tool-row:not(.tool-row-generic) .tool-header[data-v-b1ed78cb],.tool-row--toggleable .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-b1ed78cb]:hover,.tool-row--toggleable .tool-header[data-v-b1ed78cb]:hover{background:#ffffff08}.tool-icon[data-v-b1ed78cb]{color:#9fbce0;flex-shrink:0}.tool-name[data-v-b1ed78cb]{color:#d0d0d0;flex-shrink:0;font-weight:600}.tool-arg[data-v-b1ed78cb],.tool-path[data-v-b1ed78cb]{color:#999;text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11.5px;overflow:hidden}.tool-path[data-v-b1ed78cb],.tool-arg[data-v-b1ed78cb]{flex:1}.tool-stat-add[data-v-b1ed78cb]{color:#66bb6a;flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-b1ed78cb]{color:#ef5350;flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-b1ed78cb]{background:#0003;border-radius:4px;max-height:400px;margin-top:4px;padding:8px 0;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;overflow:auto}.diff-line[data-v-b1ed78cb]{white-space:pre;color:#bbb;padding:0 12px}.diff-sign[data-v-b1ed78cb]{color:#555;-webkit-user-select:none;user-select:none;width:14px;display:inline-block}.diff-add[data-v-b1ed78cb]{color:#c8e6c9;background:#66bb6a1a}.diff-add .diff-sign[data-v-b1ed78cb]{color:#66bb6a}.diff-del[data-v-b1ed78cb]{color:#ffcdd2;background:#ef53501a}.diff-del .diff-sign[data-v-b1ed78cb]{color:#ef5350}.tool-output[data-v-b1ed78cb]{color:#aaa;white-space:pre-wrap;background:#00000026;border-radius:4px;max-height:8em;margin-top:4px;padding:6px 10px;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px;overflow:auto}.markdown-message[data-v-3a29c489]{color:#e0e0e0;word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-3a29c489] *{max-width:100%}.markdown-message[data-v-3a29c489] 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-3a29c489] code{word-break:break-all}.markdown-message[data-v-3a29c489] p{margin:0 0 .4em}.markdown-message[data-v-3a29c489] p:last-child{margin-bottom:0}.markdown-message[data-v-3a29c489] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-3a29c489] h1,.markdown-message[data-v-3a29c489] h2,.markdown-message[data-v-3a29c489] h3,.markdown-message[data-v-3a29c489] h4,.markdown-message[data-v-3a29c489] h5,.markdown-message[data-v-3a29c489] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-3a29c489] h1{font-size:1.25em}.markdown-message[data-v-3a29c489] h2{font-size:1.15em}.markdown-message[data-v-3a29c489] h3{font-size:1.08em}.markdown-message[data-v-3a29c489] h4,.markdown-message[data-v-3a29c489] h5,.markdown-message[data-v-3a29c489] h6{font-size:1em}.markdown-user-prompt[data-v-3a29c489]{color:#aaa;font-size:12px;font-style:italic}.markdown-user-prompt[data-v-3a29c489] p{margin:0 0 .4em}.markdown-user-prompt[data-v-3a29c489] 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-50994916]{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-header[data-v-50994916]{color:#888;background:#ffffff08;border-bottom:1px solid #ffffff0d;align-items:center;gap:8px;padding:8px 14px;font-size:11px;display:flex}.turn-badge[data-v-50994916]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-50994916]{color:#ce93d8;background:#ce93d826}.turn-badge-agent[data-v-50994916]{color:#7986cb;background:#7986cb26}.turn-badge-system[data-v-50994916]{color:#bdbdbd;background:#75757533;font-style:italic}.turn-badge-session[data-v-50994916]{color:#9e9e9e;background:#61616133}.turn-time[data-v-50994916]{color:#666;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px}.turn-time-arrow[data-v-50994916]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-50994916]{color:#8891a3}.turn-actions[data-v-50994916]{color:#777;font-size:11px}.turn-body[data-v-50994916]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-50994916]>*{min-width:0;max-width:100%}.turn-body[data-v-50994916] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-50994916]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-50994916]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-50994916]:hover{opacity:1}.activity-feed-wrap[data-v-a9305543]{width:100%;height:100%;position:relative}.activity-feed-scroll[data-v-a9305543]{width:100%;height:100%}.activity-feed-nav-cluster[data-v-a9305543]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-nav-btn[data-v-a9305543]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-a9305543]:hover{opacity:1}.content-origin-marker[data-v-a9305543]{pointer-events:none;width:0;height:0;margin:0;padding:0}.activity-feed-scroll[data-v-a9305543] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-a9305543]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{E as e,F as t,H as n,L as r,M as i,Q as a,U as o,_t as s,bt as c,d as l,f as u,g as d,h as f,l as p,p as m,r as h,rt as g,u as _,v,yt as y}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{L as b,l as x,t as S}from"./QIcon-B0-pH3Qs.js";import{n as C,t as w}from"./settings-CAILUJXO.js";import{t as T}from"./QBtn-DHwAb18J.js";import{n as E}from"./vue-i18n-BJlZEYnA.js";import{S as D,b as O,v as k}from"./index-ljurK0Xv.js";import{t as A}from"./QSpinnerDots-DEiRooBD.js";import{t as j}from"./QExpansionItem-CWw6ZujM.js";import{t as M}from"./QScrollArea-DpCqRRE0.js";import{t as N}from"./QTooltip-BIDjo2hJ.js";import{n as P,r as F,t as I}from"./documents-Capxg1Is.js";import{t as L}from"./_plugin-vue_export-helper-r4mAJOHR.js";function ee(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:brainstorm-complete`:case`message:raw`:case`skills:discovered`:case`usage`:case`rate_limit`:case`subagent:progress`:case`error`:break;default:}}let o=null;for(let e of r)e.type===`text`&&e.streaming&&(o&&(o.streaming=!1),o=e);return o&&!n&&(o.streaming=!1),r}function te(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}function R(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:`user`;case`session`:return`session`;default:return`agent`}}function ne(e){let t=[],n=null;for(let r of e){let e=R(r),i=e===`session`||e===`system-prompt`;!n||n.speaker!==e||i?(n={speaker:e,ts:r.ts,items:[r]},t.push(n),i&&(n=null)):n.items.push(r)}return t}var z={class:`text-caption text-grey-6`},B=v({__name:`SessionEventItem`,props:{item:{}},setup(e){let n=e,r=p(()=>{switch(n.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,n)=>(t(),m(`span`,z,c(e.$t(r.value)),1))}});function V(e,t){if(t.length===0||e.length===0)return e;let n=[...t].sort((e,t)=>t.length-e.length),r=new DOMParser().parseFromString(`<div>${e}</div>`,`text/html`),i=r.body.firstChild;if(!i)return e;function a(e){if(e.nodeType===Node.TEXT_NODE){H(e,n,r);return}if(e.nodeName===`A`)return;let t=Array.from(e.childNodes);for(let e of t)a(e)}return a(i),i.innerHTML}function H(e,t,n){let r=e.textContent??``;if(!t.some(e=>r.includes(e)))return;let i=n.createDocumentFragment(),a=0;for(;a<r.length;){let e=re(r,a,t);if(!e){i.appendChild(n.createTextNode(r.slice(a)));break}e.index>a&&i.appendChild(n.createTextNode(r.slice(a,e.index)));let o=n.createElement(`a`);o.className=`document-link`,o.setAttribute(`data-document-path`,e.path),o.setAttribute(`href`,`#`),o.textContent=e.path,i.appendChild(o),a=e.index+e.path.length}e.parentNode?.replaceChild(i,e)}function re(e,t,n){let r=null;for(let i of n){let n=e.indexOf(i,t);n<0||(!r||n<r.index||n===r.index&&i.length>r.path.length)&&(r={index:n,path:i})}return r}var U=[`innerHTML`],ie=L(v({__name:`TextMessageItem`,props:{item:{}},setup(e){let n=e,r=I(),i=k(),a=p(()=>{let e=i.selectedWorkspaceId;return e?r.documentsFor(e).map(e=>e.path):[]}),o=p(()=>{let e=V(P.parse(n.item.text,{async:!1,breaks:!0,gfm:!0}),a.value);return F.sanitize(e,{ADD_ATTR:[`data-document-path`]})});function s(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let n=t.getAttribute(`data-document-path`),a=i.selectedWorkspaceId;!n||!a||r.openDocumentByPath(a,n)}return(n,r)=>(t(),m(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,U),e.item.streaming?(t(),l(x,{key:0,size:`xs`,class:`q-ml-xs`})):u(``,!0)]))}}),[[`__scopeId`,`data-v-0ac5a3e4`]]),W={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},ae=[`innerHTML`],G={key:1,style:{"white-space":`pre-wrap`}},K=L(v({__name:`ThinkingItem`,props:{item:{}},setup(e){let n=e,r=p(()=>n.item.text.trim().slice(0,100)),i=p(()=>n.item.text.trim().length>0),a=p(()=>n.item.text.trim().length>100),s=p(()=>{let e=P.parse(n.item.text,{async:!1,breaks:!0,gfm:!0});return F.sanitize(e)});return(n,d)=>i.value?(t(),m(`div`,W,[a.value?(t(),l(j,{key:0,dense:``,"dense-toggle":``,label:r.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:o(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:s.value},null,8,ae)]),_:1},8,[`label`])):(t(),m(`span`,G,c(e.item.text),1))])):u(``,!0)}}),[[`__scopeId`,`data-v-e9fb9f90`]]);function oe(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=n.length,a=r.length,o=Array.from({length:i+1},()=>Array(a+1).fill(0));for(let e=i-1;e>=0;e--)for(let t=a-1;t>=0;t--)n[e]===r[t]?o[e][t]=o[e+1][t+1]+1:o[e][t]=Math.max(o[e+1][t],o[e][t+1]);let s=[],c=0,l=0;for(;c<i&&l<a;)n[c]===r[l]?(s.push({type:`context`,content:n[c]}),c++,l++):o[c+1][l]>=o[c][l+1]?(s.push({type:`del`,content:n[c]}),c++):(s.push({type:`add`,content:r[l]}),l++);for(;c<i;)s.push({type:`del`,content:n[c++]});for(;l<a;)s.push({type:`add`,content:r[l++]});return s}function q(e,t){if(!t||typeof t!=`object`)return null;let n=t;if(e===`Edit`){let e=n.file_path;if(!e)return null;let t=n.old_string??``,r=n.new_string??``;return{toolName:`Edit`,filePath:e,oldString:t,newString:r,replaceAll:n.replace_all??!1,additions:r?r.split(`
|
|
4
|
+
`).length:0,deletions:t?t.split(`
|
|
5
|
+
`).length:0}}if(e===`Write`){let e=n.file_path;if(!e)return null;let t=n.content??``;return{toolName:`Write`,filePath:e,content:t,additions:t?t.split(`
|
|
6
|
+
`).length:0,deletions:0}}if(e===`Bash`){let e=(n.command??``).match(/^\s*rm\s+(?:-[a-zA-Z]*\s+)*(.+)/);if(e)return{toolName:`Bash:rm`,filePath:e[1].trim().replace(/["']/g,``),additions:0,deletions:1}}return null}function J(e,t){if(!e||!t?.projectPath)return e;let n=se(e,`${t.projectPath}/.worktrees/${t.workingBranch}`);return n===e&&(n=se(e,t.projectPath)),n}function se(e,t){if(!t)return e;let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return e.replace(RegExp(`${n}/`,`g`),``).replace(RegExp(`${n}(?=\\s|$|["'\`])`,`g`),`.`)}var ce={class:`tool-name`},le=[`title`],Y={key:0,class:`tool-stat-add`},X={key:1,class:`tool-stat-del`},ue={class:`diff-sign`},de={class:`tool-name`},Z=[`title`],Q=L(v({__name:`ToolCallItem`,props:{item:{}},setup(e){let i=e,o=a(!1),g=k(),v=p(()=>q(i.item.name,i.item.input)),y=p(()=>v.value?J(v.value.filePath,g.selectedWorkspace):``),x={Bash:`terminal`,Read:`description`,Edit:`edit`,Write:`edit_note`,MultiEdit:`edit`,Glob:`folder_open`,Grep:`manage_search`,LS:`list`,Skill:`auto_awesome`,Task:`hub`,Agent:`hub`,TodoWrite:`checklist`,TodoRead:`checklist`,ToolSearch:`search`,WebFetch:`public`,WebSearch:`travel_explore`,NotebookRead:`book`,NotebookEdit:`edit_note`,SendMessage:`send`,ExitPlanMode:`check_circle_outline`,KillShell:`stop_circle`,BashOutput:`terminal`},C=p(()=>x[i.item.name]??`build`),w=p(()=>{if(v.value)return``;let e=i.item.input,t=T(e);return t?J(t,g.selectedWorkspace):``});function T(e){if(!e||typeof e!=`object`)return typeof e==`string`?e:``;let t=e;for(let e of[`file_path`,`path`,`command`,`pattern`,`query`,`url`,`skill`,`description`,`subject`,`prompt`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}for(let e of Object.values(t))if(typeof e==`string`&&e.length>0)return e;return``}let E=p(()=>{let e=v.value;return e?e.toolName===`Edit`&&e.oldString!==void 0&&e.newString!==void 0?oe(e.oldString,e.newString):e.toolName===`Write`&&e.content!==void 0?e.content.split(`
|
|
7
|
+
`).map(e=>({type:`add`,content:e})):e.toolName===`Bash:rm`?[{type:`del`,content:`File deleted`}]:null:null}),D=p(()=>{let e=i.item.result;if(!e)return``;if(typeof e.output==`string`)return e.output;try{return JSON.stringify(e.output)}catch{return String(e.output)}}),O=new Set([`Read`]),A=p(()=>!!(i.item.result&&D.value)&&(!O.has(i.item.name)||i.item.result?.isError===!0));function j(){o.value=!o.value}return n(()=>i.item.result?.isError===!0,e=>{e&&(o.value=!0)},{immediate:!0}),(n,i)=>v.value?(t(),m(`div`,{key:0,class:s([`tool-row`,{"tool-row-expanded":o.value}])},[_(`div`,{class:`tool-header`,onClick:j},[d(S,{name:C.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,ce,c(v.value.toolName===`Bash:rm`?`Bash`:v.value.toolName),1),_(`span`,{class:`tool-path`,title:v.value.filePath},c(y.value),9,le),v.value.additions>0?(t(),m(`span`,Y,`+`+c(v.value.additions),1)):u(``,!0),v.value.deletions>0?(t(),m(`span`,X,`-`+c(v.value.deletions),1)):u(``,!0),e.item.result?.isError?(t(),l(S,{key:2,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-xs`})):e.item.result?(t(),l(S,{key:3,name:`check`,color:`positive`,size:`xs`,class:`q-ml-xs`})):u(``,!0),d(S,{name:o.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-auto text-grey-6`},null,8,[`name`])]),o.value&&E.value?(t(),m(`div`,{key:0,class:`tool-diff`,onClick:i[0]||=b(()=>{},[`stop`])},[(t(!0),m(h,null,r(E.value,(e,n)=>(t(),m(`div`,{key:n,class:s([`diff-line`,{"diff-del":e.type===`del`,"diff-add":e.type===`add`,"diff-context":e.type===`context`}])},[_(`span`,ue,c(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),f(c(e.content),1)],2))),128))])):u(``,!0)],2)):(t(),m(`div`,{key:1,class:s([`tool-row tool-row-generic`,{"tool-row-expanded":o.value,"tool-row--toggleable":A.value}])},[_(`div`,{class:`tool-header`,onClick:i[1]||=e=>A.value&&j()},[d(S,{name:C.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,de,c(e.item.name),1),w.value?(t(),m(`span`,{key:0,class:`tool-arg`,title:T(e.item.input)||w.value},c(w.value),9,Z)):u(``,!0),e.item.result?.isError?(t(),l(S,{key:1,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-auto`})):e.item.result?(t(),l(S,{key:2,name:`check`,color:`positive`,size:`xs`,class:`q-ml-auto`})):u(``,!0),A.value?(t(),l(S,{key:3,name:o.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-xs text-grey-6`},null,8,[`name`])):u(``,!0)]),o.value&&A.value?(t(),m(`div`,{key:0,class:`tool-output`,onClick:i[2]||=b(()=>{},[`stop`])},c(D.value),1)):u(``,!0)],2))}}),[[`__scopeId`,`data-v-b1ed78cb`]]);function $(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 fe=[`innerHTML`],pe=[`innerHTML`],me=[`src`],he=L(v({__name:`UserMessageItem`,props:{item:{}},setup(e){let n=e,r=k(),i=p(()=>n.item.sender===`system-prompt`),s=p(()=>{let e=$(n.item.content,r.selectedWorkspaceId??``),t=P.parse(e,{async:!1,breaks:!0,gfm:!0});return F.sanitize(t)}),c=a(null),f=a(!1);function g(e){let t=e.target;if(t?.tagName!==`IMG`)return;let n=t;n.src&&(c.value=n.src,f.value=!0)}return(e,n)=>(t(),m(h,null,[i.value?(t(),l(j,{key:0,dense:``,"dense-toggle":``,label:e.$t(`chat.systemPrompt`),"header-class":`text-grey-5 text-caption`},{default:o(()=>[_(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:s.value},null,8,fe)]),_:1},8,[`label`])):(t(),m(`div`,{key:1,class:`markdown-message`,onClick:g},[_(`div`,{innerHTML:s.value},null,8,pe)])),d(C,{modelValue:f.value,"onUpdate:modelValue":n[1]||=e=>f.value=e},{default:o(()=>[c.value?(t(),m(`img`,{key:0,src:c.value,alt:``,class:`image-lightbox-img`,onClick:n[0]||=e=>f.value=!1},null,8,me)):u(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-3a29c489`]]),ge={class:`turn-header`},_e={key:0,class:`turn-time`},ve={class:`turn-time turn-time-updated`},ye={key:2,class:`turn-actions`},be={class:`turn-body`},xe={key:0,class:`turn-scroll-top`},Se=L(v({__name:`TurnCard`,props:{turn:{}},emits:[`scrollTo`],setup(e,{emit:n}){let i=e,v=n,{t:b}=E(),x=a(null);function C(){let e=x.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;v(`scrollTo`,Math.max(0,n-8))}let w=p(()=>{switch(i.turn.speaker){case`user`:return{label:b(`chat.you`),accent:`#ce93d8`,badgeClass:`turn-badge-user`};case`agent`:return{label:b(`chat.agent`),accent:`#7986cb`,badgeClass:`turn-badge-agent`};case`system-prompt`:return{label:b(`chat.systemPrompt`),accent:`#757575`,badgeClass:`turn-badge-system`};case`session`:return{label:b(`chat.session`),accent:`#616161`,badgeClass:`turn-badge-session`}}});function D(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 O=p(()=>D(i.turn.ts)),k=p(()=>{let e=i.turn.items;if(e.length===0)return null;for(let t=e.length-1;t>=0;t--){let n=e[t].ts;if(n)return n}return null}),A=p(()=>{let e=i.turn.ts,t=k.value;if(!t||!e||t===e)return``;let n=new Date(e).getTime(),r=new Date(t).getTime();return Number.isNaN(n)||Number.isNaN(r)||r<=n?``:D(t,r-n<6e4)}),j=p(()=>A.value!==``),M=p(()=>i.turn.items.filter(e=>e.type===`tool`).length);return(n,i)=>(t(),m(`div`,{ref_key:`cardEl`,ref:x,class:s([`turn-card`,{"turn-card--user":e.turn.speaker===`user`}]),style:y({"--turn-accent":w.value.accent})},[_(`div`,ge,[_(`span`,{class:s([`turn-badge`,w.value.badgeClass])},c(w.value.label),3),O.value?(t(),m(`span`,_e,c(O.value),1)):u(``,!0),j.value?(t(),m(h,{key:1},[d(S,{name:`arrow_forward`,size:`10px`,color:`grey-7`,class:`turn-time-arrow`}),_(`span`,ve,[f(c(A.value)+` `,1),d(N,null,{default:o(()=>[f(c(g(b)(`chat.lastUpdatedAt`,{time:A.value})),1)]),_:1})])],64)):u(``,!0),M.value>0?(t(),m(`span`,ye,` · `+c(g(b)(`chat.nActions`,{n:M.value})),1)):u(``,!0)]),_(`div`,be,[(t(!0),m(h,null,r(e.turn.items,(e,n)=>(t(),m(h,{key:n},[e.type===`text`?(t(),l(ie,{key:0,item:e},null,8,[`item`])):e.type===`thinking`?(t(),l(K,{key:1,item:e},null,8,[`item`])):e.type===`tool`?(t(),l(Q,{key:2,item:e},null,8,[`item`])):e.type===`user`?(t(),l(he,{key:3,item:e},null,8,[`item`])):e.type===`session`?(t(),l(B,{key:4,item:e},null,8,[`item`])):u(``,!0)],64))),128))]),e.turn.items.length>4?(t(),m(`div`,xe,[d(T,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`grey-6`,class:`turn-scroll-top-btn`,onClick:C},{default:o(()=>[d(N,null,{default:o(()=>[f(c(g(b)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):u(``,!0)],6))}}),[[`__scopeId`,`data-v-50994916`]]),Ce={key:0,class:`activity-feed-switching`},we={key:1,class:`activity-feed-wrap`},Te={key:0,class:`text-center q-py-sm text-caption text-grey-6`},Ee={class:`q-pa-md`},De={key:1,class:`q-px-md q-pb-md`},Oe={class:`activity-feed-nav-cluster`},ke=60,Ae=200,je=200,Me=400,Ne=200,Pe=L(v({__name:`ActivityFeed`,props:{workspaceId:{}},setup(s){let g=s,v=D(),y=w(),b=k(),S=p(()=>b.selectedSessionId),C=p(()=>b.sessions.find(e=>e.id===S.value)?.engineSessionId??null);function E(e){return!S.value||!e?!0:e===S.value||e===C.value}let N=p(()=>(b.activityFeeds[g.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&E(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,ts:e.timestamp,sessionId:e.sessionId}))),P=p(()=>O(b.workspaces.find(e=>e.id===g.workspaceId)?.status)),F=p(()=>{let e=v.eventsFor(g.workspaceId),t=v.timestampsFor(g.workspaceId),n=v.sessionIdsFor(g.workspaceId),r=[],i=[];for(let a=0;a<e.length;a++)E(n[a])&&(r.push(e[a]),i.push(t[a]));let a=te(ee(r,i,P.value),N.value);return ne(y.showVerboseSystemMessages?a:a.filter(e=>e.type!==`session`))}),I=p(()=>y.showVerboseSystemMessages?v.eventsFor(g.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),L=a(null),R=a(!0),z=a(!1),B=!1,V=a(!0),H=a(new Map);function re(e){R.value=e.verticalSize-e.verticalPosition-e.verticalContainerSize<=ke,B&&e.verticalPosition<=Ae&&!z.value&&ie()&&G()}function U(e,t){return`${e}:${t}`}function ie(){let e=S.value;return e?H.value.get(U(g.workspaceId,e))??!0:v.hasMoreOlderFor(g.workspaceId)}function W(e,t,n){H.value.set(U(e,t),n)}function ae(e){if(!S.value)return v.oldestIdFor(e);let t=v.eventIdsFor(e),n=v.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!E(n[e]))continue;let r=t[e];if(r)return r}}async function G(){let t=g.workspaceId,n=S.value,r=ae(t);if(!r)return;z.value=!0;let i=Date.now();try{let i=L.value,a=i?.getScroll().verticalSize??0,o=i?.getScroll().verticalPosition??0,s=new URLSearchParams({before:r,limit:`200`});n&&s.set(`session`,n);let c=fetch(`/api/workspaces/${t}/events?${s.toString()}`),l=new Promise(e=>setTimeout(e,je)),[u]=await Promise.all([c,l]);if(!u.ok){n?W(t,n,!1):v.prepend(t,[],[],{oldestId:r,hasMoreOlder:!1});return}let d=await u.json(),f=d.events??[],p=f.filter(e=>e.type===`agent:event`&&e.workspaceId===t),m=f.filter(e=>e.type===`user:message`&&e.workspaceId===t),h=p.map(e=>e.payload),g=p.map(e=>e.createdAt),_=p.map(e=>e.sessionId??null),y=p.map(e=>e.id),x=f.length>0?f[0].id:r;n&&W(t,n,d.hasMore),v.prepend(t,h,g,{oldestId:x,hasMoreOlder:n?v.hasMoreOlderFor(t):d.hasMore,sessionIds:_,eventIds:y});for(let e of m){let n=e.payload;typeof n.content==`string`&&b.addActivityItem(t,{id:e.id,type:`text`,content:n.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:n.sender??`user`}})}if(await e(),i){let e=i.getScroll().verticalSize-a,t=Math.max(o+e,Ae+50);i.setScrollPosition(`vertical`,t,0)}}catch(e){console.error(`[ActivityFeed] failed to load older events:`,e)}finally{let e=Date.now()-i,t=Math.max(0,je-e);await new Promise(e=>setTimeout(e,t+Me)),z.value=!1}}async function K(t=0){await e();let n=L.value;if(!n)return;let r=n.getScroll();n.setScrollPosition(`vertical`,r.verticalSize,t)}function oe(e){let t=L.value;t&&t.setScrollPosition(`vertical`,Math.max(0,e),250)}let q=a([]),J=a(null);function se(){let e=F.value,t=q.value,n=[];if(t.length===e.length){for(let r=0;r<e.length;r++){if(e[r].speaker!==`user`)continue;let i=t[r]?.$el;i&&n.push(i)}if(n.length>0)return n}let r=J.value?.parentElement;if(r){let e=r.querySelectorAll(`.turn-card--user`);for(let t of e)n.push(t)}return n}function ce(){let e=L.value;if(!e)return null;let t=J.value;if(!t)return null;let n=e.getScroll().verticalPosition,r=t.getBoundingClientRect().top,i=null;for(let e of se()){let t=e.getBoundingClientRect().top-r;if(t<n-40)i=t;else break}return i}async function le(){let t=L.value;if(!t)return;let n=ce();if(n===null)for(let t=0;t<15&&ie();t++){for(;z.value;)await new Promise(e=>setTimeout(e,50));if(await G(),await e(),n=ce(),n!==null)break}n!==null&&t.setScrollPosition(`vertical`,Math.max(0,n-12),250)}async function Y(){B=!1,await e(),await K(0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{B=!0})})}let X=p(()=>{let e=v.sessionIdsFor(g.workspaceId);if(!S.value)return e.length;let t=0;for(let n of e)E(n)&&t++;return t}),ue=p(()=>v.eventsFor(g.workspaceId).length);async function de(){V.value=!0;let e=Date.now();await new Promise(e=>setTimeout(e,Ne));let t=e+5e3;for(;ue.value===0&&Date.now()<t;)await new Promise(e=>setTimeout(e,50));V.value=!1}n(V,async e=>{!e&&X.value>0&&await Y(),!e&&X.value===0&&S.value&&$()}),i(()=>{de(),X.value>0&&Y(),S.value&&$()});let Z=!1;n(X,async(e,t)=>{if(!Z&&e>0){Z=!0,await Y();return}e>t&&R.value&&!z.value&&await K(180)}),n(()=>g.workspaceId,()=>{R.value=!0,Z=!1,B=!1,de(),X.value>0&&Y()}),n(()=>b.selectedSessionId,async()=>{R.value=!0,B=!1,await Y(),$()});let Q=new Set;async function $(){let t=S.value;if(!t||X.value>0)return;let n=U(g.workspaceId,t);if(!Q.has(n)){Q.add(n);try{let n=await fetch(`/api/workspaces/${g.workspaceId}/events?session=${encodeURIComponent(t)}&limit=500`);if(!n.ok)return;let r=await n.json(),i=r.events??[];if(i.length===0)return;let a=i.filter(e=>e.type===`agent:event`&&e.workspaceId===g.workspaceId),o=i.filter(e=>e.type===`user:message`&&e.workspaceId===g.workspaceId),s=a.map(e=>e.payload),c=a.map(e=>e.createdAt),l=a.map(e=>e.sessionId??null),u=a.map(e=>e.id);W(g.workspaceId,t,r.hasMore),s.length>0&&v.prepend(g.workspaceId,s,c,{oldestId:i[0].id,hasMoreOlder:v.hasMoreOlderFor(g.workspaceId),sessionIds:l,eventIds:u});for(let e of o){let t=e.payload;typeof t.content==`string`&&b.addActivityItem(g.workspaceId,{id:e.id,type:`text`,content:t.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:t.sender??`user`}})}await e(),await K(0)}catch(e){console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),Q.delete(n)}}}n(p(()=>N.value.filter(e=>e.sender!==`system-prompt`).length),async(e,t)=>{e>t&&(R.value=!0,await K(180))});async function fe(){R.value=!0,await K(250)}return(e,n)=>V.value?(t(),m(`div`,Ce,[d(A,{size:`40px`,color:`indigo-4`})])):(t(),m(`div`,we,[d(M,{ref_key:`scrollRef`,ref:L,class:`activity-feed-scroll`,onScroll:re},{default:o(()=>[_(`div`,{ref_key:`contentOriginRef`,ref:J,class:`content-origin-marker`},null,512),z.value?(t(),m(`div`,Te,[d(x,{size:`sm`}),f(` `+c(e.$t(`activity.loading_older`)),1)])):u(``,!0),_(`div`,Ee,[(t(!0),m(h,null,r(F.value,(e,n)=>(t(),l(Se,{key:n,ref_for:!0,ref_key:`turnRefs`,ref:q,turn:e,onScrollTo:oe},null,8,[`turn`]))),128))]),I.value.length?(t(),m(`div`,De,[d(j,{label:e.$t(`activity.raw_lines`,{n:I.value.length}),dense:``},{default:o(()=>[(t(!0),m(h,null,r(I.value,(e,n)=>(t(),m(`div`,{key:n,class:`text-caption text-grey q-pa-xs`},c(e),1))),128))]),_:1},8,[`label`])])):u(``,!0)]),_:1},512),_(`div`,Oe,[R.value?u(``,!0):(t(),l(T,{key:0,round:``,dense:``,unelevated:``,color:`grey-9`,"text-color":`grey-3`,icon:`arrow_downward`,size:`sm`,class:`activity-feed-nav-btn`,title:e.$t(`activity.scroll_to_bottom`),onClick:fe},null,8,[`title`])),d(T,{round:``,dense:``,unelevated:``,color:`grey-9`,"text-color":`grey-3`,icon:`arrow_upward`,size:`sm`,class:`activity-feed-nav-btn`,title:e.$t(`activity.prev_user_message`),onClick:le},null,8,[`title`])])]))}}),[[`__scopeId`,`data-v-a9305543`]]);export{Pe as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{k as e,m as t}from"./QIcon-B0-pH3Qs.js";import{d as n,f as r}from"./scroll-
|
|
1
|
+
import{k as e,m as t}from"./QIcon-B0-pH3Qs.js";import{d as n,f as r}from"./scroll-CYWyxBdv.js";function i(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=r(e);i!==void 0&&n(i,t,o.depth)})},handlerKey(e){t(e,13)===!0&&o.handler(e)}};e.__qclosepopup=o,e.addEventListener(`click`,o.handler),e.addEventListener(`keyup`,o.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=i(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{a as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.create-page[data-v-81666389]{background-color:#1a1a2e;min-height:100%;padding:48px 24px}.create-inner[data-v-81666389]{width:100%;max-width:700px}.create-title[data-v-81666389]{font-size:24px;line-height:1.3}.create-card[data-v-81666389]{background:#224;border:1px solid #444;overflow:hidden}.card-top-bar[data-v-81666389]{background:#1e1e3a;min-height:36px}.card-name-wrap[data-v-81666389]{background:#224;padding:8px 16px 4px}.card-name-wrap[data-v-81666389] .q-field__control{height:32px;min-height:32px;padding:0}.card-name-wrap[data-v-81666389] input{color:#e0e0e0;font-size:15px;font-weight:500}.card-name-wrap[data-v-81666389] input::placeholder{color:#555}.card-textarea-wrap[data-v-81666389]{background:#224}.repo-select[data-v-81666389]{min-width:160px;max-width:260px}.repo-select[data-v-81666389] .q-field__prepend{align-items:center;height:auto;padding-top:0}.create-textarea[data-v-81666389]{color:#d0d0d0;width:100%;padding:12px 16px 4px}.create-textarea[data-v-81666389] .q-field__control{padding:0}.create-textarea[data-v-81666389] textarea{color:#d0d0d0;resize:none;min-height:100px;font-size:14px;line-height:1.6}.create-textarea[data-v-81666389] textarea::placeholder{color:#666}.notion-toggle-btn[data-v-81666389]{background:#333;padding:2px 10px}.notion-url-wrap[data-v-81666389]{background:#1e1e3a;padding:8px 0 0}.notion-url-input[data-v-81666389]{padding:0 12px}.notion-url-input[data-v-81666389] .q-field__control{height:36px;min-height:36px;padding:0}.notion-url-input[data-v-81666389] input{color:#d0d0d0;font-size:13px}.notion-url-input[data-v-81666389] input::placeholder{color:#555;font-size:12px}.notion-error[data-v-81666389],.notion-valid[data-v-81666389]{padding-bottom:6px}.sentry-toggle-btn[data-v-81666389]{background:#333;padding:2px 10px}.sentry-url-wrap[data-v-81666389]{background:#1e1e3a;padding:8px 0 0}.sentry-url-input[data-v-81666389]{padding:0 12px}.sentry-url-input[data-v-81666389] .q-field__control{height:36px;min-height:36px;padding:0}.sentry-url-input[data-v-81666389] input{color:#d0d0d0;font-size:13px}.sentry-url-input[data-v-81666389] input::placeholder{color:#555;font-size:12px}.sentry-error[data-v-81666389],.sentry-valid[data-v-81666389]{padding-bottom:6px}.slide-enter-active[data-v-81666389],.slide-leave-active[data-v-81666389]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-81666389],.slide-leave-to[data-v-81666389]{opacity:0;max-height:0}.slide-enter-to[data-v-81666389],.slide-leave-from[data-v-81666389]{opacity:1;max-height:120px}.card-bottom-bar[data-v-81666389]{background:#1e1e3a}.bottom-row[data-v-81666389]{flex-wrap:wrap;min-height:40px}.bottom-row-agent[data-v-81666389]{border-bottom:1px solid #ffffff0f}.bottom-row-agent+.bottom-row-git[data-v-81666389]{background:#00000026}.skip-setup-btn[data-v-81666389]{min-height:28px;padding:2px 10px;font-size:11px}.skip-setup-btn[data-v-81666389] .q-btn__content{gap:4px}.skip-setup-btn[data-v-81666389] .q-icon{font-size:14px}.bottom-row-git .bottom-select.repo-select[data-v-81666389]{flex:280px;min-width:220px}.bottom-row-git .bottom-select.repo-select[data-v-81666389] input{color:#bbb;padding:0 4px;font-size:11px}.bottom-row-git .bottom-select.repo-select[data-v-81666389] input::placeholder{color:#666;font-style:italic}.bottom-row-git .bottom-select.branch-type-select[data-v-81666389],.bottom-row-git .bottom-select.branch-select[data-v-81666389]{flex:none}.bottom-select[data-v-81666389]{background:#333;min-width:60px;height:28px;padding:0 6px}.bottom-select[data-v-81666389] .q-field__control{height:28px;min-height:28px;padding:0}.bottom-select[data-v-81666389] .q-field__native{min-height:unset;padding:0}.bottom-select-label[data-v-81666389]{color:#bbb;gap:2px;font-size:11px}.bottom-sep[data-v-81666389]{color:#555;padding:0 2px;font-size:12px;line-height:1}.repo-path-wrap[data-v-81666389]{background:#333;border-radius:6px;height:28px;padding:0 8px}.repo-input[data-v-81666389]{min-width:140px}.repo-input[data-v-81666389] .q-field__control{height:28px;min-height:28px;padding:0}.repo-input[data-v-81666389] input{color:#bbb;font-size:11px}.repo-input[data-v-81666389] input::placeholder{color:#666;font-size:11px}.branch-select[data-v-81666389]{min-width:80px}.create-btn[data-v-81666389]{color:#fff;background:#4f46e5;min-width:220px;height:32px;padding:0 32px;font-size:13px}.create-btn[data-v-81666389] .q-btn__content{height:32px}.create-hint[data-v-81666389]{line-height:1.5}.fade-enter-active[data-v-81666389],.fade-leave-active[data-v-81666389]{transition:opacity .2s}.fade-enter-from[data-v-81666389],.fade-leave-to[data-v-81666389]{opacity:0}.manual-hint[data-v-81666389]{background:#1e1e3a;line-height:1.4}.manual-expansion[data-v-81666389]{background:#1e1e3a;border:1px solid #333;border-radius:4px;margin-top:6px;overflow:hidden}.manual-expansion[data-v-81666389] .manual-expansion-header{min-height:32px;padding:4px 10px;font-size:12px}.manual-expansion[data-v-81666389] .q-expansion-item__content,.manual-section-body[data-v-81666389]{background:#1a1a2e}.manual-input[data-v-81666389] .q-field__control{height:26px;min-height:26px;padding:0}.manual-input[data-v-81666389] input{color:#e0e0e0;font-size:12px}.manual-input[data-v-81666389] input::placeholder{color:#555}.manual-item[data-v-81666389]{border-top:1px solid #ffffff0a}.manual-item[data-v-81666389]:first-child{border-top:none}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{F as e,H as t,L as n,M as r,N as i,Q as a,T as ee,U as o,bt as s,d as c,f as l,g as u,h as d,l as f,p,r as te,rt as ne,u as m,v as re,vt as ie,x as ae}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{I as h,L as g,M as oe,t as _}from"./QIcon-B0-pH3Qs.js";import{t as v}from"./QSeparator-DNSiXYrN.js";import{t as se}from"./settings-CAILUJXO.js";import{t as y}from"./QBtn-DHwAb18J.js";import{n as ce}from"./vue-i18n-BJlZEYnA.js";import{g as le,i as b,m as ue,v as de}from"./index-ljurK0Xv.js";import{n as x,t as S}from"./QItemSection-CiY_LK5Y.js";import{t as C}from"./QItemLabel-Codqjisk.js";import{t as fe}from"./QExpansionItem-CWw6ZujM.js";import{t as w}from"./QTooltip-BIDjo2hJ.js";import{t as pe}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as me}from"./QSpace-BNr0AftG.js";import{t as he}from"./use-quasar-Cc4smfg5.js";import{n as T,t as ge}from"./models-BWwzb9Qz.js";import{t as _e}from"./QPage-Dn4E3GHB.js";var ve={class:`create-inner`},ye={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},be={class:`create-card rounded-borders`},xe={class:`card-top-bar row items-center q-px-md q-py-xs`},Se={class:`model-badge cursor-default row items-center q-gutter-xs`},Ce={class:`text-indigo-3 text-weight-medium text-caption`},we={key:0,class:`notion-url-wrap`},Te={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ee={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},De={key:0,class:`sentry-url-wrap`},Oe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},ke={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},Ae={class:`card-name-wrap`},je={class:`card-textarea-wrap`},Me={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},Ne={class:`q-pa-sm manual-section-body`},Pe={class:`row items-center q-gutter-sm q-mb-sm`},Fe={class:`col text-caption text-grey-4`},Ie={class:`q-pa-sm manual-section-body`},Le={class:`row items-center q-gutter-sm q-mb-sm`},Re={class:`col text-caption text-grey-4`},ze={class:`card-bottom-bar`},Be={class:`bottom-row bottom-row-agent row items-center q-gutter-xs q-px-sm q-py-xs`},Ve={class:`bottom-select-label row items-center no-wrap`},He={class:`bottom-select-label row items-center no-wrap`},Ue={class:`bottom-select-label row items-center no-wrap`},We={class:`bottom-select-label row items-center no-wrap`},Ge={class:`row no-wrap items-center q-gutter-xs`},Ke={class:`bottom-row bottom-row-git row items-center q-gutter-xs q-px-sm q-py-xs`},qe={class:`bottom-select-label row items-center no-wrap`},Je={class:`bottom-select-label row items-center no-wrap`},Ye={class:`row justify-center q-px-sm q-py-sm`},Xe={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ze=pe(re({__name:`CreatePage`,setup(re){let pe=ue(),Ze=he(),Qe=de(),E=se(),{t:D}=ce(),$e=a([]),O=a(``),k=a(``),A=a(``),j=a(!1),M=a(`claude-opus-4-7`),N=a(`auto`),P=a(``),F=a(null),I=a(`feature`),L=a(!1),R=a([]),z=a(`claude-code`),et=f(()=>R.value.find(e=>e.id===z.value)),tt=f(()=>R.value.map(e=>({value:e.id,label:e.displayName}))),nt=f(()=>(et.value?.capabilities.permissionModes??[`auto-accept`,`plan`]).map(e=>({value:e,label:D(`engine.permission.${e}`)}))),rt=[{label:`feature/`,value:`feature`},{label:`fix/`,value:`fix`},{label:`hotfix/`,value:`hotfix`},{label:`chore/`,value:`chore`},{label:`refactor/`,value:`refactor`},{label:`docs/`,value:`docs`},{label:`test/`,value:`test`}],B=a(E.global.defaultPermissionMode||`plan`),V=a([]),H=a(!1),it=a(!1),at=f(()=>ge.map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));function U(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let ot=f(()=>[{label:U(D(`reasoning.auto`)),value:`auto`,description:D(`reasoning.autoDescription`)},{label:U(D(`reasoning.low`)),value:`low`,description:D(`reasoning.lowDescription`)},{label:U(D(`reasoning.medium`)),value:`medium`,description:D(`reasoning.mediumDescription`)},{label:U(D(`reasoning.high`)),value:`high`,description:D(`reasoning.highDescription`)},{label:U(D(`reasoning.xhigh`)),value:`xhigh`,description:D(`reasoning.xhighDescription`)},{label:U(D(`reasoning.max`)),value:`max`,description:D(`reasoning.maxDescription`)}]),W=f(()=>A.value.trim().startsWith(`https://www.notion.so/`)),G=a([]),K=a([]),q=a(``),J=a(``),st=f(()=>!j.value||!W.value);function ct(){let e=q.value.trim();e&&(G.value.push(e),q.value=``)}function lt(e){G.value.splice(e,1)}function ut(){let e=J.value.trim();e&&(K.value.push(e),J.value=``)}function dt(e){K.value.splice(e,1)}function ft(){j.value=!j.value,j.value||(A.value=``)}let Y=a(!1),X=a(!1),Z=a(``),Q=f(()=>/\/issues\/\d+/.test(Z.value.trim()));function pt(){Y.value=!Y.value,Y.value||(Z.value=``)}async function mt(e){if(!e.trim()){V.value=[],F.value=null;return}H.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();V.value=n.local??n.branches??[],V.value.length>0&&!F.value&&(F.value=V.value[0]??null)}catch{V.value=[],F.value=null}finally{H.value=!1}}function ht(e){let t=E.getProjectByPath(e);t&&(t.defaultSourceBranch&&(F.value=t.defaultSourceBranch),t.defaultModel?M.value=t.defaultModel:E.global.defaultModel&&(M.value=E.global.defaultModel))}let $=null;t(P,e=>{$&&clearTimeout($),$=setTimeout(()=>{F.value=null,mt(e),ht(e)},500)});function gt(e,t){t(()=>{$e.value=E.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}r(async()=>{E.fetchSettings();try{let e=await fetch(`/api/engines`);e.ok&&(R.value=await e.json())}catch{}}),i(()=>{$&&clearTimeout($)});function _t(e){return e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`).substring(0,50)}function vt(){return O.value.trim()?O.value.trim().substring(0,80):!j.value&&!Y.value&&k.value.trim()&&(k.value.trim().split(`
|
|
2
|
+
`)[0]??``).substring(0,80)||`workspace`}function yt(e){let t=(e.split(`/`).pop()??``).split(`-`);t.length>1&&/^[0-9a-f]{12,}$/i.test(t[t.length-1])&&t.pop();let n=t.join(`-`).toLowerCase(),r=n.match(/tk-(\d+)/);if(r){let e=`TK-${r[1]}`,t=n.replace(/tk-\d+/i,``).replace(/-+/g,`-`).replace(/^-|-$/g,``).substring(0,40);return t?`${e}--${t}`:e}return n.substring(0,50)||`task-${Date.now()}`}function bt(){return j.value&&!W.value?D(`createPage.validationNotionUrl`):Y.value&&!Q.value?D(`createPage.sentryValidation`):!j.value&&!Y.value&&!k.value.trim()?D(`createPage.validationDescription`):!j.value&&!Y.value&&(!vt()||vt()===`workspace`)&&!O.value.trim()&&!k.value.trim()?D(`createPage.validationName`):P.value.trim()?F.value?null:D(`createPage.validationBranch`):D(`createPage.validationPath`)}async function xt(){let e=bt();if(e){Ze.notify({type:`negative`,message:e,position:`top`});return}it.value=!0;try{let e=vt(),t;t=j.value&&W.value?yt(A.value.trim()):e===`workspace`?`task-${Date.now()}`:_t(e);let n=`${I.value}/${t}`,r={name:e,projectPath:P.value.trim(),sourceBranch:F.value,workingBranch:n,engine:z.value,model:M.value,reasoningEffort:N.value,...j.value&&W.value?{notionUrl:A.value.trim()}:{},...Y.value&&Q.value?{sentryUrl:Z.value.trim()}:{},...st.value&&G.value.length>0?{tasks:G.value}:{},...st.value&&K.value.length>0?{acceptanceCriteria:K.value}:{},...L.value?{skipSetupScript:!0}:{},...k.value.trim()?{description:k.value.trim()}:{},...X.value?{autoLoop:!0}:{},permissionMode:X.value?`auto-accept`:B.value},i=await Qe.createWorkspace(r);le().subscribe(i.id),Qe.selectWorkspace(i.id),pe.push({name:`workspace`,params:{id:i.id}})}catch{Ze.notify({type:`negative`,message:D(`createPage.errorCreating`),position:`top`})}finally{it.value=!1}}return(t,r)=>(e(),c(_e,{class:`create-page flex flex-center column`},{default:o(()=>[m(`div`,ve,[m(`div`,ye,s(t.$t(`createPage.title`)),1),m(`div`,be,[m(`div`,xe,[m(`span`,Se,[u(_,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),m(`span`,Ce,s(et.value?.displayName??t.$t(`createPage.claudeCode`)),1)]),u(me),u(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:j.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,onClick:ft},{default:o(()=>[u(_,{name:`description`,size:`14px`,class:`q-mr-xs`}),d(` `+s(j.value?t.$t(`createPage.notionEnabled`):t.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`]),u(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:Y.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,onClick:pt},{default:o(()=>[u(_,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),d(` `+s(Y.value?t.$t(`createPage.sentryEnabled`):t.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`])]),u(v,{color:`grey-9`}),u(oe,{name:`slide`},{default:o(()=>[j.value?(e(),p(`div`,we,[u(b,{modelValue:A.value,"onUpdate:modelValue":r[0]||=e=>A.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:o(()=>[u(_,{name:`link`,size:`16px`,color:W.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),A.value.trim()&&!W.value?(e(),p(`div`,Te,s(t.$t(`createPage.notionValidation`)),1)):l(``,!0),W.value?(e(),p(`div`,Ee,s(t.$t(`createPage.notionAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),j.value?(e(),c(v,{key:0,color:`grey-9`})):l(``,!0),u(oe,{name:`slide`},{default:o(()=>[Y.value?(e(),p(`div`,De,[u(b,{modelValue:Z.value,"onUpdate:modelValue":r[1]||=e=>Z.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:o(()=>[u(_,{name:`link`,size:`16px`,color:Q.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!Q.value?(e(),p(`div`,Oe,s(t.$t(`createPage.sentryValidation`)),1)):l(``,!0),Q.value?(e(),p(`div`,ke,s(t.$t(`createPage.sentryAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),Y.value?(e(),c(v,{key:1,color:`grey-9`})):l(``,!0),m(`div`,Ae,[u(b,{modelValue:O.value,"onUpdate:modelValue":r[2]||=e=>O.value=e,borderless:``,dense:``,placeholder:j.value&&W.value?t.$t(`createPage.workspaceName`):t.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),u(v,{color:`grey-9`}),m(`div`,je,[u(b,{modelValue:k.value,"onUpdate:modelValue":r[3]||=e=>k.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:j.value?t.$t(`createPage.instructions`):t.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[h(g(xt,[`ctrl`]),[`enter`]),h(g(xt,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`])]),u(v,{color:`grey-9`}),st.value?(e(),p(te,{key:2},[m(`div`,Me,s(t.$t(`createPage.manualHint`)),1),u(fe,{dark:``,dense:``,label:t.$t(`createPage.tasks`,{count:G.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:o(()=>[m(`div`,Ne,[m(`div`,Pe,[u(b,{modelValue:q.value,"onUpdate:modelValue":r[4]||=e=>q.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:h(g(ct,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!q.value.trim(),onClick:ct},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(te,null,n(G.value,(n,r)=>(e(),p(`div`,{key:`task-${r}`,class:`row items-center q-py-xs manual-item`},[m(`span`,Fe,s(n),1),u(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>lt(r)},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(fe,{dark:``,dense:``,label:t.$t(`createPage.acceptanceCriteria`,{count:K.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:o(()=>[m(`div`,Ie,[m(`div`,Le,[u(b,{modelValue:J.value,"onUpdate:modelValue":r[5]||=e=>J.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:h(g(ut,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!J.value.trim(),onClick:ut},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(te,null,n(K.value,(n,r)=>(e(),p(`div`,{key:`crit-${r}`,class:`row items-center q-py-xs manual-item`},[m(`span`,Re,s(n),1),u(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>dt(r)},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(v,{color:`grey-9`})],64)):l(``,!0),m(`div`,ze,[m(`div`,Be,[tt.value.length>0?(e(),c(T,{key:0,modelValue:z.value,"onUpdate:modelValue":r[6]||=e=>z.value=e,options:tt.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[m(`span`,Ve,[u(_,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(tt.value.find(e=>e.value===z.value)?.label??z.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])):l(``,!0),u(T,{modelValue:M.value,"onUpdate:modelValue":r[7]||=e=>M.value=e,options:at.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[m(`span`,He,[d(s(at.value.find(e=>e.value===M.value)?.label??M.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(x,ee(t,{class:`model-option`}),{default:o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(T,{modelValue:N.value,"onUpdate:modelValue":r[8]||=e=>N.value=e,options:ot.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[m(`span`,Ue,[u(_,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(ot.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(x,ie(ae(t)),{default:o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(T,{modelValue:B.value,"onUpdate:modelValue":r[9]||=e=>B.value=e,options:nt.value,disable:X.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[m(`span`,We,[u(_,{name:X.value?`flash_on`:B.value===`plan`?`visibility`:`flash_on`,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),d(` `+s(X.value?nt.value.find(e=>e.value===`auto-accept`)?.label??`auto-accept`:nt.value.find(e=>e.value===B.value)?.label??B.value)+` `,1),X.value?l(``,!0):(e(),c(_,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(X.value?t.$t(`createPage.permissionLockedByAutoLoop`):t.$t(`engine.permission`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`]),u(me),m(`div`,Ge,[u(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:X.value?`autorenew`:`sync_disabled`,color:X.value?`amber-4`:`grey-5`,label:t.$t(`autoLoop.startInMode`),class:`skip-setup-btn`,onClick:r[10]||=e=>X.value=!X.value},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`]),u(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:L.value?`play_disabled`:`play_circle`,color:L.value?`orange-4`:`grey-5`,label:t.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:r[11]||=e=>L.value=!L.value},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])])]),m(`div`,Ke,[u(T,{modelValue:P.value,"onUpdate:modelValue":r[12]||=e=>P.value=e,options:$e.value,dense:``,borderless:``,"use-input":``,"fill-input":``,"hide-selected":``,"input-debounce":`0`,"new-value-mode":`add`,class:`bottom-select rounded-borders repo-select`,"hide-dropdown-icon":``,"input-class":P.value?``:`repo-input-empty`,placeholder:t.$t(`createPage.projectPath`),behavior:ne(E).projectPaths.length>0?`menu`:`dialog`,onFilter:gt,onInputValue:r[13]||=e=>{P.value=e}},{prepend:o(()=>[u(_,{name:`folder`,size:`14px`,color:`grey-5`})]),"no-option":o(()=>[u(x,null,{default:o(()=>[u(S,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`]),u(T,{modelValue:I.value,"onUpdate:modelValue":r[14]||=e=>I.value=e,options:rt,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:o(()=>[m(`span`,qe,[u(_,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(I.value)+`/ `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`]),u(T,{modelValue:F.value,"onUpdate:modelValue":r[15]||=e=>F.value=e,options:V.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,loading:H.value,disable:!P.value.trim()||H.value},{selected:o(()=>[m(`span`,Je,[u(_,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(F.value??t.$t(`createPage.branch`))+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":o(()=>[u(x,null,{default:o(()=>[u(S,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(P.value.trim()?t.$t(`createPage.noBranches`):t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])]),m(`div`,Ye,[u(y,{label:t.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:it.value,onClick:xt},null,8,[`label`,`loading`])])]),m(`div`,Xe,s(j.value?t.$t(`createPage.notionExtractHint`):t.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-81666389`]]);export{Ze as default};
|