@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,140 @@
1
+ import{createHash as Ce}from"node:crypto";import{existsSync as z,readFileSync as Q,unlinkSync as dt,writeFileSync as ut,mkdirSync as lt,statSync as pt}from"node:fs";import{join as M}from"node:path";import{homedir as se}from"node:os";import{LicenseClient as ft}from"../license/license-client.js";import{EncryptedCache as ye}from"../cache/encrypted-cache.js";import{NoOpCache as mt}from"../types/index.js";import{resolveClientPreFlightTrigger as gt,TierAwareClient as ht}from"../tier/tier-aware-client.js";import{loadSecureConfig as Et}from"../config/secure-config.js";import{DEFAULT_SERVER_URL as _t}from"../constants.js";import{detectFirstRunLocale as It,renderFirstRunMessage as St}from"../i18n/first-run.js";import{humanizeError as Ae,formatHumanizedError as Te,detectErrorLocale as ve}from"../errors/error-messages.js";import{degradeStateSnapshotForPayloadLimit as Ct,projectStateSnapshotForInvoke as yt}from"../state/project-state-snapshot.js";import{maybeRepairStateJsonBeforeInvoke as At,StateRepairHardStopError as Tt}from"../state/state-json-repair.js";import{bootstrapArchitectureMemory as vt}from"../memory/project-memory-writer.js";import{RUNNER_BOOTSTRAP_POLICY_REASON_CODES as wt,classifyRunnerBootstrapPolicyFromArgs as Rt}from"../continuity/runner-bootstrap-policy.js";import{RUNNER_SCHEDULER_BOOTSTRAP_REASON_CODES as bt,ensureRunnerSchedulerBootstrap as Nt}from"../runner/scheduler.js";import{CONTINUITY_INVOKE_WATCH_DEFAULT_LIMIT as we,CONTINUITY_INVOKE_WATCH_DEFAULT_MAX_IDLE_POLLS as Re,CONTINUITY_INVOKE_WATCH_DEFAULT_MAX_POLLS as be,CONTINUITY_INVOKE_WATCH_DEFAULT_POLL_INTERVAL_MS as Ne,openContinuityClientStateStore as Ot}from"../continuity/continuity-client-state-store.js";import{isLocalJobsConsoleArgs as Lt,runLocalJobsConsoleCommand as kt}from"../runner/local-console.js";const Z=M(se(),".neocortex"),Oe=M(Z,"cache"),Le=M(Oe,"menu-cache.json"),ke=1440*60*1e3,xe=3e4,H="3.9.62",Pe=256*1024,je=Pe,De=.8,W="[REDACTED]",xt=1e5,ee=2e3,Pt=200,jt=200,Dt=12,Ut=/(?:promptBody|workflow|workflowGraph|stepBody|privateUrl|rawLog|secret|credential|licenseKey|apiKey|internalRouting|serverOnly|proprietary|protected)/i,Mt=/(?:PRIVATE|PROTECTED|SERVER_ONLY)[-_\s]*(?:PROMPT|PROMPT_BODY|WORKFLOW|WORKFLOW_GRAPH|STEP_BODY|STEP|ROUTING)\s*[:=][^\n\r]*/gi,Wt=/(?:https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\]|private|internal)[^\s"'<>]*|raw[_-]?log|transcript|stack\s*trace|stderr:|stdout:|system prompt|prompt body|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P185[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH)|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=)/gi,ie=Math.floor(Pe*De),Ue=M(Z,".first-run-shown"),$t="<!-- NEOCORTEX-MEMORY-START -->";function Bt(e){return/^\s*\*?init(?:\s|$)/i.test(e)}function Ht(e){const t=M(e,"NEOCORTEX.md"),n=z(t)?Q(t,"utf8"):void 0,r=n===void 0?["missing_canonical_memory"]:[n.includes($t)?void 0:"missing_managed_memory_block",n.length>18e3?"canonical_memory_over_budget":void 0,/api[-_ ]?key|license[-_ ]?key|password\s*[:=]|secret\s*[:=]/i.test(n)?"possible_secret_shape_detected":void 0].filter(p=>!!p),a=["AGENTS.md","CLAUDE.md","GEMINI.md",".opencode/AGENTS.md",".cursor/rules/neocortex.mdc",".github/copilot-instructions.md"].filter(p=>z(M(e,p))),s=r.includes("possible_secret_shape_detected")?"low":r.length===0?"high":a.length>0?"medium":"low",c=vt(e);return{canonical:{path:"NEOCORTEX.md",exists:n!==void 0,incompleteReasons:r,confidence:s},permittedSources:{packageBuildFiles:c.repositoryMap?.find(p=>p.startsWith("Package/build files:"))?.split(",").length??0,architectureReadmeDocs:c.architectureReferences?.length??0,runtimeConfigTemplates:c.environmentPractices?.[0]?.startsWith("Runtime/config templates:")?c.environmentPractices[0].split(",").length:0,platformWrappers:a.length},wrapperFiles:a,recommendedPreviewCommand:'neocortex-client refresh-memory --dry-run --project-root "$PROJECT_ROOT"',recommendedRefreshCommand:'neocortex-client refresh-memory --project-root "$PROJECT_ROOT"',guardrails:["Use only permitted bootstrap sources; never read real .env files or credentials into memory.","Preserve human-authored wrapper content outside Neocortex managed blocks.","Do not reset .neocortex/state.json or depend on legacy planning.current during init bootstrap."]}}function Vt(){try{if(z(Ue))return;const e=It(),t=St(e);process.stderr.write(t);try{lt(Z,{recursive:!0}),ut(Ue,new Date().toISOString(),"utf-8")}catch{}}catch{}}function ce(e,t=process.cwd()){return e&&e.trim().length>0?e:t}const Ft=new Set(["completed","aborted","cancelled"]),Jt=new Set(["watch-target-missing","watch-target-malformed","watch-target-ambiguous","watch-target-multiple"]),T=Object.freeze({COMPLETED:"invoke-watch-completed",CANCELLED:"invoke-watch-cancelled",IDLE_TIMEOUT:"invoke-watch-idle-timeout",MAX_POLLS:"invoke-watch-max-polls",STORE_UNAVAILABLE:"invoke-watch-store-unavailable",TARGET_UNRESOLVED:"invoke-watch-target-unresolved"}),w=Object.freeze({MISSING:"watch-target-missing",MALFORMED:"watch-target-malformed",AMBIGUOUS:"watch-target-ambiguous",CONFLICT:"watch-target-conflicting-evidence",SERVER_HELD_STREAM:"watch-target-server-held-stream-unsupported"}),h=Object.freeze({OK:"continuity-ok",WATCH_NO_SUMMARIES_YET:"watch-no-summaries-yet",WATCH_CURSOR_ADVANCED:"watch-cursor-advanced",WATCH_CURSOR_UNCHANGED:"watch-cursor-unchanged",WATCH_RENDER_PENDING:"watch-render-pending",WATCH_STOP_IDLE_LIMIT_REACHED:"watch-stop-idle-limit-reached",WATCH_STOP_MAX_POLLS_REACHED:"watch-stop-max-polls-reached",WATCH_TARGET_UNRESOLVED:"watch-target-unresolved",WATCH_SNAPSHOT_UNAVAILABLE:"watch-snapshot-unavailable",WATCH_EVIDENCE_UNAVAILABLE:"watch-evidence-unavailable"}),Me=240,Gt=/(https?:\/\/\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[_-]?log|transcript|stack\s*trace|stderr:|stdout:|system prompt|prompt body|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P185[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH))/i;function Kt(e){return e.replace(/[\w.+-]+@[\w-]+\.[\w.-]+/g,W).replace(/(?:sk|pk|whsec|nxk)[-_](?:test|live|ant|proj|pro|free|enterprise)?[-_]?[A-Za-z0-9_-]{16,}/g,W).replace(/NX-[FPE]-[a-f0-9]{24}-[a-f0-9]{4}/g,W).replace(/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,W).replace(Mt,W).replace(Wt,W)}function V(e,t){const n=Kt(e);return n.length<=t?n:`${n.slice(0,t)}\u2026[TRUNCATED:${n.length-t}]`}function de(e,t=0,n=new WeakSet){if(t>Dt)return"[MAX_DEPTH]";if(e==null)return e;if(typeof e=="string")return V(e,ee);if(typeof e=="number")return Number.isFinite(e)?e:null;if(typeof e=="boolean")return e;if(typeof e=="bigint")return String(e);if(typeof e=="function"||typeof e=="symbol"||typeof e!="object")return;if(n.has(e))return"[CIRCULAR]";if(n.add(e),Array.isArray(e))return e.slice(0,Pt).map(o=>de(o,t+1,n));const r={};for(const[o,a]of Object.entries(e).slice(0,jt)){if(Ut.test(o)){r[o]=W;continue}const s=de(a,t+1,n);s!==void 0&&(r[o]=s)}return r}function ue(e,t){return{instructions:V(e??"",xt),metadata:t?de(t):void 0}}class k extends Error{code;constructor(t,n){super(n),this.name="InvokeCliInputError",this.code=t}}class We extends Error{code="PAYLOAD_TOO_LARGE";telemetry;constructor(t){super(`PAYLOAD_TOO_LARGE: invoke request is ${t.payloadBytes} bytes after deterministic degradation; limit is ${t.limitBytes}. Reduce command input or local state context and retry.`),this.name="InvokePayloadTooLargeError",this.telemetry=t}}let le=!1;function zt(e){const t=[];if(!e||typeof e!="object")return t;const n=e,r=n.planning;if(r&&(r.current!==void 0||Array.isArray(r.history))&&t.push({code:"PLANNING_LEGACY",message:"legacy `planning.current`/`planning.history` detected (not read by v1 orchestrator)"}),Array.isArray(n.stories)&&t.push({code:"STORIES_AS_ARRAY",message:"`stories` is an Array (expected Object keyed by story ID)"}),n.epics&&typeof n.epics=="object"&&!Array.isArray(n.epics))for(const[a,s]of Object.entries(n.epics)){const c=s;if(c&&c.stories!==void 0&&!Array.isArray(c.stories)){t.push({code:"EPIC_STORIES_NOT_ARRAY",message:`epic "${a}" has non-array \`stories\` field (expected string[] of story IDs)`});break}}const o=n.epics&&typeof n.epics=="object"&&Object.keys(n.epics).length>0||n.stories&&typeof n.stories=="object"&&!Array.isArray(n.stories)&&Object.keys(n.stories).length>0||Array.isArray(n.stories)||r&&r.current!==void 0;return n.schema_version===void 0?o&&t.push({code:"SCHEMA_VERSION_MISSING",message:"`schema_version` field missing (expected: `schema_version: 1`)"}):n.schema_version!==1&&t.push({code:"SCHEMA_VERSION_OUTDATED",message:`schema_version=${String(n.schema_version)} (expected: 1)`}),t}function Yt(e){if(!(le||e.length===0)){le=!0;try{const t=e.map(n=>` - ${n.message}`).join(`
2
+ `);process.stderr.write(`[Neocortex] state.json schema drift detected:
3
+ ${t}
4
+ Run \`neocortex *migrate-state --preview\` to inspect or \`neocortex *migrate-state --apply\` to migrate.
5
+ See docs/arquitetura-software/STATE-JSON-SCHEMA.md for the schema contract.
6
+ `)}catch{}}}function vr(){le=!1}function $e(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}function qt(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}function g(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function te(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}function y(e){if(typeof e!="string")return;const t=e.trim();if(t)return t.replace(/[^a-z0-9_.:-]+/gi,"_").slice(0,120)}function pe(e,t){if(!g(e))return;const n={};for(const r of t){const o=e[r];if(typeof o=="boolean")n[r]=o;else if(typeof o=="number"&&Number.isFinite(o))n[r]=o;else if(typeof o=="string"){const a=y(o);a&&(n[r]=a)}}return Object.keys(n).length>0?n:void 0}function Xt(e){if(!g(e))return;const t={...y(e.active_epic_id??e.activeEpicId)?{active_epic_id:y(e.active_epic_id??e.activeEpicId)}:{},...y(e.active_story_id??e.activeStoryId)?{active_story_id:y(e.active_story_id??e.activeStoryId)}:{},...y(e.active_step_id??e.activeStepId)?{active_step_id:y(e.active_step_id??e.activeStepId)}:{},...y(e.session_id??e.sessionId)?{session_id:y(e.session_id??e.sessionId)}:{},...y(e.started_at??e.startedAt)?{started_at:y(e.started_at??e.startedAt)}:{}};return Object.keys(t).length>0?t:void 0}function Qt(e){const t=pe(e.completionEvidence??e.completion_evidence,["prNumber","pr_number","prState","pr_state","pullRequestState","merged","mergedAt","issueNumber","issue_number","issueState","issue_state","closedAt"]),n=pe(e.issueCloseAudit??e.issue_close_audit,["schema_version","event","storyId","epicId","issueNumber","closedAt","publicSafe","rawLogStorage"]),r=pe(e.scopedCiEvidence??e.scoped_ci_evidence,["schema_version","storyId","epicId","prNumber","finalState","publicSafe","rawLogStorage"]);return{...typeof e.merged=="boolean"?{merged:e.merged}:{},...typeof e.safeToContinueYoloop=="boolean"?{safeToContinueYoloop:e.safeToContinueYoloop}:{},...typeof e.mergeBlockedRemotely=="boolean"?{mergeBlockedRemotely:e.mergeBlockedRemotely}:{},...y(e.physicalMergeStatus)?{physicalMergeStatus:y(e.physicalMergeStatus)}:{},...y(e.pr_state??e.prState??e.pull_request_state??e.pullRequestState)?{pr_state:y(e.pr_state??e.prState??e.pull_request_state??e.pullRequestState)}:{},...y(e.issue_state??e.issueState??e.workflow_issue_state)?{issue_state:y(e.issue_state??e.issueState??e.workflow_issue_state)}:{},...te(e.issue_number??e.issueNumber)?{issue_number:te(e.issue_number??e.issueNumber)}:{},...t?{completionEvidence:t}:{},...n?{issueCloseAudit:n}:{},...r?{scopedCiEvidence:r}:{}}}function Zt(e){const t=M(e,".neocortex","state.json");if(!z(t))return{config:{project_name:"unknown",default_branch:"main",language:"pt-BR"},stories:{},epics:{}};let n;try{const l=Q(t,"utf-8");n=JSON.parse(l)}catch{return{config:{project_name:"unknown",default_branch:"main",language:"pt-BR"},stories:{},epics:{}}}try{const l=zt(n);l.length>0&&Yt(l)}catch{}const r=n.config??n.project??{},o=n.stories??{},a={};for(const[l,d]of Object.entries(o))a[l]={id:d.id??l,title:d.title,epic_id:d.epic_id,status:d.status??"backlog",steps_completed:d.steps_completed??[],last_step:d.last_step??null,branch_name:d.branch_name??null,pr_number:d.pr_number,...te(d.workflow_issue)?{workflow_issue:te(d.workflow_issue)}:{},...Qt(d),depends_on:$e(d.depends_on),files_to_modify:qt(d.files_to_modify),risk:typeof d.risk=="string"?d.risk:void 0,blast_radius:typeof d.blast_radius=="number"?d.blast_radius:void 0};const s=n.epics??{},c={};for(const[l,d]of Object.entries(s))c[l]={id:d.id??l,title:d.title,status:d.status,stories:d.stories,total_stories:d.total_stories,completed_stories:d.completed_stories,depends_on:$e(d.depends_on)};const p=Xt(n.current_session??n.currentSession);return{schema_version:typeof n.schema_version=="number"?n.schema_version:void 0,config:{project_name:r.project_name??r.name??"unknown",default_branch:r.default_branch??"main",language:r.language??"pt-BR",yolo_mode:r.yolo_mode,user_name:r.user_name,worktree_base:r.worktree_base,max_parallel_stories:r.max_parallel_stories},stories:a,epics:c,...p?{current_session:p}:{}}}function wr(e,t){return{kind:"full",trigger:e,targetEpicId:null,targetStoryId:null,includedStoryCount:Object.keys(t.stories).length,includedEpicCount:Object.keys(t.epics).length,omittedStoryCount:0,omittedEpicCount:0,reason:"full-state",projectionMode:"full-compatible"}}const Be="neocortex:menu:cache";async function en(e){try{const t=await e.get(Be);if(!t)return null;const n=JSON.parse(t);return n.version!==H||Date.now()-n.cachedAt>ke?null:n}catch{return null}}async function tn(e,t,n){try{const r={instructions:t,metadata:n,cachedAt:Date.now(),version:H};await e.set(Be,JSON.stringify(r),ke),nn()}catch{}}function nn(){try{z(Le)&&dt(Le)}catch{}}function rn(){return Et()}async function on(e,t){try{let n;if(t){const s=M(Z,"cache");n=new ye({cacheDir:s,passphrase:t})}else process.stderr.write(`[neocortex] Warning: No license key in config. Run "neocortex activate" to re-authenticate.
7
+ `),n=new mt;const r=new ft({serverUrl:e,licenseKey:t??"",cacheProvider:n}),o=await r.getToken();if(!o)return null;const a=new ht({cacheProvider:n,licenseClient:r});return{token:o,client:r,tierClient:a}}catch{return null}}let He=!1;function Ve(e){return Ce("sha256").update(e).digest("hex")}function an(){const e=Number(process.env.NEOCORTEX_INVOKE_CHUNK_BYTES??"49152");return Number.isFinite(e)&&e>=1024&&e<=98304?Math.floor(e):49152}function sn(e,t,n){return`args-${Ce("sha256").update("invoke-materialization:v1").update(e).update(String(t)).update(JSON.stringify(n)).digest("hex")}`}async function Fe(e,t,n,r){const o=await fetch(`${e}${t}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`,"X-Client-Version":H},body:JSON.stringify(n)}),a=await o.text().catch(()=>""),s=(()=>{try{return a?JSON.parse(a):{}}catch{return{}}})();if(!o.ok){const c=typeof s.error_code=="string"?s.error_code:`HTTP_${o.status}`,p=typeof s.message=="string"?s.message:"materialization upload failed";throw new Error(`${c}: ${p}`)}return s}async function cn(e,t,n){const r=Buffer.from(t,"utf8"),o=an(),a=[];for(let S=0,m=0;S<r.byteLength;S+=o,m++){const I=r.subarray(S,Math.min(S+o,r.byteLength));a.push({index:m,sha256:Ve(I),byteLength:I.byteLength})}const s=Ve(r),c=sn(s,r.byteLength,a),p=Number(process.env.NEOCORTEX_INVOKE_CHUNK_TTL_SECONDS??"900");for(const S of a){const m=S.index*o,I=r.subarray(m,m+S.byteLength);await Fe(e,"/api/v1/invoke/materialization/chunks",{manifestId:c,index:S.index,sha256:S.sha256,byteLength:S.byteLength,contentBase64:I.toString("base64"),ttlSeconds:p,idempotencyKey:`${c}:${S.index}:${S.sha256}`},n)}const d=(await Fe(e,"/api/v1/invoke/materialization/manifests",{manifestId:c,sha256:s,byteLength:r.byteLength,chunkCount:a.length,chunks:a,ttlSeconds:p,retry:{attempt:1,budget:3,idempotencyKey:c}},n)).argsRef;if(!d?.manifestId)throw new Error("MATERIALIZATION_RESPONSE_INVALID: missing argsRef");return{argsRef:d,chunks:a}}function F(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function dn(...e){const t=new Set,n=[];for(const r of e)for(const o of r??[]){const a=y(o);if(!(!a||t.has(a))&&(t.add(a),n.push(a),n.length>=16))return n}return n}function un(e){const t=e.graphRetrieval;if(!g(t))return{accepted:!1,itemCount:0};const n=Array.isArray(t.items)?t.items.length:0;return{accepted:n>0||typeof t.retrievalId=="string"||t.accepted===!0,itemCount:n}}function fe(e,t=F(e),n=[],r={}){const o=e.stateSnapshot.scope,a=Object.keys(e.stateSnapshot.stories).length,s=Object.keys(e.stateSnapshot.epics).length,c=o?.kind??"full";return{schemaVersion:1,payloadBytes:t,limitBytes:r.limitBytes??je,warningThresholdBytes:r.warningThresholdBytes??ie,scope:{kind:c,...o?.projectionMode?{projectionMode:o.projectionMode}:{},commandId:o?.commandId??null,stateProjectionPolicy:o?.stateProjectionPolicy??null},includedStories:o?.includedStoryCount??a,omittedStories:o?.omittedStoryCount??0,includedEpics:o?.includedEpicCount??s,omittedEpics:o?.omittedEpicCount??0,graphRetrieval:un(e.stateSnapshot),reasonCodes:dn(n,o?.reasonCodes),publicSafe:!0}}function ln(e){const t=g(e.budget)?e.budget:void 0,n=typeof t?.maxPayloadBytes=="number"&&Number.isFinite(t.maxPayloadBytes)?t.maxPayloadBytes:12*1024;return Math.max(1024,Math.min(n,12*1024))}function pn(e){return g(e)?{stableId:y(e.stableId)??"unknown",...g(e.source)?{source:e.source}:{},reasonCode:"budget_exceeded"}:{stableId:"unknown",reasonCode:"budget_exceeded"}}function Je(e){const t=Array.isArray(e)?e.filter(n=>typeof n=="string"):[];return t.includes("budget_exceeded")?t:[...t,"budget_exceeded"]}function fn(e){const t=e.graphRetrieval;if(!g(t)||!Array.isArray(t.items))return e;const n=ln(t);let r=[...t.items],o=Array.isArray(t.skipped)?[...t.skipped]:[],a=t;for(;Buffer.byteLength(JSON.stringify(a),"utf8")>n&&r.length>0;){const s=r.pop();o=[...o,pn(s)].slice(-32),a={...t,items:r,skipped:o,warnings:Je(t.warnings)}}return Buffer.byteLength(JSON.stringify(a),"utf8")>n&&(a={...t,query:typeof t.query=="string"?t.query.slice(0,240):t.query,items:[],skipped:[],warnings:Je(t.warnings)}),a===t?e:{...e,graphRetrieval:a}}function mn(e,t={}){const n=t.limitBytes??je,r=t.warningThresholdBytes??Math.floor(n*De),o=F(e);if(o<=n)return{body:e,degraded:!1,telemetry:fe(e,o,["payload-within-limit"],{limitBytes:n,warningThresholdBytes:r})};let a={...e,stateSnapshot:Ct(e.stateSnapshot)},s=["payload-size-guardrail","state-degraded"],c=F(a);c>n&&(a={...a,stateSnapshot:fn(a.stateSnapshot)},s=[...s,"graph-retrieval-budget-enforced"],c=F(a));const p=fe(a,c,s,{limitBytes:n,warningThresholdBytes:r});if(c>n)throw new We(p);return{body:a,degraded:!0,telemetry:p}}function gn(e){return rt(e)??e.trim().split(/\s+/,1)[0]?.slice(0,80)??"(empty)"}function Ge(e){return e.args!==void 0?gn(e.args):`argsRef:${e.argsRef.manifestId.slice(0,80)}`}function hn(e){const t=F(e);if(t<ie)return t;const n=fe(e,t,["payload-warning-threshold"]);return process.stderr.write(`[Neocortex] invoke payload near server limit: trigger=${Ge(e)} scope=${n.scope.kind} mode=${n.scope.projectionMode??n.scope.kind} payloadBytes=${n.payloadBytes} limit=${n.limitBytes} includedStories=${n.includedStories} omittedStories=${n.omittedStories} includedEpics=${n.includedEpics} omittedEpics=${n.omittedEpics} graphRetrieval.accepted=${n.graphRetrieval.accepted} graphRetrieval.itemCount=${n.graphRetrieval.itemCount} reasonCodes=${n.reasonCodes.join(",")||"none"}
8
+ `),t}function Ke(e,t){process.stderr.write(`[Neocortex] invoke payload guardrail: trigger=${Ge(e)} scope.kind=${t.scope.kind} payloadBytes=${t.payloadBytes} limit=${t.limitBytes} includedStories=${t.includedStories} omittedStories=${t.omittedStories} includedEpics=${t.includedEpics} omittedEpics=${t.omittedEpics} graphRetrieval.accepted=${t.graphRetrieval.accepted} graphRetrieval.itemCount=${t.graphRetrieval.itemCount} reasonCodes=${t.reasonCodes.join(",")||"none"}
9
+ `)}async function En(e){const t=Rt(e.args,{platformTarget:e.platformTarget,environment:e.environment??process.env});if(t.action==="skipped")return{shouldContinue:!0,attachToRequest:_n(t),metadata:ze(t)};const n=e.bootstrapper??Nt;let r;try{r=await n({projectRoot:e.projectRoot,env:e.environment??process.env})}catch{r={ok:!1,attempted:!0,installed:!1,started:!1,cached:!1,projectKey:"unknown",reasonCodes:[bt.UNEXPECTED_ERROR],publicSummary:"runner scheduler bootstrap stopped unexpectedly.",publicSafe:!0}}const o=ze(t,r);if(r.ok)return{shouldContinue:!0,attachToRequest:!0,metadata:o};const a=o.reasonCodes.slice(0,5).join(",");return t.failurePolicy==="fail-open"?{shouldContinue:!0,attachToRequest:!0,metadata:{...o,failOpenWarning:!0},warning:`Runner auto-bootstrap warning (${a}); continuing fail-open for operator command.`}:{shouldContinue:!1,attachToRequest:!1,metadata:o,errorCode:"RUNNER_BOOTSTRAP_REQUIRED_FAILED",error:`Runner auto-bootstrap required but failed (${a}). Run neocortex-runner doctor or retry after resolving scheduler setup.`,exitCode:1}}function _n(e){return!e.reasonCodes.includes(wt.SKIPPED_NON_CONTINUITY_COMMAND)}function ze(e,t){return{schemaVersion:1,action:e.action,failurePolicy:e.failurePolicy,command:e.command,operation:e.operation,attempted:t?.attempted??!1,ok:t?.ok??!0,cached:t?.cached??!1,installed:t?.installed??!1,started:t?.started??!1,...t?.projectKey?{projectKey:t.projectKey}:{},reasonCodes:N([...e.reasonCodes,...t?.reasonCodes??[]]),publicSummary:t?.publicSummary??e.publicSummary,publicSafe:!0}}function N(e){return Array.from(new Set(e.map(t=>t.slice(0,120))))}function ne(e,t,n){const r=Math.floor(e??t);return Number.isFinite(r)?Math.max(1,Math.min(n,r)):t}function re(e,t){const n=process.env[e];if(!n)return t;const r=Number(n);return Number.isFinite(r)?r:t}function E(e,t=Me){const n=typeof e=="string"&&e.trim().length>0?e.trim():"unknown",r=V(n,t),o=Gt.test(r)?W:r;return o.length<=t?o:`${o.slice(0,t)}\u2026[TRUNCATED:${o.length-t}]`}function me(e,t=Me){if(!(typeof e!="string"||e.trim().length===0))return E(e,t)}function ge(e,t,n,r){const o=me(e?.targetId??t,120),a=e?.selectorKind??(o?Ee(o):void 0),s=(e?.relatedJobIds??[]).map(c=>me(c,120)).filter(c=>!!c);return{schemaVersion:1,contractVersion:"continuity-v1",targetResolutionState:n,...a?{targetKind:a}:{},...o?{targetId:o}:{},...t?{targetJobId:E(t,120)}:{},...e?.jobId?{jobId:E(e.jobId,120)}:{},...e?.goalId?{goalId:E(e.goalId,120)}:{},...e?.loopId?{loopId:E(e.loopId,120)}:{},...s.length>0?{relatedJobIds:s}:{},relatedJobCount:s.length,reasonCodes:N(r.length>0?r:[h.OK]),publicSafe:!0}}function D(e,t,n,r,o=[]){const a=(e?.redactions?.length??0)>0,s=e?a?"unsafe":n&&r===0?"empty":"available":"unavailable",c=me(t[t.length-1]?.eventId,120),p=o.length>0?o:s==="unavailable"?[h.WATCH_SNAPSHOT_UNAVAILABLE]:s==="empty"?[h.WATCH_NO_SUMMARIES_YET]:[h.OK];return{schemaVersion:1,contractVersion:"continuity-v1",snapshotStatus:s,...e?.generatedAt?{generatedAt:E(e.generatedAt,80)}:{},renderedSummaryCount:r,...c?{latestEventId:c}:{},reasonCodes:N(p),publicSafe:!0}}function x(e,t,n,r,o=[],a){const s=r[r.length-1],c=n??s?.cursor,p=!!(c&&c!==t&&r.length>0),l=a??(p?"advanced":t||c?"unchanged":"not_started"),d=o.length>0?o:l==="advanced"?[h.WATCH_CURSOR_ADVANCED]:l==="unavailable"?[h.WATCH_EVIDENCE_UNAVAILABLE]:[h.WATCH_CURSOR_UNCHANGED];return{schemaVersion:1,contractVersion:"continuity-v1",cursorState:l,...e?{initialCursor:E(e,200)}:{},...t?{currentCursor:E(t,200)}:{},...c?{nextCursor:E(c,200)}:{},cursorAdvanced:p,...s?.eventId?{eventId:E(s.eventId,120)}:{},reasonCodes:N(d),publicSafe:!0}}function P(e){const t=e.targetEvidence;return{type:"watch_status",schemaVersion:1,contractVersion:"continuity-v1",recordType:"watch_status",command:"invoke",operation:"watch",watchStatus:e.watchStatus,active:e.active,...t?.targetResolutionState?{targetResolutionState:t.targetResolutionState}:{},...t?.targetKind?{targetKind:t.targetKind}:{},...t?.targetId?{targetId:t.targetId}:{},...t?{targetEvidence:t}:{},...e.snapshotEvidence?{snapshotEvidence:e.snapshotEvidence}:{},...e.cursorEvidence?{cursorEvidence:e.cursorEvidence}:{},...e.stopReason?{stopReason:e.stopReason}:{},reasonCodes:N([...e.reasonCodes??[],...t?.reasonCodes??[],...e.snapshotEvidence?.reasonCodes??[],...e.cursorEvidence?.reasonCodes??[]]),generatedAt:E(e.generatedAt??new Date().toISOString(),80),publicSafe:!0}}function In(e){const t=e.targetKind&&e.targetId?`${e.targetKind}/${e.targetId}`:e.targetId??"[unresolved]",n=e.snapshotEvidence?.renderedSummaryCount??0,r=e.targetEvidence?.relatedJobCount??0,o=e.cursorEvidence?.cursorState??"unavailable",a=e.cursorEvidence?.currentCursor??"[none]",s=e.cursorEvidence?.nextCursor??"[none]",c=e.snapshotEvidence?.snapshotStatus??"not_requested",p=e.snapshotEvidence?.generatedAt??e.generatedAt;return[`[watch-status] ${e.targetResolutionState==="unresolved"||e.stopReason==="target_unresolved"?"unresolved-target":n===0&&(e.watchStatus==="waiting"||e.watchStatus==="active")?"no-new-summary":e.watchStatus==="stopped"?"stopped":"lifecycle"}`,`status=${e.watchStatus}`,`active=${e.active}`,`target=${t}`,`resolution=${e.targetResolutionState??"unavailable"}`,`relatedJobs=${r}`,`summaries=${n}`,`snapshot=${c}`,`generatedAt=${p}`,`cursor=${o}`,`current=${E(a,200)}`,`next=${E(s,200)}`,`advanced=${e.cursorEvidence?.cursorAdvanced??!1}`,`stop=${e.stopReason??"not_stopped"}`,`reasons=${e.reasonCodes.join(",")}`].join(" ")}function j(e,t,n){if(t==="json"){n.write(JSON.stringify(e)+`
10
+ `);return}n.write(In(e)+`
11
+ `)}function Sn(e,t,n){return{continuityInvokeWatch:{schemaVersion:1,contractVersion:"continuity-v1",command:"invoke",operation:"watch",watchStatus:e.watchStatus,stopReason:e.stopReason??"not_stopped",targetResolutionState:e.targetResolutionState,targetKind:e.targetKind,targetId:e.targetId,snapshotStatus:e.snapshotEvidence?.snapshotStatus,snapshotGeneratedAt:e.snapshotEvidence?.generatedAt,renderedSummaryCount:e.snapshotEvidence?.renderedSummaryCount??t,cursorState:e.cursorEvidence?.cursorState,cursorAdvanced:e.cursorEvidence?.cursorAdvanced,summariesEmitted:t,polls:n,statusRecord:e,publicSafe:!0}}}function U(e,t,n,r){return{status:e,summariesEmitted:t,polls:n,reasonCodes:r.reasonCodes,watchStatus:r.watchStatus,stopReason:r.stopReason,targetEvidence:r.targetEvidence,snapshotEvidence:r.snapshotEvidence,cursorEvidence:r.cursorEvidence,statusRecord:r,metadata:Sn(r,t,n),publicSafe:!0}}function Cn(e){const t=e.reasonCode?` reason=${E(e.reasonCode,80)}`:"",n=e.goalId?` goal=${E(e.goalId,100)}`:"",r=e.loopId?` loop=${E(e.loopId,100)}`:"";return`[watch] ${E(e.createdAt,80)} event=${E(e.eventId,120)} job=${E(e.jobId,100)}${n}${r} execution=${E(e.executionId,120)}${t} -- ${E(e.publicSummary)}`}function yn(e){return{type:"processing_summary",source:"local_continuity_sqlite",eventId:E(e.eventId,120),jobId:E(e.jobId,100),...e.goalId?{goalId:E(e.goalId,100)}:{},...e.loopId?{loopId:E(e.loopId,100)}:{},executionId:E(e.executionId,120),...e.reasonCode?{reasonCode:E(e.reasonCode,80)}:{},createdAt:E(e.createdAt,80),publicSummary:E(e.publicSummary),publicSafe:!0}}function An(e,t,n){if(t==="json"){n.write(JSON.stringify(yn(e))+`
12
+ `);return}n.write(Cn(e)+`
13
+ `)}function he(e){return Ft.has(e.status)}function Tn(e,t,n){if(t){const o=e.find(a=>a.jobId===t);return!!(o&&he(o))}return n<=0?!1:e.filter(o=>!he(o)).length===0}function vn(e,t,n,r){return n<r?!1:t?!e.some(o=>o.jobId===t&&!he(o)):e.length===0}function wn(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{const r=setTimeout(o,e);function o(){clearTimeout(r),t?.removeEventListener("abort",o),n()}t?.addEventListener("abort",o,{once:!0})})}function Rn(e){return e.includes(w.MALFORMED)?"malformed":e.includes(w.AMBIGUOUS)?"ambiguous":e.includes("watch-target-multiple")?"multiple":e.includes("watch-evidence-unsafe")?"unsafe":e.includes(w.MISSING)||e.includes(T.TARGET_UNRESOLVED)?"unresolved":"unavailable"}function Ye(e,t){const n=t?Y(t):void 0,r=N([...e,T.TARGET_UNRESOLVED,h.WATCH_TARGET_UNRESOLVED]),o=ge(n,n?.targetId,Rn(r),r),a=D({generatedAt:new Date().toISOString()},[],!1,0,[h.WATCH_TARGET_UNRESOLVED]),s=x(void 0,void 0,void 0,[],[h.WATCH_TARGET_UNRESOLVED],"unavailable");return P({watchStatus:"blocked",active:!1,targetEvidence:o,snapshotEvidence:a,cursorEvidence:s,stopReason:"target_unresolved",reasonCodes:r,generatedAt:a.generatedAt})}function bn(e,t,n,r){const o=Ye(e,Xe(t));return j(o,n,r),U("target-unresolved",0,0,o)}async function Nn(e){if(e.signal?.aborted){const b=ge(e.target??Y(e.targetJobId),e.targetJobId,e.target??e.targetJobId?"resolved":"unresolved",[T.CANCELLED]),_=D(void 0,[],!1,0),A=x(e.initialCursor,e.initialCursor,e.initialCursor,[],[T.CANCELLED],"unavailable"),X=P({watchStatus:"stopped",active:!1,targetEvidence:b,snapshotEvidence:_,cursorEvidence:A,stopReason:"cancelled",reasonCodes:[T.CANCELLED]});return U("cancelled",0,0,X)}const t=e.target??Y(e.targetJobId),n=e.targetJobId??t?.targetId,r=e.stdout??process.stdout;if(!t){const b=Ye([w.MISSING,T.TARGET_UNRESOLVED]);return j(b,e.format,r),U("target-unresolved",0,0,b)}const o=ne(e.limit??re("NEOCORTEX_INVOKE_WATCH_LIMIT",we),we,50),a=Math.max(50,ne(e.pollIntervalMs??re("NEOCORTEX_INVOKE_WATCH_POLL_INTERVAL_MS",Ne),Ne,6e4)),s=ne(e.maxIdlePolls??re("NEOCORTEX_INVOKE_WATCH_MAX_IDLE_POLLS",Re),Re,120),c=ne(e.maxPolls??re("NEOCORTEX_INVOKE_WATCH_MAX_POLLS",be),be,86400),p=e.sleep??wn;let l=e.initialCursor,d=0,S=0,m=0;const I=ge(t,n,"resolved",[h.OK]),f={schemaVersion:1,contractVersion:"continuity-v1",snapshotStatus:"pending",renderedSummaryCount:0,reasonCodes:[h.WATCH_RENDER_PENDING],publicSafe:!0},L=x(e.initialCursor,l,l,[],e.initialCursor?[h.WATCH_CURSOR_UNCHANGED]:[h.WATCH_NO_SUMMARIES_YET],e.initialCursor?"unchanged":"not_started");j(P({watchStatus:"active",active:!0,targetEvidence:I,snapshotEvidence:f,cursorEvidence:L,stopReason:"not_stopped",reasonCodes:[h.OK]}),e.format,r);let i;try{i=await Ot({projectRoot:e.projectRoot})}catch{const b=D(void 0,[],!1,d,[h.WATCH_SNAPSHOT_UNAVAILABLE]),_=x(e.initialCursor,l,l,[],[h.WATCH_EVIDENCE_UNAVAILABLE],"unavailable"),A=P({watchStatus:"blocked",active:!1,targetEvidence:I,snapshotEvidence:b,cursorEvidence:_,stopReason:"unavailable_evidence",reasonCodes:[T.STORE_UNAVAILABLE]});return j(A,e.format,r),U("store-unavailable",d,m,A)}try{for(;!e.signal?.aborted&&m<c;){m+=1;const b=l,_=i.collectProcessingOutputSummaryCursor({...l?{cursor:l}:{},...t?{target:t}:{},...n?{jobId:n}:{},limit:o}),A=i.collectSnapshot({jobLimit:50,processingSummaryLimit:1}),X=A.jobs;if(_.summaries.length>0){for(const G of _.summaries)An(G,e.format,r),d+=1;l=_.nextCursor??_.summaries[_.summaries.length-1]?.cursor??l,S=0}else l=_.nextCursor??l,S+=1;const it=D(A,_.summaries,!0,_.summaries.length),ct=x(e.initialCursor,b,l,_.summaries,_.summaries.length>0?[h.WATCH_CURSOR_ADVANCED]:[h.WATCH_NO_SUMMARIES_YET]);if(j(P({watchStatus:_.summaries.length>0?"polling":"waiting",active:!0,targetEvidence:I,snapshotEvidence:it,cursorEvidence:ct,stopReason:"not_stopped",reasonCodes:_.summaries.length>0?[h.WATCH_CURSOR_ADVANCED]:[h.WATCH_NO_SUMMARIES_YET],generatedAt:A.generatedAt}),e.format,r),!_.hasMore&&Tn(X,n,d)){const G=D(A,_.summaries,!1,d,[T.COMPLETED]),ae=x(e.initialCursor,b,l,_.summaries,[T.COMPLETED],"exhausted"),K=P({watchStatus:"stopped",active:!1,targetEvidence:I,snapshotEvidence:G,cursorEvidence:ae,stopReason:"not_stopped",reasonCodes:[T.COMPLETED],generatedAt:A.generatedAt});return j(K,e.format,r),U("completed",d,m,K)}if(!_.hasMore&&vn(X,n,S,s)){const G=D(A,_.summaries,!1,d,[h.WATCH_STOP_IDLE_LIMIT_REACHED]),ae=x(e.initialCursor,b,l,_.summaries,[h.WATCH_STOP_IDLE_LIMIT_REACHED],"exhausted"),K=P({watchStatus:"stopped",active:!1,targetEvidence:I,snapshotEvidence:G,cursorEvidence:ae,stopReason:"idle_limit_reached",reasonCodes:[T.IDLE_TIMEOUT,h.WATCH_STOP_IDLE_LIMIT_REACHED],generatedAt:A.generatedAt});return j(K,e.format,r),U("idle-timeout",d,m,K)}_.hasMore||await p(a,e.signal)}}catch{const b=D(void 0,[],!1,d,[h.WATCH_SNAPSHOT_UNAVAILABLE]),_=x(e.initialCursor,l,l,[],[h.WATCH_EVIDENCE_UNAVAILABLE],"unavailable"),A=P({watchStatus:"blocked",active:!1,targetEvidence:I,snapshotEvidence:b,cursorEvidence:_,stopReason:"unavailable_evidence",reasonCodes:[T.STORE_UNAVAILABLE]});return j(A,e.format,r),U("store-unavailable",d,m,A)}finally{i.close()}if(e.signal?.aborted){const b=D(void 0,[],!1,d,[T.CANCELLED]),_=x(e.initialCursor,l,l,[],[T.CANCELLED],"unavailable"),A=P({watchStatus:"stopped",active:!1,targetEvidence:I,snapshotEvidence:b,cursorEvidence:_,stopReason:"cancelled",reasonCodes:[T.CANCELLED]});return j(A,e.format,r),U("cancelled",d,m,A)}const u=D(void 0,[],!1,d,[h.WATCH_STOP_MAX_POLLS_REACHED]),C=x(e.initialCursor,l,l,[],[h.WATCH_STOP_MAX_POLLS_REACHED],"exhausted"),B=P({watchStatus:"stopped",active:!1,targetEvidence:I,snapshotEvidence:u,cursorEvidence:C,stopReason:"max_polls_reached",reasonCodes:[T.MAX_POLLS,h.WATCH_STOP_MAX_POLLS_REACHED]});return j(B,e.format,r),U("max-polls",d,m,B)}function O(e){const t=e.trim().replace(/^@/,"").match(/^(job|goal|loop)-([JGL])(\d{3,})$/i);if(!t)return;const n=t[1].toLowerCase(),r=t[2].toUpperCase();if(!(n==="job"&&r!=="J"||n==="goal"&&r!=="G"||n==="loop"&&r!=="L"))return`${n}-${r}${t[3]}`}function Ee(e){if(e.startsWith("job-J"))return"job";if(e.startsWith("goal-G"))return"goal";if(e.startsWith("loop-L"))return"loop"}function qe(e){const t=[],n=/(?:^|[\s"'([,{])@?(job-[Jj]\d{3,}|goal-[Gg]\d{3,}|loop-[Ll]\d{3,})(?=$|[\s"')\]},.;:!?])/g;let r;for(;(r=n.exec(e))!==null;){const o=O(r[1]);o&&t.push(o)}return N(t)}function Xe(e){return qe(e)[0]}function Y(e){const t=e?O(e):void 0;if(t){if(t.startsWith("job-J"))return{selectorKind:"job",targetId:t,jobId:t,publicSafe:!0};if(t.startsWith("goal-G"))return{selectorKind:"goal",targetId:t,goalId:t,publicSafe:!0};if(t.startsWith("loop-L"))return{selectorKind:"loop",targetId:t,loopId:t,publicSafe:!0}}}function _e(e){return N(e.filter(t=>typeof t=="string").map(t=>O(t)).filter(t=>!!t?.startsWith("job-J")))}function On(e,t){const n=_e(t).filter(r=>r!==e.targetId&&r!==e.jobId);return n.length>0?{...e,relatedJobIds:n}:e}function Ln(e){if(!e)return;const t=g(e.target)?e.target:void 0,n=typeof e.selectorKind=="string"?e.selectorKind:typeof t?.selectorKind=="string"?t.selectorKind:void 0,r=typeof e.targetId=="string"?O(e.targetId):typeof t?.targetId=="string"?O(t.targetId):typeof e.targetJobId=="string"?O(e.targetJobId):void 0,o=Y(r);if(!o||n&&n!==o.selectorKind)return;const a=Array.isArray(e.relatedJobIds)?e.relatedJobIds:Array.isArray(t?.relatedJobIds)?t.relatedJobIds:void 0,s=_e([...a??[],e.jobId,t?.jobId,e.targetJobId,t?.targetJobId]).filter(c=>c!==o.targetId&&c!==o.jobId);return{...o,...typeof(e.jobId??t?.jobId)=="string"?{jobId:O(e.jobId??t?.jobId)??o.jobId}:{},...typeof(e.goalId??t?.goalId)=="string"?{goalId:O(e.goalId??t?.goalId)??o.goalId}:{},...typeof(e.loopId??t?.loopId)=="string"?{loopId:O(e.loopId??t?.loopId)??o.loopId}:{},...s.length>0?{relatedJobIds:s}:{}}}function Qe(e){const t=e.trim().split(/\s+/).filter(Boolean),n=t[0]?.replace(/^\*/,"").toLowerCase(),r=t[1]?.replace(/^--/,"").toLowerCase();return(n==="jobs"||n==="job"||n==="continuity-jobs"||n==="61")&&r==="watch"}const v=Object.freeze({ACTIVE:"command-level-watch-active",INACTIVE:"command-level-watch-inactive",DUPLICATE:"command-level-watch-duplicate",AMBIGUOUS:"command-level-watch-ambiguous",QUOTED:"command-level-watch-quoted",MALFORMED:"command-level-watch-malformed",NON_FINAL:"command-level-watch-non-final",UNRESOLVED:"command-level-watch-unresolved",UNSUPPORTED:"command-level-watch-unsupported",TARGET_INVALID:"command-level-watch-target-invalid"}),kn=new Set(["create","start","resume"]),xn=new Set(["create","resume","run-once"]);function Ie(e,t,n,r,o){return{schemaVersion:1,contractVersion:"continuity-v1",...n?{command:n}:{},...r?{operation:r}:{},active:e,...o?{watchToken:o}:{},reasonCodes:N(t),serverHeldStream:!1,allJobsPolling:!1,targetResolution:e?"required-after-dispatch":"inactive",publicSafe:!0}}function R(e,t=[],n,r){const o=t.length>0?t:[v.INACTIVE];return{args:e,watch:!1,reasonCodes:o,metadata:Ie(!1,o,n,r),publicSafe:!0}}function Pn(e){const t=e.trim().split(/\s+/).filter(Boolean),n=t.slice(2).filter(a=>a==="--watch").length;if(n===0)return R(e,[],"jobs","watch");if(n!==1)return R(e,[v.AMBIGUOUS],"jobs","watch");const r=t.filter((a,s)=>s<2||a!=="--watch").join(" ");return Qe(r)?r.trim().split(/\s+/).filter(Boolean).slice(2).length!==1?R(e,[v.AMBIGUOUS],"jobs","watch"):Xe(r)?{args:r,watch:!0,reasonCodes:[v.ACTIVE],metadata:Ie(!0,[v.ACTIVE],"jobs","watch"),publicSafe:!0}:R(e,[v.TARGET_INVALID],"jobs","watch"):R(e,[v.UNSUPPORTED],"jobs","watch")}function jn(e){const t=[];let n=!1,r=0;for(;r<e.length;){for(;r<e.length&&/\s/.test(e[r]);)r+=1;if(r>=e.length)break;const o=r;let a="",s=!1,c=null;for(;r<e.length;){const p=e[r];if(c){if(p===c){s=!0,c=null,r+=1;continue}if(p==="\\"&&r+1<e.length){a+=e[r+1],r+=2;continue}a+=p,r+=1;continue}if(/\s/.test(p))break;if(p==='"'||p==="'"){s=!0,c=p,r+=1;continue}a+=p,r+=1}c&&(n=!0),t.push({value:a,start:o,end:r,quoted:s})}return{tokens:t,malformed:n}}function Dn(e){if(!e||e.quoted)return;const t=e.value.replace(/^\*/,"").toLowerCase();return t==="goal"||t==="loop"?t:void 0}function Un(e,t){if(!e||e==="jobs"||!t||t.quoted)return;const n=t.value.toLowerCase();return(e==="goal"?kn:xn).has(n)?n:void 0}function Mn(e){return!e.quoted&&e.value!=="--watch"&&e.value.toLowerCase().startsWith("--watch")}function Wn(e){const{tokens:t,malformed:n}=jn(e),r=Dn(t[0]),o=Un(r,t[1]);if(n)return R(e,[v.MALFORMED],r,o);const a=t.filter(m=>m.value==="--watch"&&!m.quoted),s=t.filter(m=>m.value==="--watch"&&m.quoted),c=t.filter(Mn);if(!(a.length>0||s.length>0||c.length>0))return R(e,[],r,o);if(a.length>1)return R(e,[v.DUPLICATE],r,o);if(a.length===1&&(s.length>0||c.length>0))return R(e,[v.AMBIGUOUS],r,o);if(s.length>0)return R(e,[v.QUOTED],r,o);if(c.length>0)return R(e,[v.MALFORMED],r,o);const l=a[0];if(!l)return R(e,[],r,o);if(t[t.length-1]!==l)return R(e,[v.NON_FINAL],r,o);if(!r||!o)return R(e,[v.UNRESOLVED],r,o);const d=`${e.slice(0,l.start)}${e.slice(l.end)}`.trim(),S={literal:"--watch",position:"final",start:l.start,end:l.end,quoted:!1,publicSafe:!0};return{args:d,watch:!0,reasonCodes:[v.ACTIVE],metadata:Ie(!0,[v.ACTIVE],r,o,S),publicSafe:!0}}function $n(e){return Qe(e)?Pn(e):Wn(e)}function Bn(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&Jt.has(t)):[]}function J(e){return{disabled:!0,reasonCodes:N(e.length>0?e:[w.MISSING])}}function Se(e,t,n=[],r){const o=Y(t);if(o)return{source:e,target:On(o,n),targetJobId:o.targetId,...r?{initialCursor:r}:{},serverHeldStream:!1}}function Hn(e){const t=new Map;for(const n of e){const r=`${n.target.selectorKind}:${n.target.targetId}`,o=t.get(r);if(!o){t.set(r,n);continue}const a=N([...o.target.relatedJobIds??[],...n.target.relatedJobIds??[]]);t.set(r,{...o,target:a.length>0?{...o.target,relatedJobIds:a}:o.target,initialCursor:o.initialCursor??n.initialCursor})}return Array.from(t.values())}function $(e,t,n,r){return{source:e,hasEvidence:t,candidates:Hn(n.filter(o=>!!o)),...r&&r.length>0?{disabledReasonCodes:N(r)}:{}}}function Vn(e,t){return e.target.selectorKind===t.target.selectorKind&&e.target.targetId===t.target.targetId}function q(e,t){const n=N(e.filter(r=>typeof r=="string").map(r=>O(r)).filter(r=>!!r));if(t){const r=n.find(o=>Ee(o)===t);if(r)return r}return n[0]}function oe(e,t){return N(e.filter(n=>typeof n=="string").map(n=>O(n)).filter(n=>!!n)).find(n=>Ee(n)===t)}function Fn(e){const t=g(e?.continuity)?e.continuity:void 0,n=g(t?.jobs)?t.jobs:void 0,r=g(n?.watcher)?n.watcher:void 0,o=Bn(r?.reasonCodes??n?.reasonCodes);if(!r)return $("watcher-metadata",o.length>0,[],o);if(r.active===!1||o.length>0)return $("watcher-metadata",!0,[],o.length>0?o:[w.MALFORMED]);if(r.serverHeldStream!==!1)return $("watcher-metadata",!0,[],[w.SERVER_HELD_STREAM]);const a=Ln(r);if(!a)return $("watcher-metadata",!0,[],[w.MISSING]);const s=typeof r.initialCursor=="string"?r.initialCursor:void 0;return $("watcher-metadata",!0,[{source:"watcher-metadata",target:a,targetJobId:a.targetId,...s?{initialCursor:s}:{},serverHeldStream:!1}])}function Ze(e,t){const n=g(e.loopJobPlan)?e.loopJobPlan:void 0,r=g(n?.metadata)?n.metadata:void 0,o=g(e.metadata)?e.metadata:void 0,s=(t==="goal"?q([e.goalId,e.targetGoalId,e.campaignId,e.jobId,e.targetJobId,o?.goalId,o?.campaignId,o?.jobId],"goal"):q([e.loopId,e.targetLoopId,e.jobId,e.targetJobId,o?.loopId,o?.jobId,r?.loopId,r?.jobId],"loop"))??q([e.jobId,e.targetJobId,o?.jobId,r?.jobId]);return Se("goal-loop-continuity-metadata",s,[e.jobId,e.targetJobId,o?.jobId,r?.jobId])}function Jn(e){const t=g(e?.continuity)?e.continuity:void 0,n=g(t?.goal)?t.goal:void 0,r=g(t?.loop)?t.loop:void 0,o=[n?Ze(n,"goal"):void 0,r?Ze(r,"loop"):void 0],a=!!(n||r);return $("goal-loop-continuity-metadata",a,o,a&&o.every(s=>!s)?[w.MISSING]:void 0)}function Gn(e){return Array.isArray(e)?e.filter(g):g(e)?Array.isArray(e.operationLogs)?e.operationLogs.filter(g):g(e.operationLog)?[e.operationLog]:Array.isArray(e.operations)?[e]:[]:[]}function et(e,t){const n=g(t.metadata)?t.metadata:void 0,r=oe([t.goalId,t.targetGoalId,t.campaignId,n?.goalId,n?.campaignId,t.jobId,n?.jobId],"goal"),o=oe([t.loopId,t.targetLoopId,n?.loopId,t.jobId,n?.jobId],"loop"),a=q([t.jobId,t.targetJobId,n?.jobId],"job"),s=r??o??a;if(!s)return;const c=e.get(s)??{targetId:s,relatedJobIds:[]};c.relatedJobIds.push(..._e([a,t.jobId,t.targetJobId,n?.jobId])),e.set(s,c)}function Kn(e){const t=g(e.metadata)?e.metadata:void 0;return!!(oe([e.goalId,e.targetGoalId,e.campaignId,t?.goalId,t?.campaignId,e.jobId,t?.jobId],"goal")??oe([e.loopId,e.targetLoopId,t?.loopId,e.jobId,t?.jobId],"loop"))}function zn(e){const t=g(e.metadata)?e.metadata:void 0;return!!q([e.goalId,e.targetGoalId,e.campaignId,e.loopId,e.targetLoopId,e.jobId,e.targetJobId,t?.goalId,t?.campaignId,t?.loopId,t?.jobId])}function tt(e,t){const n=[];for(const s of["metadata","job","event","receipt","processingOutputSummary"]){const c=t[s];g(c)&&n.push(c)}const r=g(t.event)?t.event:void 0;g(r?.metadata)&&n.push(r.metadata),g(r?.processingOutputSummary)&&n.push(r.processingOutputSummary);const o=g(t.receipt)?t.receipt:void 0;g(o?.metadata)&&n.push(o.metadata);const a=n.some(zn);for(const s of n)et(e,s);(!a||Kn(t))&&et(e,t)}function Yn(e){const t=Gn(e?.continuityStateUpdate),n=new Map;for(const o of t){tt(n,o);const a=Array.isArray(o.operations)?o.operations.filter(g):[];for(const s of a)tt(n,s)}const r=Array.from(n.values()).map(o=>Se("continuity-state-update-operation-log",o.targetId,o.relatedJobIds));return $("continuity-state-update-operation-log",t.length>0,r,t.length>0&&r.every(o=>!o)?[w.MISSING]:void 0)}function qn(e){const t=qe(e);return $("explicit-args",t.length>0,t.map(n=>Se("explicit-args",n)))}function Xn(e,t){const n=[Fn(e),Jn(e),Yn(e),qn(t)];for(let r=0;r<n.length;r+=1){const o=n[r];if(!o.hasEvidence)continue;if(o.disabledReasonCodes&&o.disabledReasonCodes.length>0)return J(o.disabledReasonCodes);if(o.candidates.length!==1)return J([o.candidates.length>1?w.AMBIGUOUS:w.MISSING]);const a=o.candidates[0];for(const s of n.slice(r+1)){if(!s.hasEvidence)continue;if(s.disabledReasonCodes&&s.disabledReasonCodes.length>0)return J(s.disabledReasonCodes);if(s.candidates.length>1)return J([w.AMBIGUOUS]);const c=s.candidates[0];if(c&&!Vn(a,c))return J([w.CONFLICT])}return{target:a.target,targetJobId:a.targetJobId,...a.initialCursor?{initialCursor:a.initialCursor}:{},source:a.source,serverHeldStream:!1}}return J([w.MISSING])}async function nt(e,t,n){const r=`${e}/api/v1/invoke`,o=new AbortController,a=setTimeout(()=>o.abort(),xe);try{const s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`,"X-Client-Version":H},body:JSON.stringify(t),signal:o.signal});if(clearTimeout(a),!s.ok){const l=await s.text().catch(()=>"Unknown error");let d;try{d=JSON.parse(l)}catch{}return{ok:!1,status:s.status,error:d?`${d.error_code??"ERROR"}: ${d.message??l}`:`HTTP ${s.status}: ${l}`,errorBody:d}}const c=await s.json(),p=s.headers.get("X-Client-Version-Warning");return p&&!He&&(He=!0,process.stderr.write(`
14
+ [Neocortex] ${p}
15
+
16
+ `)),{ok:!0,status:s.status,data:c}}catch(s){clearTimeout(a);const c=s instanceof Error?s.message:String(s);return{ok:!1,status:0,error:c.includes("abort")?`Request timeout after ${xe/1e3}s`:`Network error: ${c}`}}}async function Qn(e){const t=ce(e.projectRoot),n=e.platformTarget??"claude-code";Vt();const r=rn(),o=(e.serverUrl??r?.serverUrl??_t).replace(/\/+$/,"");try{At(t,{args:e.args})}catch(i){if(i instanceof Tt)return process.stderr.write(`${i.message}
17
+ `),{success:!1,error:i.message,exitCode:1};const u=i instanceof Error?i.message:String(i);return process.stderr.write(`[Neocortex] state.json repair stopped unexpectedly: ${u}. No request was sent; inspect .neocortex/state.json and rerun.
18
+ `),{success:!1,error:u,exitCode:1}}const a=Zt(t);try{const{maybeAutoResolveYoloopArgs:i}=await import("../yoloop/invoke-hooks.js"),u={args:e.args,projectRoot:t,logger:{info:C=>process.stderr.write(`${C}
19
+ `),warn:C=>process.stderr.write(`${C}
20
+ `)}};i(u),u.args!==e.args&&(e={...e,args:u.args})}catch(i){const u=i instanceof Error?i.message:String(i);process.stderr.write(`[Neocortex] Auto-resolve hook (P121.05) failed: ${u}. Proceeding with raw args.
21
+ `)}try{const{readYoloopForRequest:i}=await import("../yoloop/invoke-hooks.js"),u=await i(e.args,t);u&&(a.yoloop=u)}catch{}try{const{readContinuityForRequest:i}=await import("../continuity/invoke-hooks.js"),u=await i(e.args,t);u&&(a.continuity=u)}catch(i){const u=i instanceof Error?i.message:String(i);process.stderr.write(`[Neocortex] continuity snapshot hook failed: ${u}. Proceeding without continuity state.
22
+ `)}try{const{maybeRunDiscoveryHook:i}=await import("../yoloop/invoke-hooks.js");await i({args:e.args,projectRoot:t,stateSnapshot:a,featureFlag:process.env.YOLOOP_AUTO_DISCOVERY!=="off",logger:{warn:u=>{console.warn(u)},info:u=>{console.error(u)}}})}catch(i){const u=i instanceof Error?i.message:String(i);process.stderr.write(`[Neocortex] discovery hook failed: ${u}. Proceeding without enrichment.
23
+ `)}try{const{readArchitecturePolicy:i}=await import("../policy/architecture-policy.js"),u=await i(t);u&&(a.architecture_policy=u)}catch(i){const u=i instanceof Error?i.message:String(i);console.warn(`[Neocortex] architecture-policy hook failed: ${u}. Proceeding without policy.`)}try{const i=/^(1|true|on|yes)$/i.test(process.env.NEOCORTEX_GRAPH_RETRIEVAL??""),{maybeRunGraphRetrievalHook:u}=await import("../yoloop/invoke-hooks.js"),C=await u({args:e.args,projectRoot:t,featureFlag:i,logger:{warn:B=>process.stderr.write(`${B}
24
+ `)}});C.applied&&C.metadata&&(a.graphRetrieval=C.metadata)}catch(i){const u=i instanceof Error?i.message:String(i);process.stderr.write(`[Neocortex] graph retrieval hook failed: ${u}. Proceeding without enrichment.
25
+ `)}try{const{readAndConsumeCheckpoint:i}=await import("../checkpoint/index.js"),u=await i(t);u&&(a.implementCheckpoint=u)}catch(i){const u=i instanceof Error?i.message:String(i);process.stderr.write(`[Neocortex] checkpoint hook failed: ${u}. Proceeding without checkpoint.
26
+ `)}const s=r?.licenseKey?new ye({cacheDir:Oe,passphrase:r.licenseKey}):null,c=e.args.trim();if(Bt(c))try{a.projectMemoryBootstrap=Ht(t)}catch(i){const u=i instanceof Error?i.message:String(i);process.stderr.write(`[Neocortex] project-memory bootstrap diagnosis failed: ${u}. Proceeding without local memory snapshot.
27
+ `)}if(!c&&s){const i=await en(s);if(i)return{success:!0,instructions:i.instructions,metadata:i.metadata,exitCode:0}}const p=await on(o,r?.licenseKey);if(!p){const i=r&&!r.licenseKey?" This may be caused by a machine fingerprint change (e.g., hardware or hostname change).":"";try{const u=ve(),C=Ae("NOT_CONFIGURED",u);C&&process.stderr.write(Te(C,u))}catch{}return{success:!1,error:`Not authenticated.${i} Visit https://neocortex.sh/portal/login to get your license key, then run: neocortex activate YOUR-LICENSE-KEY`,exitCode:2}}const l=rt(c);if(l)try{const i=await p.tierClient.preFlightCheck(l);if(!i.allowed)return process.stderr.write(`[neocortex] ${i.message}
28
+ `),{success:!1,error:i.message??"Trigger not available on your plan",exitCode:1}}catch{}const d=await En({args:c,projectRoot:t,platformTarget:n,environment:e.environment??process.env,bootstrapper:e.runnerBootstrapper});if(d.attachToRequest&&(a.runnerBootstrap=d.metadata),d.warning&&process.stderr.write(`[Neocortex] ${d.warning}
29
+ `),!d.shouldContinue)return d.error&&process.stderr.write(`[Neocortex] ${d.error}
30
+ `),{success:!1,error:d.error??"Runner auto-bootstrap required but failed.",errorCode:d.errorCode,exitCode:d.exitCode??1};const S=yt(c,a);let m={args:c,projectRoot:t.replace(se(),"~"),stateSnapshot:S,platformTarget:n};const I=F(m);if(e.inputSource&&e.inputSource!=="args"&&I>=ie)try{m={argsRef:(await cn(o,c,p.token)).argsRef,projectRoot:t.replace(se(),"~"),stateSnapshot:S,platformTarget:n}}catch(i){return{success:!1,error:`INVOKE_MATERIALIZATION_FAILED: ${i instanceof Error?i.message:String(i)}`,errorCode:"INVOKE_MATERIALIZATION_FAILED",exitCode:1}}try{const i=mn(m);m=i.body,i.degraded?Ke(m,i.telemetry):hn(m)}catch(i){if(i instanceof We)return Ke(m,i.telemetry),process.stderr.write(`[Neocortex] ${i.message}
31
+ `),{success:!1,error:i.message,errorCode:i.code,metadata:{invokePayload:i.telemetry},exitCode:1};throw i}let f=await nt(o,m,p.token);if(!f.ok&&f.status===401){const i=f.errorBody?.fallback_action;if(i==="refresh_token"||i==="re_authenticate"){const u=await p.client.forceRefresh();u&&(f=await nt(o,m,u))}}if(!f.ok&&f.status===426){const i=f.errorBody,u=i?.upgrade_command??"npm install -g @ornexus/neocortex@latest",C=i?.min_version??"unknown";return process.stderr.write(`
32
+ `),process.stderr.write(`==================================================
33
+ `),process.stderr.write(` UPGRADE REQUIRED
34
+ `),process.stderr.write(`==================================================
35
+ `),process.stderr.write(`
36
+ Your Neocortex version (${H}) is no longer supported.
37
+ `),process.stderr.write(` Minimum required: ${C}
38
+
39
+ `),process.stderr.write(` Run this command to update:
40
+
41
+ `),process.stderr.write(` ${u}
42
+
43
+ `),process.stderr.write(` After updating, re-run your command.
44
+ `),process.stderr.write(`==================================================
45
+
46
+ `),{success:!1,error:`UPGRADE_REQUIRED: Client version ${H} is below minimum ${C}. Run: ${u}`,exitCode:3}}if(!f.ok||!f.data){const i=f.status===401?2:(f.status===429||f.status>=500,1);try{const u=f.errorBody?.error_code??(f.status===429?"RATE_LIMITED":f.status>=500?"SERVER_ERROR":void 0);if(u){const C=ve(),B=Ae(u,C);B&&process.stderr.write(Te(B,C))}}catch{}return{success:!1,error:V(f.error??"Unknown error from server",ee),exitCode:i}}if(!c&&f.data.metadata?.mode==="menu"&&s&&tn(s,f.data.instructions,f.data.metadata).catch(()=>{}),f.data.metadata&&p.tierClient.updateQuotaFromResponse(f.data.metadata).catch(()=>{}),f.data.metadata?.mode==="error"&&f.data.metadata?.errorCode==="CLIENT_UPGRADE_REQUIRED")return process.stderr.write(`
47
+ `),process.stderr.write(`==================================================
48
+ `),process.stderr.write(` YOLOOP CLIENT UPGRADE REQUIRED
49
+ `),process.stderr.write(`==================================================
50
+ `),process.stderr.write(`
51
+ Your Neocortex client version (${H}) does not
52
+ `),process.stderr.write(` support client-side yoloop state persistence.
53
+
54
+ `),process.stderr.write(` Run this command to upgrade:
55
+
56
+ `),process.stderr.write(` npm install -g @ornexus/neocortex@latest
57
+
58
+ `),process.stderr.write(` After upgrading, re-run your yoloop command.
59
+ `),process.stderr.write(`==================================================
60
+
61
+ `),{success:!1,error:"CLIENT_UPGRADE_REQUIRED: This client does not support yoloop client-side persistence. Run: npm install -g @ornexus/neocortex@latest",exitCode:3};if(f.data.metadata?.yoloopStateUpdate)try{const{persistYoloopFromResponse:i}=await import("../yoloop/invoke-hooks.js");await i(f.data.metadata,t)}catch{}if(f.data.metadata?.continuityStateUpdate)try{const{persistContinuityFromResponse:i}=await import("../continuity/invoke-hooks.js"),u=await i(f.data.metadata,t);if(!u.ok){const C=u.reasonCodes.join(",");return process.stderr.write(`[Neocortex] continuity persistence failed: ${C}. No continuity mutation was committed.
62
+ `),{success:!1,error:`CONTINUITY_PERSISTENCE_FAILED: ${C}`,errorCode:"CONTINUITY_PERSISTENCE_FAILED",exitCode:1}}}catch(i){const u=i instanceof Error?i.message:String(i);return process.stderr.write(`[Neocortex] continuity persistence hook failed: ${u}. No continuity mutation was committed.
63
+ `),{success:!1,error:`CONTINUITY_PERSISTENCE_FAILED: ${V(u,ee)}`,errorCode:"CONTINUITY_PERSISTENCE_FAILED",exitCode:1}}if(f.data.metadata?.stateMutated===!0)try{const{persistMigratedStateFromResponse:i}=await import("../yoloop/invoke-hooks.js");await i(f.data.metadata,t)}catch{}if(f.data.metadata?.tier_changed){const i=f.data.metadata.current_tier;try{await p.client.forceRefresh()?(await p.tierClient.invalidateTierCache(),process.stderr.write(`[Neocortex] Token atualizado automaticamente para tier ${i}
64
+ `)):process.stderr.write(`[Neocortex] Seu tier foi atualizado para ${i}! Execute "neocortex activate" para obter um token atualizado.
65
+ `)}catch{process.stderr.write(`[Neocortex] Seu tier foi atualizado para ${i}! Execute "neocortex activate" para obter um token atualizado.
66
+ `)}}const L=ue(f.data.instructions,f.data.metadata);return{success:!0,instructions:L.instructions,metadata:L.metadata,exitCode:0}}function rt(e){const[t]=e.trim().split(/\s+/,1);return t?/^@?epic-[a-z0-9][a-z0-9._-]*$/i.test(t)?"epic":gt(t):null}const ot="Provide exactly one invoke input source: --args <string>, --stdin, or --args-file <path>.",Zn=`
67
+ neocortex-client invoke - Send orchestration request to server
68
+
69
+ Usage:
70
+ neocortex-client invoke --args "*status" [--format plain|json]
71
+ neocortex-client invoke --args "*jobs console @job-J001"
72
+ neocortex-client invoke --args "*jobs watch @job-J001" [--watch]
73
+ neocortex-client invoke --args "*jobs watch @goal-G001 --watch" [--format json]
74
+ neocortex-client invoke --args "*goal create synthetic objective --watch"
75
+ neocortex-client invoke --args "*loop run-once loop-L001 --watch" [--format json]
76
+ neocortex-client invoke --stdin < synthetic.story.md
77
+ neocortex-client invoke --args-file ./synthetic.story.md
78
+
79
+ Options:
80
+ --args <string> Selected Neocortex command payload (for example, "*jobs watch @loop-L001")
81
+ --stdin Read an oversized explicit payload as UTF-8 text from stdin
82
+ --args-file <path> Read an oversized explicit payload as UTF-8 text from a local file
83
+ --project-root <path> Project root directory (default: cwd; Git repo not required)
84
+ --format <type> Output format: json | plain (default: plain)
85
+ --watch Keep the foreground client polling local continuity summaries
86
+ --server-url <url> Server URL override
87
+
88
+ Invocation payload boundary:
89
+ Select only the explicit user-intended Neocortex command and arguments after
90
+ the trigger, then preserve that selected payload verbatim for --args.
91
+ Do not forward ambient platform/tool metadata, assistant notes, histories,
92
+ raw logs/stdout/stderr, protected prompts/workflows, private URLs, secrets,
93
+ credentials, PII or injection-like reminder text. --stdin and --args-file are
94
+ only for oversized explicit user payloads, never logs, histories, prompts or
95
+ orchestration context.
96
+
97
+ Jobs watch forms:
98
+ *jobs console @job-J001 # local-only raw stdout/stderr + confirmed stdin; no hosted stream
99
+ *jobs watch @job-J001
100
+ *jobs watch @goal-G001
101
+ *jobs watch @loop-L001
102
+ *jobs watch @goal-G001 --watch
103
+
104
+ Goal/loop command-level watch forms:
105
+ *goal create synthetic objective --watch
106
+ *goal start @goal-G001 --watch
107
+ *goal resume goal-G001 --watch
108
+ *loop create every-5m synthetic objective --watch
109
+ *loop resume @loop-L001 --watch
110
+ *loop run-once loop-L001 --watch
111
+
112
+ Invalid or inactive command-level watch examples:
113
+ *goal create synthetic --watch --watch # duplicate
114
+ *goal create "--watch" # quoted objective text
115
+ *goal create --watch synthetic objective # non-final / mid-command
116
+ *goal status @goal-G001 --watch # unsupported operation
117
+ *loop once @loop-L001 --watch # unsupported alias
118
+
119
+ JSON compatibility:
120
+ --format json without active watch writes one JSON document.
121
+ --format json with active --watch writes typed NDJSON: an invoke_result line,
122
+ watch_status lifecycle records and local processing_summary lines.
123
+
124
+ Watch factual evidence:
125
+ Active watch reports target resolution state, target kind/id, related job
126
+ counts, snapshot status/generatedAt, rendered summary counts, cursor state,
127
+ cursor advancement, event ids, lifecycle status and stop reasons.
128
+
129
+ Safety:
130
+ Jobs console is Plane B/local-only: no hosted server call for raw output, no server-held stream, no raw persistence, and stdin requires explicit local confirmation.
131
+ Jobs, goal and loop watch use serverHeldStream=false and foreground local SQLite polling of public processing summaries only.
132
+ Unresolved targets disable polling with public reason codes; there is no all-jobs fallback.
133
+ `.trim();function er(e){return e.includes("--help")||e.includes("-h")||e.includes("help")}function at(e){return new k("INVOKE_INPUT_VALUE_MISSING",`${e} requires a value. ${ot}`)}function tr(e){try{if(!pt(e).isFile())throw new k("INVOKE_ARGS_FILE_NOT_FILE","--args-file must point to a readable UTF-8 text file.");return Q(e,"utf8")}catch(t){throw t instanceof k?t:new k("INVOKE_ARGS_FILE_READ_FAILED","--args-file could not be read as UTF-8 text. Check the path and permissions.")}}function nr(){try{if(process.stdin.isTTY)throw new k("INVOKE_STDIN_EMPTY","--stdin requires piped UTF-8 text, for example: neocortex-client invoke --stdin < synthetic.story.md");return Q(0,"utf8")}catch(e){throw e instanceof k?e:new k("INVOKE_STDIN_READ_FAILED","--stdin could not be read as UTF-8 text. Pipe command text into stdin and retry.")}}function rr(e,t={}){let n,r=!1,o,a,s="plain",c=!1,p;for(let I=0;I<e.length;I++)switch(e[I]){case"--args":{const L=e[++I];if(L===void 0)throw at("--args");n=L;break}case"--stdin":r=!0;break;case"--args-file":{const L=e[++I];if(L===void 0)throw at("--args-file");o=L;break}case"--project-root":a=e[++I];break;case"--format":s=e[++I]??"plain";break;case"--watch":c=!0;break;case"--server-url":p=e[++I];break}const l=[n!==void 0?"args":void 0,r?"stdin":void 0,o!==void 0?"args-file":void 0].filter(I=>I!==void 0);if(l.length===0)throw new k("INVOKE_INPUT_SOURCE_MISSING",ot);if(l.length>1)throw new k("INVOKE_INPUT_SOURCE_CONFLICT",`Choose only one invoke input source; received ${l.join(", ")}.`);const d=l[0],S=d==="args"?n:d==="stdin"?(t.readStdin??nr)():(t.readArgsFile??tr)(o),m=d==="args"?$n(S):R(S);return{args:m.args,inputSource:d,projectRoot:a,format:s,watch:c||m.watch,commandLevelWatch:m.metadata,serverUrl:p}}function st(e,t){return t?.active?{...e??{},commandLevelWatch:t,serverHeldStream:!1}:e}function or(e,t,n=process.stdout,r=process.stderr){if(t.format==="json"){const s=ue(e.instructions,e.metadata),c=st(s.metadata,t.commandLevelWatch);if(t.watch){n.write(JSON.stringify({type:"invoke_result",instructions:s.instructions,metadata:c,publicSafe:!0})+`
134
+ `);return}n.write(JSON.stringify({instructions:s.instructions,metadata:c})+`
135
+ `);return}const o=ue(e.instructions,e.metadata),a=st(o.metadata,t.commandLevelWatch);n.write(o.instructions+`
136
+ `),a&&r.write(JSON.stringify(a)+`
137
+ `)}function ar(e){const t=()=>e.abort();return process.once("SIGINT",t),process.once("SIGTERM",t),()=>{process.removeListener("SIGINT",t),process.removeListener("SIGTERM",t)}}async function Rr(e){if(er(e))return process.stdout.write(`${Zn}
138
+ `),0;let t;try{t=rr(e)}catch(r){if(r instanceof k)return process.stderr.write(JSON.stringify({error_code:r.code,message:r.message})+`
139
+ `),1;throw r}if(Lt(t.args))return(await kt({args:t.args,projectRoot:ce(t.projectRoot),format:t.format,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})).exitCode;const n=await Qn({args:t.args,inputSource:t.inputSource,watch:t.watch,projectRoot:t.projectRoot,format:t.format,serverUrl:t.serverUrl});if(!n.success)return process.stderr.write(JSON.stringify({error_code:n.errorCode??(n.exitCode===2?"NOT_CONFIGURED":"INVOKE_ERROR"),message:V(n.error??"",ee)})+`
140
+ `),n.exitCode;if(or(n,t),t.watch){const r=new AbortController,o=ar(r);try{const a=Xn(n.metadata,t.args);a.disabled?bn(a.reasonCodes??[T.TARGET_UNRESOLVED],t.args,t.format,process.stdout):await Nn({projectRoot:ce(t.projectRoot),format:t.format,...a,signal:r.signal})}finally{o()}}return 0}export{Zn as INVOKE_HELP_TEXT,je as INVOKE_PAYLOAD_LIMIT_BYTES,ie as INVOKE_PAYLOAD_WARNING_THRESHOLD_BYTES,k as InvokeCliInputError,We as InvokePayloadTooLargeError,vr as __resetSchemaDriftWarnedForTests,Ht as collectInitProjectMemoryBootstrapSnapshot,Zt as collectStateSnapshot,F as computeInvokeRequestBodySizeBytes,wr as createFullStateSnapshotScope,fe as createInvokePayloadTelemetry,zt as detectStateSchemaDrift,rt as extractPreFlightTrigger,mn as guardInvokeRequestBodySize,Qn as invoke,Rr as invokeCliHandler,Bt as isInitTrigger,hn as maybeEmitInvokePayloadSizeWarning,En as maybeRunInvokeRunnerAutoBootstrap,rr as parseInvokeCliOptions,$n as resolveInvokeCommandLevelWatch,ce as resolveInvokeProjectRoot,Xn as resolveInvokeWatchTarget,ue as sanitizeInvokeCliOutput,Nn as watchContinuityProcessingSummaries,or as writeInvokeCliSuccessOutput};
@@ -0,0 +1,11 @@
1
+ import { type ProjectMemoryTargetId } from '../memory/shared-project-memory-types.js';
2
+ import { type WriteProjectMemoryTargetFilesResult } from '../memory/project-memory-writer.js';
3
+ export interface RefreshMemoryCliOptions {
4
+ readonly projectRoot: string;
5
+ readonly targetIds: readonly ProjectMemoryTargetId[];
6
+ readonly dryRun: boolean;
7
+ readonly memoryNotes?: readonly string[];
8
+ }
9
+ export declare function parseRefreshMemoryArgs(args: readonly string[]): RefreshMemoryCliOptions;
10
+ export declare function refreshProjectMemoryTargets(options: RefreshMemoryCliOptions): readonly WriteProjectMemoryTargetFilesResult[];
11
+ export declare function refreshMemoryCliHandler(args: readonly string[]): Promise<number>;
@@ -0,0 +1 @@
1
+ import{resolve as m}from"node:path";import{isProjectMemoryTargetId as h,listProjectMemoryTargets as d}from"../memory/shared-project-memory-types.js";import{writeProjectMemoryTargetFiles as g}from"../memory/project-memory-writer.js";function i(r){return(r??"").split(",").map(t=>t.trim()).filter(Boolean)}function p(r){let t=process.cwd(),c=!1;const a=[],n=[];for(let s=0;s<r.length;s++){const e=r[s];if(e==="--dry-run"||e==="--preview")c=!0;else if(e==="--project-root")t=r[++s]??t;else if(e.startsWith("--project-root="))t=e.slice(15);else if(e==="--target"||e==="--targets")a.push(...i(r[++s]));else if(e.startsWith("--target="))a.push(...i(e.slice(9)));else if(e.startsWith("--targets="))a.push(...i(e.slice(10)));else if(e==="--note"||e==="--memory-note"||e==="--change"){const l=r[++s];l&&n.push(l)}else e.startsWith("--note=")?n.push(e.slice(7)):e.startsWith("--memory-note=")?n.push(e.slice(14)):e.startsWith("--change=")&&n.push(e.slice(9))}const o=a.length>0?a.map(s=>{if(!h(s))throw new Error(`Unknown project-memory target: ${s}`);return s}):["canonical",...d().map(s=>s.targetId)];return{projectRoot:m(t),targetIds:Array.from(new Set(o)),dryRun:c,memoryNotes:n}}function u(r){return r.targetIds.map(t=>g({projectRoot:r.projectRoot,targetId:t,dryRun:r.dryRun,memoryNotes:r.memoryNotes??[]}))}async function R(r){try{const t=p(r),a=u(t).flatMap(n=>n.files.map(o=>[o.changed?t.dryRun?"would-change":"changed":"unchanged",o.mode,o.relativeFile,o.fallbackReason?`warning=${o.fallbackReason}`:void 0,o.remediationDebt?`debt=${o.remediationDebt}`:void 0,o.reasonCodes&&o.reasonCodes.length>0?`reasons=${o.reasonCodes.join(",")}`:void 0].filter(Boolean).join(" ")));console.log(`${t.dryRun?"Project memory preview":"Project memory refreshed"}: ${t.projectRoot}`);for(const n of a)console.log(n);return 0}catch(t){return console.error(t instanceof Error?t.message:String(t)),1}}export{p as parseRefreshMemoryArgs,R as refreshMemoryCliHandler,u as refreshProjectMemoryTargets};
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * This file is part of Neocortex CLI, licensed under the
6
+ * Functional Source License, Version 1.1 (FSL-1.1).
7
+ *
8
+ * Change Date: February 20, 2029
9
+ * Change License: MIT
10
+ *
11
+ * See the LICENSE file in the project root for full license text.
12
+ */
13
+ import type { AssetResolver } from '../resolvers/asset-resolver.js';
14
+ import type { CreateResolverOptions } from '../types/index.js';
15
+ /** Result of resolver selection including the reason for the choice */
16
+ export interface ResolverSelectionResult {
17
+ readonly resolver: AssetResolver;
18
+ readonly reason: string;
19
+ readonly mode: 'local' | 'remote';
20
+ }
21
+ /**
22
+ * Create the appropriate AssetResolver based on configuration.
23
+ *
24
+ * Selection follows a strict priority chain:
25
+ * 1. forceLocal option -> LocalResolver
26
+ * 2. NEOCORTEX_MODE=local -> LocalResolver
27
+ * 3. NEOCORTEX_MODE=remote -> RemoteResolver
28
+ * 4. core/ exists locally -> LocalResolver
29
+ * 5. License key + no core/ -> RemoteResolver
30
+ * 6. Default -> LocalResolver
31
+ *
32
+ * @param options - Optional configuration overrides
33
+ * @returns Configured AssetResolver ready for use
34
+ */
35
+ export declare function createResolver(options?: CreateResolverOptions): Promise<AssetResolver>;
36
+ /**
37
+ * Select resolver with full result including reason.
38
+ * Useful for logging/debugging why a specific resolver was chosen.
39
+ */
40
+ export declare function selectResolver(options?: CreateResolverOptions): Promise<ResolverSelectionResult>;
@@ -0,0 +1 @@
1
+ import{access as E,readFile as h,writeFile as R,mkdir as C}from"node:fs/promises";import{join as i,resolve as w}from"node:path";import{homedir as d}from"node:os";import{createHash as g}from"node:crypto";import{LocalResolver as l}from"../resolvers/local-resolver.js";import{RemoteResolver as u}from"../resolvers/remote-resolver.js";import{DEFAULT_SERVER_URL as O}from"../constants.js";const v=i(d(),".neocortex","feature-flags.json"),y=36e5;async function _(e){try{const r=process.env.NEOCORTEX_REMOTE_PERCENTAGE;if(r!==void 0){const n=parseInt(r,10);return isNaN(n)||n<=0?"skip":f(n)?"remote":"local"}const t=await F();if(t)return t.forceLocal?"local":t.forceRemote?"remote":t.remotePercentage<=0?"skip":f(t.remotePercentage)?"remote":"local";const c=s(e),o=await L(c);return o?(await p(o),o.forceLocal?"local":o.forceRemote?"remote":o.remotePercentage<=0?"skip":f(o.remotePercentage)?"remote":"local"):"skip"}catch{return"skip"}}function f(e){const r=process.env.NEOCORTEX_MACHINE_ID??"default";return g("sha256").update(r).digest().readUInt16BE(0)%100<e}async function F(){try{const e=await h(v,"utf-8"),r=JSON.parse(e);return Date.now()-r.fetchedAt<y?r:null}catch{return null}}async function p(e){try{await C(i(d(),".neocortex"),{recursive:!0}),await R(v,JSON.stringify(e),"utf-8")}catch{}}async function L(e){try{const r=new AbortController,t=setTimeout(()=>r.abort(),5e3),c=await fetch(`${e}/api/v1/config`,{signal:r.signal});if(clearTimeout(t),!c.ok)return null;const o=await c.json();return{remotePercentage:o.remotePercentage??0,forceRemote:o.forceRemote??!1,forceLocal:o.forceLocal??!1,fetchedAt:Date.now()}}catch{return null}}async function N(e){try{return await E(i(e,"core")),!0}catch{return!1}}function m(e){return e?.licenseKey||process.env.NEOCORTEX_LICENSE_KEY||void 0}function s(e){return e?.serverUrl||process.env.NEOCORTEX_SERVER_URL||O}async function M(e){return(await k(e)).resolver}async function k(e){const r=w(e?.projectRoot||process.cwd()),t=process.env.NEOCORTEX_MODE?.toLowerCase();if(e?.forceLocal)return{resolver:new l({projectRoot:r}),reason:"Forced local mode via --local flag",mode:"local"};if(t==="local")return{resolver:new l({projectRoot:r}),reason:"NEOCORTEX_MODE=local environment variable",mode:"local"};if(t==="remote"){const a=m(e);return a?{resolver:new u({serverUrl:s(e),licenseKey:a,cacheProvider:e?.cacheProvider,licenseClient:e?.licenseClient}),reason:"NEOCORTEX_MODE=remote environment variable",mode:"remote"}:{resolver:new l({projectRoot:r}),reason:"NEOCORTEX_MODE=remote but no license key found, falling back to local",mode:"local"}}if(await N(r))return{resolver:new l({projectRoot:r}),reason:"Auto-detected development mode (core/ directory exists)",mode:"local"};if(await _(e)==="remote"){const a=m(e);if(a)return{resolver:new u({serverUrl:s(e),licenseKey:a,cacheProvider:e?.cacheProvider,licenseClient:e?.licenseClient}),reason:"Feature flag cutover: machine in remote bucket",mode:"remote"}}const n=m(e);return n?{resolver:new u({serverUrl:s(e),licenseKey:n,cacheProvider:e?.cacheProvider,licenseClient:e?.licenseClient}),reason:"Auto-detected production mode (license key present, no core/ directory)",mode:"remote"}:{resolver:new l({projectRoot:r}),reason:"Default fallback to local mode",mode:"local"}}export{M as createResolver,k as selectResolver};
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * This file is part of Neocortex CLI, licensed under the
6
+ * Functional Source License, Version 1.1 (FSL-1.1).
7
+ *
8
+ * Change Date: February 20, 2029
9
+ * Change License: MIT
10
+ *
11
+ * See the LICENSE file in the project root for full license text.
12
+ */
13
+ /** Key type discriminator (Story 29.04) */
14
+ export type KeyType = 'license' | 'api_key';
15
+ /** Resolved config with decrypted license key */
16
+ export interface SecureConfig {
17
+ readonly serverUrl?: string;
18
+ readonly mode?: string;
19
+ readonly machineId?: string;
20
+ readonly activatedAt?: string;
21
+ readonly tier?: string;
22
+ readonly licenseKey?: string;
23
+ /** Key type: 'license' (NX-...) or 'api_key' (nxk_...). undefined = legacy (treat as license). Story 29.04 */
24
+ readonly keyType?: KeyType;
25
+ }
26
+ /**
27
+ * Encrypt a license key using the machine fingerprint as passphrase.
28
+ * Returns the encrypted envelope string.
29
+ */
30
+ export declare function encryptLicenseKey(licenseKey: string): string;
31
+ /**
32
+ * Decrypt a license key using the machine fingerprint as passphrase.
33
+ * Returns the plaintext key or null if decryption fails (hardware changed).
34
+ */
35
+ export declare function decryptLicenseKey(encryptedKey: string): string | null;
36
+ /**
37
+ * Set restrictive file permissions on config files.
38
+ * Unix: chmod 600 (owner read/write only).
39
+ * Windows: icacls to remove inheritance and grant Full Control only to current user.
40
+ * Story 61.4 - F4 remediation.
41
+ * Story 66.1 - Windows ACL via icacls.
42
+ */
43
+ export declare function setSecureFilePermissions(filePath: string): void;
44
+ /**
45
+ * Set restrictive directory permissions on config directories.
46
+ * Unix: chmod 700 (owner read/write/execute only).
47
+ * Windows: icacls with (OI)(CI) for propagation to child objects.
48
+ * Story 61.4 - F4 remediation.
49
+ * Story 66.1 - Windows ACL via icacls.
50
+ */
51
+ export declare function setSecureDirPermissions(dirPath: string): void;
52
+ /**
53
+ * Load config from ~/.neocortex/config.json with automatic migration.
54
+ *
55
+ * If the config contains a plaintext `licenseKey` (old format), it is:
56
+ * 1. Encrypted using machine fingerprint
57
+ * 2. Stored as `encryptedLicenseKey`
58
+ * 3. Old `licenseKey` field removed
59
+ * 4. Config rewritten to disk
60
+ *
61
+ * If decryption of `encryptedLicenseKey` fails (hardware change),
62
+ * returns config with licenseKey = undefined.
63
+ */
64
+ export declare function loadSecureConfig(): SecureConfig | null;
65
+ /**
66
+ * Save config after activation with encrypted license key.
67
+ * This is the primary write path called from activate.ts.
68
+ */
69
+ export declare function saveSecureConfig(config: {
70
+ serverUrl: string;
71
+ mode: string;
72
+ machineId: string;
73
+ activatedAt: string;
74
+ tier?: string;
75
+ licenseKey: string;
76
+ /** Key type: 'license' (NX-...) or 'api_key' (nxk_...). Auto-detected from key prefix if omitted. Story 29.04 */
77
+ keyType?: KeyType;
78
+ }): void;
@@ -0,0 +1,12 @@
1
+ import{existsSync as p,readFileSync as U,writeFileSync as R,mkdirSync as S,chmodSync as u}from"node:fs";import{execSync as y}from"node:child_process";import{join as a}from"node:path";import{homedir as L}from"node:os";import{encrypt as I,decrypt as g}from"../cache/crypto-utils.js";import{getMachineFingerprint as l}from"../machine/fingerprint.js";import{DEFAULT_SERVER_URL as x}from"../constants.js";const o=a(L(),".neocortex"),s=a(o,"config.json"),K=["api","neocortex","ornexus","com"].join("."),d=1;function f(r){const e=l();return I(r,e)}function C(r){try{const e=l();return g(r,e).plaintext}catch{return null}}function O(r){try{if(process.platform==="win32"){const e=process.env.USERNAME||process.env.USER||"";if(!e)return;y(`icacls "${r}" /inheritance:r /grant:r "${e}:(F)"`,{stdio:"pipe",timeout:5e3})}else u(r,384)}catch{}}function m(r){try{if(process.platform==="win32"){const e=process.env.USERNAME||process.env.USER||"";if(!e)return;y(`icacls "${r}" /inheritance:r /grant:r "${e}:(OI)(CI)(F)"`,{stdio:"pipe",timeout:5e3})}else u(r,448)}catch{}}let h=!1;function _(r){if(h)return;const e=r.serverUrl;if(!e)return;/^https?:\/\/(localhost|127\.0\.0\.1|0\.0\.0\.0)(:\d+)?/i.test(e)&&(h=!0,console.warn(`
2
+ [!] Warning: connected to local server (`+e+`).
3
+ To use production, run: neocortex activate YOUR-LICENSE-KEY
4
+ Get yours at https://neocortex.sh/portal/login
5
+ `))}function F(r){const e=r.match(/^(https?:\/\/)([^/]+)(.*)$/i);if(!e)return null;const[,c,t,n=""]=e;return t.toLowerCase()!==K?null:`${c}api.neocortex.sh${n}`}function Y(){try{if(!p(s))return null;const r=U(s,"utf-8"),e=JSON.parse(r.replace(/^\uFEFF/,""));if(e.licenseKey&&!e.encryptedLicenseKey){const n=f(e.licenseKey),i={...e},E=i.licenseKey;return delete i.licenseKey,i.encryptedLicenseKey=n,i.configVersion||(i.configVersion=d),v(i),{serverUrl:e.serverUrl,mode:e.mode,machineId:e.machineId,activatedAt:e.activatedAt,tier:e.tier,licenseKey:E,keyType:e.keyType}}let c;if(e.encryptedLicenseKey){const n=C(e.encryptedLicenseKey);n&&(c=n)}const t={serverUrl:e.serverUrl,mode:e.mode,machineId:e.machineId,activatedAt:e.activatedAt,tier:e.tier,licenseKey:c,keyType:e.keyType};if(e.machineId&&!c&&e.encryptedLicenseKey){const n=l();e.machineId!==n&&console.warn(`
6
+ [!] Machine fingerprint changed (was: ${e.machineId.slice(0,12)}..., now: ${n.slice(0,12)}...).
7
+ Your encrypted credentials are no longer valid.
8
+ Re-activate with: neocortex activate YOUR-LICENSE-KEY
9
+ `)}if(_(t),t.serverUrl&&!process.env.NEOCORTEX_SERVER_URL&&/^https?:\/\/(localhost|127\.0\.0\.1|0\.0\.0\.0)(:\d+)?/i.test(t.serverUrl)){const i=x;return console.warn(`[neocortex] Auto-repairing serverUrl: ${t.serverUrl} -> ${i}
10
+ [neocortex] To keep localhost, set NEOCORTEX_SERVER_URL=${t.serverUrl}
11
+ `),{...t,serverUrl:i}}if(t.serverUrl&&!process.env.NEOCORTEX_SERVER_URL){const n=F(t.serverUrl);if(n)return{...t,serverUrl:n}}return t}catch{return null}}function v(r){S(o,{recursive:!0}),m(o);const e=a(o,"cache");p(e)&&m(e),R(s,JSON.stringify(r,null,2)+`
12
+ `,"utf-8"),O(s)}function G(r){const e=f(r.licenseKey),c=r.keyType??(r.licenseKey.startsWith("nxk_")?"api_key":"license"),t={configVersion:d,serverUrl:r.serverUrl,mode:r.mode,machineId:r.machineId,activatedAt:r.activatedAt,tier:r.tier,encryptedLicenseKey:e,keyType:c};v(t)}export{C as decryptLicenseKey,f as encryptLicenseKey,Y as loadSecureConfig,G as saveSecureConfig,m as setSecureDirPermissions,O as setSecureFilePermissions};
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * This file is part of Neocortex CLI, licensed under the
6
+ * Functional Source License, Version 1.1 (FSL-1.1).
7
+ *
8
+ * Change Date: February 20, 2029
9
+ * Change License: MIT
10
+ *
11
+ * See the LICENSE file in the project root for full license text.
12
+ */
13
+ /**
14
+ * Production server URL.
15
+ *
16
+ * Single Source of Truth for the default Neocortex IP Protection Server URL.
17
+ * All client-side code MUST import this constant instead of hardcoding the URL.
18
+ *
19
+ * Shell scripts (install.sh, install.ps1) cannot import from TypeScript,
20
+ * so they maintain a hardcoded copy with a comment referencing this file.
21
+ *
22
+ * Epic 70 - Story 70.03
23
+ * Epic P46 - Story P46.01: migrated legacy API host to api.neocortex.sh
24
+ */
25
+ export declare const DEFAULT_SERVER_URL = "https://api.neocortex.sh";
@@ -0,0 +1 @@
1
+ const t="https://api.neocortex.sh";export{t as DEFAULT_SERVER_URL};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * This file is part of Neocortex CLI, licensed under the
6
+ * Functional Source License, Version 1.1 (FSL-1.1).
7
+ *
8
+ * Change Date: February 20, 2029
9
+ * Change License: MIT
10
+ *
11
+ * See the LICENSE file in the project root for full license text.
12
+ */
13
+ import type { PipelineContext } from '../types/index.js';
14
+ /** Options for context collection */
15
+ export interface CollectContextOptions {
16
+ readonly projectRoot: string;
17
+ readonly storyFilePath: string;
18
+ readonly storyId: string;
19
+ readonly stepId: string;
20
+ readonly platformTarget?: string;
21
+ }
22
+ /**
23
+ * Collect complete pipeline context.
24
+ *
25
+ * Reads state.json, package.json, and story file to build
26
+ * a sanitized PipelineContext for the remote server.
27
+ */
28
+ export declare function collectContext(options: CollectContextOptions): Promise<PipelineContext>;
@@ -0,0 +1,2 @@
1
+ import{readFile as i}from"node:fs/promises";import{join as p}from"node:path";import{sanitizeObject as l}from"./context-sanitizer.js";const f=/^---\n([\s\S]*?)\n---/;function m(s){const e=s.match(f);if(!e)return{};const t={};for(const n of e[1].split(`
2
+ `)){const c=n.indexOf(":");if(c===-1)continue;const a=n.slice(0,c).trim().replace(/^['"]|['"]$/g,""),r=n.slice(c+1).trim().replace(/^['"]|['"]$/g,"");t[a]=r}return t}function g(s){const e=[],t=/\*\*AC\d+:?\s*([^*]+)\*\*/g;let n;for(;(n=t.exec(s))!==null;)e.push(n[1].trim());return e}const S={react:"React",next:"Next.js",vue:"Vue",nuxt:"Nuxt",angular:"Angular",svelte:"Svelte",express:"Express",fastify:"Fastify",nest:"NestJS",koa:"Koa",hapi:"Hapi"};function w(s){const e=[];for(const[t,n]of Object.entries(S))t in s&&e.push(n);return e}function y(s){const e=new Set;return e.add("JavaScript"),("typescript"in s||Object.keys(s).some(t=>t.includes("ts-")))&&e.add("TypeScript"),[...e]}async function O(s){const{projectRoot:e,storyFilePath:t,storyId:n,stepId:c,platformTarget:a}=s,r=await h(e,n),u=await C(e),o=await I(t),d={storyId:n,stepId:c,epicId:o.epicId||r.epicId||"",storyTitle:o.title,currentStatus:r.status,stepsCompleted:r.stepsCompleted,branchName:r.branchName,platformTarget:a||x(),codebaseMetadata:u,storyMetadata:o};return l(d,e)}async function h(s,e){try{const t=p(s,".neocortex","state.json"),n=await i(t,"utf-8"),a=JSON.parse(n).stories?.[e];return{status:a?.status||"unknown",stepsCompleted:a?.steps_completed||[],branchName:a?.branch_name||"",epicId:a?.epic_id||""}}catch{return{status:"unknown",stepsCompleted:[],branchName:"",epicId:""}}}async function C(s){try{const e=p(s,"package.json"),t=await i(e,"utf-8"),n=JSON.parse(t),c={...n.dependencies||{},...n.devDependencies||{}};return{projectName:n.name||"unknown",languages:y(c),frameworks:w(c),dependencies:n.dependencies||{},nodeVersion:process.version}}catch{return{projectName:"unknown",languages:["JavaScript"],frameworks:[],dependencies:{},nodeVersion:process.version}}}async function I(s){try{const e=await i(s,"utf-8"),t=m(e),n=g(e);let c=[];const a=t.dependencies;if(a)try{c=JSON.parse(a.replace(/'/g,'"'))}catch{c=a.split(",").map(r=>r.trim().replace(/[[\]"']/g,""))}return{id:t.id||"",epicId:t.epic_id||"",title:t.title||"",status:t.status||t.currentStatus||"",dependencies:c,acceptanceCriteria:n}}catch{return{id:"",epicId:"",title:"",status:"",dependencies:[],acceptanceCriteria:[]}}}function x(){return process.env.CLAUDE_CODE||process.env.CLAUDE_AGENT?"claude-code":process.env.CURSOR_SESSION_ID?"cursor":process.env.VSCODE_PID?"vscode":process.env.GEMINI_CLI?"gemini":"unknown"}export{O as collectContext};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * This file is part of Neocortex CLI, licensed under the
6
+ * Functional Source License, Version 1.1 (FSL-1.1).
7
+ *
8
+ * Change Date: February 20, 2029
9
+ * Change License: MIT
10
+ *
11
+ * See the LICENSE file in the project root for full license text.
12
+ */
13
+ /**
14
+ * Sanitize a single string value.
15
+ *
16
+ * Applies path sanitization, token removal, and truncation.
17
+ */
18
+ export declare function sanitizeValue(value: string, projectRoot: string): string;
19
+ /**
20
+ * Sanitize a record of key-value pairs.
21
+ *
22
+ * Removes entries with sensitive keys and sanitizes remaining values.
23
+ */
24
+ export declare function sanitizeRecord(record: Record<string, string>, projectRoot: string): Record<string, string>;
25
+ /**
26
+ * Deep sanitize an object, processing all string values recursively.
27
+ */
28
+ export declare function sanitizeObject<T>(obj: T, projectRoot: string): T;
@@ -0,0 +1 @@
1
+ import{homedir as o}from"node:os";const f=[/token/i,/key/i,/secret/i,/password/i,/credential/i,/auth/i,/github_pat_/i,/npm_token/i,/api_key/i],l=[/github_pat_[A-Za-z0-9_]{36,}/g,/ghp_[A-Za-z0-9]{36,}/g,/gho_[A-Za-z0-9]{36,}/g,/sk-[A-Za-z0-9]{32,}/g,/Bearer\s+[A-Za-z0-9._\-]+/g,/-----BEGIN\s+(RSA\s+)?PRIVATE\s+KEY-----[\s\S]*?-----END/g],s=1e3;function p(e,n){let t=e;if(n){const i=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp(i,"g"),".")}const r=o();if(r){const i=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp(i,"g"),"~")}return t}function g(e){let n=e;for(const t of l)n=n.replace(t,"[REDACTED]");return n}function E(e){return e.length<=s?e:`${e.slice(0,s)}...[truncated, ${e.length} chars total]`}function a(e){return f.some(n=>n.test(e))}function c(e,n){let t=p(e,n);return t=g(t),t=E(t),t}function _(e,n){const t={};for(const[r,i]of Object.entries(e))a(r)||(t[r]=c(i,n));return t}function u(e,n){if(e==null)return e;if(typeof e=="string")return c(e,n);if(Array.isArray(e))return e.map(t=>u(t,n));if(typeof e=="object"){const t={};for(const[r,i]of Object.entries(e))a(r)&&typeof i=="string"?t[r]="[REDACTED]":t[r]=u(i,n);return t}return e}export{u as sanitizeObject,_ as sanitizeRecord,c as sanitizeValue};
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @license FSL-1.1
3
+ * Copyright (c) 2026 OrNexus AI
4
+ *
5
+ * P199.03 -- public-safe autonomous execution governance envelope.
6
+ */
7
+ import type { ContinuitySqliteStore } from './sqlite-store.js';
8
+ export declare const AUTONOMOUS_GOVERNANCE_VERSION: 1;
9
+ export declare const AUTONOMOUS_GOVERNANCE_EVENT_TYPE: "autonomous_governance_audit";
10
+ export declare const AUTONOMOUS_GOVERNANCE_EVIDENCE_TAG: "[P199-EV-GOVERNANCE]";
11
+ export declare const AUTONOMOUS_GOVERNANCE_REASON_CODES: Readonly<{
12
+ readonly OK: "continuity-ok";
13
+ readonly BYPASS_BLOCKED: "headless-directive-rejected";
14
+ }>;
15
+ export type AutonomousGovernanceKind = 'yolo' | 'yoloop' | 'run_yolo' | 'run_yoloop';
16
+ export type AutonomousGovernanceSource = 'direct-yolo' | 'direct-yoloop' | 'headless-run-yolo' | 'headless-run-yoloop' | 'delegated-subagent';
17
+ export type AutonomousGovernanceTargetKind = 'story' | 'epic' | 'epic_directory';
18
+ export interface AutonomousGovernanceIntent {
19
+ readonly autonomousKind: AutonomousGovernanceKind;
20
+ readonly source: AutonomousGovernanceSource;
21
+ readonly targetKind: AutonomousGovernanceTargetKind;
22
+ readonly targetRef: string;
23
+ readonly storyId?: string;
24
+ readonly epicId?: string;
25
+ readonly commandHash?: string;
26
+ }
27
+ export interface AutonomousGovernanceEnvelope extends AutonomousGovernanceIntent {
28
+ readonly schemaVersion: 1;
29
+ readonly contractVersion: 'continuity-v1';
30
+ readonly governanceVersion: typeof AUTONOMOUS_GOVERNANCE_VERSION;
31
+ readonly envelopeId: string;
32
+ readonly jobId: string;
33
+ readonly executionId: string;
34
+ readonly auditId: string;
35
+ readonly receiptId: string;
36
+ readonly status: 'accepted' | 'rejected';
37
+ readonly reasonCode: string;
38
+ readonly publicSummary: string;
39
+ readonly counts: Readonly<Record<string, number>>;
40
+ readonly hashes: Readonly<Record<string, string>>;
41
+ readonly relativePaths: readonly string[];
42
+ readonly publicSafe: true;
43
+ }
44
+ export type AutonomousGovernanceValidationResult = {
45
+ readonly ok: true;
46
+ readonly envelope: AutonomousGovernanceEnvelope;
47
+ } | {
48
+ readonly ok: false;
49
+ readonly reasonCode: string;
50
+ readonly publicSummary: string;
51
+ readonly redactionSummary: readonly PublicRedactionEvidence[];
52
+ };
53
+ export interface PublicRedactionEvidence {
54
+ readonly field: string;
55
+ readonly reason: string;
56
+ readonly evidence: string;
57
+ readonly publicSafe: true;
58
+ }
59
+ export interface AutonomousGovernanceRecordResult {
60
+ readonly ok: boolean;
61
+ readonly envelope: AutonomousGovernanceEnvelope;
62
+ readonly reasonCode: string;
63
+ readonly publicSummary: string;
64
+ readonly publicSafe: true;
65
+ }
66
+ export declare function parseAutonomousInvokeIntent(args: string): AutonomousGovernanceIntent | null;
67
+ export declare function isAutonomousInvoke(args: string): boolean;
68
+ export declare function buildAutonomousGovernanceEnvelope(input: AutonomousGovernanceIntent & {
69
+ readonly jobId?: string;
70
+ readonly operationSeed?: string;
71
+ readonly status?: 'accepted' | 'rejected';
72
+ readonly reasonCode?: string;
73
+ }): AutonomousGovernanceEnvelope;
74
+ export declare function validateAutonomousGovernanceEnvelope(input: unknown, expected?: {
75
+ readonly autonomousKind?: AutonomousGovernanceKind;
76
+ readonly jobId?: string;
77
+ readonly targetKind?: AutonomousGovernanceTargetKind;
78
+ readonly targetRef?: string;
79
+ }): AutonomousGovernanceValidationResult;
80
+ export declare function readAutonomousGovernanceEnvelopeFromMetadata(metadataJson: string | null | undefined, expected?: Parameters<typeof validateAutonomousGovernanceEnvelope>[1]): AutonomousGovernanceValidationResult;
81
+ export declare function recordAutonomousGovernance(store: ContinuitySqliteStore, envelope: AutonomousGovernanceEnvelope, nowIso: string, options?: {
82
+ readonly requireExistingJob?: boolean;
83
+ }): AutonomousGovernanceRecordResult;
84
+ export declare function autonomousGovernanceMetadata(envelope: AutonomousGovernanceEnvelope, base?: Readonly<Record<string, unknown>>): Record<string, unknown>;