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.
Files changed (68) hide show
  1. package/dist/assets/AgentLibrary-BeJJa_zv.js +1 -0
  2. package/dist/assets/History-mWbqemhZ.js +2 -0
  3. package/dist/assets/Hooks-D_8sciZu.js +3 -0
  4. package/dist/assets/HostBilko-6aUJ7Smz.js +1 -0
  5. package/dist/assets/Library-CG1LDXLw.js +46 -0
  6. package/dist/assets/ListDetail-CIIJOWwI.js +1 -0
  7. package/dist/assets/MarkdownEditor-D0-y8V-f.js +1 -0
  8. package/dist/assets/McpServers-Kc-djiVi.js +2 -0
  9. package/dist/assets/Memory-B60DGRTW.js +8 -0
  10. package/dist/assets/Panel-CbTPsYHq.js +1 -0
  11. package/dist/assets/Permissions-C8KrSfrd.js +3 -0
  12. package/dist/assets/Plugins-BT8EumHb.js +2 -0
  13. package/dist/assets/ProvenanceBadge-cEqPpFsT.js +1 -0
  14. package/dist/assets/Scheduler-DbKPd0or.js +14 -0
  15. package/dist/assets/ScopeSwitcher-BNesCJ_t.js +1 -0
  16. package/dist/assets/Settings-Bjt7AQ6G.js +3 -0
  17. package/dist/assets/SkillReferenceGraph-DzuaPDM-.js +46 -0
  18. package/dist/assets/Skills-CVL_4X3T.js +3 -0
  19. package/dist/assets/SystemPrompt-Ct__nFF1.js +1 -0
  20. package/dist/assets/TagLibrary-DmrTfw4D.js +1 -0
  21. package/dist/assets/{TiptapBody-Bn-LMce4.js → TiptapBody-DaS0M_Ni.js} +1 -1
  22. package/dist/assets/Toggle-C0a-6xV7.js +1 -0
  23. package/dist/assets/index-CO_7DroC.js +3066 -0
  24. package/dist/assets/{index-DOXvph-Z.css → index-LlWpj2VJ.css} +1 -1
  25. package/dist/assets/listSkills-QORduPIk.js +1 -0
  26. package/dist/assets/settingsSchema-B7dMJaix.js +3 -0
  27. package/dist/assets/skillFrontmatter-Dif5JIg7.js +10 -0
  28. package/dist/index.html +2 -2
  29. package/package.json +1 -3
  30. package/src/main/__tests__/config-readText-bounded.test.cjs +84 -0
  31. package/src/main/__tests__/heapSnapshot.test.cjs +121 -0
  32. package/src/main/__tests__/historyAggregatorIntraday.test.cjs +313 -0
  33. package/src/main/__tests__/runLogRetention.test.cjs +343 -0
  34. package/src/main/__tests__/runVerify-transcript-commit-evidence.test.cjs +215 -0
  35. package/src/main/__tests__/scheduler-investigation-prompt.test.cjs +42 -1
  36. package/src/main/__tests__/scheduler-prd-missing-skip.test.cjs +54 -1
  37. package/src/main/__tests__/transcripts-batch-flush.test.cjs +249 -0
  38. package/src/main/__tests__/transcripts-doFlush-array.test.cjs +6 -0
  39. package/src/main/__tests__/transcripts-paged-reads.test.cjs +6 -0
  40. package/src/main/__tests__/transcriptsUsageFor.test.cjs +6 -0
  41. package/src/main/config.cjs +32 -29
  42. package/src/main/files.cjs +20 -0
  43. package/src/main/health.cjs +32 -0
  44. package/src/main/heapSnapshot.cjs +122 -0
  45. package/src/main/historyAggregator.cjs +176 -36
  46. package/src/main/index.cjs +10 -63
  47. package/src/main/ipcSchemas.cjs +20 -209
  48. package/src/main/lib/opsOwnership.cjs +0 -2
  49. package/src/main/lib/runLogRetention.cjs +358 -0
  50. package/src/main/lib/summarize.cjs +0 -1
  51. package/src/main/runVerify.cjs +55 -6
  52. package/src/main/scheduler.cjs +46 -7
  53. package/src/main/transcripts.cjs +29 -5
  54. package/src/preload/api.d.ts +18 -199
  55. package/src/preload/index.cjs +12 -102
  56. package/dist/assets/index-BfiMRkln.js +0 -3225
  57. package/src/main/__tests__/browserAgentServer.test.cjs +0 -235
  58. package/src/main/__tests__/browserView-destroyed-handler.test.cjs +0 -85
  59. package/src/main/__tests__/browserView-oauth-popup.test.cjs +0 -126
  60. package/src/main/__tests__/web-remote-e2e-pinning.test.cjs +0 -181
  61. package/src/main/browserAgentServer.cjs +0 -224
  62. package/src/main/browserCapture.cjs +0 -728
  63. package/src/main/browserView.cjs +0 -916
  64. package/src/main/lib/__tests__/browserAgentActions.test.cjs +0 -76
  65. package/src/main/lib/browserAgentActions.cjs +0 -114
  66. package/src/main/lib/e2eStateMachine.cjs +0 -39
  67. package/src/main/webRemote.cjs +0 -1367
  68. package/src/preload/browserViewPreload.cjs +0 -118
@@ -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, ev) => handler(ev);
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),