@ornexus/neocortex 4.60.72 → 4.60.74

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 (46) hide show
  1. package/dist/release-source.json +1 -1
  2. package/dist/sbom.cdx.json +1217 -1211
  3. package/install.ps1 +1 -1
  4. package/install.sh +1 -1
  5. package/package.json +2 -2
  6. package/packages/client/dist/commands/invoke.js +66 -66
  7. package/packages/client/dist/continuity/sqlite-store.d.ts +22 -1
  8. package/packages/client/dist/continuity/sqlite-store.js +60 -60
  9. package/packages/client/dist/git/epic-operational-state.d.ts +198 -0
  10. package/packages/client/dist/git/epic-operational-state.js +2 -0
  11. package/packages/client/dist/git/git-lifecycle-store.d.ts +32 -1
  12. package/packages/client/dist/git/git-lifecycle-store.js +9 -8
  13. package/packages/client/dist/migrations/epic-lifecycle-backfill.d.ts +97 -0
  14. package/packages/client/dist/migrations/epic-lifecycle-backfill.js +3 -0
  15. package/packages/client/dist/migrations/state-json.d.ts +22 -0
  16. package/packages/client/dist/migrations/state-json.js +4 -4
  17. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.d.ts +1 -1
  18. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +2 -2
  19. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.d.ts +2 -0
  20. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +10 -8
  21. package/packages/client/dist/runner/headless/epic-terminal-git-runner.d.ts +18 -2
  22. package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +2 -2
  23. package/packages/client/dist/runner/headless/run-yolo.js +1 -1
  24. package/packages/client/dist/runner/headless/run-yoloop.d.ts +1 -0
  25. package/packages/client/dist/runner/headless/run-yoloop.js +2 -2
  26. package/packages/client/dist/runner/headless/types.js +2 -2
  27. package/packages/client/dist/state/project-state-snapshot.d.ts +8 -0
  28. package/packages/client/dist/state/project-state-snapshot.js +1 -1
  29. package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
  30. package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +65 -1
  31. package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +8 -0
  32. package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
  33. package/packages/shared/dist/yolo/change-evidence.js +1 -1
  34. package/packages/shared/dist/yolo/spec-envelope.js +3 -6
  35. package/packages/shared/dist/yoloop/epic-terminal-git.js +144 -2
  36. package/targets-stubs/antigravity/gemini.md +1 -1
  37. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  38. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  39. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  40. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  41. package/targets-stubs/claude-code/neocortex.md +2 -2
  42. package/targets-stubs/codex/AGENTS.md +1 -1
  43. package/targets-stubs/cursor/agent.md +2 -2
  44. package/targets-stubs/gemini-cli/agent.md +2 -2
  45. package/targets-stubs/opencode/neocortex-root.md +1 -1
  46. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -1,7 +1,7 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { posix } from 'node:path';
3
3
  const SHA = /^[a-f0-9]{40}(?:[a-f0-9]{24})?$/;
4
- const PATH = /^[A-Za-z0-9_.-][A-Za-z0-9_./ -]{0,239}$/;
4
+ const PATH = /^[A-Za-z0-9_.\[\]-][A-Za-z0-9_./ \[\]-]{0,239}$/;
5
5
  const UNSAFE = /(^|\/)(?:\.env(?:\.|$)|secrets?|credentials?|private-prompts?|customer-data)(?:\/|$)|(?:token|password|license[_-]?key|secret)[=:]/i;
6
6
  function digest(paths) {
7
7
  return createHash('sha256').update(JSON.stringify(paths)).digest('hex');
@@ -1,8 +1,9 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { posix } from 'node:path';
3
3
  import { inspectFrontmatterContext } from '../frontmatter-context-contract.js';
4
- export const YOLO_SPEC_ARTIFACT_LIMIT_BYTES = 64 * 1024;
5
- export const YOLO_SPEC_TOTAL_LIMIT_BYTES = 128 * 1024;
4
+ // Artifact bytes are intentionally not capped here. The invoke transport owns
5
+ // the request-level byte guardrail; this contract owns count, shape, content,
6
+ // target, freshness and digest integrity without a smaller duplicate ceiling.
6
7
  export const YOLO_SPEC_MAX_ARTIFACTS = 12;
7
8
  export const YOLO_SPEC_MAX_AGE_MS = 120_000;
8
9
  export const YOLO_SPEC_FUTURE_SKEW_MS = 30_000;
@@ -59,8 +60,6 @@ function checkArtifact(value) {
59
60
  }
60
61
  const content = normalizeContent(value.content);
61
62
  const bytes = Buffer.byteLength(content, 'utf8');
62
- if (bytes > YOLO_SPEC_ARTIFACT_LIMIT_BYTES)
63
- deny('yolo-spec-envelope-too-large');
64
63
  if (content !== value.content || bytes !== value.byteLength || sha256(content) !== value.sha256) {
65
64
  deny('yolo-spec-envelope-digest-mismatch');
66
65
  }
@@ -126,8 +125,6 @@ export function assertYoloSpecEnvelopeV1(value, context) {
126
125
  for (const artifact of artifacts)
127
126
  checkArtifact(artifact);
128
127
  const typedArtifacts = artifacts;
129
- if (typedArtifacts.reduce((sum, artifact) => sum + artifact.byteLength, 0) > YOLO_SPEC_TOTAL_LIMIT_BYTES)
130
- deny('yolo-spec-envelope-too-large');
131
128
  const keys = typedArtifacts.map((artifact) => `${artifact.kind}:${artifact.path}`);
132
129
  if (new Set(keys).size !== keys.length || keys.some((key, index) => index > 0 && key < keys[index - 1]))
133
130
  deny('yolo-spec-envelope-unsafe');
@@ -1,4 +1,17 @@
1
1
  /** Public contracts and pure safety decisions for epic-owned terminal Git. */
2
+ import { createHash } from 'node:crypto';
3
+ /**
4
+ * P205 complete-gate budgets are declared in config/release-gates.v2.json and
5
+ * mirrored here so installed clients keep the same closed runtime bounds.
6
+ * release-gates.test.mjs prevents either side from drifting independently.
7
+ */
8
+ export const P205_RELEASE_GATE_BUDGETS = Object.freeze({
9
+ completeGateWorstCaseMs: 45 * 60 * 1000,
10
+ cancellationGraceMs: 5 * 60 * 1000,
11
+ aggregateValidityMs: 2 * 60 * 60 * 1000,
12
+ terminalWorkflowMaxDurationMs: 2 * 60 * 60 * 1000,
13
+ });
14
+ export const P205_ROOT_INVOKE_TIMEOUT_MS = P205_RELEASE_GATE_BUDGETS.completeGateWorstCaseMs + P205_RELEASE_GATE_BUDGETS.cancellationGraceMs;
2
15
  export const EPIC_TERMINAL_GIT_REASON_CODES = Object.freeze({
3
16
  READY: 'epic-terminal-git-ready',
4
17
  ALREADY_COMPLETE: 'epic-terminal-git-already-complete',
@@ -38,6 +51,96 @@ export const EPIC_TERMINAL_GIT_REASON_CODES = Object.freeze({
38
51
  PR_BASE_GUARD_UNVERIFIABLE: 'epic-terminal-pr-base-guard-unverifiable',
39
52
  PR_MERGE_QUEUE_LOCAL_GATE_REQUIRED: 'epic-terminal-pr-merge-queue-local-gate-required',
40
53
  });
54
+ export function epicHeadReconciliationRangeDigest(lastAcceptedCheckpointHeadSha, executionHeadSha, reconciliationCommitShas) {
55
+ return createHash('sha256').update([
56
+ 'epic-head-reconciliation-range-v1',
57
+ lastAcceptedCheckpointHeadSha,
58
+ executionHeadSha,
59
+ ...reconciliationCommitShas,
60
+ ].join('\0')).digest('hex');
61
+ }
62
+ export function epicHeadReconciliationPathsDigest(paths) {
63
+ return createHash('sha256').update(paths.join('\0')).digest('hex');
64
+ }
65
+ export function epicHeadReconciliationInputDigest(value) {
66
+ return createHash('sha256').update(JSON.stringify({
67
+ schemaVersion: value.schemaVersion,
68
+ kind: value.kind,
69
+ producer: value.producer,
70
+ epicId: value.epicId,
71
+ executionBranch: value.executionBranch,
72
+ originBranch: value.originBranch,
73
+ graphRevision: value.graphRevision,
74
+ originHeadSha: value.originHeadSha,
75
+ lastAcceptedCheckpointHeadSha: value.lastAcceptedCheckpointHeadSha,
76
+ executionHeadSha: value.executionHeadSha,
77
+ acceptedCheckpointIds: value.acceptedCheckpointIds,
78
+ acceptedCheckpointHeads: value.acceptedCheckpointHeads,
79
+ reconciliationCommitShas: value.reconciliationCommitShas,
80
+ commitRangeDigest: value.commitRangeDigest,
81
+ changedPaths: value.changedPaths,
82
+ changedPathsDigest: value.changedPathsDigest,
83
+ allowedWriteSet: value.allowedWriteSet,
84
+ allowedWriteSetDigest: value.allowedWriteSetDigest,
85
+ aggregateReceiptRef: value.aggregateReceiptRef,
86
+ aggregateManifestDigest: value.aggregateManifestDigest,
87
+ aggregateResultDigest: value.aggregateResultDigest,
88
+ producedAt: value.producedAt,
89
+ revalidatedAt: value.revalidatedAt,
90
+ publicSafe: value.publicSafe,
91
+ })).digest('hex');
92
+ }
93
+ export function validateEpicHeadReconciliationReceipt(value, expected) {
94
+ if (!value || value.schemaVersion !== 1 || value.kind !== 'epic_head_reconciliation'
95
+ || value.producer !== 'client-p205-head-reconciliation-v1' || value.publicSafe !== true
96
+ || !nonEmpty(value.epicId) || !nonEmpty(value.executionBranch) || !nonEmpty(value.originBranch)
97
+ || !Array.isArray(value.acceptedCheckpointIds) || !Array.isArray(value.acceptedCheckpointHeads)
98
+ || !Array.isArray(value.reconciliationCommitShas) || !Array.isArray(value.changedPaths)
99
+ || !Array.isArray(value.allowedWriteSet)
100
+ || value.epicId !== expected.epicId || value.executionBranch !== expected.executionBranch
101
+ || value.originBranch !== expected.originBranch || value.graphRevision !== expected.graphRevision
102
+ || value.originHeadSha !== expected.originHeadSha || value.executionHeadSha !== expected.executionHeadSha
103
+ || value.lastAcceptedCheckpointHeadSha !== expected.acceptedCheckpointHeads.at(-1)
104
+ || !sameOrdered(value.acceptedCheckpointIds, expected.acceptedCheckpointIds)
105
+ || !sameOrdered(value.acceptedCheckpointHeads, expected.acceptedCheckpointHeads)
106
+ || value.aggregateReceiptRef !== expected.aggregateQaReceipt.receiptRef
107
+ || value.aggregateManifestDigest !== expected.aggregateQaReceipt.manifestDigest
108
+ || value.aggregateResultDigest !== expected.aggregateQaReceipt.resultDigest
109
+ || !nonEmpty(value.aggregateReceiptRef) || !isHash(value.aggregateManifestDigest)
110
+ || !isHash(value.aggregateResultDigest) || !nonEmpty(value.producedAt) || !nonEmpty(value.revalidatedAt)
111
+ || value.acceptedCheckpointIds.length === 0 || value.acceptedCheckpointIds.length > 2_048
112
+ || value.acceptedCheckpointIds.some((id) => !nonEmpty(id) || id.length > 240)
113
+ || value.reconciliationCommitShas.length > 2_048
114
+ || value.changedPaths.length > 2_048
115
+ || value.allowedWriteSet.length === 0 || value.allowedWriteSet.length > 2_048
116
+ || (value.lastAcceptedCheckpointHeadSha !== value.executionHeadSha
117
+ && (value.reconciliationCommitShas.length === 0 || value.changedPaths.length === 0))
118
+ || (value.lastAcceptedCheckpointHeadSha === value.executionHeadSha
119
+ && (value.reconciliationCommitShas.length !== 0 || value.changedPaths.length !== 0))
120
+ || !isFullSha(value.originHeadSha) || !isFullSha(value.lastAcceptedCheckpointHeadSha)
121
+ || !isFullSha(value.executionHeadSha) || !isHash(value.graphRevision)
122
+ || value.acceptedCheckpointHeads.some((sha) => !isFullSha(sha))
123
+ || value.reconciliationCommitShas.some((sha) => !isFullSha(sha))
124
+ || !sameOrdered(value.changedPaths, [...new Set(value.changedPaths)].sort())
125
+ || !sameOrdered(value.allowedWriteSet, [...new Set(value.allowedWriteSet)].sort())
126
+ || value.changedPaths.some((path) => !safeRepositoryPath(path))
127
+ || value.allowedWriteSet.some((path) => !safeWriteScope(path))
128
+ || value.changedPaths.some((path) => !value.allowedWriteSet.some((scope) => writeScopeCovers(scope, path)))
129
+ || value.commitRangeDigest !== epicHeadReconciliationRangeDigest(value.lastAcceptedCheckpointHeadSha, value.executionHeadSha, value.reconciliationCommitShas)
130
+ || value.changedPathsDigest !== epicHeadReconciliationPathsDigest(value.changedPaths)
131
+ || value.allowedWriteSetDigest !== epicHeadReconciliationPathsDigest(value.allowedWriteSet)
132
+ || value.inputDigest !== epicHeadReconciliationInputDigest(value)
133
+ || !isHash(value.commitRangeDigest) || !isHash(value.changedPathsDigest)
134
+ || !isHash(value.allowedWriteSetDigest) || !isHash(value.inputDigest))
135
+ return false;
136
+ const producedAt = Date.parse(value.producedAt);
137
+ const revalidatedAt = Date.parse(value.revalidatedAt);
138
+ const now = Date.parse(expected.nowIso);
139
+ return Number.isFinite(producedAt) && Number.isFinite(revalidatedAt) && Number.isFinite(now)
140
+ && revalidatedAt >= producedAt
141
+ && now - revalidatedAt <= P205_RELEASE_GATE_BUDGETS.aggregateValidityMs
142
+ && revalidatedAt - now <= P205_RELEASE_GATE_BUDGETS.cancellationGraceMs;
143
+ }
41
144
  export function validateEpicTerminalGitDirective(directive, actual) {
42
145
  const reasons = [];
43
146
  if (!nonEmpty(directive.originBranch))
@@ -76,8 +179,8 @@ export function validateEpicTerminalGitDirective(directive, actual) {
76
179
  || !directive.localGates.receiptRefs.includes(aggregate.receiptRef)) {
77
180
  reasons.push(EPIC_TERMINAL_GIT_REASON_CODES.AGGREGATE_QA_REQUIRED);
78
181
  }
79
- else if (!Number.isFinite(Date.parse(aggregate.checkedAt)) || actual.nowIso && (Date.parse(actual.nowIso) - Date.parse(aggregate.checkedAt) > 30 * 60 * 1000
80
- || Date.parse(aggregate.checkedAt) - Date.parse(actual.nowIso) > 5 * 60 * 1000)) {
182
+ else if (!Number.isFinite(Date.parse(aggregate.checkedAt)) || actual.nowIso && (Date.parse(actual.nowIso) - Date.parse(aggregate.checkedAt) > P205_RELEASE_GATE_BUDGETS.aggregateValidityMs
183
+ || Date.parse(aggregate.checkedAt) - Date.parse(actual.nowIso) > P205_RELEASE_GATE_BUDGETS.cancellationGraceMs)) {
81
184
  reasons.push(EPIC_TERMINAL_GIT_REASON_CODES.AGGREGATE_QA_STALE);
82
185
  }
83
186
  const originBinding = actual.originBinding;
@@ -90,6 +193,24 @@ export function validateEpicTerminalGitDirective(directive, actual) {
90
193
  || !Number.isFinite(Date.parse(originBinding.capturedAt))) {
91
194
  reasons.push(EPIC_TERMINAL_GIT_REASON_CODES.ORIGIN_BINDING_REQUIRED);
92
195
  }
196
+ const directedReconciliation = directive.localGates?.headReconciliationReceipt;
197
+ const actualReconciliation = actual.headReconciliationReceipt;
198
+ if (directedReconciliation && (!actualReconciliation || !originBinding || !aggregate
199
+ || directedReconciliation.inputDigest !== actualReconciliation.inputDigest
200
+ || !validateEpicHeadReconciliationReceipt(actualReconciliation, {
201
+ epicId: directive.epicId,
202
+ executionBranch: directive.executionBranch,
203
+ originBranch: directive.originBranch,
204
+ graphRevision: directive.graphRevision,
205
+ originHeadSha: originBinding.originHeadSha,
206
+ executionHeadSha: actual.executionHeadSha,
207
+ acceptedCheckpointIds: actual.acceptedCheckpointIds,
208
+ acceptedCheckpointHeads: actualReconciliation.acceptedCheckpointHeads,
209
+ aggregateQaReceipt: aggregate,
210
+ nowIso: actual.nowIso ?? new Date(0).toISOString(),
211
+ }))) {
212
+ reasons.push(EPIC_TERMINAL_GIT_REASON_CODES.AGGREGATE_QA_REQUIRED);
213
+ }
93
214
  if (actual.writerLeaseActive)
94
215
  reasons.push(EPIC_TERMINAL_GIT_REASON_CODES.LEASE_ACTIVE);
95
216
  if (!sameSet(directive.storyCheckpointIds, actual.acceptedCheckpointIds)) {
@@ -220,6 +341,9 @@ function nonEmpty(value) {
220
341
  function isSha(value) {
221
342
  return /^[a-f0-9]{7,64}$/i.test(value);
222
343
  }
344
+ function isFullSha(value) {
345
+ return /^[a-f0-9]{40,64}$/i.test(value);
346
+ }
223
347
  function isHash(value) {
224
348
  return typeof value === 'string' && /^[a-f0-9]{64}$/i.test(value);
225
349
  }
@@ -229,3 +353,21 @@ function unique(values) {
229
353
  function sameSet(left, right) {
230
354
  return left.length === right.length && [...left].sort().every((item, index) => item === [...right].sort()[index]);
231
355
  }
356
+ function sameOrdered(left, right) {
357
+ return left.length === right.length && left.every((item, index) => item === right[index]);
358
+ }
359
+ function safeRepositoryPath(value) {
360
+ return safeWriteScope(value) && !value.endsWith('/');
361
+ }
362
+ function safeWriteScope(value) {
363
+ if (typeof value !== 'string' || value.length === 0 || value.length > 512
364
+ || value.startsWith('/') || value.startsWith('-') || value.includes('\\')
365
+ || value.includes('\0') || value.includes('//'))
366
+ return false;
367
+ const parts = value.replace(/\/$/, '').split('/');
368
+ return parts.length > 0 && parts.every((part) => part.length > 0 && part !== '.' && part !== '..')
369
+ && parts[0] !== '.git';
370
+ }
371
+ function writeScopeCovers(scope, path) {
372
+ return scope === path || scope.endsWith('/') && path.startsWith(scope);
373
+ }
@@ -1,4 +1,4 @@
1
- # 🧠 Neocortex v4.60.72 | OrNexus Team
1
+ # 🧠 Neocortex v4.60.74 | 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.72 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.74 | 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.72'
7
+ version: '4.60.74'
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.72 | OrNexus Team"
3
+ description: "🧠 Neocortex Root Agent v4.60.74 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  tools:
@@ -108,7 +108,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
108
108
  ┌────────────────────────────────────────────────────────────┐
109
109
  │ │
110
110
  │ ####### N E O C O R T E X │
111
- │ ### ######## v4.60.72 │
111
+ │ ### ######## v4.60.74 │
112
112
  │ ######### ##### │
113
113
  │ ## ############## Development Orchestrator │
114
114
  │ ## ### ###### ## OrNexus Team │
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex'
5
5
  title: 'Development Orchestrator'
6
6
  icon: '>'
7
- version: '4.60.72'
7
+ version: '4.60.74'
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.72 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.74 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  permissionMode: bypassPermissions
@@ -104,7 +104,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
104
104
  ┌────────────────────────────────────────────────────────────┐
105
105
  │ │
106
106
  │ ####### N E O C O R T E X │
107
- │ ### ######## v4.60.72 │
107
+ │ ### ######## v4.60.74 │
108
108
  │ ######### ##### │
109
109
  │ ## ############## Development Orchestrator │
110
110
  │ ## ### ###### ## OrNexus Team │
@@ -28,7 +28,7 @@ Codex built-in commands or actions.
28
28
 
29
29
  <!-- END: Plugin Conflict Prevention -->
30
30
 
31
- # Neocortex v4.60.72 | OrNexus Team
31
+ # Neocortex v4.60.74 | OrNexus Team
32
32
 
33
33
  You are a Development Orchestrator. All orchestration logic is delivered by the remote Neocortex server.
34
34
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.72 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.74 | OrNexus Team"
4
4
  model: inherit
5
5
  readonly: false
6
6
  is_background: false
@@ -64,7 +64,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
64
64
  ┌────────────────────────────────────────────────────────────┐
65
65
  │ │
66
66
  │ ####### N E O C O R T E X │
67
- │ ### ######## v4.60.72 │
67
+ │ ### ######## v4.60.74 │
68
68
  │ ######### ##### │
69
69
  │ ## ############## Development Orchestrator │
70
70
  │ ## ### ###### ## OrNexus Team │
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex-root
3
- description: "🧠 Neocortex v4.60.72 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.74 | OrNexus Team"
4
4
  kind: local
5
5
  tools:
6
6
  # File operations (Gemini CLI built-ins)
@@ -62,7 +62,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
62
62
  ┌────────────────────────────────────────────────────────────┐
63
63
  │ │
64
64
  │ ####### N E O C O R T E X │
65
- │ ### ######## v4.60.72 │
65
+ │ ### ######## v4.60.74 │
66
66
  │ ######### ##### │
67
67
  │ ## ############## Development Orchestrator │
68
68
  │ ## ### ###### ## OrNexus Team │
@@ -58,7 +58,7 @@ explicit server opt-in rather than a local assumption.
58
58
  ┌────────────────────────────────────────────────────────────┐
59
59
  │ │
60
60
  │ ####### N E O C O R T E X │
61
- │ ### ######## v4.60.72 │
61
+ │ ### ######## v4.60.74 │
62
62
  │ ######### ##### │
63
63
  │ ## ############## Development Orchestrator │
64
64
  │ ## ### ###### ## OrNexus Team │
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: "neocortex"
3
- description: "Neocortex v4.60.72 | OrNexus Team"
3
+ description: "Neocortex v4.60.74 | OrNexus Team"
4
4
  tools:
5
5
  # Read / Edit (built-in tool sets)
6
6
  - read
@@ -68,7 +68,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
68
68
  ┌────────────────────────────────────────────────────────────┐
69
69
  │ │
70
70
  │ ####### N E O C O R T E X │
71
- │ ### ######## v4.60.72 │
71
+ │ ### ######## v4.60.74 │
72
72
  │ ######### ##### │
73
73
  │ ## ############## Development Orchestrator │
74
74
  │ ## ### ###### ## OrNexus Team │