@ornexus/neocortex 4.60.16 → 4.63.4

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 (69) hide show
  1. package/dist/sbom.cdx.json +29 -29
  2. package/docs/install/installer-diagnostics.md +33 -0
  3. package/install.ps1 +49 -229
  4. package/install.sh +30 -92
  5. package/package.json +5 -2
  6. package/packages/client/dist/adapters/platform-detector.d.ts +7 -6
  7. package/packages/client/dist/adapters/platform-detector.js +1 -1
  8. package/packages/client/dist/agent/refresh-stubs.js +1 -1
  9. package/packages/client/dist/cache/encrypted-cache.d.ts +10 -4
  10. package/packages/client/dist/cache/encrypted-cache.js +1 -1
  11. package/packages/client/dist/cache/in-memory-asset-cache.d.ts +5 -4
  12. package/packages/client/dist/cache/in-memory-asset-cache.js +1 -1
  13. package/packages/client/dist/cache/protected-pi-boundary.d.ts +6 -2
  14. package/packages/client/dist/cache/protected-pi-boundary.js +1 -1
  15. package/packages/client/dist/checkpoint/checkpoint-client-reader.d.ts +31 -30
  16. package/packages/client/dist/checkpoint/checkpoint-client-reader.js +2 -2
  17. package/packages/client/dist/checkpoint/shared-checkpoint-types.d.ts +2 -0
  18. package/packages/client/dist/cli.js +3 -3
  19. package/packages/client/dist/commands/invoke.d.ts +77 -1
  20. package/packages/client/dist/commands/invoke.js +44 -59
  21. package/packages/client/dist/config/resolver-selection.d.ts +12 -31
  22. package/packages/client/dist/config/resolver-selection.js +1 -1
  23. package/packages/client/dist/errors/error-messages.js +1 -1
  24. package/packages/client/dist/evidence/collector.d.ts +18 -0
  25. package/packages/client/dist/evidence/collector.js +1 -0
  26. package/packages/client/dist/evidence/index.d.ts +3 -0
  27. package/packages/client/dist/evidence/index.js +1 -0
  28. package/packages/client/dist/evidence/types.d.ts +59 -0
  29. package/packages/client/dist/evidence/types.js +0 -0
  30. package/packages/client/dist/graph-retrieval/pre-command-hook.d.ts +21 -0
  31. package/packages/client/dist/graph-retrieval/pre-command-hook.js +1 -1
  32. package/packages/client/dist/index.d.ts +10 -11
  33. package/packages/client/dist/index.js +1 -1
  34. package/packages/client/dist/license/license-client.d.ts +17 -0
  35. package/packages/client/dist/license/license-client.js +1 -1
  36. package/packages/client/dist/memory/project-memory-writer.js +13 -13
  37. package/packages/client/dist/memory/shared-project-memory-types.d.ts +1 -1
  38. package/packages/client/dist/memory/shared-project-memory-types.js +2 -2
  39. package/packages/client/dist/resolvers/asset-resolver.d.ts +8 -71
  40. package/packages/client/dist/resolvers/remote-resolver.d.ts +7 -69
  41. package/packages/client/dist/resolvers/remote-resolver.js +1 -1
  42. package/packages/client/dist/runner-cli.js +0 -0
  43. package/packages/client/dist/state/project-state-snapshot.js +1 -1
  44. package/packages/client/dist/telemetry/index.d.ts +1 -1
  45. package/packages/client/dist/telemetry/index.js +1 -1
  46. package/packages/client/dist/telemetry/offline-queue.d.ts +12 -2
  47. package/packages/client/dist/telemetry/offline-queue.js +1 -1
  48. package/packages/client/dist/types/index.d.ts +26 -8
  49. package/packages/client/dist/types/index.js +1 -1
  50. package/packages/client/dist/types/shared-public-execution-contract.d.ts +175 -0
  51. package/packages/client/dist/types/shared-public-execution-contract.js +2 -0
  52. package/targets-stubs/antigravity/gemini.md +1 -1
  53. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  54. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  55. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  56. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  57. package/targets-stubs/claude-code/neocortex.md +2 -2
  58. package/targets-stubs/codex/AGENTS.md +16 -6
  59. package/targets-stubs/codex/README.md +24 -0
  60. package/targets-stubs/codex/install-codex.sh +70 -1
  61. package/targets-stubs/codex/neocortex-local.config.toml +17 -0
  62. package/targets-stubs/codex/neocortex.toml +10 -1
  63. package/targets-stubs/cursor/agent.md +2 -2
  64. package/targets-stubs/gemini-cli/agent.md +2 -2
  65. package/targets-stubs/opencode/neocortex-root.md +4 -4
  66. package/targets-stubs/opencode/neocortex.md +1 -1
  67. package/targets-stubs/vscode/neocortex.agent.md +2 -2
  68. package/packages/client/dist/resolvers/local-resolver.d.ts +0 -26
  69. package/packages/client/dist/resolvers/local-resolver.js +0 -8
@@ -18,10 +18,14 @@ export interface TelemetryEvent {
18
18
  export interface QueueConfig {
19
19
  /** Path to queue file. Default: ~/.neocortex/.telemetry-queue */
20
20
  queueFilePath: string;
21
- /** Maximum number of events in queue. Default: 1000 */
21
+ /** Maximum number of events in queue. Default/cap: 500 */
22
22
  maxEvents: number;
23
- /** Maximum queue file size in bytes. Default: 5_242_880 (5MB) */
23
+ /** Maximum queue file size in bytes. Default/cap: 1_048_576 (1 MiB) */
24
24
  maxSizeBytes: number;
25
+ /** Maximum age for queued events. Capped at seven days. */
26
+ retentionMs: number;
27
+ /** Maximum serialized size for one event. */
28
+ maxEventSizeBytes: number;
25
29
  }
26
30
  export interface QueueStats {
27
31
  count: number;
@@ -31,6 +35,12 @@ export interface FlushResult {
31
35
  sent: number;
32
36
  failed: number;
33
37
  }
38
+ /** Project a candidate to the only offline telemetry schema accepted on disk. */
39
+ export declare function validateTelemetryEvent(candidate: unknown, options?: {
40
+ readonly now?: number;
41
+ readonly retentionMs?: number;
42
+ readonly maxEventSizeBytes?: number;
43
+ }): TelemetryEvent | null;
34
44
  export declare class OfflineTelemetryQueue {
35
45
  private readonly config;
36
46
  constructor(config?: Partial<QueueConfig>);
@@ -1 +1 @@
1
- import{readFile as a,writeFile as n,mkdir as r}from"node:fs/promises";import{dirname as u}from"node:path";import{join as c}from"node:path";import{homedir as o}from"node:os";const h={queueFilePath:c(o(),".neocortex",".telemetry-queue"),maxEvents:1e3,maxSizeBytes:5242880};class d{config;constructor(t){this.config={...h,...t}}async enqueue(t){try{const e=await this.loadQueue();for(e.push(t);e.length>this.config.maxEvents;)e.shift();let i=JSON.stringify(e);for(;Buffer.byteLength(i,"utf8")>this.config.maxSizeBytes&&e.length>0;)e.shift(),i=JSON.stringify(e);await this.saveQueue(e)}catch{}}async flush(t){try{const e=await this.loadQueue();return e.length===0?{sent:0,failed:0}:await t(e)?(await this.saveQueue([]),{sent:e.length,failed:0}):{sent:0,failed:e.length}}catch{return{sent:0,failed:0}}}async getStats(){try{const t=await this.loadQueue(),e=JSON.stringify(t);return{count:t.length,sizeBytes:Buffer.byteLength(e,"utf8")}}catch{return{count:0,sizeBytes:0}}}async clear(){try{await this.saveQueue([])}catch{}}async loadQueue(){try{const t=await a(this.config.queueFilePath,"utf8"),e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}async saveQueue(t){const e=u(this.config.queueFilePath);await r(e,{recursive:!0});const i=`${this.config.queueFilePath}.tmp`;await n(i,JSON.stringify(t),"utf8");const{rename:s}=await import("node:fs/promises");await s(i,this.config.queueFilePath)}}export{d as OfflineTelemetryQueue};
1
+ import{chmod as a,readFile as g,writeFile as S,mkdir as p,rename as w,rm as x,stat as E}from"node:fs/promises";import{dirname as z}from"node:path";import{join as B}from"node:path";import{homedir as v}from"node:os";import{hasProtectedCachePayloadMarker as F}from"../cache/protected-pi-boundary.js";import{setSecureDirPermissions as M,setSecureFilePermissions as h}from"../config/secure-config.js";const r={queueFilePath:B(v(),".neocortex",".telemetry-queue"),maxEvents:500,maxSizeBytes:1048576,retentionMs:10080*60*1e3,maxEventSizeBytes:4096},o=10080*60*1e3,N=300*1e3,P=new Set(["cache.hit","cache.miss","cli.command","command.completed","command.failed","network.retry","recovery.detected","telemetry.health"]),b=new Set(["cacheStatus","commandClass","commandId","count","durationMs","failed","index","offline","outcome","reasonCode","retryCount","sent","sizeBytes","success"]);function _(i){if(i===null||typeof i=="boolean")return i;if(typeof i=="number")return Number.isFinite(i)?i:void 0;if(!(typeof i!="string"||i.length===0||i.length>128))return/^[a-z0-9*][a-z0-9*._:/-]{0,127}$/i.test(i)?i:void 0}function y(i,n={}){try{if(!i||typeof i!="object"||Array.isArray(i))return null;const e=i;if(typeof e.type!="string"||!P.has(e.type)||typeof e.timestamp!="number"||!Number.isFinite(e.timestamp))return null;const t=n.now??Date.now(),s=Math.min(n.retentionMs??o,o);if(e.timestamp<t-s||e.timestamp>t+N||!e.data||typeof e.data!="object"||Array.isArray(e.data))return null;const u={};for(const[f,d]of Object.entries(e.data)){if(!b.has(f))return null;const l=_(d);if(l===void 0)return null;u[f]=l}const c={type:e.type,timestamp:e.timestamp,data:u},m=JSON.stringify(c);return F(m)||Buffer.byteLength(m,"utf8")>(n.maxEventSizeBytes??r.maxEventSizeBytes)?null:c}catch{return null}}class D{config;constructor(n){const e={...r,...n};this.config={queueFilePath:e.queueFilePath,maxEvents:Number.isInteger(e.maxEvents)&&e.maxEvents>0?Math.min(e.maxEvents,r.maxEvents):r.maxEvents,maxSizeBytes:Number.isInteger(e.maxSizeBytes)&&e.maxSizeBytes>0?Math.min(e.maxSizeBytes,r.maxSizeBytes):r.maxSizeBytes,retentionMs:Number.isFinite(e.retentionMs)&&e.retentionMs>0?Math.min(e.retentionMs,o):r.retentionMs,maxEventSizeBytes:Number.isInteger(e.maxEventSizeBytes)&&e.maxEventSizeBytes>0?Math.min(e.maxEventSizeBytes,r.maxEventSizeBytes):r.maxEventSizeBytes}}async enqueue(n){try{const e=y(n,this.config);if(!e)return;const t=await this.loadQueue();for(t.push(e);t.length>this.config.maxEvents;)t.shift();let s=JSON.stringify(t);for(;Buffer.byteLength(s,"utf8")>this.config.maxSizeBytes&&t.length>0;)t.shift(),s=JSON.stringify(t);await this.saveQueue(t)}catch{}}async flush(n){try{const e=await this.loadQueue();return e.length===0?{sent:0,failed:0}:await n(e)?(await this.saveQueue([]),{sent:e.length,failed:0}):{sent:0,failed:e.length}}catch{return{sent:0,failed:0}}}async getStats(){try{const n=await this.loadQueue(),e=JSON.stringify(n);return{count:n.length,sizeBytes:Buffer.byteLength(e,"utf8")}}catch{return{count:0,sizeBytes:0}}}async clear(){try{await this.saveQueue([])}catch{}}async loadQueue(){try{if((await E(this.config.queueFilePath)).size>this.config.maxSizeBytes)return[];const e=await g(this.config.queueFilePath,"utf8"),t=JSON.parse(e);return Array.isArray(t)?t.map(s=>y(s,this.config)).filter(s=>s!==null).slice(-this.config.maxEvents):[]}catch{return[]}}async saveQueue(n){const e=z(this.config.queueFilePath);await p(e,{recursive:!0,mode:448}),process.platform==="win32"?M(e):await a(e,448);const t=`${this.config.queueFilePath}.tmp`;try{await S(t,JSON.stringify(n),{encoding:"utf8",mode:384,flag:"w"}),process.platform==="win32"?h(t):await a(t,384),await w(t,this.config.queueFilePath),process.platform==="win32"?h(this.config.queueFilePath):await a(this.config.queueFilePath,384)}catch(s){throw await x(t,{force:!0}).catch(()=>{}),s}}}export{D as OfflineTelemetryQueue,y as validateTelemetryEvent};
@@ -95,6 +95,22 @@ export interface StepRegistry {
95
95
  };
96
96
  readonly [key: string]: unknown;
97
97
  }
98
+ /** Metadata-only capability row returned by the production registry. */
99
+ export interface PublicCapabilityRegistryEntry {
100
+ readonly token: string;
101
+ readonly availability: 'supported';
102
+ readonly tier: 'free' | 'pro' | 'enterprise';
103
+ }
104
+ /** Exact public registry shape; no asset names, paths or content fields. */
105
+ export interface PublicCapabilityRegistry {
106
+ readonly schema_version: 1;
107
+ readonly capabilities: readonly PublicCapabilityRegistryEntry[];
108
+ readonly version: string;
109
+ readonly cache_control: {
110
+ readonly ttl_seconds: number;
111
+ readonly etag: string;
112
+ };
113
+ }
98
114
  /** Assembled prompt ready for execution */
99
115
  export interface AssembledPrompt {
100
116
  readonly prompt: string;
@@ -102,11 +118,15 @@ export interface AssembledPrompt {
102
118
  readonly includedSkills: readonly string[];
103
119
  readonly includedStandards: readonly string[];
104
120
  }
105
- /** Interface for encrypted cache (implemented in Story 42.3) */
121
+ /** Cooperative cache I/O; providers must avoid committing after signal abort. */
122
+ export interface CacheOperationOptions {
123
+ readonly signal?: AbortSignal;
124
+ }
106
125
  export interface CacheProvider {
107
- get(key: string): Promise<string | null>;
108
- set(key: string, value: string, ttlMs?: number): Promise<void>;
109
- clear(): Promise<void>;
126
+ get(key: string, options?: CacheOperationOptions): Promise<string | null>;
127
+ set(key: string, value: string, ttlMs?: number, options?: CacheOperationOptions): Promise<void>;
128
+ compareAndSet?(key: string, expectedValue: string | null, value: string, ttlMs?: number, options?: CacheOperationOptions): Promise<boolean>;
129
+ clear(options?: CacheOperationOptions): Promise<void>;
110
130
  }
111
131
  /** No-op cache implementation for development/fallback */
112
132
  export declare class NoOpCache implements CacheProvider {
@@ -114,10 +134,6 @@ export declare class NoOpCache implements CacheProvider {
114
134
  set(): Promise<void>;
115
135
  clear(): Promise<void>;
116
136
  }
117
- /** Options for LocalResolver */
118
- export interface LocalResolverOptions {
119
- readonly projectRoot: string;
120
- }
121
137
  /** Options for RemoteResolver */
122
138
  export interface RemoteResolverOptions {
123
139
  readonly serverUrl: string;
@@ -138,3 +154,5 @@ export interface CreateResolverOptions {
138
154
  readonly cacheProvider?: CacheProvider;
139
155
  readonly licenseClient?: import('../license/license-client.js').LicenseClient;
140
156
  }
157
+ export { PUBLIC_ARTIFACT_KINDS, PUBLIC_EXECUTION_ALLOWED_TOP_LEVEL_FIELDS, PUBLIC_EXECUTION_AUTHORITIES, PUBLIC_EXECUTION_CONTRACT_VERSION, PUBLIC_EXECUTION_DIRECTIVE_KINDS, PUBLIC_EXECUTION_LIMITS, PUBLIC_EXECUTION_MIN_SECURE_CLIENT_VERSION, PUBLIC_EXECUTION_NEGOTIATION_REASON_CODES, PUBLIC_EXECUTION_SCHEMA_HEADER, PUBLIC_EXECUTION_SCHEMA_VERSION, PUBLIC_EXECUTION_STATUSES, PUBLIC_EXECUTION_UNKNOWN_FIELD_POLICY, PUBLIC_EXECUTION_VALIDATION_REASON_CODES, PUBLIC_ROOT_EXECUTION_OPERATIONS, PUBLIC_SERVER_EXECUTION_OPERATIONS, PUBLIC_VALIDATION_STATUSES, PublicExecutionContractError, isPublicExecutionRepositoryPath, negotiatePublicExecutionSchema, serializePublicExecutionResponse, validatePublicExecutionResponse, } from './shared-public-execution-contract.js';
158
+ export type { PublicArtifactKind, PublicDirectiveAuthority, PublicExecutionArtifact, PublicExecutionAuthority, PublicExecutionBlocker, PublicExecutionDebt, PublicExecutionDirective, PublicExecutionNegotiationOptions, PublicExecutionNegotiationReasonCode, PublicExecutionNegotiationResult, PublicExecutionRefs, PublicExecutionResponse, PublicExecutionStatus, PublicExecutionUpgradeResponse, PublicExecutionValidation, PublicExecutionValidationIssue, PublicExecutionValidationReasonCode, PublicExecutionValidationResult, PublicNativeTaskDirective, PublicRootExecutionDirective, PublicRootExecutionOperation, PublicServerExecutionDirective, PublicServerExecutionOperation, PublicValidationStatus, } from './shared-public-execution-contract.js';
@@ -1 +1 @@
1
- var a;(function(e){e.LOCAL="local",e.REMOTE="remote"})(a||(a={}));class c{async get(){return null}async set(){}async clear(){}}export{c as NoOpCache,a as ResolverMode};
1
+ var I;(function(E){E.LOCAL="local",E.REMOTE="remote"})(I||(I={}));class _{async get(){return null}async set(){}async clear(){}}import{PUBLIC_ARTIFACT_KINDS as T,PUBLIC_EXECUTION_ALLOWED_TOP_LEVEL_FIELDS as U,PUBLIC_EXECUTION_AUTHORITIES as N,PUBLIC_EXECUTION_CONTRACT_VERSION as L,PUBLIC_EXECUTION_DIRECTIVE_KINDS as e,PUBLIC_EXECUTION_LIMITS as P,PUBLIC_EXECUTION_MIN_SECURE_CLIENT_VERSION as S,PUBLIC_EXECUTION_NEGOTIATION_REASON_CODES as c,PUBLIC_EXECUTION_SCHEMA_HEADER as o,PUBLIC_EXECUTION_SCHEMA_VERSION as t,PUBLIC_EXECUTION_STATUSES as A,PUBLIC_EXECUTION_UNKNOWN_FIELD_POLICY as R,PUBLIC_EXECUTION_VALIDATION_REASON_CODES as i,PUBLIC_ROOT_EXECUTION_OPERATIONS as n,PUBLIC_SERVER_EXECUTION_OPERATIONS as B,PUBLIC_VALIDATION_STATUSES as a,PublicExecutionContractError as r,isPublicExecutionRepositoryPath as X,negotiatePublicExecutionSchema as l,serializePublicExecutionResponse as s,validatePublicExecutionResponse as u}from"./shared-public-execution-contract.js";export{_ as NoOpCache,T as PUBLIC_ARTIFACT_KINDS,U as PUBLIC_EXECUTION_ALLOWED_TOP_LEVEL_FIELDS,N as PUBLIC_EXECUTION_AUTHORITIES,L as PUBLIC_EXECUTION_CONTRACT_VERSION,e as PUBLIC_EXECUTION_DIRECTIVE_KINDS,P as PUBLIC_EXECUTION_LIMITS,S as PUBLIC_EXECUTION_MIN_SECURE_CLIENT_VERSION,c as PUBLIC_EXECUTION_NEGOTIATION_REASON_CODES,o as PUBLIC_EXECUTION_SCHEMA_HEADER,t as PUBLIC_EXECUTION_SCHEMA_VERSION,A as PUBLIC_EXECUTION_STATUSES,R as PUBLIC_EXECUTION_UNKNOWN_FIELD_POLICY,i as PUBLIC_EXECUTION_VALIDATION_REASON_CODES,n as PUBLIC_ROOT_EXECUTION_OPERATIONS,B as PUBLIC_SERVER_EXECUTION_OPERATIONS,a as PUBLIC_VALIDATION_STATUSES,r as PublicExecutionContractError,I as ResolverMode,X as isPublicExecutionRepositoryPath,l as negotiatePublicExecutionSchema,s as serializePublicExecutionResponse,u as validatePublicExecutionResponse};
@@ -0,0 +1,175 @@
1
+ /**
2
+ * P201.02 public execution response contract.
3
+ *
4
+ * This module is deliberately dependency-free so the Docker-compatible server
5
+ * mirror can remain byte-for-byte equivalent without importing workspace code.
6
+ */
7
+ export declare const PUBLIC_EXECUTION_SCHEMA_VERSION: 1;
8
+ export declare const PUBLIC_EXECUTION_CONTRACT_VERSION: "p201-public-execution-v1";
9
+ export declare const PUBLIC_EXECUTION_MIN_SECURE_CLIENT_VERSION: "4.60.15";
10
+ export declare const PUBLIC_EXECUTION_SCHEMA_HEADER: "x-public-execution-schema-version";
11
+ export declare const PUBLIC_EXECUTION_UNKNOWN_FIELD_POLICY: "reject";
12
+ export declare const PUBLIC_EXECUTION_STATUSES: readonly ["queued", "running", "waiting", "blocked", "completed", "failed", "cancelled"];
13
+ export type PublicExecutionStatus = (typeof PUBLIC_EXECUTION_STATUSES)[number];
14
+ export declare const PUBLIC_EXECUTION_AUTHORITIES: readonly ["server-owned", "root-local", "native-task", "mixed"];
15
+ export type PublicExecutionAuthority = (typeof PUBLIC_EXECUTION_AUTHORITIES)[number];
16
+ export type PublicDirectiveAuthority = Exclude<PublicExecutionAuthority, 'mixed'>;
17
+ export declare const PUBLIC_EXECUTION_DIRECTIVE_KINDS: readonly ["server-execution", "root-execution", "native-task"];
18
+ export declare const PUBLIC_SERVER_EXECUTION_OPERATIONS: readonly ["observe", "continue", "cancel"];
19
+ export declare const PUBLIC_ROOT_EXECUTION_OPERATIONS: readonly ["inspect", "modify", "validate", "state-update", "git"];
20
+ export declare const PUBLIC_ARTIFACT_KINDS: readonly ["story", "spec", "tasks", "evidence", "report", "diff", "validation"];
21
+ export declare const PUBLIC_VALIDATION_STATUSES: readonly ["selected", "passed", "failed", "skipped"];
22
+ export type PublicServerExecutionOperation = (typeof PUBLIC_SERVER_EXECUTION_OPERATIONS)[number];
23
+ export type PublicRootExecutionOperation = (typeof PUBLIC_ROOT_EXECUTION_OPERATIONS)[number];
24
+ export type PublicArtifactKind = (typeof PUBLIC_ARTIFACT_KINDS)[number];
25
+ export type PublicValidationStatus = (typeof PUBLIC_VALIDATION_STATUSES)[number];
26
+ export declare const PUBLIC_EXECUTION_LIMITS: Readonly<{
27
+ envelopeBytes: 65536;
28
+ identifierBytes: 128;
29
+ reasonCodeBytes: 96;
30
+ summaryBytes: 2048;
31
+ repositoryPathBytes: 256;
32
+ maxDirectives: 64;
33
+ maxArtifacts: 64;
34
+ maxRows: 100;
35
+ maxRefs: 64;
36
+ maxValidationIssues: 32;
37
+ }>;
38
+ export declare const PUBLIC_EXECUTION_VALIDATION_REASON_CODES: Readonly<{
39
+ readonly invalidEnvelope: "public-execution-invalid-envelope";
40
+ readonly unknownField: "public-execution-unknown-field";
41
+ readonly protectedField: "public-execution-protected-field";
42
+ readonly unknownDirective: "public-execution-directive-unknown";
43
+ readonly authorityMismatch: "public-execution-authority-mismatch";
44
+ readonly invalidIdentifier: "public-execution-identifier-invalid";
45
+ readonly invalidReasonCode: "public-execution-reason-code-invalid";
46
+ readonly invalidSummary: "public-execution-summary-invalid";
47
+ readonly invalidRepositoryPath: "public-execution-path-invalid";
48
+ readonly outputUnbounded: "public-execution-output-unbounded";
49
+ readonly duplicateReference: "public-execution-reference-duplicate";
50
+ }>;
51
+ export declare const PUBLIC_EXECUTION_NEGOTIATION_REASON_CODES: Readonly<{
52
+ readonly schemaRequired: "public-execution-schema-required";
53
+ readonly schemaUnsupported: "public-execution-schema-unsupported";
54
+ readonly clientUpgradeRequired: "public-execution-client-upgrade-required";
55
+ }>;
56
+ export type PublicExecutionValidationReasonCode = (typeof PUBLIC_EXECUTION_VALIDATION_REASON_CODES)[keyof typeof PUBLIC_EXECUTION_VALIDATION_REASON_CODES];
57
+ export type PublicExecutionNegotiationReasonCode = (typeof PUBLIC_EXECUTION_NEGOTIATION_REASON_CODES)[keyof typeof PUBLIC_EXECUTION_NEGOTIATION_REASON_CODES];
58
+ export interface PublicServerExecutionDirective {
59
+ readonly kind: 'server-execution';
60
+ readonly authority: 'server-owned';
61
+ readonly directiveId: string;
62
+ readonly contractId: string;
63
+ readonly operation: PublicServerExecutionOperation;
64
+ readonly summary: string;
65
+ }
66
+ export interface PublicRootExecutionDirective {
67
+ readonly kind: 'root-execution';
68
+ readonly authority: 'root-local';
69
+ readonly directiveId: string;
70
+ readonly taskId: string;
71
+ readonly operation: PublicRootExecutionOperation;
72
+ readonly summary: string;
73
+ readonly contractIds: readonly string[];
74
+ readonly projectPaths: readonly string[];
75
+ }
76
+ export interface PublicNativeTaskDirective {
77
+ readonly kind: 'native-task';
78
+ readonly authority: 'native-task';
79
+ readonly directiveId: string;
80
+ readonly taskId: string;
81
+ readonly subagentType: 'neocortex';
82
+ readonly command: 'yolo';
83
+ readonly storyPath: string;
84
+ readonly acceptanceRefs: readonly string[];
85
+ }
86
+ export type PublicExecutionDirective = PublicServerExecutionDirective | PublicRootExecutionDirective | PublicNativeTaskDirective;
87
+ export interface PublicExecutionRefs {
88
+ readonly contractIds: readonly string[];
89
+ readonly projectPaths: readonly string[];
90
+ }
91
+ export interface PublicExecutionArtifact {
92
+ readonly artifactId: string;
93
+ readonly kind: PublicArtifactKind;
94
+ readonly path: string;
95
+ readonly contractIds: readonly string[];
96
+ readonly syntheticSummary?: string;
97
+ }
98
+ export interface PublicExecutionBlocker {
99
+ readonly blockerId: string;
100
+ readonly reasonCode: string;
101
+ readonly summary: string;
102
+ readonly contractIds: readonly string[];
103
+ readonly projectPaths: readonly string[];
104
+ }
105
+ export interface PublicExecutionDebt {
106
+ readonly debtId: string;
107
+ readonly reasonCode: string;
108
+ readonly summary: string;
109
+ readonly contractIds: readonly string[];
110
+ readonly projectPaths: readonly string[];
111
+ }
112
+ export interface PublicExecutionValidation {
113
+ readonly checkId: string;
114
+ readonly status: PublicValidationStatus;
115
+ readonly acceptanceRefs: readonly string[];
116
+ readonly contractIds: readonly string[];
117
+ readonly artifactIds: readonly string[];
118
+ readonly reasonCode?: string;
119
+ readonly summary?: string;
120
+ }
121
+ export interface PublicExecutionResponse {
122
+ readonly schemaVersion: typeof PUBLIC_EXECUTION_SCHEMA_VERSION;
123
+ readonly contractVersion: typeof PUBLIC_EXECUTION_CONTRACT_VERSION;
124
+ readonly minSecureClientVersion: typeof PUBLIC_EXECUTION_MIN_SECURE_CLIENT_VERSION;
125
+ readonly executionId: string;
126
+ readonly status: PublicExecutionStatus;
127
+ readonly authority: PublicExecutionAuthority;
128
+ readonly directives: readonly PublicExecutionDirective[];
129
+ readonly refs: PublicExecutionRefs;
130
+ readonly artifacts: readonly PublicExecutionArtifact[];
131
+ readonly blockers: readonly PublicExecutionBlocker[];
132
+ readonly debt: readonly PublicExecutionDebt[];
133
+ readonly validation: readonly PublicExecutionValidation[];
134
+ }
135
+ export interface PublicExecutionValidationIssue {
136
+ readonly path: string;
137
+ readonly reasonCode: PublicExecutionValidationReasonCode;
138
+ }
139
+ export type PublicExecutionValidationResult = {
140
+ readonly ok: true;
141
+ readonly value: PublicExecutionResponse;
142
+ } | {
143
+ readonly ok: false;
144
+ readonly issues: readonly PublicExecutionValidationIssue[];
145
+ };
146
+ export interface PublicExecutionUpgradeResponse {
147
+ readonly error_code: 'PUBLIC_EXECUTION_UPGRADE_REQUIRED';
148
+ readonly reason_code: PublicExecutionNegotiationReasonCode;
149
+ readonly supported_schema_version: typeof PUBLIC_EXECUTION_SCHEMA_VERSION;
150
+ readonly min_secure_client_version: typeof PUBLIC_EXECUTION_MIN_SECURE_CLIENT_VERSION;
151
+ readonly fallback_action: 'upgrade_client';
152
+ }
153
+ export type PublicExecutionNegotiationResult = {
154
+ readonly ok: true;
155
+ readonly schemaVersion: typeof PUBLIC_EXECUTION_SCHEMA_VERSION;
156
+ readonly negotiated: boolean;
157
+ } | {
158
+ readonly ok: false;
159
+ readonly statusCode: 426;
160
+ readonly response: PublicExecutionUpgradeResponse;
161
+ };
162
+ export interface PublicExecutionNegotiationOptions {
163
+ /** Transitional route behavior until P201.06 makes V1 negotiation mandatory. */
164
+ readonly allowUndeclared?: boolean;
165
+ }
166
+ export declare const PUBLIC_EXECUTION_ALLOWED_TOP_LEVEL_FIELDS: readonly ["schemaVersion", "contractVersion", "minSecureClientVersion", "executionId", "status", "authority", "directives", "refs", "artifacts", "blockers", "debt", "validation"];
167
+ export declare function isPublicExecutionRepositoryPath(value: unknown): value is string;
168
+ export declare function validatePublicExecutionResponse(value: unknown): PublicExecutionValidationResult;
169
+ export declare class PublicExecutionContractError extends Error {
170
+ readonly code = "PUBLIC_EXECUTION_CONTRACT_REJECTED";
171
+ readonly issues: readonly PublicExecutionValidationIssue[];
172
+ constructor(issues: readonly PublicExecutionValidationIssue[]);
173
+ }
174
+ export declare function serializePublicExecutionResponse(value: unknown): string;
175
+ export declare function negotiatePublicExecutionSchema(declaredSchemaVersion: unknown, clientVersion: unknown, options?: PublicExecutionNegotiationOptions): PublicExecutionNegotiationResult;
@@ -0,0 +1,2 @@
1
+ const W=1,k="p201-public-execution-v1",$="4.60.15",J="x-public-execution-schema-version",Q="reject",U=["queued","running","waiting","blocked","completed","failed","cancelled"],P=["server-owned","root-local","native-task","mixed"],S=["server-execution","root-execution","native-task"],A=["observe","continue","cancel"],B=["inspect","modify","validate","state-update","git"],L=["story","spec","tasks","evidence","report","diff","validation"],g=["selected","passed","failed","skipped"],u=Object.freeze({envelopeBytes:65536,identifierBytes:128,reasonCodeBytes:96,summaryBytes:2048,repositoryPathBytes:256,maxDirectives:64,maxArtifacts:64,maxRows:100,maxRefs:64,maxValidationIssues:32}),i=Object.freeze({invalidEnvelope:"public-execution-invalid-envelope",unknownField:"public-execution-unknown-field",protectedField:"public-execution-protected-field",unknownDirective:"public-execution-directive-unknown",authorityMismatch:"public-execution-authority-mismatch",invalidIdentifier:"public-execution-identifier-invalid",invalidReasonCode:"public-execution-reason-code-invalid",invalidSummary:"public-execution-summary-invalid",invalidRepositoryPath:"public-execution-path-invalid",outputUnbounded:"public-execution-output-unbounded",duplicateReference:"public-execution-reference-duplicate"}),v=Object.freeze({schemaRequired:"public-execution-schema-required",schemaUnsupported:"public-execution-schema-unsupported",clientUpgradeRequired:"public-execution-client-upgrade-required"}),x=Object.freeze(["schemaVersion","contractVersion","minSecureClientVersion","executionId","status","authority","directives","refs","artifacts","blockers","debt","validation"]),w=new Set(["instructions","prompt","prompttemplate","body","content","workflow","workflowgraph","stepbody","skillbody","standardbody","rawlog","metadata"]),D=/^[A-Za-z0-9][A-Za-z0-9._:-]*$/,V=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,X=/^[A-Za-z0-9._@-]+$/,j=/(?:https?:\/\/|(?:^|\s)\/(?:home|Users|media|mnt|tmp|var|etc|private)\/|[A-Za-z]:\\|(?:promptTemplate|stepBody|skillBody|standardBody|workflowGraph|rawLog)\s*[:=]|(?:SERVER_ONLY|PRIVATE_PROMPT|BEGIN_SYNTHETIC_PROTECTED)[A-Z0-9_:-]*)/i;function p(r){return new TextEncoder().encode(r).byteLength}function T(r){return r!==null&&typeof r=="object"&&!Array.isArray(r)}function C(r,t){return Object.prototype.hasOwnProperty.call(r,t)}function c(r,t,e){r.length>=u.maxValidationIssues||r.some(n=>n.path===t&&n.reasonCode===e)||r.push({path:t,reasonCode:e})}function l(r,t,e,n,o){if(!T(r))return c(o,t,i.invalidEnvelope),null;const d=new Set(e);for(const a of Object.keys(r))d.has(a)||c(o,`${t}.${a}`,w.has(a.toLowerCase())?i.protectedField:i.unknownField);for(const a of n)C(r,a)||c(o,`${t}.${a}`,i.invalidEnvelope);return r}function I(r,t,e,n){return Array.isArray(r)?(r.length>e&&c(n,t,i.outputUnbounded),r.slice(0,e)):(c(n,t,i.invalidEnvelope),null)}function E(r,t,e,n){return typeof r!="string"||!t.includes(r)?(c(n,e,i.invalidEnvelope),!1):!0}function s(r,t,e){return typeof r!="string"||p(r)>u.identifierBytes||!D.test(r)?(c(e,t,i.invalidIdentifier),!1):!0}function O(r,t,e){return typeof r!="string"||p(r)>u.reasonCodeBytes||!V.test(r)?(c(e,t,i.invalidReasonCode),!1):!0}function y(r,t,e){return typeof r!="string"||r.length===0||r.includes(`
2
+ `)||r.includes("\r")||p(r)>u.summaryBytes||j.test(r)?(c(e,t,i.invalidSummary),!1):!0}function M(r){if(typeof r!="string"||r.length===0||p(r)>u.repositoryPathBytes||r.includes("\\")||r.includes("://")||r.startsWith("/")||r.startsWith("~"))return!1;const t=r.split("/");return!(t.some(e=>!e||e==="."||e===".."||!X.test(e))||t.some(e=>["core",".git","node_modules"].includes(e.toLowerCase())))}function m(r,t,e){return M(r)?!0:(c(e,t,i.invalidRepositoryPath),!1)}function f(r,t,e,n){const o=I(r,t,u.maxRefs,n);if(!o)return;const d=new Set;o.forEach((a,_)=>{const h=`${t}[${_}]`;!e(a,h,n)||typeof a!="string"||(d.has(a)&&c(n,h,i.duplicateReference),d.add(a))})}function z(r,t,e){const n=l(r,t,["contractIds","projectPaths"],["contractIds","projectPaths"],e);n&&(f(n.contractIds,`${t}.contractIds`,s,e),f(n.projectPaths,`${t}.projectPaths`,m,e))}function F(r,t,e){if(!T(r))return c(e,t,i.invalidEnvelope),null;if(typeof r.kind!="string"||!S.includes(r.kind))return c(e,`${t}.kind`,i.unknownDirective),null;if(r.kind==="server-execution"){const o=l(r,t,["kind","authority","directiveId","contractId","operation","summary"],["kind","authority","directiveId","contractId","operation","summary"],e);return o?(o.authority!=="server-owned"&&c(e,`${t}.authority`,i.authorityMismatch),s(o.directiveId,`${t}.directiveId`,e),s(o.contractId,`${t}.contractId`,e),E(o.operation,A,`${t}.operation`,e),y(o.summary,`${t}.summary`,e),o.authority==="server-owned"?"server-owned":null):null}if(r.kind==="root-execution"){const o=l(r,t,["kind","authority","directiveId","taskId","operation","summary","contractIds","projectPaths"],["kind","authority","directiveId","taskId","operation","summary","contractIds","projectPaths"],e);return o?(o.authority!=="root-local"&&c(e,`${t}.authority`,i.authorityMismatch),s(o.directiveId,`${t}.directiveId`,e),s(o.taskId,`${t}.taskId`,e),E(o.operation,B,`${t}.operation`,e),y(o.summary,`${t}.summary`,e),f(o.contractIds,`${t}.contractIds`,s,e),f(o.projectPaths,`${t}.projectPaths`,m,e),o.authority==="root-local"?"root-local":null):null}const n=l(r,t,["kind","authority","directiveId","taskId","subagentType","command","storyPath","acceptanceRefs"],["kind","authority","directiveId","taskId","subagentType","command","storyPath","acceptanceRefs"],e);return n?(n.authority!=="native-task"&&c(e,`${t}.authority`,i.authorityMismatch),s(n.directiveId,`${t}.directiveId`,e),s(n.taskId,`${t}.taskId`,e),n.subagentType!=="neocortex"&&c(e,`${t}.subagentType`,i.invalidEnvelope),n.command!=="yolo"&&c(e,`${t}.command`,i.invalidEnvelope),m(n.storyPath,`${t}.storyPath`,e)&&typeof n.storyPath=="string"&&!/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/.test(n.storyPath)&&c(e,`${t}.storyPath`,i.invalidRepositoryPath),f(n.acceptanceRefs,`${t}.acceptanceRefs`,s,e),n.authority==="native-task"?"native-task":null):null}function H(r,t,e){const n=l(r,t,["artifactId","kind","path","contractIds","syntheticSummary"],["artifactId","kind","path","contractIds"],e);n&&(s(n.artifactId,`${t}.artifactId`,e),E(n.kind,L,`${t}.kind`,e),m(n.path,`${t}.path`,e),f(n.contractIds,`${t}.contractIds`,s,e),C(n,"syntheticSummary")&&y(n.syntheticSummary,`${t}.syntheticSummary`,e))}function N(r,t,e,n){const o=l(r,t,[e,"reasonCode","summary","contractIds","projectPaths"],[e,"reasonCode","summary","contractIds","projectPaths"],n);o&&(s(o[e],`${t}.${e}`,n),O(o.reasonCode,`${t}.reasonCode`,n),y(o.summary,`${t}.summary`,n),f(o.contractIds,`${t}.contractIds`,s,n),f(o.projectPaths,`${t}.projectPaths`,m,n))}function Z(r,t,e){const n=l(r,t,["checkId","status","acceptanceRefs","contractIds","artifactIds","reasonCode","summary"],["checkId","status","acceptanceRefs","contractIds","artifactIds"],e);n&&(s(n.checkId,`${t}.checkId`,e),E(n.status,g,`${t}.status`,e),f(n.acceptanceRefs,`${t}.acceptanceRefs`,s,e),f(n.contractIds,`${t}.contractIds`,s,e),f(n.artifactIds,`${t}.artifactIds`,s,e),C(n,"reasonCode")&&O(n.reasonCode,`${t}.reasonCode`,e),C(n,"summary")&&y(n.summary,`${t}.summary`,e))}function q(r){const t=[],e=l(r,"$",x,x,t);if(!e)return{ok:!1,issues:t};e.schemaVersion!==1&&c(t,"$.schemaVersion",i.invalidEnvelope),e.contractVersion!==k&&c(t,"$.contractVersion",i.invalidEnvelope),e.minSecureClientVersion!==$&&c(t,"$.minSecureClientVersion",i.invalidEnvelope),s(e.executionId,"$.executionId",t),E(e.status,U,"$.status",t),E(e.authority,P,"$.authority",t);const n=new Set;if(I(e.directives,"$.directives",u.maxDirectives,t)?.forEach((d,a)=>{const _=F(d,`$.directives[${a}]`,t);_&&n.add(_)}),e.authority==="mixed")n.size<2&&c(t,"$.authority",i.authorityMismatch);else if(P.includes(String(e.authority))){for(const d of n)if(d!==e.authority){c(t,"$.authority",i.authorityMismatch);break}}z(e.refs,"$.refs",t),I(e.artifacts,"$.artifacts",u.maxArtifacts,t)?.forEach((d,a)=>H(d,`$.artifacts[${a}]`,t)),I(e.blockers,"$.blockers",u.maxRows,t)?.forEach((d,a)=>N(d,`$.blockers[${a}]`,"blockerId",t)),I(e.debt,"$.debt",u.maxRows,t)?.forEach((d,a)=>N(d,`$.debt[${a}]`,"debtId",t)),I(e.validation,"$.validation",u.maxRows,t)?.forEach((d,a)=>Z(d,`$.validation[${a}]`,t));try{const d=JSON.stringify(r);(typeof d!="string"||p(d)>u.envelopeBytes)&&c(t,"$",i.outputUnbounded)}catch{c(t,"$",i.invalidEnvelope)}return t.length>0?{ok:!1,issues:t}:{ok:!0,value:r}}class G extends Error{code="PUBLIC_EXECUTION_CONTRACT_REJECTED";issues;constructor(t){super(`${t[0]?.reasonCode??i.invalidEnvelope} at ${t[0]?.path??"$"}`),this.name="PublicExecutionContractError",this.issues=t}}function K(r){const t=q(r);if(!t.ok)throw new G(t.issues);return JSON.stringify(t.value)}function b(r){if(typeof r!="string")return null;const t=r.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!t)return null;const e=[Number(t[1]),Number(t[2]),Number(t[3])];return e.some(n=>!Number.isSafeInteger(n))?null:{parts:e,prerelease:t[4]!==void 0}}function Y(r){const t=b(r),e=b($);if(!t||!e)return!1;for(let n=0;n<3;n+=1)if(t.parts[n]!==e.parts[n])return t.parts[n]>e.parts[n];return e.prerelease||!t.prerelease}function R(r){return{ok:!1,statusCode:426,response:{error_code:"PUBLIC_EXECUTION_UPGRADE_REQUIRED",reason_code:r,supported_schema_version:1,min_secure_client_version:$,fallback_action:"upgrade_client"}}}function tt(r,t,e={}){return r==null||r===""?e.allowUndeclared===!0?{ok:!0,schemaVersion:1,negotiated:!1}:R(v.schemaRequired):(typeof r=="number"?r:typeof r=="string"&&/^\d+$/.test(r)?Number(r):Number.NaN)!==1?R(v.schemaUnsupported):Y(t)?{ok:!0,schemaVersion:1,negotiated:!0}:R(v.clientUpgradeRequired)}export{L as PUBLIC_ARTIFACT_KINDS,x as PUBLIC_EXECUTION_ALLOWED_TOP_LEVEL_FIELDS,P as PUBLIC_EXECUTION_AUTHORITIES,k as PUBLIC_EXECUTION_CONTRACT_VERSION,S as PUBLIC_EXECUTION_DIRECTIVE_KINDS,u as PUBLIC_EXECUTION_LIMITS,$ as PUBLIC_EXECUTION_MIN_SECURE_CLIENT_VERSION,v as PUBLIC_EXECUTION_NEGOTIATION_REASON_CODES,J as PUBLIC_EXECUTION_SCHEMA_HEADER,W as PUBLIC_EXECUTION_SCHEMA_VERSION,U as PUBLIC_EXECUTION_STATUSES,Q as PUBLIC_EXECUTION_UNKNOWN_FIELD_POLICY,i as PUBLIC_EXECUTION_VALIDATION_REASON_CODES,B as PUBLIC_ROOT_EXECUTION_OPERATIONS,A as PUBLIC_SERVER_EXECUTION_OPERATIONS,g as PUBLIC_VALIDATION_STATUSES,G as PublicExecutionContractError,M as isPublicExecutionRepositoryPath,tt as negotiatePublicExecutionSchema,K as serializePublicExecutionResponse,q as validatePublicExecutionResponse};
@@ -1,4 +1,4 @@
1
- # 🧠 Neocortex v4.60.16 | OrNexus Team
1
+ # 🧠 Neocortex v4.63.4 | OrNexus Team
2
2
 
3
3
  This project uses Neocortex, a Development Orchestrator.
4
4
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.16 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.63.4 | OrNexus Team"
4
4
  ---
5
5
 
6
6
  <!--
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex Root Agent'
5
5
  title: 'Development Orchestrator (Root)'
6
6
  icon: '>'
7
- version: '4.60.16'
7
+ version: '4.63.4'
8
8
  architecture: 'thin-client'
9
9
  module: stand-alone
10
10
  hasSidecar: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex-root
3
- description: "🧠 Neocortex Root Agent v4.60.16 | OrNexus Team"
3
+ description: "🧠 Neocortex Root Agent v4.63.4 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  tools:
@@ -105,7 +105,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
105
105
  ┌────────────────────────────────────────────────────────────┐
106
106
  │ │
107
107
  │ ####### N E O C O R T E X │
108
- │ ### ######## v4.60.16
108
+ │ ### ######## v4.63.4
109
109
  │ ######### ##### │
110
110
  │ ## ############## Development Orchestrator │
111
111
  │ ## ### ###### ## OrNexus Team │
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex'
5
5
  title: 'Development Orchestrator'
6
6
  icon: '>'
7
- version: '4.60.16'
7
+ version: '4.63.4'
8
8
  architecture: 'thin-client'
9
9
  module: stand-alone
10
10
  hasSidecar: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.16 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.63.4 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  tools:
@@ -99,7 +99,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
99
99
  ┌────────────────────────────────────────────────────────────┐
100
100
  │ │
101
101
  │ ####### N E O C O R T E X │
102
- │ ### ######## v4.60.16
102
+ │ ### ######## v4.63.4
103
103
  │ ######### ##### │
104
104
  │ ## ############## Development Orchestrator │
105
105
  │ ## ### ###### ## OrNexus Team │
@@ -25,7 +25,7 @@ Codex built-in commands or actions.
25
25
 
26
26
  <!-- END: Plugin Conflict Prevention -->
27
27
 
28
- # Neocortex v4.60.16 | OrNexus Team
28
+ # Neocortex v4.63.4 | OrNexus Team
29
29
 
30
30
  You are a Development Orchestrator. All orchestration logic is delivered by the remote Neocortex server.
31
31
 
@@ -63,7 +63,7 @@ When the user invokes Neocortex, follow this protocol EXACTLY:
63
63
  2. **Execute the thin client** to get instructions from the server:
64
64
 
65
65
  ```bash
66
- neocortex-client invoke \
66
+ CODEX_CLI=1 neocortex-client invoke \
67
67
  --args "{USER_ARGS}" \
68
68
  --project-root "$(git rev-parse --show-toplevel 2>/dev/null || pwd -P)" \
69
69
  --format plain
@@ -71,6 +71,16 @@ neocortex-client invoke \
71
71
 
72
72
  3. **Follow EXACTLY the instructions returned** by the thin client on stdout
73
73
 
74
+ ## Codex Local Activation Access
75
+
76
+ Neocortex activation/auth state is local (normally under `~/.neocortex`) and can
77
+ be hidden by Codex sandboxing. Run Codex Neocortex commands only from a trusted
78
+ local project session/profile with access to local activation state and network.
79
+ If sandboxing blocks auth, retry with the explicit local Codex profile
80
+ (`codex --profile neocortex-local`) or the equivalent Codex App **Full Access** /
81
+ trusted-local mode. Do not paste credentials, secrets, raw auth logs or activation
82
+ material into prompts, memory, docs, state or project files.
83
+
74
84
  ### Large input compatibility
75
85
 
76
86
  Use `--args` exactly as shown above for normal triggers and delegated prompts; it
@@ -79,8 +89,8 @@ synthetic story or mega prompt that cannot safely fit in a shell argument, use
79
89
  exactly one large-input source instead:
80
90
 
81
91
  ```bash
82
- neocortex-client invoke --stdin --project-root "$(git rev-parse --show-toplevel 2>/dev/null || pwd -P)" --format plain < synthetic.story.md
83
- neocortex-client invoke --args-file ./synthetic.story.md --project-root "$(git rev-parse --show-toplevel 2>/dev/null || pwd -P)" --format plain
92
+ CODEX_CLI=1 neocortex-client invoke --stdin --project-root "$(git rev-parse --show-toplevel 2>/dev/null || pwd -P)" --format plain < synthetic.story.md
93
+ CODEX_CLI=1 neocortex-client invoke --args-file ./synthetic.story.md --project-root "$(git rev-parse --show-toplevel 2>/dev/null || pwd -P)" --format plain
84
94
  ```
85
95
 
86
96
  Do not force migration to these options, do not combine them with `--args`, and
@@ -197,7 +207,7 @@ in free-form text or with `--url`. Findings can become remediation stories for
197
207
  |-----------|---------|--------|
198
208
  | 0 | Success | Follow stdout instructions |
199
209
  | 1 | Server error | Show stderr to user |
200
- | 2 | Not configured | Instruct: "Visit https://neocortex.sh/portal/login to get your license key, then run: `neocortex activate YOUR-LICENSE-KEY`" |
210
+ | 2 | Not configured | Instruct: "Visit https://neocortex.sh/portal/login, then run `neocortex activate` from a trusted local shell or retry Codex with the local profile/Full Access if sandboxing blocked auth." |
201
211
 
202
212
  ## Rules
203
213
 
@@ -239,7 +249,7 @@ termination tokens report complete/aborted.
239
249
 
240
250
  ```bash
241
251
  while true; do
242
- RESPONSE=$(neocortex-client invoke --args "*yoloop @docs/epics/" --format plain)
252
+ RESPONSE=$(CODEX_CLI=1 neocortex-client invoke --args "*yoloop @docs/epics/" --format plain)
243
253
  echo "$RESPONSE"
244
254
  echo "$RESPONSE" | grep -q '\[YOLOOP_COMPLETE\]' && break
245
255
  echo "$RESPONSE" | grep -q '\[YOLOOP_ABORTED\]' && break
@@ -22,6 +22,7 @@ neocortex activate YOUR-LICENSE-KEY # Get yours at https://neocortex.sh/portal/
22
22
  |---|---|
23
23
  | `AGENTS.md` | Root thin-client trigger interceptor (delegates to neocortex-client) |
24
24
  | `neocortex.toml` | Native Codex custom agent for isolated Neocortex task directives |
25
+ | `neocortex-local.config.toml` | Explicit local Codex profile fragment for trusted Neocortex runs |
25
26
  | `config-mcp.toml` | MCP server configuration (Playwright + Context7) |
26
27
 
27
28
  ## How It Works
@@ -42,6 +43,29 @@ The installer does not raise Codex `[agents] max_threads` or `max_depth` by
42
43
  default. Users can tune those settings in `$CODEX_HOME/config.toml` when their
43
44
  Codex environment supports native subagent configuration.
44
45
 
46
+ ## Local Neocortex Profile
47
+
48
+ Codex sandboxing can hide the activated local Neocortex state in `~/.neocortex`
49
+ or block the Neocortex API. The Codex installer therefore places an explicit
50
+ local profile asset at `$CODEX_HOME/neocortex-local.config.toml` and appends the
51
+ named `[profiles.neocortex-local]` profile to `$CODEX_HOME/config.toml` only when
52
+ that profile is not already present. Existing `config.toml` content, MCP entries
53
+ and user-owned profiles are preserved.
54
+
55
+ Use the profile only from a trusted local checkout when you intentionally want
56
+ Codex to access local activation state and the real project files:
57
+
58
+ ```bash
59
+ codex --profile neocortex-local "@neocortex *status"
60
+ codex --profile neocortex-local exec "@neocortex *yolo @docs/stories/1.1.story.md"
61
+ ```
62
+
63
+ In Codex App, select the equivalent **Full Access** / trusted-local permission
64
+ mode before invoking `@neocortex *...`. Broad local access is an explicit
65
+ operator choice; do not enable it for unrelated tasks or remote/hosted sessions.
66
+ The profile file contains no secrets and users should never paste license keys,
67
+ API keys or tokens into Codex prompts or project files.
68
+
45
69
  Codex custom agent reference: https://developers.openai.com/codex/subagents
46
70
 
47
71
  For more information, visit: https://neocortex.sh
@@ -2,6 +2,71 @@
2
2
  # Neocortex - OpenAI Codex CLI Install Adapter (Thin Client)
3
3
  # Simplified installer for npm tarball mode (targets-stubs only)
4
4
 
5
+ codex_config_is_safe_to_append() {
6
+ local config_file="${1:?CONFIG_FILE required}"
7
+
8
+ if [ ! -f "$config_file" ]; then
9
+ return 0
10
+ fi
11
+
12
+ if command -v node >/dev/null 2>&1; then
13
+ node - "$config_file" <<'NODE'
14
+ const fs = require('fs');
15
+ const file = process.argv[2];
16
+ const text = fs.readFileSync(file, 'utf8');
17
+ for (const line of text.split(/\r?\n/)) {
18
+ const trimmed = line.trim();
19
+ if (!trimmed || trimmed.startsWith('#')) continue;
20
+ if (trimmed.startsWith('[') && !/^\[[^\]]+\]$/.test(trimmed)) process.exit(1);
21
+ const quotes = (trimmed.match(/(?<!\\)"/g) || []).length;
22
+ if (quotes % 2 !== 0) process.exit(1);
23
+ }
24
+ NODE
25
+ return $?
26
+ fi
27
+
28
+ if grep -Eq '^[[:space:]]*\[[^]]*$' "$config_file" 2>/dev/null; then
29
+ return 1
30
+ fi
31
+
32
+ return 0
33
+ }
34
+
35
+ install_codex_local_profile() {
36
+ local codex_target="${1:?CODEX_TARGET required}"
37
+ local codex_home="${2:?CODEX_HOME required}"
38
+ local profile_stub="$codex_target/neocortex-local.config.toml"
39
+ local profile_asset="$codex_home/neocortex-local.config.toml"
40
+ local config_file="$codex_home/config.toml"
41
+
42
+ if [ ! -f "$profile_stub" ]; then
43
+ echo "[CODEX] WARN: neocortex-local.config.toml not found; local profile asset skipped" >&2
44
+ return 0
45
+ fi
46
+
47
+ cp "$profile_stub" "$profile_asset"
48
+ echo "[CODEX] Installed: $profile_asset (local profile asset)"
49
+
50
+ if [ -f "$config_file" ] && grep -Eq '^[[:space:]]*\[profiles\.("?neocortex-local"?|neocortex-local)\][[:space:]]*$' "$config_file" 2>/dev/null; then
51
+ echo "[CODEX] Preserved existing [profiles.neocortex-local] in $config_file"
52
+ return 0
53
+ fi
54
+
55
+ if ! codex_config_is_safe_to_append "$config_file"; then
56
+ echo "[CODEX] WARN: leaving existing $config_file untouched; profile asset available at: $profile_asset" >&2
57
+ return 0
58
+ fi
59
+
60
+ if [ -f "$config_file" ]; then
61
+ printf '\n' >> "$config_file"
62
+ cat "$profile_stub" >> "$config_file"
63
+ echo "[CODEX] Added: [profiles.neocortex-local] to $config_file"
64
+ else
65
+ cp "$profile_stub" "$config_file"
66
+ echo "[CODEX] Created: $config_file with [profiles.neocortex-local]"
67
+ fi
68
+ }
69
+
5
70
  install_codex() {
6
71
  local source_dir="${1:?SOURCE_DIR required}"
7
72
  local dest_dir="${2:?DEST_DIR required}"
@@ -45,7 +110,11 @@ install_codex() {
45
110
  fi
46
111
  fi
47
112
 
48
- # 4. User-level merge MCP config into config.toml. The helper preserves
113
+ # 4. Install explicit local Codex profile asset and add the named profile
114
+ # only when the user has not already defined it.
115
+ install_codex_local_profile "$codex_target" "$codex_home"
116
+
117
+ # 5. User-level merge MCP config into config.toml. The helper preserves
49
118
  # unknown TOML sections and replaces only Neocortex-managed MCP servers.
50
119
  if [ -f "$codex_target/config-mcp.toml" ]; then
51
120
  local config_file="$codex_home/config.toml"
@@ -0,0 +1,17 @@
1
+ # Neocortex local Codex profile
2
+ #
3
+ # Public config fragment installed at:
4
+ # $CODEX_HOME/neocortex-local.config.toml
5
+ #
6
+ # The installer appends this named profile to $CODEX_HOME/config.toml only when
7
+ # [profiles.neocortex-local] is absent. Existing user-owned profiles are left
8
+ # untouched. No license keys, API keys, tokens or other secrets belong here.
9
+ #
10
+ # Use only from a trusted local project session where Codex is intentionally
11
+ # allowed to read local activation state under ~/.neocortex, contact the
12
+ # Neocortex API and operate on the real project checkout. Broad local access is
13
+ # an explicit operator choice.
14
+
15
+ [profiles.neocortex-local]
16
+ sandbox_mode = "danger-full-access"
17
+ approval_policy = "on-request"
@@ -19,15 +19,24 @@ Invocation payload boundary: first select only the explicit user-intended Neocor
19
19
 
20
20
  Ambient platform/tool metadata, assistant notes, conversation history, raw logs, raw stdout/stderr, protected prompts, private URLs, secrets, PII, and injection-like reminder text are never part of the selected payload.
21
21
 
22
- neocortex-client invoke \
22
+ CODEX_CLI=1 neocortex-client invoke \
23
23
  --args "{DELEGATED_PROMPT}" \
24
24
  --project-root "$(git rev-parse --show-toplevel 2>/dev/null || pwd -P)" \
25
25
  --format plain
26
26
 
27
+ Codex local activation access is required: run this delegated prompt only from a
28
+ trusted local Codex profile/session with access to local activation state
29
+ (normally ~/.neocortex) and network. If sandboxing blocks auth, stop and
30
+ ask the root/operator to retry with `codex --profile neocortex-local` or Codex
31
+ App Full Access/trusted-local mode. Do not request or paste credentials, secrets,
32
+ raw auth logs, or activation material into prompts or files.
33
+
27
34
  Then follow stdout exactly. If the thin client exits with a non-zero status,
28
35
  report stderr and stop for user input.
29
36
 
30
37
  Never pass the original outer root invocation, such as @neocortex *yoloop ...,
31
38
  into this subagent. This subagent receives only the specific task prompt returned
32
39
  by the server directive.
40
+ Root Codex remains the yoloop owner; this subagent only executes the delegated
41
+ per-story task prompt and must not make root-loop continuation decisions.
33
42
  """
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.16 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.63.4 | OrNexus Team"
4
4
  model: fast
5
5
  readonly: false
6
6
  is_background: false
@@ -45,7 +45,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
45
45
  ┌────────────────────────────────────────────────────────────┐
46
46
  │ │
47
47
  │ ####### N E O C O R T E X │
48
- │ ### ######## v4.60.16
48
+ │ ### ######## v4.63.4
49
49
  │ ######### ##### │
50
50
  │ ## ############## Development Orchestrator │
51
51
  │ ## ### ###### ## OrNexus Team │