sneakoscope 1.16.1 → 1.16.2

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 CHANGED
@@ -10,7 +10,7 @@ SKS does not try to clone every other harness. It focuses on one thing: making C
10
10
 
11
11
  ## Current Release
12
12
 
13
- SKS **1.16.1** closes the native multi-session agent kernel: `sks agent` and `sks --agent` create bounded agent rosters, non-overlapping leases, append-only ledgers, session lifecycle proof, recursion guards, dynamic per-agent effort routing, and native agent proof evidence. The old multi-agent command surface has been removed; native agents are the only release-supported route collaboration backend.
13
+ SKS **1.16.2** carries forward the native multi-session agent kernel and adds Codex App prompt-side Team width control: `$Team 20:agents ...` / `$Team 20:agent ...` can request up to 20 native Team sessions. SKS **1.16.1** closed the kernel itself: `sks agent` and `sks --agent` create bounded agent rosters, non-overlapping leases, append-only ledgers, session lifecycle proof, recursion guards, dynamic per-agent effort routing, and native agent proof evidence. The old multi-agent command surface has been removed; native agents are the only release-supported route collaboration backend.
14
14
 
15
15
  ```bash
16
16
  sks mad-sks plan --target-root <path> --json
@@ -76,7 +76,7 @@ dependencies = [
76
76
 
77
77
  [[package]]
78
78
  name = "sks-core"
79
- version = "1.16.1"
79
+ version = "1.16.2"
80
80
  dependencies = [
81
81
  "serde_json",
82
82
  ]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "sks-core"
3
- version = "1.16.1"
3
+ version = "1.16.2"
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.16.1"),
7
+ Some("--version") => println!("sks-rs 1.16.2"),
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.16.1",
5
- "source_digest": "f48dc53e59ca32017277669987b311270b723a6f057fe64d7b39ee80e4934757",
6
- "source_file_count": 1474,
7
- "built_at_source_time": 1779647681180
4
+ "package_version": "1.16.2",
5
+ "source_digest": "38a14936b463c4d5f6254412dbaa186a6f351f637dd5e5db82a6eb6b5eff43b9",
6
+ "source_file_count": 1475,
7
+ "built_at_source_time": 1779679969693
8
8
  }
package/dist/bin/sks.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const FAST_PACKAGE_VERSION = '1.16.1';
2
+ const FAST_PACKAGE_VERSION = '1.16.2';
3
3
  const args = process.argv.slice(2);
4
4
  try {
5
5
  if (args[0] === '--version' || args[0] === '-v' || args[0] === 'version') {
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "schema": "sks.dist-build.v2",
3
- "version": "1.16.1",
4
- "package_version": "1.16.1",
3
+ "version": "1.16.2",
4
+ "package_version": "1.16.2",
5
5
  "typescript": true,
6
6
  "mjs_runtime_files": 0,
7
- "source_digest": "f48dc53e59ca32017277669987b311270b723a6f057fe64d7b39ee80e4934757",
8
- "source_file_count": 1474,
7
+ "source_digest": "38a14936b463c4d5f6254412dbaa186a6f351f637dd5e5db82a6eb6b5eff43b9",
8
+ "source_file_count": 1475,
9
9
  "dist_stamp_schema": "sks.dist-build-stamp.v1",
10
10
  "files": [
11
11
  "bin/sks.d.ts",
@@ -29,7 +29,7 @@ export async function team(args = []) {
29
29
  const opts = parseTeamCreateArgs(cleanCreateArgs);
30
30
  const { prompt, agentSessions, roleCounts, roster } = opts;
31
31
  if (!prompt) {
32
- console.error('Usage: sks team "task" [executor:5 reviewer:6 user:1] [--agents N] [--no-open-tmux] [--json] [--mock]');
32
+ console.error('Usage: sks team "task" [20:agents] [executor:5 reviewer:6 user:1] [--agents N] [--no-open-tmux] [--json] [--mock]');
33
33
  process.exitCode = 1;
34
34
  return;
35
35
  }
@@ -68,7 +68,7 @@ const FIXTURES = Object.freeze({
68
68
  'cli-commit': fixture('mock', 'sks commit --dry-run', [], 'pass'),
69
69
  'cli-commit-and-push': fixture('mock', 'sks commit-and-push --dry-run', [], 'pass'),
70
70
  'cli-context7': fixture('real_optional', 'sks context7 check --json', [], 'pass'),
71
- 'cli-all-features': fixture('mock', 'sks all-features complete --json', ['.sneakoscope/reports/all-feature-completion-1.16.1.json'], 'pass'),
71
+ 'cli-all-features': fixture('mock', 'sks all-features complete --json', ['.sneakoscope/reports/all-feature-completion-1.16.2.json'], 'pass'),
72
72
  'cli-init': fixture('mock', 'sks init --local-only --dry-run', [], 'pass'),
73
73
  'cli-eval': fixture('mock', 'sks eval run --mock --json', [], 'pass'),
74
74
  'cli-harness': fixture('mock', 'sks harness fixture --mock --json', [], 'pass'),
@@ -1,4 +1,4 @@
1
- export declare const PACKAGE_VERSION = "1.16.1";
1
+ export declare const PACKAGE_VERSION = "1.16.2";
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.16.1';
8
+ export const PACKAGE_VERSION = '1.16.2';
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() {
@@ -5,7 +5,8 @@ export declare const DEFAULT_TEAM_ROLE_COUNTS: {
5
5
  reviewer: number;
6
6
  executor: number;
7
7
  };
8
- export declare const DEFAULT_MAX_TEAM_AGENT_SESSIONS = 6;
8
+ export declare const MAX_TEAM_AGENT_SESSIONS = 20;
9
+ export declare const DEFAULT_MAX_TEAM_AGENT_SESSIONS = 20;
9
10
  export declare function teamAgentReasoning(input?: any): {
10
11
  policy_version: number;
11
12
  reasoning_effort: string;
@@ -2,6 +2,7 @@ import path from 'node:path';
2
2
  import { appendJsonlBounded, nowIso, readJson, readText, writeJsonAtomic, writeTextAtomic } from './fsx.js';
3
3
  import { reasoningProfileName, triwikiContextTracking, triwikiContextTrackingText } from './routes.js';
4
4
  import { MIN_TEAM_REVIEWER_LANES, MIN_TEAM_REVIEW_STAGE_AGENT_SESSIONS } from './team-review-policy.js';
5
+ import { MAX_AGENT_COUNT } from './agents/agent-schema.js';
5
6
  export { MIN_TEAM_REVIEWER_LANES, MIN_TEAM_REVIEW_POLICY_TEXT, MIN_TEAM_REVIEW_STAGE_AGENT_SESSIONS, evaluateTeamReviewPolicyGate, teamReviewPolicy } from './team-review-policy.js';
6
7
  const MAX_LIVE_BYTES = 192 * 1024;
7
8
  const TEAM_RUNTIME_TASKS_ARTIFACT = 'team-runtime-tasks.json';
@@ -34,7 +35,8 @@ const CHAT_COLOR_CODES = {
34
35
  gray: '90'
35
36
  };
36
37
  export const DEFAULT_TEAM_ROLE_COUNTS = { user: 1, planner: 1, reviewer: MIN_TEAM_REVIEWER_LANES, executor: 3 };
37
- export const DEFAULT_MAX_TEAM_AGENT_SESSIONS = 6;
38
+ export const MAX_TEAM_AGENT_SESSIONS = MAX_AGENT_COUNT;
39
+ export const DEFAULT_MAX_TEAM_AGENT_SESSIONS = MAX_TEAM_AGENT_SESSIONS;
38
40
  const ROLE_ALIASES = {
39
41
  user: 'user',
40
42
  users: 'user',
@@ -213,6 +215,7 @@ ${prompt}
213
215
  - Use relevant TriWiki context before every stage, hydrate low-trust claims from source during the stage, refresh after findings/artifact changes, and validate before handoffs or final claims.
214
216
  - Native agent intake agents are read-only and split repo, docs, tests, risk, API, and user-flow investigation before the parent refreshes TriWiki for debate.
215
217
  - executor:N means build N debate participants and then a separate N-person executor development team.
218
+ - N:agents or N:agent means use up to N native multi-session agents for Team bundles, capped at ${MAX_TEAM_AGENT_SESSIONS}.
216
219
  - Debate uses compact Hyperplan-derived adversarial lenses: challenge framing, subtract surface, demand evidence, test integration risk, and consider one simpler alternative.
217
220
  - User personas are intentionally impatient, self-interested, stubborn, low-context, and dislike inconvenience.
218
221
  - Executors are capable developers with disjoint ownership.
@@ -287,7 +290,9 @@ export function defaultTeamControl(id) {
287
290
  }
288
291
  export function normalizeTeamAgentSessions(value, fallback = 3) {
289
292
  const n = Number(value ?? fallback);
290
- return Math.min(12, Math.max(1, Number.isFinite(n) ? Math.floor(n) : fallback));
293
+ const fallbackNumber = Number(fallback);
294
+ const fallbackCount = Number.isFinite(fallbackNumber) ? Math.floor(fallbackNumber) : 3;
295
+ return Math.min(MAX_TEAM_AGENT_SESSIONS, Math.max(1, Number.isFinite(n) ? Math.floor(n) : fallbackCount));
291
296
  }
292
297
  export function parseTeamSpecArgs(args = []) {
293
298
  const cleanArgs = [];
@@ -296,6 +301,13 @@ export function parseTeamSpecArgs(args = []) {
296
301
  let explicitExecutor = false;
297
302
  for (let i = 0; i < args.length; i++) {
298
303
  const arg = String(args[i]);
304
+ const agentBudget = parseAgentBudgetToken(arg);
305
+ if (agentBudget !== null) {
306
+ explicitSession = agentBudget;
307
+ if (!explicitExecutor)
308
+ roleCounts.executor = agentBudget;
309
+ continue;
310
+ }
299
311
  const rolePair = parseRolePair(arg);
300
312
  if (rolePair) {
301
313
  roleCounts[rolePair.role] = rolePair.count;
@@ -344,26 +356,25 @@ export function parseTeamSpecArgs(args = []) {
344
356
  }
345
357
  if (arg === '--json' || arg === '--open-tmux' || arg === '--tmux-open' || arg === '--no-open-tmux' || arg === '--no-tmux' || arg === '--no-attach' || arg === '--separate-session' || arg === '--new-session' || arg === '--legacy-team-session' || arg === '--no-dynamic-team-tmux')
346
358
  continue;
347
- cleanArgs.push(args[i]);
359
+ const consumed = consumeTeamSpecText(arg, { roleCounts, explicitExecutor, explicitSession });
360
+ roleCounts = consumed.roleCounts;
361
+ explicitExecutor = consumed.explicitExecutor;
362
+ explicitSession = consumed.explicitSession;
363
+ if (consumed.prompt)
364
+ cleanArgs.push(consumed.prompt);
348
365
  }
349
366
  return { cleanArgs, ...normalizeTeamSpec({ roleCounts, agentSessions: explicitSession }) };
350
367
  }
351
368
  export function parseTeamSpecText(text = '') {
352
369
  let roleCounts = { ...DEFAULT_TEAM_ROLE_COUNTS };
353
- let explicitExecutor = false;
370
+ let explicitSession = null;
354
371
  const wantsMaxAgents = /\b(max|maximum|maximal|available agents?)\b|최대|가용가능/i.test(String(text || ''));
355
- const prompt = String(text || '').replace(/\b([A-Za-z][A-Za-z_-]*):(\d+)\b/g, (token) => {
356
- const parsed = parseRolePair(token);
357
- if (!parsed)
358
- return token;
359
- roleCounts[parsed.role] = parsed.count;
360
- if (parsed.role === 'executor')
361
- explicitExecutor = true;
362
- return '';
363
- }).replace(/\s+/g, ' ').trim();
364
- if (wantsMaxAgents && !explicitExecutor)
372
+ const consumed = consumeTeamSpecText(text, { roleCounts, explicitExecutor: false, explicitSession });
373
+ roleCounts = consumed.roleCounts;
374
+ explicitSession = consumed.explicitSession;
375
+ if (wantsMaxAgents && !consumed.explicitExecutor)
365
376
  roleCounts.executor = DEFAULT_MAX_TEAM_AGENT_SESSIONS;
366
- return { prompt, ...normalizeTeamSpec({ roleCounts, agentSessions: wantsMaxAgents ? roleCounts.executor : undefined, prompt }) };
377
+ return { prompt: consumed.prompt, ...normalizeTeamSpec({ roleCounts, agentSessions: explicitSession ?? (wantsMaxAgents ? roleCounts.executor : undefined), prompt: consumed.prompt }) };
367
378
  }
368
379
  export function normalizeTeamSpec(opts = {}) {
369
380
  const roleCounts = normalizeTeamRoleCounts(opts.roleCounts);
@@ -455,6 +466,35 @@ function parseRolePair(token) {
455
466
  return null;
456
467
  return { role, count: normalizeTeamAgentSessions(match[2], DEFAULT_TEAM_ROLE_COUNTS[role] || 1) };
457
468
  }
469
+ function parseAgentBudgetToken(token) {
470
+ const match = String(token || '').match(/^(\d+):(agents?|sessions?|team)$/i);
471
+ if (!match)
472
+ return null;
473
+ return normalizeTeamAgentSessions(match[1], DEFAULT_TEAM_ROLE_COUNTS.executor);
474
+ }
475
+ function consumeTeamSpecText(text, state = {}) {
476
+ const roleCounts = state.roleCounts || { ...DEFAULT_TEAM_ROLE_COUNTS };
477
+ let explicitExecutor = state.explicitExecutor === true;
478
+ let explicitSession = state.explicitSession ?? null;
479
+ const prompt = String(text || '').replace(/\b(\d+):(agents?|sessions?|team)\b/gi, (token) => {
480
+ const agentBudget = parseAgentBudgetToken(token);
481
+ if (agentBudget === null)
482
+ return token;
483
+ explicitSession = agentBudget;
484
+ if (!explicitExecutor)
485
+ roleCounts.executor = agentBudget;
486
+ return '';
487
+ }).replace(/\b([A-Za-z][A-Za-z_-]*):(\d+)\b/g, (token) => {
488
+ const parsed = parseRolePair(token);
489
+ if (!parsed)
490
+ return token;
491
+ roleCounts[parsed.role] = parsed.count;
492
+ if (parsed.role === 'executor')
493
+ explicitExecutor = true;
494
+ return '';
495
+ }).replace(/\s+/g, ' ').trim();
496
+ return { prompt, roleCounts, explicitExecutor, explicitSession };
497
+ }
458
498
  function normalizeTeamRole(role) {
459
499
  return ROLE_ALIASES[String(role || '').trim().toLowerCase().replace(/[^a-z_-]/g, '')] || null;
460
500
  }
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "1.16.1";
1
+ export declare const PACKAGE_VERSION = "1.16.2";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,2 +1,2 @@
1
- export const PACKAGE_VERSION = '1.16.1';
1
+ export const PACKAGE_VERSION = '1.16.2';
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": "1.16.1",
4
+ "version": "1.16.2",
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",