sneakoscope 2.0.7 → 2.0.9
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/README.md +1 -1
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/crates/sks-core/src/main.rs +1 -1
- package/dist/.sks-build-stamp.json +4 -4
- package/dist/bin/sks.js +1 -1
- package/dist/build-manifest.json +44 -8
- package/dist/commands/zellij.js +144 -1
- package/dist/core/agents/agent-command-surface.js +4 -2
- package/dist/core/agents/agent-orchestrator.js +5 -2
- package/dist/core/agents/agent-patch-schema.js +4 -2
- package/dist/core/agents/native-cli-session-swarm.js +81 -9
- package/dist/core/commands/mad-sks-command.js +17 -1
- package/dist/core/commands/naruto-command.js +99 -7
- package/dist/core/fsx.js +1 -1
- package/dist/core/git/git-repo-detection.js +7 -0
- package/dist/core/git/git-worktree-cleanup.js +14 -3
- package/dist/core/git/git-worktree-diff.js +7 -2
- package/dist/core/git/git-worktree-manager.js +9 -2
- package/dist/core/git/git-worktree-patch-envelope.js +5 -5
- package/dist/core/naruto/naruto-active-pool.js +108 -0
- package/dist/core/naruto/naruto-concurrency-governor.js +16 -1
- package/dist/core/naruto/naruto-work-graph.js +2 -1
- package/dist/core/release/release-gate-cache-v2.js +117 -0
- package/dist/core/release/release-gate-dag.js +190 -0
- package/dist/core/release/release-gate-hermetic-env.js +32 -0
- package/dist/core/release/release-gate-node.js +62 -0
- package/dist/core/release/release-gate-report.js +11 -0
- package/dist/core/release/release-gate-resource-governor.js +54 -0
- package/dist/core/release/release-gate-scheduler.js +15 -0
- package/dist/core/version.js +1 -1
- package/dist/core/zellij/zellij-dashboard-pane.js +71 -0
- package/dist/core/zellij/zellij-dashboard-renderer.js +58 -0
- package/dist/core/zellij/zellij-launcher.js +3 -3
- package/dist/core/zellij/zellij-layout-builder.js +1 -1
- package/dist/core/zellij/zellij-right-column-layout-proof.js +42 -0
- package/dist/core/zellij/zellij-right-column-manager.js +245 -0
- package/dist/core/zellij/zellij-worker-pane-manager.js +180 -15
- package/dist/scripts/codex-sdk-release-review-pipeline-check.js +5 -5
- package/dist/scripts/doctor-fix-proves-codex-read-check.js +26 -5
- package/dist/scripts/git-worktree-diff-envelope-check.js +17 -0
- package/dist/scripts/git-worktree-dirty-lock-check.js +17 -0
- package/dist/scripts/git-worktree-dirty-main-detection-check.js +14 -0
- package/dist/scripts/git-worktree-integration-primary-check.js +22 -0
- package/dist/scripts/git-worktree-manifest-append-check.js +18 -0
- package/dist/scripts/git-worktree-untracked-diff-check.js +18 -0
- package/dist/scripts/lib/codex-sdk-gate-lib.js +4 -0
- package/dist/scripts/mad-sks-zellij-default-pane-worker-check.js +2 -2
- package/dist/scripts/naruto-concurrency-governor-check.js +2 -1
- package/dist/scripts/naruto-extreme-parallelism-check.js +22 -0
- package/dist/scripts/naruto-real-active-pool-check.js +38 -0
- package/dist/scripts/naruto-work-graph-check.js +1 -1
- package/dist/scripts/naruto-worktree-coding-blackbox.js +29 -0
- package/dist/scripts/naruto-zellij-dynamic-right-column-check.js +21 -0
- package/dist/scripts/product-design-auto-install-check.js +3 -3
- package/dist/scripts/product-design-plugin-routing-check.js +3 -3
- package/dist/scripts/release-cache-glob-hashing-check.js +42 -0
- package/dist/scripts/release-dag-full-coverage-check.js +35 -0
- package/dist/scripts/release-gate-dag-runner-check.js +17 -0
- package/dist/scripts/release-gate-dag-runner.js +32 -0
- package/dist/scripts/release-gate-worker.js +10 -0
- package/dist/scripts/release-metadata-1-19-check.js +8 -2
- package/dist/scripts/release-parallel-speed-budget-check.js +79 -0
- package/dist/scripts/release-readiness-report.js +1 -1
- package/dist/scripts/release-stability-report-check.js +99 -0
- package/dist/scripts/zellij-dashboard-pane-check.js +70 -0
- package/dist/scripts/zellij-dashboard-watch.js +41 -0
- package/dist/scripts/zellij-developer-controls-check.js +20 -0
- package/dist/scripts/zellij-dynamic-pane-lifecycle-check.js +21 -0
- package/dist/scripts/zellij-initial-main-only-blackbox.js +28 -0
- package/dist/scripts/zellij-right-column-geometry-proof.js +29 -0
- package/dist/scripts/zellij-right-column-manager-check.js +22 -0
- package/dist/scripts/zellij-worker-pane-manager-check.js +2 -1
- package/dist/scripts/zellij-worker-pane-manager-single-owner-check.js +7 -6
- package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +185 -0
- package/package.json +32 -5
- package/schemas/release/release-gate-node.schema.json +52 -0
- package/schemas/zellij/zellij-right-column-state.schema.json +41 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { assertGate, emitGate } from './sks-1-18-gate-lib.js';
|
|
4
|
+
const panes = [
|
|
5
|
+
{ pane_id: 'main', role: 'main', geometry: { x: 0, y: 0, width: 120, height: 60 }, name: 'orchestrator' },
|
|
6
|
+
{ pane_id: 'dash', role: 'dashboard', geometry: { x: 121, y: 0, width: 80, height: 10 }, name: 'SKS Dashboard' },
|
|
7
|
+
{ pane_id: 'w1', role: 'worker', geometry: { x: 121, y: 11, width: 80, height: 15 }, name: 'slot-001/gen-1' },
|
|
8
|
+
{ pane_id: 'w2', role: 'worker', geometry: { x: 121, y: 27, width: 80, height: 15 }, name: 'slot-002/gen-1' }
|
|
9
|
+
];
|
|
10
|
+
const main = panes[0];
|
|
11
|
+
const workers = panes.filter((pane) => pane.role === 'worker');
|
|
12
|
+
const sameRightX = workers.every((pane) => Math.abs(pane.geometry.x - workers[0].geometry.x) <= 2);
|
|
13
|
+
const rightOfMain = workers.every((pane) => pane.geometry.x >= main.geometry.x + main.geometry.width - 2);
|
|
14
|
+
const increasingY = workers.every((pane, index) => index === 0 || pane.geometry.y > workers[index - 1].geometry.y);
|
|
15
|
+
const capOk = workers.length <= 8;
|
|
16
|
+
const requireReal = process.argv.includes('--require-real') || process.env.SKS_REQUIRE_ZELLIJ === '1';
|
|
17
|
+
const report = {
|
|
18
|
+
schema: 'sks.zellij-right-column-geometry-proof.v1',
|
|
19
|
+
ok: sameRightX && rightOfMain && increasingY && capOk,
|
|
20
|
+
synthetic: !requireReal,
|
|
21
|
+
same_right_x: sameRightX,
|
|
22
|
+
right_of_main: rightOfMain,
|
|
23
|
+
increasing_y: increasingY,
|
|
24
|
+
visible_cap_ok: capOk,
|
|
25
|
+
panes
|
|
26
|
+
};
|
|
27
|
+
assertGate(report.ok, 'right-column geometry proof failed', report);
|
|
28
|
+
emitGate('zellij:right-column-geometry-proof', report);
|
|
29
|
+
//# sourceMappingURL=zellij-right-column-geometry-proof.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { assertGate, emitGate, root } from './sks-1-18-gate-lib.js';
|
|
6
|
+
const source = fs.readFileSync(path.join(root, 'src/core/zellij/zellij-right-column-manager.ts'), 'utf8');
|
|
7
|
+
const worker = fs.readFileSync(path.join(root, 'src/core/zellij/zellij-worker-pane-manager.ts'), 'utf8');
|
|
8
|
+
const schemaExists = fs.existsSync(path.join(root, 'schemas/zellij/zellij-right-column-state.schema.json'));
|
|
9
|
+
const report = {
|
|
10
|
+
schema: 'sks.zellij-right-column-manager-check.v1',
|
|
11
|
+
ok: true,
|
|
12
|
+
exports: ['ensureRightColumn', 'prepareWorkerInRightColumn', 'recordWorkerPaneInRightColumn', 'recordHeadlessWorkerInRightColumn', 'closeWorkerInRightColumn'].every((name) => source.includes(`function ${name}`)),
|
|
13
|
+
dashboard_after_worker_reservation: source.includes('right_column_creating') && source.includes('scheduler_slot_reserved'),
|
|
14
|
+
dashboard_direction_right: source.includes('openZellijDashboardPane'),
|
|
15
|
+
worker_direction_down: worker.includes("'--direction', directionRequested") && worker.includes("directionRequested: 'right' | 'down'") && worker.includes("'--near-current-pane'"),
|
|
16
|
+
headless_overflow: source.includes('worker_headless_overflow') && source.includes('visible_pane_cap'),
|
|
17
|
+
schema_exists: schemaExists
|
|
18
|
+
};
|
|
19
|
+
report.ok = report.exports && report.dashboard_after_worker_reservation && report.dashboard_direction_right && report.worker_direction_down && report.headless_overflow && report.schema_exists;
|
|
20
|
+
assertGate(report.ok, 'right-column manager must own dashboard, down-stacked workers, headless overflow, and state schema', report);
|
|
21
|
+
emitGate('zellij:right-column-manager', report);
|
|
22
|
+
//# sourceMappingURL=zellij-right-column-manager-check.js.map
|
|
@@ -58,7 +58,8 @@ const spawnOrder = evaluateZellijWorkerPaneSpawnOrder([
|
|
|
58
58
|
const syntheticRejected = !isRealZellijWorkerPaneIdSource('synthetic_layout_pending_proof')
|
|
59
59
|
&& !isRealZellijWorkerPaneIdSource('zellij_worker_pane_stdout_missing');
|
|
60
60
|
const sourceOk = source.includes("action', 'new-pane'")
|
|
61
|
-
&& source.includes("'--direction',
|
|
61
|
+
&& source.includes("'--direction', directionRequested")
|
|
62
|
+
&& source.includes("'--near-current-pane'")
|
|
62
63
|
&& source.includes("'--name', paneName")
|
|
63
64
|
&& source.includes("'--', 'sh', '-lc'")
|
|
64
65
|
&& source.includes('zellij_worker_new_pane_stdout')
|
|
@@ -7,12 +7,13 @@ const managerPath = path.join(root, 'src', 'core', 'zellij', 'zellij-worker-pane
|
|
|
7
7
|
const nativePath = path.join(root, 'src', 'core', 'agents', 'native-cli-session-swarm.ts');
|
|
8
8
|
const manager = await fs.readFile(managerPath, 'utf8');
|
|
9
9
|
const native = await fs.readFile(nativePath, 'utf8');
|
|
10
|
-
const managerOwnsNewPane = /runZellij\(\[[\s\S]{0,
|
|
10
|
+
const managerOwnsNewPane = /runZellij\(\[[\s\S]{0,800}'new-pane'/.test(manager)
|
|
11
|
+
|| (manager.includes("'new-pane'") && manager.includes('const newPaneArgs') && manager.includes('runZellij(newPaneArgs'));
|
|
11
12
|
const nativeDirectNewPane = /runZellij\(\[[\s\S]{0,500}'new-pane'/.test(native);
|
|
12
13
|
const nativeUsesManager = native.includes('openWorkerPane({') && native.includes('closeWorkerPane({');
|
|
13
|
-
const
|
|
14
|
-
const fallbackRecorded = manager.includes("direction_applied: input.directionApplied") && manager.includes("directionApplied = 'unknown'");
|
|
15
|
-
const ok = managerOwnsNewPane && !nativeDirectNewPane && nativeUsesManager &&
|
|
14
|
+
const dynamicDirection = manager.includes("'--direction', directionRequested") && manager.includes("'--near-current-pane'");
|
|
15
|
+
const fallbackRecorded = manager.includes("direction_applied: input.directionApplied") && (manager.includes("directionApplied = 'unknown'") || manager.includes("directionApplied = rightColumn ? 'down' : 'unknown'"));
|
|
16
|
+
const ok = managerOwnsNewPane && !nativeDirectNewPane && nativeUsesManager && dynamicDirection && fallbackRecorded;
|
|
16
17
|
emit({
|
|
17
18
|
schema: 'sks.zellij-worker-pane-manager-single-owner-check.v1',
|
|
18
19
|
ok,
|
|
@@ -20,14 +21,14 @@ emit({
|
|
|
20
21
|
manager_owns_new_pane: managerOwnsNewPane,
|
|
21
22
|
native_direct_new_pane_absent: !nativeDirectNewPane,
|
|
22
23
|
native_uses_manager: nativeUsesManager,
|
|
23
|
-
|
|
24
|
+
dynamic_direction_requested: dynamicDirection,
|
|
24
25
|
fallback_recorded: fallbackRecorded
|
|
25
26
|
},
|
|
26
27
|
blockers: ok ? [] : [
|
|
27
28
|
...(!managerOwnsNewPane ? ['worker_pane_manager_new_pane_missing'] : []),
|
|
28
29
|
...(nativeDirectNewPane ? ['native_cli_session_swarm_direct_new_pane'] : []),
|
|
29
30
|
...(!nativeUsesManager ? ['native_cli_session_swarm_not_using_worker_pane_manager'] : []),
|
|
30
|
-
...(!
|
|
31
|
+
...(!dynamicDirection ? ['zellij_worker_dynamic_direction_missing'] : []),
|
|
31
32
|
...(!fallbackRecorded ? ['zellij_worker_direction_fallback_not_recorded'] : [])
|
|
32
33
|
]
|
|
33
34
|
});
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { pathToFileURL } from 'node:url';
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { assertGate, emitGate, readText, root } from './sks-1-18-gate-lib.js';
|
|
8
|
+
import { ensureDistFresh } from './lib/ensure-dist-fresh.js';
|
|
9
|
+
const requireReal = process.env.SKS_REQUIRE_ZELLIJ === '1' || process.argv.includes('--require-real');
|
|
10
|
+
const manager = readText('src/core/zellij/zellij-worker-pane-manager.ts');
|
|
11
|
+
const schema = readText('src/core/agents/agent-schema.ts');
|
|
12
|
+
const swarm = readText('src/core/agents/native-cli-session-swarm.ts');
|
|
13
|
+
assertGate(manager.includes('action') && manager.includes('new-pane'), 'worker pane manager must call zellij action new-pane');
|
|
14
|
+
assertGate(manager.includes('list-panes') && manager.includes('dump-screen'), 'worker pane proof must reconcile real list-panes/dump-screen evidence');
|
|
15
|
+
assertGate(schema.includes('AgentWorkerPlacement') && swarm.includes("placement === 'zellij-pane'"), 'worker placement must control Zellij panes independently of backend');
|
|
16
|
+
if (!requireReal) {
|
|
17
|
+
emitGate('zellij:worker-pane-real-ui:blackbox', { real_required: false, proof_mode: 'source_contract' });
|
|
18
|
+
process.exit(0);
|
|
19
|
+
}
|
|
20
|
+
const { spawnSync } = await import('node:child_process');
|
|
21
|
+
const available = spawnSync('zellij', ['--version'], { encoding: 'utf8' });
|
|
22
|
+
assertGate(available.status === 0, 'SKS_REQUIRE_ZELLIJ=1 requires zellij binary', { stderr: available.stderr });
|
|
23
|
+
const freshness = ensureDistFresh({ rebuild: false });
|
|
24
|
+
assertGate(freshness.ok === true, 'dist must be fresh before real Zellij worker-pane blackbox', freshness);
|
|
25
|
+
const zellij = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-command.js')).href);
|
|
26
|
+
const workerPane = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-worker-pane-manager.js')).href);
|
|
27
|
+
const missionId = `M-zellij-worker-pane-real-${Date.now()}`;
|
|
28
|
+
const sessionName = `sks-worker-pane-real-${process.pid}`;
|
|
29
|
+
const ledgerRoot = path.join(root, '.sneakoscope', 'missions', missionId, 'agents');
|
|
30
|
+
fs.rmSync(path.join(root, '.sneakoscope', 'missions', missionId), { recursive: true, force: true });
|
|
31
|
+
fs.mkdirSync(ledgerRoot, { recursive: true });
|
|
32
|
+
await zellij.runZellij(['kill-session', sessionName], { cwd: root, timeoutMs: 5000, optional: true });
|
|
33
|
+
const attachedClient = startAttachedZellijClient(sessionName);
|
|
34
|
+
await sleep(1500);
|
|
35
|
+
await zellij.runZellij(['--session', sessionName, 'action', 'send-keys', 'Esc'], { cwd: root, timeoutMs: 5000, optional: true });
|
|
36
|
+
await sleep(250);
|
|
37
|
+
const before = await zellij.runZellij(['--session', sessionName, 'action', 'list-panes', '--json', '--all'], { cwd: root, timeoutMs: 5000, optional: true });
|
|
38
|
+
const beforeCount = parsePaneRows(before.stdout_tail).length;
|
|
39
|
+
const beforeTerminalCount = parsePaneRows(before.stdout_tail).filter((row) => row && row.is_plugin !== true).length;
|
|
40
|
+
const records = [];
|
|
41
|
+
try {
|
|
42
|
+
for (let index = 1; index <= 3; index += 1) {
|
|
43
|
+
const slotId = `slot-${String(index).padStart(3, '0')}`;
|
|
44
|
+
const workerDir = path.join('sessions', slotId, 'gen-1', 'worker');
|
|
45
|
+
const absWorkerDir = path.join(ledgerRoot, workerDir);
|
|
46
|
+
fs.mkdirSync(absWorkerDir, { recursive: true });
|
|
47
|
+
const heartbeatRel = path.join(workerDir, 'worker-heartbeat.jsonl');
|
|
48
|
+
const resultRel = path.join(workerDir, 'worker-result.json');
|
|
49
|
+
const stdoutRel = path.join(workerDir, 'worker.stdout.log');
|
|
50
|
+
const stderrRel = path.join(workerDir, 'worker.stderr.log');
|
|
51
|
+
const heartbeatAbs = path.join(ledgerRoot, heartbeatRel);
|
|
52
|
+
const resultAbs = path.join(ledgerRoot, resultRel);
|
|
53
|
+
const backend = index === 1 ? 'codex-sdk' : index === 2 ? 'local-llm' : 'python-codex-sdk';
|
|
54
|
+
const expectedTitle = `${slotId}/gen-1 · WT:WT-${String(index).padStart(4, '0')} · branch:fixture · ${backend} · fast · codex-lb · active`;
|
|
55
|
+
const workerScript = [
|
|
56
|
+
"const fs=require('fs');",
|
|
57
|
+
`fs.appendFileSync(${JSON.stringify(heartbeatAbs)}, JSON.stringify({ok:true, slot:${JSON.stringify(slotId)}, ts:new Date().toISOString()})+'\\n');`,
|
|
58
|
+
`fs.writeFileSync(${JSON.stringify(resultAbs)}, JSON.stringify({schema:'sks.agent-result.v1', status:'done', slot:${JSON.stringify(slotId)}, heartbeat_seen:true}, null, 2)+'\\n');`,
|
|
59
|
+
"setTimeout(()=>process.exit(0), 8000);"
|
|
60
|
+
].join('');
|
|
61
|
+
const record = await workerPane.openWorkerPane({
|
|
62
|
+
root: ledgerRoot,
|
|
63
|
+
missionId,
|
|
64
|
+
sessionName,
|
|
65
|
+
slotId,
|
|
66
|
+
generationIndex: 1,
|
|
67
|
+
sessionId: `${slotId}-gen-1`,
|
|
68
|
+
workerArtifactDir: workerDir,
|
|
69
|
+
workerCommand: `printf ${shellQuote(`\u001b]2;${expectedTitle}\u0007`)}; ${process.execPath} -e ${shellQuote(workerScript)}`,
|
|
70
|
+
resultPath: resultRel,
|
|
71
|
+
heartbeatPath: heartbeatRel,
|
|
72
|
+
patchEnvelopePath: path.join(workerDir, 'worker-patch-envelope.json'),
|
|
73
|
+
stdoutLog: stdoutRel,
|
|
74
|
+
stderrLog: stderrRel,
|
|
75
|
+
cwd: root,
|
|
76
|
+
serviceTier: 'fast',
|
|
77
|
+
backend,
|
|
78
|
+
statusLabel: 'active',
|
|
79
|
+
worktree: { id: `WT-${String(index).padStart(4, '0')}`, path: root, branch: 'fixture' }
|
|
80
|
+
});
|
|
81
|
+
records.push(record);
|
|
82
|
+
}
|
|
83
|
+
await sleep(750);
|
|
84
|
+
const listed = await zellij.runZellij(['--session', sessionName, 'action', 'list-panes', '--json', '--all'], { cwd: root, timeoutMs: 5000, optional: false });
|
|
85
|
+
const rows = parsePaneRows(listed.stdout_tail);
|
|
86
|
+
const terminalRows = rows.filter((row) => row && row.is_plugin !== true);
|
|
87
|
+
const titles = rows.map((row) => String(row.title || row.name || row.pane_name || ''));
|
|
88
|
+
const matchedTitles = records.filter((record) => titles.includes(record.pane_title)).length;
|
|
89
|
+
const commandMatchedWorkers = records.filter((record) => rows.some((row) => {
|
|
90
|
+
const command = `${row.terminal_command || ''} ${row.pane_command || ''} ${row.command || ''}`;
|
|
91
|
+
return command.includes(missionId) && command.includes(record.slot_id);
|
|
92
|
+
})).length;
|
|
93
|
+
const requestedTitleCommands = records.filter((record) => {
|
|
94
|
+
const args = Array.isArray(record.launch?.args) ? record.launch.args.map(String) : [];
|
|
95
|
+
return args.includes('--name') && args.includes(record.pane_title);
|
|
96
|
+
}).length;
|
|
97
|
+
const dump = await zellij.runZellij(['--session', sessionName, 'action', 'dump-screen'], { cwd: root, timeoutMs: 5000, optional: true });
|
|
98
|
+
const heartbeatSeen = records.filter((record) => fs.existsSync(path.join(ledgerRoot, record.heartbeat_path))).length;
|
|
99
|
+
const resultSeen = records.filter((record) => fs.existsSync(path.join(ledgerRoot, record.worker_result_path))).length;
|
|
100
|
+
const realPaneIds = records.filter((record) => workerPane.isRealZellijWorkerPaneIdSource(record.pane_id_source) && record.pane_id).length;
|
|
101
|
+
const report = {
|
|
102
|
+
schema: 'sks.zellij-worker-pane-real-ui-blackbox.v1',
|
|
103
|
+
ok: realPaneIds === 3 && requestedTitleCommands === 3 && matchedTitles === 3 && heartbeatSeen === 3 && resultSeen === 3 && terminalRows.length >= beforeTerminalCount + 3,
|
|
104
|
+
real_required: true,
|
|
105
|
+
zellij_version: available.stdout.trim(),
|
|
106
|
+
mission_id: missionId,
|
|
107
|
+
session_name: sessionName,
|
|
108
|
+
before_pane_count: beforeCount,
|
|
109
|
+
before_terminal_pane_count: beforeTerminalCount,
|
|
110
|
+
after_pane_count: rows.length,
|
|
111
|
+
terminal_pane_count: terminalRows.length,
|
|
112
|
+
worker_pane_count: records.length,
|
|
113
|
+
real_pane_ids: realPaneIds,
|
|
114
|
+
matched_titles: matchedTitles,
|
|
115
|
+
command_matched_workers: commandMatchedWorkers,
|
|
116
|
+
requested_title_commands: requestedTitleCommands,
|
|
117
|
+
heartbeat_seen: heartbeatSeen,
|
|
118
|
+
result_seen: resultSeen,
|
|
119
|
+
dump_screen_ok: dump.ok,
|
|
120
|
+
pane_titles: records.map((record) => record.pane_title),
|
|
121
|
+
pane_id_sources: records.map((record) => record.pane_id_source),
|
|
122
|
+
proof_root: ledgerRoot,
|
|
123
|
+
blockers: []
|
|
124
|
+
};
|
|
125
|
+
if (!report.ok) {
|
|
126
|
+
report.blockers = [
|
|
127
|
+
...(realPaneIds === 3 ? [] : ['real_worker_pane_ids_missing']),
|
|
128
|
+
...(requestedTitleCommands === 3 ? [] : ['worker_pane_title_request_missing']),
|
|
129
|
+
...(matchedTitles === 3 ? [] : ['worker_pane_titles_not_visible_in_list_panes']),
|
|
130
|
+
...(heartbeatSeen === 3 ? [] : ['worker_heartbeat_missing']),
|
|
131
|
+
...(resultSeen === 3 ? [] : ['worker_result_missing']),
|
|
132
|
+
...(terminalRows.length >= beforeTerminalCount + 3 ? [] : ['terminal_worker_pane_count_below_3'])
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
fs.mkdirSync(path.join(root, '.sneakoscope', 'reports'), { recursive: true });
|
|
136
|
+
fs.writeFileSync(path.join(root, '.sneakoscope', 'reports', 'zellij-worker-pane-real-ui-blackbox.json'), `${JSON.stringify(report, null, 2)}\n`);
|
|
137
|
+
emitGate('zellij:worker-pane-real-ui:blackbox', report);
|
|
138
|
+
if (!report.ok)
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
await zellij.runZellij(['kill-session', sessionName], { cwd: root, timeoutMs: 5000, optional: true });
|
|
143
|
+
safeKill(attachedClient, 'SIGTERM');
|
|
144
|
+
await sleep(250);
|
|
145
|
+
safeKill(attachedClient, 'SIGKILL');
|
|
146
|
+
}
|
|
147
|
+
function parsePaneRows(text) {
|
|
148
|
+
if (!String(text || '').trim())
|
|
149
|
+
return [];
|
|
150
|
+
try {
|
|
151
|
+
const parsed = JSON.parse(String(text));
|
|
152
|
+
if (Array.isArray(parsed))
|
|
153
|
+
return parsed;
|
|
154
|
+
if (Array.isArray(parsed?.panes))
|
|
155
|
+
return parsed.panes;
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function sleep(ms) {
|
|
163
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
164
|
+
}
|
|
165
|
+
function shellQuote(value) {
|
|
166
|
+
return `'${String(value).replace(/'/g, `'\\''`)}'`;
|
|
167
|
+
}
|
|
168
|
+
function startAttachedZellijClient(sessionName) {
|
|
169
|
+
const logFile = path.join(root, '.sneakoscope', 'reports', `${sessionName}.script.log`);
|
|
170
|
+
fs.mkdirSync(path.dirname(logFile), { recursive: true });
|
|
171
|
+
return spawn('script', ['-q', logFile, 'zellij', 'attach', '--create', sessionName], {
|
|
172
|
+
cwd: root,
|
|
173
|
+
stdio: ['ignore', 'ignore', 'ignore']
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
function safeKill(child, signal) {
|
|
177
|
+
try {
|
|
178
|
+
if (!child.killed)
|
|
179
|
+
child.kill(signal);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Best-effort cleanup for the disposable pseudo-terminal client.
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=zellij-worker-pane-real-ui-blackbox.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sneakoscope",
|
|
3
3
|
"displayName": "ㅅㅋㅅ",
|
|
4
|
-
"version": "2.0.
|
|
4
|
+
"version": "2.0.9",
|
|
5
5
|
"description": "Sneakoscope Codex: fast proof-first Codex trust layer with image-based Voxel TriWiki.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"homepage": "https://github.com/mandarange/Sneakoscope-Codex#readme",
|
|
@@ -312,10 +312,10 @@
|
|
|
312
312
|
"ultra-router:classification": "node ./dist/scripts/ultra-router-classification-check.js",
|
|
313
313
|
"ultra-router:auto-router": "node ./dist/scripts/ultra-router-auto-router-check.js",
|
|
314
314
|
"coverage": "node --experimental-test-coverage --test \"test/**/*.test.mjs\"",
|
|
315
|
-
"release:check": "npm run
|
|
316
|
-
"release:real-check": "node ./dist/scripts/release-real-check.js && SKS_REQUIRE_GIT_WORKTREE=1 npm run naruto:worktree-coding -- --require-real && npm run codex-control:real-smoke -- --require-real && npm run codex-sdk:real-smoke -- --require-real && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:smoke && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:throughput && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:cache-performance && SKS_REQUIRE_PYTHON_CODEX_SDK=1 npm run python-sdk:real-smoke && SKS_REQUIRE_CODEX_0137=1 npm run codex:0.137-compat:require-real && npm run zellij:real-session-launch -- --require-real --main-only --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run zellij:pane-proof -- --require-real --mission M-release-real-zellij-extra --session sks-rrz-extra --expected-lanes 0 && npm run zellij:screen-proof -- --require-real --main-only --mission M-release-real-zellij-extra && npm run zellij:real-session-cleanup -- --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run agent:real-codex-in-zellij-worker-pane -- --require-real &&
|
|
315
|
+
"release:check": "npm run build --silent && node ./dist/scripts/release-gate-dag-runner.js --preset release && node ./dist/scripts/release-check-stamp.js write",
|
|
316
|
+
"release:real-check": "node ./dist/scripts/release-real-check.js && SKS_REQUIRE_ZELLIJ=1 npm run zellij:right-column-geometry-proof -- --require-real && SKS_REQUIRE_ZELLIJ=1 npm run naruto:zellij-dynamic-right-column -- --require-real && SKS_REQUIRE_GIT_WORKTREE=1 npm run naruto:worktree-coding:blackbox -- --require-real && npm run codex-control:real-smoke -- --require-real && npm run codex-sdk:real-smoke -- --require-real && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:smoke && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:throughput && SKS_REQUIRE_LOCAL_LLM=1 npm run local-llm:cache-performance && SKS_REQUIRE_PYTHON_CODEX_SDK=1 npm run python-sdk:real-smoke && SKS_REQUIRE_CODEX_0137=1 npm run codex:0.137-compat:require-real && npm run zellij:real-session-launch -- --require-real --main-only --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run zellij:pane-proof -- --require-real --mission M-release-real-zellij-extra --session sks-rrz-extra --expected-lanes 0 && npm run zellij:screen-proof -- --require-real --main-only --mission M-release-real-zellij-extra && npm run zellij:real-session-cleanup -- --mission M-release-real-zellij-extra --session sks-rrz-extra && npm run agent:real-codex-in-zellij-worker-pane -- --require-real && SKS_REQUIRE_LOCAL_LLM=1 SKS_REQUIRE_GPT_FINAL=1 npm run naruto:real-local-gpt-final-smoke && SKS_REQUIRE_LOCAL_LLM=1 SKS_REQUIRE_GPT_FINAL=1 npm run local-collab:gpt-final-performance && SKS_REQUIRE_ZELLIJ=1 npm run zellij:worker-pane-real-ui:blackbox -- --require-real",
|
|
317
317
|
"release:publish": "npm run publish:npm",
|
|
318
|
-
"publish:dry": "npm run release:metadata && npm run release:version-truth && npm run publish:packlist-performance && npm run prepublish:release-check-or-fast && node ./dist/scripts/release-check-stamp.js verify && npm run release:provenance -- --publish && npm run release:dist-freshness && npm --cache /tmp/sks-npm-cache publish --dry-run --registry https://registry.npmjs.org/ --access public",
|
|
318
|
+
"publish:dry": "npm run release:metadata && npm run release:version-truth && npm run publish:packlist-performance && npm run prepublish:release-check-or-fast && node ./dist/scripts/check-publish-tag.js && node ./dist/scripts/release-check-stamp.js verify && npm run release:provenance -- --publish && npm run release:dist-freshness && node ./dist/scripts/release-registry-check.js --require-unpublished && npm --cache /tmp/sks-npm-cache publish --dry-run --ignore-scripts --registry https://registry.npmjs.org/ --access public",
|
|
319
319
|
"publish:npm": "npm --cache /tmp/sks-npm-cache publish --registry https://registry.npmjs.org/ --access public",
|
|
320
320
|
"prepack": "npm run build",
|
|
321
321
|
"prepublishOnly": "npm run release:metadata && npm run release:version-truth && npm run release:dist-freshness && npm run publish:packlist-performance && npm run prepublish:release-check-or-fast && node ./dist/scripts/check-publish-tag.js && node ./dist/scripts/release-check-stamp.js verify && npm run release:provenance -- --publish && node ./dist/scripts/release-registry-check.js --require-unpublished --require-publish-auth",
|
|
@@ -501,7 +501,34 @@
|
|
|
501
501
|
"runtime:ts-python-boundary": "node ./dist/scripts/runtime-ts-python-boundary-check.js",
|
|
502
502
|
"python-tools:smoke": "node ./dist/scripts/python-tools-smoke-check.js",
|
|
503
503
|
"agent:zellij-dynamic-backfill-panes": "node ./dist/scripts/agent-zellij-dynamic-backfill-panes-check.js",
|
|
504
|
-
"agent:real-codex-in-zellij-worker-pane": "node ./dist/scripts/agent-real-codex-in-zellij-worker-pane-check.js"
|
|
504
|
+
"agent:real-codex-in-zellij-worker-pane": "node ./dist/scripts/agent-real-codex-in-zellij-worker-pane-check.js",
|
|
505
|
+
"release:check:legacy": "npm run release:check:parallel && npm run mad-sks:app-ui-no-mutation && npm run codex-app:fast-ui-preservation && npm run codex-app:ui-clobber-guard && npm run doctor:fixes-codex-app-fast-ui && npm run provider:badge-context && npm run provider:context-config-toml && npm run codex-app:provider-badge && npm run zellij:spawn-on-demand-layout && npm run zellij:worker-pane-manager && npm run zellij:worker-pane-manager-single-owner && npm run agent:worker-pane-communication-contract && npm run runtime:no-mjs-scripts && npm run runtime:ts-python-boundary && npm run codex-sdk:capability && npm run codex-sdk:no-legacy-fallback && npm run codex-sdk:backend-router && npm run codex-sdk:structured-output && npm run codex-sdk:event-stream-ledger && npm run codex-sdk:thread-registry && npm run codex-sdk:sandbox-policy && npm run codex-sdk:zellij-pane-binding && npm run codex-sdk:all-pipelines && npm run codex-sdk:dfix-pipeline && npm run codex-sdk:qa-pipeline && npm run codex-sdk:research-pipeline && npm run codex-sdk:team-naruto-agent-pipeline && npm run codex-sdk:release-review-pipeline && npm run codex-sdk:ux-ppt-review-pipeline && npm run codex-sdk:core-skill-pipeline && npm run codex-control:capability && npm run codex-control:no-legacy-fallback && npm run codex-control:structured-output && npm run codex-control:event-stream-ledger && npm run codex-control:thread-registry && npm run codex-control:side-effect-scope && npm run codex-control:all-pipelines && npm run codex-control:empty-result-retry && npm run codex-control:stream-idle-watchdog && npm run codex-control:tool-call-sequence-repair && npm run codex-control:keepalive-no-cot-leak && npm run local-collab:policy && npm run local-collab:gpt-final-arbiter && npm run local-collab:no-local-only-final && npm run local-collab:gpt-final-availability && npm run local-llm:capability && npm run local-llm:structured-output && npm run local-llm:tool-call-repair && npm run local-llm:all-pipelines && npm run local-collab:all-pipelines-final-gpt && npm run python-sdk:capability && npm run python-sdk:stream-bridge && npm run python-sdk:sandbox-policy && npm run python-sdk:all-pipelines && npm run codex:plugin-list-json && npm run codex:product-design-plugin-routing && npm run codex:product-design-auto-install && npm run codex:thread-runtime-choice && npm run codex:environment-scoped-approvals && npm run ultra-router:classification && npm run ultra-router:auto-router && npm run release:version-truth && npm run release:worktree-gates && npm run codex:0.137-compat && npm run codex:0.136-compat && npm run codex:0.135-compat && npm run doctor:codex-doctor-parity && npm run codex:permission-profiles && npm run codex:legacy-profile-consumers-removed && npm run terminal:keyboard-enhancement-safety && npm run terminal:tui-output-stability && npm run codex:resume-cwd-truth && npm run mcp:tool-naming-parity && npm run responses:retry-policy-centralized && npm run runtime:no-tmux && npm run zellij:layout-valid && npm run agent:zellij-dynamic-backfill-panes && npm run agent:worker-pane-communication-contract && npm run agent:slot-pane-binding-proof && npm run zellij:worker-pane-manager && npm run zellij:spawn-on-demand-layout && npm run zellij:lane-renderer && npm run mad-sks:zellij-launch && npm run mad-sks:zellij-default-pane-worker && npm run agent:zellij-runtime && npm run codex:config-eperm-fixture && npm run doctor:fix-proves-codex-read && npm run mad:preflight-blocks-unreadable-config && npm run fast:codex-service-tier-proof && npm run codex:project-config-policy-splitter && npm run test:no-orphan-dist-imports && npm run agent:patch-envelope-extraction && npm run agent:patch-queue-runtime && npm run agent:strategy-to-lease-wiring && npm run agent:patch-swarm-runtime && npm run agent:patch-transaction-journal && npm run agent:patch-conflict-rebase && npm run agent:strategy-to-patch-strict && npm run agent:patch-swarm-runtime-truth && npm run agent:rollback-command && npm run agent:patch-verification-dag && npm run agent:patch-rollback-dag && npm run agent:patch-proof-runtime && npm run agent:patch-swarm-route-blackbox && npm run team:patch-swarm-route-blackbox && npm run dfix:patch-swarm-route-blackbox && npm run appshots:thread-attachment-discovery && npm run mcp:readonly-runtime-scheduler && npm run naruto:work-graph && npm run naruto:readonly-routing && npm run naruto:concurrency-governor && npm run naruto:active-pool && npm run naruto:role-distribution && npm run naruto:parallel-patch-apply && npm run naruto:verification-pool && npm run naruto:zellij-massive-ui && npm run naruto:gpt-final-pack && npm run prompt:placeholder-guard && npm run codex:0.134-runner-truth && npm run agent:native-cli-session-swarm && npm run naruto:shadow-clone-swarm && npm run agent:native-cli-session-swarm-10 && npm run agent:native-cli-session-swarm-20 && npm run agent:no-subagent-scaling && npm run agent:native-cli-session-proof && npm run agent:worker-backend-router && npm run agent:codex-child-overlap && npm run agent:model-authored-patch-envelope && npm run agent:fast-mode-default && npm run agent:fast-mode-worker-propagation && npm run codex:fast-mode-profile-propagation && npm run mad-sks:fast-mode-propagation && npm run zellij:launch-command-truth && npm run zellij:real-session-heartbeat && npm run zellij:ui-design && npm run zellij:doctor-readiness && npm run legacy:upgrade-zero-break && npm run publish:packlist-performance && npm run postinstall:safe-side-effects && npm run runtime:ts-rust-boundary && npm run core-skill:card-schema && npm run core-skill:rollout-scoring && npm run core-skill:patch && npm run core-skill:heldout-validation && npm run core-skill:deployment-snapshot && npm run core-skill:no-inference-optimizer && npm run core-skill:route-runtime-integration && npm run core-skill:promotion-side-effect-ledger && npm run core-skill:legacy-promotion-api-audit && npm run safety:side-effect-zero && npm run safety:mutation-callsite-coverage && npm run safety:mutation-callsite-coverage:repo-wide && npm run side-effect:runtime-report && npm run release:gate-planner && npm run release:dynamic-performance && npm run release:provenance && npm run release:gate-budget && npm run agent:wiki-context-proof && npm run shared-memory:check && npm run wrongness:check && npm run wrongness:fixtures && npm run trust:check && npm run git-collaboration:e2e && node ./dist/scripts/release-check-stamp.js write && npm run release:readiness --silent && node ./dist/scripts/release-check-stamp.js write",
|
|
506
|
+
"release:check:dag": "node ./dist/scripts/release-gate-dag-runner.js --preset release",
|
|
507
|
+
"release:check:dag:explain": "node ./dist/scripts/release-gate-dag-runner.js --preset release --explain",
|
|
508
|
+
"release:check:dag:no-cache": "node ./dist/scripts/release-gate-dag-runner.js --preset release --no-cache",
|
|
509
|
+
"release:check:dag:fail-fast": "node ./dist/scripts/release-gate-dag-runner.js --preset release --fail-fast",
|
|
510
|
+
"release:dag-runner": "node ./dist/scripts/release-gate-dag-runner-check.js",
|
|
511
|
+
"release:parallel-speed-budget": "node ./dist/scripts/release-parallel-speed-budget-check.js",
|
|
512
|
+
"release:stability-report": "node ./dist/scripts/release-stability-report-check.js",
|
|
513
|
+
"git:worktree-manifest-append": "node ./dist/scripts/git-worktree-manifest-append-check.js",
|
|
514
|
+
"git:worktree-dirty-main-detection": "node ./dist/scripts/git-worktree-dirty-main-detection-check.js",
|
|
515
|
+
"git:worktree-untracked-diff": "node ./dist/scripts/git-worktree-untracked-diff-check.js",
|
|
516
|
+
"git:worktree-diff-envelope": "node ./dist/scripts/git-worktree-diff-envelope-check.js",
|
|
517
|
+
"git:worktree-integration-primary": "node ./dist/scripts/git-worktree-integration-primary-check.js",
|
|
518
|
+
"git:worktree-dirty-lock": "node ./dist/scripts/git-worktree-dirty-lock-check.js",
|
|
519
|
+
"naruto:worktree-coding:blackbox": "node ./dist/scripts/naruto-worktree-coding-blackbox.js",
|
|
520
|
+
"zellij:worker-pane-real-ui:blackbox": "node ./dist/scripts/zellij-worker-pane-real-ui-blackbox.js",
|
|
521
|
+
"zellij:dashboard-pane": "node ./dist/scripts/zellij-dashboard-pane-check.js",
|
|
522
|
+
"zellij:initial-main-only-blackbox": "node ./dist/scripts/zellij-initial-main-only-blackbox.js",
|
|
523
|
+
"zellij:right-column-manager": "node ./dist/scripts/zellij-right-column-manager-check.js",
|
|
524
|
+
"zellij:right-column-geometry-proof": "node ./dist/scripts/zellij-right-column-geometry-proof.js",
|
|
525
|
+
"zellij:dynamic-pane-lifecycle": "node ./dist/scripts/zellij-dynamic-pane-lifecycle-check.js",
|
|
526
|
+
"zellij:developer-controls": "node ./dist/scripts/zellij-developer-controls-check.js",
|
|
527
|
+
"naruto:real-active-pool": "node ./dist/scripts/naruto-real-active-pool-check.js",
|
|
528
|
+
"naruto:extreme-parallelism": "node ./dist/scripts/naruto-extreme-parallelism-check.js",
|
|
529
|
+
"naruto:zellij-dynamic-right-column": "node ./dist/scripts/naruto-zellij-dynamic-right-column-check.js",
|
|
530
|
+
"release:dag-full-coverage": "node ./dist/scripts/release-dag-full-coverage-check.js",
|
|
531
|
+
"release:cache-glob-hashing": "node ./dist/scripts/release-cache-glob-hashing-check.js"
|
|
505
532
|
},
|
|
506
533
|
"keywords": [
|
|
507
534
|
"sneakoscope",
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sneakoscope.local/schemas/release/release-gate-node.schema.json",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": ["schema", "gates"],
|
|
6
|
+
"properties": {
|
|
7
|
+
"schema": { "const": "sks.release-gates.v2" },
|
|
8
|
+
"gates": {
|
|
9
|
+
"type": "array",
|
|
10
|
+
"items": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"required": ["id", "command", "deps", "resource", "side_effect", "timeout_ms", "cache", "isolation", "preset"],
|
|
13
|
+
"properties": {
|
|
14
|
+
"id": { "type": "string", "minLength": 1 },
|
|
15
|
+
"command": { "type": "string", "minLength": 1 },
|
|
16
|
+
"deps": { "type": "array", "items": { "type": "string" } },
|
|
17
|
+
"resource": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"minItems": 1,
|
|
20
|
+
"items": {
|
|
21
|
+
"enum": ["cpu-light", "cpu-heavy", "io-light", "io-heavy", "git", "git-worktree", "zellij-real", "local-llm-real", "remote-model-real", "python", "network", "global-config", "publish", "fs-read"]
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"side_effect": { "enum": ["hermetic", "real-env"] },
|
|
25
|
+
"timeout_ms": { "type": "integer", "minimum": 1 },
|
|
26
|
+
"cache": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"required": ["enabled", "inputs"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"enabled": { "type": "boolean" },
|
|
31
|
+
"inputs": { "type": "array", "items": { "type": "string" } }
|
|
32
|
+
},
|
|
33
|
+
"additionalProperties": false
|
|
34
|
+
},
|
|
35
|
+
"isolation": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"required": ["home", "codex_home", "report_dir"],
|
|
38
|
+
"properties": {
|
|
39
|
+
"home": { "enum": ["temp", "inherit"] },
|
|
40
|
+
"codex_home": { "enum": ["temp", "inherit"] },
|
|
41
|
+
"report_dir": { "const": "per-gate" }
|
|
42
|
+
},
|
|
43
|
+
"additionalProperties": false
|
|
44
|
+
},
|
|
45
|
+
"preset": { "type": "array", "items": { "type": "string" } }
|
|
46
|
+
},
|
|
47
|
+
"additionalProperties": false
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"additionalProperties": false
|
|
52
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "sks.zellij-right-column-state.v1",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": ["schema", "mission_id", "session_name", "status", "visible_worker_panes", "headless_workers", "blockers"],
|
|
6
|
+
"properties": {
|
|
7
|
+
"schema": { "const": "sks.zellij-right-column-state.v1" },
|
|
8
|
+
"mission_id": { "type": "string" },
|
|
9
|
+
"session_name": { "type": "string" },
|
|
10
|
+
"status": { "enum": ["absent", "creating", "active", "draining", "closed"] },
|
|
11
|
+
"dashboard_pane_id": { "type": ["string", "null"] },
|
|
12
|
+
"right_anchor_pane_id": { "type": ["string", "null"] },
|
|
13
|
+
"visible_worker_panes": {
|
|
14
|
+
"type": "array",
|
|
15
|
+
"items": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"required": ["slot_id", "generation_index", "y_order", "status"],
|
|
18
|
+
"properties": {
|
|
19
|
+
"pane_id": { "type": ["string", "null"] },
|
|
20
|
+
"slot_id": { "type": "string" },
|
|
21
|
+
"generation_index": { "type": "integer" },
|
|
22
|
+
"y_order": { "type": "integer" },
|
|
23
|
+
"status": { "enum": ["launching", "running", "draining", "closed", "failed"] }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"headless_workers": {
|
|
28
|
+
"type": "array",
|
|
29
|
+
"items": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"required": ["slot_id", "generation_index", "reason"],
|
|
32
|
+
"properties": {
|
|
33
|
+
"slot_id": { "type": "string" },
|
|
34
|
+
"generation_index": { "type": "integer" },
|
|
35
|
+
"reason": { "type": "string" }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"blockers": { "type": "array", "items": { "type": "string" } }
|
|
40
|
+
}
|
|
41
|
+
}
|