sneakoscope 6.1.0 → 6.2.0

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 (246) hide show
  1. package/README.md +35 -11
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/dist/bin/fast-inline.js +18 -9
  5. package/dist/bin/sks-dispatch.js +2 -2
  6. package/dist/cli/args.js +2 -0
  7. package/dist/cli/command-manifest-lite.js +2 -3
  8. package/dist/cli/command-registry.js +3 -4
  9. package/dist/cli/help-fast.js +1 -1
  10. package/dist/cli/install-helpers.js +116 -306
  11. package/dist/cli/install-tool-helpers.js +287 -0
  12. package/dist/cli/router.js +40 -4
  13. package/dist/commands/codex-lb.js +51 -20
  14. package/dist/commands/codex.js +39 -1
  15. package/dist/commands/doctor.js +242 -20
  16. package/dist/commands/tmux.js +5 -1
  17. package/dist/commands/zellij-monitor-pane.js +2 -0
  18. package/dist/commands/zellij-viewport-pane.js +3 -1
  19. package/dist/commands/zellij.js +1 -1
  20. package/dist/config/skills-manifest.json +59 -59
  21. package/dist/core/agent-bridge/agent-manifest.js +48 -0
  22. package/dist/core/agents/agent-command-surface.js +2 -1
  23. package/dist/core/agents/agent-effort-policy.js +38 -35
  24. package/dist/core/agents/agent-plan.js +100 -21
  25. package/dist/core/agents/agent-role-config.js +43 -46
  26. package/dist/core/agents/agent-runner-codex-exec.js +16 -3
  27. package/dist/core/agents/agent-schema.js +3 -2
  28. package/dist/core/agents/native-cli-session-swarm.js +1 -1
  29. package/dist/core/agents/zellij-right-lane-cockpit.js +2 -2
  30. package/dist/core/codex/agent-config-file-repair.js +94 -193
  31. package/dist/core/codex/codex-cli-update.js +723 -0
  32. package/dist/core/codex/codex-config-guard.js +185 -9
  33. package/dist/core/codex/codex-config-readability.js +21 -8
  34. package/dist/core/codex/codex-config-toml.js +14 -11
  35. package/dist/core/codex/codex-project-config-policy.js +3 -6
  36. package/dist/core/codex/codex-startup-config-postcheck.js +52 -42
  37. package/dist/core/codex-adapter.js +35 -22
  38. package/dist/core/codex-app/codex-agent-role-sync.js +13 -54
  39. package/dist/core/codex-app/codex-app-launcher.js +48 -17
  40. package/dist/core/codex-app/codex-app-restart.js +23 -2
  41. package/dist/core/codex-app/mcp-manager.js +679 -0
  42. package/dist/core/codex-app/sks-menubar.js +533 -8
  43. package/dist/core/codex-control/codex-0139-image-path-real-probe.js +15 -4
  44. package/dist/core/codex-control/codex-0139-web-search-probe.js +17 -6
  45. package/dist/core/codex-control/codex-lb-launch-recovery.js +293 -0
  46. package/dist/core/codex-control/codex-reliability-shield.js +89 -29
  47. package/dist/core/codex-control/codex-sdk-adapter.js +44 -8
  48. package/dist/core/codex-control/codex-task-runner.js +62 -9
  49. package/dist/core/codex-control/python-codex-sdk-adapter.js +30 -3
  50. package/dist/core/codex-exec-output-schema.js +35 -6
  51. package/dist/core/codex-lb/codex-lb-env.js +1 -1
  52. package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +291 -0
  53. package/dist/core/codex-native/codex-native-feature-broker.js +9 -16
  54. package/dist/core/codex-native/codex-native-repair-transaction.js +1 -1
  55. package/dist/core/codex-native/core-skill-manifest.js +8 -4
  56. package/dist/core/codex-runtime/codex-desktop-config-policy.js +2 -3
  57. package/dist/core/commands/agent-bridge-command.js +23 -2
  58. package/dist/core/commands/agent-command.js +19 -5
  59. package/dist/core/commands/basic-cli.js +47 -6
  60. package/dist/core/commands/command-utils.js +1 -1
  61. package/dist/core/commands/mad-sks-command.js +76 -10
  62. package/dist/core/commands/menubar-command.js +94 -0
  63. package/dist/core/commands/naruto-command.js +645 -1156
  64. package/dist/core/commands/research-command.js +293 -231
  65. package/dist/core/commands/run-command.js +100 -23
  66. package/dist/core/commands/team-command.js +2 -3
  67. package/dist/core/commands/team-legacy-observe-command.js +94 -359
  68. package/dist/core/commands/wiki-command.js +11 -5
  69. package/dist/core/db-safety.js +2 -2
  70. package/dist/core/decision-lattice.js +6 -6
  71. package/dist/core/doctor/codex-startup-config-repair.js +8 -3
  72. package/dist/core/doctor/doctor-codex-startup-repair.js +6 -141
  73. package/dist/core/feature-fixture-executor.js +71 -7
  74. package/dist/core/feature-fixture-runner.js +53 -12
  75. package/dist/core/feature-fixtures.js +47 -14
  76. package/dist/core/feature-registry.js +28 -27
  77. package/dist/core/fsx.js +1 -0
  78. package/dist/core/harness-conflicts.js +18 -9
  79. package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +14 -8
  80. package/dist/core/hooks-runtime/hook-io.js +8 -4
  81. package/dist/core/hooks-runtime/light-turn.js +70 -0
  82. package/dist/core/hooks-runtime/naruto-decision-gate.js +184 -0
  83. package/dist/core/hooks-runtime/payload-signals.js +270 -0
  84. package/dist/core/hooks-runtime/stop-repeat-guard.js +89 -0
  85. package/dist/core/hooks-runtime/team-digest.js +0 -1
  86. package/dist/core/hooks-runtime/tool-output-quarantine.js +93 -0
  87. package/dist/core/hooks-runtime.js +438 -354
  88. package/dist/core/init/skills.js +16 -30
  89. package/dist/core/init.js +144 -36
  90. package/dist/core/managed-assets/managed-assets-manifest.js +566 -10
  91. package/dist/core/mission.js +24 -1
  92. package/dist/core/pipeline-internals/runtime-core.js +570 -177
  93. package/dist/core/pipeline-internals/runtime-gates.js +174 -48
  94. package/dist/core/preflight/parallel-preflight-engine.js +66 -4
  95. package/dist/core/proof/route-adapter.js +1 -1
  96. package/dist/core/proof/route-proof-gate.js +7 -2
  97. package/dist/core/proof/selftest-proof-fixtures.js +3 -5
  98. package/dist/core/proof-field.js +1 -1
  99. package/dist/core/provider/model-router.js +42 -31
  100. package/dist/core/recallpulse/policy.js +12 -28
  101. package/dist/core/recallpulse.js +11 -6
  102. package/dist/core/release/npm-pack-proof.js +247 -0
  103. package/dist/core/release/package-dist-snapshot.js +151 -0
  104. package/dist/core/release/package-size-budget.js +4 -1
  105. package/dist/core/release/release-authorization-snapshot.js +115 -0
  106. package/dist/core/release/release-gate-affected-selector.js +14 -2
  107. package/dist/core/release/release-gate-cache-v2.js +30 -0
  108. package/dist/core/release/release-gate-contract.js +161 -0
  109. package/dist/core/release/release-gate-dag.js +1 -0
  110. package/dist/core/release/release-real-contract.js +90 -10
  111. package/dist/core/release-parallel-full-coverage.js +31 -143
  112. package/dist/core/research/claim-evidence-matrix.js +41 -6
  113. package/dist/core/research/experiment-plan.js +14 -10
  114. package/dist/core/research/falsification.js +9 -2
  115. package/dist/core/research/implementation-blueprint-densifier.js +82 -60
  116. package/dist/core/research/implementation-blueprint.js +32 -26
  117. package/dist/core/research/mock-result.js +122 -11
  118. package/dist/core/research/replication-pack.js +15 -8
  119. package/dist/core/research/research-adversarial-review.js +1068 -0
  120. package/dist/core/research/research-claim-builder.js +69 -17
  121. package/dist/core/research/research-claim-synthesizer.js +343 -0
  122. package/dist/core/research/research-cycle-runner.js +53 -3
  123. package/dist/core/research/research-falsification-runner.js +176 -0
  124. package/dist/core/research/research-final-reviewer.js +44 -125
  125. package/dist/core/research/research-plan-markdown.js +123 -0
  126. package/dist/core/research/research-realistic-report.js +14 -6
  127. package/dist/core/research/research-review-artifact-digest.js +66 -0
  128. package/dist/core/research/research-source-evidence.js +144 -0
  129. package/dist/core/research/research-source-layer-catalog.js +68 -0
  130. package/dist/core/research/research-source-ledger-merge.js +250 -12
  131. package/dist/core/research/research-source-shards.js +26 -70
  132. package/dist/core/research/research-stage-runner.js +237 -247
  133. package/dist/core/research/research-super-search.js +188 -0
  134. package/dist/core/research/research-synthesis-prompt.js +20 -1
  135. package/dist/core/research/research-synthesis-writer.js +86 -5
  136. package/dist/core/research/research-work-graph.js +25 -18
  137. package/dist/core/research/source-quality-report.js +21 -0
  138. package/dist/core/research.js +424 -390
  139. package/dist/core/retention.js +70 -2
  140. package/dist/core/routes/constants.js +1 -1
  141. package/dist/core/routes/dollar-manifest-lite.js +11 -11
  142. package/dist/core/routes.js +149 -69
  143. package/dist/core/runtime/task-profile.js +66 -0
  144. package/dist/core/runtime/verification-budget.js +12 -0
  145. package/dist/core/security/high-risk-contracts.js +6 -6
  146. package/dist/core/stop-gate/stop-gate-check.js +49 -12
  147. package/dist/core/subagents/agent-catalog.js +287 -0
  148. package/dist/core/subagents/model-policy.js +259 -0
  149. package/dist/core/subagents/naruto-help-contract.js +47 -0
  150. package/dist/core/subagents/official-subagent-config.js +488 -0
  151. package/dist/core/subagents/official-subagent-preparation.js +297 -0
  152. package/dist/core/subagents/official-subagent-prompt.js +159 -0
  153. package/dist/core/subagents/official-subagent-runner.js +129 -0
  154. package/dist/core/subagents/subagent-evidence.js +663 -0
  155. package/dist/core/subagents/terminology.js +16 -0
  156. package/dist/core/subagents/thread-budget.js +21 -0
  157. package/dist/core/subagents/triwiki-attention.js +168 -0
  158. package/dist/core/super-search/runtime-helpers.js +173 -19
  159. package/dist/core/super-search/runtime.js +140 -15
  160. package/dist/core/super-search/source-records.js +49 -8
  161. package/dist/core/team-review-policy.js +15 -0
  162. package/dist/core/triwiki/code-pack-head-freshness.js +291 -0
  163. package/dist/core/triwiki/triwiki-module-card.js +1 -1
  164. package/dist/core/triwiki-wrongness/wrongness-ledger.js +9 -2
  165. package/dist/core/version-manager.js +51 -1
  166. package/dist/core/version.js +1 -1
  167. package/dist/core/work-order-ledger.js +40 -1
  168. package/dist/core/zellij/zellij-fake-adapter.js +3 -1
  169. package/dist/core/zellij/zellij-launcher.js +49 -10
  170. package/dist/core/zellij/zellij-layout-builder.js +14 -5
  171. package/dist/core/zellij/zellij-official-subagent-activity.js +477 -0
  172. package/dist/core/zellij/zellij-official-subagent-telemetry.js +264 -0
  173. package/dist/core/zellij/zellij-pane-proof.js +9 -1
  174. package/dist/core/zellij/zellij-slot-pane-renderer.js +17 -5
  175. package/dist/core/zellij/zellij-slot-telemetry.js +15 -3
  176. package/dist/core/zellij/zellij-ui-mode.js +1 -1
  177. package/dist/core/zellij/zellij-update.js +14 -1
  178. package/dist/core/zellij/zellij-viewport-binder.js +3 -0
  179. package/dist/scripts/agent-role-config-repair-check.js +14 -16
  180. package/dist/scripts/architecture-guard-check.js +8 -1
  181. package/dist/scripts/canonical-test-runner.js +7 -1
  182. package/dist/scripts/check-route-modularity.js +0 -1
  183. package/dist/scripts/check-ts-contracts.js +1 -1
  184. package/dist/scripts/codex-control-all-pipelines-check.js +7 -3
  185. package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +27 -0
  186. package/dist/scripts/codex-lb-fast-mode-truth-check.js +11 -1
  187. package/dist/scripts/codex-lb-fast-ui-preservation-check.js +9 -2
  188. package/dist/scripts/codex-lb-gpt56-fast-profile-check.js +13 -2
  189. package/dist/scripts/codex-native-agent-role-content-check.js +27 -7
  190. package/dist/scripts/codex-native-repair-transaction-check.js +3 -1
  191. package/dist/scripts/codex-sdk-all-pipelines-check.js +7 -4
  192. package/dist/scripts/codex-sdk-backend-router-check.js +2 -0
  193. package/dist/scripts/codex-sdk-research-pipeline-check.js +30 -8
  194. package/dist/scripts/db-route-materialization-check.js +33 -0
  195. package/dist/scripts/docs-truthfulness-check.js +3 -1
  196. package/dist/scripts/doctor-codex-startup-repair-check.js +12 -15
  197. package/dist/scripts/doctor-fix-production-blackbox.js +12 -2
  198. package/dist/scripts/doctor-startup-config-repair-blackbox.js +8 -2
  199. package/dist/scripts/doctor-startup-config-repair-check.js +12 -2
  200. package/dist/scripts/install-update-preserves-config-check.js +6 -1
  201. package/dist/scripts/lib/codex-sdk-gate-lib.js +4 -0
  202. package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +0 -1
  203. package/dist/scripts/managed-role-manifest-parity-check.js +5 -4
  204. package/dist/scripts/naruto-codex-e2e-check.js +14 -7
  205. package/dist/scripts/naruto-shadow-clone-swarm-check.js +4 -201
  206. package/dist/scripts/npm-publish-performance-check.js +20 -12
  207. package/dist/scripts/official-subagent-workflow-check.js +145 -0
  208. package/dist/scripts/package-published-contract-check.js +6 -29
  209. package/dist/scripts/packlist-performance-check.js +18 -21
  210. package/dist/scripts/parallel-verification-engine-check.js +2 -2
  211. package/dist/scripts/prepublish-release-check-or-fast.js +23 -86
  212. package/dist/scripts/python-codex-sdk-all-pipelines-check.js +8 -0
  213. package/dist/scripts/release-affected-selector-check.js +74 -1
  214. package/dist/scripts/release-check-stamp.js +153 -248
  215. package/dist/scripts/release-dag-full-coverage-check.js +7 -15
  216. package/dist/scripts/release-dynamic-presets-check.js +2 -1
  217. package/dist/scripts/release-gate-dag-runner-check.js +0 -1
  218. package/dist/scripts/release-gate-dag-runner.js +12 -1
  219. package/dist/scripts/release-gate-existence-audit.js +1 -2
  220. package/dist/scripts/release-parallel-full-coverage-check.js +12 -6
  221. package/dist/scripts/release-parallel-speed-budget-check.js +18 -2
  222. package/dist/scripts/release-real-check.js +26 -4
  223. package/dist/scripts/release-registry-check.js +61 -16
  224. package/dist/scripts/research-blueprint-densifier-check.js +2 -2
  225. package/dist/scripts/research-real-cycle-no-legacy-final-md-check.js +11 -7
  226. package/dist/scripts/sizecheck.js +2 -2
  227. package/dist/scripts/sks-3-1-4-directive-check-lib.js +8 -2
  228. package/dist/scripts/sks-3-1-5-directive-check-lib.js +3 -2
  229. package/dist/scripts/sks-3-1-6-directive-check-lib.js +5 -3
  230. package/dist/scripts/sks-menubar-install-check.js +14 -1
  231. package/dist/scripts/super-search-provider-interface-check.js +31 -18
  232. package/dist/scripts/trust-fixture-check.js +32 -10
  233. package/dist/scripts/wrongness-fixture-check.js +1 -1
  234. package/dist/scripts/zellij-layout-valid-check.js +5 -5
  235. package/dist/scripts/zellij-spawn-on-demand-layout-check.js +3 -3
  236. package/docs/demo.tape +1 -1
  237. package/infra-harness-gates.json +1486 -0
  238. package/package.json +15 -10
  239. package/release-gates.v2.json +4060 -0
  240. package/runtime-required-scripts.json +9 -0
  241. package/dist/commands/db.js +0 -6
  242. package/dist/core/commands/db-command.js +0 -146
  243. package/dist/core/research/prompt.js +0 -15
  244. package/dist/scripts/codex-0139-feature-probes-check.js +0 -30
  245. package/dist/scripts/codex-0139-marketplace-source-check.js +0 -13
  246. package/dist/scripts/codex-control-tool-call-sequence-repair-check.js +0 -14
@@ -0,0 +1,297 @@
1
+ import fsp from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { nowIso, randomId, writeJsonAtomic, writeTextAtomic } from '../fsx.js';
4
+ import { classifyTaskProfile } from '../runtime/task-profile.js';
5
+ import { chooseVerificationBudget } from '../runtime/verification-budget.js';
6
+ import { buildOfficialSubagentPrompt } from './official-subagent-prompt.js';
7
+ import { readOfficialSubagentConfig } from './official-subagent-config.js';
8
+ import { NARUTO_PARENT_EFFORT, NARUTO_PARENT_MODEL } from './model-policy.js';
9
+ import { MAX_ON_DEMAND_SUBAGENT_ROLE_COUNT, officialSubagentFanoutPolicy, officialSubagentOnDemandRolePlan, officialSubagentRoleCatalog, recommendOfficialSubagentRoles } from './agent-catalog.js';
10
+ import { resolveSubagentThreadBudget } from './thread-budget.js';
11
+ import { readBoundedTriwikiAttention } from './triwiki-attention.js';
12
+ import { SUBAGENT_EVIDENCE_FILENAME, SUBAGENT_EVENT_LOG_FILENAME, SUBAGENT_PARENT_SUMMARY_FILENAME, normalizeSubagentParentSummary, writeSubagentEvidence } from './subagent-evidence.js';
13
+ export const NARUTO_RESULT_SCHEMA = 'sks.naruto-subagent-workflow.v1';
14
+ export const SUBAGENT_PLAN_FILENAME = 'subagent-plan.json';
15
+ export const NARUTO_SUMMARY_FILENAME = 'naruto-summary.json';
16
+ export const NARUTO_GATE_FILENAME = 'naruto-gate.json';
17
+ export async function prepareOfficialSubagentMission(input) {
18
+ const goal = String(input.goal || '').trim();
19
+ const mode = input.mode === 'naruto' ? 'naruto' : 'generic';
20
+ const taskProfile = classifyTaskProfile(goal);
21
+ const suggestedAgents = recommendOfficialSubagentRoles({
22
+ description: goal,
23
+ readOnly: input.readOnly === true,
24
+ requiresWrite: input.readOnly !== true
25
+ });
26
+ const officialConfig = await readOfficialSubagentConfig(input.root);
27
+ const triwikiAttention = await readBoundedTriwikiAttention(input.root, triwikiAttentionLimit(taskProfile), goal);
28
+ const operatorRequested = input.requestedSubagentsExplicit ?? input.requestedSubagents !== undefined;
29
+ const routeContract = mode === 'generic' && !operatorRequested
30
+ ? routeOwnedSubagentContract(input.route)
31
+ : null;
32
+ const requestedSubagents = input.requestedSubagents ?? routeContract?.count;
33
+ const requestedSource = operatorRequested
34
+ ? 'operator'
35
+ : routeContract
36
+ ? 'route_contract'
37
+ : 'automatic';
38
+ const selectedFanoutPolicy = officialSubagentFanoutPolicy({
39
+ ...(requestedSubagents === undefined ? {} : { requestedSubagents }),
40
+ requestedExplicit: requestedSource !== 'automatic',
41
+ requestedSource,
42
+ taskProfile,
43
+ suggestedRoles: suggestedAgents,
44
+ goal
45
+ });
46
+ const budget = resolveSubagentThreadBudget({
47
+ requested: selectedFanoutPolicy.requested_subagents,
48
+ configuredMaxThreads: input.maxThreads ?? officialConfig.maxThreads
49
+ });
50
+ const verification = chooseVerificationBudget({ taskProfile, changedFiles: [] });
51
+ const workflowRunId = String(input.workflowRunId || '').trim()
52
+ || `${mode === 'naruto' ? 'naruto' : 'official'}-${Date.now().toString(36)}-${randomId(8)}`;
53
+ const fanoutPolicy = {
54
+ ...selectedFanoutPolicy,
55
+ requested_subagents: budget.requestedSubagents
56
+ };
57
+ const observedParentModel = String(input.observedParentModel || '').trim() || null;
58
+ const parentModelMatch = observedParentModel ? observedParentModelMatchesPolicy(observedParentModel) : null;
59
+ const delegationGoal = input.readOnly
60
+ ? `${goal}\n\nConstraint: run every delegated slice in read-only mode. Do not edit files.`
61
+ : goal;
62
+ const delegationPrompt = buildOfficialSubagentPrompt({
63
+ goal: delegationGoal,
64
+ slices: [],
65
+ requestedSubagents: budget.requestedSubagents,
66
+ requestedSubagentsExplicit: requestedSource === 'operator',
67
+ requestedSubagentsSource: requestedSource,
68
+ maxThreads: budget.maxThreads,
69
+ decompositionStatus: 'parent_required',
70
+ triwikiAttention,
71
+ recommendedAgents: suggestedAgents
72
+ });
73
+ const selectedAgentPlan = officialSubagentOnDemandRolePlan(suggestedAgents);
74
+ const agentCatalog = onDemandAgentCatalogMetadata(selectedAgentPlan);
75
+ const configBlockers = officialConfig.blockers.map((blocker) => `official_subagent_config:${blocker}`);
76
+ const plan = {
77
+ schema: 'sks.subagent-plan.v1',
78
+ mission_id: input.missionId,
79
+ route: input.route,
80
+ workflow: 'official_codex_subagent',
81
+ workflow_run_id: workflowRunId,
82
+ session_scope: input.sessionScope || null,
83
+ goal,
84
+ read_only: input.readOnly === true,
85
+ task_profile: taskProfile,
86
+ decomposition_status: 'parent_required',
87
+ delegation_prompt: delegationPrompt,
88
+ requested_subagents: budget.requestedSubagents,
89
+ requested_subagents_explicit: requestedSource === 'operator',
90
+ requested_subagents_source: requestedSource,
91
+ route_owned_count_contract: routeContract,
92
+ max_threads: budget.maxThreads,
93
+ first_wave: budget.firstWave,
94
+ wave_count: budget.waveCount,
95
+ max_depth: budget.maxDepth,
96
+ config_source: input.maxThreads === undefined ? officialConfig.sources.maxThreads : 'cli',
97
+ config_sources: officialConfig.sources,
98
+ config_blockers: officialConfig.blockers,
99
+ triwiki_attention: triwikiAttention,
100
+ suggested_agents: suggestedAgents,
101
+ fanout_policy: fanoutPolicy,
102
+ slices: [],
103
+ parent_model_policy: NARUTO_PARENT_MODEL,
104
+ observed_parent_model: observedParentModel,
105
+ parent_model_match: parentModelMatch,
106
+ parent: {
107
+ model: NARUTO_PARENT_MODEL,
108
+ model_reasoning_effort: NARUTO_PARENT_EFFORT
109
+ },
110
+ agent_catalog: agentCatalog,
111
+ agents: selectedAgentPlan,
112
+ verification_budget: verification,
113
+ verification_checks: [],
114
+ verification: { budget: verification },
115
+ legacy_process_swarm_used: false,
116
+ created_at: nowIso()
117
+ };
118
+ const cleanup = [
119
+ fsp.rm(path.join(input.dir, SUBAGENT_PARENT_SUMMARY_FILENAME), { force: true }),
120
+ fsp.rm(path.join(input.dir, SUBAGENT_EVIDENCE_FILENAME), { force: true })
121
+ ];
122
+ if (mode === 'naruto') {
123
+ cleanup.push(fsp.rm(path.join(input.dir, NARUTO_SUMMARY_FILENAME), { force: true }), fsp.rm(path.join(input.dir, NARUTO_GATE_FILENAME), { force: true }));
124
+ }
125
+ await Promise.all(cleanup);
126
+ await writeTextAtomic(path.join(input.dir, SUBAGENT_EVENT_LOG_FILENAME), '');
127
+ await writeJsonAtomic(path.join(input.dir, SUBAGENT_PLAN_FILENAME), plan);
128
+ const evidence = await writeSubagentEvidence(input.dir, {
129
+ requestedSubagents: budget.requestedSubagents,
130
+ events: [],
131
+ parentSummaryPresent: false,
132
+ workflowStatus: 'delegation_context_ready',
133
+ preparationOnly: input.preparationOnly !== false,
134
+ runId: workflowRunId,
135
+ additionalBlockers: configBlockers
136
+ });
137
+ if (mode === 'naruto') {
138
+ const blockers = uniqueStrings([
139
+ ...evidence.blockers,
140
+ ...configBlockers,
141
+ ...(parentModelMatch === false ? [`parent_model_mismatch:${observedParentModel}`] : [])
142
+ ]);
143
+ await writeJsonAtomic(path.join(input.dir, NARUTO_SUMMARY_FILENAME), buildNarutoSummary({
144
+ missionId: input.missionId,
145
+ workflowRunId,
146
+ budget,
147
+ evidence,
148
+ verification,
149
+ status: 'delegation_context_ready',
150
+ ok: false,
151
+ blockers,
152
+ sessionKey: input.sessionScope || null,
153
+ suggestedAgents,
154
+ observedParentModel,
155
+ parentModelMatch
156
+ }));
157
+ await writeNarutoGate(input.dir, {
158
+ missionId: input.missionId,
159
+ workflowRunId,
160
+ evidence,
161
+ passed: false,
162
+ blockers,
163
+ configBlockers,
164
+ observedParentModel,
165
+ parentModelMatch
166
+ });
167
+ }
168
+ return {
169
+ plan,
170
+ evidence,
171
+ budget,
172
+ verification,
173
+ taskProfile,
174
+ delegationPrompt,
175
+ workflowRunId,
176
+ officialConfig,
177
+ triwikiAttention,
178
+ suggestedAgents,
179
+ fanoutPolicy,
180
+ configBlockers,
181
+ observedParentModel,
182
+ parentModelMatch
183
+ };
184
+ }
185
+ function triwikiAttentionLimit(taskProfile) {
186
+ return ['parallel-read', 'parallel-write', 'high-risk'].includes(taskProfile) ? 6 : 4;
187
+ }
188
+ function routeOwnedSubagentContract(route) {
189
+ const normalized = String(route || '').replace(/^\$/, '').trim().toLowerCase();
190
+ if (normalized === 'research') {
191
+ return { count: 3, reason: 'research_exact_three_independent_reviewers' };
192
+ }
193
+ if (normalized === 'autoresearch') {
194
+ return { count: 3, reason: 'autoresearch_exact_three_independent_reviewers' };
195
+ }
196
+ return null;
197
+ }
198
+ export function buildNarutoSummary(input) {
199
+ const parentSummary = normalizeSubagentParentSummary(input.parentSummary);
200
+ const suggestedAgents = Array.isArray(input.suggestedAgents)
201
+ ? uniqueStrings(input.suggestedAgents)
202
+ : [];
203
+ const selectedAgentPlan = officialSubagentOnDemandRolePlan(suggestedAgents);
204
+ return {
205
+ schema: NARUTO_RESULT_SCHEMA,
206
+ ok: input.ok === true,
207
+ completion_evidence: input.ok === true,
208
+ status: input.status,
209
+ route: '$Naruto',
210
+ workflow: 'official_codex_subagent',
211
+ workflow_run_id: input.workflowRunId || input.evidence?.run_id || null,
212
+ mission_id: input.missionId,
213
+ parent: {
214
+ model: NARUTO_PARENT_MODEL,
215
+ model_reasoning_effort: NARUTO_PARENT_EFFORT,
216
+ observed_model: input.observedParentModel || null,
217
+ observed_model_match: input.parentModelMatch ?? null
218
+ },
219
+ requested_subagents: input.budget.requestedSubagents,
220
+ max_threads: input.budget.maxThreads,
221
+ max_depth: input.budget.maxDepth,
222
+ started_subagents: Number(input.evidence?.started_threads || 0),
223
+ completed_subagents: Number(input.evidence?.completed_threads || 0),
224
+ failed_subagents: Number(input.evidence?.failed_threads || 0),
225
+ agent_catalog: onDemandAgentCatalogMetadata(selectedAgentPlan),
226
+ agents: selectedAgentPlan,
227
+ verification: {
228
+ budget: input.verification,
229
+ checks: []
230
+ },
231
+ parent_summary_present: Boolean(input.parentSummary),
232
+ parent_summary: parentSummary.summary,
233
+ parent_thread_outcomes: parentSummary.raw?.thread_outcomes || [],
234
+ app_session: input.appSession === true,
235
+ session_scope: input.sessionKey || null,
236
+ blockers: uniqueStrings(input.blockers || input.evidence?.blockers || []),
237
+ legacy_process_swarm_used: false,
238
+ updated_at: nowIso()
239
+ };
240
+ }
241
+ function onDemandAgentCatalogMetadata(selectedAgentPlan) {
242
+ const selectedAgents = Object.keys(selectedAgentPlan);
243
+ return {
244
+ mode: 'on_demand',
245
+ total_available: officialSubagentRoleCatalog().length,
246
+ selected_count: selectedAgents.length,
247
+ selected_agents: selectedAgents,
248
+ max_injected: MAX_ON_DEMAND_SUBAGENT_ROLE_COUNT,
249
+ full_catalog_injected: false
250
+ };
251
+ }
252
+ export async function writeNarutoGate(dir, input) {
253
+ await writeJsonAtomic(path.join(dir, NARUTO_GATE_FILENAME), buildNarutoGateResult(input));
254
+ }
255
+ export function buildNarutoGateResult(input) {
256
+ const passed = input.passed === true;
257
+ const requested = Number(input.evidence?.requested_subagents || 0);
258
+ const completed = Number(input.evidence?.completed_threads || 0);
259
+ const failed = Number(input.evidence?.failed_threads || 0);
260
+ return {
261
+ schema: 'sks.naruto-gate.v1',
262
+ route: '$Naruto',
263
+ workflow: 'official_codex_subagent',
264
+ workflow_run_id: input.workflowRunId || input.evidence?.run_id || null,
265
+ mission_id: input.missionId,
266
+ parent_model_policy: NARUTO_PARENT_MODEL,
267
+ observed_parent_model: input.observedParentModel || null,
268
+ parent_model_match: input.parentModelMatch ?? null,
269
+ status: passed ? 'passed' : 'blocked',
270
+ passed,
271
+ terminal: passed,
272
+ terminal_state: passed ? 'completed' : 'blocked',
273
+ subagent_plan_ready: true,
274
+ official_subagent_evidence: input.evidence?.ok === true,
275
+ session_cleanup: failed === 0 && requested > 0 && completed >= requested,
276
+ subagent_evidence_ready: input.evidence?.ok === true,
277
+ requested_subagents: requested || null,
278
+ started_subagents: Number(input.evidence?.started_threads || 0),
279
+ completed_subagents: Number(input.evidence?.completed_threads || 0),
280
+ failed_subagents: Number(input.evidence?.failed_threads || 0),
281
+ parent_summary_present: input.evidence?.parent_summary_present === true,
282
+ event_sources: input.evidence?.event_sources || [],
283
+ native_process_proof_required: false,
284
+ legacy_process_swarm_used: false,
285
+ config_blockers: uniqueStrings(input.configBlockers || []),
286
+ blockers: uniqueStrings(input.blockers || input.evidence?.blockers || []),
287
+ missing_fields: uniqueStrings(input.blockers || input.evidence?.blockers || []),
288
+ updated_at: nowIso()
289
+ };
290
+ }
291
+ function observedParentModelMatchesPolicy(model) {
292
+ return model.toLowerCase() === NARUTO_PARENT_MODEL || /gpt[-_. ]?5\.6[-_. ]?sol|\bsol(?:\s+max)?\b/i.test(model);
293
+ }
294
+ function uniqueStrings(values) {
295
+ return [...new Set(values.map((value) => String(value || '').trim()).filter(Boolean))];
296
+ }
297
+ //# sourceMappingURL=official-subagent-preparation.js.map
@@ -0,0 +1,159 @@
1
+ import { HARD_NARUTO_MAX_THREADS } from './thread-budget.js';
2
+ import { MAX_AUTOMATIC_REVIEWER_COUNT, MAX_AUTOMATIC_SUBAGENT_COUNT, officialSubagentOnDemandRoleCatalog, officialSubagentRoleCatalog, selectOfficialSubagentRole } from './agent-catalog.js';
3
+ export function buildOfficialSubagentPrompt(input) {
4
+ const maxThreads = clampThreads(input.maxThreads);
5
+ const requestedSubagents = normalizeRequestedSubagents(input.requestedSubagents, input.slices.length);
6
+ const waveCount = requestedSubagents === 0 ? 0 : Math.ceil(requestedSubagents / maxThreads);
7
+ const parentDecompositionRequired = input.decompositionStatus === 'parent_required';
8
+ const requestedSource = input.requestedSubagentsSource === 'route_contract'
9
+ ? 'route_contract'
10
+ : input.requestedSubagentsExplicit === true || input.requestedSubagentsSource === 'operator'
11
+ ? 'operator'
12
+ : 'automatic';
13
+ const requestedPolicy = requestedSource === 'operator'
14
+ ? `${requestedSubagents} (explicit operator request)`
15
+ : requestedSource === 'route_contract'
16
+ ? `${requestedSubagents} (route-owned exact orchestration contract)`
17
+ : `${requestedSubagents} (risk-based automatic count; two independent children are the non-trivial default; keep the plan and evidence count exact)`;
18
+ const triwiki = renderBoundedTriwikiAttention(input.triwikiAttention);
19
+ const resolvedSlices = input.slices.map((slice) => ({
20
+ slice,
21
+ agentName: slice.agent || selectOfficialSubagentRole({
22
+ title: slice.title,
23
+ description: slice.description,
24
+ role: slice.kind,
25
+ ...(slice.paths === undefined ? {} : { paths: slice.paths }),
26
+ readOnly: slice.readOnly === true,
27
+ requiresWrite: slice.readOnly !== true
28
+ })
29
+ }));
30
+ const catalog = renderAgentCatalog([
31
+ ...resolvedSlices.map((row) => row.agentName),
32
+ ...(input.recommendedAgents || [])
33
+ ]);
34
+ const rows = resolvedSlices.map(({ slice, agentName }, index) => {
35
+ const mode = slice.readOnly ? 'read-only' : 'use the parent permission mode';
36
+ const paths = (slice.paths || []).map((entry) => String(entry).trim()).filter(Boolean);
37
+ const role = officialSubagentOnDemandRoleCatalog([agentName])[0];
38
+ return [
39
+ `${index + 1}. [${slice.id}] use custom agent \`${agentName}\``,
40
+ ` title: ${slice.title}`,
41
+ ` task: ${slice.description}`,
42
+ ` model policy: ${role ? `${role.model_policy} (${role.model}/${role.model_reasoning_effort})` : 'resolve from installed custom agent'}`,
43
+ ` mode: ${mode}`,
44
+ ` paths: ${paths.join(', ') || 'assigned by parent'}`
45
+ ].join('\n');
46
+ }).join('\n');
47
+ return `
48
+ Use a Codex subagent workflow for the independent slices below.
49
+
50
+ Parent agent:
51
+ - model policy: gpt-5.6-sol with max reasoning
52
+ - owns decomposition, integration, and final answer
53
+ - do not do duplicate work already delegated
54
+
55
+ Subagent rules:
56
+ - use only Codex official subagent threads; do not launch shell workers, a custom scheduler, a worker pool, or model fanout
57
+ - select the narrowest matching project custom agent by its description; the custom agent name is the spawn type
58
+ - use \`worker\` with gpt-5.6-luna and max reasoning only for tiny, short-context, mechanical work with no exploration or judgment
59
+ - use gpt-5.6-sol with high reasoning for ordinary UI, logic, backend, and native implementation
60
+ - use gpt-5.6-sol with max reasoning for review, debugging, planning, architecture, security, database, research, release, ambiguity, and every judgment-bearing slice
61
+ - use gpt-5.6-terra with medium reasoning for long-context analysis and direct Computer Use, Browser/Chrome, or image-generation execution
62
+ - split mixed work when possible: Terra gathers or operates, Sol High implements, and Sol Max judges; when one slice cannot be split safely, judgment takes priority
63
+ - never assign Luna to long-context, exploration, review, debugging, planning, or tool-heavy work
64
+ - automatic fan-out is selected before execution: two independent children for non-trivial work,
65
+ and at most ${MAX_AUTOMATIC_SUBAGENT_COUNT} only for critical multi-domain risk; trivial Answer/DFix work is filtered before this route
66
+ - automatic reviewer-only fan-out is capped at ${MAX_AUTOMATIC_REVIEWER_COUNT} for ordinary work; critical multi-domain review may use the overall cap of ${MAX_AUTOMATIC_SUBAGENT_COUNT}
67
+ - requested subagents: ${requestedPolicy}
68
+ - max open agent threads: ${maxThreads}
69
+ - planned waves: ${waveCount}
70
+ - max depth: 1
71
+ - subagents must not spawn subagents
72
+ - parallel writes require disjoint paths
73
+ - if paths overlap, run those slices serially
74
+ - wait for every requested subagent before integrating
75
+ - close completed threads after collecting results
76
+ ${parentDecompositionRequired ? `- decomposition status: parent_required
77
+ - before spawning, decompose the goal into independent, non-overlapping slices
78
+ - do not invent write scopes merely to reach the requested count
79
+ ${requestedSource === 'operator'
80
+ ? '- the explicit operator count is authoritative; if it cannot be defended safely, block and report instead of silently changing it'
81
+ : requestedSource === 'route_contract'
82
+ ? '- the route-owned exact count is authoritative; preserve it and follow the route-specific orchestration contract'
83
+ : '- if fewer defensible slices exist, reduce the delegation plan and requested count before execution; never increase automatically beyond the selected count'}` : '- decomposition status: ready'}
84
+
85
+ Central TriWiki context:
86
+ ${triwiki}
87
+
88
+ Project custom agent catalog:
89
+ ${catalog}
90
+
91
+ Goal:
92
+ ${String(input.goal || '').trim()}
93
+
94
+ Slices:
95
+ ${rows || '(parent decomposition required before any subagent is spawned)'}
96
+
97
+ Final parent output:
98
+ - return one JSON object as the final message; prose outside that object is not completion evidence
99
+ - use this exact schema so SKS can correlate every stopped agent thread with a trustworthy parent outcome:
100
+ {
101
+ "schema": "sks.subagent-parent-summary.v1",
102
+ "status": "completed|blocked|failed",
103
+ "summary": "Completion Summary: concise integrated result. Honest Mode: goal/evidence/checks/gaps assessment.",
104
+ "thread_outcomes": [
105
+ { "thread_id": "official agent/thread id", "status": "completed|blocked|failed", "summary": "slice result" }
106
+ ],
107
+ "changed_files": [],
108
+ "verification": [],
109
+ "blockers": []
110
+ }
111
+ - include one thread_outcomes row for every requested subagent; a SubagentStop event alone never proves success
112
+ - keep completion summary and Honest Mode wording inside the JSON fields; do not add prose outside the object
113
+ `.trim();
114
+ }
115
+ function renderBoundedTriwikiAttention(value) {
116
+ if (!value?.available || value.anchors.length === 0) {
117
+ return [
118
+ '- no bounded attention anchors are available; rely on current scoped sources',
119
+ '- do not compensate by making every subagent reread the entire repository or full TriWiki pack'
120
+ ].join('\n');
121
+ }
122
+ const anchors = value.anchors.map((anchor) => ({
123
+ id: anchor.id,
124
+ claim_hash: anchor.claim_hash,
125
+ source_hash: anchor.source_hash,
126
+ hydrate_hint: anchor.hydrate_hint
127
+ }));
128
+ return [
129
+ `- consume these ${anchors.length} attention.use_first anchors before broad discovery`,
130
+ '- hydrate a referenced source only when its anchor is relevant to the assigned slice or a risky decision',
131
+ '- do not inject the full context pack or make each subagent repeat repository-wide context discovery',
132
+ `- bounded anchors: ${JSON.stringify(anchors)}`
133
+ ].join('\n');
134
+ }
135
+ function renderAgentCatalog(requested) {
136
+ const names = [...new Set(requested.map(String).map((name) => name.trim()).filter(Boolean))];
137
+ const selected = officialSubagentOnDemandRoleCatalog(names.length ? names : ['expert']);
138
+ const preferred = new Set(names);
139
+ return [
140
+ `- metadata mode: on-demand (${selected.length}/${officialSubagentRoleCatalog().length} roles included; full catalog is not injected)`,
141
+ ...selected.map((role) => {
142
+ const marker = preferred.has(role.name) ? ' [suggested for this goal]' : '';
143
+ return `- \`${role.name}\`${marker}: ${role.model_policy}, ${role.model}/${role.model_reasoning_effort}, ${role.sandbox_mode}; ${role.description}`;
144
+ })
145
+ ].join('\n');
146
+ }
147
+ function clampThreads(value) {
148
+ const parsed = Number(value);
149
+ if (!Number.isFinite(parsed))
150
+ return 1;
151
+ return Math.max(1, Math.min(HARD_NARUTO_MAX_THREADS, Math.floor(parsed)));
152
+ }
153
+ function normalizeRequestedSubagents(value, fallback) {
154
+ const parsed = value === undefined || value === null || value === '' ? fallback : Number(value);
155
+ if (!Number.isFinite(parsed))
156
+ return Math.max(0, Math.min(HARD_NARUTO_MAX_THREADS, fallback));
157
+ return Math.max(0, Math.min(HARD_NARUTO_MAX_THREADS, Math.floor(parsed)));
158
+ }
159
+ //# sourceMappingURL=official-subagent-prompt.js.map
@@ -0,0 +1,129 @@
1
+ import fsp from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { runProcess } from '../fsx.js';
5
+ import { NARUTO_PARENT_EFFORT, NARUTO_PARENT_MODEL } from './model-policy.js';
6
+ import { inspectCodexLbCliLaunchRecovery } from '../codex-control/codex-lb-launch-recovery.js';
7
+ export const OFFICIAL_SUBAGENT_WORKFLOW_SCHEMA = 'sks.subagent-workflow.v1';
8
+ export function detectCodexAppSession(env = process.env) {
9
+ if (env.SKS_NARUTO_STANDALONE_CLI === '1')
10
+ return false;
11
+ if (env.SKS_NARUTO_APP_SESSION === '1')
12
+ return true;
13
+ return Boolean(env.CODEX_THREAD_ID);
14
+ }
15
+ export function codexAppSessionKey(env = process.env) {
16
+ if (!detectCodexAppSession(env))
17
+ return null;
18
+ const threadId = String(env.CODEX_THREAD_ID || '').trim();
19
+ return threadId || null;
20
+ }
21
+ export function buildOfficialSubagentCodexArgs(input) {
22
+ return [
23
+ 'exec',
24
+ '-m', NARUTO_PARENT_MODEL,
25
+ '-c', `model_reasoning_effort="${NARUTO_PARENT_EFFORT}"`,
26
+ '-c', `agents.max_threads=${Math.max(1, Math.floor(input.maxThreads))}`,
27
+ '-c', 'agents.max_depth=1',
28
+ '--output-last-message', input.parentSummaryFile,
29
+ input.prompt
30
+ ];
31
+ }
32
+ export async function runOfficialSubagentWorkflow(input) {
33
+ const base = {
34
+ schema: OFFICIAL_SUBAGENT_WORKFLOW_SCHEMA,
35
+ workflow: 'official_codex_subagent',
36
+ requested_subagents: input.requestedSubagents,
37
+ max_threads: input.maxThreads,
38
+ max_depth: 1,
39
+ parent_model: NARUTO_PARENT_MODEL,
40
+ parent_reasoning_effort: NARUTO_PARENT_EFFORT,
41
+ session_scope: input.sessionKey || null,
42
+ legacy_process_swarm_used: false
43
+ };
44
+ if (input.appSession) {
45
+ return {
46
+ ...base,
47
+ ok: false,
48
+ status: 'delegation_context_ready',
49
+ prepared: true,
50
+ additionalContext: input.prompt,
51
+ completion_evidence: false,
52
+ note: 'The current Codex parent must spawn and await the official subagents. Preparation is not completion evidence.'
53
+ };
54
+ }
55
+ const childEnv = {
56
+ ...(input.env || {}),
57
+ SKS_NARUTO_STANDALONE_CLI: '0',
58
+ SKS_NARUTO_PARENT_LAUNCH: '1',
59
+ ...(input.missionId ? { SKS_NARUTO_PARENT_MISSION_ID: input.missionId } : {})
60
+ };
61
+ const parentSummaryFile = path.join(os.tmpdir(), `sks-naruto-parent-summary-${process.pid}-${Date.now()}.txt`);
62
+ const args = buildOfficialSubagentCodexArgs({
63
+ prompt: input.prompt,
64
+ maxThreads: input.maxThreads,
65
+ parentSummaryFile
66
+ });
67
+ const toolOutputRecovery = await inspectCodexLbCliLaunchRecovery({
68
+ root: input.root,
69
+ env: { ...process.env, ...childEnv },
70
+ cliArgs: args.slice(0, -1)
71
+ });
72
+ if (!toolOutputRecovery.ok) {
73
+ return {
74
+ ...base,
75
+ ok: false,
76
+ status: 'tool_output_recovery_blocked',
77
+ prepared: false,
78
+ codex_exit_code: null,
79
+ parent_summary: null,
80
+ parent_summary_file: null,
81
+ tool_output_recovery: toolOutputRecovery,
82
+ blockers: toolOutputRecovery.blockers,
83
+ operator_actions: toolOutputRecovery.operator_actions,
84
+ completion_evidence: false
85
+ };
86
+ }
87
+ await fsp.mkdir(path.dirname(parentSummaryFile), { recursive: true });
88
+ const execute = input.runProcessImpl || runProcess;
89
+ let processResult;
90
+ try {
91
+ processResult = await execute(input.codexBin || 'codex', args, {
92
+ cwd: input.root,
93
+ timeoutMs: input.timeoutMs || 60 * 60 * 1000,
94
+ maxOutputBytes: 256 * 1024,
95
+ env: childEnv
96
+ });
97
+ }
98
+ catch (error) {
99
+ processResult = {
100
+ code: -1,
101
+ stdout: '',
102
+ stderr: String(error?.message || error),
103
+ stdoutBytes: 0,
104
+ stderrBytes: 0,
105
+ truncated: false,
106
+ timedOut: false
107
+ };
108
+ }
109
+ const parentSummary = await fsp.readFile(parentSummaryFile, 'utf8').catch(() => '');
110
+ await fsp.rm(parentSummaryFile, { force: true }).catch(() => undefined);
111
+ return {
112
+ ...base,
113
+ ok: processResult.code === 0,
114
+ status: processResult.code === 0 ? 'parent_completed' : 'parent_failed',
115
+ codex_exit_code: processResult.code,
116
+ parent_summary: parentSummary.trim() || null,
117
+ parent_summary_file: null,
118
+ tool_output_recovery: toolOutputRecovery,
119
+ process: {
120
+ pid: processResult.pid || null,
121
+ timed_out: processResult.timedOut,
122
+ stdout_tail: processResult.stdout,
123
+ stderr_tail: processResult.stderr,
124
+ output_truncated: processResult.truncated
125
+ },
126
+ completion_evidence: false
127
+ };
128
+ }
129
+ //# sourceMappingURL=official-subagent-runner.js.map