@phenx-inc/ctlsurf 0.14.2 → 0.15.1
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/THIRD-PARTY-NOTICES.md +82 -0
- package/out/headless/index.mjs +91 -72
- package/out/headless/index.mjs.map +3 -3
- package/out/main/index.js +117 -72
- package/out/preload/index.js +6 -1
- package/out/renderer/assets/{cssMode-bQYoCKra.js → cssMode-B77M9HlN.js} +3 -3
- package/out/renderer/assets/{freemarker2-BS1ERQl_.js → freemarker2-oUT2zvyQ.js} +1 -1
- package/out/renderer/assets/{handlebars-B-ZEHRLr.js → handlebars-jCckoi5j.js} +1 -1
- package/out/renderer/assets/{html-lk9e1Lkl.js → html-kAgrAaKW.js} +1 -1
- package/out/renderer/assets/{htmlMode-Ds1eMYgM.js → htmlMode-DIWkIawy.js} +3 -3
- package/out/renderer/assets/{index-BpCORklm.css → index-3sFJEz7i.css} +787 -399
- package/out/renderer/assets/{index-BJNR4hRK.js → index-CN3UN7Tm.js} +431 -104
- package/out/renderer/assets/{javascript-D6OeziKX.js → javascript-B9GYUE-I.js} +2 -2
- package/out/renderer/assets/{jsonMode-t5SESE75.js → jsonMode-BzFKTZjJ.js} +3 -3
- package/out/renderer/assets/{liquid-B5Wjh0p_.js → liquid-Ccw-S_Y6.js} +1 -1
- package/out/renderer/assets/{lspLanguageFeatures-BEgiDCIW.js → lspLanguageFeatures-BE0g7ubH.js} +1 -1
- package/out/renderer/assets/{mdx-ByNAXh8t.js → mdx-oXeAA0qU.js} +1 -1
- package/out/renderer/assets/{python-CIFO0XQW.js → python-DlSX3TvA.js} +1 -1
- package/out/renderer/assets/{razor-LXHhGcNO.js → razor-ButO9S7r.js} +1 -1
- package/out/renderer/assets/{tsMode-WiO8CDaI.js → tsMode-CTCpE-67.js} +1 -1
- package/out/renderer/assets/{typescript-ZBQlq256.js → typescript-9o62WOnS.js} +1 -1
- package/out/renderer/assets/{xml-DBaLJlQU.js → xml-C4nOH2_D.js} +1 -1
- package/out/renderer/assets/{yaml-CId9skah.js → yaml-mXYgKoWW.js} +1 -1
- package/out/renderer/index.html +60 -3
- package/package.json +5 -4
- package/src/main/index.ts +54 -3
- package/src/main/orchestrator.ts +10 -2
- package/src/main/ticketStore.ts +100 -66
- package/src/preload/index.ts +13 -3
- package/src/renderer/App.tsx +4 -2
- package/src/renderer/components/CtlsurfPanel.tsx +1 -1
- package/src/renderer/components/EditorPanel.tsx +29 -1
- package/src/renderer/components/ObserverPanel.tsx +13 -6
- package/src/renderer/components/SettingsDialog.tsx +82 -0
- package/src/renderer/components/TerminalPanel.tsx +12 -22
- package/src/renderer/components/TicketPanel.tsx +33 -15
- package/src/renderer/index.html +58 -1
- package/src/renderer/lib/theme.ts +173 -0
- package/src/renderer/lib/themes.ts +126 -0
- package/src/renderer/styles.css +787 -399
package/out/main/index.js
CHANGED
|
@@ -11002,11 +11002,11 @@ function isSameLocalDay(a, b2) {
|
|
|
11002
11002
|
function log$4(...args) {
|
|
11003
11003
|
log$5("[time-tracker]", ...args);
|
|
11004
11004
|
}
|
|
11005
|
-
function findPageByTitle$
|
|
11005
|
+
function findPageByTitle$1(pages, title) {
|
|
11006
11006
|
for (const p2 of pages) {
|
|
11007
11007
|
if (p2?.title === title) return p2;
|
|
11008
11008
|
if (p2?.children?.length) {
|
|
11009
|
-
const c = findPageByTitle$
|
|
11009
|
+
const c = findPageByTitle$1(p2.children, title);
|
|
11010
11010
|
if (c) return c;
|
|
11011
11011
|
}
|
|
11012
11012
|
}
|
|
@@ -11184,7 +11184,7 @@ class TimeTracker {
|
|
|
11184
11184
|
}
|
|
11185
11185
|
if (!folder?.id) return null;
|
|
11186
11186
|
const folderDetail = await this.api.getFolder(folder.id);
|
|
11187
|
-
const agentPage = findPageByTitle$
|
|
11187
|
+
const agentPage = findPageByTitle$1(folderDetail?.pages || [], AGENT_DATASTORE_PAGE_TITLE$2);
|
|
11188
11188
|
if (!agentPage?.id) return null;
|
|
11189
11189
|
const blockId = await this.findOrAdoptBlock(agentPage.id);
|
|
11190
11190
|
if (blockId) {
|
|
@@ -11289,21 +11289,19 @@ const COLUMNS$1 = [
|
|
|
11289
11289
|
function log$3(...args) {
|
|
11290
11290
|
log$5("[ticket-store]", ...args);
|
|
11291
11291
|
}
|
|
11292
|
-
function
|
|
11292
|
+
function findPagesByTitle(pages, title) {
|
|
11293
|
+
const found = [];
|
|
11293
11294
|
for (const p2 of pages) {
|
|
11294
|
-
if (p2?.title === title)
|
|
11295
|
-
if (p2?.children?.length)
|
|
11296
|
-
const c = findPageByTitle$1(p2.children, title);
|
|
11297
|
-
if (c) return c;
|
|
11298
|
-
}
|
|
11295
|
+
if (p2?.title === title) found.push(p2);
|
|
11296
|
+
if (p2?.children?.length) found.push(...findPagesByTitle(p2.children, title));
|
|
11299
11297
|
}
|
|
11300
|
-
return
|
|
11298
|
+
return found;
|
|
11301
11299
|
}
|
|
11302
11300
|
class TicketStore {
|
|
11303
11301
|
api;
|
|
11304
|
-
// Per-cwd cache of
|
|
11305
|
-
//
|
|
11306
|
-
//
|
|
11302
|
+
// Per-cwd cache of every resolved Tickets datastore. `primary` is where new
|
|
11303
|
+
// tickets are written and what gets handed to the coding agent; `all` covers
|
|
11304
|
+
// duplicate Agent Datastore pages so listing misses nothing.
|
|
11307
11305
|
dsCache = /* @__PURE__ */ new Map();
|
|
11308
11306
|
constructor(api) {
|
|
11309
11307
|
this.api = api;
|
|
@@ -11313,11 +11311,11 @@ class TicketStore {
|
|
|
11313
11311
|
const title = input.title?.trim();
|
|
11314
11312
|
if (!title) return { ok: false, error: "Title is required" };
|
|
11315
11313
|
try {
|
|
11316
|
-
const
|
|
11317
|
-
if (!
|
|
11314
|
+
const stores = await this.resolveStores(cwd, true);
|
|
11315
|
+
if (!stores) {
|
|
11318
11316
|
return { ok: false, error: "No ctlsurf project found for this folder" };
|
|
11319
11317
|
}
|
|
11320
|
-
await this.api.addRow(
|
|
11318
|
+
await this.api.addRow(stores.primary.blockId, {
|
|
11321
11319
|
Title: title,
|
|
11322
11320
|
Description: input.description?.trim() || "",
|
|
11323
11321
|
Status: input.status || "Open",
|
|
@@ -11331,14 +11329,15 @@ class TicketStore {
|
|
|
11331
11329
|
return { ok: false, error: err?.message || String(err) };
|
|
11332
11330
|
}
|
|
11333
11331
|
}
|
|
11334
|
-
/** Updates an existing ticket row
|
|
11335
|
-
|
|
11332
|
+
/** Updates an existing ticket row. `blockId` names the store the row lives
|
|
11333
|
+
* in (from listTickets); without it the primary store is assumed. */
|
|
11334
|
+
async updateTicket(cwd, rowId, input, blockId) {
|
|
11336
11335
|
const title = input.title?.trim();
|
|
11337
11336
|
if (!title) return { ok: false, error: "Title is required" };
|
|
11338
11337
|
try {
|
|
11339
|
-
const
|
|
11340
|
-
if (!
|
|
11341
|
-
await this.api.updateRow(
|
|
11338
|
+
const stores = await this.resolveStores(cwd, false);
|
|
11339
|
+
if (!stores) return { ok: false, error: "No Tickets datastore for this project" };
|
|
11340
|
+
await this.api.updateRow(blockId || stores.primary.blockId, rowId, {
|
|
11342
11341
|
Title: title,
|
|
11343
11342
|
Description: input.description?.trim() || "",
|
|
11344
11343
|
Status: input.status || "Open",
|
|
@@ -11351,28 +11350,39 @@ class TicketStore {
|
|
|
11351
11350
|
return { ok: false, error: err?.message || String(err) };
|
|
11352
11351
|
}
|
|
11353
11352
|
}
|
|
11354
|
-
/** Lists existing tickets
|
|
11355
|
-
*
|
|
11353
|
+
/** Lists existing tickets across every Tickets store in the project's
|
|
11354
|
+
* folder, newest first. Does not create the datastore — an unconfigured
|
|
11355
|
+
* project simply has no tickets yet. */
|
|
11356
11356
|
async listTickets(cwd) {
|
|
11357
11357
|
try {
|
|
11358
|
-
const
|
|
11359
|
-
if (!
|
|
11360
|
-
const
|
|
11361
|
-
const
|
|
11362
|
-
|
|
11363
|
-
|
|
11364
|
-
|
|
11365
|
-
|
|
11366
|
-
|
|
11367
|
-
|
|
11368
|
-
|
|
11369
|
-
|
|
11358
|
+
const stores = await this.resolveStores(cwd, false);
|
|
11359
|
+
if (!stores) return { ok: true, tickets: [] };
|
|
11360
|
+
const tickets = [];
|
|
11361
|
+
for (const ds of stores.all) {
|
|
11362
|
+
const res = await this.api.queryRows(ds.blockId, { orderBy: "Created", order: "desc", limit: 200 });
|
|
11363
|
+
for (const r of res?.rows || []) {
|
|
11364
|
+
tickets.push({
|
|
11365
|
+
id: r.id,
|
|
11366
|
+
title: String(r.data?.Title ?? ""),
|
|
11367
|
+
description: String(r.data?.Description ?? ""),
|
|
11368
|
+
status: String(r.data?.Status ?? "Open"),
|
|
11369
|
+
priority: String(r.data?.Priority ?? "Med"),
|
|
11370
|
+
created: r.data?.Created ?? r.created_at ?? null,
|
|
11371
|
+
blockId: ds.blockId,
|
|
11372
|
+
pageId: ds.pageId
|
|
11373
|
+
});
|
|
11374
|
+
}
|
|
11375
|
+
}
|
|
11376
|
+
if (stores.all.length > 1) {
|
|
11377
|
+
tickets.sort((a, b2) => (b2.created || "").localeCompare(a.created || ""));
|
|
11378
|
+
}
|
|
11379
|
+
return { ok: true, tickets, blockId: stores.primary.blockId, pageId: stores.primary.pageId };
|
|
11370
11380
|
} catch (err) {
|
|
11371
11381
|
log$3(`listTickets failed for ${cwd}: ${err?.message || err}`);
|
|
11372
11382
|
return { ok: false, tickets: [], error: err?.message || String(err) };
|
|
11373
11383
|
}
|
|
11374
11384
|
}
|
|
11375
|
-
async
|
|
11385
|
+
async resolveStores(cwd, create) {
|
|
11376
11386
|
const cached = this.dsCache.get(cwd);
|
|
11377
11387
|
if (cached) return cached;
|
|
11378
11388
|
let folder = null;
|
|
@@ -11383,17 +11393,27 @@ class TicketStore {
|
|
|
11383
11393
|
}
|
|
11384
11394
|
if (!folder?.id) return null;
|
|
11385
11395
|
const folderDetail = await this.api.getFolder(folder.id);
|
|
11386
|
-
const
|
|
11387
|
-
if (
|
|
11388
|
-
const
|
|
11389
|
-
|
|
11390
|
-
if (
|
|
11391
|
-
|
|
11392
|
-
|
|
11393
|
-
|
|
11394
|
-
|
|
11396
|
+
const agentPages = findPagesByTitle(folderDetail?.pages || [], AGENT_DATASTORE_PAGE_TITLE$1);
|
|
11397
|
+
if (agentPages.length === 0) return null;
|
|
11398
|
+
const rootPath = folder.root_path || cwd;
|
|
11399
|
+
agentPages.sort((a, b2) => Number(b2?.root_path === rootPath) - Number(a?.root_path === rootPath));
|
|
11400
|
+
if (agentPages.length > 1) {
|
|
11401
|
+
log$3(`Found ${agentPages.length} "Agent Datastore" pages for ${cwd}; aggregating tickets across all of them`);
|
|
11402
|
+
}
|
|
11403
|
+
const all = [];
|
|
11404
|
+
for (const page of agentPages) {
|
|
11405
|
+
for (const blockId of await this.findTicketBlocks(page.id)) {
|
|
11406
|
+
all.push({ blockId, pageId: page.id });
|
|
11407
|
+
}
|
|
11408
|
+
}
|
|
11409
|
+
if (all.length > 0) {
|
|
11410
|
+
for (const ds of all) await this.ensureColumns(ds.blockId);
|
|
11411
|
+
const stores = { primary: all[0], all };
|
|
11412
|
+
this.dsCache.set(cwd, stores);
|
|
11413
|
+
return stores;
|
|
11395
11414
|
}
|
|
11396
11415
|
if (!create) return null;
|
|
11416
|
+
const pageId = agentPages[0].id;
|
|
11397
11417
|
const columns = COLUMNS$1.map((c, i) => ({
|
|
11398
11418
|
id: `col_${i}`,
|
|
11399
11419
|
name: c.name,
|
|
@@ -11408,47 +11428,45 @@ class TicketStore {
|
|
|
11408
11428
|
if (created?.id) {
|
|
11409
11429
|
log$3(`Created "${DATASTORE_TITLE}" datastore on Agent Datastore page for ${cwd}`);
|
|
11410
11430
|
const ds = { blockId: created.id, pageId };
|
|
11411
|
-
|
|
11412
|
-
|
|
11431
|
+
const stores = { primary: ds, all: [ds] };
|
|
11432
|
+
this.dsCache.set(cwd, stores);
|
|
11433
|
+
return stores;
|
|
11413
11434
|
}
|
|
11414
11435
|
return null;
|
|
11415
11436
|
}
|
|
11416
|
-
/** Finds
|
|
11417
|
-
*
|
|
11418
|
-
*
|
|
11419
|
-
|
|
11437
|
+
/** Finds every Tickets block on the page: system_key matches first, then
|
|
11438
|
+
* title matches for legacy blocks. When no system_key block exists, the
|
|
11439
|
+
* first legacy block is adopted (system_key backfilled so it survives a
|
|
11440
|
+
* later rename); extra title matches are still listed but left unstamped so
|
|
11441
|
+
* the primary can't flip between sessions. */
|
|
11442
|
+
async findTicketBlocks(pageId) {
|
|
11420
11443
|
const summaries = await this.api.getPageBlockSummaries(pageId) || [];
|
|
11421
11444
|
const datastoreSummaries = summaries.filter((b2) => b2?.type === "datastore" && b2?.id);
|
|
11422
|
-
if (datastoreSummaries.length === 0) return
|
|
11423
|
-
|
|
11424
|
-
|
|
11445
|
+
if (datastoreSummaries.length === 0) return [];
|
|
11446
|
+
const keyed = [];
|
|
11447
|
+
const legacy = [];
|
|
11425
11448
|
for (const s of datastoreSummaries) {
|
|
11426
11449
|
try {
|
|
11427
11450
|
const block = await this.api.getBlock(s.id);
|
|
11428
11451
|
const props = block?.props || {};
|
|
11429
|
-
if (props.system_key === SYSTEM_KEY)
|
|
11430
|
-
|
|
11431
|
-
}
|
|
11432
|
-
if (s.title === DATASTORE_TITLE && titleFallbackId === null) {
|
|
11433
|
-
titleFallbackId = s.id;
|
|
11434
|
-
titleFallbackProps = props;
|
|
11435
|
-
}
|
|
11452
|
+
if (props.system_key === SYSTEM_KEY) keyed.push(s.id);
|
|
11453
|
+
else if (s.title === DATASTORE_TITLE) legacy.push({ id: s.id, props });
|
|
11436
11454
|
} catch (err) {
|
|
11437
11455
|
log$3(`getBlock(${s.id}) failed during lookup: ${err?.message || err}`);
|
|
11438
11456
|
}
|
|
11439
11457
|
}
|
|
11440
|
-
if (
|
|
11458
|
+
if (keyed.length === 0 && legacy.length > 0) {
|
|
11459
|
+
const adopt = legacy[0];
|
|
11441
11460
|
try {
|
|
11442
|
-
await this.api.updateBlock(
|
|
11443
|
-
props: { ...
|
|
11461
|
+
await this.api.updateBlock(adopt.id, {
|
|
11462
|
+
props: { ...adopt.props, system_key: SYSTEM_KEY }
|
|
11444
11463
|
});
|
|
11445
|
-
log$3(`Backfilled system_key on legacy Tickets block ${
|
|
11464
|
+
log$3(`Backfilled system_key on legacy Tickets block ${adopt.id}`);
|
|
11446
11465
|
} catch (err) {
|
|
11447
|
-
log$3(`backfill system_key failed on ${
|
|
11466
|
+
log$3(`backfill system_key failed on ${adopt.id}: ${err?.message || err}`);
|
|
11448
11467
|
}
|
|
11449
|
-
return titleFallbackId;
|
|
11450
11468
|
}
|
|
11451
|
-
return
|
|
11469
|
+
return [...keyed, ...legacy.map((l) => l.id)];
|
|
11452
11470
|
}
|
|
11453
11471
|
async ensureColumns(blockId) {
|
|
11454
11472
|
try {
|
|
@@ -23328,13 +23346,13 @@ class Orchestrator {
|
|
|
23328
23346
|
}
|
|
23329
23347
|
return this.ticketStore.addTicket(cwd, input);
|
|
23330
23348
|
}
|
|
23331
|
-
async updateTicketForActiveTab(rowId, input) {
|
|
23349
|
+
async updateTicketForActiveTab(rowId, input, blockId) {
|
|
23332
23350
|
const cwd = this.getActiveTabProjectPath();
|
|
23333
23351
|
if (!cwd) return { ok: false, error: "No active terminal tab" };
|
|
23334
23352
|
if (!this.ctlsurfApi.getApiKey()) {
|
|
23335
23353
|
return { ok: false, error: "ctlsurf API key not configured" };
|
|
23336
23354
|
}
|
|
23337
|
-
return this.ticketStore.updateTicket(cwd, rowId, input);
|
|
23355
|
+
return this.ticketStore.updateTicket(cwd, rowId, input, blockId);
|
|
23338
23356
|
}
|
|
23339
23357
|
async listTicketsForActiveTab() {
|
|
23340
23358
|
const cwd = this.getActiveTabProjectPath();
|
|
@@ -23626,12 +23644,18 @@ const orchestrator = new Orchestrator(
|
|
|
23626
23644
|
}
|
|
23627
23645
|
);
|
|
23628
23646
|
function createWindow() {
|
|
23647
|
+
const saved = orchestrator.settingsData;
|
|
23648
|
+
if (saved.themeSource === "light" || saved.themeSource === "dark" || saved.themeSource === "system") {
|
|
23649
|
+
electron.nativeTheme.themeSource = saved.themeSource;
|
|
23650
|
+
}
|
|
23651
|
+
const savedBg = typeof saved.themeBackground === "string" && /^#[0-9a-fA-F]{6}$/.test(saved.themeBackground) ? saved.themeBackground : null;
|
|
23629
23652
|
mainWindow = new electron.BrowserWindow({
|
|
23630
23653
|
width: 1400,
|
|
23631
23654
|
height: 900,
|
|
23632
23655
|
minWidth: 600,
|
|
23633
23656
|
minHeight: 400,
|
|
23634
23657
|
title: "ctlsurf-worker",
|
|
23658
|
+
backgroundColor: savedBg ?? (electron.nativeTheme.shouldUseDarkColors ? "#1a1b26" : "#e9eaef"),
|
|
23635
23659
|
titleBarStyle: "hiddenInset",
|
|
23636
23660
|
icon: path$1.join(__dirname, "../../resources/icon.png"),
|
|
23637
23661
|
webPreferences: {
|
|
@@ -23729,6 +23753,27 @@ electron.ipcMain.handle(
|
|
|
23729
23753
|
electron.ipcMain.handle("app:homePath", () => electron.app.getPath("home"));
|
|
23730
23754
|
electron.ipcMain.handle("app:cwd", () => process.env.CTLSURF_WORKER_CWD || process.cwd());
|
|
23731
23755
|
electron.ipcMain.handle("app:projectName", () => orchestrator.projectName);
|
|
23756
|
+
electron.ipcMain.handle("app:getAppearance", () => ({
|
|
23757
|
+
pref: orchestrator.settingsData.appearance ?? null
|
|
23758
|
+
}));
|
|
23759
|
+
electron.ipcMain.handle("app:setAppearance", (_e, data) => {
|
|
23760
|
+
const source = data?.source;
|
|
23761
|
+
if (source !== "system" && source !== "light" && source !== "dark") return { ok: false };
|
|
23762
|
+
electron.nativeTheme.themeSource = source;
|
|
23763
|
+
const settings = orchestrator.settingsData;
|
|
23764
|
+
if (data.pref && typeof data.pref === "object") {
|
|
23765
|
+
settings.appearance = data.pref;
|
|
23766
|
+
}
|
|
23767
|
+
settings.themeSource = source;
|
|
23768
|
+
if (typeof data.background === "string" && /^#[0-9a-fA-F]{6}$/.test(data.background)) {
|
|
23769
|
+
settings.themeBackground = data.background;
|
|
23770
|
+
if (mainWindow && !mainWindow.isDestroyed()) {
|
|
23771
|
+
mainWindow.setBackgroundColor(data.background);
|
|
23772
|
+
}
|
|
23773
|
+
}
|
|
23774
|
+
orchestrator.saveSettings();
|
|
23775
|
+
return { ok: true };
|
|
23776
|
+
});
|
|
23732
23777
|
electron.ipcMain.handle("app:browseCwd", async () => {
|
|
23733
23778
|
if (!mainWindow) return null;
|
|
23734
23779
|
const result = await electron.dialog.showOpenDialog(mainWindow, {
|
|
@@ -23933,8 +23978,8 @@ electron.ipcMain.handle("tickets:project", () => {
|
|
|
23933
23978
|
electron.ipcMain.handle("tickets:add", async (_event, input) => {
|
|
23934
23979
|
return orchestrator.addTicketForActiveTab(input);
|
|
23935
23980
|
});
|
|
23936
|
-
electron.ipcMain.handle("tickets:update", async (_event, rowId, input) => {
|
|
23937
|
-
return orchestrator.updateTicketForActiveTab(rowId, input);
|
|
23981
|
+
electron.ipcMain.handle("tickets:update", async (_event, rowId, input, blockId) => {
|
|
23982
|
+
return orchestrator.updateTicketForActiveTab(rowId, input, blockId);
|
|
23938
23983
|
});
|
|
23939
23984
|
electron.ipcMain.handle("tickets:list", async () => {
|
|
23940
23985
|
return orchestrator.listTicketsForActiveTab();
|
package/out/preload/index.js
CHANGED
|
@@ -40,6 +40,11 @@ const api = {
|
|
|
40
40
|
return () => electron.ipcRenderer.removeListener("app:projectChanged", listener);
|
|
41
41
|
},
|
|
42
42
|
browseCwd: () => electron.ipcRenderer.invoke("app:browseCwd"),
|
|
43
|
+
// Mirror the renderer's appearance preference onto Chromium's nativeTheme and
|
|
44
|
+
// persist it. localStorage stays the source of truth (see renderer/lib/theme.ts);
|
|
45
|
+
// this copy backs the pre-load window background and localStorage recovery.
|
|
46
|
+
setAppearance: (data) => electron.ipcRenderer.invoke("app:setAppearance", data),
|
|
47
|
+
getAppearance: () => electron.ipcRenderer.invoke("app:getAppearance"),
|
|
43
48
|
// Clipboard — write a rich-HTML table (+ plain-text fallback) for email paste.
|
|
44
49
|
// `ok` reflects a read-back verification in the main process, not just that the
|
|
45
50
|
// call was made; `error` is set when the write threw.
|
|
@@ -68,7 +73,7 @@ const api = {
|
|
|
68
73
|
// Tickets (active tab)
|
|
69
74
|
getTicketProject: () => electron.ipcRenderer.invoke("tickets:project"),
|
|
70
75
|
addTicket: (input) => electron.ipcRenderer.invoke("tickets:add", input),
|
|
71
|
-
updateTicket: (rowId, input) => electron.ipcRenderer.invoke("tickets:update", rowId, input),
|
|
76
|
+
updateTicket: (rowId, input, blockId) => electron.ipcRenderer.invoke("tickets:update", rowId, input, blockId),
|
|
72
77
|
listTickets: () => electron.ipcRenderer.invoke("tickets:list"),
|
|
73
78
|
// Chat logging (global)
|
|
74
79
|
getLogChat: () => electron.ipcRenderer.invoke("logchat:get"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { c as createWebWorker, l as languages } from "./index-
|
|
2
|
-
import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-
|
|
3
|
-
import { h, i, j, t, k } from "./lspLanguageFeatures-
|
|
1
|
+
import { c as createWebWorker, l as languages } from "./index-CN3UN7Tm.js";
|
|
2
|
+
import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-BE0g7ubH.js";
|
|
3
|
+
import { h, i, j, t, k } from "./lspLanguageFeatures-BE0g7ubH.js";
|
|
4
4
|
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
|
|
5
5
|
class WorkerManager {
|
|
6
6
|
constructor(defaults) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { c as createWebWorker, l as languages } from "./index-
|
|
2
|
-
import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-
|
|
3
|
-
import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-
|
|
1
|
+
import { c as createWebWorker, l as languages } from "./index-CN3UN7Tm.js";
|
|
2
|
+
import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-BE0g7ubH.js";
|
|
3
|
+
import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-BE0g7ubH.js";
|
|
4
4
|
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
|
|
5
5
|
class WorkerManager {
|
|
6
6
|
constructor(defaults) {
|