claude-code-session-manager 0.71.0 → 0.72.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 (30) hide show
  1. package/dist/assets/{AgentLibrary-B1lh6YEM.js → AgentLibrary-CXw7Z5Iw.js} +1 -1
  2. package/dist/assets/{History-B1jNdKFk.js → History-D64U_aDf.js} +1 -1
  3. package/dist/assets/{Hooks-BWHFkF7z.js → Hooks-BFVkM6QH.js} +1 -1
  4. package/dist/assets/{HostBilko-CYQt0b-t.js → HostBilko-BRERoCra.js} +1 -1
  5. package/dist/assets/{Library-DZVKlOBQ.js → Library-C6shVsjv.js} +1 -1
  6. package/dist/assets/{ListDetail-rBF1ZQv8.js → ListDetail-dXWSZuDV.js} +1 -1
  7. package/dist/assets/{MarkdownEditor-zS0QmHxL.js → MarkdownEditor-D_akyPJ2.js} +1 -1
  8. package/dist/assets/{McpServers-BA54nZee.js → McpServers-DxROkYGa.js} +1 -1
  9. package/dist/assets/{Memory-DN97rjG5.js → Memory-OqUyTRrr.js} +1 -1
  10. package/dist/assets/{Panel-DLn9L0Cv.js → Panel-Biw98xRO.js} +1 -1
  11. package/dist/assets/{Permissions-BnDRq-EM.js → Permissions-CIdZOzK8.js} +1 -1
  12. package/dist/assets/{Plugins-aPC4a4Bi.js → Plugins-Dt147wEE.js} +2 -2
  13. package/dist/assets/{ProvenanceBadge-Bc1gskID.js → ProvenanceBadge-BUikIHf4.js} +1 -1
  14. package/dist/assets/{SaveBar-CjvWkRaQ.js → SaveBar-BoHRDHlp.js} +1 -1
  15. package/dist/assets/{Scheduler-86oyi_P2.js → Scheduler-CipmAcy7.js} +1 -1
  16. package/dist/assets/{ScopeSwitcher-DJvnhSk3.js → ScopeSwitcher-CkCwUYU5.js} +1 -1
  17. package/dist/assets/{Settings-B7_1p_xA.js → Settings-CmU_7z2e.js} +1 -1
  18. package/dist/assets/{SkillReferenceGraph-CZjMRk3z.js → SkillReferenceGraph-BuSuA3B7.js} +1 -1
  19. package/dist/assets/{Skills-EueUDa9X.js → Skills-BM8w5BGV.js} +1 -1
  20. package/dist/assets/{SystemPrompt-BQQudmyk.js → SystemPrompt-BWOdtfze.js} +1 -1
  21. package/dist/assets/{TagLibrary-BEAqaJlp.js → TagLibrary-cn3JECC5.js} +1 -1
  22. package/dist/assets/{TiptapBody-DKmVDGB5.js → TiptapBody-BwoXKY8J.js} +1 -1
  23. package/dist/assets/{Toggle-B7Qb5e2O.js → Toggle-BlNVxkq-.js} +1 -1
  24. package/dist/assets/{index-l-hKv9ou.js → index-BpzvONtX.js} +519 -519
  25. package/dist/assets/{index-CNmekpRK.css → index-DDpA9yBe.css} +1 -1
  26. package/dist/assets/{settingsSchema-DEW4x9LG.js → settingsSchema-DePBZnaw.js} +1 -1
  27. package/dist/index.html +2 -2
  28. package/package.json +1 -1
  29. package/src/main/__tests__/stop-signal-anchor.test.cjs +75 -0
  30. package/src/main/index.cjs +6 -6
@@ -0,0 +1,75 @@
1
+ /**
2
+ * stop-signal-anchor.test.cjs — drift guard between chatRunner's
3
+ * STOP_SENTINEL/splitStopSignal and the renderer's duplicated copy.
4
+ *
5
+ * `src/renderer/lib/stopSignal.ts` cannot import this main-process `.cjs`
6
+ * (CommonJS main / ESM renderer split), so it carries its own literal
7
+ * `STOP_SENTINEL` + a re-implementation of `splitStopSignal`. This test
8
+ * requires the REAL exported constant and asserts the renderer's copy is
9
+ * byte-identical, and that both splitters agree on `body` for the same
10
+ * composed sample — so a rework of either constant/function fails here
11
+ * loudly instead of the two forms of a stop-signal reply silently drifting
12
+ * back out of sync (which is exactly what caused the doubled-message bug
13
+ * this module exists to fix).
14
+ *
15
+ * Run: timeout 120 npx vitest run src/main/__tests__/stop-signal-anchor.test.cjs
16
+ */
17
+
18
+ 'use strict';
19
+
20
+ const path = require('path');
21
+
22
+ import { test, expect } from 'vitest';
23
+
24
+ const { STOP_SENTINEL, splitStopSignal } = require('../chatRunner.cjs');
25
+
26
+ async function loadRendererCopy() {
27
+ const mod = await import(
28
+ /* @vite-ignore */ path.resolve(__dirname, '..', '..', 'renderer', 'lib', 'stopSignal.ts')
29
+ );
30
+ return mod;
31
+ }
32
+
33
+ test('the renderer STOP_SENTINEL literal is byte-identical to chatRunner.cjs', async () => {
34
+ const rendererCopy = await loadRendererCopy();
35
+ expect(rendererCopy.STOP_SENTINEL).toBe(STOP_SENTINEL);
36
+ });
37
+
38
+ test('both splitters agree on body for a composed stop-signal reply', async () => {
39
+ const rendererCopy = await loadRendererCopy();
40
+ const body = 'Here is what I found and what I still need from you.';
41
+ const full = `${body}\n\n${STOP_SENTINEL}\n${JSON.stringify({ questions: ['Deploy to prod now?'] })}`;
42
+
43
+ const mainSplit = splitStopSignal(full);
44
+ const rendererSplit = rendererCopy.splitStopSignal(full);
45
+
46
+ expect(mainSplit).not.toBeNull();
47
+ expect(rendererSplit).not.toBeNull();
48
+ expect(rendererSplit.body).toBe(mainSplit.answerBody);
49
+ expect(rendererSplit.body).toBe(body);
50
+ expect(rendererSplit.questions ?? mainSplit.questions).toBeDefined();
51
+ });
52
+
53
+ test('both splitters return null for text with no sentinel', async () => {
54
+ const rendererCopy = await loadRendererCopy();
55
+ const plain = 'Just a normal reply, no protocol block.';
56
+ expect(splitStopSignal(plain)).toBeNull();
57
+ expect(rendererCopy.splitStopSignal(plain)).toBeNull();
58
+ });
59
+
60
+ test('both splitters refuse a quoted sentinel with no valid JSON tail', async () => {
61
+ const rendererCopy = await loadRendererCopy();
62
+ const quoting = `Why does chat use ${STOP_SENTINEL} internally? Not real JSON after it.`;
63
+ expect(splitStopSignal(quoting)).toBeNull();
64
+ expect(rendererCopy.splitStopSignal(quoting)).toBeNull();
65
+ });
66
+
67
+ test('both splitters anchor on the LAST sentinel occurrence', async () => {
68
+ const rendererCopy = await loadRendererCopy();
69
+ const body = 'first mention of the sentinel text, then the real one';
70
+ const full = `${STOP_SENTINEL} mentioned earlier in prose.\n\n${body}\n\n${STOP_SENTINEL}\n${JSON.stringify({ questions: ['q'] })}`;
71
+
72
+ const mainSplit = splitStopSignal(full);
73
+ const rendererSplit = rendererCopy.splitStopSignal(full);
74
+ expect(mainSplit.answerBody).toBe(rendererSplit.body);
75
+ });
@@ -1057,7 +1057,7 @@ app.whenReady().then(async () => {
1057
1057
  label: 'Session Manager',
1058
1058
  submenu: [
1059
1059
  {
1060
- label: 'New Session',
1060
+ label: 'Open / Start Project…',
1061
1061
  accelerator: 'CmdOrCtrl+N',
1062
1062
  click: () => {
1063
1063
  if (mainWindow && !mainWindow.isDestroyed()) {
@@ -1066,12 +1066,12 @@ app.whenReady().then(async () => {
1066
1066
  },
1067
1067
  },
1068
1068
  {
1069
- label: 'Restart App',
1069
+ label: 'Restart Session Manager App',
1070
1070
  accelerator: 'CmdOrCtrl+Shift+R',
1071
1071
  click: rebootApp,
1072
1072
  },
1073
1073
  {
1074
- label: 'Reboot Session',
1074
+ label: 'Restart Terminal in Active Tab',
1075
1075
  accelerator: 'CmdOrCtrl+Shift+S',
1076
1076
  click: () => {
1077
1077
  if (mainWindow && !mainWindow.isDestroyed()) {
@@ -1080,14 +1080,14 @@ app.whenReady().then(async () => {
1080
1080
  },
1081
1081
  },
1082
1082
  { type: 'separator' },
1083
- { label: 'Quit', accelerator: 'CmdOrCtrl+Q', role: 'quit' },
1083
+ { label: 'Quit Session Manager', accelerator: 'CmdOrCtrl+Q', role: 'quit' },
1084
1084
  ],
1085
1085
  },
1086
1086
  {
1087
1087
  label: 'Dev',
1088
1088
  submenu: [
1089
- { label: 'Toggle DevTools', accelerator: 'F12', role: 'toggleDevTools' },
1090
- { label: 'Reload', accelerator: 'CmdOrCtrl+R', role: 'reload' },
1089
+ { label: 'Toggle Developer Tools', accelerator: 'F12', role: 'toggleDevTools' },
1090
+ { label: 'Reload App Window', accelerator: 'CmdOrCtrl+R', role: 'reload' },
1091
1091
  // Diagnostic-only; absent unless SM_HEAP_SNAPSHOT=1 (see heapSnapshot.cjs).
1092
1092
  ...(heapSnapshotMenuItem ? [heapSnapshotMenuItem] : []),
1093
1093
  ],