sneakoscope 1.21.1 → 1.21.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +2 -2
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/crates/sks-core/src/main.rs +1 -1
  5. package/dist/.sks-build-stamp.json +4 -4
  6. package/dist/bin/sks.js +1 -1
  7. package/dist/build-manifest.json +6 -6
  8. package/dist/cli/install-helpers.d.ts +1 -1
  9. package/dist/cli/install-helpers.js +17 -8
  10. package/dist/commands/image-ux-review.d.ts +3 -0
  11. package/dist/commands/mad-sks.d.ts +1 -0
  12. package/dist/commands/ppt.d.ts +3 -0
  13. package/dist/core/agents/agent-gate.d.ts +1 -0
  14. package/dist/core/agents/agent-gate.js +14 -2
  15. package/dist/core/agents/agent-orchestrator.d.ts +3 -0
  16. package/dist/core/agents/agent-orchestrator.js +15 -1
  17. package/dist/core/agents/agent-proof-evidence.d.ts +2 -0
  18. package/dist/core/agents/agent-proof-evidence.js +3 -0
  19. package/dist/core/agents/agent-schema.d.ts +1 -0
  20. package/dist/core/agents/route-collaboration-ledger.d.ts +3 -0
  21. package/dist/core/agents/zellij-lane-supervisor.js +7 -3
  22. package/dist/core/commands/fast-mode-command.d.ts +51 -0
  23. package/dist/core/commands/fast-mode-command.js +5 -0
  24. package/dist/core/commands/image-ux-review-command.d.ts +3 -0
  25. package/dist/core/commands/mad-sks-command.d.ts +1 -0
  26. package/dist/core/commands/naruto-command.js +3 -2
  27. package/dist/core/commands/ppt-command.d.ts +3 -0
  28. package/dist/core/commands/team-command.js +10 -7
  29. package/dist/core/fsx.d.ts +1 -1
  30. package/dist/core/fsx.js +1 -1
  31. package/dist/core/proof/auto-finalize.js +24 -20
  32. package/dist/core/version.d.ts +1 -1
  33. package/dist/core/version.js +1 -1
  34. package/dist/core/zellij/zellij-clipboard-config.d.ts +2 -0
  35. package/dist/core/zellij/zellij-clipboard-config.js +13 -10
  36. package/dist/core/zellij/zellij-launcher.d.ts +3 -0
  37. package/dist/core/zellij/zellij-launcher.js +1 -0
  38. package/package.json +4 -3
package/README.md CHANGED
@@ -16,11 +16,11 @@ Set up this agent project with Sneakoscope Codex. Use [[mandarange/Sneakoscope-C
16
16
 
17
17
  ## Current Release
18
18
 
19
- SKS **1.21.1** fixes three `sks --mad` launch problems. **(1) Launch speed:** the launch no longer SHA-256-hashes the entire protected core (~1,900 files) on every invocation the never-compared launch snapshot now uses a cheap metadata digest, and the redundant live `codex exec` config probe is skipped on the launch hot path (restore with `SKS_LAUNCH_FULL_CODEX_PROBE=1`); the immutable-harness integrity gates still use full content hashing. **(2) Zellij clipboard:** sessions now set `copy_command "pbcopy"` + `copy_on_select true` so selected text reaches the macOS clipboard instead of relying on OSC 52 (which Terminal.app drops); Shift+drag remains the native-selection fallback. **(3) Codex legacy-profile warning:** SKS migrated its config profiles to Codex 0.134+ per-file `$CODEX_HOME/<name>.config.toml` overlays — the project-config splitter now drops the deprecated `[profiles.*]` tables / `profile=` selector instead of relocating them into the home config, so Codex stops warning at startup. The Codex App fast-mode `[profiles.sks-fast-high]` table and `default_profile` are preserved.
19
+ SKS **1.21.3** restores macOS native text copy in SKS-launched Zellij sessions: the generated clipboard config and launch options now set `mouse_mode false` alongside `copy_command pbcopy`, so drag-select + `Cmd+C` reaches the terminal/system clipboard instead of being intercepted by Zellij. It also keeps Team/Naruto native agents individually visible in the right-side Zellij UI by separating runtime concurrency (`target_active_slots`) from the visual lane count (`visual_lane_count`). Direct `npm publish` now repairs a stale release-check stamp by running the full authoritative `npm run release:check` once before continuing, instead of failing early in `prepublish:fast-check` after a version bump. Explicit `sks fast-mode on` / `$Fast-On` now repairs Codex's Fast mode UI/default profile as well as the project-local SKS preference. It carries forward the 1.21.2 Zellij launch fix, 1.21.1 launch-speed fix, and Codex legacy-profile cleanup.
20
20
 
21
21
  SKS **1.20.4** is a targeted `sks --mad` / codex-lb Zellij usability patch: when a background MAD Zellij session launches successfully, SKS now prints the exact `Attach with: ZELLIJ_SOCKET_DIR=... zellij attach ...` command so operators can enter the fresh session without manually reconstructing the socket namespace.
22
22
 
23
- SKS **1.20.3** added the macOS Zellij launch fallback and project-local Fast mode control. SKS supplies a short per-user `ZELLIJ_SOCKET_DIR` by default, caps generated session names safely, records `*_command_with_env` attach commands, and classifies `IPC socket path is too long` as `zellij_socket_path_too_long` instead of a generic launch failure. It also adds `sks fast-mode on|off|status|clear`, `$Fast-On`, `$Fast-Off`, and `$Fast-Mode`; saved project preferences are used only when no explicit `--fast`, `--no-fast`, or `--service-tier` flag is present.
23
+ SKS **1.20.3** added the macOS Zellij launch fallback and project-local Fast mode control. SKS supplies a short per-user `ZELLIJ_SOCKET_DIR` by default, caps generated session names safely, records `*_command_with_env` attach commands, and classifies `IPC socket path is too long` as `zellij_socket_path_too_long` instead of a generic launch failure. It also adds `sks fast-mode on|off|status|clear`, `$Fast-On`, `$Fast-Off`, and `$Fast-Mode`; saved project preferences are used only when no explicit `--fast`, `--no-fast`, or `--service-tier` flag is present. In 1.21.3 and newer, the explicit `on` action also restores Codex App/CLI Fast mode defaults in `~/.codex/config.toml` when they were disabled.
24
24
 
25
25
  It carries forward the **1.20.2** stabilization layer: **Mutation Guard** routes genuinely-risky global/config/permission/package mutations through the Requested-Scope Contract + Mutation Ledger (`safety:mutation-callsite-coverage` fails any unguarded, unallowlisted risky call site); `release:check:dynamic:execute` is the real **caching gate runner** (schema v2, real/heavy gates deferred to `release:real-check`, dynamic-only cannot authorize publish); the **Core Skill** deployed snapshot is read by the route runtime and recorded in `agent-proof-evidence.json` (`selected_core_skill`), with promotions written to the mutation ledger; and `sks doctor` exposes an explicit **`zellij_readiness`** block (`zellij:doctor-readiness`). See `docs/dynamic-release-pipeline.md`.
26
26
 
@@ -76,7 +76,7 @@ dependencies = [
76
76
 
77
77
  [[package]]
78
78
  name = "sks-core"
79
- version = "1.21.1"
79
+ version = "1.21.3"
80
80
  dependencies = [
81
81
  "serde_json",
82
82
  ]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "sks-core"
3
- version = "1.21.1"
3
+ version = "1.21.3"
4
4
  edition = "2021"
5
5
 
6
6
  [dependencies]
@@ -4,7 +4,7 @@ use std::io::{self, Read, Seek, SeekFrom};
4
4
  fn main() {
5
5
  let mut args = std::env::args().skip(1);
6
6
  match args.next().as_deref() {
7
- Some("--version") => println!("sks-rs 1.21.1"),
7
+ Some("--version") => println!("sks-rs 1.21.3"),
8
8
  Some("compact-info") => {
9
9
  let mut input = String::new();
10
10
  let _ = io::stdin().read_to_string(&mut input);
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schema": "sks.dist-build-stamp.v1",
3
3
  "package_name": "sneakoscope",
4
- "package_version": "1.21.1",
5
- "source_digest": "a0c970633ae67e63cd3667675e1a590e0d0e26caefd55f7f812764c7f8b8f869",
6
- "source_file_count": 1752,
7
- "built_at_source_time": 1780307630901
4
+ "package_version": "1.21.3",
5
+ "source_digest": "fdee4bb2a16e87fbf85b069519a8c545b16b2d6fe64ad9da30b5e765ee555887",
6
+ "source_file_count": 1755,
7
+ "built_at_source_time": 1780312892629
8
8
  }
package/dist/bin/sks.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const FAST_PACKAGE_VERSION = '1.21.1';
2
+ const FAST_PACKAGE_VERSION = '1.21.3';
3
3
  const args = process.argv.slice(2);
4
4
  try {
5
5
  if (args[0] === '--agent' && args[1] === 'worker') {
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "schema": "sks.dist-build.v2",
3
- "version": "1.21.1",
4
- "package_version": "1.21.1",
3
+ "version": "1.21.3",
4
+ "package_version": "1.21.3",
5
5
  "typescript": true,
6
6
  "mjs_runtime_files": 0,
7
7
  "compiled_file_count": 1022,
8
8
  "compiled_js_count": 511,
9
9
  "compiled_dts_count": 511,
10
- "source_digest": "a0c970633ae67e63cd3667675e1a590e0d0e26caefd55f7f812764c7f8b8f869",
11
- "source_file_count": 1752,
12
- "source_files_hash": "6b8e7de7bcab2c6ddd83d31e15d7219e9d3f595813a1ec8173936208d3c877ef",
13
- "source_list_hash": "6b8e7de7bcab2c6ddd83d31e15d7219e9d3f595813a1ec8173936208d3c877ef",
10
+ "source_digest": "fdee4bb2a16e87fbf85b069519a8c545b16b2d6fe64ad9da30b5e765ee555887",
11
+ "source_file_count": 1755,
12
+ "source_files_hash": "e6487058a1a0894c6b8a629b64319d45be1ad9a0658ab422a39969c1e39ad7e3",
13
+ "source_list_hash": "e6487058a1a0894c6b8a629b64319d45be1ad9a0658ab422a39969c1e39ad7e3",
14
14
  "src_mjs_runtime_files": 0,
15
15
  "dist_stamp_schema": "sks.dist-build-stamp.v1",
16
16
  "files": [
@@ -336,7 +336,7 @@ export declare function ensureGlobalCodexFastModeDuringInstall(opts?: any): Prom
336
336
  backup_path?: never;
337
337
  parse_smoke?: never;
338
338
  }>;
339
- export declare function normalizeCodexFastModeUiConfig(text?: any): string;
339
+ export declare function normalizeCodexFastModeUiConfig(text?: any, opts?: any): string;
340
340
  export declare function safeWriteCodexConfigToml(configPath: string, current: string, next: string, tag?: string): Promise<{
341
341
  ok: boolean;
342
342
  status: string;
@@ -1479,7 +1479,7 @@ export async function ensureGlobalCodexFastModeDuringInstall(opts = {}) {
1479
1479
  return { status: 'unparseable_config_preserved', config_path: configPath, backup_path: backupPath, parse_smoke: currentSmoke };
1480
1480
  }
1481
1481
  }
1482
- const next = normalizeCodexFastModeUiConfig(current);
1482
+ const next = normalizeCodexFastModeUiConfig(current, { forceFastMode: opts.forceFastMode === true });
1483
1483
  if (next === ensureTrailingNewline(current))
1484
1484
  return { status: 'present', config_path: configPath };
1485
1485
  // Safety gate 2: never WRITE a config that would not parse.
@@ -1495,12 +1495,12 @@ export async function ensureGlobalCodexFastModeDuringInstall(opts = {}) {
1495
1495
  return { status: 'failed', config_path: configPath, error: err.message };
1496
1496
  }
1497
1497
  }
1498
- export function normalizeCodexFastModeUiConfig(text = '') {
1498
+ export function normalizeCodexFastModeUiConfig(text = '', opts = {}) {
1499
1499
  // Run to a fixed point so a second install is a true no-op (idempotent). The per-pass
1500
1500
  // table/whitespace normalization converges within one extra pass.
1501
- return normalizeCodexFastModeUiConfigOnce(normalizeCodexFastModeUiConfigOnce(text));
1501
+ return normalizeCodexFastModeUiConfigOnce(normalizeCodexFastModeUiConfigOnce(text, opts), opts);
1502
1502
  }
1503
- function normalizeCodexFastModeUiConfigOnce(text = '') {
1503
+ function normalizeCodexFastModeUiConfigOnce(text = '', opts = {}) {
1504
1504
  // Preserve user-owned top-level scalars (model / service_tier / model_reasoning_effort):
1505
1505
  // SKS only supplies a default when the user has not chosen one, and never strips the
1506
1506
  // user's own reasoning effort. SKS continues to manage its own namespaced tables below
@@ -1509,7 +1509,9 @@ function normalizeCodexFastModeUiConfigOnce(text = '') {
1509
1509
  next = removeTomlTableKey(next, 'notice', 'fast_default_opt_out');
1510
1510
  next = removeTomlTableKey(next, 'features', 'codex_hooks');
1511
1511
  next = upsertTopLevelTomlStringIfAbsent(next, 'model', 'gpt-5.5');
1512
- next = upsertTopLevelTomlStringIfAbsent(next, 'service_tier', 'fast');
1512
+ next = opts.forceFastMode === true
1513
+ ? upsertTopLevelTomlString(next, 'service_tier', 'fast')
1514
+ : upsertTopLevelTomlStringIfAbsent(next, 'service_tier', 'fast');
1513
1515
  // Codex App feature flags / fast-mode UI / suppress-warning are SET-IF-ABSENT: a fresh
1514
1516
  // config still gets SKS's defaults, but SKS NEVER overrides (re-enables) a feature the
1515
1517
  // user disabled in the App, and never rejects-then-hides UI by forcing an unrecognized
@@ -1522,9 +1524,16 @@ function normalizeCodexFastModeUiConfigOnce(text = '') {
1522
1524
  'guardian_approval = true', 'tool_suggest = true', 'apps = true', 'plugins = true'
1523
1525
  ])
1524
1526
  next = upsertTomlTableKeyIfAbsent(next, 'features', featureLine);
1525
- next = upsertTomlTableKeyIfAbsent(next, 'user.fast_mode', 'visible = true');
1526
- next = upsertTomlTableKeyIfAbsent(next, 'user.fast_mode', 'enabled = true');
1527
- next = upsertTomlTableKeyIfAbsent(next, 'user.fast_mode', 'default_profile = "sks-fast-high"');
1527
+ if (opts.forceFastMode === true) {
1528
+ next = upsertTomlTableKey(next, 'user.fast_mode', 'visible = true');
1529
+ next = upsertTomlTableKey(next, 'user.fast_mode', 'enabled = true');
1530
+ next = upsertTomlTableKey(next, 'user.fast_mode', 'default_profile = "sks-fast-high"');
1531
+ }
1532
+ else {
1533
+ next = upsertTomlTableKeyIfAbsent(next, 'user.fast_mode', 'visible = true');
1534
+ next = upsertTomlTableKeyIfAbsent(next, 'user.fast_mode', 'enabled = true');
1535
+ next = upsertTomlTableKeyIfAbsent(next, 'user.fast_mode', 'default_profile = "sks-fast-high"');
1536
+ }
1528
1537
  // Keep ONLY the sks-fast-high config-profile table: the Codex App fast-mode
1529
1538
  // (`[user.fast_mode] default_profile = "sks-fast-high"`) and the
1530
1539
  // codex-app:ui-preservation gate still expect it. The other SKS config profiles are
@@ -511,6 +511,7 @@ export declare function run(command: any, args?: any): Promise<void | {
511
511
  status: string;
512
512
  blockers: string[];
513
513
  };
514
+ visual_lane_count?: never;
514
515
  native_cli_session_proof?: never;
515
516
  no_subagent_scaling_policy?: never;
516
517
  fast_mode_policy?: never;
@@ -578,6 +579,7 @@ export declare function run(command: any, args?: any): Promise<void | {
578
579
  requested_work_items: number;
579
580
  actual_total_work_items: any;
580
581
  target_active_slots: number;
582
+ visual_lane_count: number;
581
583
  minimum_work_items: number;
582
584
  scheduler: {
583
585
  schema: string;
@@ -974,6 +976,7 @@ export declare function run(command: any, args?: any): Promise<void | {
974
976
  all_generations_closed: boolean;
975
977
  scheduler_state: string;
976
978
  target_active_slots: number;
979
+ visual_lane_count: number;
977
980
  requested_work_items: number;
978
981
  actual_total_work_items: number;
979
982
  minimum_work_items: number;
@@ -29,6 +29,7 @@ export declare function run(_command: any, args?: any): Promise<void | {
29
29
  zellij_socket_dir_source: import("../core/zellij/zellij-command.js").ZellijSocketDirSource;
30
30
  clipboard_config_path: string;
31
31
  clipboard_copy_command: string;
32
+ clipboard_mouse_mode: boolean;
32
33
  pane_proof_path: string;
33
34
  pane_proof: {
34
35
  schema: string;
@@ -360,6 +360,7 @@ export declare function run(command: any, args?: any): Promise<void | {
360
360
  status: string;
361
361
  blockers: string[];
362
362
  };
363
+ visual_lane_count?: never;
363
364
  native_cli_session_proof?: never;
364
365
  no_subagent_scaling_policy?: never;
365
366
  fast_mode_policy?: never;
@@ -427,6 +428,7 @@ export declare function run(command: any, args?: any): Promise<void | {
427
428
  requested_work_items: number;
428
429
  actual_total_work_items: any;
429
430
  target_active_slots: number;
431
+ visual_lane_count: number;
430
432
  minimum_work_items: number;
431
433
  scheduler: {
432
434
  schema: string;
@@ -823,6 +825,7 @@ export declare function run(command: any, args?: any): Promise<void | {
823
825
  all_generations_closed: boolean;
824
826
  scheduler_state: string;
825
827
  target_active_slots: number;
828
+ visual_lane_count: number;
826
829
  requested_work_items: number;
827
830
  actual_total_work_items: number;
828
831
  minimum_work_items: number;
@@ -6,6 +6,7 @@ export declare function readAgentGateStatus(root: string, missionId: string): Pr
6
6
  source: string;
7
7
  proof: any;
8
8
  gate: any;
9
+ expected_agent_count: number;
9
10
  all_sessions_closed: boolean;
10
11
  }>;
11
12
  //# sourceMappingURL=agent-gate.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { AGENT_INTAKE_STAGE_ID } from './agent-schema.js';
3
+ import { AGENT_INTAKE_STAGE_ID, DEFAULT_AGENT_COUNT } from './agent-schema.js';
4
4
  async function exists(file) {
5
5
  try {
6
6
  await fs.access(file);
@@ -22,8 +22,16 @@ export async function readAgentGateStatus(root, missionId) {
22
22
  const dir = path.join(root, '.sneakoscope', 'missions', missionId);
23
23
  const proofPath = path.join(dir, 'agents', 'agent-proof-evidence.json');
24
24
  const gatePath = path.join(dir, 'agent-gate.json');
25
+ const policyPath = path.join(dir, 'agents', 'agent-concurrency-policy.json');
26
+ const teamPlanPath = path.join(dir, 'team-plan.json');
25
27
  const proof = await readJson(proofPath, null);
26
28
  const gate = await readJson(gatePath, null);
29
+ const policy = await readJson(policyPath, null);
30
+ const teamPlan = await readJson(teamPlanPath, null);
31
+ const expectedAgentCount = Math.max(DEFAULT_AGENT_COUNT, Number(gate?.expected_agent_count ||
32
+ teamPlan?.bundle_size ||
33
+ policy?.agents ||
34
+ DEFAULT_AGENT_COUNT) || DEFAULT_AGENT_COUNT);
27
35
  const missing = [];
28
36
  if (!(await exists(proofPath)))
29
37
  missing.push('agents/agent-proof-evidence.json');
@@ -32,8 +40,11 @@ export async function readAgentGateStatus(root, missionId) {
32
40
  blockers.push('agent_proof_not_ok');
33
41
  if (proof?.status !== 'passed')
34
42
  blockers.push('agent_proof_status_not_passed');
35
- if (Number(proof?.agent_count || 0) < 5)
43
+ const agentCount = Number(proof?.agent_count || 0);
44
+ if (agentCount < DEFAULT_AGENT_COUNT)
36
45
  blockers.push('agent_count_below_5');
46
+ if (agentCount < expectedAgentCount)
47
+ blockers.push('agent_count_below_expected');
37
48
  if (proof?.no_overlap_ok !== true)
38
49
  blockers.push('agent_no_overlap_not_ok');
39
50
  if (proof?.ledger_hash_chain_ok !== true)
@@ -52,6 +63,7 @@ export async function readAgentGateStatus(root, missionId) {
52
63
  source: proofPath,
53
64
  proof,
54
65
  gate,
66
+ expected_agent_count: expectedAgentCount,
55
67
  all_sessions_closed: sessionsClosed
56
68
  };
57
69
  }
@@ -127,6 +127,7 @@ export declare function runNativeAgentOrchestrator(opts?: AgentRunOptions): Prom
127
127
  status: string;
128
128
  blockers: string[];
129
129
  };
130
+ visual_lane_count?: never;
130
131
  native_cli_session_proof?: never;
131
132
  no_subagent_scaling_policy?: never;
132
133
  fast_mode_policy?: never;
@@ -194,6 +195,7 @@ export declare function runNativeAgentOrchestrator(opts?: AgentRunOptions): Prom
194
195
  requested_work_items: number;
195
196
  actual_total_work_items: any;
196
197
  target_active_slots: number;
198
+ visual_lane_count: number;
197
199
  minimum_work_items: number;
198
200
  scheduler: {
199
201
  schema: string;
@@ -590,6 +592,7 @@ export declare function runNativeAgentOrchestrator(opts?: AgentRunOptions): Prom
590
592
  all_generations_closed: boolean;
591
593
  scheduler_state: string;
592
594
  target_active_slots: number;
595
+ visual_lane_count: number;
593
596
  requested_work_items: number;
594
597
  actual_total_work_items: number;
595
598
  minimum_work_items: number;
@@ -79,6 +79,7 @@ export async function runNativeAgentOrchestrator(opts = {}) {
79
79
  })
80
80
  }));
81
81
  const targetActiveSlots = normalizeTargetActiveSlots(opts.targetActiveSlots ?? opts.agents ?? roster.agent_count, maxAgentCount);
82
+ const visualLaneCount = normalizeVisualLaneCount(opts.visualLaneCount ?? opts.clones ?? opts.agents ?? roster.agent_count, roster.agent_count, maxAgentCount);
82
83
  const desiredWorkItemCount = normalizeDesiredWorkItemCount(opts.desiredWorkItemCount, opts.minimumWorkItems, targetActiveSlots);
83
84
  const minimumWorkItems = normalizeMinimumWorkItems(opts.minimumWorkItems, targetActiveSlots);
84
85
  const sourceIntelligence = await runSourceIntelligence({ root, missionDir: dir, route, query: prompt, offline: true, context7Available: true });
@@ -195,7 +196,7 @@ export async function runNativeAgentOrchestrator(opts = {}) {
195
196
  await writeIntelligentWorkGraphArtifacts(ledgerRoot, partition.intelligent_work_graph);
196
197
  await writeScoutPolicyArtifact(ledgerRoot);
197
198
  await writeZellijRightLaneCockpit(ledgerRoot, { missionId, sessionName: `sks-${missionId}`, agents: roster.roster });
198
- await initializeZellijLaneSupervisor(ledgerRoot, { missionId, sessionName: `sks-${missionId}`, targetActiveSlots, launchRealZellij: realZellij });
199
+ await initializeZellijLaneSupervisor(ledgerRoot, { missionId, sessionName: `sks-${missionId}`, targetActiveSlots: visualLaneCount, launchRealZellij: realZellij });
199
200
  await writeZellijPaneProof(root, { missionId, require: realZellijProofRequired, phase: 'initial', ledgerRoot });
200
201
  await writeAgentCodexCockpitArtifacts(dir, { missionId, projectHash: namespace.root_hash });
201
202
  await writeJsonAtomic(path.join(ledgerRoot, 'agent-no-overlap-proof.json'), partition.no_overlap_proof || { schema: 'sks.agent-no-overlap-proof.v1', ok: false, blockers: ['missing_no_overlap_proof'] });
@@ -209,6 +210,7 @@ export async function runNativeAgentOrchestrator(opts = {}) {
209
210
  concurrency: roster.concurrency,
210
211
  batch_count: 0,
211
212
  target_active_slots: targetActiveSlots,
213
+ visual_lane_count: visualLaneCount,
212
214
  desired_work_items: desiredWorkItemCount,
213
215
  minimum_work_items: minimumWorkItems,
214
216
  requested_work_items: desiredWorkItemCount,
@@ -404,6 +406,7 @@ export async function runNativeAgentOrchestrator(opts = {}) {
404
406
  minimumWorkItems,
405
407
  targetActiveSlots,
406
408
  realParallel: backend === 'codex-exec' && opts.mock !== true,
409
+ visualLaneCount,
407
410
  roster,
408
411
  partition,
409
412
  consensus,
@@ -442,6 +445,7 @@ export async function runNativeAgentOrchestrator(opts = {}) {
442
445
  requested_work_items: desiredWorkItemCount,
443
446
  actual_total_work_items: partition.task_graph?.total_work_items || partition.slices.length,
444
447
  target_active_slots: targetActiveSlots,
448
+ visual_lane_count: visualLaneCount,
445
449
  minimum_work_items: minimumWorkItems,
446
450
  scheduler,
447
451
  source_intelligence: sourceIntelligenceRef,
@@ -724,6 +728,16 @@ function normalizeMinimumWorkItems(value, targetActiveSlots) {
724
728
  return Math.max(1, Math.floor(targetActiveSlots));
725
729
  return Math.max(1, Math.floor(parsed));
726
730
  }
731
+ function normalizeVisualLaneCount(value, fallback, maxAgentCount) {
732
+ const parsed = Number(value);
733
+ const fallbackCount = Number(fallback);
734
+ const raw = Number.isFinite(parsed) && parsed > 0
735
+ ? parsed
736
+ : Number.isFinite(fallbackCount) && fallbackCount > 0
737
+ ? fallbackCount
738
+ : 1;
739
+ return Math.max(1, Math.min(maxAgentCount, Math.floor(raw)));
740
+ }
727
741
  function isWriteCapableRun(opts) {
728
742
  return opts.applyPatches === true || opts.dryRunPatches === true || (opts.writeMode !== undefined && opts.writeMode !== 'off');
729
743
  }
@@ -7,6 +7,7 @@ export declare function writeAgentProofEvidence(root: string, input: {
7
7
  requestedWorkItems?: number;
8
8
  minimumWorkItems?: number;
9
9
  targetActiveSlots?: number;
10
+ visualLaneCount?: number;
10
11
  realParallel?: boolean;
11
12
  roster?: any;
12
13
  partition?: any;
@@ -97,6 +98,7 @@ export declare function writeAgentProofEvidence(root: string, input: {
97
98
  all_generations_closed: boolean;
98
99
  scheduler_state: string;
99
100
  target_active_slots: number;
101
+ visual_lane_count: number;
100
102
  requested_work_items: number;
101
103
  actual_total_work_items: number;
102
104
  minimum_work_items: number;
@@ -47,6 +47,7 @@ export async function writeAgentProofEvidence(root, input) {
47
47
  const workQueueTotalWorkItems = Number(workQueue?.total_work_items || 0);
48
48
  const schedulerTotalWorkItems = Number(scheduler?.total_work_items || 0);
49
49
  const targetActiveSlots = Number(input.targetActiveSlots || scheduler?.target_active_slots || taskGraph?.target_active_slots || input.roster?.agent_count || 0);
50
+ const visualLaneCount = Number(input.visualLaneCount || zellijLanes?.lane_count || laneSupervisor?.lane_count || targetActiveSlots || 0);
50
51
  const minimumWorkItems = Number(input.minimumWorkItems || taskGraph?.minimum_work_items || targetActiveSlots || 0);
51
52
  const taskGraphMatchesCliOptions = Boolean(taskGraph) && requestedWorkItems === taskGraphTotalWorkItems && targetActiveSlots === Number(taskGraph.target_active_slots || 0);
52
53
  const workQueueMatchesTaskGraph = Boolean(workQueue && taskGraph) && workQueueTotalWorkItems === taskGraphTotalWorkItems;
@@ -111,6 +112,7 @@ export async function writeAgentProofEvidence(root, input) {
111
112
  ...(terminalCloseReportCount < generationCount ? ['terminal_close_report_count_below_generation_count'] : []),
112
113
  ...(slots && slots.all_slots_closed_after_drain !== true ? ['agent_worker_slots_not_closed_after_drain'] : []),
113
114
  ...(!laneSupervisor ? ['zellij_lane_supervisor_missing'] : []),
115
+ ...(laneSupervisor && visualLaneCount > 0 && Number(laneSupervisor.lane_count || 0) < visualLaneCount ? ['zellij_lane_count_below_visual_lane_count'] : []),
114
116
  ...(laneSupervisor && laneSupervisor.no_flicker_verified !== true ? ['zellij_lane_no_flicker_not_verified'] : []),
115
117
  ...(laneSupervisor && laneSupervisor.pane_survival_checked !== true ? ['zellij_lane_survival_not_checked'] : []),
116
118
  ...(laneSupervisor && Number(laneSupervisor.unexpected_close_count || 0) > 0 ? ['zellij_lane_unexpected_close_before_drain'] : []),
@@ -206,6 +208,7 @@ export async function writeAgentProofEvidence(root, input) {
206
208
  all_generations_closed: generations.ok,
207
209
  scheduler_state: 'agent-scheduler-state.json',
208
210
  target_active_slots: targetActiveSlots,
211
+ visual_lane_count: visualLaneCount,
209
212
  requested_work_items: requestedWorkItems,
210
213
  actual_total_work_items: taskGraphTotalWorkItems || schedulerTotalWorkItems,
211
214
  minimum_work_items: minimumWorkItems,
@@ -96,6 +96,7 @@ export interface AgentRunOptions {
96
96
  noFast?: boolean;
97
97
  nativeCliSwarm?: boolean;
98
98
  maxAgentCount?: number;
99
+ visualLaneCount?: number;
99
100
  clones?: number;
100
101
  narutoMode?: boolean;
101
102
  }
@@ -186,6 +186,7 @@ export declare function writeRouteCollaborationArtifacts(root: string, opts: {
186
186
  status: string;
187
187
  blockers: string[];
188
188
  };
189
+ visual_lane_count?: never;
189
190
  native_cli_session_proof?: never;
190
191
  no_subagent_scaling_policy?: never;
191
192
  fast_mode_policy?: never;
@@ -253,6 +254,7 @@ export declare function writeRouteCollaborationArtifacts(root: string, opts: {
253
254
  requested_work_items: number;
254
255
  actual_total_work_items: any;
255
256
  target_active_slots: number;
257
+ visual_lane_count: number;
256
258
  minimum_work_items: number;
257
259
  scheduler: {
258
260
  schema: string;
@@ -649,6 +651,7 @@ export declare function writeRouteCollaborationArtifacts(root: string, opts: {
649
651
  all_generations_closed: boolean;
650
652
  scheduler_state: string;
651
653
  target_active_slots: number;
654
+ visual_lane_count: number;
652
655
  requested_work_items: number;
653
656
  actual_total_work_items: number;
654
657
  minimum_work_items: number;
@@ -34,9 +34,13 @@ export async function updateZellijLaneSupervisorFromSlots(root, input) {
34
34
  targetActiveSlots: Math.max(1, input.slots.length || input.state?.target_active_slots || 1)
35
35
  });
36
36
  }
37
- const laneBySlot = new Map(supervisor.lanes.map((lane) => [lane.slot_id, lane]));
38
- const lanes = input.slots.map((slot, index) => {
39
- const previous = laneBySlot.get(slot.slot_id) || createLane(input.missionId, supervisor.session_name, index + 1, nowIso());
37
+ const slotById = new Map(input.slots.map((slot) => [slot.slot_id, slot]));
38
+ const laneCount = Math.max(supervisor.lanes.length, input.slots.length);
39
+ const lanes = Array.from({ length: laneCount }, (_, index) => {
40
+ const previous = supervisor.lanes[index] || createLane(input.missionId, supervisor.session_name, index + 1, nowIso());
41
+ const slot = slotById.get(previous.slot_id);
42
+ if (!slot)
43
+ return previous;
40
44
  return {
41
45
  ...previous,
42
46
  current_session_id: slot.current_session_id,
@@ -12,6 +12,57 @@ export declare function fastModeCommand(args?: string[]): Promise<void | {
12
12
  fast_mode: boolean;
13
13
  service_tier: import("../agents/fast-mode-policy.js").AgentServiceTier;
14
14
  disabled_by: "none" | "no-fast" | "service-tier-standard" | "preference-standard";
15
+ codex_fast_mode_repair: {
16
+ status: string;
17
+ reason: string;
18
+ config_path?: never;
19
+ backup_path?: never;
20
+ parse_smoke?: never;
21
+ error?: never;
22
+ } | {
23
+ status: string;
24
+ config_path: any;
25
+ backup_path: string | null;
26
+ parse_smoke: {
27
+ ok: boolean;
28
+ unterminated_multiline_string: boolean;
29
+ invalid_table_header: string | null;
30
+ };
31
+ reason?: never;
32
+ error?: never;
33
+ } | {
34
+ status: string;
35
+ config_path: any;
36
+ reason?: never;
37
+ backup_path?: never;
38
+ parse_smoke?: never;
39
+ error?: never;
40
+ } | {
41
+ status: string;
42
+ config_path: any;
43
+ parse_smoke: {
44
+ ok: boolean;
45
+ unterminated_multiline_string: boolean;
46
+ invalid_table_header: string | null;
47
+ };
48
+ reason?: never;
49
+ backup_path?: never;
50
+ error?: never;
51
+ } | {
52
+ status: string;
53
+ config_path: any;
54
+ backup_path: string | null;
55
+ reason?: never;
56
+ parse_smoke?: never;
57
+ error?: never;
58
+ } | {
59
+ status: string;
60
+ config_path: any;
61
+ error: any;
62
+ reason?: never;
63
+ backup_path?: never;
64
+ parse_smoke?: never;
65
+ } | null;
15
66
  policy: import("../agents/fast-mode-policy.js").FastModePolicy;
16
67
  dollar_commands: {
17
68
  on: string;
@@ -3,6 +3,7 @@ import { flag } from '../../cli/args.js';
3
3
  import { printJson } from '../../cli/output.js';
4
4
  import { projectRoot } from '../fsx.js';
5
5
  import { clearFastModePreference, fastModePreferencePath, readFastModePreference, resolveFastModePolicy, writeFastModePreference } from '../agents/fast-mode-policy.js';
6
+ import { ensureGlobalCodexFastModeDuringInstall } from '../../cli/install-helpers.js';
6
7
  export const FAST_MODE_COMMAND_SCHEMA = 'sks.fast-mode-command.v1';
7
8
  export async function fastModeCommand(args = []) {
8
9
  const action = normalizeFastModeAction(args[0]);
@@ -20,6 +21,9 @@ export async function fastModeCommand(args = []) {
20
21
  preference = null;
21
22
  }
22
23
  const policy = resolveFastModePolicy({ root });
24
+ const codexFastModeRepair = action === 'on'
25
+ ? await ensureGlobalCodexFastModeDuringInstall({ forceFastMode: true })
26
+ : null;
23
27
  const result = {
24
28
  schema: FAST_MODE_COMMAND_SCHEMA,
25
29
  ok: true,
@@ -31,6 +35,7 @@ export async function fastModeCommand(args = []) {
31
35
  fast_mode: policy.fast_mode,
32
36
  service_tier: policy.service_tier,
33
37
  disabled_by: policy.disabled_by,
38
+ codex_fast_mode_repair: codexFastModeRepair,
34
39
  policy,
35
40
  dollar_commands: {
36
41
  on: '$Fast-On',
@@ -511,6 +511,7 @@ export declare function imageUxReviewCommand(command: any, args?: any): Promise<
511
511
  status: string;
512
512
  blockers: string[];
513
513
  };
514
+ visual_lane_count?: never;
514
515
  native_cli_session_proof?: never;
515
516
  no_subagent_scaling_policy?: never;
516
517
  fast_mode_policy?: never;
@@ -578,6 +579,7 @@ export declare function imageUxReviewCommand(command: any, args?: any): Promise<
578
579
  requested_work_items: number;
579
580
  actual_total_work_items: any;
580
581
  target_active_slots: number;
582
+ visual_lane_count: number;
581
583
  minimum_work_items: number;
582
584
  scheduler: {
583
585
  schema: string;
@@ -974,6 +976,7 @@ export declare function imageUxReviewCommand(command: any, args?: any): Promise<
974
976
  all_generations_closed: boolean;
975
977
  scheduler_state: string;
976
978
  target_active_slots: number;
979
+ visual_lane_count: number;
977
980
  requested_work_items: number;
978
981
  actual_total_work_items: number;
979
982
  minimum_work_items: number;
@@ -29,6 +29,7 @@ export declare function madHighCommand(args?: any, deps?: any): Promise<void | {
29
29
  zellij_socket_dir_source: import("../zellij/zellij-command.js").ZellijSocketDirSource;
30
30
  clipboard_config_path: string;
31
31
  clipboard_copy_command: string;
32
+ clipboard_mouse_mode: boolean;
32
33
  pane_proof_path: string;
33
34
  pane_proof: {
34
35
  schema: string;
@@ -42,6 +42,7 @@ async function narutoRun(parsed) {
42
42
  agents: roster.agent_count,
43
43
  concurrency: activeSlots,
44
44
  targetActiveSlots: activeSlots,
45
+ visualLaneCount: roster.agent_count,
45
46
  desiredWorkItemCount: parsed.workItems,
46
47
  maxAgentCount: MAX_NARUTO_AGENT_COUNT,
47
48
  narutoMode: true,
@@ -84,7 +85,7 @@ async function narutoRun(parsed) {
84
85
  missionId: result.mission_id,
85
86
  ledgerRoot,
86
87
  kind: 'naruto',
87
- slotCount: summary.target_active_slots,
88
+ slotCount: summary.clones,
88
89
  dryRun: false,
89
90
  attach: false
90
91
  });
@@ -98,7 +99,7 @@ async function narutoRun(parsed) {
98
99
  console.log('Backend: ' + result.backend);
99
100
  console.log('Proof: ' + summary.proof);
100
101
  if (summary.zellij?.ok && summary.zellij.capability?.status === 'ok')
101
- console.log('Zellij: prepared ' + summary.target_active_slots + ' native session lane(s) in ' + summary.zellij.session_name);
102
+ console.log('Zellij: prepared ' + summary.clones + ' native clone lane(s) in ' + summary.zellij.session_name);
102
103
  else if (summary.zellij?.ok)
103
104
  console.log('Zellij: optional live panes unavailable (' + ((summary.zellij.warnings || []).join('; ') || summary.zellij.capability?.status || 'unknown') + ')');
104
105
  });
@@ -360,6 +360,7 @@ export declare function pptCommand(command: any, args?: any): Promise<void | {
360
360
  status: string;
361
361
  blockers: string[];
362
362
  };
363
+ visual_lane_count?: never;
363
364
  native_cli_session_proof?: never;
364
365
  no_subagent_scaling_policy?: never;
365
366
  fast_mode_policy?: never;
@@ -427,6 +428,7 @@ export declare function pptCommand(command: any, args?: any): Promise<void | {
427
428
  requested_work_items: number;
428
429
  actual_total_work_items: any;
429
430
  target_active_slots: number;
431
+ visual_lane_count: number;
430
432
  minimum_work_items: number;
431
433
  scheduler: {
432
434
  schema: string;
@@ -823,6 +825,7 @@ export declare function pptCommand(command: any, args?: any): Promise<void | {
823
825
  all_generations_closed: boolean;
824
826
  scheduler_state: string;
825
827
  target_active_slots: number;
828
+ visual_lane_count: number;
826
829
  requested_work_items: number;
827
830
  actual_total_work_items: number;
828
831
  minimum_work_items: number;
@@ -29,6 +29,7 @@ export async function team(args = []) {
29
29
  const opts = parseTeamCreateArgs(cleanCreateArgs);
30
30
  const { prompt, agentSessions, roleCounts, roster } = opts;
31
31
  const targetActiveSlots = readBoundedIntegerFlag(args, '--target-active-slots', roster.bundle_size, 1, 20);
32
+ const visualLaneCount = roster.bundle_size;
32
33
  const desiredWorkItemCount = readBoundedIntegerFlag(args, '--work-items', targetActiveSlots, 1, 200);
33
34
  const minimumWorkItems = readBoundedIntegerFlag(args, '--minimum-work-items', targetActiveSlots, 1, 200);
34
35
  const maxQueueExpansion = readBoundedIntegerFlag(args, '--max-queue-expansion', 10, 0, 200);
@@ -80,9 +81,9 @@ export async function team(args = []) {
80
81
  await writeFromChatImgArtifacts(dir, { missionId: id, requests: [{ verbatim: prompt }], ambiguities: ['image source inventory must be completed before implementation'] });
81
82
  let liveZellij = null;
82
83
  if (!mock && openZellij) {
83
- liveZellij = await launchTeamZellijView({ root, missionId: id, ledgerRoot: path.join(dir, 'agents'), slotCount: targetActiveSlots, dryRun: false, attach: false });
84
+ liveZellij = await launchTeamZellijView({ root, missionId: id, ledgerRoot: path.join(dir, 'agents'), slotCount: visualLaneCount, dryRun: false, attach: false });
84
85
  if (liveZellij?.ok && liveZellij.capability?.status === 'ok')
85
- console.log(`Zellij: prepared ${targetActiveSlots} native session lane(s) in ${liveZellij.session_name}. Attach with: ${liveZellij.attach_command_with_env || liveZellij.attach_command}`);
86
+ console.log(`Zellij: prepared ${visualLaneCount} native agent lane(s) in ${liveZellij.session_name}. Attach with: ${liveZellij.attach_command_with_env || liveZellij.attach_command}`);
86
87
  else if (liveZellij?.ok)
87
88
  console.log(`Zellij: optional live panes unavailable (${(liveZellij.warnings || []).join('; ') || liveZellij.capability?.status || 'unknown'}).`);
88
89
  else
@@ -97,6 +98,7 @@ export async function team(args = []) {
97
98
  mock,
98
99
  agents: roster.bundle_size,
99
100
  targetActiveSlots,
101
+ visualLaneCount,
100
102
  desiredWorkItemCount,
101
103
  minimumWorkItems,
102
104
  maxQueueExpansion,
@@ -145,6 +147,7 @@ export async function team(args = []) {
145
147
  agent_sessions: agentSessions,
146
148
  bundle_size: roster.bundle_size,
147
149
  target_active_slots: targetActiveSlots,
150
+ visual_lane_count: visualLaneCount,
148
151
  desired_work_items: desiredWorkItemCount,
149
152
  minimum_work_items: minimumWorkItems,
150
153
  max_queue_expansion: maxQueueExpansion,
@@ -167,7 +170,7 @@ export async function team(args = []) {
167
170
  result.proof = proof.validation;
168
171
  }
169
172
  else {
170
- result.zellij = liveZellij || await launchTeamZellijView({ root, missionId: id, ledgerRoot: path.join(dir, 'agents'), slotCount: targetActiveSlots, dryRun: jsonOutput || !openZellij, attach: false });
173
+ result.zellij = liveZellij || await launchTeamZellijView({ root, missionId: id, ledgerRoot: path.join(dir, 'agents'), slotCount: visualLaneCount, dryRun: jsonOutput || !openZellij, attach: false });
171
174
  if (openZellij && result.zellij?.ok && result.zellij.capability?.status === 'ok' && shouldAutoAttachTeamZellij(args))
172
175
  attachZellijSessionInteractive(result.zellij.session_name, { cwd: root });
173
176
  }
@@ -178,7 +181,7 @@ export async function team(args = []) {
178
181
  console.log(`Role counts: ${formatRoleCounts(roleCounts)}`);
179
182
  console.log(`Review policy: minimum ${MIN_TEAM_REVIEWER_LANES} reviewer/QA validation lanes`);
180
183
  if (result.zellij?.ok && result.zellij.capability?.status === 'ok')
181
- console.log(`Zellij: prepared ${targetActiveSlots} native session lane(s) in ${result.zellij.session_name}`);
184
+ console.log(`Zellij: prepared ${visualLaneCount} native agent lane(s) in ${result.zellij.session_name}`);
182
185
  else if (result.zellij?.ok)
183
186
  console.log(`Zellij: optional live panes unavailable (${(result.zellij.warnings || []).join('; ') || result.zellij.capability?.status || 'unknown'})`);
184
187
  else if (!mock)
@@ -427,11 +430,11 @@ async function inferTeamZellijSlotCount(dir, plan = {}) {
427
430
  const scheduler = await readJson(path.join(dir, 'agents', 'agent-scheduler-state.json'), null);
428
431
  const lanes = await readJson(path.join(dir, 'agents', 'agent-zellij-lanes.json'), null);
429
432
  const candidates = [
430
- scheduler?.target_active_slots,
433
+ plan?.bundle_size,
434
+ plan?.agent_session_count,
431
435
  lanes?.lane_count,
432
436
  plan?.target_active_slots,
433
- plan?.agent_session_count,
434
- plan?.bundle_size
437
+ scheduler?.target_active_slots
435
438
  ].map((value) => Number(value)).filter((value) => Number.isFinite(value) && value > 0);
436
439
  return Math.max(1, Math.min(100, Math.floor(candidates[0] || 5)));
437
440
  }
@@ -1,4 +1,4 @@
1
- export declare const PACKAGE_VERSION = "1.21.1";
1
+ export declare const PACKAGE_VERSION = "1.21.3";
2
2
  export declare const DEFAULT_PROCESS_TAIL_BYTES: number;
3
3
  export declare const DEFAULT_PROCESS_TIMEOUT_MS: number;
4
4
  export interface RunProcessOptions {
package/dist/core/fsx.js CHANGED
@@ -5,7 +5,7 @@ import os from 'node:os';
5
5
  import crypto from 'node:crypto';
6
6
  import { spawn } from 'node:child_process';
7
7
  import { fileURLToPath } from 'node:url';
8
- export const PACKAGE_VERSION = '1.21.1';
8
+ export const PACKAGE_VERSION = '1.21.3';
9
9
  export const DEFAULT_PROCESS_TAIL_BYTES = 256 * 1024;
10
10
  export const DEFAULT_PROCESS_TIMEOUT_MS = 30 * 60 * 1000;
11
11
  export function nowIso() {
@@ -84,25 +84,29 @@ async function ensureMockAgentEvidence(root, missionId, route, prompt) {
84
84
  await writeJsonAtomic(path.join(dir, 'agent-task-board.json'), { schema: 'sks.agent-task-board.v1', tasks: [] });
85
85
  if (!(await exists(path.join(dir, 'agent-janitor-report.json'))))
86
86
  await writeJsonAtomic(path.join(dir, 'agent-janitor-report.json'), { schema: 'sks.agent-janitor-report.v1', ok: true, mission_id: missionId, project_hash: null, blockers: [] });
87
- await writeJsonAtomic(path.join(dir, 'agent-concurrency-policy.json'), { schema: 'sks.agent-concurrency-policy.v1', agents: DEFAULT_AGENT_COUNT, concurrency: DEFAULT_AGENT_COUNT, backend: 'fake' });
88
- await writeJsonAtomic(path.join(dir, 'agent-proof-evidence.json'), {
89
- schema: 'sks.agent-proof-evidence.v1',
90
- ok: true,
91
- status: 'passed',
92
- mission_id: missionId,
93
- route,
94
- backend: 'fake',
95
- real_parallel_claim: false,
96
- fake_backend_disclaimer: 'fixture only; no real parallel execution claim',
97
- agent_count: DEFAULT_AGENT_COUNT,
98
- max_agents: 20,
99
- all_sessions_closed: true,
100
- ledger_hash_chain_ok: true,
101
- no_overlap_ok: true,
102
- consensus_ok: true,
103
- janitor_report: 'agents/agent-janitor-report.json',
104
- janitor_ok: true,
105
- blockers: []
106
- });
87
+ if (!(await exists(path.join(dir, 'agent-concurrency-policy.json')))) {
88
+ await writeJsonAtomic(path.join(dir, 'agent-concurrency-policy.json'), { schema: 'sks.agent-concurrency-policy.v1', agents: DEFAULT_AGENT_COUNT, concurrency: DEFAULT_AGENT_COUNT, backend: 'fake' });
89
+ }
90
+ if (!(await exists(path.join(dir, 'agent-proof-evidence.json')))) {
91
+ await writeJsonAtomic(path.join(dir, 'agent-proof-evidence.json'), {
92
+ schema: 'sks.agent-proof-evidence.v1',
93
+ ok: true,
94
+ status: 'passed',
95
+ mission_id: missionId,
96
+ route,
97
+ backend: 'fake',
98
+ real_parallel_claim: false,
99
+ fake_backend_disclaimer: 'fixture only; no real parallel execution claim',
100
+ agent_count: DEFAULT_AGENT_COUNT,
101
+ max_agents: 20,
102
+ all_sessions_closed: true,
103
+ ledger_hash_chain_ok: true,
104
+ no_overlap_ok: true,
105
+ consensus_ok: true,
106
+ janitor_report: 'agents/agent-janitor-report.json',
107
+ janitor_ok: true,
108
+ blockers: []
109
+ });
110
+ }
107
111
  }
108
112
  //# sourceMappingURL=auto-finalize.js.map
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "1.21.1";
1
+ export declare const PACKAGE_VERSION = "1.21.3";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,2 +1,2 @@
1
- export const PACKAGE_VERSION = '1.21.1';
1
+ export const PACKAGE_VERSION = '1.21.3';
2
2
  //# sourceMappingURL=version.js.map
@@ -3,6 +3,7 @@ export interface ZellijClipboardConfig {
3
3
  copy_command: string;
4
4
  copy_clipboard: 'system' | 'primary';
5
5
  copy_on_select: boolean;
6
+ mouse_mode: boolean;
6
7
  /** Flags to append to the `zellij ... options` subcommand for the created session. */
7
8
  optionFlags: string[];
8
9
  /** Path to a dedicated config.kdl for the interactive attach (delivered via ZELLIJ_CONFIG_FILE). */
@@ -16,6 +17,7 @@ export declare function buildZellijClipboardKdl(cfg: {
16
17
  copy_command: string;
17
18
  copy_clipboard: 'system' | 'primary';
18
19
  copy_on_select: boolean;
20
+ mouse_mode: boolean;
19
21
  }): string;
20
22
  export declare function writeZellijClipboardConfig(root: string, missionId: string, platform?: NodeJS.Platform): Promise<ZellijClipboardConfig>;
21
23
  //# sourceMappingURL=zellij-clipboard-config.d.ts.map
@@ -3,11 +3,10 @@ import { ensureDir, nowIso, writeTextAtomic } from '../fsx.js';
3
3
  // Single source of truth for the Zellij clipboard pipeline used by `sks --mad`
4
4
  // (and any other SKS-launched Zellij session). By default Zellij copies via the
5
5
  // OSC 52 escape sequence, which several macOS terminals (Terminal.app always,
6
- // some iTerm2 configs) silently drop so text selected inside a pane never
7
- // reaches the system clipboard. Setting copy_command="pbcopy" pipes selections
8
- // straight to the macOS clipboard, and copy_on_select=true makes a mouse drag
9
- // copy without entering copy mode. (Shift+drag still falls back to native
10
- // terminal selection regardless.)
6
+ // some iTerm2 configs) silently drop, and mouse_mode can intercept native
7
+ // terminal selections so Cmd+C has nothing to copy. Setting copy_command="pbcopy"
8
+ // keeps Zellij's copy action wired to the macOS clipboard, while mouse_mode=false
9
+ // leaves drag-select + Cmd+C to the terminal.
11
10
  export const ZELLIJ_CLIPBOARD_CONFIG_SCHEMA = 'sks.zellij-clipboard-config.v1';
12
11
  /** Pick the platform-correct clipboard command. macOS is the primary target. */
13
12
  export function resolveCopyCommand(platform = process.platform, env = process.env) {
@@ -25,6 +24,7 @@ function kdlString(value) {
25
24
  export function buildZellijClipboardKdl(cfg) {
26
25
  return [
27
26
  '// Generated by Sneakoscope (sks) so launched Zellij sessions copy to the OS clipboard.',
27
+ `mouse_mode ${cfg.mouse_mode ? 'true' : 'false'}`,
28
28
  `copy_command ${kdlString(cfg.copy_command)}`,
29
29
  `copy_clipboard ${kdlString(cfg.copy_clipboard)}`,
30
30
  `copy_on_select ${cfg.copy_on_select ? 'true' : 'false'}`,
@@ -35,18 +35,21 @@ export async function writeZellijClipboardConfig(root, missionId, platform = pro
35
35
  const copy_command = resolveCopyCommand(platform);
36
36
  const copy_clipboard = 'system';
37
37
  const copy_on_select = true;
38
+ const mouse_mode = false;
38
39
  const dir = path.join(root, '.sneakoscope', 'missions', missionId);
39
40
  await ensureDir(dir);
40
41
  const config_path = path.join(dir, 'zellij-clipboard.kdl');
41
- await writeTextAtomic(config_path, buildZellijClipboardKdl({ copy_command, copy_clipboard, copy_on_select }));
42
+ await writeTextAtomic(config_path, buildZellijClipboardKdl({ copy_command, copy_clipboard, copy_on_select, mouse_mode }));
42
43
  return {
43
44
  copy_command,
44
45
  copy_clipboard,
45
46
  copy_on_select,
46
- // Appended AFTER `--default-layout <path>` in the create command. The `options`
47
- // subcommand sets these on the *created* background session; per Zellij CLI docs
48
- // the value formats are: --copy-on-select true|false, --copy-clipboard system|primary.
49
- optionFlags: ['--copy-command', copy_command, '--copy-clipboard', copy_clipboard, '--copy-on-select', String(copy_on_select)],
47
+ mouse_mode,
48
+ // Appended AFTER `--default-layout <path>` in the create command. Zellij treats
49
+ // --copy-command as mutually exclusive with --copy-clipboard (OSC52 target), so
50
+ // only pass the command and copy-on-select flags on the CLI. The generated KDL
51
+ // still records copy_clipboard for config-file consumers that use OSC52.
52
+ optionFlags: ['--copy-command', copy_command, '--copy-on-select', String(copy_on_select), '--mouse-mode', String(mouse_mode)],
50
53
  config_path,
51
54
  generated_at: nowIso()
52
55
  };
@@ -46,6 +46,7 @@ export declare function launchZellijLayout(opts?: ZellijLaunchOptions): Promise<
46
46
  zellij_socket_dir_source: import("./zellij-command.js").ZellijSocketDirSource;
47
47
  clipboard_config_path: string;
48
48
  clipboard_copy_command: string;
49
+ clipboard_mouse_mode: boolean;
49
50
  pane_proof_path: string;
50
51
  pane_proof: {
51
52
  schema: string;
@@ -109,6 +110,7 @@ export declare function launchMadZellijUi(args?: readonly unknown[], opts?: Zell
109
110
  zellij_socket_dir_source: import("./zellij-command.js").ZellijSocketDirSource;
110
111
  clipboard_config_path: string;
111
112
  clipboard_copy_command: string;
113
+ clipboard_mouse_mode: boolean;
112
114
  pane_proof_path: string;
113
115
  pane_proof: {
114
116
  schema: string;
@@ -172,6 +174,7 @@ export declare function launchTeamZellijView(opts?: ZellijLaunchOptions): Promis
172
174
  zellij_socket_dir_source: import("./zellij-command.js").ZellijSocketDirSource;
173
175
  clipboard_config_path: string;
174
176
  clipboard_copy_command: string;
177
+ clipboard_mouse_mode: boolean;
175
178
  pane_proof_path: string;
176
179
  pane_proof: {
177
180
  schema: string;
@@ -95,6 +95,7 @@ export async function launchZellijLayout(opts = {}) {
95
95
  zellij_socket_dir_source: zellijEnv.zellij_socket_dir_source,
96
96
  clipboard_config_path: clipboard.config_path,
97
97
  clipboard_copy_command: clipboard.copy_command,
98
+ clipboard_mouse_mode: clipboard.mouse_mode,
98
99
  pane_proof_path: path.join(root, '.sneakoscope', 'missions', missionId, 'zellij-pane-proof.json'),
99
100
  pane_proof: paneProof,
100
101
  dry_run: opts.dryRun === true,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sneakoscope",
3
3
  "displayName": "ㅅㅋㅅ",
4
- "version": "1.21.1",
4
+ "version": "1.21.3",
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",
@@ -94,6 +94,7 @@
94
94
  "release:gate-budget": "node ./scripts/release-gate-budget-check.mjs",
95
95
  "agent:wiki-context-proof": "node ./scripts/agent-wiki-context-proof-check.mjs",
96
96
  "prepublish:fast-check": "node ./scripts/prepublish-fast-check.mjs",
97
+ "prepublish:release-check-or-fast": "node ./scripts/prepublish-release-check-or-fast.mjs",
97
98
  "mad:preflight-blocks-unreadable-config": "node ./scripts/mad-preflight-blocks-unreadable-config-check.mjs",
98
99
  "codex:0.135-compat": "node ./scripts/codex-0-135-compat-check.mjs",
99
100
  "codex:0.135-compat:require-real": "node ./scripts/codex-0-135-compat-check.mjs --require-real",
@@ -246,10 +247,10 @@
246
247
  "release:check": "npm run release:check:parallel && npm run release:version-truth && 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 zellij:lane-renderer && npm run mad-sks:zellij-launch && 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 codex:0.134-runner-truth && npm run agent:native-cli-session-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 ./scripts/release-check-stamp.mjs write && npm run release:readiness --silent && node ./scripts/release-check-stamp.mjs write",
247
248
  "release:real-check": "node ./scripts/release-real-check.mjs",
248
249
  "release:publish": "npm run publish:npm",
249
- "publish:dry": "npm run release:metadata && npm run release:version-truth && npm run publish:packlist-performance && npm run prepublish:fast-check && node ./scripts/release-check-stamp.mjs 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",
250
+ "publish:dry": "npm run release:metadata && npm run release:version-truth && npm run publish:packlist-performance && npm run prepublish:release-check-or-fast && node ./scripts/release-check-stamp.mjs 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",
250
251
  "publish:npm": "npm --cache /tmp/sks-npm-cache publish --registry https://registry.npmjs.org/ --access public",
251
252
  "prepack": "npm run build",
252
- "prepublishOnly": "npm run release:metadata && npm run release:version-truth && npm run release:dist-freshness && npm run publish:packlist-performance && npm run prepublish:fast-check && node ./scripts/check-publish-tag.mjs && node ./scripts/release-check-stamp.mjs verify && npm run release:provenance -- --publish && node ./scripts/release-registry-check.mjs --require-unpublished",
253
+ "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 ./scripts/check-publish-tag.mjs && node ./scripts/release-check-stamp.mjs verify && npm run release:provenance -- --publish && node ./scripts/release-registry-check.mjs --require-unpublished",
253
254
  "dist:check": "node ./scripts/check-dist-runtime.mjs",
254
255
  "ux-review:run-wires-imagegen": "node ./scripts/ux-review-run-wires-imagegen-check.mjs",
255
256
  "ux-review:extract-wires-real-extractor": "node ./scripts/ux-review-extract-wires-real-extractor-check.mjs",