@ornexus/neocortex 4.60.71 → 4.60.73

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 (243) hide show
  1. package/dist/release-source.json +1 -1
  2. package/dist/sbom.cdx.json +1211 -1217
  3. package/install.ps1 +1 -1
  4. package/install.sh +1 -1
  5. package/package.json +2 -2
  6. package/packages/client/dist/adapters/adapter-registry.js +108 -1
  7. package/packages/client/dist/adapters/antigravity-adapter.js +77 -2
  8. package/packages/client/dist/adapters/claude-code-adapter.js +79 -3
  9. package/packages/client/dist/adapters/codex-adapter.js +80 -2
  10. package/packages/client/dist/adapters/cursor-adapter.js +115 -4
  11. package/packages/client/dist/adapters/gemini-adapter.js +71 -2
  12. package/packages/client/dist/adapters/grok-adapter.js +42 -2
  13. package/packages/client/dist/adapters/index.js +22 -1
  14. package/packages/client/dist/adapters/platform-detector.js +212 -1
  15. package/packages/client/dist/adapters/target-adapter.js +12 -0
  16. package/packages/client/dist/adapters/vscode-adapter.js +72 -2
  17. package/packages/client/dist/agent/refresh-stubs.js +417 -2
  18. package/packages/client/dist/agent/update-agent-yaml.js +102 -1
  19. package/packages/client/dist/agent/update-description.js +251 -1
  20. package/packages/client/dist/cache/crypto-utils.js +78 -1
  21. package/packages/client/dist/cache/encrypted-cache.js +108 -1
  22. package/packages/client/dist/cache/in-memory-asset-cache.js +73 -1
  23. package/packages/client/dist/cache/index.js +13 -1
  24. package/packages/client/dist/cache/protected-pi-boundary.js +44 -1
  25. package/packages/client/dist/checkpoint/checkpoint-client-reader.js +127 -2
  26. package/packages/client/dist/checkpoint/index.js +11 -1
  27. package/packages/client/dist/checkpoint/shared-checkpoint-types.js +32 -1
  28. package/packages/client/dist/cli.js +358 -5
  29. package/packages/client/dist/commands/activate.js +394 -8
  30. package/packages/client/dist/commands/architecture-answers.js +274 -7
  31. package/packages/client/dist/commands/architecture-memory-terminal.js +253 -4
  32. package/packages/client/dist/commands/architecture-non-ui-continuation.js +100 -1
  33. package/packages/client/dist/commands/architecture-root-binding.js +51 -1
  34. package/packages/client/dist/commands/cache-status.js +112 -2
  35. package/packages/client/dist/commands/config.js +88 -1
  36. package/packages/client/dist/commands/doctor.js +635 -2
  37. package/packages/client/dist/commands/invoke.js +7200 -143
  38. package/packages/client/dist/commands/legacy-epic-terminal.js +71 -1
  39. package/packages/client/dist/commands/legacy-story-branch.js +96 -1
  40. package/packages/client/dist/commands/legacy-story-pr.js +276 -1
  41. package/packages/client/dist/commands/mutation-qa-checkpoint.js +285 -5
  42. package/packages/client/dist/commands/mutation-qa-gate.js +54 -1
  43. package/packages/client/dist/commands/mutation-qa-git.js +41 -1
  44. package/packages/client/dist/commands/mutation-qa-policy.js +102 -1
  45. package/packages/client/dist/commands/mutation-qa-run.js +219 -3
  46. package/packages/client/dist/commands/mutation-qa-verdict.js +149 -1
  47. package/packages/client/dist/commands/mutation-qa.js +220 -1
  48. package/packages/client/dist/commands/native-agent.js +136 -2
  49. package/packages/client/dist/commands/planning-diagnosis.js +43 -1
  50. package/packages/client/dist/commands/planning-generation.js +53 -1
  51. package/packages/client/dist/commands/planning-memory.js +40 -1
  52. package/packages/client/dist/commands/planning-research.js +42 -1
  53. package/packages/client/dist/commands/private-session.js +75 -1
  54. package/packages/client/dist/commands/property-qa.js +139 -1
  55. package/packages/client/dist/commands/qa-control.js +16 -1
  56. package/packages/client/dist/commands/qa-scan-browser-launch.js +55 -1
  57. package/packages/client/dist/commands/qa-scan-browser-route.js +28 -1
  58. package/packages/client/dist/commands/qa-scan-capture.js +663 -5
  59. package/packages/client/dist/commands/qa-scan-discovery.js +376 -3
  60. package/packages/client/dist/commands/qa-scan-review.js +826 -5
  61. package/packages/client/dist/commands/qa-synthetic-backend-capture.js +266 -1
  62. package/packages/client/dist/commands/qa-synthetic-backend-review.js +297 -1
  63. package/packages/client/dist/commands/qa-synthetic-backend.js +340 -2
  64. package/packages/client/dist/commands/qa-synthetic-broker-port.js +85 -1
  65. package/packages/client/dist/commands/qa-synthetic-browser.js +39 -1
  66. package/packages/client/dist/commands/refactor-characterization.js +671 -21
  67. package/packages/client/dist/commands/refactor-commit.js +399 -13
  68. package/packages/client/dist/commands/refactor-control.js +142 -3
  69. package/packages/client/dist/commands/refactor-cpp-assertions.js +93 -3
  70. package/packages/client/dist/commands/refactor-review.js +283 -5
  71. package/packages/client/dist/commands/refactor-root.js +588 -7
  72. package/packages/client/dist/commands/refresh-memory.js +156 -3
  73. package/packages/client/dist/commands/shared-architecture-non-ui.js +24 -1
  74. package/packages/client/dist/commands/story-checkpoint.js +171 -1
  75. package/packages/client/dist/config/profile-directory.js +13 -1
  76. package/packages/client/dist/config/resolver-selection.js +278 -1
  77. package/packages/client/dist/config/secure-config.js +281 -12
  78. package/packages/client/dist/config.js +223 -2
  79. package/packages/client/dist/constants.js +25 -1
  80. package/packages/client/dist/context/context-collector.js +222 -2
  81. package/packages/client/dist/context/context-sanitizer.js +145 -1
  82. package/packages/client/dist/continuity/autonomous-governance.js +285 -1
  83. package/packages/client/dist/continuity/continuity-client-state-store.js +1587 -1
  84. package/packages/client/dist/continuity/invoke-hooks.js +129 -1
  85. package/packages/client/dist/continuity/migrations/001-initial-schema.js +12 -2
  86. package/packages/client/dist/continuity/migrations/002-processing-output-summary-indexes.js +12 -2
  87. package/packages/client/dist/continuity/migrations/003-headless-execution-attempts.js +12 -2
  88. package/packages/client/dist/continuity/migrations/004-outbox-delivery-state.js +12 -2
  89. package/packages/client/dist/continuity/migrations/005-bounded-headless-queue.js +12 -2
  90. package/packages/client/dist/continuity/migrations/006-native-agent-dispatches.js +10 -2
  91. package/packages/client/dist/continuity/native-agent-store.js +69 -1
  92. package/packages/client/dist/continuity/native-agent-types.js +90 -1
  93. package/packages/client/dist/continuity/outbox.js +117 -1
  94. package/packages/client/dist/continuity/runner-bootstrap-policy.js +172 -1
  95. package/packages/client/dist/continuity/sqlite-store.d.ts +22 -1
  96. package/packages/client/dist/continuity/sqlite-store.js +2612 -81
  97. package/packages/client/dist/effects/invoke-effect-gateways.js +62 -1
  98. package/packages/client/dist/errors/error-messages.js +228 -2
  99. package/packages/client/dist/errors/frontmatter-diagnostics.js +125 -1
  100. package/packages/client/dist/evidence/collector.js +347 -1
  101. package/packages/client/dist/evidence/index.js +1 -1
  102. package/packages/client/dist/evidence/types.js +2 -0
  103. package/packages/client/dist/fs/atomic-state-replace.js +152 -1
  104. package/packages/client/dist/generated/command-registry.generated.js +4076 -1
  105. package/packages/client/dist/generated/public-projections.generated.js +149 -1
  106. package/packages/client/dist/git/direct-yolo-c01-retry.js +138 -4
  107. package/packages/client/dist/git/direct-yolo-checkpoint.js +1234 -4
  108. package/packages/client/dist/git/epic-operational-state.d.ts +198 -0
  109. package/packages/client/dist/git/epic-operational-state.js +672 -0
  110. package/packages/client/dist/git/git-lifecycle-step-ids.js +14 -1
  111. package/packages/client/dist/git/git-lifecycle-store.d.ts +9 -1
  112. package/packages/client/dist/git/git-lifecycle-store.js +1981 -9
  113. package/packages/client/dist/git/legacy-story-branch-checkpoint.js +259 -9
  114. package/packages/client/dist/git/legacy-story-branch-setup.js +348 -4
  115. package/packages/client/dist/git/legacy-story-pr.js +3538 -70
  116. package/packages/client/dist/git/secure-filesystem-boundary.js +182 -5
  117. package/packages/client/dist/graph-retrieval/pre-command-hook.js +284 -1
  118. package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.js +237 -1
  119. package/packages/client/dist/i18n/first-run.js +60 -2
  120. package/packages/client/dist/index.js +47 -1
  121. package/packages/client/dist/invocation/invoke-input.js +24 -1
  122. package/packages/client/dist/license/index.js +5 -1
  123. package/packages/client/dist/license/license-client.js +304 -1
  124. package/packages/client/dist/machine/fingerprint.js +163 -2
  125. package/packages/client/dist/machine/index.js +5 -1
  126. package/packages/client/dist/memory/project-memory-path-scope.js +62 -1
  127. package/packages/client/dist/memory/project-memory-writer.js +1007 -40
  128. package/packages/client/dist/memory/shared-project-memory-types.js +253 -2
  129. package/packages/client/dist/migrations/epic-lifecycle-backfill.d.ts +97 -0
  130. package/packages/client/dist/migrations/epic-lifecycle-backfill.js +1060 -0
  131. package/packages/client/dist/migrations/project-identity-capability.js +50 -1
  132. package/packages/client/dist/migrations/project-identity.js +493 -7
  133. package/packages/client/dist/migrations/state-json.d.ts +22 -0
  134. package/packages/client/dist/migrations/state-json.js +393 -4
  135. package/packages/client/dist/policy/architecture-policy.js +184 -2
  136. package/packages/client/dist/policy/index.js +7 -1
  137. package/packages/client/dist/policy/shared-policy-types.js +38 -0
  138. package/packages/client/dist/policy/subagent-approval-policy.js +55 -1
  139. package/packages/client/dist/private-execution/clean-baseline.js +279 -2
  140. package/packages/client/dist/private-execution/codex-executor.js +574 -4
  141. package/packages/client/dist/private-execution/codex-host-runtime.js +137 -1
  142. package/packages/client/dist/private-execution/codex-lifecycle-guard.js +97 -1
  143. package/packages/client/dist/private-execution/codex-scoped-permissions.js +128 -1
  144. package/packages/client/dist/private-execution/delivery.js +410 -13
  145. package/packages/client/dist/private-execution/diagnosis-root-review.js +294 -2
  146. package/packages/client/dist/private-execution/frozen-handoff.js +19 -6
  147. package/packages/client/dist/private-execution/implementation-validation.js +106 -2
  148. package/packages/client/dist/private-execution/isolated-admission.js +1432 -23
  149. package/packages/client/dist/private-execution/isolated-session.js +725 -5
  150. package/packages/client/dist/private-execution/isolated-workspace.js +122 -1
  151. package/packages/client/dist/private-execution/pact-consumer-runtime.js +409 -3
  152. package/packages/client/dist/private-execution/pact-test-source.js +258 -1
  153. package/packages/client/dist/private-execution/pact-toolchain.js +290 -3
  154. package/packages/client/dist/private-execution/pact-write-set.js +172 -1
  155. package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.js +406 -5
  156. package/packages/client/dist/private-execution/planning-generation-checkpoint.js +462 -5
  157. package/packages/client/dist/private-execution/planning-memory-checkpoint.js +139 -3
  158. package/packages/client/dist/private-execution/planning-research-checkpoint.js +325 -4
  159. package/packages/client/dist/private-execution/private-report-store.js +42 -1
  160. package/packages/client/dist/private-execution/property-test-candidate.js +103 -1
  161. package/packages/client/dist/private-execution/property-test-choices.js +147 -3
  162. package/packages/client/dist/private-execution/property-test-plan.js +271 -7
  163. package/packages/client/dist/private-execution/property-test-review.js +258 -4
  164. package/packages/client/dist/private-execution/property-test-runtime.js +372 -9
  165. package/packages/client/dist/private-execution/property-test-source.js +139 -1
  166. package/packages/client/dist/private-execution/root-checkpoint.js +80 -1
  167. package/packages/client/dist/private-execution/root-memory-git-evidence.js +135 -3
  168. package/packages/client/dist/private-execution/root-memory-recovery.js +93 -1
  169. package/packages/client/dist/private-execution/root-memory-request.js +29 -1
  170. package/packages/client/dist/private-execution/root-memory-scope.js +178 -1
  171. package/packages/client/dist/private-execution/root-memory-writer.js +102 -1
  172. package/packages/client/dist/private-execution/session-lease.js +63 -1
  173. package/packages/client/dist/private-execution/shared-private-admission-types.js +50 -1
  174. package/packages/client/dist/private-execution/shared-project-validation.js +66 -1
  175. package/packages/client/dist/private-execution/shared-root-memory-types.js +61 -1
  176. package/packages/client/dist/private-execution/ux-source-validation.js +372 -1
  177. package/packages/client/dist/private-execution/ux-write-set.js +191 -2
  178. package/packages/client/dist/registry/registry-reconciliation.js +234 -1
  179. package/packages/client/dist/resilience/circuit-breaker.js +170 -1
  180. package/packages/client/dist/resilience/degradation-manager.js +164 -1
  181. package/packages/client/dist/resilience/freshness-indicator.js +100 -1
  182. package/packages/client/dist/resilience/index.js +8 -1
  183. package/packages/client/dist/resilience/recovery-detector.js +74 -1
  184. package/packages/client/dist/resolvers/asset-resolver.js +13 -0
  185. package/packages/client/dist/resolvers/local-resolver.js +255 -8
  186. package/packages/client/dist/resolvers/remote-resolver.js +233 -1
  187. package/packages/client/dist/runner/binary.js +404 -1
  188. package/packages/client/dist/runner/cli.js +1571 -17
  189. package/packages/client/dist/runner/headless/adapters.js +49 -1
  190. package/packages/client/dist/runner/headless/claude-code-adapter.js +79 -1
  191. package/packages/client/dist/runner/headless/continuous-story-workspace.js +1628 -11
  192. package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.js +69 -1
  193. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +110 -2
  194. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +1236 -8
  195. package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +318 -2
  196. package/packages/client/dist/runner/headless/fake-adapter.js +62 -1
  197. package/packages/client/dist/runner/headless/managed-profile.js +132 -1
  198. package/packages/client/dist/runner/headless/opencode-adapter.js +145 -2
  199. package/packages/client/dist/runner/headless/prepared-story-bundle.js +43 -1
  200. package/packages/client/dist/runner/headless/resolver.js +231 -1
  201. package/packages/client/dist/runner/headless/run-yolo.js +885 -1
  202. package/packages/client/dist/runner/headless/run-yoloop.js +2574 -2
  203. package/packages/client/dist/runner/headless/types.js +574 -2
  204. package/packages/client/dist/runner/local-console.js +396 -13
  205. package/packages/client/dist/runner/portal-sync-worker.js +1487 -1
  206. package/packages/client/dist/runner/project-identity.js +106 -1
  207. package/packages/client/dist/runner/scheduler.js +995 -7
  208. package/packages/client/dist/runner-cli.js +18 -2
  209. package/packages/client/dist/state/invocation-shape.js +13 -1
  210. package/packages/client/dist/state/project-state-snapshot.d.ts +8 -0
  211. package/packages/client/dist/state/project-state-snapshot.js +1731 -1
  212. package/packages/client/dist/state/state-json-repair.js +785 -3
  213. package/packages/client/dist/state/structural-dag-projection.js +118 -1
  214. package/packages/client/dist/telemetry/index.js +5 -1
  215. package/packages/client/dist/telemetry/offline-queue.js +131 -1
  216. package/packages/client/dist/tier/index.js +5 -1
  217. package/packages/client/dist/tier/tier-aware-client.js +405 -1
  218. package/packages/client/dist/types/index.js +38 -1
  219. package/packages/client/dist/version.js +27 -1
  220. package/packages/client/dist/yolo/change-evidence-collector.js +126 -1
  221. package/packages/client/dist/yolo/invoke-envelope-capability.js +62 -1
  222. package/packages/client/dist/yolo/spec-envelope-collector.js +184 -5
  223. package/packages/client/dist/yoloop/discovery-hook.js +300 -2
  224. package/packages/client/dist/yoloop/index.js +8 -1
  225. package/packages/client/dist/yoloop/invoke-hooks.js +669 -12
  226. package/packages/client/dist/yoloop/shared-discover-epics.js +1007 -1
  227. package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +65 -1
  228. package/packages/client/dist/yoloop/shared-yoloop-types.js +33 -1
  229. package/packages/client/dist/yoloop/target-normalization.js +180 -1
  230. package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +8 -0
  231. package/packages/client/dist/yoloop/yoloop-client-state-store.js +1920 -1
  232. package/packages/shared/dist/yolo/spec-envelope.js +3 -6
  233. package/targets-stubs/antigravity/gemini.md +1 -1
  234. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  235. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  236. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  237. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  238. package/targets-stubs/claude-code/neocortex.md +2 -2
  239. package/targets-stubs/codex/AGENTS.md +1 -1
  240. package/targets-stubs/cursor/agent.md +2 -2
  241. package/targets-stubs/gemini-cli/agent.md +2 -2
  242. package/targets-stubs/opencode/neocortex-root.md +1 -1
  243. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -27,7 +27,48 @@ export type YoloopSessionMode = 'directory' | 'epic-file' | 'epic-id';
27
27
  export type YoloopLockOwnerKind = 'client' | 'server';
28
28
  export type YoloopLockOwnerPidState = 'live' | 'stale' | 'unknown';
29
29
  export type YoloopLockLeaseState = 'active' | 'expired' | 'unknown';
30
- export type YoloopPersistenceCapability = 'rollover-session-v1' | 'successor-transition-v1' | 'continuation-replan-v1';
30
+ export type YoloopPersistenceCapability = 'rollover-session-v1' | 'successor-transition-v1' | 'continuation-replan-v1' | 'cross-epic-continuation-reconcile-v1';
31
+ export interface YoloopCrossEpicReconciliationEvidenceV1 {
32
+ readonly schemaVersion: 'YoloopCrossEpicReconciliationEvidence/1.0';
33
+ readonly repositoryFingerprint: string;
34
+ readonly identityHash: string;
35
+ readonly sourceEpicId: string;
36
+ readonly sourceGraphRevision: string;
37
+ readonly targetEpicId: string;
38
+ readonly targetGraphRevision: string;
39
+ readonly storeRevision: number;
40
+ readonly writerEpoch: number;
41
+ readonly runId: string;
42
+ readonly runStatus: 'success' | 'exhausted';
43
+ readonly runRevision: number;
44
+ readonly snapshotHash: string | null;
45
+ readonly continuationSessionHash: string;
46
+ readonly pendingAuthorityHash: string;
47
+ readonly pendingAuthorityCount: 0 | 1;
48
+ readonly lockActive: false;
49
+ readonly currentSessionActive: false;
50
+ readonly journalActive: false;
51
+ readonly decision: 'eligible';
52
+ readonly reasonCodes: readonly string[];
53
+ readonly publicSafe: true;
54
+ }
55
+ export interface YoloopCrossEpicReconciliationReceiptV1 {
56
+ readonly schemaVersion: 'YoloopCrossEpicReconciliationReceipt/1.0';
57
+ readonly operationId: string;
58
+ readonly idempotencyKey: string;
59
+ readonly payloadHash: string;
60
+ readonly sourceEpicId: string;
61
+ readonly sourceGraphRevision: string;
62
+ readonly targetEpicId: string;
63
+ readonly targetGraphRevision: string;
64
+ readonly runId: string;
65
+ readonly previousSessionHash: string;
66
+ readonly nextSessionHash: string;
67
+ readonly retiredAuthorityHash: string;
68
+ readonly retiredAuthorityCount: 0 | 1;
69
+ readonly outcome: 'cross-epic-reconciled';
70
+ readonly publicSafe: true;
71
+ }
31
72
  /** Lock file payload. Mirrors server-internal `LockMetadata` (v1.1 schema). */
32
73
  export interface YoloopPersistedLock {
33
74
  readonly pid: number;
@@ -350,6 +391,29 @@ export type YoloopStateOperation = {
350
391
  readonly nextSession: Readonly<Record<string, unknown>>;
351
392
  readonly payloadHash: string;
352
393
  readonly receipt: Readonly<Record<string, unknown>>;
394
+ } | {
395
+ readonly type: 'reconcile_cross_epic_continuation';
396
+ readonly operationId: string;
397
+ readonly idempotencyKey: string;
398
+ readonly expectedCommonRevision: number;
399
+ readonly expectedWriterEpoch: number;
400
+ readonly expectedIdentityHash: string;
401
+ readonly sourceEpicId: string;
402
+ readonly sourceGraphRevision: string;
403
+ readonly targetEpicId: string;
404
+ readonly targetGraphRevision: string;
405
+ readonly expectedRunId: string;
406
+ readonly expectedRunStatus: 'success' | 'exhausted';
407
+ readonly expectedRunRevision: number;
408
+ readonly expectedSnapshotHash: string | null;
409
+ readonly sourceSessionId: string;
410
+ readonly expectedSessionHash: string;
411
+ readonly expectedPendingHash: string;
412
+ readonly expectedPendingCount: 0 | 1;
413
+ readonly nextSession: Readonly<Record<string, unknown>>;
414
+ readonly nextSessionHash: string;
415
+ readonly payloadHash: string;
416
+ readonly receipt: YoloopCrossEpicReconciliationReceiptV1;
353
417
  } | {
354
418
  readonly type: 'recovery_attempted';
355
419
  readonly attempt: YoloopRecoveryAttemptRef;
@@ -1 +1,33 @@
1
- const R=50;export{R as RECOVERY_HISTORY_CAP};
1
+ /**
2
+ * P117.07: Inlined byte-identical types from `@neocortex/shared/types/yoloop-persistence`
3
+ * + `@neocortex/shared/yoloop/recovery-types` (RECOVERY_HISTORY_CAP).
4
+ *
5
+ * Same regression class as P117.01 (checkpoint inline). Mirrors P92.01 server
6
+ * SSoT-Shadow precedent — server `shared-types.ts` does the same for tier-config.
7
+ *
8
+ * Live regression: client tarball is published standalone via `@ornexus/neocortex`
9
+ * and does NOT include `@neocortex/shared` as a runtime dependency (workspace
10
+ * package, excluded from tarball per `.npmignore` + `tsconfig.build.json`). Any
11
+ * non-erased import of `@neocortex/shared` in `packages/client/dist/yoloop/**`
12
+ * causes runtime `ERR_MODULE_NOT_FOUND` on globally installed `@ornexus/neocortex`,
13
+ * silently disabling P101.06/P101.07 yoloop client state persistence (warning on
14
+ * every CLI invocation, fail-soft per design but feature effectively off).
15
+ *
16
+ * Sync responsibility: `yoloop-shared-sync.test.ts` (client-side drift test) +
17
+ * `shared-types-sync.test.ts` (server-side cross-package sanity, P92.03 baseline).
18
+ *
19
+ * Defense-in-depth: `validate-pre-publish.js` ships `validateClientNoSharedImport()`
20
+ * (P117.01 expanded by P117.07 to cover yoloop dist) — match = exit 1 (publish blocked).
21
+ *
22
+ * DO NOT EDIT WITHOUT also editing `packages/shared/src/types/yoloop-persistence.ts`
23
+ * + `packages/shared/src/yoloop/recovery-types.ts`.
24
+ */
25
+ // === P117.07: byte-identical from @neocortex/shared/yoloop/recovery-types ===
26
+ /**
27
+ * P104.06 -- FIFO cap for `state.recovery_history[]` in
28
+ * `.neocortex/yoloop-state.json`. When the array exceeds this size, the
29
+ * client drops oldest entries. Bound is heuristic: ~50 attempts × ~300
30
+ * bytes/entry = ~15 KB worst case in state.json (negligible).
31
+ */
32
+ export const RECOVERY_HISTORY_CAP = 50;
33
+ // === END P117.07 ===
@@ -1 +1,180 @@
1
- import{existsSync as h}from"node:fs";import{resolve as p}from"node:path";import{formatFrontmatterDiagnostic as A}from"../errors/frontmatter-diagnostics.js";const O=/^\*?(yoloop|auto-yolo|epic-runner|story-runner|loop-yolo|auto-epic)\b/i,T=/^@neocortex\b\s*/i,_=/\[[^\]\r\n]*\]\(([^)\r\n]+)\)/g,E=/^[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*\/?$/,R=/^epic-[A-Za-z0-9._-]+\.md$/i;function g(t){if(typeof t!="string")return null;let e=t.trimStart(),n=!1;const r=e.match(T);r&&(e=e.slice(r[0].length).trimStart(),n=!0);const o=e.match(O);return o?Object.freeze({triggerToken:o[0],remainder:e.slice(o[0].length).trim(),agentSelectorRemoved:n}):null}function v(t){return g(t)!==null}function u(t){return Object.freeze({ok:!1,errorCode:"INVALID_YOLOOP_TARGET",reasonCode:t,message:`INVALID_YOLOOP_TARGET: ${A(t)}`})}function k(t){let e=t.trim().replace(/^@/,"").replace(/^\.\//,"");if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)||e.startsWith("//"))return{ok:!1,failure:"external"};if(e.startsWith("/")||e.startsWith("~")||/^[A-Za-z]:[\\/]/.test(e)||e.includes("\\")||e.includes("\0"))return{ok:!1,failure:"unsafe-path"};const n=e.split("/").filter(Boolean);return!e||!E.test(e)||n.some(r=>r==="."||r==="..")?{ok:!1,failure:"unsafe-path"}:!e.endsWith("/")&&!e.toLowerCase().endsWith(".md")?{ok:!1,failure:"malformed"}:(e=e.replace(/^\.\//,""),{ok:!0,target:e})}function $(t){return`markdown-link-target-${t}`}function b(t){return`raw-target-${t}`}function w(t,e){return t.startsWith("@")||e.includes("/")||e.includes("\\")||e.startsWith(".")||e.startsWith("~")||e.toLowerCase().endsWith(".md")||/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function z(t,e){if(!e||!R.test(t)||h(p(e,t)))return t;const n=`docs/epics/${t}`;return h(p(e,n))?n:t}function f(t){return Object.freeze([...t])}function W(t,e={}){const n=g(t);if(!n)return Object.freeze({ok:!0,args:typeof t=="string"?t:"",changed:!1,reasonCodes:f(["yoloop-target-unchanged"])});const r=[];n.agentSelectorRemoved&&r.push("agent-selector-removed");const o=n.remainder;if(!o){const a=n.triggerToken;return Object.freeze({ok:!0,args:a,changed:a!==t,reasonCodes:f(r.length>0?r:["yoloop-target-unchanged"])})}const i=[...o.matchAll(_)],d=o.startsWith("[")||o.includes("](");if(i.length>1)return u("markdown-link-target-ambiguous");if(d&&i.length===0)return u("markdown-link-target-malformed");if(i.length===1){const a=i[0];if(a[0]!==o)return u("markdown-link-target-ambiguous");const s=k(a[1]);if(!s.ok)return u($(s.failure));const l=z(s.target,e.projectRoot);return r.push("markdown-link-target-normalized"),l!==s.target&&r.push("basename-target-canonicalized"),Object.freeze({ok:!0,args:`${n.triggerToken} @${l}`,changed:!0,reasonCodes:f(r)})}const c=o.match(/^@?([^\s]+)$/)?.[1];if(c){let a=c;if(w(o,c)){const l=k(c);if(!l.ok)return u(b(l.failure));a=l.target}const s=z(a,e.projectRoot);if(s!==c)return r.push("basename-target-canonicalized"),Object.freeze({ok:!0,args:`${n.triggerToken} @${s}`,changed:!0,reasonCodes:f(r)})}const m=`${n.triggerToken}${o?` ${o}`:""}`;return Object.freeze({ok:!0,args:m,changed:m!==t,reasonCodes:f(r.length>0?r:["yoloop-target-unchanged"])})}function P(t,e){const n=W(t,{projectRoot:e});if(!n.ok)return null;const r=g(n.args);if(!r?.remainder)return null;const o=r.remainder.match(/(?:^|\s)@([^\s]+)/);if(o)return o[1];const i=r.remainder.split(/\s+/).find(d=>d.length>0&&!d.startsWith("-"));return i?i.replace(/^(?:"|')|(?:"|')$/g,""):null}export{P as extractYoloopTargetPath,v as isYoloopInvocation,W as normalizeYoloopTargetArgs,g as parseYoloopInvocation};
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { formatFrontmatterDiagnostic } from '../errors/frontmatter-diagnostics.js';
4
+ const YOLOOP_TRIGGER_RE = /^\*?(yoloop|auto-yolo|epic-runner|story-runner|loop-yolo|auto-epic)\b/i;
5
+ const AGENT_SELECTOR_RE = /^@neocortex\b\s*/i;
6
+ const MARKDOWN_LINK_RE = /\[[^\]\r\n]*\]\(([^)\r\n]+)\)/g;
7
+ const SAFE_PROJECT_PATH_RE = /^[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*\/?$/;
8
+ const EPIC_BASENAME_RE = /^epic-[A-Za-z0-9._-]+\.md$/i;
9
+ export function parseYoloopInvocation(args) {
10
+ if (typeof args !== 'string')
11
+ return null;
12
+ let remaining = args.trimStart();
13
+ let agentSelectorRemoved = false;
14
+ const selector = remaining.match(AGENT_SELECTOR_RE);
15
+ if (selector) {
16
+ remaining = remaining.slice(selector[0].length).trimStart();
17
+ agentSelectorRemoved = true;
18
+ }
19
+ const trigger = remaining.match(YOLOOP_TRIGGER_RE);
20
+ if (!trigger)
21
+ return null;
22
+ return Object.freeze({
23
+ triggerToken: trigger[0],
24
+ remainder: remaining.slice(trigger[0].length).trim(),
25
+ agentSelectorRemoved,
26
+ });
27
+ }
28
+ export function isYoloopInvocation(args) {
29
+ return parseYoloopInvocation(args) !== null;
30
+ }
31
+ function failure(reasonCode) {
32
+ return Object.freeze({
33
+ ok: false,
34
+ errorCode: 'INVALID_YOLOOP_TARGET',
35
+ reasonCode,
36
+ message: `INVALID_YOLOOP_TARGET: ${formatFrontmatterDiagnostic(reasonCode)}`,
37
+ });
38
+ }
39
+ function validateProjectTarget(rawTarget) {
40
+ let target = rawTarget.trim().replace(/^@/, '').replace(/^\.\//, '');
41
+ if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(target) || target.startsWith('//')) {
42
+ return { ok: false, failure: 'external' };
43
+ }
44
+ if (target.startsWith('/') ||
45
+ target.startsWith('~') ||
46
+ /^[A-Za-z]:[\\/]/.test(target) ||
47
+ target.includes('\\') ||
48
+ target.includes('\0')) {
49
+ return { ok: false, failure: 'unsafe-path' };
50
+ }
51
+ const segments = target.split('/').filter(Boolean);
52
+ if (!target ||
53
+ !SAFE_PROJECT_PATH_RE.test(target) ||
54
+ segments.some((segment) => segment === '.' || segment === '..')) {
55
+ return { ok: false, failure: 'unsafe-path' };
56
+ }
57
+ if (!target.endsWith('/') && !target.toLowerCase().endsWith('.md')) {
58
+ return { ok: false, failure: 'malformed' };
59
+ }
60
+ target = target.replace(/^\.\//, '');
61
+ return { ok: true, target };
62
+ }
63
+ function markdownFailure(failureCode) {
64
+ return `markdown-link-target-${failureCode}`;
65
+ }
66
+ function rawFailure(failureCode) {
67
+ return `raw-target-${failureCode}`;
68
+ }
69
+ function isPathLikeRawTarget(remainder, target) {
70
+ return remainder.startsWith('@') ||
71
+ target.includes('/') ||
72
+ target.includes('\\') ||
73
+ target.startsWith('.') ||
74
+ target.startsWith('~') ||
75
+ target.toLowerCase().endsWith('.md') ||
76
+ /^[A-Za-z][A-Za-z0-9+.-]*:/.test(target);
77
+ }
78
+ function canonicalizeEpicBasename(target, projectRoot) {
79
+ if (!projectRoot || !EPIC_BASENAME_RE.test(target))
80
+ return target;
81
+ if (existsSync(resolve(projectRoot, target)))
82
+ return target;
83
+ const canonical = `docs/epics/${target}`;
84
+ return existsSync(resolve(projectRoot, canonical)) ? canonical : target;
85
+ }
86
+ function freezeReasonCodes(reasonCodes) {
87
+ return Object.freeze([...reasonCodes]);
88
+ }
89
+ export function normalizeYoloopTargetArgs(args, options = {}) {
90
+ const parsed = parseYoloopInvocation(args);
91
+ if (!parsed) {
92
+ return Object.freeze({
93
+ ok: true,
94
+ args: typeof args === 'string' ? args : '',
95
+ changed: false,
96
+ reasonCodes: freezeReasonCodes(['yoloop-target-unchanged']),
97
+ });
98
+ }
99
+ const reasons = [];
100
+ if (parsed.agentSelectorRemoved)
101
+ reasons.push('agent-selector-removed');
102
+ const remainder = parsed.remainder;
103
+ if (!remainder) {
104
+ const normalizedArgs = parsed.triggerToken;
105
+ return Object.freeze({
106
+ ok: true,
107
+ args: normalizedArgs,
108
+ changed: normalizedArgs !== args,
109
+ reasonCodes: freezeReasonCodes(reasons.length > 0 ? reasons : ['yoloop-target-unchanged']),
110
+ });
111
+ }
112
+ const links = [...remainder.matchAll(MARKDOWN_LINK_RE)];
113
+ const hasMarkdownLinkSyntax = remainder.startsWith('[') || remainder.includes('](');
114
+ if (links.length > 1)
115
+ return failure('markdown-link-target-ambiguous');
116
+ if (hasMarkdownLinkSyntax && links.length === 0)
117
+ return failure('markdown-link-target-malformed');
118
+ if (links.length === 1) {
119
+ const link = links[0];
120
+ if (link[0] !== remainder)
121
+ return failure('markdown-link-target-ambiguous');
122
+ const validation = validateProjectTarget(link[1]);
123
+ if (!validation.ok)
124
+ return failure(markdownFailure(validation.failure));
125
+ const target = canonicalizeEpicBasename(validation.target, options.projectRoot);
126
+ reasons.push('markdown-link-target-normalized');
127
+ if (target !== validation.target)
128
+ reasons.push('basename-target-canonicalized');
129
+ return Object.freeze({
130
+ ok: true,
131
+ args: `${parsed.triggerToken} @${target}`,
132
+ changed: true,
133
+ reasonCodes: freezeReasonCodes(reasons),
134
+ });
135
+ }
136
+ const rawTarget = remainder.match(/^@?([^\s]+)$/)?.[1];
137
+ if (rawTarget) {
138
+ let validatedTarget = rawTarget;
139
+ if (isPathLikeRawTarget(remainder, rawTarget)) {
140
+ const validation = validateProjectTarget(rawTarget);
141
+ if (!validation.ok)
142
+ return failure(rawFailure(validation.failure));
143
+ validatedTarget = validation.target;
144
+ }
145
+ const target = canonicalizeEpicBasename(validatedTarget, options.projectRoot);
146
+ if (target !== rawTarget) {
147
+ reasons.push('basename-target-canonicalized');
148
+ return Object.freeze({
149
+ ok: true,
150
+ args: `${parsed.triggerToken} @${target}`,
151
+ changed: true,
152
+ reasonCodes: freezeReasonCodes(reasons),
153
+ });
154
+ }
155
+ }
156
+ const normalizedArgs = `${parsed.triggerToken}${remainder ? ` ${remainder}` : ''}`;
157
+ return Object.freeze({
158
+ ok: true,
159
+ args: normalizedArgs,
160
+ changed: normalizedArgs !== args,
161
+ reasonCodes: freezeReasonCodes(reasons.length > 0 ? reasons : ['yoloop-target-unchanged']),
162
+ });
163
+ }
164
+ export function extractYoloopTargetPath(args, projectRoot) {
165
+ const normalized = normalizeYoloopTargetArgs(args, { projectRoot });
166
+ if (!normalized.ok)
167
+ return null;
168
+ const parsed = parseYoloopInvocation(normalized.args);
169
+ if (!parsed?.remainder)
170
+ return null;
171
+ const atPath = parsed.remainder.match(/(?:^|\s)@([^\s]+)/);
172
+ if (atPath)
173
+ return atPath[1];
174
+ const positional = parsed.remainder.split(/\s+/).find((token) => {
175
+ return token.length > 0 && !token.startsWith('-');
176
+ });
177
+ if (!positional)
178
+ return null;
179
+ return positional.replace(/^(?:"|')|(?:"|')$/g, '');
180
+ }
@@ -41,6 +41,7 @@ export declare function createDefaultCounters(nowIso: string): YoloopPersistedCo
41
41
  /** Build default state envelope (no lock, default counters). */
42
42
  export declare function createDefaultState(nowIso: string): YoloopPersistedState;
43
43
  export declare class YoloopClientStateStore {
44
+ private readonly projectRoot;
44
45
  private readonly stateDir;
45
46
  private readonly statePath;
46
47
  private readonly lockPath;
@@ -78,6 +79,13 @@ export declare class YoloopClientStateStore {
78
79
  readonly idempotencyKey?: string;
79
80
  }, nowIso?: string): Promise<YoloopRunTransitionReceiptV1>;
80
81
  private applyOperation;
82
+ /**
83
+ * Runtime v2 is authoritative once present. Missing/non-Git/v1 projects keep
84
+ * the legacy checkout-local adapter; a corrupt v2 never falls back.
85
+ */
86
+ private readCommonAuthorityIfPresent;
87
+ /** Apply legacy operation semantics to the common authority under its Git CAS. */
88
+ private applyCommonOperation;
81
89
  private reserveContinuationAuthority;
82
90
  private acknowledgeContinuationAuthority;
83
91
  private repairContinuationAuthority;