@ornexus/neocortex 4.60.16

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 (235) hide show
  1. package/LICENSE +56 -0
  2. package/LICENSE-COMMERCIAL.md +70 -0
  3. package/README.md +58 -0
  4. package/dist/sbom.cdx.json +11159 -0
  5. package/docs/install/coderabbit-manual-setup.md +86 -0
  6. package/docs/install/installer-diagnostics.md +107 -0
  7. package/docs/install/linux-global-install.md +97 -0
  8. package/install.js +572 -0
  9. package/install.ps1 +2214 -0
  10. package/install.sh +2013 -0
  11. package/package.json +132 -0
  12. package/packages/client/dist/adapters/adapter-registry.d.ts +61 -0
  13. package/packages/client/dist/adapters/adapter-registry.js +1 -0
  14. package/packages/client/dist/adapters/antigravity-adapter.d.ts +18 -0
  15. package/packages/client/dist/adapters/antigravity-adapter.js +2 -0
  16. package/packages/client/dist/adapters/claude-code-adapter.d.ts +19 -0
  17. package/packages/client/dist/adapters/claude-code-adapter.js +3 -0
  18. package/packages/client/dist/adapters/codex-adapter.d.ts +19 -0
  19. package/packages/client/dist/adapters/codex-adapter.js +2 -0
  20. package/packages/client/dist/adapters/cursor-adapter.d.ts +19 -0
  21. package/packages/client/dist/adapters/cursor-adapter.js +4 -0
  22. package/packages/client/dist/adapters/gemini-adapter.d.ts +18 -0
  23. package/packages/client/dist/adapters/gemini-adapter.js +2 -0
  24. package/packages/client/dist/adapters/index.d.ts +19 -0
  25. package/packages/client/dist/adapters/index.js +1 -0
  26. package/packages/client/dist/adapters/platform-detector.d.ts +48 -0
  27. package/packages/client/dist/adapters/platform-detector.js +1 -0
  28. package/packages/client/dist/adapters/target-adapter.d.ts +70 -0
  29. package/packages/client/dist/adapters/target-adapter.js +0 -0
  30. package/packages/client/dist/adapters/vscode-adapter.d.ts +19 -0
  31. package/packages/client/dist/adapters/vscode-adapter.js +2 -0
  32. package/packages/client/dist/agent/refresh-stubs.d.ts +90 -0
  33. package/packages/client/dist/agent/refresh-stubs.js +2 -0
  34. package/packages/client/dist/agent/update-agent-yaml.d.ts +26 -0
  35. package/packages/client/dist/agent/update-agent-yaml.js +1 -0
  36. package/packages/client/dist/agent/update-description.d.ts +45 -0
  37. package/packages/client/dist/agent/update-description.js +1 -0
  38. package/packages/client/dist/cache/crypto-utils.d.ts +30 -0
  39. package/packages/client/dist/cache/crypto-utils.js +1 -0
  40. package/packages/client/dist/cache/encrypted-cache.d.ts +30 -0
  41. package/packages/client/dist/cache/encrypted-cache.js +1 -0
  42. package/packages/client/dist/cache/in-memory-asset-cache.d.ts +62 -0
  43. package/packages/client/dist/cache/in-memory-asset-cache.js +1 -0
  44. package/packages/client/dist/cache/index.d.ts +13 -0
  45. package/packages/client/dist/cache/index.js +1 -0
  46. package/packages/client/dist/cache/protected-pi-boundary.d.ts +19 -0
  47. package/packages/client/dist/cache/protected-pi-boundary.js +1 -0
  48. package/packages/client/dist/checkpoint/checkpoint-client-reader.d.ts +45 -0
  49. package/packages/client/dist/checkpoint/checkpoint-client-reader.js +2 -0
  50. package/packages/client/dist/checkpoint/index.d.ts +12 -0
  51. package/packages/client/dist/checkpoint/index.js +1 -0
  52. package/packages/client/dist/checkpoint/shared-checkpoint-types.d.ts +85 -0
  53. package/packages/client/dist/checkpoint/shared-checkpoint-types.js +1 -0
  54. package/packages/client/dist/cli.d.ts +14 -0
  55. package/packages/client/dist/cli.js +81 -0
  56. package/packages/client/dist/commands/activate.d.ts +55 -0
  57. package/packages/client/dist/commands/activate.js +8 -0
  58. package/packages/client/dist/commands/cache-status.d.ts +39 -0
  59. package/packages/client/dist/commands/cache-status.js +2 -0
  60. package/packages/client/dist/commands/invoke.d.ts +546 -0
  61. package/packages/client/dist/commands/invoke.js +140 -0
  62. package/packages/client/dist/commands/refresh-memory.d.ts +11 -0
  63. package/packages/client/dist/commands/refresh-memory.js +1 -0
  64. package/packages/client/dist/config/resolver-selection.d.ts +40 -0
  65. package/packages/client/dist/config/resolver-selection.js +1 -0
  66. package/packages/client/dist/config/secure-config.d.ts +78 -0
  67. package/packages/client/dist/config/secure-config.js +12 -0
  68. package/packages/client/dist/constants.d.ts +25 -0
  69. package/packages/client/dist/constants.js +1 -0
  70. package/packages/client/dist/context/context-collector.d.ts +28 -0
  71. package/packages/client/dist/context/context-collector.js +2 -0
  72. package/packages/client/dist/context/context-sanitizer.d.ts +28 -0
  73. package/packages/client/dist/context/context-sanitizer.js +1 -0
  74. package/packages/client/dist/continuity/autonomous-governance.d.ts +84 -0
  75. package/packages/client/dist/continuity/autonomous-governance.js +1 -0
  76. package/packages/client/dist/continuity/continuity-client-state-store.d.ts +302 -0
  77. package/packages/client/dist/continuity/continuity-client-state-store.js +1 -0
  78. package/packages/client/dist/continuity/invoke-hooks.d.ts +19 -0
  79. package/packages/client/dist/continuity/invoke-hooks.js +1 -0
  80. package/packages/client/dist/continuity/migrations/001-initial-schema.d.ts +11 -0
  81. package/packages/client/dist/continuity/migrations/001-initial-schema.js +263 -0
  82. package/packages/client/dist/continuity/migrations/002-processing-output-summary-indexes.d.ts +11 -0
  83. package/packages/client/dist/continuity/migrations/002-processing-output-summary-indexes.js +7 -0
  84. package/packages/client/dist/continuity/migrations/003-headless-execution-attempts.d.ts +11 -0
  85. package/packages/client/dist/continuity/migrations/003-headless-execution-attempts.js +62 -0
  86. package/packages/client/dist/continuity/migrations/004-outbox-delivery-state.d.ts +11 -0
  87. package/packages/client/dist/continuity/migrations/004-outbox-delivery-state.js +19 -0
  88. package/packages/client/dist/continuity/migrations/005-bounded-headless-queue.d.ts +11 -0
  89. package/packages/client/dist/continuity/migrations/005-bounded-headless-queue.js +35 -0
  90. package/packages/client/dist/continuity/outbox.d.ts +83 -0
  91. package/packages/client/dist/continuity/outbox.js +1 -0
  92. package/packages/client/dist/continuity/runner-bootstrap-policy.d.ts +50 -0
  93. package/packages/client/dist/continuity/runner-bootstrap-policy.js +1 -0
  94. package/packages/client/dist/continuity/sqlite-store.d.ts +926 -0
  95. package/packages/client/dist/continuity/sqlite-store.js +619 -0
  96. package/packages/client/dist/errors/error-messages.d.ts +40 -0
  97. package/packages/client/dist/errors/error-messages.js +2 -0
  98. package/packages/client/dist/graph-retrieval/pre-command-hook.d.ts +34 -0
  99. package/packages/client/dist/graph-retrieval/pre-command-hook.js +1 -0
  100. package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.d.ts +99 -0
  101. package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.js +1 -0
  102. package/packages/client/dist/i18n/first-run.d.ts +23 -0
  103. package/packages/client/dist/i18n/first-run.js +2 -0
  104. package/packages/client/dist/index.d.ts +56 -0
  105. package/packages/client/dist/index.js +1 -0
  106. package/packages/client/dist/license/index.d.ts +5 -0
  107. package/packages/client/dist/license/index.js +1 -0
  108. package/packages/client/dist/license/license-client.d.ts +79 -0
  109. package/packages/client/dist/license/license-client.js +1 -0
  110. package/packages/client/dist/machine/fingerprint.d.ts +34 -0
  111. package/packages/client/dist/machine/fingerprint.js +2 -0
  112. package/packages/client/dist/machine/index.d.ts +5 -0
  113. package/packages/client/dist/machine/index.js +1 -0
  114. package/packages/client/dist/memory/project-memory-writer.d.ts +74 -0
  115. package/packages/client/dist/memory/project-memory-writer.js +36 -0
  116. package/packages/client/dist/memory/shared-project-memory-types.d.ts +370 -0
  117. package/packages/client/dist/memory/shared-project-memory-types.js +2 -0
  118. package/packages/client/dist/policy/architecture-policy.d.ts +40 -0
  119. package/packages/client/dist/policy/architecture-policy.js +2 -0
  120. package/packages/client/dist/policy/index.d.ts +8 -0
  121. package/packages/client/dist/policy/index.js +1 -0
  122. package/packages/client/dist/policy/shared-policy-types.d.ts +89 -0
  123. package/packages/client/dist/policy/shared-policy-types.js +0 -0
  124. package/packages/client/dist/resilience/circuit-breaker.d.ts +70 -0
  125. package/packages/client/dist/resilience/circuit-breaker.js +1 -0
  126. package/packages/client/dist/resilience/degradation-manager.d.ts +67 -0
  127. package/packages/client/dist/resilience/degradation-manager.js +1 -0
  128. package/packages/client/dist/resilience/freshness-indicator.d.ts +59 -0
  129. package/packages/client/dist/resilience/freshness-indicator.js +1 -0
  130. package/packages/client/dist/resilience/index.d.ts +8 -0
  131. package/packages/client/dist/resilience/index.js +1 -0
  132. package/packages/client/dist/resilience/recovery-detector.d.ts +59 -0
  133. package/packages/client/dist/resilience/recovery-detector.js +1 -0
  134. package/packages/client/dist/resolvers/asset-resolver.d.ts +79 -0
  135. package/packages/client/dist/resolvers/asset-resolver.js +0 -0
  136. package/packages/client/dist/resolvers/local-resolver.d.ts +26 -0
  137. package/packages/client/dist/resolvers/local-resolver.js +8 -0
  138. package/packages/client/dist/resolvers/remote-resolver.d.ts +91 -0
  139. package/packages/client/dist/resolvers/remote-resolver.js +1 -0
  140. package/packages/client/dist/runner/binary.d.ts +115 -0
  141. package/packages/client/dist/runner/binary.js +1 -0
  142. package/packages/client/dist/runner/cli.d.ts +168 -0
  143. package/packages/client/dist/runner/cli.js +70 -0
  144. package/packages/client/dist/runner/headless/adapters.d.ts +20 -0
  145. package/packages/client/dist/runner/headless/adapters.js +1 -0
  146. package/packages/client/dist/runner/headless/claude-code-adapter.d.ts +8 -0
  147. package/packages/client/dist/runner/headless/claude-code-adapter.js +1 -0
  148. package/packages/client/dist/runner/headless/fake-adapter.d.ts +8 -0
  149. package/packages/client/dist/runner/headless/fake-adapter.js +1 -0
  150. package/packages/client/dist/runner/headless/opencode-adapter.d.ts +15 -0
  151. package/packages/client/dist/runner/headless/opencode-adapter.js +2 -0
  152. package/packages/client/dist/runner/headless/resolver.d.ts +68 -0
  153. package/packages/client/dist/runner/headless/resolver.js +1 -0
  154. package/packages/client/dist/runner/headless/run-yolo.d.ts +59 -0
  155. package/packages/client/dist/runner/headless/run-yolo.js +1 -0
  156. package/packages/client/dist/runner/headless/run-yoloop.d.ts +113 -0
  157. package/packages/client/dist/runner/headless/run-yoloop.js +1 -0
  158. package/packages/client/dist/runner/headless/types.d.ts +194 -0
  159. package/packages/client/dist/runner/headless/types.js +2 -0
  160. package/packages/client/dist/runner/local-console.d.ts +83 -0
  161. package/packages/client/dist/runner/local-console.js +13 -0
  162. package/packages/client/dist/runner/portal-sync-worker.d.ts +184 -0
  163. package/packages/client/dist/runner/portal-sync-worker.js +1 -0
  164. package/packages/client/dist/runner/project-identity.d.ts +19 -0
  165. package/packages/client/dist/runner/project-identity.js +1 -0
  166. package/packages/client/dist/runner/scheduler.d.ts +186 -0
  167. package/packages/client/dist/runner/scheduler.js +7 -0
  168. package/packages/client/dist/runner-cli.d.ts +9 -0
  169. package/packages/client/dist/runner-cli.js +3 -0
  170. package/packages/client/dist/state/project-state-snapshot.d.ts +24 -0
  171. package/packages/client/dist/state/project-state-snapshot.js +1 -0
  172. package/packages/client/dist/state/state-json-repair.d.ts +74 -0
  173. package/packages/client/dist/state/state-json-repair.js +3 -0
  174. package/packages/client/dist/telemetry/index.d.ts +5 -0
  175. package/packages/client/dist/telemetry/index.js +1 -0
  176. package/packages/client/dist/telemetry/offline-queue.d.ts +57 -0
  177. package/packages/client/dist/telemetry/offline-queue.js +1 -0
  178. package/packages/client/dist/tier/index.d.ts +5 -0
  179. package/packages/client/dist/tier/index.js +1 -0
  180. package/packages/client/dist/tier/tier-aware-client.d.ts +105 -0
  181. package/packages/client/dist/tier/tier-aware-client.js +1 -0
  182. package/packages/client/dist/types/index.d.ts +140 -0
  183. package/packages/client/dist/types/index.js +1 -0
  184. package/packages/client/dist/yoloop/discovery-hook.d.ts +85 -0
  185. package/packages/client/dist/yoloop/discovery-hook.js +2 -0
  186. package/packages/client/dist/yoloop/index.d.ts +10 -0
  187. package/packages/client/dist/yoloop/index.js +1 -0
  188. package/packages/client/dist/yoloop/invoke-hooks.d.ts +127 -0
  189. package/packages/client/dist/yoloop/invoke-hooks.js +5 -0
  190. package/packages/client/dist/yoloop/shared-discover-epics.d.ts +289 -0
  191. package/packages/client/dist/yoloop/shared-discover-epics.js +1 -0
  192. package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +172 -0
  193. package/packages/client/dist/yoloop/shared-yoloop-types.js +1 -0
  194. package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +124 -0
  195. package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -0
  196. package/postinstall.js +754 -0
  197. package/targets-stubs/antigravity/README.md +36 -0
  198. package/targets-stubs/antigravity/gemini.md +29 -0
  199. package/targets-stubs/antigravity/install-antigravity.sh +153 -0
  200. package/targets-stubs/antigravity/mcp-config.json +30 -0
  201. package/targets-stubs/antigravity/skill/SKILL.md +166 -0
  202. package/targets-stubs/claude-code/.mcp.json +32 -0
  203. package/targets-stubs/claude-code/README.md +20 -0
  204. package/targets-stubs/claude-code/neocortex-root.agent.yaml +42 -0
  205. package/targets-stubs/claude-code/neocortex-root.md +317 -0
  206. package/targets-stubs/claude-code/neocortex.agent.yaml +42 -0
  207. package/targets-stubs/claude-code/neocortex.md +385 -0
  208. package/targets-stubs/codex/AGENTS.md +250 -0
  209. package/targets-stubs/codex/README.md +47 -0
  210. package/targets-stubs/codex/config-mcp.toml +22 -0
  211. package/targets-stubs/codex/install-codex.sh +63 -0
  212. package/targets-stubs/codex/neocortex.toml +33 -0
  213. package/targets-stubs/cursor/README.md +33 -0
  214. package/targets-stubs/cursor/agent.md +211 -0
  215. package/targets-stubs/cursor/install-cursor.sh +50 -0
  216. package/targets-stubs/cursor/mcp.json +30 -0
  217. package/targets-stubs/gemini-cli/README.md +34 -0
  218. package/targets-stubs/gemini-cli/agent.md +241 -0
  219. package/targets-stubs/gemini-cli/agents/neocortex.md +60 -0
  220. package/targets-stubs/gemini-cli/gemini.md +46 -0
  221. package/targets-stubs/gemini-cli/install-gemini.sh +70 -0
  222. package/targets-stubs/gemini-cli/settings-mcp.json +30 -0
  223. package/targets-stubs/kimi/mcp.json +33 -0
  224. package/targets-stubs/kimi/neocortex.md +60 -0
  225. package/targets-stubs/lib/mcp-merge.js +189 -0
  226. package/targets-stubs/openclaw/README.md +12 -0
  227. package/targets-stubs/openclaw/SKILL.md +92 -0
  228. package/targets-stubs/opencode/neocortex-root.md +267 -0
  229. package/targets-stubs/opencode/neocortex.md +65 -0
  230. package/targets-stubs/opencode/opencode-mcp.json +35 -0
  231. package/targets-stubs/vscode/README.md +34 -0
  232. package/targets-stubs/vscode/copilot-instructions.md +47 -0
  233. package/targets-stubs/vscode/install-vscode.sh +72 -0
  234. package/targets-stubs/vscode/mcp.json +36 -0
  235. package/targets-stubs/vscode/neocortex.agent.md +252 -0
@@ -0,0 +1,113 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * P190.06 -- runner root-owned execution plane for run_yoloop directives.
6
+ */
7
+ import { type ContinuityHeadlessExecutionAttemptStatus, type ContinuitySqliteStore } from '../../continuity/sqlite-store.js';
8
+ import { HeadlessAdapterRegistry } from './adapters.js';
9
+ import { type HeadlessAdapterExecutionOptions, type HeadlessAdapterId, type HeadlessRedactionEvidence } from './types.js';
10
+ export declare const DEFAULT_HEADLESS_YOLOOP_MAX_ITERATIONS = 20;
11
+ export declare const DEFAULT_HEADLESS_YOLOOP_MAX_DURATION_MS: number;
12
+ export declare const DEFAULT_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP = 1;
13
+ export declare const MAX_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP = 10;
14
+ export declare const RUN_YOLOOP_DRIVER_STATES: readonly ["start", "metadata_parse", "child_story_delegation", "reinvoke", "complete", "aborted", "backoff"];
15
+ export type RunYoloopDriverState = (typeof RUN_YOLOOP_DRIVER_STATES)[number];
16
+ export interface RunYoloopRootInvokeInput {
17
+ readonly projectRoot: string;
18
+ readonly args: string;
19
+ readonly attemptId: string;
20
+ readonly executionId: string;
21
+ readonly jobId: string;
22
+ readonly runnerId: string;
23
+ readonly iteration: number;
24
+ readonly runtimeId: HeadlessAdapterId;
25
+ readonly modelId?: string;
26
+ readonly timeoutMs: number;
27
+ readonly serverUrl?: string;
28
+ }
29
+ export interface RunYoloopRootInvokeResult {
30
+ readonly success: boolean;
31
+ readonly instructions?: string;
32
+ readonly metadata?: Record<string, unknown>;
33
+ readonly error?: string;
34
+ readonly errorCode?: string;
35
+ readonly exitCode?: number;
36
+ readonly durationMs?: number;
37
+ readonly publicSafe?: true;
38
+ }
39
+ export type RunYoloopRootInvoker = (input: RunYoloopRootInvokeInput) => Promise<RunYoloopRootInvokeResult>;
40
+ export interface RunYoloopExecutionPhaseOptions {
41
+ readonly store: ContinuitySqliteStore;
42
+ readonly projectRoot: string;
43
+ readonly runnerId: string;
44
+ readonly now: () => string;
45
+ readonly metadata?: Record<string, unknown> | readonly Record<string, unknown>[];
46
+ readonly adapterRegistry?: HeadlessAdapterRegistry;
47
+ readonly adapterOptions?: HeadlessAdapterExecutionOptions;
48
+ readonly runtimeDefaults?: unknown;
49
+ readonly runtimeFallback?: unknown | false;
50
+ readonly limit?: number;
51
+ readonly leaseMs?: number;
52
+ readonly staleLeaseAfterMs?: number;
53
+ readonly timeoutMs?: number;
54
+ readonly backoffMs?: number;
55
+ readonly maxAttempts?: number;
56
+ readonly queueCap?: number;
57
+ readonly maxIterations?: number;
58
+ readonly maxDurationMs?: number;
59
+ readonly localConcurrencyCap?: number;
60
+ readonly yoloopInvoker?: RunYoloopRootInvoker;
61
+ readonly idFactory?: (prefix: string, attemptId: string) => string;
62
+ readonly serverUrl?: string;
63
+ }
64
+ export interface RunYoloopAggregateCounts {
65
+ readonly iterations: number;
66
+ readonly childCount: number;
67
+ readonly succeededChildCount: number;
68
+ readonly failedChildCount: number;
69
+ readonly skippedChildCount: number;
70
+ readonly metadataCompleteCount: number;
71
+ readonly metadataAbortedCount: number;
72
+ }
73
+ export interface RunYoloopExecutionReceipt {
74
+ readonly attemptId: string;
75
+ readonly executionId: string;
76
+ readonly jobId: string;
77
+ readonly status: ContinuityHeadlessExecutionAttemptStatus;
78
+ readonly outcome: 'applied' | 'failed' | 'ignored' | 'deferred';
79
+ readonly reasonCode: string;
80
+ readonly timestamp: string;
81
+ readonly childStoryIds: readonly string[];
82
+ readonly aggregateCounts: RunYoloopAggregateCounts;
83
+ readonly workerPoolSummary: RunYoloopWorkerPoolSummary;
84
+ readonly redactionSummary: readonly HeadlessRedactionEvidence[];
85
+ readonly publicSafe: true;
86
+ }
87
+ export interface RunYoloopWorkerPoolSummary {
88
+ readonly mode: 'serial' | 'parallel_wave';
89
+ readonly serverMaxConcurrency: number;
90
+ readonly localCap: number;
91
+ readonly queueCap: number;
92
+ readonly availableLeases: number;
93
+ readonly effectiveConcurrency: number;
94
+ readonly peakConcurrency: number;
95
+ readonly pendingChildCount: number;
96
+ readonly startedChildCount: number;
97
+ readonly completedChildCount: number;
98
+ readonly backpressurePauseCount: number;
99
+ readonly reasonCodes: readonly string[];
100
+ readonly publicSafe: true;
101
+ }
102
+ export interface RunYoloopExecutionPhaseSummary {
103
+ readonly ok: boolean;
104
+ readonly enqueuedAttemptCount: number;
105
+ readonly dueAttemptCount: number;
106
+ readonly processedAttemptCount: number;
107
+ readonly recoveredAttemptIds: readonly string[];
108
+ readonly receipts: readonly RunYoloopExecutionReceipt[];
109
+ readonly reasonCodes: readonly string[];
110
+ readonly publicSafe: true;
111
+ }
112
+ export declare function defaultYoloopRootInvoker(input: RunYoloopRootInvokeInput): Promise<RunYoloopRootInvokeResult>;
113
+ export declare function runYoloopExecutionPhase(options: RunYoloopExecutionPhaseOptions): Promise<RunYoloopExecutionPhaseSummary>;
@@ -0,0 +1 @@
1
+ import{randomBytes as ue}from"node:crypto";import{invoke as me}from"../../commands/invoke.js";import{AUTONOMOUS_GOVERNANCE_EVIDENCE_TAG as pe,AUTONOMOUS_GOVERNANCE_REASON_CODES as se,autonomousGovernanceMetadata as fe,buildAutonomousGovernanceEnvelope as ye,readAutonomousGovernanceEnvelopeFromMetadata as he,recordAutonomousGovernance as _e}from"../../continuity/autonomous-governance.js";import{createDefaultHeadlessAdapterRegistry as Ce}from"./adapters.js";import{loadHeadlessRuntimeDefaults as Ie,resolveHeadlessRuntime as Ae}from"./resolver.js";import{DEFAULT_HEADLESS_EXECUTION_BACKOFF_MS as Se,DEFAULT_HEADLESS_EXECUTION_LEASE_MS as be,DEFAULT_HEADLESS_EXECUTION_LIMIT as Ee,DEFAULT_HEADLESS_EXECUTION_MAX_ATTEMPTS as ge,DEFAULT_HEADLESS_EXECUTION_STALE_LEASE_AFTER_MS as Oe,DEFAULT_HEADLESS_EXECUTION_TIMEOUT_MS as ke,headlessExecutionEntityId as N,runYoloExecutionPhase as Re}from"./run-yolo.js";import{HEADLESS_REASON_CODES as d,boundPublicSummary as Z,hashPublicValue as g,redaction as f}from"./types.js";const ve=20,Te=1800*1e3,ne=1,Pe=10,It=Object.freeze(["start","metadata_parse","child_story_delegation","reinvoke","complete","aborted","backoff"]),G=/^docs\/epics\/epic-[A-Za-z0-9._-]+\.md$/,xe=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,ie=/^\*yolo @docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,Le=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,j=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/,z=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,A=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY))/i,De=new Set(["schemaVersion","contractVersion","kind","commandClass","jobId","operationId","idempotencyKey","targetKind","targetRef","commandRef","epicId","runtime","publicSummary","reasonCode","attempts","metadata","redactionSummary","publicSafe"]),Me=new Set(["runtimeId","modelId","source","reasonCode","publicSafe"]),we="job-aborted",Ne="max-iterations-reached",je="max-duration-reached";async function He(e){const r=Date.now(),t=await me({args:e.args,projectRoot:e.projectRoot,format:"json",platformTarget:"runner",serverUrl:e.serverUrl});return{success:t.success,instructions:t.instructions,metadata:t.metadata,error:t.error,errorCode:t.errorCode,exitCode:t.exitCode,durationMs:Date.now()-r,publicSafe:!0}}async function At(e){const r=e.adapterRegistry??Ce(),t=L(e.limit??Ee,1,10),o=L(e.leaseMs??be,1e3,3600*1e3),a=L(e.staleLeaseAfterMs??Oe,0,1440*60*1e3),n=L(e.maxAttempts??ge,1,10),s=L(e.localConcurrencyCap??ne,1,Pe),i=[],l=[],c=e.now(),u=Ke({store:e.store,metadata:e.metadata,nowIso:c,maxAttempts:n,queueCap:e.queueCap});i.push(...u.reasonCodes);const m=e.store.recoverStaleHeadlessExecutionAttempts({nowIso:c,staleAfterMs:a,limit:t*2});m.recoveredAttemptIds.length>0&&(i.push(d.EXECUTION_BACKOFF),m.failedAttemptIds.length>0&&i.push(d.EXECUTION_TIMEOUT));const _=e.store.listDueHeadlessExecutionAttempts({nowIso:e.now(),limit:Math.max(t*5,10)}).filter(y=>y.directive_kind==="run_yoloop").slice(0,t);for(const y of _){const p=await Ue({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,attempt:y,registry:r,now:e.now,leaseMs:o,timeoutMs:L(e.timeoutMs??ke,1e3,18e5),backoffMs:L(e.backoffMs??Se,1e3,36e5),maxAttempts:n,maxIterations:L(e.maxIterations??ve,1,100),maxDurationMs:L(e.maxDurationMs??Te,1e3,72e5),localConcurrencyCap:s,queueCap:e.queueCap,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,yoloopInvoker:e.yoloopInvoker??He,serverUrl:e.serverUrl,idFactory:e.idFactory??lt});l.push(p),i.push(p.reasonCode,...p.workerPoolSummary.reasonCodes)}return{ok:l.every(y=>y.outcome!=="failed")&&u.rejectedCount===0,enqueuedAttemptCount:u.enqueuedCount,dueAttemptCount:_.length,processedAttemptCount:l.filter(y=>y.outcome!=="ignored").length,recoveredAttemptIds:m.recoveredAttemptIds,receipts:l,reasonCodes:x(i.length>0?i:[d.OK]),publicSafe:!0}}function Ke(e){let r=0,t=0;const o=[];for(const a of ot(e.metadata)){if(!C(a)||a.kind!=="run_yoloop")continue;const n=Be(a);if(!n.ok){t+=1,o.push(n.reasonCode);continue}const s=n.directive;if(!e.store.jobExists(s.jobId)){t+=1,o.push(se.BYPASS_BLOCKED);continue}const i=at(s);if(e.store.hasCompletedHeadlessExecutionDirectiveHash(i)){o.push(d.EXECUTION_COMPLETED);continue}const l=ye({autonomousKind:"run_yoloop",source:"headless-run-yoloop",targetKind:"epic",targetRef:s.targetRef,epicId:s.epicId??V(s.targetRef),jobId:s.jobId,operationSeed:s.operationId,commandHash:g(s.commandRef)}),c=_e(e.store,l,e.nowIso,{requireExistingJob:!0});if(!c.ok){t+=1,o.push(c.reasonCode);continue}const u=N("attempt",s.idempotencyKey),m=N("exec",s.operationId),_=e.store.enqueueHeadlessExecutionAttempt({attemptId:u,executionId:m,jobId:s.jobId,directiveHash:i,directiveKind:"run_yoloop",commandClass:s.commandClass,targetKind:"epic",targetRef:s.targetRef,epicId:s.epicId??V(s.targetRef),runtimeId:s.runtime?.runtimeId,modelId:s.runtime?.modelId,runtimeSource:ct(s.runtime?.source),reasonCode:s.reasonCode,publicSummary:s.publicSummary,enqueuedAt:e.nowIso,notBeforeAt:e.nowIso,maxAttempts:e.maxAttempts,queueCap:e.queueCap,operationId:`${s.operationId}:enqueue`,idempotencyKey:s.idempotencyKey,counts:{directives:1},hashes:{directive:i},redactionSummary:s.redactionSummary,relativePaths:[s.targetRef],metadata:fe(l,{schemaVersion:1,contractVersion:"continuity-v1",jobId:s.jobId,operationId:s.operationId,reasonCode:s.reasonCode??d.OK,targetRef:s.targetRef,directiveHash:i})});if(!_.accepted){t+=1,o.push(_.reasonCode??"queue-cap-reached");continue}_.inserted&&(r+=1),o.push(d.OK)}return{enqueuedCount:r,rejectedCount:t,reasonCodes:x(o)}}async function Ue(e){const r=e.now(),t=e.idFactory("lease",e.attempt.attempt_id),o=le(r,e.leaseMs);if(!e.store.claimHeadlessExecutionAttempt({attemptId:e.attempt.attempt_id,leaseId:t,runnerId:e.runnerId,claimedAt:r,leaseExpiresAt:o,reasonCode:d.OK}).inserted)return et(e.attempt,{status:e.attempt.status,receiptStatus:"ignored",reasonCode:"lease-conflict",timestamp:r});if(e.store.hasCompletedHeadlessExecutionDirectiveHash(e.attempt.directive_hash,e.attempt.attempt_id))return Q(e.store,e.attempt,{leaseId:t,runnerId:e.runnerId,status:"skipped",receiptStatus:"ignored",reasonCode:d.EXECUTION_COMPLETED,publicSummary:"Skipped duplicate run_yoloop directive because the directive hash is already completed.",completedAt:e.now(),counts:te(),hashes:{directive:e.attempt.directive_hash},redactionSummary:[],relativePaths:[e.attempt.target_ref],childStoryIds:[],stateTransitions:["start","complete"]});const s=Fe(e);if(!s.ok)return Q(e.store,e.attempt,{leaseId:t,runnerId:e.runnerId,status:s.status,receiptStatus:s.receiptStatus,reasonCode:s.reasonCode,publicSummary:s.publicSummary,completedAt:e.now(),counts:te(),hashes:{directive:e.attempt.directive_hash},redactionSummary:s.redactionSummary,relativePaths:nt(e.attempt),childStoryIds:[],stateTransitions:["start"]});const i=await $e({...e,prepared:s.input}),l=tt(e.attempt,i,e.maxAttempts,e.backoffMs,e.now()),c=l.retry?"backoff":i.status,u=l.retry?"deferred":i.receiptStatus,m=l.retry?d.EXECUTION_BACKOFF:i.reasonCode,_=l.retry?"Headless run_yoloop execution scheduled bounded retry after transient metadata/runtime outcome.":i.publicSummary;return Q(e.store,e.attempt,{leaseId:t,runnerId:e.runnerId,status:c,receiptStatus:u,reasonCode:m,publicSummary:_,completedAt:e.now(),durationMs:i.durationMs,notBeforeAt:l.notBeforeAt,retryCount:l.retryCount,counts:i.counts,workerPoolSummary:i.workerPoolSummary,hashes:{...i.hashes,directive:e.attempt.directive_hash},redactionSummary:i.redactionSummary,relativePaths:i.relativePaths,childStoryIds:i.childStoryIds,runtimeId:s.input.runtimeId,modelId:s.input.modelId,runtimeSource:s.input.runtimeSource,stateTransitions:i.stateTransitions})}async function $e(e){const r=Date.now(),t=["start"],o=new Set,a=[],n=[],s={root:g(e.prepared.rootPrompt)},i=[f("rootPrompt","prompt_body",s.root)];let l=0,c=0,u=0,m=0,_=0,y=0;const p=de(e.localConcurrencyCap);for(;;){if(l>=e.maxIterations)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:Ne,publicSummary:"Headless yoloop reached the bounded iteration limit before completion metadata.",retryable:!1,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});if(Date.now()-r>e.maxDurationMs)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:je,publicSummary:"Headless yoloop reached the bounded duration limit before completion metadata.",retryable:!1,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});t.push("metadata_parse");const h=await e.yoloopInvoker({projectRoot:e.projectRoot,args:e.prepared.rootPrompt,attemptId:e.attempt.attempt_id,executionId:e.attempt.execution_id,jobId:e.attempt.job_id,runnerId:e.runnerId,iteration:l,runtimeId:e.prepared.runtimeId,...e.prepared.modelId?{modelId:e.prepared.modelId}:{},timeoutMs:e.timeoutMs,serverUrl:e.serverUrl});if(h.durationMs!==void 0&&(s[`iter-${l}`]=g(String(h.durationMs))),!h.success)return t.push("backoff"),P({status:"backoff",receiptStatus:"deferred",reasonCode:d.EXECUTION_FAILED,publicSummary:"Headless yoloop root metadata invocation failed with bounded public evidence.",retryable:!0,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});const b=h.metadata,D=Je(b);if(!D.ok)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:D.reasonCode,publicSummary:D.publicSummary,retryable:!1,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:[...i,...D.redactionSummary],relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});if(D.aborted)return y+=1,t.push("aborted"),P({status:"failed",receiptStatus:"failed",reasonCode:we,publicSummary:"Headless yoloop stopped because public metadata reported an aborted loop.",retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});if(D.complete)return _+=1,t.push("complete"),P({status:"completed",receiptStatus:"applied",reasonCode:d.EXECUTION_COMPLETED,publicSummary:"Headless yoloop completed after public metadata reported yoloopComplete.",retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});const O=Xe(b,e.prepared.epicId);if(!O.ok)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:O.reasonCode,publicSummary:O.publicSummary,retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:[...i,...O.redactionSummary],relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});const oe=O.prompts.find(M=>o.has(M.storyId));if(oe)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:d.YOLOOP_ISOLATION_VIOLATION,publicSummary:"Headless yoloop rejected cyclic child story delegation evidence.",retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:[...i,f("storyId","prompt_body",g(oe.storyId))],relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});p.mode=O.parallelAuthorized?"parallel_wave":"serial",p.serverMaxConcurrency=O.serverMaxConcurrency,p.pendingChildCount=O.prompts.length;const q=[...O.prompts];for(;q.length>0;){const M=Ye({store:e.store,nowIso:e.now(),localCap:e.localConcurrencyCap,serverMaxConcurrency:O.serverMaxConcurrency,parallelAuthorized:O.parallelAuthorized});if(p.queueCap=M.queueCap,p.availableLeases=M.availableLeases,p.effectiveConcurrency=M.effectiveConcurrency,p.reasonCodes.push(M.reasonCode),M.effectiveConcurrency===0)return p.backpressurePauseCount+=1,p.pendingChildCount=q.length,t.push("backoff"),P({status:"backoff",receiptStatus:"deferred",reasonCode:d.WORKER_POOL_BACKPRESSURE_PAUSED,publicSummary:"Headless yoloop paused child workers because bounded queue or lease capacity was unavailable.",retryable:!0,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});const W=q.splice(0,M.effectiveConcurrency);p.startedChildCount+=W.length,p.peakConcurrency=Math.max(p.peakConcurrency,W.length),p.pendingChildCount=q.length,t.push("child_story_delegation");const ae=await Promise.all(W.map(E=>ze({...e,child:E,iteration:l})));p.completedChildCount+=ae.length;let w;for(const E of ae){const B=E.child;s[`child-${B.storyId.replace(/[^A-Za-z0-9_.:-]/g,"-")}`]=E.commandHash,i.push(E.promptRedaction),a.push(B.storyId),n.push(B.targetRef),o.add(B.storyId);const $=E.receipt;if(!$){E.reasonCodes.includes("queue-cap-reached")?(p.backpressurePauseCount+=1,p.pendingChildCount+=1,p.reasonCodes.push(d.WORKER_POOL_BACKPRESSURE_PAUSED),w??={kind:"deferred",reasonCode:d.WORKER_POOL_BACKPRESSURE_PAUSED}):(u+=1,w??={kind:"missing",reasonCode:d.EXECUTION_FAILED});continue}if($.outcome==="deferred"){w??={kind:"deferred",reasonCode:d.EXECUTION_BACKOFF};continue}if($.outcome==="failed"){u+=1,w??={kind:"failed",reasonCode:$.reasonCode||d.EXECUTION_FAILED};continue}$.outcome==="ignored"?m+=1:c+=1}if(w){const E=w.kind==="deferred";return P({status:E?"backoff":"failed",receiptStatus:E?"deferred":"failed",reasonCode:w.reasonCode,publicSummary:w.kind==="missing"?"Headless yoloop child story delegation did not produce a public receipt.":E?"Headless yoloop child story delegated bounded backoff to the root attempt.":"Headless yoloop child story execution failed with public receipt evidence.",retryable:E,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t})}}l+=1,t.push("reinvoke")}}async function ze(e){const r=Qe({rootAttempt:e.attempt,child:e.child,iteration:e.iteration,runtimeId:e.prepared.runtimeId,modelId:e.prepared.modelId,runtimeSource:e.prepared.runtimeSource}),t=N("attempt",r.idempotencyKey),o=await Re({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,now:e.now,metadata:{continuityExecutionDirectives:[r]},adapterRegistry:e.registry,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,timeoutMs:e.timeoutMs,maxAttempts:1,limit:1,queueCap:e.queueCap,attemptIds:[t],idFactory:e.idFactory});return{child:e.child,receipt:o.receipts.find(a=>a.attemptId===t)??o.receipts[0],reasonCodes:o.reasonCodes,commandHash:g(e.child.commandRef),promptRedaction:f(`child.${e.child.storyId}`,"prompt_body",g(e.child.commandRef))}}function Ye(e){const r=e.store.collectSnapshotRows({nowIso:e.nowIso,jobLimit:1,staleLeaseLimit:1,receiptLimit:1,eventLimit:1,snapshotLimit:1}),t=Math.max(1,Math.floor(r.queue.capacity)),o=Math.max(0,Math.floor(r.queue.running)-1),a=Math.max(0,e.localCap-o),n=Math.max(0,Math.min(a,Math.floor(r.queue.available))),s=e.parallelAuthorized?Math.max(1,Math.floor(e.serverMaxConcurrency)):1,i=Math.max(0,Math.min(s,e.localCap,t,n));return{queueCap:t,availableLeases:n,effectiveConcurrency:i,reasonCode:i===0?d.WORKER_POOL_BACKPRESSURE_PAUSED:e.parallelAuthorized&&i>1?d.WORKER_POOL_PARALLEL_ACTIVE:d.WORKER_POOL_SERIAL_FALLBACK}}function de(e){return{mode:"serial",serverMaxConcurrency:1,localCap:e,queueCap:1,availableLeases:1,effectiveConcurrency:1,peakConcurrency:0,pendingChildCount:0,startedChildCount:0,completedChildCount:0,backpressurePauseCount:0,reasonCodes:[]}}function k(e){return{mode:e.mode,serverMaxConcurrency:T(e.serverMaxConcurrency),localCap:T(e.localCap),queueCap:T(e.queueCap),availableLeases:T(e.availableLeases),effectiveConcurrency:T(e.effectiveConcurrency),peakConcurrency:T(e.peakConcurrency),pendingChildCount:T(e.pendingChildCount),startedChildCount:T(e.startedChildCount),completedChildCount:T(e.completedChildCount),backpressurePauseCount:T(e.backpressurePauseCount),reasonCodes:x(e.reasonCodes.length>0?e.reasonCodes:[d.WORKER_POOL_SERIAL_FALLBACK]).slice(0,10),publicSafe:!0}}function J(e=ne){return k(de(e))}function T(e){return Number.isFinite(e)?Math.max(0,Math.min(1e4,Math.floor(e))):0}function Fe(e){const r=he(e.attempt.metadata_json,{autonomousKind:"run_yoloop",jobId:e.attempt.job_id,targetKind:"epic",targetRef:e.attempt.target_ref});if(!r.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:r.reasonCode,publicSummary:r.publicSummary,redactionSummary:r.redactionSummary};const t=Ve(e.attempt);if(!t.ok)return t;const o=qe(e);if(!o.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:o.reasonCode,publicSummary:o.publicSummary,redactionSummary:o.redactionSummary};const a=e.attempt.epic_id??V(e.attempt.target_ref);return{ok:!0,input:{rootPrompt:`*yoloop @${e.attempt.target_ref}`,targetRef:e.attempt.target_ref,epicId:a,runtimeId:o.runtimeId,...o.modelId?{modelId:o.modelId}:{},runtimeSource:o.runtimeSource,publicSafe:!0}}}function Ve(e){const r=[];e.directive_kind!=="run_yoloop"&&r.push(f("directiveKind","unsafe_key","value-denied")),e.target_kind!=="epic"&&r.push(f("targetKind","prompt_body","value-denied")),(!G.test(e.target_ref)||j.test(e.target_ref)||A.test(e.target_ref))&&r.push(f("targetRef","prompt_body","value-denied"));const t=V(e.target_ref);return e.epic_id&&e.epic_id!==t&&r.push(f("epicId","prompt_body","value-denied")),r.length>0?{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:d.PROMPT_REJECTED,publicSummary:"Headless run_yoloop attempt did not match the canonical public epic prompt shape.",redactionSummary:r}:{ok:!0,input:{rootPrompt:`*yoloop @${e.target_ref}`,targetRef:e.target_ref,epicId:t,runtimeId:"fake",publicSafe:!0}}}function qe(e){const r=e.runtimeDefaults!==void 0?e.runtimeDefaults:Ie({projectRoot:e.projectRoot});if(C(r)&&r.ok===!1)return{ok:!1,reasonCode:d.RUNTIME_UNTRUSTED,publicSummary:typeof r.publicSummary=="string"?r.publicSummary:"Headless runtime defaults failed public-safety validation.",redactionSummary:Array.isArray(r.redactionSummary)?r.redactionSummary:[]};const t=dt(e.attempt.runtime_source)??"explicit",o=e.attempt.runtime_id||e.attempt.model_id?{...e.attempt.runtime_id?{runtimeId:e.attempt.runtime_id}:{},...e.attempt.model_id?{modelId:e.attempt.model_id}:{},source:t,publicSafe:!0}:void 0,a={registry:e.registry,defaults:r,fallback:e.runtimeFallback};o&&(t==="origin"?a.origin=o:t==="default"?a.projectDefault=o:t==="fallback"?a.fallback=o:a.explicit=o);const n=Ae(a);return n.ok?{ok:!0,runtimeId:n.runtimeId,...n.modelId?{modelId:n.modelId}:{},runtimeSource:n.runtimeSource}:{ok:!1,reasonCode:n.reasonCode,publicSummary:n.publicSummary,redactionSummary:n.redactionSummary}}function Be(e){const r=[];for(const b of Object.keys(e))(!De.has(b)||z.test(b))&&r.push(f(b,U(b),"key-denied"));e.publicSafe!==!0&&r.push(f("publicSafe","unsafe_key","value-denied"));const t=S(e,"kind"),o=S(e,"commandClass"),a=S(e,"jobId"),n=S(e,"operationId"),s=S(e,"idempotencyKey"),i=S(e,"targetKind"),l=S(e,"targetRef"),c=S(e,"commandRef"),u=S(e,"publicSummary"),m=S(e,"epicId");t!=="run_yoloop"&&r.push(f("kind","unsafe_key","value-denied")),o!=="goal-tick"&&o!=="loop-tick"&&r.push(f("commandClass","unsafe_key","value-denied")),re(a)||r.push(f("jobId","unsafe_key","value-denied")),re(n)||r.push(f("operationId","unsafe_key","value-denied")),re(s)||r.push(f("idempotencyKey","unsafe_key","value-denied")),(i!=="epic"||!l||!G.test(l)||A.test(l))&&r.push(f("targetRef","prompt_body","value-denied"));const _=l?`*yoloop @${l}`:void 0;(!c||c!==_||c.includes("@neocortex")||j.test(c)||A.test(c))&&r.push(f("commandRef","prompt_body","value-denied")),m&&l&&m!==V(l)&&r.push(f("epicId","prompt_body","value-denied")),(!u||u.length>240||A.test(u))&&r.push(f("publicSummary","unbounded_text","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||A.test(e.reasonCode))&&r.push(f("reasonCode","unsafe_key","value-denied"));const y=rt(e.runtime,r);e.attempts!==void 0&&X(e.attempts,"attempts",r),e.metadata!==void 0&&X(e.metadata,"metadata",r);const p=C(e.metadata)?e.metadata:void 0,h=st(e.redactionSummary,r);return r.length>0||t!=="run_yoloop"||!o||!a||!n||!s||!l||!c||!u?{ok:!1,reasonCode:r.some(D=>D.reason==="prompt_body")?d.PROMPT_REJECTED:d.DIRECTIVE_REJECTED,redactionSummary:r}:{ok:!0,directive:{kind:"run_yoloop",commandClass:o,jobId:a,operationId:n,idempotencyKey:s,targetKind:"epic",targetRef:l,commandRef:c,...m?{epicId:m}:{},...y?{runtime:y}:{},publicSummary:u,...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},...p?{metadata:p}:{},...h.length>0?{redactionSummary:h}:{},publicSafe:!0}}}function Xe(e,r){if(!e)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop metadata was missing.",[]);const t=We(e);if(!t.ok)return t;const o=[],a=C(e.yoloopExecutionPlan)?e.yoloopExecutionPlan:void 0,n=a?R(a.storyIds).filter(K):[];let s;if(a){const c=Ze(a);if(!c.ok)return c;s=c;for(const u of Ge(a)){const m=H(u,r,"execution-plan");if(!m.ok)return m;o.push(m.prompt)}if(o.length===0)for(const u of n){const m=H(`*yolo @docs/stories/${u}.story.md`,r,"execution-plan");if(!m.ok)return m;o.push(m.prompt)}}const i=typeof e.nextStoryId=="string"&&K(e.nextStoryId)?e.nextStoryId:void 0;for(const c of Array.isArray(e.skillDirectives)?e.skillDirectives:[]){if(!C(c)||c.kind!=="task")continue;const u=R(c.promptTemplates);if(u.length>0){for(const p of u){const h=H(p,r,"task-directive");if(!h.ok)return h;o.push(h.prompt)}continue}const m=typeof c.promptTemplate=="string"?c.promptTemplate:void 0;if(!m)continue;const _=R(c.storyIds).filter(K),y=_.length>0?_:i?[i]:[];if(y.length===0&&ie.test(m)){const p=H(m,r,"task-directive");if(!p.ok)return p;o.push(p.prompt);continue}for(const p of y){const h=m.includes("{storyId}")?m.replaceAll("{storyId}",p):m,b=H(h,r,"task-directive");if(!b.ok)return b;o.push(b.prompt)}}if(o.length===0&&i){const c=H(`*yolo @docs/stories/${i}.story.md`,r,"next-story");if(!c.ok)return c;o.push(c.prompt)}const l=ut(o,c=>c.commandRef);if(n.length>0){const c=new Set(n);for(const u of l)if(!c.has(u.storyId))return I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a child prompt outside the server-authorized execution plan.",[f("storyId","prompt_body",g(u.storyId))])}return s?.parallelAuthorized&&!F(l.map(c=>c.storyId),n)?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop rejected a parallel plan whose executable prompts did not match the selected wave.",[]):l.length===0?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop metadata did not include an authorized per-story child prompt.",[]):{ok:!0,prompts:l,mode:s?.mode??"legacy",serverMaxConcurrency:s?.serverMaxConcurrency??1,parallelAuthorized:s?.parallelAuthorized??!1,reasonCodes:[d.OK,s?.parallelAuthorized?d.WORKER_POOL_PARALLEL_ACTIVE:d.WORKER_POOL_SERIAL_FALLBACK]}}function We(e){const r=[];return e.nextStoryId!==void 0&&Y(e.nextStoryId,"nextStoryId",r),e.yoloopExecutionPlan!==void 0&&Y(e.yoloopExecutionPlan,"yoloopExecutionPlan",r),Array.isArray(e.skillDirectives)&&e.skillDirectives.forEach((t,o)=>{C(t)&&t.kind==="task"&&Y(t,`skillDirectives.${o}`,r)}),r.length>0?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop rejected unsafe public metadata before child delegation.",r):{ok:!0}}function Y(e,r,t){if(typeof e=="string"){(A.test(e)||/\0/.test(e))&&t.push(f(r,U(r),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((o,a)=>Y(o,`${r}.${a}`,t));return}if(C(e)){for(const[o,a]of Object.entries(e)){const n=`${r}.${o}`;!(o==="promptTemplate"||o==="promptTemplates"||o==="childPromptKind"||o==="allowMetaTaskPromptInChild"||o==="authorization")&&z.test(o)&&t.push(f(n,U(o),"key-denied")),Y(a,n,t)}return}t.push(f(r,"unsafe_key","value-denied"))}}function Ze(e){const r=typeof e.mode=="string"?e.mode:"",t=C(e.isolationPolicy)?e.isolationPolicy:void 0,o=R(e.storyIds);if(e.authorization!=="server_authorized")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan was not server-authorized.",[]);if(e.executor!=="root_agent"&&e.executor!=="root_agent_with_child_tasks")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan executor was not root-owned.",[]);if(r!=="serial"&&r!=="parallel_wave"&&r!=="manual")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan mode was invalid.",[]);if(!Array.isArray(e.storyIds)||o.length===0||o.length!==e.storyIds.length||o.some(h=>!K(h))||new Set(o).size!==o.length)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan story selection was invalid or ambiguous.",[]);if(!t||t.rootOwnsLoop!==!0||t.childPromptKind!=="per_story_yolo_only"&&!(t.childPromptKind==="none"&&(r==="serial"&&t.childTaskDelegation==="not_required"||r==="parallel_wave"&&e.executor==="root_agent"&&t.childTaskDelegation==="forbidden"))||t.allowOuterYoloopInChild!==!1||t.allowMetaTaskPromptInChild!==!1)return I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected an execution plan that did not preserve root-owned child isolation.",[f("isolationPolicy","prompt_body","value-denied")]);const a=Array.isArray(e.skippedStories)?e.skippedStories:[];for(const h of a){if(!C(h)||typeof h.storyId!="string"||!K(h.storyId)||typeof h.reason!="string")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop skipped-story evidence was malformed.",[]);if(o.includes(h.storyId))return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop selected a story that server evidence marked skipped.",[])}if(r!=="parallel_wave")return{ok:!0,mode:r,serverMaxConcurrency:1,parallelAuthorized:!1};const n=e.maxConcurrency,s=e.maxParallel,i=C(e.dependencyBasis)?e.dependencyBasis:void 0,l=C(e.readinessBasis)?e.readinessBasis:void 0,c=Array.isArray(e.parallelWaves)?e.parallelWaves:[],u=c.length===1&&C(c[0])?c[0]:void 0;if(t.rootOwnedScheduling!=="parallel_wave_allowed"||!Number.isInteger(n)||typeof n!="number"||n<2||n>o.length||!Number.isInteger(s)||s!==n||!i||i.source!=="state_snapshot"||!F(R(i.storyIds),o)||!l||l.source!=="ready_wave"||!F(R(l.selectedStoryIds),o)||!u||!F(R(u.storyIds),o)||u.maxConcurrency!==n)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan lacked consistent bounded authorization and readiness evidence.",[]);const m=R(u.promptTemplates);if(m.length!==o.length||new Set(m).size!==m.length)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel wave prompts were incomplete or ambiguous.",[]);const y=(Array.isArray(u.proofSummaries)?u.proofSummaries:Array.isArray(e.proofSummaries)?e.proofSummaries:[]).find(h=>C(h)&&F(R(h.storyIds),o));return!C(y)||y.dependencyClosure!=="resolved"||y.contractOwnership!=="non_overlapping"||y.validationSurfaces!=="compatible"?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan lacked resolved independence proof.",[]):a.find(h=>C(h)&&typeof h.reason=="string"&&/(cycle|unresolved|ambiguous)/i.test(h.reason))?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan contained unresolved dependency evidence.",[]):{ok:!0,mode:"parallel_wave",serverMaxConcurrency:n,parallelAuthorized:!0}}function Ge(e){const r=[];r.push(...R(e.promptTemplates));for(const t of Array.isArray(e.serialSteps)?e.serialSteps:[])C(t)&&typeof t.promptTemplate=="string"&&r.push(t.promptTemplate);for(const t of Array.isArray(e.parallelWaves)?e.parallelWaves:[])C(t)&&r.push(...R(t.promptTemplates));return r}function H(e,r,t){if(e.includes("@neocortex")||e.includes("*yoloop")||j.test(e)||A.test(e))return I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected an unsafe child prompt shape.",[f("promptTemplate","prompt_body",g(e))]);if(!ie.test(e))return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop child prompt did not match the canonical per-story yolo shape.",[f("promptTemplate","prompt_body",g(e))]);const o=e.replace(/^\*yolo @/,""),a=it(o);return!xe.test(o)||!K(a)||!a.startsWith(`${r}.`)?I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a child prompt outside the targeted public epic.",[f("storyId","prompt_body",g(a))]):{ok:!0,prompt:{storyId:a,targetRef:o,commandRef:e,source:t}}}function Je(e){if(!e||!C(e))return{ok:!1,reasonCode:d.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop root invocation did not return public metadata.",redactionSummary:[]};const r=e.yoloopComplete===!0,t=e.yoloopAborted===!0;return r&&t?{ok:!1,reasonCode:d.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop metadata reported mutually exclusive terminal states.",redactionSummary:[f("yoloopTerminal","unsafe_key","value-denied")]}:{ok:!0,complete:r,aborted:t}}function Qe(e){const r=N("child-op",`${e.rootAttempt.execution_id}-${e.iteration}-${e.child.storyId}`),t=N("child-idem",`${e.rootAttempt.attempt_id}-${e.iteration}-${e.child.storyId}`);return{schemaVersion:1,contractVersion:"continuity-v1",kind:"run_yolo",commandClass:e.rootAttempt.command_class==="goal-tick"?"goal-tick":"loop-tick",jobId:e.rootAttempt.job_id,operationId:r,idempotencyKey:t,targetKind:"story",targetRef:e.child.targetRef,commandRef:e.child.commandRef,storyId:e.child.storyId,runtime:{runtimeId:e.runtimeId,...e.modelId?{modelId:e.modelId}:{},source:e.runtimeSource??"explicit",reasonCode:e.runtimeSource==="fallback"?d.RUNTIME_FALLBACK:d.RUNTIME_EXPLICIT,publicSafe:!0},publicSummary:`Root-owned yoloop delegated public story ${e.child.storyId}.`,reasonCode:d.OK,metadata:{governanceSource:"delegated-subagent",parentAttemptId:e.rootAttempt.attempt_id,parentExecutionId:e.rootAttempt.execution_id,iteration:e.iteration,publicSafe:!0},attempts:[],redactionSummary:[f("prompt","prompt_body",g(e.child.commandRef))],publicSafe:!0}}function Q(e,r,t){const o=ce(t.hashes),a=t.workerPoolSummary??J(),n=ce({iterations:t.counts.iterations,childCount:t.counts.childCount,succeededChildCount:t.counts.succeededChildCount,failedChildCount:t.counts.failedChildCount,skippedChildCount:t.counts.skippedChildCount,metadataCompleteCount:t.counts.metadataCompleteCount,metadataAbortedCount:t.counts.metadataAbortedCount,serverMaxConcurrency:a.serverMaxConcurrency,localCap:a.localCap,queueCap:a.queueCap,availableLeases:a.availableLeases,effectiveConcurrency:a.effectiveConcurrency,peakConcurrency:a.peakConcurrency,pendingChildCount:a.pendingChildCount,startedChildCount:a.startedChildCount,completedChildCount:a.completedChildCount,backpressurePauseCount:a.backpressurePauseCount}),s={schemaVersion:1,contractVersion:"continuity-v1",attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.job_id,directiveHash:r.directive_hash,status:t.status,reasonCode:t.reasonCode,storyIds:t.childStoryIds.slice(0,50),counts:n,hashes:o,...t.reasonCode===se.BYPASS_BLOCKED?{governanceEvidence:pe}:{},reasonCodes:x([t.reasonCode,...a.reasonCodes,...t.stateTransitions]),publicSummary:Z(t.publicSummary)};return e.completeHeadlessExecutionAttempt({attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.job_id,leaseId:t.leaseId,runnerId:t.runnerId,status:t.status,completedAt:t.completedAt,durationMs:t.durationMs,reasonCode:t.reasonCode,publicSummary:Z(t.publicSummary),notBeforeAt:t.notBeforeAt,retryCount:t.retryCount,counts:n,hashes:o,redactionSummary:t.redactionSummary,relativePaths:x([r.target_ref,...t.relativePaths]),metadata:s}),e.recordHeadlessExecutionReceipt({receiptId:`receipt-${N("headless-yoloop",`${r.attempt_id}-${t.status}`)}`,attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.job_id,status:t.receiptStatus,reasonCode:t.reasonCode,createdAt:t.completedAt,operationId:`${r.execution_id}:${t.status}:receipt`,idempotencyKey:`${r.directive_hash}:${t.status}:receipt`,counts:n,hashes:o,redactionSummary:t.redactionSummary,relativePaths:x([r.target_ref,...t.relativePaths]),metadata:s}),e.recordHeadlessExecutionSummary({eventId:`event-${N("headless-yoloop-summary",`${r.attempt_id}-${t.status}`)}`,attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.job_id,status:t.status,runtimeId:t.runtimeId,modelId:t.modelId,publicSummary:Z(t.publicSummary),reasonCode:t.reasonCode,createdAt:t.completedAt,durationMs:t.durationMs,counts:n,hashes:o,redactionSummary:t.redactionSummary,relativePaths:x([r.target_ref,...t.relativePaths]),metadata:s}),{attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.job_id,status:t.status,outcome:t.receiptStatus,reasonCode:t.reasonCode,timestamp:t.completedAt,childStoryIds:t.childStoryIds,aggregateCounts:t.counts,workerPoolSummary:a,redactionSummary:t.redactionSummary,publicSafe:!0}}function et(e,r){return{attemptId:e.attempt_id,executionId:e.execution_id,jobId:e.job_id,status:r.status,outcome:r.receiptStatus,reasonCode:r.reasonCode,timestamp:r.timestamp,childStoryIds:[],aggregateCounts:te(),workerPoolSummary:J(),redactionSummary:[],publicSafe:!0}}function tt(e,r,t,o,a){if(!r.retryable)return{retry:!1};const n=e.retry_count+1;if(n>=Math.max(1,e.max_attempts||t))return{retry:!1,retryCount:n};const s=Math.min(8,2**Math.max(0,e.retry_count));return{retry:!0,retryCount:n,notBeforeAt:le(a,o*s)}}function P(e){return{status:e.status,receiptStatus:e.receiptStatus,reasonCode:e.reasonCode,publicSummary:e.publicSummary,retryable:e.retryable,durationMs:Math.max(0,Date.now()-e.startedAt),counts:e.counts,workerPoolSummary:e.workerPoolSummary??J(),hashes:e.hashes,redactionSummary:e.redactions.slice(0,50),relativePaths:x(e.relativePaths).slice(0,50),childStoryIds:x(e.childStoryIds).slice(0,50),stateTransitions:x(e.stateTransitions)}}function rt(e,r){if(e===void 0)return;if(!C(e)){r.push(f("runtime","unsafe_key","value-denied"));return}for(const n of Object.keys(e))(!Me.has(n)||z.test(n))&&r.push(f(`runtime.${n}`,U(n),"key-denied"));e.publicSafe!==!0&&r.push(f("runtime.publicSafe","unsafe_key","value-denied"));const t=S(e,"runtimeId"),o=S(e,"modelId"),a=S(e,"source");if(t&&(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/.test(t)||A.test(t)||j.test(t))&&r.push(f("runtime.runtimeId","unsafe_key","value-denied")),o&&(!/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/.test(o)||A.test(o)||j.test(o))&&r.push(f("runtime.modelId","unsafe_key","value-denied")),a!==void 0&&a!=="explicit"&&a!=="origin"&&a!=="default"&&a!=="fallback"&&a!=="unspecified"&&r.push(f("runtime.source","unsafe_key","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||A.test(e.reasonCode))&&r.push(f("runtime.reasonCode","unsafe_key","value-denied")),e.publicSafe===!0)return{...t?{runtimeId:t}:{},...o?{modelId:o}:{},...a==="explicit"||a==="origin"||a==="default"||a==="fallback"||a==="unspecified"?{source:a}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0}}function ot(e){const r=Array.isArray(e)?e:e?[e]:[],t=[];for(const o of r){const a=o.continuityExecutionDirectives;Array.isArray(a)&&t.push(...a)}return t}function at(e){return g(ee({kind:e.kind,commandClass:e.commandClass,jobId:e.jobId,targetRef:e.targetRef,commandRef:e.commandRef,epicId:e.epicId,runtime:e.runtime}))}function ee(e){return Array.isArray(e)?`[${e.map(ee).join(",")}]`:C(e)?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${ee(e[r])}`).join(",")}}`:JSON.stringify(e)}function X(e,r,t){if(typeof e=="string"){(A.test(e)||j.test(e))&&t.push(f(r,U(r),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((o,a)=>X(o,`${r}.${a}`,t));return}if(C(e)){for(const[o,a]of Object.entries(e)){const n=`${r}.${o}`;z.test(o)&&t.push(f(n,U(o),"key-denied")),X(a,n,t)}return}t.push(f(r,"unsafe_key","value-denied"))}}function st(e,r){if(e===void 0)return[];if(!Array.isArray(e))return r.push(f("redactionSummary","unsafe_key","value-denied")),[];const t=[];for(const[o,a]of e.entries()){if(!C(a)||a.publicSafe!==!0){r.push(f(`redactionSummary.${o}`,"unsafe_key","value-denied"));continue}const n=S(a,"field"),s=S(a,"reason"),i=S(a,"evidence");if(!n||!s||!i||A.test(n)||A.test(s)||A.test(i)){r.push(f(`redactionSummary.${o}`,"unsafe_key","value-denied"));continue}t.push({field:n,reason:s,evidence:i,publicSafe:!0})}return t}function I(e,r,t){return{ok:!1,reasonCode:e,publicSummary:r,redactionSummary:t}}function R(e){return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}function F(e,r){return e.length===r.length&&new Set(e).size===e.length&&e.every(t=>r.includes(t))}function nt(e){return G.test(e.target_ref)?[e.target_ref]:[]}function ce(e){if(!e)return;const r={};for(const[t,o]of Object.entries(e))!/^[A-Za-z0-9_.:-]{1,80}$/.test(t)||z.test(t)||A.test(t)||typeof o=="string"&&A.test(o)||(r[t]=o);return Object.keys(r).length>0?r:void 0}function te(){return v(0,0,0,0,0,0,0)}function v(e,r,t,o,a,n,s){return{iterations:e,childCount:r,succeededChildCount:t,failedChildCount:o,skippedChildCount:a,metadataCompleteCount:n,metadataAbortedCount:s}}function it(e){return e.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")}function V(e){return e.replace(/^docs\/epics\/epic-/,"").replace(/\.md$/,"")}function K(e){return/^[A-Za-z0-9][A-Za-z0-9_-]*\.\d+[A-Za-z0-9_-]*$/.test(e)&&!A.test(e)&&!j.test(e)}function dt(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e}function ct(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback"||e==="unspecified")return e}function U(e){return/prompt|commandRef/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function S(e,r){return typeof e[r]=="string"?e[r]:void 0}function re(e){return!!(e&&Le.test(e)&&!A.test(e)&&!j.test(e))}function C(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function lt(e,r){return N(e,`${r}-${Date.now()}-${ue(4).toString("hex")}`)}function le(e,r){const t=Date.parse(e);return new Date((Number.isFinite(t)?t:Date.now())+r).toISOString()}function L(e,r,t){return Number.isFinite(e)?Math.max(r,Math.min(t,Math.floor(e))):r}function x(e){return Array.from(new Set(e))}function ut(e,r){const t=new Set,o=[];for(const a of e){const n=r(a);t.has(n)||(t.add(n),o.push(a))}return o}export{ne as DEFAULT_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,Te as DEFAULT_HEADLESS_YOLOOP_MAX_DURATION_MS,ve as DEFAULT_HEADLESS_YOLOOP_MAX_ITERATIONS,Pe as MAX_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,It as RUN_YOLOOP_DRIVER_STATES,He as defaultYoloopRootInvoker,At as runYoloopExecutionPhase};
@@ -0,0 +1,194 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * P190.04 -- public-safe headless runtime/adapter contracts.
6
+ */
7
+ import { type LocalJobConsoleRegistration } from '../local-console.js';
8
+ export declare const HEADLESS_ADAPTER_IDS: readonly ["fake", "test", "opencode", "claude-code"];
9
+ export type HeadlessAdapterId = (typeof HEADLESS_ADAPTER_IDS)[number];
10
+ export type HeadlessPromptKind = 'yolo' | 'yoloop';
11
+ export type HeadlessTargetKind = 'story' | 'epic';
12
+ export type HeadlessRuntimeSource = 'explicit' | 'origin' | 'default' | 'fallback' | 'unresolved';
13
+ export type HeadlessExecutionStatus = 'completed' | 'failed' | 'timed_out' | 'skipped';
14
+ export declare const HEADLESS_REASON_CODES: Readonly<{
15
+ readonly OK: "continuity-ok";
16
+ readonly RUNTIME_EXPLICIT: "headless-runtime-explicit";
17
+ readonly RUNTIME_ORIGIN: "headless-runtime-origin";
18
+ readonly RUNTIME_DEFAULT: "headless-runtime-default";
19
+ readonly RUNTIME_FALLBACK: "headless-runtime-fallback";
20
+ readonly RUNTIME_UNRESOLVED: "headless-runtime-unresolved";
21
+ readonly RUNTIME_UNTRUSTED: "headless-runtime-untrusted";
22
+ readonly MODEL_REJECTED: "headless-model-rejected";
23
+ readonly DIRECTIVE_REJECTED: "headless-directive-rejected";
24
+ readonly PROMPT_REJECTED: "headless-prompt-rejected";
25
+ readonly ADAPTER_UNAVAILABLE: "headless-adapter-unavailable";
26
+ readonly RUNTIME_AUTH_REQUIRED: "headless-runtime-auth-required";
27
+ readonly EXECUTION_TIMEOUT: "headless-execution-timeout";
28
+ readonly EXECUTION_BACKOFF: "headless-execution-backoff";
29
+ readonly EXECUTION_COMPLETED: "headless-execution-completed";
30
+ readonly EXECUTION_FAILED: "headless-execution-failed";
31
+ readonly RECEIPT_REDACTED: "headless-receipt-redacted";
32
+ readonly YOLOOP_METADATA_INVALID: "headless-yoloop-metadata-invalid";
33
+ readonly YOLOOP_ISOLATION_VIOLATION: "headless-yoloop-isolation-violation";
34
+ readonly WORKER_POOL_SERIAL_FALLBACK: "worker-pool-serial-fallback";
35
+ readonly WORKER_POOL_PARALLEL_ACTIVE: "worker-pool-parallel-active";
36
+ readonly WORKER_POOL_BACKPRESSURE_PAUSED: "worker-pool-backpressure-paused";
37
+ }>;
38
+ export type HeadlessReasonCode = (typeof HEADLESS_REASON_CODES)[keyof typeof HEADLESS_REASON_CODES];
39
+ export interface HeadlessRedactionEvidence {
40
+ readonly field: string;
41
+ readonly reason: string;
42
+ readonly evidence: string;
43
+ readonly publicSafe: true;
44
+ }
45
+ export interface HeadlessAdapterReceiptContext {
46
+ readonly executionId?: string;
47
+ readonly attemptId?: string;
48
+ readonly jobId?: string;
49
+ readonly operationId?: string;
50
+ readonly idempotencyKey?: string;
51
+ readonly runnerId?: string;
52
+ }
53
+ export interface HeadlessAdapterExecutionInput {
54
+ readonly promptKind: HeadlessPromptKind;
55
+ readonly targetKind: HeadlessTargetKind;
56
+ readonly targetRef: string;
57
+ readonly storyId?: string;
58
+ readonly epicId?: string;
59
+ readonly runtimeId: HeadlessAdapterId;
60
+ readonly modelId?: string;
61
+ readonly runtimeSource?: Exclude<HeadlessRuntimeSource, 'unresolved'>;
62
+ readonly timeoutMs?: number;
63
+ readonly receipt?: HeadlessAdapterReceiptContext;
64
+ readonly publicSummary?: string;
65
+ readonly publicSafe: true;
66
+ }
67
+ export interface HeadlessAdapterInvocation {
68
+ readonly adapterId: HeadlessAdapterId;
69
+ readonly commandName: string;
70
+ readonly args: readonly string[];
71
+ readonly promptHash: string;
72
+ readonly modelId?: string;
73
+ readonly timeoutMs: number;
74
+ readonly publicSafe: true;
75
+ }
76
+ export type HeadlessAdapterInvocationResult = {
77
+ readonly ok: true;
78
+ readonly invocation: HeadlessAdapterInvocation;
79
+ readonly publicSafe: true;
80
+ } | HeadlessAdapterRejectedResult;
81
+ export type HeadlessAdapterAvailability = {
82
+ readonly ok: true;
83
+ readonly adapterId: HeadlessAdapterId;
84
+ readonly commandName: string;
85
+ readonly versionHash?: string;
86
+ readonly reasonCodes: readonly HeadlessReasonCode[];
87
+ readonly publicSummary: string;
88
+ readonly publicSafe: true;
89
+ /** Internal-only trusted executable; do not persist or render. */
90
+ readonly executablePath?: string;
91
+ } | {
92
+ readonly ok: false;
93
+ readonly adapterId: HeadlessAdapterId;
94
+ readonly commandName?: string;
95
+ readonly reasonCode: HeadlessReasonCode;
96
+ readonly reasonCodes: readonly HeadlessReasonCode[];
97
+ readonly publicSummary: string;
98
+ readonly redactionSummary: readonly HeadlessRedactionEvidence[];
99
+ readonly publicSafe: true;
100
+ };
101
+ export interface HeadlessAdapterExecutionResult {
102
+ readonly status: HeadlessExecutionStatus;
103
+ readonly adapterId: HeadlessAdapterId;
104
+ readonly runtimeId: HeadlessAdapterId;
105
+ readonly modelId?: string;
106
+ readonly runtimeSource?: Exclude<HeadlessRuntimeSource, 'unresolved'>;
107
+ readonly reasonCode: HeadlessReasonCode;
108
+ readonly reasonCodes: readonly HeadlessReasonCode[];
109
+ readonly exitCode?: number | null;
110
+ readonly signal?: string | null;
111
+ readonly durationMs: number;
112
+ readonly counts: Readonly<Record<string, number>>;
113
+ readonly hashes: Readonly<Record<string, string>>;
114
+ readonly publicSummary: string;
115
+ readonly redactionSummary: readonly HeadlessRedactionEvidence[];
116
+ readonly relativePaths: readonly string[];
117
+ readonly receipt?: HeadlessAdapterReceiptContext;
118
+ readonly publicSafe: true;
119
+ }
120
+ export interface HeadlessAdapterExecutionOptions {
121
+ readonly cwd?: string;
122
+ readonly env?: NodeJS.ProcessEnv;
123
+ readonly platform?: NodeJS.Platform;
124
+ readonly now?: () => number;
125
+ readonly commandRunner?: HeadlessCommandRunner;
126
+ readonly commandLocator?: (commandName: string, env?: NodeJS.ProcessEnv) => string | undefined;
127
+ readonly versionRunner?: HeadlessCommandRunner;
128
+ readonly maxOutputBytes?: number;
129
+ }
130
+ export interface HeadlessAdapter {
131
+ readonly id: HeadlessAdapterId;
132
+ readonly displayName: string;
133
+ checkAvailability(options?: HeadlessAdapterExecutionOptions): Promise<HeadlessAdapterAvailability>;
134
+ buildInvocation(input: HeadlessAdapterExecutionInput): HeadlessAdapterInvocationResult;
135
+ execute(input: HeadlessAdapterExecutionInput, options?: HeadlessAdapterExecutionOptions): Promise<HeadlessAdapterExecutionResult>;
136
+ }
137
+ export interface HeadlessCommandRunOptions {
138
+ readonly cwd?: string;
139
+ readonly env?: NodeJS.ProcessEnv;
140
+ readonly timeoutMs?: number;
141
+ readonly maxOutputBytes?: number;
142
+ readonly localConsole?: LocalJobConsoleRegistration;
143
+ }
144
+ export interface HeadlessCommandRunResult {
145
+ readonly exitCode: number | null;
146
+ readonly signal?: string | null;
147
+ readonly timedOut: boolean;
148
+ readonly durationMs: number;
149
+ /** Internal-only captured stdout; normalized adapter results hash/redact it. */
150
+ readonly stdout: string;
151
+ /** Internal-only captured stderr; normalized adapter results hash/redact it. */
152
+ readonly stderr: string;
153
+ readonly stdoutBytes: number;
154
+ readonly stderrBytes: number;
155
+ }
156
+ export type HeadlessCommandRunner = (command: string, args: readonly string[], options?: HeadlessCommandRunOptions) => Promise<HeadlessCommandRunResult>;
157
+ export type HeadlessAdapterInputValidationResult = {
158
+ readonly ok: true;
159
+ readonly input: HeadlessAdapterExecutionInput;
160
+ readonly prompt: string;
161
+ readonly promptHash: string;
162
+ readonly reasonCodes: readonly HeadlessReasonCode[];
163
+ readonly publicSafe: true;
164
+ } | HeadlessAdapterRejectedResult;
165
+ export interface HeadlessAdapterRejectedResult {
166
+ readonly ok: false;
167
+ readonly reasonCode: HeadlessReasonCode;
168
+ readonly reasonCodes: readonly HeadlessReasonCode[];
169
+ readonly publicSummary: string;
170
+ readonly redactionSummary: readonly HeadlessRedactionEvidence[];
171
+ readonly publicSafe: true;
172
+ }
173
+ export declare function isHeadlessAdapterId(value: string): value is HeadlessAdapterId;
174
+ export declare function validateHeadlessAdapterExecutionInput(input: unknown, expectedRuntimeId?: HeadlessAdapterId): HeadlessAdapterInputValidationResult;
175
+ export declare function renderHeadlessPrompt(input: Pick<HeadlessAdapterExecutionInput, 'promptKind' | 'targetRef'>): string;
176
+ export declare function hashPublicValue(value: string): string;
177
+ export declare function createRejectedExecutionResult(adapterId: HeadlessAdapterId, runtimeId: HeadlessAdapterId, rejected: HeadlessAdapterRejectedResult, durationMs?: number): HeadlessAdapterExecutionResult;
178
+ export declare function createUnavailableExecutionResult(adapterId: HeadlessAdapterId, input: HeadlessAdapterExecutionInput, availability: Extract<HeadlessAdapterAvailability, {
179
+ ok: false;
180
+ }>, durationMs?: number): HeadlessAdapterExecutionResult;
181
+ export declare function normalizeHeadlessCommandResult(adapterId: HeadlessAdapterId, input: HeadlessAdapterExecutionInput, commandResult: HeadlessCommandRunResult): HeadlessAdapterExecutionResult;
182
+ export declare function runHeadlessCommand(command: string, args: readonly string[], options?: HeadlessCommandRunOptions): Promise<HeadlessCommandRunResult>;
183
+ export declare function adapterAvailabilityFailure(adapterId: HeadlessAdapterId, commandName: string | undefined, reasonCode: HeadlessReasonCode, publicSummary: string, redactionSummary?: readonly HeadlessRedactionEvidence[]): Extract<HeadlessAdapterAvailability, {
184
+ ok: false;
185
+ }>;
186
+ export declare function adapterAvailabilitySuccess(adapterId: HeadlessAdapterId, commandName: string, publicSummary: string, details?: {
187
+ readonly executablePath?: string;
188
+ readonly versionText?: string;
189
+ }): Extract<HeadlessAdapterAvailability, {
190
+ ok: true;
191
+ }>;
192
+ export declare function redaction(field: string, reason: string, evidence: string): HeadlessRedactionEvidence;
193
+ export declare function boundPublicSummary(value: string): string;
194
+ export declare function isSafeHeadlessModelId(value: string): boolean;
@@ -0,0 +1,2 @@
1
+ import{createHash as K}from"node:crypto";import{spawn as j}from"node:child_process";import{createLocalJobConsoleServer as B}from"../local-console.js";const z=Object.freeze(["fake","test","opencode","claude-code"]),f=Object.freeze({OK:"continuity-ok",RUNTIME_EXPLICIT:"headless-runtime-explicit",RUNTIME_ORIGIN:"headless-runtime-origin",RUNTIME_DEFAULT:"headless-runtime-default",RUNTIME_FALLBACK:"headless-runtime-fallback",RUNTIME_UNRESOLVED:"headless-runtime-unresolved",RUNTIME_UNTRUSTED:"headless-runtime-untrusted",MODEL_REJECTED:"headless-model-rejected",DIRECTIVE_REJECTED:"headless-directive-rejected",PROMPT_REJECTED:"headless-prompt-rejected",ADAPTER_UNAVAILABLE:"headless-adapter-unavailable",RUNTIME_AUTH_REQUIRED:"headless-runtime-auth-required",EXECUTION_TIMEOUT:"headless-execution-timeout",EXECUTION_BACKOFF:"headless-execution-backoff",EXECUTION_COMPLETED:"headless-execution-completed",EXECUTION_FAILED:"headless-execution-failed",RECEIPT_REDACTED:"headless-receipt-redacted",YOLOOP_METADATA_INVALID:"headless-yoloop-metadata-invalid",YOLOOP_ISOLATION_VIOLATION:"headless-yoloop-isolation-violation",WORKER_POOL_SERIAL_FALLBACK:"worker-pool-serial-fallback",WORKER_POOL_PARALLEL_ACTIVE:"worker-pool-parallel-active",WORKER_POOL_BACKPRESSURE_PAUSED:"worker-pool-backpressure-paused"}),V=120,O=240,F=600*1e3,M=1800*1e3,$=/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/,v=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,X=/^docs\/epics\/epic-[A-Za-z0-9._-]+\.md$/,J=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,U=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS)/i,C=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/,Y=new Set(["promptKind","targetKind","targetRef","storyId","epicId","runtimeId","modelId","runtimeSource","timeoutMs","receipt","publicSummary","publicSafe"]),Z=new Set(["executionId","attemptId","jobId","operationId","idempotencyKey","runnerId"]);function q(e){return z.includes(e)}function ue(e,r){const t=[],o=[];if(!w(e))return t.push(d("input","unsafe_key","value-denied")),N(f.DIRECTIVE_REJECTED,"Headless adapter input must be a public object.",t);for(const i of Object.keys(e))Y.has(i)||(o.push(i),t.push(d(i,P(i),"key-denied")));const u=e.publicSafe===!0;u||t.push(d("publicSafe","unsafe_key","value-denied"));const a=h(e.promptKind);a!=="yolo"&&a!=="yoloop"&&t.push(d("promptKind","unsafe_key","value-denied"));const l=h(e.targetKind);l!=="story"&&l!=="epic"&&t.push(d("targetKind","unsafe_key","value-denied"));const s=h(e.targetRef);(!s||!L(s)||C.test(s)||s.includes(".."))&&t.push(d("targetRef","prompt_body","value-denied")),a==="yolo"&&(l!=="story"||!s||!v.test(s))&&t.push(d("targetRef","prompt_body","value-denied")),a==="yoloop"&&(l!=="epic"||!s||!X.test(s))&&t.push(d("targetRef","prompt_body","value-denied"));const c=D(e.storyId,"storyId",t),p=D(e.epicId,"epicId",t);c&&s&&a==="yolo"&&c!==s.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")&&t.push(d("storyId","prompt_body","value-denied")),p&&s&&a==="yoloop"&&p!==s.replace(/^docs\/epics\/epic-/,"").replace(/\.md$/,"")&&t.push(d("epicId","prompt_body","value-denied"));const E=h(e.runtimeId);(!E||!q(E)||r&&E!==r)&&t.push(d("runtimeId","unsafe_key","value-denied"));const m=G(e.modelId,t),I=Q(e.runtimeSource,t),_=ee(e.timeoutMs,t),S=re(e.publicSummary,t),T=oe(e.receipt,t);if(t.length>0||o.length>0||!u||!a||!l||!s||!E){const i=t.some(y=>y.field==="modelId"),g=t.some(y=>y.reason==="prompt_body");return N(i?f.MODEL_REJECTED:g?f.PROMPT_REJECTED:f.DIRECTIVE_REJECTED,g?"Headless adapter target did not match a public prompt shape.":"Headless adapter input failed public-safety validation.",t)}const A={promptKind:a,targetKind:l,targetRef:s,...c?{storyId:c}:{},...p?{epicId:p}:{},runtimeId:E,...m?{modelId:m}:{},...I?{runtimeSource:I}:{},..._?{timeoutMs:_}:{},...T?{receipt:T}:{},...S?{publicSummary:S}:{},publicSafe:!0},n=x(A);return{ok:!0,input:A,prompt:n,promptHash:b(n),reasonCodes:[f.OK],publicSafe:!0}}function x(e){return e.promptKind==="yolo"?`*yolo @${e.targetRef}`:`*yoloop @${e.targetRef}`}function b(e){return`sha256:${K("sha256").update(e).digest("hex")}`}function ce(e,r,t,o=0){return{status:"failed",adapterId:e,runtimeId:r,reasonCode:t.reasonCode,reasonCodes:t.reasonCodes,durationMs:o,counts:{},hashes:{},publicSummary:R(t.publicSummary),redactionSummary:t.redactionSummary,relativePaths:[],publicSafe:!0}}function le(e,r,t,o=0){return{status:"failed",adapterId:e,runtimeId:r.runtimeId,...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},reasonCode:t.reasonCode,reasonCodes:t.reasonCodes,durationMs:o,counts:{},hashes:{prompt:b(x(r))},publicSummary:R(t.publicSummary),redactionSummary:t.redactionSummary,relativePaths:[r.targetRef],...r.receipt?{receipt:r.receipt}:{},publicSafe:!0}}function pe(e,r,t){const o=x(r),u=b(t.stdout),a=b(t.stderr),l=t.timedOut||t.exitCode===0?0:ne(t.stdout,t.stderr),s=t.timedOut?"timed_out":t.exitCode===0?"completed":"failed",c=t.timedOut?f.EXECUTION_TIMEOUT:t.exitCode===0?f.EXECUTION_COMPLETED:l>0?f.RUNTIME_AUTH_REQUIRED:f.EXECUTION_FAILED,p=[d("prompt","prompt_body",b(o))];return t.stdoutBytes>0&&p.push(d("stdout","raw_log",u)),t.stderrBytes>0&&p.push(d("stderr","raw_log",a)),{status:s,adapterId:e,runtimeId:r.runtimeId,...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},reasonCode:c,reasonCodes:[c,f.RECEIPT_REDACTED],exitCode:t.exitCode,signal:t.signal??null,durationMs:t.durationMs,counts:{stdoutBytes:t.stdoutBytes,stderrBytes:t.stderrBytes,stdoutLines:k(t.stdout),stderrLines:k(t.stderr),...l>0?{authEvidenceMatches:l}:{}},hashes:{prompt:b(o),stdout:u,stderr:a},publicSummary:s==="completed"?"Headless adapter completed with public-safe redacted output summary.":s==="timed_out"?"Headless adapter timed out; raw output was redacted.":c===f.RUNTIME_AUTH_REQUIRED?"Headless adapter requires local runtime authentication; raw output was redacted.":"Headless adapter failed; raw output was redacted.",redactionSummary:p,relativePaths:[r.targetRef],...r.receipt?{receipt:r.receipt}:{},publicSafe:!0}}async function fe(e,r,t={}){const o=Date.now(),u=te(t.timeoutMs),a=t.maxOutputBytes??64e3;return await new Promise(l=>{const s=j(e,[...r],{cwd:t.cwd,env:t.env,shell:!1,stdio:[t.localConsole?"pipe":"ignore","pipe","pipe"]}),c=t.localConsole?.jobId?B({...t.localConsole,projectRoot:t.localConsole.projectRoot??t.cwd,writeStdin:n=>{s.stdin?.write(n)},signalProcess:n=>s.kill(n)}):void 0;c?.start();let p="",E="",m=0,I=0,_=!1,S=!1;const T=(n,i,g)=>{const y=g+i.length;if(n.length<a){const H=a-n.length;return{text:n+i.toString("utf8").slice(0,H),bytes:y}}return{text:n,bytes:y}};s.stdout?.on("data",n=>{const i=T(p,n,m);p=i.text,m=i.bytes,c?.broadcastStdout(n)}),s.stderr?.on("data",n=>{const i=T(E,n,I);E=i.text,I=i.bytes,c?.broadcastStderr(n)});const A=setTimeout(()=>{S=!0,s.kill("SIGTERM")},u);s.on("error",n=>{if(_)return;_=!0,clearTimeout(A),c?.close({exitCode:127,signal:null});const i=n instanceof Error?n.message:String(n);l({exitCode:127,signal:null,timedOut:!1,durationMs:Date.now()-o,stdout:p,stderr:i,stdoutBytes:m,stderrBytes:Buffer.byteLength(i)})}),s.on("close",(n,i)=>{_||(_=!0,clearTimeout(A),c?.close({exitCode:n,signal:i}),l({exitCode:n,signal:i,timedOut:S,durationMs:Date.now()-o,stdout:p,stderr:E,stdoutBytes:m,stderrBytes:I}))})})}function Ee(e,r,t,o,u=[]){return{ok:!1,adapterId:e,...r?{commandName:r}:{},reasonCode:t,reasonCodes:[t],publicSummary:R(o),redactionSummary:u,publicSafe:!0}}function me(e,r,t,o={}){const u={ok:!0,adapterId:e,commandName:r,...o.versionText?{versionHash:b(o.versionText)}:{},reasonCodes:[f.OK],publicSummary:R(t),publicSafe:!0};return o.executablePath&&Object.defineProperty(u,"executablePath",{value:o.executablePath,enumerable:!1,configurable:!1}),u}function d(e,r,t){return{field:e,reason:r,evidence:t,publicSafe:!0}}function R(e){return e.length<=O?e:`${e.slice(0,O)}\u2026[TRUNCATED:${e.length-O}]`}function W(e){return e.length<=V&&$.test(e)&&!U.test(e)&&!C.test(e)&&!e.includes("..")&&!e.startsWith("/")}function N(e,r,t){return{ok:!1,reasonCode:e,reasonCodes:[e],publicSummary:R(r),redactionSummary:t,publicSafe:!0}}function D(e,r,t){if(e===void 0)return;const o=h(e);if(!o||!L(o)||C.test(o)){t.push(d(r,P(r),"value-denied"));return}return o}function G(e,r){if(e===void 0)return;const t=h(e);if(!t||!W(t)){r.push(d("modelId","unsafe_key","value-denied"));return}return t}function Q(e,r){if(e!==void 0){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e;r.push(d("runtimeSource","unsafe_key","value-denied"))}}function ee(e,r){if(e!==void 0){if(typeof e!="number"||!Number.isInteger(e)||e<=0||e>M){r.push(d("timeoutMs","unbounded_number","value-denied"));return}return e}}function te(e){return!e||!Number.isInteger(e)||e<=0||e>M?F:e}function re(e,r){if(e===void 0)return;const t=h(e);if(!t||t.length>O||!L(t)){r.push(d("publicSummary","unbounded_text","value-denied"));return}return t}function oe(e,r){if(e===void 0)return;if(!w(e)){r.push(d("receipt","unsafe_key","value-denied"));return}const t={};for(const[o,u]of Object.entries(e)){if(!Z.has(o)||J.test(o)){r.push(d(`receipt.${o}`,P(o),"key-denied"));continue}const a=D(u,`receipt.${o}`,r);a&&(t[o]=a)}return Object.keys(t).length>0?t:void 0}function P(e){return/prompt/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function h(e){return typeof e=="string"?e:void 0}function L(e){return e.length>0&&!U.test(e)&&!/\0/.test(e)}function k(e){return e?e.split(/\r?\n/).filter(r=>r.length>0).length:0}const se=Object.freeze([/\bauth(?:entication|orization)?\s+(?:is\s+)?required\b/i,/\brequires?\s+authentication\b/i,/\bmust\s+(?:log\s?in|authenticate|be\s+authenticated)\b/i,/\bunauthenticated\b/i,/\b(?:not|unauthenticated)\s+(?:logged\s+in|authenticated)\b/i,/\blog\s?in\s+(?:required|to\s+continue|before\s+continuing)\b/i,/\bplease\s+(?:log\s?in|authenticate|sign\s?in)\b/i,/\bsign\s?in\s+(?:required|to\s+continue|before\s+continuing)\b/i,/\bsession\s+(?:expired|not\s+found|invalid)\b/i,/\bcredentials?\s+(?:missing|required|not\s+found)\b/i]);function ne(...e){const r=e.filter(t=>t.length>0).map(t=>t.slice(0,8e3)).join(`
2
+ `);return r?se.reduce((t,o)=>t+(o.test(r)?1:0),0):0}function w(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}export{z as HEADLESS_ADAPTER_IDS,f as HEADLESS_REASON_CODES,Ee as adapterAvailabilityFailure,me as adapterAvailabilitySuccess,R as boundPublicSummary,ce as createRejectedExecutionResult,le as createUnavailableExecutionResult,b as hashPublicValue,q as isHeadlessAdapterId,W as isSafeHeadlessModelId,pe as normalizeHeadlessCommandResult,d as redaction,x as renderHeadlessPrompt,fe as runHeadlessCommand,ue as validateHeadlessAdapterExecutionInput};
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * P197.03 -- local Plane B jobs console attach surface.
6
+ *
7
+ * Raw stdout/stderr and stdin are intentionally scoped to an operator-local IPC
8
+ * hop between the runner-owned child process and the foreground CLI. Nothing in
9
+ * this file persists raw output, PIDs, TTY names, file descriptors or socket paths
10
+ * to continuity storage or server-bound metadata.
11
+ */
12
+ export declare const LOCAL_JOBS_CONSOLE_REASON_CODES: Readonly<{
13
+ readonly OK: "continuity-ok";
14
+ readonly ATTACHED: "jobs-console-attached";
15
+ readonly NOT_ATTACHED: "jobs-console-not-attached";
16
+ readonly INVALID_SELECTOR: "jobs-console-invalid-selector";
17
+ readonly IPC_UNAVAILABLE: "jobs-console-ipc-unavailable";
18
+ readonly STDIN_CONFIRMATION_REQUIRED: "jobs-console-stdin-confirmation-required";
19
+ readonly STDIN_DISCARDED: "jobs-console-stdin-discarded";
20
+ readonly LOCAL_CONTROL_APPLIED: "jobs-console-local-control-applied";
21
+ readonly LOCAL_CONTROL_FAILED: "jobs-console-local-control-failed";
22
+ }>;
23
+ export type LocalJobsConsoleReasonCode = (typeof LOCAL_JOBS_CONSOLE_REASON_CODES)[keyof typeof LOCAL_JOBS_CONSOLE_REASON_CODES] | string;
24
+ export type LocalJobsConsoleControlAction = 'pause' | 'resume' | 'cancel';
25
+ export interface LocalJobConsoleRegistration {
26
+ readonly projectRoot?: string;
27
+ readonly jobId: string;
28
+ readonly attemptId?: string;
29
+ readonly executionId?: string;
30
+ readonly publicSafe: true;
31
+ }
32
+ export interface LocalJobConsoleServerOptions extends LocalJobConsoleRegistration {
33
+ readonly writeStdin?: (chunk: Buffer) => boolean | void;
34
+ readonly signalProcess?: (signal: NodeJS.Signals) => boolean;
35
+ readonly socketPath?: string;
36
+ }
37
+ export interface LocalJobConsoleServerStartResult {
38
+ readonly ok: boolean;
39
+ readonly reasonCode: LocalJobsConsoleReasonCode;
40
+ readonly publicSafe: true;
41
+ }
42
+ export interface LocalJobConsoleServerHandle {
43
+ readonly jobId: string;
44
+ readonly socketPath: string;
45
+ start(): Promise<LocalJobConsoleServerStartResult>;
46
+ broadcastStdout(chunk: Buffer | string): void;
47
+ broadcastStderr(chunk: Buffer | string): void;
48
+ close(exit?: {
49
+ readonly exitCode?: number | null;
50
+ readonly signal?: string | null;
51
+ }): void;
52
+ }
53
+ export interface LocalJobsConsoleCommandOptions {
54
+ readonly args: string;
55
+ readonly projectRoot?: string;
56
+ readonly format?: 'plain' | 'json';
57
+ readonly stdin?: NodeJS.ReadableStream;
58
+ readonly stdout?: NodeJS.WritableStream;
59
+ readonly stderr?: NodeJS.WritableStream;
60
+ readonly connectTimeoutMs?: number;
61
+ }
62
+ export interface LocalJobsConsoleCommandResult {
63
+ readonly status: 'attached' | 'not-attached' | 'invalid' | 'error';
64
+ readonly exitCode: number;
65
+ readonly jobId?: string;
66
+ readonly reasonCodes: readonly LocalJobsConsoleReasonCode[];
67
+ readonly serverHeldStream: false;
68
+ readonly serverAccessToLocalhost: false;
69
+ readonly publicSafe: true;
70
+ }
71
+ export declare function isLocalJobsConsoleArgs(args: string): boolean;
72
+ export declare function parseLocalJobsConsoleArgs(args: string): {
73
+ readonly kind: 'not-console';
74
+ } | {
75
+ readonly kind: 'valid';
76
+ readonly jobId: string;
77
+ } | {
78
+ readonly kind: 'invalid';
79
+ readonly reasonCode: LocalJobsConsoleReasonCode;
80
+ };
81
+ export declare function localJobConsoleSocketPath(projectRoot: string | undefined, jobId: string): string;
82
+ export declare function createLocalJobConsoleServer(options: LocalJobConsoleServerOptions): LocalJobConsoleServerHandle;
83
+ export declare function runLocalJobsConsoleCommand(options: LocalJobsConsoleCommandOptions): Promise<LocalJobsConsoleCommandResult>;
@@ -0,0 +1,13 @@
1
+ import{createHash as $}from"node:crypto";import{existsSync as J,mkdirSync as x,rmSync as N}from"node:fs";import{createConnection as P,createServer as B}from"node:net";import{tmpdir as F}from"node:os";import{dirname as H,join as M,resolve as V}from"node:path";import{createInterface as U}from"node:readline";const a=Object.freeze({OK:"continuity-ok",ATTACHED:"jobs-console-attached",NOT_ATTACHED:"jobs-console-not-attached",INVALID_SELECTOR:"jobs-console-invalid-selector",IPC_UNAVAILABLE:"jobs-console-ipc-unavailable",STDIN_CONFIRMATION_REQUIRED:"jobs-console-stdin-confirmation-required",STDIN_DISCARDED:"jobs-console-stdin-discarded",LOCAL_CONTROL_APPLIED:"jobs-console-local-control-applied",LOCAL_CONTROL_FAILED:"jobs-console-local-control-failed"}),K=/^@?(job-J\d{3,})$/i,q=/^job-J\d{3,}$/i,z=250;function re(t){return w(t).kind!=="not-console"}function w(t){const e=t.trim().split(/\s+/).filter(Boolean);if(e.length<2)return{kind:"not-console"};const r=e[0]?.replace(/^\*/,"").toLowerCase(),c=e[1]?.toLowerCase();if(r!=="jobs"||c!=="console")return{kind:"not-console"};if(e.length!==3)return{kind:"invalid",reasonCode:a.INVALID_SELECTOR};const s=e[2]?.match(K);return s?{kind:"valid",jobId:O(s[1])}:{kind:"invalid",reasonCode:a.INVALID_SELECTOR}}function D(t,e){const r=V(t&&t.trim().length>0?t:process.cwd()),c=$("sha256").update(r).digest("hex").slice(0,24),s=G(O(e));return process.platform==="win32"?`\\\\.\\pipe\\neocortex-job-console-${c}-${s}`:M(F(),"neocortex-job-console",c,`${s}.sock`)}function se(t){const e=O(t.jobId),r=t.socketPath??D(t.projectRoot,e),c=new Set;let s,I=!1;const b=(o,n)=>{o.destroyed||o.write(`${JSON.stringify(n)}
2
+ `)},p=o=>{for(const n of c)b(n,o)},m=(o,n)=>{if(n.type==="close"){o.end();return}if(n.type==="stdin"){const f=h(n.data);if(!f){b(o,{type:"stdin_ack",ok:!1,reasonCode:a.IPC_UNAVAILABLE,publicSafe:!0});return}try{t.writeStdin?.(f),b(o,{type:"stdin_ack",ok:!0,reasonCode:a.OK,publicSafe:!0})}catch{b(o,{type:"stdin_ack",ok:!1,reasonCode:a.IPC_UNAVAILABLE,publicSafe:!0})}return}if(n.type==="control"){const f=W(n.action);let l=!1;try{l=!!(f&&t.signalProcess?.(f))}catch{l=!1}b(o,{type:"control_ack",action:n.action,ok:l,reasonCode:l?a.LOCAL_CONTROL_APPLIED:a.LOCAL_CONTROL_FAILED,publicSafe:!0})}};return{jobId:e,socketPath:r,async start(){if(I)return{ok:!0,reasonCode:a.OK,publicSafe:!0};if(!q.test(e))return{ok:!1,reasonCode:a.INVALID_SELECTOR,publicSafe:!0};try{return process.platform!=="win32"&&(x(H(r),{recursive:!0,mode:448}),J(r)&&N(r,{force:!0})),s=B(o=>{c.add(o),o.setEncoding("utf8"),b(o,{type:"attached",jobId:e,...t.attemptId?{attemptId:t.attemptId}:{},...t.executionId?{executionId:t.executionId}:{},serverHeldStream:!1,publicSafe:!0});let n="";o.on("data",f=>{n+=f;const l=n.split(`
3
+ `);n=l.pop()??"";for(const C of l){const S=Q(C);S&&m(o,S)}}),o.on("close",()=>c.delete(o)),o.on("error",()=>c.delete(o))}),await new Promise((o,n)=>{s?.once("error",n),s?.listen(r,()=>o())}),I=!0,{ok:!0,reasonCode:a.OK,publicSafe:!0}}catch{return{ok:!1,reasonCode:a.IPC_UNAVAILABLE,publicSafe:!0}}},broadcastStdout(o){p(g("stdout",o))},broadcastStderr(o){p(g("stderr",o))},close(o={}){p({type:"exit",exitCode:o.exitCode??null,signal:o.signal??null,publicSafe:!0});for(const n of c)n.end();c.clear();try{s?.close()}catch{}if(process.platform!=="win32")try{N(r,{force:!0})}catch{}I=!1}}}async function ae(t){const e=t.stdout??process.stdout,r=t.stderr??process.stderr,c=t.stdin??process.stdin,s=w(t.args);if(s.kind==="not-console")return A("invalid",1,void 0,[a.INVALID_SELECTOR]);if(s.kind==="invalid"){const p=A("invalid",1,void 0,[s.reasonCode]);return E(e,p,t.format),p}const I=D(t.projectRoot,s.jobId),b=Math.max(10,Math.min(5e3,Math.floor(t.connectTimeoutMs??z)));return await new Promise(p=>{const m=P(I);let o=!1,n=!1,f="",l;const C=new Set;let S=()=>{};const L=setTimeout(()=>{if(o||n)return;n=!0,m.destroy();const i=A("not-attached",0,s.jobId,[a.NOT_ATTACHED]);E(e,i,t.format),p(i)},b),y=(i,u=0)=>{n||(n=!0,clearTimeout(L),S(),m.end(),p(A(i,u,s.jobId,Array.from(C))))},T=i=>{m.destroyed||m.write(`${JSON.stringify(i)}
4
+ `)},R=i=>{T({type:"control",action:i})},_=U({input:c,terminal:!1}),j=i=>{if(!o)return;const u=i.trim();if(l!==void 0){u==="yes"?T({type:"stdin",data:Buffer.from(`${l}
5
+ `,"utf8").toString("base64"),encoding:"base64"}):(C.add(a.STDIN_DISCARDED),e.write(`[jobs-console] stdin discarded; explicit confirmation was not provided.
6
+ `)),l=void 0;return}if(u==="/quit"){T({type:"close"}),y("attached",0);return}if(u==="/pause"||u==="/resume"||u==="/cancel"){R(u.slice(1));return}l=i,C.add(a.STDIN_CONFIRMATION_REQUIRED),e.write(`[jobs-console] confirm stdin: type yes to send this line to the local process; anything else discards it.
7
+ `)};S=()=>{_.removeListener("line",j),_.close()},_.on("line",j),m.on("connect",()=>{o=!0,clearTimeout(L),C.add(a.ATTACHED),e.write(`[jobs-console] attached job=${s.jobId} serverHeldStream=false serverAccessToLocalhost=false controls=/pause,/resume,/cancel,/quit
8
+ `)}),m.on("data",i=>{f+=i.toString("utf8");const u=f.split(`
9
+ `);f=u.pop()??"";for(const v of u){const d=Z(v);d&&(d.type==="stdout"?e.write(h(d.data)??Buffer.alloc(0)):d.type==="stderr"?r.write(h(d.data)??Buffer.alloc(0)):d.type==="control_ack"?(C.add(d.reasonCode),e.write(`[jobs-console] control ${d.action} ${d.ok?"applied":"failed"} reason=${d.reasonCode}
10
+ `)):d.type==="stdin_ack"?(C.add(d.reasonCode),e.write(`[jobs-console] stdin ${d.ok?"sent":"failed"} reason=${d.reasonCode}
11
+ `)):d.type==="exit"&&y("attached",0))}}),m.on("error",()=>{if(o||n){C.add(a.IPC_UNAVAILABLE),y("error",1);return}n=!0,clearTimeout(L),S();const i=A("not-attached",0,s.jobId,[a.NOT_ATTACHED]);E(e,i,t.format),p(i)}),m.on("close",()=>{!n&&o&&y("attached",0)})})}function O(t){const e=t.replace(/^@/,""),r=e.match(/^job-J(\d{3,})$/i);return r?`job-J${r[1]}`:e}function G(t){return t.replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||"job"}function g(t,e){return{type:t,data:Buffer.from(e).toString("base64"),encoding:"base64"}}function Q(t){const e=k(t);if(e){if(e.type==="stdin"&&typeof e.data=="string"&&e.encoding==="base64"||e.type==="control"&&(e.action==="pause"||e.action==="resume"||e.action==="cancel"))return e;if(e.type==="close")return{type:"close"}}}function Z(t){const e=k(t);if(!(!e||typeof e.type!="string"))return e}function k(t){if(t.trim())try{const e=JSON.parse(t);return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}catch{return}}function h(t){try{return Buffer.from(t,"base64")}catch{return}}function W(t){return t==="pause"?process.platform==="win32"?void 0:"SIGSTOP":t==="resume"?process.platform==="win32"?void 0:"SIGCONT":"SIGTERM"}function A(t,e,r,c){return{status:t,exitCode:e,...r?{jobId:r}:{},reasonCodes:c.length>0?Array.from(new Set(c)):[a.OK],serverHeldStream:!1,serverAccessToLocalhost:!1,publicSafe:!0}}function E(t,e,r="plain"){if(r==="json"){t.write(`${JSON.stringify({type:"jobs_console_status",...e})}
12
+ `);return}const c=e.jobId?` job=${e.jobId}`:"";t.write(`[jobs-console] status=${e.status}${c} serverHeldStream=false serverAccessToLocalhost=false reasons=${e.reasonCodes.join(",")}
13
+ `)}export{a as LOCAL_JOBS_CONSOLE_REASON_CODES,se as createLocalJobConsoleServer,re as isLocalJobsConsoleArgs,D as localJobConsoleSocketPath,w as parseLocalJobsConsoleArgs,ae as runLocalJobsConsoleCommand};