@phenx-inc/ctlsurf 0.17.2 → 0.17.3

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 (51) hide show
  1. package/README.md +25 -2
  2. package/out/headless/index.mjs +1033 -128
  3. package/out/headless/index.mjs.map +4 -4
  4. package/out/main/index.js +929 -17
  5. package/out/preload/index.js +15 -0
  6. package/out/renderer/assets/{cssMode-BtQxI2Eb.js → cssMode-BJfoToLX.js} +3 -3
  7. package/out/renderer/assets/{freemarker2-DRW5dmY5.js → freemarker2-T0eMtP1Z.js} +1 -1
  8. package/out/renderer/assets/{handlebars-CFLF3cP7.js → handlebars-Dbbib8fi.js} +1 -1
  9. package/out/renderer/assets/{html-DtnBOkwp.js → html-BRHT_oxc.js} +1 -1
  10. package/out/renderer/assets/{htmlMode-DMVysDCg.js → htmlMode-BRlZTxME.js} +3 -3
  11. package/out/renderer/assets/{index-CEjwKjtd.css → index-CBWAeUYW.css} +91 -0
  12. package/out/renderer/assets/{index-Dm70hk5s.js → index-RCAeuJTr.js} +476 -411
  13. package/out/renderer/assets/{javascript-ChlyA1sf.js → javascript-BbOZOxq9.js} +2 -2
  14. package/out/renderer/assets/{jsonMode-D1_oHzeN.js → jsonMode-CUvAeYcT.js} +3 -3
  15. package/out/renderer/assets/{liquid-D4ftdy1G.js → liquid-DRIACo_s.js} +1 -1
  16. package/out/renderer/assets/{lspLanguageFeatures-Ckqu5ubG.js → lspLanguageFeatures-Ds-3nH9p.js} +1 -1
  17. package/out/renderer/assets/{mdx-B9wsVYSC.js → mdx-D76jlpLO.js} +1 -1
  18. package/out/renderer/assets/{python-e23tD6IS.js → python-CMuRPKJi.js} +1 -1
  19. package/out/renderer/assets/{razor-CrDyXj3d.js → razor-DRoH5mal.js} +1 -1
  20. package/out/renderer/assets/{tsMode-BwGC5o4O.js → tsMode-dPJzgFD7.js} +1 -1
  21. package/out/renderer/assets/{typescript-Do-98d_O.js → typescript-D5USKnLj.js} +1 -1
  22. package/out/renderer/assets/{xml-Dpdu5R3m.js → xml-qYg1wt2P.js} +1 -1
  23. package/out/renderer/assets/{yaml-B0Zt7LCJ.js → yaml-Uc-CvnvL.js} +1 -1
  24. package/out/renderer/index.html +2 -2
  25. package/package.json +4 -2
  26. package/scripts/check-work-map-gpu.cjs +62 -0
  27. package/scripts/check-work-map-gpu.d.cts +13 -0
  28. package/scripts/postinstall.cjs +15 -0
  29. package/scripts/prepare-work-map.py +37 -0
  30. package/scripts/test-work-map-capability.cjs +45 -0
  31. package/scripts/test-work-map-ui.cjs +130 -0
  32. package/scripts/test-work-map.cjs +352 -0
  33. package/scripts/work-map-clef.py +81 -0
  34. package/src/main/index.ts +35 -1
  35. package/src/main/observer/observer.ts +2 -0
  36. package/src/main/orchestrator.ts +39 -4
  37. package/src/main/transcripts.ts +35 -16
  38. package/src/main/workMap/clef.ts +156 -0
  39. package/src/main/workMap/normalize.ts +172 -0
  40. package/src/main/workMap/source.ts +28 -0
  41. package/src/main/workMap/tree.ts +199 -0
  42. package/src/main/workMap/workMap.ts +244 -0
  43. package/src/preload/index.ts +17 -0
  44. package/src/renderer/App.tsx +15 -16
  45. package/src/renderer/components/ObserverPanel.tsx +3 -0
  46. package/src/renderer/components/SettingsDialog.tsx +0 -104
  47. package/src/renderer/components/WorkMapPanel.tsx +235 -0
  48. package/src/renderer/components/WorkMapToggle.tsx +50 -0
  49. package/src/renderer/lib/workMapHighlights.ts +41 -0
  50. package/src/renderer/styles.css +91 -0
  51. package/src/shared/workMap.d.ts +70 -0
@@ -85,6 +85,21 @@ const api = {
85
85
  // Speak agent replies (global, Electron-only)
86
86
  getSpeakReplies: () => electron.ipcRenderer.invoke("speak:get"),
87
87
  setSpeakReplies: (enabled) => electron.ipcRenderer.invoke("speak:set", enabled),
88
+ getWorkMap: (tabId) => electron.ipcRenderer.invoke("workmap:get", tabId),
89
+ getWorkMapCapability: () => electron.ipcRenderer.invoke("workmap:capability"),
90
+ onWorkMapCapability: (callback) => {
91
+ const listener = (_event, capability) => callback(capability);
92
+ electron.ipcRenderer.on("workmap:capability", listener);
93
+ return () => electron.ipcRenderer.removeListener("workmap:capability", listener);
94
+ },
95
+ getWorkMapSource: (tabId, eventId) => electron.ipcRenderer.invoke("workmap:source", tabId, eventId),
96
+ setWorkMap: (tabId, settings) => electron.ipcRenderer.invoke("workmap:set", tabId, settings),
97
+ clearWorkMap: (tabId) => electron.ipcRenderer.invoke("workmap:clear", tabId),
98
+ onWorkMapUpdate: (callback) => {
99
+ const listener = (_event, snapshot) => callback(snapshot);
100
+ electron.ipcRenderer.on("workmap:update", listener);
101
+ return () => electron.ipcRenderer.removeListener("workmap:update", listener);
102
+ },
88
103
  // Observer supervision layer (global). The API key is write-only over IPC:
89
104
  // the getter reports only whether one is configured and from where.
90
105
  getObserverSettings: () => electron.ipcRenderer.invoke("observer:get"),
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-Dm70hk5s.js";
2
- import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-Ckqu5ubG.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-Ckqu5ubG.js";
1
+ import { c as createWebWorker, l as languages } from "./index-RCAeuJTr.js";
2
+ import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-Ds-3nH9p.js";
3
+ import { h, i, j, t, k } from "./lspLanguageFeatures-Ds-3nH9p.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-Dm70hk5s.js";
1
+ import { l as languages } from "./index-RCAeuJTr.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-Dm70hk5s.js";
1
+ import { l as languages } from "./index-RCAeuJTr.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-Dm70hk5s.js";
1
+ import { l as languages } from "./index-RCAeuJTr.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-Dm70hk5s.js";
2
- import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-Ckqu5ubG.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-Ckqu5ubG.js";
1
+ import { c as createWebWorker, l as languages } from "./index-RCAeuJTr.js";
2
+ import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-Ds-3nH9p.js";
3
+ import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-Ds-3nH9p.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -7403,6 +7403,97 @@
7403
7403
  flipped mechanically.
7404
7404
  ───────────────────────────────────────────────────────────── */
7405
7405
 
7406
+ /* Live work map */
7407
+ .work-map-panel { position: relative; display: flex; flex-direction: column; height: 100%; min-width: 0; overflow: hidden; background: var(--bg-app); color: var(--text); font-size: 12px; }
7408
+ .work-map-controls { padding: 20px 18px 12px; flex-shrink: 0; border-bottom: 1px solid var(--border-subtle); background: var(--bg-chrome); max-height: 55%; overflow-y: auto; }
7409
+ .work-map-kicker { display: block; color: var(--text-muted); font-size: 9px; font-weight: 700; letter-spacing: 1.6px; line-height: 1.8; }
7410
+ .work-map-heading-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin: 4px 0 10px; }
7411
+ .work-map-heading h2 { margin: 0; color: var(--text-bright); font-size: 21px; font-weight: 550; letter-spacing: -0.7px; }
7412
+ .work-map-panel button, .work-map-panel select, .work-map-panel input { font: inherit; }
7413
+ .work-map-panel button { cursor: pointer; }
7414
+ .work-map-panel button:disabled { opacity: .45; cursor: default; }
7415
+ .work-map-panel button:focus-visible, .work-map-panel summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
7416
+ .work-map-switch { display: flex; align-items: center; gap: 6px; flex-shrink: 0; padding: 4px 7px; border: 1px solid var(--border); border-radius: 20px; background: var(--bg-surface); color: var(--text-muted); }
7417
+ .work-map-switch span { width: 11px; height: 11px; border-radius: 50%; background: var(--text-muted); }
7418
+ .work-map-switch b { font-size: 10px; font-weight: 600; }
7419
+ .work-map-switch.on { color: var(--success); border-color: var(--success); background: var(--bg-chip-soft); }
7420
+ .work-map-switch.on span { background: var(--success); }
7421
+ .work-map-engine-row { display: flex; gap: 12px; align-items: center; }
7422
+ .work-map-engine-row label { color: var(--text-soft); font-size: 11px; }
7423
+ .work-map-engine-row select { flex: 1; min-width: 0; padding: 6px 8px; color: var(--text-bright); background: var(--bg-well); border: 1px solid var(--border-subtle); border-radius: 6px; }
7424
+ .work-map-live { display: flex; align-items: center; gap: 6px; padding-top: 12px; font-size: 10px; color: var(--text-soft); }
7425
+ .work-map-live-dot { width: 5px; height: 5px; flex-shrink: 0; background: var(--text-muted); border-radius: 50%; }
7426
+ .work-map-live-dot.on { background: var(--success); box-shadow: 0 0 7px color-mix(in srgb, var(--success) 30%, transparent); }
7427
+ .work-map-agent { margin-left: auto; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7428
+ .work-map-error { padding: 10px; margin-top: 12px; border: 1px solid var(--danger); border-radius: 6px; color: var(--danger); font-size: 11px; line-height: 1.5; overflow-wrap: anywhere; }
7429
+ .work-map-error button, .work-map-setup button { display: block; background: var(--bg-surface); border: 1px solid var(--border); color: var(--text-bright); border-radius: 4px; padding: 4px 9px; margin-top: 8px; }
7430
+ .work-map-setup { margin-top: 10px; font-size: 10px; color: var(--text-muted); }
7431
+ .work-map-setup summary { cursor: pointer; width: fit-content; }
7432
+ .work-map-setup p { color: var(--text-soft); line-height: 1.6; }
7433
+ .work-map-setup label { display: block; margin-top: 8px; color: var(--text-soft); }
7434
+ .work-map-setup input { display: block; width: 100%; box-sizing: border-box; margin-top: 4px; padding: 6px; background: var(--bg-well); color: var(--text); border: 1px solid var(--border); border-radius: 4px; font-size: 10px; }
7435
+ .work-map-scroll { flex: 1; min-height: 0; overflow: auto; padding: 20px 14px 40px; scrollbar-gutter: stable; overflow-anchor: none; }
7436
+ .work-map-empty { padding: 24px 14px; max-width: 280px; margin: auto; }
7437
+ .work-map-empty-tree { display: flex; flex-direction: column; color: var(--accent); font: 22px/1.7 ui-monospace, monospace; margin: 0 0 20px 10px; }
7438
+ .work-map-empty-tree span { color: var(--text-muted); padding-left: 5px; }
7439
+ .work-map-empty h3 { font-size: 16px; font-weight: 500; line-height: 1.5; color: var(--text-bright); margin: 0 0 10px; }
7440
+ .work-map-empty p { color: var(--text-soft); font-size: 12px; line-height: 1.8; margin: 0; }
7441
+ .work-map-goal + .work-map-goal { margin-top: 28px; }
7442
+ .work-map-goal-heading { display: flex; align-items: flex-start; gap: 9px; width: 100%; border: 0; padding: 0; background: transparent; text-align: left; color: var(--text-bright); }
7443
+ .work-map-goal-icon { font-size: 22px; line-height: 1.5; color: var(--accent); flex-shrink: 0; }
7444
+ .work-map-goal-heading strong { display: block; line-height: 1.5; font-size: 13px; font-weight: 550; overflow-wrap: anywhere; }
7445
+ .work-map-caret { margin-left: auto; color: var(--text-muted); flex-shrink: 0; font-size: 12px; }
7446
+ .work-map-branches { margin: 12px 0 0 10px; padding-left: 17px; border-left: 1px solid var(--border-dim); }
7447
+ .work-map-branch { position: relative; padding: 0 0 17px; }
7448
+ .work-map-branch:last-child { padding-bottom: 0; }
7449
+ .work-map-branch::before { content: ''; position: absolute; left: -18px; top: 12px; width: 15px; height: 1px; background: var(--border-dim); }
7450
+ .work-map-branch-heading { display: flex; align-items: center; gap: 7px; width: 100%; padding: 5px 0; border: 0; background: transparent; text-align: left; color: var(--text-bright); }
7451
+ .work-map-branch-point { width: 6px; height: 6px; flex-shrink: 0; border-radius: 2px; background: var(--accent); }
7452
+ .work-map-branch-point.failed { background: var(--danger); }
7453
+ .work-map-branch-label { min-width: 0; overflow-wrap: anywhere; font-size: 11px; font-weight: 600; }
7454
+ .work-map-count { padding: 1px 5px; border-radius: 4px; background: var(--bg-chip); color: var(--text-soft); font-size: 9px; }
7455
+ .work-map-steps { list-style: none; margin: 5px 0 0 2px; padding: 0 0 0 8px; border-left: 1px solid var(--border-subtle); }
7456
+ .work-map-step { margin: 5px 0; border: 1px solid var(--border-well); background: var(--bg-well); border-radius: 7px; overflow: hidden; }
7457
+ .work-map-step.failed { border-color: color-mix(in srgb, var(--danger) 45%, var(--border-well)); }
7458
+ .work-map-step-button { display: flex; align-items: flex-start; gap: 8px; padding: 10px 9px; width: 100%; border: 0; background: transparent; color: var(--text); text-align: left; }
7459
+ .work-map-step-button:hover { background: var(--bg-inset-hi); }
7460
+ .work-map-activity { display: grid; place-items: center; width: 22px; height: 22px; flex-shrink: 0; border-radius: 5px; background: var(--bg-chip); color: var(--accent); font-size: 17px; }
7461
+ .work-map-activity.editing { color: var(--warning); }
7462
+ .work-map-activity.testing { color: var(--success); }
7463
+ .work-map-activity.planning { color: var(--sev-digest); }
7464
+ .work-map-activity.thinking { color: var(--sev-digest); }
7465
+ .work-map-step.follows-intent { margin-left: 12px; border-left: 2px solid var(--border-dim); }
7466
+ .work-map-link { color: var(--text-soft); }
7467
+ .work-map-reason { display: block; border-left: 2px solid var(--border-dim); padding-left: 7px; margin-top: 7px; color: var(--text-soft); font-size: 10px; line-height: 1.7; overflow-wrap: anywhere; }
7468
+ .work-map-reason b { color: var(--text-bright); font-size: 9px; margin-right: 3px; }
7469
+ .work-map-receipt .work-map-source-text { max-height: 310px; line-height: 1.8; }
7470
+ .work-map-highlight { color: var(--text-bright); background: color-mix(in srgb, var(--warning) 25%, transparent); border-radius: 2px; padding: 1px 0; }
7471
+ .work-map-highlight.reason { background: color-mix(in srgb, var(--accent) 25%, transparent); }
7472
+ .work-map-highlight-key { display: flex !important; flex-wrap: wrap; gap: 10px; }
7473
+ .work-map-highlight-key span:first-child { color: var(--warning); }
7474
+ .work-map-highlight-key span + span { color: var(--accent); }
7475
+ .work-map-thinking-status { color: var(--text-muted); font-size: 10px; line-height: 1.5; margin: 8px 0 0; }
7476
+ .work-map-intent { color: var(--sev-digest); }
7477
+ .work-map-intent.hypothesis { color: var(--warning); }
7478
+ .work-map-intent.decision { color: var(--accent); }
7479
+ .work-map-step-copy { min-width: 0; flex: 1; }
7480
+ .work-map-step-title { display: block; overflow-wrap: anywhere; line-height: 1.6; font-size: 11px; }
7481
+ .work-map-step-meta { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 5px; font-size: 9px; color: var(--text-muted); }
7482
+ .work-map-status.running { color: var(--accent); }
7483
+ .work-map-status.succeeded { color: var(--success); }
7484
+ .work-map-status.failed { color: var(--danger); }
7485
+ .work-map-receipt-caret { color: var(--text-muted); line-height: 1.6; font-size: 12px; }
7486
+ .work-map-evidence { padding: 0 10px 10px; font-size: 10px; line-height: 1.6; }
7487
+ .work-map-evidence-heading { border-top: 1px solid var(--border-subtle); padding-top: 10px; color: var(--text-bright); font-weight: 600; }
7488
+ .work-map-receipt { margin-top: 10px; color: var(--text-soft); }
7489
+ .work-map-receipt pre { font: 10px/1.6 ui-monospace, monospace; color: var(--text); background: var(--bg-app); white-space: pre-wrap; overflow-wrap: anywhere; padding: 8px; border-radius: 4px; max-height: 170px; overflow: auto; }
7490
+ .work-map-receipt code { display: block; color: var(--text-muted); font-size: 9px; overflow-wrap: anywhere; }
7491
+ .work-map-evidence small { display: block; margin-top: 10px; color: var(--text-muted); font-size: 9px; }
7492
+ .work-map-retained { color: var(--text-muted); font-size: 10px; padding: 12px 0; text-align: center; }
7493
+ .work-map-jump { position: absolute; bottom: 45px; left: 50%; transform: translateX(-50%); white-space: nowrap; border: 1px solid var(--border-strong); border-radius: 20px; padding: 7px 13px; background: var(--bg-raised); color: var(--accent); box-shadow: 0 3px 12px var(--shadow-color); }
7494
+ .work-map-footer { display: flex; align-items: center; justify-content: space-between; padding: 9px 14px; gap: 8px; border-top: 1px solid var(--border-subtle); background: var(--bg-chrome); color: var(--text-muted); font-size: 9px; }
7495
+ .work-map-footer button { border: 0; background: transparent; color: var(--text-soft); padding: 2px; font-size: 10px; }
7496
+
7406
7497
  :root,
7407
7498
  :root[data-theme='tokyo-night'] {
7408
7499
  color-scheme: dark;