claude-code-session-manager 0.8.5 → 0.10.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 (69) hide show
  1. package/README.md +95 -65
  2. package/dist/assets/cssMode-DWlBzlpW.js +1 -0
  3. package/dist/assets/{freemarker2-dhfKZR7u.js → freemarker2-Cgg83m-Z.js} +2 -2
  4. package/dist/assets/handlebars-C4r4LOI9.js +1 -0
  5. package/dist/assets/html-DaxRI5sW.js +1 -0
  6. package/dist/assets/htmlMode-Bu_8jtXo.js +1 -0
  7. package/dist/assets/index-C_tgFedf.js +3986 -0
  8. package/dist/assets/{editor-BTnBOi8r.css → index-Dj3Db4OA.css} +32 -1
  9. package/dist/assets/javascript-D5Ztx-Ej.js +1 -0
  10. package/dist/assets/{jsonMode-BtjA-2w_.js → jsonMode-tfsgezVc.js} +4 -4
  11. package/dist/assets/liquid-F2cD9OL0.js +1 -0
  12. package/dist/assets/lspLanguageFeatures-Bz_Eih8F.js +4 -0
  13. package/dist/assets/mdx-BPlD1clX.js +1 -0
  14. package/dist/assets/{ort-wasm-simd-threaded.asyncify-CtKKja6V.wasm → ort-wasm-simd-threaded.asyncify-DMmc6YqF.wasm} +0 -0
  15. package/dist/assets/python-B4gUOWNI.js +1 -0
  16. package/dist/assets/razor-B6pMxVp1.js +1 -0
  17. package/dist/assets/{tsMode-hUkEyjsH.js → tsMode-C9nq6cHi.js} +2 -2
  18. package/dist/assets/typescript-Do5Vtwxu.js +1 -0
  19. package/dist/assets/{whisperWorker-QfIS0sPF.js → whisperWorker-CcsPqZUS.js} +19 -19
  20. package/dist/assets/xml-C0mTbVRp.js +1 -0
  21. package/dist/assets/yaml-D3sePJfA.js +1 -0
  22. package/dist/index.html +2 -2
  23. package/package.json +18 -9
  24. package/screenshots/.gitkeep +0 -0
  25. package/screenshots/README-screenshots.md +13 -0
  26. package/src/main/config.cjs +47 -9
  27. package/src/main/historyAggregator.cjs +10 -5
  28. package/src/main/index.cjs +85 -14
  29. package/src/main/ipcSchemas.cjs +165 -3
  30. package/src/main/lib/claudeBin.cjs +39 -0
  31. package/src/main/lib/encodeCwd.cjs +19 -0
  32. package/src/main/lib/fileTail.cjs +35 -0
  33. package/src/main/lib/insideHome.cjs +38 -0
  34. package/src/main/lib/prdFrontmatter.cjs +51 -0
  35. package/src/main/lib/sendToRenderer.cjs +21 -0
  36. package/src/main/memoryTool.cjs +203 -0
  37. package/src/main/otelSettings.cjs +2 -7
  38. package/src/main/pluginInstall.cjs +129 -0
  39. package/src/main/pty.cjs +13 -29
  40. package/src/main/queueOps.cjs +404 -0
  41. package/src/main/scheduler/prdParser.cjs +135 -0
  42. package/src/main/scheduler.cjs +291 -250
  43. package/src/main/sessionsStore.cjs +2 -6
  44. package/src/main/supervisor.cjs +3 -35
  45. package/src/main/teams.cjs +95 -0
  46. package/src/main/transcripts.cjs +5 -7
  47. package/src/main/usage.cjs +8 -0
  48. package/src/main/voiceHotkey.cjs +13 -9
  49. package/src/main/voiceSettings.cjs +2 -9
  50. package/src/main/voiceWizard.cjs +4 -11
  51. package/src/main/watchers.cjs +18 -42
  52. package/src/preload/api.d.ts +153 -1
  53. package/src/preload/index.cjs +29 -0
  54. package/dist/assets/cssMode-BCLoTYI0.js +0 -1
  55. package/dist/assets/editor.main-UoasbVGy.js +0 -908
  56. package/dist/assets/handlebars-DdpqwFuV.js +0 -1
  57. package/dist/assets/html-1oTJClkg.js +0 -1
  58. package/dist/assets/htmlMode-CF1QbIg-.js +0 -1
  59. package/dist/assets/index-DWDcKbgI.js +0 -3046
  60. package/dist/assets/index-eqxng9X2.css +0 -32
  61. package/dist/assets/javascript-BP_Q5MFx.js +0 -1
  62. package/dist/assets/liquid-DstuL8vm.js +0 -1
  63. package/dist/assets/lspLanguageFeatures-DvSiaY4f.js +0 -4
  64. package/dist/assets/mdx-qO-uvsJd.js +0 -1
  65. package/dist/assets/python-CCPz_1cy.js +0 -1
  66. package/dist/assets/razor-B7tCzkdh.js +0 -1
  67. package/dist/assets/typescript-BeXECzAk.js +0 -1
  68. package/dist/assets/xml-MRJd4GHf.js +0 -1
  69. package/dist/assets/yaml-CzGliMNL.js +0 -1
@@ -247,6 +247,16 @@ export interface ScheduleConfig {
247
247
 
248
248
  export type ScheduleJobStatus = 'pending' | 'running' | 'completed' | 'failed';
249
249
 
250
+ export interface ScheduleJobRuntime {
251
+ pid: number;
252
+ runId: string;
253
+ startedAt: string | null;
254
+ /** Claude session UUID for the `--session-id` arg — populated when the job spawns. */
255
+ sessionId?: string;
256
+ /** Resolved cwd the job was launched in (may differ from job.cwd if defaultCwd was applied). */
257
+ cwd?: string;
258
+ }
259
+
250
260
  export interface ScheduleJob {
251
261
  slug: string;
252
262
  title: string;
@@ -260,6 +270,11 @@ export interface ScheduleJob {
260
270
  finishedAt: string | null;
261
271
  exitCode: number | null;
262
272
  error: string | null;
273
+ /** Claude session UUID passed via `--session-id`. Set when the job spawns
274
+ * and persisted across queue reloads so the renderer can find the JSONL
275
+ * transcript even after restart. */
276
+ sessionId?: string;
277
+ runtime?: ScheduleJobRuntime;
263
278
  }
264
279
 
265
280
  export interface SchedulePaths {
@@ -395,6 +410,115 @@ export interface WatcherClosedEvent {
395
410
  watcherId: string;
396
411
  }
397
412
 
413
+ export interface TeamMember {
414
+ name: string;
415
+ agentType: string | null;
416
+ model: string | null;
417
+ }
418
+
419
+ export interface TeamInfo {
420
+ name: string;
421
+ configPath: string;
422
+ description: string | null;
423
+ leadAgentId: string | null;
424
+ members: TeamMember[];
425
+ memberCount: number;
426
+ inboxDepth: number;
427
+ }
428
+
429
+ export interface TeamsListResult {
430
+ teams: TeamInfo[];
431
+ }
432
+
433
+ // ────────────────────────────────────────────── Bundle D — queue ops
434
+
435
+ export interface LintFinding {
436
+ rule: string;
437
+ line: number;
438
+ snippet: string;
439
+ severity: 'warn' | 'error';
440
+ }
441
+
442
+ export interface LintReport {
443
+ slug: string;
444
+ findings: LintFinding[];
445
+ }
446
+
447
+ export interface LintQueueResult {
448
+ reports: LintReport[];
449
+ scannedAt: number;
450
+ }
451
+
452
+ export interface ArchivePrdResult {
453
+ ok: boolean;
454
+ archived: number;
455
+ archivedTo: string | null;
456
+ results: Array<{ ok: boolean; slug: string; error?: string; archivedTo?: string }>;
457
+ error?: string;
458
+ }
459
+
460
+ export interface RetagPrdItem {
461
+ slug: string;
462
+ /** New parallel-group number; if set on an NN-kebab slug, the file is renamed. */
463
+ parallelGroup?: number;
464
+ estimateMinutes?: number;
465
+ }
466
+
467
+ export interface RetagPrdResult {
468
+ ok: boolean;
469
+ retagged: number;
470
+ results: Array<{
471
+ ok: boolean;
472
+ slug: string;
473
+ newSlug?: string;
474
+ before?: Record<string, string>;
475
+ after?: Record<string, string>;
476
+ error?: string;
477
+ }>;
478
+ error?: string;
479
+ }
480
+
481
+ // ────────────────────────────────────────────── Bundle C (cycle 3) — Memory tab
482
+
483
+ export interface MemoryEntry {
484
+ name: string;
485
+ path: string;
486
+ mtimeMs: number;
487
+ bytes: number;
488
+ }
489
+
490
+ export interface MemoryListResult {
491
+ entries: MemoryEntry[];
492
+ workspace: string;
493
+ error: string | null;
494
+ }
495
+
496
+ export interface MemoryReadResult {
497
+ content: string;
498
+ exists: boolean;
499
+ mtimeMs: number;
500
+ bytes: number;
501
+ error: string | null;
502
+ }
503
+
504
+ export interface MemoryMutationResult {
505
+ ok: boolean;
506
+ error: string | null;
507
+ }
508
+
509
+ // ────────────────────────────────────────────── Bundle F — plugins install
510
+
511
+ export interface PluginInstallResult {
512
+ ok: boolean;
513
+ exitCode: number;
514
+ error?: string;
515
+ }
516
+
517
+ export interface PluginInstallProgressEvent {
518
+ slug: string;
519
+ line: string;
520
+ }
521
+
398
522
  export interface SessionManagerAPI {
399
523
  app: {
400
524
  version: () => Promise<string>;
@@ -505,10 +629,16 @@ export interface SessionManagerAPI {
505
629
  openFolder: () => Promise<{ ok: boolean }>;
506
630
  readPrd: (slug: string) => Promise<{ ok: boolean; text?: string; error?: string }>;
507
631
  readLog: (runId: string, slug: string) => Promise<{ ok: boolean; text?: string; error?: string }>;
508
- writePrd: (slug: string, body: string) => Promise<{ ok: boolean; bytesWritten: number }>;
632
+ writePrd: (slug: string, body: string) => Promise<{ ok: true; bytesWritten: number } | { ok: false; error: string }>;
509
633
  listPrds: () => Promise<PrdListItem[]>;
510
634
  health: () => Promise<ScheduleHealthSnapshot>;
511
635
  onState: (handler: (snapshot: ScheduleStateSnapshot) => void) => () => void;
636
+ /** Bundle D — scan all PRDs for unbounded loops + missing frontmatter. */
637
+ lintQueue: () => Promise<LintQueueResult>;
638
+ /** Bundle D — move PRDs to prds-archived/<ISO>/. Never deletes. */
639
+ archivePrds: (slugs: string[]) => Promise<ArchivePrdResult>;
640
+ /** Bundle D — bulk retag parallelGroup and/or estimateMinutes. */
641
+ retagPrds: (items: RetagPrdItem[]) => Promise<RetagPrdResult>;
512
642
  };
513
643
  supervisor: {
514
644
  /** Debug-only: run a supervisor tick immediately. Used by e2e tests. */
@@ -516,6 +646,28 @@ export interface SessionManagerAPI {
516
646
  /** Return last 50 supervisor log entries, descending by ts. */
517
647
  getLog: () => Promise<SupervisorLogEntry[]>;
518
648
  };
649
+ teams: {
650
+ /** Enumerate ~/.claude/teams/<name>/config.json + inbox depths. */
651
+ list: () => Promise<TeamsListResult>;
652
+ };
653
+ plugins: {
654
+ /** Run `claude plugin install <slug>` in a hidden pty. Streams output
655
+ * via `onInstallProgress`. Returns { ok, exitCode } on exit. */
656
+ install: (payload: { slug: string }) => Promise<PluginInstallResult>;
657
+ onInstallProgress: (handler: (ev: PluginInstallProgressEvent) => void) => () => void;
658
+ };
659
+ memory: {
660
+ /** List markdown memory entries for the given workspace (defaults to 'default'). */
661
+ list: (workspace?: string) => Promise<MemoryListResult>;
662
+ /** Read the contents of one memory entry. */
663
+ read: (name: string, workspace?: string) => Promise<MemoryReadResult>;
664
+ /** Atomic write of a memory entry (max 1 MiB). */
665
+ write: (name: string, content: string, workspace?: string) => Promise<MemoryMutationResult>;
666
+ /** Delete a memory entry. */
667
+ delete: (name: string, workspace?: string) => Promise<MemoryMutationResult>;
668
+ /** Create a new memory entry with starter frontmatter + body. */
669
+ create: (name: string, description?: string, workspace?: string) => Promise<MemoryMutationResult>;
670
+ };
519
671
  }
520
672
 
521
673
  declare global {
@@ -162,9 +162,38 @@ contextBridge.exposeInMainWorld('api', {
162
162
  ipcRenderer.on('schedule:state', listener);
163
163
  return () => ipcRenderer.removeListener('schedule:state', listener);
164
164
  },
165
+ // Bundle D — queue ops (queueOps.cjs).
166
+ lintQueue: () => ipcRenderer.invoke('schedule:lint-queue'),
167
+ archivePrds: (slugs) => ipcRenderer.invoke('schedule:archive-prd', { slugs }),
168
+ retagPrds: (items) => ipcRenderer.invoke('schedule:retag-prd', { items }),
165
169
  },
166
170
  supervisor: {
167
171
  tickNow: () => ipcRenderer.invoke('supervisor:tick-now'),
168
172
  getLog: () => ipcRenderer.invoke('supervisor:get-log'),
169
173
  },
174
+ teams: {
175
+ list: () => ipcRenderer.invoke('teams:list'),
176
+ },
177
+ plugins: {
178
+ install: (payload) => ipcRenderer.invoke('plugins:install', payload),
179
+ onInstallProgress: (handler) => {
180
+ const listener = (_e, payload) => handler(payload);
181
+ ipcRenderer.on('plugins:install-progress', listener);
182
+ return () => ipcRenderer.removeListener('plugins:install-progress', listener);
183
+ },
184
+ },
185
+ memory: {
186
+ list: (workspace) => ipcRenderer.invoke('memory:list', workspace ? { workspace } : {}),
187
+ read: (name, workspace) => ipcRenderer.invoke('memory:read', workspace ? { name, workspace } : { name }),
188
+ write: (name, content, workspace) =>
189
+ ipcRenderer.invoke('memory:write', workspace ? { name, content, workspace } : { name, content }),
190
+ delete: (name, workspace) =>
191
+ ipcRenderer.invoke('memory:delete', workspace ? { name, workspace } : { name }),
192
+ create: (name, description, workspace) => {
193
+ const payload = { name };
194
+ if (description) payload.description = description;
195
+ if (workspace) payload.workspace = workspace;
196
+ return ipcRenderer.invoke('memory:create', payload);
197
+ },
198
+ },
170
199
  });
@@ -1 +0,0 @@
1
- import{c as h,l as s}from"./editor.main-UoasbVGy.js";import{C as c,H as u,D as p,a as m,R as f,b as _,c as w,d as k,F as v,e as D,S as P,f as R,g as I}from"./lspLanguageFeatures-DvSiaY4f.js";import{h as H,i as U,j as y,t as T,k as x}from"./lspLanguageFeatures-DvSiaY4f.js";import"./index-DWDcKbgI.js";const C=120*1e3;class A{constructor(n){this._defaults=n,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>C&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=h({moduleId:"vs/language/css/cssWorker",createWorker:()=>new Worker(new URL(""+new URL("css.worker-B4z49cGk.js",import.meta.url).href,import.meta.url),{type:"module"}),label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...n){let e;return this._getClient().then(a=>{e=a}).then(a=>{if(this._worker)return this._worker.withSyncedResources(n)}).then(a=>e)}}function L(o){const n=[],e=[],a=new A(o);n.push(a);const r=(...t)=>a.getLanguageServiceWorker(...t);function l(){const{languageId:t,modeConfiguration:i}=o;g(e),i.completionItems&&e.push(s.registerCompletionItemProvider(t,new c(r,["/","-",":"]))),i.hovers&&e.push(s.registerHoverProvider(t,new u(r))),i.documentHighlights&&e.push(s.registerDocumentHighlightProvider(t,new p(r))),i.definitions&&e.push(s.registerDefinitionProvider(t,new m(r))),i.references&&e.push(s.registerReferenceProvider(t,new f(r))),i.documentSymbols&&e.push(s.registerDocumentSymbolProvider(t,new _(r))),i.rename&&e.push(s.registerRenameProvider(t,new w(r))),i.colors&&e.push(s.registerColorProvider(t,new k(r))),i.foldingRanges&&e.push(s.registerFoldingRangeProvider(t,new v(r))),i.diagnostics&&e.push(new D(t,r,o.onDidChange)),i.selectionRanges&&e.push(s.registerSelectionRangeProvider(t,new P(r))),i.documentFormattingEdits&&e.push(s.registerDocumentFormattingEditProvider(t,new R(r))),i.documentRangeFormattingEdits&&e.push(s.registerDocumentRangeFormattingEditProvider(t,new I(r)))}return l(),n.push(d(e)),d(n)}function d(o){return{dispose:()=>g(o)}}function g(o){for(;o.length;)o.pop().dispose()}export{c as CompletionAdapter,m as DefinitionAdapter,D as DiagnosticsAdapter,k as DocumentColorAdapter,R as DocumentFormattingEditProvider,p as DocumentHighlightAdapter,H as DocumentLinkAdapter,I as DocumentRangeFormattingEditProvider,_ as DocumentSymbolAdapter,v as FoldingRangeAdapter,u as HoverAdapter,f as ReferenceAdapter,w as RenameAdapter,P as SelectionRangeAdapter,A as WorkerManager,U as fromPosition,y as fromRange,L as setupMode,T as toRange,x as toTextEdit};