sneakoscope 3.0.0 â 3.0.1
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 +4 -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/core/codex-control/codex-0139-capability.js +102 -0
- package/dist/core/commands/mad-sks-command.js +4 -0
- package/dist/core/commands/naruto-command.js +2 -0
- package/dist/core/fsx.js +1 -1
- package/dist/core/pipeline-internals/runtime-core.js +4 -2
- package/dist/core/version.js +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -35,9 +35,11 @@ Set up this agent project with Sneakoscope Codex. Use [[mandarange/Sneakoscope-C
|
|
|
35
35
|
|
|
36
36
|
## đ Current Release
|
|
37
37
|
|
|
38
|
-
SKS **3.0.
|
|
38
|
+
SKS **3.0.1** tracks Codex CLI `rust-v0.139.0`: capability detection for code-mode web search, preserved `oneOf`/`allOf` tool schemas, plugin marketplace `source`/cached catalog, the `-P` sandbox profile alias, and the multi-agent v2 `interrupt_agent` rename (accepted alongside `close_agent` in cockpit event classification). See [docs/codex-0.139-compat.md](docs/codex-0.139-compat.md).
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
SKS 3.0.0 was the parallel-runtime stabilization release. The whole live-swarm experience â what you actually *see* while 5, 20, or 100 workers run â was rebuilt and proven end-to-end.
|
|
41
|
+
|
|
42
|
+
What changed in 3.0.0:
|
|
41
43
|
|
|
42
44
|
- **Slot panes are finally alive.** The watch renderer froze for entire missions because the telemetry snapshot cache never invalidated; snapshot reads are now mtime-aware, multi-process flushes merge instead of clobbering each other, and the disk `updated_at` stays authoritative for stale detection.
|
|
43
45
|
- **One SLOTS column, vertical stack.** Concurrent workers used to race anchor creation and split the screen into N side-by-side columns. Anchor + worker pane creation is serialized per session, and workers join a native Zellij stacked-pane group (`new-pane --stacked`, opt out with `SKS_ZELLIJ_WORKER_STACKED=0`).
|
|
@@ -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 3.0.
|
|
7
|
+
Some("--version") => println!("sks-rs 3.0.1"),
|
|
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": "3.0.
|
|
5
|
-
"source_digest": "
|
|
6
|
-
"source_file_count":
|
|
7
|
-
"built_at_source_time":
|
|
4
|
+
"package_version": "3.0.1",
|
|
5
|
+
"source_digest": "5c97e638daf3eab1aeac1eaa644b771787a9d8cfd1a9756e7ab4e76a7aba523e",
|
|
6
|
+
"source_file_count": 2265,
|
|
7
|
+
"built_at_source_time": 1781080652355
|
|
8
8
|
}
|
package/dist/bin/sks.js
CHANGED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { findCodexBinary } from '../codex-adapter.js';
|
|
3
|
+
import { compareSemverLike, parseCodexVersionText } from '../codex-compat/codex-version-policy.js';
|
|
4
|
+
import { nowIso, runProcess, writeJsonAtomic } from '../fsx.js';
|
|
5
|
+
export async function detectCodex0139Capability(input = {}) {
|
|
6
|
+
const fake = process.env.SKS_CODEX_0139_FAKE === '1';
|
|
7
|
+
const codexBin = fake
|
|
8
|
+
? input.codexBin || process.env.CODEX_BIN || 'codex'
|
|
9
|
+
: input.codexBin || process.env.CODEX_BIN || await findCodexBinary();
|
|
10
|
+
const versionText = fake
|
|
11
|
+
? String(process.env.SKS_CODEX_VERSION_FAKE || 'codex-cli 0.139.0')
|
|
12
|
+
: await readCodexVersionText(codexBin);
|
|
13
|
+
const parsed = parseCodexVersionText(versionText);
|
|
14
|
+
const atLeast139 = Boolean(parsed && compareSemverLike(parsed, '0.139.0') >= 0);
|
|
15
|
+
const probeMode = process.env.SKS_CODEX_0139_PROBE === '1' ? 'feature-probe' : 'version-only';
|
|
16
|
+
const featureProbeResults = probeMode === 'feature-probe'
|
|
17
|
+
? await probeCodex0139Features(codexBin, { fake })
|
|
18
|
+
: {
|
|
19
|
+
marketplace_list_json: 'skipped',
|
|
20
|
+
sandbox_profile_alias: 'skipped'
|
|
21
|
+
};
|
|
22
|
+
const marketplaceOk = atLeast139 && (probeMode === 'version-only' || featureProbeResults.marketplace_list_json !== 'failed');
|
|
23
|
+
const profileAliasOk = atLeast139 && (probeMode === 'version-only' || featureProbeResults.sandbox_profile_alias !== 'failed');
|
|
24
|
+
const blockers = [
|
|
25
|
+
...(!codexBin ? ['codex_cli_missing'] : []),
|
|
26
|
+
...(atLeast139 ? [] : ['codex_0_139_required_for_search_schema_marketplace_features']),
|
|
27
|
+
...(probeMode === 'feature-probe' && featureProbeResults.marketplace_list_json === 'failed' ? ['codex_marketplace_list_json_probe_failed'] : [])
|
|
28
|
+
];
|
|
29
|
+
return {
|
|
30
|
+
schema: 'sks.codex-0139-capability.v1',
|
|
31
|
+
ok: atLeast139 && blockers.length === 0,
|
|
32
|
+
probe_mode: probeMode,
|
|
33
|
+
codex_bin: codexBin || null,
|
|
34
|
+
version_text: versionText || null,
|
|
35
|
+
parsed_version: parsed,
|
|
36
|
+
supports_code_mode_web_search: atLeast139,
|
|
37
|
+
supports_rich_tool_schemas: atLeast139,
|
|
38
|
+
supports_doctor_env_details: atLeast139,
|
|
39
|
+
supports_marketplace_source_field: marketplaceOk,
|
|
40
|
+
supports_plugin_catalog_cache: atLeast139,
|
|
41
|
+
supports_sandbox_profile_alias: profileAliasOk,
|
|
42
|
+
supports_interrupt_agent_rename: atLeast139,
|
|
43
|
+
feature_probe_results: featureProbeResults,
|
|
44
|
+
blockers
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export async function writeCodex0139CapabilityArtifacts(root, input = {}) {
|
|
48
|
+
const capability = await detectCodex0139Capability({ codexBin: input.codexBin || null });
|
|
49
|
+
const report = { ...capability, generated_at: nowIso() };
|
|
50
|
+
const rootArtifact = path.join(root, '.sneakoscope', 'codex-0139-capability.json');
|
|
51
|
+
await writeJsonAtomic(rootArtifact, report);
|
|
52
|
+
let missionArtifact = null;
|
|
53
|
+
if (input.missionId) {
|
|
54
|
+
missionArtifact = path.join(root, '.sneakoscope', 'missions', input.missionId, 'codex-0139-capability.json');
|
|
55
|
+
await writeJsonAtomic(missionArtifact, report);
|
|
56
|
+
}
|
|
57
|
+
return { report, root_artifact: rootArtifact, mission_artifact: missionArtifact };
|
|
58
|
+
}
|
|
59
|
+
async function readCodexVersionText(codexBin) {
|
|
60
|
+
if (!codexBin)
|
|
61
|
+
return null;
|
|
62
|
+
const result = await runProcess(codexBin, ['--version'], { timeoutMs: 10_000, maxOutputBytes: 16 * 1024 }).catch((err) => ({
|
|
63
|
+
code: 1,
|
|
64
|
+
stdout: '',
|
|
65
|
+
stderr: err?.message || String(err)
|
|
66
|
+
}));
|
|
67
|
+
const text = `${result.stdout || ''}${result.stderr || ''}`.trim();
|
|
68
|
+
return result.code === 0 ? text : text || null;
|
|
69
|
+
}
|
|
70
|
+
async function probeCodex0139Features(codexBin, opts = {}) {
|
|
71
|
+
if (opts.fake) {
|
|
72
|
+
return {
|
|
73
|
+
marketplace_list_json: process.env.SKS_CODEX_0139_FAKE_MARKETPLACE_FAIL === '1' ? 'failed' : 'passed',
|
|
74
|
+
sandbox_profile_alias: 'passed'
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const timeoutMs = Math.max(1, Number(process.env.SKS_CODEX_0139_PROBE_TIMEOUT_MS || 3000) || 3000);
|
|
78
|
+
if (!codexBin) {
|
|
79
|
+
return { marketplace_list_json: 'failed', sandbox_profile_alias: 'failed' };
|
|
80
|
+
}
|
|
81
|
+
const marketplace = await runProcess(codexBin, ['plugin', 'marketplace', 'list', '--json'], { timeoutMs, maxOutputBytes: 256 * 1024 }).catch(() => ({ code: 1, stdout: '' }));
|
|
82
|
+
const marketplaceListJson = marketplace.code === 0 && marketplaceSourcesPresent(marketplace.stdout) ? 'passed' : 'failed';
|
|
83
|
+
const help = await runProcess(codexBin, ['--help'], { timeoutMs, maxOutputBytes: 256 * 1024 }).catch(() => ({ code: 1, stdout: '' }));
|
|
84
|
+
const aliasOk = help.code === 0 && /(^|\s)-P[,\s]/m.test(String(help.stdout || ''));
|
|
85
|
+
return {
|
|
86
|
+
marketplace_list_json: marketplaceListJson,
|
|
87
|
+
sandbox_profile_alias: aliasOk ? 'passed' : 'failed'
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function marketplaceSourcesPresent(stdout) {
|
|
91
|
+
try {
|
|
92
|
+
const parsed = JSON.parse(String(stdout || ''));
|
|
93
|
+
const rows = Array.isArray(parsed) ? parsed : Array.isArray(parsed?.marketplaces) ? parsed.marketplaces : Array.isArray(parsed?.items) ? parsed.items : [];
|
|
94
|
+
if (!rows.length)
|
|
95
|
+
return true;
|
|
96
|
+
return rows.some((row) => typeof row?.source === 'string' && row.source.length > 0);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=codex-0139-capability.js.map
|
|
@@ -21,6 +21,7 @@ import { diffCodexAppUiSnapshots, writeCodexAppUiSnapshot } from '../codex-app/c
|
|
|
21
21
|
import { checkSksUpdateNotice } from '../update/update-notice.js';
|
|
22
22
|
import { createMadDbCapability, MAD_DB_ACK } from '../mad-db/mad-db-capability.js';
|
|
23
23
|
import { writeCodex0138CapabilityArtifacts } from '../codex-control/codex-0138-capability.js';
|
|
24
|
+
import { writeCodex0139CapabilityArtifacts } from '../codex-control/codex-0139-capability.js';
|
|
24
25
|
export async function madHighCommand(args = [], deps = {}) {
|
|
25
26
|
const subcommand = firstSubcommand(args);
|
|
26
27
|
if (subcommand)
|
|
@@ -385,6 +386,7 @@ async function activateMadZellijPermissionState(cwd = process.cwd(), args = [])
|
|
|
385
386
|
const dbWriteAllowed = has('db_write');
|
|
386
387
|
const { id, dir } = await createMission(root, { mode: 'mad-sks', prompt: 'sks --mad Zellij scoped high-power maintenance session' });
|
|
387
388
|
await writeCodex0138CapabilityArtifacts(root, { missionId: id }).catch(() => null);
|
|
389
|
+
await writeCodex0139CapabilityArtifacts(root, { missionId: id }).catch(() => null);
|
|
388
390
|
const protectedCore = resolveProtectedCore({ packageRoot: packageRoot(), targetRoot: cwd });
|
|
389
391
|
// The interactive launch 'before' snapshot is only persisted (env + policy json)
|
|
390
392
|
// and is never compared against an 'after' snapshot during the session, so the
|
|
@@ -571,6 +573,7 @@ function codexLbImmediateLaunchOpts(args = [], lb = {}, opts = {}) {
|
|
|
571
573
|
export async function madSksFixture(root) {
|
|
572
574
|
const { id, dir } = await createMission(root, { mode: 'mad-sks', prompt: '$MAD-SKS fixture permission gate' });
|
|
573
575
|
await writeCodex0138CapabilityArtifacts(root, { missionId: id }).catch(() => null);
|
|
576
|
+
await writeCodex0139CapabilityArtifacts(root, { missionId: id }).catch(() => null);
|
|
574
577
|
const gate = { schema_version: 1, passed: true, mad_sks_permission_active: true, permissions_deactivated: true, catastrophic_safety_guard_active: true, permission_profile: permissionGateSummary(), fixture: true };
|
|
575
578
|
await writeJsonAtomic(path.join(dir, 'mad-sks-gate.json'), gate);
|
|
576
579
|
return { mission_id: id, dir, gate };
|
|
@@ -746,6 +749,7 @@ async function materializeMadSksRun(root, targetRoot, permission, userIntent, js
|
|
|
746
749
|
await initProject(root, {});
|
|
747
750
|
const { id, dir } = await createMission(root, { mode: 'mad-sks', prompt: userIntent });
|
|
748
751
|
await writeCodex0138CapabilityArtifacts(root, { missionId: id }).catch(() => null);
|
|
752
|
+
await writeCodex0139CapabilityArtifacts(root, { missionId: id }).catch(() => null);
|
|
749
753
|
const before = await snapshotProtectedCore(packageRoot(), 'before');
|
|
750
754
|
const authorization = opts.authorizationManifest || createMadSksAuthorizationManifest({ permission, userIntent });
|
|
751
755
|
const authorizationPath = opts.authorizationManifestPath || path.join(dir, 'mad-sks-authorization.json');
|
|
@@ -23,6 +23,7 @@ import { checkPromptPlaceholders } from '../prompt/prompt-placeholder-guard.js';
|
|
|
23
23
|
import { evaluateGitWorktreeCapability } from '../git/git-worktree-capability.js';
|
|
24
24
|
import { buildRuntimeProofSummary, renderRuntimeProofSummary } from '../agents/runtime-proof-summary.js';
|
|
25
25
|
import { writeCodex0138CapabilityArtifacts } from '../codex-control/codex-0138-capability.js';
|
|
26
|
+
import { writeCodex0139CapabilityArtifacts } from '../codex-control/codex-0139-capability.js';
|
|
26
27
|
const NARUTO_RESULT_SCHEMA = 'sks.naruto-command-result.v1';
|
|
27
28
|
const NARUTO_ROUTE = '$Naruto';
|
|
28
29
|
// $Naruto â Shadow Clone Swarm (åŊąåčēĢ / Kage Bunshin no Jutsu).
|
|
@@ -83,6 +84,7 @@ async function narutoRun(parsed) {
|
|
|
83
84
|
});
|
|
84
85
|
const mission = await createMission(root, { mode: 'naruto', prompt: parsed.prompt });
|
|
85
86
|
await writeCodex0138CapabilityArtifacts(root, { missionId: mission.id }).catch(() => null);
|
|
87
|
+
await writeCodex0139CapabilityArtifacts(root, { missionId: mission.id }).catch(() => null);
|
|
86
88
|
const gitWorktreeCapability = writeCapable
|
|
87
89
|
? await evaluateGitWorktreeCapability({ root, missionId: mission.id })
|
|
88
90
|
: null;
|
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 = '3.0.
|
|
8
|
+
export const PACKAGE_VERSION = '3.0.1';
|
|
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() {
|
|
@@ -1249,13 +1249,15 @@ function subagentToolName(payload) {
|
|
|
1249
1249
|
}
|
|
1250
1250
|
function subagentStage(payload) {
|
|
1251
1251
|
const hay = JSON.stringify(payload || {});
|
|
1252
|
-
|
|
1252
|
+
// Codex 0.139 renamed multi-agent v2 `close_agent` to `interrupt_agent`;
|
|
1253
|
+
// accept both so cockpit evidence keeps classifying on newer CLIs.
|
|
1254
|
+
if (!/(spawn_agent|send_input|wait_agent|close_agent|interrupt_agent|subagent|worker|explorer)/i.test(hay))
|
|
1253
1255
|
return null;
|
|
1254
1256
|
if (/subagent[_ -]?unavailable|subagents unavailable|unsafe to split|unsplittable|cannot safely split/i.test(hay))
|
|
1255
1257
|
return 'exception';
|
|
1256
1258
|
if (/spawn_agent/i.test(hay))
|
|
1257
1259
|
return 'spawn_agent';
|
|
1258
|
-
if (/wait_agent|close_agent|completed|final/i.test(hay))
|
|
1260
|
+
if (/wait_agent|close_agent|interrupt_agent|completed|final/i.test(hay))
|
|
1259
1261
|
return 'result';
|
|
1260
1262
|
return 'subagent';
|
|
1261
1263
|
}
|
package/dist/core/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const PACKAGE_VERSION = '3.0.
|
|
1
|
+
export const PACKAGE_VERSION = '3.0.1';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sneakoscope",
|
|
3
3
|
"displayName": "ã
ã
ã
",
|
|
4
|
-
"version": "3.0.
|
|
4
|
+
"version": "3.0.1",
|
|
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",
|
|
@@ -562,6 +562,7 @@
|
|
|
562
562
|
"release:check:dag:no-cache": "node ./dist/scripts/release-gate-dag-runner.js --preset release --no-cache",
|
|
563
563
|
"release:check:dag:fail-fast": "node ./dist/scripts/release-gate-dag-runner.js --preset release --fail-fast",
|
|
564
564
|
"codex:0138-capability": "node ./dist/scripts/codex-0138-capability-check.js",
|
|
565
|
+
"codex:0139-capability": "node ./dist/scripts/codex-0139-capability-check.js",
|
|
565
566
|
"codex:0138-capability-artifact": "node ./dist/scripts/codex-0138-capability-artifact-check.js",
|
|
566
567
|
"codex-sdk:version-compat": "node ./dist/scripts/codex-sdk-version-compat-check.js",
|
|
567
568
|
"codex-app:handoff": "node ./dist/scripts/codex-app-handoff-check.js",
|