sneakoscope 1.21.2 → 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.
- package/README.md +2 -2
- 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 +6 -6
- package/dist/cli/install-helpers.d.ts +1 -1
- package/dist/cli/install-helpers.js +17 -8
- package/dist/commands/image-ux-review.d.ts +3 -0
- package/dist/commands/mad-sks.d.ts +1 -0
- package/dist/commands/ppt.d.ts +3 -0
- package/dist/core/agents/agent-gate.d.ts +1 -0
- package/dist/core/agents/agent-gate.js +14 -2
- package/dist/core/agents/agent-orchestrator.d.ts +3 -0
- package/dist/core/agents/agent-orchestrator.js +15 -1
- package/dist/core/agents/agent-proof-evidence.d.ts +2 -0
- package/dist/core/agents/agent-proof-evidence.js +3 -0
- package/dist/core/agents/agent-schema.d.ts +1 -0
- package/dist/core/agents/route-collaboration-ledger.d.ts +3 -0
- package/dist/core/agents/zellij-lane-supervisor.js +7 -3
- package/dist/core/commands/fast-mode-command.d.ts +51 -0
- package/dist/core/commands/fast-mode-command.js +5 -0
- package/dist/core/commands/image-ux-review-command.d.ts +3 -0
- package/dist/core/commands/mad-sks-command.d.ts +1 -0
- package/dist/core/commands/naruto-command.js +3 -2
- package/dist/core/commands/ppt-command.d.ts +3 -0
- package/dist/core/commands/team-command.js +10 -7
- package/dist/core/fsx.d.ts +1 -1
- package/dist/core/fsx.js +1 -1
- package/dist/core/proof/auto-finalize.js +24 -20
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/zellij/zellij-clipboard-config.d.ts +2 -0
- package/dist/core/zellij/zellij-clipboard-config.js +9 -7
- package/dist/core/zellij/zellij-launcher.d.ts +3 -0
- package/dist/core/zellij/zellij-launcher.js +1 -0
- 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.
|
|
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
|
|
|
@@ -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.
|
|
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.
|
|
5
|
-
"source_digest": "
|
|
6
|
-
"source_file_count":
|
|
7
|
-
"built_at_source_time":
|
|
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
package/dist/build-manifest.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "sks.dist-build.v2",
|
|
3
|
-
"version": "1.21.
|
|
4
|
-
"package_version": "1.21.
|
|
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": "
|
|
11
|
-
"source_file_count":
|
|
12
|
-
"source_files_hash": "
|
|
13
|
-
"source_list_hash": "
|
|
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 =
|
|
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
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
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;
|
package/dist/commands/ppt.d.ts
CHANGED
|
@@ -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;
|
|
@@ -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
|
-
|
|
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,
|
|
@@ -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
|
|
38
|
-
const
|
|
39
|
-
|
|
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.
|
|
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.
|
|
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:
|
|
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 ${
|
|
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:
|
|
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 ${
|
|
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
|
-
|
|
433
|
+
plan?.bundle_size,
|
|
434
|
+
plan?.agent_session_count,
|
|
431
435
|
lanes?.lane_count,
|
|
432
436
|
plan?.target_active_slots,
|
|
433
|
-
|
|
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
|
}
|
package/dist/core/fsx.d.ts
CHANGED
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.
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
package/dist/core/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PACKAGE_VERSION = "1.21.
|
|
1
|
+
export declare const PACKAGE_VERSION = "1.21.3";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/core/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const PACKAGE_VERSION = '1.21.
|
|
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
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
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,19 +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,
|
|
47
|
+
mouse_mode,
|
|
46
48
|
// Appended AFTER `--default-layout <path>` in the create command. Zellij treats
|
|
47
49
|
// --copy-command as mutually exclusive with --copy-clipboard (OSC52 target), so
|
|
48
50
|
// only pass the command and copy-on-select flags on the CLI. The generated KDL
|
|
49
51
|
// still records copy_clipboard for config-file consumers that use OSC52.
|
|
50
|
-
optionFlags: ['--copy-command', copy_command, '--copy-on-select', String(copy_on_select)],
|
|
52
|
+
optionFlags: ['--copy-command', copy_command, '--copy-on-select', String(copy_on_select), '--mouse-mode', String(mouse_mode)],
|
|
51
53
|
config_path,
|
|
52
54
|
generated_at: nowIso()
|
|
53
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.
|
|
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:
|
|
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:
|
|
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",
|