claude-code-session-manager 0.62.0 → 0.63.0
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/dist/assets/AgentLibrary-BeJJa_zv.js +1 -0
- package/dist/assets/History-mWbqemhZ.js +2 -0
- package/dist/assets/Hooks-D_8sciZu.js +3 -0
- package/dist/assets/HostBilko-6aUJ7Smz.js +1 -0
- package/dist/assets/Library-CG1LDXLw.js +46 -0
- package/dist/assets/ListDetail-CIIJOWwI.js +1 -0
- package/dist/assets/MarkdownEditor-D0-y8V-f.js +1 -0
- package/dist/assets/McpServers-Kc-djiVi.js +2 -0
- package/dist/assets/Memory-B60DGRTW.js +8 -0
- package/dist/assets/Panel-CbTPsYHq.js +1 -0
- package/dist/assets/Permissions-C8KrSfrd.js +3 -0
- package/dist/assets/Plugins-BT8EumHb.js +2 -0
- package/dist/assets/ProvenanceBadge-cEqPpFsT.js +1 -0
- package/dist/assets/Scheduler-DbKPd0or.js +14 -0
- package/dist/assets/ScopeSwitcher-BNesCJ_t.js +1 -0
- package/dist/assets/Settings-Bjt7AQ6G.js +3 -0
- package/dist/assets/SkillReferenceGraph-DzuaPDM-.js +46 -0
- package/dist/assets/Skills-CVL_4X3T.js +3 -0
- package/dist/assets/SystemPrompt-Ct__nFF1.js +1 -0
- package/dist/assets/TagLibrary-DmrTfw4D.js +1 -0
- package/dist/assets/{TiptapBody-Bn-LMce4.js → TiptapBody-DaS0M_Ni.js} +1 -1
- package/dist/assets/Toggle-C0a-6xV7.js +1 -0
- package/dist/assets/index-CO_7DroC.js +3066 -0
- package/dist/assets/{index-DOXvph-Z.css → index-LlWpj2VJ.css} +1 -1
- package/dist/assets/listSkills-QORduPIk.js +1 -0
- package/dist/assets/settingsSchema-B7dMJaix.js +3 -0
- package/dist/assets/skillFrontmatter-Dif5JIg7.js +10 -0
- package/dist/index.html +2 -2
- package/package.json +1 -3
- package/src/main/__tests__/config-readText-bounded.test.cjs +84 -0
- package/src/main/__tests__/heapSnapshot.test.cjs +121 -0
- package/src/main/__tests__/historyAggregatorIntraday.test.cjs +313 -0
- package/src/main/__tests__/runLogRetention.test.cjs +343 -0
- package/src/main/__tests__/runVerify-transcript-commit-evidence.test.cjs +215 -0
- package/src/main/__tests__/scheduler-investigation-prompt.test.cjs +42 -1
- package/src/main/__tests__/scheduler-prd-missing-skip.test.cjs +54 -1
- package/src/main/__tests__/transcripts-batch-flush.test.cjs +249 -0
- package/src/main/__tests__/transcripts-doFlush-array.test.cjs +6 -0
- package/src/main/__tests__/transcripts-paged-reads.test.cjs +6 -0
- package/src/main/__tests__/transcriptsUsageFor.test.cjs +6 -0
- package/src/main/config.cjs +32 -29
- package/src/main/files.cjs +20 -0
- package/src/main/health.cjs +32 -0
- package/src/main/heapSnapshot.cjs +122 -0
- package/src/main/historyAggregator.cjs +176 -36
- package/src/main/index.cjs +10 -63
- package/src/main/ipcSchemas.cjs +20 -209
- package/src/main/lib/opsOwnership.cjs +0 -2
- package/src/main/lib/runLogRetention.cjs +358 -0
- package/src/main/lib/summarize.cjs +0 -1
- package/src/main/runVerify.cjs +55 -6
- package/src/main/scheduler.cjs +46 -7
- package/src/main/transcripts.cjs +29 -5
- package/src/preload/api.d.ts +18 -199
- package/src/preload/index.cjs +12 -102
- package/dist/assets/index-BfiMRkln.js +0 -3225
- package/src/main/__tests__/browserAgentServer.test.cjs +0 -235
- package/src/main/__tests__/browserView-destroyed-handler.test.cjs +0 -85
- package/src/main/__tests__/browserView-oauth-popup.test.cjs +0 -126
- package/src/main/__tests__/web-remote-e2e-pinning.test.cjs +0 -181
- package/src/main/browserAgentServer.cjs +0 -224
- package/src/main/browserCapture.cjs +0 -728
- package/src/main/browserView.cjs +0 -916
- package/src/main/lib/__tests__/browserAgentActions.test.cjs +0 -76
- package/src/main/lib/browserAgentActions.cjs +0 -114
- package/src/main/lib/e2eStateMachine.cjs +0 -39
- package/src/main/webRemote.cjs +0 -1367
- package/src/preload/browserViewPreload.cjs +0 -118
package/src/preload/index.cjs
CHANGED
|
@@ -56,66 +56,6 @@ contextBridge.exposeInMainWorld('api', {
|
|
|
56
56
|
return () => ipcRenderer.removeListener('pty:write-error', listener);
|
|
57
57
|
},
|
|
58
58
|
},
|
|
59
|
-
browser: {
|
|
60
|
-
create: (payload) => ipcRenderer.invoke('browser:create', payload),
|
|
61
|
-
setBounds: (payload) => ipcRenderer.invoke('browser:set-bounds', payload),
|
|
62
|
-
show: (viewId) => ipcRenderer.invoke('browser:show', { viewId }),
|
|
63
|
-
hide: (viewId) => ipcRenderer.invoke('browser:hide', { viewId }),
|
|
64
|
-
destroy: (viewId) => ipcRenderer.invoke('browser:destroy', { viewId }),
|
|
65
|
-
navigate: (payload) => ipcRenderer.invoke('browser:navigate', payload),
|
|
66
|
-
back: (viewId) => ipcRenderer.invoke('browser:back', { viewId }),
|
|
67
|
-
forward: (viewId) => ipcRenderer.invoke('browser:forward', { viewId }),
|
|
68
|
-
reload: (viewId) => ipcRenderer.invoke('browser:reload', { viewId }),
|
|
69
|
-
stop: (viewId) => ipcRenderer.invoke('browser:stop', { viewId }),
|
|
70
|
-
onNavState: (viewId, handler) => {
|
|
71
|
-
const channel = `browser:nav-state:${viewId}`;
|
|
72
|
-
const listener = (_e, state) => handler(state);
|
|
73
|
-
ipcRenderer.on(channel, listener);
|
|
74
|
-
return () => ipcRenderer.removeListener(channel, listener);
|
|
75
|
-
},
|
|
76
|
-
recordStart: (viewId) => ipcRenderer.invoke('browser:record-start', { viewId }),
|
|
77
|
-
recordStop: (viewId) => ipcRenderer.invoke('browser:record-stop', { viewId }),
|
|
78
|
-
onRecordStep: (viewId, handler) => {
|
|
79
|
-
const channel = `browser:record-step:${viewId}`;
|
|
80
|
-
const listener = (_e, step) => handler(step);
|
|
81
|
-
ipcRenderer.on(channel, listener);
|
|
82
|
-
return () => ipcRenderer.removeListener(channel, listener);
|
|
83
|
-
},
|
|
84
|
-
captureDom: (payload) => ipcRenderer.invoke('browser:capture-dom', payload),
|
|
85
|
-
captureShot: (viewId) => ipcRenderer.invoke('browser:capture-shot', { viewId }),
|
|
86
|
-
saveBinary: (path, base64, writer) => ipcRenderer.invoke('browser:save-binary', { path, base64, writer }),
|
|
87
|
-
saveRecording: (payload) => ipcRenderer.invoke('browser:save-recording', payload),
|
|
88
|
-
replay: (payload) => ipcRenderer.invoke('browser:replay', payload),
|
|
89
|
-
onReplayStep: (viewId, handler) => {
|
|
90
|
-
const channel = `browser:replay-step:${viewId}`;
|
|
91
|
-
const listener = (_e, step) => handler(step);
|
|
92
|
-
ipcRenderer.on(channel, listener);
|
|
93
|
-
return () => ipcRenderer.removeListener(channel, listener);
|
|
94
|
-
},
|
|
95
|
-
setZoom: (payload) => ipcRenderer.invoke('browser:set-zoom', payload),
|
|
96
|
-
find: (payload) => ipcRenderer.invoke('browser:find', payload),
|
|
97
|
-
stopFind: (viewId) => ipcRenderer.invoke('browser:stop-find', { viewId }),
|
|
98
|
-
onFindResult: (viewId, handler) => {
|
|
99
|
-
const channel = `browser:find-result:${viewId}`;
|
|
100
|
-
const listener = (_e, result) => handler(result);
|
|
101
|
-
ipcRenderer.on(channel, listener);
|
|
102
|
-
return () => ipcRenderer.removeListener(channel, listener);
|
|
103
|
-
},
|
|
104
|
-
pickerStart: (viewId) => ipcRenderer.invoke('browser:picker-start', { viewId }),
|
|
105
|
-
pickerStop: (viewId) => ipcRenderer.invoke('browser:picker-stop', { viewId }),
|
|
106
|
-
onPickerEvent: (viewId, handler) => {
|
|
107
|
-
const channel = `browser:picker-event:${viewId}`;
|
|
108
|
-
const listener = (_e, ev) => handler(ev);
|
|
109
|
-
ipcRenderer.on(channel, listener);
|
|
110
|
-
return () => ipcRenderer.removeListener(channel, listener);
|
|
111
|
-
},
|
|
112
|
-
capture: (payload) => ipcRenderer.invoke('browser:capture', payload),
|
|
113
|
-
onOpenTabRequest: (handler) => {
|
|
114
|
-
const listener = (_e, payload) => handler(payload);
|
|
115
|
-
ipcRenderer.on('browser:open-tab-request', listener);
|
|
116
|
-
return () => ipcRenderer.removeListener('browser:open-tab-request', listener);
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
59
|
transcripts: {
|
|
120
60
|
subscribe: (payload) => ipcRenderer.invoke('transcript:subscribe', payload),
|
|
121
61
|
unsubscribe: (tabId) => ipcRenderer.invoke('transcript:unsubscribe', { tabId }),
|
|
@@ -128,9 +68,13 @@ contextBridge.exposeInMainWorld('api', {
|
|
|
128
68
|
ipcRenderer.invoke('transcript:path', { cwd, sessionUuid }),
|
|
129
69
|
usageFor: (cwd, sessionIds) =>
|
|
130
70
|
ipcRenderer.invoke('transcript:usageFor', { cwd, sessionIds }),
|
|
71
|
+
// Main sends one batch (array) per flush — see transcripts.cjs's doFlush —
|
|
72
|
+
// so the handler is array-shaped, not per-event, letting subscribers
|
|
73
|
+
// (live.ts, chat.ts) commit their store once per batch instead of once
|
|
74
|
+
// per event.
|
|
131
75
|
onEvent: (tabId, handler) => {
|
|
132
76
|
const channel = `transcript:event:${tabId}`;
|
|
133
|
-
const listener = (_e,
|
|
77
|
+
const listener = (_e, events) => handler(events);
|
|
134
78
|
ipcRenderer.on(channel, listener);
|
|
135
79
|
return () => ipcRenderer.removeListener(channel, listener);
|
|
136
80
|
},
|
|
@@ -172,7 +116,7 @@ contextBridge.exposeInMainWorld('api', {
|
|
|
172
116
|
},
|
|
173
117
|
config: {
|
|
174
118
|
readJson: (path) => ipcRenderer.invoke('config:read-json', { path }),
|
|
175
|
-
readText: (path) => ipcRenderer.invoke('config:read-text', { path }),
|
|
119
|
+
readText: (path, opts) => ipcRenderer.invoke('config:read-text', { path, maxBytes: opts?.maxBytes }),
|
|
176
120
|
writeJson: (path, data, writer) => ipcRenderer.invoke('config:write-json', { path, data, writer }),
|
|
177
121
|
writeText: (path, text, writer) => ipcRenderer.invoke('config:write-text', { path, text, writer }),
|
|
178
122
|
listDir: (path, opts) => ipcRenderer.invoke('config:list-dir', { path, opts }),
|
|
@@ -233,6 +177,11 @@ contextBridge.exposeInMainWorld('api', {
|
|
|
233
177
|
status: () => ipcRenderer.invoke('otel:status'),
|
|
234
178
|
configPath: () => ipcRenderer.invoke('otel:config-path'),
|
|
235
179
|
},
|
|
180
|
+
// Diagnostic only — no handler is registered unless the main process was
|
|
181
|
+
// launched with SM_HEAP_SNAPSHOT=1, so this rejects by default.
|
|
182
|
+
diagnostics: {
|
|
183
|
+
takeHeapSnapshot: () => ipcRenderer.invoke('diagnostics:heap-snapshot'),
|
|
184
|
+
},
|
|
236
185
|
history: {
|
|
237
186
|
aggregate: (req) => ipcRenderer.invoke('history:aggregate', req),
|
|
238
187
|
scanProjects: () => ipcRenderer.invoke('history:scan-projects'),
|
|
@@ -246,6 +195,7 @@ contextBridge.exposeInMainWorld('api', {
|
|
|
246
195
|
rename: (path, newName) => ipcRenderer.invoke('files:rename', { path, newName }),
|
|
247
196
|
delete: (path) => ipcRenderer.invoke('files:delete', { path }),
|
|
248
197
|
duplicate: (path) => ipcRenderer.invoke('files:duplicate', { path }),
|
|
198
|
+
saveBinary: (path, base64, writer) => ipcRenderer.invoke('files:save-binary', { path, base64, writer }),
|
|
249
199
|
},
|
|
250
200
|
docEdit: {
|
|
251
201
|
run: (payload) => ipcRenderer.invoke('docedit:run', payload),
|
|
@@ -309,7 +259,6 @@ contextBridge.exposeInMainWorld('api', {
|
|
|
309
259
|
clipboard: {
|
|
310
260
|
pasteImage: () => ipcRenderer.invoke('clipboard:paste-image'),
|
|
311
261
|
pasteText: () => ipcRenderer.invoke('clipboard:paste-text'),
|
|
312
|
-
copyImage: (dataUrl) => ipcRenderer.invoke('browser:copy-image', { dataUrl }),
|
|
313
262
|
writeText: (text) => ipcRenderer.invoke('clipboard:write-text', { text }),
|
|
314
263
|
},
|
|
315
264
|
memory: {
|
|
@@ -372,45 +321,6 @@ contextBridge.exposeInMainWorld('api', {
|
|
|
372
321
|
status: (cwd) => ipcRenderer.invoke('git:status', { cwd }),
|
|
373
322
|
fileStatus: (cwd) => ipcRenderer.invoke('git:file-status', { cwd }),
|
|
374
323
|
},
|
|
375
|
-
webRemote: {
|
|
376
|
-
/** Current connection state (no token values). */
|
|
377
|
-
getStatus: () => ipcRenderer.invoke('webRemote:get-status'),
|
|
378
|
-
/** Turn remote control on. Initiates relay connection if a device is paired. */
|
|
379
|
-
enable: () => ipcRenderer.invoke('webRemote:enable'),
|
|
380
|
-
/** Turn remote control off. Immediately drops relay connection. */
|
|
381
|
-
disable: () => ipcRenderer.invoke('webRemote:disable'),
|
|
382
|
-
/** Allow MUTATE-tier commands (pty spawn/write, scheduler writes). Default off. */
|
|
383
|
-
enableControl: () => ipcRenderer.invoke('webRemote:enable-control'),
|
|
384
|
-
/** Block MUTATE-tier commands — mobile becomes read-only mirror. */
|
|
385
|
-
disableControl: () => ipcRenderer.invoke('webRemote:disable-control'),
|
|
386
|
-
/** Pair a new device using the 8-character OTP shown in the web UI. */
|
|
387
|
-
pair: (otp) => ipcRenderer.invoke('webRemote:pair', { otp }),
|
|
388
|
-
/** Revoke a paired device by its deviceId. */
|
|
389
|
-
revokeDevice: (deviceId) => ipcRenderer.invoke('webRemote:revoke-device', { deviceId }),
|
|
390
|
-
/** Read the last N lines of today's audit log (default 50). */
|
|
391
|
-
auditTail: (lines) => ipcRenderer.invoke('webRemote:audit-tail', lines ? { lines } : {}),
|
|
392
|
-
/** Push event from main when connection status changes. */
|
|
393
|
-
onStatus: (handler) => {
|
|
394
|
-
const listener = (_e, payload) => handler(payload);
|
|
395
|
-
ipcRenderer.on('webRemote:status', listener);
|
|
396
|
-
return () => ipcRenderer.removeListener('webRemote:status', listener);
|
|
397
|
-
},
|
|
398
|
-
/** Push event when the relay revokes this device's token. */
|
|
399
|
-
onTokenRevoked: (handler) => {
|
|
400
|
-
const listener = (_e, payload) => handler(payload);
|
|
401
|
-
ipcRenderer.on('webRemote:token-revoked', listener);
|
|
402
|
-
return () => ipcRenderer.removeListener('webRemote:token-revoked', listener);
|
|
403
|
-
},
|
|
404
|
-
/** Revoke ALL paired devices and tear down every session immediately. */
|
|
405
|
-
revokeAll: () => ipcRenderer.invoke('webRemote:revoke-all'),
|
|
406
|
-
confirmSas: () => ipcRenderer.invoke('webRemote:confirm-sas'),
|
|
407
|
-
/** Push event when revokeAll completes (main broadcasts webRemote:revoked-all). */
|
|
408
|
-
onRevokedAll: (handler) => {
|
|
409
|
-
const listener = (_e, payload) => handler(payload);
|
|
410
|
-
ipcRenderer.on('webRemote:revoked-all', listener);
|
|
411
|
-
return () => ipcRenderer.removeListener('webRemote:revoked-all', listener);
|
|
412
|
-
},
|
|
413
|
-
},
|
|
414
324
|
chat: {
|
|
415
325
|
/** Spawn a headless claude -p job. Results arrive via the on* listeners. */
|
|
416
326
|
run: (payload) => ipcRenderer.invoke('chat:run', payload),
|