tmux-ide 2.9.3 → 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.
- package/LICENSE +1 -1
- package/README.md +120 -139
- package/bin/cli.js +4847 -3585
- package/package.json +16 -9
- package/packages/contracts/src/session-runtime.ts +2 -0
- package/packages/contracts/src/terminal-delivery.ts +4 -0
- package/packages/core/src/terminal-compact-capability.ts +31 -1
- package/packages/core/src/terminal-delivery.ts +234 -32
- package/packages/core/src/terminal-replica-hash-cache.ts +162 -21
- package/packages/core/src/terminal-replica-owned-row.ts +165 -10
- package/packages/core/src/terminal-replica.ts +43 -21
- package/packages/daemon/dist/lib/daemon-embed.js +19 -34
- package/packages/daemon/dist/lib/runtime-trace-writer.js +133 -0
- package/packages/daemon/dist/lib/tmux-client-execution.js +37 -2
- package/packages/daemon/dist/lib/tmux-server-owner.js +20 -4
- package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/Info.plist +2 -2
- package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/MacOS/tmux-ide-notifier +0 -0
- package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/Resources/Assets.car +0 -0
- package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/_CodeSignature/CodeResources +2 -2
- package/packages/daemon/dist/native/tmux/darwin-arm64/manifest.json +5 -1
- package/packages/daemon/dist/native/tmux/darwin-arm64/tmux +0 -0
- package/packages/daemon/dist/native/tmux/darwin-x64/manifest.json +5 -1
- package/packages/daemon/dist/native/tmux/darwin-x64/tmux +0 -0
- package/packages/daemon/dist/native/tmux/linux-arm64/manifest.json +5 -1
- package/packages/daemon/dist/native/tmux/linux-arm64/tmux +0 -0
- package/packages/daemon/dist/native/tmux/linux-x64/licenses/libevent_core-2.1.so.7.txt +0 -0
- package/packages/daemon/dist/native/tmux/linux-x64/manifest.json +5 -1
- package/packages/daemon/dist/native/tmux/linux-x64/tmux +0 -0
- package/packages/daemon/dist/terminal/attachments/native-runtime.js +6 -6
- package/packages/daemon/dist/terminal/mirror/control-channel.js +379 -75
- package/packages/daemon/dist/terminal/mirror/mirror-service.js +43 -3
- package/packages/daemon/dist/terminal/mirror/native-grid-projection.js +20 -11
- package/packages/daemon/dist/terminal/mirror/session-channel.js +639 -811
- package/packages/daemon/dist/terminal/mirror/stock-pane-snapshot.js +177 -0
- package/packages/daemon/dist/terminal/session-runtime/causal-cell-ledger.js +1 -1
- package/packages/daemon/dist/terminal/session-runtime/registry.js +145 -15
- package/packages/daemon/dist/terminal/session-runtime/stock-capture-fidelity.js +12 -0
- package/packages/daemon/dist/terminal/session-runtime/terminal-delivery-hub.js +128 -10
- package/packages/daemon/dist/terminal/session-runtime/terminal-replica-interpreter.js +21 -4
- package/packages/daemon/dist/terminal/session-runtime/terminal-replica-owner.js +19 -2
- package/packages/daemon/dist/terminal/session-runtime/xterm-terminal-interpreter-backend.js +17 -19
- package/packages/daemon/dist/tui/integrations/claude-agent-teams.js +264 -0
- package/packages/daemon/dist/tui/mirror/open-tui-workspace-runtime-port.js +64 -4
- package/packages/daemon/dist/tui/mirror/pane-surface.jsx +10 -1
- package/packages/daemon/dist/tui/mirror/reference-performance-trace.js +117 -71
- package/packages/daemon/dist/tui/mirror/runtime/application-terminal-input-ingress.js +27 -3
- package/packages/daemon/dist/tui/mirror/runtime/pane-scoped-terminal-surface.jsx +17 -4
- package/packages/daemon/dist/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.js +19 -0
- package/packages/daemon/dist/tui/mirror/runtime/terminal-input-adapter.js +10 -2
- package/packages/daemon/dist/tui/mirror/testing/styled-frame-oracle.js +156 -0
- package/packages/daemon/src/lib/daemon-embed.ts +22 -34
- package/packages/daemon/src/lib/runtime-trace-writer.ts +132 -0
- package/packages/daemon/src/lib/tmux-client-execution.ts +47 -2
- package/packages/daemon/src/lib/tmux-server-owner.ts +19 -3
- package/packages/daemon/src/terminal/attachments/native-runtime.ts +6 -0
- package/packages/daemon/src/terminal/mirror/control-channel.ts +428 -84
- package/packages/daemon/src/terminal/mirror/events.ts +7 -7
- package/packages/daemon/src/terminal/mirror/mirror-service.ts +49 -3
- package/packages/daemon/src/terminal/mirror/native-grid-projection.ts +21 -11
- package/packages/daemon/src/terminal/mirror/pane-feed.ts +9 -4
- package/packages/daemon/src/terminal/mirror/session-channel.ts +705 -859
- package/packages/daemon/src/terminal/mirror/stock-pane-snapshot.ts +228 -0
- package/packages/daemon/src/terminal/session-runtime/causal-cell-ledger.ts +1 -1
- package/packages/daemon/src/terminal/session-runtime/registry.ts +203 -32
- package/packages/daemon/src/terminal/session-runtime/runtime-observability.ts +7 -0
- package/packages/daemon/src/terminal/session-runtime/stock-capture-fidelity.ts +13 -0
- package/packages/daemon/src/terminal/session-runtime/terminal-delivery-hub.ts +142 -8
- package/packages/daemon/src/terminal/session-runtime/terminal-replica-interpreter.ts +26 -3
- package/packages/daemon/src/terminal/session-runtime/terminal-replica-owner.ts +25 -1
- package/packages/daemon/src/terminal/session-runtime/xterm-terminal-interpreter-backend.ts +26 -20
- package/packages/daemon/src/tui/integrations/claude-agent-teams.ts +334 -0
- package/packages/daemon/src/tui/mirror/open-tui-workspace-runtime-port.ts +63 -4
- package/packages/daemon/src/tui/mirror/pane-surface.tsx +9 -1
- package/packages/daemon/src/tui/mirror/reference-performance-trace.ts +141 -90
- package/packages/daemon/src/tui/mirror/runtime/application-terminal-input-ingress.ts +27 -4
- package/packages/daemon/src/tui/mirror/runtime/pane-scoped-terminal-surface.tsx +61 -31
- package/packages/daemon/src/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.ts +31 -3
- package/packages/daemon/src/tui/mirror/runtime/terminal-input-adapter.ts +9 -6
- package/packages/daemon/src/tui/mirror/testing/styled-frame-oracle.ts +209 -0
- package/packages/daemon-client/src/terminal-fast-lane.ts +53 -4
- package/packages/daemon-client/src/workspace-client-types.ts +1 -0
- package/packages/daemon-client/src/workspace-client.ts +78 -5
- package/packages/tmux-bridge/src/index.ts +1 -0
- package/packages/tmux-bridge/src/runner.ts +25 -1
- package/skill/SKILL.md +30 -30
|
@@ -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.
|
|
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.
|
|
24
|
+
<string>2.9.5</string>
|
|
25
25
|
<key>CFBundleVersion</key>
|
|
26
|
-
<string>2.9.
|
|
26
|
+
<string>2.9.5</string>
|
|
27
27
|
<key>LSMinimumSystemVersion</key>
|
|
28
28
|
<string>11.0</string>
|
|
29
29
|
<key>LSUIElement</key>
|
|
Binary file
|
|
Binary file
|
package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/_CodeSignature/CodeResources
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
</data>
|
|
11
11
|
<key>Resources/Assets.car</key>
|
|
12
12
|
<data>
|
|
13
|
-
|
|
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
|
-
|
|
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": "
|
|
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",
|
|
Binary file
|
|
@@ -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": "
|
|
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",
|
|
Binary file
|
|
@@ -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": "
|
|
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",
|
|
Binary file
|
|
File without changes
|
|
@@ -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": "
|
|
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",
|
|
Binary file
|
|
@@ -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) {
|