clitrigger 0.2.24 → 0.2.26
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/README.md +44 -31
- package/README_KR.md +44 -31
- package/dist/client/assets/AnalyticsPanel-CJF51ov7.js +48 -0
- package/dist/client/assets/FloatingComposerController-5A3GJtK4-BqOKhUaC.js +1 -0
- package/dist/client/assets/PlannerPageEditor-1-XUcFw6.css +1 -0
- package/dist/client/assets/PlannerPageEditor-BJ0DxLsM.js +211 -0
- package/dist/client/assets/TaskGraph-B4qlPjjq.js +2 -0
- package/dist/client/assets/VaultLayout-Cbz0Dzjt.js +153 -0
- package/dist/client/assets/clsx-B-dksMZM.js +1 -0
- package/dist/client/assets/index-B_5C2Aov.css +32 -0
- package/dist/client/assets/index-Df25dsa5.js +668 -0
- package/dist/client/assets/index-Vcq4gwWv.js +1 -0
- package/dist/client/assets/style-BZV40eAE.css +1 -0
- package/dist/client/assets/style-BeBN7DXF.js +7 -0
- package/dist/client/assets/value-BTdN53H7.js +1 -0
- package/dist/client/assets/with-selector-bfGVmvLm.js +17 -0
- package/dist/client/index.html +2 -2
- package/dist/server/db/queries.d.ts.map +1 -1
- package/dist/server/db/queries.js +14 -8
- package/dist/server/db/queries.js.map +1 -1
- package/dist/server/db/schema.d.ts.map +1 -1
- package/dist/server/db/schema.js +3 -1
- package/dist/server/db/schema.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +47 -25
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/jira-client.d.ts.map +1 -1
- package/dist/server/lib/jira-client.js +4 -1
- package/dist/server/lib/jira-client.js.map +1 -1
- package/dist/server/middleware/auth.d.ts +9 -0
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/auth.js +95 -17
- package/dist/server/middleware/auth.js.map +1 -1
- package/dist/server/plugins/jira/router.d.ts.map +1 -1
- package/dist/server/plugins/jira/router.js +3 -1
- package/dist/server/plugins/jira/router.js.map +1 -1
- package/dist/server/routes/files.d.ts.map +1 -1
- package/dist/server/routes/files.js +9 -20
- package/dist/server/routes/files.js.map +1 -1
- package/dist/server/routes/images.d.ts.map +1 -1
- package/dist/server/routes/images.js +9 -0
- package/dist/server/routes/images.js.map +1 -1
- package/dist/server/routes/memory.d.ts.map +1 -1
- package/dist/server/routes/memory.js +2 -16
- package/dist/server/routes/memory.js.map +1 -1
- package/dist/server/routes/projects.d.ts.map +1 -1
- package/dist/server/routes/projects.js +42 -12
- package/dist/server/routes/projects.js.map +1 -1
- package/dist/server/routes/vault.d.ts.map +1 -1
- package/dist/server/routes/vault.js +6 -1
- package/dist/server/routes/vault.js.map +1 -1
- package/dist/server/services/claude-manager.d.ts.map +1 -1
- package/dist/server/services/claude-manager.js +15 -0
- package/dist/server/services/claude-manager.js.map +1 -1
- package/dist/server/services/session-manager.d.ts +1 -0
- package/dist/server/services/session-manager.d.ts.map +1 -1
- package/dist/server/services/session-manager.js +32 -1
- package/dist/server/services/session-manager.js.map +1 -1
- package/dist/server/utils/net-safety.d.ts +2 -0
- package/dist/server/utils/net-safety.d.ts.map +1 -0
- package/dist/server/utils/net-safety.js +28 -0
- package/dist/server/utils/net-safety.js.map +1 -0
- package/dist/server/utils/open-path.d.ts +4 -0
- package/dist/server/utils/open-path.d.ts.map +1 -0
- package/dist/server/utils/open-path.js +19 -0
- package/dist/server/utils/open-path.js.map +1 -0
- package/dist/server/utils/path-safety.d.ts +2 -0
- package/dist/server/utils/path-safety.d.ts.map +1 -0
- package/dist/server/utils/path-safety.js +25 -0
- package/dist/server/utils/path-safety.js.map +1 -0
- package/dist/server/websocket/index.d.ts.map +1 -1
- package/dist/server/websocket/index.js +26 -1
- package/dist/server/websocket/index.js.map +1 -1
- package/electron/main.cjs +17 -3
- package/package.json +6 -6
- package/dist/client/assets/FloatingComposerController-5A3GJtK4-D5OJqjB6.js +0 -1
- package/dist/client/assets/index-7c5uNap1.js +0 -1080
- package/dist/client/assets/index-CyIseJUh.css +0 -32
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// SSRF guard for user-supplied base URLs (e.g. Jira base_url). Requires http(s)
|
|
2
|
+
// and blocks loopback / link-local hosts — notably the cloud metadata endpoint
|
|
3
|
+
// (169.254.169.254). Private LAN ranges (10./192.168./172.16-31.) are allowed
|
|
4
|
+
// so self-hosted/internal Jira still works. Does not defend against DNS
|
|
5
|
+
// rebinding (out of scope for a single-user tool).
|
|
6
|
+
export function assertPublicHttpUrl(raw) {
|
|
7
|
+
let u;
|
|
8
|
+
try {
|
|
9
|
+
u = new URL(raw);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
throw new Error('Invalid URL');
|
|
13
|
+
}
|
|
14
|
+
if (u.protocol !== 'http:' && u.protocol !== 'https:') {
|
|
15
|
+
throw new Error('URL must use http or https');
|
|
16
|
+
}
|
|
17
|
+
const host = u.hostname.toLowerCase();
|
|
18
|
+
const blocked = host === 'localhost' ||
|
|
19
|
+
host.endsWith('.localhost') ||
|
|
20
|
+
host === '::1' ||
|
|
21
|
+
host === '0.0.0.0' ||
|
|
22
|
+
/^127\./.test(host) ||
|
|
23
|
+
/^169\.254\./.test(host);
|
|
24
|
+
if (blocked) {
|
|
25
|
+
throw new Error('URL host is not allowed');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=net-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"net-safety.js","sourceRoot":"","sources":["../../../src/server/utils/net-safety.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,wEAAwE;AACxE,mDAAmD;AACnD,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QACH,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,OAAO,GACX,IAAI,KAAK,WAAW;QACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC3B,IAAI,KAAK,KAAK;QACd,IAAI,KAAK,SAAS;QAClB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACnB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-path.d.ts","sourceRoot":"","sources":["../../../src/server/utils/open-path.ts"],"names":[],"mappings":"AAOA,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAShF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
// Open a file/folder with the OS default handler, or reveal a file in the file
|
|
4
|
+
// manager. Uses execFile (argv array, no shell) so a path containing shell
|
|
5
|
+
// metacharacters — e.g. an agent-created filename like `$(touch pwned).md` —
|
|
6
|
+
// cannot inject a command. Exit codes from explorer/open are ignored.
|
|
7
|
+
export function osOpenPath(target, opts = {}) {
|
|
8
|
+
const done = () => { };
|
|
9
|
+
if (process.platform === 'win32') {
|
|
10
|
+
execFile('explorer.exe', [opts.reveal ? `/select,${target}` : target], done);
|
|
11
|
+
}
|
|
12
|
+
else if (process.platform === 'darwin') {
|
|
13
|
+
execFile('open', opts.reveal ? ['-R', target] : [target], done);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
execFile('xdg-open', [opts.reveal ? path.dirname(target) : target], done);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=open-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-path.js","sourceRoot":"","sources":["../../../src/server/utils/open-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAC7E,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,OAA6B,EAAE;IACxE,MAAM,IAAI,GAAG,GAAG,EAAE,GAAkC,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-safety.d.ts","sourceRoot":"","sources":["../../../src/server/utils/path-safety.ts"],"names":[],"mappings":"AAOA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAevE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
// Returns true if `abs` (an already lexically-resolved path) stays within
|
|
4
|
+
// `root` even after resolving symlinks. For a not-yet-created file it checks
|
|
5
|
+
// the nearest existing ancestor. Defends against an in-tree symlink that points
|
|
6
|
+
// outside the project root (which a lexical `startsWith` check would miss).
|
|
7
|
+
export function isRealpathWithinRoot(root, abs) {
|
|
8
|
+
try {
|
|
9
|
+
let probe = abs;
|
|
10
|
+
while (!fs.existsSync(probe)) {
|
|
11
|
+
const parent = path.dirname(probe);
|
|
12
|
+
if (parent === probe)
|
|
13
|
+
break;
|
|
14
|
+
probe = parent;
|
|
15
|
+
}
|
|
16
|
+
const realRoot = fs.realpathSync(root);
|
|
17
|
+
const realProbe = fs.realpathSync(probe);
|
|
18
|
+
const sep = realRoot.endsWith(path.sep) ? realRoot : realRoot + path.sep;
|
|
19
|
+
return realProbe === realRoot || realProbe.startsWith(sep);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=path-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-safety.js","sourceRoot":"","sources":["../../../src/server/utils/path-safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,0EAA0E;AAC1E,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,GAAW;IAC5D,IAAI,CAAC;QACH,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,MAAM,KAAK,KAAK;gBAAE,MAAM;YAC5B,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;QACD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;QACzE,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/websocket/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/websocket/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AASnC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA2LlD"}
|
|
@@ -4,6 +4,7 @@ import { sessionMiddleware } from '../middleware/auth.js';
|
|
|
4
4
|
import { claudeManager } from '../services/claude-manager.js';
|
|
5
5
|
import { sessionManager } from '../services/session-manager.js';
|
|
6
6
|
import { getTodoById, createTaskLog, getSessionById, createSessionLog, getSessionRawChunks } from '../db/queries.js';
|
|
7
|
+
import { getSetting } from '../db/app-settings.js';
|
|
7
8
|
export function initWebSocket(server) {
|
|
8
9
|
const wss = new WebSocketServer({ noServer: true });
|
|
9
10
|
// Handle upgrade manually to validate session auth
|
|
@@ -48,6 +49,13 @@ export function initWebSocket(server) {
|
|
|
48
49
|
socket.destroy();
|
|
49
50
|
return;
|
|
50
51
|
}
|
|
52
|
+
// Reject sessions issued before the last password change (parity with HTTP).
|
|
53
|
+
const changedAt = Number(getSetting('auth.password_changed_at') || 0);
|
|
54
|
+
if (changedAt && (session.createdAt ?? 0) < changedAt) {
|
|
55
|
+
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
|
|
56
|
+
socket.destroy();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
51
59
|
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
52
60
|
wss.emit('connection', ws, req);
|
|
53
61
|
});
|
|
@@ -112,9 +120,26 @@ export function initWebSocket(server) {
|
|
|
112
120
|
try {
|
|
113
121
|
sessionManager.flushPendingRaw(msg.sessionId);
|
|
114
122
|
const chunks = getSessionRawChunks(msg.sessionId);
|
|
123
|
+
// Coalesce DB rows into large frames. A long session holds tens
|
|
124
|
+
// of thousands of tiny rows (one per 100ms flush); one ws frame
|
|
125
|
+
// per row made re-opening a terminal take seconds.
|
|
126
|
+
const REPLAY_FRAME_BYTES = 256 * 1024;
|
|
127
|
+
let batch = [];
|
|
128
|
+
let batchBytes = 0;
|
|
129
|
+
const sendBatch = () => {
|
|
130
|
+
if (batch.length === 0)
|
|
131
|
+
return;
|
|
132
|
+
ws.send(encodeSessionFrame(msg.sessionId, Buffer.concat(batch)), { binary: true });
|
|
133
|
+
batch = [];
|
|
134
|
+
batchBytes = 0;
|
|
135
|
+
};
|
|
115
136
|
for (const c of chunks) {
|
|
116
|
-
|
|
137
|
+
batch.push(c.bytes);
|
|
138
|
+
batchBytes += c.bytes.length;
|
|
139
|
+
if (batchBytes >= REPLAY_FRAME_BYTES)
|
|
140
|
+
sendBatch();
|
|
117
141
|
}
|
|
142
|
+
sendBatch();
|
|
118
143
|
}
|
|
119
144
|
catch { /* ignore replay errors */ }
|
|
120
145
|
ws.send(JSON.stringify({ type: 'session:replay-end', sessionId: msg.sessionId }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/websocket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAGrC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/websocket/index.ts"],"names":[],"mappings":"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"}
|
package/electron/main.cjs
CHANGED
|
@@ -160,7 +160,7 @@ function createWindow(port) {
|
|
|
160
160
|
preload: path.join(__dirname, 'preload.cjs'),
|
|
161
161
|
contextIsolation: true,
|
|
162
162
|
nodeIntegration: false,
|
|
163
|
-
sandbox:
|
|
163
|
+
sandbox: true,
|
|
164
164
|
},
|
|
165
165
|
});
|
|
166
166
|
|
|
@@ -194,7 +194,11 @@ function createWindow(port) {
|
|
|
194
194
|
mainWindow.webContents.setWindowOpenHandler(({ url, features }) => {
|
|
195
195
|
const isLocal = localOrigins.some((o) => url.startsWith(o));
|
|
196
196
|
if (!isLocal) {
|
|
197
|
-
|
|
197
|
+
// Only hand safe schemes to the OS — never file:/smb:/custom handlers.
|
|
198
|
+
try {
|
|
199
|
+
const proto = new URL(url).protocol;
|
|
200
|
+
if (proto === 'http:' || proto === 'https:' || proto === 'mailto:') shell.openExternal(url);
|
|
201
|
+
} catch { /* invalid url — ignore */ }
|
|
198
202
|
return { action: 'deny' };
|
|
199
203
|
}
|
|
200
204
|
// Session pop-out windows: open as a real OS child window with the same
|
|
@@ -237,7 +241,7 @@ function createWindow(port) {
|
|
|
237
241
|
preload: path.join(__dirname, 'preload.cjs'),
|
|
238
242
|
contextIsolation: true,
|
|
239
243
|
nodeIntegration: false,
|
|
240
|
-
sandbox:
|
|
244
|
+
sandbox: true,
|
|
241
245
|
},
|
|
242
246
|
},
|
|
243
247
|
};
|
|
@@ -245,11 +249,21 @@ function createWindow(port) {
|
|
|
245
249
|
return { action: 'allow' };
|
|
246
250
|
});
|
|
247
251
|
|
|
252
|
+
// Block top-level navigation to off-origin URLs so injected content / links
|
|
253
|
+
// can't load a remote page inside the trusted, preload-attached window.
|
|
254
|
+
const blockOffOriginNav = (contents) => {
|
|
255
|
+
contents.on('will-navigate', (e, navUrl) => {
|
|
256
|
+
if (!localOrigins.some((o) => navUrl.startsWith(o))) e.preventDefault();
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
blockOffOriginNav(mainWindow.webContents);
|
|
260
|
+
|
|
248
261
|
// Newly-created child windows (popouts) inherit the main window's
|
|
249
262
|
// setWindowOpenHandler but not the lock-screen focus-recovery handler.
|
|
250
263
|
// Attach the same focus → webContents.focus() bridge so xterm typing
|
|
251
264
|
// doesn't go dead after resume.
|
|
252
265
|
mainWindow.webContents.on('did-create-window', (childWin) => {
|
|
266
|
+
blockOffOriginNav(childWin.webContents);
|
|
253
267
|
childWin.on('focus', () => {
|
|
254
268
|
// Skip when webContents already holds focus — a redundant programmatic
|
|
255
269
|
// focus() resets the Windows IME (TSF) caret context, which is the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clitrigger",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.26",
|
|
4
4
|
"description": "Spawn isolated git worktrees and orchestrate Claude/Gemini/Codex CLI tasks in parallel from a web UI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"dependencies": {
|
|
72
72
|
"@iarna/toml": "^2.2.5",
|
|
73
73
|
"@types/iarna__toml": "^2.0.5",
|
|
74
|
-
"better-sqlite3": "^12.
|
|
74
|
+
"better-sqlite3": "^12.11.1",
|
|
75
75
|
"cloudflared": "^0.7.1",
|
|
76
76
|
"cors": "^2.8.5",
|
|
77
77
|
"dotenv": "^16.4.7",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"ws": "^8.18.0"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
|
-
"@electron/rebuild": "^
|
|
92
|
+
"@electron/rebuild": "^4.1.0",
|
|
93
93
|
"@types/better-sqlite3": "^7.6.12",
|
|
94
94
|
"@types/cors": "^2.8.17",
|
|
95
95
|
"@types/express": "^5.0.0",
|
|
@@ -101,9 +101,9 @@
|
|
|
101
101
|
"@types/ws": "^8.5.13",
|
|
102
102
|
"@vitest/coverage-v8": "^4.1.1",
|
|
103
103
|
"concurrently": "^9.1.0",
|
|
104
|
-
"electron": "^
|
|
105
|
-
"electron-builder": "^
|
|
106
|
-
"esbuild": "^0.
|
|
104
|
+
"electron": "^43.0.0",
|
|
105
|
+
"electron-builder": "^26.15.3",
|
|
106
|
+
"esbuild": "^0.28.1",
|
|
107
107
|
"png-to-ico": "^3.0.1",
|
|
108
108
|
"sharp": "^0.34.5",
|
|
109
109
|
"tsx": "^4.19.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as b,M as d,N as u,v as l,z as x,B as g,K as C,Z as h,r as m,T as v,j as i,q as j,P as y,U as E,o as S,s as O,f as P,G as T,D as F}from"./index-7c5uNap1.js";var I=m.memo(({isEmpty:t,onSave:o,Components:s,dict:e})=>i.jsx(s.Generic.Toolbar.Root,{className:F("bn-action-toolbar","bn-comment-actions"),variant:"action-toolbar",children:i.jsx(s.Generic.Toolbar.Button,{className:"bn-button",mainTooltip:e.comments.save_button_text,variant:"compact",isDisabled:t,onClick:o,children:e.comments.save_button_text})}));function U(){let t=d(),o=u(l),s=x(),e=g(),r=C({trailingBlock:!1,dictionary:{...e,placeholders:{emptyDocument:e.placeholders.new_comment}},schema:o.commentEditorSchema||h}),c=m.useCallback(async()=>{await o.createThread({initialComment:{body:r.document}}),o.stopPendingComment(),t.transact(a=>{a.setSelection(v.create(a.doc,a.selection.to))}),t.focus()},[o,r,t]);return i.jsx(s.Comments.Card,{className:"bn-thread",children:i.jsx(j,{autoFocus:!0,editable:!0,editor:r,actions:({isFocused:a,isEmpty:n})=>i.jsx(I,{isFocused:a,isEmpty:n,onSave:c,Components:s,dict:e})})})}var N=b({default:()=>_});function _(t){let o=d(),s=u(l),e=y(l,{editor:o,selector:n=>n.pendingComment}),r=E({editor:o,selector:({editor:n})=>e?{from:n.prosemirrorState.selection.from,to:n.prosemirrorState.selection.to}:void 0}),c=m.useMemo(()=>{var n,p;return{...t.floatingUIOptions,useFloatingOptions:{open:!!e,onOpenChange:f=>{f||(s.stopPendingComment(),o.focus())},placement:"bottom",middleware:[S(10),O(),P()],...(n=t.floatingUIOptions)==null?void 0:n.useFloatingOptions},focusManagerProps:{disabled:!1},elementProps:{style:{zIndex:60},...(p=t.floatingUIOptions)==null?void 0:p.elementProps}}},[s,o,e,t.floatingUIOptions]),a=t.floatingComposer||U;return i.jsx(T,{position:r,portalElement:t.portalElement,...c,children:i.jsx(a,{})})}export{N as n,U as r,_ as t};
|