tmux-ide 2.9.4 → 2.9.5

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 (80) hide show
  1. package/bin/cli.js +4354 -3376
  2. package/package.json +7 -6
  3. package/packages/contracts/src/session-runtime.ts +2 -0
  4. package/packages/contracts/src/terminal-delivery.ts +4 -0
  5. package/packages/core/src/terminal-compact-capability.ts +31 -1
  6. package/packages/core/src/terminal-delivery.ts +234 -32
  7. package/packages/core/src/terminal-replica-hash-cache.ts +162 -21
  8. package/packages/core/src/terminal-replica-owned-row.ts +165 -10
  9. package/packages/core/src/terminal-replica.ts +43 -21
  10. package/packages/daemon/dist/lib/daemon-embed.js +19 -34
  11. package/packages/daemon/dist/lib/runtime-trace-writer.js +133 -0
  12. package/packages/daemon/dist/lib/tmux-client-execution.js +37 -2
  13. package/packages/daemon/dist/lib/tmux-server-owner.js +20 -4
  14. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/Info.plist +2 -2
  15. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/MacOS/tmux-ide-notifier +0 -0
  16. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/Resources/Assets.car +0 -0
  17. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/_CodeSignature/CodeResources +2 -2
  18. package/packages/daemon/dist/native/tmux/darwin-arm64/manifest.json +5 -1
  19. package/packages/daemon/dist/native/tmux/darwin-arm64/tmux +0 -0
  20. package/packages/daemon/dist/native/tmux/darwin-x64/manifest.json +5 -1
  21. package/packages/daemon/dist/native/tmux/darwin-x64/tmux +0 -0
  22. package/packages/daemon/dist/native/tmux/linux-arm64/manifest.json +5 -1
  23. package/packages/daemon/dist/native/tmux/linux-arm64/tmux +0 -0
  24. package/packages/daemon/dist/native/tmux/linux-x64/licenses/libevent_core-2.1.so.7.txt +0 -0
  25. package/packages/daemon/dist/native/tmux/linux-x64/manifest.json +5 -1
  26. package/packages/daemon/dist/native/tmux/linux-x64/tmux +0 -0
  27. package/packages/daemon/dist/terminal/attachments/native-runtime.js +6 -6
  28. package/packages/daemon/dist/terminal/mirror/control-channel.js +379 -75
  29. package/packages/daemon/dist/terminal/mirror/mirror-service.js +43 -3
  30. package/packages/daemon/dist/terminal/mirror/native-grid-projection.js +20 -11
  31. package/packages/daemon/dist/terminal/mirror/session-channel.js +639 -811
  32. package/packages/daemon/dist/terminal/mirror/stock-pane-snapshot.js +177 -0
  33. package/packages/daemon/dist/terminal/session-runtime/causal-cell-ledger.js +1 -1
  34. package/packages/daemon/dist/terminal/session-runtime/registry.js +145 -15
  35. package/packages/daemon/dist/terminal/session-runtime/stock-capture-fidelity.js +12 -0
  36. package/packages/daemon/dist/terminal/session-runtime/terminal-delivery-hub.js +128 -10
  37. package/packages/daemon/dist/terminal/session-runtime/terminal-replica-interpreter.js +21 -4
  38. package/packages/daemon/dist/terminal/session-runtime/terminal-replica-owner.js +19 -2
  39. package/packages/daemon/dist/terminal/session-runtime/xterm-terminal-interpreter-backend.js +17 -19
  40. package/packages/daemon/dist/tui/mirror/open-tui-workspace-runtime-port.js +64 -4
  41. package/packages/daemon/dist/tui/mirror/pane-surface.jsx +10 -1
  42. package/packages/daemon/dist/tui/mirror/reference-performance-trace.js +117 -71
  43. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-input-ingress.js +27 -3
  44. package/packages/daemon/dist/tui/mirror/runtime/pane-scoped-terminal-surface.jsx +17 -4
  45. package/packages/daemon/dist/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.js +19 -0
  46. package/packages/daemon/dist/tui/mirror/runtime/terminal-input-adapter.js +10 -2
  47. package/packages/daemon/dist/tui/mirror/testing/styled-frame-oracle.js +156 -0
  48. package/packages/daemon/src/lib/daemon-embed.ts +22 -34
  49. package/packages/daemon/src/lib/runtime-trace-writer.ts +132 -0
  50. package/packages/daemon/src/lib/tmux-client-execution.ts +47 -2
  51. package/packages/daemon/src/lib/tmux-server-owner.ts +19 -3
  52. package/packages/daemon/src/terminal/attachments/native-runtime.ts +6 -0
  53. package/packages/daemon/src/terminal/mirror/control-channel.ts +428 -84
  54. package/packages/daemon/src/terminal/mirror/events.ts +7 -7
  55. package/packages/daemon/src/terminal/mirror/mirror-service.ts +49 -3
  56. package/packages/daemon/src/terminal/mirror/native-grid-projection.ts +21 -11
  57. package/packages/daemon/src/terminal/mirror/pane-feed.ts +9 -4
  58. package/packages/daemon/src/terminal/mirror/session-channel.ts +705 -859
  59. package/packages/daemon/src/terminal/mirror/stock-pane-snapshot.ts +228 -0
  60. package/packages/daemon/src/terminal/session-runtime/causal-cell-ledger.ts +1 -1
  61. package/packages/daemon/src/terminal/session-runtime/registry.ts +203 -32
  62. package/packages/daemon/src/terminal/session-runtime/runtime-observability.ts +7 -0
  63. package/packages/daemon/src/terminal/session-runtime/stock-capture-fidelity.ts +13 -0
  64. package/packages/daemon/src/terminal/session-runtime/terminal-delivery-hub.ts +142 -8
  65. package/packages/daemon/src/terminal/session-runtime/terminal-replica-interpreter.ts +26 -3
  66. package/packages/daemon/src/terminal/session-runtime/terminal-replica-owner.ts +25 -1
  67. package/packages/daemon/src/terminal/session-runtime/xterm-terminal-interpreter-backend.ts +26 -20
  68. package/packages/daemon/src/tui/mirror/open-tui-workspace-runtime-port.ts +63 -4
  69. package/packages/daemon/src/tui/mirror/pane-surface.tsx +9 -1
  70. package/packages/daemon/src/tui/mirror/reference-performance-trace.ts +141 -90
  71. package/packages/daemon/src/tui/mirror/runtime/application-terminal-input-ingress.ts +27 -4
  72. package/packages/daemon/src/tui/mirror/runtime/pane-scoped-terminal-surface.tsx +61 -31
  73. package/packages/daemon/src/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.ts +31 -3
  74. package/packages/daemon/src/tui/mirror/runtime/terminal-input-adapter.ts +9 -6
  75. package/packages/daemon/src/tui/mirror/testing/styled-frame-oracle.ts +209 -0
  76. package/packages/daemon-client/src/terminal-fast-lane.ts +53 -4
  77. package/packages/daemon-client/src/workspace-client-types.ts +1 -0
  78. package/packages/daemon-client/src/workspace-client.ts +78 -5
  79. package/packages/tmux-bridge/src/index.ts +1 -0
  80. package/packages/tmux-bridge/src/runner.ts +25 -1
@@ -0,0 +1,133 @@
1
+ const MAX_RECORD_BYTES = 64 * 1024;
2
+ /** Opt-in diagnostics: one stream buffer, no additional queue or producer backpressure. */
3
+ export function createRuntimeTraceWriter(stream, identity, closeTimeoutMs = 1000) {
4
+ const counts = {
5
+ offeredRecords: 0,
6
+ acceptedRecords: 0,
7
+ droppedRecords: 0,
8
+ saturatedDrops: 0,
9
+ failedDrops: 0,
10
+ oversizedRecords: 0,
11
+ constructionFailures: 0,
12
+ rejectedWrites: 0,
13
+ writeFailures: 0,
14
+ };
15
+ let saturated = false;
16
+ let failed = false;
17
+ let closed = false;
18
+ let closing;
19
+ let closeFailure;
20
+ const snapshot = () => ({ ...counts, failed, saturated, writableLength: stream.writableLength });
21
+ stream.on("drain", () => {
22
+ if (!failed)
23
+ saturated = false;
24
+ });
25
+ // Retain the error listener through destroy: a late stream error must not escape cleanup.
26
+ stream.on("error", (error) => {
27
+ counts.writeFailures++;
28
+ failed = true;
29
+ closeFailure?.(error);
30
+ });
31
+ return {
32
+ snapshot,
33
+ append(build) {
34
+ if (closed)
35
+ return;
36
+ counts.offeredRecords++;
37
+ if (failed || stream.destroyed) {
38
+ counts.failedDrops++;
39
+ counts.droppedRecords++;
40
+ return;
41
+ }
42
+ if (saturated) {
43
+ counts.saturatedDrops++;
44
+ counts.droppedRecords++;
45
+ return;
46
+ }
47
+ let line;
48
+ try {
49
+ const json = JSON.stringify(build());
50
+ if (json === undefined)
51
+ throw new Error("Trace record is not JSON");
52
+ line = `${json}\n`;
53
+ if (Buffer.byteLength(line) > MAX_RECORD_BYTES) {
54
+ counts.oversizedRecords++;
55
+ counts.droppedRecords++;
56
+ return;
57
+ }
58
+ }
59
+ catch {
60
+ counts.constructionFailures++;
61
+ counts.droppedRecords++;
62
+ failed = true;
63
+ return;
64
+ }
65
+ try {
66
+ saturated = !stream.write(line);
67
+ counts.acceptedRecords++;
68
+ }
69
+ catch {
70
+ counts.rejectedWrites++;
71
+ counts.droppedRecords++;
72
+ failed = true;
73
+ }
74
+ },
75
+ close(incomplete = false) {
76
+ if (closing)
77
+ return closing;
78
+ closed = true;
79
+ if (incomplete)
80
+ failed = true;
81
+ closing = new Promise((resolve, reject) => {
82
+ let settled = false;
83
+ const finish = (error) => {
84
+ if (settled)
85
+ return;
86
+ settled = true;
87
+ clearTimeout(timer);
88
+ stream.off("drain", end);
89
+ stream.off("close", prematureClose);
90
+ closeFailure = undefined;
91
+ if (error) {
92
+ failed = true;
93
+ stream.destroy();
94
+ reject(error);
95
+ }
96
+ else
97
+ resolve();
98
+ };
99
+ const prematureClose = () => finish(new Error("Runtime trace closed before final summary completion"));
100
+ const end = () => {
101
+ try {
102
+ if (stream.destroyed || !stream.writable)
103
+ throw new Error("Runtime trace stream unavailable");
104
+ const summary = {
105
+ version: 1,
106
+ type: "performance.daemon-trace.summary",
107
+ ...identity,
108
+ ...snapshot(),
109
+ maxRecordBytes: MAX_RECORD_BYTES,
110
+ acceptedRecordsExcludeSummary: true,
111
+ shutdownKind: incomplete ? "startup-rollback" : "normal",
112
+ ringTailOverwrites: "not-file-loss",
113
+ };
114
+ stream.end(`${JSON.stringify(summary)}\n`, () => finish(failed ? new Error("Runtime trace recorded failures") : undefined));
115
+ }
116
+ catch (error) {
117
+ finish(error instanceof Error ? error : new Error("Runtime trace end failed"));
118
+ }
119
+ };
120
+ const timer = setTimeout(() => finish(new Error("Runtime trace close timed out")), closeTimeoutMs);
121
+ closeFailure = finish;
122
+ stream.on("close", prematureClose);
123
+ if (stream.destroyed)
124
+ finish(new Error("Runtime trace stream destroyed"));
125
+ else if (saturated && stream.writableNeedDrain)
126
+ stream.once("drain", end);
127
+ else
128
+ end();
129
+ });
130
+ return closing;
131
+ },
132
+ };
133
+ }
@@ -1,7 +1,8 @@
1
+ import { fileURLToPath } from "node:url";
1
2
  import { accessSync, constants, realpathSync, statSync } from "node:fs";
2
- import { delimiter, isAbsolute, join } from "node:path";
3
+ import { delimiter, isAbsolute, join, resolve } from "node:path";
3
4
  import { resolveRuntimeNamespace } from "./runtime-namespace.js";
4
- import { resolveBundledTmux, bundledTmuxResourceEnvironment } from "./bundled-tmux.js";
5
+ import { resolveBundledTmux, bundledTmuxResourceEnvironment, withBundledTmuxResources, } from "./bundled-tmux.js";
5
6
  export function resolveTmuxExecutable() {
6
7
  if (resolveRuntimeNamespace().development)
7
8
  return resolveBundledTmux();
@@ -57,3 +58,37 @@ export function tmuxClientEnvironment(source, executable) {
57
58
  }
58
59
  return { ...environment, ...bundledTmuxResourceEnvironment(executable) };
59
60
  }
61
+ /** Ordinary CLI commands retain PATH selection; bundled tmux fills a missing system client. */
62
+ export function resolveOrdinaryTmuxClient(environment, cwd) {
63
+ const configured = environment.TMUX_IDE_TMUX_BIN;
64
+ const candidates = configured
65
+ ? [configured]
66
+ : (environment.PATH ?? "/usr/bin:/bin")
67
+ .split(delimiter)
68
+ .map((entry) => resolve(cwd instanceof URL ? fileURLToPath(cwd) : (cwd ?? process.cwd()), entry, "tmux"));
69
+ let executable;
70
+ for (const candidate of candidates) {
71
+ try {
72
+ if (!isAbsolute(candidate))
73
+ continue;
74
+ accessSync(candidate, constants.X_OK);
75
+ const canonical = realpathSync(candidate);
76
+ if (statSync(canonical).isFile()) {
77
+ executable = canonical;
78
+ break;
79
+ }
80
+ }
81
+ catch {
82
+ /* Try the next ordinary PATH candidate. */
83
+ }
84
+ }
85
+ if (!executable && !configured)
86
+ executable =
87
+ resolveBundledTmux([
88
+ ...(environment.TMUX_IDE_CLI ? [environment.TMUX_IDE_CLI] : []),
89
+ fileURLToPath(import.meta.url),
90
+ ]) ?? undefined;
91
+ if (!executable)
92
+ throw new Error("tmux_executable_unavailable");
93
+ return { executable, environment: withBundledTmuxResources(executable, environment) };
94
+ }
@@ -10,7 +10,8 @@ import { PaneSourceCredentialAuthority, STARTUP_PANE_CREDENTIAL_TIMEOUT_MS, } fr
10
10
  import { createNativeTmuxSessionCreator } from "./tmux-server-session-create.js";
11
11
  import { createTmuxSessionMutationFence } from "./tmux-session-mutation-fence.js";
12
12
  import { createNativeTmuxSessionOpener } from "./tmux-server-session-open.js";
13
- import { randomUUID } from "node:crypto";
13
+ import { createHash, randomUUID } from "node:crypto";
14
+ import { WorkspaceIdSchemaZ } from "@tmux-ide/contracts";
14
15
  import { mkdirSync } from "node:fs";
15
16
  import { z } from "zod";
16
17
  import { isVisibleFleetSession } from "../command-center/discovery.js";
@@ -29,6 +30,22 @@ import { WorkspaceMultiplexerAuthority } from "./workspace-multiplexer-verbs.js"
29
30
  import { WorkspacePaneCreationAuthority, createPinnedWorkspaceTmuxRunner, } from "./workspace-pane-creation.js";
30
31
  import { WorkspaceRegistry } from "./workspace-registry.js";
31
32
  import { createServerGenerationFencedTmuxRunner, createServerGenerationFencedTmuxAsyncRunner, } from "./tmux-server-generation-runner.js";
33
+ /** Native display names are not necessarily valid shared-contract record identities. */
34
+ function discoveredWorkspaceName(registry, sessionName) {
35
+ if (WorkspaceIdSchemaZ.safeParse(sessionName).success && !registry.has(sessionName))
36
+ return sessionName;
37
+ // Existing intent wins even if it occupies a derived ID. Each candidate is
38
+ // deterministic; repeated refreshes retain the already-adopted session alias.
39
+ for (let suffix = 0; suffix <= registry.list().length; suffix += 1) {
40
+ const digest = createHash("sha256")
41
+ .update(`tmux-ide.discovered-workspace.v1\0${sessionName}\0${suffix}`)
42
+ .digest("hex");
43
+ const name = `session-${digest}`;
44
+ if (!registry.has(name))
45
+ return name;
46
+ }
47
+ throw new Error("Unable to allocate discovered workspace identity");
48
+ }
32
49
  /** Refresh discovered live membership without changing durable workspace intent or aliases. */
33
50
  export function createNativeTmuxServerCatalog(workspaceRegistry, run, assertOpen = () => undefined) {
34
51
  return async () => {
@@ -70,10 +87,9 @@ export function createNativeTmuxServerCatalog(workspaceRegistry, run, assertOpen
70
87
  if (workspaceRegistry.isVolatile(workspace.name) && !names.has(workspace.sessionName))
71
88
  workspaceRegistry.remove(workspace.name);
72
89
  for (const { summary, dir } of rows.values())
73
- if (!workspaceRegistry.has(summary.sessionName) &&
74
- !workspaceRegistry.list().some((workspace) => workspace.sessionName === summary.sessionName))
90
+ if (!workspaceRegistry.list().some((workspace) => workspace.sessionName === summary.sessionName))
75
91
  workspaceRegistry.add({
76
- name: summary.sessionName,
92
+ name: discoveredWorkspaceName(workspaceRegistry, summary.sessionName),
77
93
  sessionName: summary.sessionName,
78
94
  projectDir: dir,
79
95
  persistence: "volatile",
@@ -21,9 +21,9 @@
21
21
  <key>CFBundlePackageType</key>
22
22
  <string>APPL</string>
23
23
  <key>CFBundleShortVersionString</key>
24
- <string>2.9.4</string>
24
+ <string>2.9.5</string>
25
25
  <key>CFBundleVersion</key>
26
- <string>2.9.4</string>
26
+ <string>2.9.5</string>
27
27
  <key>LSMinimumSystemVersion</key>
28
28
  <string>11.0</string>
29
29
  <key>LSUIElement</key>
@@ -10,7 +10,7 @@
10
10
  </data>
11
11
  <key>Resources/Assets.car</key>
12
12
  <data>
13
- TPHWDo+ga7DgPtltNVjNyW6+Kpc=
13
+ LkIDt8zENP1qaa4Np7MKFvpCNtw=
14
14
  </data>
15
15
  </dict>
16
16
  <key>files2</key>
@@ -26,7 +26,7 @@
26
26
  <dict>
27
27
  <key>hash2</key>
28
28
  <data>
29
- I1uLFZ9MLgryptxKSUR8tbfEKr5vQzHGgIpna3gvlxc=
29
+ x/5GhMc3oN6TS2XQV90W/AIHsGC3fBG0KZ/AD8bX6yQ=
30
30
  </data>
31
31
  </dict>
32
32
  </dict>
@@ -14,6 +14,10 @@
14
14
  {
15
15
  "patch": "interaction-journal-v1.patch",
16
16
  "patchSha256": "fab780c9ca4a8452fbf73d5ed04e0d9420c887c6006c84b9d0c83a89af80aa0d"
17
+ },
18
+ {
19
+ "patch": "control-output-barriers.patch",
20
+ "patchSha256": "00ce678017ce94fd8ca1374b956d8db5cc4f6cdbe1309eddceed8fddb1adf6a8"
17
21
  }
18
22
  ],
19
23
  "experimentalExtensions": [
@@ -32,7 +36,7 @@
32
36
  "platform": "darwin",
33
37
  "arch": "arm64",
34
38
  "files": {
35
- "tmux": "a2e77c671aaa7e2855c3a105fdcfe6b4e048770379857d3de21a3253f0f36365",
39
+ "tmux": "40e3ffe22314bad57e3cbacfb1f7490d6fee33e09e2f4a58f3b3b437e41a3819",
36
40
  "lib/libutf8proc.3.2.3.dylib": "9d044f05ab5e8b19ae954485cfd8b7dd06e0cb66f0e02fe80be99533b21168ae",
37
41
  "lib/libncursesw.6.dylib": "c9b3c77b5874b0c694590774f7b7b1568b2bb13e82707bdf29cb7296446fe596",
38
42
  "lib/libevent_core-2.1.7.dylib": "5d8dc45957013ce78a17dbacd6f5ed80cec148983d8c7eeeb4408d2f7f74743e",
@@ -14,6 +14,10 @@
14
14
  {
15
15
  "patch": "interaction-journal-v1.patch",
16
16
  "patchSha256": "fab780c9ca4a8452fbf73d5ed04e0d9420c887c6006c84b9d0c83a89af80aa0d"
17
+ },
18
+ {
19
+ "patch": "control-output-barriers.patch",
20
+ "patchSha256": "00ce678017ce94fd8ca1374b956d8db5cc4f6cdbe1309eddceed8fddb1adf6a8"
17
21
  }
18
22
  ],
19
23
  "experimentalExtensions": [
@@ -32,7 +36,7 @@
32
36
  "platform": "darwin",
33
37
  "arch": "x64",
34
38
  "files": {
35
- "tmux": "4998ab3bde94e588a0c4ef300e0de657cfb39d7b0689f10627517a989b7fcaf7",
39
+ "tmux": "235f6c59c685dc6ab06e53b5391880f0ff8d13aeab6e48ad0d450ebff0e33f64",
36
40
  "lib/libutf8proc.3.2.3.dylib": "f4871a7c01da24da6bb2b6e3a1d51ce2c3710de735b6a328b01db1b26aa337ca",
37
41
  "lib/libncursesw.6.dylib": "ab31fabd46c7303ef4c410c6146c605c3cf8c487d428037c3a472a445aeb9de2",
38
42
  "lib/libevent_core-2.1.7.dylib": "9439dc69a27f9fe364804d5ae2347fca7a80ebcb83cdb00489132dc567fe2c1a",
@@ -14,6 +14,10 @@
14
14
  {
15
15
  "patch": "interaction-journal-v1.patch",
16
16
  "patchSha256": "fab780c9ca4a8452fbf73d5ed04e0d9420c887c6006c84b9d0c83a89af80aa0d"
17
+ },
18
+ {
19
+ "patch": "control-output-barriers.patch",
20
+ "patchSha256": "00ce678017ce94fd8ca1374b956d8db5cc4f6cdbe1309eddceed8fddb1adf6a8"
17
21
  }
18
22
  ],
19
23
  "experimentalExtensions": [
@@ -60,7 +64,7 @@
60
64
  "platform": "linux",
61
65
  "arch": "arm64",
62
66
  "files": {
63
- "tmux": "8b2aa7bb6754add5c669068d48835036d639ff73b9a01b0dc5c080cd32b7b6eb",
67
+ "tmux": "760291d888aef01da2100ebf68d1c07089f5f91c05dc7a5200a862af94f2c29a",
64
68
  "lib/libutf8proc.so.3": "83cd7bce65037a46494b154b0f7bfd2479bc1659f56321b9ec896f4b64fb490c",
65
69
  "lib/libtinfo.so.6": "22952a4f434fd0f356fad23b92de42084e6666d8a594eadd11511b059cc5bb66",
66
70
  "lib/libevent_core-2.1.so.7": "80ad9f14cdea14f65c7a778fef4d831d51d23edc55efd263d7f265587eab73d4",
@@ -14,6 +14,10 @@
14
14
  {
15
15
  "patch": "interaction-journal-v1.patch",
16
16
  "patchSha256": "fab780c9ca4a8452fbf73d5ed04e0d9420c887c6006c84b9d0c83a89af80aa0d"
17
+ },
18
+ {
19
+ "patch": "control-output-barriers.patch",
20
+ "patchSha256": "00ce678017ce94fd8ca1374b956d8db5cc4f6cdbe1309eddceed8fddb1adf6a8"
17
21
  }
18
22
  ],
19
23
  "experimentalExtensions": [
@@ -60,7 +64,7 @@
60
64
  "platform": "linux",
61
65
  "arch": "x64",
62
66
  "files": {
63
- "tmux": "8933071dbaeea131b04961ab74ff8b21a622891bce6a01f43ef5122e2fad14d2",
67
+ "tmux": "f82952f0deea5f882b57a1e0409bb01f2ef193374518005257b6675e6566ddb1",
64
68
  "lib/libutf8proc.so.3": "a5aa10c99ac2e9a30c4e01fa4baa85a03dadf71eb73119c76fb3f9f54798962d",
65
69
  "lib/libtinfo.so.6": "170db4dd0c324ee73d8d5440a38708726066e1288aba942d57191c6f002240d9",
66
70
  "lib/libevent_core-2.1.so.7": "adf343350b739d3dba2b8a6cccbe0729cd9e9ee32b38ba69c08bd14f24a8431e",
@@ -378,7 +378,7 @@ function projectTrustedMirrorInventory(trusted, workspaceName, expectedSessionNa
378
378
  return Object.freeze(panes);
379
379
  }
380
380
  function analyzeInventoryPanes(panes) {
381
- return analyzeTrustedSemanticPaneCatalog(panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row));
381
+ return analyzeTrustedSemanticPaneCatalog(panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, nameSource: _nameSource, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row));
382
382
  }
383
383
  function hasWindowStampCollision(rows) {
384
384
  const windows = new Map();
@@ -641,13 +641,13 @@ export async function discoverWorkspaceRegistryTerminalInventory(registry, runne
641
641
  }
642
642
  }
643
643
  }
644
- const catalog = analyzeTrustedSemanticPaneCatalog(panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row));
644
+ const catalog = analyzeTrustedSemanticPaneCatalog(panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, nameSource: _nameSource, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row));
645
645
  return Object.freeze({ panes: Object.freeze(panes), catalog });
646
646
  }
647
647
  /** Internal raw-id discovery; callers expose only SemanticPaneCatalog resolution. */
648
648
  export async function discoverWorkspaceRegistrySemanticPanes(registry, runner, signal) {
649
649
  const inventory = await discoverWorkspaceRegistryTerminalInventory(registry, runner, signal);
650
- return inventory.panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row);
650
+ return inventory.panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, nameSource: _nameSource, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row);
651
651
  }
652
652
  function quoteArgument(value) {
653
653
  if (/\0|\r|\n/u.test(value)) {
@@ -847,7 +847,7 @@ export class WorkspaceTerminalInventoryRuntime {
847
847
  new SemanticPaneCatalog({
848
848
  discover: async () => {
849
849
  const inventory = await this.#discoverTerminalInventory();
850
- return inventory.panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row);
850
+ return inventory.panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, nameSource: _nameSource, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row);
851
851
  },
852
852
  });
853
853
  const orphanExecutor = new TmuxAttachmentViewExecutor({ runner: this.runner });
@@ -1399,7 +1399,7 @@ export class NativeTerminalAttachmentRuntime {
1399
1399
  new SemanticPaneCatalog({
1400
1400
  discover: async () => {
1401
1401
  const inventory = await discoverTerminalInventory();
1402
- return inventory.panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row);
1402
+ return inventory.panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, nameSource: _nameSource, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row);
1403
1403
  },
1404
1404
  });
1405
1405
  const launcher = new PtyTmuxAttachmentLauncher({
@@ -1643,7 +1643,7 @@ export class NativeTerminalAttachmentRuntime {
1643
1643
  if (panes.length === 0)
1644
1644
  return null;
1645
1645
  const active = panes.find((pane) => pane.active) ?? panes[0];
1646
- const sessionCatalog = analyzeTrustedSemanticPaneCatalog(panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row));
1646
+ const sessionCatalog = analyzeTrustedSemanticPaneCatalog(panes.map(({ sessionName: _sessionName, index: _index, title: _title, currentCommand: _currentCommand, active: _active, role: _role, name: _name, nameSource: _nameSource, type: _type, missionStamp: _missionStamp, dir: _dir, interactionEndpoint: _interactionEndpoint, nativeIdentity: _nativeIdentity, nativePaneBirthId: _nativePaneBirthId, ...row }) => row));
1647
1647
  const windowStamps = new Map();
1648
1648
  let windowIdentityReady = true;
1649
1649
  for (const pane of sessionCatalog.rows) {